mirror of
https://github.com/redstrate/Physis.git
synced 2025-04-24 21:37:46 +00:00
Begin work on supporting writing different vertex counts
This commit is contained in:
parent
fc2d2f73cf
commit
5f1721fe14
1 changed files with 59 additions and 0 deletions
59
src/model.rs
59
src/model.rs
|
@ -340,6 +340,7 @@ pub struct MDL {
|
||||||
file_header: ModelFileHeader,
|
file_header: ModelFileHeader,
|
||||||
vertex_declarations: Vec<VertexDeclaration>,
|
vertex_declarations: Vec<VertexDeclaration>,
|
||||||
model_data: ModelData,
|
model_data: ModelData,
|
||||||
|
header_offset: u64,
|
||||||
|
|
||||||
pub lods: Vec<Lod>,
|
pub lods: Vec<Lod>,
|
||||||
pub affected_bone_names: Vec<String>,
|
pub affected_bone_names: Vec<String>,
|
||||||
|
@ -573,6 +574,7 @@ impl MDL {
|
||||||
file_header: model_file_header,
|
file_header: model_file_header,
|
||||||
vertex_declarations,
|
vertex_declarations,
|
||||||
model_data: model,
|
model_data: model,
|
||||||
|
header_offset,
|
||||||
lods,
|
lods,
|
||||||
affected_bone_names,
|
affected_bone_names,
|
||||||
material_names
|
material_names
|
||||||
|
@ -588,6 +590,63 @@ impl MDL {
|
||||||
// Update vertex count in header
|
// 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].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;
|
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<ByteBuffer> {
|
pub fn write_to_buffer(&self) -> Option<ByteBuffer> {
|
||||||
|
|
Loading…
Add table
Reference in a new issue