summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2020-06-28 23:32:36 +0200
committerJosJuice <josjuice@gmail.com>2020-06-29 01:20:02 +0200
commitdb75509ec5d2cd15036a5cda629f952c2b860d6e (patch)
tree43b6be00a008f361e1eedf2aa70cc291ff6fbbd0 /Source/Android/app/src/main/java
parent961f93701065f099ba68fb610f699f89b804a2b4 (diff)
Android: Enfore correct stick gate in overlay
Currently, the touch controller overlay uses a square gate for sticks. This commit changes that so that it instead uses the stick gate configured in the INI, which ensures that the values sent to the core are appropriately scaled regardless of what is configured in the INI and makes the overlay look nicer if the INI is set to a stick gate that matches the graphics.
Diffstat (limited to 'Source/Android/app/src/main/java')
-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());
}