implement texture_loader

This commit is contained in:
Quaternions 2024-02-13 02:09:35 -08:00
parent b5ab8f377d
commit 05e609521a
2 changed files with 11 additions and 32 deletions

View File

@ -21,6 +21,6 @@ fn load_dom<R:Read>(input:R)->Result<rbx_dom_weak::WeakDom,Error>{
} }
} }
pub fn read<R:Read>(input:R)->Result<strafesnet_common::map::CompleteMap,Error>{ pub fn read<R:Read,F:FnMut(&str)->Option<strafesnet_common::model::TextureId>>(input:R,acquire_id:F)->Result<strafesnet_common::map::CompleteMap,Error>{
Ok(rbx::convert(load_dom(input)?)) Ok(rbx::convert(load_dom(input)?,acquire_id))
} }

View File

@ -337,22 +337,6 @@ fn get_attributes(object:&rbx_dom_weak::Instance,can_collide:bool,velocity:Plana
} }
} }
struct RobloxAssetId(u64);
struct RobloxAssetIdParseErr;
impl std::str::FromStr for RobloxAssetId{
type Err=RobloxAssetIdParseErr;
fn from_str(s:&str)->Result<Self,Self::Err>{
let regman=lazy_regex::regex!(r"(\d+)$");
if let Some(captures) = regman.captures(s) {
if captures.len()==2{//captures[0] is all captures concatenated, and then each individual capture
if let Ok(id) = captures[0].parse::<u64>(){
return Ok(Self(id));
}
}
}
Err(RobloxAssetIdParseErr)
}
}
#[derive(Clone,Copy,PartialEq)] #[derive(Clone,Copy,PartialEq)]
struct RobloxTextureTransform{ struct RobloxTextureTransform{
offset_u:f32, offset_u:f32,
@ -421,7 +405,7 @@ struct ModelOwnedAttributes{
color:model::Color4,//transparency is in here color:model::Color4,//transparency is in here
transform:Planar64Affine3, transform:Planar64Affine3,
} }
pub fn convert(dom:rbx_dom_weak::WeakDom)->map::CompleteMap{ pub fn convert<F:FnMut(&str)->Option<model::TextureId>>(dom:rbx_dom_weak::WeakDom,mut acquire_id:F)->map::CompleteMap{
let mut modes_builder=ModesBuilder::default(); let mut modes_builder=ModesBuilder::default();
let mut models1=Vec::new(); let mut models1=Vec::new();
@ -437,7 +421,6 @@ pub fn convert(dom:rbx_dom_weak::WeakDom)->map::CompleteMap{
//TODO: some sort of thing like RobloxResources that describes where to get each resource //TODO: some sort of thing like RobloxResources that describes where to get each resource
//this would be another dependency built for downloading resources to keep this one clean //this would be another dependency built for downloading resources to keep this one clean
let mut unique_render_groups=vec![RenderConfig::default()]; let mut unique_render_groups=vec![RenderConfig::default()];
let mut render_id_from_asset_id=HashMap::<u64,RenderConfigId>::new();
let textureless_render_group=RenderConfigId::new(0); let textureless_render_group=RenderConfigId::new(0);
let mut object_refs=Vec::new(); let mut object_refs=Vec::new();
@ -520,18 +503,14 @@ pub fn convert(dom:rbx_dom_weak::WeakDom)->map::CompleteMap{
decal.properties.get("Color3"), decal.properties.get("Color3"),
decal.properties.get("Transparency"), decal.properties.get("Transparency"),
) { ) {
if let Ok(asset_id)=content.clone().into_string().parse::<RobloxAssetId>(){ if let Some(texture_id)=acquire_id(content.as_ref()){
let render_id=textureless_render_group; //this is equivalent to a get_or_create pattern because there is a singular no-texture RenderId
/* TODO: textures //so RenderId==TextureId+1
let render_id=if let Some(&render_id)=render_id_from_asset_id.get(&asset_id.0){ //not the most failsafe code but this is just for the map tool lmao
render_id if unique_render_groups.len()==texture_id.get() as usize+1{
}else{ unique_render_groups.push(RenderConfig::texture(texture_id));
let render_id=RenderConfigId::new(unique_render_groups.len() as u32);
render_id_from_asset_id.insert(asset_id.0,render_id);
unique_render_groups.push(RenderConfig::texture(asset_id.0));
render_id
}; };
*/ let render_id=RenderConfigId::new(texture_id.get()+1);
let normal_id=normalid.to_u32(); let normal_id=normalid.to_u32();
if normal_id<6{ if normal_id<6{
let (roblox_texture_color,roblox_texture_transform)=if decal.class=="Texture"{ let (roblox_texture_color,roblox_texture_transform)=if decal.class=="Texture"{
@ -733,7 +712,7 @@ pub fn convert(dom:rbx_dom_weak::WeakDom)->map::CompleteMap{
} }
}).collect(); }).collect();
map::CompleteMap{ map::CompleteMap{
render_configs:vec![RenderConfig::default()],//asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(), render_configs:unique_render_groups,//asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(),
meshes, meshes,
models, models,
modes:modes_builder.build(), modes:modes_builder.build(),