41 lines
1.5 KiB
GDScript
41 lines
1.5 KiB
GDScript
class_name AdtWaterSceneFinalizer
|
|
extends RefCounted
|
|
|
|
## Builds and attaches one ADT water subtree on the renderer main thread. The
|
|
## supplied tile root owns the returned subtree; this service retains no state.
|
|
|
|
const ADT_BUILDER_SCRIPT := preload("res://addons/mpq_extractor/loaders/adt_builder.gd")
|
|
|
|
|
|
## Builds water from parsed ADT data and attaches it once to [param tile_root].
|
|
## [param tile_origin_godot_units] is the existing Godot-world tile origin used
|
|
## by [ADTBuilder]. When [param editor_owner] is non-null and is an ancestor,
|
|
## ownership is assigned recursively for persisted Editor previews. Returns the
|
|
## attached borrowed root, or null for empty/invalid input or dry ADT data.
|
|
## This method mutates the SceneTree and must run on the main thread.
|
|
func attach_water_scene(
|
|
water_data: Dictionary,
|
|
tile_origin_godot_units: Vector3,
|
|
tile_root: Node,
|
|
editor_owner: Node = null) -> Node3D:
|
|
if water_data.is_empty() or tile_root == null or not is_instance_valid(tile_root):
|
|
return null
|
|
|
|
var water_root: Node3D = ADT_BUILDER_SCRIPT.build_tile_water_scene(
|
|
water_data,
|
|
tile_origin_godot_units
|
|
)
|
|
if water_root == null:
|
|
return null
|
|
|
|
tile_root.add_child(water_root)
|
|
if editor_owner != null and is_instance_valid(editor_owner):
|
|
_assign_owner_recursive(water_root, editor_owner)
|
|
return water_root
|
|
|
|
|
|
func _assign_owner_recursive(generated_node: Node, editor_owner: Node) -> void:
|
|
generated_node.owner = editor_owner
|
|
for child in generated_node.get_children():
|
|
_assign_owner_recursive(child, editor_owner)
|