Commit: 1e9a7383efa5b40eaef79b4bb82643f28b83b288 Author: Joseph Eagar Date: Sat Aug 7 19:25:36 2021 -0700 Branches: temp_bmesh_multires https://developer.blender.org/rB1e9a7383efa5b40eaef79b4bb82643f28b83b288
* Don't rely on BMLog's stored normals, instead flag pbvh nodes to update normals on undo/redo. =================================================================== M source/blender/bmesh/intern/bmesh_log.c M source/blender/bmesh/intern/bmesh_log.h M source/blender/editors/sculpt_paint/sculpt_undo.c =================================================================== diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c index acba919e817..9cab7fb02af 100644 --- a/source/blender/bmesh/intern/bmesh_log.c +++ b/source/blender/bmesh/intern/bmesh_log.c @@ -147,7 +147,7 @@ struct BMLog { typedef struct { float co[3]; - short no[3]; + float no[3]; char hflag; float mask; void *customdata; @@ -399,7 +399,8 @@ static void bm_log_vert_bmvert_copy(BMLog *log, bool copy_customdata) { copy_v3_v3(lv->co, v->co); - normal_float_to_short_v3(lv->no, v->no); + copy_v3_v3(lv->no, v->no); + lv->mask = vert_mask_get(v, cd_vert_mask_offset); lv->hflag = v->head.hflag; @@ -583,10 +584,13 @@ static void bm_log_verts_restore( GHASH_ITER (gh_iter, verts) { void *key = BLI_ghashIterator_getKey(&gh_iter); BMLogVert *lv = BLI_ghashIterator_getValue(&gh_iter); + BMVert *v = BM_vert_create(bm, lv->co, NULL, BM_CREATE_SKIP_ID); + vert_mask_set(v, lv->mask, cd_vert_mask_offset); + v->head.hflag = lv->hflag; - normal_short_to_float_v3(v->no, lv->no); + copy_v3_v3(v->no, lv->no); #ifdef CUSTOMDATA if (lv->customdata) { @@ -698,13 +702,13 @@ static void bm_log_vert_values_swap( uint id = POINTER_AS_UINT(key); BMVert *v = bm_log_vert_from_id(log, id); float mask; - short normal[3]; swap_v3_v3(v->co, lv->co); - copy_v3_v3_short(normal, lv->no); - normal_float_to_short_v3(lv->no, v->no); - normal_short_to_float_v3(v->no, normal); + swap_v3_v3(v->no, lv->no); + SWAP(char, v->head.hflag, lv->hflag); + + // TODO: probably don't need to deal with mask explicitly anymore mask = lv->mask; lv->mask = vert_mask_get(v, cd_vert_mask_offset); vert_mask_set(v, mask, cd_vert_mask_offset); @@ -2120,7 +2124,7 @@ const float *BM_log_original_vert_co(BMLog *log, BMVert *v) /* Get the logged normal of a vertex * * Does not modify the log or the vertex */ -const short *BM_log_original_vert_no(BMLog *log, BMVert *v) +const float *BM_log_original_vert_no(BMLog *log, BMVert *v) { BMLogEntry *entry = log->current_entry; const BMLogVert *lv; @@ -2153,7 +2157,7 @@ float BM_log_original_mask(BMLog *log, BMVert *v) return lv->mask; } -void BM_log_original_vert_data(BMLog *log, BMVert *v, const float **r_co, const short **r_no) +void BM_log_original_vert_data(BMLog *log, BMVert *v, const float **r_co, const float **r_no) { BMLogEntry *entry = log->current_entry; const BMLogVert *lv; diff --git a/source/blender/bmesh/intern/bmesh_log.h b/source/blender/bmesh/intern/bmesh_log.h index c7a1629a496..f83c5741e10 100644 --- a/source/blender/bmesh/intern/bmesh_log.h +++ b/source/blender/bmesh/intern/bmesh_log.h @@ -115,13 +115,13 @@ void BM_log_before_all_removed(BMesh *bm, BMLog *log); const float *BM_log_original_vert_co(BMLog *log, BMVert *v); /* Get the logged normal of a vertex */ -const short *BM_log_original_vert_no(BMLog *log, BMVert *v); +const float *BM_log_original_vert_no(BMLog *log, BMVert *v); /* Get the logged mask of a vertex */ float BM_log_original_mask(BMLog *log, BMVert *v); /* Get the logged data of a vertex (avoid multiple lookups) */ -void BM_log_original_vert_data(BMLog *log, BMVert *v, const float **r_co, const short **r_no); +void BM_log_original_vert_data(BMLog *log, BMVert *v, const float **r_co, const float **r_no); /* For internal use only (unit testing) */ BMLogEntry *BM_log_current_entry(BMLog *log); diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c index 769598ebab3..a2a60936fbb 100644 --- a/source/blender/editors/sculpt_paint/sculpt_undo.c +++ b/source/blender/editors/sculpt_paint/sculpt_undo.c @@ -423,6 +423,7 @@ static void sculpt_undo_bmesh_restore_generic_task_cb( PBVHNode **nodes = userdata; BKE_pbvh_node_mark_redraw(nodes[n]); + BKE_pbvh_node_mark_normals_update(nodes[n]); } extern const char dyntopop_node_idx_layer_id[]; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs