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