Project

General

Profile

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

examples / src / main / java / org / distorted / examples / effects3d / Effects3DActivity.java @ 334c13fa

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.DistortedBitmap;
42
import org.distorted.library.DistortedCubes;
43
import org.distorted.library.DistortedObject;
44
import org.distorted.library.EffectNames;
45
import org.distorted.library.EffectTypes;
46

    
47
import java.io.IOException;
48
import java.io.InputStream;
49
import java.util.ArrayList;
50

    
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

    
53
public class Effects3DActivity extends Activity
54
                              implements View.OnClickListener,
55
                                         AdapterView.OnItemSelectedListener
56
  {
57
  private static final int COLOR_OFF = 0xffffe81f;
58
  private static final int COLOR_ON  = 0xff0000ff;
59

    
60
  private boolean firstScreen;
61

    
62
  // fields needed for the first 'pick-a-shape' screen
63
  //
64
  private int mNumCols = 10;
65
  private int mNumRows = 10;
66
  private NumberPicker mColsPicker, mRowsPicker;
67
  private boolean[] mShape;
68
  private DistortedObject mObject;
69
  private int mObjectType;
70
  private int mBitmap;
71

    
72
  private ArrayList<Effects3DEffect> mEffects;
73
  private int mEffectAdd;
74
  private float mCenterX, mCenterY, mCenterZ;
75
  private float mRegionX, mRegionY, mRegionR;
76

    
77
  private EffectNames[] mEffectNames;
78

    
79
  private static boolean mSupportsRegion;
80
  private static boolean mSupportsCenter;
81

    
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83

    
84
  @Override
85
  protected void onCreate(Bundle savedState)
86
    {
87
    super.onCreate(savedState);
88

    
89
    mEffects = new ArrayList<>();
90

    
91
    createEffectNames();
92

    
93
    setContentView(R.layout.objectpickerlayout);
94

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

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

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

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

    
121
    firstScreen = true;
122

    
123
    mObjectType = 0;
124

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

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

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

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

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

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

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

    
146
  private void createEffectNames()
147
    {
148
    EffectTypes type1 = EffectTypes.FRAGMENT;
149
    EffectTypes type2 = EffectTypes.VERTEX;
150

    
151
    EffectNames[] names = EffectNames.values();
152

    
153
    int numEffects=0;
154

    
155
    for(int i=0; i<names.length; i++)
156
      if( names[i].getType() == type1 || names[i].getType() == type2 ) numEffects++;
157

    
158
    mEffectNames = new EffectNames[numEffects];
159

    
160
    numEffects=0;
161

    
162
    for(int i=0; i<names.length; i++)
163
      if( names[i].getType() == type1 || names[i].getType() == type2 )
164
        {
165
        mEffectNames[numEffects++] = names[i];
166
        }
167
    }
168

    
169
///////////////////////////////////////////////////////////////////////////////////////////////////
170

    
171
  private void setGrid()
172
    {
173
    LinearLayout lay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
174

    
175
    int width = lay.getWidth();
176
    int height= lay.getHeight();
177
    int w = mNumCols>0 ? (int)( 0.9f*width / mNumCols) : 0;
178
    int h = mNumRows>0 ? (int)( 0.9f*height/ mNumRows) : 0;
179
    int size= w<h ? w:h;
180
    int pad = size<20 ? 1 : size/20;
181

    
182
    lay.removeAllViews();
183

    
184
    mShape = new boolean[mNumRows*mNumCols];
185

    
186
    TableRow.LayoutParams p = new TableRow.LayoutParams();
187

    
188
    p.rightMargin  = pad;
189
    p.leftMargin   = pad;
190
    p.topMargin    = pad;
191
    p.bottomMargin = pad;
192
    p.height       = size;
193
    p.width        = size;
194

    
195
    for (int rows=0; rows<mNumRows; rows++)
196
      {
197
      TableRow tr = new TableRow(this);
198
      tr.setGravity(Gravity.CENTER);
199

    
200
      for(int cols=0; cols<mNumCols; cols++)
201
        {
202
        Button b = new Button(this);
203
        b.setOnClickListener(this);
204
        b.setId(rows*mNumCols+cols);
205
        b.setLayoutParams(p);
206
        b.setBackgroundColor(COLOR_ON);
207
        tr.addView(b, p);
208
        mShape[rows*mNumCols+cols] = true;
209
        }
210

    
211
      lay.addView(tr);
212
      }
213
    }
214

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

    
217
  public DistortedObject getObject()
218
    {
219
    return mObject;
220
    }
221

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

    
224
  public static void setSupportsRegion(boolean supports)
225
    {
226
    mSupportsRegion = supports;
227
    }
228

    
229
///////////////////////////////////////////////////////////////////////////////////////////////////
230

    
231
  public static boolean supportsRegion()
232
    {
233
    return mSupportsRegion;
234
    }
235

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

    
238
  public static void setSupportsCenter(boolean supports)
239
    {
240
    mSupportsCenter = supports;
241
    }
242

    
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244

    
245
  public static boolean supportsCenter()
246
    {
247
    return mSupportsCenter;
248
    }
249

    
250
///////////////////////////////////////////////////////////////////////////////////////////////////
251

    
252
  public Bitmap getBitmap()
253
    {
254
    Bitmap bmp;
255

    
256
    if( mBitmap!=-1)
257
      {
258
      InputStream is = getResources().openRawResource(mBitmap);
259

    
260
      try
261
        {
262
        bmp = BitmapFactory.decodeStream(is);
263
        }
264
      finally
265
        {
266
        try
267
          {
268
          is.close();
269
          }
270
        catch(IOException e) { }
271
        }
272
      }
273
    else
274
      {
275
      final int W = 640;
276
      final int H = 640;
277

    
278
      Paint paint = new Paint();
279
      bmp = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
280
      Canvas canvas = new Canvas(bmp);
281

    
282
      paint.setAntiAlias(true);
283
      paint.setTextAlign(Paint.Align.CENTER);
284
      paint.setColor(0xff008800);
285
      paint.setStyle(Paint.Style.FILL);
286
      canvas.drawRect(0, 0, W, H, paint);
287
      paint.setColor(0xffffffff);
288

    
289
      for(int i=0; i<=mNumCols ; i++ )
290
        {
291
        canvas.drawRect(W*i/mNumCols - 1,                0,  W*i/mNumCols + 1,  H               , paint);
292
        canvas.drawRect(               0, H *i/mNumCols -1,  W               ,  H*i/mNumCols + 1, paint);
293
        }
294
      }
295

    
296
    return bmp;
297
    }
298

    
299
///////////////////////////////////////////////////////////////////////////////////////////////////
300

    
301
  public void onClick(View view)
302
    {
303
    Button tmp = (Button)view;
304
    int id = tmp.getId();
305
    mShape[id] = !mShape[id];
306
    tmp.setBackgroundColor(mShape[id] ? COLOR_ON:COLOR_OFF);
307
    }
308

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

    
311
  public void setRegion(float x, float y, float r)
312
    {
313
    mRegionX = x;
314
    mRegionY =-y;
315
    mRegionR = r;
316

    
317
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
318

    
319
    view.getRenderer().setRegion(mRegionX, mRegionY, mRegionR);
320
    }
321

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

    
324
  public void setCenter(float x, float y, float z)
325
    {
326
    mCenterX = x;
327
    mCenterY = y;
328
    mCenterZ = z;
329

    
330
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
331

    
332
    view.getRenderer().setCenter( mCenterX, mCenterY, mCenterZ );
333
    }
334

    
335
///////////////////////////////////////////////////////////////////////////////////////////////////
336

    
337
  public float getCenterX()
338
    {
339
    return mCenterX;
340
    }
341

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

    
344
  public float getCenterY()
345
    {
346
    return mCenterY;
347
    }
348

    
349
///////////////////////////////////////////////////////////////////////////////////////////////////
350

    
351
  public float getCenterZ()
352
    {
353
    return mCenterZ;
354
    }
355

    
356
///////////////////////////////////////////////////////////////////////////////////////////////////
357

    
358
  public float getRegionX()
359
    {
360
    return mRegionX;
361
    }
362

    
363
///////////////////////////////////////////////////////////////////////////////////////////////////
364

    
365
  public float getRegionY()
366
    {
367
    return mRegionY;
368
    }
369

    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371

    
372
  public float getRegionR()
373
    {
374
    return mRegionR;
375
    }
376

    
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378

    
379
  public void Continue(View v)
380
    {
381
    firstScreen = false;
382

    
383
    if( mObjectType==1 )
384
      {
385
      mObject = new DistortedBitmap(100,100,mNumCols);
386
      setEffectView();
387
      }
388
    else
389
      {
390
      View view = getLayoutInflater().inflate(R.layout.objectpicker2layout, null);
391

    
392
      setContentView(view);
393

    
394
      view.post(new Runnable() {
395
            @Override
396
            public void run() {
397
              setGrid();
398
            }
399
        });
400
      }
401
    }
402

    
403
///////////////////////////////////////////////////////////////////////////////////////////////////
404

    
405
  public void Create(View v)
406
    {
407
    firstScreen = false;
408

    
409
    String str = "";
410

    
411
    for(int i=0; i<mNumRows*mNumCols; i++)
412
      str += mShape[i] ? "1" : "0";
413

    
414
    mObject = new DistortedCubes(mNumCols, str, 10);
415

    
416
    setEffectView();
417
    }
418

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

    
421
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
422
    {
423
    switch(parent.getId())
424
      {
425
      case R.id.objectpicker_spinnerType  : mObjectType = pos;
426
                                            break;
427
      case R.id.objectpicker_spinnerBitmap: switch(pos)
428
                                              {
429
                                              case 0: mBitmap = -1        ; break;
430
                                              case 1: mBitmap = R.raw.face; break;
431
                                              case 2: mBitmap = R.raw.dog;  break;
432
                                              case 3: mBitmap = R.raw.cat;  break;
433
                                              case 4: mBitmap = R.raw.grid; break;
434
                                              }
435
                                            break;
436
      case R.id.effects3dspinner          : mEffectAdd = pos;
437
                                            break;
438
      }
439
    }
440

    
441
///////////////////////////////////////////////////////////////////////////////////////////////////
442

    
443
  public void onNothingSelected(AdapterView<?> parent)
444
    {
445
    }
446

    
447
///////////////////////////////////////////////////////////////////////////////////////////////////
448

    
449
  public int getWidth()
450
    {
451
    return mObject==null ? 0: mObject.getWidth();
452
    }
453

    
454
///////////////////////////////////////////////////////////////////////////////////////////////////
455

    
456
  public int getHeight()
457
    {
458
    return mObject==null ? 0: mObject.getHeight();
459
    }
460

    
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462

    
463
  public int getDepth()
464
    {
465
    return mObject==null ? 0: mObject.getDepth();
466
    }
467

    
468
///////////////////////////////////////////////////////////////////////////////////////////////////
469

    
470
  public int getScreenWidth()
471
    {
472
    return 0;
473
    }
474

    
475
///////////////////////////////////////////////////////////////////////////////////////////////////
476

    
477
  public int getScreenHeight()
478
    {
479
    return 0;
480
    }
481

    
482
///////////////////////////////////////////////////////////////////////////////////////////////////
483

    
484
  private void resetData()
485
    {
486
    mCenterX = 0.5f*getWidth();
487
    mCenterY = 0.5f*getHeight();
488
    mRegionX = 0;
489
    mRegionY = 0;
490
    mRegionR = getWidth()/2;
491

    
492
    mSupportsRegion = true;
493
    mSupportsCenter =false;
494
    }
495

    
496
///////////////////////////////////////////////////////////////////////////////////////////////////
497
// 'second screen' methods
498

    
499
  private void setEffectView()
500
    {
501
    resetData();
502

    
503
    final View view = getLayoutInflater().inflate(R.layout.effects3dlayout, null);
504

    
505
    setContentView(view);
506

    
507
    String[] effects = new String[mEffectNames.length];
508

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

    
511
    Spinner effectSpinner = (Spinner)findViewById(R.id.effects3dspinner );
512
    effectSpinner.setOnItemSelectedListener(this);
513

    
514
    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, effects);
515
    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
516
    effectSpinner.setAdapter(adapterEffect);
517

    
518
    mEffectAdd = 0;
519
    }
520

    
521
///////////////////////////////////////////////////////////////////////////////////////////////////
522

    
523
  public void newEffect(View v)
524
    {
525
    Effects3DEffect eff = new Effects3DEffect(mEffectNames[mEffectAdd], this);
526
    mEffects.add(eff);
527

    
528
    LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
529
    View view = eff.createView();
530
    layout.addView(view);
531

    
532
    if( mSupportsCenter )
533
      {
534
      View center = eff.createCenter();
535
      layout.addView(center);
536
      }
537

    
538
    if( mSupportsRegion )
539
      {
540
      View region = eff.createRegion();
541
      layout.addView(region);
542
      }
543

    
544
    eff.apply(mObject);
545
    }
546

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

    
549
  public void removeAll(View v)
550
    {
551
    mEffects.clear();
552
    LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
553
    layout.removeAllViews();
554
    mObject.abortEffects(EffectTypes.VERTEX);
555
    mObject.abortEffects(EffectTypes.FRAGMENT);
556

    
557
    resetData();
558

    
559
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
560
    Effects3DRenderer renderer= view.getRenderer();
561

    
562
    renderer.setCenter( mCenterX, mCenterY, mCenterZ );
563
    renderer.setRegion( mRegionX, mRegionY, mRegionR );
564
    renderer.mQuat1.set(0,0,0,1);
565
    renderer.mQuat2.set(0,0,0,1);
566
    }
567

    
568
///////////////////////////////////////////////////////////////////////////////////////////////////
569

    
570
  public void remove(View v)
571
    {
572
    for(Effects3DEffect effect: mEffects)
573
      {
574
      if( effect.thisView(v) )
575
        {
576
        LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
577
        View view;
578

    
579
        view = effect.getEffect();
580
        if( view!=null ) layout.removeView(view);
581
        view = effect.getCenter();
582
        if( view!=null ) layout.removeView(view);
583
        view = effect.getRegion();
584
        if( view!=null ) layout.removeView(view);
585

    
586
        long id = effect.getId();
587
        mObject.abortEffect(id);
588
        mEffects.remove(effect);
589

    
590
        resetData();
591

    
592
        break;
593
        }
594
      }
595
    }
596

    
597
///////////////////////////////////////////////////////////////////////////////////////////////////
598
// Overrides
599

    
600
  @Override
601
  protected void onPause()
602
    {
603
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
604
    if( mView!=null ) mView.onPause();
605
    super.onPause();
606
    }
607

    
608
///////////////////////////////////////////////////////////////////////////////////////////////////
609
    
610
  @Override
611
  protected void onResume()
612
    {
613
    super.onResume();
614
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
615
    if( mView!=null ) mView.onResume();
616
    }
617

    
618
///////////////////////////////////////////////////////////////////////////////////////////////////
619
    
620
  @Override
621
  public void onWindowFocusChanged(boolean hasFocus)
622
    {
623
    super.onWindowFocusChanged(hasFocus);
624

    
625
    if( firstScreen )
626
      {
627
      mColsPicker.setValue(mNumCols);
628
      mRowsPicker.setValue(mNumRows);
629
      }
630
    }
631

    
632
///////////////////////////////////////////////////////////////////////////////////////////////////
633
    
634
  @Override
635
  protected void onDestroy()
636
    {
637
    Distorted.onDestroy();
638
    super.onDestroy();
639
    }
640

    
641
  }
(1-1/4)