extrude handles active face, and operators now properly restore unmodified mesh on...
[blender.git] / source / blender / bmesh / intern / bmesh_opdefines.c
1 #include "bmesh.h"
2 #include "bmesh_private.h"
3
4 #include <stdio.h>
5
6 BMOpDefine def_makevert = {
7         "makevert",
8         {{BMOP_OPSLOT_VEC, "co"},
9         {BMOP_OPSLOT_ELEMENT_BUF, "newvertout"},
10         {0, /*null-terminating sentinel*/}},
11         bmesh_makevert_exec,
12         0,
13 };
14
15 /*contextual_create is fkey, it creates
16   new faces, makes stuff from edge nets,
17   makes wire edges, etc.  it also dissolves
18   faces.*/
19 BMOpDefine def_contextual_create= {
20         "contextual_create",
21         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
22          {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
23          {0, /*null-terminating sentinel*/}},
24         bmesh_contextual_create_exec,
25         0,
26 };
27
28 BMOpDefine def_edgenet_fill= {
29         "edgenet_fill",
30         {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
31          {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
32         {0, /*null-terminating sentinel*/}},
33         bmesh_edgenet_fill_exec,
34         0,
35 };
36
37 BMOpDefine def_rotate = {
38         "rotate",
39         {{BMOP_OPSLOT_VEC, "cent"},
40          {BMOP_OPSLOT_MAT, "mat"},
41         {BMOP_OPSLOT_ELEMENT_BUF, "verts"},
42         {0, /*null-terminating sentinel*/}},
43         bmesh_rotate_exec,
44         0,
45 };
46
47 BMOpDefine def_translate= {
48         "translate",
49         {{BMOP_OPSLOT_VEC, "vec"},
50         {BMOP_OPSLOT_ELEMENT_BUF, "verts"},
51         {0, /*null-terminating sentinel*/}},
52         bmesh_translate_exec,
53         0,
54 };
55
56
57 /*applies a transform to vertices*/
58 BMOpDefine def_transform = {
59         "transform",
60         {{BMOP_OPSLOT_MAT, "mat"},
61         {BMOP_OPSLOT_ELEMENT_BUF, "verts"},
62         {0, /*null-terminating sentinel*/}},
63         bmesh_transform_exec,
64         0,
65 };
66
67 /*loads a bmesh into an object*/
68 BMOpDefine def_object_load_bmesh = {
69         "object_load_bmesh",
70         {{BMOP_OPSLOT_PNT, "scene"},
71         {BMOP_OPSLOT_PNT, "object"},
72         {0, /*null-terminating sentinel*/}},
73         bmesh_to_mesh_exec,
74         0,
75 };
76
77
78 BMOpDefine def_mesh_to_bmesh = {
79         "mesh_to_bmesh",
80         {{BMOP_OPSLOT_PNT, "mesh"},
81          {0, /*null-terminating sentinel*/}},
82         mesh_to_bmesh_exec,
83         0
84 };
85
86 BMOpDefine def_extrudeverts_indiv = {
87         "extrude_vert_indiv",
88         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
89         {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"},
90         {BMOP_OPSLOT_ELEMENT_BUF, "vertout"},
91         {0} /*null-terminating sentinel*/},
92         extrude_vert_indiv_exec,
93         0
94 };
95
96 #if 0
97 BMOpDefine def_makeprim = {
98         "makeprim",
99         {{BMOP_OPSLOT_INT, "type"},
100         {BMOP_OPSLOT_INT, "tot", /*rows/cols also applies to spheres*/
101         {BMOP_OPSLOT_INT, "seg",
102         {BMOP_OPSLOT_INT, "subdiv"},
103         {BMOP_OPSLOT_INT, "ext"},
104         {BMOP_OPSLOT_INT, "fill"},
105         {BMOP_OPSLOT_FLT, "dia"},
106         {BMOP_OPSLOT_FLT, "depth"},
107         {BMOP_OPSLOT_PNT, "mat"},
108         {BMOP_OPSLOT_ELEMENT_BUF, "geomout"}, //won't be implemented right away
109         {0}}
110         makeprim_exec,
111         0
112 };
113 #endif
114
115 BMOpDefine def_connectverts = {
116         "connectverts",
117         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
118         {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"},
119         {0} /*null-terminating sentinel*/},
120         connectverts_exec,
121         0
122 };
123
124 BMOpDefine def_extrudefaceregion = {
125         "extrudefaceregion",
126         {{BMOP_OPSLOT_ELEMENT_BUF, "edgefacein"},
127         {BMOP_OPSLOT_MAPPING, "exclude"},
128         {BMOP_OPSLOT_ELEMENT_BUF, "geomout"},
129         {0} /*null-terminating sentinel*/},
130         extrude_edge_context_exec,
131         0
132 };
133
134 BMOpDefine def_makefgonsop = {
135         "makefgon",
136         {{BMOP_OPSLOT_INT, "trifan"}, /*use triangle fans instead of 
137                                         real interpolation*/
138          {0} /*null-terminating sentinel*/},
139         bmesh_make_fgons_exec,
140         0
141 };
142
143 BMOpDefine def_dissolvevertsop = {
144         "dissolveverts",
145         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
146         {0} /*null-terminating sentinel*/},
147         dissolveverts_exec,
148         0
149 };
150
151 BMOpDefine def_dissolveedgessop = {
152         "dissolveedges",
153         {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
154         {BMOP_OPSLOT_ELEMENT_BUF, "regionout"},
155         {0} /*null-terminating sentinel*/},
156         dissolveedges_exec,
157         0
158 };
159
160 BMOpDefine def_dissolvefacesop = {
161         "dissolvefaces",
162         {{BMOP_OPSLOT_ELEMENT_BUF, "faces"},
163         {BMOP_OPSLOT_ELEMENT_BUF, "regionout"},
164         {0} /*null-terminating sentinel*/},
165         dissolvefaces_exec,
166         0
167 };
168
169
170 BMOpDefine def_triangop = {
171         "triangulate",
172         {{BMOP_OPSLOT_ELEMENT_BUF, "faces"},
173         {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"},
174         {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
175         {BMOP_OPSLOT_MAPPING, "facemap"},
176         {0} /*null-terminating sentinel*/},
177         triangulate_exec,
178         0
179 };
180
181 BMOpDefine def_subdop = {
182         "esubd",
183         {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
184         {BMOP_OPSLOT_INT, "numcuts"},
185         {BMOP_OPSLOT_INT, "flag"},
186         {BMOP_OPSLOT_FLT, "radius"},
187         {BMOP_OPSLOT_MAPPING, "custompatterns"},
188         {BMOP_OPSLOT_MAPPING, "edgepercents"},
189         
190         /*these next two can have multiple types of elements in them.*/
191         {BMOP_OPSLOT_ELEMENT_BUF, "outinner"},
192         {BMOP_OPSLOT_ELEMENT_BUF, "outsplit"},
193         {0} /*null-terminating sentinel*/,
194         },
195         esubdivide_exec,
196         0
197 };
198
199 BMOpDefine def_edit2bmesh = {
200         "editmesh_to_bmesh",
201         {{BMOP_OPSLOT_PNT, "em"}, {BMOP_OPSLOT_MAPPING, "map"},
202         {0} /*null-terminating sentinel*/},
203         edit2bmesh_exec,
204         0
205 };
206
207 BMOpDefine def_bmesh2edit = {
208         "bmesh_to_editmesh",
209         {{BMOP_OPSLOT_PNT, "emout"},
210         {0} /*null-terminating sentinel*/},
211         bmesh2edit_exec,
212         0
213 };
214
215 BMOpDefine def_delop = {
216         "del",
217         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"}, {BMOP_OPSLOT_INT, "context"},
218         {0} /*null-terminating sentinel*/},
219         delop_exec,
220         0
221 };
222
223 BMOpDefine def_dupeop = {
224         "dupe",
225         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
226         {BMOP_OPSLOT_ELEMENT_BUF, "origout"},
227         {BMOP_OPSLOT_ELEMENT_BUF, "newout"},
228         /*facemap maps from source faces to dupe
229           faces, and from dupe faces to source faces.*/
230         {BMOP_OPSLOT_MAPPING, "facemap"},
231         {BMOP_OPSLOT_MAPPING, "boundarymap"},
232         {BMOP_OPSLOT_MAPPING, "isovertmap"},
233         {0} /*null-terminating sentinel*/},
234         dupeop_exec,
235         0
236 };
237
238 BMOpDefine def_splitop = {
239         "split",
240         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
241         {BMOP_OPSLOT_ELEMENT_BUF, "geomout"},
242         {BMOP_OPSLOT_MAPPING, "boundarymap"},
243         {BMOP_OPSLOT_MAPPING, "isovertmap"},
244         {0} /*null-terminating sentinel*/},
245         splitop_exec,
246         0
247 };
248
249 BMOpDefine *opdefines[] = {
250         &def_splitop,
251         &def_dupeop,
252         &def_delop,
253         &def_edit2bmesh,
254         &def_bmesh2edit,
255         &def_subdop,
256         &def_triangop,
257         &def_dissolvefacesop,
258         &def_dissolveedgessop,
259         &def_dissolvevertsop,
260         &def_makefgonsop,
261         &def_extrudefaceregion,
262         &def_connectverts,
263         //&def_makeprim,
264         &def_extrudeverts_indiv,
265         &def_mesh_to_bmesh,
266         &def_object_load_bmesh,
267         &def_transform,
268         &def_translate,
269         &def_rotate,
270         &def_edgenet_fill,
271         &def_contextual_create,
272         &def_makevert,
273 };
274
275 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));