Skip to content

Commit

Permalink
use new non-faillible api for constraint edge
Browse files Browse the repository at this point in the history
  • Loading branch information
mockersf committed Jun 28, 2024
1 parent 96629be commit 3733978
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 50 deletions.
6 changes: 3 additions & 3 deletions benches/merger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ fn merger(c: &mut Criterion) {
triangulation.add_obstacle(ARENA_OBSTACLES[2].to_vec());
triangulation.add_obstacle(ARENA_OBSTACLES[3].to_vec());
triangulation.add_obstacle(ARENA_OBSTACLES[4].to_vec());
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
b.iter(|| {
let mut mesh = mesh.clone();

Expand Down Expand Up @@ -1972,7 +1972,7 @@ fn merger_many_overlapping(c: &mut Criterion) {
c.bench_function(&"merger many overlapping".to_string(), |b| {
let mut triangulation = random_with_many_obstacles();
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
b.iter(|| {
let mut mesh = mesh.clone();
while mesh.merge_polygons() {}
Expand All @@ -1985,7 +1985,7 @@ fn merger_many_overlapping_once(c: &mut Criterion) {
c.bench_function(&"merger many overlapping (once)".to_string(), |b| {
let mut triangulation = random_with_many_obstacles();
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
b.iter(|| {
let mut mesh = mesh.clone();
mesh.merge_polygons();
Expand Down
14 changes: 7 additions & 7 deletions benches/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ fn triangulation(c: &mut Criterion) {
triangulation.add_obstacle(ARENA_OBSTACLES[3].to_vec());
triangulation.add_obstacle(ARENA_OBSTACLES[4].to_vec());

let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
black_box(mesh);
})
});
Expand All @@ -161,7 +161,7 @@ fn triangulation_bulk(c: &mut Criterion) {
ARENA_OBSTACLES[3].to_vec(),
ARENA_OBSTACLES[4].to_vec(),
]);
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
black_box(mesh);
})
});
Expand All @@ -180,7 +180,7 @@ fn triangulation_overlapping(c: &mut Criterion) {
triangulation.add_obstacle(ARENA_OBSTACLES[4].to_vec());
triangulation.merge_overlapping_obstacles();

let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
black_box(mesh);
})
});
Expand Down Expand Up @@ -219,7 +219,7 @@ fn triangulation_square(c: &mut Criterion) {
vec2(7.5, 7.5),
vec2(7.5, 5.01),
]);
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
black_box(mesh);
})
});
Expand Down Expand Up @@ -259,7 +259,7 @@ fn triangulation_square_overlapping(c: &mut Criterion) {
vec2(7.5, 4.0),
]);
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
black_box(mesh);
})
});
Expand Down Expand Up @@ -2088,7 +2088,7 @@ fn triangulation_many_overlapping(c: &mut Criterion) {
b.iter(|| {
let mut triangulation = random_with_many_obstacles();
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
black_box(mesh);
})
});
Expand All @@ -2102,7 +2102,7 @@ fn triangulation_many_overlapping_simplified(c: &mut Criterion) {
let mut triangulation = random_with_many_obstacles();
triangulation.merge_overlapping_obstacles();
triangulation.simplify(0.005);
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
black_box(mesh);
})
},
Expand Down
2 changes: 1 addition & 1 deletion examples/traced/src/bin/merged.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1828,7 +1828,7 @@ fn main() {
]);
triangulation.merge_overlapping_obstacles();
triangulation.simplify(0.005);
let mut mesh = triangulation.as_navmesh().unwrap();
let mut mesh = triangulation.as_navmesh();
while mesh.merge_polygons() {}
}
}
2 changes: 1 addition & 1 deletion examples/traced/src/bin/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1828,6 +1828,6 @@ fn main() {
]);
triangulation.merge_overlapping_obstacles();
triangulation.simplify(0.005);
triangulation.as_navmesh().unwrap();
triangulation.as_navmesh();
}
}
45 changes: 16 additions & 29 deletions src/input/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,41 +145,32 @@ impl Triangulation {
fn add_constraint_edges(
cdt: &mut ConstrainedDelaunayTriangulation<Point2<f32>>,
edges: &LineString<f32>,
) -> Option<()> {
) {
let mut edge_iter = edges.coords().peekable();
let mut next_point = None;
loop {
let from = edge_iter.next().unwrap();
let next = edge_iter.peek();

let point_a = cdt
.insert(Point2 {
let point_a = next_point.unwrap_or_else(|| {
cdt.insert(Point2 {
x: from.x,
y: from.y,
})
.unwrap();
.unwrap()
});
let point_b = if let Some(next) = next {
cdt.insert(Point2 {
x: next.x,
y: next.y,
})
.unwrap()
} else {
cdt.insert(Point2 {
x: edges[0].x,
y: edges[0].y,
})
.unwrap()
};
if cdt.can_add_constraint(point_a, point_b) {
cdt.add_constraint(point_a, point_b);
} else {
return None;
}
if next.is_none() {
break;
}
};
cdt.add_constraint_and_split(point_a, point_b, |v| v);
next_point = Some(point_b);
}
Some(())
}

/// Convert the triangulation into a [`Mesh`].
Expand All @@ -191,7 +182,7 @@ impl Triangulation {
/// # use glam::vec2;
/// # use polyanya::Triangulation;
/// # let triangulation = Triangulation::from_outer_edges(&[vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0)]);
/// let mut mesh = triangulation.as_navmesh().unwrap();
/// let mut mesh = triangulation.as_navmesh();
///
/// // Merge polygons at least once before baking.
/// mesh.merge_polygons();
Expand All @@ -200,18 +191,14 @@ impl Triangulation {
/// mesh.bake();
/// ```
#[cfg_attr(feature = "tracing", instrument(skip_all))]
pub fn as_navmesh(&self) -> Option<Mesh> {
pub fn as_navmesh(&self) -> Mesh {
let mut cdt = ConstrainedDelaunayTriangulation::<Point2<f32>>::new();
Triangulation::add_constraint_edges(&mut cdt, self.inner.exterior())?;
Triangulation::add_constraint_edges(&mut cdt, self.inner.exterior());

if self
.inner
self.inner
.interiors()
.iter()
.any(|obstacle| Triangulation::add_constraint_edges(&mut cdt, obstacle).is_none())
{
return None;
}
.for_each(|obstacle| Triangulation::add_constraint_edges(&mut cdt, obstacle));

#[cfg(feature = "tracing")]
let polygon_span = tracing::info_span!("listing polygons").entered();
Expand Down Expand Up @@ -278,10 +265,10 @@ impl Triangulation {
#[cfg(feature = "tracing")]
drop(vertex_span);

Some(Mesh {
Mesh {
vertices,
polygons,
..Default::default()
})
}
}
}
4 changes: 2 additions & 2 deletions src/merger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ mod test {
Vec2::new(1., 1.),
Vec2::new(1., -1.),
]);
let mut mesh = triangulation.as_navmesh().unwrap();
let mut mesh = triangulation.as_navmesh();
// println!("{:#?}", mesh);
while mesh.merge_polygons() {
// println!("{:#?}", mesh);
Expand Down Expand Up @@ -316,7 +316,7 @@ mod test {
],
]);
triangulation.simplify(0.001);
let mut mesh = triangulation.as_navmesh().unwrap();
let mut mesh = triangulation.as_navmesh();

mesh.unbake();
// println!("{:#?}", mesh);
Expand Down
2 changes: 1 addition & 1 deletion tests/arena-triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ fn arena_mesh() -> Mesh {
vec2(26., 7.),
vec2(26., 10.),
]);
triangulation.as_navmesh().unwrap()
triangulation.as_navmesh()
}

#[test]
Expand Down
12 changes: 6 additions & 6 deletions tests/triangulation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ fn is_in_mesh() {
vec2(7.5, 7.5),
vec2(7.5, 2.5),
]);
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
for i in 0..10 {
for j in 0..10 {
if i > 2 && i < 8 && j > 2 && j < 8 {
Expand Down Expand Up @@ -61,7 +61,7 @@ fn is_in_mesh_4_obstacles() {
]);
triangulation.merge_overlapping_obstacles();
triangulation.simplify(0.5);
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();

dbg!(mesh.polygons.len());
for i in 0..10 {
Expand Down Expand Up @@ -108,7 +108,7 @@ fn is_in_mesh_overlapping() {
vec2(7.5, 7.5),
vec2(7.5, 4.0),
]);
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
for i in 0..10 {
for j in 0..10 {
if i > 2 && i < 8 && j > 2 && j < 8 {
Expand Down Expand Up @@ -153,7 +153,7 @@ fn is_in_mesh_overlapping_merged() {
vec2(7.5, 4.0),
]);
triangulation.merge_overlapping_obstacles();
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
for i in 0..10 {
for j in 0..10 {
if i > 2 && i < 8 && j > 2 && j < 8 {
Expand Down Expand Up @@ -198,9 +198,9 @@ fn is_in_mesh_overlapping_simplified() {
vec2(7.5, 4.0),
]);
triangulation.merge_overlapping_obstacles();
let polygons_before = triangulation.as_navmesh().unwrap().polygons;
let polygons_before = triangulation.as_navmesh().polygons;
triangulation.simplify(1.0);
let mesh: Mesh = triangulation.as_navmesh().unwrap();
let mesh: Mesh = triangulation.as_navmesh();
assert!(dbg!(polygons_before.len()) > dbg!(mesh.polygons.len()));
for i in 0..10 {
for j in 0..10 {
Expand Down

0 comments on commit 3733978

Please sign in to comment.