Revision 5a4d4fba
Added by Leszek Koltunski over 5 years ago
| src/main/java/org/distorted/effects/BaseEffect.java | ||
|---|---|---|
| 29 | 29 | import org.distorted.effects.win.WinEffect; | 
| 30 | 30 | import org.distorted.library.main.DistortedScreen; | 
| 31 | 31 | import org.distorted.main.R; | 
| 32 | import org.distorted.main.RubikPostRender;
 | |
| 32 | import org.distorted.main.RubikPreRender;
 | |
| 33 | 33 |  | 
| 34 | 34 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 35 | 35 |  | 
| ... | ... | |
| 197 | 197 |  | 
| 198 | 198 | //////////////////////////////////////////////////////////////////////////////// | 
| 199 | 199 |  | 
| 200 |     public long startEffect(DistortedScreen screen, RubikPostRender post) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 | |
| 200 |     public long startEffect(DistortedScreen screen, RubikPreRender pre) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 | |
| 201 | 201 |       {
 | 
| 202 | 202 |       Method method1 = mClass.getDeclaredMethod("create", int.class);
 | 
| 203 | 203 |  | 
| 204 | 204 | Object value1 = method1.invoke(null,mCurrentType); | 
| 205 | 205 | BaseEffect baseEffect = (BaseEffect)value1; | 
| 206 | 206 |  | 
| 207 |       Method method2 = mClass.getDeclaredMethod("start", int.class, DistortedScreen.class, RubikPostRender.class);
 | |
| 207 |       Method method2 = mClass.getDeclaredMethod("start", int.class, DistortedScreen.class, RubikPreRender.class);
 | |
| 208 | 208 |  | 
| 209 | 209 | Integer translated = translatePos(mCurrentPos)+1; | 
| 210 |       Object value2 = method2.invoke(baseEffect,translated,screen,post);
 | |
| 210 |       Object value2 = method2.invoke(baseEffect,translated,screen,pre);
 | |
| 211 | 211 | return (Long)value2; | 
| 212 | 212 | } | 
| 213 | 213 |  | 
| src/main/java/org/distorted/effects/objectchange/ObjectChangeEffect.java | ||
|---|---|---|
| 24 | 24 | import org.distorted.library.main.DistortedEffects; | 
| 25 | 25 | import org.distorted.library.main.DistortedScreen; | 
| 26 | 26 | import org.distorted.library.message.EffectListener; | 
| 27 | import org.distorted.main.RubikPostRender;
 | |
| 27 | import org.distorted.main.RubikPreRender;
 | |
| 28 | 28 | import org.distorted.objects.RubikObject; | 
| 29 | 29 |  | 
| 30 | 30 | import java.lang.reflect.Method; | 
| ... | ... | |
| 224 | 224 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 225 | 225 |  | 
| 226 | 226 |   @SuppressWarnings("unused")
 | 
| 227 |   public long start(int duration, DistortedScreen screen, RubikPostRender post)
 | |
| 227 |   public long start(int duration, DistortedScreen screen, RubikPreRender pre)
 | |
| 228 | 228 |     {
 | 
| 229 | 229 | mScreen = screen; | 
| 230 |     mObject[0]= post.getOldObject();
 | |
| 231 |     mObject[1]= post.getObject();
 | |
| 232 |     mListener = post;
 | |
| 230 |     mObject[0]= pre.getOldObject();
 | |
| 231 |     mObject[1]= pre.getObject();
 | |
| 232 |     mListener = pre;
 | |
| 233 | 233 | mDuration = duration; | 
| 234 | 234 |  | 
| 235 | 235 | if( mObject[0]!=null ) | 
| src/main/java/org/distorted/effects/scramble/ScrambleEffect.java | ||
|---|---|---|
| 24 | 24 | import org.distorted.library.main.DistortedEffects; | 
| 25 | 25 | import org.distorted.library.main.DistortedScreen; | 
| 26 | 26 | import org.distorted.library.message.EffectListener; | 
| 27 | import org.distorted.main.RubikPostRender;
 | |
| 27 | import org.distorted.main.RubikPreRender;
 | |
| 28 | 28 | import org.distorted.objects.RubikObject; | 
| 29 | 29 |  | 
| 30 | 30 | import java.lang.reflect.Method; | 
| ... | ... | |
| 32 | 32 |  | 
| 33 | 33 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 34 | 34 |  | 
| 35 | public abstract class ScrambleEffect extends BaseEffect implements EffectListener, RubikPostRender.ActionFinishedListener
 | |
| 35 | public abstract class ScrambleEffect extends BaseEffect implements EffectListener, RubikPreRender.ActionFinishedListener
 | |
| 36 | 36 | {
 | 
| 37 | 37 | public enum Type | 
| 38 | 38 |     {
 | 
| ... | ... | |
| 63 | 63 | } | 
| 64 | 64 | } | 
| 65 | 65 |  | 
| 66 |   private RubikPostRender mPostRender;
 | |
| 66 |   private RubikPreRender mPreRender;
 | |
| 67 | 67 | private int mEffectReturned; | 
| 68 | 68 | private int mNumDoubleScramblesLeft, mNumScramblesLeft; | 
| 69 | 69 | private int mLastVector; | 
| ... | ... | |
| 167 | 167 |         android.util.Log.e("effect", "ERROR: "+mNumDoubleScramblesLeft);
 | 
| 168 | 168 | } | 
| 169 | 169 |  | 
| 170 |       mPostRender.addRotation(this, mLastVector, rowBitmap, angle*(360/mBasicAngle), durationMillis);
 | |
| 170 |       mPreRender.addRotation(this, mLastVector, rowBitmap, angle*(360/mBasicAngle), durationMillis);
 | |
| 171 | 171 | } | 
| 172 | 172 | else | 
| 173 | 173 |       {
 | 
| ... | ... | |
| 175 | 175 |  | 
| 176 | 176 | if( mEffectReturned == mCubeEffectNumber+mNodeEffectNumber ) | 
| 177 | 177 |         {
 | 
| 178 |         mPostRender.effectFinished(FAKE_EFFECT_ID);
 | |
| 178 |         mPreRender.effectFinished(FAKE_EFFECT_ID);
 | |
| 179 | 179 | } | 
| 180 | 180 | } | 
| 181 | 181 | } | 
| ... | ... | |
| 279 | 279 |  | 
| 280 | 280 | if( mNumScramblesLeft==0 ) | 
| 281 | 281 |             {
 | 
| 282 |             mPostRender.effectFinished(FAKE_EFFECT_ID);
 | |
| 282 |             mPreRender.effectFinished(FAKE_EFFECT_ID);
 | |
| 283 | 283 | } | 
| 284 | 284 | } | 
| 285 | 285 |  | 
| ... | ... | |
| 302 | 302 |  | 
| 303 | 303 | if( mNumScramblesLeft==0 ) | 
| 304 | 304 |             {
 | 
| 305 |             mPostRender.effectFinished(FAKE_EFFECT_ID);
 | |
| 305 |             mPreRender.effectFinished(FAKE_EFFECT_ID);
 | |
| 306 | 306 | } | 
| 307 | 307 | } | 
| 308 | 308 |  | 
| ... | ... | |
| 314 | 314 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 315 | 315 |  | 
| 316 | 316 |   @SuppressWarnings("unused")
 | 
| 317 |   public long start(int duration, DistortedScreen screen, RubikPostRender post)
 | |
| 317 |   public long start(int duration, DistortedScreen screen, RubikPreRender pre)
 | |
| 318 | 318 |     {
 | 
| 319 |     mObject     = post.getObject();
 | |
| 320 |     mPostRender = post;
 | |
| 319 |     mObject     = pre.getObject();
 | |
| 320 |     mPreRender  = pre;
 | |
| 321 | 321 | mRowChances = mObject.getRowChances(); | 
| 322 | 322 |  | 
| 323 | 323 | mObject.solve(); | 
| ... | ... | |
| 325 | 325 | mNumAxis = mObject.getRotationAxis().length; | 
| 326 | 326 | mBasicAngle = mObject.getBasicAngle(); | 
| 327 | 327 |  | 
| 328 |     int numScrambles = post.getNumScrambles();
 | |
| 328 |     int numScrambles = pre.getNumScrambles();
 | |
| 329 | 329 | int dura = (int)(duration*Math.pow(numScrambles,0.6f)); | 
| 330 | 330 | createBaseEffects(dura,numScrambles); | 
| 331 | 331 | createEffects (dura,numScrambles); | 
| src/main/java/org/distorted/effects/solve/SolveEffect.java | ||
|---|---|---|
| 24 | 24 | import org.distorted.library.main.DistortedEffects; | 
| 25 | 25 | import org.distorted.library.main.DistortedScreen; | 
| 26 | 26 | import org.distorted.library.message.EffectListener; | 
| 27 | import org.distorted.main.RubikPostRender;
 | |
| 27 | import org.distorted.main.RubikPreRender;
 | |
| 28 | 28 | import org.distorted.objects.RubikObject; | 
| 29 | 29 |  | 
| 30 | 30 | import java.lang.reflect.Method; | 
| ... | ... | |
| 197 | 197 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 198 | 198 |  | 
| 199 | 199 |   @SuppressWarnings("unused")
 | 
| 200 |   public long start(int duration, DistortedScreen screen, RubikPostRender post)
 | |
| 200 |   public long start(int duration, DistortedScreen screen, RubikPreRender pre)
 | |
| 201 | 201 |     {
 | 
| 202 | 202 | mScreen = screen; | 
| 203 |     mObject   = post.getObject();
 | |
| 204 |     mListener = post;
 | |
| 203 |     mObject   = pre.getObject();
 | |
| 204 |     mListener = pre;
 | |
| 205 | 205 | mDuration = duration; | 
| 206 | 206 |  | 
| 207 | 207 | createEffectsPhase0(mDuration); | 
| src/main/java/org/distorted/effects/win/WinEffect.java | ||
|---|---|---|
| 24 | 24 | import org.distorted.library.main.DistortedEffects; | 
| 25 | 25 | import org.distorted.library.main.DistortedScreen; | 
| 26 | 26 | import org.distorted.library.message.EffectListener; | 
| 27 | import org.distorted.main.RubikPostRender;
 | |
| 27 | import org.distorted.main.RubikPreRender;
 | |
| 28 | 28 | import org.distorted.objects.RubikObject; | 
| 29 | 29 |  | 
| 30 | 30 | import java.lang.reflect.Method; | 
| ... | ... | |
| 163 | 163 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 164 | 164 |  | 
| 165 | 165 |   @SuppressWarnings("unused")
 | 
| 166 |   public long start(int duration, DistortedScreen screen, RubikPostRender post)
 | |
| 166 |   public long start(int duration, DistortedScreen screen, RubikPreRender pre)
 | |
| 167 | 167 |     {
 | 
| 168 | 168 | mScreen = screen; | 
| 169 |     mObject   = post.getObject();
 | |
| 170 |     mListener = post;
 | |
| 169 |     mObject   = pre.getObject();
 | |
| 170 |     mListener = pre;
 | |
| 171 | 171 | mDuration = duration; | 
| 172 | 172 |  | 
| 173 | 173 | createEffects(mDuration); | 
| src/main/java/org/distorted/main/RubikActivity.java | ||
|---|---|---|
| 107 | 107 | if( sizeIndex>=0 && sizeIndex<sizes.length ) | 
| 108 | 108 |           {
 | 
| 109 | 109 | success = true; | 
| 110 |           view.getPostRender().changeObject(obj,size);
 | |
| 110 |           view.getPreRender().changeObject(obj,size);
 | |
| 111 | 111 | } | 
| 112 | 112 |  | 
| 113 | 113 | } | 
| ... | ... | |
| 118 | 118 | int s = RubikStatePlay.DEF_SIZE; | 
| 119 | 119 |  | 
| 120 | 120 | play.setObjectAndSize(this,obj,s); | 
| 121 |         view.getPostRender().changeObject(obj,s);
 | |
| 121 |         view.getPreRender().changeObject(obj,s);
 | |
| 122 | 122 | } | 
| 123 | 123 | } | 
| 124 | 124 |  | 
| ... | ... | |
| 150 | 150 |  | 
| 151 | 151 | RubikState.savePreferences(editor); | 
| 152 | 152 | RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); | 
| 153 |       view.getPostRender().savePreferences(editor);
 | |
| 153 |       view.getPreRender().savePreferences(editor);
 | |
| 154 | 154 |  | 
| 155 | 155 | editor.apply(); | 
| 156 | 156 | } | 
| ... | ... | |
| 174 | 174 | RubikState.restorePreferences(preferences); | 
| 175 | 175 |  | 
| 176 | 176 | RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); | 
| 177 |       view.getPostRender().restorePreferences(preferences);
 | |
| 177 |       view.getPreRender().restorePreferences(preferences);
 | |
| 178 | 178 | } | 
| 179 | 179 |  | 
| 180 | 180 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 203 | 203 | public RubikObject getObject() | 
| 204 | 204 |       {
 | 
| 205 | 205 | RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); | 
| 206 |       RubikPostRender post = view.getPostRender();
 | |
| 207 |       return post.getObject();
 | |
| 206 |       RubikPreRender pre = view.getPreRender();
 | |
| 207 |       return pre.getObject();
 | |
| 208 | 208 | } | 
| 209 | 209 |  | 
| 210 | 210 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 211 | 211 |  | 
| 212 |     public RubikPostRender getPostRender()
 | |
| 212 |     public RubikPreRender getPreRender()
 | |
| 213 | 213 |       {
 | 
| 214 | 214 | RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); | 
| 215 |       return view.getPostRender();
 | |
| 215 |       return view.getPreRender();
 | |
| 216 | 216 | } | 
| 217 | 217 |  | 
| 218 | 218 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 220 | 220 | public void changeObject(RubikObjectList object, int size) | 
| 221 | 221 |       {
 | 
| 222 | 222 | RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); | 
| 223 |       RubikPostRender post = view.getPostRender();
 | |
| 224 |       post.changeObject(object,size);
 | |
| 223 |       RubikPreRender pre = view.getPreRender();
 | |
| 224 |       pre.changeObject(object,size);
 | |
| 225 | 225 | } | 
| 226 | 226 |  | 
| 227 | 227 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| ... | ... | |
| 229 | 229 | public void setupObject(RubikObjectList object, int size, int[][] moves) | 
| 230 | 230 |       {
 | 
| 231 | 231 | RubikSurfaceView view = findViewById(R.id.rubikSurfaceView); | 
| 232 |       RubikPostRender post = view.getPostRender();
 | |
| 233 |       post.setupObject(object,size,moves);
 | |
| 232 |       RubikPreRender pre = view.getPreRender();
 | |
| 233 |       pre.setupObject(object,size,moves);
 | |
| 234 | 234 | } | 
| 235 | 235 |  | 
| 236 | 236 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| src/main/java/org/distorted/main/RubikPostRender.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2020 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Magic Cube. // | |
| 5 | // // | |
| 6 | // Magic Cube is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Magic Cube is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Magic Cube. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.main; | |
| 21 |  | |
| 22 | import android.content.SharedPreferences; | |
| 23 | import android.os.Bundle; | |
| 24 |  | |
| 25 | import org.distorted.dialogs.RubikDialogNewRecord; | |
| 26 | import org.distorted.dialogs.RubikDialogSolved; | |
| 27 | import org.distorted.effects.BaseEffect; | |
| 28 | import org.distorted.library.message.EffectListener; | |
| 29 | import org.distorted.objects.RubikObject; | |
| 30 | import org.distorted.objects.RubikObjectList; | |
| 31 | import org.distorted.scores.RubikScores; | |
| 32 | import org.distorted.states.RubikState; | |
| 33 | import org.distorted.states.RubikStateSolving; | |
| 34 |  | |
| 35 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 36 |  | |
| 37 | public class RubikPostRender implements EffectListener | |
| 38 |   {
 | |
| 39 | public interface ActionFinishedListener | |
| 40 |     {
 | |
| 41 | void onActionFinished(long effectID); | |
| 42 | } | |
| 43 |  | |
| 44 | private RubikSurfaceView mView; | |
| 45 | private boolean mFinishRotation, mRemoveRotation, mRemovePatternRotation, mAddRotation, | |
| 46 | mSetQuatCurrent, mSetQuatAccumulated, mChangeObject, mSetupObject, mSolveObject, | |
| 47 | mScrambleObject, mInitializeObject, mSetTextureMap, mResetAllTextureMaps; | |
| 48 | private boolean mCanRotate, mCanPlay; | |
| 49 | private boolean mIsSolved; | |
| 50 | private RubikObjectList mNextObject; | |
| 51 | private int mNextSize; | |
| 52 | private long mRotationFinishedID; | |
| 53 | private long[] mEffectID; | |
| 54 | private boolean mIsNewRecord; | |
| 55 | private long mNewRecord; | |
| 56 | private int mScreenWidth, mScreenHeight; | |
| 57 | private SharedPreferences mPreferences; | |
| 58 | private int[][] mNextMoves; | |
| 59 | private RubikObject mOldObject, mNewObject; | |
| 60 | private int mScrambleObjectNum; | |
| 61 | private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle; | |
| 62 | private long mAddRotationDuration; | |
| 63 | private ActionFinishedListener mAddActionListener; | |
| 64 | private long mAddRotationID, mRemoveRotationID; | |
| 65 | private int mCubit, mFace, mNewColor; | |
| 66 |  | |
| 67 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 68 |  | |
| 69 | RubikPostRender(RubikSurfaceView view) | |
| 70 |     {
 | |
| 71 | mView = view; | |
| 72 |  | |
| 73 | mFinishRotation = false; | |
| 74 | mRemoveRotation = false; | |
| 75 | mRemovePatternRotation= false; | |
| 76 | mAddRotation = false; | |
| 77 | mSetQuatCurrent = false; | |
| 78 | mSetQuatAccumulated = false; | |
| 79 | mChangeObject = false; | |
| 80 | mSetupObject = false; | |
| 81 | mSolveObject = false; | |
| 82 | mScrambleObject = false; | |
| 83 |  | |
| 84 | mCanRotate = true; | |
| 85 | mCanPlay = true; | |
| 86 |  | |
| 87 | mOldObject = null; | |
| 88 | mNewObject = null; | |
| 89 |  | |
| 90 | mScreenWidth = mScreenHeight = 0; | |
| 91 | mScrambleObjectNum = 0; | |
| 92 |  | |
| 93 | mEffectID = new long[BaseEffect.Type.LENGTH]; | |
| 94 | } | |
| 95 |  | |
| 96 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 97 |  | |
| 98 | private void createObjectNow(RubikObjectList object, int size, int[][] moves) | |
| 99 |     {
 | |
| 100 | boolean firstTime = (mNewObject==null); | |
| 101 |  | |
| 102 | if( mOldObject!=null ) mOldObject.releaseResources(); | |
| 103 | mOldObject = mNewObject; | |
| 104 |  | |
| 105 | mNewObject = object.create(size, mView.getQuatCurrent(), mView.getQuatAccumulated(), moves); | |
| 106 |  | |
| 107 | if( mNewObject!=null ) | |
| 108 |       {
 | |
| 109 | mNewObject.createTexture(); | |
| 110 | mView.setMovement(object.getObjectMovementClass()); | |
| 111 |  | |
| 112 | if( firstTime ) mNewObject.restorePreferences(mPreferences); | |
| 113 |  | |
| 114 | if( mScreenWidth!=0 ) | |
| 115 |         {
 | |
| 116 | mNewObject.recomputeScaleFactor(mScreenWidth, mScreenHeight); | |
| 117 | } | |
| 118 |  | |
| 119 | mIsSolved = mNewObject.isSolved(); | |
| 120 | } | |
| 121 | } | |
| 122 |  | |
| 123 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 124 | // do all 'adjustable' effects (SizeChange, Solve, Scramble) | |
| 125 |  | |
| 126 | private void doEffectNow(BaseEffect.Type type) | |
| 127 |     {
 | |
| 128 | int index = type.ordinal(); | |
| 129 |  | |
| 130 | try | |
| 131 |       {
 | |
| 132 | mEffectID[index] = type.startEffect(mView.getRenderer().getScreen(),this); | |
| 133 | } | |
| 134 | catch( Exception ex ) | |
| 135 |       {
 | |
| 136 |       android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
 | |
| 137 |  | |
| 138 | mCanPlay = true; | |
| 139 | mCanRotate = true; | |
| 140 | } | |
| 141 | } | |
| 142 |  | |
| 143 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 144 |  | |
| 145 | private void removeRotationNow() | |
| 146 |     {
 | |
| 147 | mRemoveRotation=false; | |
| 148 | mNewObject.removeRotationNow(); | |
| 149 |  | |
| 150 | boolean solved = mNewObject.isSolved(); | |
| 151 |  | |
| 152 | if( solved && !mIsSolved ) | |
| 153 |       {
 | |
| 154 | if( RubikState.getCurrentState()==RubikState.SOLV ) | |
| 155 |         {
 | |
| 156 | RubikStateSolving solving = (RubikStateSolving)RubikState.SOLV.getStateClass(); | |
| 157 | mNewRecord = solving.getRecord(); | |
| 158 |  | |
| 159 | if( mNewRecord< 0 ) | |
| 160 |           {
 | |
| 161 | mNewRecord = -mNewRecord; | |
| 162 | mIsNewRecord = false; | |
| 163 | } | |
| 164 | else | |
| 165 |           {
 | |
| 166 | mIsNewRecord = true; | |
| 167 | } | |
| 168 | } | |
| 169 |  | |
| 170 | mCanRotate = false; | |
| 171 | mCanPlay = false; | |
| 172 | doEffectNow( BaseEffect.Type.WIN ); | |
| 173 | } | |
| 174 | else | |
| 175 |       {
 | |
| 176 | mCanRotate = true; | |
| 177 | mCanPlay = true; | |
| 178 | } | |
| 179 |  | |
| 180 | mIsSolved = solved; | |
| 181 | } | |
| 182 |  | |
| 183 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 184 |  | |
| 185 | private void removeRotation() | |
| 186 |     {
 | |
| 187 | mRemoveRotation = true; | |
| 188 | } | |
| 189 |  | |
| 190 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 191 |  | |
| 192 | private void removePatternRotation() | |
| 193 |     {
 | |
| 194 | mRemovePatternRotation = true; | |
| 195 | } | |
| 196 |  | |
| 197 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 198 |  | |
| 199 | private void removePatternRotationNow() | |
| 200 |     {
 | |
| 201 | mRemovePatternRotation=false; | |
| 202 | mNewObject.removeRotationNow(); | |
| 203 | mAddActionListener.onActionFinished(mRemoveRotationID); | |
| 204 | } | |
| 205 |  | |
| 206 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 207 |  | |
| 208 | private void addRotationNow() | |
| 209 |     {
 | |
| 210 | mAddRotation = false; | |
| 211 | mAddRotationID = mNewObject.addNewRotation( mAddRotationAxis, mAddRotationRowBitmap, | |
| 212 | mAddRotationAngle, mAddRotationDuration, this); | |
| 213 | } | |
| 214 |  | |
| 215 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 216 |  | |
| 217 | private void finishRotationNow() | |
| 218 |     {
 | |
| 219 | mFinishRotation = false; | |
| 220 | mCanRotate = false; | |
| 221 | mCanPlay = false; | |
| 222 | mRotationFinishedID = mNewObject.finishRotationNow(this); | |
| 223 |  | |
| 224 | if( mRotationFinishedID==0 ) // failed to add effect - should never happen | |
| 225 |       {
 | |
| 226 | mCanRotate = true; | |
| 227 | mCanPlay = true; | |
| 228 | } | |
| 229 | } | |
| 230 |  | |
| 231 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 232 |  | |
| 233 | private void changeObjectNow() | |
| 234 |     {
 | |
| 235 | mChangeObject = false; | |
| 236 |  | |
| 237 | if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getSize()!=mNextSize) | |
| 238 |       {
 | |
| 239 | mCanRotate= false; | |
| 240 | mCanPlay = false; | |
| 241 | createObjectNow(mNextObject, mNextSize, null); | |
| 242 | doEffectNow( BaseEffect.Type.SIZECHANGE ); | |
| 243 | } | |
| 244 | } | |
| 245 |  | |
| 246 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 247 |  | |
| 248 | private void setupObjectNow() | |
| 249 |     {
 | |
| 250 | mSetupObject = false; | |
| 251 |  | |
| 252 | if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getSize()!=mNextSize) | |
| 253 |       {
 | |
| 254 | mCanRotate= false; | |
| 255 | mCanPlay = false; | |
| 256 | createObjectNow(mNextObject, mNextSize, mNextMoves); | |
| 257 | doEffectNow( BaseEffect.Type.SIZECHANGE ); | |
| 258 | } | |
| 259 | else | |
| 260 |       {
 | |
| 261 | mNewObject.initializeObject(mNextMoves); | |
| 262 | } | |
| 263 | } | |
| 264 |  | |
| 265 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 266 |  | |
| 267 | private void scrambleObjectNow() | |
| 268 |     {
 | |
| 269 | mScrambleObject = false; | |
| 270 | mCanRotate = false; | |
| 271 | mCanPlay = false; | |
| 272 | mIsSolved = false; | |
| 273 | RubikScores.getInstance().incrementNumPlays(); | |
| 274 | doEffectNow( BaseEffect.Type.SCRAMBLE ); | |
| 275 | } | |
| 276 |  | |
| 277 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 278 |  | |
| 279 | private void solveObjectNow() | |
| 280 |     {
 | |
| 281 | mSolveObject = false; | |
| 282 | mCanRotate = false; | |
| 283 | mCanPlay = false; | |
| 284 | doEffectNow( BaseEffect.Type.SOLVE ); | |
| 285 | } | |
| 286 |  | |
| 287 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 288 |  | |
| 289 | private void initializeObjectNow() | |
| 290 |     {
 | |
| 291 | mInitializeObject = false; | |
| 292 | mNewObject.initializeObject(mNextMoves); | |
| 293 | } | |
| 294 |  | |
| 295 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 296 |  | |
| 297 | private void setTextureMapNow() | |
| 298 |     {
 | |
| 299 | mSetTextureMap = false; | |
| 300 |  | |
| 301 | if( mNewObject!=null ) mNewObject.setTextureMap(mCubit,mFace,mNewColor); | |
| 302 | } | |
| 303 |  | |
| 304 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 305 |  | |
| 306 | private void resetAllTextureMapsNow() | |
| 307 |     {
 | |
| 308 | mResetAllTextureMaps = false; | |
| 309 |  | |
| 310 | if( mNewObject!=null ) mNewObject.resetAllTextureMaps(); | |
| 311 | } | |
| 312 |  | |
| 313 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 314 |  | |
| 315 | private void setQuatCurrentNow() | |
| 316 |     {
 | |
| 317 | mSetQuatCurrent = false; | |
| 318 | mView.setQuatCurrent(); | |
| 319 | } | |
| 320 |  | |
| 321 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 322 |  | |
| 323 | private void setQuatAccumulatedNow() | |
| 324 |     {
 | |
| 325 | mSetQuatAccumulated = false; | |
| 326 | mView.setQuatAccumulated(); | |
| 327 | } | |
| 328 |  | |
| 329 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 330 | // | |
| 331 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 332 |  | |
| 333 | void setScreenSize(int width, int height) | |
| 334 |     {
 | |
| 335 | if( mNewObject!=null ) | |
| 336 |       {
 | |
| 337 | mNewObject.createTexture(); | |
| 338 | mNewObject.recomputeScaleFactor(width,height); | |
| 339 | } | |
| 340 |  | |
| 341 | mScreenHeight = height; | |
| 342 | mScreenWidth = width; | |
| 343 | } | |
| 344 |  | |
| 345 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 346 |  | |
| 347 | void savePreferences(SharedPreferences.Editor editor) | |
| 348 |     {
 | |
| 349 | if( mNewObject!=null ) | |
| 350 |       {
 | |
| 351 | mNewObject.savePreferences(editor); | |
| 352 | } | |
| 353 | } | |
| 354 |  | |
| 355 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 356 |  | |
| 357 | void restorePreferences(SharedPreferences preferences) | |
| 358 |     {
 | |
| 359 | mPreferences = preferences; | |
| 360 | } | |
| 361 |  | |
| 362 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 363 |  | |
| 364 | void finishRotation() | |
| 365 |     {
 | |
| 366 | mFinishRotation = true; | |
| 367 | } | |
| 368 |  | |
| 369 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 370 |  | |
| 371 | void changeObject(RubikObjectList object, int size) | |
| 372 |     {
 | |
| 373 | if( size>0 ) | |
| 374 |       {
 | |
| 375 | mChangeObject = true; | |
| 376 | mNextObject = object; | |
| 377 | mNextSize = size; | |
| 378 | } | |
| 379 | } | |
| 380 |  | |
| 381 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 382 |  | |
| 383 | void setupObject(RubikObjectList object, int size, int[][] moves) | |
| 384 |     {
 | |
| 385 | if( size>0 ) | |
| 386 |       {
 | |
| 387 | mSetupObject= true; | |
| 388 | mNextObject = object; | |
| 389 | mNextSize = size; | |
| 390 | mNextMoves = moves; | |
| 391 | } | |
| 392 | } | |
| 393 |  | |
| 394 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 395 |  | |
| 396 | void setTextureMap(int cubit, int face, int newColor) | |
| 397 |     {
 | |
| 398 | mSetTextureMap = true; | |
| 399 |  | |
| 400 | mCubit = cubit; | |
| 401 | mFace = face; | |
| 402 | mNewColor = newColor; | |
| 403 | } | |
| 404 |  | |
| 405 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 406 |  | |
| 407 | boolean canRotate() | |
| 408 |     {
 | |
| 409 | return mCanRotate; | |
| 410 | } | |
| 411 |  | |
| 412 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 413 |  | |
| 414 | public boolean canPlay() | |
| 415 |     {
 | |
| 416 | return mCanPlay; | |
| 417 | } | |
| 418 |  | |
| 419 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 420 |  | |
| 421 | void setQuatCurrentOnNextRender() | |
| 422 |     {
 | |
| 423 | mSetQuatCurrent = true; | |
| 424 | } | |
| 425 |  | |
| 426 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 427 |  | |
| 428 | void setQuatAccumulatedOnNextRender() | |
| 429 |     {
 | |
| 430 | mSetQuatAccumulated = true; | |
| 431 | } | |
| 432 |  | |
| 433 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 434 |  | |
| 435 | void postRender() | |
| 436 |     {
 | |
| 437 | if( mSetQuatCurrent ) setQuatCurrentNow(); | |
| 438 | if( mSetQuatAccumulated ) setQuatAccumulatedNow(); | |
| 439 | if( mFinishRotation ) finishRotationNow(); | |
| 440 | if( mRemoveRotation ) removeRotationNow(); | |
| 441 | if( mRemovePatternRotation ) removePatternRotationNow(); | |
| 442 | if( mChangeObject ) changeObjectNow(); | |
| 443 | if( mSetupObject ) setupObjectNow(); | |
| 444 | if( mSolveObject ) solveObjectNow(); | |
| 445 | if( mScrambleObject ) scrambleObjectNow(); | |
| 446 | if( mAddRotation ) addRotationNow(); | |
| 447 | if( mInitializeObject ) initializeObjectNow(); | |
| 448 | if( mResetAllTextureMaps ) resetAllTextureMapsNow(); | |
| 449 | if( mSetTextureMap ) setTextureMapNow(); | |
| 450 | } | |
| 451 |  | |
| 452 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 453 | // PUBLIC API | |
| 454 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 455 |  | |
| 456 | public void addRotation(ActionFinishedListener listener, int axis, int rowBitmap, int angle, long duration) | |
| 457 |     {
 | |
| 458 | mAddRotation = true; | |
| 459 |  | |
| 460 | mAddActionListener = listener; | |
| 461 | mAddRotationAxis = axis; | |
| 462 | mAddRotationRowBitmap = rowBitmap; | |
| 463 | mAddRotationAngle = angle; | |
| 464 | mAddRotationDuration = duration; | |
| 465 | } | |
| 466 |  | |
| 467 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 468 |  | |
| 469 | public void initializeObject(int[][] moves) | |
| 470 |     {
 | |
| 471 | mInitializeObject = true; | |
| 472 | mNextMoves = moves; | |
| 473 | } | |
| 474 |  | |
| 475 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 476 |  | |
| 477 | public void scrambleObject(int num) | |
| 478 |     {
 | |
| 479 | if( mCanPlay ) | |
| 480 |       {
 | |
| 481 | mScrambleObject = true; | |
| 482 | mScrambleObjectNum = num; | |
| 483 | } | |
| 484 | } | |
| 485 |  | |
| 486 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 487 |  | |
| 488 | public void solveObject() | |
| 489 |     {
 | |
| 490 | if( mCanPlay ) | |
| 491 |       {
 | |
| 492 | mSolveObject = true; | |
| 493 | } | |
| 494 | } | |
| 495 |  | |
| 496 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 497 |  | |
| 498 | public void resetAllTextureMaps() | |
| 499 |     {
 | |
| 500 | mResetAllTextureMaps = true; | |
| 501 | } | |
| 502 |  | |
| 503 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 504 |  | |
| 505 | public RubikObject getObject() | |
| 506 |     {
 | |
| 507 | return mNewObject; | |
| 508 | } | |
| 509 |  | |
| 510 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 511 |  | |
| 512 | public RubikObject getOldObject() | |
| 513 |     {
 | |
| 514 | return mOldObject; | |
| 515 | } | |
| 516 |  | |
| 517 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 518 |  | |
| 519 | public int getNumScrambles() | |
| 520 |     {
 | |
| 521 | return mScrambleObjectNum; | |
| 522 | } | |
| 523 |  | |
| 524 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 525 |  | |
| 526 | public void effectFinished(final long effectID) | |
| 527 |     {
 | |
| 528 | if( effectID == mRotationFinishedID ) | |
| 529 |       {
 | |
| 530 | mRotationFinishedID = 0; | |
| 531 | removeRotation(); | |
| 532 | } | |
| 533 | else if( effectID == mAddRotationID ) | |
| 534 |       {
 | |
| 535 | mAddRotationID = 0; | |
| 536 | mRemoveRotationID = effectID; | |
| 537 | removePatternRotation(); | |
| 538 | } | |
| 539 | else | |
| 540 |       {
 | |
| 541 | for(int i=0; i<BaseEffect.Type.LENGTH; i++) | |
| 542 |         {
 | |
| 543 | if( effectID == mEffectID[i] ) | |
| 544 |           {
 | |
| 545 | mCanRotate = true; | |
| 546 | mCanPlay = true; | |
| 547 |  | |
| 548 | if( i==BaseEffect.Type.SCRAMBLE.ordinal() ) | |
| 549 |             {
 | |
| 550 | final RubikActivity act = (RubikActivity)mView.getContext(); | |
| 551 |  | |
| 552 | act.runOnUiThread(new Runnable() | |
| 553 |               {
 | |
| 554 | @Override | |
| 555 | public void run() | |
| 556 |                 {
 | |
| 557 | RubikState.switchState( act, RubikState.READ); | |
| 558 | } | |
| 559 | }); | |
| 560 | } | |
| 561 |  | |
| 562 | if( i==BaseEffect.Type.WIN.ordinal() ) | |
| 563 |             {
 | |
| 564 | if( RubikState.getCurrentState()==RubikState.SOLV ) | |
| 565 |               {
 | |
| 566 | final RubikActivity act = (RubikActivity)mView.getContext(); | |
| 567 | Bundle bundle = new Bundle(); | |
| 568 |               bundle.putLong("time", mNewRecord );
 | |
| 569 |  | |
| 570 | if( mIsNewRecord ) | |
| 571 |                 {
 | |
| 572 | RubikDialogNewRecord dialog = new RubikDialogNewRecord(); | |
| 573 | dialog.setArguments(bundle); | |
| 574 | dialog.show( act.getSupportFragmentManager(), null); | |
| 575 | } | |
| 576 | else | |
| 577 |                 {
 | |
| 578 | RubikDialogSolved dialog = new RubikDialogSolved(); | |
| 579 | dialog.setArguments(bundle); | |
| 580 | dialog.show( act.getSupportFragmentManager(), null); | |
| 581 | } | |
| 582 |  | |
| 583 | act.runOnUiThread(new Runnable() | |
| 584 |                 {
 | |
| 585 | @Override | |
| 586 | public void run() | |
| 587 |                   {
 | |
| 588 | RubikState.switchState( act, RubikState.DONE); | |
| 589 | } | |
| 590 | }); | |
| 591 | } | |
| 592 | } | |
| 593 |  | |
| 594 | break; | |
| 595 | } | |
| 596 | } | |
| 597 | } | |
| 598 | } | |
| 599 | } | |
| src/main/java/org/distorted/main/RubikPreRender.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2020 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Magic Cube. // | |
| 5 | // // | |
| 6 | // Magic Cube is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Magic Cube is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Magic Cube. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.main; | |
| 21 |  | |
| 22 | import android.content.SharedPreferences; | |
| 23 | import android.os.Bundle; | |
| 24 |  | |
| 25 | import org.distorted.dialogs.RubikDialogNewRecord; | |
| 26 | import org.distorted.dialogs.RubikDialogSolved; | |
| 27 | import org.distorted.effects.BaseEffect; | |
| 28 | import org.distorted.library.message.EffectListener; | |
| 29 | import org.distorted.objects.RubikObject; | |
| 30 | import org.distorted.objects.RubikObjectList; | |
| 31 | import org.distorted.scores.RubikScores; | |
| 32 | import org.distorted.states.RubikState; | |
| 33 | import org.distorted.states.RubikStateSolving; | |
| 34 |  | |
| 35 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 36 |  | |
| 37 | public class RubikPreRender implements EffectListener | |
| 38 |   {
 | |
| 39 | public interface ActionFinishedListener | |
| 40 |     {
 | |
| 41 | void onActionFinished(long effectID); | |
| 42 | } | |
| 43 |  | |
| 44 | private RubikSurfaceView mView; | |
| 45 | private boolean mFinishRotation, mRemoveRotation, mRemovePatternRotation, mAddRotation, | |
| 46 | mSetQuatCurrent, mSetQuatAccumulated, mChangeObject, mSetupObject, mSolveObject, | |
| 47 | mScrambleObject, mInitializeObject, mSetTextureMap, mResetAllTextureMaps; | |
| 48 | private boolean mCanRotate, mCanPlay; | |
| 49 | private boolean mIsSolved; | |
| 50 | private RubikObjectList mNextObject; | |
| 51 | private int mNextSize; | |
| 52 | private long mRotationFinishedID; | |
| 53 | private long[] mEffectID; | |
| 54 | private boolean mIsNewRecord; | |
| 55 | private long mNewRecord; | |
| 56 | private int mScreenWidth, mScreenHeight; | |
| 57 | private SharedPreferences mPreferences; | |
| 58 | private int[][] mNextMoves; | |
| 59 | private RubikObject mOldObject, mNewObject; | |
| 60 | private int mScrambleObjectNum; | |
| 61 | private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle; | |
| 62 | private long mAddRotationDuration; | |
| 63 | private ActionFinishedListener mAddActionListener; | |
| 64 | private long mAddRotationID, mRemoveRotationID; | |
| 65 | private int mCubit, mFace, mNewColor; | |
| 66 |  | |
| 67 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 68 |  | |
| 69 | RubikPreRender(RubikSurfaceView view) | |
| 70 |     {
 | |
| 71 | mView = view; | |
| 72 |  | |
| 73 | mFinishRotation = false; | |
| 74 | mRemoveRotation = false; | |
| 75 | mRemovePatternRotation= false; | |
| 76 | mAddRotation = false; | |
| 77 | mSetQuatCurrent = false; | |
| 78 | mSetQuatAccumulated = false; | |
| 79 | mChangeObject = false; | |
| 80 | mSetupObject = false; | |
| 81 | mSolveObject = false; | |
| 82 | mScrambleObject = false; | |
| 83 |  | |
| 84 | mCanRotate = true; | |
| 85 | mCanPlay = true; | |
| 86 |  | |
| 87 | mOldObject = null; | |
| 88 | mNewObject = null; | |
| 89 |  | |
| 90 | mScreenWidth = mScreenHeight = 0; | |
| 91 | mScrambleObjectNum = 0; | |
| 92 |  | |
| 93 | mEffectID = new long[BaseEffect.Type.LENGTH]; | |
| 94 | } | |
| 95 |  | |
| 96 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 97 |  | |
| 98 | private void createObjectNow(RubikObjectList object, int size, int[][] moves) | |
| 99 |     {
 | |
| 100 | boolean firstTime = (mNewObject==null); | |
| 101 |  | |
| 102 | if( mOldObject!=null ) mOldObject.releaseResources(); | |
| 103 | mOldObject = mNewObject; | |
| 104 |  | |
| 105 | mNewObject = object.create(size, mView.getQuatCurrent(), mView.getQuatAccumulated(), moves); | |
| 106 |  | |
| 107 | if( mNewObject!=null ) | |
| 108 |       {
 | |
| 109 | mNewObject.createTexture(); | |
| 110 | mView.setMovement(object.getObjectMovementClass()); | |
| 111 |  | |
| 112 | if( firstTime ) mNewObject.restorePreferences(mPreferences); | |
| 113 |  | |
| 114 | if( mScreenWidth!=0 ) | |
| 115 |         {
 | |
| 116 | mNewObject.recomputeScaleFactor(mScreenWidth, mScreenHeight); | |
| 117 | } | |
| 118 |  | |
| 119 | mIsSolved = mNewObject.isSolved(); | |
| 120 | } | |
| 121 | } | |
| 122 |  | |
| 123 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 124 | // do all 'adjustable' effects (SizeChange, Solve, Scramble) | |
| 125 |  | |
| 126 | private void doEffectNow(BaseEffect.Type type) | |
| 127 |     {
 | |
| 128 | int index = type.ordinal(); | |
| 129 |  | |
| 130 | try | |
| 131 |       {
 | |
| 132 | mEffectID[index] = type.startEffect(mView.getRenderer().getScreen(),this); | |
| 133 | } | |
| 134 | catch( Exception ex ) | |
| 135 |       {
 | |
| 136 |       android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
 | |
| 137 |  | |
| 138 | mCanPlay = true; | |
| 139 | mCanRotate = true; | |
| 140 | } | |
| 141 | } | |
| 142 |  | |
| 143 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 144 |  | |
| 145 | private void removeRotationNow() | |
| 146 |     {
 | |
| 147 | mRemoveRotation=false; | |
| 148 | mNewObject.removeRotationNow(); | |
| 149 |  | |
| 150 | boolean solved = mNewObject.isSolved(); | |
| 151 |  | |
| 152 | if( solved && !mIsSolved ) | |
| 153 |       {
 | |
| 154 | if( RubikState.getCurrentState()==RubikState.SOLV ) | |
| 155 |         {
 | |
| 156 | RubikStateSolving solving = (RubikStateSolving)RubikState.SOLV.getStateClass(); | |
| 157 | mNewRecord = solving.getRecord(); | |
| 158 |  | |
| 159 | if( mNewRecord< 0 ) | |
| 160 |           {
 | |
| 161 | mNewRecord = -mNewRecord; | |
| 162 | mIsNewRecord = false; | |
| 163 | } | |
| 164 | else | |
| 165 |           {
 | |
| 166 | mIsNewRecord = true; | |
| 167 | } | |
| 168 | } | |
| 169 |  | |
| 170 | mCanRotate = false; | |
| 171 | mCanPlay = false; | |
| 172 | doEffectNow( BaseEffect.Type.WIN ); | |
| 173 | } | |
| 174 | else | |
| 175 |       {
 | |
| 176 | mCanRotate = true; | |
| 177 | mCanPlay = true; | |
| 178 | } | |
| 179 |  | |
| 180 | mIsSolved = solved; | |
| 181 | } | |
| 182 |  | |
| 183 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 184 |  | |
| 185 | private void removeRotation() | |
| 186 |     {
 | |
| 187 | mRemoveRotation = true; | |
| 188 | } | |
| 189 |  | |
| 190 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 191 |  | |
| 192 | private void removePatternRotation() | |
| 193 |     {
 | |
| 194 | mRemovePatternRotation = true; | |
| 195 | } | |
| 196 |  | |
| 197 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 198 |  | |
| 199 | private void removePatternRotationNow() | |
| 200 |     {
 | |
| 201 | mRemovePatternRotation=false; | |
| 202 | mNewObject.removeRotationNow(); | |
| 203 | mAddActionListener.onActionFinished(mRemoveRotationID); | |
| 204 | } | |
| 205 |  | |
| 206 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 207 |  | |
| 208 | private void addRotationNow() | |
| 209 |     {
 | |
| 210 | mAddRotation = false; | |
| 211 | mAddRotationID = mNewObject.addNewRotation( mAddRotationAxis, mAddRotationRowBitmap, | |
| 212 | mAddRotationAngle, mAddRotationDuration, this); | |
| 213 | } | |
| 214 |  | |
| 215 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 216 |  | |
| 217 | private void finishRotationNow() | |
| 218 |     {
 | |
| 219 | mFinishRotation = false; | |
| 220 | mCanRotate = false; | |
| 221 | mCanPlay = false; | |
| 222 | mRotationFinishedID = mNewObject.finishRotationNow(this); | |
| 223 |  | |
| 224 | if( mRotationFinishedID==0 ) // failed to add effect - should never happen | |
| 225 |       {
 | |
| 226 | mCanRotate = true; | |
| 227 | mCanPlay = true; | |
| 228 | } | |
| 229 | } | |
| 230 |  | |
| 231 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 232 |  | |
| 233 | private void changeObjectNow() | |
| 234 |     {
 | |
| 235 | mChangeObject = false; | |
| 236 |  | |
| 237 | if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getSize()!=mNextSize) | |
| 238 |       {
 | |
| 239 | mCanRotate= false; | |
| 240 | mCanPlay = false; | |
| 241 | createObjectNow(mNextObject, mNextSize, null); | |
| 242 | doEffectNow( BaseEffect.Type.SIZECHANGE ); | |
| 243 | } | |
| 244 | } | |
| 245 |  | |
| 246 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 247 |  | |
| 248 | private void setupObjectNow() | |
| 249 |     {
 | |
| 250 | mSetupObject = false; | |
| 251 |  | |
| 252 | if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getSize()!=mNextSize) | |
| 253 |       {
 | |
| 254 | mCanRotate= false; | |
| 255 | mCanPlay = false; | |
| 256 | createObjectNow(mNextObject, mNextSize, mNextMoves); | |
| 257 | doEffectNow( BaseEffect.Type.SIZECHANGE ); | |
| 258 | } | |
| 259 | else | |
| 260 |       {
 | |
| 261 | mNewObject.initializeObject(mNextMoves); | |
| 262 | } | |
| 263 | } | |
| 264 |  | |
| 265 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 266 |  | |
| 267 | private void scrambleObjectNow() | |
| 268 |     {
 | |
| 269 | mScrambleObject = false; | |
| 270 | mCanRotate = false; | |
| 271 | mCanPlay = false; | |
| 272 | mIsSolved = false; | |
| 273 | RubikScores.getInstance().incrementNumPlays(); | |
| 274 | doEffectNow( BaseEffect.Type.SCRAMBLE ); | |
| 275 | } | |
| 276 |  | |
| 277 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 278 |  | |
| 279 | private void solveObjectNow() | |
| 280 |     {
 | |
| 281 | mSolveObject = false; | |
| 282 | mCanRotate = false; | |
| 283 | mCanPlay = false; | |
| 284 | doEffectNow( BaseEffect.Type.SOLVE ); | |
| 285 | } | |
| 286 |  | |
| 287 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 288 |  | |
| 289 | private void initializeObjectNow() | |
| 290 |     {
 | |
| 291 | mInitializeObject = false; | |
| 292 | mNewObject.initializeObject(mNextMoves); | |
| 293 | } | |
| 294 |  | |
| 295 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 296 |  | |
| 297 | private void setTextureMapNow() | |
| 298 |     {
 | |
| 299 | mSetTextureMap = false; | |
| 300 |  | |
| 301 | if( mNewObject!=null ) mNewObject.setTextureMap(mCubit,mFace,mNewColor); | |
| 302 | } | |
| 303 |  | |
| 304 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 305 |  | |
| 306 | private void resetAllTextureMapsNow() | |
| 307 |     {
 | |
| 308 | mResetAllTextureMaps = false; | |
| 309 |  | |
| 310 | if( mNewObject!=null ) mNewObject.resetAllTextureMaps(); | |
| 311 | } | |
| 312 |  | |
| 313 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 314 |  | |
| 315 | private void setQuatCurrentNow() | |
| 316 |     {
 | |
| 317 | mSetQuatCurrent = false; | |
| 318 | mView.setQuatCurrent(); | |
| 319 | } | |
| 320 |  | |
| 321 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 322 |  | |
| 323 | private void setQuatAccumulatedNow() | |
| 324 |     {
 | |
| 325 | mSetQuatAccumulated = false; | |
| 326 | mView.setQuatAccumulated(); | |
| 327 | } | |
| 328 |  | |
| 329 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 330 | // | |
| 331 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 332 |  | |
| 333 | void setScreenSize(int width, int height) | |
| 334 |     {
 | |
| 335 | if( mNewObject!=null ) | |
| 336 |       {
 | |
| 337 | mNewObject.createTexture(); | |
| 338 | mNewObject.recomputeScaleFactor(width,height); | |
| 339 | } | |
| 340 |  | |
| 341 | mScreenHeight = height; | |
| 342 | mScreenWidth = width; | |
| 343 | } | |
| 344 |  | |
| 345 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 346 |  | |
| 347 | void savePreferences(SharedPreferences.Editor editor) | |
| 348 |     {
 | |
| 349 | if( mNewObject!=null ) | |
| 350 |       {
 | |
| 351 | mNewObject.savePreferences(editor); | |
| 352 | } | |
| 353 | } | |
| 354 |  | |
| 355 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 356 |  | |
| 357 | void restorePreferences(SharedPreferences preferences) | |
| 358 |     {
 | |
| 359 | mPreferences = preferences; | |
| 360 | } | |
| 361 |  | |
| 362 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 363 |  | |
| 364 | void finishRotation() | |
| 365 |     {
 | |
| 366 | mFinishRotation = true; | |
| 367 | } | |
| 368 |  | |
| 369 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 370 |  | |
| 371 | void changeObject(RubikObjectList object, int size) | |
| 372 |     {
 | |
| 373 | if( size>0 ) | |
| 374 |       {
 | |
| 375 | mChangeObject = true; | |
| 376 | mNextObject = object; | |
| 377 | mNextSize = size; | |
| 378 | } | |
| 379 | } | |
| 380 |  | |
| 381 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 382 |  | |
| 383 | void setupObject(RubikObjectList object, int size, int[][] moves) | |
| 384 |     {
 | |
| 385 | if( size>0 ) | |
| 386 |       {
 | |
| 387 | mSetupObject= true; | |
| 388 | mNextObject = object; | |
| 389 | mNextSize = size; | |
| 390 | mNextMoves = moves; | |
| 391 | } | |
| 392 | } | |
| 393 |  | |
| 394 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 395 |  | |
| 396 | void setTextureMap(int cubit, int face, int newColor) | |
| 397 |     {
 | |
| 398 | mSetTextureMap = true; | |
| 399 |  | |
| 400 | mCubit = cubit; | |
| 401 | mFace = face; | |
| 402 | mNewColor = newColor; | |
| 403 | } | |
| 404 |  | |
| 405 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 406 |  | |
| 407 | boolean canRotate() | |
| 408 |     {
 | |
| 409 | return mCanRotate; | |
| 410 | } | |
| 411 |  | |
| 412 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 413 |  | |
| 414 | public boolean canPlay() | |
| 415 |     {
 | |
| 416 | return mCanPlay; | |
| 417 | } | |
| 418 |  | |
| 419 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 420 |  | |
| 421 | void setQuatCurrentOnNextRender() | |
| 422 |     {
 | |
| 423 | mSetQuatCurrent = true; | |
| 424 | } | |
| 425 |  | |
| 426 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 427 |  | |
| 428 | void setQuatAccumulatedOnNextRender() | |
| 429 |     {
 | |
| 430 | mSetQuatAccumulated = true; | |
| 431 | } | |
| 432 |  | |
| 433 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 434 |  | |
| 435 | void preRender() | |
| 436 |     {
 | |
| 437 | if( mSetQuatCurrent ) setQuatCurrentNow(); | |
| 438 | if( mSetQuatAccumulated ) setQuatAccumulatedNow(); | |
| 439 | if( mFinishRotation ) finishRotationNow(); | |
| 440 | if( mRemoveRotation ) removeRotationNow(); | |
| 441 | if( mRemovePatternRotation ) removePatternRotationNow(); | |
| 442 | if( mChangeObject ) changeObjectNow(); | |
| 443 | if( mSetupObject ) setupObjectNow(); | |
| 444 | if( mSolveObject ) solveObjectNow(); | |
| 445 | if( mScrambleObject ) scrambleObjectNow(); | |
| 446 | if( mAddRotation ) addRotationNow(); | |
| 447 | if( mInitializeObject ) initializeObjectNow(); | |
| 448 | if( mResetAllTextureMaps ) resetAllTextureMapsNow(); | |
| 449 | if( mSetTextureMap ) setTextureMapNow(); | |
| 450 | } | |
| 451 |  | |
| 452 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 453 | // PUBLIC API | |
| 454 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 455 |  | |
| 456 | public void addRotation(ActionFinishedListener listener, int axis, int rowBitmap, int angle, long duration) | |
| 457 |     {
 | |
| 458 | mAddRotation = true; | |
| 459 |  | |
| 460 | mAddActionListener = listener; | |
| 461 | mAddRotationAxis = axis; | |
| 462 | mAddRotationRowBitmap = rowBitmap; | |
| 463 | mAddRotationAngle = angle; | |
| 464 | mAddRotationDuration = duration; | |
| 465 | } | |
| 466 |  | |
| 467 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 468 |  | |
| 469 | public void initializeObject(int[][] moves) | |
| 470 |     {
 | |
| 471 | mInitializeObject = true; | |
| 472 | mNextMoves = moves; | |
| 473 | } | |
| 474 |  | |
| 475 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 476 |  | |
| 477 | public void scrambleObject(int num) | |
| 478 |     {
 | |
| 479 | if( mCanPlay ) | |
| 480 |       {
 | |
| 481 | mScrambleObject = true; | |
| 482 | mScrambleObjectNum = num; | |
| 483 | } | |
| 484 | } | |
| 485 |  | |
| 486 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 487 |  | |
| 488 | public void solveObject() | |
| 489 |     {
 | |
| 490 | if( mCanPlay ) | |
| 491 |       {
 | |
| 492 | mSolveObject = true; | |
| 493 | } | |
| 494 | } | |
| 495 |  | |
| 496 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 497 |  | |
| 498 | public void resetAllTextureMaps() | |
| 499 |     {
 | |
| 500 | mResetAllTextureMaps = true; | |
| 501 | } | |
| 502 |  | |
| 503 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 504 |  | |
| 505 | public RubikObject getObject() | |
| 506 |     {
 | |
| 507 | return mNewObject; | |
| 508 | } | |
| 509 |  | |
| 510 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 511 |  | |
| 512 | public RubikObject getOldObject() | |
| 513 |     {
 | |
| 514 | return mOldObject; | |
| 515 | } | |
| 516 |  | |
| 517 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 518 |  | |
| 519 | public int getNumScrambles() | |
| 520 |     {
 | |
| 521 | return mScrambleObjectNum; | |
| 522 | } | |
| 523 |  | |
| 524 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 525 |  | |
| 526 | public void effectFinished(final long effectID) | |
| 527 |     {
 | |
| 528 | if( effectID == mRotationFinishedID ) | |
| 529 |       {
 | |
| 530 | mRotationFinishedID = 0; | |
| 531 | removeRotation(); | |
| 532 | } | |
| 533 | else if( effectID == mAddRotationID ) | |
| 534 |       {
 | |
| 535 | mAddRotationID = 0; | |
| 536 | mRemoveRotationID = effectID; | |
| 537 | removePatternRotation(); | |
| 538 | } | |
| 539 | else | |
| 540 |       {
 | |
| 541 | for(int i=0; i<BaseEffect.Type.LENGTH; i++) | |
| 542 |         {
 | |
| 543 | if( effectID == mEffectID[i] ) | |
| 544 |           {
 | |
| 545 | mCanRotate = true; | |
| 546 | mCanPlay = true; | |
| 547 |  | |
| 548 | if( i==BaseEffect.Type.SCRAMBLE.ordinal() ) | |
| 549 |             {
 | |
| 550 | final RubikActivity act = (RubikActivity)mView.getContext(); | |
| 551 |  | |
| 552 | act.runOnUiThread(new Runnable() | |
| 553 |               {
 | |
| 554 | @Override | |
| 555 | public void run() | |
| 556 |                 {
 | |
| 557 | RubikState.switchState( act, RubikState.READ); | |
| 558 | } | |
| 559 | }); | |
| 560 | } | |
| 561 |  | |
| 562 | if( i==BaseEffect.Type.WIN.ordinal() ) | |
| 563 |             {
 | |
| 564 | if( RubikState.getCurrentState()==RubikState.SOLV ) | |
| 565 |               {
 | |
| 566 | final RubikActivity act = (RubikActivity)mView.getContext(); | |
| 567 | Bundle bundle = new Bundle(); | |
| 568 |               bundle.putLong("time", mNewRecord );
 | |
| 569 |  | |
| 570 | if( mIsNewRecord ) | |
| 571 |                 {
 | |
| 572 | RubikDialogNewRecord dialog = new RubikDialogNewRecord(); | |
| 573 | dialog.setArguments(bundle); | |
| 574 | dialog.show( act.getSupportFragmentManager(), null); | |
| 575 | } | |
| 576 | else | |
| 577 |                 {
 | |
| 578 | RubikDialogSolved dialog = new RubikDialogSolved(); | |
| 579 | dialog.setArguments(bundle); | |
| 580 | dialog.show( act.getSupportFragmentManager(), null); | |
| 581 | } | |
| 582 |  | |
| 583 | act.runOnUiThread(new Runnable() | |
| 584 |                 {
 | |
| 585 | @Override | |
| 586 | public void run() | |
| 587 |                   {
 | |
| 588 | RubikState.switchState( act, RubikState.DONE); | |
| 589 | } | |
| 590 | }); | |
Also available in: Unified diff
Convert the PostRender to a PreRender, called before we render.
This makes more sense as this way things are prepared for the very first render.