commit before doing some hefty shapekey change, will break compilation
[blender-staging.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 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.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software Foundation,
23  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  *
25  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
26  * All rights reserved.
27  *
28  * The Original Code is: all of this file.
29  *
30  * Contributor(s): none yet.
31  *
32  * ***** END GPL LICENSE BLOCK *****
33  */
34
35 #ifndef BLI_EDITVERT_H
36 #define BLI_EDITVERT_H
37
38 #include "DNA_customdata_types.h"
39 #include "DNA_mesh_types.h"
40
41 #include "BLO_sys_types.h" // for intptr_t support
42
43 struct DerivedMesh;
44 struct RetopoPaintData;
45 struct BLI_mempool;
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                 intptr_t         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         float bweight;
71         short fast;     /* only 0 or 1, for editmesh_fastmalloc, do not store temp data here! */
72         int hash;
73         int keyindex; /* original index #, for restoring  key information */
74
75         void *data;             /* custom vertex data */
76 } EditVert;
77
78 struct EditEdge;
79
80 typedef struct HashEdge {
81         struct EditEdge *eed;
82         struct HashEdge *next;
83 } HashEdge;
84
85 /* note; changing this also might affect the undo copy in editmesh.c */
86 typedef struct EditEdge
87 {
88         struct EditEdge *next, *prev;
89         struct EditVert *v1, *v2;
90         union {
91                 /* some lean storage for temporary usage 
92                  * in editmesh routines
93                  */
94                 struct EditVert *v;
95                 struct EditEdge *e;
96                 struct EditFace *f;
97                 void            *p;
98                 intptr_t         l;
99                 float                   fp;
100         } tmp;
101         short f1, f2;   /* short, f1 is (ab)used in subdiv */
102         unsigned char f, h, dir, seam, sharp;
103         float crease;
104         float bweight;
105         short fast;             /* only 0 or 1, for editmesh_fastmalloc */
106         short fgoni;            /* index for fgon, for search */
107         HashEdge hash;
108         void *data;                     /*custom edge data*/
109 } EditEdge;
110
111 /* note; changing this also might affect the undo copy in editmesh.c */
112 typedef struct EditFace
113 {
114         struct EditFace *next, *prev;
115         struct EditVert *v1, *v2, *v3, *v4;
116         struct EditEdge *e1, *e2, *e3, *e4;
117         union {
118                 /* some lean storage for temporary usage 
119                  * in editmesh routines
120                  */
121                 struct EditVert *v;
122                 struct EditEdge *e;
123                 struct EditFace *f;
124                 void            *p;
125                 intptr_t         l;
126                 float                   fp;
127         } tmp;
128         float n[3], cent[3];
129         unsigned char flag;
130         unsigned char f, f1, h;
131         unsigned char fast;                     /* only 0 or 1, for editmesh_fastmalloc */
132         unsigned char fgonf;            /* flag for fgon options */
133         short mat_nr;
134         void *data;             /* custom face data */
135 } EditFace;
136
137
138 /*selection types*/
139 #define EDITVERT 0
140 #define EDITEDGE 1
141 #define EDITFACE 2
142
143 typedef struct EditSelection
144 {
145         struct EditSelection *next, *prev;
146         short type;
147         void *data;
148 } EditSelection;
149
150
151 typedef struct EditMesh
152 {
153         ListBase verts, edges, faces;
154         ListBase selected; /*EditSelections. Used to store the order in which things are selected.*/
155         HashEdge *hashedgetab;
156         
157         /* this is for the editmesh_fastmalloc */
158         struct BLI_mempool *vertpool, *edgepool, *facepool;
159
160         EditVert *allverts, *curvert;
161         EditEdge *alledges, *curedge;
162         EditFace *allfaces, *curface;
163                 /* DerivedMesh caches... note that derived cage can be equivalent
164                  * to derived final, care should be taken on release.
165                  */
166         
167         /* used for keeping track of the last clicked on face - so the space image
168          * when using the last selected face - (EditSelection) the space image flickered too much
169          * 
170          * never access this directly, use EM_set_actFace and EM_get_actFace */
171         EditFace *act_face; 
172         
173         /* copy from scene */
174         short selectmode;
175         /* copy from object actcol */
176         short mat_nr;
177         /* stats */
178         int totvert, totedge, totface, totvertsel, totedgesel, totfacesel;
179         /* shape key being edited */
180         int shapenr;
181         
182         struct DerivedMesh *derivedCage, *derivedFinal;
183         /* the custom data layer mask that was last used to calculate
184          * derivedCage and derivedFinal
185          */
186         int lastDataMask;
187
188         struct RetopoPaintData *retopo_paint_data;
189
190         CustomData vdata, edata, fdata;
191
192 } EditMesh;
193
194 #endif
195