Project

General

Profile

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

examples / src / main / java / org / distorted / examples / vertex3d / Vertex3DActivity.java @ 50ac40a6

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

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

    
75
  private float fdeformX, fdeformY, fdeformZ;
76
  private float fdistortX, fdistortY, fdistortZ;
77
  private float fsinkA;
78
  private float fswirlA;
79
  private float fcenterX, fcenterY;
80

    
81
  private DistortedObject mObject;
82

    
83
  private EffectNames[] effects = new EffectNames[4];
84
  private int mObjectType;
85

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

    
93
    setContentView(R.layout.objectpickerlayout);
94

    
95
    mLay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
96

    
97
    mColsPicker = (NumberPicker)findViewById(R.id.objectpicker_cols);
98
    mRowsPicker = (NumberPicker)findViewById(R.id.objectpicker_rows);
99

    
100
    mColsPicker.setMaxValue(10);
101
    mColsPicker.setMinValue( 0);
102
    mRowsPicker.setMaxValue(10);
103
    mRowsPicker.setMinValue( 0);
104

    
105
    mColsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
106
      {
107
      @Override
108
      public void onValueChange(NumberPicker picker, int oldVal, int newVal)
109
        {
110
        setGrid();
111
        }
112
      });
113

    
114
    mRowsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
115
      {
116
      @Override
117
      public void onValueChange(NumberPicker picker, int oldVal, int newVal)
118
        {
119
        setGrid();
120
        }
121
      });
122

    
123
    firstScreen = true;
124

    
125
    mObjectType = 0;
126

    
127
    Spinner typeSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerType);
128
    typeSpinner.setOnItemSelectedListener(this);
129

    
130
    String[] objectType = new String[] {"DistortedCubes", "DistortedBitmap"};
131

    
132
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
133
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
134
    typeSpinner.setAdapter(adapter);
135
    }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138

    
139
  private void setGrid()
140
    {
141
    mNumCols = mColsPicker.getValue();
142
    mNumRows = mRowsPicker.getValue();
143

    
144
    int width = mLay.getWidth();
145
    int height= mLay.getHeight();
146
    int w = mNumCols>0 ? (width / mNumCols) -10 : 0;
147
    int h = mNumRows>0 ? (height/ mNumRows) -10 : 0;
148
    int size= w<h ? w:h;
149
    int pad = size/20;
150

    
151
    mLay.removeAllViews();
152

    
153
    mShape = new boolean[mNumRows*mNumCols];
154

    
155
    TableRow.LayoutParams p = new android.widget.TableRow.LayoutParams();
156

    
157
    p.rightMargin  = pad;
158
    p.leftMargin   = pad;
159
    p.topMargin    = pad;
160
    p.bottomMargin = pad;
161
    p.height       = size;
162
    p.width        = size;
163

    
164
    for (int rows=0; rows<mNumRows; rows++)
165
      {
166
      TableRow tr = new TableRow(this);
167
      tr.setGravity(Gravity.CENTER);
168

    
169
      for(int cols=0; cols<mNumCols; cols++)
170
        {
171
        Button b = new Button(this);
172
        b.setOnClickListener(this);
173
        b.setId(rows*mNumCols+cols);
174
        b.setLayoutParams(p);
175
        b.setBackgroundColor(COLOR_OFF);
176
        tr.addView(b, p);
177
        mShape[rows*mNumCols+cols] = false;
178
        }
179

    
180
      mLay.addView(tr);
181
      }
182
    }
183

    
184
///////////////////////////////////////////////////////////////////////////////////////////////////
185

    
186
  public DistortedObject getObject()
187
    {
188
    return mObject;
189
    }
190

    
191
///////////////////////////////////////////////////////////////////////////////////////////////////
192

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

    
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202

    
203
  public void Create(View v)
204
    {
205
    firstScreen = false;
206

    
207
    if( mObjectType==1 )
208
      {
209
      mObject = new DistortedBitmap(100,100,mNumCols);
210
      }
211
    else
212
      {
213
      String str = "";
214

    
215
      for(int i=0; i<mNumRows*mNumCols; i++)
216
        str += mShape[i] ? "1" : "0";
217

    
218
      mObject = new DistortedCubes(mNumCols, str, 10);
219
      }
220

    
221
    setContentView(R.layout.vertex3dlayout);
222
    Default(null);
223
    }
224

    
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

    
228
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
229
    {
230
    switch(parent.getId())
231
      {
232
      case R.id.objectpicker_spinnerType: mObjectType = pos; break;
233
      }
234
    }
235

    
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237

    
238
  public void onNothingSelected(AdapterView<?> parent)
239
    {
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243
// 'second screen' methods
244

    
245
  public void Default(View view)
246
    {
247
    effects[0] = EffectNames.DEFORM;
248
    effects[1] = EffectNames.DISTORT;
249
    effects[2] = EffectNames.SINK;
250
    effects[3] = EffectNames.SWIRL;
251
    
252
    deformX = 50;
253
    deformY = 50;
254
    deformZ = 50;
255

    
256
    distortX = 50;
257
    distortY = 50;
258
    distortZ = 50;
259

    
260
    sinkA =  50;
261
    swirlA = 50;
262

    
263
    centerX = 50;
264
    centerY = 50;
265

    
266
    textCenter = (TextView)findViewById(R.id.vertex3dcenterText);
267
    computeCenter();
268
    setCenterText();
269

    
270
    setBar(R.id.vertex3dcenterX, centerX);
271
    setBar(R.id.vertex3dcenterY, centerY);
272

    
273
    addViews();
274
    }
275
    
276
///////////////////////////////////////////////////////////////////////////////////////////////////
277
    
278
  private void addViews()
279
    {
280
    LinearLayout layout = (LinearLayout)findViewById(R.id.vertex3dlayout);
281
    
282
    layout.removeAllViews();
283
      
284
    View deform = getLayoutInflater().inflate(R.layout.vertex3ddeform , null);
285
    View distort= getLayoutInflater().inflate(R.layout.vertex3ddistort, null);
286
    View sink   = getLayoutInflater().inflate(R.layout.vertex3dsink   , null);
287
    View swirl  = getLayoutInflater().inflate(R.layout.vertex3dswirl  , null);
288
     
289
    for( int i=effects.length-1 ; i>=0 ; i-- )
290
      {
291
      switch(effects[i])
292
        {
293
        case DEFORM : layout.addView(deform , 0); break;
294
        case DISTORT: layout.addView(distort, 0); break;
295
        case SINK   : layout.addView(sink   , 0); break;
296
        case SWIRL  : layout.addView(swirl  , 0); break;
297
        }
298
      }
299
      
300
    textDeform = (TextView)findViewById(R.id.vertex3ddeformText);
301
    textDistort= (TextView)findViewById(R.id.vertex3ddistortText);
302
    textSink   = (TextView)findViewById(R.id.vertex3dsinkText);
303
    textSwirl  = (TextView)findViewById(R.id.vertex3dswirlText);
304
     
305
    setDeformText();
306
    setDistortText();
307
    setSinkText();
308
    setSwirlText();
309
      
310
    setBar(R.id.vertex3ddeformBar1, deformX);
311
    setBar(R.id.vertex3ddeformBar2, deformY);
312
    setBar(R.id.vertex3ddeformBar3, deformZ);
313

    
314
    setBar(R.id.vertex3ddistortBar1, distortX);
315
    setBar(R.id.vertex3ddistortBar2, distortY);
316
    setBar(R.id.vertex3ddistortBar3, distortZ);
317
      
318
    setBar(R.id.vertex3dsinkBar1, sinkA);
319

    
320
    setBar(R.id.vertex3dswirlBar1, swirlA);
321

    
322
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
323
    view.getRenderer().setOrder(effects);
324
    }
325

    
326
///////////////////////////////////////////////////////////////////////////////////////////////////
327

    
328
  private void moveUp(EffectNames name)
329
    {
330
    int len = effects.length-1;
331
    int index = -1;
332

    
333
    for(int i=0; i<=len; i++)
334
      {
335
      if( effects[i]==name )
336
        {
337
        index=i;
338
        break;
339
        }
340
      }
341

    
342
    if( index==0 )
343
      {
344
      for(int i=0; i<len; i++)
345
        effects[i] = effects[i+1];
346

    
347
      effects[len] = name;
348
      }
349
    else if( index>0 )
350
      {
351
      effects[index]   = effects[index-1];
352
      effects[index-1] = name;
353
      }
354

    
355
    addViews();
356
    }
357

    
358
///////////////////////////////////////////////////////////////////////////////////////////////////
359

    
360
  public void ButtonDeform(View v)
361
    {
362
    moveUp(EffectNames.DEFORM);
363
    }
364

    
365
///////////////////////////////////////////////////////////////////////////////////////////////////
366

    
367
  public void ButtonDistort(View v)
368
    {
369
    moveUp(EffectNames.DISTORT);
370
    }
371

    
372
///////////////////////////////////////////////////////////////////////////////////////////////////
373

    
374
  public void ButtonSink(View v)
375
    {
376
    moveUp(EffectNames.SINK);
377
    }
378

    
379
///////////////////////////////////////////////////////////////////////////////////////////////////
380

    
381
  public void ButtonSwirl(View v)
382
    {
383
    moveUp(EffectNames.SWIRL);
384
    }
385

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

    
388
  private void setBar(int id, int value)
389
    {
390
    bar = (SeekBar)findViewById(id);
391
    bar.setOnSeekBarChangeListener(this);
392
    bar.setProgress(value);
393
    }
394

    
395
///////////////////////////////////////////////////////////////////////////////////////////////////
396

    
397
  private void computeDeform()
398
    {
399
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
400
    Vertex3DRenderer renderer = view.getRenderer();
401

    
402
    fdeformX = (deformX-50)*renderer.mScreenMin/200.0f;
403
    fdeformY = (deformY-50)*renderer.mScreenMin/200.0f;
404
    fdeformZ = (deformZ-50)*renderer.mScreenMin/200.0f;
405

    
406
    renderer.setDeform( fdeformX, fdeformY, fdeformZ );
407
    }
408

    
409
///////////////////////////////////////////////////////////////////////////////////////////////////
410

    
411
  private void setDeformText()
412
    {
413
    fdeformX = ((int)(100*fdeformX))/100.0f;
414
    fdeformY = ((int)(100*fdeformY))/100.0f;
415
    fdeformZ = ((int)(100*fdeformZ))/100.0f;
416

    
417
    textDeform.setText("deform("+fdeformX+" , "+fdeformY+" , "+fdeformZ+")");
418
    }
419

    
420
///////////////////////////////////////////////////////////////////////////////////////////////////
421

    
422
  private void computeDistort()
423
    {
424
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
425
    Vertex3DRenderer renderer = view.getRenderer();
426

    
427
    fdistortX = (distortX-50)*renderer.mScreenMin/200.0f;
428
    fdistortY = (distortY-50)*renderer.mScreenMin/200.0f;
429
    fdistortZ = (distortZ-50)*renderer.mScreenMin/200.0f;
430

    
431
    renderer.setDistort(fdistortX, fdistortY, fdistortZ);
432
    }
433

    
434
///////////////////////////////////////////////////////////////////////////////////////////////////
435

    
436
  private void setDistortText()
437
    {
438
    fdistortX = ((int)(100*fdistortX))/100.0f;
439
    fdistortY = ((int)(100*fdistortY))/100.0f;
440
    fdistortZ = ((int)(100*fdistortZ))/100.0f;
441

    
442
    textDistort.setText("distort("+fdistortX+" , "+fdistortY+" , "+fdistortZ+")");
443
    }
444

    
445
///////////////////////////////////////////////////////////////////////////////////////////////////
446

    
447
  private void computeSink()
448
    {
449
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
450

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

    
453
    view.getRenderer().setSink( fsinkA );
454
    }
455

    
456
///////////////////////////////////////////////////////////////////////////////////////////////////
457

    
458
  private void setSinkText()
459
    {
460
    fsinkA = ((int)(100*fsinkA))/100.0f;
461

    
462
    textSink.setText("sink("+fsinkA+")");
463
    }
464

    
465
///////////////////////////////////////////////////////////////////////////////////////////////////
466

    
467
  private void computeSwirl()
468
    {
469
    Vertex3DSurfaceView view = (Vertex3DSurfaceView)findViewById(R.id.vertex3dSurfaceView);
470

    
471
    fswirlA = (swirlA-50)*3.6f;
472

    
473
    view.getRenderer().setSwirl( fswirlA );
474
    }
475
    
476
///////////////////////////////////////////////////////////////////////////////////////////////////
477

    
478
  private void setSwirlText()
479
    {
480
    fswirlA = ((int)(100*fswirlA))/100.0f;
481

    
482
    textSwirl.setText("swirl("+fswirlA+")");
483
    }
484

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

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

    
491
    fcenterX = centerX;
492
    fcenterY = centerY;
493

    
494
    view.getRenderer().setCenter( fcenterX, fcenterY );
495
    }
496

    
497
///////////////////////////////////////////////////////////////////////////////////////////////////
498

    
499
  private void setCenterText()
500
    {
501
    fcenterX = ((int)(100*fcenterX))/100.0f;
502
    fcenterY = ((int)(100*fcenterY))/100.0f;
503

    
504
    textCenter.setText("center("+fcenterX+","+fcenterY+")");
505
    }
506

    
507
///////////////////////////////////////////////////////////////////////////////////////////////////
508

    
509
  public float getCenterX()
510
    {
511
    return fcenterX;
512
    }
513

    
514
///////////////////////////////////////////////////////////////////////////////////////////////////
515

    
516
  public float getCenterY()
517
    {
518
    return fcenterY;
519
    }
520

    
521
///////////////////////////////////////////////////////////////////////////////////////////////////
522
// Overrides
523

    
524
  @Override
525
  protected void onPause()
526
    {
527
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.vertex3dSurfaceView);
528
    if( mView!=null ) mView.onPause();
529
    super.onPause();
530
    }
531

    
532
///////////////////////////////////////////////////////////////////////////////////////////////////
533
    
534
  @Override
535
  protected void onResume()
536
    {
537
    super.onResume();
538
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.vertex3dSurfaceView);
539
    if( mView!=null ) mView.onResume();
540
    }
541

    
542
///////////////////////////////////////////////////////////////////////////////////////////////////
543
    
544
  @Override
545
  public void onWindowFocusChanged(boolean hasFocus)
546
    {
547
    super.onWindowFocusChanged(hasFocus);
548

    
549
    if( firstScreen )
550
      {
551
      mColsPicker.setValue(mNumCols);
552
      mRowsPicker.setValue(mNumRows);
553

    
554
      if( hasFocus ) setGrid();
555
      }
556
    }
557

    
558
///////////////////////////////////////////////////////////////////////////////////////////////////
559
    
560
  @Override
561
  protected void onDestroy()
562
    {
563
    Distorted.onDestroy();
564
    super.onDestroy();
565
    }
566
    
567
///////////////////////////////////////////////////////////////////////////////////////////////////
568
    
569
  public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
570
    {
571
    switch (bar.getId())
572
      {
573
      case R.id.vertex3dcenterX     : centerX = progress; computeCenter() ; setCenterText()  ; break;
574
      case R.id.vertex3dcenterY     : centerY = progress; computeCenter() ; setCenterText()  ; break;
575
      case R.id.vertex3ddeformBar1  : deformX = progress; computeDeform() ; setDeformText()  ; break;
576
      case R.id.vertex3ddeformBar2  : deformY = progress; computeDeform() ; setDeformText()  ; break;
577
      case R.id.vertex3ddeformBar3  : deformZ = progress; computeDeform() ; setDeformText()  ; break;
578
      case R.id.vertex3ddistortBar1 : distortX= progress; computeDistort(); setDistortText() ; break;
579
      case R.id.vertex3ddistortBar2 : distortY= progress; computeDistort(); setDistortText() ; break;
580
      case R.id.vertex3ddistortBar3 : distortZ= progress; computeDistort(); setDistortText() ; break;
581
      case R.id.vertex3dsinkBar1    : sinkA   = progress; computeSink()   ; setSinkText()    ; break;
582
      case R.id.vertex3dswirlBar1   : swirlA  = progress; computeSwirl()  ; setSwirlText()   ; break;
583
      }
584
    }
585

    
586
///////////////////////////////////////////////////////////////////////////////////////////////////
587

    
588
  public void onStartTrackingTouch(SeekBar bar) { }
589
    
590
///////////////////////////////////////////////////////////////////////////////////////////////////
591

    
592
  public void onStopTrackingTouch(SeekBar bar)  { }
593
  }
(1-1/3)