diff --git a/lib/bsp_loader/src/bsp.rs b/lib/bsp_loader/src/bsp.rs index 8c9e217..f21de37 100644 --- a/lib/bsp_loader/src/bsp.rs +++ b/lib/bsp_loader/src/bsp.rs @@ -5,6 +5,8 @@ use strafesnet_deferred_loader::deferred_loader::{MeshDeferredLoader,RenderConfi use strafesnet_deferred_loader::mesh::Meshes; use strafesnet_deferred_loader::texture::{RenderConfigs,Texture}; +use vbsp::Plane; + use crate::valve_transform; fn ingest_vertex( @@ -32,6 +34,22 @@ fn ingest_vertex( }) } +fn solve3(c0:&Plane,c1:&Plane,c2:&Plane)->Option<glam::Vec3>{ + const EPSILON:f32=1.0/1024.0; + let n0=glam::Vec3::from_array(c0.normal.into()); + let n1=glam::Vec3::from_array(c1.normal.into()); + let n2=glam::Vec3::from_array(c2.normal.into()); + let n0_n1=n0.cross(n1); + let det=n2.dot(n0_n1); + if det.abs()<EPSILON{ + return None; + } + let d0=c0.dist; + let d1=c1.dist; + let d2=c2.dist; + Some((n1.cross(n2)*d0+n2.cross(n0)*d1+n0.cross(n1)*d2)/det) +} + pub fn convert<'a>( bsp:&'a crate::Bsp, render_config_deferred_loader:&mut RenderConfigDeferredLoader<Cow<'a,str>>, @@ -136,7 +154,7 @@ pub fn convert<'a>( let tex=mb.acquire_tex_id(glam::Vec2::ZERO); // for each face, determine one edge at a time until you complete the face - for (face_id,face) in plane_list.iter().enumerate(){ + for (plane_id,plane0) in plane_list.iter().enumerate(){ // 1. find first edge // 2. follow edges around face @@ -144,8 +162,12 @@ pub fn convert<'a>( // 1. pick any two additional planes to make a set of three // 2. check if any planes occlude the intersection // 3. use this test to replace left and right alternating until they are not occluded - let mut plane1=&plane_list[(face_id+1).rem_euclid(plane_list.len())]; - let mut plane2=&plane_list[(face_id+2).rem_euclid(plane_list.len())]; + let mut plane1=&plane_list[(plane_id+1).rem_euclid(plane_list.len())]; + let mut plane2=&plane_list[(plane_id+2).rem_euclid(plane_list.len())]; + loop{ + // test if any other faces occlude the intersection + solve3(plane0,plane1,plane2); + } } let polygon_groups=model::PolygonGroup::PolygonList(model::PolygonList::new(polygon_list));