@@ -752,13 +752,18 @@ extension GLTransmissionFormat: GeometryImporter {
752752 public mutating func loadGeometry( options: GeometryImporterOptions ) async throws ( GateEngineError) -> RawGeometry {
753753 guard gltf. meshes != nil else { throw GateEngineError . failedToDecode ( " File contains no geometry. " ) }
754754
755+ // TODO: Disambiguate desire for subObjectName
756+ // Different software can output different names in different places.
757+ // A mesh name could end up as a node.name, material.name, or mesh.name
758+ // The end user needs a way to pick what they mean when they try to load geometry
759+ // These changes need to be reflected in CollisionMesh importing as well
755760 var mesh : GLTF . Mesh ? = nil
756761 if let name = options. subobjectName {
757- if let meshID = gltf. nodes. first ( where: { $0. name == name } ) ? . mesh {
758- mesh = gltf. meshes![ meshID]
759- } else if let _mesh = gltf. meshes!. first ( where: { $0. name == name } ) {
762+ if let _mesh = gltf. meshes!. first ( where: { $0. name == name } ) {
760763 mesh = _mesh
761- } else {
764+ } else if let meshID = gltf. nodes. first ( where: { $0. name == name } ) ? . mesh {
765+ mesh = gltf. meshes![ meshID]
766+ } else {
762767 let meshNames = gltf. meshes!. map ( { $0. name } )
763768 let nodeNames = gltf. nodes. filter ( { $0. mesh != nil } ) . map ( { $0. name } )
764769 throw GateEngineError . failedToDecode (
@@ -872,22 +877,28 @@ extension GLTransmissionFormat: GeometryImporter {
872877 if options. applyRootTransform, let nodeIndex = gltf. scenes [ gltf. scene] . nodes? . first {
873878 let transform = gltf. nodes [ nodeIndex] . transform. createMatrix ( )
874879 return geometryBase * transform
875- } else if options. makeInstancesReal, let nodes = gltf. scenes [ gltf. scene] . nodes {
880+ } else if options. makeInstancesReal, let sceneNodeIndicies = gltf. scenes [ gltf. scene] . nodes {
876881 var transformedGeometries : [ RawGeometry ] = [ ]
877- let meshIndex = gltf. meshes!. firstIndex ( where: { $0. name == mesh. name} )
878- for index in nodes {
879- guard gltf. nodes [ index] . mesh == meshIndex else { continue }
880- var transform : Matrix4x4 = . identity
881-
882- func applyNode( _ nodeIndex: Int ) {
883- transform *= gltf. nodes [ nodeIndex] . transform. createMatrix ( )
884- if let parent = nodes. first ( where: { gltf. nodes [ $0] . children? . contains ( nodeIndex) == true } ) {
885- applyNode ( parent)
882+ for meshIndex in gltf. meshes!. indices {
883+ // mesh.name is not required to be unique
884+ // Multiple meshes can have the same name for some reason but different content
885+ // So we need to loop through every mesh and check every name
886+ guard gltf. meshes![ meshIndex] . name == mesh. name else { continue }
887+ for sceneNodeIndex in sceneNodeIndicies {
888+ guard gltf. nodes [ sceneNodeIndex] . mesh == meshIndex else { continue }
889+ var transform : Matrix4x4 = . identity
890+
891+ func applyNode( _ sceneNodeIndex: Int ) {
892+ transform *= gltf. nodes [ sceneNodeIndex] . transform. createMatrix ( )
893+ if let parent = sceneNodeIndicies. first ( where: { gltf. nodes [ $0] . children? . contains ( sceneNodeIndex) == true } ) {
894+ applyNode ( parent)
895+ }
886896 }
897+ applyNode ( sceneNodeIndex)
898+ transformedGeometries. append ( geometryBase * transform)
887899 }
888- applyNode ( index)
889- transformedGeometries. append ( geometryBase * transform)
890900 }
901+ assert ( transformedGeometries. isEmpty == false )
891902 return RawGeometry ( combining: transformedGeometries, optimizing: . byEquality)
892903 } else {
893904 return geometryBase
@@ -1386,11 +1397,11 @@ extension GLTransmissionFormat: CollisionMeshImporter {
13861397
13871398 var mesh : GLTF . Mesh ? = nil
13881399 if let name = options. subobjectName {
1389- if let meshID = gltf. nodes. first ( where: { $0. name == name } ) ? . mesh {
1390- mesh = gltf. meshes![ meshID]
1391- } else if let _mesh = gltf. meshes!. first ( where: { $0. name == name } ) {
1400+ if let _mesh = gltf. meshes!. first ( where: { $0. name == name } ) {
13921401 mesh = _mesh
1393- } else {
1402+ } else if let meshID = gltf. nodes. first ( where: { $0. name == name } ) ? . mesh {
1403+ mesh = gltf. meshes![ meshID]
1404+ } else {
13941405 let meshNames = gltf. meshes!. map ( { $0. name } )
13951406 let nodeNames = gltf. nodes. filter ( { $0. mesh != nil } ) . map ( { $0. name } )
13961407 throw GateEngineError . failedToDecode (
@@ -1501,22 +1512,28 @@ extension GLTransmissionFormat: CollisionMeshImporter {
15011512 let geometryBase = geometryBase * transform
15021513 let triangles = geometryBase. generateCollisionTriangles ( using: options. collisionAttributes)
15031514 return RawCollisionMesh ( collisionTriangles: triangles)
1504- } else if options. makeInstancesReal, let nodes = gltf. scenes [ gltf. scene] . nodes {
1515+ } else if options. makeInstancesReal, let sceneNodeIndicies = gltf. scenes [ gltf. scene] . nodes {
15051516 var transformedGeometries : [ RawGeometry ] = [ ]
1506- let meshIndex = gltf. meshes!. firstIndex ( where: { $0. name == mesh. name} )
1507- for index in nodes {
1508- guard gltf. nodes [ index] . mesh == meshIndex else { continue }
1509- var transform : Matrix4x4 = . identity
1510-
1511- func applyNode( _ nodeIndex: Int ) {
1512- transform *= gltf. nodes [ nodeIndex] . transform. createMatrix ( )
1513- if let parent = nodes. first ( where: { gltf. nodes [ $0] . children? . contains ( nodeIndex) == true } ) {
1514- applyNode ( parent)
1517+ for meshIndex in gltf. meshes!. indices {
1518+ // mesh.name is not required to be unique
1519+ // Multiple meshes can have the same name for some reason but different content
1520+ // So we need to loop through every mesh and check every name
1521+ guard gltf. meshes![ meshIndex] . name == mesh. name else { continue }
1522+ for sceneNodeIndex in sceneNodeIndicies {
1523+ guard gltf. nodes [ sceneNodeIndex] . mesh == meshIndex else { continue }
1524+ var transform : Matrix4x4 = . identity
1525+
1526+ func applyNode( _ sceneNodeIndex: Int ) {
1527+ transform *= gltf. nodes [ sceneNodeIndex] . transform. createMatrix ( )
1528+ if let parent = sceneNodeIndicies. first ( where: { gltf. nodes [ $0] . children? . contains ( sceneNodeIndex) == true } ) {
1529+ applyNode ( parent)
1530+ }
15151531 }
1532+ applyNode ( sceneNodeIndex)
1533+ transformedGeometries. append ( geometryBase * transform)
15161534 }
1517- applyNode ( index)
1518- transformedGeometries. append ( geometryBase * transform)
15191535 }
1536+ assert ( transformedGeometries. isEmpty == false )
15201537 let geometryBase = RawGeometry ( combining: transformedGeometries, optimizing: . byEquality)
15211538 let triangles = geometryBase. generateCollisionTriangles ( using: options. collisionAttributes)
15221539 return RawCollisionMesh ( collisionTriangles: triangles)
0 commit comments