Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / main / ObjectPreRender.java @ 7e8750c9

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 float mTextureBorders, mTextureCorners;
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
          mNewObject.restorePreferences(mOS);
145
          mOS = null;
146
          }
147

    
148
        mIsSolved = mNewObject.isSolved();
149
        }
150
      }
151
    }
152

    
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
// do all 'adjustable' effects (SizeChange, Solve, Scramble)
155

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

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

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

    
178
///////////////////////////////////////////////////////////////////////////////////////////////////
179

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

    
185
    boolean solved = mNewObject.isSolved();
186

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

    
199
    rememberMove(mFinishAxis,mFinishRow,angle);
200

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

    
209
    mIsSolved = solved;
210
    }
211

    
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213

    
214
  private void removeManualRotation()
215
    {
216
    mRemoveManualRotation = true;
217
    }
218

    
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

    
221
  private void removeProgramaticRotation()
222
    {
223
    mRemoveProgramaticRotation = true;
224
    }
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

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

    
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236

    
237
  private void addRotationNow()
238
    {
239
    mAddRotation = false;
240

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

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

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

    
270
      mInterface.reportProblem(error,true);
271
      unblockEverything();
272
      }
273
    }
274

    
275
///////////////////////////////////////////////////////////////////////////////////////////////////
276

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

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

    
289
///////////////////////////////////////////////////////////////////////////////////////////////////
290

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

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301

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

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

    
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321

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

    
330
///////////////////////////////////////////////////////////////////////////////////////////////////
331

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

    
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339

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

    
346
///////////////////////////////////////////////////////////////////////////////////////////////////
347

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

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

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

    
364
///////////////////////////////////////////////////////////////////////////////////////////////////
365

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

    
372
///////////////////////////////////////////////////////////////////////////////////////////////////
373

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

    
380
///////////////////////////////////////////////////////////////////////////////////////////////////
381

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

    
388
///////////////////////////////////////////////////////////////////////////////////////////////////
389

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

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

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

    
404
///////////////////////////////////////////////////////////////////////////////////////////////////
405

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

    
412
///////////////////////////////////////////////////////////////////////////////////////////////////
413

    
414
  private int computeRowFromBitmap(int rowBitmap)
415
    {
416
    int index = 0;
417

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

    
425
    return 0;
426
    }
427

    
428
///////////////////////////////////////////////////////////////////////////////////////////////////
429

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

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

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

    
451
///////////////////////////////////////////////////////////////////////////////////////////////////
452

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

    
460
    mFinishRotation = true;
461
    }
462

    
463
///////////////////////////////////////////////////////////////////////////////////////////////////
464

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

    
469
    mCubit    = cubit;
470
    mFace     = face;
471
    mNewColor = newColor;
472
    }
473

    
474
///////////////////////////////////////////////////////////////////////////////////////////////////
475

    
476
  public void repaintPuzzleFace(int cubit, int face, int newColor, float borders, float corners)
477
    {
478
    mRepaintPuzzleFace = true;
479

    
480
    mCubit    = cubit;
481
    mFace     = face;
482
    mNewColor = newColor;
483
    mTextureBorders = borders;
484
    mTextureCorners = corners;
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
    mOS = os;
563
    }
564

    
565
///////////////////////////////////////////////////////////////////////////////////////////////////
566

    
567
  public void changeObject(int ordinal, int iconMode, InitAssets asset)
568
    {
569
    mChangeObject = true;
570
    mOrdinal    = ordinal;
571
    mIconMode   = iconMode;
572
    mAsset      = asset;
573
    }
574

    
575
///////////////////////////////////////////////////////////////////////////////////////////////////
576

    
577
  public void setDefaultRotation(int numFaces)
578
    {
579
    if( mController!=null && mController.getRotateOnCreation() )
580
      {
581
      switch(numFaces)
582
        {
583
        case  4: mController.rotateNow(ShapeTetrahedron.DEFAULT_ROT ); break;
584
        case  6: mController.rotateNow(ShapeHexahedron.DEFAULT_ROT  ); break;
585
        case  8: mController.rotateNow(ShapeOctahedron.DEFAULT_ROT  ); break;
586
        case 12: mController.rotateNow(ShapeDodecahedron.DEFAULT_ROT); break;
587
        }
588
      }
589
    }
590

    
591
///////////////////////////////////////////////////////////////////////////////////////////////////
592

    
593
  public boolean isRotationBlocked()
594
    {
595
    return mRotationBlocked;
596
    }
597

    
598
///////////////////////////////////////////////////////////////////////////////////////////////////
599

    
600
  public boolean isScramblingAndSolvingNotBlocked()
601
    {
602
    return !mScramblingAndSolvingBlocked;
603
    }
604

    
605
///////////////////////////////////////////////////////////////////////////////////////////////////
606

    
607
  public void blockRotation(int place)
608
    {
609
    mRotationBlocked = true;
610
  //  mBlockController.rotationBlocked(place);
611
    }
612

    
613
///////////////////////////////////////////////////////////////////////////////////////////////////
614

    
615
  public void unblockRotation()
616
    {
617
    mRotationBlocked = false;
618
  //  mBlockController.rotationUnblocked();
619
    }
620

    
621
///////////////////////////////////////////////////////////////////////////////////////////////////
622

    
623
  public void unblockScramblingAndSolving()
624
    {
625
    mScramblingAndSolvingBlocked = false;
626
   // mBlockController.scramblingAndSolvingUnblocked();
627
    }
628

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

    
631
  public void preRender()
632
    {
633
    if( mSolve                    ) solveNow();
634
    if( mSetQuat                  ) setQuatNow();
635
    if( mFinishRotation           ) finishRotationNow();
636
    if( mRemoveManualRotation     ) removeManualRotationNow();
637
    if( mRemoveProgramaticRotation) removeProgramaticRotationNow();
638
    if( mChangeObject             ) changeObjectNow();
639
    if( mSolveObject              ) solveObjectNow();
640
    if( mScrambleObject           ) scrambleObjectNow();
641
    if( mFastScrambleObject       ) fastScrambleObjectNow();
642
    if( mPresentObject            ) presentObjectNow();
643
    if( mAddRotation              ) addRotationNow();
644
    if( mInitializeObject         ) initializeObjectNow();
645
    if( mApplyScrambles           ) applyScramblesNow();
646
    if( mResetAllTextureMaps      ) resetAllTextureMapsNow();
647
    if( mSetTextureMap            ) setTextureMapNow();
648
    if( mResetTextureEffect       ) resetTextureNow();
649
    if( mRepaintPuzzleFace        ) repaintPuzzleFaceNow();
650
    }
651

    
652
///////////////////////////////////////////////////////////////////////////////////////////////////
653

    
654
  public void addRotation(MovesFinished listener, int axis, int rowBitmap, int bareAngle, int millPreDegree)
655
    {
656
    int[][] basicAngles = mNewObject==null ? null : mNewObject.getBasicAngles();
657

    
658
    if( basicAngles!=null && axis<basicAngles.length )
659
      {
660
      int row = computeRowFromBitmap(rowBitmap);
661

    
662
      if( row<basicAngles[axis].length )
663
        {
664
        int basicAngle= basicAngles[axis][row];
665
        int angle     = bareAngle*(360/basicAngle);
666
        int duration  = Math.abs(angle)*millPreDegree;
667

    
668
        mAddActionListener    = listener;
669
        mAddRotationAxis      = axis;
670
        mAddRotationRowBitmap = rowBitmap;
671
        mAddRotationAngle     = angle;
672
        mAddRotationDuration  = duration;
673
        mAddRotationTime      = System.currentTimeMillis();
674
        mAddRotation          = true;
675

    
676
        if( listener instanceof ScrambleEffect )
677
          {
678
          mDebug += (mNewObject==null ? "null" : mNewObject.reportState() );
679
          mDebug += ("(a "+axis+" "+rowBitmap+" "+angle+" "+(mAddRotationTime-mScrambleStartTime))+")";
680
          }
681
        }
682
      }
683
    }
684

    
685
///////////////////////////////////////////////////////////////////////////////////////////////////
686

    
687
  public void initializeObject(int[][] moves)
688
    {
689
    mInitializeObject = true;
690
    mInitMoves = moves;
691
    }
692

    
693
///////////////////////////////////////////////////////////////////////////////////////////////////
694

    
695
  public void applyScrambles(int[][] moves)
696
    {
697
    mApplyScrambles = true;
698
    mScraMoves = moves;
699
    }
700

    
701
///////////////////////////////////////////////////////////////////////////////////////////////////
702

    
703
  public boolean scrambleObject(int num)
704
    {
705
    if( !mScramblingAndSolvingBlocked )
706
      {
707
      mScrambleObject = true;
708
      mScrambleObjectNum = num;
709
      mDebug = "";
710
      mScrambleStartTime = System.currentTimeMillis();
711
      return true;
712
      }
713
    return false;
714
    }
715

    
716
///////////////////////////////////////////////////////////////////////////////////////////////////
717

    
718
  public boolean fastScrambleObject(int duration, int num)
719
    {
720
    if( !mScramblingAndSolvingBlocked )
721
      {
722
      mFastScrambleObject = true;
723
      mScrambleObjectNum = num;
724
      mScrambleObjectDuration = duration;
725
      mDebug = "";
726
      mScrambleStartTime = System.currentTimeMillis();
727
      return true;
728
      }
729
    return false;
730
    }
731

    
732
///////////////////////////////////////////////////////////////////////////////////////////////////
733

    
734
  public void presentObject(int num, int duration)
735
    {
736
    mScrambleObjectNum = num;
737
    mPresentDuration = duration;
738
    mPresentObject = true;
739
    }
740

    
741
///////////////////////////////////////////////////////////////////////////////////////////////////
742
// this starts the Solve Effect
743

    
744
  public void solveObject()
745
    {
746
    if( !mScramblingAndSolvingBlocked )
747
      {
748
      mSolveObject = true;
749
      }
750
    }
751

    
752
///////////////////////////////////////////////////////////////////////////////////////////////////
753
// this only sets the cubits state to solved
754

    
755
  public void solveOnly()
756
    {
757
    mSolve = true;
758
    }
759

    
760
///////////////////////////////////////////////////////////////////////////////////////////////////
761

    
762
  public void resetTextureMapsEffect(int duration)
763
    {
764
    mRestickerDuration = duration;
765
    mResetTextureEffect = true;
766
    }
767

    
768
///////////////////////////////////////////////////////////////////////////////////////////////////
769

    
770
  public void resetAllTextureMaps()
771
    {
772
    mResetAllTextureMaps = true;
773
    }
774

    
775
///////////////////////////////////////////////////////////////////////////////////////////////////
776

    
777
  public TwistyObject getObject()
778
    {
779
    return mNewObject;
780
    }
781

    
782
///////////////////////////////////////////////////////////////////////////////////////////////////
783

    
784
  public TwistyObjectNode getObjectNode()
785
    {
786
    return mController.getNode();
787
    }
788

    
789
///////////////////////////////////////////////////////////////////////////////////////////////////
790

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

    
830
          break;
831
          }
832
        }
833
      }
834
    }
835
  }
(3-3/9)