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