the errors went away but im not done

This commit is contained in:
Quaternions 2025-01-29 13:21:11 -08:00
parent 77b41e7ebf
commit 82d68311fd
3 changed files with 88 additions and 62 deletions
lib/rbx_loader/src

@ -5,6 +5,13 @@ use strafesnet_deferred_loader::{loader::Loader,texture::Texture};
use crate::data::RobloxMeshBytes; use crate::data::RobloxMeshBytes;
fn read_entire_file(path:impl AsRef<std::path::Path>)->Result<Vec<u8>,std::io::Error>{
let mut file=std::fs::File::open(path)?;
let mut data=Vec::new();
file.read_to_end(&mut data)?;
Ok(data)
}
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Debug)] #[derive(Debug)]
pub enum TextureError{ pub enum TextureError{
@ -41,9 +48,7 @@ impl<'a> Loader for TextureLoader<'a>{
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{ fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{
let RobloxAssetId(asset_id)=index.parse()?; let RobloxAssetId(asset_id)=index.parse()?;
let file_name=format!("textures/{}.dds",asset_id); let file_name=format!("textures/{}.dds",asset_id);
let mut file=std::fs::File::open(file_name)?; let data=read_entire_file(file_name)?;
let mut data=Vec::new();
file.read_to_end(&mut data)?;
Ok(Texture::ImageDDS(data)) Ok(Texture::ImageDDS(data))
} }
} }
@ -53,7 +58,8 @@ impl<'a> Loader for TextureLoader<'a>{
pub enum MeshError{ pub enum MeshError{
Io(std::io::Error), Io(std::io::Error),
RobloxAssetIdParse(RobloxAssetIdParseErr), RobloxAssetIdParse(RobloxAssetIdParseErr),
Mesh(crate::mesh::Error) Mesh(crate::mesh::Error),
Union(crate::union::Error),
} }
impl std::fmt::Display for MeshError{ impl std::fmt::Display for MeshError{
@ -77,6 +83,43 @@ impl From<crate::mesh::Error> for MeshError{
Self::Mesh(value) Self::Mesh(value)
} }
} }
impl From<crate::union::Error> for MeshError{
fn from(value:crate::union::Error)->Self{
Self::Union(value)
}
}
#[derive(Hash,Eq,PartialEq)]
pub enum MeshType<'a>{
FileMesh,
Union{
mesh_data:&'a [u8],
physics_data:&'a [u8],
},
}
#[derive(Hash,Eq,PartialEq)]
pub struct MeshIndex<'a>{
mesh_type:MeshType<'a>,
content:&'a str,
}
impl MeshIndex<'_>{
pub fn file_mesh(content:&str)->MeshIndex{
MeshIndex{
mesh_type:MeshType::FileMesh,
content,
}
}
pub fn union<'a>(
content:&'a str,
mesh_data:&'a [u8],
physics_data:&'a [u8],
)->MeshIndex<'a>{
MeshIndex{
mesh_type:MeshType::Union{mesh_data,physics_data},
content,
}
}
}
pub struct MeshLoader<'a>(std::marker::PhantomData<&'a ()>); pub struct MeshLoader<'a>(std::marker::PhantomData<&'a ()>);
impl MeshLoader<'_>{ impl MeshLoader<'_>{
@ -86,17 +129,18 @@ impl MeshLoader<'_>{
} }
impl<'a> Loader for MeshLoader<'a>{ impl<'a> Loader for MeshLoader<'a>{
type Error=MeshError; type Error=MeshError;
type Index=&'a str; type Index=MeshIndex<'a>;
type Resource=Mesh; type Resource=Mesh;
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{ fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{
let RobloxAssetId(asset_id)=index.parse()?; let RobloxAssetId(asset_id)=index.content.parse()?;
let file_name=format!("meshes/{}",asset_id); let file_name=format!("meshes/{}",asset_id);
let mut file=std::fs::File::open(file_name)?;
// reading the entire file is way faster than // reading the entire file is way faster than
// round tripping to disk every read from the parser // round tripping to disk every read from the parser
let mut data=Vec::new(); let data=read_entire_file(file_name)?;
file.read_to_end(&mut data)?; let mesh=match index.mesh_type{
let mesh=crate::mesh::convert(RobloxMeshBytes::new(data))?; MeshType::FileMesh=>crate::mesh::convert(RobloxMeshBytes::new(data))?,
MeshType::Union{physics_data,mesh_data}=>crate::union::convert(physics_data,mesh_data)?,
};
Ok(mesh) Ok(mesh)
} }
} }

@ -1,4 +1,5 @@
use std::collections::HashMap; use std::collections::HashMap;
use crate::loader::MeshIndex;
use crate::primitives; use crate::primitives;
use strafesnet_common::map; use strafesnet_common::map;
use strafesnet_common::model; use strafesnet_common::model;
@ -487,31 +488,24 @@ enum Shape{
MeshPart, MeshPart,
PhysicsData, PhysicsData,
} }
enum MeshAvailability<'a>{ enum MeshAvailability{
Immediate, Immediate,
DeferredMesh(RenderConfigId), DeferredMesh(RenderConfigId),
DeferredUnion(RobloxPartDescription,UnionDeferredAttributes<'a>), DeferredUnion(RobloxPartDescription),
} }
struct DeferredModelDeferredAttributes{ struct DeferredModelDeferredAttributes<'a>{
render:RenderConfigId, render:RenderConfigId,
model:ModelDeferredAttributes, model:ModelDeferredAttributes<'a>,
} }
struct ModelDeferredAttributes{ struct ModelDeferredAttributes<'a>{
mesh:model::MeshId, mesh:model::MeshId,
deferred_attributes:GetAttributesArgs, deferred_attributes:GetAttributesArgs<'a>,
color:model::Color4,//transparency is in here color:model::Color4,//transparency is in here
transform:Planar64Affine3, transform:Planar64Affine3,
} }
struct DeferredUnionDeferredAttributes<'a>{ struct DeferredUnionDeferredAttributes<'a>{
render:RobloxPartDescription, render:RobloxPartDescription,
model:ModelDeferredAttributes, model:ModelDeferredAttributes<'a>,
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,
@ -519,17 +513,18 @@ struct ModelOwnedAttributes{
color:model::Color4,//transparency is in here color:model::Color4,//transparency is in here
transform:Planar64Affine3, transform:Planar64Affine3,
} }
struct GetAttributesArgs{ struct GetAttributesArgs<'a>{
name:Box<str>, name:&'a str,
can_collide:bool, can_collide:bool,
velocity:Planar64Vec3, velocity:Planar64Vec3,
} }
pub fn convert<'a>( pub fn convert<'a>(
dom:&'a rbx_dom_weak::WeakDom, dom:&'a rbx_dom_weak::WeakDom,
render_config_deferred_loader:&mut RenderConfigDeferredLoader<&'a str>, render_config_deferred_loader:&mut RenderConfigDeferredLoader<&'a str>,
mesh_deferred_loader:&mut MeshDeferredLoader<&'a str>, mesh_deferred_loader:&mut MeshDeferredLoader<MeshIndex<'a>>,
)->PartialMap1<'a>{ )->PartialMap1<'a>{
let mut deferred_models_deferred_attributes=Vec::new(); let mut deferred_models_deferred_attributes=Vec::new();
let mut deferred_unions_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();
@ -600,7 +595,7 @@ pub fn convert<'a>(
let (availability,mesh_id)=match shape{ let (availability,mesh_id)=match shape{
Shape::Primitive(primitive_shape)=>{ Shape::Primitive(primitive_shape)=>{
//TODO: TAB TAB //TODO: TAB TAB
let part_texture_description=get_texture_description(&mut temp_objects,&mut render_config_deferred_loader,dom,object,size); let part_texture_description=get_texture_description(&mut temp_objects,render_config_deferred_loader,dom,object,size);
//obscure rust syntax "slice pattern" //obscure rust syntax "slice pattern"
let [ let [
f0,//Cube::Right f0,//Cube::Right
@ -714,7 +709,7 @@ pub fn convert<'a>(
){ ){
( (
MeshAvailability::DeferredMesh(render_config_deferred_loader.acquire_render_config_id(Some(texture_asset_id.as_ref()))), MeshAvailability::DeferredMesh(render_config_deferred_loader.acquire_render_config_id(Some(texture_asset_id.as_ref()))),
mesh_deferred_loader.acquire_mesh_id(mesh_asset_id.as_ref()), mesh_deferred_loader.acquire_mesh_id(MeshIndex::file_mesh(mesh_asset_id.as_ref())),
) )
}else{ }else{
panic!("Mesh has no Mesh or Texture"); panic!("Mesh has no Mesh or Texture");
@ -723,34 +718,22 @@ pub fn convert<'a>(
//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});
let mut asset_id=None; let mut content="";
let mut mesh_data=None; let mut mesh_data:&[u8]=&[];
let mut physics_data=None; let mut physics_data:&[u8]=&[];
if let Some(rbx_dom_weak::types::Variant::Content(content))=object.properties.get("AssetId"){ if let Some(rbx_dom_weak::types::Variant::Content(asset_id))=object.properties.get("AssetId"){
let value:&str=content.as_ref(); content=asset_id.as_ref();
if !value.is_empty(){
asset_id=Some(value);
}
} }
if let Some(rbx_dom_weak::types::Variant::BinaryString(data))=object.properties.get("MeshData"){ if let Some(rbx_dom_weak::types::Variant::BinaryString(data))=object.properties.get("MeshData"){
let value:&[u8]=data.as_ref(); mesh_data=data.as_ref();
if !value.is_empty(){
mesh_data=Some(value);
}
} }
if let Some(rbx_dom_weak::types::Variant::BinaryString(data))=object.properties.get("PhysicsData"){ if let Some(rbx_dom_weak::types::Variant::BinaryString(data))=object.properties.get("PhysicsData"){
let value:&[u8]=data.as_ref(); physics_data=data.as_ref();
if !value.is_empty(){
physics_data=Some(value);
}
} }
let part_texture_description=get_texture_description(&mut temp_objects,&mut render_config_deferred_loader,dom,object,size); let part_texture_description=get_texture_description(&mut temp_objects,render_config_deferred_loader,dom,object,size);
let union_deferred_attributes=UnionDeferredAttributes{ let mesh_index=MeshIndex::union(content,mesh_data,physics_data);
asset_id, let mesh_id=mesh_deferred_loader.acquire_mesh_id(mesh_index);
mesh_data, (MeshAvailability::DeferredUnion(part_texture_description),mesh_id)
physics_data,
};
(MeshAvailability::DeferredUnion(part_texture_description,union_deferred_attributes),mesh_id)
}, },
}; };
let model_deferred_attributes=ModelDeferredAttributes{ let model_deferred_attributes=ModelDeferredAttributes{
@ -758,7 +741,7 @@ pub fn convert<'a>(
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.as_str().into(), name:object.name.as_str(),
can_collide:*can_collide, can_collide:*can_collide,
velocity:vec3::try_from_f32_array([velocity.x,velocity.y,velocity.z]).unwrap(), velocity:vec3::try_from_f32_array([velocity.x,velocity.y,velocity.z]).unwrap(),
}, },
@ -769,10 +752,9 @@ pub fn convert<'a>(
render, render,
model:model_deferred_attributes model:model_deferred_attributes
}), }),
MeshAvailability::DeferredUnion(part_texture_description,union_deferred_attributes)=>deferred_unions_deferred_attributes.push(DeferredUnionDeferredAttributes{ MeshAvailability::DeferredUnion(part_texture_description)=>deferred_unions_deferred_attributes.push(DeferredUnionDeferredAttributes{
render:part_texture_description, render:part_texture_description,
model:model_deferred_attributes, model:model_deferred_attributes,
union:union_deferred_attributes,
}), }),
} }
} }
@ -782,6 +764,7 @@ pub fn convert<'a>(
primitive_meshes, primitive_meshes,
primitive_models_deferred_attributes, primitive_models_deferred_attributes,
deferred_models_deferred_attributes, deferred_models_deferred_attributes,
deferred_unions_deferred_attributes,
} }
} }
struct MeshWithAabb{ struct MeshWithAabb{
@ -790,11 +773,11 @@ struct MeshWithAabb{
} }
pub struct PartialMap1<'a>{ 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<'a>>,
deferred_models_deferred_attributes:Vec<DeferredModelDeferredAttributes>, deferred_models_deferred_attributes:Vec<DeferredModelDeferredAttributes<'a>>,
deferred_union_deferred_attributes:Vec<DeferredModelDeferredAttributes>, deferred_unions_deferred_attributes:Vec<DeferredUnionDeferredAttributes<'a>>,
} }
impl PartialMap1{ impl PartialMap1<'_>{
pub fn add_meshpart_meshes_and_calculate_attributes( pub fn add_meshpart_meshes_and_calculate_attributes(
mut self, mut self,
meshpart_meshes:Meshes, meshpart_meshes:Meshes,

@ -33,7 +33,7 @@ pub fn convert(roblox_physics_data:&[u8],roblox_mesh_data:&[u8])->Result<model::
std::io::Cursor::new(roblox_mesh_data) std::io::Cursor::new(roblox_mesh_data)
).map_err(Error::RobloxMeshData)?; ).map_err(Error::RobloxMeshData)?;
let graphics_mesh=match mesh_data{ let graphics_mesh=match mesh_data{
rbx_mesh::mesh_data::CSGPHS::CSGK(csgk)=>return Err(Error::NotSupposedToHappen), rbx_mesh::mesh_data::CSGPHS::CSGK(_)=>return Err(Error::NotSupposedToHappen),
rbx_mesh::mesh_data::CSGPHS::CSGPHS2(mesh_data2)=>mesh_data2.mesh, rbx_mesh::mesh_data::CSGPHS::CSGPHS2(mesh_data2)=>mesh_data2.mesh,
rbx_mesh::mesh_data::CSGPHS::CSGPHS4(mesh_data4)=>mesh_data4.mesh, rbx_mesh::mesh_data::CSGPHS::CSGPHS4(mesh_data4)=>mesh_data4.mesh,
}; };
@ -47,8 +47,7 @@ pub fn convert(roblox_physics_data:&[u8],roblox_mesh_data:&[u8])->Result<model::
// have not seen this format in practice // have not seen this format in practice
|rbx_mesh::physics_data::PhysicsData::CSGPHS(rbx_mesh::physics_data::CSGPHS::Block) |rbx_mesh::physics_data::PhysicsData::CSGPHS(rbx_mesh::physics_data::CSGPHS::Block)
=>return Err(Error::NotSupposedToHappen), =>return Err(Error::NotSupposedToHappen),
rbx_mesh::physics_data::PhysicsData::CSGPHS(rbx_mesh::physics_data::CSGPHS::Meshes3(meshes)) rbx_mesh::physics_data::PhysicsData::CSGPHS(rbx_mesh::physics_data::CSGPHS::Meshes(meshes))
|rbx_mesh::physics_data::PhysicsData::CSGPHS(rbx_mesh::physics_data::CSGPHS::Meshes5(meshes))
=>meshes.meshes, =>meshes.meshes,
rbx_mesh::physics_data::PhysicsData::CSGPHS(rbx_mesh::physics_data::CSGPHS::PhysicsInfoMesh(pim)) rbx_mesh::physics_data::PhysicsData::CSGPHS(rbx_mesh::physics_data::CSGPHS::PhysicsInfoMesh(pim))
=>vec![pim.mesh], =>vec![pim.mesh],