Move layer displacements from SculptUndoNode to PBVHNode

* This doesn't make much difference for regular mesh/multires
  sculpting, but for dynamic topology sculpting the undo stack isn't
  split up by PBVH nodes, so it's more convenient to store the layer
  data in PBVH nodes.

* Note that the life cycle of the layer displacement data is
  unchanged -- it's only valid during a stroke with the layer brush,
  gets free'd when the undo step ends.
This commit is contained in:
Nicholas Bishop
2012-12-30 18:26:11 +00:00
parent ec258542e2
commit 31f978c8ef
6 changed files with 39 additions and 15 deletions

View File

@@ -156,6 +156,14 @@ void BLI_pbvh_grids_update(PBVH *bvh, struct CCGElem **grid_elems,
struct DMGridAdjacency *gridadj, void **gridfaces, struct DMGridAdjacency *gridadj, void **gridfaces,
struct DMFlagMat *flagmats, unsigned int **grid_hidden); struct DMFlagMat *flagmats, unsigned int **grid_hidden);
/* Layer displacement */
/* Get the node's displacement layer, creating it if necessary */
float *BLI_pbvh_node_layer_disp_get(PBVH *pbvh, PBVHNode *node);
/* If the node has a displacement layer, free it and set to null */
void BLI_pbvh_node_layer_disp_free(PBVHNode *node);
/* vertex deformer */ /* vertex deformer */
float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3]; float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3];
void BLI_pbvh_apply_vertCos(struct PBVH *pbvh, float (*vertCos)[3]); void BLI_pbvh_apply_vertCos(struct PBVH *pbvh, float (*vertCos)[3]);

View File

@@ -600,6 +600,7 @@ void BLI_pbvh_free(PBVH *bvh)
MEM_freeN(node->vert_indices); MEM_freeN(node->vert_indices);
if (node->face_vert_indices) if (node->face_vert_indices)
MEM_freeN(node->face_vert_indices); MEM_freeN(node->face_vert_indices);
BLI_pbvh_node_layer_disp_free(node);
} }
} }
@@ -1611,6 +1612,26 @@ void BLI_pbvh_grids_update(PBVH *bvh, CCGElem **grids, DMGridAdjacency *gridadj,
} }
} }
/* Get the node's displacement layer, creating it if necessary */
float *BLI_pbvh_node_layer_disp_get(PBVH *bvh, PBVHNode *node)
{
if (!node->layer_disp) {
int totvert = 0;
BLI_pbvh_node_num_verts(bvh, node, &totvert, NULL);
node->layer_disp = MEM_callocN(sizeof(float) * totvert, "layer disp");
}
return node->layer_disp;
}
/* If the node has a displacement layer, free it and set to null */
void BLI_pbvh_node_layer_disp_free(PBVHNode *node)
{
if (node->layer_disp) {
MEM_freeN(node->layer_disp);
node->layer_disp = NULL;
}
}
float (*BLI_pbvh_get_vertCos(PBVH * pbvh))[3] float (*BLI_pbvh_get_vertCos(PBVH * pbvh))[3]
{ {
int a; int a;

View File

@@ -91,6 +91,9 @@ struct PBVHNode {
/* Used for raycasting: how close bb is to the ray point. */ /* Used for raycasting: how close bb is to the ray point. */
float tmin; float tmin;
/* Scalar displacements for sculpt mode's layer brush. */
float *layer_disp;
int proxy_count; int proxy_count;
PBVHProxyNode *proxies; PBVHProxyNode *proxies;
}; };

View File

@@ -1908,13 +1908,12 @@ static void do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
unode = sculpt_undo_push_node(ob, nodes[n], SCULPT_UNDO_COORDS); unode = sculpt_undo_push_node(ob, nodes[n], SCULPT_UNDO_COORDS);
origco = unode->co; origco = unode->co;
if (!unode->layer_disp) {
#pragma omp critical #pragma omp critical
unode->layer_disp = MEM_callocN(sizeof(float) * unode->totvert, "layer disp"); {
layer_disp = BLI_pbvh_node_layer_disp_get(ss->pbvh, nodes[n]);
} }
layer_disp = unode->layer_disp;
sculpt_brush_test_init(ss, &test); sculpt_brush_test_init(ss, &test);
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE)

View File

@@ -101,9 +101,6 @@ typedef struct SculptUndoNode {
int *grids; /* to restore into right location */ int *grids; /* to restore into right location */
BLI_bitmap *grid_hidden; BLI_bitmap *grid_hidden;
/* layer brush */
float *layer_disp;
/* shape keys */ /* shape keys */
char shapeName[sizeof(((KeyBlock *)0))->name]; char shapeName[sizeof(((KeyBlock *)0))->name];
} SculptUndoNode; } SculptUndoNode;

View File

@@ -374,8 +374,6 @@ static void sculpt_undo_free(ListBase *lb)
MEM_freeN(unode->index); MEM_freeN(unode->index);
if (unode->grids) if (unode->grids)
MEM_freeN(unode->grids); MEM_freeN(unode->grids);
if (unode->layer_disp)
MEM_freeN(unode->layer_disp);
if (unode->orig_co) if (unode->orig_co)
MEM_freeN(unode->orig_co); MEM_freeN(unode->orig_co);
if (unode->vert_hidden) if (unode->vert_hidden)
@@ -612,10 +610,8 @@ void sculpt_undo_push_end(void)
unode->no = NULL; unode->no = NULL;
} }
if (unode->layer_disp) { if (unode->node)
MEM_freeN(unode->layer_disp); BLI_pbvh_node_layer_disp_free(unode->node);
unode->layer_disp = NULL;
}
} }
undo_paint_push_end(UNDO_PAINT_MESH); undo_paint_push_end(UNDO_PAINT_MESH);