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