Project

General

Profile

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

examples / src / main / java / org / distorted / examples / deform / DeformRenderer.java @ 7451c98a

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
package org.distorted.examples.deform;
21

    
22
import javax.microedition.khronos.egl.EGLConfig;
23
import javax.microedition.khronos.opengles.GL10;
24

    
25
import org.distorted.library.Distorted;
26
import org.distorted.library.DistortedTexture;
27
import org.distorted.library.DistortedEffectQueues;
28
import org.distorted.library.GridObject;
29
import org.distorted.library.GridFlat;
30

    
31
import org.distorted.library.EffectNames;
32
import org.distorted.library.EffectTypes;
33
import org.distorted.library.type.Dynamic3D;
34
import org.distorted.library.type.Static3D;
35
import org.distorted.library.type.Static4D;
36

    
37
import android.graphics.Bitmap;
38
import android.graphics.Canvas;
39
import android.graphics.Paint;
40
import android.graphics.Paint.Style;
41
import android.opengl.GLES20;
42
import android.opengl.GLSurfaceView;
43

    
44
///////////////////////////////////////////////////////////////////////////////////////////////////
45

    
46
class DeformRenderer implements GLSurfaceView.Renderer 
47
   {
48
   private static final int NUM_VECTORS =  8;
49
   private static final int NUM_LINES   = 10;
50
   private static final int NUM_FRAMES  = 10;
51

    
52
   private GLSurfaceView mView;
53
   private DistortedTexture fpsTexture, stretchTexture;
54
   private DistortedEffectQueues fpsQueues, stretchQueues;
55
   private GridObject fpsGrid, stretchGrid;
56
   private Static3D touchPoint;
57

    
58
   private Dynamic3D mReleasedDistortDynamic;
59
   private Dynamic3D mMovingDistortDynamic;
60
   private Static3D[] vDistort;
61
   private Dynamic3D mReleasedDeformDynamic;
62
   private Dynamic3D mMovingDeformDynamic;
63
   private Static3D[] vDeform;
64
   private Dynamic3D mReleasedShearDynamic;
65
   private Dynamic3D mMovingShearDynamic;
66
   private Static3D[] vShear;
67

    
68
   private Static4D mRegion;
69
   private Canvas fpsCanvas;
70
   private Bitmap fpsBitmap;
71
   private int scrHeight, scrWidth;
72
   private Paint mPaint;
73
   private int fpsH, fpsW;
74
   private String fpsString = "";
75
   private long lastTime=0;
76
   private long[] durations;
77
   private int currDuration;
78

    
79
   private EffectNames mMode = EffectNames.DISTORT;
80
   private boolean bitmapCreated = false;
81
   private long mLastEffect = -1;
82

    
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84

    
85
   DeformRenderer(GLSurfaceView view)
86
      { 
87
      mView = view;
88

    
89
      mPaint = new Paint();
90
      mPaint.setAntiAlias(true);
91
      mPaint.setTextAlign(Paint.Align.CENTER);
92

    
93
      fpsQueues     = new DistortedEffectQueues();
94
      stretchQueues = new DistortedEffectQueues();
95

    
96
      mRegion = new Static4D(0,0,0,0);
97

    
98
      durations = new long[NUM_FRAMES+1];
99
      currDuration = 0;
100

    
101
      for(int i=0; i<NUM_FRAMES+1; i++) durations[i]=0;
102

    
103
      // DISTORT
104
      mReleasedDistortDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
105
      mReleasedDistortDynamic.setMode(Dynamic3D.MODE_PATH);
106
      mMovingDistortDynamic = new Dynamic3D(0,0.5f);
107
      mMovingDistortDynamic.setMode(Dynamic3D.MODE_PATH);
108

    
109
      vDistort = new Static3D[NUM_VECTORS];
110

    
111
      for(int i=0; i<NUM_VECTORS; i++)
112
        {
113
        vDistort[i] = new Static3D(0,0,0);
114
        mReleasedDistortDynamic.add(vDistort[i]);
115
        }
116

    
117
      mMovingDistortDynamic.add(vDistort[0]);
118

    
119
      // Deform
120
      mReleasedDeformDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
121
      mReleasedDeformDynamic.setMode(Dynamic3D.MODE_PATH);
122
      mMovingDeformDynamic = new Dynamic3D(0,0.5f);
123
      mMovingDeformDynamic.setMode(Dynamic3D.MODE_PATH);
124

    
125
      vDeform = new Static3D[NUM_VECTORS];
126

    
127
      for(int i=0; i<NUM_VECTORS; i++)
128
        {
129
        vDeform[i] = new Static3D(0,0,0);
130
        mReleasedDeformDynamic.add(vDeform[i]);
131
        }
132

    
133
      mMovingDeformDynamic.add(vDeform[0]);
134

    
135
      // Shear
136
      mReleasedShearDynamic = new Dynamic3D(NUM_VECTORS*500, 0.5f);
137
      mReleasedShearDynamic.setMode(Dynamic3D.MODE_PATH);
138
      mMovingShearDynamic = new Dynamic3D(0,0.5f);
139
      mMovingShearDynamic.setMode(Dynamic3D.MODE_PATH);
140

    
141
      vShear = new Static3D[NUM_VECTORS];
142

    
143
      for(int i=0; i<NUM_VECTORS; i++)
144
        {
145
        vShear[i] = new Static3D(0,0,0);
146
        mReleasedShearDynamic.add(vShear[i]);
147
        }
148

    
149
      mMovingShearDynamic.add(vShear[0]);
150
      }
151

    
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153

    
154
   void setMode(EffectNames mode)
155
      {
156
      mMode = mode;  
157
      }
158
   
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

    
161
   void setRegionRadius(int r)
162
      {
163
      mRegion.set3( r==100 ? 100*scrWidth : r*scrWidth/100.0f);
164
      }
165

    
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167

    
168
   public void onPause()
169
      {
170
      bitmapCreated = false;  
171
      }
172
      
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174
   
175
   public void onDrawFrame(GL10 glUnused)
176
     {
177
     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
178
    
179
     long time = System.currentTimeMillis();
180
      
181
     stretchQueues.draw(time,stretchTexture,stretchGrid);
182
      
183
     mPaint.setColor(0xffffffff);
184
     fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint);
185
     mPaint.setColor(0xff000000);
186
     fpsCanvas.drawText(fpsString, fpsW/2, 5*fpsH/6, mPaint);
187
      
188
     fpsTexture.setTexture(fpsBitmap);
189
     fpsQueues.draw(time,fpsTexture,fpsGrid);
190
      
191
     computeFPS(time);
192
     }
193

    
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195
    
196
   public void onSurfaceChanged(GL10 glUnused, int width, int height)
197
     {
198
     scrHeight = height;
199
     scrWidth  = width;
200

    
201
     setRegionRadius(50);
202

    
203
     Distorted.onSurfaceChanged(width, height);
204
      
205
     if( !bitmapCreated )
206
       {
207
       createBitmap(scrWidth/2,scrHeight/2);
208
       stretchQueues.move( new Static3D(scrWidth/4,scrHeight/4,0) );
209
       fpsQueues.move( new Static3D(5,5,0) );
210
       bitmapCreated=true;
211
       }
212
     else
213
       {
214
       stretchQueues.abortEffects(EffectTypes.VERTEX);
215
       stretchQueues.abortEffects(EffectTypes.FRAGMENT);
216
       stretchQueues.abortEffects(EffectNames.SHEAR);
217
       }
218
     }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221
    
222
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
223
     {
224
     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
225

    
226
     try
227
       {
228
       Distorted.onSurfaceCreated(mView.getContext());
229
       }
230
     catch(Exception ex)
231
       {
232
       android.util.Log.e("DeformRenderer", ex.toString() );
233
       }
234
     }
235
    
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237

    
238
   private void createBitmap(int w, int h)
239
     {
240
     Canvas stretchCanvas;
241
      
242
     stretchTexture = new DistortedTexture(w,h);
243
     stretchGrid    = new GridFlat(50,50*h/w);
244
     Bitmap stretchBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
245
     stretchCanvas = new Canvas(stretchBitmap);
246
      
247
     fpsW = scrWidth/5;
248
     fpsH = fpsW/2;
249

    
250
     mPaint.setTextSize(2*fpsH/3);
251
     mPaint.setColor(0xff008800);
252
     mPaint.setStyle(Style.FILL);
253
     stretchCanvas.drawRect(0, 0, w, h, mPaint);
254
     mPaint.setColor(0xffffffff);
255
      
256
     for(int i=0; i<=NUM_LINES ; i++ )
257
       {
258
       stretchCanvas.drawRect(w*i/NUM_LINES - 1,                 0,  w*i/NUM_LINES + 1,  h                , mPaint);
259
       stretchCanvas.drawRect(                0, h *i/NUM_LINES -1,  w                ,  h*i/NUM_LINES + 1, mPaint);
260
       }
261
        
262
     touchPoint= new Static3D(0,0,0);
263
        
264
     fpsTexture = new DistortedTexture(fpsW,fpsH);
265
     fpsGrid = new GridFlat(1,1);
266

    
267
     fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888);
268
     fpsCanvas = new Canvas(fpsBitmap);
269
        
270
     stretchTexture.setTexture(stretchBitmap);
271
     fpsTexture.setTexture(fpsBitmap);
272
     }
273

    
274
///////////////////////////////////////////////////////////////////////////////////////////////////
275

    
276
   void down(int x, int y)
277
     {
278
     int xt = x-scrWidth/4;
279
     int yt = y-scrHeight/4;
280
      
281
     if( xt<0 ) xt=0;
282
     if( xt>scrWidth/2 ) xt=scrWidth/2;
283
     if( yt<0 ) yt=0;
284
     if( yt>scrHeight/2 ) yt=scrHeight/2;
285
      
286
     touchPoint.set(xt,yt,0);
287

    
288
     switch(mMode)
289
       {
290
       case DISTORT: vDistort[0].set(0,0,0);
291
                     mLastEffect = stretchQueues.distort( mMovingDistortDynamic, touchPoint, mRegion);
292
                     break;
293
       case DEFORM : vDeform[0].set(0,0,0);
294
                     mLastEffect = stretchQueues.deform( mMovingDeformDynamic, touchPoint, mRegion);
295
                     break;
296
       case SHEAR  : vShear[0].set(0,0,0);
297
                     mLastEffect = stretchQueues.shear(mMovingShearDynamic, touchPoint);
298
                     break;
299
       }
300
     }
301
    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
   void move(int x, int y)
305
     {
306
     switch(mMode)
307
       {
308
       case DISTORT: vDistort[0].set(x,y);
309
                     break;
310
       case DEFORM:  vDeform[0].set(x,y);
311
                     break;
312
       case SHEAR:   vShear[0].set( (float)x/(scrWidth/2), (float)y/(scrHeight/2));
313
                     break;
314
       }
315
     }
316
    
317
///////////////////////////////////////////////////////////////////////////////////////////////////
318

    
319
   void up()
320
     {
321
     stretchQueues.abortEffect(mLastEffect);
322

    
323
     float damp = -0.65f;
324

    
325
     switch(mMode)
326
       {
327
       case DISTORT: for(int i=1; i<NUM_VECTORS-1; i++)
328
                       {
329
                       vDistort[i].set( vDistort[i-1].getX()*damp, vDistort[i-1].getY()*damp );
330
                       }
331
                     vDistort[NUM_VECTORS-1].set(0,0);
332
                     stretchQueues.distort( mReleasedDistortDynamic, touchPoint, mRegion);
333
                     break;
334
       case DEFORM : for(int i=1; i<NUM_VECTORS-1; i++)
335
                       {
336
                       vDeform[i].set( vDeform[i-1].getX()*damp, vDeform[i-1].getY()*damp );
337
                       }
338
                     vDeform[NUM_VECTORS-1].set(0,0);
339
                     stretchQueues.deform( mReleasedDeformDynamic, touchPoint, mRegion);
340
                     break;
341
       case SHEAR  : for(int i=1; i<NUM_VECTORS-1; i++)
342
                       {
343
                       vShear[i].set( vShear[i-1].getX()*damp, vShear[i-1].getY()*damp );
344
                       }
345
                     vShear[NUM_VECTORS-1].set(0,0);
346
                     stretchQueues.shear(mReleasedShearDynamic, touchPoint);
347
                     break;
348
       }
349
     }
350

    
351
///////////////////////////////////////////////////////////////////////////////////////////////////
352

    
353
   private void computeFPS(long currentTime)
354
     {
355
     if( lastTime!=0 )
356
       {
357
       currDuration++;
358
       if( currDuration>=NUM_FRAMES ) currDuration = 0;
359
       durations[NUM_FRAMES] += ((currentTime-lastTime)-durations[currDuration]);
360
       durations[currDuration] = currentTime-lastTime;
361

    
362
       fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
363
       }
364
      
365
     lastTime = currentTime;
366
     }
367
   }
(2-2/3)