This commit is contained in:
Quaternions 2025-02-05 07:57:59 -08:00
parent 45c6de5d3c
commit 11a864682a

@ -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));