Revision 3c4a326c
Added by Leszek Koltunski almost 6 years ago
| src/main/java/org/distorted/effect/scramble/ScrambleEffect.java | ||
|---|---|---|
| 23 | 23 |
import org.distorted.library.effect.Effect; |
| 24 | 24 |
import org.distorted.library.main.DistortedEffects; |
| 25 | 25 |
import org.distorted.library.message.EffectListener; |
| 26 |
import org.distorted.library.type.Static3D; |
|
| 26 | 27 |
import org.distorted.magic.RubikRenderer; |
| 27 | 28 |
import org.distorted.object.RubikObject; |
| 28 | 29 |
|
| 29 | 30 |
import java.lang.reflect.Method; |
| 30 | 31 |
import java.util.Random; |
| 31 | 32 |
|
| 32 |
import static org.distorted.object.RubikObjectList.VECTX; |
|
| 33 |
import static org.distorted.object.RubikObjectList.VECTY; |
|
| 34 |
import static org.distorted.object.RubikObjectList.VECTZ; |
|
| 35 |
|
|
| 36 | 33 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 37 | 34 |
|
| 38 | 35 |
public abstract class ScrambleEffect extends BaseEffect implements EffectListener |
| ... | ... | |
| 55 | 52 |
private static final int FAKE_EFFECT_ID = -3; |
| 56 | 53 |
private static final Type[] types; |
| 57 | 54 |
|
| 55 |
private static final Static3D VECTX = new Static3D(1,0,0); |
|
| 56 |
private static final Static3D VECTY = new Static3D(0,1,0); |
|
| 57 |
private static final Static3D VECTZ = new Static3D(0,0,1); |
|
| 58 |
private static final Static3D VECTU = new Static3D(0,0,0); |
|
| 59 |
|
|
| 60 |
private static final Static3D[] VECTORS = { VECTX, VECTY, VECTZ, VECTZ };
|
|
| 61 |
|
|
| 58 | 62 |
static |
| 59 | 63 |
{
|
| 60 | 64 |
int i=0; |
| ... | ... | |
| 86 | 90 |
ScrambleEffect() |
| 87 | 91 |
{
|
| 88 | 92 |
mRnd = new Random( System.currentTimeMillis() ); |
| 89 |
mLastVector = -1;
|
|
| 93 |
mLastVector = 3;
|
|
| 90 | 94 |
} |
| 91 | 95 |
|
| 92 | 96 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 123 | 127 |
{
|
| 124 | 128 |
if( mNumScramblesLeft>0 ) |
| 125 | 129 |
{
|
| 126 |
if( mLastVector == -1 )
|
|
| 130 |
if( mLastVector == 3 )
|
|
| 127 | 131 |
{
|
| 128 |
switch(mRnd.nextInt(3)) |
|
| 129 |
{
|
|
| 130 |
case 0: mLastVector = VECTX; break; |
|
| 131 |
case 1: mLastVector = VECTY; break; |
|
| 132 |
case 2: mLastVector = VECTZ; break; |
|
| 133 |
} |
|
| 132 |
mLastVector = mRnd.nextInt(3); |
|
| 134 | 133 |
} |
| 135 | 134 |
else |
| 136 | 135 |
{
|
| ... | ... | |
| 138 | 137 |
|
| 139 | 138 |
switch(mLastVector) |
| 140 | 139 |
{
|
| 141 |
case VECTX: mLastVector = (newVector==0 ? VECTY: VECTZ); break;
|
|
| 142 |
case VECTY: mLastVector = (newVector==0 ? VECTX: VECTZ); break;
|
|
| 143 |
case VECTZ: mLastVector = (newVector==0 ? VECTX: VECTY); break;
|
|
| 140 |
case 0: mLastVector = (newVector==0 ? 1:2); break;
|
|
| 141 |
case 1: mLastVector = (newVector==0 ? 0:2); break;
|
|
| 142 |
case 2: mLastVector = (newVector==0 ? 0:1); break;
|
|
| 144 | 143 |
} |
| 145 | 144 |
} |
| 146 | 145 |
|
| ... | ... | |
| 157 | 156 |
android.util.Log.e("effect", "ERROR: "+mNumDoubleScramblesLeft);
|
| 158 | 157 |
} |
| 159 | 158 |
|
| 160 |
mCurrentBaseEffectID = mObject.addNewRotation(mLastVector, row, angle*90, durationMillis, this );
|
|
| 159 |
mCurrentBaseEffectID = mObject.addNewRotation(VECTORS[mLastVector], row, angle*90, durationMillis, this );
|
|
| 161 | 160 |
} |
| 162 | 161 |
else |
| 163 | 162 |
{
|
| src/main/java/org/distorted/magic/RubikRenderer.java | ||
|---|---|---|
| 132 | 132 |
|
| 133 | 133 |
void savePreferences(SharedPreferences.Editor editor) |
| 134 | 134 |
{
|
| 135 |
mNewObject.savePreferences(editor); |
|
| 135 |
if( mNewObject!=null ) |
|
| 136 |
{
|
|
| 137 |
mNewObject.savePreferences(editor); |
|
| 138 |
} |
|
| 136 | 139 |
} |
| 137 | 140 |
|
| 138 | 141 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/magic/RubikSurfaceView.java | ||
|---|---|---|
| 27 | 27 |
import android.view.MotionEvent; |
| 28 | 28 |
|
| 29 | 29 |
import org.distorted.library.type.Static2D; |
| 30 |
import org.distorted.library.type.Static3D; |
|
| 30 | 31 |
import org.distorted.library.type.Static4D; |
| 31 | 32 |
import org.distorted.object.RubikObject; |
| 32 | 33 |
import org.distorted.object.RubikObjectMovement; |
| ... | ... | |
| 264 | 265 |
Static4D touchPoint2 = new Static4D(x, y, 0, 0); |
| 265 | 266 |
Static4D rotatedTouchPoint2= rotateVectorByInvertedQuat(touchPoint2, mQuatAccumulated); |
| 266 | 267 |
|
| 267 |
Static2D rot = mMovement.newRotation(rotatedTouchPoint2);
|
|
| 268 |
Static4D rot = mMovement.newRotation(rotatedTouchPoint2);
|
|
| 268 | 269 |
RubikObject object = mRenderer.getObject(); |
| 269 | 270 |
|
| 270 |
object.beginNewRotation( (int)rot.get0(), (int)(object.getSize()*rot.get1()) );
|
|
| 271 |
object.beginNewRotation( new Static3D(rot.get0(),rot.get1(),rot.get2()), (int)(object.getSize()*rot.get3()) );
|
|
| 271 | 272 |
|
| 272 | 273 |
if( RubikState.getCurrentState()==RubikState.SOLV ) |
| 273 | 274 |
{
|
| src/main/java/org/distorted/object/Cubit.java | ||
|---|---|---|
| 233 | 233 |
|
| 234 | 234 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 235 | 235 |
|
| 236 |
Static4D returnRotationQuat(float qx,float qy,float qz)
|
|
| 236 |
Static4D returnRotationQuat( Static3D axis)
|
|
| 237 | 237 |
{
|
| 238 | 238 |
int pointNum = mRotationAngle.getNumPoints(); |
| 239 | 239 |
|
| ... | ... | |
| 244 | 244 |
double nearestAngleInRadians = nearestAngleInDegrees*Math.PI/180; |
| 245 | 245 |
float sinA =-(float)Math.sin(nearestAngleInRadians*0.5); |
| 246 | 246 |
float cosA = (float)Math.cos(nearestAngleInRadians*0.5); |
| 247 |
return new Static4D(qx*sinA, qy*sinA, qz*sinA, cosA);
|
|
| 247 |
return new Static4D( axis.get0()*sinA, axis.get1()*sinA, axis.get2()*sinA, cosA);
|
|
| 248 | 248 |
} |
| 249 | 249 |
|
| 250 | 250 |
return null; |
| src/main/java/org/distorted/object/RubikCube.java | ||
|---|---|---|
| 30 | 30 |
import org.distorted.library.type.Static3D; |
| 31 | 31 |
import org.distorted.library.type.Static4D; |
| 32 | 32 |
|
| 33 |
import static org.distorted.object.RubikObjectList.VECTX; |
|
| 34 |
import static org.distorted.object.RubikObjectList.VECTY; |
|
| 35 |
import static org.distorted.object.RubikObjectList.VECTZ; |
|
| 36 |
|
|
| 37 | 33 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 38 | 34 |
|
| 39 | 35 |
class RubikCube extends RubikObject |
| ... | ... | |
| 64 | 60 |
} |
| 65 | 61 |
|
| 66 | 62 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 67 |
// i.e. size^3 - (size-2)^3 - number of cubits in the outside wall of the Cube (we dont create or |
|
| 68 |
// render the inside0
|
|
| 63 |
// i.e. size^3 - (size-2)^3 - number of cubits in the outside wall of the Cube (we don't create or
|
|
| 64 |
// render the inside)
|
|
| 69 | 65 |
|
| 70 | 66 |
int getNumCubits(int size) |
| 71 | 67 |
{
|
| 72 |
return 6*size*size - 12*size + 8;
|
|
| 68 |
return size>1 ? 6*size*size - 12*size + 8 : 1;
|
|
| 73 | 69 |
} |
| 74 | 70 |
|
| 75 | 71 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 109 | 105 |
|
| 110 | 106 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 111 | 107 |
|
| 112 |
boolean belongsToRotation( Static3D currentPosition, int vector, int row)
|
|
| 108 |
boolean belongsToRotation( Static3D currentPosition, Static3D axis, int row)
|
|
| 113 | 109 |
{
|
| 114 |
switch(vector) |
|
| 115 |
{
|
|
| 116 |
case VECTX: return currentPosition.get0()==row; |
|
| 117 |
case VECTY: return currentPosition.get1()==row; |
|
| 118 |
case VECTZ: return currentPosition.get2()==row; |
|
| 119 |
} |
|
| 110 |
if( axis.get0()!=0 ) return currentPosition.get0()==row; |
|
| 111 |
if( axis.get1()!=0 ) return currentPosition.get1()==row; |
|
| 112 |
if( axis.get2()!=0 ) return currentPosition.get2()==row; |
|
| 120 | 113 |
|
| 121 | 114 |
return false; |
| 122 | 115 |
} |
| src/main/java/org/distorted/object/RubikCubeMovement.java | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
package org.distorted.object; |
| 21 | 21 |
|
| 22 |
import org.distorted.library.type.Static2D; |
|
| 23 | 22 |
import org.distorted.library.type.Static4D; |
| 24 | 23 |
|
| 25 |
import static org.distorted.object.RubikObjectList.VECTX; |
|
| 26 |
import static org.distorted.object.RubikObjectList.VECTY; |
|
| 27 |
import static org.distorted.object.RubikObjectList.VECTZ; |
|
| 28 |
|
|
| 29 | 24 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 30 | 25 |
|
| 31 | 26 |
class RubikCubeMovement extends RubikObjectMovement |
| 32 | 27 |
{
|
| 33 | 28 |
private final static int NONE =-1; |
| 34 |
private final static int FRONT = 0; // has to be 6 consecutive ints
|
|
| 35 |
private final static int BACK = 1; // FRONT ... BOTTOM
|
|
| 36 |
private final static int LEFT = 2; // |
|
| 37 |
private final static int RIGHT = 3; // |
|
| 29 |
private final static int FRONT = 0; // |
|
| 30 |
private final static int BACK = 1; // |
|
| 31 |
private final static int LEFT = 2; // has to be 6 consecutive ints
|
|
| 32 |
private final static int RIGHT = 3; // FRONT ... BOTTOM
|
|
| 38 | 33 |
private final static int TOP = 4; // |
| 39 | 34 |
private final static int BOTTOM = 5; // |
| 40 | 35 |
|
| 36 |
private static final int VECTX = 0; // |
|
| 37 |
private static final int VECTY = 1; // don't change this |
|
| 38 |
private static final int VECTZ = 2; // |
|
| 39 |
|
|
| 41 | 40 |
private static final int[] VECT = {VECTX,VECTY,VECTZ};
|
| 42 | 41 |
|
| 43 | 42 |
private float[] mPoint, mCamera, mDiff, mTouch; |
| ... | ... | |
| 192 | 191 |
|
| 193 | 192 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 194 | 193 |
|
| 195 |
public Static2D newRotation(Static4D rotatedTouchPoint)
|
|
| 194 |
public Static4D newRotation(Static4D rotatedTouchPoint)
|
|
| 196 | 195 |
{
|
| 197 | 196 |
float cubeHalfSize= RubikObject.OBJECT_SCREEN_RATIO*0.5f; |
| 198 | 197 |
|
| ... | ... | |
| 215 | 214 |
mTouch[1] = mPoint[1]; |
| 216 | 215 |
mTouch[2] = mPoint[2]; |
| 217 | 216 |
|
| 218 |
return new Static2D(mRotationVect,offset); |
|
| 217 |
Static4D result=null; |
|
| 218 |
|
|
| 219 |
switch(mRotationVect) |
|
| 220 |
{
|
|
| 221 |
case VECTX: result = new Static4D(1,0,0,offset); break; |
|
| 222 |
case VECTY: result = new Static4D(0,1,0,offset); break; |
|
| 223 |
case VECTZ: result = new Static4D(0,0,1,offset); break; |
|
| 224 |
} |
|
| 225 |
|
|
| 226 |
return result; |
|
| 219 | 227 |
} |
| 220 | 228 |
|
| 221 | 229 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/object/RubikObject.java | ||
|---|---|---|
| 37 | 37 |
import org.distorted.library.type.Static3D; |
| 38 | 38 |
import org.distorted.library.type.Static4D; |
| 39 | 39 |
|
| 40 |
import static org.distorted.object.RubikObjectList.*; |
|
| 41 |
|
|
| 42 | 40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 43 | 41 |
|
| 44 | 42 |
public abstract class RubikObject extends DistortedNode |
| ... | ... | |
| 50 | 48 |
private static final int POST_ROTATION_MILLISEC = 500; |
| 51 | 49 |
private final int NUM_CUBITS; |
| 52 | 50 |
private final int[][] CUBIT_POSITIONS; |
| 53 |
private int mRotAxis, mRotRow;
|
|
| 54 |
|
|
| 51 |
private int mRotRow; |
|
| 52 |
private Static3D mRotAxis; |
|
| 55 | 53 |
private Static3D mMove, mScale, mNodeMove, mNodeScale; |
| 56 | 54 |
private Static4D mQuatAccumulated; |
| 57 | 55 |
private DistortedTexture mNodeTexture; |
| ... | ... | |
| 292 | 290 |
|
| 293 | 291 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 294 | 292 |
|
| 295 |
public void beginNewRotation(int vector, int row )
|
|
| 293 |
public void beginNewRotation(Static3D axis, int row )
|
|
| 296 | 294 |
{
|
| 297 |
Static3D axis = VectX; |
|
| 298 |
|
|
| 299 |
switch(vector) |
|
| 300 |
{
|
|
| 301 |
case VECTX: axis = VectX; break; |
|
| 302 |
case VECTY: axis = VectY; break; |
|
| 303 |
case VECTZ: axis = VectZ; break; |
|
| 304 |
} |
|
| 305 |
|
|
| 306 |
mRotAxis = vector; |
|
| 295 |
mRotAxis = axis; |
|
| 307 | 296 |
mRotRow = row; |
| 308 | 297 |
|
| 309 | 298 |
mRotationAngleStatic.set0(0.0f); |
| 310 | 299 |
|
| 311 | 300 |
for(int i=0; i<NUM_CUBITS; i++) |
| 312 |
if( belongsToRotation( mCubits[i].mCurrentPosition,vector,mRotRow) )
|
|
| 301 |
if( belongsToRotation( mCubits[i].mCurrentPosition,axis,mRotRow) )
|
|
| 313 | 302 |
{
|
| 314 | 303 |
mCubits[i].beginNewRotation(axis); |
| 315 | 304 |
} |
| ... | ... | |
| 317 | 306 |
|
| 318 | 307 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 319 | 308 |
|
| 320 |
public long addNewRotation(int vector, int row, int angle, long durationMillis, EffectListener listener )
|
|
| 309 |
public long addNewRotation( Static3D axis, int row, int angle, long durationMillis, EffectListener listener )
|
|
| 321 | 310 |
{
|
| 322 |
Static3D axis = VectX; |
|
| 323 | 311 |
long effectID=0; |
| 324 | 312 |
boolean first = true; |
| 325 | 313 |
|
| 326 |
switch(vector) |
|
| 327 |
{
|
|
| 328 |
case VECTX: axis = VectX; break; |
|
| 329 |
case VECTY: axis = VectY; break; |
|
| 330 |
case VECTZ: axis = VectZ; break; |
|
| 331 |
} |
|
| 332 |
|
|
| 333 |
mRotAxis = vector; |
|
| 314 |
mRotAxis = axis; |
|
| 334 | 315 |
mRotRow = row; |
| 335 | 316 |
|
| 336 | 317 |
mRotationAngleStatic.set0(0.0f); |
| 337 | 318 |
|
| 338 | 319 |
for(int i=0; i<NUM_CUBITS; i++) |
| 339 |
if( belongsToRotation(mCubits[i].mCurrentPosition,vector,mRotRow) )
|
|
| 320 |
if( belongsToRotation(mCubits[i].mCurrentPosition,axis,mRotRow) )
|
|
| 340 | 321 |
{
|
| 341 | 322 |
mCubits[i].addNewRotation(axis,durationMillis,angle); |
| 342 | 323 |
|
| ... | ... | |
| 354 | 335 |
|
| 355 | 336 |
public void removeRotationNow() |
| 356 | 337 |
{
|
| 357 |
float qx=0,qy=0,qz=0; |
|
| 358 | 338 |
boolean first = true; |
| 359 | 339 |
Static4D quat = null; |
| 360 | 340 |
|
| 361 |
switch(mRotAxis) |
|
| 362 |
{
|
|
| 363 |
case VECTX: qx=1; break; |
|
| 364 |
case VECTY: qy=1; break; |
|
| 365 |
case VECTZ: qz=1; break; |
|
| 366 |
} |
|
| 367 |
|
|
| 368 | 341 |
for(int i=0; i<NUM_CUBITS; i++) |
| 369 | 342 |
if( belongsToRotation(mCubits[i].mCurrentPosition,mRotAxis,mRotRow) ) |
| 370 | 343 |
{
|
| 371 | 344 |
if( first ) |
| 372 | 345 |
{
|
| 373 | 346 |
first = false; |
| 374 |
quat = mCubits[i].returnRotationQuat(qx,qy,qz);
|
|
| 347 |
quat = mCubits[i].returnRotationQuat(mRotAxis);
|
|
| 375 | 348 |
} |
| 376 | 349 |
|
| 377 | 350 |
mCubits[i].removeRotationNow(quat); |
| ... | ... | |
| 385 | 358 |
abstract int getNumCubits(int size); |
| 386 | 359 |
abstract int[][] getCubitPositions(int size); |
| 387 | 360 |
abstract float[] getLegalQuats(); |
| 388 |
abstract boolean belongsToRotation(Static3D position, int axis, int row);
|
|
| 361 |
abstract boolean belongsToRotation(Static3D position, Static3D axis, int row);
|
|
| 389 | 362 |
abstract MeshCubes createMesh(int vertices,int x, int y, int z); |
| 390 | 363 |
|
| 391 | 364 |
public abstract void createTexture(); |
| src/main/java/org/distorted/object/RubikObjectList.java | ||
|---|---|---|
| 22 | 22 |
import org.distorted.library.main.DistortedEffects; |
| 23 | 23 |
import org.distorted.library.main.DistortedTexture; |
| 24 | 24 |
import org.distorted.library.mesh.MeshRectangles; |
| 25 |
import org.distorted.library.type.Static3D; |
|
| 26 | 25 |
import org.distorted.library.type.Static4D; |
| 27 | 26 |
import org.distorted.magic.R; |
| 28 | 27 |
|
| ... | ... | |
| 38 | 37 |
CUBE5 ( 5, R.drawable.button5 , RubikCube.class, RubikCubeMovement.class), |
| 39 | 38 |
; |
| 40 | 39 |
|
| 41 |
public static final int VECTX = 0; // |
|
| 42 |
public static final int VECTY = 1; // don't change this |
|
| 43 |
public static final int VECTZ = 2; // |
|
| 44 |
static final Static3D VectX = new Static3D(1,0,0); |
|
| 45 |
static final Static3D VectY = new Static3D(0,1,0); |
|
| 46 |
static final Static3D VectZ = new Static3D(0,0,1); |
|
| 47 |
|
|
| 48 | 40 |
public static final int LENGTH = values().length; |
| 49 | 41 |
private final int mObjectSize, mIconID; |
| 50 | 42 |
final Class<? extends RubikObject> mObjectClass; |
| src/main/java/org/distorted/object/RubikObjectMovement.java | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
package org.distorted.object; |
| 21 | 21 |
|
| 22 |
import org.distorted.library.type.Static2D; |
|
| 23 | 22 |
import org.distorted.library.type.Static4D; |
| 24 | 23 |
|
| 25 | 24 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 27 | 26 |
public abstract class RubikObjectMovement |
| 28 | 27 |
{
|
| 29 | 28 |
public abstract boolean faceTouched(Static4D rotatedTouchPoint, Static4D rotatedCamera); |
| 30 |
public abstract Static2D newRotation(Static4D rotatedTouchPoint);
|
|
| 29 |
public abstract Static4D newRotation(Static4D rotatedTouchPoint);
|
|
| 31 | 30 |
public abstract float continueRotation(Static4D rotatedTouchPoint); |
| 32 | 31 |
} |
Also available in: Unified diff
More work on making new types of RubikObjects easily creatable.