public static ModelData ReadModelData(Stream stream) { EngineBinaryReader engineBinaryReader = new EngineBinaryReader(stream); ModelData modelData = new ModelData(); modelData.Bones.Capacity = engineBinaryReader.ReadInt32(); for (int i = 0; i < modelData.Bones.Capacity; i++) { ModelBoneData modelBoneData = new ModelBoneData(); modelData.Bones.Add(modelBoneData); modelBoneData.ParentBoneIndex = engineBinaryReader.ReadInt32(); modelBoneData.Name = engineBinaryReader.ReadString(); modelBoneData.Transform = engineBinaryReader.ReadMatrix(); } modelData.Meshes.Capacity = engineBinaryReader.ReadInt32(); for (int j = 0; j < modelData.Meshes.Capacity; j++) { ModelMeshData modelMeshData = new ModelMeshData(); modelData.Meshes.Add(modelMeshData); modelMeshData.ParentBoneIndex = engineBinaryReader.ReadInt32(); modelMeshData.Name = engineBinaryReader.ReadString(); modelMeshData.MeshParts.Capacity = engineBinaryReader.ReadInt32(); modelMeshData.BoundingBox = engineBinaryReader.ReadBoundingBox(); for (int k = 0; k < modelMeshData.MeshParts.Capacity; k++) { ModelMeshPartData modelMeshPartData = new ModelMeshPartData(); modelMeshData.MeshParts.Add(modelMeshPartData); modelMeshPartData.BuffersDataIndex = engineBinaryReader.ReadInt32(); modelMeshPartData.StartIndex = engineBinaryReader.ReadInt32(); modelMeshPartData.IndicesCount = engineBinaryReader.ReadInt32(); modelMeshPartData.BoundingBox = engineBinaryReader.ReadBoundingBox(); } } modelData.Buffers.Capacity = engineBinaryReader.ReadInt32(); for (int l = 0; l < modelData.Buffers.Capacity; l++) { ModelBuffersData modelBuffersData = new ModelBuffersData(); modelData.Buffers.Add(modelBuffersData); VertexElement[] array = new VertexElement[engineBinaryReader.ReadInt32()]; for (int m = 0; m < array.Length; m++) { array[m] = new VertexElement(engineBinaryReader.ReadInt32(), (VertexElementFormat)engineBinaryReader.ReadInt32(), engineBinaryReader.ReadString()); } modelBuffersData.VertexDeclaration = new VertexDeclaration(array); modelBuffersData.Vertices = engineBinaryReader.ReadBytes(engineBinaryReader.ReadInt32()); modelBuffersData.Indices = engineBinaryReader.ReadBytes(engineBinaryReader.ReadInt32()); } return(modelData); }
internal void Initialize(ModelData modelData, bool keepSourceVertexDataInTags) { if (modelData == null) { throw new ArgumentNullException("modelData"); } InternalDispose(); VertexBuffer[] array = new VertexBuffer[modelData.Buffers.Count]; IndexBuffer[] array2 = new IndexBuffer[modelData.Buffers.Count]; for (int i = 0; i < modelData.Buffers.Count; i++) { ModelBuffersData modelBuffersData = modelData.Buffers[i]; array[i] = new VertexBuffer(modelBuffersData.VertexDeclaration, modelBuffersData.Vertices.Length / modelBuffersData.VertexDeclaration.VertexStride); array[i].SetData(modelBuffersData.Vertices, 0, modelBuffersData.Vertices.Length); array2[i] = new IndexBuffer(IndexFormat.SixteenBits, modelBuffersData.Indices.Length / 2); array2[i].SetData(modelBuffersData.Indices, 0, modelBuffersData.Indices.Length); if (keepSourceVertexDataInTags) { array[i].Tag = modelBuffersData.Vertices; array2[i].Tag = modelBuffersData.Indices; } } foreach (ModelBoneData bone in modelData.Bones) { NewBone(bone.Name, bone.Transform, (bone.ParentBoneIndex >= 0) ? m_bones[bone.ParentBoneIndex] : null); } foreach (ModelMeshData mesh in modelData.Meshes) { ModelMesh modelMesh = NewMesh(mesh.Name, m_bones[mesh.ParentBoneIndex], mesh.BoundingBox); m_meshes.Add(modelMesh); foreach (ModelMeshPartData meshPart in mesh.MeshParts) { modelMesh.NewMeshPart(array[meshPart.BuffersDataIndex], array2[meshPart.BuffersDataIndex], meshPart.StartIndex, meshPart.IndicesCount, meshPart.BoundingBox); } } }