android: Invert rotation to match phone orientation

master
german77 2023-05-09 23:44:00 +07:00 committed by bunnei
parent 5d43594a70
commit aa957df0dc
1 changed files with 27 additions and 5 deletions

@ -13,9 +13,12 @@ import android.hardware.SensorEvent
import android.hardware.SensorEventListener import android.hardware.SensorEventListener
import android.hardware.SensorManager import android.hardware.SensorManager
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.InputDevice
import android.view.KeyEvent import android.view.KeyEvent
import android.view.MotionEvent import android.view.MotionEvent
import android.view.Surface
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
@ -49,6 +52,7 @@ open class EmulationActivity : AppCompatActivity(), SensorEventListener {
private val gyro = FloatArray(3) private val gyro = FloatArray(3)
private val accel = FloatArray(3) private val accel = FloatArray(3)
private var motionTimestamp: Long = 0 private var motionTimestamp: Long = 0
private var flipMotionOrientation: Boolean = false
private lateinit var game: Game private lateinit var game: Game
@ -173,15 +177,33 @@ open class EmulationActivity : AppCompatActivity(), SensorEventListener {
} }
override fun onSensorChanged(event: SensorEvent) { override fun onSensorChanged(event: SensorEvent) {
val rotation = this.display?.rotation
if (rotation == Surface.ROTATION_90) {
flipMotionOrientation = true
}
if (rotation == Surface.ROTATION_270) {
flipMotionOrientation = false
}
if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
accel[0] = -event.values[1] / SensorManager.GRAVITY_EARTH if (flipMotionOrientation) {
accel[1] = event.values[0] / SensorManager.GRAVITY_EARTH accel[0] = event.values[1] / SensorManager.GRAVITY_EARTH
accel[1] = -event.values[0] / SensorManager.GRAVITY_EARTH
} else {
accel[0] = -event.values[1] / SensorManager.GRAVITY_EARTH
accel[1] = event.values[0] / SensorManager.GRAVITY_EARTH
}
accel[2] = -event.values[2] / SensorManager.GRAVITY_EARTH accel[2] = -event.values[2] / SensorManager.GRAVITY_EARTH
} }
if (event.sensor.type == Sensor.TYPE_GYROSCOPE) { if (event.sensor.type == Sensor.TYPE_GYROSCOPE) {
// Investigate why sensor value is off by 6x // Investigate why sensor value is off by 6x
gyro[0] = event.values[1] / 6.0f if (flipMotionOrientation) {
gyro[1] = -event.values[0] / 6.0f gyro[0] = -event.values[1] / 6.0f
gyro[1] = event.values[0] / 6.0f
} else {
gyro[0] = event.values[1] / 6.0f
gyro[1] = -event.values[0] / 6.0f
}
gyro[2] = event.values[2] / 6.0f gyro[2] = event.values[2] / 6.0f
} }