Update object bounding box during sculpt

Fixes the sculpt object being incorrectly clipped during drawing due
to an out-of-date bounding box making it seem that the object had gone
outside the view.

Added a BKE_pbvh function to get the top-level bounding box. In
sculpt_flush_update(), where the PBVH bounds are updated, the result
is copied to the object's bounding box.

Fixes bug [#33790]
projects.blender.org/tracker/?func=detail&aid=33790&group_id=9&atid=498
This commit is contained in:
Nicholas Bishop
2013-01-20 00:19:57 +00:00
parent 383987560b
commit 4256ad7566
3 changed files with 32 additions and 0 deletions

View File

@@ -113,6 +113,9 @@ typedef enum {
PBVHType BKE_pbvh_type(const PBVH *bvh);
/* Get the PBVH root's bounding box */
void BKE_pbvh_bounding_box(const PBVH *bvh, float min[3], float max[3]);
/* multires hidden data, only valid for type == PBVH_GRIDS */
unsigned int **BKE_pbvh_grid_hidden(const PBVH *bvh);

View File

@@ -1238,6 +1238,19 @@ PBVHType BKE_pbvh_type(const PBVH *bvh)
return bvh->type;
}
void BKE_pbvh_bounding_box(const PBVH *bvh, float min[3], float max[3])
{
if (bvh->totnode) {
const BB *bb = &bvh->nodes[0].vb;
copy_v3_v3(min, bb->bmin);
copy_v3_v3(max, bb->bmax);
}
else {
zero_v3(min);
zero_v3(max);
}
}
BLI_bitmap *BKE_pbvh_grid_hidden(const PBVH *bvh)
{
BLI_assert(bvh->type == PBVH_GRIDS);

View File

@@ -4180,6 +4180,17 @@ static void sculpt_restore_mesh(Sculpt *sd, Object *ob)
}
}
/* Copy the PBVH bounding box into the object's bounding box */
static void sculpt_update_object_bounding_box(Object *ob)
{
if (ob->bb) {
float bb_min[3], bb_max[3];
BKE_pbvh_bounding_box(ob->sculpt->pbvh, bb_min, bb_max);
BKE_boundbox_init_from_minmax(ob->bb, bb_min, bb_max);
}
}
static void sculpt_flush_update(bContext *C)
{
Object *ob = CTX_data_active_object(C);
@@ -4200,6 +4211,11 @@ static void sculpt_flush_update(bContext *C)
rcti r;
BKE_pbvh_update(ss->pbvh, PBVH_UpdateBB, NULL);
/* Update the object's bounding box too so that the object
* doesn't get incorrectly clipped during drawing in
* draw_mesh_object(). [#33790] */
sculpt_update_object_bounding_box(ob);
if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) {
if (ss->cache)
ss->cache->previous_r = r;