Project

General

Profile

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

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

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 7e8750c9 leszek
  private float mTextureBorders, mTextureCorners;
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 79c7c950 Leszek Koltunski
          mNewObject.restorePreferences(mOS);
145
          mOS = null;
146 3ce95490 Leszek Koltunski
          }
147
148
        mIsSolved = mNewObject.isSolved();
149 9a694085 Leszek Koltunski
        }
150 7c111294 Leszek Koltunski
      }
151
    }
152
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
// do all 'adjustable' effects (SizeChange, Solve, Scramble)
155
156 b1370e3b Leszek Koltunski
  private void doEffectNow(BaseEffect.Type type, int duration)
157 7c111294 Leszek Koltunski
    {
158
    try
159
      {
160
      int index = type.ordinal();
161 b1370e3b Leszek Koltunski
      mEffectID[index] = type.startEffect(this,duration);
162 7c111294 Leszek Koltunski
      }
163
    catch( Exception ex )
164
      {
165
      android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
166
      unblockEverything();
167
      }
168
    }
169
170 bb58b357 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
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 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
179
180 4a014840 leszek
  private void removeManualRotationNow()
181 7c111294 Leszek Koltunski
    {
182 4a014840 leszek
    mRemoveManualRotation =false;
183
    float angle = mNewObject.removeRotation();
184 7c111294 Leszek Koltunski
185
    boolean solved = mNewObject.isSolved();
186
187
    if( solved && !mIsSolved )
188
      {
189 b3fff6fb Leszek Koltunski
      mInterface.onSolved();
190 7c111294 Leszek Koltunski
      unblockEverything();
191 b1370e3b Leszek Koltunski
      int duration = BaseEffect.Type.WIN.getDuration();
192
      doEffectNow( BaseEffect.Type.WIN, duration );
193 7c111294 Leszek Koltunski
      }
194
    else
195
      {
196
      unblockEverything();
197
      }
198
199 bb58b357 leszek
    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 7c111294 Leszek Koltunski
    mIsSolved = solved;
210
    }
211
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213
214 4a014840 leszek
  private void removeManualRotation()
215 7c111294 Leszek Koltunski
    {
216 4a014840 leszek
    mRemoveManualRotation = true;
217 7c111294 Leszek Koltunski
    }
218
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220
221 4a014840 leszek
  private void removeProgramaticRotation()
222 7c111294 Leszek Koltunski
    {
223 4a014840 leszek
    mRemoveProgramaticRotation = true;
224 7c111294 Leszek Koltunski
    }
225
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227
228 4a014840 leszek
  private void removeProgramaticRotationNow()
229 7c111294 Leszek Koltunski
    {
230 4a014840 leszek
    mRemoveProgramaticRotation =false;
231
    mNewObject.removeRotation();
232
    mAddActionListener.onActionFinished(mRemoveProgramaticRotationID);
233 7c111294 Leszek Koltunski
    }
234
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236
237
  private void addRotationNow()
238
    {
239
    mAddRotation = false;
240
241 d85de775 Leszek Koltunski
    if( mNewObject.getNumAxis() > mAddRotationAxis )
242 8c069e23 Leszek Koltunski
      {
243 4a014840 leszek
      mAddRotationID = mNewObject.addRotation( this, mAddRotationAxis, mAddRotationRowBitmap,
244
                                                     mAddRotationAngle, mAddRotationDuration);
245 8c069e23 Leszek Koltunski
246 605f319b Leszek Koltunski
      // 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 8c069e23 Leszek Koltunski
        }
260
      }
261
    else // should never happen but Firebase says it sometimes does
262 7c111294 Leszek Koltunski
      {
263 8c069e23 Leszek Koltunski
      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 32c1697e Leszek Koltunski
      mInterface.reportProblem(error,true);
271 7c111294 Leszek Koltunski
      unblockEverything();
272
      }
273
    }
274
275
///////////////////////////////////////////////////////////////////////////////////////////////////
276
277
  private void finishRotationNow()
278
    {
279
    mFinishRotation = false;
280 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_0);
281 4a014840 leszek
    mRotationFinishedID = mNewObject.finishRotation(this,mFinishAxis,mFinishRow,mFinishAngle,mAvgSpeed);
282 7c111294 Leszek Koltunski
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 e1a86bf2 Leszek Koltunski
    blockEverything(BlockController.PLACE_1);
295 1fda81c4 leszek
    createObjectNow(mOrdinal,mIconMode,mAsset);
296 b1370e3b Leszek Koltunski
    int duration = BaseEffect.Type.SIZECHANGE.getDuration();
297
    doEffectNow( BaseEffect.Type.SIZECHANGE, duration );
298 568d4698 Leszek Koltunski
    }
299
300 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
301
302
  private void scrambleObjectNow()
303
    {
304
    mScrambleObject = false;
305
    mIsSolved       = false;
306 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_3);
307 e8d8c12a Leszek Koltunski
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 7c111294 Leszek Koltunski
    }
319
320 186bc982 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
321
322
  private void fastScrambleObjectNow()
323
    {
324
    mFastScrambleObject = false;
325
    mIsSolved           = false;
326
    blockEverything(BlockController.PLACE_5);
327 f7e30f36 Leszek Koltunski
    doEffectNow( BaseEffect.Type.FAST_SCRAMBLE, mScrambleObjectDuration );
328 186bc982 Leszek Koltunski
    }
329
330 4c2c0f44 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
331
332
  private void resetTextureNow()
333
    {
334
    mResetTextureEffect = false;
335
    doEffectNow( BaseEffect.Type.RESTICKER, mRestickerDuration );
336
    }
337
338 826d293e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
339
340
  private void presentObjectNow()
341
    {
342
    mPresentObject = false;
343 b1370e3b Leszek Koltunski
    doEffectNow( BaseEffect.Type.PRESENT, mPresentDuration );
344 826d293e Leszek Koltunski
    }
345
346 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
347
348
  private void solveObjectNow()
349
    {
350
    mSolveObject = false;
351 b78ebd76 Leszek Koltunski
    blockEverything(BlockController.PLACE_4);
352 b1370e3b Leszek Koltunski
    int duration = BaseEffect.Type.SOLVE.getDuration();
353
    doEffectNow( BaseEffect.Type.SOLVE, duration );
354 7c111294 Leszek Koltunski
    }
355
356
///////////////////////////////////////////////////////////////////////////////////////////////////
357
358
  private void solveNow()
359
    {
360
    mSolve = false;
361 a57e6870 Leszek Koltunski
    if( mNewObject!=null ) mNewObject.solve();
362 7c111294 Leszek Koltunski
    }
363
364
///////////////////////////////////////////////////////////////////////////////////////////////////
365
366
  private void initializeObjectNow()
367
    {
368
    mInitializeObject = false;
369 f557ecc4 leszek
    mNewObject.initializeObject(mInitMoves);
370 7c111294 Leszek Koltunski
    }
371
372 d356eecc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
373
374
  private void applyScramblesNow()
375
    {
376
    mApplyScrambles = false;
377 f557ecc4 leszek
    mNewObject.applyScrambles(mScraMoves);
378 d356eecc Leszek Koltunski
    }
379
380 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
381
382
  private void setTextureMapNow()
383
    {
384
    mSetTextureMap = false;
385
    if( mNewObject!=null ) mNewObject.setTextureMap(mCubit,mFace,mNewColor);
386
    }
387
388 55acff1e leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
389
390
  private void repaintPuzzleFaceNow()
391
    {
392
    mRepaintPuzzleFace = false;
393 7e8750c9 leszek
    if( mNewObject!=null ) mNewObject.repaintPuzzleFace(mCubit,mFace,mNewColor,mTextureBorders,mTextureCorners);
394 55acff1e leszek
    }
395
396 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 15e5214c Leszek Koltunski
    mController.setQuat();
410 7c111294 Leszek Koltunski
    }
411
412 beee90ab Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 6b301f56 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
429
430
  private void blockEverything(int place)
431
    {
432 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = true;
433
    mRotationBlocked = true;
434 36082229 leszek
  //  mBlockController.rotationBlocked(place);
435
  //  mBlockController.scramblingAndSolvingBlocked(place);
436 6b301f56 Leszek Koltunski
    }
437
438
///////////////////////////////////////////////////////////////////////////////////////////////////
439 060b445e Leszek Koltunski
// 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 6b301f56 Leszek Koltunski
443 060b445e Leszek Koltunski
  void unblockEverything()
444 6b301f56 Leszek Koltunski
    {
445 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = false;
446
    mRotationBlocked = false;
447 36082229 leszek
  //  mBlockController.rotationUnblocked();
448
  //  mBlockController.scramblingAndSolvingUnblocked();
449 6b301f56 Leszek Koltunski
    }
450
451 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
452
453 bb58b357 leszek
  void finishRotation(int currentAxis, int currentRow, float currentAngle, float avgSpeed)
454 7c111294 Leszek Koltunski
    {
455 bb58b357 leszek
    mFinishAxis = currentAxis;
456
    mFinishRow  = currentRow;
457
    mFinishAngle= currentAngle;
458
    mAvgSpeed   = avgSpeed;
459 15e5214c Leszek Koltunski
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 55acff1e leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
475
476 7e8750c9 leszek
  public void repaintPuzzleFace(int cubit, int face, int newColor, float borders, float corners)
477 55acff1e leszek
    {
478
    mRepaintPuzzleFace = true;
479
480
    mCubit    = cubit;
481
    mFace     = face;
482
    mNewColor = newColor;
483 7e8750c9 leszek
    mTextureBorders = borders;
484
    mTextureCorners = corners;
485 55acff1e leszek
    }
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 79c7c950 Leszek Koltunski
    mOS = os;
563 7c111294 Leszek Koltunski
    }
564
565
///////////////////////////////////////////////////////////////////////////////////////////////////
566
567 1fda81c4 leszek
  public void changeObject(int ordinal, int iconMode, InitAssets asset)
568 7c111294 Leszek Koltunski
    {
569
    mChangeObject = true;
570 e1a86bf2 Leszek Koltunski
    mOrdinal    = ordinal;
571 3bf19410 Leszek Koltunski
    mIconMode   = iconMode;
572 cf93ea4e Leszek Koltunski
    mAsset      = asset;
573 568d4698 Leszek Koltunski
    }
574
575 4a389a4e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
576
577
  public void setDefaultRotation(int numFaces)
578
    {
579 66959ff9 Leszek Koltunski
    if( mController!=null && mController.getRotateOnCreation() )
580 4a389a4e Leszek Koltunski
      {
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 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
592
593 7205c655 Leszek Koltunski
  public boolean isRotationBlocked()
594 7c111294 Leszek Koltunski
    {
595 7205c655 Leszek Koltunski
    return mRotationBlocked;
596 7c111294 Leszek Koltunski
    }
597
598
///////////////////////////////////////////////////////////////////////////////////////////////////
599
600 7205c655 Leszek Koltunski
  public boolean isScramblingAndSolvingNotBlocked()
601 7c111294 Leszek Koltunski
    {
602 7205c655 Leszek Koltunski
    return !mScramblingAndSolvingBlocked;
603 7c111294 Leszek Koltunski
    }
604
605
///////////////////////////////////////////////////////////////////////////////////////////////////
606
607 7205c655 Leszek Koltunski
  public void blockRotation(int place)
608 7c111294 Leszek Koltunski
    {
609 7205c655 Leszek Koltunski
    mRotationBlocked = true;
610 36082229 leszek
  //  mBlockController.rotationBlocked(place);
611 7c111294 Leszek Koltunski
    }
612
613
///////////////////////////////////////////////////////////////////////////////////////////////////
614
615 7205c655 Leszek Koltunski
  public void unblockRotation()
616 7c111294 Leszek Koltunski
    {
617 7205c655 Leszek Koltunski
    mRotationBlocked = false;
618 36082229 leszek
  //  mBlockController.rotationUnblocked();
619 7c111294 Leszek Koltunski
    }
620
621
///////////////////////////////////////////////////////////////////////////////////////////////////
622
623 7205c655 Leszek Koltunski
  public void unblockScramblingAndSolving()
624 7c111294 Leszek Koltunski
    {
625 7205c655 Leszek Koltunski
    mScramblingAndSolvingBlocked = false;
626 36082229 leszek
   // mBlockController.scramblingAndSolvingUnblocked();
627 7c111294 Leszek Koltunski
    }
628
629
///////////////////////////////////////////////////////////////////////////////////////////////////
630
631
  public void preRender()
632
    {
633 4a014840 leszek
    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 55acff1e leszek
    if( mRepaintPuzzleFace        ) repaintPuzzleFaceNow();
650 7c111294 Leszek Koltunski
    }
651
652
///////////////////////////////////////////////////////////////////////////////////////////////////
653
654 2df35810 Leszek Koltunski
  public void addRotation(MovesFinished listener, int axis, int rowBitmap, int bareAngle, int millPreDegree)
655 7c111294 Leszek Koltunski
    {
656 3a0a23bf Leszek Koltunski
    int[][] basicAngles = mNewObject==null ? null : mNewObject.getBasicAngles();
657 7c111294 Leszek Koltunski
658 4a014840 leszek
    if( basicAngles!=null && axis<basicAngles.length )
659 7c111294 Leszek Koltunski
      {
660 0eff8c76 Leszek Koltunski
      int row = computeRowFromBitmap(rowBitmap);
661 a1bcb301 Leszek Koltunski
662 0eff8c76 Leszek Koltunski
      if( row<basicAngles[axis].length )
663 a1bcb301 Leszek Koltunski
        {
664 0eff8c76 Leszek Koltunski
        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 605f319b Leszek Koltunski
        mAddRotation          = true;
675 0eff8c76 Leszek Koltunski
676
        if( listener instanceof ScrambleEffect )
677
          {
678 11d8426d Leszek Koltunski
          mDebug += (mNewObject==null ? "null" : mNewObject.reportState() );
679 93743a22 Leszek Koltunski
          mDebug += ("(a "+axis+" "+rowBitmap+" "+angle+" "+(mAddRotationTime-mScrambleStartTime))+")";
680 0eff8c76 Leszek Koltunski
          }
681 a1bcb301 Leszek Koltunski
        }
682 7c111294 Leszek Koltunski
      }
683
    }
684
685
///////////////////////////////////////////////////////////////////////////////////////////////////
686
687
  public void initializeObject(int[][] moves)
688
    {
689
    mInitializeObject = true;
690 f557ecc4 leszek
    mInitMoves = moves;
691 7c111294 Leszek Koltunski
    }
692
693 d356eecc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
694
695
  public void applyScrambles(int[][] moves)
696
    {
697
    mApplyScrambles = true;
698 f557ecc4 leszek
    mScraMoves = moves;
699 d356eecc Leszek Koltunski
    }
700
701 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
702
703 36f6390b Leszek Koltunski
  public boolean scrambleObject(int num)
704 7c111294 Leszek Koltunski
    {
705 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
706 7c111294 Leszek Koltunski
      {
707
      mScrambleObject = true;
708
      mScrambleObjectNum = num;
709
      mDebug = "";
710 adb3a093 Leszek Koltunski
      mScrambleStartTime = System.currentTimeMillis();
711 36f6390b Leszek Koltunski
      return true;
712 7c111294 Leszek Koltunski
      }
713 36f6390b Leszek Koltunski
    return false;
714 7c111294 Leszek Koltunski
    }
715
716 186bc982 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
717
718 36f6390b Leszek Koltunski
  public boolean fastScrambleObject(int duration, int num)
719 186bc982 Leszek Koltunski
    {
720 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
721 186bc982 Leszek Koltunski
      {
722
      mFastScrambleObject = true;
723
      mScrambleObjectNum = num;
724 f7e30f36 Leszek Koltunski
      mScrambleObjectDuration = duration;
725 186bc982 Leszek Koltunski
      mDebug = "";
726
      mScrambleStartTime = System.currentTimeMillis();
727 36f6390b Leszek Koltunski
      return true;
728 186bc982 Leszek Koltunski
      }
729 36f6390b Leszek Koltunski
    return false;
730 186bc982 Leszek Koltunski
    }
731
732 826d293e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
733
734 b1370e3b Leszek Koltunski
  public void presentObject(int num, int duration)
735 826d293e Leszek Koltunski
    {
736
    mScrambleObjectNum = num;
737 b1370e3b Leszek Koltunski
    mPresentDuration = duration;
738 826d293e Leszek Koltunski
    mPresentObject = true;
739
    }
740
741 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
742
// this starts the Solve Effect
743
744
  public void solveObject()
745
    {
746 7205c655 Leszek Koltunski
    if( !mScramblingAndSolvingBlocked )
747 7c111294 Leszek Koltunski
      {
748
      mSolveObject = true;
749
      }
750
    }
751
752 17d623f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
753
// this only sets the cubits state to solved
754
755
  public void solveOnly()
756
    {
757
    mSolve = true;
758
    }
759
760 4c2c0f44 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
761
762
  public void resetTextureMapsEffect(int duration)
763
    {
764
    mRestickerDuration = duration;
765
    mResetTextureEffect = true;
766
    }
767
768 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
769
770
  public void resetAllTextureMaps()
771
    {
772
    mResetAllTextureMaps = true;
773
    }
774
775
///////////////////////////////////////////////////////////////////////////////////////////////////
776
777
  public TwistyObject getObject()
778
    {
779
    return mNewObject;
780
    }
781
782 7ba38dd4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
783
784
  public TwistyObjectNode getObjectNode()
785
    {
786
    return mController.getNode();
787
    }
788
789 7c111294 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
790
791
  public void effectFinished(final long effectID)
792
    {
793
    if( effectID == mRotationFinishedID )
794
      {
795
      mRotationFinishedID = 0;
796 4a014840 leszek
      removeManualRotation();
797 7c111294 Leszek Koltunski
      }
798
    else if( effectID == mAddRotationID )
799
      {
800
      mAddRotationID = 0;
801 4a014840 leszek
      mRemoveProgramaticRotationID = effectID;
802
      removeProgramaticRotation();
803 7c111294 Leszek Koltunski
      }
804
    else
805
      {
806
      for(int i=0; i<BaseEffect.Type.LENGTH; i++)
807
        {
808
        if( effectID == mEffectID[i] )
809
          {
810 adb3a093 Leszek Koltunski
          if( i==BaseEffect.Type.SCRAMBLE.ordinal() )
811
            {
812
            mScrambleEndTime = System.currentTimeMillis();
813
            mInterface.onScrambleEffectFinished();
814
            }
815 1dc673a3 Leszek Koltunski
          else if( i==BaseEffect.Type.FAST_SCRAMBLE.ordinal() )
816
            {
817
            mInterface.onScrambleEffectFinished();
818
            unblockEverything();
819
            }
820
          else if( i==BaseEffect.Type.WIN.ordinal() )
821 adb3a093 Leszek Koltunski
            {
822
            mInterface.onWinEffectFinished(mScrambleStartTime,mScrambleEndTime-mScrambleStartTime,mDebug,mScrambleObjectNum);
823
            }
824 060b445e Leszek Koltunski
          else
825
            {
826 94490b34 leszek
            if( mOldObject!=null ) mOldObject.releaseResources();
827 060b445e Leszek Koltunski
            unblockEverything();
828
            }
829
830 7c111294 Leszek Koltunski
          break;
831
          }
832
        }
833
      }
834
    }
835
  }