Table of Contents

Class GridPositioner3D

Namespace
GridPlacement.GDScript
Assembly
MoonBark.GridPlacement.GDScript.dll

Controls the on-grid cursor used by building/interaction systems in 3D.\n\n6.0.0-3D-Surface (Wave B1.3): production 3D positioner, the public-facing 3D surface for placement targeting. The 3D positioner: - Drives a [GridPlacementHost] via [_input] / [_physics_process] dispatch (parallel to the 2D positioner's contract) - Resolves camera cursor → GridMap cell via [Camera3D] ray-cast + [GridMap.local_to_map] (via [GridPositioner3DSpike]) - Mirrors the 2D positioner's DI lifecycle ([resolve_placement_dependencies], [set_dependencies], [set_targeting_state])\n\nDifference from the 2D positioner: the 2D positioner uses a [Camera2D] + canvas-transform projection; the 3D positioner uses a [Camera3D] + ray-cast to a ground plane (the spike's math). The 2D positioner also carries a full visibility reconciliation + recenter policy + diagnostic pipeline (965 lines) which is intentionally NOT mirrored in Wave B1; consumers of the 3D surface use the host's mode + visibility logic instead, parallel to how the 2D services were refactored in 6.0.0-S.\n\nNo extends PlacementNode2D/3D: the 2D positioner does not extend the per-node DI base class either, and the 6.0.0-S refactor moved dependencies to the host + session model. Mirroring that means the 3D positioner is a stand-alone Node3D, not a custom base.

class GridPositioner3D extends Node3D
GridPositioner3D

Fields

LOG_PREFIX

const LOG_PREFIX: String = "[GridPositioner3D]"

MISS

The sentinel returned by [method ray_from_screen_to_cell] when the ray misses the grid. Same contract as [GridPositioner3DSpike.SPIKE_MISS].

const MISS: Vector3i = Vector3i(2147483647, 2147483647, 2147483647)

Properties

camera

The active camera. Either set via [method configure] (preferred) or auto-resolved from the viewport if the positioner is the current camera's parent. The 2D positioner auto-resolves from [code]viewport.get_camera_2d()[/code]; the 3D version auto-resolves from [code]viewport.get_camera_3d()[/code] as a fallback.

@export var camera: Camera3D

grid

The active target grid. Either set via [method configure] or resolved from the targeting state.

@export var grid: GridMap

cursor_source

Injected cursor-source callable. Returns a [Vector2] screen position (parallel to the 2D positioner's [code]cursor_source[/code]). Tests inject a fixed Vector2 for deterministic positioning.

var cursor_source: Callable

input_processing_enabled

Public flag & API for enabling/disabling input processing. Mirrors the 2D positioner's [code]input_processing_enabled[/code].

var input_processing_enabled: bool = false

viewport

var viewport: Viewport = get_viewport()

screen_center

var screen_center: Vector2 = viewport.get_visible_rect().get_center()

screen_pos

var screen_pos: Vector2 = _get_cursor_screen_position()

cell

var cell: Vector3i = _spike.ray_from_screen_to_cell(p_motion.position)

grid_ref

var grid_ref: GridMap = _get_target_grid()

issues

var issues = get_runtime_issues()

issues

var issues = get_runtime_issues()

viewport

var viewport: Viewport = get_viewport()

viewport

var viewport: Viewport = get_viewport()

result

var result = cursor_source.call()

world_hit

var world_hit: Vector3 = _spike.camera.project_ray_origin(p_motion.position)

cell

var cell: Vector3i = _spike.ray_from_screen_to_cell(p_motion.position)

grid_ref

var grid_ref: GridMap = _get_target_grid()

Methods

resolve_placement_dependencies

func resolve_placement_dependencies(p_config: PlacementContainer) -> void:

Parameters

p_config

Returns

set_input_processing_enabled

func set_input_processing_enabled(p_enabled: bool) -> void:

Parameters

p_enabled

Returns

is_input_ready

func is_input_ready() -> bool:

Returns

are_dependencies_ready

func are_dependencies_ready() -> bool:

Returns

set_dependencies

func set_dependencies(p_states: PlacementStates, p_config: PlacementConfig, p_logger: PlacementLogger = null, enable_input: bool = true) -> void:

Parameters

p_states
p_config
p_logger
enable_input

Returns

set_targeting_state

func set_targeting_state(p_targeting_state: GridTargetingState) -> void:

Parameters

p_targeting_state

Returns

move_to_viewport_center_tile

func move_to_viewport_center_tile() -> Vector3i:

Returns

move_to_cursor_center_tile

func move_to_cursor_center_tile() -> Vector3i:

Returns

ray_from_screen_to_cell_or_null

func ray_from_screen_to_cell_or_null(p_screen_pos: Vector2) -> Variant:

Parameters

p_screen_pos

Returns

ray_from_screen_to_cell

func ray_from_screen_to_cell(p_screen_pos: Vector2) -> Vector3i:

Parameters

p_screen_pos

Returns

get_spike

func get_spike() -> GridPositioner3DSpike:

Returns

move_positioner_by_tile

func move_positioner_by_tile(p_tile_delta: Vector3i) -> void:

Parameters

p_tile_delta

Returns

get_runtime_issues

func get_runtime_issues() -> Array[String]:

Returns

validate_dependencies

func validate_dependencies() -> bool:

Returns

remove_self_as_positioner

func remove_self_as_positioner() -> void:

Returns