Add vertex merging
This commit is contained in:
parent
1ffa8a9860
commit
901fb79ae6
|
@ -1,10 +1,14 @@
|
||||||
use glam::Vec3;
|
use glam::Vec3;
|
||||||
|
|
||||||
use crate::plane::{Plane, PlaneIntersection};
|
use crate::{
|
||||||
|
math,
|
||||||
|
plane::{Plane, PlaneIntersection},
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default, Debug, Clone)]
|
||||||
pub struct MaterialId(pub String);
|
pub struct MaterialId(pub String);
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct TextureProjection {
|
pub struct TextureProjection {
|
||||||
pub u: Plane,
|
pub u: Plane,
|
||||||
pub v: Plane,
|
pub v: Plane,
|
||||||
|
@ -25,7 +29,7 @@ impl Default for TextureProjection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default, Debug, Clone)]
|
||||||
pub struct BrushPlane {
|
pub struct BrushPlane {
|
||||||
pub plane: Plane,
|
pub plane: Plane,
|
||||||
pub material: MaterialId,
|
pub material: MaterialId,
|
||||||
|
@ -34,18 +38,27 @@ pub struct BrushPlane {
|
||||||
|
|
||||||
pub struct Brush {
|
pub struct Brush {
|
||||||
pub planes: Vec<BrushPlane>,
|
pub planes: Vec<BrushPlane>,
|
||||||
|
raw_vertices: Vec<PlaneIntersection>,
|
||||||
|
vertices: Vec<Vec3>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Brush {
|
impl Brush {
|
||||||
pub fn get_vertices(&self) -> Vec<Vec3> {
|
pub fn new(planes: &[BrushPlane]) -> Self {
|
||||||
if self.planes.len() < 3 {
|
Self {
|
||||||
println!("fug");
|
planes: planes.to_vec(),
|
||||||
return vec![];
|
raw_vertices: vec![],
|
||||||
|
vertices: vec![],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rebuild(&mut self) {
|
||||||
|
if self.planes.len() < 4 {
|
||||||
|
panic!("Invalid number of planes. Minimum 4 planes required.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test all permutations of brush planes for intersections
|
// Test all permutations of brush planes for intersections
|
||||||
let mut intersections = vec![];
|
let mut intersections = vec![];
|
||||||
let mut vs = vec![];
|
let mut vs: Vec<Vec3> = vec![];
|
||||||
let len = self.planes.len();
|
let len = self.planes.len();
|
||||||
for i in 0..(len - 2) {
|
for i in 0..(len - 2) {
|
||||||
for j in (i + 1)..(len - 1) {
|
for j in (i + 1)..(len - 1) {
|
||||||
|
@ -63,7 +76,7 @@ impl Brush {
|
||||||
|
|
||||||
// Validate intersections against other brush planes
|
// Validate intersections against other brush planes
|
||||||
// TODO: No need to check against planes that are part of the intersection
|
// TODO: No need to check against planes that are part of the intersection
|
||||||
for intersection in intersections {
|
for intersection in &intersections {
|
||||||
let mut valid = true;
|
let mut valid = true;
|
||||||
for bplane in &self.planes {
|
for bplane in &self.planes {
|
||||||
if !intersection.in_halfspace_mat(&bplane.plane) {
|
if !intersection.in_halfspace_mat(&bplane.plane) {
|
||||||
|
@ -72,11 +85,31 @@ impl Brush {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Merge vertices
|
||||||
if valid {
|
if valid {
|
||||||
vs.push(intersection.get_intersection_point());
|
let point = intersection.get_intersection_point();
|
||||||
|
let mut duplicate = false;
|
||||||
|
for v in &vs {
|
||||||
|
if v.abs_diff_eq(point, math::EPSILON) {
|
||||||
|
duplicate = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !duplicate {
|
||||||
|
vs.push(point);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vs
|
self.vertices = vs;
|
||||||
|
self.raw_vertices = intersections;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_vertices(&self) -> Vec<Vec3> {
|
||||||
|
self.vertices.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_intersections(&self) -> Vec<PlaneIntersection> {
|
||||||
|
self.raw_vertices.clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,13 +22,9 @@ fn generate_box_brush(position: Vec3, extent: Vec3) -> Brush {
|
||||||
plane: Plane::from_point_normal(point, *normal),
|
plane: Plane::from_point_normal(point, *normal),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
});
|
});
|
||||||
|
|
||||||
println!("Plane: {:?}", brush_planes.last().unwrap().plane);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Brush {
|
Brush::new(&brush_planes)
|
||||||
planes: brush_planes,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Position is center of base plane
|
/// Position is center of base plane
|
||||||
|
@ -43,14 +39,12 @@ fn generate_pyramid_brush(position: Vec3, height: f32, side_count: u32) -> Brush
|
||||||
|
|
||||||
for i in 0..side_count {
|
for i in 0..side_count {
|
||||||
let angle = (i as f32 / side_count as f32) * 360.0_f32.to_radians();
|
let angle = (i as f32 / side_count as f32) * 360.0_f32.to_radians();
|
||||||
dbg!(angle);
|
|
||||||
let rot_mat = Mat3::from_cols(
|
let rot_mat = Mat3::from_cols(
|
||||||
Vec3::new(angle.cos(), 0.0, -angle.sin()),
|
Vec3::new(angle.cos(), 0.0, -angle.sin()),
|
||||||
Vec3::Y,
|
Vec3::Y,
|
||||||
Vec3::new(angle.sin(), 0.0, angle.cos()),
|
Vec3::new(angle.sin(), 0.0, angle.cos()),
|
||||||
);
|
);
|
||||||
let normal = rot_mat * Vec3::new(1.0, 1.0, 0.0);
|
let normal = rot_mat * Vec3::new(1.0, 1.0, 0.0);
|
||||||
dbg!(normal);
|
|
||||||
|
|
||||||
brush_planes.push(BrushPlane {
|
brush_planes.push(BrushPlane {
|
||||||
plane: Plane::from_point_normal(tip, normal),
|
plane: Plane::from_point_normal(tip, normal),
|
||||||
|
@ -58,18 +52,19 @@ fn generate_pyramid_brush(position: Vec3, height: f32, side_count: u32) -> Brush
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Brush {
|
Brush::new(&brush_planes)
|
||||||
planes: brush_planes,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let brush = generate_box_brush(Vec3::new(1.0, 0.0, 0.0), Vec3::new(1.0, 2.0, 1.0));
|
let mut brush = generate_box_brush(Vec3::new(1.0, 0.0, 0.0), Vec3::new(1.0, 2.0, 1.0));
|
||||||
|
brush.rebuild();
|
||||||
let vs = brush.get_vertices();
|
let vs = brush.get_vertices();
|
||||||
|
|
||||||
println!("Vertices: {vs:?}");
|
println!("Vertices: {vs:?}");
|
||||||
|
|
||||||
let vs = generate_pyramid_brush(Vec3::ZERO, 1.0, 4).get_vertices();
|
let mut brush = generate_pyramid_brush(Vec3::ZERO, 1.0, 4);
|
||||||
|
brush.rebuild();
|
||||||
|
let vs = brush.get_vertices();
|
||||||
|
|
||||||
println!("Vertices: {vs:?}");
|
println!("Vertices: {vs:?}");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue