diff options
-rw-r--r-- | source/blender/blenkernel/BKE_paint.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/paint.c | 2 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 37 |
3 files changed, 32 insertions, 15 deletions
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index c36e9f6961f..f88d1a1ee40 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -283,11 +283,11 @@ typedef struct SculptClothSimulation { } SculptClothSimulation; -typedef struct SculptLayerPersistentBase { +typedef struct SculptPersistentBase { float co[3]; float no[3]; float disp; -} SculptLayerPersistentBase; +} SculptPersistentBase; typedef struct SculptVertexInfo { /* Idexed by vertex, stores and ID of its topologycally connected component. */ @@ -392,9 +392,9 @@ typedef struct SculptSession { float pose_origin[3]; SculptPoseIKChain *pose_ik_chain_preview; - /* Layer brush persistence between strokes */ + /* Mesh State Persistence */ /* This is freed with the PBVH, so it is always in sync with the mesh. */ - SculptLayerPersistentBase *layer_base; + SculptPersistentBase *persistent_base; SculptVertexInfo vertex_info; SculptFakeNeighbors fake_neighbors; diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index f0026ec58dc..b3ab856468c 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -1310,7 +1310,7 @@ static void sculptsession_free_pbvh(Object *object) MEM_SAFE_FREE(ss->pmap); MEM_SAFE_FREE(ss->pmap_mem); - MEM_SAFE_FREE(ss->layer_base); + MEM_SAFE_FREE(ss->persistent_base); MEM_SAFE_FREE(ss->preview_vert_index_list); ss->preview_vert_index_count = 0; diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index d414d6d8f0f..a753b7b4c26 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -198,6 +198,23 @@ void SCULPT_vertex_normal_get(SculptSession *ss, int index, float no[3]) } } +const float *SCULPT_vertex_persistent_co_get(SculptSession *ss, int index) +{ + if (ss->persistent_base) { + return ss->persistent_base[index].co; + } + return SCULPT_vertex_co_get(ss, index); +} + +void SCULPT_vertex_persistent_normal_get(SculptSession *ss, int index, float no[3]) +{ + if (ss->persistent_base) { + copy_v3_v3(no, ss->persistent_base[index].no); + return; + } + SCULPT_vertex_normal_get(ss, index, no); +} + float SCULPT_vertex_mask_get(SculptSession *ss, int index) { BMVert *v; @@ -4136,7 +4153,7 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata, Sculpt *sd = data->sd; const Brush *brush = data->brush; - const bool use_persistent_base = ss->layer_base && brush->flag & BRUSH_PERSISTENT; + const bool use_persistent_base = ss->persistent_base && brush->flag & BRUSH_PERSISTENT; PBVHVertexIter vd; SculptOrigVertData orig_data; @@ -4166,7 +4183,7 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata, const int vi = vd.index; float *disp_factor; if (use_persistent_base) { - disp_factor = &ss->layer_base[vi].disp; + disp_factor = &ss->persistent_base[vi].disp; } else { disp_factor = &ss->cache->layer_displacement_factor[vi]; @@ -4196,9 +4213,9 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata, float normal[3]; if (use_persistent_base) { - copy_v3_v3(normal, ss->layer_base[vi].no); + SCULPT_vertex_persistent_normal_get(ss, vi, normal); mul_v3_fl(normal, brush->height); - madd_v3_v3v3fl(final_co, ss->layer_base[vi].co, normal, *disp_factor); + madd_v3_v3v3fl(final_co, SCULPT_vertex_persistent_co_get(ss, vi), normal, *disp_factor); } else { normal_short_to_float_v3(normal, orig_data.no); @@ -7457,16 +7474,16 @@ static int sculpt_set_persistent_base_exec(bContext *C, wmOperator *UNUSED(op)) SCULPT_vertex_random_access_init(ss); BKE_sculpt_update_object_for_edit(depsgraph, ob, false, false, false); - MEM_SAFE_FREE(ss->layer_base); + MEM_SAFE_FREE(ss->persistent_base); const int totvert = SCULPT_vertex_count_get(ss); - ss->layer_base = MEM_mallocN(sizeof(SculptLayerPersistentBase) * totvert, - "layer persistent base"); + ss->persistent_base = MEM_mallocN(sizeof(SculptPersistentBase) * totvert, + "layer persistent base"); for (int i = 0; i < totvert; i++) { - copy_v3_v3(ss->layer_base[i].co, SCULPT_vertex_co_get(ss, i)); - SCULPT_vertex_normal_get(ss, i, ss->layer_base[i].no); - ss->layer_base[i].disp = 0.0f; + copy_v3_v3(ss->persistent_base[i].co, SCULPT_vertex_co_get(ss, i)); + SCULPT_vertex_normal_get(ss, i, ss->persistent_base[i].no); + ss->persistent_base[i].disp = 0.0f; } } |