refactor(M03): extract M2 mesh resource traversal
Work-Package: M03-RND-M2-MESH-RESOURCE-EXTRACTOR-001 Agent: sindo-main-codex Tests: 36 headless renderer/coordinate contracts pass; checkpoint dry-run 7/7; documentation and coordination gates pass Fidelity: preserves first-Mesh preorder and temporary PackedScene cleanup; no visual parity claim
This commit is contained in:
@@ -69,6 +69,9 @@ const M2_MESH_LOAD_PIPELINE_STATE_SCRIPT := preload(
|
||||
const M2_MESH_RESOURCE_CACHE_STATE_SCRIPT := preload(
|
||||
"res://src/render/m2/m2_mesh_resource_cache_state.gd"
|
||||
)
|
||||
const M2_MESH_RESOURCE_EXTRACTOR_SCRIPT := preload(
|
||||
"res://src/render/m2/m2_mesh_resource_extractor.gd"
|
||||
)
|
||||
const STREAMING_TARGET_PLANNER_SCRIPT := preload("res://src/render/streaming/streaming_target_planner.gd")
|
||||
const STREAMING_TARGET_POLICY_SCRIPT := preload("res://src/render/streaming/streaming_target_policy.gd")
|
||||
const RENDER_BUDGET_SCHEDULER_SCRIPT := preload("res://src/render/streaming/render_budget_scheduler.gd")
|
||||
@@ -260,6 +263,7 @@ var _m2_runtime_mesh_rebuild_classifier := (
|
||||
M2_RUNTIME_MESH_REBUILD_CLASSIFIER_SCRIPT.new()
|
||||
)
|
||||
var _m2_mesh_resource_cache_state := M2_MESH_RESOURCE_CACHE_STATE_SCRIPT.new()
|
||||
var _m2_mesh_resource_extractor := M2_MESH_RESOURCE_EXTRACTOR_SCRIPT.new()
|
||||
var _m2_mesh_load_pipeline_state := M2_MESH_LOAD_PIPELINE_STATE_SCRIPT.new()
|
||||
var _m2_animation_load_requests: Dictionary = {}
|
||||
var _m2_animation_finalize_queue: Array = []
|
||||
@@ -4277,7 +4281,7 @@ func _drain_m2_mesh_loads() -> void:
|
||||
|
||||
var path := String(pending.get("path", ""))
|
||||
var resource: Resource = ResourceLoader.load_threaded_get(path)
|
||||
var mesh := _extract_first_mesh_from_m2_resource(resource)
|
||||
var mesh := _m2_mesh_resource_extractor.extract_first_mesh(resource)
|
||||
if mesh != null:
|
||||
_m2_mesh_resource_cache_state.store_mesh(
|
||||
normalized_rel,
|
||||
@@ -4695,34 +4699,11 @@ func _rebuild_m2_mesh_from_data(data: Dictionary) -> Mesh:
|
||||
var prototype: Node3D = M2_BUILDER_SCRIPT.build(data, extracted_dir)
|
||||
if prototype == null:
|
||||
return null
|
||||
var rebuilt := _find_first_mesh_recursive(prototype)
|
||||
var rebuilt := _m2_mesh_resource_extractor.find_first_mesh_in_subtree(prototype)
|
||||
prototype.free()
|
||||
return rebuilt
|
||||
|
||||
|
||||
func _extract_first_mesh_from_m2_resource(resource: Resource) -> Mesh:
|
||||
if resource is Mesh:
|
||||
return resource as Mesh
|
||||
if resource is PackedScene:
|
||||
var node := (resource as PackedScene).instantiate()
|
||||
if node == null:
|
||||
return null
|
||||
var mesh := _find_first_mesh_recursive(node)
|
||||
node.free()
|
||||
return mesh
|
||||
return null
|
||||
|
||||
|
||||
func _find_first_mesh_recursive(node: Node) -> Mesh:
|
||||
if node is MeshInstance3D:
|
||||
return (node as MeshInstance3D).mesh
|
||||
for child in node.get_children():
|
||||
var mesh := _find_first_mesh_recursive(child)
|
||||
if mesh != null:
|
||||
return mesh
|
||||
return null
|
||||
|
||||
|
||||
func _get_or_load_m2_mesh(rel_path: String) -> Mesh:
|
||||
var normalized_rel := _normalize_m2_rel_path(rel_path)
|
||||
if _m2_mesh_resource_cache_state.has_mesh(normalized_rel):
|
||||
@@ -4730,7 +4711,7 @@ func _get_or_load_m2_mesh(rel_path: String) -> Mesh:
|
||||
var prototype: Node3D = _get_or_load_m2_prototype(rel_path)
|
||||
if prototype == null:
|
||||
return null
|
||||
var mesh := _find_first_mesh_recursive(prototype)
|
||||
var mesh := _m2_mesh_resource_extractor.find_first_mesh_in_subtree(prototype)
|
||||
if mesh != null and not normalized_rel.is_empty():
|
||||
mesh = _prepare_m2_mesh_for_runtime(normalized_rel, mesh)
|
||||
_m2_mesh_resource_cache_state.store_mesh(normalized_rel, mesh)
|
||||
|
||||
Reference in New Issue
Block a user