Project

General

Profile

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

examples / src / main / java / org / distorted / examples / effects3d / Effects3DActivity.java @ 0ab55f0c

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.CheckBox;
35
import android.widget.LinearLayout;
36
import android.widget.NumberPicker;
37
import android.widget.Spinner;
38
import android.widget.TableRow;
39

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

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

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

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

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

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

    
82
  private EffectNames[] mEffectNames;
83

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

    
87
  private static boolean mShowCenter = true;
88
  private static boolean mShowRegion = true;
89
  private static boolean mShowNormal = true;
90

    
91
///////////////////////////////////////////////////////////////////////////////////////////////////
92

    
93
  @Override
94
  protected void onCreate(Bundle savedState)
95
    {
96
    super.onCreate(savedState);
97

    
98
    mList = new ArrayList<>();
99

    
100
    createEffectNames();
101

    
102
    setContentView(R.layout.objectpickerlayout);
103

    
104
    mLay = (LinearLayout)findViewById(R.id.objectpicker_buttongrid);
105

    
106
    mColsPicker = (NumberPicker)findViewById(R.id.objectpicker_cols);
107
    mRowsPicker = (NumberPicker)findViewById(R.id.objectpicker_rows);
108

    
109
    mColsPicker.setMaxValue(40);
110
    mColsPicker.setMinValue( 0);
111
    mRowsPicker.setMaxValue(40);
112
    mRowsPicker.setMinValue( 0);
113

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

    
123
    mRowsPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener()
124
         {
125
         @Override
126
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
127
           {
128
           setGrid();
129
           }
130
         });
131

    
132
    mObjectType = 0;
133
    mGridInitialized = false;
134

    
135
    Spinner typeSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerType);
136
    typeSpinner.setOnItemSelectedListener(this);
137

    
138
    String[] objectType = new String[] {"Mesh: Cubes", "Mesh: Flat"};
139

    
140
    ArrayAdapter<String> adapterType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectType);
141
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
142
    typeSpinner.setAdapter(adapterType);
143

    
144
    Spinner bitmapSpinner  = (Spinner)findViewById(R.id.objectpicker_spinnerBitmap);
145
    bitmapSpinner.setOnItemSelectedListener(this);
146

    
147
    String[] objectBitmap = new String[] { "Texture: Grid", "Texture: Girl", "Texture: Dog", "Texture: Cat",
148
                                           "Texture: Squares", "Texture: Bean", "Texture: Lisa" };
149

    
150
    ArrayAdapter<String> adapterBitmap = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectBitmap);
151
    adapterBitmap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
152
    bitmapSpinner.setAdapter(adapterBitmap);
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
  private void createEffectNames()
158
    {
159
    EffectTypes type1 = EffectTypes.FRAGMENT;
160
    EffectTypes type2 = EffectTypes.VERTEX;
161

    
162
    EffectNames[] names = EffectNames.values();
163

    
164
    int numEffects=0;
165

    
166
    for(int i=0; i<names.length; i++)
167
      if( names[i].getType() == type1 || names[i].getType() == type2 ) numEffects++;
168

    
169
    mEffectNames = new EffectNames[numEffects];
170

    
171
    numEffects=0;
172

    
173
    for(int i=0; i<names.length; i++)
174
      if( names[i].getType() == type1 || names[i].getType() == type2 )
175
        {
176
        mEffectNames[numEffects++] = names[i];
177
        }
178
    }
179

    
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181

    
182
  private void setGrid()
183
    {
184
    mGridInitialized = true;
185

    
186
    mNumCols = mColsPicker.getValue();
187
    mNumRows = mRowsPicker.getValue();
188

    
189
    int width = mLay.getWidth();
190
    int height= mLay.getHeight();
191
    int w = mNumCols>0 ? (int)( 0.9f*width / mNumCols) : 0;
192
    int h = mNumRows>0 ? (int)( 0.9f*height/ mNumRows) : 0;
193
    int size= w<h ? w:h;
194
    int pad = size<20 ? 1 : size/20;
195

    
196
    mLay.removeAllViews();
197

    
198
    mShape = new boolean[mNumRows*mNumCols];
199

    
200
    TableRow.LayoutParams p = new TableRow.LayoutParams();
201

    
202
    p.rightMargin  = pad;
203
    p.leftMargin   = pad;
204
    p.topMargin    = pad;
205
    p.bottomMargin = pad;
206
    p.height       = size;
207
    p.width        = size;
208

    
209
    for (int rows=0; rows<mNumRows; rows++)
210
      {
211
      TableRow tr = new TableRow(this);
212
      tr.setGravity(Gravity.CENTER);
213

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

    
225
      mLay.addView(tr);
226
      }
227
    }
228

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

    
231
  public DistortedTexture getTexture()
232
    {
233
    return mTexture;
234
    }
235

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

    
238
  public DistortedEffects getEffects()
239
    {
240
    return mEffects;
241
    }
242

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

    
245
  public MeshObject getMesh()
246
    {
247
    return mMesh;
248
    }
249

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

    
252
  public void setSupportsRegion(boolean supports)
253
    {
254
    mSupportsRegion = supports;
255
    }
256

    
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258

    
259
  public void setSupportsCenter(boolean supports)
260
    {
261
    mSupportsCenter = supports;
262
    }
263

    
264
///////////////////////////////////////////////////////////////////////////////////////////////////
265

    
266
  public Bitmap getBitmap()
267
    {
268
    if( mBitmap==null )
269
      {
270
      if( mBitmapID!=-1)
271
        {
272
        InputStream is = getResources().openRawResource(mBitmapID);
273

    
274
        try
275
          {
276
          mBitmap = BitmapFactory.decodeStream(is);
277
          }
278
        finally
279
          {
280
          try
281
            {
282
            is.close();
283
            }
284
          catch(IOException e) { }
285
          }
286
        }
287
      else
288
        {
289
        final int W = 64*mNumCols;
290
        final int H = 64*mNumRows;
291

    
292
        Paint paint = new Paint();
293
        mBitmap = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
294
        Canvas canvas = new Canvas(mBitmap);
295

    
296
        paint.setAntiAlias(true);
297
        paint.setTextAlign(Paint.Align.CENTER);
298
        paint.setColor(0xff008800);
299
        paint.setStyle(Paint.Style.FILL);
300
        canvas.drawRect(0, 0, W, H, paint);
301
        paint.setColor(0xffffffff);
302

    
303
        for(int i=0; i<=mNumCols ; i++ ) canvas.drawRect(W*i/mNumCols-1, 0, W*i/mNumCols + 1, H, paint);
304
        for(int i=0; i<=mNumRows ; i++ ) canvas.drawRect( 0, H*i/mNumRows-1, W,  H*i/mNumRows+1, paint);
305
        }
306
      }
307

    
308
    return mBitmap;
309
    }
310

    
311
///////////////////////////////////////////////////////////////////////////////////////////////////
312

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

    
324
///////////////////////////////////////////////////////////////////////////////////////////////////
325

    
326
  private void uncheckAll()
327
    {
328
    TableRow tr;
329
    Button butt;
330

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

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

    
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345

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

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

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

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

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

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

    
370
  public float getCenterX()
371
    {
372
    return mCenterX;
373
    }
374

    
375
///////////////////////////////////////////////////////////////////////////////////////////////////
376

    
377
  public float getCenterY()
378
    {
379
    return mCenterY;
380
    }
381

    
382
///////////////////////////////////////////////////////////////////////////////////////////////////
383

    
384
  public float getCenterZ()
385
    {
386
    return mCenterZ;
387
    }
388

    
389
///////////////////////////////////////////////////////////////////////////////////////////////////
390

    
391
  public float getRegionX()
392
    {
393
    return mRegionX;
394
    }
395

    
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397

    
398
  public float getRegionY()
399
    {
400
    return mRegionY;
401
    }
402

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

    
405
  public float getRegionR()
406
    {
407
    return mRegionR;
408
    }
409

    
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411

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

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

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

    
428
      mMesh = new MeshCubes(mNumCols, str, false);
429
      }
430

    
431
    mMesh.setShowNormals(mShowNormal);
432

    
433
    mEffects= new DistortedEffects();
434
    mTexture= new DistortedTexture(mNumCols,mNumRows);
435

    
436
    final View view = getLayoutInflater().inflate(R.layout.effects3dlayout, null);
437

    
438
    setContentView(view);
439

    
440
    String[] effects = new String[mEffectNames.length];
441

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

    
444
    Spinner effectSpinner = (Spinner)findViewById(R.id.effects3dspinner );
445
    effectSpinner.setOnItemSelectedListener(this);
446

    
447
    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, effects);
448
    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
449
    effectSpinner.setAdapter(adapterEffect);
450

    
451
    resetData();
452

    
453
    mEffectAdd = 0;
454
    }
455

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

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

    
484
///////////////////////////////////////////////////////////////////////////////////////////////////
485

    
486
  public void onNothingSelected(AdapterView<?> parent)
487
    {
488
    }
489

    
490
///////////////////////////////////////////////////////////////////////////////////////////////////
491

    
492
  public int getWidth()
493
    {
494
    return mTexture==null ? 0: mTexture.getWidth();
495
    }
496

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

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

    
504
///////////////////////////////////////////////////////////////////////////////////////////////////
505

    
506
  public int getDepth()
507
    {
508
    return mTexture==null ? 0: mTexture.getDepth(mMesh);
509
    }
510

    
511
///////////////////////////////////////////////////////////////////////////////////////////////////
512

    
513
  public int getScreenWidth()
514
    {
515
    return 0;
516
    }
517

    
518
///////////////////////////////////////////////////////////////////////////////////////////////////
519

    
520
  private void resetData()
521
    {
522
    mCenterX = 0.5f*getWidth();
523
    mCenterY = 0.5f*getHeight();
524
    mRegionX = 0;
525
    mRegionY = 0;
526
    mRegionR = getWidth()/2;
527

    
528
    mSupportsRegion =false;
529
    mSupportsCenter =false;
530

    
531
    Effects3DSurfaceView view = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
532
    view.getRenderer().showRegionAndCenter(false,false);
533
    }
534

    
535
///////////////////////////////////////////////////////////////////////////////////////////////////
536
// 'second screen' methods
537

    
538
  public void newEffect(View v)
539
    {
540
    Effects3DEffect eff = new Effects3DEffect(mEffectNames[mEffectAdd], this);
541
    mList.add(eff);
542

    
543
    LinearLayout layout = (LinearLayout)findViewById(R.id.effects3dlayout);
544
    View view = eff.createView();
545
    layout.addView(view);
546

    
547
    if( mSupportsCenter )
548
      {
549
      View center = eff.createCenter();
550
      layout.addView(center);
551
      }
552

    
553
    if( mSupportsRegion )
554
      {
555
      View region = eff.createRegion();
556
      layout.addView(region);
557
      }
558

    
559
    eff.apply(mEffects);
560

    
561
    boolean show = (mEffectNames[mEffectAdd].getType()==EffectTypes.VERTEX);
562
    Effects3DSurfaceView sv = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
563
    sv.getRenderer().showRegionAndCenter( (show && mShowRegion) , (show && mShowCenter) );
564
    }
565

    
566
///////////////////////////////////////////////////////////////////////////////////////////////////
567

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

    
576
    resetData();
577

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

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

    
587
///////////////////////////////////////////////////////////////////////////////////////////////////
588

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

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

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

    
608
        resetData();
609

    
610
        break;
611
        }
612
      }
613
    }
614

    
615
///////////////////////////////////////////////////////////////////////////////////////////////////
616

    
617
    boolean getShowCenter()
618
      {
619
      return mShowCenter;
620
      }
621

    
622
///////////////////////////////////////////////////////////////////////////////////////////////////
623

    
624
    boolean getShowRegion()
625
      {
626
      return mShowRegion;
627
      }
628

    
629
///////////////////////////////////////////////////////////////////////////////////////////////////
630

    
631
    public void showCenter(View view)
632
      {
633
      CheckBox box = (CheckBox)view;
634
      mShowCenter = box.isChecked();
635

    
636
      Effects3DSurfaceView sv = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
637
      sv.getRenderer().showRegionAndCenter(mShowRegion,mShowCenter);
638
      }
639

    
640
///////////////////////////////////////////////////////////////////////////////////////////////////
641

    
642
    public void showRegion(View view)
643
      {
644
      CheckBox box = (CheckBox)view;
645
      mShowRegion = box.isChecked();
646

    
647
      Effects3DSurfaceView sv = (Effects3DSurfaceView)findViewById(R.id.effects3dSurfaceView);
648
      sv.getRenderer().showRegionAndCenter(mShowRegion,mShowCenter);
649
      }
650

    
651
///////////////////////////////////////////////////////////////////////////////////////////////////
652

    
653
    public void showNormal(View view)
654
      {
655
      CheckBox box = (CheckBox)view;
656
      mShowNormal = box.isChecked();
657

    
658
      if ( mMesh!=null )
659
        {
660
        mMesh.setShowNormals(mShowNormal);
661
        }
662
      }
663

    
664
///////////////////////////////////////////////////////////////////////////////////////////////////
665
// Overrides
666

    
667
  @Override
668
  protected void onPause()
669
    {
670
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
671
    if( mView!=null ) mView.onPause();
672

    
673
    Distorted.onPause();
674
    super.onPause();
675
    }
676

    
677
///////////////////////////////////////////////////////////////////////////////////////////////////
678
    
679
  @Override
680
  protected void onResume()
681
    {
682
    super.onResume();
683
    GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
684
    if( mView!=null ) mView.onResume();
685
    }
686

    
687
///////////////////////////////////////////////////////////////////////////////////////////////////
688
    
689
  @Override
690
  public void onWindowFocusChanged(boolean hasFocus)
691
    {
692
    super.onWindowFocusChanged(hasFocus);
693

    
694
    mColsPicker.setValue(mNumCols);
695
    mRowsPicker.setValue(mNumRows);
696

    
697
    if( !mGridInitialized ) setGrid();
698
    }
699

    
700
///////////////////////////////////////////////////////////////////////////////////////////////////
701
    
702
  @Override
703
  protected void onDestroy()
704
    {
705
    Distorted.onDestroy();
706
    super.onDestroy();
707
    }
708

    
709
  }
(1-1/4)