Project

General

Profile

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

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

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 224c0ff1 leszek
  private boolean mRestoreStickersOnly;
64 7c111294 Leszek Koltunski
65 8c069e23 Leszek Koltunski
  // debugging only
66
  private long mAddRotationTime;
67
68 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
69
70 440f8e33 Leszek Koltunski
  public ObjectPreRender(ObjectControl controller, ObjectLibInterface actioner)
71 7c111294 Leszek Koltunski
    {
72 b3fff6fb Leszek Koltunski
    mInterface = actioner;
73 15e5214c Leszek Koltunski
    mController = controller;
74 7c111294 Leszek Koltunski
75
    mFinishRotation       = false;
76 4a014840 leszek
    mRemoveManualRotation = false;
77
    mRemoveProgramaticRotation = false;
78 7c111294 Leszek Koltunski
    mAddRotation          = false;
79
    mSetQuat              = false;
80
    mChangeObject         = false;
81
    mSolveObject          = false;
82
    mSolve                = false;
83
    mScrambleObject       = false;
84 186bc982 Leszek Koltunski
    mFastScrambleObject   = false;
85 826d293e Leszek Koltunski
    mPresentObject        = false;
86 4c2c0f44 Leszek Koltunski
    mResetTextureEffect   = false;
87 55acff1e leszek
    mRepaintPuzzleFace    = false;
88 7c111294 Leszek Koltunski
89
    mOldObject = null;
90
    mNewObject = null;
91
92
    mDebug = "";
93
    mScrambleObjectNum = 0;
94 64c209f5 Leszek Koltunski
    mScale = 1.0f;
95 7c111294 Leszek Koltunski
96
    mEffectID = new long[BaseEffect.Type.LENGTH];
97
98 36082229 leszek
  //  mBlockController = new BlockController(this);
99 7c111294 Leszek Koltunski
    unblockEverything();
100
    }
101
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103
104 1fda81c4 leszek
  private void createObjectNow(int ordinal, int iconMode, InitAssets assets)
105 7c111294 Leszek Koltunski
    {
106 3ce95490 Leszek Koltunski
    long time1 = System.currentTimeMillis();
107 72d6857c Leszek Koltunski
    Static3D move = new Static3D(mMoveX,mMoveY,0);
108 e1a86bf2 Leszek Koltunski
    Static4D quat = mController.getQuat();
109 3ce95490 Leszek Koltunski
    TwistyObject tmp;
110
    boolean error = false;
111 7c111294 Leszek Koltunski
112 cf93ea4e Leszek Koltunski
    if( assets==null || assets.noJsonStream() )
113 3ce95490 Leszek Koltunski
      {
114 361fd0de leszek
      tmp = ListObjects.create( ordinal, iconMode, quat, move, mScale, assets);
115 3ce95490 Leszek Koltunski
      }
116
    else
117
      {
118 1fda81c4 leszek
      tmp = new TwistyJson( iconMode, quat, move, mScale, assets);
119 3ce95490 Leszek Koltunski
      error = tmp.getError();
120
      }
121 594bbce0 Leszek Koltunski
122 3ce95490 Leszek Koltunski
    if( error )
123
      {
124
      String errorString = tmp.getErrorString();
125
      mInterface.reportJSONError(errorString,ordinal);
126
      }
127
    else
128 7c111294 Leszek Koltunski
      {
129 3ce95490 Leszek Koltunski
      if( mOldObject!=null ) mOldObject.releaseResources();
130
      mOldObject = mNewObject;
131
      mNewObject = tmp;
132
133
      long time2 = System.currentTimeMillis();
134
      mInterface.onObjectCreated(time2-time1);
135 9a694085 Leszek Koltunski
136 3ce95490 Leszek Koltunski
      if( mNewObject!=null )
137 9a694085 Leszek Koltunski
        {
138 3ce95490 Leszek Koltunski
        mNewObject.setLibInterface(mInterface);
139
        mController.setTouchControl(mNewObject);
140 30bd2f96 Leszek Koltunski
        mNewObject.setObjectRatioNow(mScale, mController.getScalingSize() );
141 3ce95490 Leszek Koltunski
142 79c7c950 Leszek Koltunski
        if( mOS!=null )
143 3ce95490 Leszek Koltunski
          {
144 224c0ff1 leszek
          if( mRestoreStickersOnly ) mNewObject.restoreStickers(mOS);
145
          else                       mNewObject.restorePreferences(mOS);
146
147 79c7c950 Leszek Koltunski
          mOS = null;
148 3ce95490 Leszek Koltunski
          }
149
150
        mIsSolved = mNewObject.isSolved();
151 9a694085 Leszek Koltunski
        }
152 7c111294 Leszek Koltunski
      }
153
    }
154
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156
// do all 'adjustable' effects (SizeChange, Solve, Scramble)
157
158 b1370e3b Leszek Koltunski
  private void doEffectNow(BaseEffect.Type type, int duration)
159 7c111294 Leszek Koltunski
    {
160
    try
161
      {
162
      int index = type.ordinal();
163 b1370e3b Leszek Koltunski
      mEffectID[index] = type.startEffect(this,duration);
164 7c111294 Leszek Koltunski
      }
165
    catch( Exception ex )
166
      {
167
      android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
168
      unblockEverything();
169
      }
170
    }
171
172 bb58b357 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
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 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
181
182 4a014840 leszek
  private void removeManualRotationNow()
183 7c111294 Leszek Koltunski
    {
184 4a014840 leszek
    mRemoveManualRotation =false;
185
    float angle = mNewObject.removeRotation();
186 7c111294 Leszek Koltunski
187
    boolean solved = mNewObject.isSolved();
188
189
    if( solved && !mIsSolved )
190
      {
191 b3fff6fb Leszek Koltunski
      mInterface.onSolved();
192 7c111294 Leszek Koltunski
      unblockEverything();
193 b1370e3b Leszek Koltunski
      int duration = BaseEffect.Type.WIN.getDuration();
194
      doEffectNow( BaseEffect.Type.WIN, duration );
195 7c111294 Leszek Koltunski
      }
196
    else
197
      {
198
      unblockEverything();
199
      }
200
201 bb58b357 leszek
    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 7c111294 Leszek Koltunski
    mIsSolved = solved;
212
    }
213
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215
216 4a014840 leszek
  private void removeManualRotation()
217 7c111294 Leszek Koltunski
    {
218 4a014840 leszek
    mRemoveManualRotation = true;
219 7c111294 Leszek Koltunski
    }
220
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222
223 4a014840 leszek
  private void removeProgramaticRotation()
224 7c111294 Leszek Koltunski
    {
225 4a014840 leszek
    mRemoveProgramaticRotation = true;
226 7c111294 Leszek Koltunski
    }
227
228
///////////////////////////////////////////////////////////////////////////////////////////////////
229
230 4a014840 leszek
  private void removeProgramaticRotationNow()
231 7c111294 Leszek Koltunski
    {
232 4a014840 leszek
    mRemoveProgramaticRotation =false;
233
    mNewObject.removeRotation();
234
    mAddActionListener.onActionFinished(mRemoveProgramaticRotationID);
235 7c111294 Leszek Koltunski
    }
236
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238
239
  private void addRotationNow()
240
    {
241
    mAddRotation = false;
242
243 d85de775 Leszek Koltunski
    if( mNewObject.getNumAxis() > mAddRotationAxis )
244 8c069e23 Leszek Koltunski
      {
245 4a014840 leszek
      mAddRotationID = mNewObject.addRotation( this, mAddRotationAxis, mAddRotationRowBitmap,
246
                                                     mAddRotationAngle, mAddRotationDuration);
247 8c069e23 Leszek Koltunski
248 605f319b Leszek Koltunski
      // 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 8c069e23 Leszek Koltunski
        }
262
      }
263
    else // should never happen but Firebase says it sometimes does
264 7c111294 Leszek Koltunski
      {
265 8c069e23 Leszek Koltunski
      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 32c1697e Leszek Koltunski
      mInterface.reportProblem(error,true);
273 7c111294 Leszek Koltunski
      unblockEverything();
274
      }
275
    }
276
277
///////////////////////////////////////////////////////////////////////////////////////////////////
278
279
  private void finishRotationNow()
280
    {
281
    mFinishRotation = false;
282 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_0);
283 4a014840 leszek
    mRotationFinishedID = mNewObject.finishRotation(this,mFinishAxis,mFinishRow,mFinishAngle,mAvgSpeed);
284 7c111294 Leszek Koltunski
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 e1a86bf2 Leszek Koltunski
    blockEverything(BlockController.PLACE_1);
297 1fda81c4 leszek
    createObjectNow(mOrdinal,mIconMode,mAsset);
298 b1370e3b Leszek Koltunski
    int duration = BaseEffect.Type.SIZECHANGE.getDuration();
299
    doEffectNow( BaseEffect.Type.SIZECHANGE, duration );
300 568d4698 Leszek Koltunski
    }
301
302 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
303
304
  private void scrambleObjectNow()
305
    {
306
    mScrambleObject = false;
307
    mIsSolved       = false;
308 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_3);
309 e8d8c12a Leszek Koltunski
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 7c111294 Leszek Koltunski
    }
321
322 186bc982 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
323
324
  private void fastScrambleObjectNow()
325
    {
326
    mFastScrambleObject = false;
327
    mIsSolved           = false;
328
    blockEverything(BlockController.PLACE_5);
329 f7e30f36 Leszek Koltunski
    doEffectNow( BaseEffect.Type.FAST_SCRAMBLE, mScrambleObjectDuration );
330 186bc982 Leszek Koltunski
    }
331
332 4c2c0f44 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
333
334
  private void resetTextureNow()
335
    {
336
    mResetTextureEffect = false;
337
    doEffectNow( BaseEffect.Type.RESTICKER, mRestickerDuration );
338
    }
339
340 826d293e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
341
342
  private void presentObjectNow()
343
    {
344
    mPresentObject = false;
345 b1370e3b Leszek Koltunski
    doEffectNow( BaseEffect.Type.PRESENT, mPresentDuration );
346 826d293e Leszek Koltunski
    }
347
348 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
349
350
  private void solveObjectNow()
351
    {
352
    mSolveObject = false;
353 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_4);
354 b1370e3b Leszek Koltunski
    int duration = BaseEffect.Type.SOLVE.getDuration();
355
    doEffectNow( BaseEffect.Type.SOLVE, duration );
356 7c111294 Leszek Koltunski
    }
357
358
///////////////////////////////////////////////////////////////////////////////////////////////////
359
360
  private void solveNow()
361
    {
362
    mSolve = false;
363 a57e6870 Leszek Koltunski
    if( mNewObject!=null ) mNewObject.solve();
364 7c111294 Leszek Koltunski
    }
365
366
///////////////////////////////////////////////////////////////////////////////////////////////////
367
368
  private void initializeObjectNow()
369
    {
370
    mInitializeObject = false;
371 f557ecc4 leszek
    mNewObject.initializeObject(mInitMoves);
372 7c111294 Leszek Koltunski
    }
373
374 d356eecc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
375
376
  private void applyScramblesNow()
377
    {
378
    mApplyScrambles = false;
379 f557ecc4 leszek
    mNewObject.applyScrambles(mScraMoves);
380 d356eecc Leszek Koltunski
    }
381
382 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
383
384
  private void setTextureMapNow()
385
    {
386
    mSetTextureMap = false;
387
    if( mNewObject!=null ) mNewObject.setTextureMap(mCubit,mFace,mNewColor);
388
    }
389
390 55acff1e leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
391
392
  private void repaintPuzzleFaceNow()
393
    {
394
    mRepaintPuzzleFace = false;
395 6f5eb9b3 leszek
    if( mNewObject!=null ) mNewObject.repaintPuzzleFace(mCubit,mFace,mNewColor);
396 55acff1e leszek
    }
397
398 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 15e5214c Leszek Koltunski
    mController.setQuat();
412 7c111294 Leszek Koltunski
    }
413
414 beee90ab Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 6b301f56 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
431
432
  private void blockEverything(int place)
433
    {
434 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = true;
435
    mRotationBlocked = true;
436 36082229 leszek
  //  mBlockController.rotationBlocked(place);
437
  //  mBlockController.scramblingAndSolvingBlocked(place);
438 6b301f56 Leszek Koltunski
    }
439
440
///////////////////////////////////////////////////////////////////////////////////////////////////
441 060b445e Leszek Koltunski
// 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 6b301f56 Leszek Koltunski
445 060b445e Leszek Koltunski
  void unblockEverything()
446 6b301f56 Leszek Koltunski
    {
447 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = false;
448
    mRotationBlocked = false;
449 36082229 leszek
  //  mBlockController.rotationUnblocked();
450
  //  mBlockController.scramblingAndSolvingUnblocked();
451 6b301f56 Leszek Koltunski
    }
452
453 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
454
455 bb58b357 leszek
  void finishRotation(int currentAxis, int currentRow, float currentAngle, float avgSpeed)
456 7c111294 Leszek Koltunski
    {
457 bb58b357 leszek
    mFinishAxis = currentAxis;
458
    mFinishRow  = currentRow;
459
    mFinishAngle= currentAngle;
460
    mAvgSpeed   = avgSpeed;
461 15e5214c Leszek Koltunski
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 55acff1e leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
477
478 6f5eb9b3 leszek
  public void repaintPuzzleFace(int cubit, int face, int newColor)
479 55acff1e leszek
    {
480
    mRepaintPuzzleFace = true;
481
482
    mCubit    = cubit;
483
    mFace     = face;
484
    mNewColor = newColor;
485
    }
486
487 15e5214c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
488
489
  void setQuatOnNextRender()
490
    {
491
    mSetQuat = true;
492
    }
493
494 02d80fe6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
495
496 72d6857c Leszek Koltunski
  void setMove(float xmove, float ymove)
497 02d80fe6 Leszek Koltunski
    {
498 72d6857c Leszek Koltunski
    mMoveX = xmove;
499
    mMoveY = ymove;
500 02d80fe6 Leszek Koltunski
    }
501
502 64c209f5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
503
504
  void setScale(float scale)
505
    {
506
    mScale = scale;
507
    }
508
509 15e5214c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 02d80fe6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
526
527 72d6857c Leszek Koltunski
  public float getMoveX()
528 02d80fe6 Leszek Koltunski
    {
529 72d6857c Leszek Koltunski
    return mMoveX;
530
    }
531
532
///////////////////////////////////////////////////////////////////////////////////////////////////
533
534
  public float getMoveY()
535
    {
536
    return mMoveY;
537 02d80fe6 Leszek Koltunski
    }
538
539 d887aa16 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
540
541
  public ObjectLibInterface getInterface()
542
    {
543
    return mInterface;
544
    }
545
546 15e5214c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
547
// PUBLIC API
548 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
549
550 79c7c950 Leszek Koltunski
  public void savePreferences(OperatingSystemInterface os)
551 7c111294 Leszek Koltunski
    {
552
    if( mNewObject!=null )
553
      {
554 79c7c950 Leszek Koltunski
      mNewObject.savePreferences(os);
555 7c111294 Leszek Koltunski
      }
556
    }
557
558
///////////////////////////////////////////////////////////////////////////////////////////////////
559
560 79c7c950 Leszek Koltunski
  public void restorePreferences(OperatingSystemInterface os)
561 7c111294 Leszek Koltunski
    {
562 224c0ff1 leszek
    mRestoreStickersOnly = false;
563
    mOS = os;
564
    }
565
566
///////////////////////////////////////////////////////////////////////////////////////////////////
567
568
  public void restoreStickers(OperatingSystemInterface os)
569
    {
570
    mRestoreStickersOnly = true;
571 79c7c950 Leszek Koltunski
    mOS = os;
572 7c111294 Leszek Koltunski
    }
573
574
///////////////////////////////////////////////////////////////////////////////////////////////////
575
576 1fda81c4 leszek
  public void changeObject(int ordinal, int iconMode, InitAssets asset)
577 7c111294 Leszek Koltunski
    {
578
    mChangeObject = true;
579 e1a86bf2 Leszek Koltunski
    mOrdinal    = ordinal;
580 3bf19410 Leszek Koltunski
    mIconMode   = iconMode;
581 cf93ea4e Leszek Koltunski
    mAsset      = asset;
582 568d4698 Leszek Koltunski
    }
583
584 4a389a4e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
585
586
  public void setDefaultRotation(int numFaces)
587
    {
588 66959ff9 Leszek Koltunski
    if( mController!=null && mController.getRotateOnCreation() )
589 4a389a4e Leszek Koltunski
      {
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 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
601
602 7205c655 Leszek Koltunski
  public boolean isRotationBlocked()
603 7c111294 Leszek Koltunski
    {
604 7205c655 Leszek Koltunski
    return mRotationBlocked;
605 7c111294 Leszek Koltunski
    }
606
607
///////////////////////////////////////////////////////////////////////////////////////////////////
608
609 7205c655 Leszek Koltunski
  public boolean isScramblingAndSolvingNotBlocked()
610 7c111294 Leszek Koltunski
    {
611 7205c655 Leszek Koltunski
    return !mScramblingAndSolvingBlocked;
612 7c111294 Leszek Koltunski
    }
613
614
///////////////////////////////////////////////////////////////////////////////////////////////////
615
616 7205c655 Leszek Koltunski
  public void blockRotation(int place)
617 7c111294 Leszek Koltunski
    {
618 7205c655 Leszek Koltunski
    mRotationBlocked = true;
619 36082229 leszek
  //  mBlockController.rotationBlocked(place);
620 7c111294 Leszek Koltunski
    }
621
622
///////////////////////////////////////////////////////////////////////////////////////////////////
623
624 7205c655 Leszek Koltunski
  public void unblockRotation()
625 7c111294 Leszek Koltunski
    {
626 7205c655 Leszek Koltunski
    mRotationBlocked = false;
627 36082229 leszek
  //  mBlockController.rotationUnblocked();
628 7c111294 Leszek Koltunski
    }
629
630
///////////////////////////////////////////////////////////////////////////////////////////////////
631
632 7205c655 Leszek Koltunski
  public void unblockScramblingAndSolving()
633 7c111294 Leszek Koltunski
    {
634 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = false;
635 36082229 leszek
   // mBlockController.scramblingAndSolvingUnblocked();
636 7c111294 Leszek Koltunski
    }
637
638
///////////////////////////////////////////////////////////////////////////////////////////////////
639
640
  public void preRender()
641
    {
642 4a014840 leszek
    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 55acff1e leszek
    if( mRepaintPuzzleFace        ) repaintPuzzleFaceNow();
659 7c111294 Leszek Koltunski
    }
660
661
///////////////////////////////////////////////////////////////////////////////////////////////////
662
663 2df35810 Leszek Koltunski
  public void addRotation(MovesFinished listener, int axis, int rowBitmap, int bareAngle, int millPreDegree)
664 7c111294 Leszek Koltunski
    {
665 3a0a23bf Leszek Koltunski
    int[][] basicAngles = mNewObject==null ? null : mNewObject.getBasicAngles();
666 7c111294 Leszek Koltunski
667 4a014840 leszek
    if( basicAngles!=null && axis<basicAngles.length )
668 7c111294 Leszek Koltunski
      {
669 0eff8c76 Leszek Koltunski
      int row = computeRowFromBitmap(rowBitmap);
670 a1bcb301 Leszek Koltunski
671 0eff8c76 Leszek Koltunski
      if( row<basicAngles[axis].length )
672 a1bcb301 Leszek Koltunski
        {
673 0eff8c76 Leszek Koltunski
        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 605f319b Leszek Koltunski
        mAddRotation          = true;
684 0eff8c76 Leszek Koltunski
685
        if( listener instanceof ScrambleEffect )
686
          {
687 11d8426d Leszek Koltunski
          mDebug += (mNewObject==null ? "null" : mNewObject.reportState() );
688 93743a22 Leszek Koltunski
          mDebug += ("(a "+axis+" "+rowBitmap+" "+angle+" "+(mAddRotationTime-mScrambleStartTime))+")";
689 0eff8c76 Leszek Koltunski
          }
690 a1bcb301 Leszek Koltunski
        }
691 7c111294 Leszek Koltunski
      }
692
    }
693
694
///////////////////////////////////////////////////////////////////////////////////////////////////
695
696
  public void initializeObject(int[][] moves)
697
    {
698
    mInitializeObject = true;
699 f557ecc4 leszek
    mInitMoves = moves;
700 7c111294 Leszek Koltunski
    }
701
702 d356eecc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
703
704
  public void applyScrambles(int[][] moves)
705
    {
706
    mApplyScrambles = true;
707 f557ecc4 leszek
    mScraMoves = moves;
708 d356eecc Leszek Koltunski
    }
709
710 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
711
712 36f6390b Leszek Koltunski
  public boolean scrambleObject(int num)
713 7c111294 Leszek Koltunski
    {
714 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
715 7c111294 Leszek Koltunski
      {
716
      mScrambleObject = true;
717
      mScrambleObjectNum = num;
718
      mDebug = "";
719 adb3a093 Leszek Koltunski
      mScrambleStartTime = System.currentTimeMillis();
720 36f6390b Leszek Koltunski
      return true;
721 7c111294 Leszek Koltunski
      }
722 36f6390b Leszek Koltunski
    return false;
723 7c111294 Leszek Koltunski
    }
724
725 186bc982 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
726
727 36f6390b Leszek Koltunski
  public boolean fastScrambleObject(int duration, int num)
728 186bc982 Leszek Koltunski
    {
729 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
730 186bc982 Leszek Koltunski
      {
731
      mFastScrambleObject = true;
732
      mScrambleObjectNum = num;
733 f7e30f36 Leszek Koltunski
      mScrambleObjectDuration = duration;
734 186bc982 Leszek Koltunski
      mDebug = "";
735
      mScrambleStartTime = System.currentTimeMillis();
736 36f6390b Leszek Koltunski
      return true;
737 186bc982 Leszek Koltunski
      }
738 36f6390b Leszek Koltunski
    return false;
739 186bc982 Leszek Koltunski
    }
740
741 826d293e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
742
743 b1370e3b Leszek Koltunski
  public void presentObject(int num, int duration)
744 826d293e Leszek Koltunski
    {
745
    mScrambleObjectNum = num;
746 b1370e3b Leszek Koltunski
    mPresentDuration = duration;
747 826d293e Leszek Koltunski
    mPresentObject = true;
748
    }
749
750 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
751
// this starts the Solve Effect
752
753
  public void solveObject()
754
    {
755 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
756 7c111294 Leszek Koltunski
      {
757
      mSolveObject = true;
758
      }
759
    }
760
761 17d623f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
762
// this only sets the cubits state to solved
763
764
  public void solveOnly()
765
    {
766
    mSolve = true;
767
    }
768
769 4c2c0f44 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
770
771
  public void resetTextureMapsEffect(int duration)
772
    {
773
    mRestickerDuration = duration;
774
    mResetTextureEffect = true;
775
    }
776
777 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
778
779
  public void resetAllTextureMaps()
780
    {
781
    mResetAllTextureMaps = true;
782
    }
783
784
///////////////////////////////////////////////////////////////////////////////////////////////////
785
786
  public TwistyObject getObject()
787
    {
788
    return mNewObject;
789
    }
790
791 7ba38dd4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
792
793
  public TwistyObjectNode getObjectNode()
794
    {
795
    return mController.getNode();
796
    }
797
798 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
799
800
  public void effectFinished(final long effectID)
801
    {
802
    if( effectID == mRotationFinishedID )
803
      {
804
      mRotationFinishedID = 0;
805 4a014840 leszek
      removeManualRotation();
806 7c111294 Leszek Koltunski
      }
807
    else if( effectID == mAddRotationID )
808
      {
809
      mAddRotationID = 0;
810 4a014840 leszek
      mRemoveProgramaticRotationID = effectID;
811
      removeProgramaticRotation();
812 7c111294 Leszek Koltunski
      }
813
    else
814
      {
815
      for(int i=0; i<BaseEffect.Type.LENGTH; i++)
816
        {
817
        if( effectID == mEffectID[i] )
818
          {
819 adb3a093 Leszek Koltunski
          if( i==BaseEffect.Type.SCRAMBLE.ordinal() )
820
            {
821
            mScrambleEndTime = System.currentTimeMillis();
822
            mInterface.onScrambleEffectFinished();
823
            }
824 1dc673a3 Leszek Koltunski
          else if( i==BaseEffect.Type.FAST_SCRAMBLE.ordinal() )
825
            {
826
            mInterface.onScrambleEffectFinished();
827
            unblockEverything();
828
            }
829
          else if( i==BaseEffect.Type.WIN.ordinal() )
830 adb3a093 Leszek Koltunski
            {
831
            mInterface.onWinEffectFinished(mScrambleStartTime,mScrambleEndTime-mScrambleStartTime,mDebug,mScrambleObjectNum);
832
            }
833 060b445e Leszek Koltunski
          else
834
            {
835 94490b34 leszek
            if( mOldObject!=null ) mOldObject.releaseResources();
836 060b445e Leszek Koltunski
            unblockEverything();
837
            }
838
839 7c111294 Leszek Koltunski
          break;
840
          }
841
        }
842
      }
843
    }
844
  }