Files
Terrarum/src/net/torvald/terrarum/controller/XinputControllerAdapter.kt
2019-07-19 23:19:25 +09:00

84 lines
2.8 KiB
Kotlin

package net.torvald.terrarum.controller
import com.github.strikerx3.jxinput.XInputAxes
import com.github.strikerx3.jxinput.XInputDevice
import net.torvald.terrarum.AppLoader
import kotlin.math.roundToInt
/**
* Note: XInput is a basically a XBOX 360 pad. XBOX One pad and any other compatible pads can be used,
* but any additional features (e.g. Impulse Trigger on XBOne) cannot be supported.
*
* Created by minjaesong on 2019-02-09.
*/
class XinputControllerAdapter(val c: XInputDevice): TerrarumController {
override fun getButton(index: Int): Boolean {
if (c.poll()) {
val button = c.components.buttons
return when (index) {
0 -> button.a
1 -> button.b
2 -> button.x
3 -> button.y
4 -> button.lShoulder
5 -> button.rShoulder
6 -> button.back
7 -> button.start
8 -> getAxis(4) >= AppLoader.gamepadDeadzone
9 -> getAxis(5) >= AppLoader.gamepadDeadzone
10 -> button.lThumb
11 -> button.rThumb
else -> throw UnsupportedOperationException("Unknown button: $index")
}
}
return false
}
override fun getAxisRaw(index: Int): Float {
if (c.poll()) {
val axes = c.components.axes
return when (index) {
0 -> axes.ly
1 -> axes.lx
2 -> axes.ry
3 -> axes.rx
4 -> axes.lt
5 -> axes.rt
else -> throw UnsupportedOperationException("Unknown axis: $index")
}
}
return -1f
}
override fun getPov(): Int {
if (c.poll()) {
val axes = c.components.axes
return when (axes.dpad) {
XInputAxes.DPAD_CENTER -> 0
XInputAxes.DPAD_UP_LEFT -> TerrarumController.POV_NW
XInputAxes.DPAD_UP -> TerrarumController.POV_N
XInputAxes.DPAD_UP_RIGHT -> TerrarumController.POV_NE
XInputAxes.DPAD_RIGHT -> TerrarumController.POV_E
XInputAxes.DPAD_DOWN_RIGHT -> TerrarumController.POV_SE
XInputAxes.DPAD_DOWN -> TerrarumController.POV_S
XInputAxes.DPAD_DOWN_LEFT -> TerrarumController.POV_SW
XInputAxes.DPAD_LEFT -> TerrarumController.POV_W
else -> 0//throw UnsupportedOperationException("Unknown pov: ${axes.dpad}")
}
}
return -1
}
override fun getName(): String {
return "(XINPUT Compatible)"
}
override fun setRumble(left: Float, right: Float) {
c.setVibration((left * 65535f).roundToInt(), (right * 65535f).roundToInt())
}
}