0592f04f05d2afb70197818757b82680fb62bdd8
[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_mesh_types.h"
42
43 struct DerivedMesh;
44 struct RetopoPaintData;
45
46 /* note; changing this also might affect the undo copy in editmesh.c */
47 typedef struct EditVert
48 {
49         struct EditVert *next, *prev;
50         union {
51                 /* some lean storage for temporary usage 
52                  * in editmesh routines
53                  */
54                 struct EditVert *v;
55                 struct EditEdge *e;
56                 struct EditFace *f;
57                 float           *fp;
58                 void            *p;
59                 long             l;
60         } tmp;
61         float no[3]; /*vertex normal */
62         float co[3]; /*vertex location */
63         short xs, ys; /* used to store a screenspace 2d projection of the verts */
64         
65         /* f stores selection eg. if (eve->f & SELECT) {...
66         h for hidden. if (!eve->h) {...
67         f1 and f2 can be used for temp data, clear them first*/
68         unsigned char f, h, f1, f2; 
69         short fast;     /* only 0 or 1, for editmesh_fastmalloc, do not store temp data here! */
70         short   totweight; /* __NLA total number of vertex weights for this vertex */
71         int hash;
72         struct MDeformWeight *dw;       /* __NLA a pointer to an array of defirm weights */
73         int keyindex; /* original index #, for restoring  key information */
74 /*#ifdef WITH_VERSE*/
75         void *vvert;
76 /*#endif*/
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                 long             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         short fast;             /* only 0 or 1, for editmesh_fastmalloc */
106         short fgoni;            /* index for fgon, for search */
107         HashEdge hash;
108 } EditEdge;
109
110 /* note; changing this also might affect the undo copy in editmesh.c */
111 typedef struct EditFace
112 {
113         struct EditFace *next, *prev;
114         struct EditVert *v1, *v2, *v3, *v4;
115         struct EditEdge *e1, *e2, *e3, *e4;
116         union {
117                 /* some lean storage for temporary usage 
118                  * in editmesh routines
119                  */
120                 struct EditVert *v;
121                 struct EditEdge *e;
122                 struct EditFace *f;
123                 void            *p;
124                 long             l;
125                 float                   fp;
126         } tmp;
127         float n[3], cent[3];
128         struct TFace tf;        /* a copy of original tface. */
129         unsigned char mat_nr, 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 /*#ifdef WITH_VERSE*/
134         void *vface;
135 /*#endif*/
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         EditVert *allverts, *curvert;
160         EditEdge *alledges, *curedge;
161         EditFace *allfaces, *curface;
162                 /* DerivedMesh caches... note that derived cage can be equivalent
163                  * to derived final, care should be taken on release.
164                  */
165         struct DerivedMesh *derivedCage, *derivedFinal;
166
167         char retopo_mode; /* 0=OFF, 1=ON, 2=PAINT */
168         struct RetopoPaintData *retopo_paint_data;
169
170 #ifdef WITH_VERSE
171         void *vnode;
172 #endif
173 } EditMesh;
174
175 #endif
176