Project

General

Profile

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

examples / src / main / java / org / distorted / examples / effects3d / Effects3DEffect.java @ 76a81b6a

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 Static1D  mSta1;
60
  private Static3D  mSta3;
61
  private Dynamic4D mRegionDyn;
62
  private Static4D  mRegionSta;
63
  private Dynamic2D mCenterDyn;
64
  private Static2D  mCenterSta;
65

    
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67
// requires knowledge about effect nature
68

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

    
76
      case CHROMA       :
77
      case SMOOTH_CHROMA: return 4;
78

    
79
      default           : return 1;
80
      }
81
    }
82

    
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84
// requires knowledge about effect nature
85

    
86
  public void apply(DistortedObject object)
87
    {
88
    switch(mName)
89
      {
90
      case DISTORT: object.distort(mDyn3, mCenterDyn, mRegionDyn); break;
91
      case DEFORM : object.deform (mDyn3, mCenterDyn            ); break;
92
      case SINK   : object.sink   (mDyn1, mCenterDyn, mRegionDyn); break;
93
      case SWIRL  : object.swirl  (mDyn1, mCenterDyn, mRegionDyn); break;
94

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

    
108
///////////////////////////////////////////////////////////////////////////////////////////////////
109
// requires knowledge about effect nature
110

    
111
  private boolean supportsRegion()
112
    {
113
    return mName == EffectNames.DEFORM ? false : true;
114
    }
115

    
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117
// requires knowledge about effect nature
118

    
119
  private void fillStatics()
120
    {
121
    switch(mName)
122
      {
123
      case DISTORT          :
124
      case DEFORM           : float l = mAct.get().getWidth()/50.0f;
125
                              float x = (mInter[0]-50)*l;
126
                              float y = (mInter[1]-50)*l;
127
                              float z = (mInter[2]-50)*l;
128
                              mSta3.set(x,y,z);
129
                              break;
130
      case SINK             : mSta1.set(mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
131
                              break;
132
      case SWIRL            : mSta1.set( 3.6f*(mInter[0]-50) );
133
                              break;
134

    
135
      case ALPHA            :
136
      case SMOOTH_ALPHA     :
137
      case BRIGHTNESS       :
138
      case SMOOTH_BRIGHTNESS:
139
      case SATURATION       :
140
      case SMOOTH_SATURATION:
141
      case CONTRAST         :
142
      case SMOOTH_CONTRAST  : mSta1.set(mInter[0]/100.0f);
143
                              break;
144

    
145
      case CHROMA           :
146
      case SMOOTH_CHROMA    : mSta1.set(mInter[0]/100.0f);
147
                              mSta3.set(255.0f*mInter[1]/100,
148
                                        255.0f*mInter[2]/100,
149
                                        255.0f*mInter[3]/100);
150
                              break;
151
      }
152
    }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155
// requires knowledge about effect nature
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
      case ALPHA            :
171
      case SMOOTH_ALPHA     :
172
      case BRIGHTNESS       :
173
      case SMOOTH_BRIGHTNESS:
174
      case SATURATION       :
175
      case SMOOTH_SATURATION:
176
      case CONTRAST         :
177
      case SMOOTH_CONTRAST  : mInter[0] = 50;
178
                              break;
179

    
180
      case CHROMA           :
181
      case SMOOTH_CHROMA    : mInter[0] = 50;
182
                              mInter[1] =  0;
183
                              mInter[2] =  0;
184
                              mInter[3] =  0;
185
                              break;
186
      }
187
    }
188

    
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190
// requires knowledge about effect nature
191

    
192
  private void setText()
193
    {
194
    String text = mName.name();
195

    
196
    if( mName.getType()== EffectTypes.FRAGMENT )
197
      {
198
      text+=(" "+((int)(mSta1.getX()*100))/100.0f);
199
      }
200

    
201
    if( mName==EffectNames.DISTORT || mName==EffectNames.DEFORM       ||
202
        mName==EffectNames.CHROMA  || mName==EffectNames.SMOOTH_CHROMA )
203
      {
204
      int f1 = (int)mSta3.getX();
205
      int f2 = (int)mSta3.getY();
206
      int f3 = (int)mSta3.getZ();
207
      text += " ("+f1+","+f2+","+f3+")";
208
      }
209
    else if(mName.getType() == EffectTypes.VERTEX)
210
      {
211
      float f1 = ((int)(mSta1.getX()*100))/100.0f;
212
      text += " ("+f1+")";
213
      }
214

    
215
    mText.setText(text);
216
    }
217

    
218
///////////////////////////////////////////////////////////////////////////////////////////////////
219

    
220
  private void fillCenterStatics()
221
    {
222
    Effects3DActivity act = mAct.get();
223

    
224
    float x = (mInterCenter[0]*0.012f - 0.1f)*act.getWidth();
225
    float y = (mInterCenter[1]*0.012f - 0.1f)*act.getHeight();
226
    mCenterSta.set(x,y);
227
    }
228

    
229
///////////////////////////////////////////////////////////////////////////////////////////////////
230

    
231
  private void setDefaultCenterInter()
232
    {
233
    mInterCenter[0] = 50;
234
    mInterCenter[1] = 50;
235
    }
236

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

    
239
  private void setCenterText()
240
    {
241
    int f0 = (int)mCenterSta.getX();
242
    int f1 = (int)mCenterSta.getY();
243

    
244
    mTextCenter.setText("center ("+f0+","+f1+")");
245
    }
246

    
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248

    
249
  private void fillRegionStatics()
250
    {
251
    Effects3DActivity act = mAct.get();
252

    
253
    float factorX = act.getWidth() / 100.0f;
254
    float factorY = act.getHeight()/ 100.0f;
255

    
256
    int deduct = (mName.getType() == EffectTypes.VERTEX ? 50:0);
257

    
258
    float  x = (mInterRegion[0]-deduct)*factorX;
259
    float  y = (mInterRegion[1]-deduct)*factorY;
260
    float rx =  mInterRegion[2]        *factorX;
261
    float ry =  mInterRegion[3]        *factorY;
262

    
263
    mRegionSta.set(x,y,rx,ry);
264
    }
265

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

    
268
  private void setDefaultRegionInter()
269
    {
270
    mInterRegion[0] = 50;
271
    mInterRegion[1] = 50;
272
    mInterRegion[2] = 50;
273
    mInterRegion[3] = 50;
274
    }
275

    
276
///////////////////////////////////////////////////////////////////////////////////////////////////
277

    
278
  private void setRegionText()
279
    {
280
    int f0 = (int)mRegionSta.getX();
281
    int f1 = (int)mRegionSta.getY();
282
    int f2 = (int)mRegionSta.getZ();
283
    int f3 = (int)mRegionSta.getW();
284

    
285
    mTextRegion.setText("region ("+f0+","+f1+","+f2+","+f3+")");
286
    }
287

    
288
///////////////////////////////////////////////////////////////////////////////////////////////////
289

    
290
  public Effects3DEffect(EffectNames name, Effects3DActivity act)
291
    {
292
    mAct = new WeakReference<>(act);
293
    mName = name;
294

    
295
    mDimension = getDimension();
296

    
297
    switch(mDimension)
298
      {
299
      case 1 : mDyn1 = new Dynamic1D();
300
               mSta1 = new Static1D(0);
301
               mDyn1.add(mSta1);
302
               mDyn3 = null;
303
               break;
304
      case 3 : mDyn3 = new Dynamic3D();
305
               mSta3 = new Static3D(0,0,0);
306
               mDyn3.add(mSta3);
307
               mDyn1 = null;
308
               break;
309
      case 4 : mDyn3 = new Dynamic3D();
310
               mSta3 = new Static3D(0,0,0);
311
               mDyn3.add(mSta3);
312
               mDyn1 = new Dynamic1D();
313
               mSta1 = new Static1D(0);
314
               mDyn1.add(mSta1);
315
               break;
316
      default: throw new RuntimeException("unsupported effect");
317
      }
318

    
319
    mInter = new int[mDimension];
320
    mSeekID= new int[mDimension];
321

    
322
    mInterRegion = new int[4];
323
    mSeekRegionID= new int[4];
324
    mRegionDyn   = new Dynamic4D();
325
    mRegionSta   = new Static4D(0,0,0,0);
326
    mRegionDyn.add(mRegionSta);
327

    
328
    mInterCenter = new int[2];
329
    mSeekCenterID= new int[2];
330
    mCenterDyn   = new Dynamic2D();
331
    mCenterSta   = new Static2D(0,0);
332
    mCenterDyn.add(mCenterSta);
333
    }
334

    
335
///////////////////////////////////////////////////////////////////////////////////////////////////
336

    
337
  public View createView()
338
    {
339
    View effect;
340
    SeekBar[] seek = new SeekBar[mDimension];
341

    
342
    Effects3DActivity act = mAct.get();
343

    
344
    switch(mDimension)
345
      {
346
      case 1 : effect     = act.getLayoutInflater().inflate(R.layout.effect1d, null);
347
               mText      = (TextView)effect.findViewById(R.id.effect1dText);
348
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect1dbar1);
349
               mSeekID[0] = seek[0].getId();
350
               break;
351
      case 2 : effect     = act.getLayoutInflater().inflate(R.layout.effect2d, null);
352
               mText      = (TextView)effect.findViewById(R.id.effect2dText);
353
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect2dbar1);
354
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect2dbar2);
355
               mSeekID[0] = seek[0].getId();
356
               mSeekID[1] = seek[1].getId();
357
               break;
358
      case 3 : effect     = act.getLayoutInflater().inflate(R.layout.effect3d, null);
359
               mText      = (TextView)effect.findViewById(R.id.effect3dText);
360
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect3dbar1);
361
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect3dbar2);
362
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect3dbar3);
363
               mSeekID[0] = seek[0].getId();
364
               mSeekID[1] = seek[1].getId();
365
               mSeekID[2] = seek[2].getId();
366
               break;
367
      case 4 : effect     = act.getLayoutInflater().inflate(R.layout.effect4d, null);
368
               mText      = (TextView)effect.findViewById(R.id.effect4dText);
369
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect4dbar1);
370
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect4dbar2);
371
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect4dbar3);
372
               seek[3]    = (SeekBar)effect.findViewById(R.id.effect4dbar4);
373
               mSeekID[0] = seek[0].getId();
374
               mSeekID[1] = seek[1].getId();
375
               mSeekID[2] = seek[2].getId();
376
               mSeekID[3] = seek[3].getId();
377
               break;
378
      default: android.util.Log.e("Effects3DEffect", "dimension "+mDimension+" not supported!");
379
               return null;
380
      }
381

    
382
    setDefaultInter();
383

    
384
    for(int i=0; i<mDimension; i++)
385
      {
386
      seek[i].setOnSeekBarChangeListener(this);
387
      seek[i].setProgress( mInter[i] );
388
      }
389

    
390
    Effects3DActivity.setSupportsRegion(supportsRegion());
391
    Effects3DActivity.setTypeVertex(mName.getType() == EffectTypes.VERTEX);
392

    
393
    return effect;
394
    }
395

    
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397

    
398
  public View createRegion()
399
    {
400
    Effects3DActivity act = mAct.get();
401

    
402
    View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
403

    
404
    SeekBar[] seek = new SeekBar[4];
405

    
406
    seek[0] = (SeekBar)region.findViewById(R.id.effectRegionBarX );
407
    seek[1] = (SeekBar)region.findViewById(R.id.effectRegionBarY );
408
    seek[2] = (SeekBar)region.findViewById(R.id.effectRegionBarRX);
409
    seek[3] = (SeekBar)region.findViewById(R.id.effectRegionBarRY);
410

    
411
    mSeekRegionID[0] = seek[0].getId();
412
    mSeekRegionID[1] = seek[1].getId();
413
    mSeekRegionID[2] = seek[2].getId();
414
    mSeekRegionID[3] = seek[3].getId();
415

    
416
    mTextRegion = (TextView)region.findViewById(R.id.effectRegionText);
417

    
418
    setDefaultRegionInter();
419

    
420
    for(int i=0; i<4; i++)
421
      {
422
      seek[i].setOnSeekBarChangeListener(this);
423
      seek[i].setProgress( mInterRegion[i] );
424
      }
425

    
426
    act.setRegion(mRegionSta.getX(),mRegionSta.getY(),mRegionSta.getZ());
427

    
428
    return region;
429
    }
430

    
431
///////////////////////////////////////////////////////////////////////////////////////////////////
432

    
433
  public View createCenter()
434
    {
435
    Effects3DActivity act = mAct.get();
436

    
437
    View center = act.getLayoutInflater().inflate(R.layout.effectcenter, null);
438

    
439
    SeekBar[] seek = new SeekBar[2];
440

    
441
    seek[0] = (SeekBar)center.findViewById(R.id.effectCenterBarX );
442
    seek[1] = (SeekBar)center.findViewById(R.id.effectCenterBarY );
443

    
444
    mSeekCenterID[0] = seek[0].getId();
445
    mSeekCenterID[1] = seek[1].getId();
446

    
447
    mTextCenter = (TextView)center.findViewById(R.id.effectCenterText);
448

    
449
    setDefaultCenterInter();
450

    
451
    for(int i=0; i<2; i++)
452
      {
453
      seek[i].setOnSeekBarChangeListener(this);
454
      seek[i].setProgress( mInterCenter[i] );
455
      }
456

    
457
    act.setCenter(mCenterSta.getX(),mCenterSta.getY());
458

    
459
    return center;
460
    }
461

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

    
464
  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
465
    {
466
    if ( mDimension>=1 && bar.getId()==mSeekID[0] )
467
      {
468
      mInter[0] = progress;
469
      fillStatics();
470
      setText();
471
      }
472
    if ( mDimension>=2 && bar.getId()==mSeekID[1] )
473
      {
474
      mInter[1] = progress;
475
      fillStatics();
476
      setText();
477
      }
478
    if ( mDimension>=3 && bar.getId()==mSeekID[2] )
479
      {
480
      mInter[2] = progress;
481
      fillStatics();
482
      setText();
483
      }
484
    if ( mDimension>=4 && bar.getId()==mSeekID[3] )
485
      {
486
      mInter[3] = progress;
487
      fillStatics();
488
      setText();
489
      }
490

    
491
    if( bar.getId() == mSeekRegionID[0] )
492
      {
493
      mInterRegion[0] = progress;
494
      fillRegionStatics();
495
      setRegionText();
496
      }
497
    if( bar.getId() == mSeekRegionID[1] )
498
      {
499
      mInterRegion[1] = progress;
500
      fillRegionStatics();
501
      setRegionText();
502
      }
503
    if( bar.getId() == mSeekRegionID[2] )
504
      {
505
      mInterRegion[2] = progress;
506
      fillRegionStatics();
507
      setRegionText();
508
      }
509
    if( bar.getId() == mSeekRegionID[3] )
510
      {
511
      mInterRegion[3] = progress;
512
      fillRegionStatics();
513
      setRegionText();
514
      }
515

    
516
    if( bar.getId() == mSeekCenterID[0] )
517
      {
518
      mInterCenter[0] = progress;
519
      fillCenterStatics();
520
      setCenterText();
521
      }
522
    if( bar.getId() == mSeekCenterID[1] )
523
      {
524
      mInterCenter[1] = progress;
525
      fillCenterStatics();
526
      setCenterText();
527
      }
528

    
529
    if( fromUser )
530
      {
531
      Effects3DActivity.setSupportsRegion(supportsRegion());
532
      Effects3DActivity.setTypeVertex(mName.getType() == EffectTypes.VERTEX);
533

    
534
      Effects3DActivity act = mAct.get();
535

    
536
      act.setCenter(mCenterSta.getX(),mCenterSta.getY());
537
      act.setRegion(mRegionSta.getX(),mRegionSta.getY(),mRegionSta.getZ());
538
      }
539
    }
540

    
541
///////////////////////////////////////////////////////////////////////////////////////////////////
542

    
543
  public void onStartTrackingTouch(SeekBar bar) { }
544

    
545
///////////////////////////////////////////////////////////////////////////////////////////////////
546

    
547
  public void onStopTrackingTouch(SeekBar bar)  { }
548
  }
(2-2/4)