deferred_loader: remove PhantomData using GATs
This commit is contained in:
parent
65e17da386
commit
ca51256a16
lib
@ -22,17 +22,17 @@ impl From<std::io::Error> for TextureError{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TextureLoader<'a>(std::marker::PhantomData<&'a ()>);
|
pub struct TextureLoader;
|
||||||
impl TextureLoader<'_>{
|
impl TextureLoader{
|
||||||
pub fn new()->Self{
|
pub fn new()->Self{
|
||||||
Self(std::marker::PhantomData)
|
Self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<'a> Loader for TextureLoader<'a>{
|
impl Loader for TextureLoader{
|
||||||
type Error=TextureError;
|
type Error=TextureError;
|
||||||
type Index=Cow<'a,str>;
|
type Index<'a>=Cow<'a,str>;
|
||||||
type Resource=Texture;
|
type Resource=Texture;
|
||||||
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{
|
fn load<'a>(&mut self,index:Self::Index<'a>)->Result<Self::Resource,Self::Error>{
|
||||||
let file_name=format!("textures/{}.dds",index);
|
let file_name=format!("textures/{}.dds",index);
|
||||||
let mut file=std::fs::File::open(file_name)?;
|
let mut file=std::fs::File::open(file_name)?;
|
||||||
let mut data=Vec::new();
|
let mut data=Vec::new();
|
||||||
@ -100,30 +100,24 @@ impl<'bsp,'vpk> BspFinder<'bsp,'vpk>{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ModelLoader<'bsp,'vpk,'a>{
|
pub struct ModelLoader<'bsp,'vpk>{
|
||||||
finder:BspFinder<'bsp,'vpk>,
|
finder:BspFinder<'bsp,'vpk>,
|
||||||
life:core::marker::PhantomData<&'a ()>,
|
|
||||||
}
|
}
|
||||||
impl ModelLoader<'_,'_,'_>{
|
impl ModelLoader<'_,'_>{
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn new<'bsp,'vpk,'a>(
|
pub const fn new<'bsp,'vpk>(
|
||||||
finder:BspFinder<'bsp,'vpk>,
|
finder:BspFinder<'bsp,'vpk>,
|
||||||
)->ModelLoader<'bsp,'vpk,'a>{
|
)->ModelLoader<'bsp,'vpk>{
|
||||||
ModelLoader{
|
ModelLoader{
|
||||||
finder,
|
finder,
|
||||||
life:core::marker::PhantomData,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<'bsp,'vpk,'a> Loader for ModelLoader<'bsp,'vpk,'a>
|
impl<'bsp,'vpk> Loader for ModelLoader<'bsp,'vpk>{
|
||||||
where
|
|
||||||
'bsp:'a,
|
|
||||||
'vpk:'a,
|
|
||||||
{
|
|
||||||
type Error=MeshError;
|
type Error=MeshError;
|
||||||
type Index=&'a str;
|
type Index<'a>=&'a str where Self:'a;
|
||||||
type Resource=vmdl::Model;
|
type Resource=vmdl::Model;
|
||||||
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{
|
fn load<'a>(&'a mut self,index:Self::Index<'a>)->Result<Self::Resource,Self::Error>{
|
||||||
let mdl_path_lower=index.to_lowercase();
|
let mdl_path_lower=index.to_lowercase();
|
||||||
//.mdl, .vvd, .dx90.vtx
|
//.mdl, .vvd, .dx90.vtx
|
||||||
let path=std::path::PathBuf::from(mdl_path_lower.as_str());
|
let path=std::path::PathBuf::from(mdl_path_lower.as_str());
|
||||||
@ -143,31 +137,27 @@ impl<'bsp,'vpk,'a> Loader for ModelLoader<'bsp,'vpk,'a>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct MeshLoader<'bsp,'vpk,'load,'a>{
|
pub struct MeshLoader<'bsp,'vpk,'load,'str>{
|
||||||
finder:BspFinder<'bsp,'vpk>,
|
finder:BspFinder<'bsp,'vpk>,
|
||||||
deferred_loader:&'load mut strafesnet_deferred_loader::deferred_loader::RenderConfigDeferredLoader<Cow<'a,str>>,
|
deferred_loader:&'load mut strafesnet_deferred_loader::deferred_loader::RenderConfigDeferredLoader<Cow<'str,str>>,
|
||||||
}
|
}
|
||||||
impl MeshLoader<'_,'_,'_,'_>{
|
impl MeshLoader<'_,'_,'_,'_>{
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn new<'bsp,'vpk,'load,'a>(
|
pub const fn new<'bsp,'vpk,'load,'str>(
|
||||||
finder:BspFinder<'bsp,'vpk>,
|
finder:BspFinder<'bsp,'vpk>,
|
||||||
deferred_loader:&'load mut strafesnet_deferred_loader::deferred_loader::RenderConfigDeferredLoader<Cow<'a,str>>,
|
deferred_loader:&'load mut strafesnet_deferred_loader::deferred_loader::RenderConfigDeferredLoader<Cow<'str,str>>,
|
||||||
)->MeshLoader<'bsp,'vpk,'load,'a>{
|
)->MeshLoader<'bsp,'vpk,'load,'str>{
|
||||||
MeshLoader{
|
MeshLoader{
|
||||||
finder,
|
finder,
|
||||||
deferred_loader
|
deferred_loader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<'bsp,'vpk,'load,'a> Loader for MeshLoader<'bsp,'vpk,'load,'a>
|
impl<'str,'bsp,'vpk,'load> Loader for MeshLoader<'bsp,'vpk,'load,'str>{
|
||||||
where
|
|
||||||
'bsp:'a,
|
|
||||||
'vpk:'a,
|
|
||||||
{
|
|
||||||
type Error=MeshError;
|
type Error=MeshError;
|
||||||
type Index=&'a str;
|
type Index<'a>=&'a str where Self:'a;
|
||||||
type Resource=Mesh;
|
type Resource=Mesh;
|
||||||
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{
|
fn load<'a>(&'a mut self,index:Self::Index<'a>)->Result<Self::Resource,Self::Error>{
|
||||||
let model=ModelLoader::new(self.finder).load(index)?;
|
let model=ModelLoader::new(self.finder).load(index)?;
|
||||||
let mesh=crate::mesh::convert_mesh(model,&mut self.deferred_loader);
|
let mesh=crate::mesh::convert_mesh(model,&mut self.deferred_loader);
|
||||||
Ok(mesh)
|
Ok(mesh)
|
||||||
|
@ -45,7 +45,7 @@ impl<H:core::hash::Hash+Eq> RenderConfigDeferredLoader<H>{
|
|||||||
pub fn into_indices(self)->impl Iterator<Item=H>{
|
pub fn into_indices(self)->impl Iterator<Item=H>{
|
||||||
self.render_config_id_from_asset_id.into_keys().flatten()
|
self.render_config_id_from_asset_id.into_keys().flatten()
|
||||||
}
|
}
|
||||||
pub fn into_render_configs<L:Loader<Resource=Texture,Index=H>>(mut self,loader:&mut L,failure_mode:LoadFailureMode)->Result<RenderConfigs,L::Error>{
|
pub fn into_render_configs<'a,L:Loader<Resource=Texture,Index<'a>=H>+'a>(mut self,loader:&mut L,failure_mode:LoadFailureMode)->Result<RenderConfigs,L::Error>{
|
||||||
let mut sorted_textures=vec![None;self.texture_count as usize];
|
let mut sorted_textures=vec![None;self.texture_count as usize];
|
||||||
for (index_option,render_config_id) in self.render_config_id_from_asset_id{
|
for (index_option,render_config_id) in self.render_config_id_from_asset_id{
|
||||||
let render_config=&mut self.render_configs[render_config_id.get() as usize];
|
let render_config=&mut self.render_configs[render_config_id.get() as usize];
|
||||||
@ -93,7 +93,7 @@ impl<H:core::hash::Hash+Eq> MeshDeferredLoader<H>{
|
|||||||
pub fn into_indices(self)->impl Iterator<Item=H>{
|
pub fn into_indices(self)->impl Iterator<Item=H>{
|
||||||
self.mesh_id_from_asset_id.into_keys()
|
self.mesh_id_from_asset_id.into_keys()
|
||||||
}
|
}
|
||||||
pub fn into_meshes<L:Loader<Resource=Mesh,Index=H>>(self,loader:&mut L,failure_mode:LoadFailureMode)->Result<Meshes,L::Error>{
|
pub fn into_meshes<'a,L:Loader<Resource=Mesh,Index<'a>=H>+'a>(self,loader:&mut L,failure_mode:LoadFailureMode)->Result<Meshes,L::Error>{
|
||||||
let mut mesh_list=vec![None;self.mesh_id_from_asset_id.len()];
|
let mut mesh_list=vec![None;self.mesh_id_from_asset_id.len()];
|
||||||
for (index,mesh_id) in self.mesh_id_from_asset_id{
|
for (index,mesh_id) in self.mesh_id_from_asset_id{
|
||||||
let resource_result=loader.load(index);
|
let resource_result=loader.load(index);
|
||||||
|
@ -2,7 +2,7 @@ use std::error::Error;
|
|||||||
|
|
||||||
pub trait Loader{
|
pub trait Loader{
|
||||||
type Error:Error;
|
type Error:Error;
|
||||||
type Index;
|
type Index<'a> where Self:'a;
|
||||||
type Resource;
|
type Resource;
|
||||||
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>;
|
fn load<'a>(&mut self,index:Self::Index<'a>)->Result<Self::Resource,Self::Error>;
|
||||||
}
|
}
|
||||||
|
@ -36,17 +36,17 @@ impl From<RobloxAssetIdParseErr> for TextureError{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TextureLoader<'a>(std::marker::PhantomData<&'a ()>);
|
pub struct TextureLoader;
|
||||||
impl TextureLoader<'_>{
|
impl TextureLoader{
|
||||||
pub fn new()->Self{
|
pub fn new()->Self{
|
||||||
Self(std::marker::PhantomData)
|
Self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<'a> Loader for TextureLoader<'a>{
|
impl Loader for TextureLoader{
|
||||||
type Error=TextureError;
|
type Error=TextureError;
|
||||||
type Index=&'a str;
|
type Index<'a>=&'a str;
|
||||||
type Resource=Texture;
|
type Resource=Texture;
|
||||||
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{
|
fn load<'a>(&mut self,index:Self::Index<'a>)->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 data=read_entire_file(file_name)?;
|
let data=read_entire_file(file_name)?;
|
||||||
@ -138,17 +138,17 @@ impl MeshIndex<'_>{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct MeshLoader<'a>(std::marker::PhantomData<&'a ()>);
|
pub struct MeshLoader;
|
||||||
impl MeshLoader<'_>{
|
impl MeshLoader{
|
||||||
pub fn new()->Self{
|
pub fn new()->Self{
|
||||||
Self(std::marker::PhantomData)
|
Self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<'a> Loader for MeshLoader<'a>{
|
impl Loader for MeshLoader{
|
||||||
type Error=MeshError;
|
type Error=MeshError;
|
||||||
type Index=MeshIndex<'a>;
|
type Index<'a>=MeshIndex<'a>;
|
||||||
type Resource=Mesh;
|
type Resource=Mesh;
|
||||||
fn load(&mut self,index:Self::Index)->Result<Self::Resource,Self::Error>{
|
fn load<'a>(&mut self,index:Self::Index<'a>)->Result<Self::Resource,Self::Error>{
|
||||||
let mesh=match index.mesh_type{
|
let mesh=match index.mesh_type{
|
||||||
MeshType::FileMesh=>{
|
MeshType::FileMesh=>{
|
||||||
let RobloxAssetId(asset_id)=index.content.parse()?;
|
let RobloxAssetId(asset_id)=index.content.parse()?;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user