refactor(M03): extract M2 placement grouper

This commit is contained in:
2026-07-17 00:05:49 +04:00
parent 9c9020e60f
commit 9df32d38ef
12 changed files with 633 additions and 59 deletions
+9 -30
View File
@@ -30,6 +30,9 @@ const M2_UNIQUE_PLACEMENT_REGISTRY_SCRIPT := preload(
const M2_PLACEMENT_TRANSFORM_RESOLVER_SCRIPT := preload(
"res://src/render/m2/m2_placement_transform_resolver.gd"
)
const M2_PLACEMENT_GROUPER_SCRIPT := preload(
"res://src/render/m2/m2_placement_grouper.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")
@@ -215,6 +218,7 @@ var _m2_unique_placement_registry := (
M2_UNIQUE_PLACEMENT_REGISTRY_SCRIPT.new()
)
var _m2_placement_transform_resolver := M2_PLACEMENT_TRANSFORM_RESOLVER_SCRIPT.new()
var _m2_placement_grouper := M2_PLACEMENT_GROUPER_SCRIPT.new()
var _m2_mesh_cache: Dictionary = {}
var _m2_mesh_load_requests: Dictionary = {}
var _m2_mesh_finalize_queue: Array = []
@@ -4119,36 +4123,11 @@ func _group_tile_m2_task(
tile_origin: Vector3,
m2_names: PackedStringArray,
m2_placements: Array) -> void:
var groups: Dictionary = {}
for placement_variant in m2_placements:
if not (placement_variant is Dictionary):
continue
var placement: Dictionary = placement_variant
var name_id: int = int(placement.get("name_id", -1))
if name_id < 0 or name_id >= m2_names.size():
continue
var normalized: String = str(m2_names[name_id]).replace("\\", "/")
if normalized.ends_with(".mdx") or normalized.ends_with(".mdl"):
normalized = normalized.get_basename() + ".m2"
if normalized.is_empty():
continue
var world_pos: Vector3 = placement.get("pos", Vector3.ZERO)
var pos: Vector3 = world_pos - tile_origin
var rot: Vector3 = placement.get("rot", Vector3.ZERO)
var scale_value: float = float(placement.get("scale", 1.0))
var basis: Basis = _m2_placement_transform_resolver.resolve_basis(rot, normalized)
var offset: Vector3 = _m2_placement_transform_resolver.resolve_origin_offset(
rot,
normalized,
scale_value
)
var xform := Transform3D(basis.scaled(Vector3.ONE * maxf(scale_value, 0.0001)), pos + offset)
if not groups.has(normalized):
groups[normalized] = []
(groups[normalized] as Array).append(xform)
var groups: Dictionary = _m2_placement_grouper.group_placements(
tile_origin,
m2_names,
m2_placements
)
_m2_group_result_mutex.lock()
_m2_group_result_queue.append({