33 lines
1.1 KiB
GDScript
33 lines
1.1 KiB
GDScript
class_name WmoPlacementResolver
|
|
extends RefCounted
|
|
|
|
## Stateless WMO cache-key, placement-identity and world-transform rules.
|
|
|
|
|
|
## Returns the historical lowercase slash-normalized relative WMO cache key.
|
|
func normalize_relative_path(relative_wmo_path: String) -> String:
|
|
return relative_wmo_path.replace("\\", "/").to_lower()
|
|
|
|
|
|
## Returns the positive MODF unique-ID key or the historical tile/index fallback.
|
|
func resolve_unique_key(
|
|
placement: Dictionary,
|
|
tile_key: String,
|
|
placement_index: int
|
|
) -> String:
|
|
var unique_id := int(placement.get("unique_id", -1))
|
|
if unique_id > 0:
|
|
return "uid:%d" % unique_id
|
|
return "tile:%s:%d" % [tile_key, placement_index]
|
|
|
|
|
|
## Returns the world-space Godot transform used by every WMO instance path.
|
|
func resolve_world_transform(placement: Dictionary) -> Transform3D:
|
|
var world_position: Vector3 = placement.get("pos", Vector3.ZERO)
|
|
var rotation_radians: Vector3 = placement.get("rot", Vector3.ZERO)
|
|
var scale_value := float(placement.get("scale", 1.0))
|
|
return Transform3D(
|
|
Basis.from_euler(rotation_radians).scaled(Vector3.ONE * scale_value),
|
|
world_position
|
|
)
|