87202ce047a7bcb7bc8a978afb2001446cab8665
[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 "BLI_editVert.h"
45 #include "BKE_DerivedMesh.h"
46 #include "transform.h"
47
48 struct BME_Vert;
49 struct BME_Edge;
50 struct BME_Poly;
51 struct BME_Loop;
52
53 struct BME_mempool;
54 typedef struct BME_mempool BME_mempool;
55
56 typedef struct BME_CycleNode{
57         struct BME_CycleNode *next, *prev;
58         void *data;
59 } BME_CycleNode;
60
61 typedef struct BME_Mesh
62 {
63         ListBase verts, edges, polys;
64         /*memory pools used for storing mesh elements*/
65         struct BME_mempool *vpool;
66         struct BME_mempool *epool;
67         struct BME_mempool *ppool;
68         struct BME_mempool *lpool;
69         /*some scratch arrays used by eulers*/
70         struct BME_Vert **vtar;
71         struct BME_Edge **edar;
72         struct BME_Loop **lpar;
73         struct BME_Poly **plar;
74         int vtarlen, edarlen, lparlen, plarlen;
75         int totvert, totedge, totpoly, totloop;                 /*record keeping*/
76         int nextv, nexte, nextp, nextl;                                 /*Next element ID for verts/edges/faces/loops. Never reused*/
77         //struct CustomData vdata, edata, pdata, ldata; /*Custom Data Layer information*/
78 } BME_Mesh;
79
80 typedef struct BME_Vert
81 {
82         struct BME_Vert *next, *prev;
83         int     EID;
84         float co[3];                                                                    
85         float no[3];                                                                    
86         struct BME_Edge *edge;                                                  /*first edge in the disk cycle for this vertex*/
87         void *data;                                                                             /*custom vertex data*/
88         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
89         int tflag1, tflag2;                                                             /*reserved for use by tools*/
90         unsigned short flag, h;
91         float bweight;
92 } BME_Vert;
93
94 typedef struct BME_Edge
95 {
96         struct BME_Edge *next, *prev;
97         int EID;
98         struct BME_Vert *v1, *v2;                                               /*note that order of vertex pointers means nothing to eulers*/
99         struct BME_CycleNode d1, d2;                                    /*disk cycle nodes for v1 and v2 respectivley*/
100         struct BME_Loop *loop;                                                  /*first BME_Loop in the radial cycle around this edge*/
101         void *data;                                                                             /*custom edge data*/
102         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
103         int tflag1, tflag2;                                                             /*reserved for use by tools*/
104         unsigned short flag, h;
105         float crease, bweight;
106 } BME_Edge;
107
108 typedef struct BME_Loop 
109 {       
110         struct BME_Loop *next, *prev;                                   /*circularly linked list around face*/
111         int EID;
112         struct BME_CycleNode radial;                                    /*circularly linked list used to find faces around an edge*/
113         struct BME_Vert *v;                                                             /*vertex that this loop starts at.*/
114         struct BME_Edge *e;                                                             /*edge this loop belongs to*/
115         struct BME_Poly *f;                                                             /*face this loop belongs to*/   
116         void *data;                                                                             /*custom per face vertex data*/
117         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
118         int tflag1, tflag2;                                                             /*reserved for use by tools*/
119         unsigned short flag, h;
120 } BME_Loop;
121
122 typedef struct BME_Poly
123 {
124         struct BME_Poly *next, *prev;
125         int EID;
126         struct BME_Loop *loopbase;                                              /*First editloop around Polygon.*/
127         unsigned int len;                                                               /*total length of the face. Eulers should preserve this data*/
128         void *data;                                                                             /*custom face data*/
129         int eflag1, eflag2;                                                             /*reserved for use by eulers*/
130         int tflag1, tflag2;                                                             /*reserved for use by tools*/
131         unsigned short flag, h, mat_nr;
132 } BME_Poly;
133
134 //*EDGE UTILITIES*/
135 int BME_verts_in_edge(struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Edge *e);
136 int BME_vert_in_edge(struct BME_Edge *e, BME_Vert *v);
137 struct BME_Vert *BME_edge_getothervert(struct BME_Edge *e, struct BME_Vert *v);
138
139 /*GENERAL CYCLE*/
140 int BME_cycle_length(void *h);
141
142 /*DISK CYCLE*/
143 struct BME_Edge *BME_disk_nextedge(struct BME_Edge *e, struct BME_Vert *v); 
144 struct BME_CycleNode *BME_disk_getpointer(struct BME_Edge *e, struct BME_Vert *v);
145 struct BME_Edge *BME_disk_next_edgeflag(struct BME_Edge *e, struct BME_Vert *v, int eflag, int tflag);
146 int BME_disk_count_edgeflag(struct BME_Vert *v, int eflag, int tflag);
147
148 /*RADIAL CYCLE*/
149 struct BME_Loop *BME_radial_nextloop(struct BME_Loop *l);
150 int BME_radial_find_face(struct BME_Edge *e,struct BME_Poly *f);
151
152 /*LOOP CYCLE*/
153 struct BME_Loop *BME_loop_find_loop(struct BME_Poly *f, struct BME_Vert *v);
154
155 /*MESH CREATION/DESTRUCTION*/
156 struct BME_Mesh *BME_make_mesh(int valloc, int ealloc, int lalloc, int palloc);
157 void BME_free_mesh(struct BME_Mesh *bm);
158 /*FULL MESH VALIDATION*/
159 int BME_validate_mesh(struct BME_Mesh *bm, int halt);
160 /*ENTER/EXIT MODELLING LOOP*/
161 int BME_model_begin(struct BME_Mesh *bm);
162 void BME_model_end(struct BME_Mesh *bm);
163
164 /*MESH CONSTRUCTION API.*/
165 /*MAKE*/
166 struct BME_Vert *BME_MV(struct BME_Mesh *bm, float *vec);
167 struct BME_Edge *BME_ME(struct BME_Mesh *bm, struct BME_Vert *v1, struct BME_Vert *v2);
168 struct BME_Poly *BME_MF(struct BME_Mesh *bm, struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Edge **elist, int len);
169 /*KILL*/
170 int BME_KV(struct BME_Mesh *bm, struct BME_Vert *v);
171 int BME_KE(struct BME_Mesh *bm, struct BME_Edge *e);
172 int BME_KF(struct BME_Mesh *bm, struct BME_Poly *bply);
173 /*SPLIT*/
174 struct BME_Vert *BME_SEMV(struct BME_Mesh *bm, struct BME_Vert *tv, struct BME_Edge *e, struct BME_Edge **re);
175 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);
176 /*JOIN*/
177 int BME_JEKV(struct BME_Mesh *bm, struct BME_Edge *ke, struct BME_Vert *kv);
178 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?*/
179 /*NORMAL FLIP(Is its own inverse)*/
180 int BME_loop_reverse(struct BME_Mesh *bm, struct BME_Poly *f);
181
182 /* bevel tool defines */
183 /* element flags */
184 #define BME_BEVEL_ORIG                  1
185 #define BME_BEVEL_BEVEL                 (1<<1)
186 #define BME_BEVEL_NONMAN                (1<<2)
187 #define BME_BEVEL_WIRE                  (1<<3)
188
189 /* tool options */
190 #define BME_BEVEL_SELECT                1
191 #define BME_BEVEL_VERT                  (1<<1)
192 #define BME_BEVEL_RADIUS                (1<<2)
193 #define BME_BEVEL_ANGLE                 (1<<3)
194 #define BME_BEVEL_WEIGHT                (1<<4)
195 //~ #define BME_BEVEL_EWEIGHT           (1<<4)
196 //~ #define BME_BEVEL_VWEIGHT           (1<<5)
197 #define BME_BEVEL_PERCENT               (1<<6)
198 #define BME_BEVEL_EMIN                  (1<<7)
199 #define BME_BEVEL_EMAX                  (1<<8)
200 #define BME_BEVEL_RUNNING               (1<<9)
201 #define BME_BEVEL_RES                   (1<<10)
202
203 typedef struct BME_TransData {
204         BME_Mesh *bm; /* the bmesh the vert belongs to */
205         BME_Vert *v;  /* pointer to the vert this tdata applies to */
206         float co[3];  /* the original coordinate */
207         float org[3]; /* the origin */
208         float vec[3]; /* a directional vector; always, always normalize! */
209         void *loc;    /* a pointer to the data to transform (likely the vert's cos) */
210         float factor; /* primary scaling factor; also accumulates number of weighted edges for beveling tool */
211         float weight; /* another scaling factor; used primarily for propogating vertex weights to transforms; */
212                       /* weight is also used across recursive bevels to help with the math */
213         float maxfactor; /* the unscaled, original factor (used only by "edge verts" in recursive beveling) */
214         float *max;   /* the maximum distance this vert can be transformed; negative is infinite
215                        * it points to the "parent" maxfactor (where maxfactor makes little sense)
216                        * where the max limit is stored (limits are stored per-corner) */
217 } BME_TransData;
218
219 typedef struct BME_TransData_Head {
220         GHash *gh;       /* the hash structure for element lookup */
221         MemArena *ma;    /* the memory "pool" we will be drawing individual elements from */
222         int len;
223 } BME_TransData_Head;
224
225 typedef struct BME_Glob { /* stored in Global G for Transform() purposes */
226         BME_Mesh *bm;
227         BME_TransData_Head *td;
228         struct TransInfo *Trans; /* a pointer to the global Trans struct */
229         int imval[2]; /* for restoring original mouse co when initTransform() is called multiple times */
230         int options;
231         int res;
232 } BME_Glob;
233
234 struct BME_TransData *BME_get_transdata(struct BME_TransData_Head *td, struct BME_Vert *v);
235 void BME_free_transdata(struct BME_TransData_Head *td);
236 float *BME_bevel_calc_polynormal(struct BME_Poly *f, struct BME_TransData_Head *td);
237 struct BME_Mesh *BME_bevel(struct BME_Mesh *bm, float value, int res, int options, int defgrp_index, float angle, BME_TransData_Head **rtd);
238
239 /*CONVERSION FUNCTIONS*/
240 struct BME_Mesh *BME_editmesh_to_bmesh(EditMesh *em, struct BME_Mesh *bm);
241 struct EditMesh *BME_bmesh_to_editmesh(struct BME_Mesh *bm, BME_TransData_Head *td);
242 struct BME_Mesh *BME_derivedmesh_to_bmesh(struct DerivedMesh *dm, struct BME_Mesh *bm);
243 struct DerivedMesh *BME_bmesh_to_derivedmesh(struct BME_Mesh *bm, struct DerivedMesh *dm);
244 #endif