summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Android/app/src/main/java/org')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java3
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java32
2 files changed, 23 insertions, 12 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java
index 3751385be8..24ec356751 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java
@@ -269,6 +269,9 @@ public final class NativeLibrary
public static native void SetMotionSensorsEnabled(boolean accelerometerEnabled,
boolean gyroscopeEnabled);
+ // Angle is in radians and should be non-negative
+ public static native double GetInputRadiusAtAngle(int emu_pad_id, int stick, double angle);
+
public static native void NewGameIniFile();
public static native void LoadGameIniFile(String gameId);
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java
index 55f6347096..a32155686e 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java
@@ -14,6 +14,8 @@ import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.view.MotionEvent;
+import org.dolphinemu.dolphinemu.NativeLibrary;
+
/**
* Custom {@link BitmapDrawable} that is capable
* of storing it's own ID.
@@ -214,21 +216,27 @@ public final class InputOverlayDrawableJoystick
private void SetInnerBounds()
{
- int X = getVirtBounds().centerX() + (int) ((axises[1]) * (getVirtBounds().width() / 2));
- int Y = getVirtBounds().centerY() + (int) ((axises[0]) * (getVirtBounds().height() / 2));
-
- if (X > getVirtBounds().centerX() + (getVirtBounds().width() / 2))
- X = getVirtBounds().centerX() + (getVirtBounds().width() / 2);
- if (X < getVirtBounds().centerX() - (getVirtBounds().width() / 2))
- X = getVirtBounds().centerX() - (getVirtBounds().width() / 2);
- if (Y > getVirtBounds().centerY() + (getVirtBounds().height() / 2))
- Y = getVirtBounds().centerY() + (getVirtBounds().height() / 2);
- if (Y < getVirtBounds().centerY() - (getVirtBounds().height() / 2))
- Y = getVirtBounds().centerY() - (getVirtBounds().height() / 2);
+ double y = axises[0];
+ double x = axises[1];
+
+ double angle = Math.atan2(y, x) + Math.PI + Math.PI;
+ double radius = Math.hypot(y, x);
+ double maxRadius = NativeLibrary.GetInputRadiusAtAngle(0, mJoystickType, angle);
+ if (radius > maxRadius)
+ {
+ y = maxRadius * Math.sin(angle);
+ x = maxRadius * Math.cos(angle);
+ axises[0] = (float) y;
+ axises[1] = (float) x;
+ }
+
+ int pixelX = getVirtBounds().centerX() + (int) (x * (getVirtBounds().width() / 2));
+ int pixelY = getVirtBounds().centerY() + (int) (y * (getVirtBounds().height() / 2));
int width = mPressedStateInnerBitmap.getBounds().width() / 2;
int height = mPressedStateInnerBitmap.getBounds().height() / 2;
- mDefaultStateInnerBitmap.setBounds(X - width, Y - height, X + width, Y + height);
+ mDefaultStateInnerBitmap.setBounds(pixelX - width, pixelY - height, pixelX + width,
+ pixelY + height);
mPressedStateInnerBitmap.setBounds(mDefaultStateInnerBitmap.getBounds());
}