Project

General

Profile

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

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

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 427ab7bf Leszek Koltunski
20 5068fa06 Leszek Koltunski
package org.distorted.examples.deform;
21 427ab7bf Leszek Koltunski
22
import javax.microedition.khronos.egl.EGLConfig;
23
import javax.microedition.khronos.opengles.GL10;
24
25 5068fa06 Leszek Koltunski
import org.distorted.library.Distorted;
26 d04a4886 Leszek Koltunski
import org.distorted.library.DistortedEffects;
27 d218d64e leszek
import org.distorted.library.DistortedScreen;
28 f6d884d5 Leszek Koltunski
import org.distorted.library.DistortedTexture;
29 b01acdaf Leszek Koltunski
import org.distorted.library.MeshObject;
30
import org.distorted.library.MeshFlat;
31 e8b6aa95 Leszek Koltunski
32 7abd1d00 Leszek Koltunski
import org.distorted.library.EffectNames;
33 95593730 Leszek Koltunski
import org.distorted.library.EffectTypes;
34 7589635e Leszek Koltunski
import org.distorted.library.type.Dynamic3D;
35
import org.distorted.library.type.Static3D;
36
import org.distorted.library.type.Static4D;
37 427ab7bf Leszek Koltunski
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 f6d884d5 Leszek Koltunski
   {
48 e8b6aa95 Leszek Koltunski
   private static final int NUM_VECTORS =  8;
49
   private static final int NUM_LINES   = 10;
50 28fe91ae leszek
   private static final int NUM_FRAMES  = 100;
51 427ab7bf Leszek Koltunski
52
   private GLSurfaceView mView;
53 f6d884d5 Leszek Koltunski
   private DistortedTexture fpsTexture, stretchTexture;
54 d04a4886 Leszek Koltunski
   private DistortedEffects fpsEffects, stretchEffects;
55 b01acdaf Leszek Koltunski
   private MeshObject fpsMesh, stretchMesh;
56 d218d64e leszek
   private DistortedScreen mScreen;
57 7589635e Leszek Koltunski
   private Static3D touchPoint;
58 7abd1d00 Leszek Koltunski
59 30c71dd5 Leszek Koltunski
   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 6161fe9a Leszek Koltunski
   private Static4D mRegion;
70 427ab7bf Leszek Koltunski
   private Canvas fpsCanvas;
71 30c71dd5 Leszek Koltunski
   private Bitmap fpsBitmap;
72 427ab7bf Leszek Koltunski
   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 f4f3a440 Leszek Koltunski
   private float mRadius;
80 7abd1d00 Leszek Koltunski
81 30c71dd5 Leszek Koltunski
   private EffectNames mMode = EffectNames.DISTORT;
82
   private long mLastEffect = -1;
83 7abd1d00 Leszek Koltunski
84 427ab7bf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
85
86 30c71dd5 Leszek Koltunski
   DeformRenderer(GLSurfaceView view)
87 427ab7bf Leszek Koltunski
      { 
88
      mView = view;
89 f6d884d5 Leszek Koltunski
90
      mPaint = new Paint();
91
      mPaint.setAntiAlias(true);
92
      mPaint.setTextAlign(Paint.Align.CENTER);
93
94 d04a4886 Leszek Koltunski
      fpsEffects = new DistortedEffects();
95
      stretchEffects = new DistortedEffects();
96 f6d884d5 Leszek Koltunski
97 f4f3a440 Leszek Koltunski
      mRegion = new Static4D(0,0,0,0);
98 7589635e Leszek Koltunski
99 30c71dd5 Leszek Koltunski
      durations = new long[NUM_FRAMES+1];
100 7abd1d00 Leszek Koltunski
      currDuration = 0;
101
102 f6d884d5 Leszek Koltunski
      for(int i=0; i<NUM_FRAMES+1; i++) durations[i]=0;
103 7abd1d00 Leszek Koltunski
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 7589635e Leszek Koltunski
110 7abd1d00 Leszek Koltunski
      vDistort = new Static3D[NUM_VECTORS];
111 7589635e Leszek Koltunski
112 427ab7bf Leszek Koltunski
      for(int i=0; i<NUM_VECTORS; i++)
113
        {
114 7abd1d00 Leszek Koltunski
        vDistort[i] = new Static3D(0,0,0);
115
        mReleasedDistortDynamic.add(vDistort[i]);
116 427ab7bf Leszek Koltunski
        }
117 7589635e Leszek Koltunski
118 7abd1d00 Leszek Koltunski
      mMovingDistortDynamic.add(vDistort[0]);
119 7589635e Leszek Koltunski
120 7abd1d00 Leszek Koltunski
      // 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 427ab7bf Leszek Koltunski
        {
130 7abd1d00 Leszek Koltunski
        vDeform[i] = new Static3D(0,0,0);
131
        mReleasedDeformDynamic.add(vDeform[i]);
132 427ab7bf Leszek Koltunski
        }
133 7abd1d00 Leszek Koltunski
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 392e16fd Leszek Koltunski
152 d218d64e leszek
      mScreen = new DistortedScreen();
153 427ab7bf Leszek Koltunski
      }
154
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156
157 30c71dd5 Leszek Koltunski
   void setMode(EffectNames mode)
158 427ab7bf Leszek Koltunski
      {
159
      mMode = mode;  
160
      }
161
   
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163
164 30c71dd5 Leszek Koltunski
   void setRegionRadius(int r)
165 427ab7bf Leszek Koltunski
      {
166 f4f3a440 Leszek Koltunski
      mRadius = ( r==100 ? 100.0f : r/100.0f);
167
      mRegion.set3(mRadius*scrWidth);
168 427ab7bf Leszek Koltunski
      }
169
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171
   
172 f6d884d5 Leszek Koltunski
   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 fe59d375 Leszek Koltunski
180
     long time = System.currentTimeMillis();
181
182
     mScreen.render(time);
183 f6d884d5 Leszek Koltunski
     computeFPS(time);
184
     }
185 427ab7bf Leszek Koltunski
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187
    
188 f6d884d5 Leszek Koltunski
   public void onSurfaceChanged(GL10 glUnused, int width, int height)
189
     {
190
     scrHeight = height;
191
     scrWidth  = width;
192 6161fe9a Leszek Koltunski
193 f4f3a440 Leszek Koltunski
     mRegion.set3(mRadius*scrWidth);
194
195 f6d884d5 Leszek Koltunski
     Canvas stretchCanvas;
196 b0ebdf5e Leszek Koltunski
     int w=width/2;
197
     int h=height/2;
198
199 b01acdaf Leszek Koltunski
     stretchMesh = new MeshFlat(50,50*h/w);
200 f6d884d5 Leszek Koltunski
     Bitmap stretchBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
201
     stretchCanvas = new Canvas(stretchBitmap);
202 b0ebdf5e Leszek Koltunski
203 f6d884d5 Leszek Koltunski
     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 b0ebdf5e Leszek Koltunski
212 f6d884d5 Leszek Koltunski
     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 b0ebdf5e Leszek Koltunski
218 f6d884d5 Leszek Koltunski
     touchPoint= new Static3D(0,0,0);
219 b01acdaf Leszek Koltunski
     fpsMesh = new MeshFlat(1,1);
220 e8b6aa95 Leszek Koltunski
221 f6d884d5 Leszek Koltunski
     fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888);
222
     fpsCanvas = new Canvas(fpsBitmap);
223 b0ebdf5e Leszek Koltunski
224
     if( stretchTexture==null ) stretchTexture = new DistortedTexture(w,h);
225 f6d884d5 Leszek Koltunski
     stretchTexture.setTexture(stretchBitmap);
226 b0ebdf5e Leszek Koltunski
227
     if( fpsTexture==null ) fpsTexture = new DistortedTexture(fpsW,fpsH);
228 f6d884d5 Leszek Koltunski
     fpsTexture.setTexture(fpsBitmap);
229 b0ebdf5e Leszek Koltunski
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 f6d884d5 Leszek Koltunski
     }
258 427ab7bf Leszek Koltunski
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260
261 f6d884d5 Leszek Koltunski
   void down(int x, int y)
262
     {
263
     int xt = x-scrWidth/4;
264
     int yt = y-scrHeight/4;
265 427ab7bf Leszek Koltunski
      
266 f6d884d5 Leszek Koltunski
     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 427ab7bf Leszek Koltunski
      
271 f6d884d5 Leszek Koltunski
     touchPoint.set(xt,yt,0);
272
273
     switch(mMode)
274
       {
275
       case DISTORT: vDistort[0].set(0,0,0);
276 392e16fd Leszek Koltunski
                     mLastEffect = stretchEffects.distort( mMovingDistortDynamic, touchPoint, mRegion);
277 f6d884d5 Leszek Koltunski
                     break;
278
       case DEFORM : vDeform[0].set(0,0,0);
279 392e16fd Leszek Koltunski
                     mLastEffect = stretchEffects.deform( mMovingDeformDynamic, touchPoint, mRegion);
280 f6d884d5 Leszek Koltunski
                     break;
281
       case SHEAR  : vShear[0].set(0,0,0);
282 392e16fd Leszek Koltunski
                     mLastEffect = stretchEffects.shear(mMovingShearDynamic, touchPoint);
283 f6d884d5 Leszek Koltunski
                     break;
284
       }
285
     }
286 427ab7bf Leszek Koltunski
    
287
///////////////////////////////////////////////////////////////////////////////////////////////////
288
289 f6d884d5 Leszek Koltunski
   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 427ab7bf Leszek Koltunski
    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303
304 f6d884d5 Leszek Koltunski
   void up()
305
     {
306 392e16fd Leszek Koltunski
     stretchEffects.abortEffect(mLastEffect);
307 f6d884d5 Leszek Koltunski
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 392e16fd Leszek Koltunski
                     stretchEffects.distort( mReleasedDistortDynamic, touchPoint, mRegion);
318 f6d884d5 Leszek Koltunski
                     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 392e16fd Leszek Koltunski
                     stretchEffects.deform( mReleasedDeformDynamic, touchPoint, mRegion);
325 f6d884d5 Leszek Koltunski
                     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 392e16fd Leszek Koltunski
                     stretchEffects.shear(mReleasedShearDynamic, touchPoint);
332 f6d884d5 Leszek Koltunski
                     break;
333
       }
334
     }
335 427ab7bf Leszek Koltunski
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337
338 f6d884d5 Leszek Koltunski
   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 427ab7bf Leszek Koltunski
      
350 f6d884d5 Leszek Koltunski
     lastTime = currentTime;
351
     }
352
   }