Project

General

Profile

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

examples / src / main / java / org / distorted / examples / vertex3d / Vertex3DActivity.java @ 950511ed

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