[Bf-blender-cvs] [587f75f0097] master: Cleanup: Use function pointers in sculpt gestures
Pablo Dobarro
noreply at git.blender.org
Fri Sep 4 16:42:38 CEST 2020
Commit: 587f75f009714d293efb2c7a13d479099a60a3fb
Author: Pablo Dobarro
Date: Fri Sep 4 14:56:15 2020 +0200
Branches: master
https://developer.blender.org/rB587f75f009714d293efb2c7a13d479099a60a3fb
Cleanup: Use function pointers in sculpt gestures
This replaces the switch case and operation types with a
SculptGestureOperation struct with callbacks.
Reviewed By: sergey
Differential Revision: https://developer.blender.org/D8798
===================================================================
M source/blender/editors/sculpt_paint/paint_mask.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c
index a8726482ccc..843454e6f59 100644
--- a/source/blender/editors/sculpt_paint/paint_mask.c
+++ b/source/blender/editors/sculpt_paint/paint_mask.c
@@ -230,11 +230,6 @@ typedef enum eSculptGestureShapeType {
SCULPT_GESTURE_SHAPE_LASSO,
} eMaskGesturesShapeType;
-typedef enum eSculptGestureOperationType {
- SCULPT_GESTURE_MASK,
- SCULPT_GESTURE_FACE_SET,
-} eSculptGestureOperationType;
-
typedef struct LassoGestureData {
float projviewobjmat[4][4];
@@ -245,6 +240,8 @@ typedef struct LassoGestureData {
BLI_bitmap *mask_px;
} LassoGestureData;
+struct SculptGestureOperation;
+
typedef struct SculptGestureContext {
SculptSession *ss;
ViewContext vc;
@@ -255,15 +252,9 @@ typedef struct SculptGestureContext {
/* Operation parameters. */
eMaskGesturesShapeType shape_type;
- eSculptGestureOperationType operation;
bool front_faces_only;
- /* Mask operation parameters. */
- PaintMaskFloodMode mask_mode;
- float mask_value;
-
- /* Face Set operation parameters. */
- int new_face_set_id;
+ struct SculptGestureOperation *operation;
/* View parameters. */
float true_view_normal[3];
@@ -280,6 +271,18 @@ typedef struct SculptGestureContext {
int totnode;
} SculptGestureContext;
+typedef struct SculptGestureOperation {
+ /* Initial setup (data updates, special undo push...). */
+ void (*sculpt_gesture_begin)(struct bContext *, SculptGestureContext *);
+
+ /* Apply the gesture action for each symmetry pass. */
+ void (*sculpt_gesture_apply_for_symmetry_pass)(struct bContext *, SculptGestureContext *);
+
+ /* Remaining actions after finishing the symmetry passes iterations (updating datalayers, tagging
+ * PBVH updates...) */
+ void (*sculpt_gesture_end)(struct bContext *, SculptGestureContext *);
+} SculptGestureOperation;
+
static void sculpt_gesture_operator_properties(wmOperatorType *ot)
{
RNA_def_boolean(ot->srna,
@@ -393,6 +396,7 @@ static SculptGestureContext *sculpt_gesture_init_from_box(bContext *C, wmOperato
static void sculpt_gesture_context_free(SculptGestureContext *sgcontext)
{
MEM_SAFE_FREE(sgcontext->lasso.mask_px);
+ MEM_SAFE_FREE(sgcontext->operation);
MEM_SAFE_FREE(sgcontext->nodes);
MEM_SAFE_FREE(sgcontext);
}
@@ -493,44 +497,47 @@ static bool sculpt_gesture_is_vertex_effected(SculptGestureContext *sgcontext, P
return false;
}
-static void mask_gesture_apply_task_cb(void *__restrict userdata,
- const int i,
- const TaskParallelTLS *__restrict UNUSED(tls))
+static void sculpt_gesture_apply(bContext *C, SculptGestureContext *sgcontext)
{
- SculptGestureContext *sgcontext = userdata;
- Object *ob = sgcontext->vc.obact;
- PBVHNode *node = sgcontext->nodes[i];
-
- const bool is_multires = BKE_pbvh_type(sgcontext->ss->pbvh) == PBVH_GRIDS;
+ SculptGestureOperation *operation = sgcontext->operation;
+ SCULPT_undo_push_begin("Sculpt Gesture Apply");
- PBVHVertexIter vd;
- bool any_masked = false;
- bool redraw = false;
+ operation->sculpt_gesture_begin(C, sgcontext);
- BKE_pbvh_vertex_iter_begin(sgcontext->ss->pbvh, node, vd, PBVH_ITER_UNIQUE)
- {
- if (sculpt_gesture_is_vertex_effected(sgcontext, &vd)) {
- float prevmask = *vd.mask;
- if (!any_masked) {
- any_masked = true;
+ for (ePaintSymmetryFlags symmpass = 0; symmpass <= sgcontext->symm; symmpass++) {
+ if (SCULPT_is_symmetry_iteration_valid(symmpass, sgcontext->symm)) {
+ sculpt_gesture_flip_for_symmetry_pass(sgcontext, symmpass);
+ sculpt_gesture_update_effected_nodes(sgcontext);
- SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
+ operation->sculpt_gesture_apply_for_symmetry_pass(C, sgcontext);
- if (is_multires) {
- BKE_pbvh_node_mark_normals_update(node);
- }
- }
- mask_flood_fill_set_elem(vd.mask, sgcontext->mask_mode, sgcontext->mask_value);
- if (prevmask != *vd.mask) {
- redraw = true;
- }
+ MEM_SAFE_FREE(sgcontext->nodes);
}
}
- BKE_pbvh_vertex_iter_end;
- if (redraw) {
- BKE_pbvh_node_mark_update_mask(node);
- }
+ operation->sculpt_gesture_end(C, sgcontext);
+
+ SCULPT_undo_push_end();
+
+ ED_region_tag_redraw(sgcontext->vc.region);
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, sgcontext->vc.obact);
+}
+
+/* Face Set Gesture Operation. */
+
+typedef struct SculptGestureFaceSetOperation {
+ SculptGestureOperation op;
+
+ int new_face_set_id;
+} SculptGestureFaceSetOperation;
+
+static void sculpt_gesture_face_set_begin(bContext *C, SculptGestureContext *sgcontext)
+{
+ Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
+ BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, true, false, false);
+
+ /* Face Sets modifications do a single undo push. */
+ SCULPT_undo_push_node(sgcontext->vc.obact, NULL, SCULPT_UNDO_FACE_SETS);
}
static void face_set_gesture_apply_task_cb(void *__restrict userdata,
@@ -538,6 +545,8 @@ static void face_set_gesture_apply_task_cb(void *__restrict userdata,
const TaskParallelTLS *__restrict UNUSED(tls))
{
SculptGestureContext *sgcontext = userdata;
+ SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *)
+ sgcontext->operation;
PBVHNode *node = sgcontext->nodes[i];
PBVHVertexIter vd;
bool any_updated = false;
@@ -545,7 +554,7 @@ static void face_set_gesture_apply_task_cb(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin(sgcontext->ss->pbvh, node, vd, PBVH_ITER_UNIQUE)
{
if (sculpt_gesture_is_vertex_effected(sgcontext, &vd)) {
- SCULPT_vertex_face_set_set(sgcontext->ss, vd.index, sgcontext->new_face_set_id);
+ SCULPT_vertex_face_set_set(sgcontext->ss, vd.index, face_set_operation->new_face_set_id);
any_updated = true;
}
}
@@ -556,77 +565,123 @@ static void face_set_gesture_apply_task_cb(void *__restrict userdata,
}
}
-static void sculpt_gesture_apply(bContext *C, SculptGestureContext *mcontext)
+static void sculpt_gesture_face_set_apply_for_symmetry_pass(bContext *UNUSED(C),
+ SculptGestureContext *sgcontext)
+{
+ TaskParallelSettings settings;
+ BKE_pbvh_parallel_range_settings(&settings, true, sgcontext->totnode);
+ BLI_task_parallel_range(
+ 0, sgcontext->totnode, sgcontext, face_set_gesture_apply_task_cb, &settings);
+}
+
+static void sculpt_gesture_face_set_end(bContext *UNUSED(C), SculptGestureContext *sgcontext)
+{
+ BKE_pbvh_update_vertex_data(sgcontext->ss->pbvh, PBVH_UpdateVisibility);
+}
+
+static void sculpt_gesture_init_face_set_properties(SculptGestureContext *sgcontext,
+ wmOperator *UNUSED(op))
+{
+ struct Mesh *mesh = BKE_mesh_from_object(sgcontext->vc.obact);
+ sgcontext->operation = MEM_callocN(sizeof(SculptGestureFaceSetOperation), "Face Set Operation");
+
+ SculptGestureFaceSetOperation *face_set_operation = (SculptGestureFaceSetOperation *)
+ sgcontext->operation;
+
+ face_set_operation->op.sculpt_gesture_begin = sculpt_gesture_face_set_begin;
+ face_set_operation->op.sculpt_gesture_apply_for_symmetry_pass =
+ sculpt_gesture_face_set_apply_for_symmetry_pass;
+ face_set_operation->op.sculpt_gesture_end = sculpt_gesture_face_set_end;
+
+ face_set_operation->new_face_set_id = ED_sculpt_face_sets_find_next_available_id(mesh);
+}
+
+/* Mask Gesture Operation. */
+
+typedef struct SculptGestureMaskOperation {
+ SculptGestureOperation op;
+
+ PaintMaskFloodMode mode;
+ float value;
+} SculptGestureMaskOperation;
+
+static void sculpt_gesture_mask_begin(bContext *C, SculptGestureContext *sgcontext)
{
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
+ BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, false, true, false);
+}
- const bool needs_mask = mcontext->operation == SCULPT_GESTURE_MASK;
- const bool needs_connectivity = mcontext->operation == SCULPT_GESTURE_FACE_SET;
+static void mask_gesture_apply_task_cb(void *__restrict userdata,
+ const int i,
+ const TaskParallelTLS *__restrict UNUSED(tls))
+{
+ SculptGestureContext *sgcontext = userdata;
+ SculptGestureMaskOperation *mask_operation = (SculptGestureMaskOperation *)sgcontext->operation;
+ Object *ob = sgcontext->vc.obact;
+ PBVHNode *node = sgcontext->nodes[i];
- BKE_sculpt_update_object_for_edit(
- depsgraph, mcontext->vc.obact, needs_connectivity, needs_mask, false);
+ const bool is_multires = BKE_pbvh_type(sgcontext->ss->pbvh) == PBVH_GRIDS;
- SCULPT_undo_push_begin("Sculpt Gesture Apply");
+ PBVHVertexIter vd;
+ bool any_masked = false;
+ bool redraw = false;
- if (mcontext->operation == SCULPT_GESTURE_FACE_SET) {
- /* Face Sets modifications do a single undo push. */
- SCULPT_undo_push_node(mcontext->vc.obact, NULL, SCULPT_UNDO_FACE_SETS);
- }
+ BKE_pbvh_vertex_iter_begin(sgcontext->ss->pbvh, node, vd, PBVH_ITER_UNIQUE)
+ {
+ if (sculpt_gesture_is_vertex_effected(sgcontext, &vd)) {
+ float prevmask = *vd.mask;
+ if (!any_masked) {
+ any_masked = true;
- for (ePaintSymmetryFlags symmpass = 0; symmpass <= mcontext->symm; symmpass++) {
- if (SCULPT_is_symmetry_iteration_valid(symmpass, mcontext->symm)) {
- sculpt_gesture_flip_for_symmetry_pass(mcontext, symmpass);
- sculpt_gesture_update_effected_nodes(mcontext);
-
- TaskParallelSettings settings;
- BKE_pbvh_parallel_range_settings(&settings, true, mcontext->totnode);
- switch (mcontext->operation) {
- case SCULPT_GESTURE_MASK:
- BLI_task_parallel_range(
- 0, mcontext->totnode, mcontext, mask_gesture_apply_task_cb, &settings);
- break;
- case SCULPT_GESTURE_FACE_SET:
- BLI_task_parallel_range(
- 0, mcontext->totnode, mcontext, face_set_gesture_apply_task_cb, &settings
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list