svn merge ^/trunk/blender -r43294:43338
[blender.git] / source / blender / blenlib / BLI_editVert.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef BLI_EDITVERT_H
29 #define BLI_EDITVERT_H
30
31 /** \file BLI_editVert.h
32  *  \ingroup bli
33  *  \since March 2001
34  *  \author nzc
35  *  \brief Some editing types needed in the lib (unfortunately) for
36  *   scanfill.c
37  */
38
39 #include "DNA_customdata_types.h"
40 #include "DNA_mesh_types.h"
41
42 #include "BLO_sys_types.h" // for intptr_t support
43
44 struct DerivedMesh;
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                 int                              t;
62         } tmp;
63         float no[3]; /*vertex normal */
64         float co[3]; /*vertex location */
65         short xs, ys; /* used to store a screenspace 2d projection of the verts */
66         
67         /* f stores selection eg. if (eve->f & SELECT) {...
68         h for hidden. if (!eve->h) {...
69         f1 and f2 can be used for temp data, clear them first*/
70         unsigned char f, h, f1, f2; 
71         float bweight;
72         short fast;     /* only 0 or 1, for editmesh_fastmalloc, do not store temp data here! */
73         int hash;     /* internal editmesh.c use only, don't touch! */
74         int keyindex; /* original index #, for restoring  key information */
75
76         void *data;             /* custom vertex data */
77 } EditVert;
78
79 struct EditEdge;
80
81 typedef struct HashEdge {
82         struct EditEdge *eed;
83         struct HashEdge *next;
84 } HashEdge;
85
86 /* note; changing this also might affect the undo copy in editmesh.c */
87 typedef struct EditEdge
88 {
89         struct EditEdge *next, *prev;
90         struct EditVert *v1, *v2;
91         union {
92                 /* some lean storage for temporary usage 
93                  * in editmesh routines
94                  */
95                 struct EditVert *v;
96                 struct EditEdge *e;
97                 struct EditFace *f;
98                 void            *p;
99                 intptr_t         l;
100                 float                   fp;
101         } tmp;
102         short f1, f2;   /* short, f1 is (ab)used in subdiv */
103         unsigned char f, h, dir, seam, sharp;
104         float crease;
105         float bweight;
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                 intptr_t         l;
127                 float                   fp;
128         } tmp;
129         float n[3], cent[3];
130         unsigned char 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         short mat_nr;
135         void *data;             /* custom face data */
136 } EditFace;
137
138
139 /*selection types*/
140 #define EDITVERT 0
141 #define EDITEDGE 1
142 #define EDITFACE 2
143
144 typedef struct EditSelection
145 {
146         struct EditSelection *next, *prev;
147         short type;
148         void *data;
149 } EditSelection;
150
151
152 typedef struct EditMesh
153 {
154         ListBase verts, edges, faces;
155         ListBase selected; /*EditSelections. Used to store the order in which things are selected.*/
156         HashEdge *hashedgetab;
157         
158         /* this is for the editmesh_fastmalloc */
159         struct BLI_mempool *vertpool, *edgepool, *facepool;
160
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         /* copy from scene */
175         short selectmode;
176         /* copy from object actcol */
177         short mat_nr;
178         /* stats */
179         int totvert, totedge, totface, totvertsel, totedgesel, totfacesel;
180         /* shape key being edited */
181         int shapenr;
182         
183         struct DerivedMesh *derivedCage, *derivedFinal;
184         /* the custom data layer mask that was last used to calculate
185          * derivedCage and derivedFinal
186          */
187         int lastDataMask;
188
189         CustomData vdata, edata, fdata;
190
191 } EditMesh;
192
193 #endif
194