Blender V4.5
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 "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,
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 "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,
205};
206
207/*
208 * Right-Hand Faces.
209 *
210 * Computes an "outside" normal for the specified input faces.
211 */
213 "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 "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 "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 "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,
316};
317
318/*
319 * Reverse Faces.
320 *
321 * Reverses the winding (vertex order) of faces.
322 * This has the effect of flipping the normal.
323 */
325 "reverse_faces",
326 /*slot_types_in*/
327 {
328 /* Input faces. */
329 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
330 /* Maintain multi-res offset. */
331 {"flip_multires", BMO_OP_SLOT_BOOL},
332 {{'\0'}},
333 },
334 /*slot_types_out*/
335 {{{'\0'}}},
336 /*init*/ nullptr,
337 /*exec*/ bmo_reverse_faces_exec,
339};
340
341/*
342 * Flip Quad Tessellation
343 *
344 * Flip the tessellation direction of the selected quads.
345 */
347 "flip_quad_tessellation",
348 /*slot_types_in*/
349 {
350 /* Input faces. */
351 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
352 {{'\0'}},
353 },
354 /*slot_types_out*/
355 {{{'\0'}}},
356 /*init*/ nullptr,
359};
360
361/*
362 * Edge Bisect.
363 *
364 * Splits input edges (but doesn't do anything else).
365 * This creates a 2-valence vert.
366 */
368 "bisect_edges",
369 /*slot_types_in*/
370 {
371 /* Input edges. */
372 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
373 /* Number of cuts. */
374 {"cuts", BMO_OP_SLOT_INT},
375 {"edge_percents",
378 {{'\0'}},
379 },
380 /*slot_types_out*/
381 {
382 /* Newly created vertices and edges. */
383 {"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
384 {{'\0'}},
385 },
386 /*init*/ nullptr,
387 /*exec*/ bmo_bisect_edges_exec,
390};
391
392/*
393 * Mirror.
394 *
395 * Mirrors geometry along an axis. The resulting geometry is welded on using
396 * merge_dist. Pairs of original/mirrored vertices are welded using the merge_dist
397 * parameter (which defines the minimum distance for welding to happen).
398 */
400 "mirror",
401 /*slot_types_in*/
402 {
403 /* Input geometry. */
405 /* Matrix defining the mirror transformation. */
406 {"matrix", BMO_OP_SLOT_MAT},
407 /* Maximum distance for merging. does no merging if 0. */
408 {"merge_dist", BMO_OP_SLOT_FLT},
409 /* The axis to use. */
410 {"axis",
414 /* Mirror UVs across the u axis. */
415 {"mirror_u", BMO_OP_SLOT_BOOL},
416 /* Mirror UVs across the v axis. */
417 {"mirror_v", BMO_OP_SLOT_BOOL},
418 /* Mirror UVs in each tile. */
419 {"mirror_udim", BMO_OP_SLOT_BOOL},
420 /* Transform shape keys too. */
421 {"use_shapekey", BMO_OP_SLOT_BOOL},
422 {{'\0'}},
423 },
424 /*slot_types_out*/
425 {
426 /* Output geometry, mirrored. */
427 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
428 {{'\0'}},
429 },
430 /*init*/ nullptr,
431 /*exec*/ bmo_mirror_exec,
434};
435
436/*
437 * Find Doubles.
438 *
439 * Takes input verts and find vertices they should weld to.
440 * Outputs a mapping slot suitable for use with the weld verts BMOP.
441 *
442 * If keep_verts is used, vertices outside that set can only be merged
443 * with vertices in that set.
444 */
446 "find_doubles",
447 /*slot_types_in*/
448 {
449 /* Input vertices. */
450 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
451 /* List of verts to keep. */
452 {"keep_verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
453 /* Maximum distance. */
454 {"dist", BMO_OP_SLOT_FLT},
455 {{'\0'}},
456 },
457 /*slot_types_out*/
458 {
459 {"targetmap.out",
462 {{'\0'}},
463 },
464 /*init*/ nullptr,
465 /*exec*/ bmo_find_doubles_exec,
467};
468
469/*
470 * Remove Doubles.
471 *
472 * Finds groups of vertices closer than dist and merges them together,
473 * using the weld verts BMOP.
474 */
476 "remove_doubles",
477 /*slot_types_in*/
478 {
479 /* Input verts. */
480 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
481
482 /* Minimum distance. */
483 {"dist", BMO_OP_SLOT_FLT},
484 {{'\0'}},
485 },
486 /*slot_types_out*/
487 {{{'\0'}}},
488 /*init*/ nullptr,
492};
493
494/*
495 * Collapse Connected.
496 *
497 * Collapses connected vertices
498 */
500 "collapse",
501 /*slot_types_in*/
502 {
503 /* Input edges. */
504 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
505 /* Also collapse UVs and such. */
506 {"uvs", BMO_OP_SLOT_BOOL},
507 {{'\0'}},
508 },
509 /*slot_types_out*/
510 {{{'\0'}}},
511 /*init*/ nullptr,
512 /*exec*/ bmo_collapse_exec,
515};
516
517/*
518 * Face-Data Point Merge.
519 *
520 * Merge uv/vcols at a specific vertex.
521 */
523 "pointmerge_facedata",
524 /*slot_types_in*/
525 {
526 /* Input vertices. */
527 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
528 /* Snap vertex. */
530 {{'\0'}},
531 },
532 /*slot_types_out*/
533 {{{'\0'}}},
534 /*init*/ nullptr,
537};
538
539/*
540 * Average Vertices Face-vert Data.
541 *
542 * Merge uv/vcols associated with the input vertices at
543 * the bounding box center. (I know, it's not averaging but
544 * the vert_snap_to_bb_center is just too long).
545 */
547 "average_vert_facedata",
548 /*slot_types_in*/
549 {
550 /* Input vertices. */
551 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
552 {{'\0'}},
553 },
554 /*slot_types_out*/
555 {{{'\0'}}},
556 /*init*/ nullptr,
559};
560
561/*
562 * Point Merge.
563 *
564 * Merge verts together at a point.
565 */
567 "pointmerge",
568 /*slot_types_in*/
569 {
570 /* Input vertices (all verts will be merged into the first). */
571 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
572 /* Position to merge at. */
573 {"merge_co", BMO_OP_SLOT_VEC},
574 {{'\0'}},
575 },
576 /*slot_types_out*/
577 {{{'\0'}}},
578 /*init*/ nullptr,
579 /*exec*/ bmo_pointmerge_exec,
582};
583
584/*
585 * Collapse Connected UVs.
586 *
587 * Collapses connected UV vertices.
588 */
590 "collapse_uvs",
591 /*slot_types_in*/
592 {
593 /* Input edges. */
594 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
595 {{'\0'}},
596 },
597 /*slot_types_out*/
598 {{{'\0'}}},
599 /*init*/ nullptr,
600 /*exec*/ bmo_collapse_uvs_exec,
602};
603
604/*
605 * Weld Verts.
606 *
607 * Welds verts together (kind-of like remove doubles, merge, etc, all of which
608 * use or will use this BMOP). You pass in mappings from vertices to the vertices
609 * they weld with.
610 */
612 "weld_verts",
613 /*slot_types_in*/
614 {
615 /* Maps welded vertices to verts they should weld to. */
617 {{'\0'}},
618 },
619 /*slot_types_out*/
620 {{{'\0'}}},
621 /*init*/ nullptr,
622 /*exec*/ bmo_weld_verts_exec,
625};
626
627/*
628 * Make Vertex.
629 *
630 * Creates a single vertex; this BMOP was necessary
631 * for click-create-vertex.
632 */
634 "create_vert",
635 /*slot_types_in*/
636 {
637 /* The coordinate of the new vert. */
638 {"co", BMO_OP_SLOT_VEC},
639 {{'\0'}},
640 },
641 /*slot_types_out*/
642 {
643 /* The new vert. */
644 {"vert.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
645 {{'\0'}},
646 },
647 /*init*/ nullptr,
648 /*exec*/ bmo_create_vert_exec,
650};
651
652/*
653 * Join Triangles.
654 *
655 * Tries to intelligently join triangles according
656 * to angle threshold and delimiters.
657 */
658
659#if 0 /* See comments at top of bmo_join_triangles.cc */
660# define USE_JOIN_TRIANGLE_INTERACTIVE_TESTING
661#endif
662
664 "join_triangles",
665 /*slot_types_in*/
666 {
667 /* Input geometry. */
668 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
669 /* Compare seam */
670 {"cmp_seam", BMO_OP_SLOT_BOOL},
671 /* Compare sharp */
672 {"cmp_sharp", BMO_OP_SLOT_BOOL},
673 /* Compare UVs */
674 {"cmp_uvs", BMO_OP_SLOT_BOOL},
675 /* Compare VCols. */
676 {"cmp_vcols", BMO_OP_SLOT_BOOL},
677 /* Compare materials. */
678 {"cmp_materials", BMO_OP_SLOT_BOOL},
679 {"angle_face_threshold", BMO_OP_SLOT_FLT},
680 {"angle_shape_threshold", BMO_OP_SLOT_FLT},
681 {"topology_influence", BMO_OP_SLOT_FLT},
682 {"deselect_joined", BMO_OP_SLOT_BOOL},
683#ifdef USE_JOIN_TRIANGLE_INTERACTIVE_TESTING
684 {"merge_limit", BMO_OP_SLOT_INT},
685 {"neighbor_debug", BMO_OP_SLOT_INT},
686#endif
687 {{'\0'}},
688 },
689 /*slot_types_out*/
690 {
691 /* Joined faces. */
692 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
693 {{'\0'}},
694 },
695 /*init*/ nullptr,
699};
700
701/*
702 * Contextual Create.
703 *
704 * This is basically F-key, it creates
705 * new faces from vertices, makes stuff from edge nets,
706 * makes wire edges, etc. It also dissolves faces.
707 *
708 * Three verts become a triangle, four become a quad. Two
709 * become a wire edge.
710 */
712 "contextual_create",
713 /*slot_types_in*/
714 {
715 /* Input geometry. */
717 /* Material to use. */
718 {"mat_nr", BMO_OP_SLOT_INT},
719 /* Smooth to use. */
720 {"use_smooth", BMO_OP_SLOT_BOOL},
721 {{'\0'}},
722 },
723 /*slot_types_out*/
724 {
725 /* Newly-made face(s). */
726 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
727
728 /* NOTE: this is for stand-alone edges only,
729 * not edges which are a part of newly created faces. */
730
731 /* Newly-made edge(s). */
732 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
733 {{'\0'}},
734 },
735 /*init*/ nullptr,
739};
740
741/*
742 * Bridge edge loops with faces.
743 */
745 "bridge_loops",
746 /*slot_types_in*/
747 {
748 /* Input edges. */
749 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
750 {"use_pairs", BMO_OP_SLOT_BOOL},
751 {"use_cyclic", BMO_OP_SLOT_BOOL},
752 /* Merge rather than creating faces. */
753 {"use_merge", BMO_OP_SLOT_BOOL},
754 /* merge factor */
755 {"merge_factor", BMO_OP_SLOT_FLT},
756 /* Twist offset for closed loops. */
757 {"twist_offset", BMO_OP_SLOT_INT},
758 {{'\0'}},
759 },
760 /*slot_types_out*/
761 {
762 /* New faces. */
763 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
764 /* New edges. */
765 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
766 {{'\0'}},
767 },
768 /*init*/ nullptr,
769 /*exec*/ bmo_bridge_loops_exec,
772};
773
774/*
775 * Grid Fill.
776 *
777 * Create faces defined by 2 disconnected edge loops (which share edges).
778 */
780 "grid_fill",
781 /*slot_types_in*/
782 {
783 /* Input edges. */
784 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
785
786 /* Restricts edges to groups. maps edges to integer. */
787
788 /* Material to use. */
789 {"mat_nr", BMO_OP_SLOT_INT},
790 /* Smooth state to use. */
791 {"use_smooth", BMO_OP_SLOT_BOOL},
792 /* Use simple interpolation. */
793 {"use_interp_simple", BMO_OP_SLOT_BOOL},
794 {{'\0'}},
795 },
796
797 /*slot_types_out*/
798 {
799 /* New faces. */
800 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
801 {{'\0'}},
802 },
803 /*init*/ nullptr,
804 /*exec*/ bmo_grid_fill_exec,
806};
807
808/*
809 * Fill Holes.
810 *
811 * Fill boundary edges with faces, copying surrounding custom-data.
812 */
814 "holes_fill",
815 /*slot_types_in*/
816 {
817 /* Input edges. */
818 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
819 /* Number of face sides to fill. */
820 {"sides", BMO_OP_SLOT_INT},
821 {{'\0'}},
822 },
823 /*slot_types_out*/
824 {
825 /* New faces. */
826 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
827 {{'\0'}},
828 },
829 /*init*/ nullptr,
830 /*exec*/ bmo_holes_fill_exec,
832};
833
834/*
835 * Face Attribute Fill.
836 *
837 * Fill in faces with data from adjacent faces.
838 */
840 "face_attribute_fill",
841 /*slot_types_in*/
842 {
843 /* Input faces. */
844 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
845 /* Copy face winding. */
846 {"use_normals", BMO_OP_SLOT_BOOL},
847 /* Copy face data. */
848 {"use_data", BMO_OP_SLOT_BOOL},
849 {{'\0'}},
850 },
851 /*slot_types_out*/
852 {
853 /* Faces that could not be handled. */
854 {"faces_fail.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
855 {{'\0'}},
856 },
857 /*init*/ nullptr,
860};
861
862/*
863 * Edge Loop Fill.
864 *
865 * Create faces defined by one or more non overlapping edge loops.
866 */
868 "edgeloop_fill",
869 /*slot_types_in*/
870 {
871 /* Input edges. */
872 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
873
874 /* Restricts edges to groups. maps edges to integer. */
875
876 /* Material to use. */
877 {"mat_nr", BMO_OP_SLOT_INT},
878 /* Smooth state to use. */
879 {"use_smooth", BMO_OP_SLOT_BOOL},
880 {{'\0'}},
881 },
882 /*slot_types_out*/
883 {
884 /* New faces. */
885 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
886 {{'\0'}},
887 },
888 /*init*/ nullptr,
889 /*exec*/ bmo_edgeloop_fill_exec,
891};
892
893/*
894 * Edge Net Fill.
895 *
896 * Create faces defined by enclosed edges.
897 */
899 "edgenet_fill",
900 /*slot_types_in*/
901 {
902 /* Input edges. */
903 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
904 /* Material to use. */
905 {"mat_nr", BMO_OP_SLOT_INT},
906 /* Smooth state to use. */
907 {"use_smooth", BMO_OP_SLOT_BOOL},
908 /* Number of sides. */
909 {"sides", BMO_OP_SLOT_INT},
910 {{'\0'}},
911 },
912 /*slot_types_out*/
913 {
914 /* New faces. */
915 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
916 {{'\0'}},
917 },
918 /*init*/ nullptr,
919 /*exec*/ bmo_edgenet_fill_exec,
921};
922
923/*
924 * Edge-net Prepare.
925 *
926 * Identifies several useful edge loop cases and modifies them so
927 * they'll become a face when edgenet_fill is called. The cases covered are:
928 *
929 * - One single loop; an edge is added to connect the ends
930 * - Two loops; two edges are added to connect the endpoints (based on the
931 * shortest distance between each endpoint).
932 */
934 "edgenet_prepare",
935 /*slot_types_in*/
936 {
937 /* Input edges. */
938 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
939 {{'\0'}},
940 },
941 /*slot_types_out*/
942 {
943 /* New edges. */
944 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
945 {{'\0'}},
946 },
947 /*init*/ nullptr,
950};
951
952/*
953 * Rotate.
954 *
955 * Rotate vertices around a center, using a 3x3 rotation matrix.
956 */
958 "rotate",
959 /*slot_types_in*/
960 {
961 /* Center of rotation. */
962 {"cent", BMO_OP_SLOT_VEC},
963 /* Matrix defining rotation. */
964 {"matrix", BMO_OP_SLOT_MAT},
965 /* Input vertices. */
966 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
967 /* Matrix to define the space (typically object matrix). */
968 {"space", BMO_OP_SLOT_MAT},
969 /* Transform shape keys too. */
970 {"use_shapekey", BMO_OP_SLOT_BOOL},
971 {{'\0'}},
972 },
973 /*slot_types_out*/
974 {{{'\0'}}},
975 /*init*/ nullptr,
976 /*exec*/ bmo_rotate_exec,
978};
979
980/*
981 * Translate.
982 *
983 * Translate vertices by an offset.
984 */
986 "translate",
987 /*slot_types_in*/
988 {
989 /* Translation offset. */
990 {"vec", BMO_OP_SLOT_VEC},
991 /* Matrix to define the space (typically object matrix). */
992 {"space", BMO_OP_SLOT_MAT},
993 /* Input vertices. */
994 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
995 /* Transform shape keys too. */
996 {"use_shapekey", BMO_OP_SLOT_BOOL},
997 {{'\0'}},
998 },
999 /*slot_types_out*/
1000 {{{'\0'}}},
1001 /*init*/ nullptr,
1002 /*exec*/ bmo_translate_exec,
1004};
1005
1006/*
1007 * Scale.
1008 *
1009 * Scales vertices by an offset.
1010 */
1012 "scale",
1013 /*slot_types_in*/
1014 {
1015 /* Scale factor. */
1016 {"vec", BMO_OP_SLOT_VEC},
1017 /* Matrix to define the space (typically object matrix). */
1018 {"space", BMO_OP_SLOT_MAT},
1019 /* Input vertices. */
1020 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1021 /* Transform shape keys too. */
1022 {"use_shapekey", BMO_OP_SLOT_BOOL},
1023 {{'\0'}},
1024 },
1025 /*slot_types_out*/
1026 {{{'\0'}}},
1027 /*init*/ nullptr,
1028 /*exec*/ bmo_scale_exec,
1030};
1031
1032/*
1033 * Transform.
1034 *
1035 * Transforms a set of vertices by a matrix. Multiplies
1036 * the vertex coordinates with the matrix.
1037 */
1039 "transform",
1040 /*slot_types_in*/
1041 {
1042 /* Transform matrix. */
1043 {"matrix", BMO_OP_SLOT_MAT},
1044 /* Matrix to define the space (typically object matrix). */
1045 {"space", BMO_OP_SLOT_MAT},
1046 /* Input vertices. */
1047 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1048 /* Transform shape keys too. */
1049 {"use_shapekey", BMO_OP_SLOT_BOOL},
1050 {{'\0'}},
1051 },
1052 /*slot_types_out*/
1053 {{{'\0'}}},
1054 /*init*/ nullptr,
1055 /*exec*/ bmo_transform_exec,
1057};
1058
1059/*
1060 * Object Load BMesh.
1061 *
1062 * Loads a bmesh into an object/mesh. This is a "private"
1063 * BMOP.
1064 */
1066 "object_load_bmesh",
1067 /*slot_types_in*/
1068 {
1069 /* Pointer to an scene structure. */
1071
1072 /* Pointer to an object structure. */
1074 {{'\0'}},
1075 },
1076 /*slot_types_out*/
1077 {{{'\0'}}},
1078 /*init*/ nullptr,
1081};
1082
1083/*
1084 * BMesh to Mesh.
1085 *
1086 * Converts a bmesh to a Mesh. This is reserved for exiting edit-mode.
1087 */
1089 "bmesh_to_mesh",
1090 /*slot_types_in*/
1091 {
1092
1093 /* Pointer to a mesh structure to fill in. */
1095 /* Pointer to an object structure. */
1097 {{'\0'}},
1098 },
1099 /*slot_types_out*/
1100 {{{'\0'}}},
1101 /*init*/ nullptr,
1102 /*exec*/ bmo_bmesh_to_mesh_exec,
1104};
1105
1106/*
1107 * Mesh to BMesh.
1108 *
1109 * Load the contents of a mesh into the bmesh. this BMOP is private, it's
1110 * reserved exclusively for entering edit-mode.
1111 */
1113 "mesh_to_bmesh",
1114 /*slot_types_in*/
1115 {
1116 /* Pointer to a Mesh structure. */
1118 /* Pointer to an Object structure. */
1120 /* Load active shapekey coordinates into verts. */
1121 {"use_shapekey", BMO_OP_SLOT_BOOL},
1122 {{'\0'}},
1123 },
1124 /*slot_types_out*/
1125 {{{'\0'}}},
1126 /*init*/ nullptr,
1127 /*exec*/ bmo_mesh_to_bmesh_exec,
1129};
1130
1131/*
1132 * Individual Face Extrude.
1133 *
1134 * Extrudes faces individually.
1135 */
1137 "extrude_discrete_faces",
1138 /*slot_types_in*/
1139 {
1140 /* Input faces. */
1141 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1142 /* Create faces with reversed direction. */
1143 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1144 /* Pass to duplicate. */
1145 {"use_select_history", BMO_OP_SLOT_BOOL},
1146 {{'\0'}},
1147 },
1148 /*slot_types_out*/
1149 {
1150 /* Output faces. */
1151 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1152 {{'\0'}},
1153 },
1154 /*init*/ nullptr,
1157};
1158
1159/*
1160 * Extrude Only Edges.
1161 *
1162 * Extrudes Edges into faces, note that this is very simple, there's no fancy
1163 * winged extrusion.
1164 */
1166 "extrude_edge_only",
1167 /*slot_types_in*/
1168 {
1169 /* Input vertices. */
1170 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1171 /* Create faces with reversed direction. */
1172 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1173 /* Pass to duplicate. */
1174 {"use_select_history", BMO_OP_SLOT_BOOL},
1175 {{'\0'}},
1176 },
1177 /*slot_types_out*/
1178 {
1179 /* Output geometry. */
1180 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1181 {{'\0'}},
1182 },
1183 /*init*/ nullptr,
1186};
1187
1188/*
1189 * Individual Vertex Extrude.
1190 *
1191 * Extrudes wire edges from vertices.
1192 */
1194 "extrude_vert_indiv",
1195 /*slot_types_in*/
1196 {
1197 /* Input vertices. */
1198 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1199 /* Pass to duplicate. */
1200 {"use_select_history", BMO_OP_SLOT_BOOL},
1201 {{'\0'}},
1202 },
1203 /*slot_types_out*/
1204 {
1205 /* Output wire edges. */
1206 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1207 /* Output vertices. */
1208 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1209 {{'\0'}},
1210 },
1211 /*init*/ nullptr,
1214};
1215
1216/*
1217 * Connect Verts.
1218 *
1219 * Split faces by adding edges that connect **verts**.
1220 */
1222 "connect_verts",
1223 /*slot_types_in*/
1224 {
1225 /* Input vertices. */
1226 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1227 /* Input faces to explicitly exclude from connecting. */
1228 {"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1229 /* Prevent splits with overlaps & intersections. */
1230 {"check_degenerate", BMO_OP_SLOT_BOOL},
1231 {{'\0'}},
1232 },
1233 /*slot_types_out*/
1234 {
1235 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1236 {{'\0'}},
1237 },
1238 /*init*/ nullptr,
1239 /*exec*/ bmo_connect_verts_exec,
1241};
1242
1243/*
1244 * Connect Verts to form Convex Faces.
1245 *
1246 * Ensures all faces are convex **faces**.
1247 */
1249 "connect_verts_concave",
1250 /*slot_types_in*/
1251 {
1252 /* Input faces. */
1253 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1254 {{'\0'}},
1255 },
1256 /*slot_types_out*/
1257 {
1258 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1259 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1260 {{'\0'}},
1261 },
1262 /*init*/ nullptr,
1265};
1266
1267/*
1268 * Connect Verts Across non Planer Faces.
1269 *
1270 * Split faces by connecting edges along non planer **faces**.
1271 */
1273 "connect_verts_nonplanar",
1274 /*slot_types_in*/
1275 {
1276 /* Total rotation angle (radians). */
1277 {"angle_limit", BMO_OP_SLOT_FLT},
1278 /* Input faces. */
1279 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1280 {{'\0'}},
1281 },
1282 /*slot_types_out*/
1283 {
1284 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1285 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1286 {{'\0'}},
1287 },
1288 /*init*/ nullptr,
1291};
1292
1293/*
1294 * Connect Verts.
1295 *
1296 * Split faces by adding edges that connect **verts**.
1297 */
1299 "connect_vert_pair",
1300 /*slot_types_in*/
1301 {
1302 /* Input vertices. */
1303 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1304 /* Input vertices to explicitly exclude from connecting. */
1305 {"verts_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1306 /* Input faces to explicitly exclude from connecting. */
1307 {"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1308 {{'\0'}},
1309 },
1310 /*slot_types_out*/
1311 {
1312 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1313 {{'\0'}},
1314 },
1315 /*init*/ nullptr,
1318};
1319
1320/*
1321 * Extrude Faces.
1322 *
1323 * Extrude operator (does not transform)
1324 */
1326 "extrude_face_region",
1327 /*slot_types_in*/
1328 {
1329 /* Edges and faces. */
1331 /* Input edges to explicitly exclude from extrusion. */
1333 /* Keep original geometry (requires ``geom`` to include edges). */
1334 {"use_keep_orig", BMO_OP_SLOT_BOOL},
1335 /* Create faces with reversed direction. */
1336 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1337 /* Use winding from surrounding faces instead of this region. */
1338 {"use_normal_from_adjacent", BMO_OP_SLOT_BOOL},
1339 /* Dissolve edges whose faces form a flat surface. */
1340 {"use_dissolve_ortho_edges", BMO_OP_SLOT_BOOL},
1341 /* Pass to duplicate. */
1342 {"use_select_history", BMO_OP_SLOT_BOOL},
1343 {{'\0'}},
1344 },
1345 /*slot_types_out*/
1346 {
1347 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1348 {{'\0'}},
1349 },
1350 /*init*/ nullptr,
1353};
1354
1355/*
1356 * Dissolve Verts.
1357 */
1359 "dissolve_verts",
1360 /*slot_types_in*/
1361 {
1362 /* Input vertices. */
1363 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1364 /* Split off face corners to maintain surrounding geometry. */
1365 {"use_face_split", BMO_OP_SLOT_BOOL},
1366 /* Split off face corners instead of merging faces. */
1367 {"use_boundary_tear", BMO_OP_SLOT_BOOL},
1368 {{'\0'}},
1369 },
1370 /*slot_types_out*/
1371 {{{'\0'}}},
1372 /*init*/ nullptr,
1373 /*exec*/ bmo_dissolve_verts_exec,
1376};
1377
1378/*
1379 * Dissolve Edges.
1380 */
1382 "dissolve_edges",
1383 /*slot_types_in*/
1384 {
1385 /* Input edges. */
1386 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1387 /* Dissolve verts left between only 2 edges. */
1388 {"use_verts", BMO_OP_SLOT_BOOL},
1389 /* Split off face corners to maintain surrounding geometry. */
1390 {"use_face_split", BMO_OP_SLOT_BOOL},
1391 /* Do not dissolve verts between 2 edges when their angle exceeds this threshold.
1392 * Disabled by default. */
1393 {"angle_threshold", BMO_OP_SLOT_FLT},
1394 {{'\0'}},
1395 },
1396 /*slot_types_out*/
1397 {
1398 {"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1399 {{'\0'}},
1400 },
1401 /*init*/ bmo_dissolve_edges_init,
1402 /*exec*/ bmo_dissolve_edges_exec,
1405};
1406
1407/*
1408 * Dissolve Faces.
1409 */
1411 "dissolve_faces",
1412 /*slot_types_in*/
1413 {
1414 /* Input faces. */
1415 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1416 /* Dissolve verts left between only 2 edges. */
1417 {"use_verts", BMO_OP_SLOT_BOOL},
1418 {{'\0'}},
1419 },
1420 /*slot_types_out*/
1421 {
1422 {"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1423 {{'\0'}},
1424 },
1425 /*init*/ nullptr,
1426 /*exec*/ bmo_dissolve_faces_exec,
1429};
1430
1432 {BMO_DELIM_NORMAL, "NORMAL"},
1433 {BMO_DELIM_MATERIAL, "MATERIAL"},
1434 {BMO_DELIM_SEAM, "SEAM"},
1435 {BMO_DELIM_SHARP, "SHARP"},
1436 {BMO_DELIM_UV, "UV"},
1437 {0, nullptr},
1438};
1439
1440/*
1441 * Limited Dissolve.
1442 *
1443 * Dissolve planar faces and co-linear edges.
1444 */
1446 "dissolve_limit",
1447 /*slot_types_in*/
1448 {
1449 /* Total rotation angle (radians). */
1450 {"angle_limit", BMO_OP_SLOT_FLT},
1451 /* Dissolve all vertices in between face boundaries. */
1452 {"use_dissolve_boundaries", BMO_OP_SLOT_BOOL},
1453 /* Input vertices. */
1454 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1455 /* Input edges. */
1456 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1457 /* Delimit dissolve operation. */
1458 {"delimit",
1462 {{'\0'}},
1463 },
1464 /*slot_types_out*/
1465 {
1466 {"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1467 {{'\0'}},
1468 },
1469 /*init*/ nullptr,
1470 /*exec*/ bmo_dissolve_limit_exec,
1473};
1474
1475/*
1476 * Degenerate Dissolve.
1477 *
1478 * Dissolve edges with no length, faces with no area.
1479 */
1481 "dissolve_degenerate",
1482 /*slot_types_in*/
1483 {
1484 /* Maximum distance to consider degenerate. */
1485 {"dist", BMO_OP_SLOT_FLT},
1486 /* Input edges. */
1487 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1488 {{'\0'}},
1489 },
1490 /*slot_types_out*/
1491 {{{'\0'}}},
1492 /*init*/ nullptr,
1496};
1497
1499 {MOD_TRIANGULATE_QUAD_BEAUTY, "BEAUTY"},
1500 {MOD_TRIANGULATE_QUAD_FIXED, "FIXED"},
1501 {MOD_TRIANGULATE_QUAD_ALTERNATE, "ALTERNATE"},
1502 {MOD_TRIANGULATE_QUAD_SHORTEDGE, "SHORT_EDGE"},
1503 {MOD_TRIANGULATE_QUAD_LONGEDGE, "LONG_EDGE"},
1504 {0, nullptr},
1505};
1506
1508 {MOD_TRIANGULATE_NGON_BEAUTY, "BEAUTY"},
1509 {MOD_TRIANGULATE_NGON_EARCLIP, "EAR_CLIP"},
1510 {0, nullptr},
1511};
1512
1513/*
1514 * Triangulate.
1515 */
1517 "triangulate",
1518 /*slot_types_in*/
1519 {
1520 /* Input faces. */
1521 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1522 /* Method for splitting the quads into triangles. */
1523 {"quad_method",
1527 /* Method for splitting the polygons into triangles. */
1528 {"ngon_method",
1532 {{'\0'}},
1533 },
1534 /*slot_types_out*/
1535 {
1536 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1537 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1538 {"face_map.out",
1541 /* Duplicate faces. */
1542 {"face_map_double.out",
1545 {{'\0'}},
1546 },
1547 /*init*/ nullptr,
1548 /*exec*/ bmo_triangulate_exec,
1550};
1551
1552/*
1553 * Un-Subdivide.
1554 *
1555 * Reduce detail in geometry containing grids.
1556 */
1558 "unsubdivide",
1559 /*slot_types_in*/
1560 {
1561 /* Input vertices. */
1562 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
1563 /* Number of times to unsubdivide. */
1564 {"iterations", BMO_OP_SLOT_INT},
1565 {{'\0'}},
1566 },
1567 /*slot_types_out*/
1568 {{{'\0'}}},
1569 /*init*/ nullptr,
1570 /*exec*/ bmo_unsubdivide_exec,
1573};
1574
1576 {SUBD_CORNER_STRAIGHT_CUT, "STRAIGHT_CUT"},
1577 {SUBD_CORNER_INNERVERT, "INNER_VERT"},
1578 {SUBD_CORNER_PATH, "PATH"},
1579 {SUBD_CORNER_FAN, "FAN"},
1580 {0, nullptr},
1581};
1582
1583/*
1584 * Subdivide Edges.
1585 *
1586 * Advanced operator for subdividing edges
1587 * with options for face patterns, smoothing and randomization.
1588 */
1590 "subdivide_edges",
1591 /*slot_types_in*/
1592 {
1593 /* Input edges. */
1594 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1595 /* Smoothness factor. */
1596 {"smooth", BMO_OP_SLOT_FLT},
1597 /* Smooth falloff type. */
1598 {"smooth_falloff",
1602 /* Fractal randomness factor. */
1603 {"fractal", BMO_OP_SLOT_FLT},
1604 /* Apply fractal displacement along normal only. */
1605 {"along_normal", BMO_OP_SLOT_FLT},
1606 /* Number of cuts. */
1607 {"cuts", BMO_OP_SLOT_INT},
1608 /* Seed for the random number generator. */
1609 {"seed", BMO_OP_SLOT_INT},
1610 /* Uses custom pointers. */
1611 {"custom_patterns",
1615 /* Quad corner type. */
1616 {"quad_corner_type",
1620 /* Fill in fully-selected faces with a grid. */
1621 {"use_grid_fill", BMO_OP_SLOT_BOOL},
1622 /* Tessellate the case of one edge selected in a quad or triangle. */
1623 {"use_single_edge", BMO_OP_SLOT_BOOL},
1624 /* Only subdivide quads (for loop-cut). */
1625 {"use_only_quads", BMO_OP_SLOT_BOOL},
1626 /* For making new primitives only. */
1627 {"use_sphere", BMO_OP_SLOT_BOOL},
1628 /* Maintain even offset when smoothing. */
1629 {"use_smooth_even", BMO_OP_SLOT_BOOL},
1630 {{'\0'}},
1631 },
1632 /*slot_types_out*/
1633 {
1634 /* NOTE: these next three can have multiple types of elements in them. */
1635 {"geom_inner.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1636 {"geom_split.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1637 /* Contains all output geometry. */
1638 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1639 {{'\0'}},
1640 },
1641 /*init*/ nullptr,
1642 /*exec*/ bmo_subdivide_edges_exec,
1645};
1646
1648 {SUBD_RING_INTERP_LINEAR, "LINEAR"},
1649 {SUBD_RING_INTERP_PATH, "PATH"},
1650 {SUBD_RING_INTERP_SURF, "SURFACE"},
1651 {0, nullptr},
1652};
1653
1654/*
1655 * Subdivide Edge-Ring.
1656 *
1657 * Take an edge-ring, and subdivide with interpolation options.
1658 */
1660 "subdivide_edgering",
1661 /*slot_types_in*/
1662 {
1663 /* Input vertices. */
1664 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
1665 /* Interpolation method. */
1666 {"interp_mode",
1670 /* Smoothness factor. */
1671 {"smooth", BMO_OP_SLOT_FLT},
1672 /* Number of cuts. */
1673 {"cuts", BMO_OP_SLOT_INT},
1674 /* Profile shape type. */
1675 {"profile_shape",
1679 /* How much intermediary new edges are shrunk/expanded. */
1680 {"profile_shape_factor", BMO_OP_SLOT_FLT},
1681 {{'\0'}},
1682 },
1683 /*slot_types_out*/
1684 {
1685 /* Output faces. */
1686 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1687 {{'\0'}},
1688 },
1689 /*init*/ nullptr,
1693};
1694
1695/*
1696 * Bisect Plane.
1697 *
1698 * Bisects the mesh by a plane (cut the mesh in half).
1699 */
1701 "bisect_plane",
1702 /*slot_types_in*/
1703 {
1704 /* Input geometry. */
1706 /* Minimum distance when testing if a vert is exactly on the plane. */
1707 {"dist", BMO_OP_SLOT_FLT},
1708 /* Point on the plane. */
1709 {"plane_co", BMO_OP_SLOT_VEC},
1710 /* Direction of the plane. */
1711 {"plane_no", BMO_OP_SLOT_VEC},
1712 /* Snap axis aligned verts to the center. */
1713 {"use_snap_center", BMO_OP_SLOT_BOOL},
1714 /* When enabled. remove all geometry on the positive side of the plane. */
1715 {"clear_outer", BMO_OP_SLOT_BOOL},
1716 /* When enabled. remove all geometry on the negative side of the plane. */
1717 {"clear_inner", BMO_OP_SLOT_BOOL},
1718 {{'\0'}},
1719 },
1720 /*slot_types_out*/
1721 {
1722 /* Output geometry aligned with the plane (new and existing). */
1723 {"geom_cut.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE}},
1724 /* Input and output geometry (result of cut). */
1725 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1726 {{'\0'}},
1727 },
1728 /*init*/ nullptr,
1729 /*exec*/ bmo_bisect_plane_exec,
1732};
1733
1735 {DEL_VERTS, "VERTS"},
1736 {DEL_EDGES, "EDGES"},
1737 {DEL_ONLYFACES, "FACES_ONLY"},
1738 {DEL_EDGESFACES, "EDGES_FACES"},
1739 {DEL_FACES, "FACES"},
1740 {DEL_FACES_KEEP_BOUNDARY, "FACES_KEEP_BOUNDARY"},
1741 {DEL_ONLYTAGGED, "TAGGED_ONLY"},
1742 {0, nullptr},
1743};
1744
1745/*
1746 * Delete Geometry.
1747 *
1748 * Utility operator to delete geometry.
1749 */
1751 "delete",
1752 /*slot_types_in*/
1753 {
1754 /* Input geometry. */
1756 /* Geometry types to delete. */
1757 {"context",
1761 {{'\0'}},
1762 },
1763 /*slot_types_out*/
1764 {{{'\0'}}},
1765 /*init*/ nullptr,
1766 /*exec*/ bmo_delete_exec,
1769};
1770
1771/*
1772 * Duplicate Geometry.
1773 *
1774 * Utility operator to duplicate geometry,
1775 * optionally into a destination mesh.
1776 */
1778 "duplicate",
1779 /*slot_types_in*/
1780 {
1781 /* Input geometry. */
1783 /* Destination bmesh, if None will use current on. */
1785 {"use_select_history", BMO_OP_SLOT_BOOL},
1786 {"use_edge_flip_from_face", BMO_OP_SLOT_BOOL},
1787 {{'\0'}},
1788 },
1789 /*slot_types_out*/
1790 {
1791 {"geom_orig.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1792 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1793
1794 /* NOTE: face_map maps from source faces to dupe faces,
1795 * and from dupe faces to source faces. */
1796
1797 {"vert_map.out",
1800 {"edge_map.out",
1803 {"face_map.out",
1806 /* Boundary edges from the split geometry that maps edges from the original geometry
1807 * to the destination edges. */
1808 {"boundary_map.out",
1811 {"isovert_map.out",
1814 {{'\0'}},
1815 },
1816 /*init*/ nullptr,
1817 /*exec*/ bmo_duplicate_exec,
1819};
1820
1821/*
1822 * Split Off Geometry.
1823 *
1824 * Disconnect geometry from adjacent edges and faces,
1825 * optionally into a destination mesh.
1826 */
1828 "split",
1829 /*slot_types_in*/
1830 {
1831 /* Input geometry. */
1833 /* Destination bmesh, if None will use current one. */
1835 /* When enabled. don't duplicate loose verts/edges. */
1836 {"use_only_faces", BMO_OP_SLOT_BOOL},
1837 {{'\0'}},
1838 },
1839 /*slot_types_out*/
1840 {
1841 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1842 /* Boundary edges from the split geometry that maps edges from the original geometry
1843 * to the destination edges.
1844 *
1845 * When the source edges have been deleted, the destination edge will be used
1846 * for both the key and the value. */
1847 {"boundary_map.out",
1850 {"isovert_map.out",
1853 {{'\0'}},
1854 },
1855 /*init*/ nullptr,
1856 /*exec*/ bmo_split_exec,
1858};
1859
1860/*
1861 * Spin.
1862 *
1863 * Extrude or duplicate geometry a number of times,
1864 * rotating and possibly translating after each step
1865 */
1867 "spin",
1868 /*slot_types_in*/
1869 {
1870 /* Input geometry. */
1872 /* Rotation center. */
1873 {"cent", BMO_OP_SLOT_VEC},
1874 /* Rotation axis. */
1875 {"axis", BMO_OP_SLOT_VEC},
1876 /* Translation delta per step. */
1877 {"dvec", BMO_OP_SLOT_VEC},
1878 /* Total rotation angle (radians). */
1879 {"angle", BMO_OP_SLOT_FLT},
1880 /* Matrix to define the space (typically object matrix). */
1881 {"space", BMO_OP_SLOT_MAT},
1882 /* Number of steps. */
1883 {"steps", BMO_OP_SLOT_INT},
1884 /* Merge first/last when the angle is a full revolution. */
1885 {"use_merge", BMO_OP_SLOT_BOOL},
1886 /* Create faces with reversed direction. */
1887 {"use_normal_flip", BMO_OP_SLOT_BOOL},
1888 /* Duplicate or extrude?. */
1889 {"use_duplicate", BMO_OP_SLOT_BOOL},
1890 {{'\0'}},
1891 },
1892 /*slot_types_out*/
1893 {
1894 /* Result of last step. */
1895 {"geom_last.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
1896 {{'\0'}},
1897 },
1898 /*init*/ nullptr,
1899 /*exec*/ bmo_spin_exec,
1901};
1902
1903/*
1904 * UV Rotation.
1905 *
1906 * Cycle the loop UVs
1907 */
1909 "rotate_uvs",
1910 /*slot_types_in*/
1911 {
1912 /* Input faces. */
1913 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1914 /* Rotate counter-clockwise if true, otherwise clockwise. */
1915 {"use_ccw", BMO_OP_SLOT_BOOL},
1916 {{'\0'}},
1917 },
1918 /*slot_types_out*/
1919 {{{'\0'}}},
1920 /*init*/ nullptr,
1921 /*exec*/ bmo_rotate_uvs_exec,
1923};
1924
1925/*
1926 * UV Reverse.
1927 *
1928 * Reverse the UVs
1929 */
1931 "reverse_uvs",
1932 /*slot_types_in*/
1933 {
1934 /* Input faces. */
1935 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1936 {{'\0'}},
1937 },
1938 /*slot_types_out*/
1939 {{{'\0'}}},
1940 /*init*/ nullptr,
1941 /*exec*/ bmo_reverse_uvs_exec,
1943};
1944
1945/*
1946 * Color Rotation.
1947 *
1948 * Cycle the loop colors
1949 */
1951 "rotate_colors",
1952 /*slot_types_in*/
1953 {
1954 /* Input faces. */
1955 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1956 /* Rotate counter-clockwise if true, otherwise clockwise. */
1957 {"use_ccw", BMO_OP_SLOT_BOOL},
1958 /* Index into color attribute list. */
1959 {"color_index", BMO_OP_SLOT_INT},
1960 {{'\0'}},
1961 },
1962 /*slot_types_out*/
1963 {{{'\0'}}},
1964 /*init*/ nullptr,
1965 /*exec*/ bmo_rotate_colors_exec,
1967};
1968
1969/*
1970 * Color Reverse
1971 *
1972 * Reverse the loop colors.
1973 */
1975 "reverse_colors",
1976 /*slot_types_in*/
1977 {
1978 /* Input faces. */
1979 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
1980 /* Index into color attribute list. */
1981 {"color_index", BMO_OP_SLOT_INT},
1982 {{'\0'}},
1983 },
1984 /*slot_types_out*/
1985 {{{'\0'}}},
1986 /*init*/ nullptr,
1987 /*exec*/ bmo_reverse_colors_exec,
1989};
1990
1991/*
1992 * Edge Split.
1993 *
1994 * Disconnects faces along input edges.
1995 */
1997 "split_edges",
1998 /*slot_types_in*/
1999 {
2000 /* Input edges. */
2001 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2002
2003 /* NOTE: needed for vertex rip so we can rip only half an edge
2004 * at a boundary which would otherwise split off. */
2005
2006 /* Optional tag verts, use to have greater control of splits. */
2007 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2008 /* Use 'verts' for splitting, else just find verts to split from edges. */
2009 {"use_verts", BMO_OP_SLOT_BOOL},
2010 {{'\0'}},
2011 },
2012 /*slot_types_out*/
2013 {
2014 /* Old output disconnected edges. */
2015 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2016 {{'\0'}},
2017 },
2018 /*init*/ nullptr,
2019 /*exec*/ bmo_split_edges_exec,
2021};
2022
2023/*
2024 * Create Grid.
2025 *
2026 * Creates a grid with a variable number of subdivisions
2027 */
2029 "create_grid",
2030 /*slot_types_in*/
2031 {
2032 /* Number of x segments. */
2033 {"x_segments", BMO_OP_SLOT_INT},
2034 /* Number of y segments. */
2035 {"y_segments", BMO_OP_SLOT_INT},
2036 /* Size of the grid. */
2037 {"size", BMO_OP_SLOT_FLT},
2038 /* Matrix to multiply the new geometry with. */
2039 {"matrix", BMO_OP_SLOT_MAT},
2040 /* Calculate default UVs. */
2041 {"calc_uvs", BMO_OP_SLOT_BOOL},
2042 {{'\0'}},
2043 },
2044 /*slot_types_out*/
2045 {
2046 /* Output verts. */
2047 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2048 {{'\0'}},
2049 },
2050 /*init*/ nullptr,
2051 /*exec*/ bmo_create_grid_exec,
2053};
2054
2055/*
2056 * Create UV Sphere.
2057 *
2058 * Creates a grid with a variable number of subdivisions
2059 */
2061 "create_uvsphere",
2062 /*slot_types_in*/
2063 {
2064 /* Number of u segments. */
2065 {"u_segments", BMO_OP_SLOT_INT},
2066 /* Number of v segment. */
2067 {"v_segments", BMO_OP_SLOT_INT},
2068 /* Radius. */
2069 {"radius", BMO_OP_SLOT_FLT},
2070 /* Matrix to multiply the new geometry with. */
2071 {"matrix", BMO_OP_SLOT_MAT},
2072 /* Calculate default UVs. */
2073 {"calc_uvs", BMO_OP_SLOT_BOOL},
2074 {{'\0'}},
2075 },
2076 /*slot_types_out*/
2077 {
2078 /* Output verts. */
2079 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2080 {{'\0'}},
2081 },
2082 /*init*/ nullptr,
2083 /*exec*/ bmo_create_uvsphere_exec,
2085};
2086
2087/*
2088 * Create Ico-Sphere.
2089 *
2090 * Creates a grid with a variable number of subdivisions
2091 */
2093 "create_icosphere",
2094 /*slot_types_in*/
2095 {
2096 /* How many times to recursively subdivide the sphere. */
2097 {"subdivisions", BMO_OP_SLOT_INT},
2098 /* Radius. */
2099 {"radius", BMO_OP_SLOT_FLT},
2100 /* Matrix to multiply the new geometry with. */
2101 {"matrix", BMO_OP_SLOT_MAT},
2102 /* Calculate default UVs. */
2103 {"calc_uvs", BMO_OP_SLOT_BOOL},
2104 {{'\0'}},
2105 },
2106 /*slot_types_out*/
2107 {
2108 /* Output verts. */
2109 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2110 {{'\0'}},
2111 },
2112 /*init*/ nullptr,
2115};
2116
2117/*
2118 * Create Suzanne.
2119 *
2120 * Creates a monkey (standard blender primitive).
2121 */
2123 "create_monkey",
2124 /*slot_types_in*/
2125 {
2126 /* Matrix to multiply the new geometry with. */
2127 {"matrix", BMO_OP_SLOT_MAT},
2128 /* Calculate default UVs. */
2129 {"calc_uvs", BMO_OP_SLOT_BOOL},
2130 {{'\0'}},
2131 },
2132 /*slot_types_out*/
2133 {
2134 /* Output verts. */
2135 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2136 {{'\0'}},
2137 },
2138 /*init*/ nullptr,
2139 /*exec*/ bmo_create_monkey_exec,
2141};
2142
2143/*
2144 * Create Cone.
2145 *
2146 * Creates a cone with variable depth at both ends
2147 */
2149 "create_cone",
2150 /*slot_types_in*/
2151 {
2152 /* Whether or not to fill in the ends with faces. */
2153 {"cap_ends", BMO_OP_SLOT_BOOL},
2154 /* Fill ends with triangles instead of ngons. */
2155 {"cap_tris", BMO_OP_SLOT_BOOL},
2156 /* Number of vertices in the base circle. */
2157 {"segments", BMO_OP_SLOT_INT},
2158 /* Radius of one end. */
2159 {"radius1", BMO_OP_SLOT_FLT},
2160 /* Radius of the opposite. */
2161 {"radius2", BMO_OP_SLOT_FLT},
2162 /* Distance between ends. */
2163 {"depth", BMO_OP_SLOT_FLT},
2164 /* Matrix to multiply the new geometry with. */
2165 {"matrix", BMO_OP_SLOT_MAT},
2166 /* Calculate default UVs. */
2167 {"calc_uvs", BMO_OP_SLOT_BOOL},
2168 {{'\0'}},
2169 },
2170 /*slot_types_out*/
2171 {
2172 /* Output verts. */
2173 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2174 {{'\0'}},
2175 },
2176 /*init*/ nullptr,
2177 /*exec*/ bmo_create_cone_exec,
2179};
2180
2181/*
2182 * Creates a Circle.
2183 */
2185 "create_circle",
2186 /*slot_types_in*/
2187 {
2188 /* Whether or not to fill in the ends with faces. */
2189 {"cap_ends", BMO_OP_SLOT_BOOL},
2190 /* Fill ends with triangles instead of ngons. */
2191 {"cap_tris", BMO_OP_SLOT_BOOL},
2192 /* Number of vertices in the circle. */
2193 {"segments", BMO_OP_SLOT_INT},
2194 /* Radius of the circle. */
2195 {"radius", BMO_OP_SLOT_FLT},
2196 /* Matrix to multiply the new geometry with. */
2197 {"matrix", BMO_OP_SLOT_MAT},
2198 /* Calculate default UVs. */
2199 {"calc_uvs", BMO_OP_SLOT_BOOL},
2200 {{'\0'}},
2201 },
2202 /*slot_types_out*/
2203 {
2204 /* Output verts. */
2205 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2206 {{'\0'}},
2207 },
2208 /*init*/ nullptr,
2209 /*exec*/ bmo_create_circle_exec,
2211};
2212
2213/*
2214 * Create Cube
2215 *
2216 * Creates a cube.
2217 */
2219 "create_cube",
2220 /*slot_types_in*/
2221 {
2222 /* Size of the cube. */
2223 {"size", BMO_OP_SLOT_FLT},
2224 /* Matrix to multiply the new geometry with. */
2225 {"matrix", BMO_OP_SLOT_MAT},
2226 /* Calculate default UVs. */
2227 {"calc_uvs", BMO_OP_SLOT_BOOL},
2228 {{'\0'}},
2229 },
2230 /*slot_types_out*/
2231 {
2232 /* Output verts. */
2233 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2234 {{'\0'}},
2235 },
2236 /*init*/ nullptr,
2237 /*exec*/ bmo_create_cube_exec,
2239};
2240
2242 {BEVEL_AMT_OFFSET, "OFFSET"},
2243 {BEVEL_AMT_WIDTH, "WIDTH"},
2244 {BEVEL_AMT_DEPTH, "DEPTH"},
2245 {BEVEL_AMT_PERCENT, "PERCENT"},
2246 {BEVEL_AMT_ABSOLUTE, "ABSOLUTE"},
2247 {0, nullptr},
2248};
2249
2251 {BEVEL_PROFILE_SUPERELLIPSE, "SUPERELLIPSE"},
2252 {BEVEL_PROFILE_CUSTOM, "CUSTOM"},
2253 {0, nullptr},
2254};
2255
2257 {BEVEL_FACE_STRENGTH_NONE, "NONE"},
2258 {BEVEL_FACE_STRENGTH_NEW, "NEW"},
2259 {BEVEL_FACE_STRENGTH_AFFECTED, "AFFECTED"},
2260 {BEVEL_FACE_STRENGTH_ALL, "ALL"},
2261 {0, nullptr},
2262};
2263
2265 {BEVEL_MITER_SHARP, "SHARP"},
2266 {BEVEL_MITER_PATCH, "PATCH"},
2267 {BEVEL_MITER_ARC, "ARC"},
2268 {0, nullptr},
2269};
2270
2272 {BEVEL_VMESH_ADJ, "ADJ"},
2273 {BEVEL_VMESH_CUTOFF, "CUTOFF"},
2274 {0, nullptr},
2275};
2276
2278 {BEVEL_AFFECT_VERTICES, "VERTICES"},
2279 {BEVEL_AFFECT_EDGES, "EDGES"},
2280 {0, nullptr},
2281};
2282
2283/*
2284 * Bevel.
2285 *
2286 * Bevels edges and vertices
2287 */
2289 "bevel",
2290 /*slot_types_in*/
2291 {
2292 /* Input edges and vertices. */
2294 /* Amount to offset beveled edge. */
2295 {"offset", BMO_OP_SLOT_FLT},
2296 /* How to measure the offset. */
2297 {"offset_type",
2301 /* The profile type to use for bevel. */
2302 {"profile_type",
2306 /* Number of segments in bevel. */
2307 {"segments", BMO_OP_SLOT_INT},
2308 /* Profile shape, 0->1 (.5=>round). */
2309 {"profile", BMO_OP_SLOT_FLT},
2310 /* Whether to bevel vertices or edges. */
2311 {"affect",
2315 /* Do not allow beveled edges/vertices to overlap each other. */
2316 {"clamp_overlap", BMO_OP_SLOT_BOOL},
2317 /* Material for bevel faces, -1 means get from adjacent faces. */
2318 {"material", BMO_OP_SLOT_INT},
2319 /* Prefer to slide along edges to having even widths. */
2320 {"loop_slide", BMO_OP_SLOT_BOOL},
2321 /* Extend edge data to allow seams to run across bevels. */
2322 {"mark_seam", BMO_OP_SLOT_BOOL},
2323 /* Extend edge data to allow sharp edges to run across bevels. */
2324 {"mark_sharp", BMO_OP_SLOT_BOOL},
2325 /* Harden normals. */
2326 {"harden_normals", BMO_OP_SLOT_BOOL},
2327 /* Whether to set face strength, and which faces to set if so. */
2328 {"face_strength_mode",
2332 /* Outer miter kind. */
2333 {"miter_outer",
2337 /* Outer miter kind. */
2338 {"miter_inner",
2342 /* Amount to offset beveled edge. */
2343 {"spread", BMO_OP_SLOT_FLT},
2344 /* CurveProfile, if None ignored */
2346 /* The method to use to create meshes at intersections. */
2347 {"vmesh_method",
2351 {{'\0'}},
2352 },
2353 /*slot_types_out*/
2354 {
2355 /* Output faces. */
2356 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2357 /* Output edges. */
2358 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2359 /* Output verts. */
2360 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2361 {{'\0'}},
2362 },
2363
2364 /*init*/ nullptr,
2365 /*exec*/ bmo_bevel_exec,
2368};
2369
2370/* No enum is defined for this. */
2372 {0, "AREA"},
2373 {1, "ANGLE"},
2374 {0, nullptr},
2375};
2376
2377/*
2378 * Beautify Fill.
2379 *
2380 * Rotate edges to create more evenly spaced triangles.
2381 */
2383 "beautify_fill",
2384 /*slot_types_in*/
2385 {
2386 /* Input faces. */
2387 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2388 /* Edges that can be flipped. */
2389 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2390 /* Restrict edge rotation to mixed tagged vertices. */
2391 {"use_restrict_tag", BMO_OP_SLOT_BOOL},
2392 /* Method to define what is beautiful. */
2393 {"method",
2397 {{'\0'}},
2398 },
2399 /*slot_types_out*/
2400 {
2401 /* New flipped faces and edges. */
2402 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2403 {{'\0'}},
2404 },
2405 /*init*/ nullptr,
2406 /*exec*/ bmo_beautify_fill_exec,
2409};
2410
2411/*
2412 * Triangle Fill.
2413 *
2414 * Fill edges with triangles
2415 */
2417 "triangle_fill",
2418 /*slot_types_in*/
2419 {
2420 /* Use best triangulation division. */
2421 {"use_beauty", BMO_OP_SLOT_BOOL},
2422 /* Dissolve resulting faces. */
2423 {"use_dissolve", BMO_OP_SLOT_BOOL},
2424 /* Input edges. */
2425 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2426 /* Optionally pass the fill normal to use. */
2427 {"normal", BMO_OP_SLOT_VEC},
2428 {{'\0'}},
2429 },
2430 /*slot_types_out*/
2431 {
2432 /* New faces and edges. */
2433 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2434 {{'\0'}},
2435 },
2436 /*init*/ nullptr,
2437 /*exec*/ bmo_triangle_fill_exec,
2439};
2440
2441/*
2442 * Solidify.
2443 *
2444 * Turns a mesh into a shell with thickness
2445 */
2447 "solidify",
2448 /*slot_types_in*/
2449 {
2450 /* Input geometry. */
2452 /* Thickness. */
2453 {"thickness", BMO_OP_SLOT_FLT},
2454 {{'\0'}},
2455 },
2456 /*slot_types_out*/
2457 {
2458 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2459 {{'\0'}},
2460 },
2461 /*init*/ nullptr,
2464};
2465
2466/*
2467 * Face Inset (Individual).
2468 *
2469 * Insets individual faces.
2470 */
2472 "inset_individual",
2473 /*slot_types_in*/
2474 {
2475 /* Input faces. */
2476 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2477 /* Thickness. */
2478 {"thickness", BMO_OP_SLOT_FLT},
2479 /* Depth. */
2480 {"depth", BMO_OP_SLOT_FLT},
2481 /* Scale the offset to give more even thickness. */
2482 {"use_even_offset", BMO_OP_SLOT_BOOL},
2483 /* Blend face data across the inset. */
2484 {"use_interpolate", BMO_OP_SLOT_BOOL},
2485 /* Scale the offset by surrounding geometry. */
2486 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2487 {{'\0'}},
2488 },
2489 /*slot_types_out*/
2490 {
2491 /* Output faces. */
2492 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2493 {{'\0'}},
2494 },
2495 /*init*/ nullptr,
2497 /* Caller needs to handle BMO_OPTYPE_FLAG_SELECT_FLUSH. */
2499};
2500
2501/*
2502 * Face Inset (Regions).
2503 *
2504 * Inset or outset face regions.
2505 */
2507 "inset_region",
2508 /*slot_types_in*/
2509 {
2510 /* Input faces. */
2511 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2512 /* Input faces to explicitly exclude from inset. */
2513 {"faces_exclude", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2514 /* Inset face boundaries. */
2515 {"use_boundary", BMO_OP_SLOT_BOOL},
2516 /* Scale the offset to give more even thickness. */
2517 {"use_even_offset", BMO_OP_SLOT_BOOL},
2518 /* Blend face data across the inset. */
2519 {"use_interpolate", BMO_OP_SLOT_BOOL},
2520 /* Scale the offset by surrounding geometry. */
2521 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2522 /* Inset the region along existing edges. */
2523 {"use_edge_rail", BMO_OP_SLOT_BOOL},
2524 /* Thickness. */
2525 {"thickness", BMO_OP_SLOT_FLT},
2526 /* Depth. */
2527 {"depth", BMO_OP_SLOT_FLT},
2528 /* Outset rather than inset. */
2529 {"use_outset", BMO_OP_SLOT_BOOL},
2530 {{'\0'}},
2531 },
2532 /*slot_types_out*/
2533 {
2534 /* Output faces. */
2535 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2536 {{'\0'}},
2537 },
2538 /*init*/ nullptr,
2539 /*exec*/ bmo_inset_region_exec,
2541};
2542
2543/*
2544 * Edge-loop Offset.
2545 *
2546 * Creates edge loops based on simple edge-outset method.
2547 */
2549 "offset_edgeloops",
2550 /*slot_types_in*/
2551 {
2552 /* Input edges. */
2553 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2554 /* Extend loop around end-points. */
2555 {"use_cap_endpoint", BMO_OP_SLOT_BOOL},
2556 {{'\0'}},
2557 },
2558 /*slot_types_out*/
2559 {
2560 /* Output edges. */
2561 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
2562 {{'\0'}},
2563 },
2564 /*init*/ nullptr,
2567};
2568
2569/*
2570 * Wire Frame.
2571 *
2572 * Makes a wire-frame copy of faces.
2573 */
2575 "wireframe",
2576 /*slot_types_in*/
2577 {
2578 /* Input faces. */
2579 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2580 /* Thickness. */
2581 {"thickness", BMO_OP_SLOT_FLT},
2582 /* Offset the thickness from the center. */
2583 {"offset", BMO_OP_SLOT_FLT},
2584 /* Remove original geometry. */
2585 {"use_replace", BMO_OP_SLOT_BOOL},
2586 /* Inset face boundaries. */
2587 {"use_boundary", BMO_OP_SLOT_BOOL},
2588 /* Scale the offset to give more even thickness. */
2589 {"use_even_offset", BMO_OP_SLOT_BOOL},
2590 /* Crease hub edges for improved subdivision surface. */
2591 {"use_crease", BMO_OP_SLOT_BOOL},
2592 /* The mean crease weight for resulting edges. */
2593 {"crease_weight", BMO_OP_SLOT_FLT},
2594 /* Scale the offset by surrounding geometry. */
2595 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2596 /* Offset material index of generated faces. */
2597 {"material_offset", BMO_OP_SLOT_INT},
2598 {{'\0'}},
2599 },
2600 /*slot_types_out*/
2601 {
2602 /* Output faces. */
2603 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2604 {{'\0'}},
2605 },
2606 /*init*/ nullptr,
2607 /*exec*/ bmo_wireframe_exec,
2610};
2611
2613 {BMOP_POKE_MEDIAN_WEIGHTED, "MEAN_WEIGHTED"},
2614 {BMOP_POKE_MEDIAN, "MEAN"},
2615 {BMOP_POKE_BOUNDS, "BOUNDS"},
2616 {0, nullptr},
2617};
2618
2619/*
2620 * Pokes a face.
2621 *
2622 * Splits a face into a triangle fan.
2623 */
2625 "poke",
2626 /*slot_types_in*/
2627 {
2628 /* Input faces. */
2629 {"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2630 /* Center vertex offset along normal. */
2631 {"offset", BMO_OP_SLOT_FLT},
2632 /* Calculation mode for center vertex. */
2633 {"center_mode",
2637 /* Apply offset. */
2638 {"use_relative_offset", BMO_OP_SLOT_BOOL},
2639 {{'\0'}},
2640 },
2641 /*slot_types_out*/
2642 {
2643 /* Output verts. */
2644 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
2645 /* Output faces. */
2646 {"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
2647 {{'\0'}},
2648 },
2649 /*init*/ nullptr,
2650 /*exec*/ bmo_poke_exec,
2653};
2654
2655#ifdef WITH_BULLET
2656/*
2657 * Convex Hull
2658 *
2659 * Builds a convex hull from the vertices in 'input'.
2660 *
2661 * If 'use_existing_faces' is true, the hull will not output triangles
2662 * that are covered by a pre-existing face.
2663 *
2664 * All hull vertices, faces, and edges are added to 'geom.out'. Any
2665 * input elements that end up inside the hull (i.e. are not used by an
2666 * output face) are added to the 'interior_geom' slot. The
2667 * 'unused_geom' slot will contain all interior geometry that is
2668 * completely unused. Lastly, 'holes_geom' contains edges and faces
2669 * that were in the input and are part of the hull.
2670 */
2671static BMOpDefine bmo_convex_hull_def = {
2672 "convex_hull",
2673 /*slot_types_in*/
2674 {
2675 /* Input geometry. */
2677 /* Skip hull triangles that are covered by a pre-existing face. */
2678 {"use_existing_faces", BMO_OP_SLOT_BOOL},
2679 {{'\0'}},
2680 },
2681 /*slot_types_out*/
2682 {
2683 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2684 {"geom_interior.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2685 {"geom_unused.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2686 {"geom_holes.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2687 {{'\0'}},
2688 },
2689 /*init*/ nullptr,
2690 /*exec*/ bmo_convex_hull_exec,
2693};
2694#endif
2695
2696/*
2697 * Symmetrize.
2698 *
2699 * Makes the mesh elements in the "input" slot symmetrical. Unlike
2700 * normal mirroring, it only copies in one direction, as specified by
2701 * the "direction" slot. The edges and faces that cross the plane of
2702 * symmetry are split as needed to enforce symmetry.
2703 *
2704 * All new vertices, edges, and faces are added to the "geom.out" slot.
2705 */
2707 "symmetrize",
2708 /*slot_types_in*/
2709 {
2710 /* Input geometry. */
2712 /* Axis to use. */
2713 {"direction",
2717 /* Minimum distance. */
2718 {"dist", BMO_OP_SLOT_FLT},
2719 /* Transform shape keys too. */
2720 {"use_shapekey", BMO_OP_SLOT_BOOL},
2721 {{'\0'}},
2722 },
2723 /*slot_types_out*/
2724 {
2725 {"geom.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
2726 {{'\0'}},
2727 },
2728 /*init*/ nullptr,
2729 /*exec*/ bmo_symmetrize_exec,
2732};
2733
2734#undef BM_FACE
2735#undef BM_EDGE
2736#undef BM_VERT
2737
2752#ifdef WITH_BULLET
2753 &bmo_convex_hull_def,
2754#endif
2791 &bmo_poke_def,
2807 &bmo_spin_def,
2821};
2822
#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_AMT_WIDTH
@ BEVEL_AMT_ABSOLUTE
@ BEVEL_AMT_PERCENT
@ BEVEL_AMT_OFFSET
@ BEVEL_AMT_DEPTH
@ BEVEL_VMESH_ADJ
@ BEVEL_VMESH_CUTOFF
@ SUBD_FALLOFF_SHARP
@ SUBD_FALLOFF_SMOOTH
@ SUBD_FALLOFF_INVSQUARE
@ SUBD_FALLOFF_SPHERE
@ SUBD_FALLOFF_LIN
@ SUBD_FALLOFF_ROOT
@ SUBD_RING_INTERP_SURF
@ SUBD_RING_INTERP_PATH
@ SUBD_RING_INTERP_LINEAR
@ BEVEL_PROFILE_SUPERELLIPSE
@ BEVEL_PROFILE_CUSTOM
@ BEVEL_MITER_PATCH
@ BEVEL_MITER_SHARP
@ BEVEL_MITER_ARC
@ BEVEL_AFFECT_VERTICES
@ BEVEL_AFFECT_EDGES
@ BMOP_POKE_MEDIAN_WEIGHTED
@ BMOP_POKE_BOUNDS
@ BMOP_POKE_MEDIAN
@ SUBD_CORNER_FAN
@ SUBD_CORNER_STRAIGHT_CUT
@ SUBD_CORNER_PATH
@ SUBD_CORNER_INNERVERT
@ BEVEL_FACE_STRENGTH_NONE
@ BEVEL_FACE_STRENGTH_AFFECTED
@ BEVEL_FACE_STRENGTH_NEW
@ BEVEL_FACE_STRENGTH_ALL
void bmo_rotate_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:115
void bmo_region_extend_exec(BMesh *bm, BMOperator *op)
Definition bmo_utils.cc:381
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:563
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:151
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:708
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:604
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:477
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:71
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:399
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:92
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:136
void bmo_weld_verts_exec(BMesh *bm, BMOperator *op)
eBMOpSlotSubType_Ptr ptr
eBMOpSlotSubType_Int intg
eBMOpSlotSubType_Map map
PointerRNA * ptr
Definition wm_files.cc:4226