Something went wrong. Try again.
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758import assert from 'node:assert/strict';import { neutral, radialDeadzone, padPose, smoothPose } from '../dist/controls.mjs';const settings = { sensitivity: 1, smoothing: 0.12, deadzone: 0.12, behavior: 'spring', invert: false,};const pad = (axes = [0, 0, 0, 0], buttons = {}) => ({ axes, buttons: Array.from({ length: 17 }, (_, i) => ({ value: buttons[i] ?? 0, pressed: (buttons[i] ?? 0) > 0.5, })),});assert.deepEqual(radialDeadzone(0.02, -0.03, 0.12), [0, 0]);assert.deepEqual(padPose(pad(), neutral(), settings, 1 / 60), neutral());let pose = padPose(pad([1, 0, 0, -1]), neutral(), settings, 1 / 60);assert.equal(pose.yaw, 30);assert.equal(pose.gazeY, 1);pose = padPose(pad([0, -1, 0, 0], { 0: 1, 7: 1 }), neutral(), settings, 1 / 60);assert.equal(pose.pitch, -20);assert.equal(pose.roll, 20);assert.equal(pose.blinkL, 1);assert.equal(pose.blinkR, 1);pose = padPose(pad([], { 4: 1 }), neutral(), settings, 1 / 60);assert.equal(pose.blinkL, 1);assert.equal(pose.blinkR, 0);assert.deepEqual(padPose(pad([1, 1, 1, 1], { 3: 1 }), pose, settings, 1 / 60), neutral());let hold = { ...settings, behavior: 'hold' };pose = padPose(pad([1, 0, 0, 0]), neutral(), hold, 0.1);assert.equal(pose.yaw, 5.4);assert.equal(padPose(pad(), pose, hold, 0.1).yaw, 5.4);pose = padPose(pad([0, -1, 0, 0]), neutral(), { ...settings, invert: true }, 0.1);assert.equal(pose.pitch, 20);const smoothed = smoothPose(neutral(), { ...neutral(), yaw: 30 }, 0.016, 0.12);assert(smoothed.yaw > 0 && smoothed.yaw < 30);for (let i = 0; i < 1000; i++) { const p = padPose( pad( Array.from({ length: 4 }, () => Math.random() * 2 - 1), { 6: Math.random(), 7: Math.random() }, ), neutral(), { ...settings, sensitivity: 1.5 }, 0.05, ); assert( Math.abs(p.yaw) <= 30 && Math.abs(p.pitch) <= 20 && Math.abs(p.roll) <= 20 && Math.abs(p.gazeX) <= 1 && Math.abs(p.gazeY) <= 1, );}console.log('Controller mapping, deadzone, limits, smoothing, reset, hold and blinks pass.');