forked from LeenkxTeam/LNXSDK
139 lines
4.3 KiB
Haxe
139 lines
4.3 KiB
Haxe
package iron.system;
|
|
|
|
#if lnx_vr
|
|
import iron.math.Vec4;
|
|
import iron.math.Quat;
|
|
|
|
class VRController {
|
|
|
|
public static var leftHandPosition: Vec4 = new Vec4();
|
|
public static var leftHandRotation: Quat = new Quat();
|
|
public static var rightHandPosition: Vec4 = new Vec4();
|
|
public static var rightHandRotation: Quat = new Quat();
|
|
|
|
public static var leftHandActive: Bool = false;
|
|
public static var rightHandActive: Bool = false;
|
|
|
|
public static var leftThumbstickX: Float = 0.0;
|
|
public static var leftThumbstickY: Float = 0.0;
|
|
public static var rightThumbstickX: Float = 0.0;
|
|
public static var rightThumbstickY: Float = 0.0;
|
|
|
|
public static var leftTrigger: Float = 0.0;
|
|
public static var rightTrigger: Float = 0.0;
|
|
public static var leftGrip: Float = 0.0;
|
|
public static var rightGrip: Float = 0.0;
|
|
|
|
public static var leftButtonX: Bool = false;
|
|
public static var leftButtonY: Bool = false;
|
|
public static var rightButtonA: Bool = false;
|
|
public static var rightButtonB: Bool = false;
|
|
|
|
public static var debugLog:Bool = false;
|
|
|
|
public static function enableDebug() {
|
|
debugLog = true;
|
|
}
|
|
|
|
public static function disableDebug() {
|
|
debugLog = false;
|
|
}
|
|
|
|
public static function updatePoses() {
|
|
var vr: kha.js.vr.VrInterface = cast kha.vr.VrInterface.instance;
|
|
if (vr == null || !vr.IsPresenting()) {
|
|
if (debugLog) trace("[VRController] Not presenting or VR null");
|
|
leftHandActive = false;
|
|
rightHandActive = false;
|
|
return;
|
|
}
|
|
|
|
untyped window._vrControllerFrame = (untyped window._vrControllerFrame || 0) + 1;
|
|
|
|
leftHandActive = false;
|
|
rightHandActive = false;
|
|
|
|
leftButtonX = false;
|
|
leftButtonY = false;
|
|
rightButtonA = false;
|
|
rightButtonB = false;
|
|
|
|
var refSpace = untyped vr.xrRefSpace;
|
|
if (vr.currentInputSources == null || vr.currentFrame == null || refSpace == null) {
|
|
return;
|
|
}
|
|
|
|
var inputSources = vr.currentInputSources;
|
|
var frame = vr.currentFrame;
|
|
|
|
var sourceCount:Int = untyped inputSources.length;
|
|
|
|
for (i in 0...sourceCount) {
|
|
var inputSource = untyped inputSources[i];
|
|
if (inputSource == null) continue;
|
|
|
|
var handedness = untyped inputSource.handedness; // "left", "right", or "none"
|
|
|
|
var gripSpace = untyped inputSource.gripSpace;
|
|
var targetRaySpace = untyped inputSource.targetRaySpace;
|
|
// use targetRaySpace first laser/pointer and fall back to gripSpace
|
|
var space = (targetRaySpace != null) ? targetRaySpace : gripSpace;
|
|
|
|
if (space == null) {
|
|
continue;
|
|
}
|
|
|
|
var pose = untyped frame.getPose(space, refSpace);
|
|
if (pose == null || pose.transform == null) {
|
|
continue;
|
|
}
|
|
|
|
var transform = pose.transform;
|
|
var pos = transform.position;
|
|
var orient = transform.orientation;
|
|
|
|
if (handedness == "left") {
|
|
leftHandPosition.set(pos.x, pos.y, pos.z);
|
|
leftHandRotation.set(orient.x, orient.y, orient.z, orient.w);
|
|
leftHandActive = true;
|
|
|
|
var gamepad = untyped inputSource.gamepad;
|
|
if (gamepad != null) {
|
|
// [0]=thumbstickX [1]=thumbstickY [2]=touchpadX [3]=touchpadY
|
|
if (gamepad.axes != null && gamepad.axes.length >= 2) {
|
|
leftThumbstickX = gamepad.axes[0];
|
|
leftThumbstickY = gamepad.axes[1];
|
|
}
|
|
// [0]=trigger [1]=grip [4]=X [5]=Y
|
|
if (gamepad.buttons != null) {
|
|
if (gamepad.buttons.length > 0) leftTrigger = gamepad.buttons[0].value;
|
|
if (gamepad.buttons.length > 1) leftGrip = gamepad.buttons[1].value;
|
|
if (gamepad.buttons.length > 4) leftButtonX = gamepad.buttons[4].pressed;
|
|
if (gamepad.buttons.length > 5) leftButtonY = gamepad.buttons[5].pressed;
|
|
}
|
|
}
|
|
}
|
|
else if (handedness == "right") {
|
|
rightHandPosition.set(pos.x, pos.y, pos.z);
|
|
rightHandRotation.set(orient.x, orient.y, orient.z, orient.w);
|
|
rightHandActive = true;
|
|
|
|
var gamepad = untyped inputSource.gamepad;
|
|
if (gamepad != null) {
|
|
if (gamepad.axes != null && gamepad.axes.length >= 2) {
|
|
rightThumbstickX = gamepad.axes[0];
|
|
rightThumbstickY = gamepad.axes[1];
|
|
}
|
|
if (gamepad.buttons != null) {
|
|
if (gamepad.buttons.length > 0) rightTrigger = gamepad.buttons[0].value;
|
|
if (gamepad.buttons.length > 1) rightGrip = gamepad.buttons[1].value;
|
|
if (gamepad.buttons.length > 4) rightButtonA = gamepad.buttons[4].pressed;
|
|
if (gamepad.buttons.length > 5) rightButtonB = gamepad.buttons[5].pressed;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#end
|