diff --git a/lib/rbx_loader/src/union.rs b/lib/rbx_loader/src/union.rs index 1324d46f..f11f375d 100644 --- a/lib/rbx_loader/src/union.rs +++ b/lib/rbx_loader/src/union.rs @@ -84,6 +84,15 @@ pub fn convert( rbx_mesh::mesh_data::MeshData::CSGMDL(rbx_mesh::mesh_data::CSGMDL::CSGMDL2(mesh_data2))=>mesh_data2.mesh, rbx_mesh::mesh_data::MeshData::CSGMDL(rbx_mesh::mesh_data::CSGMDL::CSGMDL4(mesh_data4))=>mesh_data4.mesh, }; + //autoscale to size, idk what roblox is doing with the graphics mesh size + let mut pos_min=glam::Vec3::MAX; + let mut pos_max=glam::Vec3::MIN; + for vertex in &graphics_mesh.vertices{ + let p=vertex.pos.into(); + pos_min=pos_min.min(p); + pos_max=pos_max.max(p); + } + let graphics_size=pos_max-pos_min; for [MeshDataVertexId(vertex_id0),MeshDataVertexId(vertex_id1),MeshDataVertexId(vertex_id2)] in graphics_mesh.faces{ let face=[ graphics_mesh.vertices.get(vertex_id0 as usize).ok_or(Error::MissingVertexId(vertex_id0))?, @@ -93,7 +102,8 @@ pub fn convert( let mut normal_agreement_checker=MeshDataNormalChecker::new(); let face=face.into_iter().map(|vertex|{ normal_agreement_checker.check(vertex.normal_id); - let pos=mb.acquire_pos_id(vec3::try_from_f32_array(vertex.pos)?); + let pos=glam::Vec3::from_array(vertex.pos)/graphics_size; + let pos=mb.acquire_pos_id(vec3::try_from_f32_array(pos.to_array())?); let normal=mb.acquire_normal_id(vec3::try_from_f32_array(vertex.norm)?); let tex_coord=glam::Vec2::from_array(vertex.tex); let maybe_face_description=&cube_face_description[vertex.normal_id as usize-1];