From 5f1721fe14325294f2b04cb00eb6afc76beb6032 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 10 Dec 2023 14:52:49 -0500 Subject: [PATCH] Begin work on supporting writing different vertex counts --- src/model.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/model.rs b/src/model.rs index 2c04f51..3e3c37a 100755 --- a/src/model.rs +++ b/src/model.rs @@ -340,6 +340,7 @@ pub struct MDL { file_header: ModelFileHeader, vertex_declarations: Vec, model_data: ModelData, + header_offset: u64, pub lods: Vec, pub affected_bone_names: Vec, @@ -573,6 +574,7 @@ impl MDL { file_header: model_file_header, vertex_declarations, model_data: model, + header_offset, lods, affected_bone_names, material_names @@ -588,6 +590,63 @@ impl MDL { // Update vertex count in header self.model_data.meshes[part.mesh_index as usize].vertex_count = part.vertices.len() as u16; self.model_data.meshes[part.mesh_index as usize].index_count = part.indices.len() as u16 as u32; + + // update values + for i in 0..self.file_header.lod_count { + let mut vertex_offset = 0; + + for j in self.model_data.lods[i as usize].mesh_index + ..self.model_data.lods[i as usize].mesh_index + self.model_data.lods[i as usize].mesh_count + { + let mesh = &mut self.model_data.meshes[j as usize]; + + for i in 0..mesh.vertex_stream_count as usize { + mesh.vertex_buffer_offsets[i] = vertex_offset; + vertex_offset += mesh.vertex_count as u32 * mesh.vertex_buffer_strides[i] as u32; + } + } + } + + for lod in &mut self.model_data.lods { + let mut total_vertex_buffer_size = 0; + + // still slightly off? + for j in lod.mesh_index + ..lod.mesh_index + lod.mesh_count + { + let vertex_count = self.model_data.meshes[j as usize].vertex_count; + + let mut total_vertex_stride: u32 = 0; + for i in 0..self.model_data.meshes[j as usize].vertex_stream_count as usize { + total_vertex_stride += self.model_data.meshes[j as usize].vertex_buffer_strides[i] as u32; + } + + total_vertex_buffer_size += vertex_count as u32 * total_vertex_stride; + } + + lod.vertex_buffer_size = total_vertex_buffer_size; // sizeof Vertex + } + + // update lod values + let mut data_offset = self.header_offset as u32; + + for lod in &mut self.model_data.lods { + lod.vertex_data_offset = data_offset; + + data_offset = lod.vertex_data_offset + lod.vertex_buffer_size; + + lod.index_data_offset = data_offset; + + data_offset = lod.index_data_offset + lod.index_buffer_size; + } + + for i in 0..self.lods.len() { + self.file_header.vertex_buffer_size[i] = self.model_data.lods[i].vertex_buffer_size; + } + + for i in 0..self.lods.len() { + self.file_header.vertex_offsets[i] = self.model_data.lods[i].vertex_data_offset; + } } pub fn write_to_buffer(&self) -> Option {