store typed id directly in hashmaps

This commit is contained in:
Quaternions 2025-01-28 14:23:22 -08:00
parent 012d2d1837
commit 926e57790e

@ -47,42 +47,42 @@ pub fn convert(roblox_physics_data:&[u8])->Result<model::Mesh,Error>{
let mut vertex_id_from=HashMap::new(); let mut vertex_id_from=HashMap::new();
let mut acquire_pos_id=|pos|{ let mut acquire_pos_id=|pos|{
let p=vec3::try_from_f32_array(pos).map_err(Error::Planar64Vec3)?; let p=vec3::try_from_f32_array(pos).map_err(Error::Planar64Vec3)?;
Ok(PositionId::new(*pos_id_from.entry(p).or_insert_with(||{ Ok(*pos_id_from.entry(p).or_insert_with(||{
let pos_id=unique_pos.len(); let pos_id=PositionId::new(unique_pos.len() as u32);
unique_pos.push(p); unique_pos.push(p);
pos_id pos_id
}) as u32)) }))
}; };
let mut acquire_tex_id=|tex|{ let mut acquire_tex_id=|tex|{
let h=bytemuck::cast::<[f32;2],[u32;2]>(tex); let h=bytemuck::cast::<[f32;2],[u32;2]>(tex);
TextureCoordinateId::new(*tex_id_from.entry(h).or_insert_with(||{ *tex_id_from.entry(h).or_insert_with(||{
let tex_id=unique_tex.len(); let tex_id=TextureCoordinateId::new(unique_tex.len() as u32);
unique_tex.push(glam::Vec2::from_array(tex)); unique_tex.push(glam::Vec2::from_array(tex));
tex_id tex_id
}) as u32) })
}; };
let mut acquire_normal_id=|normal|{ let mut acquire_normal_id=|normal|{
let n=vec3::try_from_f32_array(normal).map_err(Error::Planar64Vec3)?; let n=vec3::try_from_f32_array(normal).map_err(Error::Planar64Vec3)?;
Ok(NormalId::new(*normal_id_from.entry(n).or_insert_with(||{ Ok(*normal_id_from.entry(n).or_insert_with(||{
let normal_id=unique_normal.len(); let normal_id=NormalId::new(unique_normal.len() as u32);
unique_normal.push(n); unique_normal.push(n);
normal_id normal_id
}) as u32)) }))
}; };
let mut acquire_color_id=|color|{ let mut acquire_color_id=|color|{
let h=bytemuck::cast::<[f32;4],[u32;4]>(color); let h=bytemuck::cast::<[f32;4],[u32;4]>(color);
ColorId::new(*color_id_from.entry(h).or_insert_with(||{ *color_id_from.entry(h).or_insert_with(||{
let color_id=unique_color.len(); let color_id=ColorId::new(unique_color.len() as u32);
unique_color.push(glam::Vec4::from_array(color)); unique_color.push(glam::Vec4::from_array(color));
color_id color_id
}) as u32) })
}; };
let mut acquire_vertex_id=|vertex:IndexedVertex|{ let mut acquire_vertex_id=|vertex:IndexedVertex|{
VertexId::new(*vertex_id_from.entry(vertex.clone()).or_insert_with(||{ *vertex_id_from.entry(vertex.clone()).or_insert_with(||{
let vertex_id=unique_vertices.len(); let vertex_id=VertexId::new(unique_vertices.len() as u32);
unique_vertices.push(vertex); unique_vertices.push(vertex);
vertex_id vertex_id
}) as u32) })
}; };
let color=acquire_color_id([1.0f32;4]); let color=acquire_color_id([1.0f32;4]);
let tex=acquire_tex_id([0.0f32;2]); let tex=acquire_tex_id([0.0f32;2]);