diff --git a/Cargo.toml b/Cargo.toml
index f7e925f..1faa702 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,7 +8,7 @@ edition = "2021"
 [features]
 legacy = ["dep:lazy-regex"]
 #roblox = []
-#source = []
+source = []
 
 [dependencies]
 lazy-regex = { version = "3.1.0", optional = true }
diff --git a/src/source.rs b/src/source.rs
index e69de29..d355027 100644
--- a/src/source.rs
+++ b/src/source.rs
@@ -0,0 +1,38 @@
+use std::io::Read;
+use std::path::PathBuf;
+use std::collections::HashMap;
+use crate::texture::{Texture,Textures};
+use strafesnet_common::model::{MeshId,TextureId};
+pub struct Loader{
+	texture_paths:HashMap<PathBuf,TextureId>,
+	mesh_paths:HashMap<PathBuf,MeshId>,
+}
+impl Loader{
+	pub fn new()->Self{
+		Self{
+			texture_paths:HashMap::new(),
+			mesh_paths:HashMap::new(),
+		}
+	}
+}
+
+//cannot fail atm
+enum AcquireTextureError{}
+enum AcquireMeshError{}
+
+impl Loader{
+	pub fn acquire_texture_id(&mut self,name:&str)->Result<TextureId,AcquireTextureError>{
+		let texture_id=TextureId::new(self.texture_paths.len() as u32);
+		Ok(*self.texture_paths.entry(name.into()).or_insert(texture_id))
+	}
+	pub fn acquire_mesh_id(&mut self,name:&str)->Result<MeshId,AcquireMeshError>{
+		let texture_id=MeshId::new(self.mesh_paths.len() as u32);
+		Ok(*self.mesh_paths.entry(name.into()).or_insert(texture_id))
+	}
+	pub fn load_textures(&self)->Result<Textures,std::io::Error>{
+		Ok(Textures::new(Vec::new()))
+	}
+	// fn load_meshes(&self)->Result<Meshes,std::io::Error>{
+	// 	Ok(Meshes::new(Vec::new()))
+	// }
+}
\ No newline at end of file