Revision c896c0b3
Added by Leszek Koltunski over 5 years ago
| src/main/java/org/distorted/magic/RubikSurfaceView.java | ||
|---|---|---|
| 54 | 54 |
private int mButton = RubikSize.SIZE3.ordinal(); |
| 55 | 55 |
|
| 56 | 56 |
private boolean mDragging, mBeginningRotation, mContinuingRotation; |
| 57 |
private int mX, mY;
|
|
| 57 |
private float mX, mY;
|
|
| 58 | 58 |
private int mLastTouchedFace; |
| 59 | 59 |
private float mCameraDistance; |
| 60 | 60 |
private int mScreenWidth, mScreenHeight, mScreenMin; |
| ... | ... | |
| 352 | 352 |
public boolean onTouchEvent(MotionEvent event) |
| 353 | 353 |
{
|
| 354 | 354 |
int action = event.getAction(); |
| 355 |
int x = (int)event.getX();
|
|
| 356 |
int y = (int)event.getY();
|
|
| 355 |
float x = event.getX() - mScreenWidth*0.5f;
|
|
| 356 |
float y = mScreenHeight*0.5f -event.getY();
|
|
| 357 | 357 |
|
| 358 | 358 |
switch(action) |
| 359 | 359 |
{
|
| 360 | 360 |
case MotionEvent.ACTION_DOWN: mX = x; |
| 361 | 361 |
mY = y; |
| 362 |
mLastTouchedFace = mMovement.faceTouched(mQuatAccumulated,mCameraDistance, x,y, mScreenWidth, mScreenHeight);
|
|
| 362 |
mLastTouchedFace = mMovement.faceTouched(mQuatAccumulated,mCameraDistance, x, y);
|
|
| 363 | 363 |
|
| 364 | 364 |
if( mLastTouchedFace != RubikCubeMovement.NONE ) |
| 365 | 365 |
{
|
| ... | ... | |
| 376 | 376 |
break; |
| 377 | 377 |
case MotionEvent.ACTION_MOVE: if( mDragging ) |
| 378 | 378 |
{
|
| 379 |
mTempCurrent.set(quatFromDrag(mX-x,mY-y));
|
|
| 379 |
mTempCurrent.set(quatFromDrag(mX-x,y-mY));
|
|
| 380 | 380 |
mRenderer.setQuatCurrentOnNextRender(); |
| 381 | 381 |
|
| 382 | 382 |
int minimumDist = (mScreenMin*mScreenMin)/(DIRECTION_SENSITIVITY*DIRECTION_SENSITIVITY); |
| ... | ... | |
| 397 | 397 |
|
| 398 | 398 |
if( (mX-x)*(mX-x)+(mY-y)*(mY-y) > minimumDistToStartRotating ) |
| 399 | 399 |
{
|
| 400 |
mMovement.addNewRotation(mQuatAccumulated,mLastTouchedFace, x,y, mScreenWidth, mScreenHeight);
|
|
| 400 |
mMovement.addNewRotation(mQuatAccumulated,mLastTouchedFace, x, y);
|
|
| 401 | 401 |
mBeginningRotation = false; |
| 402 | 402 |
mContinuingRotation= true; |
| 403 | 403 |
} |
| 404 | 404 |
} |
| 405 | 405 |
else if( mContinuingRotation ) |
| 406 | 406 |
{
|
| 407 |
mMovement.continueRotation(mQuatAccumulated,mLastTouchedFace, x,y, mScreenWidth, mScreenHeight);
|
|
| 407 |
mMovement.continueRotation(mQuatAccumulated,mLastTouchedFace, x, y, mScreenMin);
|
|
| 408 | 408 |
} |
| 409 | 409 |
break; |
| 410 | 410 |
case MotionEvent.ACTION_UP : if( mDragging ) |
| src/main/java/org/distorted/object/RubikCubeMovement.java | ||
|---|---|---|
| 63 | 63 |
|
| 64 | 64 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 65 | 65 |
|
| 66 |
private void convertTouchPointToScreenSpace(Static4D accumulated, int x, int y, int scrW, int scrH)
|
|
| 66 |
private void convertTouchPointToScreenSpace(Static4D accumulated, float x, float y)
|
|
| 67 | 67 |
{
|
| 68 |
float halfScrWidth = scrW*0.5f; |
|
| 69 |
float halfScrHeight = scrH*0.5f; |
|
| 70 |
Static4D touchPoint = new Static4D(x-halfScrWidth, halfScrHeight-y, 0, 0); |
|
| 68 |
Static4D touchPoint = new Static4D(x, y, 0, 0); |
|
| 71 | 69 |
Static4D rotatedTouchPoint= RubikSurfaceView.rotateVectorByInvertedQuat(touchPoint, accumulated); |
| 72 | 70 |
|
| 73 | 71 |
mPoint[0] = rotatedTouchPoint.get1(); |
| ... | ... | |
| 192 | 190 |
|
| 193 | 191 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 194 | 192 |
|
| 195 |
public int faceTouched(Static4D accumulated, float cameraDistance, int x, int y, int scrW, int scrH)
|
|
| 193 |
public int faceTouched(Static4D accumulated, float cameraDistance, float x, float y)
|
|
| 196 | 194 |
{
|
| 197 | 195 |
float cubeHalfSize= mCube.returnCubeSizeInScreenSpace()*0.5f; |
| 198 | 196 |
|
| 199 |
convertTouchPointToScreenSpace(accumulated,x,y, scrW, scrH);
|
|
| 197 |
convertTouchPointToScreenSpace(accumulated,x,y); |
|
| 200 | 198 |
convertCameraPointToScreenSpace(accumulated, cameraDistance); |
| 201 | 199 |
|
| 202 | 200 |
for(int face=FRONT; face<=BOTTOM; face++) |
| ... | ... | |
| 218 | 216 |
|
| 219 | 217 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 220 | 218 |
|
| 221 |
public void addNewRotation(Static4D accumulated, int lastTouchedFace, int x, int y, int scrW, int scrH)
|
|
| 219 |
public void addNewRotation(Static4D accumulated, int lastTouchedFace, float x, float y)
|
|
| 222 | 220 |
{
|
| 223 | 221 |
float cubeHalfSize= mCube.returnCubeSizeInScreenSpace()*0.5f; |
| 224 | 222 |
|
| 225 |
convertTouchPointToScreenSpace(accumulated, x,y, scrW, scrH);
|
|
| 223 |
convertTouchPointToScreenSpace(accumulated,x,y);
|
|
| 226 | 224 |
castTouchPointOntoFace(lastTouchedFace,cubeHalfSize,mDiff); |
| 227 | 225 |
|
| 228 | 226 |
mDiff[0] -= mTouchPointCastOntoFace[0]; |
| ... | ... | |
| 243 | 241 |
|
| 244 | 242 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 245 | 243 |
|
| 246 |
public void continueRotation(Static4D accumulated, int lastTouchedFace, int x, int y, int scrW, int scrH)
|
|
| 244 |
public void continueRotation(Static4D accumulated, int lastTouchedFace, float x, float y, int scrMin)
|
|
| 247 | 245 |
{
|
| 248 |
convertTouchPointToScreenSpace(accumulated, x,y, scrW, scrH);
|
|
| 246 |
convertTouchPointToScreenSpace(accumulated,x,y);
|
|
| 249 | 247 |
|
| 250 | 248 |
mDiff[0] = mPoint[0]-mTouchPoint[0]; |
| 251 | 249 |
mDiff[1] = mPoint[1]-mTouchPoint[1]; |
| ... | ... | |
| 256 | 254 |
int sign = retFaceRotationSign(lastTouchedFace); |
| 257 | 255 |
float angle = (mRotationVect==xAxis ? mDiff[yAxis] : -mDiff[xAxis]); |
| 258 | 256 |
|
| 259 |
int scrMin = scrW<scrH ? scrW:scrH; |
|
| 260 |
|
|
| 261 | 257 |
mCube.continueRotation(SWIPING_SENSITIVITY*sign*angle/scrMin); |
| 262 | 258 |
} |
| 263 | 259 |
} |
Also available in: Unified diff
Simplifications for object movement.