Fix buffer overflow in 2D BVH

Some areas of code were missed and assumed Vector3.
This commit is contained in:
PouleyKetchoupp 2021-09-29 10:32:33 -07:00
parent f72419d152
commit d3c6395dcd
3 changed files with 23 additions and 22 deletions

View file

@ -14,7 +14,7 @@ struct CullParams {
uint32_t pairable_type; uint32_t pairable_type;
// optional components for different tests // optional components for different tests
Vector3 point; Point point;
BVHABB_CLASS abb; BVHABB_CLASS abb;
typename BVHABB_CLASS::ConvexHull hull; typename BVHABB_CLASS::ConvexHull hull;
typename BVHABB_CLASS::Segment segment; typename BVHABB_CLASS::Segment segment;

View file

@ -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 _debug_aabb_to_string(const BVHABB_CLASS &aabb) const {
String sz = "("; Point size = aabb.calculate_size();
sz += itos(aabb.min.x);
sz += " ~ ";
sz += itos(-aabb.neg_max.x);
sz += ") (";
sz += itos(aabb.min.y); String sz;
sz += " ~ "; float vol = 0.0;
sz += itos(-aabb.neg_max.y);
sz += ") (";
sz += itos(aabb.min.z); for (int i = 0; i < Point::AXES_COUNT; ++i) {
sz += "(";
sz += itos(aabb.min[i]);
sz += " ~ "; sz += " ~ ";
sz += itos(-aabb.neg_max.z); sz += itos(-aabb.neg_max[i]);
sz += ") "; sz += ") ";
Vector3 size = aabb.calculate_size(); vol += size[i];
float vol = size.x * size.y * size.z; }
sz += "vol " + itos(vol); sz += "vol " + itos(vol);
return sz; return sz;

View file

@ -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 centre = full_bound.calculate_centre();
Point size = full_bound.calculate_size(); Point size = full_bound.calculate_size();
int order[3]; int order[Point::AXIS_COUNT];
order[0] = size.min_axis(); order[0] = size.min_axis();
order[2] = size.max_axis(); 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]); order[1] = 3 - (order[0] + order[2]);
}
// simplest case, split on the longest axis // simplest case, split on the longest axis
int split_axis = order[0]; int split_axis = order[0];
@ -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 // detect when split on longest axis failed
int min_threshold = MAX_ITEMS / 4; 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); min_group_size[0] = MIN(num_a, num_b);
if (min_group_size[0] < min_threshold) { if (min_group_size[0] < min_threshold) {
// slow but sure .. first move everything back into a // slow but sure .. first move everything back into a
@ -64,7 +68,7 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
num_b = 0; num_b = 0;
// now calculate the best split // 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]; split_axis = order[axis];
int count = 0; int count = 0;
@ -82,7 +86,7 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
// best axis // best axis
int best_axis = 0; int best_axis = 0;
int best_min = min_group_size[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) { if (min_group_size[axis] > best_min) {
best_min = min_group_size[axis]; best_min = min_group_size[axis];
best_axis = axis; best_axis = axis;