pre-merge commit. the mirror modifier is currently in pieces, to be picked back...
[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 /*do not rename any operator or slot names! otherwise you must go 
7   through the code and find all references to them!*/
8
9 BMOpDefine def_finddoubles = {
10         "finddoubles",
11         /*maps welded vertices to verts they should weld to.*/
12         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
13          //list of verts to keep
14          {BMOP_OPSLOT_ELEMENT_BUF, "keepverts"},
15          {BMOP_OPSLOT_FLT,         "dist"},
16          {BMOP_OPSLOT_MAPPING, "targetmapout"},
17          {0, /*null-terminating sentinel*/}},
18         bmesh_finddoubles_exec,
19         0,
20 };
21
22 BMOpDefine def_removedoubles = {
23         "removedoubles",
24         /*maps welded vertices to verts they should weld to.*/
25         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
26          {BMOP_OPSLOT_FLT,         "dist"},
27          {0, /*null-terminating sentinel*/}},
28         bmesh_removedoubles_exec,
29         0,
30 };
31
32 BMOpDefine def_weldverts = {
33         "weldverts",
34         /*maps welded vertices to verts they should weld to.*/
35         {{BMOP_OPSLOT_MAPPING, "targetmap"},
36          {0, /*null-terminating sentinel*/}},
37         bmesh_weldverts_exec,
38         0,
39 };
40
41 BMOpDefine def_makevert = {
42         "makevert",
43         {{BMOP_OPSLOT_VEC, "co"},
44         {BMOP_OPSLOT_ELEMENT_BUF, "newvertout"},
45         {0, /*null-terminating sentinel*/}},
46         bmesh_makevert_exec,
47         0,
48 };
49
50 /*contextual_create is fkey, it creates
51   new faces, makes stuff from edge nets,
52   makes wire edges, etc.  it also dissolves
53   faces.*/
54 BMOpDefine def_contextual_create= {
55         "contextual_create",
56         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
57          {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
58          {0, /*null-terminating sentinel*/}},
59         bmesh_contextual_create_exec,
60         0,
61 };
62
63 BMOpDefine def_edgenet_fill= {
64         "edgenet_fill",
65         {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
66          {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
67         {0, /*null-terminating sentinel*/}},
68         bmesh_edgenet_fill_exec,
69         0,
70 };
71
72 BMOpDefine def_rotate = {
73         "rotate",
74         {{BMOP_OPSLOT_VEC, "cent"},
75          {BMOP_OPSLOT_MAT, "mat"},
76         {BMOP_OPSLOT_ELEMENT_BUF, "verts"},
77         {0, /*null-terminating sentinel*/}},
78         bmesh_rotate_exec,
79         0,
80 };
81
82 BMOpDefine def_translate= {
83         "translate",
84         {{BMOP_OPSLOT_VEC, "vec"},
85         {BMOP_OPSLOT_ELEMENT_BUF, "verts"},
86         {0, /*null-terminating sentinel*/}},
87         bmesh_translate_exec,
88         0,
89 };
90
91
92 /*applies a transform to vertices*/
93 BMOpDefine def_transform = {
94         "transform",
95         {{BMOP_OPSLOT_MAT, "mat"},
96         {BMOP_OPSLOT_ELEMENT_BUF, "verts"},
97         {0, /*null-terminating sentinel*/}},
98         bmesh_transform_exec,
99         0,
100 };
101
102 /*loads a bmesh into an object*/
103 BMOpDefine def_object_load_bmesh = {
104         "object_load_bmesh",
105         {{BMOP_OPSLOT_PNT, "scene"},
106         {BMOP_OPSLOT_PNT, "object"},
107         {0, /*null-terminating sentinel*/}},
108         bmesh_to_mesh_exec,
109         0,
110 };
111
112
113 BMOpDefine def_mesh_to_bmesh = {
114         "mesh_to_bmesh",
115         {{BMOP_OPSLOT_PNT, "mesh"},
116          {0, /*null-terminating sentinel*/}},
117         mesh_to_bmesh_exec,
118         0
119 };
120
121 BMOpDefine def_extrudeverts_indiv = {
122         "extrude_vert_indiv",
123         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
124         {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"},
125         {BMOP_OPSLOT_ELEMENT_BUF, "vertout"},
126         {0} /*null-terminating sentinel*/},
127         extrude_vert_indiv_exec,
128         0
129 };
130
131 #if 0
132 BMOpDefine def_makeprim = {
133         "makeprim",
134         {{BMOP_OPSLOT_INT, "type"},
135         {BMOP_OPSLOT_INT, "tot", /*rows/cols also applies to spheres*/
136         {BMOP_OPSLOT_INT, "seg",
137         {BMOP_OPSLOT_INT, "subdiv"},
138         {BMOP_OPSLOT_INT, "ext"},
139         {BMOP_OPSLOT_INT, "fill"},
140         {BMOP_OPSLOT_FLT, "dia"},
141         {BMOP_OPSLOT_FLT, "depth"},
142         {BMOP_OPSLOT_PNT, "mat"},
143         {BMOP_OPSLOT_ELEMENT_BUF, "geomout"}, //won't be implemented right away
144         {0}}
145         makeprim_exec,
146         0
147 };
148 #endif
149
150 BMOpDefine def_connectverts = {
151         "connectverts",
152         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
153         {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"},
154         {0} /*null-terminating sentinel*/},
155         connectverts_exec,
156         0
157 };
158
159 BMOpDefine def_extrudefaceregion = {
160         "extrudefaceregion",
161         {{BMOP_OPSLOT_ELEMENT_BUF, "edgefacein"},
162         {BMOP_OPSLOT_MAPPING, "exclude"},
163         {BMOP_OPSLOT_ELEMENT_BUF, "geomout"},
164         {0} /*null-terminating sentinel*/},
165         extrude_edge_context_exec,
166         0
167 };
168
169 BMOpDefine def_makefgonsop = {
170         "makefgon",
171         {{BMOP_OPSLOT_INT, "trifan"}, /*use triangle fans instead of 
172                                         real interpolation*/
173          {0} /*null-terminating sentinel*/},
174         bmesh_make_fgons_exec,
175         0
176 };
177
178 BMOpDefine def_dissolvevertsop = {
179         "dissolveverts",
180         {{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
181         {0} /*null-terminating sentinel*/},
182         dissolveverts_exec,
183         0
184 };
185
186 BMOpDefine def_dissolveedgessop = {
187         "dissolveedges",
188         {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
189         {BMOP_OPSLOT_ELEMENT_BUF, "regionout"},
190         {0} /*null-terminating sentinel*/},
191         dissolveedges_exec,
192         0
193 };
194
195 BMOpDefine def_dissolveedgeloopsop = {
196         "dissolveedgeloop",
197         {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
198         {BMOP_OPSLOT_ELEMENT_BUF, "regionout"},
199         {0} /*null-terminating sentinel*/},
200         dissolve_edgeloop_exec,
201         0
202 };
203
204 BMOpDefine def_dissolvefacesop = {
205         "dissolvefaces",
206         {{BMOP_OPSLOT_ELEMENT_BUF, "faces"},
207         {BMOP_OPSLOT_ELEMENT_BUF, "regionout"},
208         {0} /*null-terminating sentinel*/},
209         dissolvefaces_exec,
210         0
211 };
212
213
214 BMOpDefine def_triangop = {
215         "triangulate",
216         {{BMOP_OPSLOT_ELEMENT_BUF, "faces"},
217         {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"},
218         {BMOP_OPSLOT_ELEMENT_BUF, "faceout"},
219         {BMOP_OPSLOT_MAPPING, "facemap"},
220         {0} /*null-terminating sentinel*/},
221         triangulate_exec,
222         0
223 };
224
225 BMOpDefine def_subdop = {
226         "esubd",
227         {{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
228         {BMOP_OPSLOT_INT, "numcuts"},
229         {BMOP_OPSLOT_INT, "flag"},
230         {BMOP_OPSLOT_FLT, "radius"},
231         {BMOP_OPSLOT_MAPPING, "custompatterns"},
232         {BMOP_OPSLOT_MAPPING, "edgepercents"},
233         
234         /*these next two can have multiple types of elements in them.*/
235         {BMOP_OPSLOT_ELEMENT_BUF, "outinner"},
236         {BMOP_OPSLOT_ELEMENT_BUF, "outsplit"},
237         {0} /*null-terminating sentinel*/,
238         },
239         esubdivide_exec,
240         0
241 };
242
243 BMOpDefine def_edit2bmesh = {
244         "editmesh_to_bmesh",
245         {{BMOP_OPSLOT_PNT, "em"}, {BMOP_OPSLOT_MAPPING, "map"},
246         {0} /*null-terminating sentinel*/},
247         edit2bmesh_exec,
248         0
249 };
250
251 BMOpDefine def_bmesh2edit = {
252         "bmesh_to_editmesh",
253         {{BMOP_OPSLOT_PNT, "emout"},
254         {0} /*null-terminating sentinel*/},
255         bmesh2edit_exec,
256         0
257 };
258
259 BMOpDefine def_delop = {
260         "del",
261         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"}, {BMOP_OPSLOT_INT, "context"},
262         {0} /*null-terminating sentinel*/},
263         delop_exec,
264         0
265 };
266
267 BMOpDefine def_dupeop = {
268         "dupe",
269         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
270         {BMOP_OPSLOT_ELEMENT_BUF, "origout"},
271         {BMOP_OPSLOT_ELEMENT_BUF, "newout"},
272         /*facemap maps from source faces to dupe
273           faces, and from dupe faces to source faces.*/
274         {BMOP_OPSLOT_MAPPING, "facemap"},
275         {BMOP_OPSLOT_MAPPING, "boundarymap"},
276         {BMOP_OPSLOT_MAPPING, "isovertmap"},
277         {0} /*null-terminating sentinel*/},
278         dupeop_exec,
279         0
280 };
281
282 BMOpDefine def_splitop = {
283         "split",
284         {{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
285         {BMOP_OPSLOT_ELEMENT_BUF, "geomout"},
286         {BMOP_OPSLOT_MAPPING, "boundarymap"},
287         {BMOP_OPSLOT_MAPPING, "isovertmap"},
288         {0} /*null-terminating sentinel*/},
289         splitop_exec,
290         0
291 };
292
293 BMOpDefine *opdefines[] = {
294         &def_splitop,
295         &def_dupeop,
296         &def_delop,
297         &def_edit2bmesh,
298         &def_bmesh2edit,
299         &def_subdop,
300         &def_triangop,
301         &def_dissolvefacesop,
302         &def_dissolveedgessop,
303         &def_dissolveedgeloopsop,
304         &def_dissolvevertsop,
305         &def_makefgonsop,
306         &def_extrudefaceregion,
307         &def_connectverts,
308         //&def_makeprim,
309         &def_extrudeverts_indiv,
310         &def_mesh_to_bmesh,
311         &def_object_load_bmesh,
312         &def_transform,
313         &def_translate,
314         &def_rotate,
315         &def_edgenet_fill,
316         &def_contextual_create,
317         &def_makevert,
318         &def_weldverts,
319         &def_removedoubles,
320         &def_finddoubles,
321 };
322
323 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));