handleEvent method
Copies only scalar/vector values; never retains a pooled event or map.
Implementation
void handleEvent(VrInputEvent event) {
final data = event.data;
final remote = event.source == VrInputSource.remotePhone;
if (event.type == VrInputType.navigate) {
final stick = data?['stick'];
final rightOnly = stick == VrGamepadStick.right || stick == 'right';
final leftOnly = stick == VrGamepadStick.left || stick == 'left';
if (!rightOnly && (event.active || _moveSource == event.source)) {
moveX = event.active ? _axis(data?['stickX'] ?? data?['x']) : 0;
moveY = event.active ? _axis(data?['stickY'] ?? data?['y']) : 0;
_moveAge = 0;
_moveRemote = remote;
_moveSource = event.active ? event.source : null;
}
if (!leftOnly && (event.active || _lookSource == event.source)) {
lookX = event.active
? _axis(
rightOnly ? (data?['x']) : (data?['lookX'] ?? data?['turn']),
)
: 0;
lookY = event.active
? _axis(
rightOnly ? (data?['y']) : (data?['lookY'] ?? data?['pitch']),
)
: 0;
_lookAge = 0;
_lookRemote = remote;
_lookSource = event.active ? event.source : null;
}
} else if (event.type == VrInputType.pointerMove) {
if (!event.active && _pointerSource != event.source) return;
_pointerSource = event.active ? event.source : null;
_pointerActive = event.active;
_pointerRemote = remote;
_pointerAge = 0;
if (!event.active) return;
_relativePointer = data?['relativeToHead'] == true;
if (_relativePointer) {
_laserX = _axis(data?['laserX'] ?? data?['x']);
_laserY = _axis(data?['laserY'] ?? data?['y']);
return;
}
final forward = data?['forward'];
final orientation = data?['orientation'];
if (forward is Vector3 && _validDirection(forward)) {
_pointerForward.setFrom(forward);
} else if (orientation is Quaternion &&
orientation.length2.isFinite &&
orientation.length2 > 1e-12) {
// Sensor/laser drivers use active q*v*q^-1; vector_math.rotate uses
// the inverse convention, so conjugate the normalized quaternion.
_rotationOperator.setValues(
-orientation.x,
-orientation.y,
-orientation.z,
orientation.w,
);
_rotationOperator.normalize();
_pointerForward.setValues(0, 0, -1);
_rotationOperator.rotate(_pointerForward);
} else {
_pointerActive = false;
return;
}
_pointerForward.normalize();
} else if (event.type == VrInputType.recenter && event.active) {
// Await the next calibrated pose; never retain the old ray.
_pointerActive = false;
}
}