diff --git a/src/bsp.rs b/src/bsp.rs
index 7ed807c..130f877 100644
--- a/src/bsp.rs
+++ b/src/bsp.rs
@@ -1,19 +1,18 @@
-use strafesnet_common::{model,integer,gameplay_attributes};
+use strafesnet_common::{map,model,integer,gameplay_attributes};
 
 const VALVE_SCALE:f32=1.0/16.0;
 fn valve_transform(v:[f32;3])->integer::Planar64Vec3{
 	integer::Planar64Vec3::try_from([v[0]*VALVE_SCALE,v[2]*VALVE_SCALE,-v[1]*VALVE_SCALE]).unwrap()
 }
-pub fn generate_indexed_models<R:std::io::Read+std::io::Seek>(input:&mut R)->Result<model::MeshInstances,vbsp::BspError>{
-	let mut s=Vec::new();
-
-	match input.read_to_end(&mut s){
-		Ok(_)=>(),
-		Err(e)=>println!("load_bsp::generate_indexed_models read_to_end failed: {:?}",e),
-	}
-
-	match vbsp::Bsp::read(s.as_slice()){
-		Ok(bsp)=>{
+pub fn convert<AcquireTextureId,AcquireMeshId>(
+	bsp:&vbsp::Bsp,
+	acquire_texture_id:AcquireTextureId,
+	acquire_mesh_id:AcquireMeshId
+)->strafesnet_common::map::CompleteMap
+where
+	AcquireTextureId:FnMut(&str)->model::TextureId,
+	AcquireMeshId:FnMut(&str)->model::MeshId,
+{
 			let mut spawn_point=integer::Planar64Vec3::ZERO;
 
 			let vertices: Vec<_> = bsp
@@ -227,10 +226,4 @@ pub fn generate_indexed_models<R:std::io::Read+std::io::Seek>(input:&mut R)->Res
 				spawn_point,
 				modes:Vec::new(),
 			})
-		},
-		Err(e)=>{
-			println!("rotten {:?}",e);
-			Err(e)
-		},
-	}
 }
diff --git a/src/lib.rs b/src/lib.rs
index e06ee2d..5eeb130 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1 +1,24 @@
-pub mod bsp;
\ No newline at end of file
+mod bsp;
+
+pub fn read<R:std::io::Read>(mut input:R)->vbsp::BspResult<vbsp::Bsp>{
+	let mut s=Vec::new();
+
+	match input.read_to_end(&mut s){
+		Ok(_)=>(),
+		Err(e)=>println!("load_bsp::convert read_to_end failed: {:?}",e),
+	}
+
+	vbsp::Bsp::read(s.as_slice())
+}
+
+pub fn convert<AcquireTextureId,AcquireMeshId>(
+	bsp:&vbsp::Bsp,
+	acquire_texture_id:AcquireTextureId,
+	acquire_mesh_id:AcquireMeshId
+)->strafesnet_common::map::CompleteMap
+where
+	AcquireTextureId:FnMut(&str)->strafesnet_common::model::TextureId,
+	AcquireMeshId:FnMut(&str)->strafesnet_common::model::MeshId,
+{
+	bsp::convert(bsp,acquire_texture_id,acquire_mesh_id)
+}
\ No newline at end of file