From 24ab087635e76ac6b9cd4fec425b9b4301cdd7c9 Mon Sep 17 00:00:00 2001 From: Harold Serrano Date: Sat, 17 Jan 2026 23:16:56 -0700 Subject: [PATCH] [Bugfix] Fixe child name serializer --- .../UntoldEngine/Scenes/SceneSerializer.swift | 11 ++++- .../SceneSerializerTest.swift | 42 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/Sources/UntoldEngine/Scenes/SceneSerializer.swift b/Sources/UntoldEngine/Scenes/SceneSerializer.swift index 0708772e..668535a4 100644 --- a/Sources/UntoldEngine/Scenes/SceneSerializer.swift +++ b/Sources/UntoldEngine/Scenes/SceneSerializer.swift @@ -131,6 +131,7 @@ struct AssetOverrideData: Codable { var transform: LocalTransformOverrideData? var material: MaterialData? var visibility: Bool? + var name: String? } struct AssetInstanceData: Codable { @@ -408,11 +409,14 @@ public func serializeScene() -> SceneData { let visibilityOverride: Bool? = nil // TODO: track visibility if needed + let entityName = getEntityName(entityId: childId) + let override = AssetOverrideData( nodePath: derivedComp.nodePath, transform: transformOverride, material: materialOverride, - visibility: visibilityOverride + visibility: visibilityOverride, + name: entityName ) overrides.append(override) } @@ -1041,6 +1045,11 @@ private func applyAssetInstanceOverrides(entityId: EntityID, overrides: [AssetOv } } + // apply entity name override + if let entityName = override.name { + setEntityName(entityId: derivedEntityId, name: entityName) + } + appliedCount += 1 } diff --git a/Tests/UntoldEngineTests/SceneSerializerTest.swift b/Tests/UntoldEngineTests/SceneSerializerTest.swift index a68b7c14..cba38aaf 100644 --- a/Tests/UntoldEngineTests/SceneSerializerTest.swift +++ b/Tests/UntoldEngineTests/SceneSerializerTest.swift @@ -427,6 +427,48 @@ final class SceneSerializerTests: XCTestCase { SSAOParams.shared.intensity = 0.0 } + // MARK: - Asset Instance Override Tests + + func testSerializeSceneStoresDerivedNodeNameOverride() { + let rootId = createEntity() + setEntityName(entityId: rootId, name: "AssetRoot") + + registerComponent(entityId: rootId, componentType: AssetInstanceComponent.self) + guard let assetInstance = scene.get(component: AssetInstanceComponent.self, for: rootId) else { + XCTFail("AssetInstanceComponent should exist on root entity") + return + } + assetInstance.assetURL = URL(fileURLWithPath: "/tmp/test.usdz") + assetInstance.assetName = "test" + assetInstance.importMode = "preserveHierarchy" + assetInstance.rootPrimPath = nil + + let childId = createEntity() + setEntityName(entityId: childId, name: "RenamedChild") + setParent(childId: childId, parentId: rootId) + + registerComponent(entityId: childId, componentType: DerivedAssetNodeComponent.self) + guard let derivedComp = scene.get(component: DerivedAssetNodeComponent.self, for: childId) else { + XCTFail("DerivedAssetNodeComponent should exist on child entity") + return + } + derivedComp.assetRootEntityId = rootId + derivedComp.nodePath = "Root/Child#0" + + let sceneData = serializeScene() + + XCTAssertEqual(sceneData.entities.count, 1, "Only the asset root should be serialized") + guard let serializedRoot = sceneData.entities.first else { + XCTFail("Serialized root entity should exist") + return + } + XCTAssertEqual(serializedRoot.name, "AssetRoot", "Root entity name should match") + XCTAssertNotNil(serializedRoot.assetInstance, "Asset instance data should be serialized") + XCTAssertEqual(serializedRoot.assetInstance?.overrides.count, 1, "Should serialize one derived override") + XCTAssertEqual(serializedRoot.assetInstance?.overrides.first?.nodePath, "Root/Child#0", "Override nodePath should match") + XCTAssertEqual(serializedRoot.assetInstance?.overrides.first?.name, "RenamedChild", "Override name should match") + } + // MARK: - Deserialization Tests func testDeserializeEmptyScene() {