refactor(M03): extract M2 unique placement registry
This commit is contained in:
@@ -24,6 +24,9 @@ const TERRAIN_CHUNK_LOD_PLANNER_SCRIPT := preload("res://src/render/terrain/terr
|
||||
const TERRAIN_CHUNK_GEOMETRY_QUEUE_PLANNER_SCRIPT := preload(
|
||||
"res://src/render/terrain/terrain_chunk_geometry_queue_planner.gd"
|
||||
)
|
||||
const M2_UNIQUE_PLACEMENT_REGISTRY_SCRIPT := preload(
|
||||
"res://src/render/m2/m2_unique_placement_registry.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")
|
||||
@@ -207,7 +210,9 @@ var _m2_group_result_mutex := Mutex.new()
|
||||
var _m2_group_result_queue: Array = []
|
||||
var _m2_build_jobs: Dictionary = {}
|
||||
var _m2_build_queue: Array = []
|
||||
var _m2_unique_registry: Dictionary = {}
|
||||
var _m2_unique_placement_registry := (
|
||||
M2_UNIQUE_PLACEMENT_REGISTRY_SCRIPT.new()
|
||||
)
|
||||
var _m2_mesh_cache: Dictionary = {}
|
||||
var _m2_mesh_load_requests: Dictionary = {}
|
||||
var _m2_mesh_finalize_queue: Array = []
|
||||
@@ -1011,7 +1016,7 @@ func render_baseline_snapshot() -> Dictionary:
|
||||
"chunk_remove": _chunk_remove_queue.size(),
|
||||
},
|
||||
"cache_entries": _tile_mesh_cache.size(),
|
||||
"m2_active_unique_ids": _m2_unique_registry.size(),
|
||||
"m2_active_unique_ids": _m2_unique_placement_registry.active_count(),
|
||||
"wmo_instances": _wmo_registry.size(),
|
||||
}
|
||||
|
||||
@@ -2965,7 +2970,7 @@ func _clear_streamed_world() -> void:
|
||||
for key in _m2_build_jobs.keys():
|
||||
_cancel_m2_build_job(String(key))
|
||||
_m2_build_queue.clear()
|
||||
_m2_unique_registry.clear()
|
||||
_m2_unique_placement_registry.clear()
|
||||
_m2_mesh_load_requests.clear()
|
||||
_m2_mesh_finalize_queue.clear()
|
||||
_m2_runtime_rebuild_required_cache.clear()
|
||||
@@ -4129,7 +4134,10 @@ func _request_tile_m2_assets(
|
||||
if _m2_group_tasks.has(key) or _m2_build_jobs.has(key):
|
||||
return result
|
||||
|
||||
var filtered := _reserve_tile_m2_placements(key, m2_placements)
|
||||
var filtered: Dictionary = _m2_unique_placement_registry.reserve(
|
||||
key,
|
||||
m2_placements
|
||||
)
|
||||
var filtered_placements: Array = filtered.get("placements", [])
|
||||
result["unique_keys"] = filtered.get("unique_keys", [])
|
||||
result["skipped_unique_keys"] = filtered.get("skipped_unique_keys", [])
|
||||
@@ -4143,46 +4151,6 @@ func _request_tile_m2_assets(
|
||||
return result
|
||||
|
||||
|
||||
func _reserve_tile_m2_placements(tile_key: String, m2_placements: Array) -> Dictionary:
|
||||
var filtered_placements: Array = []
|
||||
var unique_keys: Array = []
|
||||
var skipped_unique_keys: Array = []
|
||||
for index in m2_placements.size():
|
||||
var placement_variant = m2_placements[index]
|
||||
if not (placement_variant is Dictionary):
|
||||
continue
|
||||
var placement: Dictionary = placement_variant
|
||||
var unique_key := _m2_unique_key(placement)
|
||||
if unique_key.is_empty():
|
||||
filtered_placements.append(placement)
|
||||
continue
|
||||
if _m2_unique_registry.has(unique_key):
|
||||
var entry: Dictionary = _m2_unique_registry[unique_key]
|
||||
var owner_tile := String(entry.get("tile", ""))
|
||||
if owner_tile == tile_key and unique_keys.has(unique_key):
|
||||
continue
|
||||
if owner_tile != tile_key:
|
||||
if not skipped_unique_keys.has(unique_key):
|
||||
skipped_unique_keys.append(unique_key)
|
||||
continue
|
||||
_m2_unique_registry[unique_key] = {"tile": tile_key}
|
||||
if not unique_keys.has(unique_key):
|
||||
unique_keys.append(unique_key)
|
||||
filtered_placements.append(placement)
|
||||
return {
|
||||
"placements": filtered_placements,
|
||||
"unique_keys": unique_keys,
|
||||
"skipped_unique_keys": skipped_unique_keys,
|
||||
}
|
||||
|
||||
|
||||
func _m2_unique_key(placement: Dictionary) -> String:
|
||||
var uid: int = int(placement.get("unique_id", -1))
|
||||
if uid <= 0:
|
||||
return ""
|
||||
return "uid:%d" % uid
|
||||
|
||||
|
||||
func _release_tile_m2_unique_keys(state: Dictionary, notify_candidates: bool = true) -> void:
|
||||
var tile_key := String(state.get("key", ""))
|
||||
var unique_keys: Array = state.get("m2_unique_keys", [])
|
||||
@@ -4191,16 +4159,7 @@ func _release_tile_m2_unique_keys(state: Dictionary, notify_candidates: bool = t
|
||||
state["m2_skipped_unique_keys"] = []
|
||||
return
|
||||
|
||||
var released_keys: Array = []
|
||||
for unique_key_variant in unique_keys:
|
||||
var unique_key := String(unique_key_variant)
|
||||
if unique_key.is_empty() or not _m2_unique_registry.has(unique_key):
|
||||
continue
|
||||
var entry: Dictionary = _m2_unique_registry[unique_key]
|
||||
if String(entry.get("tile", "")) != tile_key:
|
||||
continue
|
||||
_m2_unique_registry.erase(unique_key)
|
||||
released_keys.append(unique_key)
|
||||
var released_keys: Array = _m2_unique_placement_registry.release(tile_key, unique_keys)
|
||||
|
||||
state["m2_unique_keys"] = []
|
||||
state["m2_skipped_unique_keys"] = []
|
||||
|
||||
Reference in New Issue
Block a user