Project

General

Profile

« Previous | Next » 

Revision b62eb334

Added by Leszek Koltunski about 5 years ago

Many things.

1) make the Dynamic.setDuration() able to be called AFTER the Dynamic has already been run. (and rename it to 'makeRunNowFor()' )
2) remove the automatic removal of zero Effects from EffectQueues.
3) adjust several Apps to cope with 2)
4) add post-rotation to Rubik (still not finished)

View differences:

src/main/java/org/distorted/examples/rubik/RubikCube.java
32 32
import org.distorted.library.main.DistortedScreen;
33 33
import org.distorted.library.main.DistortedTexture;
34 34
import org.distorted.library.mesh.MeshCubes;
35
import org.distorted.library.message.EffectListener;
35 36
import org.distorted.library.type.Dynamic1D;
36 37
import org.distorted.library.type.Static1D;
37 38
import org.distorted.library.type.Static3D;
......
53 54
    private Static3D[][][] mRotationAxis;
54 55
    private Dynamic1D[][][] mRotationAngle;
55 56
    private Static3D[][][] mCurrentPosition;
56
    private Static1D mRotationAngleStatic;
57
    private Static1D mRotationAngleStatic, mRotationAngleNearest;
57 58
    private DistortedTexture mTexture;
59
    private DistortedEffects mEffectsListeningForNow;
58 60

  
59 61
    private int mRotAxis, mRotRow;
60 62
    private int mSize;
......
65 67
      {
66 68
      mSize = size;
67 69

  
68
      mRotationAngleStatic = new Static1D(0);
70
      mRotationAngleStatic  = new Static1D(0);
71
      mRotationAngleNearest = new Static1D(0);
72

  
69 73
      mRotAxis= RubikSurfaceView.VECTX;
70 74
      mTexture = new DistortedTexture(TEXTURE_SIZE,TEXTURE_SIZE);
71 75

  
......
192 196

  
193 197
///////////////////////////////////////////////////////////////////////////////////////////////////
194 198

  
195
    void continueRotation(float angle)
199
    void continueRotation(float angleInDegrees)
200
      {
201
      mRotationAngleStatic.set1(angleInDegrees);
202
      }
203

  
204
///////////////////////////////////////////////////////////////////////////////////////////////////
205

  
206
    private int computeNearestAngle(float angle)
196 207
      {
197
      mRotationAngleStatic.set1(angle);
208
      final int NEAREST = 90;
209

  
210
      int tmp = (int)((angle+NEAREST/2)/NEAREST);
211
      if( angle< -(NEAREST/2) ) tmp-=1;
212

  
213
      return NEAREST*tmp;
198 214
      }
199 215

  
200 216
///////////////////////////////////////////////////////////////////////////////////////////////////
201 217

  
202
    void finishRotationCalledOnNextRender()
218
    void finishRotationCalledOnNextRender(EffectListener listener)
203 219
      {
204
      float nearestAngle = (mRotationAngleStatic.get1()+45.0f)/90.0f;
205
      if( nearestAngle<0 ) nearestAngle-=1.0f;
206
      int nearestAngleInDegrees = 90*(4-((int)nearestAngle+4)%4);
220
      boolean first = true;
221
      int nearestAngleInDegrees = computeNearestAngle(mRotationAngleStatic.get1());
222

  
223

  
224
      android.util.Log.e("cube", "finish: angle="+((int)mRotationAngleStatic.get1())+" ret: "+nearestAngleInDegrees);
225

  
226

  
227
      mRotationAngleNearest.set1(nearestAngleInDegrees);
228

  
229
      for(int x=0; x<mSize; x++)
230
        for(int y=0; y<mSize; y++)
231
          for(int z=0; z<mSize; z++)
232
            if( x==0 || x==mSize-1 || y==0 || y==mSize-1 || z==0 || z==mSize-1 )
233
              {
234
              if( belongsToRotation(x,y,z,mRotAxis,mRotRow) )
235
                {
236
                mRotationAngle[x][y][z].makeRunNowFor(2000);
237
                mRotationAngle[x][y][z].add(mRotationAngleNearest);
238

  
239
                if( first )
240
                  {
241
                  first = false;
242
                  mEffectsListeningForNow = mEffects[x][y][z];
243
                  mEffectsListeningForNow.registerForMessages(listener);
244
                  }
245
                }
246
              }
247
      }
248

  
249
///////////////////////////////////////////////////////////////////////////////////////////////////
250

  
251
    void removeRotationCalledOnNextRender(EffectListener listener)
252
      {
253
      mEffectsListeningForNow.deregisterForMessages(listener);
254

  
255
      int nearestAngleInDegrees = computeNearestAngle(mRotationAngleStatic.get1());
207 256
      double nearestAngleInRadians = nearestAngleInDegrees*Math.PI/180;
208
      float sinA = (float)Math.sin(nearestAngleInRadians*0.5);
257
      float sinA =-(float)Math.sin(nearestAngleInRadians*0.5);
209 258
      float cosA = (float)Math.cos(nearestAngleInRadians*0.5);
210 259

  
260
      android.util.Log.e("cube", "remove: angle="+((int)mRotationAngleStatic.get1())+" ret: "+nearestAngleInDegrees);
261

  
211 262
      mRotationAngleStatic.set1(0);
263
      mRotationAngleNearest.set1(0);
212 264

  
213 265
      float qx=0,qy=0,qz=0;
214 266

  
......
228 280
              {
229 281
              if( belongsToRotation(x,y,z,mRotAxis,mRotRow) )
230 282
                {
283
                mRotationAngle[x][y][z].makeRunNowFor(0);
231 284
                mRotationAngle[x][y][z].removeAll();
232 285
                mQuatScramble[x][y][z].set(RubikSurfaceView.quatMultiply(quat,mQuatScramble[x][y][z]));
233 286
                modifyCurrentPosition(x,y,z,quat);

Also available in: Unified diff