Added a new slot type, that maps geometric elements to
[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_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, int slotcode, int flag, int type);
84 int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, int slotcode);
85
86 void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, int slotcode, 
87                         void *element, void *data, int len);
88 void BMO_Insert_MapFloat(BMesh *bm, BMOperator *op, int slotcode, 
89                         void *element, float val);
90 void *BMO_Get_MapData(BMesh *bm, BMOperator *op, int slotcode,
91                       void *element);
92 float BMO_Get_MapFloat(BMesh *bm, BMOperator *op, int slotcode,
93                        void *element);
94 void BMO_Mapping_To_Flag(struct BMesh *bm, struct BMOperator *op, 
95                          int slotcode, int flag);
96
97 /*if msg is null, then the default message for the errorcode is used*/
98 void BMOP_RaiseError(BMesh *bm, int errcode, char *msg);
99 /*returns error code or 0 if no error*/
100 int BMOP_GetError(BMesh *bm, char **msg);
101 /*returns 1 if there was an error*/
102 int BMOP_CheckError(BMesh *bm);
103 int BMOP_PopError(BMesh *bm, char **msg);
104
105 /*------ error code defines -------*/
106
107 /*error messages*/
108 #define BMERR_SELF_INTERSECTING        1
109
110 static char *bmop_error_messages[] = {
111        0,
112        "Self intersection error",
113 };
114
115 /*------------begin operator defines (see bmesh_opdefines.c too)------------*/
116 /*split op*/
117 #define BMOP_SPLIT                              0
118
119 enum {
120         BMOP_SPLIT_MULTIN,
121         BMOP_SPLIT_MULTOUT,
122         BMOP_SPLIT_TOTSLOT,
123 };
124
125 /*dupe op*/
126 #define BMOP_DUPE       1
127
128 enum {
129         BMOP_DUPE_MULTIN,
130         BMOP_DUPE_ORIG,
131         BMOP_DUPE_NEW,
132         BMOP_DUPE_TOTSLOT
133 };
134
135 /*delete op*/
136 #define BMOP_DEL        2
137
138 enum {
139         BMOP_DEL_MULTIN,
140         BMOP_DEL_CONTEXT,
141         BMOP_DEL_TOTSLOT,
142 };
143
144 #define DEL_VERTS               1
145 #define DEL_EDGES               2
146 #define DEL_ONLYFACES   3
147 #define DEL_EDGESFACES  4
148 #define DEL_FACES               5
149 #define DEL_ALL                 6
150
151 /*BMOP_DEL_CONTEXT*/
152 enum {
153         BMOP_DEL_VERTS = 1,
154         BMOP_DEL_EDGESFACES,
155         BMOP_DEL_ONLYFACES,
156         BMOP_DEL_FACES,
157         BMOP_DEL_ALL,
158 };
159
160 /*editmesh->bmesh op*/
161 #define BMOP_FROM_EDITMESH              3
162 enum {
163         BMOP_FROM_EDITMESH_EM,
164         BMOP_FROM_EDITMESH_TOTSLOT,
165 };
166
167 #define BMOP_TO_EDITMESH                4
168 /*bmesh->editmesh op*/
169 enum {
170         BMOP_TO_EDITMESH_EMOUT,
171         BMOP_TO_EDITMESH_TOTSLOT,
172 };
173
174 /*edge subdivide op*/
175 #define BMOP_ESUBDIVIDE                 5
176 enum {
177         BMOP_ESUBDIVIDE_EDGES,
178         BMOP_ESUBDIVIDE_NUMCUTS,
179         BMOP_ESUBDIVIDE_FLAG, //beauty flag in esubdivide
180         BMOP_ESUBDIVIDE_RADIUS,
181         BMOP_ESUBDIVIDE_SELACTION,
182
183         BMOP_ESUBDIVIDE_CUSTOMFILL_FACEMAP,
184         BMOP_ESUBDIVIDE_PERCENT_EDGEMAP,
185
186         /*inner verts/new faces of completely filled faces, e.g.
187           fully selected face.*/
188         BMOP_ESUBDIVIDE_INNER_MULTOUT,
189
190         /*new edges and vertices from splitting original edges,
191           doesn't include edges creating by connecting verts.*/
192         BMOP_ESUBDIVIDE_SPLIT_MULTOUT,
193         
194         /*edges created by connecting verts, except for those created
195           by fully-filled faces (e.g. fully selected faces).*/
196         BMOP_ESUBDIVIDE_CONNECT_MULTOUT,
197         BMOP_ESUBDIVIDE_TOTSLOT,
198 };
199 /*
200 SUBDIV_SELECT_INNER
201 SUBDIV_SELECT_ORIG
202 SUBDIV_SELECT_INNER_SEL
203 SUBDIV_SELECT_LOOPCUT
204 DOUBLEOPFILL
205 */
206
207 /*triangulate*/
208 #define BMOP_TRIANGULATE                6
209
210 enum {
211         BMOP_TRIANG_FACEIN,
212         BMOP_TRIANG_NEW_EDGES,
213         BMOP_TRIANG_NEW_FACES,
214         BMOP_TRIANG_TOTSLOT,
215 };
216
217 /*dissolve faces*/
218 #define BMOP_DISSOLVE_FACES             7
219
220 #define BMOP_DISFACES_FACEIN    0
221 #define BMOP_DISFACES_TOTSLOT   1
222
223 /*dissolve verts*/
224 #define BMOP_DISSOLVE_VERTS             8
225
226 #define BMOP_DISVERTS_VERTIN    0
227 #define BMOP_DISVERTS_TOTSLOT   1
228
229 #define BMOP_MAKE_FGONS                 9
230 #define BMOP_MAKE_FGONS_TOTSLOT 0
231
232 /*keep this updated!*/
233 #define BMOP_TOTAL_OPS                  10
234 /*-------------------------------end operator defines-------------------------------*/
235
236 extern BMOpDefine *opdefines[];
237 extern int bmesh_total_ops;
238
239 /*------specific operator helper functions-------*/
240
241 /*executes the duplicate operation, feeding elements of 
242   type flag etypeflag and header flag flag to it.  note,
243   to get more useful information (such as the mapping from
244   original to new elements) you should run the dupe op manually.*/
245 struct Object;
246
247 void BMOP_DupeFromFlag(struct BMesh *bm, int etypeflag, int flag);
248 void BM_esubdivideflag(struct Object *obedit, struct BMesh *bm, int selflag, float rad, 
249                        int flag, int numcuts, int seltype);
250 #endif