Project

General

Profile

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

examples / src / main / java / org / distorted / examples / fragment3d / Fragment3DActivity.java @ 950511ed

1 df77c72c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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.app.Activity;
23
import android.opengl.GLSurfaceView;
24
import android.os.Bundle;
25
import android.view.Gravity;
26
import android.view.View;
27
import android.widget.AdapterView;
28
import android.widget.ArrayAdapter;
29
import android.widget.Button;
30
import android.widget.LinearLayout;
31
import android.widget.NumberPicker;
32
import android.widget.Spinner;
33
import android.widget.TableRow;
34
35
import org.distorted.examples.R;
36
import org.distorted.library.Distorted;
37
import org.distorted.library.DistortedBitmap;
38
import org.distorted.library.DistortedCubes;
39
import org.distorted.library.DistortedObject;
40
import org.distorted.library.EffectNames;
41 7e9be46d Leszek Koltunski
import org.distorted.library.EffectTypes;
42
import org.distorted.library.type.Dynamic1D;
43
import org.distorted.library.type.Dynamic3D;
44 75c7def3 Leszek Koltunski
import org.distorted.library.type.Dynamic4D;
45 7e9be46d Leszek Koltunski
46
import java.util.ArrayList;
47 df77c72c Leszek Koltunski
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49
50
public class Fragment3DActivity extends Activity
51 75c7def3 Leszek Koltunski
                                implements View.OnClickListener,
52 df77c72c Leszek Koltunski
                                           AdapterView.OnItemSelectedListener
53
  {
54
  private static final int COLOR_OFF = 0xffffe81f;
55
  private static final int COLOR_ON  = 0xff0000ff;
56
57
  private boolean firstScreen;
58
59 b4a73ea5 Leszek Koltunski
  // fields needed for the first 'pick-a-shape' screen
60
  //
61 df77c72c Leszek Koltunski
  private int mNumCols = 3;
62
  private int mNumRows = 3;
63
  private NumberPicker mColsPicker, mRowsPicker;
64
  private boolean[] mShape;
65
  private DistortedObject mObject;
66
  private int mObjectType;
67
  private int mBitmap;
68
69 7e9be46d Leszek Koltunski
  private ArrayList<Fragment3DEffect> mEffects;
70 65270124 Leszek Koltunski
  private int mEffectAdd;
71 df77c72c Leszek Koltunski
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73
    
74
  @Override
75
  protected void onCreate(Bundle savedState)
76
    {
77
    super.onCreate(savedState);
78
79 7e9be46d Leszek Koltunski
    mEffects = new ArrayList<>();
80
81 df77c72c Leszek Koltunski
    setContentView(R.layout.objectpickerlayout);
82
83
    mColsPicker = (NumberPicker)findViewById(R.id.objectpicker_cols);
84
    mRowsPicker = (NumberPicker)findViewById(R.id.objectpicker_rows);
85
86
    mColsPicker.setMaxValue(10);
87
    mColsPicker.setMinValue( 0);
88
    mRowsPicker.setMaxValue(10);
89
    mRowsPicker.setMinValue( 0);
90
91
    mColsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
92
      {
93
      @Override
94
      public void onValueChange(NumberPicker picker, int oldVal, int newVal)
95
        {
96
        mNumCols = mColsPicker.getValue();
97
        }
98
      });
99
100
    mRowsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
101
      {
102
      @Override
103
      public void onValueChange(NumberPicker picker, int oldVal, int newVal)
104
        {
105
        mNumRows = mRowsPicker.getValue();
106
        }
107
      });
108
109
    firstScreen = true;
110
111
    mObjectType = 0;
112
113
    Spinner typeSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerType);
114
    typeSpinner.setOnItemSelectedListener(this);
115
116
    String[] objectType = new String[] {"DistortedCubes", "DistortedBitmap"};
117
118
    ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
119
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
120
    typeSpinner.setAdapter(adapterType);
121
122
    Spinner bitmapSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerBitmap);
123
    bitmapSpinner.setOnItemSelectedListener(this);
124
125
    String[] objectBitmap = new String[] {"Girl", "Dog", "Cat", "Grid"};
126
127
    ArrayAdapter<String> adapterBitmap = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectBitmap);
128
    adapterBitmap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
129
    bitmapSpinner.setAdapter(adapterBitmap);
130
    }
131
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133
134
  private void setGrid()
135
    {
136 65270124 Leszek Koltunski
    LinearLayout lay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
137 df77c72c Leszek Koltunski
138 65270124 Leszek Koltunski
    int width = lay.getWidth();
139
    int height= lay.getHeight();
140 df77c72c Leszek Koltunski
    int w = mNumCols>0 ? (width / mNumCols) -10 : 0;
141
    int h = mNumRows>0 ? (height/ mNumRows) -10 : 0;
142
    int size= w<h ? w:h;
143
    int pad = size/20;
144
145 65270124 Leszek Koltunski
    lay.removeAllViews();
146 df77c72c Leszek Koltunski
147
    mShape = new boolean[mNumRows*mNumCols];
148
149
    TableRow.LayoutParams p = new android.widget.TableRow.LayoutParams();
150
151
    p.rightMargin  = pad;
152
    p.leftMargin   = pad;
153
    p.topMargin    = pad;
154
    p.bottomMargin = pad;
155
    p.height       = size;
156
    p.width        = size;
157
158
    for (int rows=0; rows<mNumRows; rows++)
159
      {
160
      TableRow tr = new TableRow(this);
161
      tr.setGravity(Gravity.CENTER);
162
163
      for(int cols=0; cols<mNumCols; cols++)
164
        {
165
        Button b = new Button(this);
166
        b.setOnClickListener(this);
167
        b.setId(rows*mNumCols+cols);
168
        b.setLayoutParams(p);
169
        b.setBackgroundColor(COLOR_ON);
170
        tr.addView(b, p);
171
        mShape[rows*mNumCols+cols] = true;
172
        }
173
174 65270124 Leszek Koltunski
      lay.addView(tr);
175 df77c72c Leszek Koltunski
      }
176
    }
177
178
///////////////////////////////////////////////////////////////////////////////////////////////////
179
180
  public DistortedObject getObject()
181
    {
182
    return mObject;
183
    }
184
185
///////////////////////////////////////////////////////////////////////////////////////////////////
186
187 7e9be46d Leszek Koltunski
  public int getBitmap()
188 df77c72c Leszek Koltunski
    {
189 7e9be46d Leszek Koltunski
    return mBitmap;
190 df77c72c Leszek Koltunski
    }
191
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193
194 7e9be46d Leszek Koltunski
  public void onClick(View view)
195 df77c72c Leszek Koltunski
    {
196 7e9be46d Leszek Koltunski
    Button tmp = (Button)view;
197
    int id = tmp.getId();
198
    mShape[id] = !mShape[id];
199
    tmp.setBackgroundColor(mShape[id] ? COLOR_ON:COLOR_OFF);
200 df77c72c Leszek Koltunski
    }
201
202
///////////////////////////////////////////////////////////////////////////////////////////////////
203
204
  public void Continue(View v)
205
    {
206 7e9be46d Leszek Koltunski
    firstScreen = false;
207
208 df77c72c Leszek Koltunski
    if( mObjectType==1 )
209
      {
210
      mObject = new DistortedBitmap(100,100,mNumCols);
211 7e9be46d Leszek Koltunski
      setFragmentView();
212 df77c72c Leszek Koltunski
      }
213
    else
214
      {
215
      View view = getLayoutInflater().inflate(R.layout.objectpicker2layout, null);
216
217
      setContentView(view);
218
219
      view.post(new Runnable() {
220
            @Override
221
            public void run() {
222
              setGrid();
223
            }
224
        });
225
      }
226
    }
227
228
///////////////////////////////////////////////////////////////////////////////////////////////////
229
230
  public void Create(View v)
231
    {
232
    firstScreen = false;
233
234
    String str = "";
235
236
    for(int i=0; i<mNumRows*mNumCols; i++)
237
      str += mShape[i] ? "1" : "0";
238
239
    mObject = new DistortedCubes(mNumCols, str, 10);
240 b4a73ea5 Leszek Koltunski
241 7e9be46d Leszek Koltunski
    setFragmentView();
242 df77c72c Leszek Koltunski
    }
243
244
245
///////////////////////////////////////////////////////////////////////////////////////////////////
246
247
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
248
    {
249
    switch(parent.getId())
250
      {
251 65270124 Leszek Koltunski
      case R.id.objectpicker_spinnerType  : mObjectType = pos;
252
                                            break;
253 df77c72c Leszek Koltunski
      case R.id.objectpicker_spinnerBitmap: switch(pos)
254
                                              {
255
                                              case 0: mBitmap = R.raw.face; break;
256
                                              case 1: mBitmap = R.raw.dog;  break;
257
                                              case 2: mBitmap = R.raw.cat;  break;
258
                                              case 3: mBitmap = R.raw.grid; break;
259
                                              }
260
                                            break;
261 65270124 Leszek Koltunski
      case R.id.fragment3dspinner         : mEffectAdd = pos;
262
                                            break;
263 df77c72c Leszek Koltunski
      }
264
    }
265
266
///////////////////////////////////////////////////////////////////////////////////////////////////
267
268
  public void onNothingSelected(AdapterView<?> parent)
269
    {
270
    }
271
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273
274 65270124 Leszek Koltunski
  public int getWidth()
275 df77c72c Leszek Koltunski
    {
276 65270124 Leszek Koltunski
    return mObject==null ? 0: mObject.getWidth();
277 b4a73ea5 Leszek Koltunski
    }
278
279
///////////////////////////////////////////////////////////////////////////////////////////////////
280
281 65270124 Leszek Koltunski
  public int getHeight()
282 b4a73ea5 Leszek Koltunski
    {
283 65270124 Leszek Koltunski
    return mObject==null ? 0: mObject.getHeight();
284 b4a73ea5 Leszek Koltunski
    }
285
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287 65270124 Leszek Koltunski
// 'second screen' methods
288 b4a73ea5 Leszek Koltunski
289 65270124 Leszek Koltunski
  private void setFragmentView()
290 b4a73ea5 Leszek Koltunski
    {
291 65270124 Leszek Koltunski
    final View view = getLayoutInflater().inflate(R.layout.fragment3dlayout, null);
292 b4a73ea5 Leszek Koltunski
293 65270124 Leszek Koltunski
    setContentView(view);
294 b4a73ea5 Leszek Koltunski
295 3bec5dc2 Leszek Koltunski
    String[] effects = new String[] { "MACROBLOCK",
296
                                      "ALPHA",
297
                                      "SMOOTH_ALPHA",
298
                                      "CHROMA",
299
                                      "SMOOTH_CHROMA",
300
                                      "BRIGHTNESS",
301
                                      "SMOOTH_BRIGHTNESS",
302
                                      "SATURATION",
303
                                      "SMOOTH_SATURATION",
304
                                      "CONTRAST",
305
                                      "SMOOTH_CONTRAST" };
306 df77c72c Leszek Koltunski
307 65270124 Leszek Koltunski
    Spinner effectSpinner = (Spinner)findViewById(R.id.fragment3dspinner );
308
    effectSpinner.setOnItemSelectedListener(this);
309 df77c72c Leszek Koltunski
310 65270124 Leszek Koltunski
    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, effects);
311
    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
312
    effectSpinner.setAdapter(adapterEffect);
313 b4a73ea5 Leszek Koltunski
314 65270124 Leszek Koltunski
    mEffectAdd = 0;
315 df77c72c Leszek Koltunski
    }
316
317
///////////////////////////////////////////////////////////////////////////////////////////////////
318
319 65270124 Leszek Koltunski
  public void newEffect(View v)
320 df77c72c Leszek Koltunski
    {
321 65270124 Leszek Koltunski
    EffectNames name;
322
323
    switch(mEffectAdd)
324
      {
325 3bec5dc2 Leszek Koltunski
      case 0 : name = EffectNames.MACROBLOCK       ; break;
326
      case 1 : name = EffectNames.ALPHA            ; break;
327
      case 2 : name = EffectNames.SMOOTH_ALPHA     ; break;
328
      case 3 : name = EffectNames.CHROMA           ; break;
329
      case 4 : name = EffectNames.SMOOTH_CHROMA    ; break;
330
      case 5 : name = EffectNames.BRIGHTNESS       ; break;
331
      case 6 : name = EffectNames.SMOOTH_BRIGHTNESS; break;
332
      case 7 : name = EffectNames.SATURATION       ; break;
333
      case 8 : name = EffectNames.SMOOTH_SATURATION; break;
334
      case 9 : name = EffectNames.CONTRAST         ; break;
335
      case 10: name = EffectNames.SMOOTH_CONTRAST  ; break;
336 65270124 Leszek Koltunski
      default: return;
337
      }
338
339
    Fragment3DEffect eff = new Fragment3DEffect(name, this);
340
    mEffects.add(eff);
341 df77c72c Leszek Koltunski
342 7e9be46d Leszek Koltunski
    LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
343 65270124 Leszek Koltunski
    View view = eff.createView();
344 56e4be07 Leszek Koltunski
    layout.addView(view);
345 65270124 Leszek Koltunski
    View region = eff.createRegion();
346 75c7def3 Leszek Koltunski
    layout.addView(region);
347 b4a73ea5 Leszek Koltunski
348 65270124 Leszek Koltunski
    Dynamic1D dyn1 = eff.getDyn1();
349
    Dynamic3D dyn3 = eff.getDyn3();
350
    Dynamic4D regi = eff.getRegion();
351 b4a73ea5 Leszek Koltunski
352 65270124 Leszek Koltunski
    switch(mEffectAdd)
353
      {
354 3bec5dc2 Leszek Koltunski
      case 0: mObject.macroblock(dyn1,       regi       ); break;
355 65270124 Leszek Koltunski
      case 1: mObject.alpha     (dyn1,       regi, false); break;
356 3bec5dc2 Leszek Koltunski
      case 2: mObject.alpha     (dyn1,       regi, true ); break;
357
      case 3: mObject.chroma    (dyn1, dyn3, regi, false); break;
358
      case 4: mObject.chroma    (dyn1, dyn3, regi, true ); break;
359
      case 5: mObject.brightness(dyn1,       regi, false); break;
360
      case 6: mObject.brightness(dyn1,       regi, true ); break;
361
      case 7: mObject.saturation(dyn1,       regi, false); break;
362
      case 8: mObject.saturation(dyn1,       regi, true ); break;
363
      case 9: mObject.contrast  (dyn1,       regi, false); break;
364
      case 10:mObject.contrast  (dyn1,       regi, true ); break;
365
366 65270124 Leszek Koltunski
      }
367 df77c72c Leszek Koltunski
    }
368
369
///////////////////////////////////////////////////////////////////////////////////////////////////
370
371 7e9be46d Leszek Koltunski
  public void removeAll(View v)
372 df77c72c Leszek Koltunski
    {
373 7e9be46d Leszek Koltunski
    mEffects.clear();
374
    LinearLayout layout = (LinearLayout)findViewById(R.id.fragment3dlayout);
375
    layout.removeAllViews();
376
    mObject.abortEffects(EffectTypes.FRAGMENT);
377 950511ed Leszek Koltunski
378
    Fragment3DSurfaceView view = (Fragment3DSurfaceView)findViewById(R.id.fragment3dSurfaceView);
379
    Fragment3DRenderer renderer= view.getRenderer();
380
381
    renderer.mQuat1.set(0,0,0,1);
382
    renderer.mQuat2.set(0,0,0,1);
383 df77c72c Leszek Koltunski
    }
384
385
///////////////////////////////////////////////////////////////////////////////////////////////////
386
// Overrides
387
388
  @Override
389
  protected void onPause()
390
    {
391
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.fragment3dSurfaceView);
392
    if( mView!=null ) mView.onPause();
393
    super.onPause();
394
    }
395
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397
    
398
  @Override
399
  protected void onResume()
400
    {
401
    super.onResume();
402
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.fragment3dSurfaceView);
403
    if( mView!=null ) mView.onResume();
404
    }
405
406
///////////////////////////////////////////////////////////////////////////////////////////////////
407
    
408
  @Override
409
  public void onWindowFocusChanged(boolean hasFocus)
410
    {
411
    super.onWindowFocusChanged(hasFocus);
412
413
    if( firstScreen )
414
      {
415
      mColsPicker.setValue(mNumCols);
416
      mRowsPicker.setValue(mNumRows);
417
      }
418
    }
419
420
///////////////////////////////////////////////////////////////////////////////////////////////////
421
    
422
  @Override
423
  protected void onDestroy()
424
    {
425
    Distorted.onDestroy();
426
    super.onDestroy();
427
    }
428 b4a73ea5 Leszek Koltunski
429 df77c72c Leszek Koltunski
  }