コード例 #1
0
        /// <summary>
        /// Обрабатывает секцию MaterialSplit (она же Bin Mesh PLG)
        /// Насколько я понял, эта секция нужна, когда отдельным кускам меша присваивается разный метариел (текстура),
        /// либо когда треугольники перечисляются не в виде TriangleList, а в виде TriangleStrip.
        ///
        /// Перезаписывает данные в последнем добавленном меше в modelData
        /// </summary>
        private void ParseMaterialSplit(int sectionSize)
        {
            int sectionEnd = (int)input.BaseStream.Position + sectionSize;

            // ParseMaterialSplit вызывается всегда после ParseGeometry, которая добавляет новый mesh в modelData
            ModelMeshData mesh = modelData.Meshes[modelData.Meshes.Count - 1];

            int triangleStrip = input.ReadInt32();
            int splitCount    = input.ReadInt32();

            mesh.SumIndicesCount = input.ReadInt32();

            mesh.TriangleStrip = triangleStrip != 0;

            mesh.MeshParts.Clear(); // перезаписываем данные о треугольниках

            for (int j = 0; j < splitCount; ++j)
            {
                int localIndicesCount = input.ReadInt32();
                int materialIdx       = input.ReadInt32();

                ModelMeshPartData meshPart = new ModelMeshPartData(localIndicesCount, materialIdx);
                for (int i = 0; i != localIndicesCount; ++i)
                {
                    meshPart.Indices.Add((short)input.ReadInt32());
                }

                mesh.MeshParts.Add(meshPart);
            }
        }
コード例 #2
0
        private void ReadTriangles(ModelMeshData mesh, int trianglesCount)
        {
            ModelMeshPartData meshPart = new ModelMeshPartData(trianglesCount * 3, 0);

            mesh.SumIndicesCount = trianglesCount * 3;

            for (var i = 0; i != trianglesCount; ++i)
            {
                meshPart.Indices.Add(input.ReadInt16());
                meshPart.Indices.Add(input.ReadInt16());
                input.BaseStream.Seek(sizeof(short), SeekOrigin.Current); // skip index flags
                meshPart.Indices.Add(input.ReadInt16());
            }

            mesh.MeshParts = new List <ModelMeshPartData>();
            mesh.MeshParts.Add(meshPart);
        }
コード例 #3
0
        private void ReadTriangles(ModelMeshData mesh, int trianglesCount)
        {
            ModelMeshPartData meshPart = new ModelMeshPartData(trianglesCount * 3, 0);
             mesh.SumIndicesCount = trianglesCount * 3;

             for (var i = 0; i != trianglesCount; ++i)
             {
            meshPart.Indices.Add(input.ReadInt16());
            meshPart.Indices.Add(input.ReadInt16());
            input.BaseStream.Seek(sizeof(short), SeekOrigin.Current); // skip index flags
            meshPart.Indices.Add(input.ReadInt16());
             }

             mesh.MeshParts = new List<ModelMeshPartData>();
             mesh.MeshParts.Add(meshPart);
        }
コード例 #4
0
        /// <summary>
        /// Обрабатывает секцию MaterialSplit (она же Bin Mesh PLG)
        /// Насколько я понял, эта секция нужна, когда отдельным кускам меша присваивается разный метариел (текстура),
        /// либо когда треугольники перечисляются не в виде TriangleList, а в виде TriangleStrip.
        /// 
        /// Перезаписывает данные в последнем добавленном меше в modelData
        /// </summary>
        private void ParseMaterialSplit(int sectionSize)
        {
            int sectionEnd = (int)input.BaseStream.Position + sectionSize;

             // ParseMaterialSplit вызывается всегда после ParseGeometry, которая добавляет новый mesh в modelData
             ModelMeshData mesh = modelData.Meshes[modelData.Meshes.Count - 1];

             int triangleStrip = input.ReadInt32();
             int splitCount = input.ReadInt32();
             mesh.SumIndicesCount = input.ReadInt32();

             mesh.TriangleStrip = triangleStrip != 0;

             mesh.MeshParts.Clear(); // перезаписываем данные о треугольниках

             for (int j = 0; j < splitCount; ++j)
             {
            int localIndicesCount = input.ReadInt32();
            int materialIdx = input.ReadInt32();

            ModelMeshPartData meshPart = new ModelMeshPartData(localIndicesCount, materialIdx);
            for (int i = 0; i != localIndicesCount; ++i)
               meshPart.Indices.Add((short)input.ReadInt32());

            mesh.MeshParts.Add(meshPart);
             }
        }