Project

General

Profile

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

examples / src / main / java / org / distorted / examples / fragment3d / Fragment3DEffect.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.fragment3d;
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.Dynamic3D;
30
import org.distorted.library.type.Dynamic4D;
31
import org.distorted.library.type.Static1D;
32
import org.distorted.library.type.Static3D;
33
import org.distorted.library.type.Static4D;
34

    
35
import java.lang.ref.WeakReference;
36

    
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38

    
39
public class Fragment3DEffect implements SeekBar.OnSeekBarChangeListener
40
  {
41
  private WeakReference<Fragment3DActivity> mAct;
42

    
43
  private EffectNames mName;
44
  private int[] mInter;
45
  private int[] mInterRegion;
46
  private int[] mSeekID;
47
  private int[] mSeekRegionID;
48
  private int mDimension;
49
  private TextView mText;
50
  private TextView mTextRegion;
51

    
52
  private Dynamic1D mDyn1;
53
  private Dynamic3D mDyn3;
54
  private Static1D  mSta1;
55
  private Static3D  mSta3;
56
  private Dynamic4D mRegionDyn;
57
  private Static4D  mRegionSta;
58

    
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60

    
61
  private void fillRegionStatics()
62
    {
63
    Fragment3DActivity act = mAct.get();
64

    
65
    float factorX = act.getWidth() / 100.0f;
66
    float factorY = act.getHeight()/ 100.0f;
67

    
68
    float  x = mInterRegion[0]*factorX;
69
    float  y = mInterRegion[1]*factorY;
70
    float rx = mInterRegion[2]*factorX;
71
    float ry = mInterRegion[3]*factorY;
72

    
73
    mRegionSta.set(x,y,rx,ry);
74
    }
75

    
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77

    
78
  private void setDefaultRegionInter()
79
    {
80
    mInterRegion[0] = 50;
81
    mInterRegion[1] = 50;
82
    mInterRegion[2] = 50;
83
    mInterRegion[3] = 50;
84
    }
85

    
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87

    
88
  private void setRegionText()
89
    {
90
    int f0 = (int)mRegionSta.getX();
91
    int f1 = (int)mRegionSta.getY();
92
    int f2 = (int)mRegionSta.getZ();
93
    int f3 = (int)mRegionSta.getW();
94

    
95
    mTextRegion.setText("region ("+f0+","+f1+","+f2+","+f3+")");
96
    }
97

    
98
///////////////////////////////////////////////////////////////////////////////////////////////////
99

    
100
  private void fillStatics()
101
    {
102
    switch(mName)
103
      {
104
      case MACROBLOCK       : Fragment3DActivity act = mAct.get();
105
                              mSta1.set(mInter[0]*act.getWidth() / 100.0f);
106
                              break;
107
      case ALPHA            :
108
      case SMOOTH_ALPHA     :
109
      case BRIGHTNESS       :
110
      case SMOOTH_BRIGHTNESS:
111
      case SATURATION       :
112
      case SMOOTH_SATURATION:
113
      case CONTRAST         :
114
      case SMOOTH_CONTRAST  : mSta1.set(mInter[0]/100.0f);
115
                              break;
116

    
117
      case CHROMA           :
118
      case SMOOTH_CHROMA    : mSta1.set(mInter[0]/100.0f);
119
                              mSta3.set(255.0f*mInter[1]/100,
120
                                        255.0f*mInter[2]/100,
121
                                        255.0f*mInter[3]/100);
122
                              break;
123
      }
124
    }
125

    
126
///////////////////////////////////////////////////////////////////////////////////////////////////
127

    
128
  private void setDefaultInter()
129
    {
130
    switch(mName)
131
      {
132
      case MACROBLOCK       : mInter[0] =  3;
133
                              break;
134
      case ALPHA            :
135
      case SMOOTH_ALPHA     :
136
      case BRIGHTNESS       :
137
      case SMOOTH_BRIGHTNESS:
138
      case SATURATION       :
139
      case SMOOTH_SATURATION:
140
      case CONTRAST         :
141
      case SMOOTH_CONTRAST  : mInter[0] = 50;
142
                              break;
143

    
144
      case CHROMA           :
145
      case SMOOTH_CHROMA    : mInter[0] = 50;
146
                              mInter[1] =  0;
147
                              mInter[2] =  0;
148
                              mInter[3] =  0;
149
                              break;
150
      }
151
    }
152

    
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154

    
155
  private void setText()
156
    {
157
    float f1 = ((int)(mSta1.getX()*100))/100.0f;
158

    
159
    String text = mName.name() +" "+f1;
160

    
161
    if( mName==EffectNames.CHROMA || mName==EffectNames.SMOOTH_CHROMA)
162
      {
163
      int f2 = (int)mSta3.getX();
164
      int f3 = (int)mSta3.getY();
165
      int f4 = (int)mSta3.getZ();
166
      text += "("+f2+","+f3+","+f4+")";
167
      }
168

    
169
    mText.setText(text);
170
    }
171

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

    
174
  public Fragment3DEffect(EffectNames name, Fragment3DActivity act)
175
    {
176
    mAct = new WeakReference<>(act);
177
    mName = name;
178

    
179
    if( mName==EffectNames.CHROMA || mName==EffectNames.SMOOTH_CHROMA )
180
      {
181
      mDimension = 4;
182
      mDyn3 = new Dynamic3D();
183
      mSta3 = new Static3D(0,0,0);
184
      mDyn3.add(mSta3);
185
      }
186
    else
187
      {
188
      mDimension = 1;
189
      mDyn3 = null;
190
      mSta3 = null;
191
      }
192

    
193
    mInter = new int[mDimension];
194
    mSeekID= new int[mDimension];
195

    
196
    mDyn1 = new Dynamic1D();
197
    mSta1 = new Static1D(0);
198
    mDyn1.add(mSta1);
199

    
200
    mInterRegion = new int[4];
201
    mSeekRegionID= new int[4];
202
    mRegionDyn   = new Dynamic4D();
203
    mRegionSta   = new Static4D(0,0,0,0);
204
    mRegionDyn.add(mRegionSta);
205
    }
206

    
207
///////////////////////////////////////////////////////////////////////////////////////////////////
208

    
209
  public Dynamic1D getDyn1()
210
    {
211
    return mDyn1;
212
    }
213

    
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215

    
216
  public Dynamic3D getDyn3()
217
    {
218
    return mDyn3;
219
    }
220

    
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222

    
223
  public Dynamic4D getRegion()
224
    {
225
    return mRegionDyn;
226
    }
227

    
228
///////////////////////////////////////////////////////////////////////////////////////////////////
229

    
230
  public View createView()
231
    {
232
    View effect;
233
    SeekBar[] seek = new SeekBar[mDimension];
234

    
235
    Fragment3DActivity act = mAct.get();
236

    
237
    switch(mDimension)
238
      {
239
      case 1 : effect     = act.getLayoutInflater().inflate(R.layout.effect1d, null);
240
               mText      = (TextView)effect.findViewById(R.id.effect1dText);
241
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect1dbar1);
242
               mSeekID[0] = seek[0].getId();
243
               break;
244
      case 2 : effect     = act.getLayoutInflater().inflate(R.layout.effect2d, null);
245
               mText      = (TextView)effect.findViewById(R.id.effect2dText);
246
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect2dbar1);
247
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect2dbar2);
248
               mSeekID[0] = seek[0].getId();
249
               mSeekID[1] = seek[1].getId();
250
               break;
251
      case 3 : effect     = act.getLayoutInflater().inflate(R.layout.effect3d, null);
252
               mText      = (TextView)effect.findViewById(R.id.effect3dText);
253
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect3dbar1);
254
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect3dbar2);
255
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect3dbar3);
256
               mSeekID[0] = seek[0].getId();
257
               mSeekID[1] = seek[1].getId();
258
               mSeekID[2] = seek[2].getId();
259
               break;
260
      case 4 : effect     = act.getLayoutInflater().inflate(R.layout.effect4d, null);
261
               mText      = (TextView)effect.findViewById(R.id.effect4dText);
262
               seek[0]    = (SeekBar)effect.findViewById(R.id.effect4dbar1);
263
               seek[1]    = (SeekBar)effect.findViewById(R.id.effect4dbar2);
264
               seek[2]    = (SeekBar)effect.findViewById(R.id.effect4dbar3);
265
               seek[3]    = (SeekBar)effect.findViewById(R.id.effect4dbar4);
266
               mSeekID[0] = seek[0].getId();
267
               mSeekID[1] = seek[1].getId();
268
               mSeekID[2] = seek[2].getId();
269
               mSeekID[3] = seek[3].getId();
270
               break;
271
      default: android.util.Log.e("Vertex3DEffect", "dimension "+mDimension+" not supported!");
272
               return null;
273
      }
274

    
275
    setDefaultInter();
276
    fillStatics();
277
    setText();
278

    
279
    for(int i=0; i<mDimension; i++)
280
      {
281
      seek[i].setOnSeekBarChangeListener(this);
282
      seek[i].setProgress( mInter[i] );
283
      }
284

    
285
    return effect;
286
    }
287

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

    
290
  public View createRegion()
291
    {
292
    Fragment3DActivity act = mAct.get();
293

    
294
    View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
295

    
296
    SeekBar[] seek = new SeekBar[4];
297

    
298
    seek[0] = (SeekBar)region.findViewById(R.id.effectRegionBarX );
299
    seek[1] = (SeekBar)region.findViewById(R.id.effectRegionBarY );
300
    seek[2] = (SeekBar)region.findViewById(R.id.effectRegionBarRX);
301
    seek[3] = (SeekBar)region.findViewById(R.id.effectRegionBarRY);
302

    
303
    mSeekRegionID[0] = seek[0].getId();
304
    mSeekRegionID[1] = seek[1].getId();
305
    mSeekRegionID[2] = seek[2].getId();
306
    mSeekRegionID[3] = seek[3].getId();
307

    
308
    mTextRegion    = (TextView)region.findViewById(R.id.effectRegionText);
309

    
310
    setDefaultRegionInter();
311
    fillRegionStatics();
312
    setRegionText();
313

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

    
320
    return region;
321
    }
322

    
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324

    
325
  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
326
    {
327
    if ( mDimension>=1 && bar.getId()==mSeekID[0] )
328
      {
329
      mInter[0] = progress;
330
      fillStatics();
331
      setText();
332
      }
333
    if ( mDimension>=2 && bar.getId()==mSeekID[1] )
334
      {
335
      mInter[1] = progress;
336
      fillStatics();
337
      setText();
338
      }
339
    if ( mDimension>=3 && bar.getId()==mSeekID[2] )
340
      {
341
      mInter[2] = progress;
342
      fillStatics();
343
      setText();
344
      }
345
    if ( mDimension>=4 && bar.getId()==mSeekID[3] )
346
      {
347
      mInter[3] = progress;
348
      fillStatics();
349
      setText();
350
      }
351

    
352
    if( bar.getId() == mSeekRegionID[0] )
353
      {
354
      mInterRegion[0] = progress;
355
      fillRegionStatics();
356
      setRegionText();
357
      }
358
    if( bar.getId() == mSeekRegionID[1] )
359
      {
360
      mInterRegion[1] = progress;
361
      fillRegionStatics();
362
      setRegionText();
363
      }
364
    if( bar.getId() == mSeekRegionID[2] )
365
      {
366
      mInterRegion[2] = progress;
367
      fillRegionStatics();
368
      setRegionText();
369
      }
370
    if( bar.getId() == mSeekRegionID[3] )
371
      {
372
      mInterRegion[3] = progress;
373
      fillRegionStatics();
374
      setRegionText();
375
      }
376

    
377
    }
378

    
379
///////////////////////////////////////////////////////////////////////////////////////////////////
380

    
381
  public void onStartTrackingTouch(SeekBar bar) { }
382

    
383
///////////////////////////////////////////////////////////////////////////////////////////////////
384

    
385
  public void onStopTrackingTouch(SeekBar bar)  { }
386
  }
(2-2/4)