Project

General

Profile

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

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

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.012f - 0.1f)*act.getWidth();
71
    float y = (mInterCenter[1]*0.012f - 0.1f)*act.getHeight();
72
    mCenterSta.set(x,y);
73

    
74
    act.setCenter(x,y);
75
    }
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

    
111
    act.setRegion(x,y,rx);
112
    }
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
  }
(2-2/4)