rnd(M03): add rendered ground query facade
This commit is contained in:
@@ -7,6 +7,7 @@ extends Node
|
||||
|
||||
const GODOT_WORLD_POSITION_SCRIPT := preload("res://src/domain/coordinates/godot_world_position.gd")
|
||||
const STREAMING_FOCUS_SCRIPT := preload("res://src/domain/streaming/streaming_focus.gd")
|
||||
const RENDERED_GROUND_SAMPLE_SCRIPT := preload("res://src/render/terrain/rendered_ground_sample.gd")
|
||||
|
||||
## Internal renderer implementation resolved relative to this node.
|
||||
## The referenced node remains owned by its scene parent.
|
||||
@@ -66,6 +67,33 @@ func renderer_metrics_snapshot() -> Dictionary:
|
||||
return (metrics_variant as Dictionary).duplicate(true)
|
||||
|
||||
|
||||
## Samples the currently loaded render terrain at a typed Godot world position.
|
||||
## This read-only renderer view is diagnostic and does not replace authoritative
|
||||
## gameplay collision or the independently composed [TerrainQuery].
|
||||
func sample_ground_height(godot_world_position: GodotWorldPosition) -> RefCounted:
|
||||
var loader := _resolve_streaming_world_loader()
|
||||
if loader == null:
|
||||
return RENDERED_GROUND_SAMPLE_SCRIPT.unavailable(&"render_facade_unavailable")
|
||||
var sample_variant = loader.call("sample_rendered_ground_height", godot_world_position)
|
||||
if sample_variant is RefCounted and sample_variant.get_script() == RENDERED_GROUND_SAMPLE_SCRIPT:
|
||||
return sample_variant
|
||||
push_error("WorldRenderFacade received an invalid rendered ground sample.")
|
||||
return RENDERED_GROUND_SAMPLE_SCRIPT.unavailable(&"render_ground_sample_invalid")
|
||||
|
||||
|
||||
## Returns a detached diagnostic snapshot for one rendered-ground query.
|
||||
## Mutating the result cannot mutate streamer queues, tile state or resources.
|
||||
func renderer_ground_query_snapshot(godot_world_position: GodotWorldPosition) -> Dictionary:
|
||||
var loader := _resolve_streaming_world_loader()
|
||||
if loader == null:
|
||||
return {}
|
||||
var snapshot_variant = loader.call("render_ground_query_snapshot", godot_world_position)
|
||||
if not (snapshot_variant is Dictionary):
|
||||
push_error("WorldRenderFacade received a non-Dictionary ground query snapshot.")
|
||||
return {}
|
||||
return (snapshot_variant as Dictionary).duplicate(true)
|
||||
|
||||
|
||||
func _capture_streaming_focus_from_source() -> void:
|
||||
if streaming_focus_source_path == NodePath():
|
||||
return
|
||||
@@ -99,6 +127,8 @@ func _resolve_streaming_world_loader() -> Node:
|
||||
&"set_streaming_focus",
|
||||
&"refresh_streaming_focus",
|
||||
&"render_baseline_snapshot",
|
||||
&"sample_rendered_ground_height",
|
||||
&"render_ground_query_snapshot",
|
||||
]:
|
||||
if not candidate.has_method(required_method):
|
||||
if not _missing_loader_reported:
|
||||
|
||||
Reference in New Issue
Block a user