Project

General

Profile

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

examples / src / main / java / org / distorted / examples / dynamic / DynamicSurfaceView.java @ 5e3cd4e1

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