예제 #1
0
 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));
         }
     }
예제 #2
0
            /// <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);
            }