Project

General

Profile

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

examples / src / main / java / org / distorted / examples / effects3d / Effects3DActivity.java @ fe7fe83e

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.effects3d;
21

    
22
import android.app.Activity;
23
import android.graphics.Bitmap;
24
import android.graphics.BitmapFactory;
25
import android.graphics.Canvas;
26
import android.graphics.Paint;
27
import android.opengl.GLSurfaceView;
28
import android.os.Bundle;
29
import android.support.design.widget.TabLayout;
30
import android.support.v4.view.ViewPager;
31
import android.view.Gravity;
32
import android.view.View;
33
import android.widget.AdapterView;
34
import android.widget.ArrayAdapter;
35
import android.widget.Button;
36
import android.widget.CheckBox;
37
import android.widget.LinearLayout;
38
import android.widget.NumberPicker;
39
import android.widget.Spinner;
40
import android.widget.TableRow;
41

    
42
import org.distorted.examples.R;
43
import org.distorted.library.effect.EffectType;
44
import org.distorted.library.main.Distorted;
45
import org.distorted.library.main.MeshCubes;
46
import org.distorted.library.main.MeshFlat;
47
import org.distorted.library.main.MeshObject;
48
import org.distorted.library.main.DistortedTexture;
49
import org.distorted.library.main.DistortedEffects;
50

    
51
import java.io.IOException;
52
import java.io.InputStream;
53

    
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55

    
56
public class Effects3DActivity extends Activity
57
                               implements View.OnClickListener, AdapterView.OnItemSelectedListener
58
  {
59
  private static final int COLOR_OFF = 0xffffe81f;
60
  private static final int COLOR_ON  = 0xff0000ff;
61
  private static final int COLOR_INAC= 0xff00ff00;
62

    
63
  private int mNumCols = 10;
64
  private int mNumRows = 10;
65
  private int mNumSlic =  1;
66
  private boolean mGridInitialized;
67
  private NumberPicker mColsPicker, mRowsPicker, mSlicPicker;
68
  private boolean[] mShape;
69
  private DistortedTexture mTexture;
70
  private MeshObject mMesh;
71
  private int mObjectType;
72
  private int mBitmapID;
73
  private Bitmap mBitmap;
74
  private LinearLayout mLay;
75

    
76
  private float mCenterX, mCenterY, mCenterZ;
77
  private float mRegionX, mRegionY, mRegionR;
78
  private DistortedEffects mEffects;
79
  private ViewPager mViewPager;
80
  private Effects3DTabViewPager mPager;
81

    
82
  private static boolean mShowCenter = true;
83
  private static boolean mShowRegion = true;
84
  private static boolean mShowNormal = true;
85
  private static boolean mUseOIT     = false;
86

    
87
///////////////////////////////////////////////////////////////////////////////////////////////////
88

    
89
  @Override
90
  protected void onCreate(Bundle savedState)
91
    {
92
    super.onCreate(savedState);
93

    
94
    setContentView(R.layout.objectpickerlayout);
95

    
96
    mLay = findViewById(R.id.objectpicker_buttongrid);
97

    
98
    mColsPicker = findViewById(R.id.objectpicker_cols);
99
    mRowsPicker = findViewById(R.id.objectpicker_rows);
100
    mSlicPicker = findViewById(R.id.objectpicker_slices);
101

    
102
    mColsPicker.setMaxValue(40);
103
    mColsPicker.setMinValue( 0);
104
    mRowsPicker.setMaxValue(40);
105
    mRowsPicker.setMinValue( 0);
106
    mSlicPicker.setMaxValue(40);
107
    mSlicPicker.setMinValue( 0);
108

    
109
    mColsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
110
         {
111
         @Override
112
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
113
           {
114
           setGrid();
115
           }
116
         });
117

    
118
    mRowsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
119
         {
120
         @Override
121
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
122
           {
123
           setGrid();
124
           }
125
         });
126

    
127
    mSlicPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
128
         {
129
         @Override
130
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
131
           {
132
           mNumSlic = mSlicPicker.getValue();
133
           }
134
         });
135

    
136
    mObjectType = 0;
137
    mGridInitialized = false;
138

    
139
    Spinner typeSpinner  = findViewById(R.id.objectpicker_spinnerType);
140
    typeSpinner.setOnItemSelectedListener(this);
141

    
142
    String[] objectType = new String[] {"Mesh: Cubes", "Mesh: Flat"};
143

    
144
    ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
145
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
146
    typeSpinner.setAdapter(adapterType);
147

    
148
    Spinner bitmapSpinner  = findViewById(R.id.objectpicker_spinnerBitmap);
149
    bitmapSpinner.setOnItemSelectedListener(this);
150

    
151
    String[] objectBitmap = new String[] { "Texture: Grid", "Texture: Girl", "Texture: Dog", "Texture: Cat",
152
                                           "Texture: Squares", "Texture: Bean", "Texture: Lisa" };
153

    
154
    ArrayAdapter<String> adapterBitmap = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectBitmap);
155
    adapterBitmap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
156
    bitmapSpinner.setAdapter(adapterBitmap);
157
    }
158

    
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

    
161
  private void setGrid()
162
    {
163
    mGridInitialized = true;
164

    
165
    mNumCols = mColsPicker.getValue();
166
    mNumRows = mRowsPicker.getValue();
167

    
168
    int width = mLay.getWidth();
169
    int height= mLay.getHeight();
170
    int w = mNumCols>0 ? (int)( 0.9f*width / mNumCols) : 0;
171
    int h = mNumRows>0 ? (int)( 0.9f*height/ mNumRows) : 0;
172
    int size= w<h ? w:h;
173
    int pad = size<20 ? 1 : size/20;
174

    
175
    mLay.removeAllViews();
176

    
177
    mShape = new boolean[mNumRows*mNumCols];
178

    
179
    TableRow.LayoutParams p = new TableRow.LayoutParams();
180

    
181
    p.rightMargin  = pad;
182
    p.leftMargin   = pad;
183
    p.topMargin    = pad;
184
    p.bottomMargin = pad;
185
    p.height       = size;
186
    p.width        = size;
187

    
188
    for (int rows=0; rows<mNumRows; rows++)
189
      {
190
      TableRow tr = new TableRow(this);
191
      tr.setGravity(Gravity.CENTER);
192

    
193
      for(int cols=0; cols<mNumCols; cols++)
194
        {
195
        Button b = new Button(this);
196
        b.setOnClickListener(this);
197
        b.setId(rows*mNumCols+cols);
198
        b.setLayoutParams(p);
199
        b.setBackgroundColor(mObjectType==1 ? COLOR_INAC : COLOR_ON);
200
        tr.addView(b, p);
201
        mShape[rows*mNumCols+cols] = true;
202
        }
203

    
204
      mLay.addView(tr);
205
      }
206
    }
207

    
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209

    
210
  public DistortedTexture getTexture()
211
    {
212
    return mTexture;
213
    }
214

    
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216

    
217
  public MeshObject getMesh()
218
    {
219
    return mMesh;
220
    }
221

    
222
///////////////////////////////////////////////////////////////////////////////////////////////////
223

    
224
  public Bitmap getBitmap()
225
    {
226
    if( mBitmap==null )
227
      {
228
      if( mBitmapID!=-1)
229
        {
230
        InputStream is = getResources().openRawResource(mBitmapID);
231

    
232
        try
233
          {
234
          mBitmap = BitmapFactory.decodeStream(is);
235
          }
236
        finally
237
          {
238
          try
239
            {
240
            is.close();
241
            }
242
          catch(IOException e) { }
243
          }
244
        }
245
      else
246
        {
247
        final int W = 64*mNumCols;
248
        final int H = 64*mNumRows;
249

    
250
        Paint paint = new Paint();
251
        mBitmap = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
252
        Canvas canvas = new Canvas(mBitmap);
253

    
254
        paint.setAntiAlias(true);
255
        paint.setTextAlign(Paint.Align.CENTER);
256
        paint.setColor(0xff008800);
257
        paint.setStyle(Paint.Style.FILL);
258
        canvas.drawRect(0, 0, W, H, paint);
259
        paint.setColor(0xffffffff);
260

    
261
        for(int i=0; i<=mNumCols ; i++ ) canvas.drawRect(W*i/mNumCols-1, 0, W*i/mNumCols + 1, H, paint);
262
        for(int i=0; i<=mNumRows ; i++ ) canvas.drawRect( 0, H*i/mNumRows-1, W,  H*i/mNumRows+1, paint);
263
        }
264
      }
265

    
266
    return mBitmap;
267
    }
268

    
269
///////////////////////////////////////////////////////////////////////////////////////////////////
270

    
271
  public void onClick(View view)
272
    {
273
    if( mObjectType!=1 )
274
      {
275
      Button tmp = (Button)view;
276
      int id = tmp.getId();
277
      mShape[id] = !mShape[id];
278
      tmp.setBackgroundColor(mShape[id] ? COLOR_ON:COLOR_OFF);
279
      }
280
    }
281

    
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283

    
284
  private void uncheckAll()
285
    {
286
    TableRow tr;
287
    Button butt;
288

    
289
    for (int row=0; row<mNumRows; row++)
290
      {
291
      tr = (TableRow)mLay.getChildAt(row);
292

    
293
      for(int col=0; col<mNumCols; col++)
294
        {
295
        butt = (Button)tr.getVirtualChildAt(col);
296
        butt.setBackgroundColor(mObjectType==1 ? COLOR_INAC : COLOR_ON);
297
        mShape[row*mNumCols+col] = true;
298
        }
299
      }
300
    }
301

    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
  public void setRegion(float x, float y, float r)
305
    {
306
    mRegionX = x;
307
    mRegionY =-y;
308
    mRegionR = r;
309

    
310
    Effects3DSurfaceView view = findViewById(R.id.effects3dSurfaceView);
311
    view.getRenderer().setRegion(mRegionX, mRegionY, mRegionR);
312
    }
313

    
314
///////////////////////////////////////////////////////////////////////////////////////////////////
315

    
316
  public void setCenter(float x, float y, float z)
317
    {
318
    mCenterX = x;
319
    mCenterY = y;
320
    mCenterZ = z;
321

    
322
    Effects3DSurfaceView view = findViewById(R.id.effects3dSurfaceView);
323
    view.getRenderer().setCenter( mCenterX, mCenterY, mCenterZ );
324
    }
325

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

    
328
  public float getCenterX()
329
    {
330
    return mCenterX;
331
    }
332

    
333
///////////////////////////////////////////////////////////////////////////////////////////////////
334

    
335
  public float getCenterY()
336
    {
337
    return mCenterY;
338
    }
339

    
340
///////////////////////////////////////////////////////////////////////////////////////////////////
341

    
342
  public float getCenterZ()
343
    {
344
    return mCenterZ;
345
    }
346

    
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348

    
349
  public float getRegionX()
350
    {
351
    return mRegionX;
352
    }
353

    
354
///////////////////////////////////////////////////////////////////////////////////////////////////
355

    
356
  public float getRegionY()
357
    {
358
    return mRegionY;
359
    }
360

    
361
///////////////////////////////////////////////////////////////////////////////////////////////////
362

    
363
  public float getRegionR()
364
    {
365
    return mRegionR;
366
    }
367

    
368
///////////////////////////////////////////////////////////////////////////////////////////////////
369

    
370
  public void Create(View v)
371
    {
372
    DistortedEffects.setMax(EffectType.VERTEX ,20);    // those have to be called before
373
    DistortedEffects.setMax(EffectType.FRAGMENT,3);    // any DistortedEffect get created!
374

    
375
    if( mObjectType==1 )
376
      {
377
      mMesh = new MeshFlat(mNumCols,mNumRows);
378
      }
379
    else
380
      {
381
      String str = "";
382

    
383
      for(int i=0; i<mNumRows*mNumCols; i++)
384
        str += mShape[i] ? "1" : "0";
385

    
386
      mMesh = new MeshCubes(mNumCols, str, mNumSlic);
387
      }
388

    
389
    mMesh.setShowNormals(mShowNormal);
390
    mTexture= new DistortedTexture(mNumCols,mNumRows);
391
    mEffects= new DistortedEffects();
392

    
393
    final View view = getLayoutInflater().inflate(R.layout.effects3dlayout, null);
394

    
395
    setContentView(view);
396

    
397
    mViewPager = findViewById(R.id.effects3d_viewpager);
398
    mPager = new Effects3DTabViewPager(this, getFragmentManager() );
399
    mViewPager.setAdapter(mPager);
400
    TabLayout tabLayout = findViewById(R.id.effects3d_sliding_tabs);
401
    tabLayout.setupWithViewPager(mViewPager);
402

    
403
    resetData();
404
    }
405

    
406
///////////////////////////////////////////////////////////////////////////////////////////////////
407

    
408
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
409
    {
410
    switch(parent.getId())
411
      {
412
      case R.id.objectpicker_spinnerType  : if( mObjectType!=pos )
413
                                              {
414
                                              mObjectType = pos;
415
                                              uncheckAll();
416
                                              }
417
                                            break;
418
      case R.id.objectpicker_spinnerBitmap: switch(pos)
419
                                              {
420
                                              case 0: mBitmapID = -1        ; break;
421
                                              case 1: mBitmapID = R.raw.face; break;
422
                                              case 2: mBitmapID = R.raw.dog ; break;
423
                                              case 3: mBitmapID = R.raw.cat ; break;
424
                                              case 4: mBitmapID = R.raw.grid; break;
425
                                              case 5: mBitmapID = R.raw.bean; break;
426
                                              case 6: mBitmapID = R.raw.monalisa; break;
427
                                              }
428
                                            break;
429
      }
430
    }
431

    
432
///////////////////////////////////////////////////////////////////////////////////////////////////
433

    
434
  public void onNothingSelected(AdapterView<?> parent)
435
    {
436
    }
437

    
438
///////////////////////////////////////////////////////////////////////////////////////////////////
439

    
440
  public int getWidth()
441
    {
442
    return mTexture==null ? 0: mTexture.getWidth();
443
    }
444

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

    
447
  public int getHeight()
448
    {
449
    return mTexture==null ? 0: mTexture.getHeight();
450
    }
451

    
452
///////////////////////////////////////////////////////////////////////////////////////////////////
453

    
454
  public int getDepth()
455
    {
456
    return mTexture==null ? 0: mTexture.getDepth(mMesh);
457
    }
458

    
459
///////////////////////////////////////////////////////////////////////////////////////////////////
460

    
461
  public int getScreenWidth()
462
    {
463
    return 0;
464
    }
465

    
466
///////////////////////////////////////////////////////////////////////////////////////////////////
467

    
468
  void resetData()
469
    {
470
    mCenterX = 0.5f*getWidth();
471
    mCenterY = 0.5f*getHeight();
472
    mRegionX = 0;
473
    mRegionY = 0;
474
    mRegionR = getWidth()/2;
475

    
476
    Effects3DSurfaceView view = findViewById(R.id.effects3dSurfaceView);
477
    Effects3DRenderer renderer= view.getRenderer();
478

    
479
    renderer.setCenter( mCenterX, mCenterY, mCenterZ );
480
    renderer.setRegion( mRegionX, mRegionY, mRegionR );
481
    renderer.mQuat1.set(0,0,0,1);
482
    renderer.mQuat2.set(0,0,0,1);
483
    }
484

    
485
///////////////////////////////////////////////////////////////////////////////////////////////////
486
// 'second screen' methods
487
///////////////////////////////////////////////////////////////////////////////////////////////////
488

    
489
  public DistortedEffects getEffects()
490
    {
491
    return mEffects;
492
    }
493

    
494
///////////////////////////////////////////////////////////////////////////////////////////////////
495

    
496
  public void newEffect(View v)
497
    {
498
    mPager.newEffect(v,mViewPager.getCurrentItem());
499
    }
500

    
501
///////////////////////////////////////////////////////////////////////////////////////////////////
502

    
503
  public void removeAll(View v)
504
    {
505
    mPager.removeAll(v,mViewPager.getCurrentItem());
506
    }
507

    
508
///////////////////////////////////////////////////////////////////////////////////////////////////
509

    
510
  public void remove(View v)
511
    {
512
    mPager.remove(v,mViewPager.getCurrentItem());
513
    }
514

    
515
///////////////////////////////////////////////////////////////////////////////////////////////////
516

    
517
  boolean getShowCenter()
518
    {
519
    return mShowCenter;
520
    }
521

    
522
///////////////////////////////////////////////////////////////////////////////////////////////////
523

    
524
  boolean getShowRegion()
525
    {
526
    return mShowRegion;
527
    }
528

    
529
///////////////////////////////////////////////////////////////////////////////////////////////////
530

    
531
  public void showCenter(View view)
532
    {
533
    CheckBox box = (CheckBox)view;
534
    mShowCenter = box.isChecked();
535

    
536
    Effects3DSurfaceView sv = findViewById(R.id.effects3dSurfaceView);
537
    sv.getRenderer().showRegionAndCenter(mShowRegion,mShowCenter);
538
    }
539

    
540
///////////////////////////////////////////////////////////////////////////////////////////////////
541

    
542
  public void showRegion(View view)
543
    {
544
    CheckBox box = (CheckBox)view;
545
    mShowRegion = box.isChecked();
546

    
547
    Effects3DSurfaceView sv = findViewById(R.id.effects3dSurfaceView);
548
    sv.getRenderer().showRegionAndCenter(mShowRegion,mShowCenter);
549
    }
550

    
551
///////////////////////////////////////////////////////////////////////////////////////////////////
552

    
553
  public void showNormal(View view)
554
    {
555
    CheckBox box = (CheckBox)view;
556
    mShowNormal = box.isChecked();
557

    
558
    if ( mMesh!=null )
559
      {
560
      mMesh.setShowNormals(mShowNormal);
561
      }
562
    }
563

    
564
///////////////////////////////////////////////////////////////////////////////////////////////////
565

    
566
  public void triggerOIT(View view)
567
    {
568
    CheckBox box = (CheckBox)view;
569
    mUseOIT = box.isChecked();
570

    
571
    Effects3DSurfaceView sv = findViewById(R.id.effects3dSurfaceView);
572
    sv.getRenderer().useOIT(mUseOIT);
573
    }
574

    
575
///////////////////////////////////////////////////////////////////////////////////////////////////
576
// Overrides
577
///////////////////////////////////////////////////////////////////////////////////////////////////
578

    
579
  @Override
580
  protected void onPause()
581
    {
582
    GLSurfaceView mView = findViewById(R.id.effects3dSurfaceView);
583
    if( mView!=null ) mView.onPause();
584

    
585
    Distorted.onPause();
586
    super.onPause();
587
    }
588

    
589
///////////////////////////////////////////////////////////////////////////////////////////////////
590
    
591
  @Override
592
  protected void onResume()
593
    {
594
    super.onResume();
595
    GLSurfaceView mView = findViewById(R.id.effects3dSurfaceView);
596
    if( mView!=null ) mView.onResume();
597
    }
598

    
599
///////////////////////////////////////////////////////////////////////////////////////////////////
600
    
601
  @Override
602
  public void onWindowFocusChanged(boolean hasFocus)
603
    {
604
    super.onWindowFocusChanged(hasFocus);
605

    
606
    mColsPicker.setValue(mNumCols);
607
    mRowsPicker.setValue(mNumRows);
608
    mSlicPicker.setValue(mNumSlic);
609

    
610
    if( !mGridInitialized ) setGrid();
611
    }
612

    
613
///////////////////////////////////////////////////////////////////////////////////////////////////
614
    
615
  @Override
616
  protected void onDestroy()
617
    {
618
    Distorted.onDestroy();
619
    super.onDestroy();
620
    }
621

    
622
  }
(1-1/6)