refactor(M03): extract WMO render resource cache state
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user