private ulong GetMaterialGeoKey(HxScene.GeometryNode node, out int materialIndex, out int geoIndex) { if (geometryCollection.TryGetValue(node.Geometry, out geoIndex)) { if (node is HxScene.MaterialGeometryNode materialNode && materialNode.Material != null && materialCollection.TryGetValue(materialNode.Material, out materialIndex)) { return(GetMaterialGeoKey(materialIndex, geoIndex)); } else { materialIndex = 0; return(GetMaterialGeoKey(0, geoIndex)); } }
/// <summary> /// Creates the mesh information. Since Assimp requires each mesh has one material only. /// Geometry has to be duplicated if they are using different material /// </summary> /// <param name="geoNode">The geo node.</param> /// <returns></returns> private MeshInfo OnCreateMeshInfo(HxScene.GeometryNode geoNode) { MeshInfo info = null; if (geoNode is HxScene.MaterialGeometryNode materialNode && materialNode.Material != null) { var key = GetMaterialGeoKey(geoNode, out var materialIndex, out var geoIndex); if (!meshInfos.TryGetValue(key, out var existing)) { info = new MeshInfo(key, geoNode.Geometry, geoNode.Name, geoIndex, materialIndex); } else { info = existing; } if (info != null && info.Bones == null && materialNode is HxScene.BoneSkinMeshNode boneNode) { info.Bones = boneNode.Bones; } } return(info); }