Cleanup: Use function pointers in geometry extract

This replaces the switch case with function pointers to
extract masks or face sets.

Reviewed By: sergey

Differential Revision: https://developer.blender.org/D8796
This commit is contained in:
Pablo Dobarro 2020-09-04 14:50:52 +02:00
parent 3215651f47
commit 985cc48fca
1 changed files with 50 additions and 56 deletions

View File

@ -61,11 +61,6 @@
#include "mesh_intern.h" /* own include */ #include "mesh_intern.h" /* own include */
typedef enum eGeometryExtractModeType {
GEOMETRY_EXTRACT_MASK = 0,
GEOMETRY_EXTRACT_FACE_SET = 1,
} eGeometryExtractModeType;
static bool geometry_extract_poll(bContext *C) static bool geometry_extract_poll(bContext *C)
{ {
Object *ob = CTX_data_active_object(C); Object *ob = CTX_data_active_object(C);
@ -79,41 +74,6 @@ static bool geometry_extract_poll(bContext *C)
return false; return false;
} }
static void geometry_extract_tag_masked_faces(BMesh *bm, const float threshold)
{
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
BMFace *f;
BMIter iter;
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
bool keep_face = true;
BMVert *v;
BMIter face_iter;
BM_ITER_ELEM (v, &face_iter, f, BM_VERTS_OF_FACE) {
const float mask = BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset);
if (mask < threshold) {
keep_face = false;
break;
}
}
BM_elem_flag_set(f, BM_ELEM_TAG, !keep_face);
}
}
static void geometry_extract_tag_face_set(BMesh *bm, const int tag_face_set_id)
{
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
const int cd_face_sets_offset = CustomData_get_offset(&bm->pdata, CD_SCULPT_FACE_SETS);
BMFace *f;
BMIter iter;
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
const int face_set_id = abs(BM_ELEM_CD_GET_INT(f, cd_face_sets_offset));
BM_elem_flag_set(f, BM_ELEM_TAG, face_set_id != tag_face_set_id);
}
}
typedef struct GeometryExtactParams { typedef struct GeometryExtactParams {
/* For extracting Face Sets. */ /* For extracting Face Sets. */
int active_face_set; int active_face_set;
@ -128,9 +88,12 @@ typedef struct GeometryExtactParams {
bool add_solidify; bool add_solidify;
} GeometryExtractParams; } GeometryExtractParams;
/* Function that tags in BMesh the faces that should be deleted in the extracted object. */
typedef void(GeometryExtractTagMeshFunc)(struct BMesh *, GeometryExtractParams *);
static int geometry_extract_apply(bContext *C, static int geometry_extract_apply(bContext *C,
wmOperator *op, wmOperator *op,
eGeometryExtractModeType mode, GeometryExtractTagMeshFunc *tag_fn,
GeometryExtractParams *params) GeometryExtractParams *params)
{ {
struct Main *bmain = CTX_data_main(C); struct Main *bmain = CTX_data_main(C);
@ -160,25 +123,17 @@ static int geometry_extract_apply(bContext *C,
})); }));
BMEditMesh *em = BKE_editmesh_create(bm, false); BMEditMesh *em = BKE_editmesh_create(bm, false);
BMVert *v;
BMEdge *ed;
BMIter iter;
switch (mode) { /* Generate the tags for deleting geometry in the extracted object. */
case GEOMETRY_EXTRACT_MASK: { tag_fn(bm, params);
geometry_extract_tag_masked_faces(bm, params->mask_threshold);
break;
}
case GEOMETRY_EXTRACT_FACE_SET: {
geometry_extract_tag_face_set(bm, params->active_face_set);
break;
}
}
/* Delete all tagged faces. */ /* Delete all tagged faces. */
BM_mesh_delete_hflag_context(bm, BM_ELEM_TAG, DEL_FACES); BM_mesh_delete_hflag_context(bm, BM_ELEM_TAG, DEL_FACES);
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
BMVert *v;
BMEdge *ed;
BMIter iter;
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
mul_v3_v3(v->co, ob->scale); mul_v3_v3(v->co, ob->scale);
} }
@ -292,6 +247,45 @@ static int geometry_extract_apply(bContext *C,
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
static void geometry_extract_tag_masked_faces(BMesh *bm, GeometryExtractParams *params)
{
const float threshold = params->mask_threshold;
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
BMFace *f;
BMIter iter;
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
bool keep_face = true;
BMVert *v;
BMIter face_iter;
BM_ITER_ELEM (v, &face_iter, f, BM_VERTS_OF_FACE) {
const float mask = BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset);
if (mask < threshold) {
keep_face = false;
break;
}
}
BM_elem_flag_set(f, BM_ELEM_TAG, !keep_face);
}
}
static void geometry_extract_tag_face_set(BMesh *bm, GeometryExtractParams *params)
{
const int tag_face_set_id = params->active_face_set;
BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false);
const int cd_face_sets_offset = CustomData_get_offset(&bm->pdata, CD_SCULPT_FACE_SETS);
BMFace *f;
BMIter iter;
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
const int face_set_id = abs(BM_ELEM_CD_GET_INT(f, cd_face_sets_offset));
BM_elem_flag_set(f, BM_ELEM_TAG, face_set_id != tag_face_set_id);
}
}
static int paint_mask_extract_exec(bContext *C, wmOperator *op) static int paint_mask_extract_exec(bContext *C, wmOperator *op)
{ {
GeometryExtractParams params; GeometryExtractParams params;
@ -300,7 +294,7 @@ static int paint_mask_extract_exec(bContext *C, wmOperator *op)
params.add_boundary_loop = RNA_boolean_get(op->ptr, "add_boundary_loop"); params.add_boundary_loop = RNA_boolean_get(op->ptr, "add_boundary_loop");
params.apply_shrinkwrap = RNA_boolean_get(op->ptr, "apply_shrinkwrap"); params.apply_shrinkwrap = RNA_boolean_get(op->ptr, "apply_shrinkwrap");
params.add_solidify = RNA_boolean_get(op->ptr, "add_solidify"); params.add_solidify = RNA_boolean_get(op->ptr, "add_solidify");
return geometry_extract_apply(C, op, GEOMETRY_EXTRACT_MASK, &params); return geometry_extract_apply(C, op, geometry_extract_tag_masked_faces, &params);
} }
static int paint_mask_extract_invoke(bContext *C, wmOperator *op, const wmEvent *e) static int paint_mask_extract_invoke(bContext *C, wmOperator *op, const wmEvent *e)
@ -406,7 +400,7 @@ static int face_set_extract_modal(bContext *C, wmOperator *op, const wmEvent *ev
params.add_boundary_loop = false; params.add_boundary_loop = false;
params.apply_shrinkwrap = true; params.apply_shrinkwrap = true;
params.add_solidify = true; params.add_solidify = true;
return geometry_extract_apply(C, op, GEOMETRY_EXTRACT_FACE_SET, &params); return geometry_extract_apply(C, op, geometry_extract_tag_face_set, &params);
} }
break; break;