Project

General

Profile

« Previous | Next » 

Revision f2abba90

Added by Leszek Koltunski about 3 years ago

effects,fastscramble,objectchange: license.

View differences:

src/main/java/org/distorted/objectlib/automator/ObjectAutomator.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube 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
// Magic Cube 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 Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

  
20
package org.distorted.objectlib.automator;
21

  
22
import java.lang.ref.WeakReference;
23

  
24
import android.app.Activity;
25

  
26
import org.distorted.library.main.DistortedFramebuffer;
27
import org.distorted.library.main.DistortedNode;
28
import org.distorted.library.message.EffectListener;
29
import org.distorted.library.type.Static4D;
30

  
31
import org.distorted.objectlib.helpers.ObjectLibInterface;
32
import org.distorted.objectlib.main.ObjectControl;
33
import org.distorted.objectlib.helpers.BlockController;
34
import org.distorted.objectlib.main.TwistyObject;
35

  
36
///////////////////////////////////////////////////////////////////////////////////////////////////
37

  
38
public class ObjectAutomator implements EffectListener
39
  {
40
  private static ObjectAutomator mControl;
41
  private final ObjectControl mObjectControl;
42

  
43
  WeakReference<Activity> mRefAct;
44
  boolean mWholeReturned, mRotateReturned;
45

  
46
  ObjectAutomatorWhole mWhole;
47
  ObjectAutomatorRotate mRotate;
48

  
49
///////////////////////////////////////////////////////////////////////////////////////////////////
50

  
51
  DistortedFramebuffer getFramebuffer()
52
    {
53
    return mObjectControl.getNode().getFramebuffer();
54
    }
55

  
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57

  
58
  ObjectControl getObjectControl()
59
    {
60
    return mObjectControl;
61
    }
62

  
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

  
65
  Static4D getQuat()
66
    {
67
    return mObjectControl.getQuat();
68
    }
69

  
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

  
72
  TwistyObject getObject()
73
    {
74
    return mObjectControl.getObject();
75
    }
76

  
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78

  
79
  private void addWholeObjects()
80
    {
81
    DistortedFramebuffer frame = getFramebuffer();
82
    DistortedNode[] nodes = mWhole.getNodes();
83

  
84
    if( frame!=null && nodes!=null )
85
      {
86
      for (DistortedNode node : nodes) frame.attach(node);
87
      }
88
    }
89

  
90
///////////////////////////////////////////////////////////////////////////////////////////////////
91

  
92
  private void removeWholeObjects()
93
    {
94
    DistortedFramebuffer frame = getFramebuffer();
95
    DistortedNode[] nodes = mWhole.returnNodes();
96

  
97
    if( frame!=null && nodes!=null )
98
      {
99
      for (DistortedNode node : nodes) frame.detach(node);
100
      }
101
    }
102

  
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

  
105
  private void addRotateObjects()
106
    {
107
    DistortedFramebuffer frame = getFramebuffer();
108
    DistortedNode[] screenNodes = mRotate.getScreenNodes();
109

  
110
    if( frame!=null && screenNodes!=null )
111
      {
112
      for (DistortedNode node : screenNodes) frame.attach(node);
113
      }
114

  
115
    DistortedNode object = mObjectControl.getObject().getNode();
116
    DistortedNode[] objectNodes = mRotate.getObjectNodes();
117

  
118
    if( object!=null && objectNodes!=null )
119
      {
120
      for (DistortedNode node : objectNodes) object.attach(node);
121
      }
122
    }
123

  
124
///////////////////////////////////////////////////////////////////////////////////////////////////
125

  
126
  private void removeRotateObjects()
127
    {
128
    DistortedFramebuffer frame = getFramebuffer();
129
    DistortedNode[] screenNodes = mRotate.returnScreenNodes();
130

  
131
    if( frame!=null && screenNodes!=null )
132
      {
133
      for (DistortedNode node : screenNodes) frame.detach(node);
134
      }
135

  
136
    DistortedNode object = mObjectControl.getObject().getNode();
137
    DistortedNode[] objectNodes = mRotate.returnObjectNodes();
138

  
139
    if( object!=null && objectNodes!=null )
140
      {
141
      for (DistortedNode node : objectNodes) object.detach(node);
142
      }
143
    }
144

  
145
///////////////////////////////////////////////////////////////////////////////////////////////////
146

  
147
  private void finishWhole()
148
    {
149
    removeWholeObjects();
150
    mWholeReturned = true;
151
    if( !mRotateReturned ) addRotateObjects();
152
    }
153

  
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155

  
156
  private void finishRotate()
157
    {
158
    removeRotateObjects();
159
    mRotateReturned= true;
160
    mObjectControl.unblockEverything();
161
    }
162

  
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164

  
165
  Activity getActivity()
166
    {
167
    return mRefAct.get();
168
    }
169

  
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171

  
172
  private ObjectAutomator(ObjectControl control)
173
    {
174
    mObjectControl = control;
175

  
176
    mWhole = new ObjectAutomatorWhole(this);
177
    mRotate= new ObjectAutomatorRotate(this);
178
    }
179

  
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181
// PUBLIC
182

  
183
  public static ObjectAutomator getInstance(ObjectControl control)
184
    {
185
    if( mControl==null ) mControl = new ObjectAutomator(control);
186

  
187
    return mControl;
188
    }
189

  
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

  
192
  public void postDrawFrame(long time)
193
    {
194
    mWhole.postDrawFrame(time);
195
    }
196

  
197
///////////////////////////////////////////////////////////////////////////////////////////////////
198

  
199
  public void effectFinished(long effectID)
200
    {
201
    if( effectID==mWhole.getEffectID()  ) finishWhole();
202
    if( effectID==mRotate.getEffectID() ) finishRotate();
203
    }
204

  
205
///////////////////////////////////////////////////////////////////////////////////////////////////
206

  
207
  public void animateAll(Activity act)
208
    {
209
    mObjectControl.blockEverything(BlockController.CONTROL_PLACE_0);
210
    mRefAct = new WeakReference<>(act);
211

  
212
    mWholeReturned = false;
213
    mRotateReturned= false;
214

  
215
    addWholeObjects();
216
    }
217

  
218
///////////////////////////////////////////////////////////////////////////////////////////////////
219

  
220
  public void animateRotate(Activity act)
221
    {
222
    mObjectControl.blockEverything(BlockController.CONTROL_PLACE_1);
223
    mRefAct = new WeakReference<>(act);
224

  
225
    mWholeReturned = true;
226
    mRotateReturned= false;
227

  
228
    addRotateObjects();
229
    }
230
  }
src/main/java/org/distorted/objectlib/automator/ObjectAutomatorRotate.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube 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
// Magic Cube 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 Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

  
20
package org.distorted.objectlib.automator;
21

  
22
import java.io.IOException;
23
import java.io.InputStream;
24

  
25
import android.app.Activity;
26
import android.graphics.Bitmap;
27
import android.graphics.BitmapFactory;
28

  
29
import org.distorted.library.effect.MatrixEffectQuaternion;
30
import org.distorted.library.effect.MatrixEffectScale;
31
import org.distorted.library.main.DistortedEffects;
32
import org.distorted.library.main.DistortedFramebuffer;
33
import org.distorted.library.main.DistortedNode;
34
import org.distorted.library.main.DistortedTexture;
35
import org.distorted.library.mesh.MeshQuad;
36
import org.distorted.library.message.EffectListener;
37
import org.distorted.library.type.Dynamic;
38
import org.distorted.library.type.Dynamic3D;
39
import org.distorted.library.type.Dynamic4D;
40
import org.distorted.library.type.Static3D;
41
import org.distorted.library.type.Static4D;
42
import org.distorted.library.main.QuatHelper;
43

  
44
import org.distorted.objectlib.R;
45
import org.distorted.objectlib.main.TwistyObject;
46

  
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48

  
49
class ObjectAutomatorRotate implements EffectListener
50
  {
51
  private static final int NUM_SCREEN = 0;
52
  private static final int NUM_OBJECT = 1;
53

  
54
  private static Static4D INIT_QUAT;
55

  
56
  private final ObjectAutomator mControl;
57
  private DistortedEffects[] mScreenEffects, mObjectEffects;
58
  private DistortedNode[] mScreenNodes, mObjectNodes;
59
  private long mScreenEffectID, mObjectEffectID, mCubeEffectID;
60
  private Static4D mObjRotQuat;
61

  
62
  private Dynamic3D mDynamic3;
63
  private Dynamic4D mDynamic4;
64
  private MatrixEffectScale mScale;
65
  private MatrixEffectQuaternion mQuaternion;
66
  private MeshQuad mScreenQuad, mObjectQuad;
67

  
68
///////////////////////////////////////////////////////////////////////////////////////////////////
69

  
70
   private Bitmap openBitmap(Activity act, int resource)
71
     {
72
     try( InputStream is = act.getResources().openRawResource(resource) )
73
       {
74
       return BitmapFactory.decodeStream(is);
75
       }
76
     catch( IOException e )
77
       {
78
       // ignore
79
       }
80

  
81
     return null;
82
     }
83

  
84
///////////////////////////////////////////////////////////////////////////////////////////////////
85

  
86
  private void computeInitQuat()
87
    {
88
    double alphaZ = 0;//-Math.PI* 0.1250f;
89
    double alphaY = 0;//-Math.PI* 0.0625f;
90

  
91
    alphaY /= 2;
92
    alphaZ /= 2;
93

  
94
    float sinZ = (float)Math.sin(alphaZ);
95
    float cosZ = (float)Math.cos(alphaZ);
96
    float sinY = (float)Math.sin(alphaY);
97
    float cosY = (float)Math.cos(alphaY);
98

  
99
    Static4D qZ = new Static4D(0,0,sinZ,cosZ);
100
    Static4D qY = new Static4D(0,sinY,0,cosY);
101

  
102
    INIT_QUAT = QuatHelper.quatMultiply(qY,qZ);
103
    }
104

  
105
///////////////////////////////////////////////////////////////////////////////////////////////////
106
// Take 3D vector 'ax', rotate it by quaternion 'objQuat' to get vector V1.
107
// Take 3D vector (1,0,0) and rotate it by INIT_QUAT to get vector V2.
108
// Return a quaternion Q such that if we rotate V1 by Q, we get V2.
109

  
110
  private Static4D computeQuat(Static3D ax, Static4D objQuat, float x, float y, float z)
111
    {
112
    Static4D ax4D = new Static4D( ax.get0(), ax.get1(), ax.get2(), 0);
113
    Static4D axRo = QuatHelper.rotateVectorByQuat(ax4D,objQuat);
114
    return QuatHelper.retRotationQuat(axRo.get0(),axRo.get1(),axRo.get2(),x,y,z);
115
    }
116

  
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118

  
119
  private void computeRotQuat()
120
    {
121
    TwistyObject object = mControl.getObject();
122
    Static3D[] axis = object.getRotationAxis();
123
    int chosen=-1,numAxis = axis.length;
124
    float cos,maxCos = -1.0f;
125
    Static4D quat;
126

  
127
    Static4D objCurrQuat = mControl.getQuat();
128
    Static4D axisX = new Static4D(1,0,0,0);
129
    Static4D rotAxisX = QuatHelper.rotateVectorByQuat(axisX,INIT_QUAT);
130

  
131
    float axX = rotAxisX.get0();
132
    float axY = rotAxisX.get1();
133
    float axZ = rotAxisX.get2();
134

  
135
    for (int a=0; a<numAxis; a++)
136
      {
137
      quat = computeQuat(axis[a],objCurrQuat,axX,axY,axZ);
138
      cos = quat.get3();
139

  
140
android.util.Log.e("D", "axis="+a+" "+quat.get0()+" "+quat.get1()+" "+quat.get2()+" "+quat.get3() );
141

  
142
      if (cos > maxCos)
143
        {
144
        maxCos = cos;
145
        chosen = a;
146
        if( mObjRotQuat==null ) mObjRotQuat = new Static4D(quat);
147
        else mObjRotQuat.set(quat);
148
        }
149
      }
150

  
151
    android.util.Log.e("D", "axis chosen: "+chosen);
152

  
153

  
154
android.util.Log.e("D", mObjRotQuat.get0()+" "+mObjRotQuat.get1()+" "+mObjRotQuat.get2()+" "+mObjRotQuat.get3() );
155
    }
156

  
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158

  
159
  private void setScreenEffectsStage1()
160
    {
161
    mDynamic3.resetToBeginning();
162
    mScale.notifyWhenFinished(mControl);
163
    }
164

  
165
///////////////////////////////////////////////////////////////////////////////////////////////////
166
// the whole cube rotates so that its axis is alignled according to the Euler angles defined in
167
// computeInitQuat()
168

  
169
  private void setObjectEffectsStage1()
170
    {
171
    TwistyObject obj = mControl.getObject();
172
    obj.apply(mQuaternion,0);
173
    mDynamic4.resetToBeginning();
174
    mQuaternion.notifyWhenFinished(this);
175

  
176

  
177
Static4D d = mDynamic4.getPoint(1);
178

  
179
android.util.Log.e("D", "set: "+d.get0()+" "+d.get1()+" "+d.get2()+" "+d.get3() );
180

  
181
    }
182

  
183
///////////////////////////////////////////////////////////////////////////////////////////////////
184

  
185
  private void setObjectEffectsStage2()
186
    {
187

  
188
    }
189

  
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

  
192
  private void createScreenEffects()
193
    {
194
    mScreenEffects   = new DistortedEffects[NUM_SCREEN];
195
    mScreenEffects[0]= new DistortedEffects();
196

  
197
    DistortedFramebuffer frame = mControl.getFramebuffer();
198
    int wid = frame.getWidth();
199

  
200
    Static3D scaleStart= new Static3D(1,1,1);
201
    Static3D scaleEnd  = new Static3D(wid,wid,wid);
202

  
203
    mDynamic3 = new Dynamic3D(10000,0.5f);
204
    mDynamic3.add(scaleStart);
205
    mDynamic3.add(scaleEnd  );
206
    mDynamic3.add(scaleStart);
207
    mDynamic3.setMode(Dynamic.MODE_PATH);
208

  
209
    mScale = new MatrixEffectScale(mDynamic3);
210
    mScreenEffectID = mScale.getID();
211
    mScreenEffects[0].apply(mScale);
212
    }
213

  
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215

  
216
  private void createObjectEffects()
217
    {
218
    mObjectEffects   = new DistortedEffects[NUM_OBJECT];
219
    mObjectEffects[0]= new DistortedEffects();
220

  
221
    mDynamic4 = new Dynamic4D(5000,0.5f);
222
    mDynamic4.add(new Static4D(0,0,0,1));
223
    mDynamic4.add(mObjRotQuat);
224
    mDynamic4.add(mObjRotQuat);
225
    mDynamic4.add(mObjRotQuat);
226
    mDynamic4.setMode(Dynamic.MODE_PATH);
227

  
228
android.util.Log.e("D", "create: "+mObjRotQuat.get0()+" "+mObjRotQuat.get1()+" "+mObjRotQuat.get2()+" "+mObjRotQuat.get3() );
229

  
230
TwistyObject obj = mControl.getObject();
231
Static3D ax = obj.getRotationAxis()[0];
232
Static4D axis = new Static4D(ax.get0(), ax.get1(), ax.get2(), 0);
233

  
234
Static4D v1 = QuatHelper.rotateVectorByQuat( new Static4D(1,0,0,0), INIT_QUAT);
235
Static4D v2 = QuatHelper.rotateVectorByQuat( axis                 , mObjRotQuat);
236

  
237
android.util.Log.e("D", "v1: "+v1.get0()+" "+v1.get1()+" "+v1.get2()+" "+v1.get3());
238
android.util.Log.e("D", "v2: "+v2.get0()+" "+v2.get1()+" "+v2.get2()+" "+v2.get3());
239
android.util.Log.e("D", "ax: "+ax.get0()+" "+ax.get1()+" "+ax.get2());
240

  
241

  
242
    Static3D center = new Static3D(0,0,0);
243
    mQuaternion = new MatrixEffectQuaternion(mDynamic4, center);
244
    mCubeEffectID = mQuaternion.getID();
245

  
246
    DistortedFramebuffer frame = mControl.getFramebuffer();
247
    int wid = frame.getWidth();
248
    Static3D scaleFactor = new Static3D(wid,wid*0.1f,10);
249
    MatrixEffectScale scale = new MatrixEffectScale(scaleFactor);
250
    MatrixEffectQuaternion quat = new MatrixEffectQuaternion(INIT_QUAT,center);
251

  
252
    mObjectEffects[0].apply(scale);
253
    mObjectEffects[0].apply(quat);
254
    }
255

  
256
///////////////////////////////////////////////////////////////////////////////////////////////////
257

  
258
  private void createScreenNodes()
259
    {
260
    if( mScreenNodes==null )
261
      {
262
      mScreenNodes= new DistortedNode[NUM_SCREEN];
263
      mScreenQuad = new MeshQuad();
264
      }
265

  
266
    DistortedTexture texture = new DistortedTexture();
267
    texture.setColorARGB(0xff00ff00);
268
    mScreenNodes[0] = new DistortedNode(texture, mScreenEffects[0], mScreenQuad);
269
    }
270

  
271
///////////////////////////////////////////////////////////////////////////////////////////////////
272

  
273
  private void createObjectNodes()
274
    {
275
    if( mObjectNodes==null )
276
      {
277
      mObjectNodes= new DistortedNode[NUM_OBJECT];
278
      mObjectQuad = new MeshQuad();
279
      }
280

  
281
    Activity act = mControl.getActivity();
282

  
283
    if( act!=null )
284
      {
285
      Bitmap bmpArrow = openBitmap(act, R.drawable.ui_axis_arrow);
286
      DistortedTexture textureArrow = new DistortedTexture();
287

  
288
      if( bmpArrow!=null ) textureArrow.setTexture(bmpArrow);
289

  
290
      mObjectNodes[0] = new DistortedNode(textureArrow, mObjectEffects[0], mObjectQuad);
291
      }
292
    else
293
      {
294
      android.util.Log.e("D", "Activity NULL!!");
295
      }
296
    }
297

  
298
///////////////////////////////////////////////////////////////////////////////////////////////////
299

  
300
  long getEffectID()
301
    {
302
    return mObjectEffectID;
303
    }
304

  
305
///////////////////////////////////////////////////////////////////////////////////////////////////
306

  
307
  DistortedNode[] getScreenNodes()
308
    {
309
    if( NUM_SCREEN>0 )
310
      {
311
      if( mScreenEffects==null ) createScreenEffects();
312
      createScreenNodes();
313
      setScreenEffectsStage1();
314
      }
315

  
316
    return mScreenNodes;
317
    }
318

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

  
321
  DistortedNode[] returnScreenNodes()
322
    {
323
    return mScreenNodes;
324
    }
325

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

  
328
   DistortedNode[] getObjectNodes()
329
    {
330
    if( NUM_OBJECT>0 )
331
      {
332
      if( INIT_QUAT==null ) computeInitQuat();
333
      computeRotQuat();
334
      if( mObjectEffects==null ) createObjectEffects();
335
      createObjectNodes();
336
      setObjectEffectsStage1();
337
      }
338

  
339
    return mObjectNodes;
340
    }
341

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

  
344
   DistortedNode[] returnObjectNodes()
345
    {
346
    return mObjectNodes;
347
    }
348

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

  
351
  ObjectAutomatorRotate(ObjectAutomator control)
352
    {
353
    mControl = control;
354
    }
355

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

  
358
  @Override
359
  public void effectFinished(long effectID)
360
    {
361
    if( effectID==mCubeEffectID)
362
      {
363
      setObjectEffectsStage2();
364

  
365
      TwistyObject obj = mControl.getObject();
366
      obj.remove(mCubeEffectID);
367
      mObjectEffectID = -1;
368
      mControl.effectFinished(mObjectEffectID);
369
      }
370
    }
371
  }
src/main/java/org/distorted/objectlib/automator/ObjectAutomatorWhole.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube 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
// Magic Cube 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 Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

  
20
package org.distorted.objectlib.automator;
21

  
22
import java.io.IOException;
23
import java.io.InputStream;
24

  
25
import android.app.Activity;
26
import android.graphics.Bitmap;
27
import android.graphics.BitmapFactory;
28

  
29
import org.distorted.library.effect.MatrixEffectMove;
30
import org.distorted.library.effect.MatrixEffectScale;
31
import org.distorted.library.main.DistortedEffects;
32
import org.distorted.library.main.DistortedFramebuffer;
33
import org.distorted.library.main.DistortedNode;
34
import org.distorted.library.main.DistortedTexture;
35
import org.distorted.library.mesh.MeshQuad;
36
import org.distorted.library.type.Dynamic;
37
import org.distorted.library.type.Dynamic3D;
38
import org.distorted.library.type.Static3D;
39

  
40
import org.distorted.objectlib.R;
41
import org.distorted.objectlib.main.ObjectControl;
42

  
43
///////////////////////////////////////////////////////////////////////////////////////////////////
44

  
45
class ObjectAutomatorWhole
46
  {
47
  private static final int NUM_NODE = 4;
48
  private static final int NUM_EFFE = 4;
49

  
50
  private static final int D1 = 2600; // time it takes for the finger to appear
51
  private static final int D2 =  250; // finger press
52
  private static final int D3 =10000; // finger triangle
53
  private static final int D4 = 3000; // fingers approach
54
  private static final int D5 = 8000; // fingers circle
55

  
56
  private static final int[] DUR = { D1, D2, D3, D2, D1/4, 3*D1/4, D1/4, D2, D4, D5, D4, D2, D1 };
57
  private static final int[] DYN = { 2, 1, 1, 1, 2, 2, 4, 2, 2, 2, 2, 2, 4};
58

  
59
  private float X0, X1, X2, Y1, D, s001, s014, s033, F;
60
  private int mWidth, mHeight;
61

  
62
  private final ObjectAutomator mControl;
63
  private DistortedEffects[] mEffects;
64
  private DistortedNode[] mNodes;
65
  private long mEffectID;
66
  private int mCurrentStage;
67

  
68
  private MeshQuad mQuad;
69
  private DistortedTexture mTextureShad, mTextureCirc;
70
  private Dynamic3D mDynMoveHand1, mDynMoveShad1;
71
  private Dynamic3D mDynScaleHand1, mDynScaleShad1;
72
  private Dynamic3D mDynMoveHand2, mDynMoveShad2;
73
  private Dynamic3D mDynScaleHand2, mDynScaleShad2;
74
  private Dynamic3D mDyn1, mDyn2, mDyn3, mDyn4;
75
  private Static3D mPosition1, mPosition2, mPosition3, mPosition4;
76
  private float[] tmpBuffer;
77
  private long mLastTime, mDiffTime;
78

  
79
///////////////////////////////////////////////////////////////////////////////////////////////////
80

  
81
   private void setPostFrame(boolean on)
82
     {
83
     Activity act = mControl.getActivity();
84
  //   act.setControlState(on);
85
     mLastTime = -1;
86
     }
87

  
88
///////////////////////////////////////////////////////////////////////////////////////////////////
89

  
90
   private Bitmap openBitmap(Activity act, int resource)
91
     {
92
     try( InputStream is = act.getResources().openRawResource(resource) )
93
       {
94
       return BitmapFactory.decodeStream(is);
95
       }
96
     catch( IOException e )
97
       {
98
       // ignore
99
       }
100

  
101
     return null;
102
     }
103

  
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105

  
106
  private void resetDynamics1(int stage)
107
    {
108
    int dur = DUR[stage-1];
109

  
110
    mDynMoveHand1.removeAll();
111
    mDynMoveShad1.removeAll();
112
    mDynScaleHand1.removeAll();
113
    mDynScaleShad1.removeAll();
114

  
115
    mDynMoveHand1.setDuration(dur);
116
    mDynMoveShad1.setDuration(dur);
117
    mDynScaleHand1.setDuration(dur);
118
    mDynScaleShad1.setDuration(dur);
119
    mDynMoveHand1.resetToBeginning();
120
    mDynMoveShad1.resetToBeginning();
121
    mDynScaleHand1.resetToBeginning();
122
    mDynScaleShad1.resetToBeginning();
123

  
124
    mCurrentStage = stage;
125
    }
126

  
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128

  
129
  private void resetDynamics2(int stage)
130
    {
131
    int dur = DUR[stage-1];
132

  
133
    mDynMoveHand2.removeAll();
134
    mDynMoveShad2.removeAll();
135
    mDynScaleHand2.removeAll();
136
    mDynScaleShad2.removeAll();
137

  
138
    mDynMoveHand2.setDuration(dur);
139
    mDynMoveShad2.setDuration(dur);
140
    mDynScaleHand2.setDuration(dur);
141
    mDynScaleShad2.setDuration(dur);
142
    mDynMoveHand2.resetToBeginning();
143
    mDynMoveShad2.resetToBeginning();
144
    mDynScaleHand2.resetToBeginning();
145
    mDynScaleShad2.resetToBeginning();
146
    }
147

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

  
150
  private void resetDynamics3(int stage)
151
    {
152
    int dur = DUR[stage-1];
153

  
154
    mDyn1.removeAll();
155
    mDyn2.removeAll();
156
    mDyn1.setDuration(dur);
157
    mDyn2.setDuration(dur);
158
    mDyn1.resetToBeginning();
159
    mDyn2.resetToBeginning();
160
    }
161

  
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163

  
164
  private void resetDynamics4(int stage)
165
    {
166
    int dur = DUR[stage-1];
167

  
168
    mDyn3.removeAll();
169
    mDyn4.removeAll();
170
    mDyn3.setDuration(dur);
171
    mDyn4.setDuration(dur);
172
    mDyn3.resetToBeginning();
173
    mDyn4.resetToBeginning();
174
    }
175

  
176
///////////////////////////////////////////////////////////////////////////////////////////////////
177
// first finger appears and approaches the screen
178

  
179
  private void setEffectsStage1()
180
    {
181
    resetDynamics1(1);
182
    resetDynamics2(1);
183
    resetDynamics3(1);
184

  
185
    Static3D point0h = new Static3D(-X0    ,-Y1    , 0);
186
    Static3D point1h = new Static3D(-X1    ,-Y1    , 0);
187
    Static3D point2h = new Static3D(-X2    ,-Y1    , 0);
188
    Static3D point3h = new Static3D(-X2  +D,-Y1  +D, 0);
189
    Static3D point0s = new Static3D(-X0+2*D,-Y1+2*D, 0);
190
    Static3D point1s = new Static3D(-X1+2*D,-Y1+2*D, 0);
191
    Static3D point2s = new Static3D(-X2+2*D,-Y1+2*D, 0);
192
    Static3D point3s = new Static3D(-X2  +D,-Y1  +D, 0);
193

  
194
    Static3D pointSc = new Static3D(s033,s033,s033);
195

  
196
    mDyn1.add(point0h);
197
    mDyn1.add(point1h);
198
    mDyn1.add(point2h);
199
    mDyn1.add(point2h);
200
    mDyn1.add(point3h);
201
    mDyn2.add(point0s);
202
    mDyn2.add(point1s);
203
    mDyn2.add(point2s);
204
    mDyn2.add(point2s);
205
    mDyn2.add(point3s);
206

  
207
    mPosition1.set(point0h);
208
    mPosition2.set(point0s);
209

  
210
    mDynMoveHand1.add(mPosition1);
211
    mDynMoveShad1.add(mPosition2);
212

  
213
    mDynScaleHand1.add(pointSc);
214
    mDynScaleShad1.add(pointSc);
215

  
216
    setPostFrame(true);
217
    }
218

  
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220
// first finger touches the screen
221

  
222
  private void setEffectsStage2()
223
    {
224
    resetDynamics1(2);
225
    resetDynamics3(2);
226

  
227
    Static3D point3h = new Static3D(-X2  +D,-Y1  +D, 0);
228
    Static3D scaleS  = new Static3D(s001,s001,s001);
229
    Static3D scaleF  = new Static3D(s014,s014,s014);
230
    Static3D pointH  = new Static3D(s033,s033,s033);
231

  
232
    mPosition1.set(scaleS);
233
    mDyn1.add(scaleS);
234
    mDyn1.add(scaleF);
235

  
236
    mDynMoveHand1.add(point3h);
237
    mDynMoveShad1.add(point3h);
238
    mDynScaleHand1.add(pointH);
239
    mDynScaleShad1.add(mPosition1);
240

  
241
    mNodes[0].changeInputSurface(mTextureCirc);
242
    }
243

  
244
///////////////////////////////////////////////////////////////////////////////////////////////////
245
// first finger moves across the screen in a triangular fashion
246

  
247
  private void setEffectsStage3()
248
    {
249
    resetDynamics1(3);
250
    resetDynamics3(3);
251

  
252
    Static3D scaleS = new Static3D(s014,s014,s014);
253
    Static3D pointH = new Static3D(s033,s033,s033);
254
    Static3D point1 = new Static3D(-X2  +D,-Y1  +D, 0);
255
    Static3D point2 = new Static3D(     +D,-Y1  +D, 0);
256
    Static3D point3 = new Static3D(+X2  +D,-Y1  +D, 0);
257
    Static3D point4 = new Static3D(+X2  +D,     +D, 0);
258
    Static3D point5 = new Static3D(+X2  +D,+Y1  +D, 0);
259
    Static3D point6 = new Static3D(     +D,     +D, 0);
260

  
261
    mDynScaleHand1.add(pointH);
262
    mDynScaleShad1.add(scaleS);
263

  
264
    mDyn1.add(point1);
265
    mDyn1.add(point1);
266
    mDyn1.add(point2);
267
    mDyn1.add(point3);
268
    mDyn1.add(point3);
269
    mDyn1.add(point4);
270
    mDyn1.add(point5);
271
    mDyn1.add(point5);
272
    mDyn1.add(point6);
273
    mDyn1.add(point1);
274
    mDyn1.add(point1);
275

  
276
    mPosition1.set(point1);
277

  
278
    mDynMoveHand1.add(mPosition1);
279
    mDynMoveShad1.add(mPosition1);
280

  
281
    ObjectControl control = mControl.getObjectControl();
282
    float x = point1.get0() + mWidth*0.5f;
283
    float y = mHeight*0.5f - point1.get1();
284

  
285
    /*
286
    view.prepareDown();
287
    view.actionDown(x,y);
288

  
289
     */
290
    }
291

  
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293
// first finger un-touches the screen
294

  
295
  private void setEffectsStage4()
296
    {
297
    resetDynamics1(4);
298
    resetDynamics3(4);
299

  
300
    Static3D point3h = new Static3D(-X2+D,-Y1+D, 0);
301
    Static3D scaleS  = new Static3D(s014,s014,s014);
302
    Static3D scaleF  = new Static3D(s001,s001,s001);
303
    Static3D pointH  = new Static3D(s033,s033,s033);
304

  
305
    mDyn1.add(scaleS);
306
    mDyn1.add(scaleF);
307
    mPosition1.set(scaleS);
308

  
309
    mDynMoveHand1.add(point3h);
310
    mDynMoveShad1.add(point3h);
311
    mDynScaleHand1.add(pointH);
312
    mDynScaleShad1.add(mPosition1);
313
    }
314

  
315
///////////////////////////////////////////////////////////////////////////////////////////////////
316
// first finger un-touches the screen (part2)
317

  
318
  private void setEffectsStage5()
319
    {
320
    resetDynamics1(5);
321
    resetDynamics3(5);
322

  
323
    Static3D pointH = new Static3D(-X2    ,-Y1    , 0);
324
    Static3D point0 = new Static3D(-X2  +D,-Y1  +D, 0);
325
    Static3D pointS = new Static3D(-X2+2*D,-Y1+2*D, 0);
326
    Static3D pointSc = new Static3D(s033,s033,s033);
327

  
328
    mPosition1.set(point0);
329
    mPosition2.set(point0);
330

  
331
    mDyn1.add(point0);
332
    mDyn1.add(pointH);
333
    mDyn2.add(point0);
334
    mDyn2.add(pointS);
335

  
336
    mDynScaleHand1.add(pointSc);
337
    mDynScaleShad1.add(pointSc);
338
    mDynMoveHand1.add(mPosition1);
339
    mDynMoveShad1.add(mPosition2);
340

  
341
    mNodes[0].changeInputSurface(mTextureShad);
342
    }
343

  
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345
// second finger appears
346

  
347
  private void setEffectsStage6()
348
    {
349
    resetDynamics1(6);
350
    resetDynamics2(6);
351
    resetDynamics3(6);
352

  
353
    Static3D pointH = new Static3D(-X2    ,-Y1    , 0);
354
    Static3D pointS = new Static3D(-X2+2*D,-Y1+2*D, 0);
355
    Static3D pointSc= new Static3D(s033,s033,s033);
356

  
357
    mDynScaleHand1.add(pointSc);
358
    mDynScaleShad1.add(pointSc);
359
    mDynMoveHand1.add(pointH);
360
    mDynMoveShad1.add(pointS);
361

  
362
    Static3D point0h = new Static3D( X0    , Y1    , 0);
363
    Static3D point1h = new Static3D( X1    , Y1    , 0);
364
    Static3D point2h = new Static3D( X2    , Y1    , 0);
365
    Static3D point0s = new Static3D( X0+2*D, Y1+2*D, 0);
366
    Static3D point1s = new Static3D( X1+2*D, Y1+2*D, 0);
367
    Static3D point2s = new Static3D( X2+2*D, Y1+2*D, 0);
368
    Static3D pointSm = new Static3D(-s033,s033,s033);
369

  
370
    mPosition1.set(point0h);
371
    mPosition2.set(point0s);
372

  
373
    mDyn1.add(point0h);
374
    mDyn1.add(point1h);
375
    mDyn1.add(point2h);
376
    mDyn1.add(point2h);
377
    mDyn2.add(point0s);
378
    mDyn2.add(point1s);
379
    mDyn2.add(point2s);
380
    mDyn2.add(point2s);
381

  
382
    mDynScaleHand2.add(pointSm);
383
    mDynScaleShad2.add(pointSm);
384
    mDynMoveHand2.add(mPosition1);
385
    mDynMoveShad2.add(mPosition2);
386
    }
387

  
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389
// both fingers touch the screen (part1)
390

  
391
  private void setEffectsStage7()
392
    {
393
    resetDynamics1(7);
394
    resetDynamics2(7);
395
    resetDynamics3(7);
396
    resetDynamics4(7);
397

  
398
    Static3D point1Sc= new Static3D( s033,s033,s033);
399
    Static3D point2Sc= new Static3D(-s033,s033,s033);
400
    mDynScaleHand1.add(point1Sc);
401
    mDynScaleShad1.add(point1Sc);
402
    mDynScaleHand2.add(point2Sc);
403
    mDynScaleShad2.add(point2Sc);
404

  
405
    Static3D point1H = new Static3D(-X2    ,-Y1    , 0);
406
    Static3D point1F = new Static3D(-X2  +D,-Y1  +D, 0);
407
    Static3D point1S = new Static3D(-X2+2*D,-Y1+2*D, 0);
408

  
409
    mDyn1.add(point1H);
410
    mDyn1.add(point1F);
411
    mDyn2.add(point1S);
412
    mDyn2.add(point1F);
413

  
414
    mPosition1.set(point1H);
415
    mPosition2.set(point1S);
416
    mDynMoveHand1.add(mPosition1);
417
    mDynMoveShad1.add(mPosition2);
418

  
419
    Static3D point2H = new Static3D( X2    , Y1    , 0);
420
    Static3D point2F = new Static3D( X2  +D, Y1  +D, 0);
421
    Static3D point2S = new Static3D( X2+2*D, Y1+2*D, 0);
422

  
423
    mDyn3.add(point2H);
424
    mDyn3.add(point2F);
425
    mDyn4.add(point2S);
426
    mDyn4.add(point2F);
427

  
428
    mPosition3.set(point2H);
429
    mPosition4.set(point2S);
430
    mDynMoveHand2.add(mPosition3);
431
    mDynMoveShad2.add(mPosition4);
432
    }
433

  
434
///////////////////////////////////////////////////////////////////////////////////////////////////
435
// both fingers touch the screen (part2)
436

  
437
  private void setEffectsStage8()
438
    {
439
    resetDynamics1(8);
440
    resetDynamics2(8);
441
    resetDynamics3(8);
442

  
443
    Static3D point1h= new Static3D(-X2  +D,-Y1  +D, 0);
444
    Static3D point2h= new Static3D( X2  +D, Y1  +D, 0);
445
    Static3D scale1S = new Static3D( s001,s001,s001);
446
    Static3D scale1F = new Static3D( s014,s014,s014);
447
    Static3D point1H = new Static3D( s033,s033,s033);
448
    Static3D scale2S = new Static3D(-s001,s001,s001);
449
    Static3D scale2F = new Static3D(-s014,s014,s014);
450
    Static3D point2H = new Static3D(-s033,s033,s033);
451

  
452
    mPosition1.set(scale1S);
453
    mDyn1.add(scale1S);
454
    mDyn1.add(scale1F);
455

  
456
    mDynMoveHand1.add(point1h);
457
    mDynMoveShad1.add(point1h);
458
    mDynScaleHand1.add(point1H);
459
    mDynScaleShad1.add(mPosition1);
460

  
461
    mPosition2.set(scale2S);
462
    mDyn2.add(scale2S);
463
    mDyn2.add(scale2F);
464

  
465
    mDynMoveHand2.add(point2h);
466
    mDynMoveShad2.add(point2h);
467
    mDynScaleHand2.add(point2H);
468
    mDynScaleShad2.add(mPosition2);
469

  
470
    mNodes[0].changeInputSurface(mTextureCirc);
471
    mNodes[1].changeInputSurface(mTextureCirc);
472
    }
473

  
474
///////////////////////////////////////////////////////////////////////////////////////////////////
475
// both fingers approach each other
476

  
477
  private void setEffectsStage9()
478
    {
479
    resetDynamics1(9);
480
    resetDynamics2(9);
481
    resetDynamics3(9);
482

  
483
    Static3D point1s = new Static3D(-X2+D,-Y1+D, 0);
484
    Static3D point2s = new Static3D( X2+D, Y1+D, 0);
485
    Static3D point1f = new Static3D(-Y1*F,-Y1*F, 0);
486
    Static3D point2f = new Static3D( Y1*F, Y1*F, 0);
487
    Static3D scale1F = new Static3D( s014,s014,s014);
488
    Static3D point1H = new Static3D( s033,s033,s033);
489
    Static3D scale2F = new Static3D(-s014,s014,s014);
490
    Static3D point2H = new Static3D(-s033,s033,s033);
491

  
492
    mDynScaleHand1.add(point1H);
493
    mDynScaleShad1.add(scale1F);
494
    mDynScaleHand2.add(point2H);
495
    mDynScaleShad2.add(scale2F);
496

  
497
    mDyn1.add(point1s);
498
    mDyn1.add(point1f);
499
    mDyn2.add(point2s);
500
    mDyn2.add(point2f);
501

  
502
    mPosition1.set(point1s);
503
    mPosition2.set(point2s);
504

  
505
    mDynMoveHand1.add(mPosition1);
506
    mDynMoveShad1.add(mPosition1);
507
    mDynMoveHand2.add(mPosition2);
508
    mDynMoveShad2.add(mPosition2);
509

  
510
    float x1 = point1s.get0() + mWidth*0.5f;
511
    float y1 = mHeight*0.5f - point1s.get1();
512
    float x2 = point2s.get0() + mWidth*0.5f;
513
    float y2 = mHeight*0.5f - point2s.get1();
514

  
515
    ObjectControl control = mControl.getObjectControl();
516

  
517
    /*
518
    view.prepareDown();
519
    view.prepareDown2();
520
    view.actionDown(x1,y1);
521
    view.actionDown2(x1,y1,x2,y2);
522

  
523
     */
524
    }
525

  
526
///////////////////////////////////////////////////////////////////////////////////////////////////
527
// both fingers go around
528

  
529
  private void setEffectsStage10()
530
    {
531
    resetDynamics1(10);
532
    resetDynamics2(10);
533
    resetDynamics3(10);
534

  
535
    Static3D scale1F = new Static3D( s014,s014,s014);
536
    Static3D point1H = new Static3D( s033,s033,s033);
537
    Static3D scale2F = new Static3D(-s014,s014,s014);
538
    Static3D point2H = new Static3D(-s033,s033,s033);
539

  
540
    Static3D point0= new Static3D(-Y1*F,-Y1*F, 0);
541
    Static3D point1= new Static3D(-Y1*F, Y1*F, 0);
542
    Static3D point2= new Static3D( Y1*F, Y1*F, 0);
543
    Static3D point3= new Static3D( Y1*F,-Y1*F, 0);
544

  
545
    mDynScaleHand1.add(point1H);
546
    mDynScaleShad1.add(scale1F);
547
    mDynScaleHand2.add(point2H);
548
    mDynScaleShad2.add(scale2F);
549

  
550
    mDyn1.add(point0);
551
    mDyn1.add(point1);
552
    mDyn1.add(point2);
553
    mDyn1.add(point3);
554
    mDyn1.add(point0);
555

  
556
    mDyn2.add(point2);
557
    mDyn2.add(point3);
558
    mDyn2.add(point0);
559
    mDyn2.add(point1);
560
    mDyn2.add(point2);
561

  
562
    mDyn1.setConvexity(1.0f);
563
    mDyn2.setConvexity(1.0f);
564

  
565
    mDyn1.setSpeedMode(Dynamic.SPEED_MODE_SEGMENT_CONSTANT);
566
    mDyn2.setSpeedMode(Dynamic.SPEED_MODE_SEGMENT_CONSTANT);
567

  
568
    mPosition1.set(point0);
569
    mPosition2.set(point2);
570

  
571
    mDynMoveHand1.add(mPosition1);
572
    mDynMoveShad1.add(mPosition1);
573
    mDynMoveHand2.add(mPosition2);
574
    mDynMoveShad2.add(mPosition2);
575
    }
576

  
577
///////////////////////////////////////////////////////////////////////////////////////////////////
578
// both fingers move away from each other
579

  
580
  private void setEffectsStage11()
581
    {
582
    resetDynamics1(11);
583
    resetDynamics2(11);
584
    resetDynamics3(11);
585

  
586
    Static3D point1s= new Static3D(-X2+D,-Y1+D, 0);
587
    Static3D point2s= new Static3D( X2+D, Y1+D, 0);
588
    Static3D point1f= new Static3D(-Y1*F,-Y1*F, 0);
589
    Static3D point2f= new Static3D( Y1*F, Y1*F, 0);
590
    Static3D scale1F= new Static3D( s014,s014,s014);
591
    Static3D point1H= new Static3D( s033,s033,s033);
592
    Static3D scale2F= new Static3D(-s014,s014,s014);
593
    Static3D point2H= new Static3D(-s033,s033,s033);
594

  
595
    mDynScaleHand1.add(point1H);
596
    mDynScaleShad1.add(scale1F);
597
    mDynScaleHand2.add(point2H);
598
    mDynScaleShad2.add(scale2F);
599

  
600
    mDyn1.add(point1f);
601
    mDyn1.add(point1s);
602
    mDyn2.add(point2f);
603
    mDyn2.add(point2s);
604

  
605
    mDyn1.setConvexity(0.0f);
606
    mDyn2.setConvexity(0.0f);
607

  
608
    mDyn1.setSpeedMode(Dynamic.SPEED_MODE_SMOOTH);
609
    mDyn2.setSpeedMode(Dynamic.SPEED_MODE_SMOOTH);
610

  
611
    mPosition1.set(point1f);
612
    mPosition2.set(point2f);
613

  
614
    mDynMoveHand1.add(mPosition1);
615
    mDynMoveShad1.add(mPosition1);
616
    mDynMoveHand2.add(mPosition2);
617
    mDynMoveShad2.add(mPosition2);
618
    }
619

  
620
///////////////////////////////////////////////////////////////////////////////////////////////////
621
// both fingers un-touch the screen (part1)
622

  
623
  private void setEffectsStage12()
624
    {
625
    resetDynamics1(12);
626
    resetDynamics2(12);
627
    resetDynamics3(12);
628

  
629
    Static3D point1h = new Static3D(-X2+D,-Y1+D, 0);
630
    Static3D point2h = new Static3D( X2+D, Y1+D, 0);
631
    Static3D scale1S = new Static3D( s014,s014,s014);
632
    Static3D scale1F = new Static3D( s001,s001,s001);
633
    Static3D point1H = new Static3D( s033,s033,s033);
634
    Static3D scale2S = new Static3D(-s014,s014,s014);
635
    Static3D scale2F = new Static3D(-s001,s001,s001);
636
    Static3D point2H = new Static3D(-s033,s033,s033);
637

  
638
    mPosition1.set(scale1S);
639
    mPosition2.set(scale2S);
640

  
641
    mDyn1.add(scale1S);
642
    mDyn1.add(scale1F);
643
    mDyn2.add(scale2S);
644
    mDyn2.add(scale2F);
645

  
646
    mDynMoveHand1.add(point1h);
647
    mDynMoveShad1.add(point1h);
648
    mDynScaleHand1.add(point1H);
649
    mDynScaleShad1.add(mPosition1);
650

  
651
    mDynMoveHand2.add(point2h);
652
    mDynMoveShad2.add(point2h);
653
    mDynScaleHand2.add(point2H);
654
    mDynScaleShad2.add(mPosition2);
655
    }
656

  
657
///////////////////////////////////////////////////////////////////////////////////////////////////
658
// both fingers un-touch the screen (part2)
659

  
660
  private void setEffectsStage13()
661
    {
662
    resetDynamics1(13);
663
    resetDynamics2(13);
664
    resetDynamics3(13);
665
    resetDynamics4(13);
666

  
667
    Static3D point1_0 = new Static3D(-X2  +D,-Y1  +D, 0);
668
    Static3D point11H = new Static3D(-X2    ,-Y1    , 0);
669
    Static3D point12H = new Static3D(-X1    ,-Y1    , 0);
670
    Static3D point13H = new Static3D(-X0    ,-Y1    , 0);
671
    Static3D point11S = new Static3D(-X2+2*D,-Y1+2*D, 0);
672
    Static3D point12S = new Static3D(-X1+2*D,-Y1+2*D, 0);
673
    Static3D point13S = new Static3D(-X0+2*D,-Y1+2*D, 0);
674
    Static3D point1Sc = new Static3D( s033,s033,s033);
675

  
676
    mPosition1.set(point1_0);
677
    mDynMoveHand1.add(mPosition1);
678
    mPosition2.set(point1_0);
679
    mDynMoveShad1.add(mPosition2);
680

  
681
    mDynScaleHand1.add(point1Sc);
682
    mDynScaleShad1.add(point1Sc);
683

  
684
    mDyn1.add(point1_0);
685
    mDyn1.add(point11H);
686
    mDyn1.add(point11H);
687
    mDyn1.add(point12H);
688
    mDyn1.add(point13H);
689

  
690
    mDyn2.add(point1_0);
691
    mDyn2.add(point11S);
692
    mDyn2.add(point11S);
693
    mDyn2.add(point12S);
694
    mDyn2.add(point13S);
695

  
696
    Static3D point2_0 = new Static3D( X2  +D, Y1  +D, 0);
697
    Static3D point21H = new Static3D( X2    , Y1    , 0);
698
    Static3D point22H = new Static3D( X1    , Y1    , 0);
699
    Static3D point23H = new Static3D( X0    , Y1    , 0);
700
    Static3D point21S = new Static3D( X2+2*D, Y1+2*D, 0);
701
    Static3D point22S = new Static3D( X1+2*D, Y1+2*D, 0);
702
    Static3D point23S = new Static3D( X0+2*D, Y1+2*D, 0);
703
    Static3D point2Sc= new Static3D(-s033,s033,s033);
704

  
705
    mPosition3.set(point2_0);
706
    mDynMoveHand2.add(mPosition3);
707
    mPosition4.set(point2_0);
708
    mDynMoveShad2.add(mPosition4);
709

  
710
    mDynScaleHand2.add(point2Sc);
711
    mDynScaleShad2.add(point2Sc);
712

  
713
    mDyn3.add(point2_0);
714
    mDyn3.add(point21H);
715
    mDyn3.add(point21H);
716
    mDyn3.add(point22H);
717
    mDyn3.add(point23H);
718

  
719
    mDyn4.add(point2_0);
720
    mDyn4.add(point21S);
721
    mDyn4.add(point21S);
722
    mDyn4.add(point22S);
723
    mDyn4.add(point23S);
724

  
725
    mNodes[0].changeInputSurface(mTextureShad);
726
    mNodes[1].changeInputSurface(mTextureShad);
727
    }
728

  
729
///////////////////////////////////////////////////////////////////////////////////////////////////
730

  
731
  private void createEffects()
732
    {
733
    mEffects = new DistortedEffects[NUM_EFFE];
734
    for(int i=0; i<NUM_EFFE; i++) mEffects[i]= new DistortedEffects();
735

  
736
    int time = DUR[0];
737

  
738
    mDyn1 = new Dynamic3D(time,0.5f);
739
    mDyn1.setMode(Dynamic.MODE_PATH);
740
    mDyn1.setConvexity(0.0f);
741
    mDyn2 = new Dynamic3D(time,0.5f);
742
    mDyn2.setMode(Dynamic.MODE_PATH);
743
    mDyn2.setConvexity(0.0f);
744
    mDyn3 = new Dynamic3D(time,0.5f);
745
    mDyn3.setMode(Dynamic.MODE_PATH);
746
    mDyn3.setConvexity(0.0f);
747
    mDyn4 = new Dynamic3D(time,0.5f);
748
    mDyn4.setMode(Dynamic.MODE_PATH);
749
    mDyn4.setConvexity(0.0f);
750

  
751
    mPosition1 = new Static3D(0,0,0);
752
    mPosition2 = new Static3D(0,0,0);
753
    mPosition3 = new Static3D(0,0,0);
754
    mPosition4 = new Static3D(0,0,0);
755

  
756
    tmpBuffer = new float[12];
757

  
758
    mDynMoveHand1 = new Dynamic3D(time,0.5f);
759
    mDynMoveHand1.setMode(Dynamic.MODE_PATH);
760
    mDynMoveHand1.setConvexity(0.0f);
761
    mDynMoveShad1 = new Dynamic3D(time,0.5f);
762
    mDynMoveShad1.setMode(Dynamic.MODE_PATH);
763
    mDynMoveShad1.setConvexity(0.0f);
764
    mDynScaleHand1 = new Dynamic3D(time,0.5f);
765
    mDynScaleHand1.setMode(Dynamic.MODE_PATH);
766
    mDynScaleHand1.setConvexity(0.0f);
767
    mDynScaleShad1 = new Dynamic3D(time,0.5f);
768
    mDynScaleShad1.setMode(Dynamic.MODE_PATH);
769
    mDynScaleShad1.setConvexity(0.0f);
770

  
771
    MatrixEffectMove  moveHand1 = new MatrixEffectMove(mDynMoveHand1);
772
    MatrixEffectMove  moveShad1 = new MatrixEffectMove(mDynMoveShad1);
773
    MatrixEffectScale scaleHand1= new MatrixEffectScale(mDynScaleHand1);
774
    MatrixEffectScale scaleShad1= new MatrixEffectScale(mDynScaleShad1);
775

  
776
    mEffects[0].apply(scaleShad1);
777
    mEffects[0].apply(moveShad1);
778
    mEffects[2].apply(scaleHand1);
779
    mEffects[2].apply(moveHand1);
780

  
781
    mDynMoveHand2 = new Dynamic3D(time,0.5f);
782
    mDynMoveHand2.setMode(Dynamic.MODE_PATH);
783
    mDynMoveHand2.setConvexity(0.0f);
784
    mDynMoveShad2 = new Dynamic3D(time,0.5f);
785
    mDynMoveShad2.setMode(Dynamic.MODE_PATH);
786
    mDynMoveShad2.setConvexity(0.0f);
787
    mDynScaleHand2 = new Dynamic3D(time,0.5f);
788
    mDynScaleHand2.setMode(Dynamic.MODE_PATH);
789
    mDynScaleHand2.setConvexity(0.0f);
790
    mDynScaleShad2 = new Dynamic3D(time,0.5f);
791
    mDynScaleShad2.setMode(Dynamic.MODE_PATH);
792
    mDynScaleShad2.setConvexity(0.0f);
793

  
794
    MatrixEffectMove  moveHand2 = new MatrixEffectMove(mDynMoveHand2);
795
    MatrixEffectMove  moveShad2 = new MatrixEffectMove(mDynMoveShad2);
796
    MatrixEffectScale scaleHand2= new MatrixEffectScale(mDynScaleHand2);
797
    MatrixEffectScale scaleShad2= new MatrixEffectScale(mDynScaleShad2);
798

  
799
    mEffects[1].apply(scaleShad2);
800
    mEffects[1].apply(moveShad2);
801
    mEffects[3].apply(scaleHand2);
802
    mEffects[3].apply(moveHand2);
803

  
804
    DistortedFramebuffer frame = mControl.getFramebuffer();
805
    mWidth = frame.getWidth();
806
    mHeight= frame.getHeight();
807

  
808
    X0   = mWidth*0.65f;
809
    X1   = mWidth*0.50f;
810
    X2   = mWidth*0.35f;
811
    Y1   = mHeight*0.28f;
812
    D    = mWidth*0.01f;
813
    s001 = mWidth*0.0001f;
814
    s014 = mWidth*0.14f;
815
    s033 = mWidth*0.33f;
816
    F    = 0.50f;
817
    }
818

  
819
///////////////////////////////////////////////////////////////////////////////////////////////////
820

  
821
  private void createNodes()
822
    {
823
    if( mNodes==null )
824
      {
825
      mNodes = new DistortedNode[NUM_NODE];
826
      mQuad  = new MeshQuad();
827
      }
828

  
829
    Activity act = mControl.getActivity();
830

  
831
    if( act!=null )
832
      {
833
      Bitmap bmpCirc = openBitmap(act, R.drawable.ui_fading_circle);
834
      Bitmap bmpShad = openBitmap(act, R.drawable.ui_hand_shadow);
835
      Bitmap bmpHand = openBitmap(act, R.drawable.ui_hand_pointer);
836

  
837
      mTextureCirc = new DistortedTexture();
838
      mTextureShad = new DistortedTexture();
839
      DistortedTexture textureHand = new DistortedTexture();
840

  
841
      if( bmpCirc!=null ) mTextureCirc.setTexture(bmpCirc);
842
      if( bmpShad!=null ) mTextureShad.setTexture(bmpShad);
843
      if( bmpHand!=null ) textureHand.setTexture(bmpHand);
844

  
845
      mNodes[0]= new DistortedNode(mTextureShad,mEffects[0],mQuad);
846
      mNodes[1]= new DistortedNode(mTextureShad,mEffects[1],mQuad);
847
      mNodes[2]= new DistortedNode( textureHand,mEffects[2],mQuad);
848
      mNodes[3]= new DistortedNode( textureHand,mEffects[3],mQuad);
849
      }
850
    else
851
      {
852
      android.util.Log.e("D", "Activity NULL!!");
853
      }
854
    }
855

  
856
///////////////////////////////////////////////////////////////////////////////////////////////////
857

  
858
  long getEffectID()
859
    {
860
    return mEffectID;
861
    }
862

  
863
///////////////////////////////////////////////////////////////////////////////////////////////////
864

  
865
  DistortedNode[] getNodes()
866
    {
867
    if( mEffects==null ) createEffects();
868
    createNodes();
869
    setEffectsStage1();
870

  
871
    return mNodes;
872
    }
873

  
874
///////////////////////////////////////////////////////////////////////////////////////////////////
875

  
876
  DistortedNode[] returnNodes()
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff