3debb0cbede29d78cc9a7c030e0c2961818a3fab
[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
6 #define BMOP_OPSLOT_INT                 0
7 #define BMOP_OPSLOT_FLT                 1
8 #define BMOP_OPSLOT_PNT                 2
9 #define BMOP_OPSLOT_VEC                 6
10
11 /*after BMOP_OPSLOT_VEC, everything is 
12   dynamically allocated arrays.  we
13   leave a space in the identifiers
14   for future growth.*/
15 #define BMOP_OPSLOT_INT_BUF             7
16 #define BMOP_OPSLOT_FLT_BUF             8               
17 #define BMOP_OPSLOT_PNT_BUF             9
18 #define BMOP_OPSLOT_TYPES               10
19
20 typedef struct BMOpSlot{
21         int slottype;
22         int len;
23         int index; /*index within slot array*/
24         union {
25                 int i;
26                 float f;                                        
27                 void *p;                                        
28                 float vec[3];                           /*vector*/
29                 void *buf;                              /*buffer*/
30         } data;
31 }BMOpSlot;
32
33 /*operators represent logical, executable mesh modules.*/
34 #define BMOP_MAX_SLOTS                  16              /*way more than probably needed*/
35
36 typedef struct BMOperator{
37         int type;
38         int slottype;
39         int needflag;
40         struct BMOpSlot slots[BMOP_MAX_SLOTS];
41         void (*exec)(struct BMesh *bm, struct BMOperator *op);
42         MemArena *arena;
43 }BMOperator;
44
45 /*need to refactor code to use this*/
46 typedef struct BMOpDefine {
47         int slottypes[BMOP_MAX_SLOTS];
48         void (*exec)(BMesh *bm, BMOperator *op);
49         int totslot;
50         int flag;
51 } BMOpDefine;
52
53 /*BMOpDefine->flag*/
54 //doesn't do anything at the moment.
55
56 /*API for operators*/
57 void BMO_Init_Op(struct BMOperator *op, int opcode);
58 void BMO_Exec_Op(struct BMesh *bm, struct BMOperator *op);
59 void BMO_Finish_Op(struct BMesh *bm, struct BMOperator *op);
60 BMOpSlot *BMO_GetSlot(struct BMOperator *op, int slotcode);
61 void BMO_CopySlot(struct BMOperator *source_op, struct BMOperator *dest_op, int src, int dst);
62 void BMO_Set_Float(struct BMOperator *op, int slotcode, float f);
63 void BMO_Set_Int(struct BMOperator *op, int slotcode, int i);
64 void BMO_Set_PntBuf(struct BMOperator *op, int slotcode, void *p, int len);
65 void BMO_Set_FltBuf(BMOperator *op, int slotcode, float *p, int len);
66 void BMO_Set_Pnt(struct BMOperator *op, int slotcode, void *p);
67 void BMO_Set_Vec(struct BMOperator *op, int slotcode, float *vec);
68 void BMO_SetFlag(struct BMesh *bm, void *element, int flag);
69 void BMO_ClearFlag(struct BMesh *bm, void *element, int flag);
70 int BMO_TestFlag(struct BMesh *bm, void *element, int flag);
71 int BMO_CountFlag(struct BMesh *bm, int flag, int type);
72 void BMO_Flag_To_Slot(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag, int type);
73 void BMO_Flag_Buffer(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag);
74 void BMO_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag, int type);
75
76 /*if msg is null, then the default message for the errorcode is used*/
77 void BMOP_RaiseError(BMesh *bm, int errcode, char *msg);
78 /*returns error code or 0 if no error*/
79 int BMOP_GetError(BMesh *bm, char **msg);
80 /*returns 1 if there was an error*/
81 int BMOP_CheckError(BMesh *bm);
82 int BMOP_PopError(BMesh *bm, char **msg);
83
84 /*------ error code defines -------*/
85
86 /*error messages*/
87 #define BMERR_SELF_INTERSECTING        1
88
89 static char *bmop_error_messages[] = {
90        0,
91        "Self intersection error",
92 };
93
94 /*------------begin operator defines (see bmesh_opdefines.c too)------------*/
95 /*split op*/
96 #define BMOP_SPLIT                              0
97
98 enum {
99         BMOP_SPLIT_MULTIN,
100         BMOP_SPLIT_MULTOUT,
101         BMOP_SPLIT_TOTSLOT,
102 };
103
104 /*dupe op*/
105 #define BMOP_DUPE       1
106
107 enum {
108         BMOP_DUPE_MULTIN,
109         BMOP_DUPE_ORIG,
110         BMOP_DUPE_NEW,
111         BMOP_DUPE_TOTSLOT
112 };
113
114 /*delete op*/
115 #define BMOP_DEL        2
116
117 enum {
118         BMOP_DEL_MULTIN,
119         BMOP_DEL_CONTEXT,
120         BMOP_DEL_TOTSLOT,
121 };
122
123 #define DEL_VERTS               1
124 #define DEL_EDGES               2
125 #define DEL_ONLYFACES   3
126 #define DEL_EDGESFACES  4
127 #define DEL_FACES               5
128 #define DEL_ALL                 6
129
130 /*BMOP_DEL_CONTEXT*/
131 enum {
132         BMOP_DEL_VERTS = 1,
133         BMOP_DEL_EDGESFACES,
134         BMOP_DEL_ONLYFACES,
135         BMOP_DEL_FACES,
136         BMOP_DEL_ALL,
137 };
138
139 /*editmesh->bmesh op*/
140 #define BMOP_FROM_EDITMESH              3
141 enum {
142         BMOP_FROM_EDITMESH_EM,
143         BMOP_FROM_EDITMESH_TOTSLOT,
144 };
145
146 #define BMOP_TO_EDITMESH                4
147 /*bmesh->editmesh op*/
148 enum {
149         BMOP_TO_EDITMESH_EMOUT,
150         BMOP_TO_EDITMESH_TOTSLOT,
151 };
152
153 /*edge subdivide op*/
154 #define BMOP_ESUBDIVIDE                 5
155 enum {
156         BMOP_ESUBDIVIDE_EDGES,
157         BMOP_ESUBDIVIDE_NUMCUTS,
158         BMOP_ESUBDIVIDE_FLAG, //beauty flag in esubdivide
159         BMOP_ESUBDIVIDE_RADIUS,
160         BMOP_ESUBDIVIDE_SELACTION,
161
162         BMOP_ESUBDIVIDE_CUSTOMFILL_FACES,
163         BMOP_ESUBDIVIDE_CUSTOMFILL_PATTERNS,
164
165         BMOP_ESUBDIVIDE_PERCENT_EDGES,
166         BMOP_ESUBDIVIDE_PERCENT_VALUES,
167
168         BMOP_ESUBDIVIDE_TOTSLOT,
169 };
170 /*
171 SUBDIV_SELECT_INNER
172 SUBDIV_SELECT_ORIG
173 SUBDIV_SELECT_INNER_SEL
174 SUBDIV_SELECT_LOOPCUT
175 DOUBLEOPFILL
176 */
177
178 /*triangulate*/
179 #define BMOP_TRIANGULATE                6
180
181 enum {
182         BMOP_TRIANG_FACEIN,
183         BMOP_TRIANG_NEW_EDGES,
184         BMOP_TRIANG_NEW_FACES,
185         BMOP_TRIANG_TOTSLOT,
186 };
187
188 /*dissolve faces*/
189 #define BMOP_DISSOLVE_FACES             7
190
191 #define BMOP_DISFACES_FACEIN    0
192 #define BMOP_DISFACES_TOTSLOT   1
193
194 /*dissolve verts*/
195 #define BMOP_DISSOLVE_VERTS             8
196
197 #define BMOP_DISVERTS_VERTIN    0
198 #define BMOP_DISVERTS_TOTSLOT   1
199
200 #define BMOP_MAKE_FGONS                 9
201 #define BMOP_MAKE_FGONS_TOTSLOT 0
202
203 /*keep this updated!*/
204 #define BMOP_TOTAL_OPS                  10
205 /*-------------------------------end operator defines-------------------------------*/
206
207 extern BMOpDefine *opdefines[];
208 extern int bmesh_total_ops;
209
210 /*------specific operator helper functions-------*/
211
212 /*executes the duplicate operation, feeding elements of 
213   type flag etypeflag and header flag flag to it.  note,
214   to get more useful information (such as the mapping from
215   original to new elements) you should run the dupe op manually.*/
216 struct Object;
217
218 void BMOP_DupeFromFlag(struct BMesh *bm, int etypeflag, int flag);
219 void BM_esubdivideflag(struct Object *obedit, struct BMesh *bm, int selflag, float rad, 
220                        int flag, int numcuts, int seltype);
221 #endif