Fix T70013: slow OpenGL calls for every vertex and weight painting step
[blender.git] / source / blender / makesdna / DNA_mesh_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_MESH_TYPES_H__
25 #define __DNA_MESH_TYPES_H__
26
27 #include "DNA_defs.h"
28 #include "DNA_ID.h"
29 #include "DNA_customdata_types.h"
30
31 struct AnimData;
32 struct Ipo;
33 struct Key;
34 struct LinkNode;
35 struct MCol;
36 struct MEdge;
37 struct MFace;
38 struct MLoop;
39 struct MLoopCol;
40 struct MLoopTri;
41 struct MLoopUV;
42 struct MPoly;
43 struct MVert;
44 struct Material;
45 struct Mesh;
46 struct Multires;
47 struct SubdivCCG;
48
49 #
50 #
51 typedef struct EditMeshData {
52   /** when set, \a vertexNos, polyNos are lazy initialized */
53   const float (*vertexCos)[3];
54
55   /** lazy initialize (when \a vertexCos is set) */
56   float const (*vertexNos)[3];
57   float const (*polyNos)[3];
58   /** also lazy init but dont depend on \a vertexCos */
59   const float (*polyCos)[3];
60 } EditMeshData;
61
62 /**
63  * \warning Typical access is done via
64  * #BKE_mesh_runtime_looptri_ensure, #BKE_mesh_runtime_looptri_len.
65  */
66 struct MLoopTri_Store {
67   /* WARNING! swapping between array (ready-to-be-used data) and array_wip
68    * (where data is actually computed)
69    * shall always be protected by same lock as one used for looptris computing. */
70   struct MLoopTri *array, *array_wip;
71   int len;
72   int len_alloc;
73 };
74
75 /* not saved in file! */
76 typedef struct Mesh_Runtime {
77   /* Evaluated mesh for objects which do not have effective modifiers. This mesh is sued as a
78    * result of modifier stack evaluation.
79    * Since modifier stack evaluation is threaded on object level we need some synchronization. */
80   struct Mesh *mesh_eval;
81   void *eval_mutex;
82
83   struct EditMeshData *edit_data;
84   void *batch_cache;
85
86   struct SubdivCCG *subdiv_ccg;
87   void *_pad1;
88   int subdiv_ccg_tot_level;
89   char _pad2[4];
90
91   int64_t cd_dirty_vert;
92   int64_t cd_dirty_edge;
93   int64_t cd_dirty_loop;
94   int64_t cd_dirty_poly;
95
96   struct MLoopTri_Store looptris;
97
98   /** 'BVHCache', for 'BKE_bvhutil.c' */
99   struct LinkNode *bvh_cache;
100
101   /** Non-manifold boundary data for Shrinkwrap Target Project. */
102   struct ShrinkwrapBoundaryData *shrinkwrap_data;
103
104   /** Set by modifier stack if only deformed from original. */
105   char deformed_only;
106   /**
107    * Copied from edit-mesh (hint, draw with editmesh data).
108    * In the future we may leave the mesh-data empty
109    * since its not needed if we can use edit-mesh data. */
110   char is_original;
111   char _pad[6];
112 } Mesh_Runtime;
113
114 typedef struct Mesh {
115   ID id;
116   /** Animation data (must be immediately after id for utilities to use it). */
117   struct AnimData *adt;
118
119   /** Old animation system, deprecated for 2.5. */
120   struct Ipo *ipo DNA_DEPRECATED;
121   struct Key *key;
122   struct Material **mat;
123   struct MSelect *mselect;
124
125   /* BMESH ONLY */
126   /*new face structures*/
127   struct MPoly *mpoly;
128   struct MLoop *mloop;
129   struct MLoopUV *mloopuv;
130   struct MLoopCol *mloopcol;
131   /* END BMESH ONLY */
132
133   /* mface stores the tessellation (triangulation) of the mesh,
134    * real faces are now stored in nface.*/
135   /** Array of mesh object mode faces for tessellation. */
136   struct MFace *mface;
137   /** Store tessellation face UV's and texture here. */
138   struct MTFace *mtface;
139   /** Deprecated, use mtface. */
140   struct TFace *tface DNA_DEPRECATED;
141   /** Array of verts. */
142   struct MVert *mvert;
143   /** Array of edges. */
144   struct MEdge *medge;
145   /** Deformgroup vertices. */
146   struct MDeformVert *dvert;
147
148   /* array of colors for the tessellated faces, must be number of tessellated
149    * faces * 4 in length */
150   struct MCol *mcol;
151   struct Mesh *texcomesh;
152
153   /* When the object is available, the preferred access method is: BKE_editmesh_from_object(ob) */
154   /** Not saved in file!. */
155   struct BMEditMesh *edit_mesh;
156
157   struct CustomData vdata, edata, fdata;
158
159   /* BMESH ONLY */
160   struct CustomData pdata, ldata;
161   /* END BMESH ONLY */
162
163   int totvert, totedge, totface, totselect;
164
165   /* BMESH ONLY */
166   int totpoly, totloop;
167   /* END BMESH ONLY */
168
169   /* the last selected vertex/edge/face are used for the active face however
170    * this means the active face must always be selected, this is to keep track
171    * of the last selected face and is similar to the old active face flag where
172    * the face does not need to be selected, -1 is inactive */
173   int act_face;
174
175   /* texture space, copied as one block in editobject.c */
176   float loc[3];
177   float size[3];
178
179   short texflag, flag;
180   float smoothresh;
181
182   /* customdata flag, for bevel-weight and crease, which are now optional */
183   char cd_flag, _pad;
184
185   char subdiv DNA_DEPRECATED, subdivr DNA_DEPRECATED;
186   /** Only kept for backwards compat, not used anymore. */
187   char subsurftype DNA_DEPRECATED;
188   char editflag;
189
190   short totcol;
191
192   float remesh_voxel_size;
193   char remesh_mode;
194   char _pad1[7];
195   /** Deprecated multiresolution modeling data, only keep for loading old files. */
196   struct Multires *mr DNA_DEPRECATED;
197
198   Mesh_Runtime runtime;
199 } Mesh;
200
201 /* deprecated by MTFace, only here for file reading */
202 #ifdef DNA_DEPRECATED
203 typedef struct TFace {
204   /** The faces image for the active UVLayer. */
205   void *tpage;
206   float uv[4][2];
207   unsigned int col[4];
208   char flag, transp;
209   short mode, tile, unwrap;
210 } TFace;
211 #endif
212
213 /* **************** MESH ********************* */
214
215 /* texflag */
216 enum {
217   ME_AUTOSPACE = 1,
218   ME_AUTOSPACE_EVALUATED = 2,
219 };
220
221 /* me->editflag */
222 enum {
223   ME_EDIT_MIRROR_X = 1 << 0,
224   ME_EDIT_MIRROR_Y = 1 << 1, /* unused so far */
225   ME_EDIT_MIRROR_Z = 1 << 2, /* unused so far */
226
227   ME_EDIT_PAINT_FACE_SEL = 1 << 3,
228   ME_EDIT_MIRROR_TOPO = 1 << 4,
229   ME_EDIT_PAINT_VERT_SEL = 1 << 5,
230 };
231
232 /* we cant have both flags enabled at once,
233  * flags defined in DNA_scene_types.h */
234 #define ME_EDIT_PAINT_SEL_MODE(_me) \
235   ((_me->editflag & ME_EDIT_PAINT_FACE_SEL) ? \
236        SCE_SELECT_FACE : \
237        (_me->editflag & ME_EDIT_PAINT_VERT_SEL) ? SCE_SELECT_VERTEX : 0)
238
239 /* me->flag */
240 enum {
241   ME_FLAG_UNUSED_0 = 1 << 0,     /* cleared */
242   ME_FLAG_UNUSED_1 = 1 << 1,     /* cleared */
243   ME_FLAG_DEPRECATED_2 = 1 << 2, /* deprecated */
244   ME_FLAG_UNUSED_3 = 1 << 3,     /* cleared */
245   ME_FLAG_UNUSED_4 = 1 << 4,     /* cleared */
246   ME_AUTOSMOOTH = 1 << 5,
247   ME_FLAG_UNUSED_6 = 1 << 6, /* cleared */
248   ME_FLAG_UNUSED_7 = 1 << 7, /* cleared */
249   ME_FLAG_UNUSED_8 = 1 << 8, /* cleared */
250   ME_DS_EXPAND = 1 << 9,
251   ME_SCULPT_DYNAMIC_TOPOLOGY = 1 << 10,
252   ME_REMESH_SMOOTH_NORMALS = 1 << 11,
253   ME_REMESH_REPROJECT_PAINT_MASK = 1 << 12,
254 };
255
256 /* me->cd_flag */
257 enum {
258   ME_CDFLAG_VERT_BWEIGHT = 1 << 0,
259   ME_CDFLAG_EDGE_BWEIGHT = 1 << 1,
260   ME_CDFLAG_EDGE_CREASE = 1 << 2,
261 };
262
263 /* me->remesh_mode */
264 enum {
265   REMESH_VOXEL = 0,
266   REMESH_QUAD = 1,
267 };
268
269 /* Subsurf Type */
270 enum {
271   ME_CC_SUBSURF = 0,
272   ME_SIMPLE_SUBSURF = 1,
273 };
274
275 #define MESH_MAX_VERTS 2000000000L
276
277 #endif