Project

General

Profile

« Previous | Next » 

Revision cd83d0aa

Added by Leszek Koltunski almost 4 years ago

Make the rotations and drag be independent of physical screen dimensions - take into account pixel density.

View differences:

.gitignore
43 43

  
44 44
# yes, ignore the .iml
45 45
*.iml
46
/google-services.json
src/main/java/org/distorted/main/RubikSurfaceView.java
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

  

Also available in: Unified diff