From 89ec2f05913b377c842a620192bfd9675d675f99 Mon Sep 17 00:00:00 2001 From: SSimco <37044560+SSimco@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:53:48 +0300 Subject: [PATCH] Update sensor manager to check device orientation --- .../cemu/cemu/emulation/EmulationActivity.kt | 2 +- .../info/cemu/cemu/input/SensorManager.kt | 53 ++++++++++++++----- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/android/app/src/main/java/info/cemu/cemu/emulation/EmulationActivity.kt b/src/android/app/src/main/java/info/cemu/cemu/emulation/EmulationActivity.kt index 31ee6c8e..fa575032 100644 --- a/src/android/app/src/main/java/info/cemu/cemu/emulation/EmulationActivity.kt +++ b/src/android/app/src/main/java/info/cemu/cemu/emulation/EmulationActivity.kt @@ -121,6 +121,7 @@ class EmulationActivity : AppCompatActivity() { val inputOverlaySettingsManager = InputOverlaySettingsManager(this) overlaySettings = inputOverlaySettingsManager.overlaySettings sensorManager = SensorManager(this) + sensorManager.setDeviceRotationProvider(deviceRotationProvider = { display.rotation }) onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -128,7 +129,6 @@ class EmulationActivity : AppCompatActivity() { } }) - initializeView(getLaunchPath()) setContentView(binding.root) } diff --git a/src/android/app/src/main/java/info/cemu/cemu/input/SensorManager.kt b/src/android/app/src/main/java/info/cemu/cemu/input/SensorManager.kt index 2ac5e8ff..ac36a053 100644 --- a/src/android/app/src/main/java/info/cemu/cemu/input/SensorManager.kt +++ b/src/android/app/src/main/java/info/cemu/cemu/input/SensorManager.kt @@ -5,6 +5,7 @@ import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager +import android.view.Surface import info.cemu.cemu.nativeinterface.NativeInput.onMotion import info.cemu.cemu.nativeinterface.NativeInput.setMotionEnabled @@ -15,11 +16,12 @@ class SensorManager(context: Context) : SensorEventListener { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) private val gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) + + private var deviceRotationProvider = { Surface.ROTATION_0 } private val hasMotionData = accelerometer != null && gyroscope != null private var accelX = 0f private var accelY = 0f private var accelZ = 0f - private var isLandscape = true private var isListening = false fun startListening() { @@ -32,8 +34,8 @@ class SensorManager(context: Context) : SensorEventListener { sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME) } - fun setIsLandscape(isLandscape: Boolean) { - this.isLandscape = isLandscape + fun setDeviceRotationProvider(deviceRotationProvider: () -> Int) { + this.deviceRotationProvider = deviceRotationProvider } fun pauseListening() { @@ -46,25 +48,50 @@ class SensorManager(context: Context) : SensorEventListener { } override fun onSensorChanged(event: SensorEvent) { + val values = event.values if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { - accelX = event.values[0] - accelY = event.values[1] - accelZ = event.values[2] + val accelValues = getSensorEventValues(values) + accelX = accelValues.first + accelY = accelValues.second + accelZ = accelValues.third return } if (event.sensor.type != Sensor.TYPE_GYROSCOPE) { return } - val gyroX = event.values[0] - val gyroY = event.values[1] - val gyroZ = event.values[2] - if (isLandscape) { - onMotion(event.timestamp, gyroY, gyroZ, gyroX, accelY, accelZ, accelX) - return - } + val (gyroX, gyroY, gyroZ) = getSensorEventValues(values) onMotion(event.timestamp, gyroX, gyroY, gyroZ, accelX, accelY, accelZ) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { } + + private fun getSensorEventValues(values: FloatArray): Triple { + val x: Float + val y: Float + val z = values[2] + val deviceRotation = deviceRotationProvider() + when (deviceRotation) { + Surface.ROTATION_90 -> { + x = -values[1] + y = values[0] + } + + Surface.ROTATION_180 -> { + x = -values[0] + y = -values[1] + } + + Surface.ROTATION_270 -> { + x = values[1] + y = -values[0] + } + + else /*Surface.ROTATION_0*/ -> { + x = values[0] + y = values[1] + } + } + return Triple(x, y, z) + } }