refactor(M03): extract WMO render resource cache state

This commit is contained in:
2026-07-17 01:11:11 +04:00
parent 4314f961f6
commit d39f591e50
11 changed files with 774 additions and 36 deletions
+41 -25
View File
@@ -21,6 +21,9 @@ const WMO_RENDER_BUILD_STEP_PLANNER_SCRIPT := preload(
const WMO_RENDER_BUILD_QUEUE_SCRIPT := preload(
"res://src/render/wmo/wmo_render_build_queue.gd"
)
const WMO_RENDER_RESOURCE_CACHE_STATE_SCRIPT := preload(
"res://src/render/wmo/wmo_render_resource_cache_state.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,9 +283,7 @@ var _tile_mesh_cache: Dictionary = {}
var _tile_mesh_cache_order: Array = []
var _terrain_quality_mesh_cache: RefCounted = TERRAIN_QUALITY_MESH_CACHE_SCRIPT.new()
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_resource_cache_state := WMO_RENDER_RESOURCE_CACHE_STATE_SCRIPT.new()
var _wmo_render_build_queue := WMO_RENDER_BUILD_QUEUE_SCRIPT.new()
var _wmo_scene_resource_cache: Dictionary = {}
var _wmo_scene_cache_missing: Dictionary = {}
@@ -467,9 +468,8 @@ func _release_runtime_caches_for_shutdown() -> void:
_m2_mesh_cache.clear()
_m2_static_animation_cache.clear()
_m2_missing_cache.clear()
_wmo_render_cache.clear()
_wmo_render_resource_cache_state.clear_all()
_wmo_scene_resource_cache.clear()
_wmo_render_missing_cache.clear()
_wmo_scene_cache_missing.clear()
_wmo_missing_cache.clear()
_shared_tex_cache.clear()
@@ -1005,7 +1005,11 @@ func _log_hitch_profile(start_usec: int, timings: Array[String], did_refresh: bo
_m2_animation_finalize_queue.size() + _m2_animation_load_requests.size(),
_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_build_queue.size()
+ _wmo_scene_load_requests.size()
+ _wmo_render_resource_cache_state.pending_request_count()
),
_wmo_render_build_queue.pending_count(),
_tile_lod_create_queue.size(),
_tile_lod_remove_queue.size(),
@@ -1032,7 +1036,11 @@ func render_baseline_snapshot() -> Dictionary:
"m2_animation": _m2_animation_finalize_queue.size() + _m2_animation_load_requests.size(),
"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_build": (
_wmo_build_queue.size()
+ _wmo_scene_load_requests.size()
+ _wmo_render_resource_cache_state.pending_request_count()
),
"wmo_groups": _wmo_render_build_queue.pending_count(),
"lod_create": _tile_lod_create_queue.size(),
"lod_remove": _tile_lod_remove_queue.size(),
@@ -1314,7 +1322,11 @@ func _tick_runtime_stats(delta: float) -> void:
_m2_animation_finalize_queue.size() + _m2_animation_load_requests.size(),
_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_build_queue.size()
+ _wmo_scene_load_requests.size()
+ _wmo_render_resource_cache_state.pending_request_count()
),
_wmo_render_build_queue.pending_count(),
_tile_lod_create_queue.size(),
_tile_lod_remove_queue.size(),
@@ -2356,15 +2368,17 @@ func _wait_for_tile_tasks() -> void:
ResourceLoader.load_threaded_get(path)
_wmo_scene_load_requests.clear()
for path_variant in _wmo_render_load_requests.values():
var wmo_render_request_paths := (
_wmo_render_resource_cache_state.request_paths_snapshot()
)
for path_variant in wmo_render_request_paths.values():
var path := String(path_variant)
if path.is_empty():
continue
var status := ResourceLoader.load_threaded_get_status(path)
if status == ResourceLoader.THREAD_LOAD_IN_PROGRESS or status == ResourceLoader.THREAD_LOAD_LOADED:
ResourceLoader.load_threaded_get(path)
_wmo_render_load_requests.clear()
_wmo_render_missing_cache.clear()
_wmo_render_resource_cache_state.clear_transient_state()
_wmo_scene_cache_missing.clear()
_wmo_render_build_queue.clear()
@@ -3002,8 +3016,7 @@ func _clear_streamed_world() -> void:
_wmo_build_jobs.clear()
_wmo_build_queue.clear()
_wmo_scene_load_requests.clear()
_wmo_render_load_requests.clear()
_wmo_render_missing_cache.clear()
_wmo_render_resource_cache_state.clear_transient_state()
_wmo_scene_cache_missing.clear()
_wmo_render_build_queue.clear()
@@ -3589,7 +3602,7 @@ func _process_wmo_build_jobs() -> void:
var normalized_rel := _wmo_placement_resolver.normalize_relative_path(
rel_path
)
if _wmo_render_load_requests.has(normalized_rel):
if _wmo_render_resource_cache_state.has_request(normalized_rel):
advance_job = false
else:
var scene := _get_wmo_scene_or_request(rel_path)
@@ -3667,15 +3680,15 @@ func _drain_wmo_scene_loads() -> void:
func _drain_wmo_render_loads() -> void:
for normalized_rel_variant in _wmo_render_load_requests.keys():
var request_paths := _wmo_render_resource_cache_state.request_paths_snapshot()
for normalized_rel_variant in request_paths.keys():
var normalized_rel := String(normalized_rel_variant)
var path := String(_wmo_render_load_requests[normalized_rel])
var path := String(request_paths[normalized_rel])
var status := ResourceLoader.load_threaded_get_status(path)
if status != ResourceLoader.THREAD_LOAD_LOADED and status != ResourceLoader.THREAD_LOAD_FAILED:
continue
_wmo_render_load_requests.erase(normalized_rel)
if status != ResourceLoader.THREAD_LOAD_LOADED:
_wmo_render_missing_cache[normalized_rel] = true
_wmo_render_resource_cache_state.complete_request_as_missing(normalized_rel)
continue
var resource: Resource = ResourceLoader.load_threaded_get(path)
if (
@@ -3683,20 +3696,23 @@ func _drain_wmo_render_loads() -> void:
and resource.get_script() == WMO_STREAMING_SCRIPT
and int(resource.get("format_version")) >= WMO_STREAMING_SCRIPT.FORMAT_VERSION
):
_wmo_render_cache[normalized_rel] = resource
_wmo_render_resource_cache_state.complete_request_with_resource(
normalized_rel,
resource
)
else:
_wmo_render_missing_cache[normalized_rel] = true
_wmo_render_resource_cache_state.complete_request_as_missing(normalized_rel)
func _get_wmo_render_or_request(rel_path: String) -> Resource:
var normalized_rel := _wmo_placement_resolver.normalize_relative_path(rel_path)
if normalized_rel.is_empty():
return null
if _wmo_render_cache.has(normalized_rel):
return _wmo_render_cache[normalized_rel]
if _wmo_render_missing_cache.has(normalized_rel):
if _wmo_render_resource_cache_state.contains_resource(normalized_rel):
return _wmo_render_resource_cache_state.resource_for(normalized_rel)
if _wmo_render_resource_cache_state.is_missing(normalized_rel):
return null
if _wmo_render_load_requests.has(normalized_rel):
if _wmo_render_resource_cache_state.has_request(normalized_rel):
return null
var cache_path := wmo_render_cache_dir.path_join(normalized_rel.get_basename() + ".res")
@@ -3709,7 +3725,7 @@ func _get_wmo_render_or_request(rel_path: String) -> Resource:
false,
ResourceLoader.CACHE_MODE_REUSE)
if err == OK or err == ERR_BUSY:
_wmo_render_load_requests[normalized_rel] = cache_path
_wmo_render_resource_cache_state.remember_request(normalized_rel, cache_path)
return null