refactor(M03): extract M2 placement grouper
This commit is contained in:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user