Project

General

Profile

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

examples / src / main / java / org / distorted / examples / fragment3d / Fragment3DEffect.java @ 66466936

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 ALPHA            :
105
      case SMOOTH_ALPHA     :
106
      case BRIGHTNESS       :
107
      case SMOOTH_BRIGHTNESS:
108
      case SATURATION       :
109
      case SMOOTH_SATURATION:
110
      case CONTRAST         :
111
      case SMOOTH_CONTRAST  : mSta1.set(mInter[0]/100.0f);
112
                              break;
113

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

    
123
///////////////////////////////////////////////////////////////////////////////////////////////////
124

    
125
  private void setDefaultInter()
126
    {
127
    switch(mName)
128
      {
129
      case ALPHA            :
130
      case SMOOTH_ALPHA     :
131
      case BRIGHTNESS       :
132
      case SMOOTH_BRIGHTNESS:
133
      case SATURATION       :
134
      case SMOOTH_SATURATION:
135
      case CONTRAST         :
136
      case SMOOTH_CONTRAST  : mInter[0] = 50;
137
                              break;
138

    
139
      case CHROMA           :
140
      case SMOOTH_CHROMA    : mInter[0] = 50;
141
                              mInter[1] =  0;
142
                              mInter[2] =  0;
143
                              mInter[3] =  0;
144
                              break;
145
      }
146
    }
147

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  private void setText()
151
    {
152
    float f1 = ((int)(mSta1.getX()*100))/100.0f;
153

    
154
    String text = mName.name() +" "+f1;
155

    
156
    if( mName==EffectNames.CHROMA || mName==EffectNames.SMOOTH_CHROMA)
157
      {
158
      int f2 = (int)mSta3.getX();
159
      int f3 = (int)mSta3.getY();
160
      int f4 = (int)mSta3.getZ();
161
      text += "("+f2+","+f3+","+f4+")";
162
      }
163

    
164
    mText.setText(text);
165
    }
166

    
167
///////////////////////////////////////////////////////////////////////////////////////////////////
168

    
169
  public Fragment3DEffect(EffectNames name, Fragment3DActivity act)
170
    {
171
    mAct = new WeakReference<>(act);
172
    mName = name;
173

    
174
    if( mName==EffectNames.CHROMA || mName==EffectNames.SMOOTH_CHROMA )
175
      {
176
      mDimension = 4;
177
      mDyn3 = new Dynamic3D();
178
      mSta3 = new Static3D(0,0,0);
179
      mDyn3.add(mSta3);
180
      }
181
    else
182
      {
183
      mDimension = 1;
184
      mDyn3 = null;
185
      mSta3 = null;
186
      }
187

    
188
    mInter = new int[mDimension];
189
    mSeekID= new int[mDimension];
190

    
191
    mDyn1 = new Dynamic1D();
192
    mSta1 = new Static1D(0);
193
    mDyn1.add(mSta1);
194

    
195
    mInterRegion = new int[4];
196
    mSeekRegionID= new int[4];
197
    mRegionDyn   = new Dynamic4D();
198
    mRegionSta   = new Static4D(0,0,0,0);
199
    mRegionDyn.add(mRegionSta);
200
    }
201

    
202
///////////////////////////////////////////////////////////////////////////////////////////////////
203

    
204
  public Dynamic1D getDyn1()
205
    {
206
    return mDyn1;
207
    }
208

    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210

    
211
  public Dynamic3D getDyn3()
212
    {
213
    return mDyn3;
214
    }
215

    
216
///////////////////////////////////////////////////////////////////////////////////////////////////
217

    
218
  public Dynamic4D getRegion()
219
    {
220
    return mRegionDyn;
221
    }
222

    
223
///////////////////////////////////////////////////////////////////////////////////////////////////
224

    
225
  public View createView()
226
    {
227
    View effect;
228
    SeekBar[] seek = new SeekBar[mDimension];
229

    
230
    Fragment3DActivity act = mAct.get();
231

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

    
270
    setDefaultInter();
271
    fillStatics();
272
    setText();
273

    
274
    for(int i=0; i<mDimension; i++)
275
      {
276
      seek[i].setOnSeekBarChangeListener(this);
277
      seek[i].setProgress( mInter[i] );
278
      }
279

    
280
    return effect;
281
    }
282

    
283
///////////////////////////////////////////////////////////////////////////////////////////////////
284

    
285
  public View createRegion()
286
    {
287
    Fragment3DActivity act = mAct.get();
288

    
289
    View region = act.getLayoutInflater().inflate(R.layout.effectregion, null);
290

    
291
    SeekBar[] seek = new SeekBar[4];
292

    
293
    seek[0] = (SeekBar)region.findViewById(R.id.effectRegionBarX );
294
    seek[1] = (SeekBar)region.findViewById(R.id.effectRegionBarY );
295
    seek[2] = (SeekBar)region.findViewById(R.id.effectRegionBarRX);
296
    seek[3] = (SeekBar)region.findViewById(R.id.effectRegionBarRY);
297

    
298
    mSeekRegionID[0] = seek[0].getId();
299
    mSeekRegionID[1] = seek[1].getId();
300
    mSeekRegionID[2] = seek[2].getId();
301
    mSeekRegionID[3] = seek[3].getId();
302

    
303
    mTextRegion    = (TextView)region.findViewById(R.id.effectRegionText);
304

    
305
    setDefaultRegionInter();
306
    fillRegionStatics();
307
    setRegionText();
308

    
309
    for(int i=0; i<4; i++)
310
      {
311
      seek[i].setOnSeekBarChangeListener(this);
312
      seek[i].setProgress( mInterRegion[i] );
313
      }
314

    
315
    return region;
316
    }
317

    
318
///////////////////////////////////////////////////////////////////////////////////////////////////
319

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

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

    
372
    }
373

    
374
///////////////////////////////////////////////////////////////////////////////////////////////////
375

    
376
  public void onStartTrackingTouch(SeekBar bar) { }
377

    
378
///////////////////////////////////////////////////////////////////////////////////////////////////
379

    
380
  public void onStopTrackingTouch(SeekBar bar)  { }
381
  }
(2-2/4)