Project

General

Profile

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

examples / src / main / java / org / distorted / examples / effects3d / Effects3DActivity.java @ 98c04ab8

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.view.Gravity;
30
import android.view.View;
31
import android.widget.AdapterView;
32
import android.widget.ArrayAdapter;
33
import android.widget.Button;
34
import android.widget.LinearLayout;
35
import android.widget.NumberPicker;
36
import android.widget.Spinner;
37
import android.widget.TableRow;
38

    
39
import org.distorted.examples.R;
40
import org.distorted.library.Distorted;
41
import org.distorted.library.MeshCubes;
42
import org.distorted.library.MeshFlat;
43
import org.distorted.library.MeshObject;
44
import org.distorted.library.DistortedTexture;
45
import org.distorted.library.DistortedEffects;
46
import org.distorted.library.EffectNames;
47
import org.distorted.library.EffectTypes;
48

    
49
import java.io.IOException;
50
import java.io.InputStream;
51
import java.util.ArrayList;
52

    
53
///////////////////////////////////////////////////////////////////////////////////////////////////
54

    
55
public class Effects3DActivity extends Activity
56
                               implements View.OnClickListener,
57
                                          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 boolean mGridInitialized;
66
  private NumberPicker mColsPicker, mRowsPicker;
67
  private boolean[] mShape;
68
  private DistortedTexture mTexture;
69
  private DistortedEffects mEffects;
70
  private MeshObject mMesh;
71
  private int mObjectType;
72
  private int mBitmapID;
73
  private Bitmap mBitmap;
74
  private LinearLayout mLay;
75

    
76
  private ArrayList<Effects3DEffect> mList;
77
  private int mEffectAdd;
78
  private float mCenterX, mCenterY, mCenterZ;
79
  private float mRegionX, mRegionY, mRegionR;
80

    
81
  private EffectNames[] mEffectNames;
82

    
83
  private static boolean mSupportsRegion;
84
  private static boolean mSupportsCenter;
85

    
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87

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

    
93
    mList = new ArrayList<>();
94

    
95
    createEffectNames();
96

    
97
    setContentView(R.layout.objectpickerlayout);
98

    
99
    mLay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
100

    
101
    mColsPicker = (NumberPicker)findViewById(R.id.objectpicker_cols);
102
    mRowsPicker = (NumberPicker)findViewById(R.id.objectpicker_rows);
103

    
104
    mColsPicker.setMaxValue(40);
105
    mColsPicker.setMinValue( 0);
106
    mRowsPicker.setMaxValue(40);
107
    mRowsPicker.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
    mObjectType = 0;
128
    mGridInitialized = false;
129

    
130
    Spinner typeSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerType);
131
    typeSpinner.setOnItemSelectedListener(this);
132

    
133
    String[] objectType = new String[] {"Mesh: Cubes", "Mesh: Flat"};
134

    
135
    ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
136
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
137
    typeSpinner.setAdapter(adapterType);
138

    
139
    Spinner bitmapSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerBitmap);
140
    bitmapSpinner.setOnItemSelectedListener(this);
141

    
142
    String[] objectBitmap = new String[] { "Texture: Grid", "Texture: Girl", "Texture: Dog", "Texture: Cat",
143
                                           "Texture: Squares", "Texture: Bean", "Texture: Lisa" };
144

    
145
    ArrayAdapter<String> adapterBitmap = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectBitmap);
146
    adapterBitmap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
147
    bitmapSpinner.setAdapter(adapterBitmap);
148
    }
149

    
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

    
152
  private void createEffectNames()
153
    {
154
    EffectTypes type1 = EffectTypes.FRAGMENT;
155
    EffectTypes type2 = EffectTypes.VERTEX;
156

    
157
    EffectNames[] names = EffectNames.values();
158

    
159
    int numEffects=0;
160

    
161
    for(int i=0; i<names.length; i++)
162
      if( names[i].getType() == type1 || names[i].getType() == type2 ) numEffects++;
163

    
164
    mEffectNames = new EffectNames[numEffects];
165

    
166
    numEffects=0;
167

    
168
    for(int i=0; i<names.length; i++)
169
      if( names[i].getType() == type1 || names[i].getType() == type2 )
170
        {
171
        mEffectNames[numEffects++] = names[i];
172
        }
173
    }
174

    
175
///////////////////////////////////////////////////////////////////////////////////////////////////
176

    
177
  private void setGrid()
178
    {
179
    mGridInitialized = true;
180

    
181
    mNumCols = mColsPicker.getValue();
182
    mNumRows = mRowsPicker.getValue();
183

    
184
    int width = mLay.getWidth();
185
    int height= mLay.getHeight();
186
    int w = mNumCols>0 ? (int)( 0.9f*width / mNumCols) : 0;
187
    int h = mNumRows>0 ? (int)( 0.9f*height/ mNumRows) : 0;
188
    int size= w<h ? w:h;
189
    int pad = size<20 ? 1 : size/20;
190

    
191
    mLay.removeAllViews();
192

    
193
    mShape = new boolean[mNumRows*mNumCols];
194

    
195
    TableRow.LayoutParams p = new TableRow.LayoutParams();
196

    
197
    p.rightMargin  = pad;
198
    p.leftMargin   = pad;
199
    p.topMargin    = pad;
200
    p.bottomMargin = pad;
201
    p.height       = size;
202
    p.width        = size;
203

    
204
    for (int rows=0; rows<mNumRows; rows++)
205
      {
206
      TableRow tr = new TableRow(this);
207
      tr.setGravity(Gravity.CENTER);
208

    
209
      for(int cols=0; cols<mNumCols; cols++)
210
        {
211
        Button b = new Button(this);
212
        b.setOnClickListener(this);
213
        b.setId(rows*mNumCols+cols);
214
        b.setLayoutParams(p);
215
        b.setBackgroundColor(mObjectType==1 ? COLOR_INAC : COLOR_ON);
216
        tr.addView(b, p);
217
        mShape[rows*mNumCols+cols] = true;
218
        }
219

    
220
      mLay.addView(tr);
221
      }
222
    }
223

    
224
///////////////////////////////////////////////////////////////////////////////////////////////////
225

    
226
  public DistortedTexture getTexture()
227
    {
228
    return mTexture;
229
    }
230

    
231
///////////////////////////////////////////////////////////////////////////////////////////////////
232

    
233
  public DistortedEffects getEffects()
234
    {
235
    return mEffects;
236
    }
237

    
238
///////////////////////////////////////////////////////////////////////////////////////////////////
239

    
240
  public MeshObject getMesh()
241
    {
242
    return mMesh;
243
    }
244

    
245
///////////////////////////////////////////////////////////////////////////////////////////////////
246

    
247
  public void setSupportsRegion(boolean supports)
248
    {
249
    mSupportsRegion = supports;
250
    }
251

    
252
///////////////////////////////////////////////////////////////////////////////////////////////////
253

    
254
  public void setSupportsCenter(boolean supports)
255
    {
256
    mSupportsCenter = supports;
257
    }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
  public Bitmap getBitmap()
262
    {
263
    if( mBitmap==null )
264
      {
265
      if( mBitmapID!=-1)
266
        {
267
        InputStream is = getResources().openRawResource(mBitmapID);
268

    
269
        try
270
          {
271
          mBitmap = BitmapFactory.decodeStream(is);
272
          }
273
        finally
274
          {
275
          try
276
            {
277
            is.close();
278
            }
279
          catch(IOException e) { }
280
          }
281
        }
282
      else
283
        {
284
        final int W = 640;
285
        final int H = 640;
286

    
287
        Paint paint = new Paint();
288
        mBitmap = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
289
        Canvas canvas = new Canvas(mBitmap);
290

    
291
        paint.setAntiAlias(true);
292
        paint.setTextAlign(Paint.Align.CENTER);
293
        paint.setColor(0xff008800);
294
        paint.setStyle(Paint.Style.FILL);
295
        canvas.drawRect(0, 0, W, H, paint);
296
        paint.setColor(0xffffffff);
297

    
298
        for(int i=0; i<=mNumCols ; i++ )
299
          {
300
          canvas.drawRect(W*i/mNumCols - 1,                0,  W*i/mNumCols + 1,  H               , paint);
301
          canvas.drawRect(               0, H *i/mNumCols -1,  W               ,  H*i/mNumCols + 1, paint);
302
          }
303
        }
304
      }
305

    
306
    return mBitmap;
307
    }
308

    
309
///////////////////////////////////////////////////////////////////////////////////////////////////
310

    
311
  public void onClick(View view)
312
    {
313
    if( mObjectType!=1 )
314
      {
315
      Button tmp = (Button)view;
316
      int id = tmp.getId();
317
      mShape[id] = !mShape[id];
318
      tmp.setBackgroundColor(mShape[id] ? COLOR_ON:COLOR_OFF);
319
      }
320
    }
321

    
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323

    
324
  private void uncheckAll()
325
    {
326
    TableRow tr;
327
    Button butt;
328

    
329
    for (int row=0; row<mNumRows; row++)
330
      {
331
      tr = (TableRow)mLay.getChildAt(row);
332

    
333
      for(int col=0; col<mNumCols; col++)
334
        {
335
        butt = (Button)tr.getVirtualChildAt(col);
336
        butt.setBackgroundColor(mObjectType==1 ? COLOR_INAC : COLOR_ON);
337
        mShape[row*mNumCols+col] = true;
338
        }
339
      }
340
    }
341

    
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343

    
344
  public void setRegion(float x, float y, float r)
345
    {
346
    mRegionX = x;
347
    mRegionY =-y;
348
    mRegionR = r;
349

    
350
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
351
    view.getRenderer().setRegion(mRegionX, mRegionY, mRegionR);
352
    }
353

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

    
356
  public void setCenter(float x, float y, float z)
357
    {
358
    mCenterX = x;
359
    mCenterY = y;
360
    mCenterZ = z;
361

    
362
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
363
    view.getRenderer().setCenter( mCenterX, mCenterY, mCenterZ );
364
    }
365

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

    
368
  public float getCenterX()
369
    {
370
    return mCenterX;
371
    }
372

    
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374

    
375
  public float getCenterY()
376
    {
377
    return mCenterY;
378
    }
379

    
380
///////////////////////////////////////////////////////////////////////////////////////////////////
381

    
382
  public float getCenterZ()
383
    {
384
    return mCenterZ;
385
    }
386

    
387
///////////////////////////////////////////////////////////////////////////////////////////////////
388

    
389
  public float getRegionX()
390
    {
391
    return mRegionX;
392
    }
393

    
394
///////////////////////////////////////////////////////////////////////////////////////////////////
395

    
396
  public float getRegionY()
397
    {
398
    return mRegionY;
399
    }
400

    
401
///////////////////////////////////////////////////////////////////////////////////////////////////
402

    
403
  public float getRegionR()
404
    {
405
    return mRegionR;
406
    }
407

    
408
///////////////////////////////////////////////////////////////////////////////////////////////////
409

    
410
  public void Create(View v)
411
    {
412
    DistortedEffects.setMaxVertex(20);    // those have to be called before
413
    DistortedEffects.setMaxFragment(3);   // any DistortedEffect get created!
414

    
415
    if( mObjectType==1 )
416
      {
417
      mMesh = new MeshFlat(mNumCols,mNumRows);
418
      }
419
    else
420
      {
421
      String str = "";
422

    
423
      for(int i=0; i<mNumRows*mNumCols; i++)
424
        str += mShape[i] ? "1" : "0";
425

    
426
      mMesh = new MeshCubes(mNumCols, str, false);
427
      }
428

    
429
    mEffects= new DistortedEffects();
430
    mTexture= new DistortedTexture(mNumCols,mNumRows);
431

    
432
    final View view = getLayoutInflater().inflate(R.layout.effects3dlayout, null);
433

    
434
    setContentView(view);
435

    
436
    String[] effects = new String[mEffectNames.length];
437

    
438
    for(int i=0; i<mEffectNames.length; i++) effects[i] = mEffectNames[i].name();
439

    
440
    Spinner effectSpinner = (Spinner)findViewById(R.id.effects3dspinner );
441
    effectSpinner.setOnItemSelectedListener(this);
442

    
443
    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, effects);
444
    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
445
    effectSpinner.setAdapter(adapterEffect);
446

    
447
    resetData();
448

    
449
    mEffectAdd = 0;
450
    }
451

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

    
454
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
455
    {
456
    switch(parent.getId())
457
      {
458
      case R.id.objectpicker_spinnerType  : if( mObjectType!=pos )
459
                                              {
460
                                              mObjectType = pos;
461
                                              uncheckAll();
462
                                              }
463
                                            break;
464
      case R.id.objectpicker_spinnerBitmap: switch(pos)
465
                                              {
466
                                              case 0: mBitmapID = -1        ; break;
467
                                              case 1: mBitmapID = R.raw.face; break;
468
                                              case 2: mBitmapID = R.raw.dog ; break;
469
                                              case 3: mBitmapID = R.raw.cat ; break;
470
                                              case 4: mBitmapID = R.raw.grid; break;
471
                                              case 5: mBitmapID = R.raw.bean; break;
472
                                              case 6: mBitmapID = R.raw.monalisa; break;
473
                                              }
474
                                            break;
475
      case R.id.effects3dspinner          : mEffectAdd = pos;
476
                                            break;
477
      }
478
    }
479

    
480
///////////////////////////////////////////////////////////////////////////////////////////////////
481

    
482
  public void onNothingSelected(AdapterView<?> parent)
483
    {
484
    }
485

    
486
///////////////////////////////////////////////////////////////////////////////////////////////////
487

    
488
  public int getWidth()
489
    {
490
    return mTexture==null ? 0: mTexture.getWidth();
491
    }
492

    
493
///////////////////////////////////////////////////////////////////////////////////////////////////
494

    
495
  public int getHeight()
496
    {
497
    return mTexture==null ? 0: mTexture.getHeight();
498
    }
499

    
500
///////////////////////////////////////////////////////////////////////////////////////////////////
501

    
502
  public int getDepth()
503
    {
504
    return mTexture==null ? 0: mTexture.getDepth(mMesh);
505
    }
506

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

    
509
  public int getScreenWidth()
510
    {
511
    return 0;
512
    }
513

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

    
516
  private void resetData()
517
    {
518
    mCenterX = 0.5f*getWidth();
519
    mCenterY = 0.5f*getHeight();
520
    mRegionX = 0;
521
    mRegionY = 0;
522
    mRegionR = getWidth()/2;
523

    
524
    mSupportsRegion =false;
525
    mSupportsCenter =false;
526

    
527
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
528
    view.getRenderer().showRegionAndCenter(false);
529
    }
530

    
531
///////////////////////////////////////////////////////////////////////////////////////////////////
532
// 'second screen' methods
533

    
534
  public void newEffect(View v)
535
    {
536
    Effects3DEffect eff = new Effects3DEffect(mEffectNames[mEffectAdd], this);
537
    mList.add(eff);
538

    
539
    LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
540
    View view = eff.createView();
541
    layout.addView(view);
542

    
543
    if( mSupportsCenter )
544
      {
545
      View center = eff.createCenter();
546
      layout.addView(center);
547
      }
548

    
549
    if( mSupportsRegion )
550
      {
551
      View region = eff.createRegion();
552
      layout.addView(region);
553
      }
554

    
555
    eff.apply(mEffects);
556

    
557
    Effects3DSurfaceView sv = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
558
    sv.getRenderer().showRegionAndCenter(mEffectNames[mEffectAdd].getType()==EffectTypes.VERTEX);
559
    }
560

    
561
///////////////////////////////////////////////////////////////////////////////////////////////////
562

    
563
  public void removeAll(View v)
564
    {
565
    mList.clear();
566
    LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
567
    layout.removeAllViews();
568
    mEffects.abortEffects(EffectTypes.VERTEX);
569
    mEffects.abortEffects(EffectTypes.FRAGMENT);
570

    
571
    resetData();
572

    
573
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
574
    Effects3DRenderer renderer= view.getRenderer();
575

    
576
    renderer.setCenter( mCenterX, mCenterY, mCenterZ );
577
    renderer.setRegion( mRegionX, mRegionY, mRegionR );
578
    renderer.mQuat1.set(0,0,0,1);
579
    renderer.mQuat2.set(0,0,0,1);
580
    }
581

    
582
///////////////////////////////////////////////////////////////////////////////////////////////////
583

    
584
  public void remove(View v)
585
    {
586
    for(Effects3DEffect effect: mList)
587
      {
588
      if( effect.thisView(v) )
589
        {
590
        LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
591
        View view;
592

    
593
        view = effect.getEffect();
594
        if( view!=null ) layout.removeView(view);
595
        view = effect.getCenter();
596
        if( view!=null ) layout.removeView(view);
597
        view = effect.getRegion();
598
        if( view!=null ) layout.removeView(view);
599

    
600
        mEffects.abortEffect(effect.getId());
601
        mList.remove(effect);
602

    
603
        resetData();
604

    
605
        break;
606
        }
607
      }
608
    }
609

    
610
///////////////////////////////////////////////////////////////////////////////////////////////////
611
// Overrides
612

    
613
  @Override
614
  protected void onPause()
615
    {
616
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
617
    if( mView!=null ) mView.onPause();
618
    super.onPause();
619
    }
620

    
621
///////////////////////////////////////////////////////////////////////////////////////////////////
622
    
623
  @Override
624
  protected void onResume()
625
    {
626
    super.onResume();
627
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
628
    if( mView!=null ) mView.onResume();
629
    }
630

    
631
///////////////////////////////////////////////////////////////////////////////////////////////////
632
    
633
  @Override
634
  public void onWindowFocusChanged(boolean hasFocus)
635
    {
636
    super.onWindowFocusChanged(hasFocus);
637

    
638
    mColsPicker.setValue(mNumCols);
639
    mRowsPicker.setValue(mNumRows);
640

    
641
    if( !mGridInitialized ) setGrid();
642
    }
643

    
644
///////////////////////////////////////////////////////////////////////////////////////////////////
645
    
646
  @Override
647
  protected void onDestroy()
648
    {
649
    Distorted.onDestroy();
650
    super.onDestroy();
651
    }
652

    
653
  }
(1-1/4)