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:
@@ -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]);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
@@ -1908,12 +1908,11 @@ 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
|
|
||||||
unode->layer_disp = MEM_callocN(sizeof(float) * unode->totvert, "layer disp");
|
|
||||||
}
|
|
||||||
|
|
||||||
layer_disp = unode->layer_disp;
|
#pragma omp critical
|
||||||
|
{
|
||||||
|
layer_disp = BLI_pbvh_node_layer_disp_get(ss->pbvh, nodes[n]);
|
||||||
|
}
|
||||||
|
|
||||||
sculpt_brush_test_init(ss, &test);
|
sculpt_brush_test_init(ss, &test);
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user