coded little vert connect tool. connects selected verts within the same face. curre...
[blender.git] / source / blender / bmesh / bmesh_operators.h
1 #ifndef BM_OPERATORS_H
2 #define BM_OPERATORS_H
3
4 #include "BLI_memarena.h"
5 #include "BLI_ghash.h"
6
7 #define BMOP_OPSLOT_INT                 0
8 #define BMOP_OPSLOT_FLT                 1
9 #define BMOP_OPSLOT_PNT                 2
10 #define BMOP_OPSLOT_VEC                 6
11
12 /*after BMOP_OPSLOT_VEC, everything is 
13   dynamically allocated arrays.  we
14   leave a space in the identifiers
15   for future growth.*/
16 #define BMOP_OPSLOT_PNT_BUF             7
17
18 #define BMOP_OPSLOT_MAPPING             8
19 #define BMOP_OPSLOT_TYPES               9
20
21 typedef struct BMOpSlot{
22         int slottype;
23         int len;
24         int flag;
25         int index; /*index within slot array*/
26         union {
27                 int i;
28                 float f;                                        
29                 void *p;                                        
30                 float vec[3];                           /*vector*/
31                 void *buf;                              /*buffer*/
32                 GHash *ghash;
33         } data;
34 }BMOpSlot;
35
36 /*BMOpSlot->flag*/
37 /*is a dynamically-allocated array.  set at runtime.*/
38 #define BMOS_DYNAMIC_ARRAY      1
39
40 /*operators represent logical, executable mesh modules.*/
41 #define BMOP_MAX_SLOTS                  16              /*way more than probably needed*/
42
43 typedef struct BMOperator{
44         int type;
45         int slottype;
46         int needflag;
47         struct BMOpSlot slots[BMOP_MAX_SLOTS];
48         void (*exec)(struct BMesh *bm, struct BMOperator *op);
49         MemArena *arena;
50 }BMOperator;
51
52 /*need to refactor code to use this*/
53 typedef struct BMOpDefine {
54         int slottypes[BMOP_MAX_SLOTS];
55         void (*exec)(BMesh *bm, BMOperator *op);
56         int totslot;
57         int flag;
58 } BMOpDefine;
59
60 /*BMOpDefine->flag*/
61 //doesn't do anything at the moment.
62
63 /*API for operators*/
64
65 /*data types that use pointers (arrays, etc) should never
66   have it set directly.  and never use BMO_Set_Pnt to
67   pass in a list of edges or any arrays, really.*/
68 void BMO_Init_Op(struct BMOperator *op, int opcode);
69 void BMO_Exec_Op(struct BMesh *bm, struct BMOperator *op);
70 void BMO_Finish_Op(struct BMesh *bm, struct BMOperator *op);
71 BMOpSlot *BMO_GetSlot(struct BMOperator *op, int slotcode);
72 void BMO_CopySlot(struct BMOperator *source_op, struct BMOperator *dest_op, int src, int dst);
73 void BMO_Set_Float(struct BMOperator *op, int slotcode, float f);
74 void BMO_Set_Int(struct BMOperator *op, int slotcode, int i);
75 void BMO_Set_Pnt(struct BMOperator *op, int slotcode, void *p);
76 void BMO_Set_Vec(struct BMOperator *op, int slotcode, float *vec);
77 void BMO_SetFlag(struct BMesh *bm, void *element, int flag);
78 void BMO_ClearFlag(struct BMesh *bm, void *element, int flag);
79 int BMO_TestFlag(struct BMesh *bm, void *element, int flag);
80 int BMO_CountFlag(struct BMesh *bm, int flag, int type);
81 void BMO_Flag_To_Slot(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag, int type);
82 void BMO_Flag_Buffer(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag);
83 void BMO_Unflag_Buffer(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag);
84 void BMO_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag, int type);
85 int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, int slotcode);
86
87 /*copies data, doesn't store a reference to it.*/
88 void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, int slotcode, 
89                         void *element, void *data, int len);
90 void BMO_Insert_MapFloat(BMesh *bm, BMOperator *op, int slotcode, 
91                         void *element, float val);
92
93 //returns 1 if the specified element is in the map.
94 int BMO_InMap(BMesh *bm, BMOperator *op, int slotcode, void *element);
95 void *BMO_Get_MapData(BMesh *bm, BMOperator *op, int slotcode,
96                       void *element);
97 float BMO_Get_MapFloat(BMesh *bm, BMOperator *op, int slotcode,
98                        void *element);
99 void BMO_Mapping_To_Flag(struct BMesh *bm, struct BMOperator *op, 
100                          int slotcode, int flag);
101
102 /*do NOT use these for non-operator-api-allocated memory! instead
103   use BMO_Get_MapData, which copies the data.*/
104 void BMO_Insert_MapPointer(BMesh *bm, BMOperator *op, int slotcode, 
105                         void *element, void *val);
106 void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, int slotcode,
107                        void *element);
108
109 struct GHashIterator;
110 typedef struct BMOIter {
111         BMOpSlot *slot;
112         int cur; //for arrays
113         struct GHashIterator giter;
114         void *val;
115 } BMOIter;
116
117 void *BMO_IterNew(BMOIter *iter, BMesh *bm, BMOperator *op, 
118                   int slotcode);
119 void *BMO_IterStep(BMOIter *iter);
120
121 /*returns a pointer to the key value when iterating over mappings.
122   remember for pointer maps this will be a pointer to a pointer.*/
123 void *BMO_IterMapVal(BMOIter *iter);
124
125 /*----------- bmop error system ----------*/
126
127 /*pushes an error onto the bmesh error stack.
128   if msg is null, then the default message for the errorcode is used.*/
129 void BMO_RaiseError(BMesh *bm, BMOperator *owner, int errcode, char *msg);
130
131 /*gets the topmost error from the stack.
132   returns error code or 0 if no error.*/
133 int BMO_GetError(BMesh *bm, char **msg, BMOperator **op);
134
135 /*same as geterror, only pops the error off the stack as well*/
136 int BMO_PopError(BMesh *bm, char **msg, BMOperator **op);
137 void BMO_ClearStack(BMesh *bm);
138
139 #if 0
140 //this is meant for handling errors, like self-intersection test failures.
141 //it's dangerous to handle errors in general though, so disabled for now.
142
143 /*catches an error raised by the op pointed to by catchop.
144   errorcode is either the errorcode, or BMERR_ALL for any 
145   error.*/
146 int BMO_CatchOpError(BMesh *bm, BMOperator *catchop, int errorcode, char **msg);
147 #endif
148
149 /*------ error code defines -------*/
150
151 /*error messages*/
152 #define BMERR_SELF_INTERSECTING                 1
153 #define BMERR_DISSOLVEDISK_FAILED               2
154 #define BMERR_CONNECTVERT_FAILED                3
155
156 static char *bmop_error_messages[] = {
157        0,
158        "Self intersection error",
159        "Could not dissolve vert",
160        "Could not connect verts",
161 };
162
163 /*------------begin operator defines (see bmesh_opdefines.c too)------------*/
164 /*split op*/
165 #define BMOP_SPLIT                              0
166
167 enum {
168         BMOP_SPLIT_MULTIN,
169         BMOP_SPLIT_MULTOUT,
170         BMOP_SPLIT_BOUNDS_EDGEMAP, //bounding edges of split faces
171         BMOP_SPLIT_TOTSLOT,
172 };
173
174 /*dupe op*/
175 #define BMOP_DUPE       1
176
177 enum {
178         BMOP_DUPE_MULTIN,
179         BMOP_DUPE_ORIG,
180         BMOP_DUPE_NEW,
181         /*we need a map for verts duplicated not connected
182           to any faces, too.*/  
183         BMOP_DUPE_BOUNDS_EDGEMAP,
184         BMOP_DUPE_TOTSLOT
185 };
186
187 /*delete op*/
188 #define BMOP_DEL        2
189
190 enum {
191         BMOP_DEL_MULTIN,
192         BMOP_DEL_CONTEXT,
193         BMOP_DEL_TOTSLOT,
194 };
195
196 #define DEL_VERTS               1
197 #define DEL_EDGES               2
198 #define DEL_ONLYFACES   3
199 #define DEL_EDGESFACES  4
200 #define DEL_FACES               5
201 #define DEL_ALL                 6
202 #define DEL_ONLYTAGGED          7
203
204 /*BMOP_DEL_CONTEXT*/
205 enum {
206         BMOP_DEL_VERTS = 1,
207         BMOP_DEL_EDGESFACES,
208         BMOP_DEL_ONLYFACES,
209         BMOP_DEL_FACES,
210         BMOP_DEL_ALL,
211 };
212
213 /*editmesh->bmesh op*/
214 #define BMOP_FROM_EDITMESH              3
215 enum {
216         BMOP_FROM_EDITMESH_EM,
217         BMOP_FROM_EDITMESH_TOTSLOT,
218 };
219
220 #define BMOP_TO_EDITMESH                4
221 /*bmesh->editmesh op*/
222 enum {
223         BMOP_TO_EDITMESH_EMOUT,
224         BMOP_TO_EDITMESH_TOTSLOT,
225 };
226
227 /*edge subdivide op*/
228 #define BMOP_ESUBDIVIDE                 5
229 enum {
230         BMOP_ESUBDIVIDE_EDGES,
231         BMOP_ESUBDIVIDE_NUMCUTS,
232         BMOP_ESUBDIVIDE_FLAG, //beauty flag in esubdivide
233         BMOP_ESUBDIVIDE_RADIUS,
234
235         BMOP_ESUBDIVIDE_CUSTOMFILL_FACEMAP,
236         BMOP_ESUBDIVIDE_PERCENT_EDGEMAP,
237
238         /*inner verts/new faces of completely filled faces, e.g.
239           fully selected face.*/
240         BMOP_ESUBDIVIDE_INNER_MULTOUT,
241
242         /*new edges and vertices from splitting original edges,
243           doesn't include edges creating by connecting verts.*/
244         BMOP_ESUBDIVIDE_SPLIT_MULTOUT,  
245         BMOP_ESUBDIVIDE_TOTSLOT,
246 };
247 /*
248 SUBDIV_SELECT_INNER
249 SUBDIV_SELECT_ORIG
250 SUBDIV_SELECT_INNER_SEL
251 SUBDIV_SELECT_LOOPCUT
252 DOUBLEOPFILL
253 */
254
255 /*triangulate*/
256 #define BMOP_TRIANGULATE                6
257
258 enum {
259         BMOP_TRIANG_FACEIN,
260         BMOP_TRIANG_NEW_EDGES,
261         BMOP_TRIANG_NEW_FACES,
262         BMOP_TRIANG_TOTSLOT,
263 };
264
265 /*dissolve faces*/
266 #define BMOP_DISSOLVE_FACES             7
267 enum {
268         BMOP_DISFACES_FACEIN,
269         //list of faces that comprise regions of split faces
270         BMOP_DISFACES_REGIONOUT,
271         BMOP_DISFACES_TOTSLOT,
272 };
273
274 /*dissolve verts*/
275 #define BMOP_DISSOLVE_VERTS             8
276
277 #define BMOP_DISVERTS_VERTIN    0
278 #define BMOP_DISVERTS_TOTSLOT   1
279
280 #define BMOP_MAKE_FGONS                 9
281 #define BMOP_MAKE_FGONS_TOTSLOT 0
282
283 #define BMOP_EXTRUDE_EDGECONTEXT        10
284 enum {
285         BMOP_EXFACE_EDGEFACEIN,
286         BMOP_EXFACE_EXCLUDEMAP, //exclude edges from skirt connecting
287         BMOP_EXFACE_MULTOUT, //new geometry
288         BMOP_EXFACE_TOTSLOT,
289 };
290
291 #define BMOP_CONNECT_VERTS              11
292 enum {
293         BM_CONVERTS_VERTIN,
294         BM_CONVERTS_EDGEOUT,
295         BM_CONVERTS_TOTSLOT
296 };
297
298 /*keep this updated!*/
299 #define BMOP_TOTAL_OPS                  12
300 /*-------------------------------end operator defines-------------------------------*/
301
302 extern BMOpDefine *opdefines[];
303 extern int bmesh_total_ops;
304
305 /*------specific operator helper functions-------*/
306
307 /*executes the duplicate operation, feeding elements of 
308   type flag etypeflag and header flag flag to it.  note,
309   to get more useful information (such as the mapping from
310   original to new elements) you should run the dupe op manually.*/
311 struct Object;
312 struct EditMesh;
313
314 void BMOP_DupeFromFlag(struct BMesh *bm, int etypeflag, int flag);
315 void BM_esubdivideflag(struct Object *obedit, struct BMesh *bm, int selflag, float rad, 
316                int flag, int numcuts, int seltype);
317 void BM_extrudefaceflag(BMesh *bm, int flag);
318
319 /*these next two return 1 if they did anything, or zero otherwise.*/
320 int BM_DissolveFaces(struct EditMesh *em, int flag);
321 /*this doesn't display errors to the user, btw*/
322 int BM_ConnectVerts(struct EditMesh *em, int flag);
323
324 #endif