PyDoc: improve BMesh operator docs

- Place doc-strings before arguments (avoid over long lines).
- Enable clang-format for BMesh operator definitions.
- Remove invalid comments (likely left in from copy-paste).
- Use double back-ticks for RST.
- Use full sentences.

No functional changes.
This commit is contained in:
Campbell Barton
2025-06-05 05:26:56 +00:00
parent b9fc0d3712
commit 2d86699209
2 changed files with 1812 additions and 1305 deletions

View File

@@ -166,6 +166,7 @@ def main():
if l.startswith("/*"):
l = l.replace("/*", "'''own <")
else:
# NOTE: `inline <...>` aren't used anymore, all doc-string comments require their own line.
l = l.replace("/*", "'''inline <")
l = l.replace("*/", ">''',")
@@ -256,27 +257,17 @@ def main():
tp_str = ""
comment_prev = ""
comment_next = ""
if i != 0:
comment_prev = args[i + 1]
if type(comment_prev) == str and comment_prev.startswith("our <"):
comment_prev = comment_next[5:-1] # strip inline <...>
else:
comment_prev = ""
if i + 1 < len(args):
comment_next = args[i + 1]
if type(comment_next) == str and comment_next.startswith("inline <"):
comment_next = comment_next[8:-1] # strip inline <...>
else:
comment_next = ""
comment = ""
if comment_prev:
comment += comment_prev.strip()
if comment_next:
comment += ("\n" if comment_prev else "") + comment_next.strip()
if i != 0:
comment = args[i - 1]
if type(args[i - 1]) == str:
if args[i - 1].startswith("own <"):
comment = args[i - 1][5:-1].strip() # strip `our <...>`
else:
comment = ""
if comment.startswith("NOTE"):
comment = ""
default_value = None
if tp == BMO_OP_SLOT_FLT:
@@ -387,6 +378,9 @@ def main():
continue
if l.strip():
l = " " + l
# Use double back-ticks for literals (C++ comments only use a single, RST expected two).
l = l.replace("`", "``")
comment_washed.append(l)
fw("\n".join(comment_washed))

View File

@@ -79,50 +79,52 @@
*/
/* Keep struct definition from wrapping. */
/* clang-format off */
/* enums shared between multiple operators */
/* Enums shared between multiple operators. */
static BMO_FlagSet bmo_enum_axis_xyz[] = {
{0, "X"},
{1, "Y"},
{2, "Z"},
{0, nullptr},
{0, "X"},
{1, "Y"},
{2, "Z"},
{0, nullptr},
};
static BMO_FlagSet bmo_enum_axis_neg_xyz_and_xyz[] = {
{0, "-X"},
{1, "-Y"},
{2, "-Z"},
{3, "X"},
{4, "Y"},
{5, "Z"},
{0, nullptr},
{0, "-X"},
{1, "-Y"},
{2, "-Z"},
{3, "X"},
{4, "Y"},
{5, "Z"},
{0, nullptr},
};
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, nullptr},
{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, nullptr},
};
static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Ptr ptr) {
static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Ptr ptr)
{
eBMOpSlotSubType_Union value;
value.ptr = ptr;
return value;
}
static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Map map) {
static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Map map)
{
eBMOpSlotSubType_Union value;
value.map = map;
return value;
}
static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Int intg) {
static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Int intg)
{
eBMOpSlotSubType_Union value;
value.intg = intg;
return value;
@@ -139,22 +141,33 @@ static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Int intg)
* Smooths vertices by using a basic vertex averaging scheme.
*/
static BMOpDefine bmo_smooth_vert_def = {
"smooth_vert",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"factor", BMO_OP_SLOT_FLT}, /* smoothing factor */
{"mirror_clip_x", BMO_OP_SLOT_BOOL}, /* set vertices close to the x axis before the operation to 0 */
{"mirror_clip_y", BMO_OP_SLOT_BOOL}, /* set vertices close to the y axis before the operation to 0 */
{"mirror_clip_z", BMO_OP_SLOT_BOOL}, /* set vertices close to the z axis before the operation to 0 */
{"clip_dist", BMO_OP_SLOT_FLT}, /* clipping threshold for the above three slots */
{"use_axis_x", BMO_OP_SLOT_BOOL}, /* smooth vertices along X axis */
{"use_axis_y", BMO_OP_SLOT_BOOL}, /* smooth vertices along Y axis */
{"use_axis_z", BMO_OP_SLOT_BOOL}, /* smooth vertices along Z axis */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_smooth_vert_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"smooth_vert",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Smoothing factor. */
{"factor", BMO_OP_SLOT_FLT},
/* Set vertices close to the x axis before the operation to 0. */
{"mirror_clip_x", BMO_OP_SLOT_BOOL},
/* Set vertices close to the y axis before the operation to 0. */
{"mirror_clip_y", BMO_OP_SLOT_BOOL},
/* Set vertices close to the z axis before the operation to 0. */
{"mirror_clip_z", BMO_OP_SLOT_BOOL},
/* Clipping threshold for the above three slots. */
{"clip_dist", BMO_OP_SLOT_FLT},
/* Smooth vertices along X axis. */
{"use_axis_x", BMO_OP_SLOT_BOOL},
/* Smooth vertices along Y axis. */
{"use_axis_y", BMO_OP_SLOT_BOOL},
/* Smooth vertices along Z axis. */
{"use_axis_z", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_smooth_vert_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -164,20 +177,29 @@ static BMOpDefine bmo_smooth_vert_def = {
* Desbrun, et al. Implicit Fairing of Irregular Meshes using Diffusion and Curvature Flow.
*/
static BMOpDefine bmo_smooth_laplacian_vert_def = {
"smooth_laplacian_vert",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"lambda_factor", BMO_OP_SLOT_FLT}, /* lambda param */
{"lambda_border", BMO_OP_SLOT_FLT}, /* lambda param in border */
{"use_x", BMO_OP_SLOT_BOOL}, /* Smooth object along X axis */
{"use_y", BMO_OP_SLOT_BOOL}, /* Smooth object along Y axis */
{"use_z", BMO_OP_SLOT_BOOL}, /* Smooth object along Z axis */
{"preserve_volume", BMO_OP_SLOT_BOOL}, /* Apply volume preservation after smooth */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_smooth_laplacian_vert_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"smooth_laplacian_vert",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Lambda parameter. */
{"lambda_factor", BMO_OP_SLOT_FLT},
/* Lambda param in border. */
{"lambda_border", BMO_OP_SLOT_FLT},
/* Smooth object along X axis. */
{"use_x", BMO_OP_SLOT_BOOL},
/* Smooth object along Y axis. */
{"use_y", BMO_OP_SLOT_BOOL},
/* Smooth object along Z axis. */
{"use_z", BMO_OP_SLOT_BOOL},
/* Apply volume preservation after smooth. */
{"preserve_volume", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_smooth_laplacian_vert_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -186,15 +208,17 @@ static BMOpDefine bmo_smooth_laplacian_vert_def = {
* Computes an "outside" normal for the specified input faces.
*/
static BMOpDefine bmo_recalc_face_normals_def = {
"recalc_face_normals",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_recalc_face_normals_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC),
"recalc_face_normals",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_recalc_face_normals_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -203,20 +227,25 @@ static BMOpDefine bmo_recalc_face_normals_def = {
* Iteratively flatten faces.
*/
static BMOpDefine bmo_planar_faces_def = {
"planar_faces",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input geometry. */
{"iterations", BMO_OP_SLOT_INT}, /* Number of times to flatten faces (for when connected faces are used) */
{"factor", BMO_OP_SLOT_FLT}, /* Influence for making planar each iteration */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* output slot, computed boundary geometry. */
{{'\0'}},
},
bmo_planar_faces_exec,
(BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"planar_faces",
/*slot_types_in*/
{
/* Input geometry. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Number of times to flatten faces (for when connected faces are used) */
{"iterations", BMO_OP_SLOT_INT},
/* Influence for making planar each iteration */
{"factor", BMO_OP_SLOT_FLT},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output slot, computed boundary geometry. */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_planar_faces_exec,
(BMO_OPTYPE_FLAG_SELECT_FLUSH | BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -230,21 +259,27 @@ static BMOpDefine bmo_planar_faces_def = {
* otherwise it spits out faces.
*/
static BMOpDefine bmo_region_extend_def = {
"region_extend",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"use_contract", BMO_OP_SLOT_BOOL}, /* find boundary inside the regions, not outside. */
{"use_faces", BMO_OP_SLOT_BOOL}, /* extend from faces instead of edges */
{"use_face_step", BMO_OP_SLOT_BOOL}, /* step over connected faces */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* output slot, computed boundary geometry. */
{{'\0'}},
},
bmo_region_extend_exec,
(BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"region_extend",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Find boundary inside the regions, not outside. */
{"use_contract", BMO_OP_SLOT_BOOL},
/* Extend from faces instead of edges. */
{"use_faces", BMO_OP_SLOT_BOOL},
/* Step over connected faces. */
{"use_face_step", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output slot, computed boundary geometry. */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_region_extend_exec,
(BMO_OPTYPE_FLAG_SELECT_FLUSH | BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -254,21 +289,24 @@ static BMOpDefine bmo_region_extend_def = {
* Simple example: `[/] becomes [|] then [\]`.
*/
static BMOpDefine bmo_rotate_edges_def = {
"rotate_edges",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"use_ccw", BMO_OP_SLOT_BOOL}, /* rotate edge counter-clockwise if true, otherwise clockwise */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* newly spun edges */
{{'\0'}},
},
bmo_rotate_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"rotate_edges",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Rotate edge counter-clockwise if true, otherwise clockwise. */
{"use_ccw", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Newly spun edges. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_rotate_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -278,16 +316,19 @@ static BMOpDefine bmo_rotate_edges_def = {
* This has the effect of flipping the normal.
*/
static BMOpDefine bmo_reverse_faces_def = {
"reverse_faces",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"flip_multires", BMO_OP_SLOT_BOOL}, /* maintain multi-res offset */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_reverse_faces_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC),
"reverse_faces",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Maintain multi-res offset. */
{"flip_multires", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_reverse_faces_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -296,15 +337,17 @@ static BMOpDefine bmo_reverse_faces_def = {
* Flip the tessellation direction of the selected quads.
*/
static BMOpDefine bmo_flip_quad_tessellation_def = {
"flip_quad_tessellation",
/* slot_in */
{
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}}
},
{{{'\0'}}}, /* no output */
bmo_flip_quad_tessellation_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC),
"flip_quad_tessellation",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_flip_quad_tessellation_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -314,22 +357,27 @@ static BMOpDefine bmo_flip_quad_tessellation_def = {
* This creates a 2-valence vert.
*/
static BMOpDefine bmo_bisect_edges_def = {
"bisect_edges",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"cuts", BMO_OP_SLOT_INT}, /* number of cuts */
{"edge_percents", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_FLT)}},
{{'\0'}},
},
/*slot_types_out*/
{{"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* newly created vertices and edges */
{{'\0'}},
},
bmo_bisect_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"bisect_edges",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Number of cuts. */
{"cuts", BMO_OP_SLOT_INT},
{"edge_percents",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_FLT)}},
{{'\0'}},
},
/*slot_types_out*/
{
/* Newly created vertices and edges. */
{"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_bisect_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -340,26 +388,39 @@ static BMOpDefine bmo_bisect_edges_def = {
* parameter (which defines the minimum distance for welding to happen).
*/
static BMOpDefine bmo_mirror_def = {
"mirror",
/*slot_types_in*/
{{"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, {eBMOpSlotSubType_Elem(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 */
{"mirror_udim", BMO_OP_SLOT_BOOL}, /* mirror UVs in each tile */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* output geometry, mirrored */
{{'\0'}},
},
bmo_mirror_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"mirror",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Matrix defining the mirror transformation. */
{"matrix", BMO_OP_SLOT_MAT},
/* Maximum distance for merging. does no merging if 0. */
{"merge_dist", BMO_OP_SLOT_FLT},
/* The axis to use. */
{"axis",
BMO_OP_SLOT_INT,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_INT_ENUM)},
bmo_enum_axis_xyz},
/* Mirror UVs across the u axis. */
{"mirror_u", BMO_OP_SLOT_BOOL},
/* Mirror UVs across the v axis. */
{"mirror_v", BMO_OP_SLOT_BOOL},
/* Mirror UVs in each tile. */
{"mirror_udim", BMO_OP_SLOT_BOOL},
/* Transform shape keys too. */
{"use_shapekey", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output geometry, mirrored. */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_mirror_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -372,19 +433,26 @@ static BMOpDefine bmo_mirror_def = {
* with vertices in that set.
*/
static BMOpDefine bmo_find_doubles_def = {
"find_doubles",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"keep_verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* list of verts to keep */
{"dist", BMO_OP_SLOT_FLT}, /* maximum distance */
{{'\0'}},
},
/*slot_types_out*/
{{"targetmap.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
bmo_find_doubles_exec,
(BMO_OPTYPE_FLAG_NOP),
"find_doubles",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* List of verts to keep. */
{"keep_verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Maximum distance. */
{"dist", BMO_OP_SLOT_FLT},
{{'\0'}},
},
/*slot_types_out*/
{
{"targetmap.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
bmo_find_doubles_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -394,18 +462,21 @@ static BMOpDefine bmo_find_doubles_def = {
* using the weld verts BMOP.
*/
static BMOpDefine bmo_remove_doubles_def = {
"remove_doubles",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input verts */
{"dist", BMO_OP_SLOT_FLT}, /* minimum distance */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_remove_doubles_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"remove_doubles",
/*slot_types_in*/
{
/* Input verts. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Minimum distance. */
{"dist", BMO_OP_SLOT_FLT},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_remove_doubles_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -414,18 +485,20 @@ static BMOpDefine bmo_remove_doubles_def = {
* Collapses connected vertices
*/
static BMOpDefine bmo_collapse_def = {
"collapse",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"uvs", BMO_OP_SLOT_BOOL}, /* also collapse UVs and such */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_collapse_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"collapse",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Also collapse UVs and such. */
{"uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_collapse_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -434,15 +507,19 @@ static BMOpDefine bmo_collapse_def = {
* Merge uv/vcols at a specific vertex.
*/
static BMOpDefine bmo_pointmerge_facedata_def = {
"pointmerge_facedata",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"vert_snap", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE}}, /* snap vertex */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_pointmerge_facedata_exec,
(BMO_OPTYPE_FLAG_NOP),
"pointmerge_facedata",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Snap vertex. */
{"vert_snap", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_pointmerge_facedata_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -453,14 +530,17 @@ static BMOpDefine bmo_pointmerge_facedata_def = {
* the vert_snap_to_bb_center is just too long).
*/
static BMOpDefine bmo_average_vert_facedata_def = {
"average_vert_facedata",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_average_vert_facedata_exec,
(BMO_OPTYPE_FLAG_NOP),
"average_vert_facedata",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_average_vert_facedata_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -469,18 +549,20 @@ static BMOpDefine bmo_average_vert_facedata_def = {
* Merge verts together at a point.
*/
static BMOpDefine bmo_pointmerge_def = {
"pointmerge",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices (all verts will be merged into the first). */
{"merge_co", BMO_OP_SLOT_VEC}, /* Position to merge at. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_pointmerge_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"pointmerge",
/*slot_types_in*/
{
/* Input vertices (all verts will be merged into the first). */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Position to merge at. */
{"merge_co", BMO_OP_SLOT_VEC},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_pointmerge_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -489,14 +571,17 @@ static BMOpDefine bmo_pointmerge_def = {
* Collapses connected UV vertices.
*/
static BMOpDefine bmo_collapse_uvs_def = {
"collapse_uvs",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_collapse_uvs_exec,
(BMO_OPTYPE_FLAG_NOP),
"collapse_uvs",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_collapse_uvs_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -507,17 +592,18 @@ static BMOpDefine bmo_collapse_uvs_def = {
* they weld with.
*/
static BMOpDefine bmo_weld_verts_def = {
"weld_verts",
/*slot_types_in*/
{{"targetmap", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}}, /* maps welded vertices to verts they should weld to */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_weld_verts_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"weld_verts",
/*slot_types_in*/
{
/* Maps welded vertices to verts they should weld to. */
{"targetmap", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_weld_verts_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -527,17 +613,21 @@ static BMOpDefine bmo_weld_verts_def = {
* for click-create-vertex.
*/
static BMOpDefine bmo_create_vert_def = {
"create_vert",
/*slot_types_in*/
{{"co", BMO_OP_SLOT_VEC}, /* the coordinate of the new vert */
{{'\0'}},
},
/*slot_types_out*/
{{"vert.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* the new vert */
{{'\0'}},
},
bmo_create_vert_exec,
(BMO_OPTYPE_FLAG_NOP),
"create_vert",
/*slot_types_in*/
{
/* The coordinate of the new vert. */
{"co", BMO_OP_SLOT_VEC},
{{'\0'}},
},
/*slot_types_out*/
{
/* The new vert. */
{"vert.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_vert_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -552,33 +642,40 @@ static BMOpDefine bmo_create_vert_def = {
#endif
static BMOpDefine bmo_join_triangles_def = {
"join_triangles",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input geometry. */
{"cmp_seam", BMO_OP_SLOT_BOOL}, /* Compare seam */
{"cmp_sharp", BMO_OP_SLOT_BOOL}, /* Compare sharp */
{"cmp_uvs", BMO_OP_SLOT_BOOL}, /* Compare UVs */
{"cmp_vcols", BMO_OP_SLOT_BOOL}, /* compare VCols */
{"cmp_materials", BMO_OP_SLOT_BOOL}, /* compare materials */
{"angle_face_threshold", BMO_OP_SLOT_FLT},
{"angle_shape_threshold", BMO_OP_SLOT_FLT},
{"topology_influence", BMO_OP_SLOT_FLT},
{"deselect_joined", BMO_OP_SLOT_BOOL},
"join_triangles",
/*slot_types_in*/
{
/* Input geometry. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Compare seam */
{"cmp_seam", BMO_OP_SLOT_BOOL},
/* Compare sharp */
{"cmp_sharp", BMO_OP_SLOT_BOOL},
/* Compare UVs */
{"cmp_uvs", BMO_OP_SLOT_BOOL},
/* Compare VCols. */
{"cmp_vcols", BMO_OP_SLOT_BOOL},
/* Compare materials. */
{"cmp_materials", BMO_OP_SLOT_BOOL},
{"angle_face_threshold", BMO_OP_SLOT_FLT},
{"angle_shape_threshold", BMO_OP_SLOT_FLT},
{"topology_influence", BMO_OP_SLOT_FLT},
{"deselect_joined", BMO_OP_SLOT_BOOL},
#ifdef USE_JOIN_TRIANGLE_INTERACTIVE_TESTING
{"merge_limit", BMO_OP_SLOT_INT},
{"neighbor_debug", BMO_OP_SLOT_INT},
{"merge_limit", BMO_OP_SLOT_INT},
{"neighbor_debug", BMO_OP_SLOT_INT},
#endif
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* joined faces */
{{'\0'}},
},
bmo_join_triangles_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
{{'\0'}},
},
/*slot_types_out*/
{
/* Joined faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_join_triangles_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -592,49 +689,64 @@ static BMOpDefine bmo_join_triangles_def = {
* become a wire edge.
*/
static BMOpDefine bmo_contextual_create_def = {
"contextual_create",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry. */
{"mat_nr", BMO_OP_SLOT_INT}, /* material to use */
{"use_smooth", BMO_OP_SLOT_BOOL}, /* smooth to use */
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* newly-made face(s) */
/* NOTE: this is for stand-alone edges only, not edges which are a part of newly created faces. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* newly-made edge(s) */
{{'\0'}},
},
bmo_contextual_create_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"contextual_create",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Material to use. */
{"mat_nr", BMO_OP_SLOT_INT},
/* Smooth to use. */
{"use_smooth", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Newly-made face(s). */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* NOTE: this is for stand-alone edges only,
* not edges which are a part of newly created faces. */
/* Newly-made edge(s). */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_contextual_create_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
* Bridge edge loops with faces.
*/
static BMOpDefine bmo_bridge_loops_def = {
"bridge_loops",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"use_pairs", BMO_OP_SLOT_BOOL},
{"use_cyclic", BMO_OP_SLOT_BOOL},
{"use_merge", BMO_OP_SLOT_BOOL}, /* merge rather than creating faces */
{"merge_factor", BMO_OP_SLOT_FLT}, /* merge factor */
{"twist_offset", BMO_OP_SLOT_INT}, /* twist offset for closed loops */
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* new faces */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* new edges */
{{'\0'}},
},
bmo_bridge_loops_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"bridge_loops",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{"use_pairs", BMO_OP_SLOT_BOOL},
{"use_cyclic", BMO_OP_SLOT_BOOL},
/* Merge rather than creating faces. */
{"use_merge", BMO_OP_SLOT_BOOL},
/* merge factor */
{"merge_factor", BMO_OP_SLOT_FLT},
/* Twist offset for closed loops. */
{"twist_offset", BMO_OP_SLOT_INT},
{{'\0'}},
},
/*slot_types_out*/
{
/* New faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* New edges. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_bridge_loops_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -643,25 +755,32 @@ static BMOpDefine bmo_bridge_loops_def = {
* Create faces defined by 2 disconnected edge loops (which share edges).
*/
static BMOpDefine bmo_grid_fill_def = {
"grid_fill",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
/* restricts edges to groups. maps edges to integer */
{"mat_nr", BMO_OP_SLOT_INT}, /* material to use */
{"use_smooth", BMO_OP_SLOT_BOOL}, /* smooth state to use */
{"use_interp_simple", BMO_OP_SLOT_BOOL}, /* use simple interpolation */
{{'\0'}},
},
/*slot_types_out*/
/* maps new faces to the group numbers they came from */
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* new faces */
{{'\0'}},
},
bmo_grid_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
"grid_fill",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Restricts edges to groups. maps edges to integer. */
/* Material to use. */
{"mat_nr", BMO_OP_SLOT_INT},
/* Smooth state to use. */
{"use_smooth", BMO_OP_SLOT_BOOL},
/* Use simple interpolation. */
{"use_interp_simple", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* New faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_grid_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
* Fill Holes.
@@ -669,43 +788,50 @@ static BMOpDefine bmo_grid_fill_def = {
* Fill boundary edges with faces, copying surrounding custom-data.
*/
static BMOpDefine bmo_holes_fill_def = {
"holes_fill",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"sides", BMO_OP_SLOT_INT}, /* number of face sides to fill */
{{'\0'}},
},
/*slot_types_out*/
/* maps new faces to the group numbers they came from */
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* new faces */
{{'\0'}},
},
bmo_holes_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"holes_fill",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Number of face sides to fill. */
{"sides", BMO_OP_SLOT_INT},
{{'\0'}},
},
/*slot_types_out*/
{
/* New faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_holes_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
* Face Attribute Fill.
*
* Fill in faces with data from adjacent faces.
*/
static BMOpDefine bmo_face_attribute_fill_def = {
"face_attribute_fill",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"use_normals", BMO_OP_SLOT_BOOL}, /* copy face winding */
{"use_data", BMO_OP_SLOT_BOOL}, /* copy face data */
{{'\0'}},
},
/*slot_types_out*/
/* maps new faces to the group numbers they came from */
{{"faces_fail.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* faces that could not be handled */
{{'\0'}},
},
bmo_face_attribute_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"face_attribute_fill",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Copy face winding. */
{"use_normals", BMO_OP_SLOT_BOOL},
/* Copy face data. */
{"use_data", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Faces that could not be handled. */
{"faces_fail.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_face_attribute_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -714,24 +840,29 @@ static BMOpDefine bmo_face_attribute_fill_def = {
* Create faces defined by one or more non overlapping edge loops.
*/
static BMOpDefine bmo_edgeloop_fill_def = {
"edgeloop_fill",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
/* restricts edges to groups. maps edges to integer */
{"mat_nr", BMO_OP_SLOT_INT}, /* material to use */
{"use_smooth", BMO_OP_SLOT_BOOL}, /* smooth state to use */
{{'\0'}},
},
/*slot_types_out*/
/* maps new faces to the group numbers they came from */
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* new faces */
{{'\0'}},
},
bmo_edgeloop_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
"edgeloop_fill",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Restricts edges to groups. maps edges to integer. */
/* Material to use. */
{"mat_nr", BMO_OP_SLOT_INT},
/* Smooth state to use. */
{"use_smooth", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* New faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_edgeloop_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
* Edge Net Fill.
@@ -739,22 +870,27 @@ static BMOpDefine bmo_edgeloop_fill_def = {
* Create faces defined by enclosed edges.
*/
static BMOpDefine bmo_edgenet_fill_def = {
"edgenet_fill",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"mat_nr", BMO_OP_SLOT_INT}, /* material to use */
{"use_smooth", BMO_OP_SLOT_BOOL}, /* smooth state to use */
{"sides", BMO_OP_SLOT_INT}, /* number of sides */
{{'\0'}},
},
/*slot_types_out*/
/* maps new faces to the group numbers they came from */
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* new faces */
{{'\0'}},
},
bmo_edgenet_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"edgenet_fill",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Material to use. */
{"mat_nr", BMO_OP_SLOT_INT},
/* Smooth state to use. */
{"use_smooth", BMO_OP_SLOT_BOOL},
/* Number of sides. */
{"sides", BMO_OP_SLOT_INT},
{{'\0'}},
},
/*slot_types_out*/
{
/* New faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_edgenet_fill_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -768,17 +904,21 @@ static BMOpDefine bmo_edgenet_fill_def = {
* shortest distance between each endpoint).
*/
static BMOpDefine bmo_edgenet_prepare_def = {
"edgenet_prepare",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* new edges */
{{'\0'}},
},
bmo_edgenet_prepare_exec,
(BMO_OPTYPE_FLAG_NOP),
"edgenet_prepare",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
/*slot_types_out*/
{
/* New edges. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_edgenet_prepare_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -787,18 +927,25 @@ static BMOpDefine bmo_edgenet_prepare_def = {
* Rotate vertices around a center, using a 3x3 rotation matrix.
*/
static BMOpDefine bmo_rotate_def = {
"rotate",
/*slot_types_in*/
{{"cent", BMO_OP_SLOT_VEC}, /* center of rotation */
{"matrix", BMO_OP_SLOT_MAT}, /* matrix defining rotation */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_rotate_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"rotate",
/*slot_types_in*/
{
/* Center of rotation. */
{"cent", BMO_OP_SLOT_VEC},
/* Matrix defining rotation. */
{"matrix", BMO_OP_SLOT_MAT},
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Matrix to define the space (typically object matrix). */
{"space", BMO_OP_SLOT_MAT},
/* Transform shape keys too. */
{"use_shapekey", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_rotate_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -807,17 +954,23 @@ static BMOpDefine bmo_rotate_def = {
* Translate vertices by an offset.
*/
static BMOpDefine bmo_translate_def = {
"translate",
/*slot_types_in*/
{{"vec", BMO_OP_SLOT_VEC}, /* translation offset */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_translate_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"translate",
/*slot_types_in*/
{
/* Translation offset. */
{"vec", BMO_OP_SLOT_VEC},
/* Matrix to define the space (typically object matrix). */
{"space", BMO_OP_SLOT_MAT},
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Transform shape keys too. */
{"use_shapekey", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_translate_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -826,20 +979,25 @@ static BMOpDefine bmo_translate_def = {
* Scales vertices by an offset.
*/
static BMOpDefine bmo_scale_def = {
"scale",
/*slot_types_in*/
{{"vec", BMO_OP_SLOT_VEC}, /* scale factor */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_scale_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"scale",
/*slot_types_in*/
{
/* Scale factor. */
{"vec", BMO_OP_SLOT_VEC},
/* Matrix to define the space (typically object matrix). */
{"space", BMO_OP_SLOT_MAT},
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Transform shape keys too. */
{"use_shapekey", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_scale_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
* Transform.
*
@@ -847,17 +1005,23 @@ static BMOpDefine bmo_scale_def = {
* the vertex coordinates with the matrix.
*/
static BMOpDefine bmo_transform_def = {
"transform",
/*slot_types_in*/
{{"matrix", BMO_OP_SLOT_MAT}, /* transform matrix */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_transform_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"transform",
/*slot_types_in*/
{
/* Transform matrix. */
{"matrix", BMO_OP_SLOT_MAT},
/* Matrix to define the space (typically object matrix). */
{"space", BMO_OP_SLOT_MAT},
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Transform shape keys too. */
{"use_shapekey", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_transform_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -867,54 +1031,66 @@ static BMOpDefine bmo_transform_def = {
* BMOP.
*/
static BMOpDefine bmo_object_load_bmesh_def = {
"object_load_bmesh",
/*slot_types_in*/
{{"scene", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_SCENE)}, /* pointer to an scene structure */
{"object", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_OBJECT)}, /* pointer to an object structure */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_object_load_bmesh_exec,
(BMO_OPTYPE_FLAG_NOP),
};
"object_load_bmesh",
/*slot_types_in*/
{
/* Pointer to an scene structure. */
{"scene", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_SCENE)},
/* Pointer to an object structure. */
{"object", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_OBJECT)},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_object_load_bmesh_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
* BMesh to Mesh.
*
* Converts a bmesh to a Mesh. This is reserved for exiting editmode.
* Converts a bmesh to a Mesh. This is reserved for exiting edit-mode.
*/
static BMOpDefine bmo_bmesh_to_mesh_def = {
"bmesh_to_mesh",
/*slot_types_in*/
{
{"mesh", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_MESH)}, /* pointer to a mesh structure to fill in */
{"object", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_OBJECT)}, /* pointer to an object structure */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_bmesh_to_mesh_exec,
(BMO_OPTYPE_FLAG_NOP),
"bmesh_to_mesh",
/*slot_types_in*/
{
/* Pointer to a mesh structure to fill in. */
{"mesh", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_MESH)},
/* Pointer to an object structure. */
{"object", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_OBJECT)},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_bmesh_to_mesh_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
* Mesh to BMesh.
*
* Load the contents of a mesh into the bmesh. this BMOP is private, it's
* reserved exclusively for entering editmode.
* reserved exclusively for entering edit-mode.
*/
static BMOpDefine bmo_mesh_to_bmesh_def = {
"mesh_to_bmesh",
/*slot_types_in*/
{
{"mesh", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_MESH)}, /* pointer to a Mesh structure */
{"object", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_OBJECT)}, /* pointer to an Object structure */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* load active shapekey coordinates into verts */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_mesh_to_bmesh_exec,
(BMO_OPTYPE_FLAG_NOP),
"mesh_to_bmesh",
/*slot_types_in*/
{
/* Pointer to a Mesh structure. */
{"mesh", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_MESH)},
/* Pointer to an Object structure. */
{"object", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_OBJECT)},
/* Load active shapekey coordinates into verts. */
{"use_shapekey", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_mesh_to_bmesh_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -923,19 +1099,25 @@ static BMOpDefine bmo_mesh_to_bmesh_def = {
* Extrudes faces individually.
*/
static BMOpDefine bmo_extrude_discrete_faces_def = {
"extrude_discrete_faces",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_select_history", BMO_OP_SLOT_BOOL}, /* pass to duplicate */
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{{'\0'}},
},
bmo_extrude_discrete_faces_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"extrude_discrete_faces",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Create faces with reversed direction. */
{"use_normal_flip", BMO_OP_SLOT_BOOL},
/* Pass to duplicate. */
{"use_select_history", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_extrude_discrete_faces_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -945,19 +1127,25 @@ static BMOpDefine bmo_extrude_discrete_faces_def = {
* winged extrusion.
*/
static BMOpDefine bmo_extrude_edge_only_def = {
"extrude_edge_only",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input vertices */
{"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_select_history", BMO_OP_SLOT_BOOL}, /* pass to duplicate */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* output geometry */
{{'\0'}},
},
bmo_extrude_edge_only_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"extrude_edge_only",
/*slot_types_in*/
{
/* Input vertices. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Create faces with reversed direction. */
{"use_normal_flip", BMO_OP_SLOT_BOOL},
/* Pass to duplicate. */
{"use_select_history", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output geometry. */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_extrude_edge_only_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -966,19 +1154,25 @@ static BMOpDefine bmo_extrude_edge_only_def = {
* Extrudes wire edges from vertices.
*/
static BMOpDefine bmo_extrude_vert_indiv_def = {
"extrude_vert_indiv",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_select_history", BMO_OP_SLOT_BOOL}, /* pass to duplicate */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* output wire edges */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output vertices */
{{'\0'}},
},
bmo_extrude_vert_indiv_exec,
(BMO_OPTYPE_FLAG_SELECT_FLUSH),
"extrude_vert_indiv",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Pass to duplicate. */
{"use_select_history", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output wire edges. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Output vertices. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_extrude_vert_indiv_exec,
(BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -987,21 +1181,24 @@ static BMOpDefine bmo_extrude_vert_indiv_def = {
* Split faces by adding edges that connect **verts**.
*/
static BMOpDefine bmo_connect_verts_def = {
"connect_verts",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces to explicitly exclude from connecting */
{"check_degenerate", BMO_OP_SLOT_BOOL}, /* prevent splits with overlaps & intersections */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_connect_verts_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"connect_verts",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Input faces to explicitly exclude from connecting. */
{"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Prevent splits with overlaps & intersections. */
{"check_degenerate", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_connect_verts_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1010,20 +1207,21 @@ static BMOpDefine bmo_connect_verts_def = {
* Ensures all faces are convex **faces**.
*/
static BMOpDefine bmo_connect_verts_concave_def = {
"connect_verts_concave",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_connect_verts_concave_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"connect_verts_concave",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
/*slot_types_out*/
{
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_connect_verts_concave_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1032,21 +1230,23 @@ static BMOpDefine bmo_connect_verts_concave_def = {
* Split faces by connecting edges along non planer **faces**.
*/
static BMOpDefine bmo_connect_verts_nonplanar_def = {
"connect_verts_nonplanar",
/*slot_types_in*/
{{"angle_limit", BMO_OP_SLOT_FLT}, /* total rotation angle (radians) */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_connect_verts_nonplanar_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"connect_verts_nonplanar",
/*slot_types_in*/
{
/* Total rotation angle (radians). */
{"angle_limit", BMO_OP_SLOT_FLT},
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
/*slot_types_out*/
{
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_connect_verts_nonplanar_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1055,118 +1255,137 @@ static BMOpDefine bmo_connect_verts_nonplanar_def = {
* Split faces by adding edges that connect **verts**.
*/
static BMOpDefine bmo_connect_vert_pair_def = {
"connect_vert_pair",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"verts_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices to explicitly exclude from connecting */
{"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces to explicitly exclude from connecting */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_connect_vert_pair_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"connect_vert_pair",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Input vertices to explicitly exclude from connecting. */
{"verts_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Input faces to explicitly exclude from connecting. */
{"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
/*slot_types_out*/
{
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_connect_vert_pair_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
* Extrude Faces.
*
* Extrude operator (does not transform)
*/
static BMOpDefine bmo_extrude_face_region_def = {
"extrude_face_region",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* edges and faces */
{"edges_exclude", BMO_OP_SLOT_MAPPING, to_subtype_union(BMO_OP_SLOT_SUBTYPE_MAP_EMPTY)}, /* input edges to explicitly exclude from extrusion */
{"use_keep_orig", BMO_OP_SLOT_BOOL}, /* keep original geometry (requires ``geom`` to include edges). */
{"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_normal_from_adjacent", BMO_OP_SLOT_BOOL}, /* Use winding from surrounding faces instead of this region. */
{"use_dissolve_ortho_edges", BMO_OP_SLOT_BOOL}, /* Dissolve edges whose faces form a flat surface. */
{"use_select_history", BMO_OP_SLOT_BOOL}, /* pass to duplicate */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_extrude_face_region_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"extrude_face_region",
/*slot_types_in*/
{
/* Edges and faces. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Input edges to explicitly exclude from extrusion. */
{"edges_exclude", BMO_OP_SLOT_MAPPING, to_subtype_union(BMO_OP_SLOT_SUBTYPE_MAP_EMPTY)},
/* Keep original geometry (requires ``geom`` to include edges). */
{"use_keep_orig", BMO_OP_SLOT_BOOL},
/* Create faces with reversed direction. */
{"use_normal_flip", BMO_OP_SLOT_BOOL},
/* Use winding from surrounding faces instead of this region. */
{"use_normal_from_adjacent", BMO_OP_SLOT_BOOL},
/* Dissolve edges whose faces form a flat surface. */
{"use_dissolve_ortho_edges", BMO_OP_SLOT_BOOL},
/* Pass to duplicate. */
{"use_select_history", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_extrude_face_region_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
* Dissolve Verts.
*/
static BMOpDefine bmo_dissolve_verts_def = {
"dissolve_verts",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_face_split", BMO_OP_SLOT_BOOL}, /* split off face corners to maintain surrounding geometry */
{"use_boundary_tear", BMO_OP_SLOT_BOOL}, /* split off face corners instead of merging faces */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_dissolve_verts_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"dissolve_verts",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Split off face corners to maintain surrounding geometry. */
{"use_face_split", BMO_OP_SLOT_BOOL},
/* Split off face corners instead of merging faces. */
{"use_boundary_tear", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_dissolve_verts_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
* Dissolve Edges.
*/
static BMOpDefine bmo_dissolve_edges_def = {
"dissolve_edges",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"use_verts", BMO_OP_SLOT_BOOL}, /* dissolve verts left between only 2 edges. */
{"use_face_split", BMO_OP_SLOT_BOOL}, /* split off face corners to maintain surrounding geometry */
{{'\0'}},
},
/*slot_types_out*/
{{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_dissolve_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"dissolve_edges",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Dissolve verts left between only 2 edges. */
{"use_verts", BMO_OP_SLOT_BOOL},
/* Split off face corners to maintain surrounding geometry. */
{"use_face_split", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_dissolve_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
* Dissolve Faces.
*/
static BMOpDefine bmo_dissolve_faces_def = {
"dissolve_faces",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"use_verts", BMO_OP_SLOT_BOOL}, /* dissolve verts left between only 2 edges. */
{{'\0'}},
},
/*slot_types_out*/
{{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_dissolve_faces_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"dissolve_faces",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Dissolve verts left between only 2 edges. */
{"use_verts", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_dissolve_faces_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
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, nullptr},
{BMO_DELIM_NORMAL, "NORMAL"},
{BMO_DELIM_MATERIAL, "MATERIAL"},
{BMO_DELIM_SEAM, "SEAM"},
{BMO_DELIM_SHARP, "SHARP"},
{BMO_DELIM_UV, "UV"},
{0, nullptr},
};
/*
@@ -1175,23 +1394,32 @@ static BMO_FlagSet bmo_enum_dissolve_limit_flags[] = {
* Dissolve planar faces and co-linear edges.
*/
static BMOpDefine bmo_dissolve_limit_def = {
"dissolve_limit",
/*slot_types_in*/
{{"angle_limit", BMO_OP_SLOT_FLT}, /* total rotation angle (radians) */
{"use_dissolve_boundaries", BMO_OP_SLOT_BOOL}, /* dissolve all vertices in between face boundaries */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"delimit", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_FLAG), bmo_enum_dissolve_limit_flags}, /* delimit dissolve operation */
{{'\0'}},
},
/*slot_types_out*/
{{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}}},
bmo_dissolve_limit_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"dissolve_limit",
/*slot_types_in*/
{
/* Total rotation angle (radians). */
{"angle_limit", BMO_OP_SLOT_FLT},
/* Dissolve all vertices in between face boundaries. */
{"use_dissolve_boundaries", BMO_OP_SLOT_BOOL},
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Delimit dissolve operation. */
{"delimit",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_FLAG),
bmo_enum_dissolve_limit_flags},
{{'\0'}},
},
/*slot_types_out*/
{
{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_dissolve_limit_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -1200,58 +1428,73 @@ static BMOpDefine bmo_dissolve_limit_def = {
* Dissolve edges with no length, faces with no area.
*/
static BMOpDefine bmo_dissolve_degenerate_def = {
"dissolve_degenerate",
/*slot_types_in*/
{{"dist", BMO_OP_SLOT_FLT}, /* maximum distance to consider degenerate */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_dissolve_degenerate_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"dissolve_degenerate",
/*slot_types_in*/
{
/* Maximum distance to consider degenerate. */
{"dist", BMO_OP_SLOT_FLT},
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_dissolve_degenerate_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
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"},
{MOD_TRIANGULATE_QUAD_LONGEDGE, "LONG_EDGE"},
{0, nullptr},
{MOD_TRIANGULATE_QUAD_BEAUTY, "BEAUTY"},
{MOD_TRIANGULATE_QUAD_FIXED, "FIXED"},
{MOD_TRIANGULATE_QUAD_ALTERNATE, "ALTERNATE"},
{MOD_TRIANGULATE_QUAD_SHORTEDGE, "SHORT_EDGE"},
{MOD_TRIANGULATE_QUAD_LONGEDGE, "LONG_EDGE"},
{0, nullptr},
};
static BMO_FlagSet bmo_enum_triangulate_ngon_method[] = {
{MOD_TRIANGULATE_NGON_BEAUTY, "BEAUTY"},
{MOD_TRIANGULATE_NGON_EARCLIP, "EAR_CLIP"},
{0, nullptr},
{MOD_TRIANGULATE_NGON_BEAUTY, "BEAUTY"},
{MOD_TRIANGULATE_NGON_EARCLIP, "EAR_CLIP"},
{0, nullptr},
};
/*
* Triangulate.
*/
static BMOpDefine bmo_triangulate_def = {
"triangulate",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"quad_method", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_triangulate_quad_method}, /* method for splitting the quads into triangles */
{"ngon_method", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_triangulate_ngon_method}, /* method for splitting the polygons into triangles */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{"face_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"face_map_double.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}}, /* duplicate faces */
{{'\0'}},
},
bmo_triangulate_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"triangulate",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Method for splitting the quads into triangles. */
{"quad_method",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_triangulate_quad_method},
/* Method for splitting the polygons into triangles. */
{"ngon_method",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_triangulate_ngon_method},
{{'\0'}},
},
/*slot_types_out*/
{
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{"face_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
/* Duplicate faces. */
{"face_map_double.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
bmo_triangulate_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1260,26 +1503,28 @@ static BMOpDefine bmo_triangulate_def = {
* Reduce detail in geometry containing grids.
*/
static BMOpDefine bmo_unsubdivide_def = {
"unsubdivide",
/*slot_types_in*/
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"iterations", BMO_OP_SLOT_INT}, /* number of times to unsubdivide */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_unsubdivide_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"unsubdivide",
/*slot_types_in*/
{
/* Input vertices. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Number of times to unsubdivide. */
{"iterations", BMO_OP_SLOT_INT},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_unsubdivide_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
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, nullptr},
{SUBD_CORNER_STRAIGHT_CUT, "STRAIGHT_CUT"},
{SUBD_CORNER_INNERVERT, "INNER_VERT"},
{SUBD_CORNER_PATH, "PATH"},
{SUBD_CORNER_FAN, "FAN"},
{0, nullptr},
};
/*
@@ -1289,44 +1534,67 @@ static BMO_FlagSet bmo_enum_subdivide_edges_quad_corner_type[] = {
* with options for face patterns, smoothing and randomization.
*/
static BMOpDefine bmo_subdivide_edges_def = {
"subdivide_edges",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"smooth", BMO_OP_SLOT_FLT}, /* smoothness factor */
{"smooth_falloff", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_falloff_type}, /* smooth falloff type */
{"fractal", BMO_OP_SLOT_FLT}, /* fractal randomness factor */
{"along_normal", BMO_OP_SLOT_FLT}, /* apply fractal displacement along normal only */
{"cuts", BMO_OP_SLOT_INT}, /* number of cuts */
{"seed", BMO_OP_SLOT_INT}, /* seed for the random number generator */
{"custom_patterns", BMO_OP_SLOT_MAPPING, to_subtype_union(BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL)}, /* uses custom pointers */
{"edge_percents", BMO_OP_SLOT_MAPPING, to_subtype_union(BMO_OP_SLOT_SUBTYPE_MAP_FLT)},
{"quad_corner_type", BMO_OP_SLOT_INT, to_subtype_union(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 loop-cut). */
{"use_sphere", BMO_OP_SLOT_BOOL}, /* for making new primitives only */
{"use_smooth_even", BMO_OP_SLOT_BOOL}, /* maintain even offset when smoothing */
{{'\0'}},
},
/*slot_types_out*/
{/* these next three can have multiple types of elements in them */
{"geom_inner.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* contains all output geometry */
{{'\0'}},
},
bmo_subdivide_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"subdivide_edges",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Smoothness factor. */
{"smooth", BMO_OP_SLOT_FLT},
/* Smooth falloff type. */
{"smooth_falloff",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_falloff_type},
/* Fractal randomness factor. */
{"fractal", BMO_OP_SLOT_FLT},
/* Apply fractal displacement along normal only. */
{"along_normal", BMO_OP_SLOT_FLT},
/* Number of cuts. */
{"cuts", BMO_OP_SLOT_INT},
/* Seed for the random number generator. */
{"seed", BMO_OP_SLOT_INT},
/* Uses custom pointers. */
{"custom_patterns",
BMO_OP_SLOT_MAPPING,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL)},
{"edge_percents", BMO_OP_SLOT_MAPPING, to_subtype_union(BMO_OP_SLOT_SUBTYPE_MAP_FLT)},
/* Quad corner type. */
{"quad_corner_type",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_subdivide_edges_quad_corner_type},
/* Fill in fully-selected faces with a grid. */
{"use_grid_fill", BMO_OP_SLOT_BOOL},
/* Tessellate the case of one edge selected in a quad or triangle. */
{"use_single_edge", BMO_OP_SLOT_BOOL},
/* Only subdivide quads (for loop-cut). */
{"use_only_quads", BMO_OP_SLOT_BOOL},
/* For making new primitives only. */
{"use_sphere", BMO_OP_SLOT_BOOL},
/* Maintain even offset when smoothing. */
{"use_smooth_even", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* NOTE: these next three can have multiple types of elements in them. */
{"geom_inner.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Contains all output geometry. */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_subdivide_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
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, nullptr},
{SUBD_RING_INTERP_LINEAR, "LINEAR"},
{SUBD_RING_INTERP_PATH, "PATH"},
{SUBD_RING_INTERP_SURF, "SURFACE"},
{0, nullptr},
};
/*
@@ -1335,23 +1603,38 @@ static BMO_FlagSet bmo_enum_subdivide_edgering_interp_mode[] = {
* Take an edge-ring, and subdivide with interpolation options.
*/
static BMOpDefine bmo_subdivide_edgering_def = {
"subdivide_edgering",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input vertices */
{"interp_mode", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_subdivide_edgering_interp_mode}, /* interpolation method */
{"smooth", BMO_OP_SLOT_FLT}, /* smoothness factor */
{"cuts", BMO_OP_SLOT_INT}, /* number of cuts */
{"profile_shape", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_falloff_type}, /* profile shape type */
{"profile_shape_factor", BMO_OP_SLOT_FLT}, /* how much intermediary new edges are shrunk/expanded */
{{'\0'}},
},
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{{'\0'}}},
bmo_subdivide_edgering_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"subdivide_edgering",
/*slot_types_in*/
{
/* Input vertices. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Interpolation method. */
{"interp_mode",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_subdivide_edgering_interp_mode},
/* Smoothness factor. */
{"smooth", BMO_OP_SLOT_FLT},
/* Number of cuts. */
{"cuts", BMO_OP_SLOT_INT},
/* Profile shape type. */
{"profile_shape",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_falloff_type},
/* How much intermediary new edges are shrunk/expanded. */
{"profile_shape_factor", BMO_OP_SLOT_FLT},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_subdivide_edgering_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -1360,36 +1643,47 @@ static BMOpDefine bmo_subdivide_edgering_def = {
* Bisects the mesh by a plane (cut the mesh in half).
*/
static BMOpDefine bmo_bisect_plane_def = {
"bisect_plane",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"dist", BMO_OP_SLOT_FLT}, /* minimum distance when testing if a vert is exactly on the plane */
{"plane_co", BMO_OP_SLOT_VEC}, /* point on the plane */
{"plane_no", BMO_OP_SLOT_VEC}, /* direction of the plane */
{"use_snap_center", BMO_OP_SLOT_BOOL}, /* snap axis aligned verts to the center */
{"clear_outer", BMO_OP_SLOT_BOOL}, /* when enabled. remove all geometry on the positive side of the plane */
{"clear_inner", BMO_OP_SLOT_BOOL}, /* when enabled. remove all geometry on the negative side of the plane */
{{'\0'}},
},
{{"geom_cut.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE}}, /* output geometry aligned with the plane (new and existing) */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input and output geometry (result of cut). */
{{'\0'}}},
bmo_bisect_plane_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"bisect_plane",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Minimum distance when testing if a vert is exactly on the plane. */
{"dist", BMO_OP_SLOT_FLT},
/* Point on the plane. */
{"plane_co", BMO_OP_SLOT_VEC},
/* Direction of the plane. */
{"plane_no", BMO_OP_SLOT_VEC},
/* Snap axis aligned verts to the center. */
{"use_snap_center", BMO_OP_SLOT_BOOL},
/* When enabled. remove all geometry on the positive side of the plane. */
{"clear_outer", BMO_OP_SLOT_BOOL},
/* When enabled. remove all geometry on the negative side of the plane. */
{"clear_inner", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output geometry aligned with the plane (new and existing). */
{"geom_cut.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE}},
/* Input and output geometry (result of cut). */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_bisect_plane_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
static BMO_FlagSet bmo_enum_delete_context[] = {
{DEL_VERTS, "VERTS"},
{DEL_EDGES, "EDGES"},
{DEL_ONLYFACES, "FACES_ONLY"},
{DEL_EDGESFACES, "EDGES_FACES"},
{DEL_FACES, "FACES"},
{DEL_FACES_KEEP_BOUNDARY, "FACES_KEEP_BOUNDARY"},
{DEL_ONLYTAGGED, "TAGGED_ONLY"},
{0, nullptr},
{DEL_VERTS, "VERTS"},
{DEL_EDGES, "EDGES"},
{DEL_ONLYFACES, "FACES_ONLY"},
{DEL_EDGESFACES, "EDGES_FACES"},
{DEL_FACES, "FACES"},
{DEL_FACES_KEEP_BOUNDARY, "FACES_KEEP_BOUNDARY"},
{DEL_ONLYTAGGED, "TAGGED_ONLY"},
{0, nullptr},
};
/*
@@ -1398,17 +1692,23 @@ static BMO_FlagSet bmo_enum_delete_context[] = {
* Utility operator to delete geometry.
*/
static BMOpDefine bmo_delete_def = {
"delete",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"context", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_delete_context}, /* geometry types to delete */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_delete_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"delete",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Geometry types to delete. */
{"context",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_delete_context},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_delete_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -1418,29 +1718,44 @@ static BMOpDefine bmo_delete_def = {
* optionally into a destination mesh.
*/
static BMOpDefine bmo_duplicate_def = {
"duplicate",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"dest", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_BMESH)}, /* destination bmesh, if None will use current on */
{"use_select_history", BMO_OP_SLOT_BOOL},
{"use_edge_flip_from_face", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{"geom_orig.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* face_map maps from source faces to dupe
* faces, and from dupe faces to source faces */
{"vert_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"edge_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"face_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"boundary_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"isovert_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
bmo_duplicate_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"duplicate",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Destination bmesh, if None will use current on. */
{"dest", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_BMESH)},
{"use_select_history", BMO_OP_SLOT_BOOL},
{"use_edge_flip_from_face", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"geom_orig.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* NOTE: face_map maps from source faces to dupe faces,
* and from dupe faces to source faces. */
{"vert_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"edge_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"face_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"boundary_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"isovert_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
bmo_duplicate_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1450,22 +1765,30 @@ static BMOpDefine bmo_duplicate_def = {
* optionally into a destination mesh.
*/
static BMOpDefine bmo_split_def = {
"split",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"dest", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_BMESH)}, /* destination bmesh, if None will use current one */
{"use_only_faces", BMO_OP_SLOT_BOOL}, /* when enabled. don't duplicate loose verts/edges */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"boundary_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"isovert_map.out", BMO_OP_SLOT_MAPPING, {eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
bmo_split_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"split",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Destination bmesh, if None will use current one. */
{"dest", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_BMESH)},
/* When enabled. don't duplicate loose verts/edges. */
{"use_only_faces", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"boundary_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{"isovert_map.out",
BMO_OP_SLOT_MAPPING,
{eBMOpSlotSubType_Elem(BMO_OP_SLOT_SUBTYPE_MAP_ELEM)}},
{{'\0'}},
},
bmo_split_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1475,27 +1798,39 @@ static BMOpDefine bmo_split_def = {
* rotating and possibly translating after each step
*/
static BMOpDefine bmo_spin_def = {
"spin",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"cent", BMO_OP_SLOT_VEC}, /* rotation center */
{"axis", BMO_OP_SLOT_VEC}, /* rotation axis */
{"dvec", BMO_OP_SLOT_VEC}, /* translation delta per step */
{"angle", BMO_OP_SLOT_FLT}, /* total rotation angle (radians) */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"steps", BMO_OP_SLOT_INT}, /* number of steps */
{"use_merge", BMO_OP_SLOT_BOOL}, /* Merge first/last when the angle is a full revolution. */
{"use_normal_flip", BMO_OP_SLOT_BOOL}, /* Create faces with reversed direction. */
{"use_duplicate", BMO_OP_SLOT_BOOL}, /* duplicate or extrude? */
{{'\0'}},
},
/*slot_types_out*/
{{"geom_last.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* result of last step */
{{'\0'}},
},
bmo_spin_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"spin",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Rotation center. */
{"cent", BMO_OP_SLOT_VEC},
/* Rotation axis. */
{"axis", BMO_OP_SLOT_VEC},
/* Translation delta per step. */
{"dvec", BMO_OP_SLOT_VEC},
/* Total rotation angle (radians). */
{"angle", BMO_OP_SLOT_FLT},
/* Matrix to define the space (typically object matrix). */
{"space", BMO_OP_SLOT_MAT},
/* Number of steps. */
{"steps", BMO_OP_SLOT_INT},
/* Merge first/last when the angle is a full revolution. */
{"use_merge", BMO_OP_SLOT_BOOL},
/* Create faces with reversed direction. */
{"use_normal_flip", BMO_OP_SLOT_BOOL},
/* Duplicate or extrude?. */
{"use_duplicate", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Result of last step. */
{"geom_last.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_spin_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1504,15 +1839,19 @@ static BMOpDefine bmo_spin_def = {
* Cycle the loop UVs
*/
static BMOpDefine bmo_rotate_uvs_def = {
"rotate_uvs",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"use_ccw", BMO_OP_SLOT_BOOL}, /* rotate counter-clockwise if true, otherwise clockwise */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_rotate_uvs_exec,
(BMO_OPTYPE_FLAG_NOP),
"rotate_uvs",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Rotate counter-clockwise if true, otherwise clockwise. */
{"use_ccw", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_rotate_uvs_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -1521,14 +1860,17 @@ static BMOpDefine bmo_rotate_uvs_def = {
* Reverse the UVs
*/
static BMOpDefine bmo_reverse_uvs_def = {
"reverse_uvs",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_reverse_uvs_exec,
(BMO_OPTYPE_FLAG_NOP),
"reverse_uvs",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_reverse_uvs_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -1537,16 +1879,21 @@ static BMOpDefine bmo_reverse_uvs_def = {
* Cycle the loop colors
*/
static BMOpDefine bmo_rotate_colors_def = {
"rotate_colors",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"use_ccw", BMO_OP_SLOT_BOOL}, /* rotate counter-clockwise if true, otherwise clockwise */
{"color_index", BMO_OP_SLOT_INT}, /* index into color attribute list */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_rotate_colors_exec,
(BMO_OPTYPE_FLAG_NOP),
"rotate_colors",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Rotate counter-clockwise if true, otherwise clockwise. */
{"use_ccw", BMO_OP_SLOT_BOOL},
/* Index into color attribute list. */
{"color_index", BMO_OP_SLOT_INT},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_rotate_colors_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -1555,15 +1902,19 @@ static BMOpDefine bmo_rotate_colors_def = {
* Reverse the loop colors.
*/
static BMOpDefine bmo_reverse_colors_def = {
"reverse_colors",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"color_index", BMO_OP_SLOT_INT}, /* index into color attribute list */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
bmo_reverse_colors_exec,
(BMO_OPTYPE_FLAG_NOP),
"reverse_colors",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Index into color attribute list. */
{"color_index", BMO_OP_SLOT_INT},
{{'\0'}},
},
/*slot_types_out*/
{{{'\0'}}},
bmo_reverse_colors_exec,
(BMO_OPTYPE_FLAG_NOP),
};
/*
@@ -1572,22 +1923,29 @@ static BMOpDefine bmo_reverse_colors_def = {
* Disconnects faces along input edges.
*/
static BMOpDefine bmo_split_edges_def = {
"split_edges",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
/* needed for vertex rip so we can rip only half an edge at a boundary which would otherwise split off */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* optional tag verts, use to have greater control of splits */
{"use_verts", BMO_OP_SLOT_BOOL}, /* use 'verts' for splitting, else just find verts to split from edges */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* old output disconnected edges */
{{'\0'}},
},
bmo_split_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"split_edges",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* NOTE: needed for vertex rip so we can rip only half an edge
* at a boundary which would otherwise split off. */
/* Optional tag verts, use to have greater control of splits. */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Use 'verts' for splitting, else just find verts to split from edges. */
{"use_verts", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Old output disconnected edges. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_split_edges_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1596,22 +1954,29 @@ static BMOpDefine bmo_split_edges_def = {
* Creates a grid with a variable number of subdivisions
*/
static BMOpDefine bmo_create_grid_def = {
"create_grid",
/*slot_types_in*/
{{"x_segments", BMO_OP_SLOT_INT}, /* number of x segments */
{"y_segments", BMO_OP_SLOT_INT}, /* number of y segments */
{"size", BMO_OP_SLOT_FLT}, /* size of the grid */
{"matrix", BMO_OP_SLOT_MAT}, /* matrix to multiply the new geometry with */
{"calc_uvs", BMO_OP_SLOT_BOOL}, /* calculate default UVs */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
bmo_create_grid_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"create_grid",
/*slot_types_in*/
{
/* Number of x segments. */
{"x_segments", BMO_OP_SLOT_INT},
/* Number of y segments. */
{"y_segments", BMO_OP_SLOT_INT},
/* Size of the grid. */
{"size", BMO_OP_SLOT_FLT},
/* Matrix to multiply the new geometry with. */
{"matrix", BMO_OP_SLOT_MAT},
/* Calculate default UVs. */
{"calc_uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_grid_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1620,22 +1985,29 @@ static BMOpDefine bmo_create_grid_def = {
* Creates a grid with a variable number of subdivisions
*/
static BMOpDefine bmo_create_uvsphere_def = {
"create_uvsphere",
/*slot_types_in*/
{{"u_segments", BMO_OP_SLOT_INT}, /* number of u segments */
{"v_segments", BMO_OP_SLOT_INT}, /* number of v segment */
{"radius", BMO_OP_SLOT_FLT}, /* radius */
{"matrix", BMO_OP_SLOT_MAT}, /* matrix to multiply the new geometry with */
{"calc_uvs", BMO_OP_SLOT_BOOL}, /* calculate default UVs */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
bmo_create_uvsphere_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"create_uvsphere",
/*slot_types_in*/
{
/* Number of u segments. */
{"u_segments", BMO_OP_SLOT_INT},
/* Number of v segment. */
{"v_segments", BMO_OP_SLOT_INT},
/* Radius. */
{"radius", BMO_OP_SLOT_FLT},
/* Matrix to multiply the new geometry with. */
{"matrix", BMO_OP_SLOT_MAT},
/* Calculate default UVs. */
{"calc_uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_uvsphere_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1644,21 +2016,27 @@ static BMOpDefine bmo_create_uvsphere_def = {
* Creates a grid with a variable number of subdivisions
*/
static BMOpDefine bmo_create_icosphere_def = {
"create_icosphere",
/*slot_types_in*/
{{"subdivisions", BMO_OP_SLOT_INT}, /* how many times to recursively subdivide the sphere */
{"radius", BMO_OP_SLOT_FLT}, /* radius */
{"matrix", BMO_OP_SLOT_MAT}, /* matrix to multiply the new geometry with */
{"calc_uvs", BMO_OP_SLOT_BOOL}, /* calculate default UVs */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
bmo_create_icosphere_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"create_icosphere",
/*slot_types_in*/
{
/* How many times to recursively subdivide the sphere. */
{"subdivisions", BMO_OP_SLOT_INT},
/* Radius. */
{"radius", BMO_OP_SLOT_FLT},
/* Matrix to multiply the new geometry with. */
{"matrix", BMO_OP_SLOT_MAT},
/* Calculate default UVs. */
{"calc_uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_icosphere_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1667,19 +2045,23 @@ static BMOpDefine bmo_create_icosphere_def = {
* Creates a monkey (standard blender primitive).
*/
static BMOpDefine bmo_create_monkey_def = {
"create_monkey",
/*slot_types_in*/
{{"matrix", BMO_OP_SLOT_MAT}, /* matrix to multiply the new geometry with */
{"calc_uvs", BMO_OP_SLOT_BOOL}, /* calculate default UVs */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
bmo_create_monkey_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"create_monkey",
/*slot_types_in*/
{
/* Matrix to multiply the new geometry with. */
{"matrix", BMO_OP_SLOT_MAT},
/* Calculate default UVs. */
{"calc_uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_monkey_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1688,48 +2070,66 @@ static BMOpDefine bmo_create_monkey_def = {
* Creates a cone with variable depth at both ends
*/
static BMOpDefine bmo_create_cone_def = {
"create_cone",
/*slot_types_in*/
{{"cap_ends", BMO_OP_SLOT_BOOL}, /* whether or not to fill in the ends with faces */
{"cap_tris", BMO_OP_SLOT_BOOL}, /* fill ends with triangles instead of ngons */
{"segments", BMO_OP_SLOT_INT}, /* number of vertices in the base circle */
{"radius1", BMO_OP_SLOT_FLT}, /* radius of one end */
{"radius2", BMO_OP_SLOT_FLT}, /* radius of the opposite */
{"depth", BMO_OP_SLOT_FLT}, /* distance between ends */
{"matrix", BMO_OP_SLOT_MAT}, /* matrix to multiply the new geometry with */
{"calc_uvs", BMO_OP_SLOT_BOOL}, /* calculate default UVs */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
bmo_create_cone_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"create_cone",
/*slot_types_in*/
{
/* Whether or not to fill in the ends with faces. */
{"cap_ends", BMO_OP_SLOT_BOOL},
/* Fill ends with triangles instead of ngons. */
{"cap_tris", BMO_OP_SLOT_BOOL},
/* Number of vertices in the base circle. */
{"segments", BMO_OP_SLOT_INT},
/* Radius of one end. */
{"radius1", BMO_OP_SLOT_FLT},
/* Radius of the opposite. */
{"radius2", BMO_OP_SLOT_FLT},
/* Distance between ends. */
{"depth", BMO_OP_SLOT_FLT},
/* Matrix to multiply the new geometry with. */
{"matrix", BMO_OP_SLOT_MAT},
/* Calculate default UVs. */
{"calc_uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_cone_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
* Creates a Circle.
*/
static BMOpDefine bmo_create_circle_def = {
"create_circle",
/*slot_types_in*/
{{"cap_ends", BMO_OP_SLOT_BOOL}, /* whether or not to fill in the ends with faces */
{"cap_tris", BMO_OP_SLOT_BOOL}, /* fill ends with triangles instead of ngons */
{"segments", BMO_OP_SLOT_INT}, /* number of vertices in the circle */
{"radius", BMO_OP_SLOT_FLT}, /* Radius of the circle. */
{"matrix", BMO_OP_SLOT_MAT}, /* matrix to multiply the new geometry with */
{"calc_uvs", BMO_OP_SLOT_BOOL}, /* calculate default UVs */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
bmo_create_circle_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"create_circle",
/*slot_types_in*/
{
/* Whether or not to fill in the ends with faces. */
{"cap_ends", BMO_OP_SLOT_BOOL},
/* Fill ends with triangles instead of ngons. */
{"cap_tris", BMO_OP_SLOT_BOOL},
/* Number of vertices in the circle. */
{"segments", BMO_OP_SLOT_INT},
/* Radius of the circle. */
{"radius", BMO_OP_SLOT_FLT},
/* Matrix to multiply the new geometry with. */
{"matrix", BMO_OP_SLOT_MAT},
/* Calculate default UVs. */
{"calc_uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_circle_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1738,62 +2138,67 @@ static BMOpDefine bmo_create_circle_def = {
* Creates a cube.
*/
static BMOpDefine bmo_create_cube_def = {
"create_cube",
/*slot_types_in*/
{{"size", BMO_OP_SLOT_FLT}, /* size of the cube */
{"matrix", BMO_OP_SLOT_MAT}, /* matrix to multiply the new geometry with */
{"calc_uvs", BMO_OP_SLOT_BOOL}, /* calculate default UVs */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
bmo_create_cube_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"create_cube",
/*slot_types_in*/
{
/* Size of the cube. */
{"size", BMO_OP_SLOT_FLT},
/* Matrix to multiply the new geometry with. */
{"matrix", BMO_OP_SLOT_MAT},
/* Calculate default UVs. */
{"calc_uvs", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_create_cube_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
static BMO_FlagSet bmo_enum_bevel_offset_type[] = {
{BEVEL_AMT_OFFSET, "OFFSET"},
{BEVEL_AMT_WIDTH, "WIDTH"},
{BEVEL_AMT_DEPTH, "DEPTH"},
{BEVEL_AMT_PERCENT, "PERCENT"},
{BEVEL_AMT_ABSOLUTE, "ABSOLUTE"},
{0, nullptr},
{BEVEL_AMT_OFFSET, "OFFSET"},
{BEVEL_AMT_WIDTH, "WIDTH"},
{BEVEL_AMT_DEPTH, "DEPTH"},
{BEVEL_AMT_PERCENT, "PERCENT"},
{BEVEL_AMT_ABSOLUTE, "ABSOLUTE"},
{0, nullptr},
};
static BMO_FlagSet bmo_enum_bevel_profile_type[] = {
{BEVEL_PROFILE_SUPERELLIPSE, "SUPERELLIPSE"},
{BEVEL_PROFILE_CUSTOM, "CUSTOM"},
{0, nullptr},
{BEVEL_PROFILE_SUPERELLIPSE, "SUPERELLIPSE"},
{BEVEL_PROFILE_CUSTOM, "CUSTOM"},
{0, nullptr},
};
static BMO_FlagSet bmo_enum_bevel_face_strength_type[] = {
{BEVEL_FACE_STRENGTH_NONE, "NONE"},
{BEVEL_FACE_STRENGTH_NEW, "NEW"},
{BEVEL_FACE_STRENGTH_AFFECTED, "AFFECTED"},
{BEVEL_FACE_STRENGTH_ALL, "ALL"},
{0, nullptr},
{BEVEL_FACE_STRENGTH_NONE, "NONE"},
{BEVEL_FACE_STRENGTH_NEW, "NEW"},
{BEVEL_FACE_STRENGTH_AFFECTED, "AFFECTED"},
{BEVEL_FACE_STRENGTH_ALL, "ALL"},
{0, nullptr},
};
static BMO_FlagSet bmo_enum_bevel_miter_type[] = {
{BEVEL_MITER_SHARP, "SHARP"},
{BEVEL_MITER_PATCH, "PATCH"},
{BEVEL_MITER_ARC, "ARC"},
{0, nullptr},
{BEVEL_MITER_SHARP, "SHARP"},
{BEVEL_MITER_PATCH, "PATCH"},
{BEVEL_MITER_ARC, "ARC"},
{0, nullptr},
};
static BMO_FlagSet bmo_enum_bevel_vmesh_method[] = {
{BEVEL_VMESH_ADJ, "ADJ"},
{BEVEL_VMESH_CUTOFF, "CUTOFF"},
{0, nullptr},
{BEVEL_VMESH_ADJ, "ADJ"},
{BEVEL_VMESH_CUTOFF, "CUTOFF"},
{0, nullptr},
};
static BMO_FlagSet bmo_enum_bevel_affect_type[] = {
{BEVEL_AFFECT_VERTICES, "VERTICES"},
{BEVEL_AFFECT_EDGES, "EDGES"},
{0, nullptr},
{BEVEL_AFFECT_VERTICES, "VERTICES"},
{BEVEL_AFFECT_EDGES, "EDGES"},
{0, nullptr},
};
/*
@@ -1802,55 +2207,91 @@ static BMO_FlagSet bmo_enum_bevel_affect_type[] = {
* Bevels edges and vertices
*/
static BMOpDefine bmo_bevel_def = {
"bevel",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input edges and vertices */
{"offset", BMO_OP_SLOT_FLT}, /* amount to offset beveled edge */
{"offset_type", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_offset_type}, /* how to measure the offset */
{"profile_type", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_profile_type}, /* The profile type to use for bevel. */
{"segments", BMO_OP_SLOT_INT}, /* number of segments in bevel */
{"profile", BMO_OP_SLOT_FLT}, /* profile shape, 0->1 (.5=>round) */
{"affect", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_affect_type}, /* Whether to bevel vertices or edges. */
{"clamp_overlap", BMO_OP_SLOT_BOOL}, /* do not allow beveled edges/vertices to overlap each other */
{"material", BMO_OP_SLOT_INT}, /* material for bevel faces, -1 means get from adjacent faces */
{"loop_slide", BMO_OP_SLOT_BOOL}, /* prefer to slide along edges to having even widths */
{"mark_seam", BMO_OP_SLOT_BOOL}, /* extend edge data to allow seams to run across bevels */
{"mark_sharp", BMO_OP_SLOT_BOOL}, /* extend edge data to allow sharp edges to run across bevels */
{"harden_normals", BMO_OP_SLOT_BOOL}, /* harden normals */
{"face_strength_mode", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_face_strength_type}, /* whether to set face strength, and which faces to set if so */
{"miter_outer", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_miter_type}, /* outer miter kind */
{"miter_inner", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_miter_type}, /* outer miter kind */
{"spread", BMO_OP_SLOT_FLT}, /* amount to offset beveled edge */
{"custom_profile", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_STRUCT)}, /* CurveProfile, if None ignored */
{"vmesh_method", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_vmesh_method}, /* The method to use to create meshes at intersections. */
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* output edges */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{{'\0'}},
},
"bevel",
/*slot_types_in*/
{
/* Input edges and vertices. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Amount to offset beveled edge. */
{"offset", BMO_OP_SLOT_FLT},
/* How to measure the offset. */
{"offset_type",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_offset_type},
/* The profile type to use for bevel. */
{"profile_type",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_profile_type},
/* Number of segments in bevel. */
{"segments", BMO_OP_SLOT_INT},
/* Profile shape, 0->1 (.5=>round). */
{"profile", BMO_OP_SLOT_FLT},
/* Whether to bevel vertices or edges. */
{"affect",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_affect_type},
/* Do not allow beveled edges/vertices to overlap each other. */
{"clamp_overlap", BMO_OP_SLOT_BOOL},
/* Material for bevel faces, -1 means get from adjacent faces. */
{"material", BMO_OP_SLOT_INT},
/* Prefer to slide along edges to having even widths. */
{"loop_slide", BMO_OP_SLOT_BOOL},
/* Extend edge data to allow seams to run across bevels. */
{"mark_seam", BMO_OP_SLOT_BOOL},
/* Extend edge data to allow sharp edges to run across bevels. */
{"mark_sharp", BMO_OP_SLOT_BOOL},
/* Harden normals. */
{"harden_normals", BMO_OP_SLOT_BOOL},
/* Whether to set face strength, and which faces to set if so. */
{"face_strength_mode",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_face_strength_type},
/* Outer miter kind. */
{"miter_outer",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_miter_type},
/* Outer miter kind. */
{"miter_inner",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_miter_type},
/* Amount to offset beveled edge. */
{"spread", BMO_OP_SLOT_FLT},
/* CurveProfile, if None ignored */
{"custom_profile", BMO_OP_SLOT_PTR, to_subtype_union(BMO_OP_SLOT_SUBTYPE_PTR_STRUCT)},
/* The method to use to create meshes at intersections. */
{"vmesh_method",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_bevel_vmesh_method},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Output edges. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
{{'\0'}},
},
bmo_bevel_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
bmo_bevel_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/* no enum is defined for this */
/* No enum is defined for this. */
static BMO_FlagSet bmo_enum_beautify_fill_method[] = {
{0, "AREA"},
{1, "ANGLE"},
{0, nullptr},
{0, "AREA"},
{1, "ANGLE"},
{0, nullptr},
};
/*
@@ -1859,23 +2300,31 @@ static BMO_FlagSet bmo_enum_beautify_fill_method[] = {
* Rotate edges to create more evenly spaced triangles.
*/
static BMOpDefine bmo_beautify_fill_def = {
"beautify_fill",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* edges that can be flipped */
{"use_restrict_tag", BMO_OP_SLOT_BOOL}, /* restrict edge rotation to mixed tagged vertices */
{"method", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_beautify_fill_method}, /* method to define what is beautiful */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* new flipped faces and edges */
{{'\0'}},
},
bmo_beautify_fill_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"beautify_fill",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Edges that can be flipped. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Restrict edge rotation to mixed tagged vertices. */
{"use_restrict_tag", BMO_OP_SLOT_BOOL},
/* Method to define what is beautiful. */
{"method",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_beautify_fill_method},
{{'\0'}},
},
/*slot_types_out*/
{
/* New flipped faces and edges. */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_beautify_fill_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/*
@@ -1884,22 +2333,27 @@ static BMOpDefine bmo_beautify_fill_def = {
* Fill edges with triangles
*/
static BMOpDefine bmo_triangle_fill_def = {
"triangle_fill",
/*slot_types_in*/
{{"use_beauty", BMO_OP_SLOT_BOOL}, /* use best triangulation division */
{"use_dissolve", BMO_OP_SLOT_BOOL}, /* dissolve resulting faces */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"normal", BMO_OP_SLOT_VEC}, /* optionally pass the fill normal to use */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* new faces and edges */
{{'\0'}},
},
bmo_triangle_fill_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"triangle_fill",
/*slot_types_in*/
{
/* Use best triangulation division. */
{"use_beauty", BMO_OP_SLOT_BOOL},
/* Dissolve resulting faces. */
{"use_dissolve", BMO_OP_SLOT_BOOL},
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Optionally pass the fill normal to use. */
{"normal", BMO_OP_SLOT_VEC},
{{'\0'}},
},
/*slot_types_out*/
{
/* New faces and edges. */
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_triangle_fill_exec,
(BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1908,19 +2362,22 @@ static BMOpDefine bmo_triangle_fill_def = {
* Turns a mesh into a shell with thickness
*/
static BMOpDefine bmo_solidify_def = {
"solidify",
/*slot_types_in*/
{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"thickness", BMO_OP_SLOT_FLT}, /* thickness */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_solidify_face_region_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"solidify",
/*slot_types_in*/
{
/* Input geometry. */
{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Thickness. */
{"thickness", BMO_OP_SLOT_FLT},
{{'\0'}},
},
/*slot_types_out*/
{
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_solidify_face_region_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1929,23 +2386,32 @@ static BMOpDefine bmo_solidify_def = {
* Insets individual faces.
*/
static BMOpDefine bmo_inset_individual_def = {
"inset_individual",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"thickness", BMO_OP_SLOT_FLT}, /* thickness */
{"depth", BMO_OP_SLOT_FLT}, /* depth */
{"use_even_offset", BMO_OP_SLOT_BOOL}, /* scale the offset to give more even thickness */
{"use_interpolate", BMO_OP_SLOT_BOOL}, /* blend face data across the inset */
{"use_relative_offset", BMO_OP_SLOT_BOOL}, /* scale the offset by surrounding geometry */
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{{'\0'}},
},
bmo_inset_individual_exec,
/* caller needs to handle BMO_OPTYPE_FLAG_SELECT_FLUSH */
(BMO_OPTYPE_FLAG_NORMALS_CALC),
"inset_individual",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Thickness. */
{"thickness", BMO_OP_SLOT_FLT},
/* Depth. */
{"depth", BMO_OP_SLOT_FLT},
/* Scale the offset to give more even thickness. */
{"use_even_offset", BMO_OP_SLOT_BOOL},
/* Blend face data across the inset. */
{"use_interpolate", BMO_OP_SLOT_BOOL},
/* Scale the offset by surrounding geometry. */
{"use_relative_offset", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_inset_individual_exec,
/* Caller needs to handle BMO_OPTYPE_FLAG_SELECT_FLUSH. */
(BMO_OPTYPE_FLAG_NORMALS_CALC),
};
/*
@@ -1954,27 +2420,39 @@ static BMOpDefine bmo_inset_individual_def = {
* Inset or outset face regions.
*/
static BMOpDefine bmo_inset_region_def = {
"inset_region",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces to explicitly exclude from inset */
{"use_boundary", BMO_OP_SLOT_BOOL}, /* inset face boundaries */
{"use_even_offset", BMO_OP_SLOT_BOOL}, /* scale the offset to give more even thickness */
{"use_interpolate", BMO_OP_SLOT_BOOL}, /* blend face data across the inset */
{"use_relative_offset", BMO_OP_SLOT_BOOL}, /* scale the offset by surrounding geometry */
{"use_edge_rail", BMO_OP_SLOT_BOOL}, /* inset the region along existing edges */
{"thickness", BMO_OP_SLOT_FLT}, /* thickness */
{"depth", BMO_OP_SLOT_FLT}, /* depth */
{"use_outset", BMO_OP_SLOT_BOOL}, /* outset rather than inset */
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{{'\0'}},
},
bmo_inset_region_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"inset_region",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Input faces to explicitly exclude from inset. */
{"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Inset face boundaries. */
{"use_boundary", BMO_OP_SLOT_BOOL},
/* Scale the offset to give more even thickness. */
{"use_even_offset", BMO_OP_SLOT_BOOL},
/* Blend face data across the inset. */
{"use_interpolate", BMO_OP_SLOT_BOOL},
/* Scale the offset by surrounding geometry. */
{"use_relative_offset", BMO_OP_SLOT_BOOL},
/* Inset the region along existing edges. */
{"use_edge_rail", BMO_OP_SLOT_BOOL},
/* Thickness. */
{"thickness", BMO_OP_SLOT_FLT},
/* Depth. */
{"depth", BMO_OP_SLOT_FLT},
/* Outset rather than inset. */
{"use_outset", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_inset_region_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -1983,19 +2461,23 @@ static BMOpDefine bmo_inset_region_def = {
* Creates edge loops based on simple edge-outset method.
*/
static BMOpDefine bmo_offset_edgeloops_def = {
"offset_edgeloops",
/*slot_types_in*/
{{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */
{"use_cap_endpoint", BMO_OP_SLOT_BOOL}, /* extend loop around end-points */
{{'\0'}},
},
/*slot_types_out*/
{{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* output edges */
{{'\0'}},
},
bmo_offset_edgeloops_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH),
"offset_edgeloops",
/*slot_types_in*/
{
/* Input edges. */
{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
/* Extend loop around end-points. */
{"use_cap_endpoint", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output edges. */
{"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
{{'\0'}},
},
bmo_offset_edgeloops_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH),
};
/*
@@ -2004,35 +2486,47 @@ static BMOpDefine bmo_offset_edgeloops_def = {
* Makes a wire-frame copy of faces.
*/
static BMOpDefine bmo_wireframe_def = {
"wireframe",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"thickness", BMO_OP_SLOT_FLT}, /* thickness */
{"offset", BMO_OP_SLOT_FLT}, /* offset the thickness from the center */
{"use_replace", BMO_OP_SLOT_BOOL}, /* remove original geometry */
{"use_boundary", BMO_OP_SLOT_BOOL}, /* inset face boundaries */
{"use_even_offset", BMO_OP_SLOT_BOOL}, /* scale the offset to give more even thickness */
{"use_crease", BMO_OP_SLOT_BOOL}, /* crease hub edges for improved subdivision surface */
{"crease_weight", BMO_OP_SLOT_FLT}, /* the mean crease weight for resulting edges */
{"use_relative_offset", BMO_OP_SLOT_BOOL}, /* scale the offset by surrounding geometry */
{"material_offset", BMO_OP_SLOT_INT}, /* offset material index of generated faces */
{{'\0'}},
},
/*slot_types_out*/
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{{'\0'}},
},
bmo_wireframe_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"wireframe",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Thickness. */
{"thickness", BMO_OP_SLOT_FLT},
/* Offset the thickness from the center. */
{"offset", BMO_OP_SLOT_FLT},
/* Remove original geometry. */
{"use_replace", BMO_OP_SLOT_BOOL},
/* Inset face boundaries. */
{"use_boundary", BMO_OP_SLOT_BOOL},
/* Scale the offset to give more even thickness. */
{"use_even_offset", BMO_OP_SLOT_BOOL},
/* Crease hub edges for improved subdivision surface. */
{"use_crease", BMO_OP_SLOT_BOOL},
/* The mean crease weight for resulting edges. */
{"crease_weight", BMO_OP_SLOT_FLT},
/* Scale the offset by surrounding geometry. */
{"use_relative_offset", BMO_OP_SLOT_BOOL},
/* Offset material index of generated faces. */
{"material_offset", BMO_OP_SLOT_INT},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_wireframe_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
static BMO_FlagSet bmo_enum_poke_center_mode[] = {
{BMOP_POKE_MEDIAN_WEIGHTED, "MEAN_WEIGHTED"},
{BMOP_POKE_MEDIAN, "MEAN"},
{BMOP_POKE_BOUNDS, "BOUNDS"},
{0, nullptr},
{BMOP_POKE_MEDIAN_WEIGHTED, "MEAN_WEIGHTED"},
{BMOP_POKE_MEDIAN, "MEAN"},
{BMOP_POKE_BOUNDS, "BOUNDS"},
{0, nullptr},
};
/*
@@ -2041,23 +2535,33 @@ static BMO_FlagSet bmo_enum_poke_center_mode[] = {
* Splits a face into a triangle fan.
*/
static BMOpDefine bmo_poke_def = {
"poke",
/*slot_types_in*/
{{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */
{"offset", BMO_OP_SLOT_FLT}, /* center vertex offset along normal */
{"center_mode", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_poke_center_mode}, /* calculation mode for center vertex */
{"use_relative_offset", BMO_OP_SLOT_BOOL}, /* apply offset */
{{'\0'}},
},
/*slot_types_out*/
{{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{{'\0'}},
},
bmo_poke_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"poke",
/*slot_types_in*/
{
/* Input faces. */
{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
/* Center vertex offset along normal. */
{"offset", BMO_OP_SLOT_FLT},
/* Calculation mode for center vertex. */
{"center_mode",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_poke_center_mode},
/* Apply offset. */
{"use_relative_offset", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
/* Output verts. */
{"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
/* Output faces. */
{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}},
},
bmo_poke_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
#ifdef WITH_BULLET
@@ -2077,23 +2581,26 @@ static BMOpDefine bmo_poke_def = {
* that were in the input and are part of the hull.
*/
static BMOpDefine bmo_convex_hull_def = {
"convex_hull",
/*slot_types_in*/
{{"input", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"use_existing_faces", BMO_OP_SLOT_BOOL}, /* skip hull triangles that are covered by a pre-existing face */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_interior.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_unused.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_holes.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_convex_hull_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"convex_hull",
/*slot_types_in*/
{
/* Input geometry. */
{"input", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Skip hull triangles that are covered by a pre-existing face. */
{"use_existing_faces", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_interior.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_unused.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{"geom_holes.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_convex_hull_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
#endif
@@ -2108,26 +2615,32 @@ static BMOpDefine bmo_convex_hull_def = {
* All new vertices, edges, and faces are added to the "geom.out" slot.
*/
static BMOpDefine bmo_symmetrize_def = {
"symmetrize",
/*slot_types_in*/
{{"input", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"direction", BMO_OP_SLOT_INT, to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM), bmo_enum_axis_neg_xyz_and_xyz}, /* axis to use */
{"dist", BMO_OP_SLOT_FLT}, /* minimum distance */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
/*slot_types_out*/
{{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_symmetrize_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC |
BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
"symmetrize",
/*slot_types_in*/
{
/* Input geometry. */
{"input", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
/* Axis to use. */
{"direction",
BMO_OP_SLOT_INT,
to_subtype_union(BMO_OP_SLOT_SUBTYPE_INT_ENUM),
bmo_enum_axis_neg_xyz_and_xyz},
/* Minimum distance. */
{"dist", BMO_OP_SLOT_FLT},
/* Transform shape keys too. */
{"use_shapekey", BMO_OP_SLOT_BOOL},
{{'\0'}},
},
/*slot_types_out*/
{
{"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
{{'\0'}},
},
bmo_symmetrize_exec,
(BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH |
BMO_OPTYPE_FLAG_SELECT_VALIDATE),
};
/* clang-format on */
#undef BM_FACE
#undef BM_EDGE
#undef BM_VERT