126 lines
4.4 KiB
TypeScript
126 lines
4.4 KiB
TypeScript
import {Base} from "./base";
|
|
import {
|
|
Angle,
|
|
Scene,
|
|
Vector3,
|
|
WebXRControllerComponent,
|
|
WebXRDefaultExperience,
|
|
WebXRInputSource
|
|
} from "@babylonjs/core";
|
|
import {ControllerMovementMode, Controllers} from "./controllers";
|
|
|
|
export class Right extends Base {
|
|
public static instance: Right;
|
|
|
|
constructor(controller:
|
|
WebXRInputSource, scene: Scene, xr: WebXRDefaultExperience) {
|
|
super(controller, scene, xr);
|
|
Right.instance = this;
|
|
this.controller.onMotionControllerInitObservable.add((init) => {
|
|
this.initTrigger(init.components['xr-standard-trigger']);
|
|
this.initBButton(init.components['b-button']);
|
|
this.initAButton(init.components['a-button']);
|
|
this.initThumbstick(init.components['xr-standard-thumbstick']);
|
|
});
|
|
|
|
|
|
}
|
|
private initBButton(bbutton: WebXRControllerComponent) {
|
|
if (bbutton) {
|
|
bbutton.onButtonStateChangedObservable.add((button) => {
|
|
if (button.pressed) {
|
|
Controllers.controllerObserver.notifyObservers({type: 'b-button', value: button.value});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
private initTrigger(trigger: WebXRControllerComponent) {
|
|
if (trigger) {
|
|
trigger
|
|
.onButtonStateChangedObservable
|
|
.add((button) => {
|
|
if (button.pressed) {
|
|
Controllers.controllerObserver.notifyObservers({type: 'trigger', value: button.value});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
private initAButton(abutton: WebXRControllerComponent) {
|
|
if (abutton) {
|
|
abutton.onButtonStateChangedObservable.add((value) => {
|
|
if (value.pressed) {
|
|
Controllers.controllerObserver.notifyObservers({type: 'menu'});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
private initThumbstick(thumbstick: WebXRControllerComponent) {
|
|
if (thumbstick) {
|
|
thumbstick.onAxisValueChangedObservable.add((value) => {
|
|
if (!Controllers.movable) {
|
|
this.moveRig(value);
|
|
} else {
|
|
if (Controllers.movementMode == ControllerMovementMode.ROTATE) {
|
|
this.rotateMovable(value);
|
|
} else {
|
|
this.moveMovable(value);
|
|
}
|
|
}
|
|
});
|
|
thumbstick.onButtonStateChangedObservable.add((value) => {
|
|
if (value.pressed) {
|
|
Controllers.toggleMovementMode();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
private moveRig(value) {
|
|
if (Math.abs(value.x) > .1) {
|
|
Controllers.controllerObserver.notifyObservers({type: 'turn', value: value.x});
|
|
} else {
|
|
Controllers.controllerObserver.notifyObservers({type: 'turn', value: 0});
|
|
}
|
|
if (Math.abs(value.y) > .1) {
|
|
Controllers.controllerObserver.notifyObservers({type: 'updown', value: value.y * this.speedFactor});
|
|
Base.stickVector.z = 1;
|
|
} else {
|
|
Controllers.controllerObserver.notifyObservers({type: 'updown', value: 0});
|
|
Base.stickVector.z = 0;
|
|
}
|
|
if (Base.stickVector.equals(Vector3.Zero())) {
|
|
Controllers.controllerObserver.notifyObservers({type: 'updown', value: 0});
|
|
}
|
|
}
|
|
|
|
private rotateMovable(value: { x: number; y: number }) {
|
|
if (Math.abs(value.y) > .1) {
|
|
Controllers.movable.rotation.x +=
|
|
Angle.FromDegrees(Math.sign(value.y)).radians();
|
|
Controllers.movable.rotation.x = this.fixRadians(Controllers.movable.rotation.x);
|
|
}
|
|
if (Math.abs(value.x) > .1) {
|
|
Controllers.movable.rotation.z +=
|
|
Angle.FromDegrees(Math.sign(value.x)).radians();
|
|
Controllers.movable.rotation.z = this.fixRadians(Controllers.movable.rotation.z);
|
|
}
|
|
}
|
|
private fixRadians(value: number) {
|
|
if (value > 2 * Math.PI) {
|
|
return value - 2 * Math.PI;
|
|
} else {
|
|
return value;
|
|
}
|
|
}
|
|
private moveMovable(value: { x: number; y: number }) {
|
|
if (Math.abs(value.y) > .1) {
|
|
Controllers.movable.position.z += Math.sign(value.y) * -.005;
|
|
}
|
|
if (Math.abs(value.x) > .1) {
|
|
Controllers.movable.position.x += Math.sign(value.x) * .005;
|
|
}
|
|
}
|
|
} |