ScenePointer class Picking and input

A programmatic pointer into a scene: a crosshair, a gamepad-driven cursor, a VR laser, or the built-in pointer behind automatic widget input.

The caller decides where the ray comes from (pointAt from a screen position, or pointAlong for an arbitrary ray); the pointer owns everything downstream: the raycast, widget-surface UV mapping, event forwarding, capture, and hover state. Several pointers coexist, each with independent capture and hover.

Filtering has two distinct axes:

  • layerMask / where / maxDistance control what the ray HITS (the occlusion set). Defaults hit everything raycastable, so blocking is physically correct out of the box; a wall in front of a panel stops the pointer.
  • interactionMask controls which widget surfaces this pointer may DRIVE. Events forward only when the nearest hit's node carries a WidgetComponent and intersects this mask.

While pressed, the interaction is captured: moves and the release route to the pressed surface even when the ray slides off it (other geometry is ignored until release), the standard pointer-capture semantics that keep drags alive at surface edges.

Hover (hit, hoveredWidget, hoverChanged) is query state for the caller (crosshair highlights, cursor feedback); it is not forwarded into the widgets (widget-level hover needs MouseTracker integration, a planned follow-up).

Constructors

ScenePointer(Scene scene, {int layerMask = 0xFFFFFFFF, int interactionMask = 0xFFFFFFFF, bool where(Node node)?, double maxDistance = double.infinity})
Creates a pointer into scene.

Properties

hashCode int
The hash code for this object.
no setterinherited
hit SceneRaycastHit?
The latest raycast hit (from the occlusion set), or null when the ray misses everything in range.
no setter
hoverChanged ChangeNotifier
Notifies when hoveredWidget changes.
final
hoveredWidget WidgetComponent?
The widget component the pointer is over (nearest hit, interaction mask passed), or null. While pressed this stays the captured surface.
no setter
interactionMask int
Which widget surfaces this pointer may drive (against Node.layers).
getter/setter pair
isPressed bool
Whether a press is in progress.
no setter
layerMask int
The occlusion set: layers the ray tests (against Node.layers).
getter/setter pair
maxDistance double
The pointer's reach, world units.
getter/setter pair
pointerId int
This pointer's id within each widget surface's forwarding state; distinct per ScenePointer so concurrent pointers never share capture.
final
pressTravel double
UV-space distance traveled between the last press and now (or the release), for click-versus-drag discrimination.
no setter
runtimeType Type
A representation of the runtime type of the object.
no setterinherited
scene Scene
The scene this pointer casts into.
final
where bool Function(Node node)?
Optional occlusion predicate (exclude the player model, etc.).
getter/setter pair

Methods

cancel() → void
Cancels the current press without completing it.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
pointAlong(Ray ray) → void
Points along ray (world space; direction need not be normalized).
pointAt(Offset screenPosition, {required Camera camera, required Size viewSize}) → void
Points along the ray leaving camera through screenPosition inside a view of viewSize logical pixels.
press() → void
Presses at the current pointer location. Forwards a pointer-down when the pointer is over a widget surface; otherwise the press is blocked (it landed on world geometry or empty space).
release() → void
Releases the current press at the pointer's location.
scroll(Offset scrollDelta) → void
Scrolls at the pointer's location by scrollDelta logical pixels, driving scrollables in the hovered widget surface.
toString() String
A string representation of this object.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited