135 lines
4.7 KiB
GDScript
135 lines
4.7 KiB
GDScript
class_name WmoSceneResourceCacheState
|
|
extends RefCounted
|
|
|
|
## Owns validated cached-WMO PackedScenes and their load state. File limits,
|
|
## ResourceLoader I/O and scene-cache validation remain caller responsibilities.
|
|
|
|
var _scenes_by_normalized_path: Dictionary = {}
|
|
var _missing_normalized_paths: Dictionary = {}
|
|
var _request_cache_paths_by_normalized_path: Dictionary = {}
|
|
|
|
|
|
## Returns the validated PackedScene for a normalized WMO path, or null.
|
|
func scene_for(normalized_relative_path: String) -> PackedScene:
|
|
if normalized_relative_path.is_empty():
|
|
return null
|
|
return _scenes_by_normalized_path.get(normalized_relative_path) as PackedScene
|
|
|
|
|
|
## Returns whether a validated PackedScene is cached for the normalized path.
|
|
func contains_scene(normalized_relative_path: String) -> bool:
|
|
return (
|
|
not normalized_relative_path.is_empty()
|
|
and _scenes_by_normalized_path.has(normalized_relative_path)
|
|
)
|
|
|
|
|
|
## Returns whether the normalized path is in the negative cache.
|
|
func is_missing(normalized_relative_path: String) -> bool:
|
|
return (
|
|
not normalized_relative_path.is_empty()
|
|
and _missing_normalized_paths.has(normalized_relative_path)
|
|
)
|
|
|
|
|
|
## Returns whether the normalized path has a pending threaded load request.
|
|
func has_request(normalized_relative_path: String) -> bool:
|
|
return (
|
|
not normalized_relative_path.is_empty()
|
|
and _request_cache_paths_by_normalized_path.has(normalized_relative_path)
|
|
)
|
|
|
|
|
|
## Records one loader-started request. Occupied or empty paths are rejected.
|
|
func remember_request(normalized_relative_path: String, cache_path: String) -> bool:
|
|
if normalized_relative_path.is_empty() or cache_path.is_empty():
|
|
return false
|
|
if _has_any_state(normalized_relative_path):
|
|
return false
|
|
_request_cache_paths_by_normalized_path[normalized_relative_path] = cache_path
|
|
return true
|
|
|
|
|
|
## Records an absent, oversize or request-start failure without requiring a
|
|
## pending request. Occupied and empty paths are rejected.
|
|
func mark_missing(normalized_relative_path: String) -> bool:
|
|
if normalized_relative_path.is_empty() or _has_any_state(normalized_relative_path):
|
|
return false
|
|
_missing_normalized_paths[normalized_relative_path] = true
|
|
return true
|
|
|
|
|
|
## Returns a detached normalized-path to cache-path snapshot for loader polling.
|
|
func request_paths_snapshot() -> Dictionary:
|
|
return _request_cache_paths_by_normalized_path.duplicate()
|
|
|
|
|
|
## Completes a pending request with a caller-validated PackedScene.
|
|
func complete_request_with_scene(
|
|
normalized_relative_path: String,
|
|
validated_scene: PackedScene
|
|
) -> bool:
|
|
if (
|
|
normalized_relative_path.is_empty()
|
|
or validated_scene == null
|
|
or not _request_cache_paths_by_normalized_path.has(normalized_relative_path)
|
|
):
|
|
return false
|
|
_request_cache_paths_by_normalized_path.erase(normalized_relative_path)
|
|
_missing_normalized_paths.erase(normalized_relative_path)
|
|
_scenes_by_normalized_path[normalized_relative_path] = validated_scene
|
|
return true
|
|
|
|
|
|
## Completes a pending request as missing after load or validation failure.
|
|
func complete_request_as_missing(normalized_relative_path: String) -> bool:
|
|
if (
|
|
normalized_relative_path.is_empty()
|
|
or not _request_cache_paths_by_normalized_path.has(normalized_relative_path)
|
|
):
|
|
return false
|
|
_request_cache_paths_by_normalized_path.erase(normalized_relative_path)
|
|
_scenes_by_normalized_path.erase(normalized_relative_path)
|
|
_missing_normalized_paths[normalized_relative_path] = true
|
|
return true
|
|
|
|
|
|
## Clears pending and negative state while retaining validated PackedScenes.
|
|
func clear_transient_state() -> void:
|
|
_request_cache_paths_by_normalized_path.clear()
|
|
_missing_normalized_paths.clear()
|
|
|
|
|
|
## Releases every cached scene and transient entry. Safe to call repeatedly.
|
|
func clear_all() -> void:
|
|
_scenes_by_normalized_path.clear()
|
|
clear_transient_state()
|
|
|
|
|
|
## Returns the number of pending threaded load requests.
|
|
func pending_request_count() -> int:
|
|
return _request_cache_paths_by_normalized_path.size()
|
|
|
|
|
|
## Returns detached, sorted scalar keys without exposing PackedScene references.
|
|
func diagnostic_snapshot() -> Dictionary:
|
|
var scene_paths: Array = _scenes_by_normalized_path.keys()
|
|
var missing_paths: Array = _missing_normalized_paths.keys()
|
|
var request_paths: Array = _request_cache_paths_by_normalized_path.keys()
|
|
scene_paths.sort()
|
|
missing_paths.sort()
|
|
request_paths.sort()
|
|
return {
|
|
"scene_paths": scene_paths.duplicate(),
|
|
"missing_paths": missing_paths.duplicate(),
|
|
"request_paths": request_paths.duplicate(),
|
|
}
|
|
|
|
|
|
func _has_any_state(normalized_relative_path: String) -> bool:
|
|
return (
|
|
_scenes_by_normalized_path.has(normalized_relative_path)
|
|
or _missing_normalized_paths.has(normalized_relative_path)
|
|
or _request_cache_paths_by_normalized_path.has(normalized_relative_path)
|
|
)
|