Project

General

Profile

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

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

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 NumberPicker mColsPicker, mRowsPicker;
66
  private boolean[] mShape;
67
  private DistortedTexture mTexture;
68
  private DistortedEffects mEffects;
69
  private MeshObject mMesh;
70
  private int mObjectType;
71
  private int mBitmapID;
72
  private Bitmap mBitmap;
73
  private LinearLayout mLay;
74

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

    
80
  private EffectNames[] mEffectNames;
81

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

    
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86

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

    
92
    mList = new ArrayList<>();
93

    
94
    createEffectNames();
95

    
96
    setContentView(R.layout.objectpickerlayout);
97

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

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

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

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

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

    
126
    mObjectType = 0;
127

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

    
131
    String[] objectType = new String[] {"Mesh: Cubes", "Mesh: Flat"};
132

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

    
137
    Spinner bitmapSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerBitmap);
138
    bitmapSpinner.setOnItemSelectedListener(this);
139

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

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

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

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

    
155
    EffectNames[] names = EffectNames.values();
156

    
157
    int numEffects=0;
158

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

    
162
    mEffectNames = new EffectNames[numEffects];
163

    
164
    numEffects=0;
165

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

    
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

    
175
  private void setGrid()
176
    {
177
    mNumCols = mColsPicker.getValue();
178
    mNumRows = mRowsPicker.getValue();
179

    
180
    int width = mLay.getWidth();
181
    int height= mLay.getHeight();
182
    int w = mNumCols>0 ? (int)( 0.9f*width / mNumCols) : 0;
183
    int h = mNumRows>0 ? (int)( 0.9f*height/ mNumRows) : 0;
184
    int size= w<h ? w:h;
185
    int pad = size<20 ? 1 : size/20;
186

    
187
    mLay.removeAllViews();
188

    
189
    mShape = new boolean[mNumRows*mNumCols];
190

    
191
    TableRow.LayoutParams p = new TableRow.LayoutParams();
192

    
193
    p.rightMargin  = pad;
194
    p.leftMargin   = pad;
195
    p.topMargin    = pad;
196
    p.bottomMargin = pad;
197
    p.height       = size;
198
    p.width        = size;
199

    
200
    for (int rows=0; rows<mNumRows; rows++)
201
      {
202
      TableRow tr = new TableRow(this);
203
      tr.setGravity(Gravity.CENTER);
204

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

    
216
      mLay.addView(tr);
217
      }
218
    }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221

    
222
  public DistortedTexture getTexture()
223
    {
224
    return mTexture;
225
    }
226

    
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228

    
229
  public DistortedEffects getEffects()
230
    {
231
    return mEffects;
232
    }
233

    
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235

    
236
  public MeshObject getMesh()
237
    {
238
    return mMesh;
239
    }
240

    
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242

    
243
  public static void setSupportsRegion(boolean supports)
244
    {
245
    mSupportsRegion = supports;
246
    }
247

    
248
///////////////////////////////////////////////////////////////////////////////////////////////////
249

    
250
  public static boolean supportsRegion()
251
    {
252
    return mSupportsRegion;
253
    }
254

    
255
///////////////////////////////////////////////////////////////////////////////////////////////////
256

    
257
  public static void setSupportsCenter(boolean supports)
258
    {
259
    mSupportsCenter = supports;
260
    }
261

    
262
///////////////////////////////////////////////////////////////////////////////////////////////////
263

    
264
  public static boolean supportsCenter()
265
    {
266
    return mSupportsCenter;
267
    }
268

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

    
271
  public Bitmap getBitmap()
272
    {
273
    if( mBitmap==null )
274
      {
275
      if( mBitmapID!=-1)
276
        {
277
        InputStream is = getResources().openRawResource(mBitmapID);
278

    
279
        try
280
          {
281
          mBitmap = BitmapFactory.decodeStream(is);
282
          }
283
        finally
284
          {
285
          try
286
            {
287
            is.close();
288
            }
289
          catch(IOException e) { }
290
          }
291
        }
292
      else
293
        {
294
        final int W = 640;
295
        final int H = 640;
296

    
297
        Paint paint = new Paint();
298
        mBitmap = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
299
        Canvas canvas = new Canvas(mBitmap);
300

    
301
        paint.setAntiAlias(true);
302
        paint.setTextAlign(Paint.Align.CENTER);
303
        paint.setColor(0xff008800);
304
        paint.setStyle(Paint.Style.FILL);
305
        canvas.drawRect(0, 0, W, H, paint);
306
        paint.setColor(0xffffffff);
307

    
308
        for(int i=0; i<=mNumCols ; i++ )
309
          {
310
          canvas.drawRect(W*i/mNumCols - 1,                0,  W*i/mNumCols + 1,  H               , paint);
311
          canvas.drawRect(               0, H *i/mNumCols -1,  W               ,  H*i/mNumCols + 1, paint);
312
          }
313
        }
314
      }
315

    
316
    return mBitmap;
317
    }
318

    
319
///////////////////////////////////////////////////////////////////////////////////////////////////
320

    
321
  public void onClick(View view)
322
    {
323
    if( mObjectType!=1 )
324
      {
325
      Button tmp = (Button)view;
326
      int id = tmp.getId();
327
      mShape[id] = !mShape[id];
328
      tmp.setBackgroundColor(mShape[id] ? COLOR_ON:COLOR_OFF);
329
      }
330
    }
331

    
332
///////////////////////////////////////////////////////////////////////////////////////////////////
333

    
334
  private void uncheckAll()
335
    {
336
    TableRow tr;
337
    Button butt;
338

    
339
    for (int row=0; row<mNumRows; row++)
340
      {
341
      tr = (TableRow)mLay.getChildAt(row);
342

    
343
      for(int col=0; col<mNumCols; col++)
344
        {
345
        butt = (Button)tr.getVirtualChildAt(col);
346
        butt.setBackgroundColor(mObjectType==1 ? COLOR_INAC : COLOR_ON);
347
        mShape[row*mNumCols+col] = true;
348
        }
349
      }
350
    }
351

    
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353

    
354
  public void setRegion(float x, float y, float r)
355
    {
356
    mRegionX = x;
357
    mRegionY =-y;
358
    mRegionR = r;
359

    
360
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
361

    
362
    view.getRenderer().setRegion(mRegionX, mRegionY, mRegionR);
363
    }
364

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

    
367
  public void setCenter(float x, float y, float z)
368
    {
369
    mCenterX = x;
370
    mCenterY = y;
371
    mCenterZ = z;
372

    
373
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
374

    
375
    view.getRenderer().setCenter( mCenterX, mCenterY, mCenterZ );
376
    }
377

    
378
///////////////////////////////////////////////////////////////////////////////////////////////////
379

    
380
  public float getCenterX()
381
    {
382
    return mCenterX;
383
    }
384

    
385
///////////////////////////////////////////////////////////////////////////////////////////////////
386

    
387
  public float getCenterY()
388
    {
389
    return mCenterY;
390
    }
391

    
392
///////////////////////////////////////////////////////////////////////////////////////////////////
393

    
394
  public float getCenterZ()
395
    {
396
    return mCenterZ;
397
    }
398

    
399
///////////////////////////////////////////////////////////////////////////////////////////////////
400

    
401
  public float getRegionX()
402
    {
403
    return mRegionX;
404
    }
405

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

    
408
  public float getRegionY()
409
    {
410
    return mRegionY;
411
    }
412

    
413
///////////////////////////////////////////////////////////////////////////////////////////////////
414

    
415
  public float getRegionR()
416
    {
417
    return mRegionR;
418
    }
419

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

    
422
  public void Create(View v)
423
    {
424
    DistortedEffects.setMaxVertex(20);    // those have to be called before
425
    DistortedEffects.setMaxFragment(3);   // any DistortedEffect get created!
426

    
427
    if( mObjectType==1 )
428
      {
429
      mMesh = new MeshFlat(mNumCols,mNumRows);
430
      }
431
    else
432
      {
433
      String str = "";
434

    
435
      for(int i=0; i<mNumRows*mNumCols; i++)
436
        str += mShape[i] ? "1" : "0";
437

    
438
      mMesh = new MeshCubes(mNumCols, str, false);
439
      }
440

    
441
    mEffects= new DistortedEffects();
442
    mTexture= new DistortedTexture(mNumCols,mNumRows);
443

    
444
    resetData();
445

    
446
    final View view = getLayoutInflater().inflate(R.layout.effects3dlayout, null);
447

    
448
    setContentView(view);
449

    
450
    String[] effects = new String[mEffectNames.length];
451

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

    
454
    Spinner effectSpinner = (Spinner)findViewById(R.id.effects3dspinner );
455
    effectSpinner.setOnItemSelectedListener(this);
456

    
457
    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, effects);
458
    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
459
    effectSpinner.setAdapter(adapterEffect);
460

    
461
    mEffectAdd = 0;
462
    }
463

    
464
///////////////////////////////////////////////////////////////////////////////////////////////////
465

    
466
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
467
    {
468
    switch(parent.getId())
469
      {
470
      case R.id.objectpicker_spinnerType  : if( mObjectType!=pos )
471
                                              {
472
                                              mObjectType = pos;
473
                                              uncheckAll();
474
                                              }
475
                                            break;
476
      case R.id.objectpicker_spinnerBitmap: switch(pos)
477
                                              {
478
                                              case 0: mBitmapID = -1        ; break;
479
                                              case 1: mBitmapID = R.raw.face; break;
480
                                              case 2: mBitmapID = R.raw.dog ; break;
481
                                              case 3: mBitmapID = R.raw.cat ; break;
482
                                              case 4: mBitmapID = R.raw.grid; break;
483
                                              case 5: mBitmapID = R.raw.bean; break;
484
                                              case 6: mBitmapID = R.raw.monalisa; break;
485
                                              }
486
                                            break;
487
      case R.id.effects3dspinner          : mEffectAdd = pos;
488
                                            break;
489
      }
490
    }
491

    
492
///////////////////////////////////////////////////////////////////////////////////////////////////
493

    
494
  public void onNothingSelected(AdapterView<?> parent)
495
    {
496
    }
497

    
498
///////////////////////////////////////////////////////////////////////////////////////////////////
499

    
500
  public int getWidth()
501
    {
502
    return mTexture==null ? 0: mTexture.getWidth();
503
    }
504

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

    
507
  public int getHeight()
508
    {
509
    return mTexture==null ? 0: mTexture.getHeight();
510
    }
511

    
512
///////////////////////////////////////////////////////////////////////////////////////////////////
513

    
514
  public int getDepth()
515
    {
516
    return mTexture==null ? 0: mTexture.getDepth(mMesh);
517
    }
518

    
519
///////////////////////////////////////////////////////////////////////////////////////////////////
520

    
521
  public int getScreenWidth()
522
    {
523
    return 0;
524
    }
525

    
526
///////////////////////////////////////////////////////////////////////////////////////////////////
527

    
528
  private void resetData()
529
    {
530
    mCenterX = 0.5f*getWidth();
531
    mCenterY = 0.5f*getHeight();
532
    mRegionX = 0;
533
    mRegionY = 0;
534
    mRegionR = getWidth()/2;
535

    
536
    mSupportsRegion = true;
537
    mSupportsCenter =false;
538
    }
539

    
540
///////////////////////////////////////////////////////////////////////////////////////////////////
541
// 'second screen' methods
542

    
543
  public void newEffect(View v)
544
    {
545
    Effects3DEffect eff = new Effects3DEffect(mEffectNames[mEffectAdd], this);
546
    mList.add(eff);
547

    
548
    LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
549
    View view = eff.createView();
550
    layout.addView(view);
551

    
552
    if( mSupportsCenter )
553
      {
554
      View center = eff.createCenter();
555
      layout.addView(center);
556
      }
557

    
558
    if( mSupportsRegion )
559
      {
560
      View region = eff.createRegion();
561
      layout.addView(region);
562
      }
563

    
564
    eff.apply(mEffects);
565
    }
566

    
567
///////////////////////////////////////////////////////////////////////////////////////////////////
568

    
569
  public void removeAll(View v)
570
    {
571
    mList.clear();
572
    LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
573
    layout.removeAllViews();
574
    mEffects.abortEffects(EffectTypes.VERTEX);
575
    mEffects.abortEffects(EffectTypes.FRAGMENT);
576

    
577
    resetData();
578

    
579
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
580
    Effects3DRenderer renderer= view.getRenderer();
581

    
582
    renderer.setCenter( mCenterX, mCenterY, mCenterZ );
583
    renderer.setRegion( mRegionX, mRegionY, mRegionR );
584
    renderer.mQuat1.set(0,0,0,1);
585
    renderer.mQuat2.set(0,0,0,1);
586
    }
587

    
588
///////////////////////////////////////////////////////////////////////////////////////////////////
589

    
590
  public void remove(View v)
591
    {
592
    for(Effects3DEffect effect: mList)
593
      {
594
      if( effect.thisView(v) )
595
        {
596
        LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
597
        View view;
598

    
599
        view = effect.getEffect();
600
        if( view!=null ) layout.removeView(view);
601
        view = effect.getCenter();
602
        if( view!=null ) layout.removeView(view);
603
        view = effect.getRegion();
604
        if( view!=null ) layout.removeView(view);
605

    
606
        mEffects.abortEffect(effect.getId());
607
        mList.remove(effect);
608

    
609
        resetData();
610

    
611
        break;
612
        }
613
      }
614
    }
615

    
616
///////////////////////////////////////////////////////////////////////////////////////////////////
617
// Overrides
618

    
619
  @Override
620
  protected void onPause()
621
    {
622
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
623
    if( mView!=null ) mView.onPause();
624
    super.onPause();
625
    }
626

    
627
///////////////////////////////////////////////////////////////////////////////////////////////////
628
    
629
  @Override
630
  protected void onResume()
631
    {
632
    super.onResume();
633
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
634
    if( mView!=null ) mView.onResume();
635
    }
636

    
637
///////////////////////////////////////////////////////////////////////////////////////////////////
638
    
639
  @Override
640
  public void onWindowFocusChanged(boolean hasFocus)
641
    {
642
    super.onWindowFocusChanged(hasFocus);
643

    
644
    mColsPicker.setValue(mNumCols);
645
    mRowsPicker.setValue(mNumRows);
646

    
647
    if( hasFocus ) setGrid();
648
    }
649

    
650
///////////////////////////////////////////////////////////////////////////////////////////////////
651
    
652
  @Override
653
  protected void onDestroy()
654
    {
655
    Distorted.onDestroy();
656
    super.onDestroy();
657
    }
658

    
659
  }
(1-1/4)