Project

General

Profile

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

examples / src / main / java / org / distorted / examples / dynamic / DynamicSurfaceView.java @ 107e4b72

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 e4330c89 Leszek Koltunski
import android.app.ActivityManager;
23 427ab7bf Leszek Koltunski
import android.content.Context;
24 e4330c89 Leszek Koltunski
import android.content.pm.ConfigurationInfo;
25 427ab7bf Leszek Koltunski
import android.opengl.GLSurfaceView;
26
import android.view.MotionEvent;
27
import android.util.AttributeSet;
28
import android.graphics.Canvas;
29
import android.graphics.Paint.Style;
30
import android.graphics.Paint;
31
32 27e12007 Leszek Koltunski
import org.distorted.library.type.Dynamic;
33 7589635e Leszek Koltunski
import org.distorted.library.type.Dynamic1D;
34
import org.distorted.library.type.Dynamic2D;
35
import org.distorted.library.type.Dynamic3D;
36
import org.distorted.library.type.Static1D;
37
import org.distorted.library.type.Static2D;
38
import org.distorted.library.type.Static3D;
39 427ab7bf Leszek Koltunski
40
///////////////////////////////////////////////////////////////////
41
42 f988589e Leszek Koltunski
public class DynamicSurfaceView extends GLSurfaceView
43 427ab7bf Leszek Koltunski
    {
44
    public static final int DIM_1D   = 0; 
45
    public static final int DIM_2D   = 1; 
46
    public static final int DIM_3DXY = 2; 
47
    public static final int DIM_3DXZ = 3; 
48 8b7c0ab3 Leszek Koltunski
49 fe3c72ce Leszek Koltunski
    private static final int NUM_POINTS = 250;
50 508f22b5 Leszek Koltunski
    private static final int MAX_POINTS =   6;
51 8b7c0ab3 Leszek Koltunski
52
    private static final Object lock = new Object();
53
54 fe3c72ce Leszek Koltunski
    private Dynamic1D di1D;
55
    private Dynamic2D di2D;
56
    private Dynamic3D di3D;
57 427ab7bf Leszek Koltunski
    
58 fe3c72ce Leszek Koltunski
    private Paint mPaint;
59
    private int moving;
60
    private int mDuration;
61
    private int mPosition;
62 b041d424 Leszek Koltunski
    private long mDiffTime, mLastTime;
63 fe3c72ce Leszek Koltunski
    private float mNoise0, mNoise1, mNoise2;
64 508f22b5 Leszek Koltunski
65 fe3c72ce Leszek Koltunski
    private int mSize1, mSize2, mSizeT, mAvg;
66 508f22b5 Leszek Koltunski
67 fe3c72ce Leszek Koltunski
    private int currentDim= DIM_2D;
68 427ab7bf Leszek Koltunski
    
69 fe3c72ce Leszek Koltunski
    private Static1D p1D;
70
    private Static2D p2D;
71
    private Static3D p3D;
72 9ff0c8c3 Leszek Koltunski
73 fe3c72ce Leszek Koltunski
    private Static1D p1N;
74
    private Static2D p2N;
75
    private Static3D p3N;
76 9ff0c8c3 Leszek Koltunski
77 fe3c72ce Leszek Koltunski
    private float[] mPoints = new float[3*NUM_POINTS];
78 427ab7bf Leszek Koltunski
      
79
///////////////////////////////////////////////////////////////////
80
    
81 41a81a14 Leszek Koltunski
    public DynamicSurfaceView(Context context, AttributeSet attrs)
82 427ab7bf Leszek Koltunski
      {
83 41a81a14 Leszek Koltunski
      super(context, attrs);
84 427ab7bf Leszek Koltunski
      
85
      mPaint = new Paint();
86
      mPaint.setStyle(Style.FILL);
87
      mPaint.setAntiAlias(true);
88 97dadfe5 Leszek Koltunski
89 427ab7bf Leszek Koltunski
      moving    = -1;
90
      mDuration = 10000;
91
      mPosition = 0;
92 8b7c0ab3 Leszek Koltunski
      mNoise0   = 0.0f;
93
      mNoise1   = 0.0f;
94
      mNoise2   = 0.0f;
95 b041d424 Leszek Koltunski
      mDiffTime = -1;
96
      mLastTime = -1;
97 8b7c0ab3 Leszek Koltunski
98 97dadfe5 Leszek Koltunski
      di1D = new Dynamic1D(mDuration,0.0f);
99 bf36cb6e Leszek Koltunski
      p1N  = new Static1D(mNoise0);
100 97dadfe5 Leszek Koltunski
      di2D = new Dynamic2D(mDuration,0.0f);
101 bf36cb6e Leszek Koltunski
      p2N  = new Static2D(mNoise0,mNoise1);
102 97dadfe5 Leszek Koltunski
      di3D = new Dynamic3D(mDuration,0.0f);
103 bf36cb6e Leszek Koltunski
      p3N  = new Static3D(mNoise0,mNoise1,mNoise2);
104
105 27e12007 Leszek Koltunski
      di1D.setAccessMode(Dynamic.ACCESS_SEQUENTIAL);
106
      di2D.setAccessMode(Dynamic.ACCESS_SEQUENTIAL);
107
      di3D.setAccessMode(Dynamic.ACCESS_SEQUENTIAL);
108
109 427ab7bf Leszek Koltunski
      if(!isInEditMode())
110
        {
111
        setFocusable(true);
112
        setFocusableInTouchMode(true);
113 8b7c0ab3 Leszek Koltunski
        DynamicRenderer mRenderer = new DynamicRenderer(this);
114 e4330c89 Leszek Koltunski
        final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
115
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
116
        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
117 427ab7bf Leszek Koltunski
        setRenderer(mRenderer);
118
        }
119
      }
120
121 508f22b5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
122
123 fe3c72ce Leszek Koltunski
    public void onSurfaceChanged(int width,int height)
124 508f22b5 Leszek Koltunski
      {
125
      mAvg = (width+height)/2;
126
127
      mSize1 = mAvg/150;
128
      mSize2 = mAvg/60;
129
      mSizeT = mAvg/30;
130
131
      mPaint.setTextSize(mSizeT);
132
133
      clearPoints();
134
      }
135
136 427ab7bf Leszek Koltunski
///////////////////////////////////////////////////////////////////
137
138 fe3c72ce Leszek Koltunski
    public void setMode(int mode)
139 427ab7bf Leszek Koltunski
      {
140
      di1D.setMode(mode);  
141
      di2D.setMode(mode);
142
      di3D.setMode(mode);
143
      }
144
145
///////////////////////////////////////////////////////////////////
146
147 fe3c72ce Leszek Koltunski
    public void setDuration(int duration)
148 427ab7bf Leszek Koltunski
      {
149
      mDuration = duration;
150
      
151
      di1D.setDuration(duration);
152
      di2D.setDuration(duration);
153
      di3D.setDuration(duration);
154
      }
155
156
///////////////////////////////////////////////////////////////////
157
158 fe3c72ce Leszek Koltunski
    public void setNoise(float noise0, float noise1, float noise2)
159 427ab7bf Leszek Koltunski
      {
160 8b7c0ab3 Leszek Koltunski
      mNoise0 = noise0;
161
      mNoise1 = noise1;
162
      mNoise2 = noise2;
163 9ff0c8c3 Leszek Koltunski
164 8b7c0ab3 Leszek Koltunski
      p1N.set(mNoise0);
165
      p2N.set(mNoise0,mNoise1);
166
      p3N.set(mNoise0,mNoise1,mNoise2);
167 9ff0c8c3 Leszek Koltunski
168
      di1D.setNoise(p1N);
169
      di2D.setNoise(p2N);
170
      di3D.setNoise(p3N);
171 427ab7bf Leszek Koltunski
      }
172
    
173
///////////////////////////////////////////////////////////////////
174
175 fe3c72ce Leszek Koltunski
    public void setDimension(int dim)
176 427ab7bf Leszek Koltunski
      {
177
      if( currentDim != dim )
178
        {
179
        if( !(currentDim==DIM_3DXY && dim==DIM_3DXZ) && !(currentDim==DIM_3DXZ && dim==DIM_3DXY) )
180
          {
181
          synchronized(lock)
182
            {
183
            di1D.removeAll();
184
            di2D.removeAll();
185
            di3D.removeAll();
186 97dadfe5 Leszek Koltunski
187 508f22b5 Leszek Koltunski
            clearPoints();
188 427ab7bf Leszek Koltunski
            }
189
          }
190
      
191
        currentDim = dim;
192
        }
193
      }
194
    
195
///////////////////////////////////////////////////////////////////
196
    
197 fe3c72ce Leszek Koltunski
    public void drawCurve(Canvas c, long time)
198 427ab7bf Leszek Koltunski
      {
199 97dadfe5 Leszek Koltunski
      if ( ++mPosition >= NUM_POINTS ) mPosition=0;
200 b041d424 Leszek Koltunski
201
      if( mLastTime<0 )
202
        {
203
        mLastTime = time;
204
        }
205
      else
206
        {
207
        mDiffTime = time - mLastTime;
208
        }
209
210 427ab7bf Leszek Koltunski
      synchronized(lock)
211
        {
212
        switch(currentDim)
213
          {
214
          case DIM_1D: drawCurve1D(c,time); break;
215
          case DIM_2D: drawCurve2D(c,time); break;
216
          default    : drawCurve3D(c,time); break;
217
          }
218
        }
219 b041d424 Leszek Koltunski
220
      mLastTime = time;
221 427ab7bf Leszek Koltunski
      }
222
223
///////////////////////////////////////////////////////////////////
224 508f22b5 Leszek Koltunski
225 fe3c72ce Leszek Koltunski
    private void clearPoints()
226 508f22b5 Leszek Koltunski
      {
227
      for(int i=0; i<3*NUM_POINTS; i++)
228
         {
229
         mPoints[i] = -10.0f;
230
         }
231
      }
232
233
///////////////////////////////////////////////////////////////////
234
235 fe3c72ce Leszek Koltunski
    private void drawCurve1D(Canvas c, long time)
236 427ab7bf Leszek Koltunski
      {
237
      int len = di1D.getNumPoints();   
238
      mPaint.setColor(0xff000000);
239
      
240 97dadfe5 Leszek Koltunski
      c.drawLine(0, DynamicRenderer.texH/2, DynamicRenderer.texW, DynamicRenderer.texH/2, mPaint);
241 508f22b5 Leszek Koltunski
      c.drawText("x", 0.95f*DynamicRenderer.texW, DynamicRenderer.texH /2 + mSizeT , mPaint);
242 97dadfe5 Leszek Koltunski
243 427ab7bf Leszek Koltunski
      if( len>=2 )
244
        {
245 5e3cd4e1 leszek
        di1D.get(mPoints,3*mPosition, time, mDiffTime);
246 97dadfe5 Leszek Koltunski
247
        for(int i=0; i<NUM_POINTS; i++)
248 427ab7bf Leszek Koltunski
          {
249 97dadfe5 Leszek Koltunski
          int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
250
                                   : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
251 427ab7bf Leszek Koltunski
         
252
          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
253 508f22b5 Leszek Koltunski
          c.drawCircle(mPoints[3*i], DynamicRenderer.texH/2 , mSize1, mPaint );
254 427ab7bf Leszek Koltunski
          }
255
        }
256
     
257
      mPaint.setColor(0xffff0000);
258
      
259
      for(int curr=0; curr<len; curr++)
260
        {      
261
        p1D = di1D.getPoint(curr);
262 e3eab072 Leszek Koltunski
        c.drawCircle(p1D.get1(), DynamicRenderer.texH/2 , mSize2, mPaint);
263 427ab7bf Leszek Koltunski
        }   
264
      }
265
    
266
///////////////////////////////////////////////////////////////////
267
      
268 fe3c72ce Leszek Koltunski
    private void drawCurve2D(Canvas c, long time)
269 427ab7bf Leszek Koltunski
      {
270
      int len = di2D.getNumPoints();   
271
      mPaint.setColor(0xff000000);
272
      
273 97dadfe5 Leszek Koltunski
      c.drawLine(0, DynamicRenderer.texH/2, DynamicRenderer.texW, DynamicRenderer.texH/2, mPaint);
274
      c.drawLine(DynamicRenderer.texW/2, 0, DynamicRenderer.texW/2, DynamicRenderer.texH, mPaint);
275 427ab7bf Leszek Koltunski
      
276 508f22b5 Leszek Koltunski
      c.drawText("x", 0.95f* DynamicRenderer.texW    , DynamicRenderer.texH/2+mSizeT , mPaint);
277
      c.drawText("y", DynamicRenderer.texW/2 + mSizeT,                        mSizeT , mPaint);
278 427ab7bf Leszek Koltunski
      
279
      if( len>=2 )
280
        {
281 5e3cd4e1 leszek
        di2D.get(mPoints,3*mPosition, time, mDiffTime);
282 97dadfe5 Leszek Koltunski
283
        for(int i=0; i<NUM_POINTS; i++)
284 427ab7bf Leszek Koltunski
          {
285 97dadfe5 Leszek Koltunski
          int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
286
                                   : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
287 427ab7bf Leszek Koltunski
         
288 97dadfe5 Leszek Koltunski
          mPaint.setColor( 0xffffff + ((color&0xff)<<24) );
289 508f22b5 Leszek Koltunski
          c.drawCircle(mPoints[3*i], mPoints[3*i+1], mSize1, mPaint );
290 427ab7bf Leszek Koltunski
          }
291
        }
292
     
293
      mPaint.setColor(0xffff0000);
294
      
295
      for(int curr=0; curr<len; curr++)
296
        {      
297
        p2D = di2D.getPoint(curr);
298 e3eab072 Leszek Koltunski
        c.drawCircle(p2D.get1(),p2D.get2(), mSize2, mPaint);
299 427ab7bf Leszek Koltunski
        }
300
      }
301
302
///////////////////////////////////////////////////////////////////
303
      
304 fe3c72ce Leszek Koltunski
    private void drawCurve3D(Canvas c, long time)
305 427ab7bf Leszek Koltunski
      {
306
      int len = di3D.getNumPoints();   
307
      mPaint.setColor(0xff000000);
308
      
309 97dadfe5 Leszek Koltunski
      c.drawLine(0, DynamicRenderer.texH/2, DynamicRenderer.texW  , DynamicRenderer.texH/2, mPaint);
310
      c.drawLine(DynamicRenderer.texW/2, 0, DynamicRenderer.texW/2, DynamicRenderer.texH  , mPaint);
311 427ab7bf Leszek Koltunski
      
312 508f22b5 Leszek Koltunski
      c.drawText( "x"                             , 0.95f* DynamicRenderer.texW    , DynamicRenderer.texH/2 + mSizeT , mPaint);
313
      c.drawText( currentDim==DIM_3DXY ? "y" : "z", DynamicRenderer.texW/2 + mSizeT,                          mSizeT , mPaint);
314 427ab7bf Leszek Koltunski
      
315
      if( len>=2 )
316
        {
317 5e3cd4e1 leszek
        di3D.get(mPoints, 3*mPosition, time, mDiffTime);
318 97dadfe5 Leszek Koltunski
319
        for(int i=0; i<NUM_POINTS; i++)
320 427ab7bf Leszek Koltunski
          {
321 97dadfe5 Leszek Koltunski
          int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
322
                                   : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
323 427ab7bf Leszek Koltunski
         
324
          mPaint.setColor( 0xffffff + ((color&0xff)<<24) ); 
325 508f22b5 Leszek Koltunski
          c.drawCircle(mPoints[3*i], mPoints[3*i + (currentDim==DIM_3DXY ? 1:2) ], mSize1, mPaint );
326 427ab7bf Leszek Koltunski
          }
327
        }
328
     
329
      mPaint.setColor(0xffff0000);
330
      
331
      for(int curr=0; curr<len; curr++)
332
        {      
333
        p3D = di3D.getPoint(curr);
334 e3eab072 Leszek Koltunski
        c.drawCircle(p3D.get1(), currentDim==DIM_3DXY ? p3D.get2():p3D.get3(), mSize2, mPaint);
335 427ab7bf Leszek Koltunski
        }   
336
      }
337
    
338
///////////////////////////////////////////////////////////////////
339
340
    private void addNewPoint(int x, int y)
341
      {
342
      float gx,gy,gz;
343
      int len;
344
      
345
      switch(currentDim)
346
        {
347
        case DIM_1D: len = di1D.getNumPoints();
348
                
349
                     for(int g=0; g<len; g++)
350
                       {
351
                       p1D = di1D.getPoint(g);  
352 e3eab072 Leszek Koltunski
                       gx = p1D.get1();
353 427ab7bf Leszek Koltunski
                                    
354 508f22b5 Leszek Koltunski
                       if( (x-gx)*(x-gx) < (mAvg*mAvg/100) )
355 427ab7bf Leszek Koltunski
                         {
356
                         moving = g;
357
                         break;
358
                         }
359
                       }
360
                     if( moving<0 )
361
                       {
362
                       synchronized(lock)
363
                         {
364 508f22b5 Leszek Koltunski
                         if( len>=MAX_POINTS )
365
                           {
366
                           di1D.removeAll();
367
                           clearPoints();
368
                           }
369 97dadfe5 Leszek Koltunski
                         di1D.add(new Static1D(x));
370 427ab7bf Leszek Koltunski
                         }
371
                       }
372
                     break;
373
        case DIM_2D: len = di2D.getNumPoints();
374
                                 
375
                     for(int g=0; g<len; g++)
376
                       {
377
                       p2D = di2D.getPoint(g);  
378 e3eab072 Leszek Koltunski
                       gx = p2D.get1();
379
                       gy = p2D.get2();
380 427ab7bf Leszek Koltunski
                                    
381 508f22b5 Leszek Koltunski
                       if( (x-gx)*(x-gx) + (y-gy)*(y-gy) < (mAvg*mAvg/100) )
382 427ab7bf Leszek Koltunski
                         {
383
                         moving = g;
384
                         break;
385
                         }
386
                       }
387
                     if( moving<0 )
388
                       {
389
                       synchronized(lock)
390
                         {
391 508f22b5 Leszek Koltunski
                         if( len>=MAX_POINTS )
392
                           {
393
                           di2D.removeAll();
394
                           clearPoints();
395
                           }
396 97dadfe5 Leszek Koltunski
                         di2D.add(new Static2D(x,y));
397 427ab7bf Leszek Koltunski
                         }
398
                       }
399
                     break;
400
        default    : len = di3D.getNumPoints();
401
                                 
402
                     for(int g=0; g<len; g++)
403
                       {
404
                       p3D = di3D.getPoint(g);  
405 e3eab072 Leszek Koltunski
                       gx = p3D.get1();
406
                       gy = p3D.get2();
407
                       gz = p3D.get3();
408 427ab7bf Leszek Koltunski
                               
409
                     if( currentDim==DIM_3DXY )
410
                       {
411 508f22b5 Leszek Koltunski
                       if( (x-gx)*(x-gx) + (y-gy)*(y-gy) < (mAvg*mAvg/100) )
412 427ab7bf Leszek Koltunski
                         {
413
                         moving = g;
414
                         break;
415
                         }
416
                       }
417
                     if( currentDim==DIM_3DXZ )
418
                       {
419 508f22b5 Leszek Koltunski
                       if( (x-gx)*(x-gx) + (y-gz)*(y-gz) < (mAvg*mAvg/100) )
420 427ab7bf Leszek Koltunski
                         {
421
                         moving = g;
422
                         break;
423
                         }
424
                       }
425
                     }
426
                   if( moving<0 )
427
                     { 
428
                     synchronized(lock)
429
                       {
430 508f22b5 Leszek Koltunski
                       if( len>=MAX_POINTS )
431
                         {
432
                         di3D.removeAll();
433
                         clearPoints();
434
                         }
435 427ab7bf Leszek Koltunski
                    
436
                       if( currentDim==DIM_3DXY )
437
                         {
438 97dadfe5 Leszek Koltunski
                         di3D.add(new Static3D(x,y, DynamicRenderer.texH/2));
439 427ab7bf Leszek Koltunski
                         }
440
                       if( currentDim==DIM_3DXZ )
441
                         {
442 97dadfe5 Leszek Koltunski
                         di3D.add(new Static3D(x, DynamicRenderer.texH/2,y));
443 427ab7bf Leszek Koltunski
                         }
444
                       }
445
                     }
446
                   break; 
447
        }
448
      }
449
    
450
///////////////////////////////////////////////////////////////////
451
    
452
    @Override public boolean onTouchEvent(MotionEvent event) 
453
      {
454
      int action = event.getAction();
455 97dadfe5 Leszek Koltunski
      int xDown, yDown;
456
457 427ab7bf Leszek Koltunski
      switch(action)
458
        {
459 97dadfe5 Leszek Koltunski
        case MotionEvent.ACTION_DOWN: xDown = (int)event.getX();
460
                                      yDown = (int)event.getY();
461 427ab7bf Leszek Koltunski
                                      
462
                                      addNewPoint(xDown,yDown);
463
                                    
464
                                      break;
465
        case MotionEvent.ACTION_MOVE: if( moving>=0 )
466
                                        {
467 97dadfe5 Leszek Koltunski
                                        xDown = (int)event.getX();
468
                                        yDown = (int)event.getY();
469 427ab7bf Leszek Koltunski
                                        
470
                                        switch(currentDim)
471
                                          {
472
                                          case DIM_1D  : di1D.setPoint(moving, xDown); 
473
                                                         break;
474
                                          case DIM_2D  : di2D.setPoint(moving, xDown, yDown);
475
                                                         break;
476 e3eab072 Leszek Koltunski
                                          case DIM_3DXY: di3D.setPoint(moving, xDown, yDown, (int)di3D.getPoint(moving).get3());
477 427ab7bf Leszek Koltunski
                                                         break;
478 e3eab072 Leszek Koltunski
                                          case DIM_3DXZ: di3D.setPoint(moving, xDown, (int)di3D.getPoint(moving).get2(), yDown);
479 427ab7bf Leszek Koltunski
                                                         break;
480
                                          }
481
                                        }                           
482
                                      break;
483
        case MotionEvent.ACTION_UP  : moving = -1;
484
                                      break;
485
        }
486
            
487
      return true;
488
      }
489
 
490
///////////////////////////////////////////////////////////////////
491
  }