Project

General

Profile

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

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

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.movingeffects;
21

    
22
import android.app.ActivityManager;
23
import android.content.Context;
24
import android.content.pm.ConfigurationInfo;
25
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
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
import org.distorted.library.main.DistortedEffects;
39
import org.distorted.library.type.Dynamic3D;
40
import org.distorted.library.type.Dynamic4D;
41
import org.distorted.library.type.Static1D;
42
import org.distorted.library.type.Static2D;
43
import org.distorted.library.type.Static3D;
44
import org.distorted.library.type.Static4D;
45

    
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47

    
48
public class MovingEffectsSurfaceView extends GLSurfaceView
49
    {
50
    private static final int LOOP_TIME = 5000;
51
    private static final int NUM_POINTS= 100;
52

    
53
    public static final int EFFECT_POINTS=0;
54
    public static final int EFFECT_BUBBLE=1;
55
    public static final int EFFECT_SINK  =2;
56
    public static final int EFFECT_TRANS =3;
57
    public static final int EFFECT_CHROMA=4;
58
    public static final int EFFECT_SWIRL =5;
59

    
60
    private static final Object lock = new Object();
61

    
62
    private Dynamic3D mCenterVertex;
63
    private Static4D mRegionVertex;
64
    private Dynamic4D mRegionFragment;
65

    
66
    private Paint mPaint;
67
    private int moving;
68
    private long mTime = 0;
69
    
70
    private int mCurrEffect;
71
    private int mSize1, mSize2, mSizeR;
72
    private Static3D mDistort;
73

    
74
    private MovingEffectsRenderer mRenderer;
75

    
76
    private VertexEffectDistort mEffectDistort;
77
    private VertexEffectSink mEffectSink;
78
    private VertexEffectSwirl mEffectSwirl;
79
    private FragmentEffectChroma mEffectChroma;
80
    private FragmentEffectAlpha mEffectAlpha;
81

    
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83
    
84
    public MovingEffectsSurfaceView(Context context, AttributeSet attrs)
85
      {
86
      super(context, attrs);
87

    
88
      mCurrEffect=EFFECT_POINTS;
89
      mPaint = new Paint();
90
      mPaint.setStyle(Style.FILL);
91
      moving = -1;
92
      
93
      mCenterVertex   = new Dynamic3D(LOOP_TIME,0.0f);
94
      mRegionFragment = new Dynamic4D(LOOP_TIME,0.0f);
95
      mRegionVertex   = new Static4D(0,0,0,0);
96
      mDistort        = new Static3D(0,0,0);
97

    
98
      if(!isInEditMode())
99
        {
100
        mRenderer = new MovingEffectsRenderer(this);
101

    
102
        setFocusable(true);
103
        setFocusableInTouchMode(true);
104
        final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
105
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
106
        setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
107
        setRenderer(mRenderer);
108

    
109
        mEffectDistort = new VertexEffectDistort( mDistort , mCenterVertex, mRegionVertex);
110
        mEffectSink    = new VertexEffectSink(new Static1D(10), mCenterVertex, mRegionVertex);
111
        mEffectSwirl   = new VertexEffectSwirl( new Static1D(30), mCenterVertex, mRegionVertex);
112
        mEffectAlpha   = new FragmentEffectAlpha(new Static1D(0.5f), mRegionFragment, true);
113
        mEffectChroma  = new FragmentEffectChroma(new Static1D(0.5f), new Static3D(1,0,0), mRegionFragment, true);
114
        }
115
      }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118

    
119
    public void onSurfaceChanged(int width,int height)
120
      {
121
      int max = width>height ? width:height;
122

    
123
      mSize1 = max/200;
124
      mSize2 = max/80;
125
      mSizeR = max/6;
126

    
127
      mRegionVertex.set(0,0, mSizeR,mSizeR);
128
      mDistort.set3(max/10);
129
      }
130

    
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

    
133
    public int getCurrentEffect()
134
      {
135
      return mCurrEffect;
136
      }
137
    
138
///////////////////////////////////////////////////////////////////////////////////////////////////
139
    
140
    public void Bubble()
141
      {
142
      if( mCurrEffect==EFFECT_BUBBLE ) return;     
143
      
144
      synchronized(lock)
145
        {
146
        DistortedEffects q = mRenderer.getEffects();
147
        q.abortByType(EffectType.VERTEX);
148
        q.abortByType(EffectType.FRAGMENT);
149
        q.apply(mEffectDistort);
150
        mCurrEffect = EFFECT_BUBBLE;
151
        }
152
      }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155

    
156
    public void Sink()
157
      {
158
      if( mCurrEffect==EFFECT_SINK ) return; 
159
         
160
      synchronized(lock)
161
        {
162
        DistortedEffects q = mRenderer.getEffects();
163
        q.abortByType(EffectType.VERTEX);
164
        q.abortByType(EffectType.FRAGMENT);
165
        q.apply(mEffectSink);
166
        mCurrEffect = EFFECT_SINK;
167
        }
168
      }
169

    
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171

    
172
    public void Chroma()
173
      {
174
      if( mCurrEffect==EFFECT_CHROMA ) return;
175
         
176
      synchronized(lock)
177
        {
178
        DistortedEffects q = mRenderer.getEffects();
179
        q.abortByType(EffectType.VERTEX);
180
        q.abortByType(EffectType.FRAGMENT);
181
        q.apply(mEffectChroma);
182
        mCurrEffect = EFFECT_CHROMA;
183
        }
184
      }
185

    
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187

    
188
    public void Transparency()
189
      {
190
      if( mCurrEffect==EFFECT_TRANS ) return;   
191
      
192
      synchronized(lock)
193
        {
194
        DistortedEffects q = mRenderer.getEffects();
195
        q.abortByType(EffectType.VERTEX);
196
        q.abortByType(EffectType.FRAGMENT);
197
        q.apply(mEffectAlpha);
198
        mCurrEffect = EFFECT_TRANS;
199
        }
200
      }
201

    
202
///////////////////////////////////////////////////////////////////////////////////////////////////
203

    
204
    public void Swirl()
205
      {
206
      if( mCurrEffect==EFFECT_SWIRL ) return;   
207
      
208
      synchronized(lock)
209
        {
210
        DistortedEffects q = mRenderer.getEffects();
211
        q.abortByType(EffectType.VERTEX);
212
        q.abortByType(EffectType.FRAGMENT);
213
        q.apply(mEffectSwirl);
214
        mCurrEffect = EFFECT_SWIRL;
215
        }
216
      }
217
    
218
///////////////////////////////////////////////////////////////////////////////////////////////////
219

    
220
    public void Abort()
221
      {
222
      synchronized(lock)
223
        {
224
        DistortedEffects q = mRenderer.getEffects();
225
        q.abortByType(EffectType.VERTEX);
226
        q.abortByType(EffectType.FRAGMENT);
227
        mCenterVertex.removeAll();
228
        mRegionFragment.removeAll();
229
        mCurrEffect = EFFECT_POINTS;
230
        mRenderer.setRefresh();
231
        }
232
      }
233

    
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235
 
236
    public void drawCurve(Canvas c, long time)
237
      {
238
      synchronized(lock)
239
        {  
240
        int len = mCenterVertex.getNumPoints();
241

    
242
        float[] drawCoord = new float[3];
243
        Static3D cu;
244

    
245
        if( len>=2 )
246
          {
247
          float step = (float)LOOP_TIME/(NUM_POINTS+1);
248

    
249
          for(int i=0; i<NUM_POINTS; i++)
250
            {
251
            mPaint.setColor( 0xffffffff );
252
            mCenterVertex.get( drawCoord, 0, (long)(i*step) );
253
            c.drawCircle(drawCoord[0], drawCoord[1], mSize1, mPaint );
254
            }
255
          }
256
     
257
        mPaint.setColor(0xffff0000);
258
      
259
        for(int curr=0; curr<len; curr++)
260
          {       
261
          cu = mCenterVertex.getPoint(curr);
262
          c.drawCircle(cu.getX(), cu.getY(), mSize2, mPaint);
263
          }
264
        
265
        if( time-mTime > LOOP_TIME ) mTime = time;
266
        }
267
      }
268
       
269
///////////////////////////////////////////////////////////////////////////////////////////////////
270
    
271
    @Override public boolean onTouchEvent(MotionEvent event) 
272
      {
273
      if( mCurrEffect!=EFFECT_POINTS ) return true;   
274

    
275
      int xDown, yDown;
276

    
277
      switch(event.getAction())
278
        {
279
        case MotionEvent.ACTION_DOWN: xDown = (int)event.getX();
280
                                      yDown = (int)event.getY();
281
                                    
282
                                      float gx, gy;
283
                                      Static2D dv;
284
                                      int len = mCenterVertex.getNumPoints();
285
                                 
286
                                      for(int g=0; g<len; g++)
287
                                        {
288
                                        dv = mCenterVertex.getPoint(g);
289
                                        gx = dv.getX();
290
                                        gy = dv.getY();
291

    
292
                                        float Z = mDistort.getZ()/10;
293

    
294
                                        if( (xDown-gx)*(xDown-gx) + (yDown-gy)*(yDown-gy) < Z*Z )
295
                                          {
296
                                          moving = g;
297
                                          break;
298
                                          }
299
                                        }
300
                                      if( moving<0 )
301
                                        {
302
                                        synchronized(lock)
303
                                          {
304
                                          mCenterVertex.add(new Static3D(xDown,yDown,0));
305
                                          mRegionFragment.add(new Static4D(xDown,yDown,mSizeR,mSizeR));
306
                                          }
307
                                        }
308
                                      mRenderer.setRefresh();
309
                                      break;
310
        case MotionEvent.ACTION_MOVE: if( moving>=0 )
311
                                        {
312
                                        xDown = (int)event.getX();
313
                                        yDown = (int)event.getY();
314

    
315
                                        mCenterVertex.setPoint(moving, xDown, yDown, 0);
316
                                        mRegionFragment.setPoint(moving, xDown, yDown, mSizeR, mSizeR);
317
                                        }
318
                                      mRenderer.setRefresh();
319
                                      break;
320
        case MotionEvent.ACTION_UP  : moving = -1;
321
                                      break;
322
        }
323
      return true;
324
      }
325
  }
(3-3/3)