Blender V5.0
bmesh_opdefines.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
37
38#include "BLI_utildefines.h"
39
40#include "bmesh.hh"
42
43#include "DNA_modifier_types.h"
44
80
81/* Keep struct definition from wrapping. */
82
83/* Enums shared between multiple operators. */
84
86 {0, "X"},
87 {1, "Y"},
88 {2, "Z"},
89 {0, nullptr},
90};
91
93 {0, "-X"},
94 {1, "-Y"},
95 {2, "-Z"},
96 {3, "X"},
97 {4, "Y"},
98 {5, "Z"},
99 {0, nullptr},
100};
101
103 {SUBD_FALLOFF_SMOOTH, "SMOOTH"},
104 {SUBD_FALLOFF_SPHERE, "SPHERE"},
105 {SUBD_FALLOFF_ROOT, "ROOT"},
106 {SUBD_FALLOFF_SHARP, "SHARP"},
107 {SUBD_FALLOFF_LIN, "LINEAR"},
108 {SUBD_FALLOFF_INVSQUARE, "INVERSE_SQUARE"},
109 {0, nullptr},
110};
111
113{
115 value.ptr = ptr;
116 return value;
117}
118
120{
122 value.map = map;
123 return value;
124}
125
127{
129 value.intg = intg;
130 return value;
131}
132
133/* Quiet 'enum-conversion' warning. */
134#define BM_FACE ((eBMOpSlotSubType_Elem)BM_FACE)
135#define BM_EDGE ((eBMOpSlotSubType_Elem)BM_EDGE)
136#define BM_VERT ((eBMOpSlotSubType_Elem)BM_VERT)
137
138/*
139 * Vertex Smooth.
140 *
141 * Smooths vertices by using a basic vertex averaging scheme.
142 */
144 /*opname*/ "smooth_vert",
145 /*slot_types_in*/
146 {
147 /* Input vertices. */
148 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
149 /* Smoothing factor. */
150 {"factor", BMO_OP_SLOT_FLT},
151 /* Set vertices close to the x axis before the operation to 0. */
152 {"mirror_clip_x", BMO_OP_SLOT_BOOL},
153 /* Set vertices close to the y axis before the operation to 0. */
154 {"mirror_clip_y", BMO_OP_SLOT_BOOL},
155 /* Set vertices close to the z axis before the operation to 0. */
156 {"mirror_clip_z", BMO_OP_SLOT_BOOL},
157 /* Clipping threshold for the above three slots. */
158 {"clip_dist", BMO_OP_SLOT_FLT},
159 /* Smooth vertices along X axis. */
160 {"use_axis_x", BMO_OP_SLOT_BOOL},
161 /* Smooth vertices along Y axis. */
162 {"use_axis_y", BMO_OP_SLOT_BOOL},
163 /* Smooth vertices along Z axis. */
164 {"use_axis_z", BMO_OP_SLOT_BOOL},
165 {{'\0'}},
166 },
167 /*slot_types_out*/
168 {{{'\0'}}},
169 /*init*/ nullptr,
170 /*exec*/ bmo_smooth_vert_exec,
171 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
172};
173
174/*
175 * Vertex Smooth Laplacian.
176 *
177 * Smooths vertices by using Laplacian smoothing propose by.
178 * Desbrun, et al. Implicit Fairing of Irregular Meshes using Diffusion and Curvature Flow.
179 */
181 /*opname*/ "smooth_laplacian_vert",
182 /*slot_types_in*/
183 {
184 /* Input vertices. */
185 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
186 /* Lambda parameter. */
187 {"lambda_factor", BMO_OP_SLOT_FLT},
188 /* Lambda param in border. */
189 {"lambda_border", BMO_OP_SLOT_FLT},
190 /* Smooth object along X axis. */
191 {"use_x", BMO_OP_SLOT_BOOL},
192 /* Smooth object along Y axis. */
193 {"use_y", BMO_OP_SLOT_BOOL},
194 /* Smooth object along Z axis. */
195 {"use_z", BMO_OP_SLOT_BOOL},
196 /* Apply volume preservation after smooth. */
197 {"preserve_volume", BMO_OP_SLOT_BOOL},
198 {{'\0'}},
199 },
200 /*slot_types_out*/
201 {{{'\0'}}},
202 /*init*/ nullptr,
204 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
205};
206
207/*
208 * Right-Hand Faces.
209 *
210 * Computes an "outside" normal for the specified input faces.
211 */
213 /*opname*/ "recalc_face_normals",
214 /*slot_types_in*/
215 {
216 /* Input faces. */
217 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
218 {{'\0'}},
219 },
220 /*slot_types_out*/
221 {{{'\0'}}},
222 /*init*/ nullptr,
225};
226
227/*
228 * Planar Faces.
229 *
230 * Iteratively flatten faces.
231 */
233 /*opname*/ "planar_faces",
234 /*slot_types_in*/
235 {
236 /* Input geometry. */
237 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
238 /* Number of times to flatten faces (for when connected faces are used) */
239 {"iterations", BMO_OP_SLOT_INT},
240 /* Influence for making planar each iteration */
241 {"factor", BMO_OP_SLOT_FLT},
242 {{'\0'}},
243 },
244 /*slot_types_out*/
245 {
246 /* Output slot, computed boundary geometry. */
247 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
248 {{'\0'}},
249 },
250 /*init*/ nullptr,
251 /*exec*/ bmo_planar_faces_exec,
253};
254
255/*
256 * Region Extend.
257 *
258 * used to implement the select more/less tools.
259 * this puts some geometry surrounding regions of
260 * geometry in geom into geom.out.
261 *
262 * if use_faces is 0 then geom.out spits out verts and edges,
263 * otherwise it spits out faces.
264 */
266 /*opname*/ "region_extend",
267 /*slot_types_in*/
268 {
269 /* Input geometry. */
271 /* Find boundary inside the regions, not outside. */
272 {"use_contract", BMO_OP_SLOT_BOOL},
273 /* Extend from faces instead of edges. */
274 {"use_faces", BMO_OP_SLOT_BOOL},
275 /* Step over connected faces. */
276 {"use_face_step", BMO_OP_SLOT_BOOL},
277 {{'\0'}},
278 },
279 /*slot_types_out*/
280 {
281 /* Output slot, computed boundary geometry. */
282 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
283 {{'\0'}},
284 },
285 /*init*/ nullptr,
286 /*exec*/ bmo_region_extend_exec,
288};
289
290/*
291 * Edge Rotate.
292 *
293 * Rotates edges topologically. Also known as "spin edge" to some people.
294 * Simple example: `[/] becomes [|] then [\‍]`.
295 */
297 /*opname*/ "rotate_edges",
298 /*slot_types_in*/
299 {
300 /* Input edges. */
301 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
302 /* Rotate edge counter-clockwise if true, otherwise clockwise. */
303 {"use_ccw", BMO_OP_SLOT_BOOL},
304 {{'\0'}},
305 },
306 /*slot_types_out*/
307 {
308 /* Newly spun edges. */
309 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
310 {{'\0'}},
311 },
312 /*init*/ nullptr,
313 /*exec*/ bmo_rotate_edges_exec,
314 /*type_flag*/
317};
318
319/*
320 * Reverse Faces.
321 *
322 * Reverses the winding (vertex order) of faces.
323 * This has the effect of flipping the normal.
324 */
326 /*opname*/ "reverse_faces",
327 /*slot_types_in*/
328 {
329 /* Input faces. */
330 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
331 /* Maintain multi-res offset. */
332 {"flip_multires", BMO_OP_SLOT_BOOL},
333 {{'\0'}},
334 },
335 /*slot_types_out*/
336 {{{'\0'}}},
337 /*init*/ nullptr,
338 /*exec*/ bmo_reverse_faces_exec,
340};
341
342/*
343 * Flip Quad Tessellation
344 *
345 * Flip the tessellation direction of the selected quads.
346 */
348 /*opname*/ "flip_quad_tessellation",
349 /*slot_types_in*/
350 {
351 /* Input faces. */
352 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
353 {{'\0'}},
354 },
355 /*slot_types_out*/
356 {{{'\0'}}},
357 /*init*/ nullptr,
360};
361
362/*
363 * Edge Bisect.
364 *
365 * Splits input edges (but doesn't do anything else).
366 * This creates a 2-valence vert.
367 */
369 /*opname*/ "bisect_edges",
370 /*slot_types_in*/
371 {
372 /* Input edges. */
373 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
374 /* Number of cuts. */
375 {"cuts", BMO_OP_SLOT_INT},
376 {"edge_percents",
379 {{'\0'}},
380 },
381 /*slot_types_out*/
382 {
383 /* Newly created vertices and edges. */
384 {"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
385 {{'\0'}},
386 },
387 /*init*/ nullptr,
388 /*exec*/ bmo_bisect_edges_exec,
389 /*type_flag*/
392};
393
394/*
395 * Mirror.
396 *
397 * Mirrors geometry along an axis. The resulting geometry is welded on using
398 * merge_dist. Pairs of original/mirrored vertices are welded using the merge_dist
399 * parameter (which defines the minimum distance for welding to happen).
400 */
402 /*opname*/ "mirror",
403 /*slot_types_in*/
404 {
405 /* Input geometry. */
407 /* Matrix defining the mirror transformation. */
408 {"matrix", BMO_OP_SLOT_MAT},
409 /* Maximum distance for merging. does no merging if 0. */
410 {"merge_dist", BMO_OP_SLOT_FLT},
411 /* The axis to use. */
412 {"axis",
416 /* Mirror UVs across the u axis. */
417 {"mirror_u", BMO_OP_SLOT_BOOL},
418 /* Mirror UVs across the v axis. */
419 {"mirror_v", BMO_OP_SLOT_BOOL},
420 /* Mirror UVs in each tile. */
421 {"mirror_udim", BMO_OP_SLOT_BOOL},
422 /* Transform shape keys too. */
423 {"use_shapekey", BMO_OP_SLOT_BOOL},
424 {{'\0'}},
425 },
426 /*slot_types_out*/
427 {
428 /* Output geometry, mirrored. */
429 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
430 {{'\0'}},
431 },
432 /*init*/ nullptr,
433 /*exec*/ bmo_mirror_exec,
434 /*type_flag*/
437};
438
439/*
440 * Find Doubles.
441 *
442 * Takes input verts and find vertices they should weld to.
443 * Outputs a mapping slot suitable for use with the weld verts BMOP.
444 *
445 * If keep_verts is used, vertices outside that set can only be merged
446 * with vertices in that set.
447 */
449 /*opname*/ "find_doubles",
450 /*slot_types_in*/
451 {
452 /* Input vertices. */
453 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
454 /* List of verts to keep. */
455 {"keep_verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
456 /* Limit the search for doubles by connected geometry. */
457 {"use_connected", BMO_OP_SLOT_BOOL},
458 /* Maximum distance. */
459 {"dist", BMO_OP_SLOT_FLT},
460 {{'\0'}},
461 },
462 /*slot_types_out*/
463 {
464 {"targetmap.out",
467 {{'\0'}},
468 },
469 /*init*/ nullptr,
470 /*exec*/ bmo_find_doubles_exec,
471 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
472};
473
474/*
475 * Remove Doubles.
476 *
477 * Finds groups of vertices closer than dist and merges them together,
478 * using the weld verts BMOP.
479 */
481 /*opname*/ "remove_doubles",
482 /*slot_types_in*/
483 {
484 /* Input verts. */
485 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
486 /* Limit the search for doubles by connected geometry. */
487 {"use_connected", BMO_OP_SLOT_BOOL},
488 /* Minimum distance. */
489 {"dist", BMO_OP_SLOT_FLT},
490 {{'\0'}},
491 },
492 /*slot_types_out*/
493 {{{'\0'}}},
494 /*init*/ nullptr,
496 /*type_flag*/
499};
500
501/*
502 * Collapse Connected.
503 *
504 * Collapses connected vertices
505 */
507 /*opname*/ "collapse",
508 /*slot_types_in*/
509 {
510 /* Input edges. */
511 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
512 /* Also collapse UVs and such. */
513 {"uvs", BMO_OP_SLOT_BOOL},
514 {{'\0'}},
515 },
516 /*slot_types_out*/
517 {{{'\0'}}},
518 /*init*/ nullptr,
519 /*exec*/ bmo_collapse_exec,
520 /*type_flag*/
523};
524
525/*
526 * Face-Data Point Merge.
527 *
528 * Merge uv/vcols at a specific vertex.
529 */
531 /*opname*/ "pointmerge_facedata",
532 /*slot_types_in*/
533 {
534 /* Input vertices. */
535 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
536 /* Snap vertex. */
538 {{'\0'}},
539 },
540 /*slot_types_out*/
541 {{{'\0'}}},
542 /*init*/ nullptr,
544 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
545};
546
547/*
548 * Average Vertices Face-vert Data.
549 *
550 * Merge uv/vcols associated with the input vertices at
551 * the bounding box center. (I know, it's not averaging but
552 * the vert_snap_to_bb_center is just too long).
553 */
555 /*opname*/ "average_vert_facedata",
556 /*slot_types_in*/
557 {
558 /* Input vertices. */
559 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
560 {{'\0'}},
561 },
562 /*slot_types_out*/
563 {{{'\0'}}},
564 /*init*/ nullptr,
566 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
567};
568
569/*
570 * Point Merge.
571 *
572 * Merge verts together at a point.
573 */
575 /*opname*/ "pointmerge",
576 /*slot_types_in*/
577 {
578 /* Input vertices (all verts will be merged into the first). */
579 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
580 /* Position to merge at. */
581 {"merge_co", BMO_OP_SLOT_VEC},
582 {{'\0'}},
583 },
584 /*slot_types_out*/
585 {{{'\0'}}},
586 /*init*/ nullptr,
587 /*exec*/ bmo_pointmerge_exec,
588 /*type_flag*/
591};
592
593/*
594 * Collapse Connected UVs.
595 *
596 * Collapses connected UV vertices.
597 */
599 /*opname*/ "collapse_uvs",
600 /*slot_types_in*/
601 {
602 /* Input edges. */
603 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
604 {{'\0'}},
605 },
606 /*slot_types_out*/
607 {{{'\0'}}},
608 /*init*/ nullptr,
609 /*exec*/ bmo_collapse_uvs_exec,
610 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
611};
612
613/*
614 * Weld Verts.
615 *
616 * Welds verts together (kind-of like remove doubles, merge, etc, all of which
617 * use or will use this BMOP). You pass in mappings from vertices to the vertices
618 * they weld with.
619 */
621 /*opname*/ "weld_verts",
622 /*slot_types_in*/
623 {
624 /* Maps welded vertices to verts they should weld to. */
626 /* Merged vertices to their centroid position,
627 * otherwise the position of the target vertex is used. */
628 {"use_centroid", BMO_OP_SLOT_BOOL},
629 {{'\0'}},
630 },
631 /*slot_types_out*/
632 {{{'\0'}}},
633 /*init*/ nullptr,
634 /*exec*/ bmo_weld_verts_exec,
635 /*type_flag*/
638};
639
640/*
641 * Make Vertex.
642 *
643 * Creates a single vertex; this BMOP was necessary
644 * for click-create-vertex.
645 */
647 /*opname*/ "create_vert",
648 /*slot_types_in*/
649 {
650 /* The coordinate of the new vert. */
651 {"co", BMO_OP_SLOT_VEC},
652 {{'\0'}},
653 },
654 /*slot_types_out*/
655 {
656 /* The new vert. */
657 {"vert.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
658 {{'\0'}},
659 },
660 /*init*/ nullptr,
661 /*exec*/ bmo_create_vert_exec,
662 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
663};
664
665/*
666 * Join Triangles.
667 *
668 * Tries to intelligently join triangles according
669 * to angle threshold and delimiters.
670 */
671
672#if 0 /* See comments at top of bmo_join_triangles.cc */
673# define USE_JOIN_TRIANGLE_INTERACTIVE_TESTING
674#endif
675
677 /*opname*/ "join_triangles",
678 /*slot_types_in*/
679 {
680 /* Input geometry. */
681 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
682 /* Compare seam */
683 {"cmp_seam", BMO_OP_SLOT_BOOL},
684 /* Compare sharp */
685 {"cmp_sharp", BMO_OP_SLOT_BOOL},
686 /* Compare UVs */
687 {"cmp_uvs", BMO_OP_SLOT_BOOL},
688 /* Compare VCols. */
689 {"cmp_vcols", BMO_OP_SLOT_BOOL},
690 /* Compare materials. */
691 {"cmp_materials", BMO_OP_SLOT_BOOL},
692 {"angle_face_threshold", BMO_OP_SLOT_FLT},
693 {"angle_shape_threshold", BMO_OP_SLOT_FLT},
694 {"topology_influence", BMO_OP_SLOT_FLT},
695 {"deselect_joined", BMO_OP_SLOT_BOOL},
696#ifdef USE_JOIN_TRIANGLE_INTERACTIVE_TESTING
697 {"merge_limit", BMO_OP_SLOT_INT},
698 {"neighbor_debug", BMO_OP_SLOT_INT},
699#endif
700 {{'\0'}},
701 },
702 /*slot_types_out*/
703 {
704 /* Joined faces. */
705 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
706 {{'\0'}},
707 },
708 /*init*/ nullptr,
710 /*type_flag*/
713};
714
715/*
716 * Contextual Create.
717 *
718 * This is basically F-key, it creates
719 * new faces from vertices, makes stuff from edge nets,
720 * makes wire edges, etc. It also dissolves faces.
721 *
722 * Three verts become a triangle, four become a quad. Two
723 * become a wire edge.
724 */
726 /*opname*/ "contextual_create",
727 /*slot_types_in*/
728 {
729 /* Input geometry. */
731 /* Material to use. */
732 {"mat_nr", BMO_OP_SLOT_INT},
733 /* Smooth to use. */
734 {"use_smooth", BMO_OP_SLOT_BOOL},
735 {{'\0'}},
736 },
737 /*slot_types_out*/
738 {
739 /* Newly-made face(s). */
740 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
741
742 /* NOTE: this is for stand-alone edges only,
743 * not edges which are a part of newly created faces. */
744
745 /* Newly-made edge(s). */
746 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
747 {{'\0'}},
748 },
749 /*init*/ nullptr,
751 /*type_flag*/
754};
755
756/*
757 * Bridge edge loops with faces.
758 */
760 /*opname*/ "bridge_loops",
761 /*slot_types_in*/
762 {
763 /* Input edges. */
764 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
765 {"use_pairs", BMO_OP_SLOT_BOOL},
766 {"use_cyclic", BMO_OP_SLOT_BOOL},
767 /* Merge rather than creating faces. */
768 {"use_merge", BMO_OP_SLOT_BOOL},
769 /* Merge factor. */
770 {"merge_factor", BMO_OP_SLOT_FLT},
771 /* Twist offset for closed loops. */
772 {"twist_offset", BMO_OP_SLOT_INT},
773 {{'\0'}},
774 },
775 /*slot_types_out*/
776 {
777 /* New faces. */
778 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
779 /* New edges. */
780 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
781 {{'\0'}},
782 },
783 /*init*/ nullptr,
784 /*exec*/ bmo_bridge_loops_exec,
785 /*type_flag*/
788};
789
790/*
791 * Grid Fill.
792 *
793 * Create faces defined by 2 disconnected edge loops (which share edges).
794 */
796 /*opname*/ "grid_fill",
797 /*slot_types_in*/
798 {
799 /* Input edges. */
800 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
801
802 /* Restricts edges to groups. maps edges to integer. */
803
804 /* Material to use. */
805 {"mat_nr", BMO_OP_SLOT_INT},
806 /* Smooth state to use. */
807 {"use_smooth", BMO_OP_SLOT_BOOL},
808 /* Use simple interpolation. */
809 {"use_interp_simple", BMO_OP_SLOT_BOOL},
810 {{'\0'}},
811 },
812
813 /*slot_types_out*/
814 {
815 /* New faces. */
816 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
817 {{'\0'}},
818 },
819 /*init*/ nullptr,
820 /*exec*/ bmo_grid_fill_exec,
822};
823
824/*
825 * Fill Holes.
826 *
827 * Fill boundary edges with faces, copying surrounding custom-data.
828 */
830 /*opname*/ "holes_fill",
831 /*slot_types_in*/
832 {
833 /* Input edges. */
834 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
835 /* Number of face sides to fill. */
836 {"sides", BMO_OP_SLOT_INT},
837 {{'\0'}},
838 },
839 /*slot_types_out*/
840 {
841 /* New faces. */
842 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
843 {{'\0'}},
844 },
845 /*init*/ nullptr,
846 /*exec*/ bmo_holes_fill_exec,
848};
849
850/*
851 * Face Attribute Fill.
852 *
853 * Fill in faces with data from adjacent faces.
854 */
856 /*opname*/ "face_attribute_fill",
857 /*slot_types_in*/
858 {
859 /* Input faces. */
860 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
861 /* Copy face winding. */
862 {"use_normals", BMO_OP_SLOT_BOOL},
863 /* Copy face data. */
864 {"use_data", BMO_OP_SLOT_BOOL},
865 {{'\0'}},
866 },
867 /*slot_types_out*/
868 {
869 /* Faces that could not be handled. */
870 {"faces_fail.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
871 {{'\0'}},
872 },
873 /*init*/ nullptr,
875 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
876};
877
878/*
879 * Edge Loop Fill.
880 *
881 * Create faces defined by one or more non overlapping edge loops.
882 */
884 /*opname*/ "edgeloop_fill",
885 /*slot_types_in*/
886 {
887 /* Input edges. */
888 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
889
890 /* Restricts edges to groups. maps edges to integer. */
891
892 /* Material to use. */
893 {"mat_nr", BMO_OP_SLOT_INT},
894 /* Smooth state to use. */
895 {"use_smooth", BMO_OP_SLOT_BOOL},
896 {{'\0'}},
897 },
898 /*slot_types_out*/
899 {
900 /* New faces. */
901 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
902 {{'\0'}},
903 },
904 /*init*/ nullptr,
905 /*exec*/ bmo_edgeloop_fill_exec,
907};
908
909/*
910 * Edge Net Fill.
911 *
912 * Create faces defined by enclosed edges.
913 */
915 /*opname*/ "edgenet_fill",
916 /*slot_types_in*/
917 {
918 /* Input edges. */
919 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
920 /* Material to use. */
921 {"mat_nr", BMO_OP_SLOT_INT},
922 /* Smooth state to use. */
923 {"use_smooth", BMO_OP_SLOT_BOOL},
924 /* Number of sides. */
925 {"sides", BMO_OP_SLOT_INT},
926 {{'\0'}},
927 },
928 /*slot_types_out*/
929 {
930 /* New faces. */
931 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
932 {{'\0'}},
933 },
934 /*init*/ nullptr,
935 /*exec*/ bmo_edgenet_fill_exec,
937};
938
939/*
940 * Edge-net Prepare.
941 *
942 * Identifies several useful edge loop cases and modifies them so
943 * they'll become a face when edgenet_fill is called. The cases covered are:
944 *
945 * - One single loop; an edge is added to connect the ends
946 * - Two loops; two edges are added to connect the endpoints (based on the
947 * shortest distance between each endpoint).
948 */
950 /*opname*/ "edgenet_prepare",
951 /*slot_types_in*/
952 {
953 /* Input edges. */
954 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
955 {{'\0'}},
956 },
957 /*slot_types_out*/
958 {
959 /* New edges. */
960 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
961 {{'\0'}},
962 },
963 /*init*/ nullptr,
965 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
966};
967
968/*
969 * Rotate.
970 *
971 * Rotate vertices around a center, using a 3x3 rotation matrix.
972 */
974 /*opname*/ "rotate",
975 /*slot_types_in*/
976 {
977 /* Center of rotation. */
978 {"cent", BMO_OP_SLOT_VEC},
979 /* Matrix defining rotation. */
980 {"matrix", BMO_OP_SLOT_MAT},
981 /* Input vertices. */
982 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
983 /* Matrix to define the space (typically object matrix). */
984 {"space", BMO_OP_SLOT_MAT},
985 /* Transform shape keys too. */
986 {"use_shapekey", BMO_OP_SLOT_BOOL},
987 {{'\0'}},
988 },
989 /*slot_types_out*/
990 {{{'\0'}}},
991 /*init*/ nullptr,
992 /*exec*/ bmo_rotate_exec,
993 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
994};
995
996/*
997 * Translate.
998 *
999 * Translate vertices by an offset.
1000 */
1002 /*opname*/ "translate",
1003 /*slot_types_in*/
1004 {
1005 /* Translation offset. */
1006 {"vec", BMO_OP_SLOT_VEC},
1007 /* Matrix to define the space (typically object matrix). */
1008 {"space", BMO_OP_SLOT_MAT},
1009 /* Input vertices. */
1010 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1011 /* Transform shape keys too. */
1012 {"use_shapekey", BMO_OP_SLOT_BOOL},
1013 {{'\0'}},
1014 },
1015 /*slot_types_out*/
1016 {{{'\0'}}},
1017 /*init*/ nullptr,
1018 /*exec*/ bmo_translate_exec,
1019 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
1020};
1021
1022/*
1023 * Scale.
1024 *
1025 * Scales vertices by an offset.
1026 */
1028 /*opname*/ "scale",
1029 /*slot_types_in*/
1030 {
1031 /* Scale factor. */
1032 {"vec", BMO_OP_SLOT_VEC},
1033 /* Matrix to define the space (typically object matrix). */
1034 {"space", BMO_OP_SLOT_MAT},
1035 /* Input vertices. */
1036 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1037 /* Transform shape keys too. */
1038 {"use_shapekey", BMO_OP_SLOT_BOOL},
1039 {{'\0'}},
1040 },
1041 /*slot_types_out*/
1042 {{{'\0'}}},
1043 /*init*/ nullptr,
1044 /*exec*/ bmo_scale_exec,
1045 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
1046};
1047
1048/*
1049 * Transform.
1050 *
1051 * Transforms a set of vertices by a matrix. Multiplies
1052 * the vertex coordinates with the matrix.
1053 */
1055 /*opname*/ "transform",
1056 /*slot_types_in*/
1057 {
1058 /* Transform matrix. */
1059 {"matrix", BMO_OP_SLOT_MAT},
1060 /* Matrix to define the space (typically object matrix). */
1061 {"space", BMO_OP_SLOT_MAT},
1062 /* Input vertices. */
1063 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1064 /* Transform shape keys too. */
1065 {"use_shapekey", BMO_OP_SLOT_BOOL},
1066 {{'\0'}},
1067 },
1068 /*slot_types_out*/
1069 {{{'\0'}}},
1070 /*init*/ nullptr,
1071 /*exec*/ bmo_transform_exec,
1072 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
1073};
1074
1075/*
1076 * Object Load BMesh.
1077 *
1078 * Loads a bmesh into an object/mesh. This is a "private"
1079 * BMOP.
1080 */
1082 /*opname*/ "object_load_bmesh",
1083 /*slot_types_in*/
1084 {
1085 /* Pointer to an scene structure. */
1087
1088 /* Pointer to an object structure. */
1090 {{'\0'}},
1091 },
1092 /*slot_types_out*/
1093 {{{'\0'}}},
1094 /*init*/ nullptr,
1096 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
1097};
1098
1099/*
1100 * BMesh to Mesh.
1101 *
1102 * Converts a bmesh to a Mesh. This is reserved for exiting edit-mode.
1103 */
1105 /*opname*/ "bmesh_to_mesh",
1106 /*slot_types_in*/
1107 {
1108
1109 /* Pointer to a mesh structure to fill in. */
1111 /* Pointer to an object structure. */
1113 {{'\0'}},
1114 },
1115 /*slot_types_out*/
1116 {{{'\0'}}},
1117 /*init*/ nullptr,
1118 /*exec*/ bmo_bmesh_to_mesh_exec,
1119 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
1120};
1121
1122/*
1123 * Mesh to BMesh.
1124 *
1125 * Load the contents of a mesh into the bmesh. this BMOP is private, it's
1126 * reserved exclusively for entering edit-mode.
1127 */
1129 /*opname*/ "mesh_to_bmesh",
1130 /*slot_types_in*/
1131 {
1132 /* Pointer to a Mesh structure. */
1134 /* Pointer to an Object structure. */
1136 /* Load active shapekey coordinates into verts. */
1137 {"use_shapekey", BMO_OP_SLOT_BOOL},
1138 {{'\0'}},
1139 },
1140 /*slot_types_out*/
1141 {{{'\0'}}},
1142 /*init*/ nullptr,
1143 /*exec*/ bmo_mesh_to_bmesh_exec,
1144 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
1145};
1146
1147/*
1148 * Individual Face Extrude.
1149 *
1150 * Extrudes faces individually.
1151 */
1153 /*opname*/ "extrude_discrete_faces",
1154 /*slot_types_in*/
1155 {
1156 /* Input faces. */
1157 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1158 /* Create faces with reversed direction. */
1159 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1160 /* Pass to duplicate. */
1161 {"use_select_history", BMO_OP_SLOT_BOOL},
1162 {{'\0'}},
1163 },
1164 /*slot_types_out*/
1165 {
1166 /* Output faces. */
1167 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1168 {{'\0'}},
1169 },
1170 /*init*/ nullptr,
1172 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
1173};
1174
1175/*
1176 * Extrude Only Edges.
1177 *
1178 * Extrudes Edges into faces, note that this is very simple, there's no fancy
1179 * winged extrusion.
1180 */
1182 /*opname*/ "extrude_edge_only",
1183 /*slot_types_in*/
1184 {
1185 /* Input vertices. */
1186 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1187 /* Create faces with reversed direction. */
1188 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1189 /* Pass to duplicate. */
1190 {"use_select_history", BMO_OP_SLOT_BOOL},
1191 {{'\0'}},
1192 },
1193 /*slot_types_out*/
1194 {
1195 /* Output geometry. */
1196 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1197 {{'\0'}},
1198 },
1199 /*init*/ nullptr,
1201 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
1202};
1203
1204/*
1205 * Individual Vertex Extrude.
1206 *
1207 * Extrudes wire edges from vertices.
1208 */
1210 /*opname*/ "extrude_vert_indiv",
1211 /*slot_types_in*/
1212 {
1213 /* Input vertices. */
1214 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1215 /* Pass to duplicate. */
1216 {"use_select_history", BMO_OP_SLOT_BOOL},
1217 {{'\0'}},
1218 },
1219 /*slot_types_out*/
1220 {
1221 /* Output wire edges. */
1222 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1223 /* Output vertices. */
1224 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1225 {{'\0'}},
1226 },
1227 /*init*/ nullptr,
1229 /*type_flag*/ (BMO_OPTYPE_FLAG_SELECT_FLUSH),
1230};
1231
1232/*
1233 * Connect Verts.
1234 *
1235 * Split faces by adding edges that connect **verts**.
1236 */
1238 /*opname*/ "connect_verts",
1239 /*slot_types_in*/
1240 {
1241 /* Input vertices. */
1242 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1243 /* Input faces to explicitly exclude from connecting. */
1244 {"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1245 /* Prevent splits with overlaps & intersections. */
1246 {"check_degenerate", BMO_OP_SLOT_BOOL},
1247 {{'\0'}},
1248 },
1249 /*slot_types_out*/
1250 {
1251 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1252 {{'\0'}},
1253 },
1254 /*init*/ nullptr,
1255 /*exec*/ bmo_connect_verts_exec,
1256 /*type_flag*/
1258};
1259
1260/*
1261 * Connect Verts to form Convex Faces.
1262 *
1263 * Ensures all faces are convex **faces**.
1264 */
1266 /*opname*/ "connect_verts_concave",
1267 /*slot_types_in*/
1268 {
1269 /* Input faces. */
1270 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1271 {{'\0'}},
1272 },
1273 /*slot_types_out*/
1274 {
1275 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1276 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1277 {{'\0'}},
1278 },
1279 /*init*/ nullptr,
1281 /*type_flag*/
1283};
1284
1285/*
1286 * Connect Verts Across non Planer Faces.
1287 *
1288 * Split faces by connecting edges along non planer **faces**.
1289 */
1291 /*opname*/ "connect_verts_nonplanar",
1292 /*slot_types_in*/
1293 {
1294 /* Total rotation angle (radians). */
1295 {"angle_limit", BMO_OP_SLOT_FLT},
1296 /* Input faces. */
1297 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1298 {{'\0'}},
1299 },
1300 /*slot_types_out*/
1301 {
1302 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1303 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1304 {{'\0'}},
1305 },
1306 /*init*/ nullptr,
1308 /*type_flag*/
1310};
1311
1312/*
1313 * Connect Verts.
1314 *
1315 * Split faces by adding edges that connect **verts**.
1316 */
1318 /*opname*/ "connect_vert_pair",
1319 /*slot_types_in*/
1320 {
1321 /* Input vertices. */
1322 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1323 /* Input vertices to explicitly exclude from connecting. */
1324 {"verts_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1325 /* Input faces to explicitly exclude from connecting. */
1326 {"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1327 {{'\0'}},
1328 },
1329 /*slot_types_out*/
1330 {
1331 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1332 {{'\0'}},
1333 },
1334 /*init*/ nullptr,
1336 /*type_flag*/
1338};
1339
1340/*
1341 * Extrude Faces.
1342 *
1343 * Extrude operator (does not transform)
1344 */
1346 /*opname*/ "extrude_face_region",
1347 /*slot_types_in*/
1348 {
1349 /* Edges and faces. */
1351 /* Input edges to explicitly exclude from extrusion. */
1353 /* Keep original geometry (requires ``geom`` to include edges). */
1354 {"use_keep_orig", BMO_OP_SLOT_BOOL},
1355 /* Create faces with reversed direction. */
1356 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1357 /* Use winding from surrounding faces instead of this region. */
1358 {"use_normal_from_adjacent", BMO_OP_SLOT_BOOL},
1359 /* Dissolve edges whose faces form a flat surface. */
1360 {"use_dissolve_ortho_edges", BMO_OP_SLOT_BOOL},
1361 /* Pass to duplicate. */
1362 {"use_select_history", BMO_OP_SLOT_BOOL},
1363 /* Skip flipping of input faces to preserve original orientation. */
1364 {"skip_input_flip", BMO_OP_SLOT_BOOL},
1365 {{'\0'}},
1366 },
1367 /*slot_types_out*/
1368 {
1369 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1370 {{'\0'}},
1371 },
1372 /*init*/ nullptr,
1374 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
1375};
1376
1377/*
1378 * Dissolve Verts.
1379 */
1381 /*opname*/ "dissolve_verts",
1382 /*slot_types_in*/
1383 {
1384 /* Input vertices. */
1385 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1386 /* Split off face corners to maintain surrounding geometry. */
1387 {"use_face_split", BMO_OP_SLOT_BOOL},
1388 /* Split off face corners instead of merging faces. */
1389 {"use_boundary_tear", BMO_OP_SLOT_BOOL},
1390 {{'\0'}},
1391 },
1392 /*slot_types_out*/
1393 {{{'\0'}}},
1394 /*init*/ nullptr,
1395 /*exec*/ bmo_dissolve_verts_exec,
1396 /*type_flag*/
1399};
1400
1401/*
1402 * Dissolve Edges.
1403 */
1405 /*opname*/ "dissolve_edges",
1406 /*slot_types_in*/
1407 {
1408 /* Input edges. */
1409 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1410 /* Dissolve verts left between only 2 edges. */
1411 {"use_verts", BMO_OP_SLOT_BOOL},
1412 /* Split off face corners to maintain surrounding geometry. */
1413 {"use_face_split", BMO_OP_SLOT_BOOL},
1414 /* Do not dissolve verts between 2 edges when their angle exceeds this threshold.
1415 * Disabled by default. */
1416 {"angle_threshold", BMO_OP_SLOT_FLT},
1417 {{'\0'}},
1418 },
1419 /*slot_types_out*/
1420 {
1421 {"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1422 {{'\0'}},
1423 },
1424 /*init*/ bmo_dissolve_edges_init,
1425 /*exec*/ bmo_dissolve_edges_exec,
1426 /*type_flag*/
1429};
1430
1431/*
1432 * Dissolve Faces.
1433 */
1435 /*opname*/ "dissolve_faces",
1436 /*slot_types_in*/
1437 {
1438 /* Input faces. */
1439 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1440 /* Dissolve verts left between only 2 edges. */
1441 {"use_verts", BMO_OP_SLOT_BOOL},
1442 {{'\0'}},
1443 },
1444 /*slot_types_out*/
1445 {
1446 {"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1447 {{'\0'}},
1448 },
1449 /*init*/ nullptr,
1450 /*exec*/ bmo_dissolve_faces_exec,
1451 /*type_flag*/
1454};
1455
1457 {BMO_DELIM_NORMAL, "NORMAL"},
1458 {BMO_DELIM_MATERIAL, "MATERIAL"},
1459 {BMO_DELIM_SEAM, "SEAM"},
1460 {BMO_DELIM_SHARP, "SHARP"},
1461 {BMO_DELIM_UV, "UV"},
1462 {0, nullptr},
1463};
1464
1465/*
1466 * Limited Dissolve.
1467 *
1468 * Dissolve planar faces and co-linear edges.
1469 */
1471 /*opname*/ "dissolve_limit",
1472 /*slot_types_in*/
1473 {
1474 /* Total rotation angle (radians). */
1475 {"angle_limit", BMO_OP_SLOT_FLT},
1476 /* Dissolve all vertices in between face boundaries. */
1477 {"use_dissolve_boundaries", BMO_OP_SLOT_BOOL},
1478 /* Input vertices. */
1479 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1480 /* Input edges. */
1481 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1482 /* Delimit dissolve operation. */
1483 {"delimit",
1487 {{'\0'}},
1488 },
1489 /*slot_types_out*/
1490 {
1491 {"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1492 {{'\0'}},
1493 },
1494 /*init*/ nullptr,
1495 /*exec*/ bmo_dissolve_limit_exec,
1496 /*type_flag*/
1499};
1500
1501/*
1502 * Degenerate Dissolve.
1503 *
1504 * Dissolve edges with no length, faces with no area.
1505 */
1507 /*opname*/ "dissolve_degenerate",
1508 /*slot_types_in*/
1509 {
1510 /* Maximum distance to consider degenerate. */
1511 {"dist", BMO_OP_SLOT_FLT},
1512 /* Input edges. */
1513 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1514 {{'\0'}},
1515 },
1516 /*slot_types_out*/
1517 {{{'\0'}}},
1518 /*init*/ nullptr,
1520 /*type_flag*/
1523};
1524
1526 {MOD_TRIANGULATE_QUAD_BEAUTY, "BEAUTY"},
1527 {MOD_TRIANGULATE_QUAD_FIXED, "FIXED"},
1528 {MOD_TRIANGULATE_QUAD_ALTERNATE, "ALTERNATE"},
1529 {MOD_TRIANGULATE_QUAD_SHORTEDGE, "SHORT_EDGE"},
1530 {MOD_TRIANGULATE_QUAD_LONGEDGE, "LONG_EDGE"},
1531 {0, nullptr},
1532};
1533
1535 {MOD_TRIANGULATE_NGON_BEAUTY, "BEAUTY"},
1536 {MOD_TRIANGULATE_NGON_EARCLIP, "EAR_CLIP"},
1537 {0, nullptr},
1538};
1539
1540/*
1541 * Triangulate.
1542 */
1544 /*opname*/ "triangulate",
1545 /*slot_types_in*/
1546 {
1547 /* Input faces. */
1548 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1549 /* Method for splitting the quads into triangles. */
1550 {"quad_method",
1554 /* Method for splitting the polygons into triangles. */
1555 {"ngon_method",
1559 {{'\0'}},
1560 },
1561 /*slot_types_out*/
1562 {
1563 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1564 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1565 {"face_map.out",
1568 /* Duplicate faces. */
1569 {"face_map_double.out",
1572 {{'\0'}},
1573 },
1574 /*init*/ nullptr,
1575 /*exec*/ bmo_triangulate_exec,
1576 /*type_flag*/
1578};
1579
1580/*
1581 * Un-Subdivide.
1582 *
1583 * Reduce detail in geometry containing grids.
1584 */
1586 /*opname*/ "unsubdivide",
1587 /*slot_types_in*/
1588 {
1589 /* Input vertices. */
1590 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1591 /* Number of times to unsubdivide. */
1592 {"iterations", BMO_OP_SLOT_INT},
1593 {{'\0'}},
1594 },
1595 /*slot_types_out*/
1596 {{{'\0'}}},
1597 /*init*/ nullptr,
1598 /*exec*/ bmo_unsubdivide_exec,
1599 /*type_flag*/
1602};
1603
1605 {SUBD_CORNER_STRAIGHT_CUT, "STRAIGHT_CUT"},
1606 {SUBD_CORNER_INNERVERT, "INNER_VERT"},
1607 {SUBD_CORNER_PATH, "PATH"},
1608 {SUBD_CORNER_FAN, "FAN"},
1609 {0, nullptr},
1610};
1611
1612/*
1613 * Subdivide Edges.
1614 *
1615 * Advanced operator for subdividing edges
1616 * with options for face patterns, smoothing and randomization.
1617 */
1619 /*opname*/ "subdivide_edges",
1620 /*slot_types_in*/
1621 {
1622 /* Input edges. */
1623 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1624 /* Smoothness factor. */
1625 {"smooth", BMO_OP_SLOT_FLT},
1626 /* Smooth falloff type. */
1627 {"smooth_falloff",
1631 /* Fractal randomness factor. */
1632 {"fractal", BMO_OP_SLOT_FLT},
1633 /* Apply fractal displacement along normal only. */
1634 {"along_normal", BMO_OP_SLOT_FLT},
1635 /* Number of cuts. */
1636 {"cuts", BMO_OP_SLOT_INT},
1637 /* Seed for the random number generator. */
1638 {"seed", BMO_OP_SLOT_INT},
1639 /* Uses custom pointers. */
1640 {"custom_patterns",
1644 /* Quad corner type. */
1645 {"quad_corner_type",
1649 /* Fill in fully-selected faces with a grid. */
1650 {"use_grid_fill", BMO_OP_SLOT_BOOL},
1651 /* Tessellate the case of one edge selected in a quad or triangle. */
1652 {"use_single_edge", BMO_OP_SLOT_BOOL},
1653 /* Only subdivide quads (for loop-cut). */
1654 {"use_only_quads", BMO_OP_SLOT_BOOL},
1655 /* For making new primitives only. */
1656 {"use_sphere", BMO_OP_SLOT_BOOL},
1657 /* Maintain even offset when smoothing. */
1658 {"use_smooth_even", BMO_OP_SLOT_BOOL},
1659 {{'\0'}},
1660 },
1661 /*slot_types_out*/
1662 {
1663 /* NOTE: these next three can have multiple types of elements in them. */
1664 {"geom_inner.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1665 {"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1666 /* Contains all output geometry. */
1667 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1668 {{'\0'}},
1669 },
1670 /*init*/ nullptr,
1671 /*exec*/ bmo_subdivide_edges_exec,
1672 /*type_flag*/
1675};
1676
1678 {SUBD_RING_INTERP_LINEAR, "LINEAR"},
1679 {SUBD_RING_INTERP_PATH, "PATH"},
1680 {SUBD_RING_INTERP_SURF, "SURFACE"},
1681 {0, nullptr},
1682};
1683
1684/*
1685 * Subdivide Edge-Ring.
1686 *
1687 * Take an edge-ring, and subdivide with interpolation options.
1688 */
1690 /*opname*/ "subdivide_edgering",
1691 /*slot_types_in*/
1692 {
1693 /* Input vertices. */
1694 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1695 /* Interpolation method. */
1696 {"interp_mode",
1700 /* Smoothness factor. */
1701 {"smooth", BMO_OP_SLOT_FLT},
1702 /* Number of cuts. */
1703 {"cuts", BMO_OP_SLOT_INT},
1704 /* Profile shape type. */
1705 {"profile_shape",
1709 /* How much intermediary new edges are shrunk/expanded. */
1710 {"profile_shape_factor", BMO_OP_SLOT_FLT},
1711 {{'\0'}},
1712 },
1713 /*slot_types_out*/
1714 {
1715 /* Output faces. */
1716 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1717 {{'\0'}},
1718 },
1719 /*init*/ nullptr,
1721 /*type_flag*/
1724};
1725
1726/*
1727 * Bisect Plane.
1728 *
1729 * Bisects the mesh by a plane (cut the mesh in half).
1730 */
1732 /*opname*/ "bisect_plane",
1733 /*slot_types_in*/
1734 {
1735 /* Input geometry. */
1737 /* Minimum distance when testing if a vert is exactly on the plane. */
1738 {"dist", BMO_OP_SLOT_FLT},
1739 /* Point on the plane. */
1740 {"plane_co", BMO_OP_SLOT_VEC},
1741 /* Direction of the plane. */
1742 {"plane_no", BMO_OP_SLOT_VEC},
1743 /* Snap axis aligned verts to the center. */
1744 {"use_snap_center", BMO_OP_SLOT_BOOL},
1745 /* When enabled. remove all geometry on the positive side of the plane. */
1746 {"clear_outer", BMO_OP_SLOT_BOOL},
1747 /* When enabled. remove all geometry on the negative side of the plane. */
1748 {"clear_inner", BMO_OP_SLOT_BOOL},
1749 {{'\0'}},
1750 },
1751 /*slot_types_out*/
1752 {
1753 /* Output geometry aligned with the plane (new and existing). */
1754 {"geom_cut.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE}},
1755 /* Input and output geometry (result of cut). */
1756 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1757 {{'\0'}},
1758 },
1759 /*init*/ nullptr,
1760 /*exec*/ bmo_bisect_plane_exec,
1761 /*type_flag*/
1764};
1765
1767 {DEL_VERTS, "VERTS"},
1768 {DEL_EDGES, "EDGES"},
1769 {DEL_ONLYFACES, "FACES_ONLY"},
1770 {DEL_EDGESFACES, "EDGES_FACES"},
1771 {DEL_FACES, "FACES"},
1772 {DEL_FACES_KEEP_BOUNDARY, "FACES_KEEP_BOUNDARY"},
1773 {DEL_ONLYTAGGED, "TAGGED_ONLY"},
1774 {0, nullptr},
1775};
1776
1777/*
1778 * Delete Geometry.
1779 *
1780 * Utility operator to delete geometry.
1781 */
1783 /*opname*/ "delete",
1784 /*slot_types_in*/
1785 {
1786 /* Input geometry. */
1788 /* Geometry types to delete. */
1789 {"context",
1793 {{'\0'}},
1794 },
1795 /*slot_types_out*/
1796 {{{'\0'}}},
1797 /*init*/ nullptr,
1798 /*exec*/ bmo_delete_exec,
1799 /*type_flag*/
1802};
1803
1804/*
1805 * Duplicate Geometry.
1806 *
1807 * Utility operator to duplicate geometry,
1808 * optionally into a destination mesh.
1809 */
1811 /*opname*/ "duplicate",
1812 /*slot_types_in*/
1813 {
1814 /* Input geometry. */
1816 /* Destination bmesh, if None will use current on. */
1818 {"use_select_history", BMO_OP_SLOT_BOOL},
1819 {"use_edge_flip_from_face", BMO_OP_SLOT_BOOL},
1820 {{'\0'}},
1821 },
1822 /*slot_types_out*/
1823 {
1824 {"geom_orig.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1825 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1826
1827 /* NOTE: face_map maps from source faces to dupe faces,
1828 * and from dupe faces to source faces. */
1829
1830 {"vert_map.out",
1833 {"edge_map.out",
1836 {"face_map.out",
1839 /* Boundary edges from the split geometry that maps edges from the original geometry
1840 * to the destination edges. */
1841 {"boundary_map.out",
1844 {"isovert_map.out",
1847 {{'\0'}},
1848 },
1849 /*init*/ nullptr,
1850 /*exec*/ bmo_duplicate_exec,
1852};
1853
1854/*
1855 * Split Off Geometry.
1856 *
1857 * Disconnect geometry from adjacent edges and faces,
1858 * optionally into a destination mesh.
1859 */
1861 /*opname*/ "split",
1862 /*slot_types_in*/
1863 {
1864 /* Input geometry. */
1866 /* Destination bmesh, if None will use current one. */
1868 /* When enabled. don't duplicate loose verts/edges. */
1869 {"use_only_faces", BMO_OP_SLOT_BOOL},
1870 {{'\0'}},
1871 },
1872 /*slot_types_out*/
1873 {
1874 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1875 /* Boundary edges from the split geometry that maps edges from the original geometry
1876 * to the destination edges.
1877 *
1878 * When the source edges have been deleted, the destination edge will be used
1879 * for both the key and the value. */
1880 {"boundary_map.out",
1883 {"isovert_map.out",
1886 {{'\0'}},
1887 },
1888 /*init*/ nullptr,
1889 /*exec*/ bmo_split_exec,
1891};
1892
1893/*
1894 * Spin.
1895 *
1896 * Extrude or duplicate geometry a number of times,
1897 * rotating and possibly translating after each step
1898 */
1900 /*opname*/ "spin",
1901 /*slot_types_in*/
1902 {
1903 /* Input geometry. */
1905 /* Rotation center. */
1906 {"cent", BMO_OP_SLOT_VEC},
1907 /* Rotation axis. */
1908 {"axis", BMO_OP_SLOT_VEC},
1909 /* Translation delta per step. */
1910 {"dvec", BMO_OP_SLOT_VEC},
1911 /* Total rotation angle (radians). */
1912 {"angle", BMO_OP_SLOT_FLT},
1913 /* Matrix to define the space (typically object matrix). */
1914 {"space", BMO_OP_SLOT_MAT},
1915 /* Number of steps. */
1916 {"steps", BMO_OP_SLOT_INT},
1917 /* Merge first/last when the angle is a full revolution. */
1918 {"use_merge", BMO_OP_SLOT_BOOL},
1919 /* Create faces with reversed direction. */
1920 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1921 /* Duplicate or extrude?. */
1922 {"use_duplicate", BMO_OP_SLOT_BOOL},
1923 {{'\0'}},
1924 },
1925 /*slot_types_out*/
1926 {
1927 /* Result of last step. */
1928 {"geom_last.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1929 {{'\0'}},
1930 },
1931 /*init*/ nullptr,
1932 /*exec*/ bmo_spin_exec,
1934};
1935
1936/*
1937 * UV Rotation.
1938 *
1939 * Cycle the loop UVs
1940 */
1942 /*opname*/ "rotate_uvs",
1943 /*slot_types_in*/
1944 {
1945 /* Input faces. */
1946 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1947 /* Rotate counter-clockwise if true, otherwise clockwise. */
1948 {"use_ccw", BMO_OP_SLOT_BOOL},
1949 {{'\0'}},
1950 },
1951 /*slot_types_out*/
1952 {{{'\0'}}},
1953 /*init*/ nullptr,
1954 /*exec*/ bmo_rotate_uvs_exec,
1955 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
1956};
1957
1958/*
1959 * UV Reverse.
1960 *
1961 * Reverse the UVs
1962 */
1964 /*opname*/ "reverse_uvs",
1965 /*slot_types_in*/
1966 {
1967 /* Input faces. */
1968 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1969 {{'\0'}},
1970 },
1971 /*slot_types_out*/
1972 {{{'\0'}}},
1973 /*init*/ nullptr,
1974 /*exec*/ bmo_reverse_uvs_exec,
1975 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
1976};
1977
1978/*
1979 * Color Rotation.
1980 *
1981 * Cycle the loop colors
1982 */
1984 /*opname*/ "rotate_colors",
1985 /*slot_types_in*/
1986 {
1987 /* Input faces. */
1988 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1989 /* Rotate counter-clockwise if true, otherwise clockwise. */
1990 {"use_ccw", BMO_OP_SLOT_BOOL},
1991 /* Index into color attribute list. */
1992 {"color_index", BMO_OP_SLOT_INT},
1993 {{'\0'}},
1994 },
1995 /*slot_types_out*/
1996 {{{'\0'}}},
1997 /*init*/ nullptr,
1998 /*exec*/ bmo_rotate_colors_exec,
1999 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
2000};
2001
2002/*
2003 * Color Reverse
2004 *
2005 * Reverse the loop colors.
2006 */
2008 /*opname*/ "reverse_colors",
2009 /*slot_types_in*/
2010 {
2011 /* Input faces. */
2012 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2013 /* Index into color attribute list. */
2014 {"color_index", BMO_OP_SLOT_INT},
2015 {{'\0'}},
2016 },
2017 /*slot_types_out*/
2018 {{{'\0'}}},
2019 /*init*/ nullptr,
2020 /*exec*/ bmo_reverse_colors_exec,
2021 /*type_flag*/ (BMO_OPTYPE_FLAG_NOP),
2022};
2023
2024/*
2025 * Edge Split.
2026 *
2027 * Disconnects faces along input edges.
2028 */
2030 /*opname*/ "split_edges",
2031 /*slot_types_in*/
2032 {
2033 /* Input edges. */
2034 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2035
2036 /* NOTE: needed for vertex rip so we can rip only half an edge
2037 * at a boundary which would otherwise split off. */
2038
2039 /* Optional tag verts, use to have greater control of splits. */
2040 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2041 /* Use 'verts' for splitting, else just find verts to split from edges. */
2042 {"use_verts", BMO_OP_SLOT_BOOL},
2043 {{'\0'}},
2044 },
2045 /*slot_types_out*/
2046 {
2047 /* Old output disconnected edges. */
2048 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2049 {{'\0'}},
2050 },
2051 /*init*/ nullptr,
2052 /*exec*/ bmo_split_edges_exec,
2053 /*type_flag*/
2055};
2056
2057/*
2058 * Create Grid.
2059 *
2060 * Creates a grid with a variable number of subdivisions
2061 */
2063 /*opname*/ "create_grid",
2064 /*slot_types_in*/
2065 {
2066 /* Number of x segments. */
2067 {"x_segments", BMO_OP_SLOT_INT},
2068 /* Number of y segments. */
2069 {"y_segments", BMO_OP_SLOT_INT},
2070 /* Size of the grid. */
2071 {"size", BMO_OP_SLOT_FLT},
2072 /* Matrix to multiply the new geometry with. */
2073 {"matrix", BMO_OP_SLOT_MAT},
2074 /* Calculate default UVs. */
2075 {"calc_uvs", BMO_OP_SLOT_BOOL},
2076 {{'\0'}},
2077 },
2078 /*slot_types_out*/
2079 {
2080 /* Output verts. */
2081 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2082 {{'\0'}},
2083 },
2084 /*init*/ nullptr,
2085 /*exec*/ bmo_create_grid_exec,
2087};
2088
2089/*
2090 * Create UV Sphere.
2091 *
2092 * Creates a grid with a variable number of subdivisions
2093 */
2095 /*opname*/ "create_uvsphere",
2096 /*slot_types_in*/
2097 {
2098 /* Number of u segments. */
2099 {"u_segments", BMO_OP_SLOT_INT},
2100 /* Number of v segment. */
2101 {"v_segments", BMO_OP_SLOT_INT},
2102 /* Radius. */
2103 {"radius", BMO_OP_SLOT_FLT},
2104 /* Matrix to multiply the new geometry with. */
2105 {"matrix", BMO_OP_SLOT_MAT},
2106 /* Calculate default UVs. */
2107 {"calc_uvs", BMO_OP_SLOT_BOOL},
2108 {{'\0'}},
2109 },
2110 /*slot_types_out*/
2111 {
2112 /* Output verts. */
2113 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2114 {{'\0'}},
2115 },
2116 /*init*/ nullptr,
2117 /*exec*/ bmo_create_uvsphere_exec,
2119};
2120
2121/*
2122 * Create Ico-Sphere.
2123 *
2124 * Creates a grid with a variable number of subdivisions
2125 */
2127 /*opname*/ "create_icosphere",
2128 /*slot_types_in*/
2129 {
2130 /* How many times to recursively subdivide the sphere. */
2131 {"subdivisions", BMO_OP_SLOT_INT},
2132 /* Radius. */
2133 {"radius", BMO_OP_SLOT_FLT},
2134 /* Matrix to multiply the new geometry with. */
2135 {"matrix", BMO_OP_SLOT_MAT},
2136 /* Calculate default UVs. */
2137 {"calc_uvs", BMO_OP_SLOT_BOOL},
2138 {{'\0'}},
2139 },
2140 /*slot_types_out*/
2141 {
2142 /* Output verts. */
2143 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2144 {{'\0'}},
2145 },
2146 /*init*/ nullptr,
2149};
2150
2151/*
2152 * Create Suzanne.
2153 *
2154 * Creates a monkey (standard blender primitive).
2155 */
2157 /*opname*/ "create_monkey",
2158 /*slot_types_in*/
2159 {
2160 /* Matrix to multiply the new geometry with. */
2161 {"matrix", BMO_OP_SLOT_MAT},
2162 /* Calculate default UVs. */
2163 {"calc_uvs", BMO_OP_SLOT_BOOL},
2164 {{'\0'}},
2165 },
2166 /*slot_types_out*/
2167 {
2168 /* Output verts. */
2169 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2170 {{'\0'}},
2171 },
2172 /*init*/ nullptr,
2173 /*exec*/ bmo_create_monkey_exec,
2175};
2176
2177/*
2178 * Create Cone.
2179 *
2180 * Creates a cone with variable depth at both ends
2181 */
2183 /*opname*/ "create_cone",
2184 /*slot_types_in*/
2185 {
2186 /* Whether or not to fill in the ends with faces. */
2187 {"cap_ends", BMO_OP_SLOT_BOOL},
2188 /* Fill ends with triangles instead of ngons. */
2189 {"cap_tris", BMO_OP_SLOT_BOOL},
2190 /* Number of vertices in the base circle. */
2191 {"segments", BMO_OP_SLOT_INT},
2192 /* Radius of one end. */
2193 {"radius1", BMO_OP_SLOT_FLT},
2194 /* Radius of the opposite. */
2195 {"radius2", BMO_OP_SLOT_FLT},
2196 /* Distance between ends. */
2197 {"depth", BMO_OP_SLOT_FLT},
2198 /* Matrix to multiply the new geometry with. */
2199 {"matrix", BMO_OP_SLOT_MAT},
2200 /* Calculate default UVs. */
2201 {"calc_uvs", BMO_OP_SLOT_BOOL},
2202 {{'\0'}},
2203 },
2204 /*slot_types_out*/
2205 {
2206 /* Output verts. */
2207 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2208 {{'\0'}},
2209 },
2210 /*init*/ nullptr,
2211 /*exec*/ bmo_create_cone_exec,
2213};
2214
2215/*
2216 * Creates a Circle.
2217 */
2219 /*opname*/ "create_circle",
2220 /*slot_types_in*/
2221 {
2222 /* Whether or not to fill in the ends with faces. */
2223 {"cap_ends", BMO_OP_SLOT_BOOL},
2224 /* Fill ends with triangles instead of ngons. */
2225 {"cap_tris", BMO_OP_SLOT_BOOL},
2226 /* Number of vertices in the circle. */
2227 {"segments", BMO_OP_SLOT_INT},
2228 /* Radius of the circle. */
2229 {"radius", BMO_OP_SLOT_FLT},
2230 /* Matrix to multiply the new geometry with. */
2231 {"matrix", BMO_OP_SLOT_MAT},
2232 /* Calculate default UVs. */
2233 {"calc_uvs", BMO_OP_SLOT_BOOL},
2234 {{'\0'}},
2235 },
2236 /*slot_types_out*/
2237 {
2238 /* Output verts. */
2239 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2240 {{'\0'}},
2241 },
2242 /*init*/ nullptr,
2243 /*exec*/ bmo_create_circle_exec,
2245};
2246
2247/*
2248 * Create Cube
2249 *
2250 * Creates a cube.
2251 */
2253 /*opname*/ "create_cube",
2254 /*slot_types_in*/
2255 {
2256 /* Size of the cube. */
2257 {"size", BMO_OP_SLOT_FLT},
2258 /* Matrix to multiply the new geometry with. */
2259 {"matrix", BMO_OP_SLOT_MAT},
2260 /* Calculate default UVs. */
2261 {"calc_uvs", BMO_OP_SLOT_BOOL},
2262 {{'\0'}},
2263 },
2264 /*slot_types_out*/
2265 {
2266 /* Output verts. */
2267 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2268 {{'\0'}},
2269 },
2270 /*init*/ nullptr,
2271 /*exec*/ bmo_create_cube_exec,
2273};
2274
2276 {BEVEL_AMT_OFFSET, "OFFSET"},
2277 {BEVEL_AMT_WIDTH, "WIDTH"},
2278 {BEVEL_AMT_DEPTH, "DEPTH"},
2279 {BEVEL_AMT_PERCENT, "PERCENT"},
2280 {BEVEL_AMT_ABSOLUTE, "ABSOLUTE"},
2281 {0, nullptr},
2282};
2283
2285 {BEVEL_PROFILE_SUPERELLIPSE, "SUPERELLIPSE"},
2286 {BEVEL_PROFILE_CUSTOM, "CUSTOM"},
2287 {0, nullptr},
2288};
2289
2291 {BEVEL_FACE_STRENGTH_NONE, "NONE"},
2292 {BEVEL_FACE_STRENGTH_NEW, "NEW"},
2293 {BEVEL_FACE_STRENGTH_AFFECTED, "AFFECTED"},
2294 {BEVEL_FACE_STRENGTH_ALL, "ALL"},
2295 {0, nullptr},
2296};
2297
2299 {BEVEL_MITER_SHARP, "SHARP"},
2300 {BEVEL_MITER_PATCH, "PATCH"},
2301 {BEVEL_MITER_ARC, "ARC"},
2302 {0, nullptr},
2303};
2304
2306 {BEVEL_VMESH_ADJ, "ADJ"},
2307 {BEVEL_VMESH_CUTOFF, "CUTOFF"},
2308 {0, nullptr},
2309};
2310
2312 {BEVEL_AFFECT_VERTICES, "VERTICES"},
2313 {BEVEL_AFFECT_EDGES, "EDGES"},
2314 {0, nullptr},
2315};
2316
2317/*
2318 * Bevel.
2319 *
2320 * Bevels edges and vertices
2321 */
2323 /*opname*/ "bevel",
2324 /*slot_types_in*/
2325 {
2326 /* Input edges and vertices. */
2328 /* Amount to offset beveled edge. */
2329 {"offset", BMO_OP_SLOT_FLT},
2330 /* How to measure the offset. */
2331 {"offset_type",
2335 /* The profile type to use for bevel. */
2336 {"profile_type",
2340 /* Number of segments in bevel. */
2341 {"segments", BMO_OP_SLOT_INT},
2342 /* Profile shape, 0->1 (.5=>round). */
2343 {"profile", BMO_OP_SLOT_FLT},
2344 /* Whether to bevel vertices or edges. */
2345 {"affect",
2349 /* Do not allow beveled edges/vertices to overlap each other. */
2350 {"clamp_overlap", BMO_OP_SLOT_BOOL},
2351 /* Material for bevel faces, -1 means get from adjacent faces. */
2352 {"material", BMO_OP_SLOT_INT},
2353 /* Prefer to slide along edges to having even widths. */
2354 {"loop_slide", BMO_OP_SLOT_BOOL},
2355 /* Extend edge data to allow seams to run across bevels. */
2356 {"mark_seam", BMO_OP_SLOT_BOOL},
2357 /* Extend edge data to allow sharp edges to run across bevels. */
2358 {"mark_sharp", BMO_OP_SLOT_BOOL},
2359 /* Harden normals. */
2360 {"harden_normals", BMO_OP_SLOT_BOOL},
2361 /* Whether to set face strength, and which faces to set if so. */
2362 {"face_strength_mode",
2366 /* Outer miter kind. */
2367 {"miter_outer",
2371 /* Outer miter kind. */
2372 {"miter_inner",
2376 /* Amount to offset beveled edge. */
2377 {"spread", BMO_OP_SLOT_FLT},
2378 /* CurveProfile, if None ignored */
2380 /* The method to use to create meshes at intersections. */
2381 {"vmesh_method",
2385 {{'\0'}},
2386 },
2387 /*slot_types_out*/
2388 {
2389 /* Output faces. */
2390 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2391 /* Output edges. */
2392 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2393 /* Output verts. */
2394 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2395 {{'\0'}},
2396 },
2397
2398 /*init*/ nullptr,
2399 /*exec*/ bmo_bevel_exec,
2400 /*type_flag*/
2403};
2404
2405/* No enum is defined for this. */
2407 {0, "AREA"},
2408 {1, "ANGLE"},
2409 {0, nullptr},
2410};
2411
2412/*
2413 * Beautify Fill.
2414 *
2415 * Rotate edges to create more evenly spaced triangles.
2416 */
2418 /*opname*/ "beautify_fill",
2419 /*slot_types_in*/
2420 {
2421 /* Input faces. */
2422 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2423 /* Edges that can be flipped. */
2424 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2425 /* Restrict edge rotation to mixed tagged vertices. */
2426 {"use_restrict_tag", BMO_OP_SLOT_BOOL},
2427 /* Method to define what is beautiful. */
2428 {"method",
2432 {{'\0'}},
2433 },
2434 /*slot_types_out*/
2435 {
2436 /* New flipped faces and edges. */
2437 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2438 {{'\0'}},
2439 },
2440 /*init*/ nullptr,
2441 /*exec*/ bmo_beautify_fill_exec,
2442 /*type_flag*/
2445};
2446
2447/*
2448 * Triangle Fill.
2449 *
2450 * Fill edges with triangles
2451 */
2453 /*opname*/ "triangle_fill",
2454 /*slot_types_in*/
2455 {
2456 /* Use best triangulation division. */
2457 {"use_beauty", BMO_OP_SLOT_BOOL},
2458 /* Dissolve resulting faces. */
2459 {"use_dissolve", BMO_OP_SLOT_BOOL},
2460 /* Input edges. */
2461 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2462 /* Optionally pass the fill normal to use. */
2463 {"normal", BMO_OP_SLOT_VEC},
2464 {{'\0'}},
2465 },
2466 /*slot_types_out*/
2467 {
2468 /* New faces and edges. */
2469 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2470 {{'\0'}},
2471 },
2472 /*init*/ nullptr,
2473 /*exec*/ bmo_triangle_fill_exec,
2474 /*type_flag*/
2476};
2477
2478/*
2479 * Solidify.
2480 *
2481 * Turns a mesh into a shell with thickness
2482 */
2484 /*opname*/ "solidify",
2485 /*slot_types_in*/
2486 {
2487 /* Input geometry. */
2489 /* Thickness. */
2490 {"thickness", BMO_OP_SLOT_FLT},
2491 {{'\0'}},
2492 },
2493 /*slot_types_out*/
2494 {
2495 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2496 {{'\0'}},
2497 },
2498 /*init*/ nullptr,
2501};
2502
2503/*
2504 * Face Inset (Individual).
2505 *
2506 * Insets individual faces.
2507 */
2509 /*opname*/ "inset_individual",
2510 /*slot_types_in*/
2511 {
2512 /* Input faces. */
2513 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2514 /* Thickness. */
2515 {"thickness", BMO_OP_SLOT_FLT},
2516 /* Depth. */
2517 {"depth", BMO_OP_SLOT_FLT},
2518 /* Scale the offset to give more even thickness. */
2519 {"use_even_offset", BMO_OP_SLOT_BOOL},
2520 /* Blend face data across the inset. */
2521 {"use_interpolate", BMO_OP_SLOT_BOOL},
2522 /* Scale the offset by surrounding geometry. */
2523 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2524 {{'\0'}},
2525 },
2526 /*slot_types_out*/
2527 {
2528 /* Output faces. */
2529 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2530 {{'\0'}},
2531 },
2532 /*init*/ nullptr,
2534 /* Caller needs to handle BMO_OPTYPE_FLAG_SELECT_FLUSH. */
2535 /*type_flag*/ (BMO_OPTYPE_FLAG_NORMALS_CALC),
2536};
2537
2538/*
2539 * Face Inset (Regions).
2540 *
2541 * Inset or outset face regions.
2542 */
2544 /*opname*/ "inset_region",
2545 /*slot_types_in*/
2546 {
2547 /* Input faces. */
2548 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2549 /* Input faces to explicitly exclude from inset. */
2550 {"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2551 /* Inset face boundaries. */
2552 {"use_boundary", BMO_OP_SLOT_BOOL},
2553 /* Scale the offset to give more even thickness. */
2554 {"use_even_offset", BMO_OP_SLOT_BOOL},
2555 /* Blend face data across the inset. */
2556 {"use_interpolate", BMO_OP_SLOT_BOOL},
2557 /* Scale the offset by surrounding geometry. */
2558 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2559 /* Inset the region along existing edges. */
2560 {"use_edge_rail", BMO_OP_SLOT_BOOL},
2561 /* Thickness. */
2562 {"thickness", BMO_OP_SLOT_FLT},
2563 /* Depth. */
2564 {"depth", BMO_OP_SLOT_FLT},
2565 /* Outset rather than inset. */
2566 {"use_outset", BMO_OP_SLOT_BOOL},
2567 {{'\0'}},
2568 },
2569 /*slot_types_out*/
2570 {
2571 /* Output faces. */
2572 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2573 {{'\0'}},
2574 },
2575 /*init*/ nullptr,
2576 /*exec*/ bmo_inset_region_exec,
2578};
2579
2580/*
2581 * Edge-loop Offset.
2582 *
2583 * Creates edge loops based on simple edge-outset method.
2584 */
2586 /*opname*/ "offset_edgeloops",
2587 /*slot_types_in*/
2588 {
2589 /* Input edges. */
2590 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2591 /* Extend loop around end-points. */
2592 {"use_cap_endpoint", BMO_OP_SLOT_BOOL},
2593 {{'\0'}},
2594 },
2595 /*slot_types_out*/
2596 {
2597 /* Output edges. */
2598 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2599 {{'\0'}},
2600 },
2601 /*init*/ nullptr,
2604};
2605
2606/*
2607 * Wire Frame.
2608 *
2609 * Makes a wire-frame copy of faces.
2610 */
2612 /*opname*/ "wireframe",
2613 /*slot_types_in*/
2614 {
2615 /* Input faces. */
2616 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2617 /* Thickness. */
2618 {"thickness", BMO_OP_SLOT_FLT},
2619 /* Offset the thickness from the center. */
2620 {"offset", BMO_OP_SLOT_FLT},
2621 /* Remove original geometry. */
2622 {"use_replace", BMO_OP_SLOT_BOOL},
2623 /* Inset face boundaries. */
2624 {"use_boundary", BMO_OP_SLOT_BOOL},
2625 /* Scale the offset to give more even thickness. */
2626 {"use_even_offset", BMO_OP_SLOT_BOOL},
2627 /* Crease hub edges for improved subdivision surface. */
2628 {"use_crease", BMO_OP_SLOT_BOOL},
2629 /* The mean crease weight for resulting edges. */
2630 {"crease_weight", BMO_OP_SLOT_FLT},
2631 /* Scale the offset by surrounding geometry. */
2632 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2633 /* Offset material index of generated faces. */
2634 {"material_offset", BMO_OP_SLOT_INT},
2635 {{'\0'}},
2636 },
2637 /*slot_types_out*/
2638 {
2639 /* Output faces. */
2640 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2641 {{'\0'}},
2642 },
2643 /*init*/ nullptr,
2644 /*exec*/ bmo_wireframe_exec,
2645 /*type_flag*/
2648};
2649
2651 {BMOP_POKE_MEDIAN_WEIGHTED, "MEAN_WEIGHTED"},
2652 {BMOP_POKE_MEDIAN, "MEAN"},
2653 {BMOP_POKE_BOUNDS, "BOUNDS"},
2654 {0, nullptr},
2655};
2656
2657/*
2658 * Pokes a face.
2659 *
2660 * Splits a face into a triangle fan.
2661 */
2663 /*opname*/ "poke",
2664 /*slot_types_in*/
2665 {
2666 /* Input faces. */
2667 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2668 /* Center vertex offset along normal. */
2669 {"offset", BMO_OP_SLOT_FLT},
2670 /* Calculation mode for center vertex. */
2671 {"center_mode",
2675 /* Apply offset. */
2676 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2677 {{'\0'}},
2678 },
2679 /*slot_types_out*/
2680 {
2681 /* Output verts. */
2682 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2683 /* Output faces. */
2684 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2685 {{'\0'}},
2686 },
2687 /*init*/ nullptr,
2688 /*exec*/ bmo_poke_exec,
2689 /*type_flag*/
2692};
2693
2694#ifdef WITH_BULLET
2695/*
2696 * Convex Hull
2697 *
2698 * Builds a convex hull from the vertices in 'input'.
2699 *
2700 * If 'use_existing_faces' is true, the hull will not output triangles
2701 * that are covered by a pre-existing face.
2702 *
2703 * All hull vertices, faces, and edges are added to 'geom.out'. Any
2704 * input elements that end up inside the hull (i.e. are not used by an
2705 * output face) are added to the 'interior_geom' slot. The
2706 * 'unused_geom' slot will contain all interior geometry that is
2707 * completely unused. Lastly, 'holes_geom' contains edges and faces
2708 * that were in the input and are part of the hull.
2709 */
2710static BMOpDefine bmo_convex_hull_def = {
2711 /*opname*/ "convex_hull",
2712 /*slot_types_in*/
2713 {
2714 /* Input geometry. */
2716 /* Skip hull triangles that are covered by a pre-existing face. */
2717 {"use_existing_faces", BMO_OP_SLOT_BOOL},
2718 {{'\0'}},
2719 },
2720 /*slot_types_out*/
2721 {
2722 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2723 {"geom_interior.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2724 {"geom_unused.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2725 {"geom_holes.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2726 {{'\0'}},
2727 },
2728 /*init*/ nullptr,
2729 /*exec*/ bmo_convex_hull_exec,
2730 /*type_flag*/
2733};
2734#endif
2735
2736/*
2737 * Symmetrize.
2738 *
2739 * Makes the mesh elements in the "input" slot symmetrical. Unlike
2740 * normal mirroring, it only copies in one direction, as specified by
2741 * the "direction" slot. The edges and faces that cross the plane of
2742 * symmetry are split as needed to enforce symmetry.
2743 *
2744 * All new vertices, edges, and faces are added to the "geom.out" slot.
2745 */
2747 /*opname*/ "symmetrize",
2748 /*slot_types_in*/
2749 {
2750 /* Input geometry. */
2752 /* Axis to use. */
2753 {"direction",
2757 /* Minimum distance. */
2758 {"dist", BMO_OP_SLOT_FLT},
2759 /* Transform shape keys too. */
2760 {"use_shapekey", BMO_OP_SLOT_BOOL},
2761 {{'\0'}},
2762 },
2763 /*slot_types_out*/
2764 {
2765 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2766 {{'\0'}},
2767 },
2768 /*init*/ nullptr,
2769 /*exec*/ bmo_symmetrize_exec,
2770 /*type_flag*/
2773};
2774
2775#undef BM_FACE
2776#undef BM_EDGE
2777#undef BM_VERT
2778
2793#ifdef WITH_BULLET
2794 &bmo_convex_hull_def,
2795#endif
2832 &bmo_poke_def,
2848 &bmo_spin_def,
2862};
2863
#define ARRAY_SIZE(arr)
@ MOD_TRIANGULATE_QUAD_SHORTEDGE
@ MOD_TRIANGULATE_QUAD_FIXED
@ MOD_TRIANGULATE_QUAD_LONGEDGE
@ MOD_TRIANGULATE_QUAD_BEAUTY
@ MOD_TRIANGULATE_QUAD_ALTERNATE
@ MOD_TRIANGULATE_NGON_BEAUTY
@ MOD_TRIANGULATE_NGON_EARCLIP
static BMOpDefine bmo_planar_faces_def
static BMOpDefine bmo_edgenet_fill_def
static BMOpDefine bmo_bevel_def
static BMOpDefine bmo_reverse_colors_def
static BMOpDefine bmo_find_doubles_def
static BMOpDefine bmo_connect_verts_concave_def
static BMOpDefine bmo_create_cone_def
static BMOpDefine bmo_unsubdivide_def
static BMOpDefine bmo_create_monkey_def
static BMOpDefine bmo_rotate_colors_def
static BMO_FlagSet bmo_enum_delete_context[]
static BMOpDefine bmo_dissolve_limit_def
static BMOpDefine bmo_join_triangles_def
static BMOpDefine bmo_reverse_uvs_def
static BMOpDefine bmo_extrude_face_region_def
static BMO_FlagSet bmo_enum_triangulate_quad_method[]
static BMO_FlagSet bmo_enum_bevel_miter_type[]
static BMOpDefine bmo_dissolve_edges_def
static BMOpDefine bmo_bmesh_to_mesh_def
static BMOpDefine bmo_extrude_edge_only_def
static BMO_FlagSet bmo_enum_dissolve_limit_flags[]
static BMO_FlagSet bmo_enum_bevel_offset_type[]
static BMOpDefine bmo_create_cube_def
static BMOpDefine bmo_edgeloop_fill_def
static BMOpDefine bmo_solidify_def
static BMOpDefine bmo_extrude_vert_indiv_def
static BMOpDefine bmo_offset_edgeloops_def
static BMOpDefine bmo_bisect_edges_def
#define BM_FACE
static BMOpDefine bmo_create_uvsphere_def
static BMOpDefine bmo_mesh_to_bmesh_def
static BMOpDefine bmo_inset_region_def
static BMOpDefine bmo_create_vert_def
static BMOpDefine bmo_smooth_laplacian_vert_def
static BMOpDefine bmo_bisect_plane_def
static BMOpDefine bmo_rotate_edges_def
static BMO_FlagSet bmo_enum_bevel_profile_type[]
static BMOpDefine bmo_create_grid_def
static BMOpDefine bmo_dissolve_verts_def
static BMOpDefine bmo_split_def
static BMOpDefine bmo_average_vert_facedata_def
static BMO_FlagSet bmo_enum_beautify_fill_method[]
static BMOpDefine bmo_connect_verts_nonplanar_def
static BMOpDefine bmo_edgenet_prepare_def
#define BM_EDGE
static BMOpDefine bmo_triangle_fill_def
static BMOpDefine bmo_region_extend_def
static BMOpDefine bmo_split_edges_def
static BMOpDefine bmo_wireframe_def
static BMOpDefine bmo_poke_def
static BMOpDefine bmo_face_attribute_fill_def
static BMOpDefine bmo_translate_def
static BMOpDefine bmo_dissolve_faces_def
static BMOpDefine bmo_mirror_def
static BMO_FlagSet bmo_enum_bevel_face_strength_type[]
static BMOpDefine bmo_contextual_create_def
static BMO_FlagSet bmo_enum_falloff_type[]
static BMOpDefine bmo_smooth_vert_def
static BMOpDefine bmo_reverse_faces_def
static BMOpDefine bmo_dissolve_degenerate_def
static BMOpDefine bmo_pointmerge_facedata_def
static BMOpDefine bmo_duplicate_def
static BMOpDefine bmo_extrude_discrete_faces_def
static BMO_FlagSet bmo_enum_bevel_vmesh_method[]
static BMOpDefine bmo_collapse_uvs_def
static BMO_FlagSet bmo_enum_subdivide_edgering_interp_mode[]
static eBMOpSlotSubType_Union to_subtype_union(const eBMOpSlotSubType_Ptr ptr)
static BMOpDefine bmo_subdivide_edgering_def
static BMOpDefine bmo_flip_quad_tessellation_def
static BMOpDefine bmo_remove_doubles_def
static BMOpDefine bmo_beautify_fill_def
static BMOpDefine bmo_pointmerge_def
static BMOpDefine bmo_weld_verts_def
static BMOpDefine bmo_rotate_uvs_def
static BMOpDefine bmo_triangulate_def
static BMOpDefine bmo_bridge_loops_def
static BMOpDefine bmo_spin_def
static BMOpDefine bmo_subdivide_edges_def
static BMOpDefine bmo_delete_def
static BMOpDefine bmo_object_load_bmesh_def
static BMOpDefine bmo_inset_individual_def
static BMOpDefine bmo_symmetrize_def
static BMOpDefine bmo_holes_fill_def
const int bmo_opdefines_total
const BMOpDefine * bmo_opdefines[]
static BMOpDefine bmo_transform_def
static BMO_FlagSet bmo_enum_axis_neg_xyz_and_xyz[]
static BMOpDefine bmo_grid_fill_def
static BMO_FlagSet bmo_enum_bevel_affect_type[]
static BMOpDefine bmo_connect_verts_def
static BMOpDefine bmo_collapse_def
static BMO_FlagSet bmo_enum_subdivide_edges_quad_corner_type[]
static BMOpDefine bmo_rotate_def
static BMOpDefine bmo_connect_vert_pair_def
static BMOpDefine bmo_create_circle_def
#define BM_VERT
static BMO_FlagSet bmo_enum_triangulate_ngon_method[]
static BMO_FlagSet bmo_enum_poke_center_mode[]
static BMOpDefine bmo_create_icosphere_def
static BMOpDefine bmo_scale_def
static BMO_FlagSet bmo_enum_axis_xyz[]
static BMOpDefine bmo_recalc_face_normals_def
eBMOpSlotSubType_Ptr
@ BMO_OP_SLOT_SUBTYPE_PTR_BMESH
@ BMO_OP_SLOT_SUBTYPE_PTR_OBJECT
@ BMO_OP_SLOT_SUBTYPE_PTR_SCENE
@ BMO_OP_SLOT_SUBTYPE_PTR_MESH
@ BMO_OP_SLOT_SUBTYPE_PTR_STRUCT
@ DEL_ONLYTAGGED
@ DEL_FACES_KEEP_BOUNDARY
@ DEL_EDGESFACES
@ DEL_ONLYFACES
eBMOpSlotSubType_Elem
@ BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE
@ BMO_OP_SLOT_ELEMENT_BUF
@ BMO_OP_SLOT_PTR
@ BMO_OP_SLOT_BOOL
@ BMO_OP_SLOT_FLT
@ BMO_OP_SLOT_INT
@ BMO_OP_SLOT_VEC
@ BMO_OP_SLOT_MAPPING
@ BMO_OP_SLOT_MAT
eBMOpSlotSubType_Map
@ BMO_OP_SLOT_SUBTYPE_MAP_ELEM
@ BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL
@ BMO_OP_SLOT_SUBTYPE_MAP_EMPTY
@ BMO_OP_SLOT_SUBTYPE_MAP_FLT
eBMOpSlotSubType_Int
@ BMO_OP_SLOT_SUBTYPE_INT_FLAG
@ BMO_OP_SLOT_SUBTYPE_INT_ENUM
@ BMO_OPTYPE_FLAG_NOP
@ BMO_OPTYPE_FLAG_SELECT_VALIDATE
@ BMO_OPTYPE_FLAG_UNTAN_MULTIRES
@ BMO_OPTYPE_FLAG_NORMALS_CALC
@ BMO_OPTYPE_FLAG_SELECT_FLUSH
@ BMO_DELIM_NORMAL
@ BMO_DELIM_MATERIAL
@ BMO_DELIM_SEAM
@ BMO_DELIM_SHARP
@ BMO_DELIM_UV
@ BEVEL_MITER_PATCH
@ BEVEL_MITER_SHARP
@ BEVEL_MITER_ARC
@ SUBD_CORNER_FAN
@ SUBD_CORNER_STRAIGHT_CUT
@ SUBD_CORNER_PATH
@ SUBD_CORNER_INNERVERT
@ BEVEL_AMT_WIDTH
@ BEVEL_AMT_ABSOLUTE
@ BEVEL_AMT_PERCENT
@ BEVEL_AMT_OFFSET
@ BEVEL_AMT_DEPTH
@ BEVEL_VMESH_ADJ
@ BEVEL_VMESH_CUTOFF
@ BEVEL_AFFECT_VERTICES
@ BEVEL_AFFECT_EDGES
@ BEVEL_FACE_STRENGTH_NONE
@ BEVEL_FACE_STRENGTH_AFFECTED
@ BEVEL_FACE_STRENGTH_NEW
@ BEVEL_FACE_STRENGTH_ALL
@ BEVEL_PROFILE_SUPERELLIPSE
@ BEVEL_PROFILE_CUSTOM
@ SUBD_RING_INTERP_SURF
@ SUBD_RING_INTERP_PATH
@ SUBD_RING_INTERP_LINEAR
@ BMOP_POKE_MEDIAN_WEIGHTED
@ BMOP_POKE_BOUNDS
@ BMOP_POKE_MEDIAN
@ SUBD_FALLOFF_SHARP
@ SUBD_FALLOFF_SMOOTH
@ SUBD_FALLOFF_INVSQUARE
@ SUBD_FALLOFF_SPHERE
@ SUBD_FALLOFF_LIN
@ SUBD_FALLOFF_ROOT
void bmo_rotate_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:116
void bmo_region_extend_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:382
void bmo_offset_edgeloops_exec(BMesh *bm, BMOperator *op)
void bmo_symmetrize_exec(BMesh *bm, BMOperator *op)
void bmo_smooth_laplacian_vert_exec(BMesh *bm, BMOperator *op)
void bmo_reverse_uvs_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:564
void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op)
void bmo_inset_region_exec(BMesh *bm, BMOperator *op)
Definition bmo_inset.cc:663
void bmo_face_attribute_fill_exec(BMesh *bm, BMOperator *op)
void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
void bmo_bevel_exec(BMesh *bm, BMOperator *op)
Definition bmo_bevel.cc:19
void bmo_mirror_exec(BMesh *bm, BMOperator *op)
Definition bmo_mirror.cc:20
void bmo_collapse_exec(BMesh *bm, BMOperator *op)
void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op)
void bmo_split_exec(BMesh *bm, BMOperator *op)
Definition bmo_dupe.cc:436
void bmo_subdivide_edgering_exec(BMesh *bm, BMOperator *op)
void bmo_flip_quad_tessellation_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:152
void bmo_dissolve_limit_exec(BMesh *bm, BMOperator *op)
void bmo_create_grid_exec(BMesh *bm, BMOperator *op)
void bmo_join_triangles_exec(BMesh *bm, BMOperator *op)
void bmo_transform_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:40
void bmo_average_vert_facedata_exec(BMesh *bm, BMOperator *op)
void bmo_extrude_vert_indiv_exec(BMesh *bm, BMOperator *op)
void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
void bmo_create_circle_exec(BMesh *bm, BMOperator *op)
void bmo_remove_doubles_exec(BMesh *bm, BMOperator *op)
void bmo_create_monkey_exec(BMesh *bm, BMOperator *op)
void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op)
void bmo_solidify_face_region_exec(BMesh *bm, BMOperator *op)
void bmo_rotate_edges_exec(BMesh *bm, BMOperator *op)
void bmo_bmesh_to_mesh_exec(BMesh *bm, BMOperator *op)
void bmo_reverse_colors_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:703
void bmo_connect_verts_nonplanar_exec(BMesh *bm, BMOperator *op)
void bmo_contextual_create_exec(BMesh *bm, BMOperator *op)
Definition bmo_create.cc:22
void bmo_inset_individual_exec(BMesh *bm, BMOperator *op)
Definition bmo_inset.cc:412
void bmo_subdivide_edges_exec(BMesh *bm, BMOperator *op)
void bmo_rotate_colors_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:600
void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op)
void bmo_create_icosphere_exec(BMesh *bm, BMOperator *op)
void bmo_rotate_uvs_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:478
void bmo_create_cone_exec(BMesh *bm, BMOperator *op)
void bmo_edgenet_fill_exec(BMesh *bm, BMOperator *op)
void bmo_bisect_edges_exec(BMesh *bm, BMOperator *op)
void bmo_edgeloop_fill_exec(BMesh *bm, BMOperator *op)
void bmo_bisect_plane_exec(BMesh *bm, BMOperator *op)
void bmo_pointmerge_exec(BMesh *bm, BMOperator *op)
void bmo_object_load_bmesh_exec(BMesh *bm, BMOperator *op)
void bmo_connect_verts_exec(BMesh *bm, BMOperator *op)
void bmo_connect_verts_concave_exec(BMesh *bm, BMOperator *op)
void bmo_dissolve_edges_exec(BMesh *bm, BMOperator *op)
void bmo_duplicate_exec(BMesh *bm, BMOperator *op)
Definition bmo_dupe.cc:373
void bmo_triangulate_exec(BMesh *bm, BMOperator *op)
void bmo_translate_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:72
void bmo_pointmerge_facedata_exec(BMesh *bm, BMOperator *op)
void bmo_edgenet_prepare_exec(BMesh *bm, BMOperator *op)
void bmo_create_vert_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:30
void bmo_mesh_to_bmesh_exec(BMesh *bm, BMOperator *op)
void bmo_holes_fill_exec(BMesh *bm, BMOperator *op)
void bmo_create_cube_exec(BMesh *bm, BMOperator *op)
void bmo_spin_exec(BMesh *bm, BMOperator *op)
Definition bmo_dupe.cc:550
void bmo_planar_faces_exec(BMesh *bm, BMOperator *op)
void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op)
void bmo_dissolve_degenerate_exec(BMesh *bm, BMOperator *op)
void bmo_recalc_face_normals_exec(BMesh *bm, BMOperator *op)
void bmo_find_doubles_exec(BMesh *bm, BMOperator *op)
void bmo_smooth_vert_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:400
void bmo_poke_exec(BMesh *bm, BMOperator *op)
Definition bmo_poke.cc:30
void bmo_delete_exec(BMesh *bm, BMOperator *op)
Definition bmo_dupe.cc:530
void bmo_wireframe_exec(BMesh *bm, BMOperator *op)
void bmo_grid_fill_exec(BMesh *bm, BMOperator *op)
void bmo_scale_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:93
void bmo_collapse_uvs_exec(BMesh *bm, BMOperator *op)
void bmo_create_uvsphere_exec(BMesh *bm, BMOperator *op)
void bmo_split_edges_exec(BMesh *bm, BMOperator *op)
void bmo_unsubdivide_exec(BMesh *bm, BMOperator *op)
void bmo_dissolve_edges_init(BMOperator *op)
void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
void bmo_reverse_faces_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:137
void bmo_weld_verts_exec(BMesh *bm, BMOperator *op)
eBMOpSlotSubType_Ptr ptr
eBMOpSlotSubType_Int intg
eBMOpSlotSubType_Map map
PointerRNA * ptr
Definition wm_files.cc:4238