holy smokes
This commit is contained in:
parent
1d20fb2c23
commit
fe1313c70f
@ -150,13 +150,13 @@ pub fn convert(roblox_mesh_bytes:crate::data::RobloxMeshBytes)->Result<model::Me
|
|||||||
rbx_mesh::mesh::VersionedMesh::Version1(mesh)=>{
|
rbx_mesh::mesh::VersionedMesh::Version1(mesh)=>{
|
||||||
let color_id=acquire_color_id([1.0f32;4]);
|
let color_id=acquire_color_id([1.0f32;4]);
|
||||||
polygon_groups.push(PolygonGroup::PolygonList(PolygonList::new(mesh.vertices.chunks_exact(3).map(|trip|{
|
polygon_groups.push(PolygonGroup::PolygonList(PolygonList::new(mesh.vertices.chunks_exact(3).map(|trip|{
|
||||||
let mut ingest_vertex1=|vertex:rbx_mesh::mesh::Vertex1|Ok(acquire_vertex_id(IndexedVertex{
|
let mut ingest_vertex1=|vertex:&rbx_mesh::mesh::Vertex1|Ok(acquire_vertex_id(IndexedVertex{
|
||||||
pos:acquire_pos_id(vertex.pos)?,
|
pos:acquire_pos_id(vertex.pos)?,
|
||||||
tex:acquire_tex_id([vertex.tex[0],vertex.tex[1]]),
|
tex:acquire_tex_id([vertex.tex[0],vertex.tex[1]]),
|
||||||
normal:acquire_normal_id(vertex.norm)?,
|
normal:acquire_normal_id(vertex.norm)?,
|
||||||
color:color_id,
|
color:color_id,
|
||||||
}));
|
}));
|
||||||
Ok(vec![ingest_vertex1(trip[0])?,ingest_vertex1(trip[1])?,ingest_vertex1(trip[2])?])
|
Ok(vec![ingest_vertex1(&trip[0])?,ingest_vertex1(&trip[1])?,ingest_vertex1(&trip[2])?])
|
||||||
}).collect::<Result<_,_>>()?)));
|
}).collect::<Result<_,_>>()?)));
|
||||||
},
|
},
|
||||||
rbx_mesh::mesh::VersionedMesh::Version2(mesh)=>{
|
rbx_mesh::mesh::VersionedMesh::Version2(mesh)=>{
|
||||||
|
38
src/rbx.rs
38
src/rbx.rs
@ -706,7 +706,7 @@ where
|
|||||||
transform:model_transform,
|
transform:model_transform,
|
||||||
color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency),
|
color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency),
|
||||||
deferred_attributes:GetAttributesArgs{
|
deferred_attributes:GetAttributesArgs{
|
||||||
name:object.name.into(),
|
name:object.name.as_str().into(),
|
||||||
can_collide:*can_collide,
|
can_collide:*can_collide,
|
||||||
velocity:Planar64Vec3::try_from([velocity.x,velocity.y,velocity.z]).unwrap(),
|
velocity:Planar64Vec3::try_from([velocity.x,velocity.y,velocity.z]).unwrap(),
|
||||||
},
|
},
|
||||||
@ -735,7 +735,7 @@ pub struct PartialMap1{
|
|||||||
}
|
}
|
||||||
impl PartialMap1{
|
impl PartialMap1{
|
||||||
pub fn add_meshpart_meshes_and_calculate_attributes<AcquireRenderConfigId>(
|
pub fn add_meshpart_meshes_and_calculate_attributes<AcquireRenderConfigId>(
|
||||||
self,
|
mut self,
|
||||||
meshpart_meshes:impl IntoIterator<Item=(model::MeshId,crate::data::RobloxMeshBytes)>,
|
meshpart_meshes:impl IntoIterator<Item=(model::MeshId,crate::data::RobloxMeshBytes)>,
|
||||||
)->PartialMap2
|
)->PartialMap2
|
||||||
where
|
where
|
||||||
@ -761,13 +761,31 @@ impl PartialMap1{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
).collect();
|
).collect();
|
||||||
|
|
||||||
|
let mut mesh_id_from_render_config_id=HashMap::new();
|
||||||
|
let mut acquire_mesh_id_from_render_config_id=|old_mesh_id,render|{
|
||||||
|
let mesh=&loaded_meshes[&old_mesh_id];
|
||||||
|
*mesh_id_from_render_config_id.entry(old_mesh_id).or_insert_with(||HashMap::new())
|
||||||
|
.entry(render).or_insert_with(||{
|
||||||
|
let mesh_id=model::MeshId::new(self.primitive_meshes.len() as u32);
|
||||||
|
let mut mesh_clone=mesh.clone();
|
||||||
|
//add a render group lool
|
||||||
|
mesh_clone.graphics_groups.push(model::IndexedGraphicsGroup{
|
||||||
|
render,
|
||||||
|
//guess that highest lod is highest quality
|
||||||
|
groups:vec![model::PolygonGroupId::new(mesh_clone.polygon_groups.len() as u32)]
|
||||||
|
});
|
||||||
|
self.primitive_meshes.push(mesh_clone);
|
||||||
|
mesh_id
|
||||||
|
})
|
||||||
|
};
|
||||||
//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=self.deferred_models_deferred_attributes.into_iter().map(|deferred_model_deferred_attributes|{
|
let models_owned_attributes:Vec<ModelOwnedAttributes>=
|
||||||
let render=deferred_model_deferred_attributes.render;
|
self.deferred_models_deferred_attributes.into_iter().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
|
||||||
ModelDeferredAttributes{
|
ModelDeferredAttributes{
|
||||||
mesh:deferred_model_deferred_attributes.model.mesh,
|
mesh:acquire_mesh_id_from_render_config_id(deferred_model_deferred_attributes.model.mesh,deferred_model_deferred_attributes.render),
|
||||||
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:deferred_model_deferred_attributes.model.transform,
|
||||||
@ -797,7 +815,7 @@ impl PartialMap1{
|
|||||||
//TODO: errors/prints
|
//TODO: errors/prints
|
||||||
if let Some(wormhole_id)=wormhole_in_model_to_id.get(&model_id){
|
if let Some(wormhole_id)=wormhole_in_model_to_id.get(&model_id){
|
||||||
if let Some(&wormhole_out_model_id)=wormhole_id_to_out_model.get(wormhole_id){
|
if let Some(&wormhole_out_model_id)=wormhole_id_to_out_model.get(wormhole_id){
|
||||||
match &mut model_owned_attributes.deferred_attributes{
|
match &mut model_owned_attributes.attributes{
|
||||||
attr::CollisionAttributes::Contact{contacting:_,general}
|
attr::CollisionAttributes::Contact{contacting:_,general}
|
||||||
|attr::CollisionAttributes::Intersect{intersecting:_,general}
|
|attr::CollisionAttributes::Intersect{intersecting:_,general}
|
||||||
=>general.wormhole=Some(attr::Wormhole{destination_model:wormhole_out_model_id}),
|
=>general.wormhole=Some(attr::Wormhole{destination_model:wormhole_out_model_id}),
|
||||||
@ -807,12 +825,12 @@ impl PartialMap1{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//index the attributes
|
//index the attributes
|
||||||
let attributes_id=if let Some(&attributes_id)=attributes_id_from_attributes.get(&model_owned_attributes.deferred_attributes){
|
let attributes_id=if let Some(&attributes_id)=attributes_id_from_attributes.get(&model_owned_attributes.attributes){
|
||||||
attributes_id
|
attributes_id
|
||||||
}else{
|
}else{
|
||||||
let attributes_id=attr::CollisionAttributesId::new(unique_attributes.len() as u32);
|
let attributes_id=attr::CollisionAttributesId::new(unique_attributes.len() as u32);
|
||||||
attributes_id_from_attributes.insert(model_owned_attributes.deferred_attributes.clone(),attributes_id);
|
attributes_id_from_attributes.insert(model_owned_attributes.attributes.clone(),attributes_id);
|
||||||
unique_attributes.push(model_owned_attributes.deferred_attributes);
|
unique_attributes.push(model_owned_attributes.attributes);
|
||||||
attributes_id
|
attributes_id
|
||||||
};
|
};
|
||||||
model::Model{
|
model::Model{
|
||||||
@ -823,7 +841,7 @@ impl PartialMap1{
|
|||||||
}
|
}
|
||||||
}).collect();
|
}).collect();
|
||||||
PartialMap2{
|
PartialMap2{
|
||||||
meshes,
|
meshes:self.primitive_meshes,
|
||||||
models,
|
models,
|
||||||
modes:modes_builder.build(),
|
modes:modes_builder.build(),
|
||||||
attributes:unique_attributes,
|
attributes:unique_attributes,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user