Project

General

Profile

Download (16.2 KB) Statistics
| Branch: | Revision:

examples / src / main / java / org / distorted / examples / dynamic / DynamicSurfaceView.java @ 97dadfe5

1 bc0a685b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 f988589e Leszek Koltunski
package org.distorted.examples.dynamic;
21 427ab7bf Leszek Koltunski
22
import android.content.Context;
23
import android.opengl.GLSurfaceView;
24
import android.os.Build;
25
import android.view.MotionEvent;
26
import android.util.AttributeSet;
27
import android.graphics.Canvas;
28
import android.graphics.Paint.Style;
29
import android.graphics.Paint;
30
31 7589635e Leszek Koltunski
import org.distorted.library.type.Dynamic1D;
32
import org.distorted.library.type.Dynamic2D;
33
import org.distorted.library.type.Dynamic3D;
34
import org.distorted.library.type.Static1D;
35
import org.distorted.library.type.Static2D;
36
import org.distorted.library.type.Static3D;
37 427ab7bf Leszek Koltunski
38
///////////////////////////////////////////////////////////////////
39
40 f988589e Leszek Koltunski
public class DynamicSurfaceView extends GLSurfaceView
41 427ab7bf Leszek Koltunski
    {
42
    public static final int DIM_1D   = 0; 
43
    public static final int DIM_2D   = 1; 
44
    public static final int DIM_3DXY = 2; 
45
    public static final int DIM_3DXZ = 3; 
46 8b7c0ab3 Leszek Koltunski
47 97dadfe5 Leszek Koltunski
    private static final int NUM_POINTS = 400;
48
    private static final int MAX_VECTORS=   6;
49 8b7c0ab3 Leszek Koltunski
50
    private static final Object lock = new Object();
51
52 7589635e Leszek Koltunski
    private static Dynamic1D di1D;
53
    private static Dynamic2D di2D;
54
    private static Dynamic3D di3D;
55 427ab7bf Leszek Koltunski
    
56
    private static Paint mPaint;
57
    private static int moving;
58
    private static int mDuration;
59 97dadfe5 Leszek Koltunski
    private static int mPosition;
60 8b7c0ab3 Leszek Koltunski
    private static float mNoise0, mNoise1, mNoise2;
61 427ab7bf Leszek Koltunski
    
62 97dadfe5 Leszek Koltunski
    private static int currentDim;
63 427ab7bf Leszek Koltunski
    
64 7589635e Leszek Koltunski
    private static Static1D p1D;
65
    private static Static2D p2D;
66
    private static Static3D p3D;
67 9ff0c8c3 Leszek Koltunski
68
    private static Static1D p1N;
69
    private static Static2D p2N;
70
    private static Static3D p3N;
71
72 97dadfe5 Leszek Koltunski
    private static float[] mPoints = new float[3*NUM_POINTS];
73 427ab7bf Leszek Koltunski
      
74
///////////////////////////////////////////////////////////////////
75
    
76 f988589e Leszek Koltunski
    public DynamicSurfaceView(Context c, AttributeSet attrs)
77 427ab7bf Leszek Koltunski
      {
78
      super(c, attrs);
79
      
80
      mPaint = new Paint();
81
      mPaint.setStyle(Style.FILL);
82
      mPaint.setAntiAlias(true);
83 97dadfe5 Leszek Koltunski
84
      currentDim= DIM_2D;
85 427ab7bf Leszek Koltunski
      moving    = -1;
86
      mDuration = 10000;
87
      mPosition = 0;
88 8b7c0ab3 Leszek Koltunski
      mNoise0   = 0.0f;
89
      mNoise1   = 0.0f;
90
      mNoise2   = 0.0f;
91
92 97dadfe5 Leszek Koltunski
      di1D = new Dynamic1D(mDuration,0.0f);
93 bf36cb6e Leszek Koltunski
      p1N  = new Static1D(mNoise0);
94 97dadfe5 Leszek Koltunski
      di2D = new Dynamic2D(mDuration,0.0f);
95 bf36cb6e Leszek Koltunski
      p2N  = new Static2D(mNoise0,mNoise1);
96 97dadfe5 Leszek Koltunski
      di3D = new Dynamic3D(mDuration,0.0f);
97 bf36cb6e Leszek Koltunski
      p3N  = new Static3D(mNoise0,mNoise1,mNoise2);
98
99 427ab7bf Leszek Koltunski
      if(!isInEditMode())
100
        {
101
        setFocusable(true);
102
        setFocusableInTouchMode(true);
103
        
104
        setEGLContextClientVersion(2);
105
        
106
        if( Build.FINGERPRINT.startsWith("generic") ) // when running on the emulator, insert a magic line that is
107
          {                                           // supposed to cure the 'no config chosen' crash on emulator startup
108
          setEGLConfigChooser(8, 8, 8, 8, 16, 0);   
109
          }
110
        
111 8b7c0ab3 Leszek Koltunski
        DynamicRenderer mRenderer = new DynamicRenderer(this);
112 427ab7bf Leszek Koltunski
        setRenderer(mRenderer);
113
        }
114
      }
115
116
///////////////////////////////////////////////////////////////////
117
118
    public static void setMode(int mode)
119
      {
120
      di1D.setMode(mode);  
121
      di2D.setMode(mode);
122
      di3D.setMode(mode);
123
      }
124
125
///////////////////////////////////////////////////////////////////
126
127
    public static void setDuration(int duration)
128
      {
129
      mDuration = duration;
130
      
131
      di1D.setDuration(duration);
132
      di2D.setDuration(duration);
133
      di3D.setDuration(duration);
134
      }
135
136
///////////////////////////////////////////////////////////////////
137
138 8b7c0ab3 Leszek Koltunski
    public static void setNoise(float noise0, float noise1, float noise2)
139 427ab7bf Leszek Koltunski
      {
140 8b7c0ab3 Leszek Koltunski
      mNoise0 = noise0;
141
      mNoise1 = noise1;
142
      mNoise2 = noise2;
143 9ff0c8c3 Leszek Koltunski
144 8b7c0ab3 Leszek Koltunski
      p1N.set(mNoise0);
145
      p2N.set(mNoise0,mNoise1);
146
      p3N.set(mNoise0,mNoise1,mNoise2);
147 9ff0c8c3 Leszek Koltunski
148
      di1D.setNoise(p1N);
149
      di2D.setNoise(p2N);
150
      di3D.setNoise(p3N);
151 427ab7bf Leszek Koltunski
      }
152
    
153
///////////////////////////////////////////////////////////////////
154
155
    public static void setDimension(int dim)
156
      {
157
      if( currentDim != dim )
158
        {
159
        if( !(currentDim==DIM_3DXY && dim==DIM_3DXZ) && !(currentDim==DIM_3DXZ && dim==DIM_3DXY) )
160
          {
161
          synchronized(lock)
162
            {
163
            di1D.removeAll();
164
            di2D.removeAll();
165
            di3D.removeAll();
166 97dadfe5 Leszek Koltunski
167
            for(int i=0; i<3*NUM_POINTS; i++)
168
              {
169
              mPoints[i] = -10.0f;
170
              }
171 427ab7bf Leszek Koltunski
            }
172
          }
173
      
174
        currentDim = dim;
175
        }
176
      }
177
    
178
///////////////////////////////////////////////////////////////////
179
    
180
    public static void drawCurve(Canvas c, long time)
181
      {
182 97dadfe5 Leszek Koltunski
      if ( ++mPosition >= NUM_POINTS ) mPosition=0;
183 427ab7bf Leszek Koltunski
         
184
      synchronized(lock)
185
        {
186
        switch(currentDim)
187
          {
188
          case DIM_1D: drawCurve1D(c,time); break;
189
          case DIM_2D: drawCurve2D(c,time); break;
190
          default    : drawCurve3D(c,time); break;
191
          }
192
        }
193
      }
194
195
///////////////////////////////////////////////////////////////////
196
      
197
    private static void drawCurve1D(Canvas c, long time)
198
      {
199
      int len = di1D.getNumPoints();   
200 97dadfe5 Leszek Koltunski
      int size1 = DynamicRenderer.texH/200;
201
      int size2 = DynamicRenderer.texH/80;
202
203 427ab7bf Leszek Koltunski
      mPaint.setColor(0xff000000);
204
      
205 97dadfe5 Leszek Koltunski
      c.drawLine(0, DynamicRenderer.texH/2, DynamicRenderer.texW, DynamicRenderer.texH/2, mPaint);
206
      c.drawText("x", 0.95f* DynamicRenderer.texW, 0.55f* DynamicRenderer.texH , mPaint);
207
208 427ab7bf Leszek Koltunski
      if( len>=2 )
209
        {
210 97dadfe5 Leszek Koltunski
        di1D.interpolateMain(mPoints,3*mPosition, time);
211
212
        for(int i=0; i<NUM_POINTS; i++)
213 427ab7bf Leszek Koltunski
          {
214 97dadfe5 Leszek Koltunski
          int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
215
                                   : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
216 427ab7bf Leszek Koltunski
         
217
          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
218 97dadfe5 Leszek Koltunski
          c.drawCircle(mPoints[3*i], DynamicRenderer.texH/2 , size1, mPaint );
219 427ab7bf Leszek Koltunski
          }
220
        }
221
     
222
      mPaint.setColor(0xffff0000);
223
      
224
      for(int curr=0; curr<len; curr++)
225
        {      
226
        p1D = di1D.getPoint(curr);
227 97dadfe5 Leszek Koltunski
        c.drawCircle(p1D.getX(), DynamicRenderer.texH/2 , size2, mPaint);
228 427ab7bf Leszek Koltunski
        }   
229
      }
230
    
231
///////////////////////////////////////////////////////////////////
232
      
233
    private static void drawCurve2D(Canvas c, long time)
234
      {
235
      int len = di2D.getNumPoints();   
236 97dadfe5 Leszek Koltunski
      int size1 = DynamicRenderer.texH/200;
237
      int size2 = DynamicRenderer.texH/80;
238
239 427ab7bf Leszek Koltunski
      mPaint.setColor(0xff000000);
240
      
241 97dadfe5 Leszek Koltunski
      c.drawLine(0, DynamicRenderer.texH/2, DynamicRenderer.texW, DynamicRenderer.texH/2, mPaint);
242
      c.drawLine(DynamicRenderer.texW/2, 0, DynamicRenderer.texW/2, DynamicRenderer.texH, mPaint);
243 427ab7bf Leszek Koltunski
      
244 97dadfe5 Leszek Koltunski
      c.drawText("x", 0.95f* DynamicRenderer.texW, 0.55f* DynamicRenderer.texH , mPaint);
245
      c.drawText("y", 0.55f* DynamicRenderer.texW, 0.05f* DynamicRenderer.texH , mPaint);
246 427ab7bf Leszek Koltunski
      
247
      if( len>=2 )
248
        {
249 97dadfe5 Leszek Koltunski
        di2D.interpolateMain(mPoints,3*mPosition, time);
250
251
//android.util.Log.e("surface", "pos="+mPosition+" x="+mPoints[3*mPosition]+" y="+mPoints[3*mPosition+1]+" time="+time);
252
253
        for(int i=0; i<NUM_POINTS; i++)
254 427ab7bf Leszek Koltunski
          {
255 97dadfe5 Leszek Koltunski
          int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
256
                                   : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
257 427ab7bf Leszek Koltunski
         
258 97dadfe5 Leszek Koltunski
          mPaint.setColor( 0xffffff + ((color&0xff)<<24) );
259
          c.drawCircle(mPoints[3*i], mPoints[3*i+1], size1, mPaint );
260 427ab7bf Leszek Koltunski
          }
261
        }
262
     
263
      mPaint.setColor(0xffff0000);
264
      
265
      for(int curr=0; curr<len; curr++)
266
        {      
267
        p2D = di2D.getPoint(curr);
268 97dadfe5 Leszek Koltunski
        c.drawCircle(p2D.getX(),p2D.getY(), size2, mPaint);
269 427ab7bf Leszek Koltunski
        }
270
      }
271
272
///////////////////////////////////////////////////////////////////
273
      
274
    private static void drawCurve3D(Canvas c, long time)
275
      {
276
      int len = di3D.getNumPoints();   
277 97dadfe5 Leszek Koltunski
      int size1 = DynamicRenderer.texH/200;
278
      int size2 = DynamicRenderer.texH/80;
279
280 427ab7bf Leszek Koltunski
      mPaint.setColor(0xff000000);
281
      
282 97dadfe5 Leszek Koltunski
      c.drawLine(0, DynamicRenderer.texH/2, DynamicRenderer.texW  , DynamicRenderer.texH/2, mPaint);
283
      c.drawLine(DynamicRenderer.texW/2, 0, DynamicRenderer.texW/2, DynamicRenderer.texH  , mPaint);
284 427ab7bf Leszek Koltunski
      
285 97dadfe5 Leszek Koltunski
      c.drawText("x", 0.95f* DynamicRenderer.texW, 0.55f* DynamicRenderer.texH , mPaint);
286
      c.drawText( currentDim==DIM_3DXY ? "y" : "z", 0.55f* DynamicRenderer.texW, 0.05f* DynamicRenderer.texH , mPaint);
287 427ab7bf Leszek Koltunski
      
288
      if( len>=2 )
289
        {
290 97dadfe5 Leszek Koltunski
        di3D.interpolateMain(mPoints, 3*mPosition, time);
291
292
        for(int i=0; i<NUM_POINTS; i++)
293 427ab7bf Leszek Koltunski
          {
294 97dadfe5 Leszek Koltunski
          int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
295
                                   : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
296 427ab7bf Leszek Koltunski
         
297
          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
298 97dadfe5 Leszek Koltunski
          c.drawCircle(mPoints[3*i], mPoints[3*i + (currentDim==DIM_3DXY ? 1:2) ], size1, mPaint );
299 427ab7bf Leszek Koltunski
          }
300
        }
301
     
302
      mPaint.setColor(0xffff0000);
303
      
304
      for(int curr=0; curr<len; curr++)
305
        {      
306
        p3D = di3D.getPoint(curr);
307 97dadfe5 Leszek Koltunski
        c.drawCircle(p3D.getX(), currentDim==DIM_3DXY ? p3D.getY():p3D.getZ(), size2, mPaint);
308 427ab7bf Leszek Koltunski
        }   
309
      }
310
    
311
///////////////////////////////////////////////////////////////////
312
313
    private void addNewPoint(int x, int y)
314
      {
315
      float gx,gy,gz;
316
      int len;
317
      
318
      switch(currentDim)
319
        {
320
        case DIM_1D: len = di1D.getNumPoints();
321
                
322
                     for(int g=0; g<len; g++)
323
                       {
324
                       p1D = di1D.getPoint(g);  
325
                       gx = p1D.getX();
326
                                    
327 97dadfe5 Leszek Koltunski
                       if( (x-gx)*(x-gx) < (DynamicRenderer.texH)*(DynamicRenderer.texH)/100 )
328 427ab7bf Leszek Koltunski
                         {
329
                         moving = g;
330
                         break;
331
                         }
332
                       }
333
                     if( moving<0 )
334
                       {
335
                       synchronized(lock)
336
                         {
337
                         if( len>=MAX_VECTORS ) di1D.removeAll();
338 97dadfe5 Leszek Koltunski
                         di1D.add(new Static1D(x));
339 427ab7bf Leszek Koltunski
                         }
340
                       }
341
                     break;
342
        case DIM_2D: len = di2D.getNumPoints();
343
                                 
344
                     for(int g=0; g<len; g++)
345
                       {
346
                       p2D = di2D.getPoint(g);  
347
                       gx = p2D.getX();
348
                       gy = p2D.getY();
349
                                    
350 97dadfe5 Leszek Koltunski
                       if( (x-gx)*(x-gx) + (y-gy)*(y-gy) < (DynamicRenderer.texH)*(DynamicRenderer.texH)/100 )
351 427ab7bf Leszek Koltunski
                         {
352
                         moving = g;
353
                         break;
354
                         }
355
                       }
356
                     if( moving<0 )
357
                       {
358
                       synchronized(lock)
359
                         {
360
                         if( len>=MAX_VECTORS ) di2D.removeAll();
361 97dadfe5 Leszek Koltunski
                         di2D.add(new Static2D(x,y));
362 427ab7bf Leszek Koltunski
                         }
363
                       }
364
                     break;
365
        default    : len = di3D.getNumPoints();
366
                                 
367
                     for(int g=0; g<len; g++)
368
                       {
369
                       p3D = di3D.getPoint(g);  
370
                       gx = p3D.getX();
371
                       gy = p3D.getY();
372
                       gz = p3D.getZ();
373
                               
374
                     if( currentDim==DIM_3DXY )
375
                       {
376 97dadfe5 Leszek Koltunski
                       if( (x-gx)*(x-gx) + (y-gy)*(y-gy) < (DynamicRenderer.texH)*(DynamicRenderer.texH)/100 )
377 427ab7bf Leszek Koltunski
                         {
378
                         moving = g;
379
                         break;
380
                         }
381
                       }
382
                     if( currentDim==DIM_3DXZ )
383
                       {
384 97dadfe5 Leszek Koltunski
                       if( (x-gx)*(x-gx) + (y-gz)*(y-gz) < (DynamicRenderer.texH)*(DynamicRenderer.texH)/100 )
385 427ab7bf Leszek Koltunski
                         {
386
                         moving = g;
387
                         break;
388
                         }
389
                       }
390
                     }
391
                   if( moving<0 )
392
                     { 
393
                     synchronized(lock)
394
                       {
395
                       if( len>=MAX_VECTORS ) di3D.removeAll();
396
                    
397
                       if( currentDim==DIM_3DXY )
398
                         {
399 97dadfe5 Leszek Koltunski
                         di3D.add(new Static3D(x,y, DynamicRenderer.texH/2));
400 427ab7bf Leszek Koltunski
                         }
401
                       if( currentDim==DIM_3DXZ )
402
                         {
403 97dadfe5 Leszek Koltunski
                         di3D.add(new Static3D(x, DynamicRenderer.texH/2,y));
404 427ab7bf Leszek Koltunski
                         }
405
                       }
406
                     }
407
                   break; 
408
        }
409
      }
410
    
411
///////////////////////////////////////////////////////////////////
412
    
413
    @Override public boolean onTouchEvent(MotionEvent event) 
414
      {
415
      int action = event.getAction();
416 97dadfe5 Leszek Koltunski
      int xDown, yDown;
417
418 427ab7bf Leszek Koltunski
      switch(action)
419
        {
420 97dadfe5 Leszek Koltunski
        case MotionEvent.ACTION_DOWN: xDown = (int)event.getX();
421
                                      yDown = (int)event.getY();
422 427ab7bf Leszek Koltunski
                                      
423
                                      addNewPoint(xDown,yDown);
424
                                    
425
                                      break;
426
        case MotionEvent.ACTION_MOVE: if( moving>=0 )
427
                                        {
428 97dadfe5 Leszek Koltunski
                                        xDown = (int)event.getX();
429
                                        yDown = (int)event.getY();
430 427ab7bf Leszek Koltunski
                                        
431
                                        switch(currentDim)
432
                                          {
433
                                          case DIM_1D  : di1D.setPoint(moving, xDown); 
434
                                                         break;
435
                                          case DIM_2D  : di2D.setPoint(moving, xDown, yDown);
436
                                                         break;
437
                                          case DIM_3DXY: di3D.setPoint(moving, xDown, yDown, (int)di3D.getPoint(moving).getZ());
438
                                                         break;
439
                                          case DIM_3DXZ: di3D.setPoint(moving, xDown, (int)di3D.getPoint(moving).getY(), yDown);
440
                                                         break;
441
                                          }
442
                                        }                           
443
                                      break;
444
        case MotionEvent.ACTION_UP  : moving = -1;
445
                                      break;
446
        }
447
            
448
      return true;
449
      }
450
 
451
///////////////////////////////////////////////////////////////////
452
  }