Project

General

Profile

« Previous | Next » 

Revision 8be29dfc

Added by Leszek Koltunski about 5 years ago

Improve the Rubik App - beginnings of rotation.

View differences:

src/main/java/org/distorted/examples/rubik/RubikSurfaceView.java
51 51

  
52 52
    private boolean mDragging, mRotating;
53 53
    private int mX, mY;
54
    private int mTouchedRow, mTouchedCol, mTouchedSli;
55 54
    private Static4D mQuatCurrent, mQuatAccumulated;
56 55
    private int mRotationVect;
57 56
    private RubikRenderer mRenderer;
......
106 105

  
107 106
                                       if( mLastTouchedFace != NONE )
108 107
                                         {
109
                                         mRenderer.abortLastEffect();
110
                                         mRenderer.applyNewEffect(mTouchedCol, mTouchedRow, mTouchedSli);
111 108
                                         mRotating = true;
112 109
                                         }
113 110
                                       else
......
127 124
                                         if( (mX-x)*(mX-x)+(mY-y)*(mY-y)>minimumToRotate )
128 125
                                           {
129 126
                                           addNewRotation(x,y);
127
                                           mX = x;
128
                                           mY = y;
130 129
                                           mRotating = false;
131 130
                                           }
132 131
                                         }
......
207 206
      {
208 207
      fillTouchPoint(x,y);
209 208

  
210
      float angle=0.0f;
209
      int sign=1;
211 210
      float cubeHalfSize= mRenderer.returnCubeSize()*0.5f;
212 211
      float A=retA(mLastTouchedFace,cubeHalfSize);
213 212

  
......
219 218
        {
220 219
        case VECTX: switch(mLastTouchedFace)
221 220
                      {
222
                      case FRONT : angle = returnAngle(-diffZ, diffY); break;
223
                      case BACK  : angle = returnAngle( diffZ,-diffY); break;
224
                      case TOP   : angle = returnAngle(-diffY,-diffZ); break;
225
                      case BOTTOM: angle = returnAngle( diffY, diffZ); break;
221
                      case FRONT : sign = returnSign(-diffY); break;
222
                      case BACK  : sign = returnSign( diffY); break;
223
                      case TOP   : sign = returnSign( diffZ); break;
224
                      case BOTTOM: sign = returnSign(-diffZ); break;
226 225
                      }
227 226
                    break;
228 227
        case VECTY: switch(mLastTouchedFace)
229 228
                      {
230
                      case FRONT : angle = returnAngle(-diffZ, diffX); break;
231
                      case BACK  : angle = returnAngle( diffZ,-diffX); break;
232
                      case LEFT  : angle = returnAngle( diffX, diffZ); break;
233
                      case RIGHT : angle = returnAngle(-diffX,-diffZ); break;
229
                      case FRONT : sign = returnSign( diffX); break;
230
                      case BACK  : sign = returnSign(-diffX); break;
231
                      case LEFT  : sign = returnSign( diffZ); break;
232
                      case RIGHT : sign = returnSign(-diffZ); break;
234 233
                      }
235 234
                    break;
236 235
        case VECTZ: switch(mLastTouchedFace)
237 236
                      {
238
                      case TOP   : angle = returnAngle( diffY, diffX); break;
239
                      case BOTTOM: angle = returnAngle(-diffY,-diffX); break;
240
                      case LEFT  : angle = returnAngle(-diffX, diffY); break;
241
                      case RIGHT : angle = returnAngle( diffX,-diffY); break;
237
                      case TOP   : sign = returnSign(-diffX); break;
238
                      case BOTTOM: sign = returnSign( diffX); break;
239
                      case LEFT  : sign = returnSign(-diffY); break;
240
                      case RIGHT : sign = returnSign( diffY); break;
242 241
                      }
243 242
                    break;
244 243
        default   : android.util.Log.e("View", "impossible vector: "+mRotationVect);
245 244
        }
246 245

  
247
      mRenderer.continueRotation(angle);
246
      float dX = mX-x;
247
      float dY = mY-y;
248
      float calibration = (float)Math.sqrt(dX*dX+dY*dY);
249

  
250
      mRenderer.continueRotation(calibration*sign);
248 251
      }
249 252

  
250 253
///////////////////////////////////////////////////////////////////////////////////////////////////
......
258 261

  
259 262
///////////////////////////////////////////////////////////////////////////////////////////////////
260 263

  
261
    private float returnAngle(float diff1, float diff2)
264
    private int returnSign(float diff)
262 265
      {
263
      float len = (float)Math.sqrt(diff1*diff1 + diff2*diff2);
264
      len /= mRenderer.mScreenMin;
265

  
266
      return diff2>0 ? len : -len;
266
      return diff>0 ? 1 : -1;
267 267
      }
268 268

  
269 269
///////////////////////////////////////////////////////////////////////////////////////////////////
......
277 277
///////////////////////////////////////////////////////////////////////////////////////////////////
278 278
// return quat1*quat2
279 279

  
280
    private Static4D quatMultiply( Static4D quat1, Static4D quat2 )
280
    static Static4D quatMultiply( Static4D quat1, Static4D quat2 )
281 281
      {
282 282
      float qx = quat1.get1();
283 283
      float qy = quat1.get2();
......
403 403
          float qY= (mStartY+cubeHalfSize) / (2*cubeHalfSize);
404 404
          float qZ= (mStartZ+cubeHalfSize) / (2*cubeHalfSize);
405 405

  
406
          if( qX==1.0f ) qX-= 0.5f/RubikRenderer.NUM_CUBES;
407
          if( qY==1.0f ) qY-= 0.5f/RubikRenderer.NUM_CUBES;
408
          if( qZ==1.0f ) qZ-= 0.5f/RubikRenderer.NUM_CUBES;
409

  
410
          if( qX<1 && qX>=0 && qY<1 && qY>=0 && qZ<1 && qZ>=0 )
411
            {
412
            mTouchedCol = (int)(qX*RubikRenderer.NUM_CUBES);
413
            mTouchedRow = (int)(qY*RubikRenderer.NUM_CUBES);
414
            mTouchedSli = (int)(qZ*RubikRenderer.NUM_CUBES);
415
            return face;
416
            }
406
          if( qX<=1 && qX>=0 && qY<=1 && qY>=0 && qZ<=1 && qZ>=0 ) return face;
417 407
          }
418 408
        }
419 409

  
420
      mTouchedRow = -1;
421
      mTouchedCol = -1;
422
      mTouchedSli = -1;
423

  
424 410
      return NONE;
425 411
      }
426 412

  

Also available in: Unified diff