Project

General

Profile

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

examples / src / main / java / org / distorted / examples / deform / DeformRenderer.java @ b0ebdf5e

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.DistortedEffects;
27
import org.distorted.library.DistortedScreen;
28
import org.distorted.library.DistortedTexture;
29
import org.distorted.library.MeshObject;
30
import org.distorted.library.MeshFlat;
31

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

    
38
import android.graphics.Bitmap;
39
import android.graphics.Canvas;
40
import android.graphics.Paint;
41
import android.graphics.Paint.Style;
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  = 100;
51

    
52
   private GLSurfaceView mView;
53
   private DistortedTexture fpsTexture, stretchTexture;
54
   private DistortedEffects fpsEffects, stretchEffects;
55
   private MeshObject fpsMesh, stretchMesh;
56
   private DistortedScreen mScreen;
57
   private Static3D touchPoint;
58

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

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

    
81
   private EffectNames mMode = EffectNames.DISTORT;
82
   private long mLastEffect = -1;
83

    
84
///////////////////////////////////////////////////////////////////////////////////////////////////
85

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

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

    
94
      fpsEffects = new DistortedEffects();
95
      stretchEffects = new DistortedEffects();
96

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

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

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

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

    
110
      vDistort = new Static3D[NUM_VECTORS];
111

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

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

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

    
126
      vDeform = new Static3D[NUM_VECTORS];
127

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

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

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

    
142
      vShear = new Static3D[NUM_VECTORS];
143

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

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

    
152
      mScreen = new DistortedScreen();
153
      }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
   void setMode(EffectNames mode)
158
      {
159
      mMode = mode;  
160
      }
161
   
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163

    
164
   void setRegionRadius(int r)
165
      {
166
      mRadius = ( r==100 ? 100.0f : r/100.0f);
167
      mRegion.set3(mRadius*scrWidth);
168
      }
169

    
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171
   
172
   public void onDrawFrame(GL10 glUnused)
173
     {
174
     mPaint.setColor(0xffffffff);
175
     fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint);
176
     mPaint.setColor(0xff000000);
177
     fpsCanvas.drawText(fpsString, fpsW/2, 5*fpsH/6, mPaint);
178
     fpsTexture.setTexture(fpsBitmap);
179

    
180
     long time = System.currentTimeMillis();
181

    
182
     mScreen.render(time);
183
     computeFPS(time);
184
     }
185

    
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187
    
188
   public void onSurfaceChanged(GL10 glUnused, int width, int height)
189
     {
190
     scrHeight = height;
191
     scrWidth  = width;
192

    
193
     mRegion.set3(mRadius*scrWidth);
194

    
195
     Canvas stretchCanvas;
196
     int w=width/2;
197
     int h=height/2;
198

    
199
     stretchMesh = new MeshFlat(50,50*h/w);
200
     Bitmap stretchBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
201
     stretchCanvas = new Canvas(stretchBitmap);
202

    
203
     fpsW = scrWidth/5;
204
     fpsH = fpsW/2;
205

    
206
     mPaint.setTextSize(2*fpsH/3);
207
     mPaint.setColor(0xff008800);
208
     mPaint.setStyle(Style.FILL);
209
     stretchCanvas.drawRect(0, 0, w, h, mPaint);
210
     mPaint.setColor(0xffffffff);
211

    
212
     for(int i=0; i<=NUM_LINES ; i++ )
213
       {
214
       stretchCanvas.drawRect(w*i/NUM_LINES - 1,                 0,  w*i/NUM_LINES + 1,  h                , mPaint);
215
       stretchCanvas.drawRect(                0, h *i/NUM_LINES -1,  w                ,  h*i/NUM_LINES + 1, mPaint);
216
       }
217

    
218
     touchPoint= new Static3D(0,0,0);
219
     fpsMesh = new MeshFlat(1,1);
220

    
221
     fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888);
222
     fpsCanvas = new Canvas(fpsBitmap);
223

    
224
     if( stretchTexture==null ) stretchTexture = new DistortedTexture(w,h);
225
     stretchTexture.setTexture(stretchBitmap);
226

    
227
     if( fpsTexture==null ) fpsTexture = new DistortedTexture(fpsW,fpsH);
228
     fpsTexture.setTexture(fpsBitmap);
229

    
230
     stretchEffects.abortAllEffects();
231
     fpsEffects.abortAllEffects();
232
     stretchEffects.move( new Static3D(scrWidth/4,scrHeight/4,0) );
233
     fpsEffects.move( new Static3D(5,5,0) );
234

    
235
     mScreen.detachAll();
236
     mScreen.attach(stretchTexture,stretchEffects,stretchMesh);
237
     mScreen.attach(fpsTexture,fpsEffects,fpsMesh);
238

    
239
     mScreen.resize(width, height);
240
     }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243
    
244
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
245
     {
246
     DistortedEffects.enableEffect(EffectNames.DISTORT);
247
     DistortedEffects.enableEffect(EffectNames.DEFORM);
248

    
249
     try
250
       {
251
       Distorted.onCreate(mView.getContext());
252
       }
253
     catch(Exception ex)
254
       {
255
       android.util.Log.e("DeformRenderer", ex.toString() );
256
       }
257
     }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
   void down(int x, int y)
262
     {
263
     int xt = x-scrWidth/4;
264
     int yt = y-scrHeight/4;
265
      
266
     if( xt<0 ) xt=0;
267
     if( xt>scrWidth/2 ) xt=scrWidth/2;
268
     if( yt<0 ) yt=0;
269
     if( yt>scrHeight/2 ) yt=scrHeight/2;
270
      
271
     touchPoint.set(xt,yt,0);
272

    
273
     switch(mMode)
274
       {
275
       case DISTORT: vDistort[0].set(0,0,0);
276
                     mLastEffect = stretchEffects.distort( mMovingDistortDynamic, touchPoint, mRegion);
277
                     break;
278
       case DEFORM : vDeform[0].set(0,0,0);
279
                     mLastEffect = stretchEffects.deform( mMovingDeformDynamic, touchPoint, mRegion);
280
                     break;
281
       case SHEAR  : vShear[0].set(0,0,0);
282
                     mLastEffect = stretchEffects.shear(mMovingShearDynamic, touchPoint);
283
                     break;
284
       }
285
     }
286
    
287
///////////////////////////////////////////////////////////////////////////////////////////////////
288

    
289
   void move(int x, int y)
290
     {
291
     switch(mMode)
292
       {
293
       case DISTORT: vDistort[0].set(x,y);
294
                     break;
295
       case DEFORM:  vDeform[0].set(x,y);
296
                     break;
297
       case SHEAR:   vShear[0].set( (float)x/(scrWidth/2), (float)y/(scrHeight/2));
298
                     break;
299
       }
300
     }
301
    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
   void up()
305
     {
306
     stretchEffects.abortEffect(mLastEffect);
307

    
308
     float damp = -0.65f;
309

    
310
     switch(mMode)
311
       {
312
       case DISTORT: for(int i=1; i<NUM_VECTORS-1; i++)
313
                       {
314
                       vDistort[i].set( vDistort[i-1].getX()*damp, vDistort[i-1].getY()*damp );
315
                       }
316
                     vDistort[NUM_VECTORS-1].set(0,0);
317
                     stretchEffects.distort( mReleasedDistortDynamic, touchPoint, mRegion);
318
                     break;
319
       case DEFORM : for(int i=1; i<NUM_VECTORS-1; i++)
320
                       {
321
                       vDeform[i].set( vDeform[i-1].getX()*damp, vDeform[i-1].getY()*damp );
322
                       }
323
                     vDeform[NUM_VECTORS-1].set(0,0);
324
                     stretchEffects.deform( mReleasedDeformDynamic, touchPoint, mRegion);
325
                     break;
326
       case SHEAR  : for(int i=1; i<NUM_VECTORS-1; i++)
327
                       {
328
                       vShear[i].set( vShear[i-1].getX()*damp, vShear[i-1].getY()*damp );
329
                       }
330
                     vShear[NUM_VECTORS-1].set(0,0);
331
                     stretchEffects.shear(mReleasedShearDynamic, touchPoint);
332
                     break;
333
       }
334
     }
335

    
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337

    
338
   private void computeFPS(long currentTime)
339
     {
340
     if( lastTime!=0 )
341
       {
342
       currDuration++;
343
       if( currDuration>=NUM_FRAMES ) currDuration = 0;
344
       durations[NUM_FRAMES] += ((currentTime-lastTime)-durations[currDuration]);
345
       durations[currDuration] = currentTime-lastTime;
346

    
347
       fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
348
       }
349
      
350
     lastTime = currentTime;
351
     }
352
   }
(2-2/3)