Project

General

Profile

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

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

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.vertex3d;
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
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

    
49
///////////////////////////////////////////////////////////////////////////////////////////////////
50

    
51
public class Vertex3DActivity extends Activity
52
                              implements View.OnClickListener,
53
                                         AdapterView.OnItemSelectedListener
54
  {
55
  private static final int COLOR_OFF = 0xffffe81f;
56
  private static final int COLOR_ON  = 0xff0000ff;
57

    
58
  private boolean firstScreen;
59

    
60
  // fields needed for the first 'pick-a-shape' screen
61
  //
62
  private int mNumCols = 10;
63
  private int mNumRows = 10;
64
  private NumberPicker mColsPicker, mRowsPicker;
65
  private boolean[] mShape;
66
  private DistortedObject mObject;
67
  private int mObjectType;
68
  private int mBitmap;
69

    
70
  private ArrayList<Vertex3DEffect> mEffects;
71
  private int mEffectAdd;
72
  private float mCenterX, mCenterY;
73

    
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75

    
76
  @Override
77
  protected void onCreate(Bundle savedState)
78
    {
79
    super.onCreate(savedState);
80

    
81
    mEffects = new ArrayList<>();
82

    
83
    setContentView(R.layout.objectpickerlayout);
84

    
85
    mColsPicker = (NumberPicker)findViewById(R.id.objectpicker_cols);
86
    mRowsPicker = (NumberPicker)findViewById(R.id.objectpicker_rows);
87

    
88
    mColsPicker.setMaxValue(15);
89
    mColsPicker.setMinValue( 0);
90
    mRowsPicker.setMaxValue(15);
91
    mRowsPicker.setMinValue( 0);
92

    
93
    mColsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
94
      {
95
      @Override
96
      public void onValueChange(NumberPicker picker, int oldVal, int newVal)
97
        {
98
        mNumCols = mColsPicker.getValue();
99
        }
100
      });
101

    
102
    mRowsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
103
      {
104
      @Override
105
      public void onValueChange(NumberPicker picker, int oldVal, int newVal)
106
        {
107
        mNumRows = mRowsPicker.getValue();
108
        }
109
      });
110

    
111
    firstScreen = true;
112

    
113
    mObjectType = 0;
114

    
115
    Spinner typeSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerType);
116
    typeSpinner.setOnItemSelectedListener(this);
117

    
118
    String[] objectType = new String[] {"DistortedCubes", "DistortedBitmap"};
119

    
120
    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
    }
133

    
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135

    
136
  private void setGrid()
137
    {
138
    LinearLayout lay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
139

    
140
    int width = lay.getWidth();
141
    int height= lay.getHeight();
142
    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
    lay.removeAllViews();
148

    
149
    mShape = new boolean[mNumRows*mNumCols];
150

    
151
    TableRow.LayoutParams p = new TableRow.LayoutParams();
152

    
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
      {
162
      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
        b.setBackgroundColor(COLOR_ON);
172
        tr.addView(b, p);
173
        mShape[rows*mNumCols+cols] = true;
174
        }
175

    
176
      lay.addView(tr);
177
      }
178
    }
179

    
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181

    
182
  public DistortedObject getObject()
183
    {
184
    return mObject;
185
    }
186

    
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188

    
189
  public int getBitmap()
190
    {
191
    return mBitmap;
192
    }
193

    
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195

    
196
  public void onClick(View view)
197
    {
198
    Button tmp = (Button)view;
199
    int id = tmp.getId();
200
    mShape[id] = !mShape[id];
201
    tmp.setBackgroundColor(mShape[id] ? COLOR_ON:COLOR_OFF);
202
    }
203

    
204
///////////////////////////////////////////////////////////////////////////////////////////////////
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
///////////////////////////////////////////////////////////////////////////////////////////////////
231

    
232
  public void Continue(View v)
233
    {
234
    firstScreen = false;
235

    
236
    if( mObjectType==1 )
237
      {
238
      mObject = new DistortedBitmap(100,100,mNumCols);
239
      setVertexView();
240
      }
241
    else
242
      {
243
      View view = getLayoutInflater().inflate(R.layout.objectpicker2layout, null);
244

    
245
      setContentView(view);
246

    
247
      view.post(new Runnable() {
248
            @Override
249
            public void run() {
250
              setGrid();
251
            }
252
        });
253
      }
254
    }
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

    
269
    setVertexView();
270
    }
271

    
272

    
273
///////////////////////////////////////////////////////////////////////////////////////////////////
274

    
275
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
276
    {
277
    switch(parent.getId())
278
      {
279
      case R.id.objectpicker_spinnerType  : mObjectType = pos;
280
                                            break;
281
      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
      case R.id.vertex3dspinner           : mEffectAdd = pos;
290
                                            break;
291
      }
292
    }
293

    
294
///////////////////////////////////////////////////////////////////////////////////////////////////
295

    
296
  public void onNothingSelected(AdapterView<?> parent)
297
    {
298
    }
299

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301

    
302
  public int getWidth()
303
    {
304
    return mObject==null ? 0: mObject.getWidth();
305
    }
306

    
307
///////////////////////////////////////////////////////////////////////////////////////////////////
308

    
309
  public int getHeight()
310
    {
311
    return mObject==null ? 0: mObject.getHeight();
312
    }
313

    
314
///////////////////////////////////////////////////////////////////////////////////////////////////
315
// 'second screen' methods
316

    
317
  private void setVertexView()
318
    {
319
    mCenterX = 0.5f*getWidth();
320
    mCenterY = 0.5f*getHeight();
321

    
322
    final View view = getLayoutInflater().inflate(R.layout.vertex3dlayout, null);
323

    
324
    setContentView(view);
325

    
326
    String[] effects = new String[] { "DISTORT",
327
                                      "DEFORM",
328
                                      "SINK",
329
                                      "SWIRL" };
330

    
331
    Spinner effectSpinner = (Spinner)findViewById(R.id.vertex3dspinner );
332
    effectSpinner.setOnItemSelectedListener(this);
333

    
334
    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

    
338
    mEffectAdd = 0;
339
    }
340

    
341
///////////////////////////////////////////////////////////////////////////////////////////////////
342

    
343
  public void newEffect(View v)
344
    {
345
    EffectNames name;
346

    
347
    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

    
356
    Vertex3DEffect eff = new Vertex3DEffect(name, this);
357
    mEffects.add(eff);
358

    
359
    LinearLayout layout = (LinearLayout)findViewById(R.id.vertex3dlayout);
360
    View view = eff.createView();
361
    layout.addView(view);
362

    
363
    if( mEffectAdd!=1 ) // deform does not support regions
364
      {
365
      View region = eff.createRegion();
366
      layout.addView(region);
367
      }
368

    
369
    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
    }
385

    
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387

    
388
  public void removeAll(View v)
389
    {
390
    mEffects.clear();
391
    LinearLayout layout = (LinearLayout)findViewById(R.id.vertex3dlayout);
392
    layout.removeAllViews();
393
    mObject.abortEffects(EffectTypes.VERTEX);
394

    
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
    }
405

    
406
///////////////////////////////////////////////////////////////////////////////////////////////////
407
// 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

    
417
///////////////////////////////////////////////////////////////////////////////////////////////////
418
    
419
  @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

    
427
///////////////////////////////////////////////////////////////////////////////////////////////////
428
    
429
  @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

    
441
///////////////////////////////////////////////////////////////////////////////////////////////////
442
    
443
  @Override
444
  protected void onDestroy()
445
    {
446
    Distorted.onDestroy();
447
    super.onDestroy();
448
    }
449

    
450
  }
(1-1/4)