Project

General

Profile

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

examples / src / main / java / org / distorted / examples / movingeffects / MovingEffectsSurfaceView.java @ df80818c

1 bc0a685b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                               //
3
//                                                                                               //
4 71c8884f Leszek Koltunski
// This file is part of Distorted.                                                               //
5 bc0a685b Leszek Koltunski
//                                                                                               //
6 71c8884f Leszek Koltunski
// Distorted is free software: you can redistribute it and/or modify                             //
7 bc0a685b Leszek Koltunski
// 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 71c8884f Leszek Koltunski
// Distorted is distributed in the hope that it will be useful,                                  //
12 bc0a685b Leszek Koltunski
// 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 71c8884f Leszek Koltunski
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18 bc0a685b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 5068fa06 Leszek Koltunski
package org.distorted.examples.movingeffects;
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.graphics.Canvas;
26
import android.graphics.Paint;
27
import android.graphics.Paint.Style;
28
import android.opengl.GLSurfaceView;
29
import android.view.MotionEvent;
30
import android.util.AttributeSet;
31
32 6173632c Leszek Koltunski
import org.distorted.library.effect.EffectType;
33
import org.distorted.library.effect.FragmentEffectAlpha;
34
import org.distorted.library.effect.FragmentEffectChroma;
35 01cef452 Leszek Koltunski
import org.distorted.library.effect.VertexEffectDeform;
36 6173632c Leszek Koltunski
import org.distorted.library.effect.VertexEffectSink;
37
import org.distorted.library.effect.VertexEffectSwirl;
38 01782e85 Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
39 334c13fa Leszek Koltunski
import org.distorted.library.type.Dynamic3D;
40 59759251 Leszek Koltunski
import org.distorted.library.type.Static1D;
41 7589635e Leszek Koltunski
import org.distorted.library.type.Static3D;
42
import org.distorted.library.type.Static4D;
43 427ab7bf Leszek Koltunski
44 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
45 427ab7bf Leszek Koltunski
46
public class MovingEffectsSurfaceView extends GLSurfaceView
47
    {
48
    private static final int LOOP_TIME = 5000;
49 97dadfe5 Leszek Koltunski
    private static final int NUM_POINTS= 100;
50 6173632c Leszek Koltunski
51 427ab7bf Leszek Koltunski
    public static final int EFFECT_POINTS=0;
52
    public static final int EFFECT_BUBBLE=1;
53
    public static final int EFFECT_SINK  =2;
54
    public static final int EFFECT_TRANS =3;
55 4348b52e Leszek Koltunski
    public static final int EFFECT_CHROMA=4;
56 427ab7bf Leszek Koltunski
    public static final int EFFECT_SWIRL =5;
57 59759251 Leszek Koltunski
58 97dadfe5 Leszek Koltunski
    private static final Object lock = new Object();
59 4562f295 Leszek Koltunski
60 1585ba24 Leszek Koltunski
    private Dynamic3D mCenter;
61 4562f295 Leszek Koltunski
    private Paint mPaint;
62
    private int moving;
63 8eed34d3 Leszek Koltunski
    private int mScrWidth, mScrHeight;
64 4562f295 Leszek Koltunski
    private long mTime = 0;
65 427ab7bf Leszek Koltunski
    
66 4562f295 Leszek Koltunski
    private int mCurrEffect;
67 1585ba24 Leszek Koltunski
    private int mSize1, mSize2;
68 01cef452 Leszek Koltunski
    private Static3D mDeform;
69 97dadfe5 Leszek Koltunski
70 f6d884d5 Leszek Koltunski
    private MovingEffectsRenderer mRenderer;
71
72 01cef452 Leszek Koltunski
    private VertexEffectDeform mEffectDeform;
73 6173632c Leszek Koltunski
    private VertexEffectSink mEffectSink;
74
    private VertexEffectSwirl mEffectSwirl;
75
    private FragmentEffectChroma mEffectChroma;
76
    private FragmentEffectAlpha mEffectAlpha;
77
78 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
79 427ab7bf Leszek Koltunski
    
80 41a81a14 Leszek Koltunski
    public MovingEffectsSurfaceView(Context context, AttributeSet attrs)
81 427ab7bf Leszek Koltunski
      {
82 41a81a14 Leszek Koltunski
      super(context, attrs);
83 59759251 Leszek Koltunski
84 427ab7bf Leszek Koltunski
      mCurrEffect=EFFECT_POINTS;
85
      mPaint = new Paint();
86
      mPaint.setStyle(Style.FILL);
87
      moving = -1;
88
      
89 c7a31368 Leszek Koltunski
      mCenter = new Dynamic3D(LOOP_TIME,0.0f);
90
      mDeform = new Static3D(0,0,0.15f);
91 59759251 Leszek Koltunski
92 427ab7bf Leszek Koltunski
      if(!isInEditMode())
93
        {
94 e4330c89 Leszek Koltunski
        mRenderer = new MovingEffectsRenderer(this);
95
96 427ab7bf Leszek Koltunski
        setFocusable(true);
97
        setFocusableInTouchMode(true);
98 e4330c89 Leszek Koltunski
        final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
99
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
100
        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
101 f6d884d5 Leszek Koltunski
        setRenderer(mRenderer);
102 6173632c Leszek Koltunski
103 c7a31368 Leszek Koltunski
        Static3D regionFrag = new Static3D(0.15f,0.15f,0.15f);
104
        Static4D regionVert = new Static4D(0,0,0,0.15f);
105
106
        mEffectDeform  = new VertexEffectDeform  ( mDeform          , mCenter, regionVert);
107
        mEffectSink    = new VertexEffectSink    (new Static1D(10)  , mCenter, regionVert);
108
        mEffectSwirl   = new VertexEffectSwirl   (new Static1D(30)  , mCenter, regionVert);
109
        mEffectAlpha   = new FragmentEffectAlpha (new Static1D(0.5f), mCenter, regionFrag, true);
110
        mEffectChroma  = new FragmentEffectChroma(new Static1D(0.5f), new Static3D(1,0,0), mCenter, regionFrag, true);
111 e4330c89 Leszek Koltunski
        }
112 427ab7bf Leszek Koltunski
      }
113
114 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
115 427ab7bf Leszek Koltunski
116 4562f295 Leszek Koltunski
    public void onSurfaceChanged(int width,int height)
117 427ab7bf Leszek Koltunski
      {
118 398fb2ee Leszek Koltunski
      int max = width>height ? width:height;
119 97dadfe5 Leszek Koltunski
120 8eed34d3 Leszek Koltunski
      mScrWidth  = width;
121 a4d59c0b Leszek Koltunski
      mScrHeight = height;
122
123 398fb2ee Leszek Koltunski
      mSize1 = max/200;
124
      mSize2 = max/80;
125 427ab7bf Leszek Koltunski
      }
126
127 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
128 427ab7bf Leszek Koltunski
129 4562f295 Leszek Koltunski
    public int getCurrentEffect()
130 427ab7bf Leszek Koltunski
      {
131
      return mCurrEffect;
132
      }
133
    
134 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
135 427ab7bf Leszek Koltunski
    
136 4562f295 Leszek Koltunski
    public void Bubble()
137 427ab7bf Leszek Koltunski
      {
138
      if( mCurrEffect==EFFECT_BUBBLE ) return;     
139
      
140
      synchronized(lock)
141
        {
142 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
143 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
144
        q.abortByType(EffectType.FRAGMENT);
145 01cef452 Leszek Koltunski
        q.apply(mEffectDeform);
146 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_BUBBLE;
147
        }
148
      }
149
150 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
151 427ab7bf Leszek Koltunski
152 4562f295 Leszek Koltunski
    public void Sink()
153 427ab7bf Leszek Koltunski
      {
154
      if( mCurrEffect==EFFECT_SINK ) return; 
155
         
156
      synchronized(lock)
157
        {
158 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
159 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
160
        q.abortByType(EffectType.FRAGMENT);
161
        q.apply(mEffectSink);
162 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_SINK;
163
        }
164
      }
165
166 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
167 427ab7bf Leszek Koltunski
168 4562f295 Leszek Koltunski
    public void Chroma()
169 427ab7bf Leszek Koltunski
      {
170 4348b52e Leszek Koltunski
      if( mCurrEffect==EFFECT_CHROMA ) return;
171 427ab7bf Leszek Koltunski
         
172
      synchronized(lock)
173
        {
174 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
175 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
176
        q.abortByType(EffectType.FRAGMENT);
177
        q.apply(mEffectChroma);
178 4348b52e Leszek Koltunski
        mCurrEffect = EFFECT_CHROMA;
179 427ab7bf Leszek Koltunski
        }
180
      }
181
182 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
183 427ab7bf Leszek Koltunski
184 4562f295 Leszek Koltunski
    public void Transparency()
185 427ab7bf Leszek Koltunski
      {
186
      if( mCurrEffect==EFFECT_TRANS ) return;   
187
      
188
      synchronized(lock)
189
        {
190 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
191 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
192
        q.abortByType(EffectType.FRAGMENT);
193
        q.apply(mEffectAlpha);
194 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_TRANS;
195
        }
196
      }
197
198 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
199 427ab7bf Leszek Koltunski
200 4562f295 Leszek Koltunski
    public void Swirl()
201 427ab7bf Leszek Koltunski
      {
202
      if( mCurrEffect==EFFECT_SWIRL ) return;   
203
      
204
      synchronized(lock)
205
        {
206 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
207 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
208
        q.abortByType(EffectType.FRAGMENT);
209
        q.apply(mEffectSwirl);
210 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_SWIRL;
211
        }
212
      }
213
    
214 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
215 427ab7bf Leszek Koltunski
216 4562f295 Leszek Koltunski
    public void Abort()
217 427ab7bf Leszek Koltunski
      {
218
      synchronized(lock)
219
        {
220 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
221 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
222
        q.abortByType(EffectType.FRAGMENT);
223 1585ba24 Leszek Koltunski
        mCenter.removeAll();
224 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_POINTS;
225 3c8b1903 Leszek Koltunski
        mRenderer.setRefresh();
226 427ab7bf Leszek Koltunski
        }
227
      }
228
229 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
230 427ab7bf Leszek Koltunski
 
231 4562f295 Leszek Koltunski
    public void drawCurve(Canvas c, long time)
232 427ab7bf Leszek Koltunski
      {
233
      synchronized(lock)
234
        {  
235 1585ba24 Leszek Koltunski
        int len = mCenter.getNumPoints();
236 97dadfe5 Leszek Koltunski
237 334c13fa Leszek Koltunski
        float[] drawCoord = new float[3];
238
        Static3D cu;
239 3c8b1903 Leszek Koltunski
240 427ab7bf Leszek Koltunski
        if( len>=2 )
241
          {
242 c7a31368 Leszek Koltunski
          final float step = (float)LOOP_TIME/(NUM_POINTS+1);
243 97dadfe5 Leszek Koltunski
244
          for(int i=0; i<NUM_POINTS; i++)
245 427ab7bf Leszek Koltunski
            {
246 3c8b1903 Leszek Koltunski
            mPaint.setColor( 0xffffffff );
247 1585ba24 Leszek Koltunski
            mCenter.get( drawCoord, 0, (long)(i*step) );
248 df80818c Leszek Koltunski
            c.drawCircle( (drawCoord[0]+0.5f)*mScrWidth, 0.5f*mScrHeight-drawCoord[1]*mScrWidth, mSize1, mPaint );
249 427ab7bf Leszek Koltunski
            }
250
          }
251
     
252
        mPaint.setColor(0xffff0000);
253
      
254
        for(int curr=0; curr<len; curr++)
255
          {       
256 1585ba24 Leszek Koltunski
          cu = mCenter.getPoint(curr);
257 df80818c Leszek Koltunski
          c.drawCircle( (cu.get0()+0.5f)*mScrWidth, 0.5f*mScrHeight-cu.get1()*mScrWidth, mSize2, mPaint);
258 427ab7bf Leszek Koltunski
          }
259
        
260
        if( time-mTime > LOOP_TIME ) mTime = time;
261
        }
262
      }
263
       
264 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
265 427ab7bf Leszek Koltunski
    
266 a4d59c0b Leszek Koltunski
    @Override
267
    public boolean onTouchEvent(MotionEvent event)
268 427ab7bf Leszek Koltunski
      {
269
      if( mCurrEffect!=EFFECT_POINTS ) return true;   
270 97dadfe5 Leszek Koltunski
271 c7a31368 Leszek Koltunski
      float xDown = event.getX()/mScrWidth - 0.5f;
272 df80818c Leszek Koltunski
      float yDown = (0.5f*mScrHeight - event.getY())/mScrWidth;
273 97dadfe5 Leszek Koltunski
274 427ab7bf Leszek Koltunski
      switch(event.getAction())
275
        {
276 8eed34d3 Leszek Koltunski
        case MotionEvent.ACTION_DOWN: float gx, gy;
277 e3eab072 Leszek Koltunski
                                      Static3D dv;
278 1585ba24 Leszek Koltunski
                                      int len = mCenter.getNumPoints();
279 427ab7bf Leszek Koltunski
                                 
280
                                      for(int g=0; g<len; g++)
281
                                        {
282 1585ba24 Leszek Koltunski
                                        dv = mCenter.getPoint(g);
283 bcbd5b45 Leszek Koltunski
                                        gx = dv.get0();
284
                                        gy = dv.get1();
285 398fb2ee Leszek Koltunski
286 bcbd5b45 Leszek Koltunski
                                        float Z = mDeform.get2()/7;
287 398fb2ee Leszek Koltunski
288
                                        if( (xDown-gx)*(xDown-gx) + (yDown-gy)*(yDown-gy) < Z*Z )
289 427ab7bf Leszek Koltunski
                                          {
290
                                          moving = g;
291
                                          break;
292
                                          }
293
                                        }
294
                                      if( moving<0 )
295
                                        {
296
                                        synchronized(lock)
297
                                          {
298 1585ba24 Leszek Koltunski
                                          mCenter.add(new Static3D(xDown,yDown,0));
299 427ab7bf Leszek Koltunski
                                          }
300 3c8b1903 Leszek Koltunski
                                        }
301
                                      mRenderer.setRefresh();
302 427ab7bf Leszek Koltunski
                                      break;
303
        case MotionEvent.ACTION_MOVE: if( moving>=0 )
304
                                        {
305 1585ba24 Leszek Koltunski
                                        mCenter.setPoint(moving, xDown, yDown, 0);
306 3c8b1903 Leszek Koltunski
                                        }
307
                                      mRenderer.setRefresh();
308 427ab7bf Leszek Koltunski
                                      break;
309
        case MotionEvent.ACTION_UP  : moving = -1;
310
                                      break;
311
        }
312
      return true;
313
      }
314
  }