Skip to content

Commit b4b1345

Browse files
committed
Fix node name conflict handling
1 parent a587b77 commit b4b1345

1 file changed

Lines changed: 28 additions & 4 deletions

File tree

Sources/GLTFSceneKit/schema/extensions/VRM/GLTFVRM_VRM.swift

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,32 @@ struct GLTFVRM_GLTFVRMExtension: GLTFCodable {
156156
enum CodingKeys: String, CodingKey {
157157
case data = "VRM"
158158
}
159+
160+
func checkNameUniqueness(rootNode: SCNNode, name: String) -> Bool {
161+
var nameCount: Int = 0
162+
rootNode.enumerateHierarchy { node, _ in
163+
if node.name == name {
164+
nameCount += 1
165+
}
166+
}
167+
168+
return nameCount <= 1
169+
}
170+
171+
func getUniqueName(targetNode: SCNNode, rootNode: SCNNode) -> String {
172+
let orgName = targetNode.name ?? "node"
173+
var name = orgName
174+
175+
var nameIsUnique = checkNameUniqueness(rootNode: rootNode, name: name)
176+
var postfix: Int = 1
177+
while !nameIsUnique {
178+
name = "\(orgName)-\(postfix)"
179+
nameIsUnique = checkNameUniqueness(rootNode: rootNode, name: name)
180+
postfix += 1
181+
}
182+
183+
return name
184+
}
159185

160186
func didLoad(by object: Any, unarchiver: GLTFUnarchiver) {
161187
guard let data = self.data else { return }
@@ -269,10 +295,8 @@ struct GLTFVRM_GLTFVRMExtension: GLTFCodable {
269295
return
270296
}
271297

272-
// TODO: Handle empty name and name conflicts
273-
guard let meshName = meshNode.name else {
274-
return
275-
}
298+
let meshName = getUniqueName(targetNode: meshNode, rootNode: scene.rootNode)
299+
meshNode.name = meshName
276300

277301
for i in 0..<meshNode.childNodes.count {
278302
let keyPath = "/\(meshName).childNodes[\(i)].morpher.weights[\(bind.index)]"

0 commit comments

Comments
 (0)