Project

General

Profile

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

examples / src / main / java / org / distorted / examples / effects3d / Effects3DEffect.java @ f4e44230

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.effects3d;
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.DistortedObject;
28
import org.distorted.library.EffectNames;
29
import org.distorted.library.EffectTypes;
30
import org.distorted.library.type.Dynamic1D;
31
import org.distorted.library.type.Dynamic2D;
32
import org.distorted.library.type.Dynamic3D;
33
import org.distorted.library.type.Dynamic4D;
34
import org.distorted.library.type.Static1D;
35
import org.distorted.library.type.Static2D;
36
import org.distorted.library.type.Static3D;
37
import org.distorted.library.type.Static4D;
38

    
39
import java.lang.ref.WeakReference;
40

    
41
///////////////////////////////////////////////////////////////////////////////////////////////////
42

    
43
public class Effects3DEffect implements SeekBar.OnSeekBarChangeListener
44
  {
45
  private WeakReference<Effects3DActivity> mAct;
46

    
47
  private EffectNames mName;
48
  private int[] mInter;
49
  private int[] mInterRegion;
50
  private int[] mInterCenter;
51
  private int[] mSeekID;
52
  private int[] mSeekRegionID;
53
  private int[] mSeekCenterID;
54
  private int mDimension;
55
  private TextView mText,mTextRegion,mTextCenter;
56

    
57
  private Dynamic1D mDyn1;
58
  private Dynamic3D mDyn3;
59
  private Dynamic4D mDyn4;
60
  private Static1D  mSta1;
61
  private Static3D  mSta3;
62
  private Static4D  mSta4;
63
  private Dynamic4D mRegionDyn;
64
  private Static4D  mRegionSta;
65
  private Dynamic2D mCenterDyn;
66
  private Static2D  mCenterSta;
67

    
68
///////////////////////////////////////////////////////////////////////////////////////////////////
69
// requires knowledge about effect nature
70

    
71
  private int getDimension()
72
    {
73
    switch(mName)
74
      {
75
      case DISTORT      :
76
      case DEFORM       : return 3;
77

    
78
      case CHROMA       :
79
      case SMOOTH_CHROMA:
80
      case WAVE         : return 4;
81

    
82
      default           : return 1;
83
      }
84
    }
85

    
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87
// requires knowledge about effect nature
88

    
89
  public void apply(DistortedObject object)
90
    {
91
    switch(mName)
92
      {
93
      case DISTORT: object.distort(mDyn3, mCenterDyn, mRegionDyn); break;
94
      case DEFORM : object.deform (mDyn3, mCenterDyn            ); break;
95
      case SINK   : object.sink   (mDyn1, mCenterDyn, mRegionDyn); break;
96
      case SWIRL  : object.swirl  (mDyn1, mCenterDyn, mRegionDyn); break;
97
      case WAVE   : object.wave   (mDyn4, mCenterDyn, mRegionDyn); break;
98

    
99
      case ALPHA            : object.alpha     (mDyn1,        mRegionDyn, false); break;
100
      case SMOOTH_ALPHA     : object.alpha     (mDyn1,        mRegionDyn, true ); break;
101
      case CHROMA           : object.chroma    (mDyn1, mDyn3, mRegionDyn, false); break;
102
      case SMOOTH_CHROMA    : object.chroma    (mDyn1, mDyn3, mRegionDyn, true ); break;
103
      case BRIGHTNESS       : object.brightness(mDyn1,        mRegionDyn, false); break;
104
      case SMOOTH_BRIGHTNESS: object.brightness(mDyn1,        mRegionDyn, true ); break;
105
      case SATURATION       : object.saturation(mDyn1,        mRegionDyn, false); break;
106
      case SMOOTH_SATURATION: object.saturation(mDyn1,        mRegionDyn, true ); break;
107
      case CONTRAST         : object.contrast  (mDyn1,        mRegionDyn, false); break;
108
      case SMOOTH_CONTRAST  : object.contrast  (mDyn1,        mRegionDyn, true ); break;
109
      }
110
    }
111

    
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113
// requires knowledge about effect nature
114

    
115
  private boolean supportsRegion()
116
    {
117
    return mName == EffectNames.DEFORM ? false : true;
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121
// requires knowledge about effect nature
122

    
123
  private void fillStatics()
124
    {
125
    switch(mName)
126
      {
127
      case DISTORT          :
128
      case DEFORM           : float l = mAct.get().getWidth()/50.0f;
129
                              float x = (mInter[0]-50)*l;
130
                              float y = (mInter[1]-50)*l;
131
                              float z = (mInter[2]-50)*l;
132
                              mSta3.set(x,y,z);
133
                              break;
134
      case WAVE             : float l2 = mAct.get().getWidth()/50.0f;
135
                              float x2 = (mInter[0]-50)*l2;
136
                              float y2 = (mInter[1]-50)*180 / 50;
137
                              float z2 = (mInter[2]-50)*l2;
138
                              float w2 = (mInter[3]-50)*180 / 50;
139
                              mSta4.set(x2,y2,z2,w2);
140
                              break;
141
      case SINK             : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
142
                              break;
143
      case SWIRL            : mSta1.set( 3.6f*(mInter[0]-50) );
144
                              break;
145

    
146
      case ALPHA            :
147
      case SMOOTH_ALPHA     : mSta1.set(mInter[0]/100.0f);
148
                              break;
149
      case SATURATION       :
150
      case SMOOTH_SATURATION:
151
      case CONTRAST         :
152
      case SMOOTH_CONTRAST  :
153
      case BRIGHTNESS       :
154
      case SMOOTH_BRIGHTNESS: mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
155
                              break;
156
      case CHROMA           :
157
      case SMOOTH_CHROMA    : mSta1.set(mInter[0]/100.0f);
158
                              mSta3.set(mInter[1]/100.0f,
159
                                        mInter[2]/100.0f,
160
                                        mInter[3]/100.0f);
161
                              break;
162
      }
163
    }
164

    
165
///////////////////////////////////////////////////////////////////////////////////////////////////
166
// requires knowledge about effect nature
167

    
168
  private void setDefaultInter()
169
    {
170
    switch(mName)
171
      {
172
      case DISTORT          :
173
      case DEFORM           : mInter[0] = 50;
174
                              mInter[1] = 50;
175
                              mInter[2] = 50;
176
                              break;
177
      case WAVE             : mInter[0] = 50;
178
                              mInter[1] = 50;
179
                              mInter[2] = 50;
180
                              mInter[3] = 50;
181
                              break;
182
      case SINK             :
183
      case SWIRL            : mInter[0] = 50;
184
                              break;
185

    
186
      case ALPHA            :
187
      case SMOOTH_ALPHA     :
188
      case BRIGHTNESS       :
189
      case SMOOTH_BRIGHTNESS:
190
      case SATURATION       :
191
      case SMOOTH_SATURATION:
192
      case CONTRAST         :
193
      case SMOOTH_CONTRAST  : mInter[0] = 50;
194
                              break;
195

    
196
      case CHROMA           :
197
      case SMOOTH_CHROMA    : mInter[0] = 50;
198
                              mInter[1] =  0;
199
                              mInter[2] =  0;
200
                              mInter[3] =  0;
201
                              break;
202
      }
203
    }
204

    
205
///////////////////////////////////////////////////////////////////////////////////////////////////
206

    
207
  private void setText()
208
    {
209
    String text = mName.name();
210

    
211
    if( mSta1 !=null )
212
      {
213
      int f1 = (int)((mSta1.getX()*100)/100.0f);
214
      text += " "+f1;
215
      }
216

    
217
    if( mSta3 !=null )
218
      {
219
      int f1 = (int)mSta3.getX();
220
      int f2 = (int)mSta3.getY();
221
      int f3 = (int)mSta3.getZ();
222
      text += " ("+f1+","+f2+","+f3+")";
223
      }
224

    
225
    if( mSta4 !=null )
226
      {
227
      int f1 = (int)mSta4.getX();
228
      int f2 = (int)mSta4.getY();
229
      int f3 = (int)mSta4.getZ();
230
      int f4 = (int)mSta4.getW();
231
      text += " ("+f1+","+f2+","+f3+","+f4+")";
232
      }
233

    
234
    mText.setText(text);
235
    }
236

    
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238

    
239
  private void fillCenterStatics()
240
    {
241
    Effects3DActivity act = mAct.get();
242

    
243
    float x = (mInterCenter[0]*0.012f - 0.1f)*act.getWidth();
244
    float y = (mInterCenter[1]*0.012f - 0.1f)*act.getHeight();
245
    mCenterSta.set(x,y);
246
    }
247

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

    
250
  private void setDefaultCenterInter()
251
    {
252
    mInterCenter[0] = 50;
253
    mInterCenter[1] = 50;
254
    }
255

    
256
///////////////////////////////////////////////////////////////////////////////////////////////////
257

    
258
  private void setCenterText()
259
    {
260
    int f0 = (int)mCenterSta.getX();
261
    int f1 = (int)mCenterSta.getY();
262

    
263
    mTextCenter.setText("center ("+f0+","+f1+")");
264
    }
265

    
266
///////////////////////////////////////////////////////////////////////////////////////////////////
267

    
268
  private void fillRegionStatics()
269
    {
270
    Effects3DActivity act = mAct.get();
271

    
272
    float factorX = act.getWidth() / 100.0f;
273
    float factorY = act.getHeight()/ 100.0f;
274

    
275
    int deduct = (mName.getType() == EffectTypes.VERTEX ? 50:0);
276

    
277
    float  x = (mInterRegion[0]-deduct)*factorX;
278
    float  y = (mInterRegion[1]-deduct)*factorY;
279
    float rx =  mInterRegion[2]        *factorX;
280
    float ry =  mInterRegion[3]        *factorY;
281

    
282
    mRegionSta.set(x,y,rx,ry);
283
    }
284

    
285
///////////////////////////////////////////////////////////////////////////////////////////////////
286

    
287
  private void setDefaultRegionInter()
288
    {
289
    mInterRegion[0] = 50;
290
    mInterRegion[1] = 50;
291
    mInterRegion[2] = 50;
292
    mInterRegion[3] = 50;
293
    }
294

    
295
///////////////////////////////////////////////////////////////////////////////////////////////////
296

    
297
  private void setRegionText()
298
    {
299
    int f0 = (int)mRegionSta.getX();
300
    int f1 = (int)mRegionSta.getY();
301
    int f2 = (int)mRegionSta.getZ();
302
    int f3 = (int)mRegionSta.getW();
303

    
304
    mTextRegion.setText("region ("+f0+","+f1+","+f2+","+f3+")");
305
    }
306

    
307
///////////////////////////////////////////////////////////////////////////////////////////////////
308

    
309
  public Effects3DEffect(EffectNames name, Effects3DActivity act)
310
    {
311
    mAct = new WeakReference<>(act);
312
    mName = name;
313

    
314
    mDyn1 = null;
315
    mDyn3 = null;
316
    mDyn4 = null;
317
    mSta1 = null;
318
    mSta3 = null;
319
    mSta4 = null;
320

    
321
    mDimension = getDimension();
322

    
323
    switch(mDimension)
324
      {
325
      case 1 : mDyn1 = new Dynamic1D();
326
               mSta1 = new Static1D(0);
327
               mDyn1.add(mSta1);
328
               break;
329
      case 3 : mDyn3 = new Dynamic3D();
330
               mSta3 = new Static3D(0,0,0);
331
               mDyn3.add(mSta3);
332
               break;
333
      case 4 : if( mName == EffectNames.WAVE )
334
                 {
335
                 mDyn4 = new Dynamic4D();
336
                 mSta4 = new Static4D(0,0,0,0);
337
                 mDyn4.add(mSta4);
338
                 }
339
               else
340
                 {
341
                 mDyn3 = new Dynamic3D();
342
                 mSta3 = new Static3D(0,0,0);
343
                 mDyn3.add(mSta3);
344
                 mDyn1 = new Dynamic1D();
345
                 mSta1 = new Static1D(0);
346
                 mDyn1.add(mSta1);
347
                 }
348
               break;
349
      default: throw new RuntimeException("unsupported effect");
350
      }
351

    
352
    mInter = new int[mDimension];
353
    mSeekID= new int[mDimension];
354

    
355
    mInterRegion = new int[4];
356
    mSeekRegionID= new int[4];
357
    mRegionDyn   = new Dynamic4D();
358
    mRegionSta   = new Static4D(0,0,0,0);
359
    mRegionDyn.add(mRegionSta);
360

    
361
    mInterCenter = new int[2];
362
    mSeekCenterID= new int[2];
363
    mCenterDyn   = new Dynamic2D();
364
    mCenterSta   = new Static2D(0,0);
365
    mCenterDyn.add(mCenterSta);
366
    }
367

    
368
///////////////////////////////////////////////////////////////////////////////////////////////////
369

    
370
  public View createView()
371
    {
372
    View effect;
373
    SeekBar[] seek = new SeekBar[mDimension];
374

    
375
    Effects3DActivity act = mAct.get();
376

    
377
    switch(mDimension)
378
      {
379
      case 1 : effect     = act.getLayoutInflater().inflate(R.layout.effect1d, null);
380
               mText      = (TextView)effect.findViewById(R.id.effect1dText);
381
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect1dbar1);
382
               mSeekID[0] = seek[0].getId();
383
               break;
384
      case 2 : effect     = act.getLayoutInflater().inflate(R.layout.effect2d, null);
385
               mText      = (TextView)effect.findViewById(R.id.effect2dText);
386
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect2dbar1);
387
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect2dbar2);
388
               mSeekID[0] = seek[0].getId();
389
               mSeekID[1] = seek[1].getId();
390
               break;
391
      case 3 : effect     = act.getLayoutInflater().inflate(R.layout.effect3d, null);
392
               mText      = (TextView)effect.findViewById(R.id.effect3dText);
393
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect3dbar1);
394
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect3dbar2);
395
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect3dbar3);
396
               mSeekID[0] = seek[0].getId();
397
               mSeekID[1] = seek[1].getId();
398
               mSeekID[2] = seek[2].getId();
399
               break;
400
      case 4 : effect     = act.getLayoutInflater().inflate(R.layout.effect4d, null);
401
               mText      = (TextView)effect.findViewById(R.id.effect4dText);
402
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect4dbar1);
403
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect4dbar2);
404
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect4dbar3);
405
               seek[3]    = (SeekBar)effect.findViewById(R.id.effect4dbar4);
406
               mSeekID[0] = seek[0].getId();
407
               mSeekID[1] = seek[1].getId();
408
               mSeekID[2] = seek[2].getId();
409
               mSeekID[3] = seek[3].getId();
410
               break;
411
      default: android.util.Log.e("Effects3DEffect", "dimension "+mDimension+" not supported!");
412
               return null;
413
      }
414

    
415
    setDefaultInter();
416

    
417
    for(int i=0; i<mDimension; i++)
418
      {
419
      seek[i].setOnSeekBarChangeListener(this);
420
      seek[i].setProgress( mInter[i] );
421
      }
422

    
423
    Effects3DActivity.setSupportsRegion(supportsRegion());
424
    Effects3DActivity.setTypeVertex(mName.getType() == EffectTypes.VERTEX);
425

    
426
    return effect;
427
    }
428

    
429
///////////////////////////////////////////////////////////////////////////////////////////////////
430

    
431
  public View createRegion()
432
    {
433
    Effects3DActivity act = mAct.get();
434

    
435
    View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
436

    
437
    SeekBar[] seek = new SeekBar[4];
438

    
439
    seek[0] = (SeekBar)region.findViewById(R.id.effectRegionBarX );
440
    seek[1] = (SeekBar)region.findViewById(R.id.effectRegionBarY );
441
    seek[2] = (SeekBar)region.findViewById(R.id.effectRegionBarRX);
442
    seek[3] = (SeekBar)region.findViewById(R.id.effectRegionBarRY);
443

    
444
    mSeekRegionID[0] = seek[0].getId();
445
    mSeekRegionID[1] = seek[1].getId();
446
    mSeekRegionID[2] = seek[2].getId();
447
    mSeekRegionID[3] = seek[3].getId();
448

    
449
    mTextRegion = (TextView)region.findViewById(R.id.effectRegionText);
450

    
451
    setDefaultRegionInter();
452

    
453
    for(int i=0; i<4; i++)
454
      {
455
      seek[i].setOnSeekBarChangeListener(this);
456
      seek[i].setProgress( mInterRegion[i] );
457
      }
458

    
459
    act.setRegion(mRegionSta.getX(),mRegionSta.getY(),mRegionSta.getZ());
460

    
461
    return region;
462
    }
463

    
464
///////////////////////////////////////////////////////////////////////////////////////////////////
465

    
466
  public View createCenter()
467
    {
468
    Effects3DActivity act = mAct.get();
469

    
470
    View center = act.getLayoutInflater().inflate(R.layout.effectcenter, null);
471

    
472
    SeekBar[] seek = new SeekBar[2];
473

    
474
    seek[0] = (SeekBar)center.findViewById(R.id.effectCenterBarX );
475
    seek[1] = (SeekBar)center.findViewById(R.id.effectCenterBarY );
476

    
477
    mSeekCenterID[0] = seek[0].getId();
478
    mSeekCenterID[1] = seek[1].getId();
479

    
480
    mTextCenter = (TextView)center.findViewById(R.id.effectCenterText);
481

    
482
    setDefaultCenterInter();
483

    
484
    for(int i=0; i<2; i++)
485
      {
486
      seek[i].setOnSeekBarChangeListener(this);
487
      seek[i].setProgress( mInterCenter[i] );
488
      }
489

    
490
    act.setCenter(mCenterSta.getX(),mCenterSta.getY());
491

    
492
    return center;
493
    }
494

    
495
///////////////////////////////////////////////////////////////////////////////////////////////////
496

    
497
  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
498
    {
499
    if ( mDimension>=1 && bar.getId()==mSeekID[0] )
500
      {
501
      mInter[0] = progress;
502
      fillStatics();
503
      setText();
504
      }
505
    if ( mDimension>=2 && bar.getId()==mSeekID[1] )
506
      {
507
      mInter[1] = progress;
508
      fillStatics();
509
      setText();
510
      }
511
    if ( mDimension>=3 && bar.getId()==mSeekID[2] )
512
      {
513
      mInter[2] = progress;
514
      fillStatics();
515
      setText();
516
      }
517
    if ( mDimension>=4 && bar.getId()==mSeekID[3] )
518
      {
519
      mInter[3] = progress;
520
      fillStatics();
521
      setText();
522
      }
523

    
524
    if( bar.getId() == mSeekRegionID[0] )
525
      {
526
      mInterRegion[0] = progress;
527
      fillRegionStatics();
528
      setRegionText();
529
      }
530
    if( bar.getId() == mSeekRegionID[1] )
531
      {
532
      mInterRegion[1] = progress;
533
      fillRegionStatics();
534
      setRegionText();
535
      }
536
    if( bar.getId() == mSeekRegionID[2] )
537
      {
538
      mInterRegion[2] = progress;
539
      fillRegionStatics();
540
      setRegionText();
541
      }
542
    if( bar.getId() == mSeekRegionID[3] )
543
      {
544
      mInterRegion[3] = progress;
545
      fillRegionStatics();
546
      setRegionText();
547
      }
548

    
549
    if( bar.getId() == mSeekCenterID[0] )
550
      {
551
      mInterCenter[0] = progress;
552
      fillCenterStatics();
553
      setCenterText();
554
      }
555
    if( bar.getId() == mSeekCenterID[1] )
556
      {
557
      mInterCenter[1] = progress;
558
      fillCenterStatics();
559
      setCenterText();
560
      }
561

    
562
    if( fromUser )
563
      {
564
      Effects3DActivity.setSupportsRegion(supportsRegion());
565
      Effects3DActivity.setTypeVertex(mName.getType() == EffectTypes.VERTEX);
566

    
567
      Effects3DActivity act = mAct.get();
568

    
569
      act.setCenter(mCenterSta.getX(),mCenterSta.getY());
570
      act.setRegion(mRegionSta.getX(),mRegionSta.getY(),mRegionSta.getZ());
571
      }
572
    }
573

    
574
///////////////////////////////////////////////////////////////////////////////////////////////////
575

    
576
  public void onStartTrackingTouch(SeekBar bar) { }
577

    
578
///////////////////////////////////////////////////////////////////////////////////////////////////
579

    
580
  public void onStopTrackingTouch(SeekBar bar)  { }
581
  }
(2-2/4)