handleEvent method

void handleEvent(
  1. VrInputEvent event
)

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;
  }
}