Project

General

Profile

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

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

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.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
  }
(2-2/4)