Project

General

Profile

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

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

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 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
import org.distorted.library.effect.VertexEffectDistort;
36
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 398fb2ee Leszek Koltunski
    private Static4D mRegionVertex;
62 1585ba24 Leszek Koltunski
    private Static3D mRegionFragment;
63 4562f295 Leszek Koltunski
64
    private Paint mPaint;
65
    private int moving;
66 a4d59c0b Leszek Koltunski
    private int mScrHeight;
67 4562f295 Leszek Koltunski
    private long mTime = 0;
68 427ab7bf Leszek Koltunski
    
69 4562f295 Leszek Koltunski
    private int mCurrEffect;
70 1585ba24 Leszek Koltunski
    private int mSize1, mSize2;
71 398fb2ee Leszek Koltunski
    private Static3D mDistort;
72 97dadfe5 Leszek Koltunski
73 f6d884d5 Leszek Koltunski
    private MovingEffectsRenderer mRenderer;
74
75 6173632c Leszek Koltunski
    private VertexEffectDistort mEffectDistort;
76
    private VertexEffectSink mEffectSink;
77
    private VertexEffectSwirl mEffectSwirl;
78
    private FragmentEffectChroma mEffectChroma;
79
    private FragmentEffectAlpha mEffectAlpha;
80
81 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
82 427ab7bf Leszek Koltunski
    
83 41a81a14 Leszek Koltunski
    public MovingEffectsSurfaceView(Context context, AttributeSet attrs)
84 427ab7bf Leszek Koltunski
      {
85 41a81a14 Leszek Koltunski
      super(context, attrs);
86 59759251 Leszek Koltunski
87 427ab7bf Leszek Koltunski
      mCurrEffect=EFFECT_POINTS;
88
      mPaint = new Paint();
89
      mPaint.setStyle(Style.FILL);
90
      moving = -1;
91
      
92 1585ba24 Leszek Koltunski
      mCenter         = new Dynamic3D(LOOP_TIME,0.0f);
93
      mRegionFragment = new Static3D(0,0,0);
94 398fb2ee Leszek Koltunski
      mRegionVertex   = new Static4D(0,0,0,0);
95
      mDistort        = new Static3D(0,0,0);
96 59759251 Leszek Koltunski
97 427ab7bf Leszek Koltunski
      if(!isInEditMode())
98
        {
99 e4330c89 Leszek Koltunski
        mRenderer = new MovingEffectsRenderer(this);
100
101 427ab7bf Leszek Koltunski
        setFocusable(true);
102
        setFocusableInTouchMode(true);
103 e4330c89 Leszek Koltunski
        final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
104
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
105
        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
106 f6d884d5 Leszek Koltunski
        setRenderer(mRenderer);
107 6173632c Leszek Koltunski
108 1585ba24 Leszek Koltunski
        mEffectDistort = new VertexEffectDistort ( mDistort         , mCenter, mRegionVertex);
109
        mEffectSink    = new VertexEffectSink    (new Static1D(10)  , mCenter, mRegionVertex);
110
        mEffectSwirl   = new VertexEffectSwirl   (new Static1D(30)  , mCenter, mRegionVertex);
111
        mEffectAlpha   = new FragmentEffectAlpha (new Static1D(0.5f), mCenter, mRegionFragment, true);
112
        mEffectChroma  = new FragmentEffectChroma(new Static1D(0.5f), new Static3D(1,0,0), mCenter, mRegionFragment, true);
113 e4330c89 Leszek Koltunski
        }
114 427ab7bf Leszek Koltunski
      }
115
116 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
117 427ab7bf Leszek Koltunski
118 4562f295 Leszek Koltunski
    public void onSurfaceChanged(int width,int height)
119 427ab7bf Leszek Koltunski
      {
120 398fb2ee Leszek Koltunski
      int max = width>height ? width:height;
121 97dadfe5 Leszek Koltunski
122 a4d59c0b Leszek Koltunski
      mScrHeight = height;
123
124 398fb2ee Leszek Koltunski
      mSize1 = max/200;
125
      mSize2 = max/80;
126 1585ba24 Leszek Koltunski
      int rad= max/6;
127 97dadfe5 Leszek Koltunski
128 1585ba24 Leszek Koltunski
      mRegionVertex.set(0,0,0,rad);
129
      mRegionFragment.set(rad,rad,rad);
130 398fb2ee Leszek Koltunski
      mDistort.set3(max/10);
131 427ab7bf Leszek Koltunski
      }
132
133 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
134 427ab7bf Leszek Koltunski
135 4562f295 Leszek Koltunski
    public int getCurrentEffect()
136 427ab7bf Leszek Koltunski
      {
137
      return mCurrEffect;
138
      }
139
    
140 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
141 427ab7bf Leszek Koltunski
    
142 4562f295 Leszek Koltunski
    public void Bubble()
143 427ab7bf Leszek Koltunski
      {
144
      if( mCurrEffect==EFFECT_BUBBLE ) return;     
145
      
146
      synchronized(lock)
147
        {
148 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
149 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
150
        q.abortByType(EffectType.FRAGMENT);
151
        q.apply(mEffectDistort);
152 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_BUBBLE;
153
        }
154
      }
155
156 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
157 427ab7bf Leszek Koltunski
158 4562f295 Leszek Koltunski
    public void Sink()
159 427ab7bf Leszek Koltunski
      {
160
      if( mCurrEffect==EFFECT_SINK ) return; 
161
         
162
      synchronized(lock)
163
        {
164 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
165 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
166
        q.abortByType(EffectType.FRAGMENT);
167
        q.apply(mEffectSink);
168 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_SINK;
169
        }
170
      }
171
172 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
173 427ab7bf Leszek Koltunski
174 4562f295 Leszek Koltunski
    public void Chroma()
175 427ab7bf Leszek Koltunski
      {
176 4348b52e Leszek Koltunski
      if( mCurrEffect==EFFECT_CHROMA ) return;
177 427ab7bf Leszek Koltunski
         
178
      synchronized(lock)
179
        {
180 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
181 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
182
        q.abortByType(EffectType.FRAGMENT);
183
        q.apply(mEffectChroma);
184 4348b52e Leszek Koltunski
        mCurrEffect = EFFECT_CHROMA;
185 427ab7bf Leszek Koltunski
        }
186
      }
187
188 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
189 427ab7bf Leszek Koltunski
190 4562f295 Leszek Koltunski
    public void Transparency()
191 427ab7bf Leszek Koltunski
      {
192
      if( mCurrEffect==EFFECT_TRANS ) return;   
193
      
194
      synchronized(lock)
195
        {
196 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
197 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
198
        q.abortByType(EffectType.FRAGMENT);
199
        q.apply(mEffectAlpha);
200 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_TRANS;
201
        }
202
      }
203
204 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
205 427ab7bf Leszek Koltunski
206 4562f295 Leszek Koltunski
    public void Swirl()
207 427ab7bf Leszek Koltunski
      {
208
      if( mCurrEffect==EFFECT_SWIRL ) return;   
209
      
210
      synchronized(lock)
211
        {
212 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
213 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
214
        q.abortByType(EffectType.FRAGMENT);
215
        q.apply(mEffectSwirl);
216 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_SWIRL;
217
        }
218
      }
219
    
220 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
221 427ab7bf Leszek Koltunski
222 4562f295 Leszek Koltunski
    public void Abort()
223 427ab7bf Leszek Koltunski
      {
224
      synchronized(lock)
225
        {
226 d04a4886 Leszek Koltunski
        DistortedEffects q = mRenderer.getEffects();
227 6173632c Leszek Koltunski
        q.abortByType(EffectType.VERTEX);
228
        q.abortByType(EffectType.FRAGMENT);
229 1585ba24 Leszek Koltunski
        mCenter.removeAll();
230 427ab7bf Leszek Koltunski
        mCurrEffect = EFFECT_POINTS;
231 3c8b1903 Leszek Koltunski
        mRenderer.setRefresh();
232 427ab7bf Leszek Koltunski
        }
233
      }
234
235 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
236 427ab7bf Leszek Koltunski
 
237 4562f295 Leszek Koltunski
    public void drawCurve(Canvas c, long time)
238 427ab7bf Leszek Koltunski
      {
239
      synchronized(lock)
240
        {  
241 1585ba24 Leszek Koltunski
        int len = mCenter.getNumPoints();
242 97dadfe5 Leszek Koltunski
243 334c13fa Leszek Koltunski
        float[] drawCoord = new float[3];
244
        Static3D cu;
245 3c8b1903 Leszek Koltunski
246 427ab7bf Leszek Koltunski
        if( len>=2 )
247
          {
248 97dadfe5 Leszek Koltunski
          float step = (float)LOOP_TIME/(NUM_POINTS+1);
249
250
          for(int i=0; i<NUM_POINTS; i++)
251 427ab7bf Leszek Koltunski
            {
252 3c8b1903 Leszek Koltunski
            mPaint.setColor( 0xffffffff );
253 1585ba24 Leszek Koltunski
            mCenter.get( drawCoord, 0, (long)(i*step) );
254 a4d59c0b Leszek Koltunski
            c.drawCircle(drawCoord[0], mScrHeight-drawCoord[1], mSize1, mPaint );
255 427ab7bf Leszek Koltunski
            }
256
          }
257
     
258
        mPaint.setColor(0xffff0000);
259
      
260
        for(int curr=0; curr<len; curr++)
261
          {       
262 1585ba24 Leszek Koltunski
          cu = mCenter.getPoint(curr);
263 a4d59c0b Leszek Koltunski
          c.drawCircle(cu.get1(), mScrHeight-cu.get2(), mSize2, mPaint);
264 427ab7bf Leszek Koltunski
          }
265
        
266
        if( time-mTime > LOOP_TIME ) mTime = time;
267
        }
268
      }
269
       
270 7bf107f7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
271 427ab7bf Leszek Koltunski
    
272 a4d59c0b Leszek Koltunski
    @Override
273
    public boolean onTouchEvent(MotionEvent event)
274 427ab7bf Leszek Koltunski
      {
275
      if( mCurrEffect!=EFFECT_POINTS ) return true;   
276 97dadfe5 Leszek Koltunski
277
      int xDown, yDown;
278
279 427ab7bf Leszek Koltunski
      switch(event.getAction())
280
        {
281 a4d59c0b Leszek Koltunski
        case MotionEvent.ACTION_DOWN: xDown =              (int)event.getX();
282
                                      yDown = mScrHeight - (int)event.getY();
283 427ab7bf Leszek Koltunski
                                    
284
                                      float gx, gy;
285 e3eab072 Leszek Koltunski
                                      Static3D dv;
286 1585ba24 Leszek Koltunski
                                      int len = mCenter.getNumPoints();
287 427ab7bf Leszek Koltunski
                                 
288
                                      for(int g=0; g<len; g++)
289
                                        {
290 1585ba24 Leszek Koltunski
                                        dv = mCenter.getPoint(g);
291 e3eab072 Leszek Koltunski
                                        gx = dv.get1();
292
                                        gy = dv.get2();
293 398fb2ee Leszek Koltunski
294 e3eab072 Leszek Koltunski
                                        float Z = mDistort.get3()/10;
295 398fb2ee Leszek Koltunski
296
                                        if( (xDown-gx)*(xDown-gx) + (yDown-gy)*(yDown-gy) < Z*Z )
297 427ab7bf Leszek Koltunski
                                          {
298
                                          moving = g;
299
                                          break;
300
                                          }
301
                                        }
302
                                      if( moving<0 )
303
                                        {
304
                                        synchronized(lock)
305
                                          {
306 1585ba24 Leszek Koltunski
                                          mCenter.add(new Static3D(xDown,yDown,0));
307 427ab7bf Leszek Koltunski
                                          }
308 3c8b1903 Leszek Koltunski
                                        }
309
                                      mRenderer.setRefresh();
310 427ab7bf Leszek Koltunski
                                      break;
311
        case MotionEvent.ACTION_MOVE: if( moving>=0 )
312
                                        {
313 a4d59c0b Leszek Koltunski
                                        xDown =              (int)event.getX();
314
                                        yDown = mScrHeight - (int)event.getY();
315 97dadfe5 Leszek Koltunski
316 1585ba24 Leszek Koltunski
                                        mCenter.setPoint(moving, xDown, yDown, 0);
317 3c8b1903 Leszek Koltunski
                                        }
318
                                      mRenderer.setRefresh();
319 427ab7bf Leszek Koltunski
                                      break;
320
        case MotionEvent.ACTION_UP  : moving = -1;
321
                                      break;
322
        }
323
      return true;
324
      }
325
  }