Ai_Assistant/client/vr/xrHaptics.js

54 lines
1.5 KiB
JavaScript
Raw Permalink Normal View History

2026-05-24 13:31:30 +02:00
export function getXRInputSourceByHandedness(renderer, handedness) {
const session = renderer.xr.getSession();
if (!session?.inputSources) return null;
return [...session.inputSources].find((source) => source.handedness === handedness) || null;
}
export function pulseXRInputSource(source, intensity, duration) {
const gamepad = source?.gamepad;
if (!gamepad) return false;
const actuator = gamepad.hapticActuators?.[0];
if (actuator) {
if (typeof actuator.playEffect === 'function') {
actuator.playEffect('dual-rumble', {
startDelay: 0,
duration,
weakMagnitude: intensity,
strongMagnitude: intensity,
}).catch(() => {});
return true;
}
if (typeof actuator.pulse === 'function') {
actuator.pulse(intensity, duration).catch?.(() => {});
return true;
}
}
const vibrationActuator = gamepad.vibrationActuator;
if (vibrationActuator?.playEffect) {
vibrationActuator.playEffect('dual-rumble', {
startDelay: 0,
duration,
weakMagnitude: intensity,
strongMagnitude: intensity,
}).catch(() => {});
return true;
}
if (vibrationActuator?.pulse) {
vibrationActuator.pulse(intensity, duration).catch?.(() => {});
return true;
}
return false;
}
export function pulseXRController(renderer, controllerIndex, intensity, duration) {
const handedness = controllerIndex === 0 ? 'left' : 'right';
const source = getXRInputSourceByHandedness(renderer, handedness);
return pulseXRInputSource(source, intensity, duration);
}