Revision d4374cd3
Added by Leszek Koltunski over 6 years ago
| src/main/java/org/distorted/examples/rubik/RubikCube.java | ||
|---|---|---|
| 42 | 42 |
|
| 43 | 43 |
class RubikCube |
| 44 | 44 |
{
|
| 45 |
private static final int POST_ROTATION_MILLISEC = 500; |
|
| 45 | 46 |
private static final int TEXTURE_SIZE = 100; |
| 46 | 47 |
|
| 47 | 48 |
private static final Static3D VectX = new Static3D(1,0,0); |
| ... | ... | |
| 54 | 55 |
private Static3D[][][] mRotationAxis; |
| 55 | 56 |
private Dynamic1D[][][] mRotationAngle; |
| 56 | 57 |
private Static3D[][][] mCurrentPosition; |
| 57 |
private Static1D mRotationAngleStatic, mRotationAngleNearest;
|
|
| 58 |
private Static1D mRotationAngleStatic, mRotationAngleMiddle, mRotationAngleFinal;
|
|
| 58 | 59 |
private DistortedTexture mTexture; |
| 59 | 60 |
private DistortedEffects mEffectsListeningForNow; |
| 60 | 61 |
|
| ... | ... | |
| 67 | 68 |
{
|
| 68 | 69 |
mSize = size; |
| 69 | 70 |
|
| 70 |
mRotationAngleStatic = new Static1D(0); |
|
| 71 |
mRotationAngleNearest = new Static1D(0); |
|
| 71 |
mRotationAngleStatic = new Static1D(0); |
|
| 72 |
mRotationAngleMiddle = new Static1D(0); |
|
| 73 |
mRotationAngleFinal = new Static1D(0); |
|
| 72 | 74 |
|
| 73 | 75 |
mRotAxis= RubikSurfaceView.VECTX; |
| 74 | 76 |
mTexture = new DistortedTexture(TEXTURE_SIZE,TEXTURE_SIZE); |
| ... | ... | |
| 218 | 220 |
void finishRotationCalledOnNextRender(EffectListener listener) |
| 219 | 221 |
{
|
| 220 | 222 |
boolean first = true; |
| 221 |
int nearestAngleInDegrees = computeNearestAngle(mRotationAngleStatic.get1()); |
|
| 222 |
|
|
| 223 |
|
|
| 224 |
android.util.Log.e("cube", "finish: angle="+((int)mRotationAngleStatic.get1())+" ret: "+nearestAngleInDegrees);
|
|
| 223 |
float startingAngle = mRotationAngleStatic.get1(); |
|
| 224 |
int nearestAngleInDegrees = computeNearestAngle(startingAngle); |
|
| 225 | 225 |
|
| 226 |
|
|
| 227 |
mRotationAngleNearest.set1(nearestAngleInDegrees);
|
|
| 226 |
mRotationAngleFinal.set1(nearestAngleInDegrees); |
|
| 227 |
mRotationAngleMiddle.set1( nearestAngleInDegrees + (nearestAngleInDegrees-startingAngle)*0.2f );
|
|
| 228 | 228 |
|
| 229 | 229 |
for(int x=0; x<mSize; x++) |
| 230 | 230 |
for(int y=0; y<mSize; y++) |
| ... | ... | |
| 233 | 233 |
{
|
| 234 | 234 |
if( belongsToRotation(x,y,z,mRotAxis,mRotRow) ) |
| 235 | 235 |
{
|
| 236 |
mRotationAngle[x][y][z].makeRunNowFor(2000); |
|
| 237 |
mRotationAngle[x][y][z].add(mRotationAngleNearest); |
|
| 236 |
mRotationAngle[x][y][z].makeRunNowFor(POST_ROTATION_MILLISEC); |
|
| 237 |
mRotationAngle[x][y][z].add(mRotationAngleMiddle); |
|
| 238 |
mRotationAngle[x][y][z].add(mRotationAngleFinal); |
|
| 238 | 239 |
|
| 239 | 240 |
if( first ) |
| 240 | 241 |
{
|
| ... | ... | |
| 257 | 258 |
float sinA =-(float)Math.sin(nearestAngleInRadians*0.5); |
| 258 | 259 |
float cosA = (float)Math.cos(nearestAngleInRadians*0.5); |
| 259 | 260 |
|
| 260 |
android.util.Log.e("cube", "remove: angle="+((int)mRotationAngleStatic.get1())+" ret: "+nearestAngleInDegrees);
|
|
| 261 |
|
|
| 262 | 261 |
mRotationAngleStatic.set1(0); |
| 263 |
mRotationAngleNearest.set1(0); |
|
| 264 | 262 |
|
| 265 | 263 |
float qx=0,qy=0,qz=0; |
| 266 | 264 |
|
| src/main/java/org/distorted/examples/rubik/RubikRenderer.java | ||
|---|---|---|
| 47 | 47 |
private Static4D mTempCurrent, mTempAccumulated; |
| 48 | 48 |
private float mCubeSizeInScreenSpace; |
| 49 | 49 |
private boolean mFinishRotation, mRemoveRotation, mFinishDragCurrent, mFinishDragAccumulated; |
| 50 |
private boolean mCanRotate; |
|
| 50 | 51 |
private RubikCube mCube; |
| 51 | 52 |
|
| 52 | 53 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 70 | 71 |
mFinishDragCurrent = false; |
| 71 | 72 |
mFinishDragAccumulated = false; |
| 72 | 73 |
|
| 74 |
mCanRotate = true; |
|
| 75 |
|
|
| 73 | 76 |
mCube = new RubikCube(NUM_CUBES, mMove, mScale, mQuatCurrent, mQuatAccumulated); |
| 74 | 77 |
} |
| 75 | 78 |
|
| ... | ... | |
| 95 | 98 |
|
| 96 | 99 |
if( mFinishRotation ) |
| 97 | 100 |
{
|
| 101 |
mCanRotate = false; |
|
| 98 | 102 |
mFinishRotation=false; |
| 99 | 103 |
mCube.finishRotationCalledOnNextRender(this); |
| 100 | 104 |
} |
| ... | ... | |
| 103 | 107 |
{
|
| 104 | 108 |
mRemoveRotation=false; |
| 105 | 109 |
mCube.removeRotationCalledOnNextRender(this); |
| 110 |
mCanRotate = true; |
|
| 106 | 111 |
} |
| 107 | 112 |
} |
| 108 | 113 |
|
| ... | ... | |
| 181 | 186 |
return mCubeSizeInScreenSpace; |
| 182 | 187 |
} |
| 183 | 188 |
|
| 189 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 190 |
|
|
| 191 |
boolean canRotate() |
|
| 192 |
{
|
|
| 193 |
return mCanRotate; |
|
| 194 |
} |
|
| 195 |
|
|
| 184 | 196 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 185 | 197 |
|
| 186 | 198 |
RubikCube getCube() |
| src/main/java/org/distorted/examples/rubik/RubikSurfaceView.java | ||
|---|---|---|
| 45 | 45 |
|
| 46 | 46 |
private static final int[] VECT = {VECTX,VECTY,VECTZ};
|
| 47 | 47 |
|
| 48 |
private boolean mDragging, mBeginRot;
|
|
| 48 |
private boolean mDragging, mBeginningRotation, mContinuingRotation;
|
|
| 49 | 49 |
private int mX, mY; |
| 50 | 50 |
private Static4D mQuatCurrent, mQuatAccumulated; |
| 51 | 51 |
private int mRotationVect; |
| ... | ... | |
| 107 | 107 |
mY = y; |
| 108 | 108 |
mLastTouchedFace = faceTouched(x,y); |
| 109 | 109 |
|
| 110 |
if( mLastTouchedFace != NONE ) { mBeginRot = true; mDragging = false; }
|
|
| 111 |
else { mDragging = true; mBeginRot = false; }
|
|
| 110 |
if( mLastTouchedFace != NONE ) |
|
| 111 |
{
|
|
| 112 |
mDragging = false; |
|
| 113 |
mBeginningRotation = mRenderer.canRotate(); |
|
| 114 |
mContinuingRotation = false; |
|
| 115 |
} |
|
| 116 |
else |
|
| 117 |
{
|
|
| 118 |
mDragging = true; |
|
| 119 |
mBeginningRotation = false; |
|
| 120 |
mContinuingRotation = false; |
|
| 121 |
} |
|
| 112 | 122 |
break; |
| 113 | 123 |
case MotionEvent.ACTION_MOVE: if( mDragging ) |
| 114 | 124 |
{
|
| 115 | 125 |
mQuatCurrent.set(quatFromDrag(mX-x,mY-y)); |
| 116 | 126 |
mRenderer.setQuatCurrent(mQuatCurrent); |
| 117 | 127 |
} |
| 118 |
else if( mBeginRot )
|
|
| 128 |
if( mBeginningRotation )
|
|
| 119 | 129 |
{
|
| 120 | 130 |
int minimumDistToStartRotating = (mScreenMin*mScreenMin)/100; |
| 121 | 131 |
|
| 122 | 132 |
if( (mX-x)*(mX-x)+(mY-y)*(mY-y) > minimumDistToStartRotating ) |
| 123 | 133 |
{
|
| 124 | 134 |
addNewRotation(x,y); |
| 125 |
mBeginRot = false; |
|
| 135 |
mBeginningRotation = false; |
|
| 136 |
mContinuingRotation= true; |
|
| 126 | 137 |
} |
| 127 | 138 |
} |
| 128 |
else |
|
| 139 |
else if( mContinuingRotation )
|
|
| 129 | 140 |
{
|
| 130 | 141 |
continueRotation(x,y); |
| 131 | 142 |
} |
| 132 | 143 |
break; |
| 133 |
case MotionEvent.ACTION_UP : if( !mDragging ) finishRotation(); |
|
| 134 |
mQuatAccumulated.set(quatMultiply(mQuatCurrent, mQuatAccumulated)); |
|
| 135 |
mQuatCurrent.set(0f, 0f, 0f, 1f); |
|
| 136 |
mRenderer.setQuatCurrent(mQuatCurrent); |
|
| 137 |
mRenderer.setQuatAccumulated(mQuatAccumulated); |
|
| 144 |
case MotionEvent.ACTION_UP : if( mDragging ) |
|
| 145 |
{
|
|
| 146 |
mQuatAccumulated.set(quatMultiply(mQuatCurrent, mQuatAccumulated)); |
|
| 147 |
mQuatCurrent.set(0f, 0f, 0f, 1f); |
|
| 148 |
mRenderer.setQuatCurrent(mQuatCurrent); |
|
| 149 |
mRenderer.setQuatAccumulated(mQuatAccumulated); |
|
| 150 |
} |
|
| 151 |
|
|
| 152 |
if( mContinuingRotation ) |
|
| 153 |
{
|
|
| 154 |
finishRotation(); |
|
| 155 |
} |
|
| 156 |
|
|
| 138 | 157 |
break; |
| 139 | 158 |
} |
| 140 | 159 |
|
Also available in: Unified diff
RubikCube: make the post-rotation effect 'nice'.