Skip to content

Commit 920343f

Browse files
committed
Fix makeInstancesReal bug
1 parent 948a562 commit 920343f

File tree

1 file changed

+49
-32
lines changed

1 file changed

+49
-32
lines changed

Sources/GateEngine/Resources/Import & Export/Importers/GLTransmissionFormat.swift

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)