Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Change Log

### Fixed

- Fix `clip_aabb_line` crashing when given incorrect inputs (zero length direction or NAN).

## 0.21.1

### Added
Expand Down
53 changes: 53 additions & 0 deletions src/query/clip/clip_aabb_line.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,11 @@ pub fn clip_aabb_line(
let near = if near_diag {
(tmin, -dir.normalize(), near_side)
} else {
// If near_side is 0, the index calculation would be invalid (-1).
if near_side == 0 {
return None;
}

let mut normal = Vector::zeros();

if near_side < 0 {
Expand All @@ -147,6 +152,11 @@ pub fn clip_aabb_line(
let far = if far_diag {
(tmax, -dir.normalize(), far_side)
} else {
// If far_side is 0, the index calculation would be invalid (-1).
if far_side == 0 {
return None;
}

let mut normal = Vector::zeros();

if far_side < 0 {
Expand All @@ -160,3 +170,46 @@ pub fn clip_aabb_line(

Some((near, far))
}
#[cfg(test)]
mod test {
use super::*;

#[test]
pub fn clip_empty_aabb_line() {
assert!(clip_aabb_line(
&Aabb::new(Point::origin(), Point::origin()),
&Point::origin(),
&[
0.0,
0.0,
#[cfg(feature = "dim3")]
0.0,
]
.into(),
)
.is_none());
}

#[test]
pub fn clip_empty_aabb_segment() {
let aabb_empty = Aabb::new(Point::origin(), Point::origin());
assert!(aabb_empty
.clip_segment(
&[
0.0,
0.0,
#[cfg(feature = "dim3")]
0.0,
]
.into(),
&[
Real::NAN,
Real::NAN,
#[cfg(feature = "dim3")]
Real::NAN,
]
.into(),
)
.is_none());
}
}