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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user