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
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_statesp_configp_loggerenable_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: