Project

General

Profile

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

examples / src / main / java / org / distorted / examples / vertex3d / Vertex3DEffect.java @ 69942a83

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