refactor(M03): extract WMO render build queue

This commit is contained in:
2026-07-17 00:56:55 +04:00
parent 040b635ec6
commit e1bb105fff
12 changed files with 643 additions and 42 deletions
+25 -32
View File
@@ -18,6 +18,9 @@ const WMO_PLACEMENT_REGISTRY_SCRIPT := preload(
const WMO_RENDER_BUILD_STEP_PLANNER_SCRIPT := preload(
"res://src/render/wmo/wmo_render_build_step_planner.gd"
)
const WMO_RENDER_BUILD_QUEUE_SCRIPT := preload(
"res://src/render/wmo/wmo_render_build_queue.gd"
)
const M2_BUILDER_SCRIPT := preload("res://addons/mpq_extractor/loaders/m2_builder.gd")
const M2_NATIVE_ANIMATED_BUILDER_SCRIPT := preload("res://addons/mpq_extractor/loaders/m2_native_animated_builder.gd")
const M2_NATIVE_ANIMATOR_SCRIPT := preload("res://src/scenes/streaming/m2_native_animator.gd")
@@ -280,8 +283,7 @@ var _wmo_prototype_cache: Dictionary = {}
var _wmo_render_cache: Dictionary = {}
var _wmo_render_missing_cache: Dictionary = {}
var _wmo_render_load_requests: Dictionary = {}
var _wmo_render_build_jobs: Dictionary = {}
var _wmo_render_build_queue: Array = []
var _wmo_render_build_queue := WMO_RENDER_BUILD_QUEUE_SCRIPT.new()
var _wmo_scene_resource_cache: Dictionary = {}
var _wmo_scene_cache_missing: Dictionary = {}
var _wmo_scene_load_requests: Dictionary = {}
@@ -1004,7 +1006,7 @@ func _log_hitch_profile(start_usec: int, timings: Array[String], did_refresh: bo
_m2_mesh_finalize_queue.size() + _m2_mesh_load_requests.size(),
_m2_build_queue.size(),
_wmo_build_queue.size() + _wmo_scene_load_requests.size() + _wmo_render_load_requests.size(),
_wmo_render_build_queue.size(),
_wmo_render_build_queue.pending_count(),
_tile_lod_create_queue.size(),
_tile_lod_remove_queue.size(),
_chunk_create_queue.size(),
@@ -1031,7 +1033,7 @@ func render_baseline_snapshot() -> Dictionary:
"m2_mesh": _m2_mesh_finalize_queue.size() + _m2_mesh_load_requests.size(),
"m2_build": _m2_build_queue.size(),
"wmo_build": _wmo_build_queue.size() + _wmo_scene_load_requests.size() + _wmo_render_load_requests.size(),
"wmo_groups": _wmo_render_build_queue.size(),
"wmo_groups": _wmo_render_build_queue.pending_count(),
"lod_create": _tile_lod_create_queue.size(),
"lod_remove": _tile_lod_remove_queue.size(),
"chunk_create": _chunk_create_queue.size(),
@@ -1313,7 +1315,7 @@ func _tick_runtime_stats(delta: float) -> void:
_m2_mesh_finalize_queue.size() + _m2_mesh_load_requests.size(),
_m2_build_queue.size(),
_wmo_build_queue.size() + _wmo_scene_load_requests.size() + _wmo_render_load_requests.size(),
_wmo_render_build_queue.size(),
_wmo_render_build_queue.pending_count(),
_tile_lod_create_queue.size(),
_tile_lod_remove_queue.size(),
_chunk_create_queue.size(),
@@ -2364,7 +2366,6 @@ func _wait_for_tile_tasks() -> void:
_wmo_render_load_requests.clear()
_wmo_render_missing_cache.clear()
_wmo_scene_cache_missing.clear()
_wmo_render_build_jobs.clear()
_wmo_render_build_queue.clear()
for pending in _terrain_upgrade_tasks.values():
@@ -3004,7 +3005,6 @@ func _clear_streamed_world() -> void:
_wmo_render_load_requests.clear()
_wmo_render_missing_cache.clear()
_wmo_scene_cache_missing.clear()
_wmo_render_build_jobs.clear()
_wmo_render_build_queue.clear()
_tile_result_mutex.lock()
@@ -3761,32 +3761,24 @@ func _instantiate_wmo_render_root(rel_path: String, placement: Dictionary) -> No
func _start_wmo_render_build(unique_key: String, root: Node3D, render_resource: Resource) -> void:
if unique_key.is_empty() or root == null or render_resource == null:
return
_wmo_render_build_jobs[unique_key] = {
"root": root,
"resource": render_resource,
"mesh_index": 0,
"multimesh_index": 0,
}
_wmo_render_build_queue.append(unique_key)
_wmo_render_build_queue.enqueue(unique_key, root, render_resource)
func _process_wmo_render_build_jobs() -> void:
while _render_budget_scheduler.has_remaining_permit(
RENDER_BUDGET_SCHEDULER_SCRIPT.WMO_RENDER_GROUP_BUILD) and not _wmo_render_build_queue.is_empty():
var unique_key := String(_wmo_render_build_queue.front())
if not _wmo_render_build_jobs.has(unique_key):
RENDER_BUDGET_SCHEDULER_SCRIPT.WMO_RENDER_GROUP_BUILD) and _wmo_render_build_queue.has_pending():
var unique_key := _wmo_render_build_queue.front_key()
var job := _wmo_render_build_queue.job_for(unique_key)
if job == null:
_wmo_render_build_queue.pop_front()
continue
var job: Dictionary = _wmo_render_build_jobs[unique_key]
var root: Node = job.get("root", null)
var root: Node = job.root()
if root == null or not is_instance_valid(root):
_cancel_wmo_render_build_job(unique_key)
continue
var render_resource: Resource = job.get("resource", null)
var render_resource: Resource = job.render_resource()
if render_resource == null:
_cancel_wmo_render_build_job(unique_key)
continue
@@ -3794,11 +3786,11 @@ func _process_wmo_render_build_jobs() -> void:
var meshes: Array = render_resource.get("meshes")
var mesh_transforms: Array = render_resource.get("mesh_transforms")
var mesh_names: PackedStringArray = render_resource.get("mesh_names")
var mesh_index: int = int(job.get("mesh_index", 0))
var mesh_index := job.mesh_index()
var multimeshes: Array = render_resource.get("multimeshes")
var multimesh_transforms: Array = render_resource.get("multimesh_transforms")
var multimesh_names: PackedStringArray = render_resource.get("multimesh_names")
var multimesh_index: int = int(job.get("multimesh_index", 0))
var multimesh_index := job.multimesh_index()
var build_step: Dictionary = _wmo_render_build_step_planner.plan_step(
meshes.size(),
mesh_index,
@@ -3829,8 +3821,10 @@ func _process_wmo_render_build_jobs() -> void:
mesh_instance.visibility_range_end_margin = CHUNK_SIZE
(root as Node3D).add_child(mesh_instance)
_set_editor_owner_recursive(mesh_instance)
job["mesh_index"] = int(build_step["next_mesh_index"])
_wmo_render_build_jobs[unique_key] = job
job.adopt_cursors(
int(build_step["next_mesh_index"]),
int(build_step["next_multimesh_index"])
)
_render_budget_scheduler.try_consume_permit(RENDER_BUDGET_SCHEDULER_SCRIPT.WMO_RENDER_GROUP_BUILD)
continue
@@ -3857,8 +3851,10 @@ func _process_wmo_render_build_jobs() -> void:
multimesh_instance.visibility_range_end_margin = CHUNK_SIZE
(root as Node3D).add_child(multimesh_instance)
_set_editor_owner_recursive(multimesh_instance)
job["multimesh_index"] = int(build_step["next_multimesh_index"])
_wmo_render_build_jobs[unique_key] = job
job.adopt_cursors(
int(build_step["next_mesh_index"]),
int(build_step["next_multimesh_index"])
)
_render_budget_scheduler.try_consume_permit(RENDER_BUDGET_SCHEDULER_SCRIPT.WMO_RENDER_GROUP_BUILD)
continue
@@ -3866,9 +3862,7 @@ func _process_wmo_render_build_jobs() -> void:
func _cancel_wmo_render_build_job(unique_key: String) -> void:
if _wmo_render_build_jobs.has(unique_key):
_wmo_render_build_jobs.erase(unique_key)
_wmo_render_build_queue.erase(unique_key)
_wmo_render_build_queue.cancel(unique_key)
func _get_resource_file_size(path: String) -> int:
@@ -4043,7 +4037,6 @@ func _unregister_tile_wmos(state: Dictionary) -> void:
func _clear_wmo_registry() -> void:
_wmo_render_build_jobs.clear()
_wmo_render_build_queue.clear()
for node_variant in _wmo_instance_nodes_by_unique_key.values():
if not (node_variant is Node):