-> Beginning of Custom Data support for BMesh
[blender.git] / source / blender / blenkernel / BKE_bmesh.h
1 /**
2  * BKE_bmesh.h    jan 2007
3  *
4  *      BMesh modeler structure and functions.
5  *
6  * $Id: BKE_bmesh.h,v 1.00 2007/01/17 17:42:01 Briggs Exp $
7  *
8  * ***** BEGIN GPL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version. The Blender
14  * Foundation also sells licenses for use in proprietary software under
15  * the Blender License.  See http://www.blender.org/BL/ for information
16  * about this.  
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26  *
27  * The Original Code is Copyright (C) 2004 Blender Foundation.
28  * All rights reserved.
29  *
30  * The Original Code is: all of this file.
31  *
32  * Contributor(s): Geoffrey Bantle.
33  *
34  * ***** END GPL LICENSE BLOCK *****
35  */
36
37 #ifndef BKE_BMESH_H
38 #define BKE_BMESH_H
39
40 #include "DNA_listBase.h"
41 #include "BLI_ghash.h"
42 #include "BLI_memarena.h"
43 #include "DNA_customdata_types.h"
44 #include "DNA_image_types.h"
45 #include "BLI_editVert.h"
46 #include "BKE_DerivedMesh.h"
47 #include "transform.h"
48
49 /*forward declerations*/
50 struct BME_Vert;
51 struct BME_Edge;
52 struct BME_Poly;
53 struct BME_Loop;
54
55
56 struct BME_mempool;
57 typedef struct BME_mempool BME_mempool;
58
59 /*Custom Data Types and defines
60         Eventual plan is to move almost everything to custom data and let caller
61         decide when making the mesh what layers they want to store in the mesh
62
63         This stuff should probably go in a seperate file....
64 */
65 typedef struct BME_CustomDataLayer {
66         int type;                                       /* type of data in layer */
67         int offset;                                     /* offset of layer in block */
68         int active;                                     /* offset of active layer*/
69         char name[32];                                  /* layer name */
70 } BME_CustomDataLayer;
71
72 typedef struct BME_CustomData {
73         BME_CustomDataLayer *layers;    /*Custom Data Layers*/
74         BME_mempool *pool;                              /*pool for alloc of blocks*/
75         int totlayer, totsize;          /*total layers and total size in bytes of each block*/
76 } BME_CustomData;
77
78 #define BME_CD_FACETEX          1               /*Image texture/texface*/
79 #define BME_CD_LOOPTEX          2               /*UV coordinates*/
80 #define BME_CD_LOOPCOL          3               /*Vcolors*/
81 #define BME_CD_DEFORMVERT       4               /*Vertex Group/Weights*/
82 #define BME_CD_NUMTYPES         5
83
84 typedef struct BME_DeformWeight {
85         int                             def_nr;
86         float                   weight;
87 } BME_DeformWeight;
88
89 typedef struct BME_DeformVert {
90         struct BME_DeformWeight *dw;
91         int totweight;
92 } BME_DeformVert;
93
94 typedef struct BME_facetex{
95         struct Image *tpage;
96         char flag, transp;
97         short mode, tile, unwrap;
98 }BME_facetex;
99
100 typedef struct BME_looptex{
101         float u, v;
102 }BME_looptex;
103
104 typedef struct BME_loopcol{
105         char r, g, b, a;
106 }BME_loopcol;
107
108 /*Notes on further structure Cleanup:
109         -Remove the tflags, they belong in custom data layers
110         -Remove the eflags completely, they are mostly not used
111         -Remove the selection/vis/bevel weight flag/values ect and move them to custom data
112         -Remove EID member and move to custom data
113         -Add a radial cycle length, disk cycle length and loop cycle lenght attributes to custom data and have eulers maintain/use them if present.
114         -Move data such as vertex coordinates/normals to custom data and leave pointers in structures to active layer data.
115         -Remove BME_CycleNode structure?
116 */
117 typedef struct BME_CycleNode{
118         struct BME_CycleNode *next, *prev;
119         void *data;
120 } BME_CycleNode;
121
122 typedef struct BME_Mesh
123 {
124         ListBase verts, edges, polys;
125         /*memory pools used for storing mesh elements*/
126         struct BME_mempool *vpool;
127         struct BME_mempool *epool;
128         struct BME_mempool *ppool;
129         struct BME_mempool *lpool;
130         /*some scratch arrays used by eulers*/
131         struct BME_Vert **vtar;
132         struct BME_Edge **edar;
133         struct BME_Loop **lpar;
134         struct BME_Poly **plar;
135         int vtarlen, edarlen, lparlen, plarlen;
136         int totvert, totedge, totpoly, totloop;                         /*record keeping*/
137         int nextv, nexte, nextp, nextl;                                         /*Next element ID for verts/edges/faces/loops. Never reused*/
138         struct BME_CustomData vdata, edata, pdata, ldata;       /*Custom Data Layer information*/
139 } BME_Mesh;
140
141 typedef struct BME_Vert
142 {
143         struct BME_Vert *next, *prev;
144         int     EID;
145         float co[3];                                                                    
146         float no[3];                                                                    
147         struct BME_Edge *edge;                                                  /*first edge in the disk cycle for this vertex*/
148         void *data;                                                                             /*custom vertex data*/
149         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
150         int tflag1, tflag2;                                                             /*reserved for use by tools*/
151         unsigned short flag, h;
152         float bweight;
153 } BME_Vert;
154
155 typedef struct BME_Edge
156 {
157         struct BME_Edge *next, *prev;
158         int EID;
159         struct BME_Vert *v1, *v2;                                               /*note that order of vertex pointers means nothing to eulers*/
160         struct BME_CycleNode d1, d2;                                    /*disk cycle nodes for v1 and v2 respectivley*/
161         struct BME_Loop *loop;                                                  /*first BME_Loop in the radial cycle around this edge*/
162         void *data;                                                                             /*custom edge data*/
163         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
164         int tflag1, tflag2;                                                             /*reserved for use by tools*/
165         unsigned short flag, h;
166         float crease, bweight;
167 } BME_Edge;
168
169 typedef struct BME_Loop 
170 {       
171         struct BME_Loop *next, *prev;                                   /*circularly linked list around face*/
172         int EID;
173         struct BME_CycleNode radial;                                    /*circularly linked list used to find faces around an edge*/
174         struct BME_Vert *v;                                                             /*vertex that this loop starts at.*/
175         struct BME_Edge *e;                                                             /*edge this loop belongs to*/
176         struct BME_Poly *f;                                                             /*face this loop belongs to*/   
177         void *data;                                                                             /*custom per face vertex data*/
178         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
179         int tflag1, tflag2;                                                             /*reserved for use by tools*/
180         unsigned short flag, h;
181 } BME_Loop;
182
183 typedef struct BME_Poly
184 {
185         struct BME_Poly *next, *prev;
186         int EID;
187         struct BME_Loop *loopbase;                                              /*First editloop around Polygon.*/
188         unsigned int len;                                                               /*total length of the face. Eulers should preserve this data*/
189         void *data;                                                                             /*custom face data*/
190         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
191         int tflag1, tflag2;                                                             /*reserved for use by tools*/
192         unsigned short flag, h, mat_nr;
193 } BME_Poly;
194
195 //*EDGE UTILITIES*/
196 int BME_verts_in_edge(struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Edge *e);
197 int BME_vert_in_edge(struct BME_Edge *e, BME_Vert *v);
198 struct BME_Vert *BME_edge_getothervert(struct BME_Edge *e, struct BME_Vert *v);
199
200 /*GENERAL CYCLE*/
201 int BME_cycle_length(void *h);
202
203 /*DISK CYCLE*/
204 struct BME_Edge *BME_disk_nextedge(struct BME_Edge *e, struct BME_Vert *v); 
205 struct BME_CycleNode *BME_disk_getpointer(struct BME_Edge *e, struct BME_Vert *v);
206 struct BME_Edge *BME_disk_next_edgeflag(struct BME_Edge *e, struct BME_Vert *v, int eflag, int tflag);
207 int BME_disk_count_edgeflag(struct BME_Vert *v, int eflag, int tflag);
208
209 /*RADIAL CYCLE*/
210 struct BME_Loop *BME_radial_nextloop(struct BME_Loop *l);
211 int BME_radial_find_face(struct BME_Edge *e,struct BME_Poly *f);
212
213 /*LOOP CYCLE*/
214 struct BME_Loop *BME_loop_find_loop(struct BME_Poly *f, struct BME_Vert *v);
215
216 /*MESH CREATION/DESTRUCTION*/
217 struct BME_Mesh *BME_make_mesh(int valloc, int ealloc, int lalloc, int palloc);
218 void BME_free_mesh(struct BME_Mesh *bm);
219 /*FULL MESH VALIDATION*/
220 int BME_validate_mesh(struct BME_Mesh *bm, int halt);
221 /*ENTER/EXIT MODELLING LOOP*/
222 int BME_model_begin(struct BME_Mesh *bm);
223 void BME_model_end(struct BME_Mesh *bm);
224
225 /*MESH CONSTRUCTION API.*/
226 /*MAKE*/
227 struct BME_Vert *BME_MV(struct BME_Mesh *bm, float *vec);
228 struct BME_Edge *BME_ME(struct BME_Mesh *bm, struct BME_Vert *v1, struct BME_Vert *v2);
229 struct BME_Poly *BME_MF(struct BME_Mesh *bm, struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Edge **elist, int len);
230 /*KILL*/
231 int BME_KV(struct BME_Mesh *bm, struct BME_Vert *v);
232 int BME_KE(struct BME_Mesh *bm, struct BME_Edge *e);
233 int BME_KF(struct BME_Mesh *bm, struct BME_Poly *bply);
234 /*SPLIT*/
235 struct BME_Vert *BME_SEMV(struct BME_Mesh *bm, struct BME_Vert *tv, struct BME_Edge *e, struct BME_Edge **re);
236 struct BME_Poly *BME_SFME(struct BME_Mesh *bm, struct BME_Poly *f, struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Loop **rl);
237 /*JOIN*/
238 int BME_JEKV(struct BME_Mesh *bm, struct BME_Edge *ke, struct BME_Vert *kv);
239 struct BME_Poly *BME_JFKE(struct BME_Mesh *bm, struct BME_Poly *f1, struct BME_Poly *f2,struct BME_Edge *e); /*no reason to return BME_Poly pointer?*/
240 /*NORMAL FLIP(Is its own inverse)*/
241 int BME_loop_reverse(struct BME_Mesh *bm, struct BME_Poly *f);
242
243 /* bevel tool defines */
244 /* element flags */
245 #define BME_BEVEL_ORIG                  1
246 #define BME_BEVEL_BEVEL                 (1<<1)
247 #define BME_BEVEL_NONMAN                (1<<2)
248 #define BME_BEVEL_WIRE                  (1<<3)
249
250 /* tool options */
251 #define BME_BEVEL_SELECT                1
252 #define BME_BEVEL_VERT                  (1<<1)
253 #define BME_BEVEL_RADIUS                (1<<2)
254 #define BME_BEVEL_ANGLE                 (1<<3)
255 #define BME_BEVEL_WEIGHT                (1<<4)
256 //~ #define BME_BEVEL_EWEIGHT           (1<<4)
257 //~ #define BME_BEVEL_VWEIGHT           (1<<5)
258 #define BME_BEVEL_PERCENT               (1<<6)
259 #define BME_BEVEL_EMIN                  (1<<7)
260 #define BME_BEVEL_EMAX                  (1<<8)
261 #define BME_BEVEL_RUNNING               (1<<9)
262 #define BME_BEVEL_RES                   (1<<10)
263
264 typedef struct BME_TransData {
265         BME_Mesh *bm; /* the bmesh the vert belongs to */
266         BME_Vert *v;  /* pointer to the vert this tdata applies to */
267         float co[3];  /* the original coordinate */
268         float org[3]; /* the origin */
269         float vec[3]; /* a directional vector; always, always normalize! */
270         void *loc;    /* a pointer to the data to transform (likely the vert's cos) */
271         float factor; /* primary scaling factor; also accumulates number of weighted edges for beveling tool */
272         float weight; /* another scaling factor; used primarily for propogating vertex weights to transforms; */
273                       /* weight is also used across recursive bevels to help with the math */
274         float maxfactor; /* the unscaled, original factor (used only by "edge verts" in recursive beveling) */
275         float *max;   /* the maximum distance this vert can be transformed; negative is infinite
276                        * it points to the "parent" maxfactor (where maxfactor makes little sense)
277                        * where the max limit is stored (limits are stored per-corner) */
278 } BME_TransData;
279
280 typedef struct BME_TransData_Head {
281         GHash *gh;       /* the hash structure for element lookup */
282         MemArena *ma;    /* the memory "pool" we will be drawing individual elements from */
283         int len;
284 } BME_TransData_Head;
285
286 typedef struct BME_Glob { /* stored in Global G for Transform() purposes */
287         BME_Mesh *bm;
288         BME_TransData_Head *td;
289         struct TransInfo *Trans; /* a pointer to the global Trans struct */
290         int imval[2]; /* for restoring original mouse co when initTransform() is called multiple times */
291         int options;
292         int res;
293 } BME_Glob;
294
295 struct BME_TransData *BME_get_transdata(struct BME_TransData_Head *td, struct BME_Vert *v);
296 void BME_free_transdata(struct BME_TransData_Head *td);
297 float *BME_bevel_calc_polynormal(struct BME_Poly *f, struct BME_TransData_Head *td);
298 struct BME_Mesh *BME_bevel(struct BME_Mesh *bm, float value, int res, int options, int defgrp_index, float angle, BME_TransData_Head **rtd);
299
300 /*CONVERSION FUNCTIONS*/
301 struct BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em, struct BME_Mesh *bm);
302 struct EditMesh *BME_bmesh_to_editmesh(struct BME_Mesh *bm, BME_TransData_Head *td);
303 struct BME_Mesh *BME_derivedmesh_to_bmesh(struct DerivedMesh *dm, struct BME_Mesh *bm);
304 struct DerivedMesh *BME_bmesh_to_derivedmesh(struct BME_Mesh *bm, struct DerivedMesh *dm);
305 #endif