This commit is contained in:
Quaternions 2024-03-09 10:47:29 -08:00
parent a103a3c034
commit 118ce9b239
2 changed files with 73 additions and 19 deletions

@ -31,6 +31,14 @@ pub fn read<R:Read>(input:R)->Result<Dom,ReadError>{
//ConvertError //ConvertError
pub fn convert<F:FnMut(Option<&str>)->strafesnet_common::model::RenderConfigId>(dom:&Dom,acquire_render_config_id:F)->rbx::PartialMap1{ pub fn convert<AcquireRenderConfigId,AcquireMeshId>(
rbx::convert(&dom.0,acquire_render_config_id) dom:&Dom,
acquire_render_config_id:AcquireRenderConfigId,
acquire_mesh_id:AcquireMeshId
)->rbx::PartialMap1
where
AcquireRenderConfigId:FnMut(Option<&str>)->strafesnet_common::model::RenderConfigId,
AcquireMeshId:FnMut(&str)->strafesnet_common::model::MeshId,
{
rbx::convert(&dom.0,acquire_render_config_id,acquire_mesh_id)
} }

@ -397,12 +397,22 @@ type RobloxPartDescription=[Option<RobloxFaceTextureDescription>;6];
type RobloxWedgeDescription=[Option<RobloxFaceTextureDescription>;5]; type RobloxWedgeDescription=[Option<RobloxFaceTextureDescription>;5];
type RobloxCornerWedgeDescription=[Option<RobloxFaceTextureDescription>;5]; type RobloxCornerWedgeDescription=[Option<RobloxFaceTextureDescription>;5];
#[derive(Clone,Eq,Hash,PartialEq)] #[derive(Clone,Eq,Hash,PartialEq)]
struct RobloxMeshPartDescription{
render:RenderConfigId,
mesh:model::MeshId,
}
#[derive(Clone,Eq,Hash,PartialEq)]
enum RobloxBasePartDescription{ enum RobloxBasePartDescription{
Sphere(RobloxPartDescription), Sphere(RobloxPartDescription),
Part(RobloxPartDescription), Part(RobloxPartDescription),
Cylinder(RobloxPartDescription), Cylinder(RobloxPartDescription),
Wedge(RobloxWedgeDescription), Wedge(RobloxWedgeDescription),
CornerWedge(RobloxCornerWedgeDescription), CornerWedge(RobloxCornerWedgeDescription),
MeshPart(RobloxMeshPartDescription)
}
enum Shape{
Primitive(primitives::Primitives),
MeshPart,
} }
struct ModelOwnedAttributes{ struct ModelOwnedAttributes{
mesh:model::MeshId, mesh:model::MeshId,
@ -410,7 +420,15 @@ struct ModelOwnedAttributes{
color:model::Color4,//transparency is in here color:model::Color4,//transparency is in here
transform:Planar64Affine3, transform:Planar64Affine3,
} }
pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::WeakDom,mut acquire_render_config_id:F)->PartialMap1{ pub fn convert<AcquireRenderConfigId,AcquireMeshId>(
dom:&rbx_dom_weak::WeakDom,
mut acquire_render_config_id:AcquireRenderConfigId,
mut acquire_mesh_id:AcquireMeshId,
)->PartialMap1
where
AcquireRenderConfigId:FnMut(Option<&str>)->model::RenderConfigId,
AcquireMeshId:FnMut(&str)->model::MeshId,
{
let mut modes_builder=ModesBuilder::default(); let mut modes_builder=ModesBuilder::default();
let mut models1=Vec::new(); let mut models1=Vec::new();
@ -467,26 +485,29 @@ pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::
//TODO: also detect "CylinderMesh" etc here //TODO: also detect "CylinderMesh" etc here
let shape=match object.class.as_str(){ let shape=match object.class.as_str(){
"Part"=>if let Some(rbx_dom_weak::types::Variant::Enum(shape))=object.properties.get("Shape"){ "Part"=>if let Some(rbx_dom_weak::types::Variant::Enum(shape))=object.properties.get("Shape"){
match shape.to_u32(){ Shape::Primitive(match shape.to_u32(){
0=>primitives::Primitives::Sphere, 0=>primitives::Primitives::Sphere,
1=>primitives::Primitives::Cube, 1=>primitives::Primitives::Cube,
2=>primitives::Primitives::Cylinder, 2=>primitives::Primitives::Cylinder,
3=>primitives::Primitives::Wedge, 3=>primitives::Primitives::Wedge,
4=>primitives::Primitives::CornerWedge, 4=>primitives::Primitives::CornerWedge,
other=>panic!("Funky roblox PartType={};",other), other=>panic!("Funky roblox PartType={};",other),
} })
}else{ }else{
panic!("Part has no Shape!"); panic!("Part has no Shape!");
}, },
"TrussPart"=>primitives::Primitives::Cube, "TrussPart"=>Shape::Primitive(primitives::Primitives::Cube),
"WedgePart"=>primitives::Primitives::Wedge, "WedgePart"=>Shape::Primitive(primitives::Primitives::Wedge),
"CornerWedgePart"=>primitives::Primitives::CornerWedge, "CornerWedgePart"=>Shape::Primitive(primitives::Primitives::CornerWedge),
"MeshPart"=>Shape::MeshPart,
_=>{ _=>{
println!("Unsupported BasePart ClassName={}; defaulting to cube",object.class); println!("Unsupported BasePart ClassName={}; defaulting to cube",object.class);
primitives::Primitives::Cube Shape::Primitive(primitives::Primitives::Cube)
} }
}; };
let basepart_description=match shape{
Shape::Primitive(primitive_shape)=>{
//use the biggest one and cut it down later... //use the biggest one and cut it down later...
let mut part_texture_description:RobloxPartDescription=[None,None,None,None,None,None]; let mut part_texture_description:RobloxPartDescription=[None,None,None,None,None,None];
temp_objects.clear(); temp_objects.clear();
@ -549,7 +570,7 @@ pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::
transform:roblox_texture_transform, transform:roblox_texture_transform,
}); });
}else{ }else{
println!("NormalId={} unsupported for shape={:?}",normal_id,shape); println!("NormalId={} unsupported for shape={:?}",normal_id,primitive_shape);
} }
} }
} }
@ -563,7 +584,7 @@ pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::
f4,//Cube::Bottom f4,//Cube::Bottom
f5,//Cube::Front f5,//Cube::Front
]=part_texture_description; ]=part_texture_description;
let basepart_texture_description=match shape{ match primitive_shape{
primitives::Primitives::Sphere=>RobloxBasePartDescription::Sphere([f0,f1,f2,f3,f4,f5]), primitives::Primitives::Sphere=>RobloxBasePartDescription::Sphere([f0,f1,f2,f3,f4,f5]),
primitives::Primitives::Cube=>RobloxBasePartDescription::Part([f0,f1,f2,f3,f4,f5]), primitives::Primitives::Cube=>RobloxBasePartDescription::Part([f0,f1,f2,f3,f4,f5]),
primitives::Primitives::Cylinder=>RobloxBasePartDescription::Cylinder([f0,f1,f2,f3,f4,f5]), primitives::Primitives::Cylinder=>RobloxBasePartDescription::Cylinder([f0,f1,f2,f3,f4,f5]),
@ -583,15 +604,31 @@ pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::
f4,//Cube::Bottom->CornerWedge::Bottom f4,//Cube::Bottom->CornerWedge::Bottom
f5,//Cube::Front->CornerWedge::Front f5,//Cube::Front->CornerWedge::Front
]), ]),
}
},
Shape::MeshPart=>if let (
Some(rbx_dom_weak::types::Variant::Content(mesh_asset_id)),
Some(rbx_dom_weak::types::Variant::Content(texture_asset_id)),
)=(
object.properties.get("MeshId"),
object.properties.get("TextureID"),
){
RobloxBasePartDescription::MeshPart(RobloxMeshPartDescription{
render:acquire_render_config_id(Some(texture_asset_id.as_ref())),
mesh:acquire_mesh_id(mesh_asset_id.as_ref()),
})
}else{
panic!("Mesh has no Mesh or Texture");
},
}; };
//make new model if unit cube has not been created before //make new model if unit cube has not been created before
let indexed_model_id=if let Some(&indexed_model_id)=indexed_model_id_from_description.get(&basepart_texture_description){ let indexed_model_id=if let Some(&indexed_model_id)=indexed_model_id_from_description.get(&basepart_description){
//push to existing texture model //push to existing texture model
indexed_model_id indexed_model_id
}else{ }else{
let indexed_model_id=model::MeshId::new(meshes.len() as u32); let indexed_model_id=model::MeshId::new(meshes.len() as u32);
indexed_model_id_from_description.insert(basepart_texture_description.clone(),indexed_model_id);//borrow checker going crazy indexed_model_id_from_description.insert(basepart_description.clone(),indexed_model_id);//borrow checker going crazy
meshes.push(match basepart_texture_description{ let mesh_option=match basepart_description{
RobloxBasePartDescription::Sphere(part_texture_description) RobloxBasePartDescription::Sphere(part_texture_description)
|RobloxBasePartDescription::Cylinder(part_texture_description) |RobloxBasePartDescription::Cylinder(part_texture_description)
|RobloxBasePartDescription::Part(part_texture_description)=>{ |RobloxBasePartDescription::Part(part_texture_description)=>{
@ -612,7 +649,7 @@ pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::
None=>primitives::FaceDescription::new_with_render_id(textureless_render_group), None=>primitives::FaceDescription::new_with_render_id(textureless_render_group),
}); });
} }
primitives::generate_partial_unit_cube(cube_face_description) Some(primitives::generate_partial_unit_cube(cube_face_description))
}, },
RobloxBasePartDescription::Wedge(wedge_texture_description)=>{ RobloxBasePartDescription::Wedge(wedge_texture_description)=>{
let mut wedge_face_description=primitives::WedgeFaceDescription::default(); let mut wedge_face_description=primitives::WedgeFaceDescription::default();
@ -631,7 +668,7 @@ pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::
None=>primitives::FaceDescription::new_with_render_id(textureless_render_group), None=>primitives::FaceDescription::new_with_render_id(textureless_render_group),
}); });
} }
primitives::generate_partial_unit_wedge(wedge_face_description) Some(primitives::generate_partial_unit_wedge(wedge_face_description))
}, },
RobloxBasePartDescription::CornerWedge(cornerwedge_texture_description)=>{ RobloxBasePartDescription::CornerWedge(cornerwedge_texture_description)=>{
let mut cornerwedge_face_description=primitives::CornerWedgeFaceDescription::default(); let mut cornerwedge_face_description=primitives::CornerWedgeFaceDescription::default();
@ -650,10 +687,19 @@ pub fn convert<F:FnMut(Option<&str>)->model::RenderConfigId>(dom:&rbx_dom_weak::
None=>primitives::FaceDescription::new_with_render_id(textureless_render_group), None=>primitives::FaceDescription::new_with_render_id(textureless_render_group),
}); });
} }
primitives::generate_partial_unit_cornerwedge(cornerwedge_face_description) Some(primitives::generate_partial_unit_cornerwedge(cornerwedge_face_description))
}, },
}); RobloxBasePartDescription::MeshPart(meshpart)=>{
indexed_model_id //meshpart.mesh
}
};
if let Some(mesh)=mesh_option{
meshes.push(mesh);
indexed_model_id
}else{
//somehow ??
//copy bsp_loader strat
}
}; };
let attributes=get_attributes( let attributes=get_attributes(
&object, &object,