Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / main / ObjectPreRender.java @ 5ce579d2

1 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 4c87f159 Leszek Koltunski
// 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 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objectlib.main;
11
12 ecf3d6e3 Leszek Koltunski
import org.distorted.library.message.EffectListener;
13 02d80fe6 Leszek Koltunski
import org.distorted.library.type.Static3D;
14 82eb152a Leszek Koltunski
15 e1a86bf2 Leszek Koltunski
import org.distorted.library.type.Static4D;
16 b3fff6fb Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectLibInterface;
17 7c111294 Leszek Koltunski
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 79c7c950 Leszek Koltunski
import org.distorted.objectlib.helpers.OperatingSystemInterface;
22 361fd0de leszek
import org.distorted.objectlib.metadata.ListObjects;
23 b31249d6 Leszek Koltunski
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 15e5214c Leszek Koltunski
28 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
29
30 ecf3d6e3 Leszek Koltunski
public class ObjectPreRender implements EffectListener
31 7c111294 Leszek Koltunski
  {
32 e8d8c12a Leszek Koltunski
  private static final int MAX_SLOW_SCRAMBLE = 50;
33
34 15e5214c Leszek Koltunski
  private final ObjectControl mController;
35 cf93ea4e Leszek Koltunski
  private InitAssets mAsset;
36 e1a86bf2 Leszek Koltunski
  private int mOrdinal;
37 7c111294 Leszek Koltunski
  private TwistyObject mOldObject, mNewObject;
38 79c7c950 Leszek Koltunski
  private OperatingSystemInterface mOS;
39 7c111294 Leszek Koltunski
  private MovesFinished mAddActionListener;
40 b3fff6fb Leszek Koltunski
  private final ObjectLibInterface mInterface;
41 7c111294 Leszek Koltunski
  private String mDebug;
42 72d6857c Leszek Koltunski
  private float mMoveX, mMoveY;
43 64c209f5 Leszek Koltunski
  private float mScale;
44 7c111294 Leszek Koltunski
45 4a014840 leszek
  private boolean mFinishRotation, mRemoveManualRotation, mRemoveProgramaticRotation, mAddRotation,
46 4c2c0f44 Leszek Koltunski
                  mSetQuat, mChangeObject, mSolveObject, mScrambleObject, mFastScrambleObject,
47
                  mPresentObject,mInitializeObject, mSetTextureMap, mResetAllTextureMaps, mSolve,
48 55acff1e leszek
                  mApplyScrambles, mResetTextureEffect, mRepaintPuzzleFace;
49 7205c655 Leszek Koltunski
  private boolean mScramblingAndSolvingBlocked, mRotationBlocked, mIsSolved;
50 7c111294 Leszek Koltunski
  private long mRotationFinishedID;
51
  private final long[] mEffectID;
52 f557ecc4 leszek
  private int[][] mInitMoves, mScraMoves;
53 f7e30f36 Leszek Koltunski
  private int mScrambleObjectNum, mScrambleObjectDuration;
54 7c111294 Leszek Koltunski
  private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle;
55
  private long mAddRotationDuration;
56 4c2c0f44 Leszek Koltunski
  private int mPresentDuration, mRestickerDuration;
57 4a014840 leszek
  private long mAddRotationID, mRemoveProgramaticRotationID;
58 7c111294 Leszek Koltunski
  private int mCubit, mFace, mNewColor;
59 bb58b357 leszek
  private int mFinishAxis, mFinishRow;
60
  private float mFinishAngle, mAvgSpeed;
61 adb3a093 Leszek Koltunski
  private long mScrambleStartTime, mScrambleEndTime;
62 1fda81c4 leszek
  private int mIconMode;
63 7c111294 Leszek Koltunski
64 8c069e23 Leszek Koltunski
  // debugging only
65
  private long mAddRotationTime;
66
67 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
68
69 440f8e33 Leszek Koltunski
  public ObjectPreRender(ObjectControl controller, ObjectLibInterface actioner)
70 7c111294 Leszek Koltunski
    {
71 b3fff6fb Leszek Koltunski
    mInterface = actioner;
72 15e5214c Leszek Koltunski
    mController = controller;
73 7c111294 Leszek Koltunski
74
    mFinishRotation       = false;
75 4a014840 leszek
    mRemoveManualRotation = false;
76
    mRemoveProgramaticRotation = false;
77 7c111294 Leszek Koltunski
    mAddRotation          = false;
78
    mSetQuat              = false;
79
    mChangeObject         = false;
80
    mSolveObject          = false;
81
    mSolve                = false;
82
    mScrambleObject       = false;
83 186bc982 Leszek Koltunski
    mFastScrambleObject   = false;
84 826d293e Leszek Koltunski
    mPresentObject        = false;
85 4c2c0f44 Leszek Koltunski
    mResetTextureEffect   = false;
86 55acff1e leszek
    mRepaintPuzzleFace    = false;
87 7c111294 Leszek Koltunski
88
    mOldObject = null;
89
    mNewObject = null;
90
91
    mDebug = "";
92
    mScrambleObjectNum = 0;
93 64c209f5 Leszek Koltunski
    mScale = 1.0f;
94 7c111294 Leszek Koltunski
95
    mEffectID = new long[BaseEffect.Type.LENGTH];
96
97 36082229 leszek
  //  mBlockController = new BlockController(this);
98 7c111294 Leszek Koltunski
    unblockEverything();
99
    }
100
101
///////////////////////////////////////////////////////////////////////////////////////////////////
102
103 1fda81c4 leszek
  private void createObjectNow(int ordinal, int iconMode, InitAssets assets)
104 7c111294 Leszek Koltunski
    {
105 3ce95490 Leszek Koltunski
    long time1 = System.currentTimeMillis();
106 72d6857c Leszek Koltunski
    Static3D move = new Static3D(mMoveX,mMoveY,0);
107 e1a86bf2 Leszek Koltunski
    Static4D quat = mController.getQuat();
108 3ce95490 Leszek Koltunski
    TwistyObject tmp;
109
    boolean error = false;
110 7c111294 Leszek Koltunski
111 cf93ea4e Leszek Koltunski
    if( assets==null || assets.noJsonStream() )
112 3ce95490 Leszek Koltunski
      {
113 361fd0de leszek
      tmp = ListObjects.create( ordinal, iconMode, quat, move, mScale, assets);
114 3ce95490 Leszek Koltunski
      }
115
    else
116
      {
117 1fda81c4 leszek
      tmp = new TwistyJson( iconMode, quat, move, mScale, assets);
118 3ce95490 Leszek Koltunski
      error = tmp.getError();
119
      }
120 594bbce0 Leszek Koltunski
121 3ce95490 Leszek Koltunski
    if( error )
122
      {
123
      String errorString = tmp.getErrorString();
124
      mInterface.reportJSONError(errorString,ordinal);
125
      }
126
    else
127 7c111294 Leszek Koltunski
      {
128 3ce95490 Leszek Koltunski
      if( mOldObject!=null ) mOldObject.releaseResources();
129
      mOldObject = mNewObject;
130
      mNewObject = tmp;
131
132
      long time2 = System.currentTimeMillis();
133
      mInterface.onObjectCreated(time2-time1);
134 9a694085 Leszek Koltunski
135 3ce95490 Leszek Koltunski
      if( mNewObject!=null )
136 9a694085 Leszek Koltunski
        {
137 3ce95490 Leszek Koltunski
        mNewObject.setLibInterface(mInterface);
138
        mController.setTouchControl(mNewObject);
139 30bd2f96 Leszek Koltunski
        mNewObject.setObjectRatioNow(mScale, mController.getScalingSize() );
140 3ce95490 Leszek Koltunski
141 79c7c950 Leszek Koltunski
        if( mOS!=null )
142 3ce95490 Leszek Koltunski
          {
143 79c7c950 Leszek Koltunski
          mNewObject.restorePreferences(mOS);
144
          mOS = null;
145 3ce95490 Leszek Koltunski
          }
146
147
        mIsSolved = mNewObject.isSolved();
148 9a694085 Leszek Koltunski
        }
149 7c111294 Leszek Koltunski
      }
150
    }
151
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153
// do all 'adjustable' effects (SizeChange, Solve, Scramble)
154
155 b1370e3b Leszek Koltunski
  private void doEffectNow(BaseEffect.Type type, int duration)
156 7c111294 Leszek Koltunski
    {
157
    try
158
      {
159
      int index = type.ordinal();
160 b1370e3b Leszek Koltunski
      mEffectID[index] = type.startEffect(this,duration);
161 7c111294 Leszek Koltunski
      }
162
    catch( Exception ex )
163
      {
164
      android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
165
      unblockEverything();
166
      }
167
    }
168
169 bb58b357 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
170
171
  private void rememberMove(int axis, int row, float angle)
172
    {
173
    mDebug += (mNewObject==null ? "[null]" : mNewObject.reportState() );
174
    mDebug += ("(m "+axis+" "+(1<<row)+" "+angle+" "+(System.currentTimeMillis()-mScrambleEndTime))+")";
175
    }
176
177 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
178
179 4a014840 leszek
  private void removeManualRotationNow()
180 7c111294 Leszek Koltunski
    {
181 4a014840 leszek
    mRemoveManualRotation =false;
182
    float angle = mNewObject.removeRotation();
183 7c111294 Leszek Koltunski
184
    boolean solved = mNewObject.isSolved();
185
186
    if( solved && !mIsSolved )
187
      {
188 b3fff6fb Leszek Koltunski
      mInterface.onSolved();
189 7c111294 Leszek Koltunski
      unblockEverything();
190 b1370e3b Leszek Koltunski
      int duration = BaseEffect.Type.WIN.getDuration();
191
      doEffectNow( BaseEffect.Type.WIN, duration );
192 7c111294 Leszek Koltunski
      }
193
    else
194
      {
195
      unblockEverything();
196
      }
197
198 bb58b357 leszek
    rememberMove(mFinishAxis,mFinishRow,angle);
199
200
    if( angle!=0 )
201
      {
202
      int[][] basicAngles = mNewObject.getBasicAngles();
203
      int basic = basicAngles[mFinishAxis][mFinishRow];
204
      int realAngle = (int)((angle*basic)/360);
205
      mInterface.onRemoveRotation(mFinishAxis,mFinishRow,realAngle);
206
      }
207
208 7c111294 Leszek Koltunski
    mIsSolved = solved;
209
    }
210
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212
213 4a014840 leszek
  private void removeManualRotation()
214 7c111294 Leszek Koltunski
    {
215 4a014840 leszek
    mRemoveManualRotation = true;
216 7c111294 Leszek Koltunski
    }
217
218
///////////////////////////////////////////////////////////////////////////////////////////////////
219
220 4a014840 leszek
  private void removeProgramaticRotation()
221 7c111294 Leszek Koltunski
    {
222 4a014840 leszek
    mRemoveProgramaticRotation = true;
223 7c111294 Leszek Koltunski
    }
224
225
///////////////////////////////////////////////////////////////////////////////////////////////////
226
227 4a014840 leszek
  private void removeProgramaticRotationNow()
228 7c111294 Leszek Koltunski
    {
229 4a014840 leszek
    mRemoveProgramaticRotation =false;
230
    mNewObject.removeRotation();
231
    mAddActionListener.onActionFinished(mRemoveProgramaticRotationID);
232 7c111294 Leszek Koltunski
    }
233
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235
236
  private void addRotationNow()
237
    {
238
    mAddRotation = false;
239
240 d85de775 Leszek Koltunski
    if( mNewObject.getNumAxis() > mAddRotationAxis )
241 8c069e23 Leszek Koltunski
      {
242 4a014840 leszek
      mAddRotationID = mNewObject.addRotation( this, mAddRotationAxis, mAddRotationRowBitmap,
243
                                                     mAddRotationAngle, mAddRotationDuration);
244 8c069e23 Leszek Koltunski
245 605f319b Leszek Koltunski
      // failed to add effect (previous rotation hasn't been removed yet)
246
      if( mAddRotationID==0 )
247
        {
248
        mAddActionListener.onActionFinished(0);
249
        }
250
      // the rotation we have just added has forced a finish() of an ongoing
251
      // manual rotation. So the effect that's going to finish is not the manual
252
      // rotation (we have just removed it) but the rotation we have just added
253
      // here - so set mRotationFinishedID to 0
254
      else if( mAddRotationID<0 )
255
        {
256
        mAddRotationID = -mAddRotationID;
257
        mRotationFinishedID = 0;
258 8c069e23 Leszek Koltunski
        }
259
      }
260
    else // should never happen but Firebase says it sometimes does
261 7c111294 Leszek Koltunski
      {
262 8c069e23 Leszek Koltunski
      long timeNow = System.currentTimeMillis();
263
      Class<? extends MovesFinished> clazz = mAddActionListener.getClass();
264
      String name = clazz.getSimpleName();
265
266
      String error = "time now: "+timeNow+" add time: "+mAddRotationTime+" axis="+mAddRotationAxis+
267
                      "object: "+mNewObject.getShortName()+" "+name;
268
269 32c1697e Leszek Koltunski
      mInterface.reportProblem(error,true);
270 7c111294 Leszek Koltunski
      unblockEverything();
271
      }
272
    }
273
274
///////////////////////////////////////////////////////////////////////////////////////////////////
275
276
  private void finishRotationNow()
277
    {
278
    mFinishRotation = false;
279 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_0);
280 4a014840 leszek
    mRotationFinishedID = mNewObject.finishRotation(this,mFinishAxis,mFinishRow,mFinishAngle,mAvgSpeed);
281 7c111294 Leszek Koltunski
282
    if( mRotationFinishedID==0 ) // failed to add effect - should never happen
283
      {
284
      unblockEverything();
285
      }
286
    }
287
288
///////////////////////////////////////////////////////////////////////////////////////////////////
289
290
  private void changeObjectNow()
291
    {
292
    mChangeObject = false;
293 e1a86bf2 Leszek Koltunski
    blockEverything(BlockController.PLACE_1);
294 1fda81c4 leszek
    createObjectNow(mOrdinal,mIconMode,mAsset);
295 b1370e3b Leszek Koltunski
    int duration = BaseEffect.Type.SIZECHANGE.getDuration();
296
    doEffectNow( BaseEffect.Type.SIZECHANGE, duration );
297 568d4698 Leszek Koltunski
    }
298
299 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
300
301
  private void scrambleObjectNow()
302
    {
303
    mScrambleObject = false;
304
    mIsSolved       = false;
305 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_3);
306 e8d8c12a Leszek Koltunski
307
    if( mScrambleObjectNum<MAX_SLOW_SCRAMBLE )
308
      {
309
      int duration = BaseEffect.Type.SCRAMBLE.getDuration();
310
      doEffectNow( BaseEffect.Type.SCRAMBLE, duration );
311
      }
312
    else
313
      {
314
      int duration = BaseEffect.Type.FAST_SCRAMBLE.getDuration();
315
      doEffectNow( BaseEffect.Type.FAST_SCRAMBLE, duration );
316
      }
317 7c111294 Leszek Koltunski
    }
318
319 186bc982 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
320
321
  private void fastScrambleObjectNow()
322
    {
323
    mFastScrambleObject = false;
324
    mIsSolved           = false;
325
    blockEverything(BlockController.PLACE_5);
326 f7e30f36 Leszek Koltunski
    doEffectNow( BaseEffect.Type.FAST_SCRAMBLE, mScrambleObjectDuration );
327 186bc982 Leszek Koltunski
    }
328
329 4c2c0f44 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
330
331
  private void resetTextureNow()
332
    {
333
    mResetTextureEffect = false;
334
    doEffectNow( BaseEffect.Type.RESTICKER, mRestickerDuration );
335
    }
336
337 826d293e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
338
339
  private void presentObjectNow()
340
    {
341
    mPresentObject = false;
342 b1370e3b Leszek Koltunski
    doEffectNow( BaseEffect.Type.PRESENT, mPresentDuration );
343 826d293e Leszek Koltunski
    }
344
345 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
346
347
  private void solveObjectNow()
348
    {
349
    mSolveObject = false;
350 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_4);
351 b1370e3b Leszek Koltunski
    int duration = BaseEffect.Type.SOLVE.getDuration();
352
    doEffectNow( BaseEffect.Type.SOLVE, duration );
353 7c111294 Leszek Koltunski
    }
354
355
///////////////////////////////////////////////////////////////////////////////////////////////////
356
357
  private void solveNow()
358
    {
359
    mSolve = false;
360 a57e6870 Leszek Koltunski
    if( mNewObject!=null ) mNewObject.solve();
361 7c111294 Leszek Koltunski
    }
362
363
///////////////////////////////////////////////////////////////////////////////////////////////////
364
365
  private void initializeObjectNow()
366
    {
367
    mInitializeObject = false;
368 f557ecc4 leszek
    mNewObject.initializeObject(mInitMoves);
369 7c111294 Leszek Koltunski
    }
370
371 d356eecc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
372
373
  private void applyScramblesNow()
374
    {
375
    mApplyScrambles = false;
376 f557ecc4 leszek
    mNewObject.applyScrambles(mScraMoves);
377 d356eecc Leszek Koltunski
    }
378
379 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
380
381
  private void setTextureMapNow()
382
    {
383
    mSetTextureMap = false;
384
    if( mNewObject!=null ) mNewObject.setTextureMap(mCubit,mFace,mNewColor);
385
    }
386
387 55acff1e leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
388
389
  private void repaintPuzzleFaceNow()
390
    {
391
    mRepaintPuzzleFace = false;
392 6f5eb9b3 leszek
    if( mNewObject!=null ) mNewObject.repaintPuzzleFace(mCubit,mFace,mNewColor);
393 55acff1e leszek
    }
394
395 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
396
397
  private void resetAllTextureMapsNow()
398
    {
399
    mResetAllTextureMaps = false;
400
    if( mNewObject!=null ) mNewObject.resetAllTextureMaps();
401
    }
402
403
///////////////////////////////////////////////////////////////////////////////////////////////////
404
405
  private void setQuatNow()
406
    {
407
    mSetQuat = false;
408 15e5214c Leszek Koltunski
    mController.setQuat();
409 7c111294 Leszek Koltunski
    }
410
411 beee90ab Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
412
413
  private int computeRowFromBitmap(int rowBitmap)
414
    {
415
    int index = 0;
416
417
    while(index<32)
418
      {
419
      if( (rowBitmap&0x1) != 0 ) return index;
420
      rowBitmap>>=1;
421
      index++;
422
      }
423
424
    return 0;
425
    }
426
427 6b301f56 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
428
429
  private void blockEverything(int place)
430
    {
431 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = true;
432
    mRotationBlocked = true;
433 36082229 leszek
  //  mBlockController.rotationBlocked(place);
434
  //  mBlockController.scramblingAndSolvingBlocked(place);
435 6b301f56 Leszek Koltunski
    }
436
437
///////////////////////////////////////////////////////////////////////////////////////////////////
438 060b445e Leszek Koltunski
// called from ObjectControl; this from app when we switch the screen to READ post-scrambling.
439
// The point: we only unblock having completed the screen switch so that it is impossible to
440
// click the solve button then.
441 6b301f56 Leszek Koltunski
442 060b445e Leszek Koltunski
  void unblockEverything()
443 6b301f56 Leszek Koltunski
    {
444 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = false;
445
    mRotationBlocked = false;
446 36082229 leszek
  //  mBlockController.rotationUnblocked();
447
  //  mBlockController.scramblingAndSolvingUnblocked();
448 6b301f56 Leszek Koltunski
    }
449
450 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
451
452 bb58b357 leszek
  void finishRotation(int currentAxis, int currentRow, float currentAngle, float avgSpeed)
453 7c111294 Leszek Koltunski
    {
454 bb58b357 leszek
    mFinishAxis = currentAxis;
455
    mFinishRow  = currentRow;
456
    mFinishAngle= currentAngle;
457
    mAvgSpeed   = avgSpeed;
458 15e5214c Leszek Koltunski
459
    mFinishRotation = true;
460
    }
461
462
///////////////////////////////////////////////////////////////////////////////////////////////////
463
464
  void setTextureMap(int cubit, int face, int newColor)
465
    {
466
    mSetTextureMap = true;
467
468
    mCubit    = cubit;
469
    mFace     = face;
470
    mNewColor = newColor;
471
    }
472
473 55acff1e leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
474
475 6f5eb9b3 leszek
  public void repaintPuzzleFace(int cubit, int face, int newColor)
476 55acff1e leszek
    {
477
    mRepaintPuzzleFace = true;
478
479
    mCubit    = cubit;
480
    mFace     = face;
481
    mNewColor = newColor;
482
    }
483
484 15e5214c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
485
486
  void setQuatOnNextRender()
487
    {
488
    mSetQuat = true;
489
    }
490
491 02d80fe6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
492
493 72d6857c Leszek Koltunski
  void setMove(float xmove, float ymove)
494 02d80fe6 Leszek Koltunski
    {
495 72d6857c Leszek Koltunski
    mMoveX = xmove;
496
    mMoveY = ymove;
497 02d80fe6 Leszek Koltunski
    }
498
499 64c209f5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
500
501
  void setScale(float scale)
502
    {
503
    mScale = scale;
504
    }
505
506 15e5214c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
507
// INTERNAL API
508
///////////////////////////////////////////////////////////////////////////////////////////////////
509
510
  public int getNumScrambles()
511
    {
512
    return mScrambleObjectNum;
513
    }
514
515
///////////////////////////////////////////////////////////////////////////////////////////////////
516
517
  public TwistyObject getOldObject()
518
    {
519
    return mOldObject;
520
    }
521
522 02d80fe6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
523
524 72d6857c Leszek Koltunski
  public float getMoveX()
525 02d80fe6 Leszek Koltunski
    {
526 72d6857c Leszek Koltunski
    return mMoveX;
527
    }
528
529
///////////////////////////////////////////////////////////////////////////////////////////////////
530
531
  public float getMoveY()
532
    {
533
    return mMoveY;
534 02d80fe6 Leszek Koltunski
    }
535
536 d887aa16 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
537
538
  public ObjectLibInterface getInterface()
539
    {
540
    return mInterface;
541
    }
542
543 15e5214c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
544
// PUBLIC API
545 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
546
547 79c7c950 Leszek Koltunski
  public void savePreferences(OperatingSystemInterface os)
548 7c111294 Leszek Koltunski
    {
549
    if( mNewObject!=null )
550
      {
551 79c7c950 Leszek Koltunski
      mNewObject.savePreferences(os);
552 7c111294 Leszek Koltunski
      }
553
    }
554
555
///////////////////////////////////////////////////////////////////////////////////////////////////
556
557 79c7c950 Leszek Koltunski
  public void restorePreferences(OperatingSystemInterface os)
558 7c111294 Leszek Koltunski
    {
559 79c7c950 Leszek Koltunski
    mOS = os;
560 7c111294 Leszek Koltunski
    }
561
562
///////////////////////////////////////////////////////////////////////////////////////////////////
563
564 1fda81c4 leszek
  public void changeObject(int ordinal, int iconMode, InitAssets asset)
565 7c111294 Leszek Koltunski
    {
566
    mChangeObject = true;
567 e1a86bf2 Leszek Koltunski
    mOrdinal    = ordinal;
568 3bf19410 Leszek Koltunski
    mIconMode   = iconMode;
569 cf93ea4e Leszek Koltunski
    mAsset      = asset;
570 568d4698 Leszek Koltunski
    }
571
572 4a389a4e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
573
574
  public void setDefaultRotation(int numFaces)
575
    {
576 66959ff9 Leszek Koltunski
    if( mController!=null && mController.getRotateOnCreation() )
577 4a389a4e Leszek Koltunski
      {
578
      switch(numFaces)
579
        {
580
        case  4: mController.rotateNow(ShapeTetrahedron.DEFAULT_ROT ); break;
581
        case  6: mController.rotateNow(ShapeHexahedron.DEFAULT_ROT  ); break;
582
        case  8: mController.rotateNow(ShapeOctahedron.DEFAULT_ROT  ); break;
583
        case 12: mController.rotateNow(ShapeDodecahedron.DEFAULT_ROT); break;
584
        }
585
      }
586
    }
587
588 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
589
590 7205c655 Leszek Koltunski
  public boolean isRotationBlocked()
591 7c111294 Leszek Koltunski
    {
592 7205c655 Leszek Koltunski
    return mRotationBlocked;
593 7c111294 Leszek Koltunski
    }
594
595
///////////////////////////////////////////////////////////////////////////////////////////////////
596
597 7205c655 Leszek Koltunski
  public boolean isScramblingAndSolvingNotBlocked()
598 7c111294 Leszek Koltunski
    {
599 7205c655 Leszek Koltunski
    return !mScramblingAndSolvingBlocked;
600 7c111294 Leszek Koltunski
    }
601
602
///////////////////////////////////////////////////////////////////////////////////////////////////
603
604 7205c655 Leszek Koltunski
  public void blockRotation(int place)
605 7c111294 Leszek Koltunski
    {
606 7205c655 Leszek Koltunski
    mRotationBlocked = true;
607 36082229 leszek
  //  mBlockController.rotationBlocked(place);
608 7c111294 Leszek Koltunski
    }
609
610
///////////////////////////////////////////////////////////////////////////////////////////////////
611
612 7205c655 Leszek Koltunski
  public void unblockRotation()
613 7c111294 Leszek Koltunski
    {
614 7205c655 Leszek Koltunski
    mRotationBlocked = false;
615 36082229 leszek
  //  mBlockController.rotationUnblocked();
616 7c111294 Leszek Koltunski
    }
617
618
///////////////////////////////////////////////////////////////////////////////////////////////////
619
620 7205c655 Leszek Koltunski
  public void unblockScramblingAndSolving()
621 7c111294 Leszek Koltunski
    {
622 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = false;
623 36082229 leszek
   // mBlockController.scramblingAndSolvingUnblocked();
624 7c111294 Leszek Koltunski
    }
625
626
///////////////////////////////////////////////////////////////////////////////////////////////////
627
628
  public void preRender()
629
    {
630 4a014840 leszek
    if( mSolve                    ) solveNow();
631
    if( mSetQuat                  ) setQuatNow();
632
    if( mFinishRotation           ) finishRotationNow();
633
    if( mRemoveManualRotation     ) removeManualRotationNow();
634
    if( mRemoveProgramaticRotation) removeProgramaticRotationNow();
635
    if( mChangeObject             ) changeObjectNow();
636
    if( mSolveObject              ) solveObjectNow();
637
    if( mScrambleObject           ) scrambleObjectNow();
638
    if( mFastScrambleObject       ) fastScrambleObjectNow();
639
    if( mPresentObject            ) presentObjectNow();
640
    if( mAddRotation              ) addRotationNow();
641
    if( mInitializeObject         ) initializeObjectNow();
642
    if( mApplyScrambles           ) applyScramblesNow();
643
    if( mResetAllTextureMaps      ) resetAllTextureMapsNow();
644
    if( mSetTextureMap            ) setTextureMapNow();
645
    if( mResetTextureEffect       ) resetTextureNow();
646 55acff1e leszek
    if( mRepaintPuzzleFace        ) repaintPuzzleFaceNow();
647 7c111294 Leszek Koltunski
    }
648
649
///////////////////////////////////////////////////////////////////////////////////////////////////
650
651 2df35810 Leszek Koltunski
  public void addRotation(MovesFinished listener, int axis, int rowBitmap, int bareAngle, int millPreDegree)
652 7c111294 Leszek Koltunski
    {
653 3a0a23bf Leszek Koltunski
    int[][] basicAngles = mNewObject==null ? null : mNewObject.getBasicAngles();
654 7c111294 Leszek Koltunski
655 4a014840 leszek
    if( basicAngles!=null && axis<basicAngles.length )
656 7c111294 Leszek Koltunski
      {
657 0eff8c76 Leszek Koltunski
      int row = computeRowFromBitmap(rowBitmap);
658 a1bcb301 Leszek Koltunski
659 0eff8c76 Leszek Koltunski
      if( row<basicAngles[axis].length )
660 a1bcb301 Leszek Koltunski
        {
661 0eff8c76 Leszek Koltunski
        int basicAngle= basicAngles[axis][row];
662
        int angle     = bareAngle*(360/basicAngle);
663
        int duration  = Math.abs(angle)*millPreDegree;
664
665
        mAddActionListener    = listener;
666
        mAddRotationAxis      = axis;
667
        mAddRotationRowBitmap = rowBitmap;
668
        mAddRotationAngle     = angle;
669
        mAddRotationDuration  = duration;
670
        mAddRotationTime      = System.currentTimeMillis();
671 605f319b Leszek Koltunski
        mAddRotation          = true;
672 0eff8c76 Leszek Koltunski
673
        if( listener instanceof ScrambleEffect )
674
          {
675 11d8426d Leszek Koltunski
          mDebug += (mNewObject==null ? "null" : mNewObject.reportState() );
676 93743a22 Leszek Koltunski
          mDebug += ("(a "+axis+" "+rowBitmap+" "+angle+" "+(mAddRotationTime-mScrambleStartTime))+")";
677 0eff8c76 Leszek Koltunski
          }
678 a1bcb301 Leszek Koltunski
        }
679 7c111294 Leszek Koltunski
      }
680
    }
681
682
///////////////////////////////////////////////////////////////////////////////////////////////////
683
684
  public void initializeObject(int[][] moves)
685
    {
686
    mInitializeObject = true;
687 f557ecc4 leszek
    mInitMoves = moves;
688 7c111294 Leszek Koltunski
    }
689
690 d356eecc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
691
692
  public void applyScrambles(int[][] moves)
693
    {
694
    mApplyScrambles = true;
695 f557ecc4 leszek
    mScraMoves = moves;
696 d356eecc Leszek Koltunski
    }
697
698 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
699
700 36f6390b Leszek Koltunski
  public boolean scrambleObject(int num)
701 7c111294 Leszek Koltunski
    {
702 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
703 7c111294 Leszek Koltunski
      {
704
      mScrambleObject = true;
705
      mScrambleObjectNum = num;
706
      mDebug = "";
707 adb3a093 Leszek Koltunski
      mScrambleStartTime = System.currentTimeMillis();
708 36f6390b Leszek Koltunski
      return true;
709 7c111294 Leszek Koltunski
      }
710 36f6390b Leszek Koltunski
    return false;
711 7c111294 Leszek Koltunski
    }
712
713 186bc982 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
714
715 36f6390b Leszek Koltunski
  public boolean fastScrambleObject(int duration, int num)
716 186bc982 Leszek Koltunski
    {
717 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
718 186bc982 Leszek Koltunski
      {
719
      mFastScrambleObject = true;
720
      mScrambleObjectNum = num;
721 f7e30f36 Leszek Koltunski
      mScrambleObjectDuration = duration;
722 186bc982 Leszek Koltunski
      mDebug = "";
723
      mScrambleStartTime = System.currentTimeMillis();
724 36f6390b Leszek Koltunski
      return true;
725 186bc982 Leszek Koltunski
      }
726 36f6390b Leszek Koltunski
    return false;
727 186bc982 Leszek Koltunski
    }
728
729 826d293e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
730
731 b1370e3b Leszek Koltunski
  public void presentObject(int num, int duration)
732 826d293e Leszek Koltunski
    {
733
    mScrambleObjectNum = num;
734 b1370e3b Leszek Koltunski
    mPresentDuration = duration;
735 826d293e Leszek Koltunski
    mPresentObject = true;
736
    }
737
738 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
739
// this starts the Solve Effect
740
741
  public void solveObject()
742
    {
743 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
744 7c111294 Leszek Koltunski
      {
745
      mSolveObject = true;
746
      }
747
    }
748
749 17d623f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
750
// this only sets the cubits state to solved
751
752
  public void solveOnly()
753
    {
754
    mSolve = true;
755
    }
756
757 4c2c0f44 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
758
759
  public void resetTextureMapsEffect(int duration)
760
    {
761
    mRestickerDuration = duration;
762
    mResetTextureEffect = true;
763
    }
764
765 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
766
767
  public void resetAllTextureMaps()
768
    {
769
    mResetAllTextureMaps = true;
770
    }
771
772
///////////////////////////////////////////////////////////////////////////////////////////////////
773
774
  public TwistyObject getObject()
775
    {
776
    return mNewObject;
777
    }
778
779 7ba38dd4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
780
781
  public TwistyObjectNode getObjectNode()
782
    {
783
    return mController.getNode();
784
    }
785
786 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
787
788
  public void effectFinished(final long effectID)
789
    {
790
    if( effectID == mRotationFinishedID )
791
      {
792
      mRotationFinishedID = 0;
793 4a014840 leszek
      removeManualRotation();
794 7c111294 Leszek Koltunski
      }
795
    else if( effectID == mAddRotationID )
796
      {
797
      mAddRotationID = 0;
798 4a014840 leszek
      mRemoveProgramaticRotationID = effectID;
799
      removeProgramaticRotation();
800 7c111294 Leszek Koltunski
      }
801
    else
802
      {
803
      for(int i=0; i<BaseEffect.Type.LENGTH; i++)
804
        {
805
        if( effectID == mEffectID[i] )
806
          {
807 adb3a093 Leszek Koltunski
          if( i==BaseEffect.Type.SCRAMBLE.ordinal() )
808
            {
809
            mScrambleEndTime = System.currentTimeMillis();
810
            mInterface.onScrambleEffectFinished();
811
            }
812 1dc673a3 Leszek Koltunski
          else if( i==BaseEffect.Type.FAST_SCRAMBLE.ordinal() )
813
            {
814
            mInterface.onScrambleEffectFinished();
815
            unblockEverything();
816
            }
817
          else if( i==BaseEffect.Type.WIN.ordinal() )
818 adb3a093 Leszek Koltunski
            {
819
            mInterface.onWinEffectFinished(mScrambleStartTime,mScrambleEndTime-mScrambleStartTime,mDebug,mScrambleObjectNum);
820
            }
821 060b445e Leszek Koltunski
          else
822
            {
823 94490b34 leszek
            if( mOldObject!=null ) mOldObject.releaseResources();
824 060b445e Leszek Koltunski
            unblockEverything();
825
            }
826
827 7c111294 Leszek Koltunski
          break;
828
          }
829
        }
830
      }
831
    }
832
  }