Project

General

Profile

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

examples / src / main / java / org / distorted / examples / vertex3d / Vertex3DEffect.java @ 950511ed

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

    
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113

    
114
  private void setDefaultRegionInter()
115
    {
116
    mInterRegion[0] = 50;
117
    mInterRegion[1] = 50;
118
    mInterRegion[2] = 50;
119
    mInterRegion[3] = 50;
120
    }
121

    
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123

    
124
  private void setRegionText()
125
    {
126
    int f0 = (int)mRegionSta.getX();
127
    int f1 = (int)mRegionSta.getY();
128
    int f2 = (int)mRegionSta.getZ();
129
    int f3 = (int)mRegionSta.getW();
130

    
131
    mTextRegion.setText("region ("+f0+","+f1+","+f2+","+f3+")");
132
    }
133

    
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135

    
136
  private void fillStatics()
137
    {
138
    switch(mName)
139
      {
140
      case DISTORT:
141
      case DEFORM : Vertex3DActivity act = mAct.get();
142
                    float l = act.getWidth()/50.0f;
143
                    float x = (mInter[0]-50)*l;
144
                    float y = (mInter[1]-50)*l;
145
                    float z = (mInter[2]-50)*l;
146
                    mSta3.set(x,y,z);
147
                    break;
148
      case SINK   : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
149
                    break;
150
      case SWIRL  : mSta1.set( 3.6f*(mInter[0]-50) );
151
                    break;
152
      }
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
  private void setDefaultInter()
158
    {
159
    switch(mName)
160
      {
161
      case DISTORT:
162
      case DEFORM : mInter[0] = 50;
163
                    mInter[1] = 50;
164
                    mInter[2] = 50;
165
                    break;
166
      case SINK   :
167
      case SWIRL  : mInter[0] = 50;
168
                    break;
169
      }
170
    }
171

    
172
///////////////////////////////////////////////////////////////////////////////////////////////////
173

    
174
  private void setText()
175
    {
176
    String text = mName.name();
177

    
178
    if( mName==EffectNames.DISTORT || mName==EffectNames.DEFORM)
179
      {
180
      int f1 = (int)mSta3.getX();
181
      int f2 = (int)mSta3.getY();
182
      int f3 = (int)mSta3.getZ();
183
      text += " ("+f1+","+f2+","+f3+")";
184
      }
185
    else
186
      {
187
      float f1 = ((int)(mSta1.getX()*100))/100.0f;
188
      text += " ("+f1+")";
189
      }
190

    
191
    mText.setText(text);
192
    }
193

    
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195

    
196
  public Vertex3DEffect(EffectNames name, Vertex3DActivity act)
197
    {
198
    mAct = new WeakReference<>(act);
199
    mName = name;
200

    
201
    if( mName==EffectNames.SINK || mName==EffectNames.SWIRL )
202
      {
203
      mDimension = 1;
204
      mDyn1 = new Dynamic1D();
205
      mSta1 = new Static1D(0);
206
      mDyn1.add(mSta1);
207
      mDyn3 = null;
208
      }
209
    else
210
      {
211
      mDimension = 3;
212
      mDyn3 = new Dynamic3D();
213
      mSta3 = new Static3D(0,0,0);
214
      mDyn3.add(mSta3);
215
      mDyn1 = null;
216
      }
217

    
218
    mInter = new int[mDimension];
219
    mSeekID= new int[mDimension];
220

    
221
    mInterRegion = new int[4];
222
    mSeekRegionID= new int[4];
223
    mRegionDyn   = new Dynamic4D();
224
    mRegionSta   = new Static4D(0,0,0,0);
225
    mRegionDyn.add(mRegionSta);
226

    
227
    mInterCenter = new int[2];
228
    mSeekCenterID= new int[2];
229
    mCenterDyn   = new Dynamic2D();
230
    mCenterSta   = new Static2D(0,0);
231
    mCenterDyn.add(mCenterSta);
232
    }
233

    
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235

    
236
  public Dynamic1D getDyn1()
237
    {
238
    return mDyn1;
239
    }
240

    
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242

    
243
  public Dynamic3D getDyn3()
244
    {
245
    return mDyn3;
246
    }
247

    
248
///////////////////////////////////////////////////////////////////////////////////////////////////
249

    
250
  public Dynamic4D getRegion()
251
    {
252
    return mRegionDyn;
253
    }
254

    
255
///////////////////////////////////////////////////////////////////////////////////////////////////
256

    
257
  public Dynamic2D getCenter()
258
    {
259
    return mCenterDyn;
260
    }
261

    
262
///////////////////////////////////////////////////////////////////////////////////////////////////
263

    
264
  public View createView()
265
    {
266
    View effect;
267
    SeekBar[] seek = new SeekBar[mDimension];
268

    
269
    Vertex3DActivity act = mAct.get();
270

    
271
    switch(mDimension)
272
      {
273
      case 1 : effect     = act.getLayoutInflater().inflate(R.layout.effect1d, null);
274
               mText      = (TextView)effect.findViewById(R.id.effect1dText);
275
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect1dbar1);
276
               mSeekID[0] = seek[0].getId();
277
               break;
278
      case 2 : effect     = act.getLayoutInflater().inflate(R.layout.effect2d, null);
279
               mText      = (TextView)effect.findViewById(R.id.effect2dText);
280
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect2dbar1);
281
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect2dbar2);
282
               mSeekID[0] = seek[0].getId();
283
               mSeekID[1] = seek[1].getId();
284
               break;
285
      case 3 : effect     = act.getLayoutInflater().inflate(R.layout.effect3d, null);
286
               mText      = (TextView)effect.findViewById(R.id.effect3dText);
287
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect3dbar1);
288
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect3dbar2);
289
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect3dbar3);
290
               mSeekID[0] = seek[0].getId();
291
               mSeekID[1] = seek[1].getId();
292
               mSeekID[2] = seek[2].getId();
293
               break;
294
      case 4 : effect     = act.getLayoutInflater().inflate(R.layout.effect4d, null);
295
               mText      = (TextView)effect.findViewById(R.id.effect4dText);
296
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect4dbar1);
297
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect4dbar2);
298
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect4dbar3);
299
               seek[3]    = (SeekBar)effect.findViewById(R.id.effect4dbar4);
300
               mSeekID[0] = seek[0].getId();
301
               mSeekID[1] = seek[1].getId();
302
               mSeekID[2] = seek[2].getId();
303
               mSeekID[3] = seek[3].getId();
304
               break;
305
      default: android.util.Log.e("Vertex3DEffect", "dimension "+mDimension+" not supported!");
306
               return null;
307
      }
308

    
309
    setDefaultInter();
310
    fillStatics();
311
    setText();
312

    
313
    for(int i=0; i<mDimension; i++)
314
      {
315
      seek[i].setOnSeekBarChangeListener(this);
316
      seek[i].setProgress( mInter[i] );
317
      }
318

    
319
    return effect;
320
    }
321

    
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323

    
324
  public View createRegion()
325
    {
326
    Vertex3DActivity act = mAct.get();
327

    
328
    View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
329

    
330
    SeekBar[] seek = new SeekBar[4];
331

    
332
    seek[0] = (SeekBar)region.findViewById(R.id.effectRegionBarX );
333
    seek[1] = (SeekBar)region.findViewById(R.id.effectRegionBarY );
334
    seek[2] = (SeekBar)region.findViewById(R.id.effectRegionBarRX);
335
    seek[3] = (SeekBar)region.findViewById(R.id.effectRegionBarRY);
336

    
337
    mSeekRegionID[0] = seek[0].getId();
338
    mSeekRegionID[1] = seek[1].getId();
339
    mSeekRegionID[2] = seek[2].getId();
340
    mSeekRegionID[3] = seek[3].getId();
341

    
342
    mTextRegion    = (TextView)region.findViewById(R.id.effectRegionText);
343

    
344
    setDefaultRegionInter();
345
    fillRegionStatics();
346
    setRegionText();
347

    
348
    for(int i=0; i<4; i++)
349
      {
350
      seek[i].setOnSeekBarChangeListener(this);
351
      seek[i].setProgress( mInterRegion[i] );
352
      }
353

    
354
    return region;
355
    }
356

    
357
///////////////////////////////////////////////////////////////////////////////////////////////////
358

    
359
  public View createCenter()
360
    {
361
    Vertex3DActivity act = mAct.get();
362

    
363
    View center = act.getLayoutInflater().inflate(R.layout.effectcenter, null);
364

    
365
    SeekBar[] seek = new SeekBar[2];
366

    
367
    seek[0] = (SeekBar)center.findViewById(R.id.effectCenterBarX );
368
    seek[1] = (SeekBar)center.findViewById(R.id.effectCenterBarY );
369

    
370
    mSeekCenterID[0] = seek[0].getId();
371
    mSeekCenterID[1] = seek[1].getId();
372

    
373
    mTextCenter    = (TextView)center.findViewById(R.id.effectCenterText);
374

    
375
    setDefaultCenterInter();
376
    fillCenterStatics();
377
    setCenterText();
378

    
379
    for(int i=0; i<2; i++)
380
      {
381
      seek[i].setOnSeekBarChangeListener(this);
382
      seek[i].setProgress( mInterCenter[i] );
383
      }
384

    
385
    return center;
386
    }
387

    
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389

    
390
  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
391
    {
392
    if ( mDimension>=1 && bar.getId()==mSeekID[0] )
393
      {
394
      mInter[0] = progress;
395
      fillStatics();
396
      setText();
397
      }
398
    if ( mDimension>=2 && bar.getId()==mSeekID[1] )
399
      {
400
      mInter[1] = progress;
401
      fillStatics();
402
      setText();
403
      }
404
    if ( mDimension>=3 && bar.getId()==mSeekID[2] )
405
      {
406
      mInter[2] = progress;
407
      fillStatics();
408
      setText();
409
      }
410
    if ( mDimension>=4 && bar.getId()==mSeekID[3] )
411
      {
412
      mInter[3] = progress;
413
      fillStatics();
414
      setText();
415
      }
416

    
417
    if( bar.getId() == mSeekRegionID[0] )
418
      {
419
      mInterRegion[0] = progress;
420
      fillRegionStatics();
421
      setRegionText();
422
      }
423
    if( bar.getId() == mSeekRegionID[1] )
424
      {
425
      mInterRegion[1] = progress;
426
      fillRegionStatics();
427
      setRegionText();
428
      }
429
    if( bar.getId() == mSeekRegionID[2] )
430
      {
431
      mInterRegion[2] = progress;
432
      fillRegionStatics();
433
      setRegionText();
434
      }
435
    if( bar.getId() == mSeekRegionID[3] )
436
      {
437
      mInterRegion[3] = progress;
438
      fillRegionStatics();
439
      setRegionText();
440
      }
441

    
442
    if( bar.getId() == mSeekCenterID[0] )
443
      {
444
      mInterCenter[0] = progress;
445
      fillCenterStatics();
446
      setCenterText();
447
      }
448
    if( bar.getId() == mSeekCenterID[1] )
449
      {
450
      mInterCenter[1] = progress;
451
      fillCenterStatics();
452
      setCenterText();
453
      }
454

    
455
    mAct.get().setCenter(mCenterSta.getX(),mCenterSta.getY());
456
    }
457

    
458
///////////////////////////////////////////////////////////////////////////////////////////////////
459

    
460
  public void onStartTrackingTouch(SeekBar bar) { }
461

    
462
///////////////////////////////////////////////////////////////////////////////////////////////////
463

    
464
  public void onStopTrackingTouch(SeekBar bar)  { }
465
  }
(2-2/4)