int BLI_bvhtree_insert(BVHTree *tree, int index, const float *co, int numpoints) { int i; BVHNode *node = NULL; // insert should only possible as long as tree->totbranch is 0 if (tree->totbranch > 0) return 0; if (tree->totleaf+1 >= MEM_allocN_len(tree->nodes)/sizeof(*(tree->nodes))) return 0; // TODO check if have enough nodes in array node = tree->nodes[tree->totleaf] = &(tree->nodearray[tree->totleaf]); tree->totleaf++; create_kdop_hull(tree, node, co, numpoints, 0); node->index= index; // inflate the bv with some epsilon for (i = tree->start_axis; i < tree->stop_axis; i++) { node->bv[(2 * i)] -= tree->epsilon; // minimum node->bv[(2 * i) + 1] += tree->epsilon; // maximum } return 1; }
int BLI_bvhtree_insert(BVHTree *tree, int index, const float co[3], int numpoints) { axis_t axis_iter; BVHNode *node = NULL; /* insert should only possible as long as tree->totbranch is 0 */ if (tree->totbranch > 0) return 0; if (tree->totleaf + 1 >= MEM_allocN_len(tree->nodes) / sizeof(*(tree->nodes))) return 0; /* TODO check if have enough nodes in array */ node = tree->nodes[tree->totleaf] = &(tree->nodearray[tree->totleaf]); tree->totleaf++; create_kdop_hull(tree, node, co, numpoints, 0); node->index = index; /* inflate the bv with some epsilon */ for (axis_iter = tree->start_axis; axis_iter < tree->stop_axis; axis_iter++) { node->bv[(2 * axis_iter)] -= tree->epsilon; /* minimum */ node->bv[(2 * axis_iter) + 1] += tree->epsilon; /* maximum */ } return 1; }
// call before BLI_bvhtree_update_tree() int BLI_bvhtree_update_node(BVHTree *tree, int index, const float *co, const float *co_moving, int numpoints) { int i; BVHNode *node= NULL; // check if index exists if (index > tree->totleaf) return 0; node = tree->nodearray + index; create_kdop_hull(tree, node, co, numpoints, 0); if (co_moving) create_kdop_hull(tree, node, co_moving, numpoints, 1); // inflate the bv with some epsilon for (i = tree->start_axis; i < tree->stop_axis; i++) { node->bv[(2 * i)] -= tree->epsilon; // minimum node->bv[(2 * i) + 1] += tree->epsilon; // maximum } return 1; }
/* call before BLI_bvhtree_update_tree() */ int BLI_bvhtree_update_node(BVHTree *tree, int index, const float co[3], const float co_moving[3], int numpoints) { BVHNode *node = NULL; axis_t axis_iter; /* check if index exists */ if (index > tree->totleaf) return 0; node = tree->nodearray + index; create_kdop_hull(tree, node, co, numpoints, 0); if (co_moving) create_kdop_hull(tree, node, co_moving, numpoints, 1); /* inflate the bv with some epsilon */ for (axis_iter = tree->start_axis; axis_iter < tree->stop_axis; axis_iter++) { node->bv[(2 * axis_iter)] -= tree->epsilon; /* minimum */ node->bv[(2 * axis_iter) + 1] += tree->epsilon; /* maximum */ } return 1; }