Filling in branch from trunk
[blender.git] / source / blender / blenlib / BLI_editVert.h
1 /**
2  * blenlib/BLI_editVert.h    mar 2001 Nzc
3  *
4  * Some editing types needed in the lib (unfortunately) for
5  * scanfill.c
6  *
7  * $Id$
8  *
9  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version. The Blender
15  * Foundation also sells licenses for use in proprietary software under
16  * the Blender License.  See http://www.blender.org/BL/ for information
17  * about this.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27  *
28  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
29  * All rights reserved.
30  *
31  * The Original Code is: all of this file.
32  *
33  * Contributor(s): none yet.
34  *
35  * ***** END GPL/BL DUAL LICENSE BLOCK *****
36  */
37
38 #ifndef BLI_EDITVERT_H
39 #define BLI_EDITVERT_H
40
41 #include "DNA_customdata_types.h"
42 #include "DNA_mesh_types.h"
43
44 struct DerivedMesh;
45 struct RetopoPaintData;
46
47 /* note; changing this also might affect the undo copy in editmesh.c */
48 typedef struct EditVert
49 {
50         struct EditVert *next, *prev;
51         union {
52                 /* some lean storage for temporary usage 
53                  * in editmesh routines
54                  */
55                 struct EditVert *v;
56                 struct EditEdge *e;
57                 struct EditFace *f;
58                 void            *p;
59                 long             l;
60                 float            fp;
61         } tmp;
62         float no[3]; /*vertex normal */
63         float co[3]; /*vertex location */
64         short xs, ys; /* used to store a screenspace 2d projection of the verts */
65         
66         /* f stores selection eg. if (eve->f & SELECT) {...
67         h for hidden. if (!eve->h) {...
68         f1 and f2 can be used for temp data, clear them first*/
69         unsigned char f, h, f1, f2; 
70         short fast;     /* only 0 or 1, for editmesh_fastmalloc, do not store temp data here! */
71         int hash;
72         int keyindex; /* original index #, for restoring  key information */
73 /*#ifdef WITH_VERSE*/
74         void *vvert;
75 /*#endif*/
76
77         void *data;             /* custom vertex data */
78 } EditVert;
79
80 struct EditEdge;
81
82 typedef struct HashEdge {
83         struct EditEdge *eed;
84         struct HashEdge *next;
85 } HashEdge;
86
87 /* note; changing this also might affect the undo copy in editmesh.c */
88 typedef struct EditEdge
89 {
90         struct EditEdge *next, *prev;
91         struct EditVert *v1, *v2;
92         union {
93                 /* some lean storage for temporary usage 
94                  * in editmesh routines
95                  */
96                 struct EditVert *v;
97                 struct EditEdge *e;
98                 struct EditFace *f;
99                 void            *p;
100                 long             l;
101                 float                   fp;
102         } tmp;
103         short f1, f2;   /* short, f1 is (ab)used in subdiv */
104         unsigned char f, h, dir, seam, sharp;
105         float crease;
106         short fast;             /* only 0 or 1, for editmesh_fastmalloc */
107         short fgoni;            /* index for fgon, for search */
108         HashEdge hash;
109         void *data;                     /*custom edge data*/
110 } EditEdge;
111
112 /* note; changing this also might affect the undo copy in editmesh.c */
113 typedef struct EditFace
114 {
115         struct EditFace *next, *prev;
116         struct EditVert *v1, *v2, *v3, *v4;
117         struct EditEdge *e1, *e2, *e3, *e4;
118         union {
119                 /* some lean storage for temporary usage 
120                  * in editmesh routines
121                  */
122                 struct EditVert *v;
123                 struct EditEdge *e;
124                 struct EditFace *f;
125                 void            *p;
126                 long             l;
127                 float                   fp;
128         } tmp;
129         float n[3], cent[3];
130         unsigned char mat_nr, flag;
131         unsigned char f, f1, h;
132         unsigned char fast;                     /* only 0 or 1, for editmesh_fastmalloc */
133         unsigned char fgonf;            /* flag for fgon options */
134 /*#ifdef WITH_VERSE*/
135         void *vface;
136 /*#endif*/
137         void *data;             /* custom face data */
138 } EditFace;
139
140
141 /*selection types*/
142 #define EDITVERT 0
143 #define EDITEDGE 1
144 #define EDITFACE 2
145
146 typedef struct EditSelection
147 {
148         struct EditSelection *next, *prev;
149         short type;
150         void *data;
151 } EditSelection;
152
153
154 typedef struct EditMesh
155 {
156         ListBase verts, edges, faces;
157         ListBase selected; /*EditSelections. Used to store the order in which things are selected.*/
158         HashEdge *hashedgetab;
159         
160         /* this is for the editmesh_fastmalloc */
161         EditVert *allverts, *curvert;
162         EditEdge *alledges, *curedge;
163         EditFace *allfaces, *curface;
164                 /* DerivedMesh caches... note that derived cage can be equivalent
165                  * to derived final, care should be taken on release.
166                  */
167         
168         /* used for keeping track of the last clicked on face - so the space image
169          * when using the last selected face - (EditSelection) the space image flickered too much
170          * 
171          * never access this directly, use EM_set_actFace and EM_get_actFace */
172         EditFace *act_face; 
173         
174         struct DerivedMesh *derivedCage, *derivedFinal;
175         /* the custom data layer mask that was last used to calculate
176          * derivedCage and derivedFinal
177          */
178         int lastDataMask;
179
180         struct RetopoPaintData *retopo_paint_data;
181
182         CustomData vdata, edata, fdata;
183
184 #ifdef WITH_VERSE
185         void *vnode;
186 #endif
187 } EditMesh;
188
189 #endif
190