Commit: 1e6a5eb0879119808fde8f002eed5ac7909944ec Author: Andrew Hale Date: Mon Aug 27 15:51:27 2018 +0200 Branches: blender2.8 https://developer.blender.org/rB1e6a5eb0879119808fde8f002eed5ac7909944ec
Implement BMesh Operator string enumerators and docs generation. Partial implementation of T56496 for review. Reviewers: campbellbarton Reviewed By: campbellbarton Differential Revision: https://developer.blender.org/D3635 =================================================================== M doc/python_api/rst_from_bmesh_opdefines.py M source/blender/bmesh/intern/bmesh_opdefines.c M source/blender/bmesh/intern/bmesh_operator_api.h M source/blender/bmesh/intern/bmesh_operators.c M source/blender/python/bmesh/bmesh_py_ops.c M source/blender/python/bmesh/bmesh_py_ops_call.c =================================================================== diff --git a/doc/python_api/rst_from_bmesh_opdefines.py b/doc/python_api/rst_from_bmesh_opdefines.py index d3e4b2a0cfd..8357d063429 100644 --- a/doc/python_api/rst_from_bmesh_opdefines.py +++ b/doc/python_api/rst_from_bmesh_opdefines.py @@ -31,6 +31,7 @@ # - campbell import os +import re CURRENT_DIR = os.path.abspath(os.path.dirname(__file__)) SOURCE_DIR = os.path.normpath(os.path.abspath(os.path.normpath(os.path.join(CURRENT_DIR, "..", "..")))) @@ -75,7 +76,8 @@ def main(): for l in fsrc: l = l[:-1] # weak but ok - if ("BMOpDefine" in l and l.split()[1] == "BMOpDefine") and "bmo_opdefines[]" not in l: + if ((("BMOpDefine" in l and l.split()[1] == "BMOpDefine") and "bmo_opdefines[]" not in l) or + ("static BMO_FlagSet " in l)): is_block = True block_ctx = [] blocks.append((comment_ctx, block_ctx)) @@ -92,9 +94,12 @@ def main(): if cpp_comment != -1: l = l[:cpp_comment] + # remove sentinel from enums + l = l.replace("{0, NULL}", "") + block_ctx.append(l) - if l.strip() == "};": + if l.strip().endswith("};"): is_block = False comment_ctx = None @@ -136,6 +141,9 @@ def main(): "BMO_OP_SLOT_SUBTYPE_PTR_MESH", "BMO_OP_SLOT_SUBTYPE_PTR_BMESH", + "BMO_OP_SLOT_SUBTYPE_INT_ENUM", + "BMO_OP_SLOT_SUBTYPE_INT_FLAG", + "BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE", "BM_VERT", @@ -160,6 +168,7 @@ def main(): for comment, b in blocks: # magic, translate into python b[0] = b[0].replace("static BMOpDefine ", "") + is_enum = False for i, l in enumerate(b): l = l.strip() @@ -178,11 +187,35 @@ def main(): # exec func. eg: bmo_rotate_edges_exec, if l.startswith("bmo_") and l.endswith("_exec,"): l = "None," + + # enums + if l.startswith("static BMO_FlagSet "): + is_enum = True + b[i] = l # for l in b: # print(l) + if is_enum: + text = "".join(b) + text = text.replace("static BMO_FlagSet ", "") + text = text.replace("[]", "") + text = text.strip(";") + text = text.replace("(", "[").replace(")", "]") + text = text.replace("\"", "'") + + k, v = text.split("=", 1) + + v = repr(re.findall(r"'([^']*)'", v)) + + k = k.strip() + v = v.strip() + + vars_dict[k] = v + + continue + text = "\n".join(b) global_namespace = { "__file__": "generated", @@ -225,6 +258,7 @@ def main(): # -- wash the comment comment_washed = [] + comment = [] if comment is None else comment for i, l in enumerate(comment): assert((l.strip() == "") or (l in {"/*", " *"}) or @@ -246,7 +280,9 @@ def main(): args_wash = [] for i in args_index: arg = args[i] - if len(arg) == 3: + if len(arg) == 4: + name, tp, tp_sub, enums = arg + elif len(arg) == 3: name, tp, tp_sub = arg elif len(arg) == 2: name, tp = arg @@ -282,7 +318,12 @@ def main(): if tp == BMO_OP_SLOT_FLT: tp_str = "float" elif tp == BMO_OP_SLOT_INT: - tp_str = "int" + if tp_sub == BMO_OP_SLOT_SUBTYPE_INT_ENUM: + tp_str = "enum in " + enums + ", default " + enums.split(",", 1)[0].strip("[") + elif tp_sub == BMO_OP_SLOT_SUBTYPE_INT_FLAG: + tp_str = "set of flags from " + enums + ", default {}" + else: + tp_str = "int" elif tp == BMO_OP_SLOT_BOOL: tp_str = "bool" elif tp == BMO_OP_SLOT_MAT: diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index ef9c510aea1..c054089480f 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -59,6 +59,8 @@ #include "bmesh.h" #include "intern/bmesh_operators_private.h" +#include "DNA_modifier_types.h" + /* The formatting of these bmesh operators is parsed by * 'doc/python_api/rst_from_bmesh_opdefines.py' * for use in python docs, so reStructuredText may be used @@ -95,6 +97,32 @@ * note that '//' comments are ignored. */ +/* enums shared between multiple operators */ + +static BMO_FlagSet bmo_enum_axis_xyz[] = { + {0, "X"}, + {1, "Y"}, + {2, "Z"}, + {0, NULL}, +}; + +static BMO_FlagSet bmo_enum_falloff_type[] = { + {SUBD_FALLOFF_SMOOTH, "SMOOTH"}, + {SUBD_FALLOFF_SPHERE, "SPHERE"}, + {SUBD_FALLOFF_ROOT, "ROOT"}, + {SUBD_FALLOFF_SHARP, "SHARP"}, + {SUBD_FALLOFF_LIN, "LINEAR"}, + {SUBD_FALLOFF_INVSQUARE, "INVERSE_SQUARE"}, + {0, NULL}, +}; + +static BMO_FlagSet bmo_enum_compare_types[] = { + {SIM_CMP_EQ, "EQUAL"}, + {SIM_CMP_GT, "GREATER_THAN"}, + {SIM_CMP_LT, "LESS_THAN"}, + {0, NULL}, +}; + /* * Vertex Smooth. * @@ -290,7 +318,7 @@ static BMOpDefine bmo_mirror_def = { {{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */ {"matrix", BMO_OP_SLOT_MAT}, /* matrix defining the mirror transformation */ {"merge_dist", BMO_OP_SLOT_FLT}, /* maximum distance for merging. does no merging if 0. */ - {"axis", BMO_OP_SLOT_INT}, /* the axis to use, 0, 1, or 2 for x, y, z */ + {"axis", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_axis_xyz}, /* the axis to use. */ {"mirror_u", BMO_OP_SLOT_BOOL}, /* mirror UVs across the u axis */ {"mirror_v", BMO_OP_SLOT_BOOL}, /* mirror UVs across the v axis */ {{'\0'}}, @@ -1110,6 +1138,15 @@ static BMOpDefine bmo_dissolve_faces_def = { BMO_OPTYPE_FLAG_SELECT_VALIDATE), }; +static BMO_FlagSet bmo_enum_dissolve_limit_flags[] = { + {BMO_DELIM_NORMAL, "NORMAL"}, + {BMO_DELIM_MATERIAL, "MATERIAL"}, + {BMO_DELIM_SEAM, "SEAM"}, + {BMO_DELIM_SHARP, "SHARP"}, + {BMO_DELIM_UV, "UV"}, + {0, NULL} +}; + /* * Limited Dissolve. * @@ -1122,7 +1159,7 @@ static BMOpDefine bmo_dissolve_limit_def = { {"use_dissolve_boundaries", BMO_OP_SLOT_BOOL}, {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, - {"delimit", BMO_OP_SLOT_INT}, + {"delimit", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_FLAG}, bmo_enum_dissolve_limit_flags}, {{'\0'}}, }, /* slots_out */ @@ -1156,6 +1193,20 @@ static BMOpDefine bmo_dissolve_degenerate_def = { BMO_OPTYPE_FLAG_SELECT_VALIDATE), }; +static BMO_FlagSet bmo_enum_triangulate_quad_method[] = { + {MOD_TRIANGULATE_QUAD_BEAUTY, "BEAUTY"}, + {MOD_TRIANGULATE_QUAD_FIXED, "FIXED"}, + {MOD_TRIANGULATE_QUAD_ALTERNATE, "ALTERNATE"}, + {MOD_TRIANGULATE_QUAD_SHORTEDGE, "SHORT_EDGE"}, + {0, NULL}, +}; + +static BMO_FlagSet bmo_enum_triangulate_ngon_method[] = { + {MOD_TRIANGULATE_NGON_BEAUTY, "BEAUTY"}, + {MOD_TRIANGULATE_NGON_EARCLIP, "EAR_CLIP"}, + {0, NULL}, +}; + /* * Triangulate. */ @@ -1163,8 +1214,8 @@ static BMOpDefine bmo_triangulate_def = { "triangulate", /* slots_in */ {{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, - {"quad_method", BMO_OP_SLOT_INT}, - {"ngon_method", BMO_OP_SLOT_INT}, + {"quad_method", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_triangulate_quad_method}, + {"ngon_method", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_triangulate_ngon_method}, {{'\0'}}, }, /* slots_out */ @@ -1200,6 +1251,14 @@ static BMOpDefine bmo_unsubdivide_def = { BMO_OPTYPE_FLAG_SELECT_VALIDATE), }; +static BMO_FlagSet bmo_enum_subdivide_edges_quad_corner_type[] = { + {SUBD_CORNER_STRAIGHT_CUT, "STRAIGHT_CUT"}, + {SUBD_CORNER_INNERVERT, "INNER_VERT"}, + {SUBD_CORNER_PATH, "PATH"}, + {SUBD_CORNER_FAN, "FAN"}, + {0, NULL}, +}; + /* * Subdivide Edges. * @@ -1211,15 +1270,14 @@ static BMOpDefine bmo_subdivide_edges_def = { /* slots_in */ {{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, {"smooth", BMO_OP_SLOT_FLT}, - {"smooth_falloff", BMO_OP_SLOT_INT}, /* SUBD_FALLOFF_ROOT and friends */ + {"smooth_falloff", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_falloff_type}, /* smooth falloff type */ {"fractal", BMO_OP_SLOT_FLT}, {"along_normal", BMO_OP_SLOT_FLT}, {"cuts", BMO_OP_SLOT_INT}, {"seed", BMO_OP_SLOT_INT}, {"custom_patterns", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL}}, /* uses custom pointers */ {"edge_percents", BMO_OP_SLOT_MAPPING, {(int)BMO_OP_SLOT_SUBTYPE_MAP_FLT}}, - - {"quad_corner_type", BMO_OP_SLOT_INT}, /* quad corner type, see bmesh_operators.h */ + {"quad_corner_type", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_subdivide_edges_quad_corner_type}, /* quad corner type */ {"use_grid_fill", BMO_OP_SLOT_BOOL}, /* fill in fully-selected faces with a grid */ {"use_single_edge", BMO_OP_SLOT_BOOL}, /* tessellate the case of one edge selected in a quad or triangle */ {"use_only_quads", BMO_OP_SLOT_BOOL}, /* only subdivide quads (for loopcut) */ @@ -1241,6 +1299,13 @@ static BMOpDefine bmo_subdivide_edges_def = { BMO_OPTYPE_FLAG_SELECT_VALIDATE), }; +static BMO_FlagSet bmo_enum_subdivide_edgering_interp_mode[] = { + {SUBD_RING_INTERP_LINEAR, "LINEAR"}, + {SUBD_RING_INTERP_PATH, "PATH"}, + {SUBD_RING_INTERP_SURF, "SURFACE"}, + {0, NULL}, +}; + /* * Subdivide Edge-Ring. * @@ -1250,10 +1315,10 @@ static BMOpDefine bmo_subdivide_edgering_def = { "subdivide_edgering", /* slots_in */ {{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input vertices */ - {"interp_mode", BMO_OP_SLOT_INT}, + {"interp_mode", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_subdivide_edgering_interp_mode}, /* interpolation method */ {"smooth", BMO_OP_SLOT_FLT}, {"cuts", BMO_OP_SLOT_INT}, @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
