/// <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); } }
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); }
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); }
/// <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); } }