Merge pull request #447 from hannobraun/debug

Simplify debug info
This commit is contained in:
Hanno Braun 2022-04-09 15:55:07 +02:00 committed by GitHub
commit b651e6f3be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 41 additions and 40 deletions

2
Cargo.lock generated
View File

@ -690,7 +690,7 @@ dependencies = [
name = "fj-debug" name = "fj-debug"
version = "0.5.0" version = "0.5.0"
dependencies = [ dependencies = [
"parry3d-f64", "fj-math",
] ]
[[package]] [[package]]

View File

@ -44,6 +44,26 @@ impl Vertices {
self.indices.push(self.indices.len() as u32); self.indices.push(self.indices.len() as u32);
self.indices.push(self.indices.len() as u32); self.indices.push(self.indices.len() as u32);
} }
pub fn push_cross(
&mut self,
position: Point<f64, 3>,
normal: [f32; 3],
color: [f32; 4],
) {
let d = 0.05;
self.push_line(
[position - vector![d, 0., 0.], position + vector![d, 0., 0.]],
normal,
color,
);
self.push_line(
[position - vector![0., d, 0.], position + vector![0., d, 0.]],
normal,
color,
);
}
} }
impl From<&Vec<Triangle<3>>> for Vertices { impl From<&Vec<Triangle<3>>> for Vertices {
@ -92,32 +112,13 @@ impl From<&DebugInfo> for Vertices {
green green
}; };
self_.push_line( self_.push_cross(triangle_edge_check.origin.to_na(), normal, color);
[
triangle_edge_check.ray.origin,
triangle_edge_check.ray.origin
+ triangle_edge_check.ray.dir,
],
normal,
color,
);
for &hit in &triangle_edge_check.hits { for &hit in &triangle_edge_check.hits {
let point = triangle_edge_check.ray.point_at(hit); let line = hit.points().map(|point| point.to_na());
let d = 0.05;
let color = [0., 0., 0., 1.]; let color = [0., 0., 0., 1.];
self_.push_line( self_.push_line(line, normal, color);
[point - vector![d, 0., 0.], point + vector![d, 0., 0.]],
normal,
color,
);
self_.push_line(
[point - vector![0., d, 0.], point + vector![0., d, 0.]],
normal,
color,
);
} }
} }

View File

@ -10,5 +10,6 @@ license = "0BSD"
keywords = ["cad", "programmatic", "code-cad"] keywords = ["cad", "programmatic", "code-cad"]
[dependencies] [dependencies.fj-math]
parry3d-f64 = "0.8.0" path = "../fj-math"
version = "0.5.0"

View File

@ -7,11 +7,9 @@
#![deny(missing_docs)] #![deny(missing_docs)]
use parry3d_f64::query::Ray; use fj_math::{Point, Segment};
/// Debug info from the CAD kernel that can be visualized /// Debug info from the CAD kernel that can be visualized
///
/// At this point, this is a placeholder that will be filled with life later.
#[derive(Default)] #[derive(Default)]
pub struct DebugInfo { pub struct DebugInfo {
/// Rays being used during face triangulation /// Rays being used during face triangulation
@ -36,18 +34,18 @@ impl DebugInfo {
/// Record of a check to determine if a triangle edge is within a face /// Record of a check to determine if a triangle edge is within a face
pub struct TriangleEdgeCheck { pub struct TriangleEdgeCheck {
/// The ray used to perform the check /// The origin of the ray used to perform the check
pub ray: Ray, pub origin: Point<3>,
/// Where the ray hit any edges of the face /// The points where the ray hit edges of the face
pub hits: Vec<f64>, pub hits: Vec<Segment<3>>,
} }
impl TriangleEdgeCheck { impl TriangleEdgeCheck {
/// Construct a new instance /// Construct a new instance
pub fn new(ray: Ray) -> Self { pub fn new(origin: Point<3>) -> Self {
Self { Self {
ray, origin,
hits: Vec::new(), hits: Vec::new(),
} }
} }

View File

@ -3,7 +3,6 @@ use std::collections::BTreeSet;
use fj_debug::{DebugInfo, TriangleEdgeCheck}; use fj_debug::{DebugInfo, TriangleEdgeCheck};
use fj_math::{Point, PolyChain, Scalar, Segment}; use fj_math::{Point, PolyChain, Scalar, Segment};
use parry2d_f64::query::{Ray as Ray2, RayCast as _}; use parry2d_f64::query::{Ray as Ray2, RayCast as _};
use parry3d_f64::query::Ray as Ray3;
use crate::geometry::Surface; use crate::geometry::Surface;
@ -102,10 +101,8 @@ impl Polygon {
dir: dir.to_na(), dir: dir.to_na(),
}; };
let mut check = TriangleEdgeCheck::new(Ray3 { let mut check =
origin: self.surface.point_surface_to_model(&point).to_na(), TriangleEdgeCheck::new(self.surface.point_surface_to_model(&point));
dir: self.surface.vector_surface_to_model(&dir).to_na(),
});
// We need to keep track of where our ray hits the edges. Otherwise, if // We need to keep track of where our ray hits the edges. Otherwise, if
// the ray hits a vertex, we might count that hit twice, as every vertex // the ray hits a vertex, we might count that hit twice, as every vertex
@ -130,7 +127,11 @@ impl Polygon {
let t = (t * eps).round() / eps; let t = (t * eps).round() / eps;
if hits.insert(t) { if hits.insert(t) {
check.hits.push(t.into_f64()); let edge =
Segment::from_points(edge.points().map(|point| {
self.surface.point_surface_to_model(&point)
}));
check.hits.push(edge);
} }
} }
} }