calculate mesh size and plumb it through to compose with the transform

This commit is contained in:
Quaternions 2024-03-13 11:44:45 -07:00
parent f4f9bb47a7
commit 0c5f47d1af

View File

@ -727,7 +727,10 @@ where
deferred_models_deferred_attributes, deferred_models_deferred_attributes,
} }
} }
struct MeshWithAabb{
mesh:model::Mesh,
aabb:strafesnet_common::aabb::Aabb,
}
pub struct PartialMap1{ pub struct PartialMap1{
primitive_meshes:Vec<model::Mesh>, primitive_meshes:Vec<model::Mesh>,
primitive_models_deferred_attributes:Vec<ModelDeferredAttributes>, primitive_models_deferred_attributes:Vec<ModelDeferredAttributes>,
@ -748,10 +751,19 @@ impl PartialMap1{
//decode roblox meshes //decode roblox meshes
//generate mesh_id_map based on meshes that failed to load //generate mesh_id_map based on meshes that failed to load
let loaded_meshes:HashMap<model::MeshId,model::Mesh>= let loaded_meshes:HashMap<model::MeshId,MeshWithAabb>=
meshpart_meshes.into_iter().flat_map(|(old_mesh_id,roblox_mesh_bytes)| meshpart_meshes.into_iter().flat_map(|(old_mesh_id,roblox_mesh_bytes)|
match crate::mesh::convert(roblox_mesh_bytes){ match crate::mesh::convert(roblox_mesh_bytes){
Ok(mesh)=>Some((old_mesh_id,mesh)), Ok(mesh)=>{
let mut aabb=strafesnet_common::aabb::Aabb::default();
for &pos in &mesh.unique_pos{
aabb.grow(pos);
}
Some((old_mesh_id,MeshWithAabb{
mesh,
aabb,
}))
},
Err(e)=>{ Err(e)=>{
println!("Error converting mesh: {e:?}"); println!("Error converting mesh: {e:?}");
None None
@ -762,11 +774,11 @@ impl PartialMap1{
let mut mesh_id_from_render_config_id=HashMap::new(); let mut mesh_id_from_render_config_id=HashMap::new();
//ignore meshes that fail to load completely for now //ignore meshes that fail to load completely for now
let mut acquire_mesh_id_from_render_config_id=|old_mesh_id,render|{ let mut acquire_mesh_id_from_render_config_id=|old_mesh_id,render|{
loaded_meshes.get(&old_mesh_id).map(|mesh| loaded_meshes.get(&old_mesh_id).map(|mesh_with_aabb|(
*mesh_id_from_render_config_id.entry(old_mesh_id).or_insert_with(||HashMap::new()) *mesh_id_from_render_config_id.entry(old_mesh_id).or_insert_with(||HashMap::new())
.entry(render).or_insert_with(||{ .entry(render).or_insert_with(||{
let mesh_id=model::MeshId::new(self.primitive_meshes.len() as u32); let mesh_id=model::MeshId::new(self.primitive_meshes.len() as u32);
let mut mesh_clone=mesh.clone(); let mut mesh_clone=mesh_with_aabb.mesh.clone();
//add a render group lool //add a render group lool
mesh_clone.graphics_groups.push(model::IndexedGraphicsGroup{ mesh_clone.graphics_groups.push(model::IndexedGraphicsGroup{
render, render,
@ -775,22 +787,32 @@ impl PartialMap1{
}); });
self.primitive_meshes.push(mesh_clone); self.primitive_meshes.push(mesh_clone);
mesh_id mesh_id
}) }),
) &mesh_with_aabb.aabb,
))
}; };
//now that the meshes are loaded, these models can be generated //now that the meshes are loaded, these models can be generated
let models_owned_attributes:Vec<ModelOwnedAttributes>= let models_owned_attributes:Vec<ModelOwnedAttributes>=
self.deferred_models_deferred_attributes.into_iter().flat_map(|deferred_model_deferred_attributes|{ self.deferred_models_deferred_attributes.into_iter().flat_map(|deferred_model_deferred_attributes|{
//meshes need to be cloned from loaded_meshes with a new id when they are used with a new render_id //meshes need to be cloned from loaded_meshes with a new id when they are used with a new render_id
//insert into primitive_meshes //insert into primitive_meshes
Some(ModelDeferredAttributes{ let (mesh,aabb)=acquire_mesh_id_from_render_config_id(
mesh:acquire_mesh_id_from_render_config_id(
deferred_model_deferred_attributes.model.mesh, deferred_model_deferred_attributes.model.mesh,
deferred_model_deferred_attributes.render deferred_model_deferred_attributes.render
)?, )?;
let size=aabb.size();
Some(ModelDeferredAttributes{
mesh,
deferred_attributes:deferred_model_deferred_attributes.model.deferred_attributes, deferred_attributes:deferred_model_deferred_attributes.model.deferred_attributes,
color:deferred_model_deferred_attributes.model.color, color:deferred_model_deferred_attributes.model.color,
transform:deferred_model_deferred_attributes.model.transform, transform:Planar64Affine3::new(
Planar64Mat3::from_cols(
deferred_model_deferred_attributes.model.transform.matrix3.x_axis*2/size.x(),
deferred_model_deferred_attributes.model.transform.matrix3.y_axis*2/size.y(),
deferred_model_deferred_attributes.model.transform.matrix3.z_axis*2/size.z()
),
deferred_model_deferred_attributes.model.transform.translation
),
}) })
}).chain(self.primitive_models_deferred_attributes.into_iter()) }).chain(self.primitive_models_deferred_attributes.into_iter())
.enumerate().map(|(model_id,model_deferred_attributes)|{ .enumerate().map(|(model_id,model_deferred_attributes)|{