Fix T65844: wrong eevee hair when vertex colors are used as input
[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 MTexPoly;
44 struct MVert;
45 struct Material;
46 struct Mesh;
47 struct Multires;
48 struct SubdivCCG;
49
50 #
51 #
52 typedef struct EditMeshData {
53   /** when set, \a vertexNos, polyNos are lazy initialized */
54   const float (*vertexCos)[3];
55
56   /** lazy initialize (when \a vertexCos is set) */
57   float const (*vertexNos)[3];
58   float const (*polyNos)[3];
59   /** also lazy init but dont depend on \a vertexCos */
60   const float (*polyCos)[3];
61 } EditMeshData;
62
63 /**
64  * \warning Typical access is done via
65  * #BKE_mesh_runtime_looptri_ensure, #BKE_mesh_runtime_looptri_len.
66  */
67 struct MLoopTri_Store {
68   /* WARNING! swapping between array (ready-to-be-used data) and array_wip
69    * (where data is actually computed)
70    * shall always be protected by same lock as one used for looptris computing. */
71   struct MLoopTri *array, *array_wip;
72   int len;
73   int len_alloc;
74 };
75
76 /* not saved in file! */
77 typedef struct Mesh_Runtime {
78   /* Evaluated mesh for objects which do not have effective modifiers. This mesh is sued as a
79    * result of modifier stack evaluation.
80    * Since modifier stack evaluation is threaded on object level we need some synchronization. */
81   struct Mesh *mesh_eval;
82   void *eval_mutex;
83
84   struct EditMeshData *edit_data;
85   void *batch_cache;
86
87   struct SubdivCCG *subdiv_ccg;
88   void *_pad1;
89   int subdiv_ccg_tot_level;
90   char _pad2[4];
91
92   int64_t cd_dirty_vert;
93   int64_t cd_dirty_edge;
94   int64_t cd_dirty_loop;
95   int64_t cd_dirty_poly;
96
97   struct MLoopTri_Store looptris;
98
99   /** 'BVHCache', for 'BKE_bvhutil.c' */
100   struct LinkNode *bvh_cache;
101
102   /** Non-manifold boundary data for Shrinkwrap Target Project. */
103   struct ShrinkwrapBoundaryData *shrinkwrap_data;
104
105   /** Set by modifier stack if only deformed from original. */
106   char deformed_only;
107   /**
108    * Copied from edit-mesh (hint, draw with editmesh data).
109    * In the future we may leave the mesh-data empty
110    * since its not needed if we can use edit-mesh data. */
111   char is_original;
112   char _pad[6];
113 } Mesh_Runtime;
114
115 typedef struct Mesh {
116   ID id;
117   /** Animation data (must be immediately after id for utilities to use it). */
118   struct AnimData *adt;
119
120   struct BoundBox *bb;
121
122   /** Old animation system, deprecated for 2.5. */
123   struct Ipo *ipo DNA_DEPRECATED;
124   struct Key *key;
125   struct Material **mat;
126   struct MSelect *mselect;
127
128   /* BMESH ONLY */
129   /*new face structures*/
130   struct MPoly *mpoly;
131   struct MLoop *mloop;
132   struct MLoopUV *mloopuv;
133   struct MLoopCol *mloopcol;
134   /* END BMESH ONLY */
135
136   /* mface stores the tessellation (triangulation) of the mesh,
137    * real faces are now stored in nface.*/
138   /** Array of mesh object mode faces for tessellation. */
139   struct MFace *mface;
140   /** Store tessellation face UV's and texture here. */
141   struct MTFace *mtface;
142   /** Deprecated, use mtface. */
143   struct TFace *tface DNA_DEPRECATED;
144   /** Array of verts. */
145   struct MVert *mvert;
146   /** Array of edges. */
147   struct MEdge *medge;
148   /** Deformgroup vertices. */
149   struct MDeformVert *dvert;
150
151   /* array of colors for the tessellated faces, must be number of tessellated
152    * faces * 4 in length */
153   struct MCol *mcol;
154   struct Mesh *texcomesh;
155
156   /* When the object is available, the preferred access method is: BKE_editmesh_from_object(ob) */
157   /** Not saved in file!. */
158   struct BMEditMesh *edit_mesh;
159
160   struct CustomData vdata, edata, fdata;
161
162   /* BMESH ONLY */
163   struct CustomData pdata, ldata;
164   /* END BMESH ONLY */
165
166   int totvert, totedge, totface, totselect;
167
168   /* BMESH ONLY */
169   int totpoly, totloop;
170   /* END BMESH ONLY */
171
172   /* the last selected vertex/edge/face are used for the active face however
173    * this means the active face must always be selected, this is to keep track
174    * of the last selected face and is similar to the old active face flag where
175    * the face does not need to be selected, -1 is inactive */
176   int act_face;
177
178   /* texture space, copied as one block in editobject.c */
179   float loc[3];
180   float size[3];
181   float rot[3];
182
183   short texflag, flag;
184   float smoothresh;
185
186   /* customdata flag, for bevel-weight and crease, which are now optional */
187   char cd_flag, _pad;
188
189   char subdiv DNA_DEPRECATED, subdivr DNA_DEPRECATED;
190   /** Only kept for backwards compat, not used anymore. */
191   char subsurftype DNA_DEPRECATED;
192   char editflag;
193
194   short totcol;
195
196   /** Deprecated multiresolution modeling data, only keep for loading old files. */
197   struct Multires *mr DNA_DEPRECATED;
198   void *_pad1;
199
200   Mesh_Runtime runtime;
201 } Mesh;
202
203 /* deprecated by MTFace, only here for file reading */
204 #ifdef DNA_DEPRECATED
205 typedef struct TFace {
206   /** The faces image for the active UVLayer. */
207   void *tpage;
208   float uv[4][2];
209   unsigned int col[4];
210   char flag, transp;
211   short mode, tile, unwrap;
212 } TFace;
213 #endif
214
215 /* **************** MESH ********************* */
216
217 /* texflag */
218 enum {
219   ME_AUTOSPACE = 1,
220 };
221
222 /* me->editflag */
223 enum {
224   ME_EDIT_MIRROR_X = 1 << 0,
225   ME_EDIT_MIRROR_Y = 1 << 1, /* unused so far */
226   ME_EDIT_MIRROR_Z = 1 << 2, /* unused so far */
227
228   ME_EDIT_PAINT_FACE_SEL = 1 << 3,
229   ME_EDIT_MIRROR_TOPO = 1 << 4,
230   ME_EDIT_PAINT_VERT_SEL = 1 << 5,
231 };
232
233 /* we cant have both flags enabled at once,
234  * flags defined in DNA_scene_types.h */
235 #define ME_EDIT_PAINT_SEL_MODE(_me) \
236   ((_me->editflag & ME_EDIT_PAINT_FACE_SEL) ? \
237        SCE_SELECT_FACE : \
238        (_me->editflag & ME_EDIT_PAINT_VERT_SEL) ? SCE_SELECT_VERTEX : 0)
239
240 /* me->flag */
241 enum {
242   ME_FLAG_UNUSED_0 = 1 << 0,     /* cleared */
243   ME_FLAG_UNUSED_1 = 1 << 1,     /* cleared */
244   ME_FLAG_DEPRECATED_2 = 1 << 2, /* deprecated */
245   ME_FLAG_UNUSED_3 = 1 << 3,     /* cleared */
246   ME_FLAG_UNUSED_4 = 1 << 4,     /* cleared */
247   ME_AUTOSMOOTH = 1 << 5,
248   ME_FLAG_UNUSED_6 = 1 << 6, /* cleared */
249   ME_FLAG_UNUSED_7 = 1 << 7, /* cleared */
250   ME_FLAG_UNUSED_8 = 1 << 8, /* cleared */
251   ME_DS_EXPAND = 1 << 9,
252   ME_SCULPT_DYNAMIC_TOPOLOGY = 1 << 10,
253 };
254
255 /* me->cd_flag */
256 enum {
257   ME_CDFLAG_VERT_BWEIGHT = 1 << 0,
258   ME_CDFLAG_EDGE_BWEIGHT = 1 << 1,
259   ME_CDFLAG_EDGE_CREASE = 1 << 2,
260 };
261
262 /* Subsurf Type */
263 enum {
264   ME_CC_SUBSURF = 0,
265   ME_SIMPLE_SUBSURF = 1,
266 };
267
268 #define MESH_MAX_VERTS 2000000000L
269
270 /* this is so we can save bmesh files that load in trunk, ignoring NGons
271  * will eventually be removed */
272
273 /* enable this so meshes get tessfaces calculated by default */
274 /* #define USE_TESSFACE_DEFAULT */
275
276 #endif