wip: actually unions not fake

This commit is contained in:
2025-01-28 15:06:20 -08:00
parent 15e9592897
commit 1464c2442d

@ -487,9 +487,10 @@ enum Shape{
MeshPart, MeshPart,
PhysicsData, PhysicsData,
} }
enum MeshAvailability{ enum MeshAvailability<'a>{
Immediate, Immediate,
Deferred(RenderConfigId), DeferredMesh(RenderConfigId),
DeferredUnion(RobloxPartDescription,UnionDeferredAttributes<'a>),
} }
struct DeferredModelDeferredAttributes{ struct DeferredModelDeferredAttributes{
render:RenderConfigId, render:RenderConfigId,
@ -501,6 +502,17 @@ struct ModelDeferredAttributes{
color:model::Color4,//transparency is in here color:model::Color4,//transparency is in here
transform:Planar64Affine3, transform:Planar64Affine3,
} }
struct DeferredUnionDeferredAttributes<'a>{
render:RobloxPartDescription,
model:ModelDeferredAttributes,
union:UnionDeferredAttributes<'a>,
}
#[derive(Hash)]
struct UnionDeferredAttributes<'a>{
asset_id:Option<&'a str>,
mesh_data:Option<&'a [u8]>,
physics_data:Option<&'a [u8]>,
}
struct ModelOwnedAttributes{ struct ModelOwnedAttributes{
mesh:model::MeshId, mesh:model::MeshId,
attributes:attr::CollisionAttributes, attributes:attr::CollisionAttributes,
@ -512,21 +524,21 @@ struct GetAttributesArgs{
can_collide:bool, can_collide:bool,
velocity:Planar64Vec3, velocity:Planar64Vec3,
} }
pub fn convert<AcquireRenderConfigId,AcquireMeshId>( pub fn convert<'a,AcquireRenderConfigId,AcquireMeshId>(
dom:&rbx_dom_weak::WeakDom, dom:&'a rbx_dom_weak::WeakDom,
mut acquire_render_config_id:AcquireRenderConfigId, mut acquire_render_config_id:AcquireRenderConfigId,
mut acquire_mesh_id:AcquireMeshId, mut acquire_mesh_id:AcquireMeshId,
)->PartialMap1 )->PartialMap1<'a>
where where
AcquireRenderConfigId:FnMut(Option<&str>)->model::RenderConfigId, AcquireRenderConfigId:FnMut(Option<&str>)->model::RenderConfigId,
AcquireMeshId:FnMut(&str)->model::MeshId, AcquireMeshId:FnMut(&str)->model::MeshId,
{ {
let mut deferred_unions_deferred_attributes=Vec::new();
let mut deferred_models_deferred_attributes=Vec::new(); let mut deferred_models_deferred_attributes=Vec::new();
let mut primitive_models_deferred_attributes=Vec::new(); let mut primitive_models_deferred_attributes=Vec::new();
let mut primitive_meshes=Vec::new(); let mut primitive_meshes=Vec::new();
let mut mesh_id_from_description=HashMap::new(); let mut mesh_id_from_description=HashMap::new();
let mut mesh_id_from_physics_data=HashMap::<&[u8],_>::new();
//just going to leave it like this for now instead of reworking the data structures for this whole thing //just going to leave it like this for now instead of reworking the data structures for this whole thing
let textureless_render_group=acquire_render_config_id(None); let textureless_render_group=acquire_render_config_id(None);
@ -707,7 +719,7 @@ where
object.properties.get("TextureID"), object.properties.get("TextureID"),
){ ){
( (
MeshAvailability::Deferred(acquire_render_config_id(Some(texture_asset_id.as_ref()))), MeshAvailability::DeferredMesh(acquire_render_config_id(Some(texture_asset_id.as_ref()))),
acquire_mesh_id(mesh_asset_id.as_ref()), acquire_mesh_id(mesh_asset_id.as_ref()),
) )
}else{ }else{
@ -716,37 +728,26 @@ where
Shape::PhysicsData=>{ Shape::PhysicsData=>{
//The union mesh is sized already //The union mesh is sized already
model_transform=planar64_affine3_from_roblox(cf,&rbx_dom_weak::types::Vector3{x:2.0,y:2.0,z:2.0}); model_transform=planar64_affine3_from_roblox(cf,&rbx_dom_weak::types::Vector3{x:2.0,y:2.0,z:2.0});
if let Some(rbx_dom_weak::types::Variant::BinaryString(data))=object.properties.get("PhysicsData"){
let physics_data=data.as_ref(); let mut asset_id=None;
let mesh_id=if let Some(&mesh_id)=mesh_id_from_physics_data.get(physics_data){ let mut mesh_data=None;
mesh_id let mut physics_data=None;
}else{ if let Some(rbx_dom_weak::types::Variant::Content(content))=object.properties.get("AssetId"){
match crate::union::convert(physics_data){ asset_id=Some(content.as_ref());
Ok(mesh)=>{
let mesh_id=model::MeshId::new(primitive_meshes.len() as u32);
primitive_meshes.push(mesh);
mesh_id_from_physics_data.insert(physics_data,mesh_id);
mesh_id
},
Err(e)=>{
model_transform=planar64_affine3_from_roblox(cf,size);
if !matches!(e,crate::union::Error::Block){
println!("Union mesh decode error {e:?}");
}
*mesh_id_from_description.entry(RobloxBasePartDescription::Part(RobloxPartDescription::default()))
.or_insert_with(||{
let mesh_id=model::MeshId::new(primitive_meshes.len() as u32);
let mesh=primitives::unit_cube(textureless_render_group);
primitive_meshes.push(mesh);
mesh_id
})
},
}
};
(MeshAvailability::Immediate,mesh_id)
}else{
panic!("Mesh has no Mesh or Texture");
} }
if let Some(rbx_dom_weak::types::Variant::BinaryString(data))=object.properties.get("MeshData"){
mesh_data=Some(data.as_ref());
}
if let Some(rbx_dom_weak::types::Variant::BinaryString(data))=object.properties.get("PhysicsData"){
physics_data=Some(data.as_ref());
}
let part_texture_description=get_texture_description(&mut temp_objects,&mut acquire_render_config_id,dom,object,size);
let union_deferred_attributes=UnionDeferredAttributes{
asset_id,
mesh_data,
physics_data,
};
(MeshAvailability::DeferredUnion(part_texture_description,union_deferred_attributes),mesh_id)
}, },
}; };
let model_deferred_attributes=ModelDeferredAttributes{ let model_deferred_attributes=ModelDeferredAttributes{
@ -761,10 +762,15 @@ where
}; };
match availability{ match availability{
MeshAvailability::Immediate=>primitive_models_deferred_attributes.push(model_deferred_attributes), MeshAvailability::Immediate=>primitive_models_deferred_attributes.push(model_deferred_attributes),
MeshAvailability::Deferred(render)=>deferred_models_deferred_attributes.push(DeferredModelDeferredAttributes{ MeshAvailability::DeferredMesh(render)=>deferred_models_deferred_attributes.push(DeferredModelDeferredAttributes{
render, render,
model:model_deferred_attributes model:model_deferred_attributes
}), }),
MeshAvailability::DeferredUnion(part_texture_description,union_deferred_attributes)=>deferred_unions_deferred_attributes.push(DeferredUnionDeferredAttributes{
render:part_texture_description,
model:model_deferred_attributes,
union:union_deferred_attributes,
}),
} }
} }
} }
@ -779,10 +785,11 @@ struct MeshWithAabb{
mesh:model::Mesh, mesh:model::Mesh,
aabb:strafesnet_common::aabb::Aabb, aabb:strafesnet_common::aabb::Aabb,
} }
pub struct PartialMap1{ pub struct PartialMap1<'a>{
primitive_meshes:Vec<model::Mesh>, primitive_meshes:Vec<model::Mesh>,
primitive_models_deferred_attributes:Vec<ModelDeferredAttributes>, primitive_models_deferred_attributes:Vec<ModelDeferredAttributes>,
deferred_models_deferred_attributes:Vec<DeferredModelDeferredAttributes>, deferred_models_deferred_attributes:Vec<DeferredModelDeferredAttributes>,
deferred_union_deferred_attributes:Vec<DeferredModelDeferredAttributes>,
} }
impl PartialMap1{ impl PartialMap1{
pub fn add_meshpart_meshes_and_calculate_attributes( pub fn add_meshpart_meshes_and_calculate_attributes(