Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix buffer overflow in 2D BVH #53230

Merged
merged 1 commit into from
Sep 30, 2021
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion core/math/bvh_cull.inc
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ struct CullParams {
uint32_t pairable_type;

// optional components for different tests
Vector3 point;
Point point;
BVHABB_CLASS abb;
typename BVHABB_CLASS::ConvexHull hull;
typename BVHABB_CLASS::Segment segment;
Expand Down
27 changes: 12 additions & 15 deletions core/math/bvh_debug.inc
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,21 @@ void _debug_recursive_print_tree(int p_tree_id) const {
}

String _debug_aabb_to_string(const BVHABB_CLASS &aabb) const {
String sz = "(";
sz += itos(aabb.min.x);
sz += " ~ ";
sz += itos(-aabb.neg_max.x);
sz += ") (";
Point size = aabb.calculate_size();

sz += itos(aabb.min.y);
sz += " ~ ";
sz += itos(-aabb.neg_max.y);
sz += ") (";
String sz;
float vol = 0.0;

sz += itos(aabb.min.z);
sz += " ~ ";
sz += itos(-aabb.neg_max.z);
sz += ") ";
for (int i = 0; i < Point::AXES_COUNT; ++i) {
sz += "(";
sz += itos(aabb.min[i]);
sz += " ~ ";
sz += itos(-aabb.neg_max[i]);
sz += ") ";

vol += size[i];
}

Vector3 size = aabb.calculate_size();
float vol = size.x * size.y * size.z;
sz += "vol " + itos(vol);

return sz;
Expand Down
16 changes: 10 additions & 6 deletions core/math/bvh_split.inc
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,15 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
Point centre = full_bound.calculate_centre();
Point size = full_bound.calculate_size();

int order[3];
int order[Point::AXIS_COUNT];

order[0] = size.min_axis();
order[2] = size.max_axis();
order[1] = 3 - (order[0] + order[2]);
order[Point::AXIS_COUNT - 1] = size.max_axis();

static_assert(Point::AXIS_COUNT <= 3);
if (Point::AXIS_COUNT == 3) {
order[1] = 3 - (order[0] + order[2]);
}

// simplest case, split on the longest axis
int split_axis = order[0];
Expand All @@ -54,7 +58,7 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u

// detect when split on longest axis failed
int min_threshold = MAX_ITEMS / 4;
int min_group_size[3];
int min_group_size[Point::AXIS_COUNT];
min_group_size[0] = MIN(num_a, num_b);
if (min_group_size[0] < min_threshold) {
// slow but sure .. first move everything back into a
Expand All @@ -64,7 +68,7 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
num_b = 0;

// now calculate the best split
for (int axis = 1; axis < 3; axis++) {
for (int axis = 1; axis < Point::AXIS_COUNT; axis++) {
split_axis = order[axis];
int count = 0;

Expand All @@ -82,7 +86,7 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
// best axis
int best_axis = 0;
int best_min = min_group_size[0];
for (int axis = 1; axis < 3; axis++) {
for (int axis = 1; axis < Point::AXIS_COUNT; axis++) {
if (min_group_size[axis] > best_min) {
best_min = min_group_size[axis];
best_axis = axis;
Expand Down