* Fix bug in BKE_pbvh_node_color_buffer_get.

This commit is contained in:
Joseph Eagar 2020-10-27 00:20:07 -07:00
parent e2c92c1341
commit 5c77439264
8 changed files with 32 additions and 8 deletions

View File

@ -144,6 +144,7 @@ typedef struct {
typedef struct {
float (*color)[4];
int size;
} PBVHColorBufferNode;
typedef enum {

View File

@ -2941,8 +2941,14 @@ PBVHColorBufferNode *BKE_pbvh_node_color_buffer_get(PBVHNode *node)
totvert = node->uniq_verts;
}
if (node->color_buffer.color && node->color_buffer.size != totvert) {
MEM_freeN(node->color_buffer.color);
node->color_buffer.color = NULL;
}
if (!node->color_buffer.color) {
node->color_buffer.color = MEM_callocN(sizeof(float[4]) * totvert, "Color buffer");
node->color_buffer.size = totvert;
}
return &node->color_buffer;
}

View File

@ -582,6 +582,7 @@ static BMVert *pbvh_bmesh_vert_create(PBVH *pbvh,
/* Log the new vertex */
BM_log_vert_added(pbvh->bm_log, v, cd_vert_mask_offset);
v->head.index = pbvh->bm->totvert; //set provisional index
return v;
}

View File

@ -999,7 +999,7 @@ void BM_log_vert_added(BMLog *log, BMVert *v, const int cd_vert_mask_offset)
lv = bm_log_vert_alloc(log, v, cd_vert_mask_offset);
BLI_ghash_insert(log->current_entry->added_verts, key, lv);
bm_log_vert_customdata(log->bm, log, v, lv);
//bm_log_vert_customdata(log->bm, log, v, lv);
}
/* Log a face before it is modified

View File

@ -787,7 +787,7 @@ static void sculpt_vertex_neighbors_get_faces(SculptSession *ss,
SculptVertRef vertex,
SculptVertexNeighborIter *iter)
{
int index = (int)vertex.i;
int index = BKE_pbvh_vertex_index_to_table(ss->pbvh, vertex);
MeshElemMap *vert_map = &ss->pmap[index];
iter->size = 0;
@ -1326,6 +1326,7 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, Scul
data->unode = unode;
data->pbvh = ss->pbvh;
data->ss = ss;
if (bm) {
data->bm_log = ss->bm_log;
@ -1345,6 +1346,7 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, Scul
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node)
{
SculptUndoNode *unode;
data->ss = ob->sculpt;
unode = SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
SCULPT_orig_vert_data_unode_init(data, ob, unode);
}
@ -1356,8 +1358,16 @@ void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter
{
if (orig_data->unode->type == SCULPT_UNDO_COORDS) {
if (orig_data->bm_log) {
BKE_pbvh_bmesh_update_origvert(
orig_data->pbvh, iter->bm_vert, &orig_data->co, &orig_data->no, NULL);
orig_data->co = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origco_offset);
float *no = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origno_offset);
normal_float_to_short_v3(orig_data->_no, no);
orig_data->no = orig_data->_no;
orig_data->col = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origvcol_offset);
// BKE_pbvh_bmesh_update_origvert(
// orig_data->pbvh, iter->bm_vert, &orig_data->co, &orig_data->no, &orig_data->col);
// BM_log_original_vert_data(orig_data->bm_log, iter->bm_vert, &orig_data->co,
// &orig_data->no);
}
@ -1368,7 +1378,9 @@ void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter
}
else if (orig_data->unode->type == SCULPT_UNDO_COLOR) {
if (orig_data->bm_log) {
BKE_pbvh_bmesh_update_origvert(orig_data->pbvh, iter->bm_vert, NULL, NULL, &orig_data->col);
orig_data->col = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origvcol_offset);
//BKE_pbvh_bmesh_update_origvert(orig_data->pbvh, iter->bm_vert, NULL, NULL, &orig_data->col);
}
else {
orig_data->col = orig_data->colors[iter->i];
@ -1502,11 +1514,11 @@ bool SCULPT_stroke_is_dynamic_topology(const SculptSession *ss, const Brush *bru
return ((BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) &&
(!ss->cache || (!ss->cache->alt_smooth)) &&
/* Requires mesh restore, which doesn't work with
* dynamic-topology. */
!(brush->flag & BRUSH_ANCHORED) && !(brush->flag & BRUSH_DRAG_DOT) &&
SCULPT_TOOL_HAS_DYNTOPO(brush->sculpt_tool));
}

View File

@ -230,6 +230,7 @@ typedef struct {
short (*normals)[3];
const float *vmasks;
float (*colors)[4];
short _no[3];
/* Original coordinate, normal, and mask. */
const float *co;
@ -237,6 +238,7 @@ typedef struct {
float mask;
const float *col;
struct PBVH *pbvh;
struct SculptSession *ss;
} SculptOrigVertData;
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node);

View File

@ -459,6 +459,8 @@ void SCULPT_do_smear_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
return;
}
SCULPT_vertex_random_access_ensure(ss);
const int totvert = SCULPT_vertex_count_get(ss);
if (SCULPT_stroke_is_first_brush_step(ss->cache)) {

View File

@ -872,8 +872,8 @@ typedef enum eBrushUVSculptTool {
SCULPT_TOOL_SLIDE_RELAX, \
SCULPT_TOOL_ELASTIC_DEFORM, \
SCULPT_TOOL_POSE, \
SCULPT_TOOL_DRAW_FACE_SETS, \
SCULPT_TOOL_PAINT, \
SCULPT_TOOL_DRAW_FACE_SETS, \
SCULPT_TOOL_SMEAR, \
\
/* These brushes could handle dynamic topology, \ \