the make ngon function's overlap test needed some work, the API function
[blender.git] / source / blender / bmesh / bmesh.h
1 /**
2  *  bmesh.h    jan 2007
3  *
4  *      BMesh API.
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, Levi Schooley.
33  *
34  * ***** END GPL LICENSE BLOCK *****
35  */
36
37 #ifndef BMESH_H
38 #define BMESH_H
39
40 #include "DNA_listBase.h"
41 #include "DNA_customdata_types.h"
42 #include "BLI_mempool.h"
43 #include "BKE_customdata.h"
44
45 /*forward declarations*/
46 struct BMVert;
47 struct BMEdge;
48 struct BMFace;
49 struct BMLoop;
50
51 /*
52  * BMHeader
53  *
54  * All mesh elements begin with a BMHeader. This structure 
55  * hold several types of data
56  *
57  * 1: The type of the element (vert, edge, loop or face)
58  * 2: Persistant flags/markings (sharp, seam, select, hidden, ect)
59  * 3: Unique ID in the bmesh.
60  * 4: some elements for internal record keeping.
61  *
62 */
63
64 /*BMHeader->type*/
65 #define BM_VERT         1
66 #define BM_EDGE         2
67 #define BM_FACE         4
68 #define BM_LOOP         8
69 #define BM_ALL          BM_VERT | BM_EDGE | BM_FACE | BM_LOOP
70
71 /*BMHeader->flag*/
72 #define BM_SELECT       (1<<0)
73
74 #define BM_SEAM         (1<<1)
75 #define BM_FGON         (1<<2)
76 #define BM_HIDDEN       (1<<3)
77 #define BM_SHARP        (1<<4)
78 #define BM_SMOOTH       (1<<5)
79 #define BM_ACTIVE       (1<<6)
80 #define BM_NONORMCALC   (1<<7)
81
82 typedef struct BMHeader {
83         struct BMHeader *next, *prev;
84         int             EID;  /*Consider removing this/making it ifdeffed for debugging*/
85         int             flag, type;
86         int                     eflag1, eflag2; /*Flags used by eulers. Try and get rid of/minimize some of these*/
87         struct BMFlagLayer *flags; /*Dynamically allocated block of flag layers for operators to use*/
88 } BMHeader;
89
90 typedef struct BMFlagLayer {
91         int f1;
92         short mask, pflag;
93 } BMFlagLayer;
94
95 #define BM_OVERLAP              (1<<14)                 /*used by bmesh_verts_in_face*/
96 #define BM_EDGEVERT     (1<<15)                 /*used by bmesh_make_ngon*/
97
98 /*
99  * BMNode
100  *
101  * Used for circular/linked list functions that form basis of
102  * adjacency system in BMesh. This should probably be hidden 
103  * somewhere since tool authors never need to know about it.
104  *
105 */
106
107 typedef struct BMNode {
108         struct BMNode *next, *prev;
109         void *data;
110 } BMNode;
111
112 typedef struct BMesh {
113         ListBase verts, edges, polys;
114         struct BLI_mempool *vpool;
115         struct BLI_mempool *epool;
116         struct BLI_mempool *lpool;
117         struct BLI_mempool *ppool;
118         struct BMVert **vtar;
119         struct BMEdge **edar;
120         struct BMLoop **lpar;
121         struct BMFace **plar;
122         int vtarlen, edarlen, lparlen, plarlen;
123         int totvert, totedge, totface, totloop; 
124         int nextv, nexte, nextp, nextl;
125         struct CustomData vdata, edata, pdata, ldata;
126         int selectmode;
127         struct BLI_mempool *flagpool;                                   /*memory pool for dynamically allocated flag layers*/
128         int stackdepth;                                                                 /*current depth of operator stack*/
129         int totflags, walkers;                                                  /*total number of tool flag layers*/
130         ListBase errorstack;
131 } BMesh;
132
133 typedef struct BMVert { 
134         struct BMHeader head;
135         float co[3];                                                                    
136         float no[3];                                                                    
137         struct BMEdge *edge;
138         void *data;
139         void *tmp;                                                                                                      /*what?*/
140         float bweight;                                                                                          /*please, someone just get rid of me...*/
141 } BMVert;
142
143 typedef struct BMEdge {
144         struct BMHeader head;
145         struct BMVert *v1, *v2;
146         struct BMNode d1, d2;
147         struct BMLoop *loop;
148         void *data;
149         float crease, bweight; /*make these custom data.... no really, please....*/
150 } BMEdge;
151
152 typedef struct BMLoop  {
153         struct BMHeader head;
154         struct BMNode radial;
155         struct BMVert *v;
156         struct BMEdge *e;
157         struct BMFace *f;       
158         void *data;
159 } BMLoop;
160
161 typedef struct BMFace {
162         struct BMHeader head;
163         struct BMLoop *loopbase;
164         int len;
165         void *data;
166         float no[3];
167
168         /*custom data again*/
169         short mat_nr; 
170 } BMFace;
171
172 /*stub */
173 void bmesh_error(void);
174
175 /*Mesh Level Ops */
176 struct BMesh *BM_Make_Mesh(int allocsize[4]);
177 void BM_Free_Mesh(struct BMesh *bm);
178 void BM_Compute_Normals(struct BMesh *bm);
179
180 /*Construction*/
181 struct BMVert *BM_Make_Vert(struct BMesh *bm, float co[3], struct BMVert *example);
182 struct BMEdge *BM_Make_Edge(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge *example, int nodouble);
183 struct BMFace *BM_Make_Quadtriangle(struct BMesh *bm, struct BMVert **verts, BMEdge **edges, int len, struct BMFace *example, int nodouble);
184 struct BMFace *BM_Make_Ngon(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge **edges, int len, int nodouble);
185 /*copies loop data from adjacent faces*/
186 void BM_Face_CopyShared(BMesh *bm, BMFace *f);
187 void BM_Copy_Attributes(struct BMesh *source_mesh, struct BMesh *target_mesh, void *source, void *target);
188 void BM_remove_tagged_faces(struct BMesh *bm, int flag);
189 void BM_remove_tagged_edges(struct BMesh *bm, int flag);
190 void BM_remove_tagged_verts(struct BMesh *bm, int flag);
191
192
193 /*Modification*/
194 struct BMFace *BM_Join_Faces(struct BMesh *bm, struct BMFace *f1, struct BMFace *f2, struct BMEdge *e, int calcnorm, int weldUVs);
195 struct BMFace *BM_Split_Face(struct BMesh *bm, struct BMFace *f, struct BMVert *v1, struct BMVert *v2, struct BMLoop **nl, struct BMEdge *example, int calcnorm);
196 void BM_Collapse_Vert(struct BMesh *bm, struct BMEdge *ke, struct BMVert *kv, float fac, int calcnorm);
197 struct BMVert *BM_Split_Edge(struct BMesh *bm, struct BMVert *v, struct BMEdge *e, struct BMEdge **ne, float percent, int calcnorm);
198 struct BMVert  *BM_Split_Edge_Multi(struct BMesh *bm, struct BMEdge *e, int numcuts);
199 BMEdge *BM_Connect_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **nf);
200 void BM_Face_UpdateNormal(BMesh *bm, BMFace *f);
201 void BM_Edge_UpdateNormals(BMesh *bm, BMEdge *e);
202 void BM_Vert_UpdateNormal(BMesh *bm, BMVert *v);
203
204 /*dissolves vert surrounded by faces*/
205 int BM_Dissolve_Disk(BMesh *bm, BMVert *v);
206
207 /*dissolves vert, in more situations then BM_Dissolve_Disk.*/
208 int BM_Dissolve_Vert(BMesh *bm, BMVert *v);
209
210 /*Interpolation*/
211 void BM_Data_Interp_From_Verts(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMVert *v, float fac);
212 void BM_Data_Facevert_Edgeinterp(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMVert *v, struct BMEdge *e1, float fac);
213 //void bmesh_data_interp_from_face(struct BMesh *bm, struct BMFace *source, struct BMFace *target);
214
215 struct EditMesh;
216 struct BMOperator;
217 BMesh *editmesh_to_bmesh(struct EditMesh *em);
218 BMesh *init_editmesh_to_bmesh(struct EditMesh *em, struct BMOperator *op);
219 struct EditMesh *bmesh_to_editmesh(BMesh *bm);
220
221 /*include the rest of the API*/
222 #include "bmesh_filters.h"
223 #include "bmesh_iterators.h"
224 #include "bmesh_marking.h"
225 #include "bmesh_operator_api.h"
226 #include "bmesh_operators.h"
227 #include "bmesh_error.h"
228 #include "bmesh_queries.h"
229 #include "bmesh_walkers.h"
230
231 #endif /* BMESH_H */