Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / main / ObjectPreRender.java @ 224c0ff1

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.main;
11

    
12
import org.distorted.library.message.EffectListener;
13
import org.distorted.library.type.Static3D;
14

    
15
import org.distorted.library.type.Static4D;
16
import org.distorted.objectlib.helpers.ObjectLibInterface;
17
import org.distorted.objectlib.effects.BaseEffect;
18
import org.distorted.objectlib.effects.scramble.ScrambleEffect;
19
import org.distorted.objectlib.helpers.BlockController;
20
import org.distorted.objectlib.helpers.MovesFinished;
21
import org.distorted.objectlib.helpers.OperatingSystemInterface;
22
import org.distorted.objectlib.metadata.ListObjects;
23
import org.distorted.objectlib.shape.ShapeDodecahedron;
24
import org.distorted.objectlib.shape.ShapeHexahedron;
25
import org.distorted.objectlib.shape.ShapeOctahedron;
26
import org.distorted.objectlib.shape.ShapeTetrahedron;
27

    
28
///////////////////////////////////////////////////////////////////////////////////////////////////
29

    
30
public class ObjectPreRender implements EffectListener
31
  {
32
  private static final int MAX_SLOW_SCRAMBLE = 50;
33

    
34
  private final ObjectControl mController;
35
  private InitAssets mAsset;
36
  private int mOrdinal;
37
  private TwistyObject mOldObject, mNewObject;
38
  private OperatingSystemInterface mOS;
39
  private MovesFinished mAddActionListener;
40
  private final ObjectLibInterface mInterface;
41
  private String mDebug;
42
  private float mMoveX, mMoveY;
43
  private float mScale;
44

    
45
  private boolean mFinishRotation, mRemoveManualRotation, mRemoveProgramaticRotation, mAddRotation,
46
                  mSetQuat, mChangeObject, mSolveObject, mScrambleObject, mFastScrambleObject,
47
                  mPresentObject,mInitializeObject, mSetTextureMap, mResetAllTextureMaps, mSolve,
48
                  mApplyScrambles, mResetTextureEffect, mRepaintPuzzleFace;
49
  private boolean mScramblingAndSolvingBlocked, mRotationBlocked, mIsSolved;
50
  private long mRotationFinishedID;
51
  private final long[] mEffectID;
52
  private int[][] mInitMoves, mScraMoves;
53
  private int mScrambleObjectNum, mScrambleObjectDuration;
54
  private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle;
55
  private long mAddRotationDuration;
56
  private int mPresentDuration, mRestickerDuration;
57
  private long mAddRotationID, mRemoveProgramaticRotationID;
58
  private int mCubit, mFace, mNewColor;
59
  private int mFinishAxis, mFinishRow;
60
  private float mFinishAngle, mAvgSpeed;
61
  private long mScrambleStartTime, mScrambleEndTime;
62
  private int mIconMode;
63
  private boolean mRestoreStickersOnly;
64

    
65
  // debugging only
66
  private long mAddRotationTime;
67

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

    
70
  public ObjectPreRender(ObjectControl controller, ObjectLibInterface actioner)
71
    {
72
    mInterface = actioner;
73
    mController = controller;
74

    
75
    mFinishRotation       = false;
76
    mRemoveManualRotation = false;
77
    mRemoveProgramaticRotation = false;
78
    mAddRotation          = false;
79
    mSetQuat              = false;
80
    mChangeObject         = false;
81
    mSolveObject          = false;
82
    mSolve                = false;
83
    mScrambleObject       = false;
84
    mFastScrambleObject   = false;
85
    mPresentObject        = false;
86
    mResetTextureEffect   = false;
87
    mRepaintPuzzleFace    = false;
88

    
89
    mOldObject = null;
90
    mNewObject = null;
91

    
92
    mDebug = "";
93
    mScrambleObjectNum = 0;
94
    mScale = 1.0f;
95

    
96
    mEffectID = new long[BaseEffect.Type.LENGTH];
97

    
98
  //  mBlockController = new BlockController(this);
99
    unblockEverything();
100
    }
101

    
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103

    
104
  private void createObjectNow(int ordinal, int iconMode, InitAssets assets)
105
    {
106
    long time1 = System.currentTimeMillis();
107
    Static3D move = new Static3D(mMoveX,mMoveY,0);
108
    Static4D quat = mController.getQuat();
109
    TwistyObject tmp;
110
    boolean error = false;
111

    
112
    if( assets==null || assets.noJsonStream() )
113
      {
114
      tmp = ListObjects.create( ordinal, iconMode, quat, move, mScale, assets);
115
      }
116
    else
117
      {
118
      tmp = new TwistyJson( iconMode, quat, move, mScale, assets);
119
      error = tmp.getError();
120
      }
121

    
122
    if( error )
123
      {
124
      String errorString = tmp.getErrorString();
125
      mInterface.reportJSONError(errorString,ordinal);
126
      }
127
    else
128
      {
129
      if( mOldObject!=null ) mOldObject.releaseResources();
130
      mOldObject = mNewObject;
131
      mNewObject = tmp;
132

    
133
      long time2 = System.currentTimeMillis();
134
      mInterface.onObjectCreated(time2-time1);
135

    
136
      if( mNewObject!=null )
137
        {
138
        mNewObject.setLibInterface(mInterface);
139
        mController.setTouchControl(mNewObject);
140
        mNewObject.setObjectRatioNow(mScale, mController.getScalingSize() );
141

    
142
        if( mOS!=null )
143
          {
144
          if( mRestoreStickersOnly ) mNewObject.restoreStickers(mOS);
145
          else                       mNewObject.restorePreferences(mOS);
146

    
147
          mOS = null;
148
          }
149

    
150
        mIsSolved = mNewObject.isSolved();
151
        }
152
      }
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156
// do all 'adjustable' effects (SizeChange, Solve, Scramble)
157

    
158
  private void doEffectNow(BaseEffect.Type type, int duration)
159
    {
160
    try
161
      {
162
      int index = type.ordinal();
163
      mEffectID[index] = type.startEffect(this,duration);
164
      }
165
    catch( Exception ex )
166
      {
167
      android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
168
      unblockEverything();
169
      }
170
    }
171

    
172
///////////////////////////////////////////////////////////////////////////////////////////////////
173

    
174
  private void rememberMove(int axis, int row, float angle)
175
    {
176
    mDebug += (mNewObject==null ? "[null]" : mNewObject.reportState() );
177
    mDebug += ("(m "+axis+" "+(1<<row)+" "+angle+" "+(System.currentTimeMillis()-mScrambleEndTime))+")";
178
    }
179

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

    
182
  private void removeManualRotationNow()
183
    {
184
    mRemoveManualRotation =false;
185
    float angle = mNewObject.removeRotation();
186

    
187
    boolean solved = mNewObject.isSolved();
188

    
189
    if( solved && !mIsSolved )
190
      {
191
      mInterface.onSolved();
192
      unblockEverything();
193
      int duration = BaseEffect.Type.WIN.getDuration();
194
      doEffectNow( BaseEffect.Type.WIN, duration );
195
      }
196
    else
197
      {
198
      unblockEverything();
199
      }
200

    
201
    rememberMove(mFinishAxis,mFinishRow,angle);
202

    
203
    if( angle!=0 )
204
      {
205
      int[][] basicAngles = mNewObject.getBasicAngles();
206
      int basic = basicAngles[mFinishAxis][mFinishRow];
207
      int realAngle = (int)((angle*basic)/360);
208
      mInterface.onRemoveRotation(mFinishAxis,mFinishRow,realAngle);
209
      }
210

    
211
    mIsSolved = solved;
212
    }
213

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

    
216
  private void removeManualRotation()
217
    {
218
    mRemoveManualRotation = true;
219
    }
220

    
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222

    
223
  private void removeProgramaticRotation()
224
    {
225
    mRemoveProgramaticRotation = true;
226
    }
227

    
228
///////////////////////////////////////////////////////////////////////////////////////////////////
229

    
230
  private void removeProgramaticRotationNow()
231
    {
232
    mRemoveProgramaticRotation =false;
233
    mNewObject.removeRotation();
234
    mAddActionListener.onActionFinished(mRemoveProgramaticRotationID);
235
    }
236

    
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238

    
239
  private void addRotationNow()
240
    {
241
    mAddRotation = false;
242

    
243
    if( mNewObject.getNumAxis() > mAddRotationAxis )
244
      {
245
      mAddRotationID = mNewObject.addRotation( this, mAddRotationAxis, mAddRotationRowBitmap,
246
                                                     mAddRotationAngle, mAddRotationDuration);
247

    
248
      // failed to add effect (previous rotation hasn't been removed yet)
249
      if( mAddRotationID==0 )
250
        {
251
        mAddActionListener.onActionFinished(0);
252
        }
253
      // the rotation we have just added has forced a finish() of an ongoing
254
      // manual rotation. So the effect that's going to finish is not the manual
255
      // rotation (we have just removed it) but the rotation we have just added
256
      // here - so set mRotationFinishedID to 0
257
      else if( mAddRotationID<0 )
258
        {
259
        mAddRotationID = -mAddRotationID;
260
        mRotationFinishedID = 0;
261
        }
262
      }
263
    else // should never happen but Firebase says it sometimes does
264
      {
265
      long timeNow = System.currentTimeMillis();
266
      Class<? extends MovesFinished> clazz = mAddActionListener.getClass();
267
      String name = clazz.getSimpleName();
268

    
269
      String error = "time now: "+timeNow+" add time: "+mAddRotationTime+" axis="+mAddRotationAxis+
270
                      "object: "+mNewObject.getShortName()+" "+name;
271

    
272
      mInterface.reportProblem(error,true);
273
      unblockEverything();
274
      }
275
    }
276

    
277
///////////////////////////////////////////////////////////////////////////////////////////////////
278

    
279
  private void finishRotationNow()
280
    {
281
    mFinishRotation = false;
282
    blockEverything(BlockController.PLACE_0);
283
    mRotationFinishedID = mNewObject.finishRotation(this,mFinishAxis,mFinishRow,mFinishAngle,mAvgSpeed);
284

    
285
    if( mRotationFinishedID==0 ) // failed to add effect - should never happen
286
      {
287
      unblockEverything();
288
      }
289
    }
290

    
291
///////////////////////////////////////////////////////////////////////////////////////////////////
292

    
293
  private void changeObjectNow()
294
    {
295
    mChangeObject = false;
296
    blockEverything(BlockController.PLACE_1);
297
    createObjectNow(mOrdinal,mIconMode,mAsset);
298
    int duration = BaseEffect.Type.SIZECHANGE.getDuration();
299
    doEffectNow( BaseEffect.Type.SIZECHANGE, duration );
300
    }
301

    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
  private void scrambleObjectNow()
305
    {
306
    mScrambleObject = false;
307
    mIsSolved       = false;
308
    blockEverything(BlockController.PLACE_3);
309

    
310
    if( mScrambleObjectNum<MAX_SLOW_SCRAMBLE )
311
      {
312
      int duration = BaseEffect.Type.SCRAMBLE.getDuration();
313
      doEffectNow( BaseEffect.Type.SCRAMBLE, duration );
314
      }
315
    else
316
      {
317
      int duration = BaseEffect.Type.FAST_SCRAMBLE.getDuration();
318
      doEffectNow( BaseEffect.Type.FAST_SCRAMBLE, duration );
319
      }
320
    }
321

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

    
324
  private void fastScrambleObjectNow()
325
    {
326
    mFastScrambleObject = false;
327
    mIsSolved           = false;
328
    blockEverything(BlockController.PLACE_5);
329
    doEffectNow( BaseEffect.Type.FAST_SCRAMBLE, mScrambleObjectDuration );
330
    }
331

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

    
334
  private void resetTextureNow()
335
    {
336
    mResetTextureEffect = false;
337
    doEffectNow( BaseEffect.Type.RESTICKER, mRestickerDuration );
338
    }
339

    
340
///////////////////////////////////////////////////////////////////////////////////////////////////
341

    
342
  private void presentObjectNow()
343
    {
344
    mPresentObject = false;
345
    doEffectNow( BaseEffect.Type.PRESENT, mPresentDuration );
346
    }
347

    
348
///////////////////////////////////////////////////////////////////////////////////////////////////
349

    
350
  private void solveObjectNow()
351
    {
352
    mSolveObject = false;
353
    blockEverything(BlockController.PLACE_4);
354
    int duration = BaseEffect.Type.SOLVE.getDuration();
355
    doEffectNow( BaseEffect.Type.SOLVE, duration );
356
    }
357

    
358
///////////////////////////////////////////////////////////////////////////////////////////////////
359

    
360
  private void solveNow()
361
    {
362
    mSolve = false;
363
    if( mNewObject!=null ) mNewObject.solve();
364
    }
365

    
366
///////////////////////////////////////////////////////////////////////////////////////////////////
367

    
368
  private void initializeObjectNow()
369
    {
370
    mInitializeObject = false;
371
    mNewObject.initializeObject(mInitMoves);
372
    }
373

    
374
///////////////////////////////////////////////////////////////////////////////////////////////////
375

    
376
  private void applyScramblesNow()
377
    {
378
    mApplyScrambles = false;
379
    mNewObject.applyScrambles(mScraMoves);
380
    }
381

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

    
384
  private void setTextureMapNow()
385
    {
386
    mSetTextureMap = false;
387
    if( mNewObject!=null ) mNewObject.setTextureMap(mCubit,mFace,mNewColor);
388
    }
389

    
390
///////////////////////////////////////////////////////////////////////////////////////////////////
391

    
392
  private void repaintPuzzleFaceNow()
393
    {
394
    mRepaintPuzzleFace = false;
395
    if( mNewObject!=null ) mNewObject.repaintPuzzleFace(mCubit,mFace,mNewColor);
396
    }
397

    
398
///////////////////////////////////////////////////////////////////////////////////////////////////
399

    
400
  private void resetAllTextureMapsNow()
401
    {
402
    mResetAllTextureMaps = false;
403
    if( mNewObject!=null ) mNewObject.resetAllTextureMaps();
404
    }
405

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

    
408
  private void setQuatNow()
409
    {
410
    mSetQuat = false;
411
    mController.setQuat();
412
    }
413

    
414
///////////////////////////////////////////////////////////////////////////////////////////////////
415

    
416
  private int computeRowFromBitmap(int rowBitmap)
417
    {
418
    int index = 0;
419

    
420
    while(index<32)
421
      {
422
      if( (rowBitmap&0x1) != 0 ) return index;
423
      rowBitmap>>=1;
424
      index++;
425
      }
426

    
427
    return 0;
428
    }
429

    
430
///////////////////////////////////////////////////////////////////////////////////////////////////
431

    
432
  private void blockEverything(int place)
433
    {
434
    mScramblingAndSolvingBlocked = true;
435
    mRotationBlocked = true;
436
  //  mBlockController.rotationBlocked(place);
437
  //  mBlockController.scramblingAndSolvingBlocked(place);
438
    }
439

    
440
///////////////////////////////////////////////////////////////////////////////////////////////////
441
// called from ObjectControl; this from app when we switch the screen to READ post-scrambling.
442
// The point: we only unblock having completed the screen switch so that it is impossible to
443
// click the solve button then.
444

    
445
  void unblockEverything()
446
    {
447
    mScramblingAndSolvingBlocked = false;
448
    mRotationBlocked = false;
449
  //  mBlockController.rotationUnblocked();
450
  //  mBlockController.scramblingAndSolvingUnblocked();
451
    }
452

    
453
///////////////////////////////////////////////////////////////////////////////////////////////////
454

    
455
  void finishRotation(int currentAxis, int currentRow, float currentAngle, float avgSpeed)
456
    {
457
    mFinishAxis = currentAxis;
458
    mFinishRow  = currentRow;
459
    mFinishAngle= currentAngle;
460
    mAvgSpeed   = avgSpeed;
461

    
462
    mFinishRotation = true;
463
    }
464

    
465
///////////////////////////////////////////////////////////////////////////////////////////////////
466

    
467
  void setTextureMap(int cubit, int face, int newColor)
468
    {
469
    mSetTextureMap = true;
470

    
471
    mCubit    = cubit;
472
    mFace     = face;
473
    mNewColor = newColor;
474
    }
475

    
476
///////////////////////////////////////////////////////////////////////////////////////////////////
477

    
478
  public void repaintPuzzleFace(int cubit, int face, int newColor)
479
    {
480
    mRepaintPuzzleFace = true;
481

    
482
    mCubit    = cubit;
483
    mFace     = face;
484
    mNewColor = newColor;
485
    }
486

    
487
///////////////////////////////////////////////////////////////////////////////////////////////////
488

    
489
  void setQuatOnNextRender()
490
    {
491
    mSetQuat = true;
492
    }
493

    
494
///////////////////////////////////////////////////////////////////////////////////////////////////
495

    
496
  void setMove(float xmove, float ymove)
497
    {
498
    mMoveX = xmove;
499
    mMoveY = ymove;
500
    }
501

    
502
///////////////////////////////////////////////////////////////////////////////////////////////////
503

    
504
  void setScale(float scale)
505
    {
506
    mScale = scale;
507
    }
508

    
509
///////////////////////////////////////////////////////////////////////////////////////////////////
510
// INTERNAL API
511
///////////////////////////////////////////////////////////////////////////////////////////////////
512

    
513
  public int getNumScrambles()
514
    {
515
    return mScrambleObjectNum;
516
    }
517

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

    
520
  public TwistyObject getOldObject()
521
    {
522
    return mOldObject;
523
    }
524

    
525
///////////////////////////////////////////////////////////////////////////////////////////////////
526

    
527
  public float getMoveX()
528
    {
529
    return mMoveX;
530
    }
531

    
532
///////////////////////////////////////////////////////////////////////////////////////////////////
533

    
534
  public float getMoveY()
535
    {
536
    return mMoveY;
537
    }
538

    
539
///////////////////////////////////////////////////////////////////////////////////////////////////
540

    
541
  public ObjectLibInterface getInterface()
542
    {
543
    return mInterface;
544
    }
545

    
546
///////////////////////////////////////////////////////////////////////////////////////////////////
547
// PUBLIC API
548
///////////////////////////////////////////////////////////////////////////////////////////////////
549

    
550
  public void savePreferences(OperatingSystemInterface os)
551
    {
552
    if( mNewObject!=null )
553
      {
554
      mNewObject.savePreferences(os);
555
      }
556
    }
557

    
558
///////////////////////////////////////////////////////////////////////////////////////////////////
559

    
560
  public void restorePreferences(OperatingSystemInterface os)
561
    {
562
    mRestoreStickersOnly = false;
563
    mOS = os;
564
    }
565

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

    
568
  public void restoreStickers(OperatingSystemInterface os)
569
    {
570
    mRestoreStickersOnly = true;
571
    mOS = os;
572
    }
573

    
574
///////////////////////////////////////////////////////////////////////////////////////////////////
575

    
576
  public void changeObject(int ordinal, int iconMode, InitAssets asset)
577
    {
578
    mChangeObject = true;
579
    mOrdinal    = ordinal;
580
    mIconMode   = iconMode;
581
    mAsset      = asset;
582
    }
583

    
584
///////////////////////////////////////////////////////////////////////////////////////////////////
585

    
586
  public void setDefaultRotation(int numFaces)
587
    {
588
    if( mController!=null && mController.getRotateOnCreation() )
589
      {
590
      switch(numFaces)
591
        {
592
        case  4: mController.rotateNow(ShapeTetrahedron.DEFAULT_ROT ); break;
593
        case  6: mController.rotateNow(ShapeHexahedron.DEFAULT_ROT  ); break;
594
        case  8: mController.rotateNow(ShapeOctahedron.DEFAULT_ROT  ); break;
595
        case 12: mController.rotateNow(ShapeDodecahedron.DEFAULT_ROT); break;
596
        }
597
      }
598
    }
599

    
600
///////////////////////////////////////////////////////////////////////////////////////////////////
601

    
602
  public boolean isRotationBlocked()
603
    {
604
    return mRotationBlocked;
605
    }
606

    
607
///////////////////////////////////////////////////////////////////////////////////////////////////
608

    
609
  public boolean isScramblingAndSolvingNotBlocked()
610
    {
611
    return !mScramblingAndSolvingBlocked;
612
    }
613

    
614
///////////////////////////////////////////////////////////////////////////////////////////////////
615

    
616
  public void blockRotation(int place)
617
    {
618
    mRotationBlocked = true;
619
  //  mBlockController.rotationBlocked(place);
620
    }
621

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

    
624
  public void unblockRotation()
625
    {
626
    mRotationBlocked = false;
627
  //  mBlockController.rotationUnblocked();
628
    }
629

    
630
///////////////////////////////////////////////////////////////////////////////////////////////////
631

    
632
  public void unblockScramblingAndSolving()
633
    {
634
    mScramblingAndSolvingBlocked = false;
635
   // mBlockController.scramblingAndSolvingUnblocked();
636
    }
637

    
638
///////////////////////////////////////////////////////////////////////////////////////////////////
639

    
640
  public void preRender()
641
    {
642
    if( mSolve                    ) solveNow();
643
    if( mSetQuat                  ) setQuatNow();
644
    if( mFinishRotation           ) finishRotationNow();
645
    if( mRemoveManualRotation     ) removeManualRotationNow();
646
    if( mRemoveProgramaticRotation) removeProgramaticRotationNow();
647
    if( mChangeObject             ) changeObjectNow();
648
    if( mSolveObject              ) solveObjectNow();
649
    if( mScrambleObject           ) scrambleObjectNow();
650
    if( mFastScrambleObject       ) fastScrambleObjectNow();
651
    if( mPresentObject            ) presentObjectNow();
652
    if( mAddRotation              ) addRotationNow();
653
    if( mInitializeObject         ) initializeObjectNow();
654
    if( mApplyScrambles           ) applyScramblesNow();
655
    if( mResetAllTextureMaps      ) resetAllTextureMapsNow();
656
    if( mSetTextureMap            ) setTextureMapNow();
657
    if( mResetTextureEffect       ) resetTextureNow();
658
    if( mRepaintPuzzleFace        ) repaintPuzzleFaceNow();
659
    }
660

    
661
///////////////////////////////////////////////////////////////////////////////////////////////////
662

    
663
  public void addRotation(MovesFinished listener, int axis, int rowBitmap, int bareAngle, int millPreDegree)
664
    {
665
    int[][] basicAngles = mNewObject==null ? null : mNewObject.getBasicAngles();
666

    
667
    if( basicAngles!=null && axis<basicAngles.length )
668
      {
669
      int row = computeRowFromBitmap(rowBitmap);
670

    
671
      if( row<basicAngles[axis].length )
672
        {
673
        int basicAngle= basicAngles[axis][row];
674
        int angle     = bareAngle*(360/basicAngle);
675
        int duration  = Math.abs(angle)*millPreDegree;
676

    
677
        mAddActionListener    = listener;
678
        mAddRotationAxis      = axis;
679
        mAddRotationRowBitmap = rowBitmap;
680
        mAddRotationAngle     = angle;
681
        mAddRotationDuration  = duration;
682
        mAddRotationTime      = System.currentTimeMillis();
683
        mAddRotation          = true;
684

    
685
        if( listener instanceof ScrambleEffect )
686
          {
687
          mDebug += (mNewObject==null ? "null" : mNewObject.reportState() );
688
          mDebug += ("(a "+axis+" "+rowBitmap+" "+angle+" "+(mAddRotationTime-mScrambleStartTime))+")";
689
          }
690
        }
691
      }
692
    }
693

    
694
///////////////////////////////////////////////////////////////////////////////////////////////////
695

    
696
  public void initializeObject(int[][] moves)
697
    {
698
    mInitializeObject = true;
699
    mInitMoves = moves;
700
    }
701

    
702
///////////////////////////////////////////////////////////////////////////////////////////////////
703

    
704
  public void applyScrambles(int[][] moves)
705
    {
706
    mApplyScrambles = true;
707
    mScraMoves = moves;
708
    }
709

    
710
///////////////////////////////////////////////////////////////////////////////////////////////////
711

    
712
  public boolean scrambleObject(int num)
713
    {
714
    if( !mScramblingAndSolvingBlocked )
715
      {
716
      mScrambleObject = true;
717
      mScrambleObjectNum = num;
718
      mDebug = "";
719
      mScrambleStartTime = System.currentTimeMillis();
720
      return true;
721
      }
722
    return false;
723
    }
724

    
725
///////////////////////////////////////////////////////////////////////////////////////////////////
726

    
727
  public boolean fastScrambleObject(int duration, int num)
728
    {
729
    if( !mScramblingAndSolvingBlocked )
730
      {
731
      mFastScrambleObject = true;
732
      mScrambleObjectNum = num;
733
      mScrambleObjectDuration = duration;
734
      mDebug = "";
735
      mScrambleStartTime = System.currentTimeMillis();
736
      return true;
737
      }
738
    return false;
739
    }
740

    
741
///////////////////////////////////////////////////////////////////////////////////////////////////
742

    
743
  public void presentObject(int num, int duration)
744
    {
745
    mScrambleObjectNum = num;
746
    mPresentDuration = duration;
747
    mPresentObject = true;
748
    }
749

    
750
///////////////////////////////////////////////////////////////////////////////////////////////////
751
// this starts the Solve Effect
752

    
753
  public void solveObject()
754
    {
755
    if( !mScramblingAndSolvingBlocked )
756
      {
757
      mSolveObject = true;
758
      }
759
    }
760

    
761
///////////////////////////////////////////////////////////////////////////////////////////////////
762
// this only sets the cubits state to solved
763

    
764
  public void solveOnly()
765
    {
766
    mSolve = true;
767
    }
768

    
769
///////////////////////////////////////////////////////////////////////////////////////////////////
770

    
771
  public void resetTextureMapsEffect(int duration)
772
    {
773
    mRestickerDuration = duration;
774
    mResetTextureEffect = true;
775
    }
776

    
777
///////////////////////////////////////////////////////////////////////////////////////////////////
778

    
779
  public void resetAllTextureMaps()
780
    {
781
    mResetAllTextureMaps = true;
782
    }
783

    
784
///////////////////////////////////////////////////////////////////////////////////////////////////
785

    
786
  public TwistyObject getObject()
787
    {
788
    return mNewObject;
789
    }
790

    
791
///////////////////////////////////////////////////////////////////////////////////////////////////
792

    
793
  public TwistyObjectNode getObjectNode()
794
    {
795
    return mController.getNode();
796
    }
797

    
798
///////////////////////////////////////////////////////////////////////////////////////////////////
799

    
800
  public void effectFinished(final long effectID)
801
    {
802
    if( effectID == mRotationFinishedID )
803
      {
804
      mRotationFinishedID = 0;
805
      removeManualRotation();
806
      }
807
    else if( effectID == mAddRotationID )
808
      {
809
      mAddRotationID = 0;
810
      mRemoveProgramaticRotationID = effectID;
811
      removeProgramaticRotation();
812
      }
813
    else
814
      {
815
      for(int i=0; i<BaseEffect.Type.LENGTH; i++)
816
        {
817
        if( effectID == mEffectID[i] )
818
          {
819
          if( i==BaseEffect.Type.SCRAMBLE.ordinal() )
820
            {
821
            mScrambleEndTime = System.currentTimeMillis();
822
            mInterface.onScrambleEffectFinished();
823
            }
824
          else if( i==BaseEffect.Type.FAST_SCRAMBLE.ordinal() )
825
            {
826
            mInterface.onScrambleEffectFinished();
827
            unblockEverything();
828
            }
829
          else if( i==BaseEffect.Type.WIN.ordinal() )
830
            {
831
            mInterface.onWinEffectFinished(mScrambleStartTime,mScrambleEndTime-mScrambleStartTime,mDebug,mScrambleObjectNum);
832
            }
833
          else
834
            {
835
            if( mOldObject!=null ) mOldObject.releaseResources();
836
            unblockEverything();
837
            }
838

    
839
          break;
840
          }
841
        }
842
      }
843
    }
844
  }
(3-3/9)