Project

General

Profile

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

examples / src / main / java / org / distorted / examples / vertex3d / Vertex3DActivity.java @ 6f779cd4

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