{"record":{"id":"7bbe4ef199af3cfa","repo":"FyroxEngine/Fyrox","slug":"a-node-with-existing-name-was-found-during-the","errorCode":null,"errorMessage":"A node with existing name {} was found during the load of {} resource! Do **NOT IGNORE** this message, please fix names in your model, otherwise engine won't be able to correctly restore data from your resource!","messagePattern":"A node with existing name (.+?) was found during the load of (.+?) resource! Do \\*\\*NOT IGNORE\\*\\* this message, please fix names in your model, otherwise engine won't be able to correctly restore data from your resource!","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"fyrox-impl/src/resource/gltf/node_names.rs","lineNumber":65,"sourceCode":"/// If the nodes have parents with the same names, then grandparent names may\n/// be used if the grandparents have different names. If the whole ancestry\n/// of the nodes is searched without finding ancestors with distinct names\n/// then the nodes are not renamed.\n///\n/// If after the whole procedure there is found to still be nodes with duplicate names,\n/// an error is logged to alert the user to the problem.\npub fn resolve_name_conflicts(path: &Path, graph: &mut Graph) {\n    let node_sets: Vec<Vec<Handle<Node>>> = build_node_sets_from_graph(graph);\n    for nodes in node_sets {\n        if nodes.len() > 1 {\n            resolve_conflict(nodes, graph);\n        }\n    }\n    // Check if conflicts have actually been resolved.\n    let mut name_set: FxHashSet<&str> = FxHashSet::default();\n    for node in graph.linear_iter() {\n        if !name_set.insert(node.name()) {\n            Log::err(format!(\n                \"A node with existing name {} was found during the load of {} resource! \\\n                    Do **NOT IGNORE** this message, please fix names in your model, otherwise \\\n                    engine won't be able to correctly restore data from your resource!\",\n                node.name(),\n                path.display()\n            ));\n        }\n    }\n}\n\nfn build_node_sets_from_graph(graph: &Graph) -> Vec<Vec<Handle<Node>>> {\n    let mut name_map: FxHashMap<&str, Vec<Handle<Node>>> = FxHashMap::default();\n    for (handle, node) in graph.pair_iter() {\n        let name = node.name();\n        let list = name_map\n            .entry(name)\n            .or_insert_with(|| Vec::with_capacity(1));\n        list.push(handle);","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/FyroxEngine/Fyrox/blob/76c91aad8eca488ce527b1af707be8b3b24ad72d/fyrox-impl/src/resource/gltf/node_names.rs#L47-L83","documentation":"When loading a glTF scene, Fyrox resolves duplicate node names by renaming, then verifies no collisions remain via resolve_name_conflicts. If two scene nodes still share a name, the engine cannot reliably map saved/animated data back to nodes, so it logs this emphatic error naming the duplicated node and the resource path.","triggerScenarios":"Loading a glTF/GLB resource where, after conflict resolution, graph.linear_iter() still finds two nodes with the same name — e.g. duplicate node names in the source file that the resolver failed to disambiguate (names differing only by characters normalized away, or empty names).","commonSituations":"Hand-authored or merged glTF files where two nodes share identical names; assets concatenated from multiple scenes; exporters that emit empty or default names for multiple nodes.","solutions":["Fix duplicate node names in the source model (DCC tool or glTF JSON): give every node a unique name and re-export.","Check for nodes with empty names in the glTF and name them explicitly before export.","Do not ignore the message — downstream save/restore of node data (animations, prefabs) will corrupt or bind to the wrong nodes."],"exampleFix":"// before (glTF nodes)\n{\"name\":\"Arm\"}, {\"name\":\"Arm\"}\n\n// after\n{\"name\":\"Arm_L\"}, {\"name\":\"Arm_R\"}","handlingStrategy":"validation","validationCode":"// Before loading, verify node names in the glTF JSON are unique:\nfn names_unique(nodes: &[serde_json::Value]) -> bool {\n    let names: Vec<_> = nodes.iter()\n        .map(|n| n[\"name\"].as_str().unwrap_or(\"\").to_string())\n        .collect();\n    names.iter().all(|n| !n.is_empty())\n        && names.len() == names.iter().collect::<std::collections::HashSet<_>>().len()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Enforce unique, non-empty node names in your DCC tool's export checklist.","Never merge scenes without renaming colliding nodes.","Treat this log as blocking: duplicate names corrupt saved data mapping."],"tags":["gltf","asset-import","naming","scene-graph"],"backgroundTag":"invalid-identifier-format","analyzedSha":"76c91aad8eca488ce527b1af707be8b3b24ad72d","analyzedAt":"2026-09-10T16:04:01.633Z","contentChangedAt":"2026-09-10T16:04:01.633Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}