Project

General

Profile

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

examples / src / main / java / org / distorted / examples / vertex3d / Vertex3DEffect.java @ 56cbe1cf

1 56cbe1cf 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
package org.distorted.examples.vertex3d;
21
22
import android.view.View;
23
import android.widget.SeekBar;
24
import android.widget.TextView;
25
26
import org.distorted.examples.R;
27
import org.distorted.library.EffectNames;
28
import org.distorted.library.type.Dynamic1D;
29
import org.distorted.library.type.Dynamic2D;
30
import org.distorted.library.type.Dynamic3D;
31
import org.distorted.library.type.Dynamic4D;
32
import org.distorted.library.type.Static1D;
33
import org.distorted.library.type.Static2D;
34
import org.distorted.library.type.Static3D;
35
import org.distorted.library.type.Static4D;
36
37
import java.lang.ref.WeakReference;
38
39
///////////////////////////////////////////////////////////////////////////////////////////////////
40
41
public class Vertex3DEffect implements SeekBar.OnSeekBarChangeListener
42
  {
43
  private WeakReference<Vertex3DActivity> mAct;
44
45
  private EffectNames mName;
46
  private int[] mInter;
47
  private int[] mInterRegion;
48
  private int[] mInterCenter;
49
  private int[] mSeekID;
50
  private int[] mSeekRegionID;
51
  private int[] mSeekCenterID;
52
  private int mDimension;
53
  private TextView mText,mTextRegion,mTextCenter;
54
55
  private Dynamic1D mDyn1;
56
  private Dynamic3D mDyn3;
57
  private Static1D  mSta1;
58
  private Static3D  mSta3;
59
  private Dynamic4D mRegionDyn;
60
  private Static4D  mRegionSta;
61
  private Dynamic2D mCenterDyn;
62
  private Static2D  mCenterSta;
63
64
///////////////////////////////////////////////////////////////////////////////////////////////////
65
66
  private void fillCenterStatics()
67
    {
68
    Vertex3DActivity act = mAct.get();
69
70
    float x = (mInterCenter[0]*0.014f - 0.2f)*act.getWidth();
71
    float y = (mInterCenter[1]*0.014f - 0.2f)*act.getHeight();
72
    mCenterSta.set(x,y);
73
    }
74
75
///////////////////////////////////////////////////////////////////////////////////////////////////
76
77
  private void setDefaultCenterInter()
78
    {
79
    mInterCenter[0] = 50;
80
    mInterCenter[1] = 50;
81
    }
82
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84
85
  private void setCenterText()
86
    {
87
    int f0 = (int)mCenterSta.getX();
88
    int f1 = (int)mCenterSta.getY();
89
90
    mTextCenter.setText("center ("+f0+","+f1+")");
91
    }
92
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94
95
  private void fillRegionStatics()
96
    {
97
    Vertex3DActivity act = mAct.get();
98
99
    float factorX = act.getWidth() / 100.0f;
100
    float factorY = act.getHeight()/ 100.0f;
101
102
    float  x = (mInterRegion[0]-50)*factorX;
103
    float  y = (mInterRegion[1]-50)*factorY;
104
    float rx =  mInterRegion[2]    *factorX;
105
    float ry =  mInterRegion[3]    *factorY;
106
107
    mRegionSta.set(x,y,rx,ry);
108
    }
109
110
///////////////////////////////////////////////////////////////////////////////////////////////////
111
112
  private void setDefaultRegionInter()
113
    {
114
    mInterRegion[0] = 50;
115
    mInterRegion[1] = 50;
116
    mInterRegion[2] = 50;
117
    mInterRegion[3] = 50;
118
    }
119
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121
122
  private void setRegionText()
123
    {
124
    int f0 = (int)mRegionSta.getX();
125
    int f1 = (int)mRegionSta.getY();
126
    int f2 = (int)mRegionSta.getZ();
127
    int f3 = (int)mRegionSta.getW();
128
129
    mTextRegion.setText("region ("+f0+","+f1+","+f2+","+f3+")");
130
    }
131
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133
134
  private void fillStatics()
135
    {
136
    switch(mName)
137
      {
138
      case DISTORT:
139
      case DEFORM : Vertex3DActivity act = mAct.get();
140
                    float l = act.getWidth()/50.0f;
141
                    float x = (mInter[0]-50)*l;
142
                    float y = (mInter[1]-50)*l;
143
                    float z = (mInter[2]-50)*l;
144
                    mSta3.set(x,y,z);
145
                    break;
146
      case SINK   : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
147
                    break;
148
      case SWIRL  : mSta1.set( 3.6f*(mInter[0]-50) );
149
                    break;
150
      }
151
    }
152
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
155
  private void setDefaultInter()
156
    {
157
    switch(mName)
158
      {
159
      case DISTORT:
160
      case DEFORM : mInter[0] = 50;
161
                    mInter[1] = 50;
162
                    mInter[2] = 50;
163
                    break;
164
      case SINK   :
165
      case SWIRL  : mInter[0] = 50;
166
                    break;
167
      }
168
    }
169
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171
172
  private void setText()
173
    {
174
    String text = mName.name();
175
176
    if( mName==EffectNames.DISTORT || mName==EffectNames.DEFORM)
177
      {
178
      int f1 = (int)mSta3.getX();
179
      int f2 = (int)mSta3.getY();
180
      int f3 = (int)mSta3.getZ();
181
      text += " ("+f1+","+f2+","+f3+")";
182
      }
183
    else
184
      {
185
      float f1 = ((int)(mSta1.getX()*100))/100.0f;
186
      text += " ("+f1+")";
187
      }
188
189
    mText.setText(text);
190
    }
191
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193
194
  public Vertex3DEffect(EffectNames name, Vertex3DActivity act)
195
    {
196
    mAct = new WeakReference<>(act);
197
    mName = name;
198
199
    if( mName==EffectNames.SINK || mName==EffectNames.SWIRL )
200
      {
201
      mDimension = 1;
202
      mDyn1 = new Dynamic1D();
203
      mSta1 = new Static1D(0);
204
      mDyn1.add(mSta1);
205
      mDyn3 = null;
206
      }
207
    else
208
      {
209
      mDimension = 3;
210
      mDyn3 = new Dynamic3D();
211
      mSta3 = new Static3D(0,0,0);
212
      mDyn3.add(mSta3);
213
      mDyn1 = null;
214
      }
215
216
    mInter = new int[mDimension];
217
    mSeekID= new int[mDimension];
218
219
    mInterRegion = new int[4];
220
    mSeekRegionID= new int[4];
221
    mRegionDyn   = new Dynamic4D();
222
    mRegionSta   = new Static4D(0,0,0,0);
223
    mRegionDyn.add(mRegionSta);
224
225
    mInterCenter = new int[2];
226
    mSeekCenterID= new int[2];
227
    mCenterDyn   = new Dynamic2D();
228
    mCenterSta   = new Static2D(0,0);
229
    mCenterDyn.add(mCenterSta);
230
    }
231
232
///////////////////////////////////////////////////////////////////////////////////////////////////
233
234
  public Dynamic1D getDyn1()
235
    {
236
    return mDyn1;
237
    }
238
239
///////////////////////////////////////////////////////////////////////////////////////////////////
240
241
  public Dynamic3D getDyn3()
242
    {
243
    return mDyn3;
244
    }
245
246
///////////////////////////////////////////////////////////////////////////////////////////////////
247
248
  public Dynamic4D getRegion()
249
    {
250
    return mRegionDyn;
251
    }
252
253
///////////////////////////////////////////////////////////////////////////////////////////////////
254
255
  public Dynamic2D getCenter()
256
    {
257
    return mCenterDyn;
258
    }
259
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
262
  public View createView()
263
    {
264
    View effect;
265
    SeekBar[] seek = new SeekBar[mDimension];
266
267
    Vertex3DActivity act = mAct.get();
268
269
    switch(mDimension)
270
      {
271
      case 1 : effect     = act.getLayoutInflater().inflate(R.layout.effect1d, null);
272
               mText      = (TextView)effect.findViewById(R.id.effect1dText);
273
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect1dbar1);
274
               mSeekID[0] = seek[0].getId();
275
               break;
276
      case 2 : effect     = act.getLayoutInflater().inflate(R.layout.effect2d, null);
277
               mText      = (TextView)effect.findViewById(R.id.effect2dText);
278
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect2dbar1);
279
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect2dbar2);
280
               mSeekID[0] = seek[0].getId();
281
               mSeekID[1] = seek[1].getId();
282
               break;
283
      case 3 : effect     = act.getLayoutInflater().inflate(R.layout.effect3d, null);
284
               mText      = (TextView)effect.findViewById(R.id.effect3dText);
285
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect3dbar1);
286
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect3dbar2);
287
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect3dbar3);
288
               mSeekID[0] = seek[0].getId();
289
               mSeekID[1] = seek[1].getId();
290
               mSeekID[2] = seek[2].getId();
291
               break;
292
      case 4 : effect     = act.getLayoutInflater().inflate(R.layout.effect4d, null);
293
               mText      = (TextView)effect.findViewById(R.id.effect4dText);
294
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect4dbar1);
295
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect4dbar2);
296
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect4dbar3);
297
               seek[3]    = (SeekBar)effect.findViewById(R.id.effect4dbar4);
298
               mSeekID[0] = seek[0].getId();
299
               mSeekID[1] = seek[1].getId();
300
               mSeekID[2] = seek[2].getId();
301
               mSeekID[3] = seek[3].getId();
302
               break;
303
      default: android.util.Log.e("Vertex3DEffect", "dimension "+mDimension+" not supported!");
304
               return null;
305
      }
306
307
    setDefaultInter();
308
    fillStatics();
309
    setText();
310
311
    for(int i=0; i<mDimension; i++)
312
      {
313
      seek[i].setOnSeekBarChangeListener(this);
314
      seek[i].setProgress( mInter[i] );
315
      }
316
317
    return effect;
318
    }
319
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321
322
  public View createRegion()
323
    {
324
    Vertex3DActivity act = mAct.get();
325
326
    View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
327
328
    SeekBar[] seek = new SeekBar[4];
329
330
    seek[0] = (SeekBar)region.findViewById(R.id.effectRegionBarX );
331
    seek[1] = (SeekBar)region.findViewById(R.id.effectRegionBarY );
332
    seek[2] = (SeekBar)region.findViewById(R.id.effectRegionBarRX);
333
    seek[3] = (SeekBar)region.findViewById(R.id.effectRegionBarRY);
334
335
    mSeekRegionID[0] = seek[0].getId();
336
    mSeekRegionID[1] = seek[1].getId();
337
    mSeekRegionID[2] = seek[2].getId();
338
    mSeekRegionID[3] = seek[3].getId();
339
340
    mTextRegion    = (TextView)region.findViewById(R.id.effectRegionText);
341
342
    setDefaultRegionInter();
343
    fillRegionStatics();
344
    setRegionText();
345
346
    for(int i=0; i<4; i++)
347
      {
348
      seek[i].setOnSeekBarChangeListener(this);
349
      seek[i].setProgress( mInterRegion[i] );
350
      }
351
352
    return region;
353
    }
354
355
///////////////////////////////////////////////////////////////////////////////////////////////////
356
357
  public View createCenter()
358
    {
359
    Vertex3DActivity act = mAct.get();
360
361
    View center = act.getLayoutInflater().inflate(R.layout.effectcenter, null);
362
363
    SeekBar[] seek = new SeekBar[2];
364
365
    seek[0] = (SeekBar)center.findViewById(R.id.effectCenterBarX );
366
    seek[1] = (SeekBar)center.findViewById(R.id.effectCenterBarY );
367
368
    mSeekCenterID[0] = seek[0].getId();
369
    mSeekCenterID[1] = seek[1].getId();
370
371
    mTextCenter    = (TextView)center.findViewById(R.id.effectCenterText);
372
373
    setDefaultCenterInter();
374
    fillCenterStatics();
375
    setCenterText();
376
377
    for(int i=0; i<2; i++)
378
      {
379
      seek[i].setOnSeekBarChangeListener(this);
380
      seek[i].setProgress( mInterCenter[i] );
381
      }
382
383
    return center;
384
    }
385
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387
388
  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
389
    {
390
    if ( mDimension>=1 && bar.getId()==mSeekID[0] )
391
      {
392
      mInter[0] = progress;
393
      fillStatics();
394
      setText();
395
      }
396
    if ( mDimension>=2 && bar.getId()==mSeekID[1] )
397
      {
398
      mInter[1] = progress;
399
      fillStatics();
400
      setText();
401
      }
402
    if ( mDimension>=3 && bar.getId()==mSeekID[2] )
403
      {
404
      mInter[2] = progress;
405
      fillStatics();
406
      setText();
407
      }
408
    if ( mDimension>=4 && bar.getId()==mSeekID[3] )
409
      {
410
      mInter[3] = progress;
411
      fillStatics();
412
      setText();
413
      }
414
415
    if( bar.getId() == mSeekRegionID[0] )
416
      {
417
      mInterRegion[0] = progress;
418
      fillRegionStatics();
419
      setRegionText();
420
      }
421
    if( bar.getId() == mSeekRegionID[1] )
422
      {
423
      mInterRegion[1] = progress;
424
      fillRegionStatics();
425
      setRegionText();
426
      }
427
    if( bar.getId() == mSeekRegionID[2] )
428
      {
429
      mInterRegion[2] = progress;
430
      fillRegionStatics();
431
      setRegionText();
432
      }
433
    if( bar.getId() == mSeekRegionID[3] )
434
      {
435
      mInterRegion[3] = progress;
436
      fillRegionStatics();
437
      setRegionText();
438
      }
439
440
    if( bar.getId() == mSeekCenterID[0] )
441
      {
442
      mInterCenter[0] = progress;
443
      fillCenterStatics();
444
      setCenterText();
445
      }
446
    if( bar.getId() == mSeekCenterID[1] )
447
      {
448
      mInterCenter[1] = progress;
449
      fillCenterStatics();
450
      setCenterText();
451
      }
452
    }
453
454
///////////////////////////////////////////////////////////////////////////////////////////////////
455
456
  public void onStartTrackingTouch(SeekBar bar) { }
457
458
///////////////////////////////////////////////////////////////////////////////////////////////////
459
460
  public void onStopTrackingTouch(SeekBar bar)  { }
461
  }