Project

General

Profile

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

examples / src / main / java / org / distorted / examples / vertex3d / Vertex3DActivity.java @ bcc8e016

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.SeekBar;
33
import android.widget.SeekBar.OnSeekBarChangeListener;
34
import android.widget.Spinner;
35
import android.widget.TableRow;
36
import android.widget.TextView;
37

    
38
import org.distorted.examples.R;
39
import org.distorted.library.Distorted;
40
import org.distorted.library.DistortedBitmap;
41
import org.distorted.library.DistortedCubes;
42
import org.distorted.library.DistortedObject;
43
import org.distorted.library.EffectNames;
44

    
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46

    
47
public class Vertex3DActivity extends Activity
48
                              implements OnSeekBarChangeListener,
49
                                         View.OnClickListener,
50
                                         AdapterView.OnItemSelectedListener
51
  {
52
  private static final int COLOR_OFF = 0xffffe81f;
53
  private static final int COLOR_ON  = 0xff0000ff;
54

    
55
  private boolean firstScreen;
56

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

    
68
  // fields needed for the second 'apply vertex effects' screen
69
  //
70
  private SeekBar bar;
71
  private TextView textDeform, textDistort, textSink, textSwirl, textCenter;
72
  private int deformX, deformY, deformZ;
73
  private int distortX, distortY, distortZ;
74
  private int sinkA;
75
  private int swirlA;
76
  private int centerX, centerY;
77

    
78
  private float fdeformX, fdeformY, fdeformZ;
79
  private float fdistortX, fdistortY, fdistortZ;
80
  private float fsinkA;
81
  private float fswirlA;
82
  private float fcenterX, fcenterY;
83
  private EffectNames[] effects = new EffectNames[4];
84

    
85

    
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87
    
88
  @Override
89
  protected void onCreate(Bundle savedState)
90
    {
91
    super.onCreate(savedState);
92

    
93
    setContentView(R.layout.objectpickerlayout);
94

    
95
    mColsPicker = (NumberPicker)findViewById(R.id.objectpicker_cols);
96
    mRowsPicker = (NumberPicker)findViewById(R.id.objectpicker_rows);
97

    
98
    mColsPicker.setMaxValue(10);
99
    mColsPicker.setMinValue( 0);
100
    mRowsPicker.setMaxValue(10);
101
    mRowsPicker.setMinValue( 0);
102

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

    
112
    mRowsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
113
      {
114
      @Override
115
      public void onValueChange(NumberPicker picker, int oldVal, int newVal)
116
        {
117
        mNumRows = mRowsPicker.getValue();
118
        }
119
      });
120

    
121
    firstScreen = true;
122

    
123
    mObjectType = 0;
124

    
125
    Spinner typeSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerType);
126
    typeSpinner.setOnItemSelectedListener(this);
127

    
128
    String[] objectType = new String[] {"DistortedCubes", "DistortedBitmap"};
129

    
130
    ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
131
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
132
    typeSpinner.setAdapter(adapterType);
133

    
134
    Spinner bitmapSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerBitmap);
135
    bitmapSpinner.setOnItemSelectedListener(this);
136

    
137
    String[] objectBitmap = new String[] {"Girl", "Dog", "Cat", "Grid"};
138

    
139
    ArrayAdapter<String> adapterBitmap = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectBitmap);
140
    adapterBitmap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
141
    bitmapSpinner.setAdapter(adapterBitmap);
142
    }
143

    
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145

    
146
  private void setGrid()
147
    {
148
    mLay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
149

    
150
    int width = mLay.getWidth();
151
    int height= mLay.getHeight();
152
    int w = mNumCols>0 ? (width / mNumCols) -10 : 0;
153
    int h = mNumRows>0 ? (height/ mNumRows) -10 : 0;
154
    int size= w<h ? w:h;
155
    int pad = size/20;
156

    
157
    mLay.removeAllViews();
158

    
159
    mShape = new boolean[mNumRows*mNumCols];
160

    
161
    TableRow.LayoutParams p = new android.widget.TableRow.LayoutParams();
162

    
163
    p.rightMargin  = pad;
164
    p.leftMargin   = pad;
165
    p.topMargin    = pad;
166
    p.bottomMargin = pad;
167
    p.height       = size;
168
    p.width        = size;
169

    
170
    for (int rows=0; rows<mNumRows; rows++)
171
      {
172
      TableRow tr = new TableRow(this);
173
      tr.setGravity(Gravity.CENTER);
174

    
175
      for(int cols=0; cols<mNumCols; cols++)
176
        {
177
        Button b = new Button(this);
178
        b.setOnClickListener(this);
179
        b.setId(rows*mNumCols+cols);
180
        b.setLayoutParams(p);
181
        b.setBackgroundColor(COLOR_ON);
182
        tr.addView(b, p);
183
        mShape[rows*mNumCols+cols] = true;
184
        }
185

    
186
      mLay.addView(tr);
187
      }
188
    }
189

    
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

    
192
  public DistortedObject getObject()
193
    {
194
    return mObject;
195
    }
196

    
197
///////////////////////////////////////////////////////////////////////////////////////////////////
198

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

    
207
///////////////////////////////////////////////////////////////////////////////////////////////////
208

    
209
  public int getBitmap()
210
    {
211
    return mBitmap;
212
    }
213

    
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215

    
216
  public void Continue(View v)
217
    {
218
    if( mObjectType==1 )
219
      {
220
      firstScreen = false;
221
      mObject = new DistortedBitmap(100,100,mNumCols);
222
      setContentView(R.layout.vertex3dlayout);
223
      Default(null);
224
      }
225
    else
226
      {
227
      View view = getLayoutInflater().inflate(R.layout.objectpicker2layout, null);
228

    
229
      setContentView(view);
230

    
231
      view.post(new Runnable() {
232
            @Override
233
            public void run() {
234
              setGrid();
235
            }
236
        });
237
      }
238
    }
239

    
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241

    
242
  public void Create(View v)
243
    {
244
    firstScreen = false;
245

    
246
    String str = "";
247

    
248
    for(int i=0; i<mNumRows*mNumCols; i++)
249
      str += mShape[i] ? "1" : "0";
250

    
251
    mObject = new DistortedCubes(mNumCols, str, 10);
252

    
253
    setContentView(R.layout.vertex3dlayout);
254
    Default(null);
255
    }
256

    
257

    
258
///////////////////////////////////////////////////////////////////////////////////////////////////
259

    
260
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
261
    {
262
    switch(parent.getId())
263
      {
264
      case R.id.objectpicker_spinnerType  : mObjectType = pos; break;
265
      case R.id.objectpicker_spinnerBitmap: switch(pos)
266
                                              {
267
                                              case 0: mBitmap = R.raw.face; break;
268
                                              case 1: mBitmap = R.raw.dog;  break;
269
                                              case 2: mBitmap = R.raw.cat;  break;
270
                                              case 3: mBitmap = R.raw.grid; break;
271
                                              }
272
                                            break;
273
      }
274
    }
275

    
276
///////////////////////////////////////////////////////////////////////////////////////////////////
277

    
278
  public void onNothingSelected(AdapterView<?> parent)
279
    {
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283
// 'second screen' methods
284

    
285
  public void Default(View view)
286
    {
287
    effects[0] = EffectNames.DEFORM;
288
    effects[1] = EffectNames.DISTORT;
289
    effects[2] = EffectNames.SINK;
290
    effects[3] = EffectNames.SWIRL;
291
    
292
    deformX = 50;
293
    deformY = 50;
294
    deformZ = 50;
295

    
296
    distortX = 50;
297
    distortY = 50;
298
    distortZ = 50;
299

    
300
    sinkA =  50;
301
    swirlA = 50;
302

    
303
    centerX = 50;
304
    centerY = 50;
305

    
306
    textCenter = (TextView)findViewById(R.id.vertex3dcenterText);
307
    computeCenter();
308
    setCenterText();
309

    
310
    setBar(R.id.vertex3dcenterX, centerX);
311
    setBar(R.id.vertex3dcenterY, centerY);
312

    
313
    addViews();
314
    }
315
    
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317
    
318
  private void addViews()
319
    {
320
    LinearLayout layout = (LinearLayout)findViewById(R.id.vertex3dlayout);
321
    
322
    layout.removeAllViews();
323
      
324
    View deform = getLayoutInflater().inflate(R.layout.vertex3ddeform , null);
325
    View distort= getLayoutInflater().inflate(R.layout.vertex3ddistort, null);
326
    View sink   = getLayoutInflater().inflate(R.layout.vertex3dsink   , null);
327
    View swirl  = getLayoutInflater().inflate(R.layout.vertex3dswirl  , null);
328
     
329
    for( int i=effects.length-1 ; i>=0 ; i-- )
330
      {
331
      switch(effects[i])
332
        {
333
        case DEFORM : layout.addView(deform , 0); break;
334
        case DISTORT: layout.addView(distort, 0); break;
335
        case SINK   : layout.addView(sink   , 0); break;
336
        case SWIRL  : layout.addView(swirl  , 0); break;
337
        }
338
      }
339
      
340
    textDeform = (TextView)findViewById(R.id.vertex3ddeformText);
341
    textDistort= (TextView)findViewById(R.id.vertex3ddistortText);
342
    textSink   = (TextView)findViewById(R.id.vertex3dsinkText);
343
    textSwirl  = (TextView)findViewById(R.id.vertex3dswirlText);
344
     
345
    setDeformText();
346
    setDistortText();
347
    setSinkText();
348
    setSwirlText();
349
      
350
    setBar(R.id.vertex3ddeformBar1, deformX);
351
    setBar(R.id.vertex3ddeformBar2, deformY);
352
    setBar(R.id.vertex3ddeformBar3, deformZ);
353

    
354
    setBar(R.id.vertex3ddistortBar1, distortX);
355
    setBar(R.id.vertex3ddistortBar2, distortY);
356
    setBar(R.id.vertex3ddistortBar3, distortZ);
357
      
358
    setBar(R.id.vertex3dsinkBar1, sinkA);
359

    
360
    setBar(R.id.vertex3dswirlBar1, swirlA);
361

    
362
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
363
    view.getRenderer().setOrder(effects);
364
    }
365

    
366
///////////////////////////////////////////////////////////////////////////////////////////////////
367

    
368
  private void moveUp(EffectNames name)
369
    {
370
    int len = effects.length-1;
371
    int index = -1;
372

    
373
    for(int i=0; i<=len; i++)
374
      {
375
      if( effects[i]==name )
376
        {
377
        index=i;
378
        break;
379
        }
380
      }
381

    
382
    if( index==0 )
383
      {
384
      for(int i=0; i<len; i++)
385
        effects[i] = effects[i+1];
386

    
387
      effects[len] = name;
388
      }
389
    else if( index>0 )
390
      {
391
      effects[index]   = effects[index-1];
392
      effects[index-1] = name;
393
      }
394

    
395
    addViews();
396
    }
397

    
398
///////////////////////////////////////////////////////////////////////////////////////////////////
399

    
400
  public void ButtonDeform(View v)
401
    {
402
    moveUp(EffectNames.DEFORM);
403
    }
404

    
405
///////////////////////////////////////////////////////////////////////////////////////////////////
406

    
407
  public void ButtonDistort(View v)
408
    {
409
    moveUp(EffectNames.DISTORT);
410
    }
411

    
412
///////////////////////////////////////////////////////////////////////////////////////////////////
413

    
414
  public void ButtonSink(View v)
415
    {
416
    moveUp(EffectNames.SINK);
417
    }
418

    
419
///////////////////////////////////////////////////////////////////////////////////////////////////
420

    
421
  public void ButtonSwirl(View v)
422
    {
423
    moveUp(EffectNames.SWIRL);
424
    }
425

    
426
///////////////////////////////////////////////////////////////////////////////////////////////////
427

    
428
  private void setBar(int id, int value)
429
    {
430
    bar = (SeekBar)findViewById(id);
431
    bar.setOnSeekBarChangeListener(this);
432
    bar.setProgress(value);
433
    }
434

    
435
///////////////////////////////////////////////////////////////////////////////////////////////////
436

    
437
  private void computeDeform()
438
    {
439
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
440
    Vertex3DRenderer renderer = view.getRenderer();
441

    
442
    fdeformX = (deformX-50)*renderer.mScreenMin/200.0f;
443
    fdeformY = (deformY-50)*renderer.mScreenMin/200.0f;
444
    fdeformZ = (deformZ-50)*renderer.mScreenMin/200.0f;
445

    
446
    renderer.setDeform( fdeformX, fdeformY, fdeformZ );
447
    }
448

    
449
///////////////////////////////////////////////////////////////////////////////////////////////////
450

    
451
  private void setDeformText()
452
    {
453
    fdeformX = ((int)(100*fdeformX))/100.0f;
454
    fdeformY = ((int)(100*fdeformY))/100.0f;
455
    fdeformZ = ((int)(100*fdeformZ))/100.0f;
456

    
457
    textDeform.setText("deform("+fdeformX+" , "+fdeformY+" , "+fdeformZ+")");
458
    }
459

    
460
///////////////////////////////////////////////////////////////////////////////////////////////////
461

    
462
  private void computeDistort()
463
    {
464
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
465
    Vertex3DRenderer renderer = view.getRenderer();
466

    
467
    fdistortX = (distortX-50)*renderer.mScreenMin/200.0f;
468
    fdistortY = (distortY-50)*renderer.mScreenMin/200.0f;
469
    fdistortZ = (distortZ-50)*renderer.mScreenMin/200.0f;
470

    
471
    renderer.setDistort(fdistortX, fdistortY, fdistortZ);
472
    }
473

    
474
///////////////////////////////////////////////////////////////////////////////////////////////////
475

    
476
  private void setDistortText()
477
    {
478
    fdistortX = ((int)(100*fdistortX))/100.0f;
479
    fdistortY = ((int)(100*fdistortY))/100.0f;
480
    fdistortZ = ((int)(100*fdistortZ))/100.0f;
481

    
482
    textDistort.setText("distort("+fdistortX+" , "+fdistortY+" , "+fdistortZ+")");
483
    }
484

    
485
///////////////////////////////////////////////////////////////////////////////////////////////////
486

    
487
  private void computeSink()
488
    {
489
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
490

    
491
    fsinkA = (sinkA>= 50 ? 0.18f*sinkA-8.0f : 0.018f*sinkA + 0.1f);
492

    
493
    view.getRenderer().setSink( fsinkA );
494
    }
495

    
496
///////////////////////////////////////////////////////////////////////////////////////////////////
497

    
498
  private void setSinkText()
499
    {
500
    fsinkA = ((int)(100*fsinkA))/100.0f;
501

    
502
    textSink.setText("sink("+fsinkA+")");
503
    }
504

    
505
///////////////////////////////////////////////////////////////////////////////////////////////////
506

    
507
  private void computeSwirl()
508
    {
509
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
510

    
511
    fswirlA = (swirlA-50)*3.6f;
512

    
513
    view.getRenderer().setSwirl( fswirlA );
514
    }
515
    
516
///////////////////////////////////////////////////////////////////////////////////////////////////
517

    
518
  private void setSwirlText()
519
    {
520
    fswirlA = ((int)(100*fswirlA))/100.0f;
521

    
522
    textSwirl.setText("swirl("+fswirlA+")");
523
    }
524

    
525
///////////////////////////////////////////////////////////////////////////////////////////////////
526

    
527
  private void computeCenter()
528
    {
529
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
530

    
531
    fcenterX = centerX;
532
    fcenterY = centerY;
533

    
534
    view.getRenderer().setCenter( fcenterX, fcenterY );
535
    }
536

    
537
///////////////////////////////////////////////////////////////////////////////////////////////////
538

    
539
  private void setCenterText()
540
    {
541
    fcenterX = ((int)(100*fcenterX))/100.0f;
542
    fcenterY = ((int)(100*fcenterY))/100.0f;
543

    
544
    textCenter.setText("center("+fcenterX+","+fcenterY+")");
545
    }
546

    
547
///////////////////////////////////////////////////////////////////////////////////////////////////
548

    
549
  public float getCenterX()
550
    {
551
    return fcenterX;
552
    }
553

    
554
///////////////////////////////////////////////////////////////////////////////////////////////////
555

    
556
  public float getCenterY()
557
    {
558
    return fcenterY;
559
    }
560

    
561
///////////////////////////////////////////////////////////////////////////////////////////////////
562
// Overrides
563

    
564
  @Override
565
  protected void onPause()
566
    {
567
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.vertex3dSurfaceView);
568
    if( mView!=null ) mView.onPause();
569
    super.onPause();
570
    }
571

    
572
///////////////////////////////////////////////////////////////////////////////////////////////////
573
    
574
  @Override
575
  protected void onResume()
576
    {
577
    super.onResume();
578
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.vertex3dSurfaceView);
579
    if( mView!=null ) mView.onResume();
580
    }
581

    
582
///////////////////////////////////////////////////////////////////////////////////////////////////
583
    
584
  @Override
585
  public void onWindowFocusChanged(boolean hasFocus)
586
    {
587
    super.onWindowFocusChanged(hasFocus);
588

    
589
    if( firstScreen )
590
      {
591
      mColsPicker.setValue(mNumCols);
592
      mRowsPicker.setValue(mNumRows);
593
      }
594
    }
595

    
596
///////////////////////////////////////////////////////////////////////////////////////////////////
597
    
598
  @Override
599
  protected void onDestroy()
600
    {
601
    Distorted.onDestroy();
602
    super.onDestroy();
603
    }
604
    
605
///////////////////////////////////////////////////////////////////////////////////////////////////
606
    
607
  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
608
    {
609
    switch (bar.getId())
610
      {
611
      case R.id.vertex3dcenterX     : centerX = progress; computeCenter() ; setCenterText()  ; break;
612
      case R.id.vertex3dcenterY     : centerY = progress; computeCenter() ; setCenterText()  ; break;
613
      case R.id.vertex3ddeformBar1  : deformX = progress; computeDeform() ; setDeformText()  ; break;
614
      case R.id.vertex3ddeformBar2  : deformY = progress; computeDeform() ; setDeformText()  ; break;
615
      case R.id.vertex3ddeformBar3  : deformZ = progress; computeDeform() ; setDeformText()  ; break;
616
      case R.id.vertex3ddistortBar1 : distortX= progress; computeDistort(); setDistortText() ; break;
617
      case R.id.vertex3ddistortBar2 : distortY= progress; computeDistort(); setDistortText() ; break;
618
      case R.id.vertex3ddistortBar3 : distortZ= progress; computeDistort(); setDistortText() ; break;
619
      case R.id.vertex3dsinkBar1    : sinkA   = progress; computeSink()   ; setSinkText()    ; break;
620
      case R.id.vertex3dswirlBar1   : swirlA  = progress; computeSwirl()  ; setSwirlText()   ; break;
621
      }
622
    }
623

    
624
///////////////////////////////////////////////////////////////////////////////////////////////////
625

    
626
  public void onStartTrackingTouch(SeekBar bar) { }
627
    
628
///////////////////////////////////////////////////////////////////////////////////////////////////
629

    
630
  public void onStopTrackingTouch(SeekBar bar)  { }
631
  }
(1-1/3)