| 24 | 24 | import android.content.pm.ConfigurationInfo;
 | 
  | 25 | 25 | import android.opengl.GLSurfaceView;
 | 
  | 26 | 26 | import android.util.AttributeSet;
 | 
  |  | 27 | import android.util.DisplayMetrics;
 | 
  | 27 | 28 | import android.view.MotionEvent;
 | 
  | 28 | 29 | 
 | 
  | 29 | 30 | import org.distorted.library.type.Static2D;
 | 
  | ... | ... |  | 
  | 49 | 50 |     // Moving the finger from the middle of the vertical screen to the right edge will rotate a
 | 
  | 50 | 51 |     // given face by SWIPING_SENSITIVITY/2 degrees.
 | 
  | 51 | 52 |     private final static int SWIPING_SENSITIVITY  = 240;
 | 
  | 52 |  |     // Moving the finger by 1/15 the distance of min(scrWidth,scrHeight) will start a Rotation.
 | 
  | 53 |  |     private final static int ROTATION_SENSITIVITY =  15;
 | 
  | 54 |  |     // Every 1/12 the distance of min(scrWidth,scrHeight) the direction of cube rotation will reset.
 | 
  | 55 |  |     private final static int DIRECTION_SENSITIVITY=  12;
 | 
  |  | 53 |     // Moving the finger by 0.33 of an inch will start a Rotation.
 | 
  |  | 54 |     private final static float ROTATION_SENSITIVITY =  0.33f;
 | 
  |  | 55 |     // Every 0.33 of an inch the direction of cube drag will reset.
 | 
  |  | 56 |     private final static float DIRECTION_SENSITIVITY=  0.33f;
 | 
  | 56 | 57 | 
 | 
  | 57 | 58 |     // Where did we get this sqrt(3)/2 ? From the (default, i.e. 60 degrees - see InternalOutputSurface!)
 | 
  | 58 | 59 |     // FOV of the projection matrix of the Node onto the Screen.
 | 
  | ... | ... |  | 
  | 81 | 82 |     private float[] mLastAngles;
 | 
  | 82 | 83 |     private long[] mLastTimestamps;
 | 
  | 83 | 84 |     private int mFirstIndex, mLastIndex;
 | 
  |  | 85 |     private int mDensity;
 | 
  | 84 | 86 | 
 | 
  | 85 | 87 |     private static Static4D mQuatCurrent    = new Static4D(0,0,0,1);
 | 
  | 86 | 88 |     private static Static4D mQuatAccumulated= new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);
 | 
  | ... | ... |  | 
  | 312 | 314 | 
 | 
  | 313 | 315 | ///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
  | 314 | 316 | 
 | 
  | 315 |  |     private boolean canBeginRotate(float x, float y)
 | 
  |  | 317 |     private float retFingerDragDistanceInInches(float xFrom, float yFrom, float xTo, float yTo)
 | 
  | 316 | 318 |       {
 | 
  | 317 |  |       return (mX-x)*(mX-x) + (mY-y)*(mY-y) > 1.0f/(ROTATION_SENSITIVITY*ROTATION_SENSITIVITY);
 | 
  | 318 |  |       }
 | 
  | 319 |  | 
 | 
  | 320 |  | ///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
  |  | 319 |       float xDist = mScreenWidth*(xFrom-xTo);
 | 
  |  | 320 |       float yDist = mScreenHeight*(yFrom-yTo);
 | 
  |  | 321 |       float distInPixels = (float)Math.sqrt(xDist*xDist + yDist*yDist);
 | 
  | 321 | 322 | 
 | 
  | 322 |  |     private boolean shouldChangeDirection(float x, float y)
 | 
  | 323 |  |       {
 | 
  | 324 |  |       return (mX-x)*(mX-x) + (mY-y)*(mY-y) > 1.0f/(DIRECTION_SENSITIVITY*DIRECTION_SENSITIVITY);
 | 
  |  | 323 |       return distInPixels/mDensity;
 | 
  | 325 | 324 |       }
 | 
  | 326 | 325 | 
 | 
  | 327 | 326 | ///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
  | ... | ... |  | 
  | 392 | 391 |       {
 | 
  | 393 | 392 |       if( mBeginningRotation )
 | 
  | 394 | 393 |         {
 | 
  | 395 |  |         if( canBeginRotate(x,y) )
 | 
  |  | 394 |         if( retFingerDragDistanceInInches(mX,mY,x,y) > ROTATION_SENSITIVITY )
 | 
  | 396 | 395 |           {
 | 
  | 397 | 396 |           mStartRotX = x;
 | 
  | 398 | 397 |           mStartRotY = y;
 | 
  | ... | ... |  | 
  | 447 | 446 |         mTempCurrent.set(quatFromDrag(mX-x,y-mY));
 | 
  | 448 | 447 |         mPreRender.setQuatCurrentOnNextRender();
 | 
  | 449 | 448 | 
 | 
  | 450 |  |         if( shouldChangeDirection(x,y) )
 | 
  |  | 449 |         if( retFingerDragDistanceInInches(mX,mY,x,y) > DIRECTION_SENSITIVITY )
 | 
  | 451 | 450 |           {
 | 
  | 452 | 451 |           mX = x;
 | 
  | 453 | 452 |           mY = y;
 | 
  | ... | ... |  | 
  | 515 | 514 |         mRenderer  = new RubikRenderer(this);
 | 
  | 516 | 515 |         mPreRender = new RubikPreRender(this);
 | 
  | 517 | 516 | 
 | 
  | 518 |  |         final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
 | 
  | 519 |  |         final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
 | 
  | 520 |  |         setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
 | 
  | 521 |  |         setRenderer(mRenderer);
 | 
  |  | 517 |         RubikActivity act = (RubikActivity)context;
 | 
  |  | 518 |         DisplayMetrics dm = new DisplayMetrics();
 | 
  |  | 519 |         act.getWindowManager().getDefaultDisplay().getMetrics(dm);
 | 
  |  | 520 | 
 | 
  |  | 521 |         mDensity = dm.densityDpi;
 | 
  |  | 522 | 
 | 
  |  | 523 |         final ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
 | 
  |  | 524 | 
 | 
  |  | 525 |         if( activityManager!=null )
 | 
  |  | 526 |           {
 | 
  |  | 527 |           final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
 | 
  |  | 528 |           setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 );
 | 
  |  | 529 |           setRenderer(mRenderer);
 | 
  |  | 530 |           }
 | 
  | 522 | 531 |         }
 | 
  | 523 | 532 |       }
 | 
  | 524 | 533 | 
 | 
 
Make the rotations and drag be independent of physical screen dimensions - take into account pixel density.