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  * Used for custom mesh data types (stored per vert/edge/loop/face)
24  */
25 
26 #pragma once
27 
28 #include "DNA_defs.h"
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 /** Descriptor and storage for a custom data layer. */
35 typedef struct CustomDataLayer {
36   /** Type of data in layer. */
37   int type;
38   /** In editmode, offset of layer in block. */
39   int offset;
40   /** General purpose flag. */
41   int flag;
42   /** Number of the active layer of this type. */
43   int active;
44   /** Number of the layer to render. */
45   int active_rnd;
46   /** Number of the layer to render. */
47   int active_clone;
48   /** Number of the layer to render. */
49   int active_mask;
50   /** Shape keyblock unique id reference. */
51   int uid;
52   /** Layer name, MAX_CUSTOMDATA_LAYER_NAME. */
53   char name[64];
54   /** Layer data. */
55   void *data;
56 } CustomDataLayer;
57 
58 #define MAX_CUSTOMDATA_LAYER_NAME 64
59 
60 typedef struct CustomDataExternal {
61   /** FILE_MAX. */
62   char filename[1024];
63 } CustomDataExternal;
64 
65 /**
66  * Structure which stores custom element data associated with mesh elements
67  * (vertices, edges or faces). The custom data is organized into a series of
68  * layers, each with a data type (e.g. MTFace, MDeformVert, etc.).
69  */
70 typedef struct CustomData {
71   /** CustomDataLayers, ordered by type. */
72   CustomDataLayer *layers;
73   /**
74    * runtime only! - maps types to indices of first layer of that type,
75    * MUST be >= CD_NUMTYPES, but we cant use a define here.
76    * Correct size is ensured in CustomData_update_typemap assert().
77    */
78   int typemap[50];
79   char _pad[4];
80   /** Number of layers, size of layers array. */
81   int totlayer, maxlayer;
82   /** In editmode, total size of all data layers. */
83   int totsize;
84   /** (BMesh Only): Memory pool for allocation of blocks. */
85   struct BLI_mempool *pool;
86   /** External file storing customdata layers. */
87   CustomDataExternal *external;
88 } CustomData;
89 
90 /* CustomData.type */
91 typedef enum CustomDataType {
92   /* Used by GLSL attributes in the cases when we need a delayed CD type
93    * assignment (in the cases when we don't know in advance which layer
94    * we are addressing).
95    */
96   CD_AUTO_FROM_NAME = -1,
97 
98   CD_MVERT = 0,
99 #ifdef DNA_DEPRECATED_ALLOW
100   CD_MSTICKY = 1, /* DEPRECATED */
101 #endif
102   CD_MDEFORMVERT = 2,
103   CD_MEDGE = 3,
104   CD_MFACE = 4,
105   CD_MTFACE = 5,
106   CD_MCOL = 6,
107   CD_ORIGINDEX = 7,
108   CD_NORMAL = 8,
109   CD_FACEMAP = 9, /* exclusive face group, each face can only be part of one */
110   CD_PROP_FLOAT = 10,
111   CD_PROP_INT32 = 11,
112   CD_PROP_STRING = 12,
113   CD_ORIGSPACE = 13, /* for modifier stack face location mapping */
114   CD_ORCO = 14,      /* undeformed vertex coordinates, normalized to 0..1 range */
115 #ifdef DNA_DEPRECATED_ALLOW
116   CD_MTEXPOLY = 15, /* deprecated */
117 #endif
118   CD_MLOOPUV = 16,
119   CD_MLOOPCOL = 17,
120   CD_TANGENT = 18,
121   CD_MDISPS = 19,
122   CD_PREVIEW_MCOL = 20,           /* for displaying weightpaint colors */
123                                   /*  CD_ID_MCOL          = 21, */
124   /* CD_TEXTURE_MLOOPCOL = 22, */ /* UNUSED */
125   CD_CLOTH_ORCO = 23,
126   /* CD_RECAST = 24, */ /* UNUSED */
127 
128   /* BMESH ONLY START */
129   CD_MPOLY = 25,
130   CD_MLOOP = 26,
131   CD_SHAPE_KEYINDEX = 27,
132   CD_SHAPEKEY = 28,
133   CD_BWEIGHT = 29,
134   CD_CREASE = 30,
135   CD_ORIGSPACE_MLOOP = 31,
136   CD_PREVIEW_MLOOPCOL = 32,
137   CD_BM_ELEM_PYPTR = 33,
138   /* BMESH ONLY END */
139 
140   CD_PAINT_MASK = 34,
141   CD_GRID_PAINT_MASK = 35,
142   CD_MVERT_SKIN = 36,
143   CD_FREESTYLE_EDGE = 37,
144   CD_FREESTYLE_FACE = 38,
145   CD_MLOOPTANGENT = 39,
146   CD_TESSLOOPNORMAL = 40,
147   CD_CUSTOMLOOPNORMAL = 41,
148   CD_SCULPT_FACE_SETS = 42,
149 
150   /* CD_LOCATION = 43, */ /* UNUSED */
151   /* CD_RADIUS = 44, */   /* UNUSED */
152   CD_HAIRCURVE = 45,
153   CD_HAIRMAPPING = 46,
154 
155   CD_PROP_COLOR = 47,
156   CD_PROP_FLOAT3 = 48,
157   CD_PROP_FLOAT2 = 49,
158 
159   CD_NUMTYPES = 50,
160 } CustomDataType;
161 
162 /* Bits for CustomDataMask */
163 #define CD_MASK_MVERT (1 << CD_MVERT)
164 // #define CD_MASK_MSTICKY      (1 << CD_MSTICKY)  /* DEPRECATED */
165 #define CD_MASK_MDEFORMVERT (1 << CD_MDEFORMVERT)
166 #define CD_MASK_MEDGE (1 << CD_MEDGE)
167 #define CD_MASK_MFACE (1 << CD_MFACE)
168 #define CD_MASK_MTFACE (1 << CD_MTFACE)
169 #define CD_MASK_MCOL (1 << CD_MCOL)
170 #define CD_MASK_ORIGINDEX (1 << CD_ORIGINDEX)
171 #define CD_MASK_NORMAL (1 << CD_NORMAL)
172 #define CD_MASK_FACEMAP (1 << CD_FACEMAP)
173 #define CD_MASK_PROP_FLOAT (1 << CD_PROP_FLOAT)
174 #define CD_MASK_PROP_INT32 (1 << CD_PROP_INT32)
175 #define CD_MASK_PROP_STRING (1 << CD_PROP_STRING)
176 #define CD_MASK_ORIGSPACE (1 << CD_ORIGSPACE)
177 #define CD_MASK_ORCO (1 << CD_ORCO)
178 // #define CD_MASK_MTEXPOLY (1 << CD_MTEXPOLY)  /* DEPRECATED */
179 #define CD_MASK_MLOOPUV (1 << CD_MLOOPUV)
180 #define CD_MASK_MLOOPCOL (1 << CD_MLOOPCOL)
181 #define CD_MASK_TANGENT (1 << CD_TANGENT)
182 #define CD_MASK_MDISPS (1 << CD_MDISPS)
183 #define CD_MASK_PREVIEW_MCOL (1 << CD_PREVIEW_MCOL)
184 #define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO)
185 // #define CD_MASK_RECAST (1 << CD_RECAST)  /* DEPRECATED */
186 
187 /* BMESH ONLY START */
188 #define CD_MASK_MPOLY (1 << CD_MPOLY)
189 #define CD_MASK_MLOOP (1 << CD_MLOOP)
190 #define CD_MASK_SHAPE_KEYINDEX (1 << CD_SHAPE_KEYINDEX)
191 #define CD_MASK_SHAPEKEY (1 << CD_SHAPEKEY)
192 #define CD_MASK_BWEIGHT (1 << CD_BWEIGHT)
193 #define CD_MASK_CREASE (1 << CD_CREASE)
194 #define CD_MASK_ORIGSPACE_MLOOP (1LL << CD_ORIGSPACE_MLOOP)
195 #define CD_MASK_PREVIEW_MLOOPCOL (1LL << CD_PREVIEW_MLOOPCOL)
196 #define CD_MASK_BM_ELEM_PYPTR (1LL << CD_BM_ELEM_PYPTR)
197 /* BMESH ONLY END */
198 
199 #define CD_MASK_PAINT_MASK (1LL << CD_PAINT_MASK)
200 #define CD_MASK_GRID_PAINT_MASK (1LL << CD_GRID_PAINT_MASK)
201 #define CD_MASK_MVERT_SKIN (1LL << CD_MVERT_SKIN)
202 #define CD_MASK_FREESTYLE_EDGE (1LL << CD_FREESTYLE_EDGE)
203 #define CD_MASK_FREESTYLE_FACE (1LL << CD_FREESTYLE_FACE)
204 #define CD_MASK_MLOOPTANGENT (1LL << CD_MLOOPTANGENT)
205 #define CD_MASK_TESSLOOPNORMAL (1LL << CD_TESSLOOPNORMAL)
206 #define CD_MASK_CUSTOMLOOPNORMAL (1LL << CD_CUSTOMLOOPNORMAL)
207 #define CD_MASK_SCULPT_FACE_SETS (1LL << CD_SCULPT_FACE_SETS)
208 #define CD_MASK_PROP_COLOR (1ULL << CD_PROP_COLOR)
209 #define CD_MASK_PROP_FLOAT3 (1ULL << CD_PROP_FLOAT3)
210 #define CD_MASK_PROP_FLOAT2 (1ULL << CD_PROP_FLOAT2)
211 
212 /** Multires loop data. */
213 #define CD_MASK_MULTIRES_GRIDS (CD_MASK_MDISPS | CD_GRID_PAINT_MASK)
214 
215 /* All data layers. */
216 #define CD_MASK_ALL (~0LL)
217 
218 /* All generic attributes. */
219 #define CD_MASK_PROP_ALL \
220   (CD_MASK_PROP_FLOAT | CD_MASK_PROP_FLOAT2 | CD_MASK_PROP_FLOAT3 | CD_MASK_PROP_INT32 | \
221    CD_MASK_PROP_COLOR | CD_MASK_PROP_STRING | CD_MASK_MLOOPCOL)
222 
223 typedef struct CustomData_MeshMasks {
224   uint64_t vmask;
225   uint64_t emask;
226   uint64_t fmask;
227   uint64_t pmask;
228   uint64_t lmask;
229 } CustomData_MeshMasks;
230 
231 /* CustomData.flag */
232 enum {
233   /* Indicates layer should not be copied by CustomData_from_template or CustomData_copy_data */
234   CD_FLAG_NOCOPY = (1 << 0),
235   /* Indicates layer should not be freed (for layers backed by external data) */
236   CD_FLAG_NOFREE = (1 << 1),
237   /* Indicates the layer is only temporary, also implies no copy */
238   CD_FLAG_TEMPORARY = ((1 << 2) | CD_FLAG_NOCOPY),
239   /* Indicates the layer is stored in an external file */
240   CD_FLAG_EXTERNAL = (1 << 3),
241   /* Indicates external data is read into memory */
242   CD_FLAG_IN_MEMORY = (1 << 4),
243 };
244 
245 /* Limits */
246 #define MAX_MTFACE 8
247 #define MAX_MCOL 8
248 
249 #define DYNTOPO_NODE_NONE -1
250 
251 #define CD_TEMP_CHUNK_SIZE 128
252 
253 #ifdef __cplusplus
254 }
255 #endif
256