wip: actually unions not fake
This commit is contained in:
@ -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(
|
||||||
|
Reference in New Issue
Block a user