Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/customdata.c
| Show First 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | |||||
| /* number of layers to add when growing a CustomData object */ | /* number of layers to add when growing a CustomData object */ | ||||
| #define CUSTOMDATA_GROW 5 | #define CUSTOMDATA_GROW 5 | ||||
| /* ensure typemap size is ok */ | /* ensure typemap size is ok */ | ||||
| BLI_STATIC_ASSERT(ARRAY_SIZE(((CustomData *)NULL)->typemap) == CD_NUMTYPES, "size mismatch"); | BLI_STATIC_ASSERT(ARRAY_SIZE(((CustomData *)NULL)->typemap) == CD_NUMTYPES, "size mismatch"); | ||||
| static CLG_LogRef LOG = {"bke.customdata"}; | static CLG_LogRef LOG = {"bke.customdata"}; | ||||
| /** Update mask_dst with layers defined in mask_src (equivalent to a bitwise OR). */ | |||||
| void CustomData_Masks_update(CustomData_Masks *mask_dst, const CustomData_Masks *mask_src) | |||||
| { | |||||
| mask_dst->vmask |= mask_src->vmask; | |||||
| mask_dst->emask |= mask_src->emask; | |||||
| mask_dst->fmask |= mask_src->fmask; | |||||
| mask_dst->pmask |= mask_src->pmask; | |||||
| mask_dst->lmask |= mask_src->lmask; | |||||
| } | |||||
| /** Return True if all layers set in \a mask_required are also set in \a mask_ref */ | |||||
| bool CustomData_Masks_are_matching(const CustomData_Masks *mask_ref, const CustomData_Masks *mask_required) | |||||
| { | |||||
| return (((mask_required->vmask & mask_ref->vmask) == mask_required->vmask) && | |||||
| ((mask_required->emask & mask_ref->emask) == mask_required->emask) && | |||||
| ((mask_required->fmask & mask_ref->fmask) == mask_required->fmask) && | |||||
| ((mask_required->pmask & mask_ref->pmask) == mask_required->pmask) && | |||||
| ((mask_required->lmask & mask_ref->lmask) == mask_required->lmask)); | |||||
| } | |||||
| /********************* Layer type information **********************/ | /********************* Layer type information **********************/ | ||||
| typedef struct LayerTypeInfo { | typedef struct LayerTypeInfo { | ||||
| int size; /* the memory size of one element of this layer's data */ | int size; /* the memory size of one element of this layer's data */ | ||||
| /** name of the struct used, for file writing */ | /** name of the struct used, for file writing */ | ||||
| const char *structname; | const char *structname; | ||||
| /** number of structs per element, for file writing */ | /** number of structs per element, for file writing */ | ||||
| int structnum; | int structnum; | ||||
| ▲ Show 20 Lines • Show All 1,292 Lines • ▼ Show 20 Lines | /* BMESH ONLY */ | ||||
| /* 25-29 */ "CDMPoly", "CDMLoop", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight", | /* 25-29 */ "CDMPoly", "CDMLoop", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight", | ||||
| /* 30-34 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDPreviewLoopCol", "CDBMElemPyPtr", "CDPaintMask", | /* 30-34 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDPreviewLoopCol", "CDBMElemPyPtr", "CDPaintMask", | ||||
| /* 35-36 */ "CDGridPaintMask", "CDMVertSkin", | /* 35-36 */ "CDGridPaintMask", "CDMVertSkin", | ||||
| /* 37-38 */ "CDFreestyleEdge", "CDFreestyleFace", | /* 37-38 */ "CDFreestyleEdge", "CDFreestyleFace", | ||||
| /* 39-41 */ "CDMLoopTangent", "CDTessLoopNormal", "CDCustomLoopNormal", | /* 39-41 */ "CDMLoopTangent", "CDTessLoopNormal", "CDCustomLoopNormal", | ||||
| }; | }; | ||||
| const CustomDataMask CD_MASK_BAREMESH = | const CustomData_Masks CD_MASK_BAREMESH = { | ||||
| CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MLOOP | CD_MASK_MPOLY | CD_MASK_BWEIGHT | CD_MASK_FACEMAP; | .vmask = CD_MASK_MVERT | CD_MASK_BWEIGHT, | ||||
| const CustomDataMask CD_MASK_MESH = | .emask = CD_MASK_MEDGE | CD_MASK_BWEIGHT, | ||||
| CD_MASK_MVERT | CD_MASK_MEDGE | | .fmask = 0, | ||||
| CD_MASK_MDEFORMVERT | | .lmask = CD_MASK_MLOOP, | ||||
| CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | | .pmask = CD_MASK_MPOLY | CD_MASK_FACEMAP, | ||||
| CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP | | }; | ||||
| CD_MASK_RECAST | CD_MASK_PAINT_MASK | | const CustomData_Masks CD_MASK_BAREMESH_ORIGINDEX = { | ||||
| CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE | | .vmask = CD_MASK_MVERT | CD_MASK_BWEIGHT | CD_MASK_ORIGINDEX, | ||||
| CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP; | .emask = CD_MASK_MEDGE | CD_MASK_BWEIGHT | CD_MASK_ORIGINDEX, | ||||
| const CustomDataMask CD_MASK_EDITMESH = | .fmask = 0, | ||||
| CD_MASK_MDEFORMVERT | CD_MASK_MLOOPUV | | .lmask = CD_MASK_MLOOP, | ||||
| CD_MASK_MLOOPCOL | CD_MASK_SHAPE_KEYINDEX | | .pmask = CD_MASK_MPOLY | CD_MASK_FACEMAP | CD_MASK_ORIGINDEX, | ||||
| CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | | }; | ||||
| CD_MASK_MDISPS | CD_MASK_SHAPEKEY | CD_MASK_RECAST | CD_MASK_PAINT_MASK | | const CustomData_Masks CD_MASK_MESH = { | ||||
| CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP; | .vmask = (CD_MASK_MVERT | CD_MASK_MDEFORMVERT | CD_MASK_BWEIGHT | CD_MASK_MVERT_SKIN | CD_MASK_PAINT_MASK | | ||||
| const CustomDataMask CD_MASK_DERIVEDMESH = | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_MDEFORMVERT | | .emask = (CD_MASK_MEDGE | CD_MASK_BWEIGHT | CD_MASK_FREESTYLE_EDGE | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO | | .fmask = 0, | ||||
| CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_PREVIEW_MLOOPCOL | | .lmask = (CD_MASK_MLOOP | CD_MASK_MDISPS | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_CUSTOMLOOPNORMAL | | ||||
| CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT | | CD_MASK_GRID_PAINT_MASK | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_PREVIEW_MCOL | CD_MASK_SHAPEKEY | CD_MASK_RECAST | | .pmask = (CD_MASK_MPOLY | CD_MASK_RECAST | CD_MASK_FACEMAP | CD_MASK_FREESTYLE_FACE | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE | | }; | ||||
| CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP; | const CustomData_Masks CD_MASK_EDITMESH = { | ||||
| const CustomDataMask CD_MASK_BMESH = | .vmask = (CD_MASK_MDEFORMVERT | CD_MASK_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_SHAPEKEY | | ||||
| CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | | CD_MASK_SHAPE_KEYINDEX | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | | .emask = (CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS | | .fmask = 0, | ||||
| CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST | CD_MASK_PAINT_MASK | | .lmask = (CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_GRID_PAINT_MASK | | ||||
| CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE | | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP; | .pmask = (CD_MASK_MDISPS | CD_MASK_RECAST | CD_MASK_FACEMAP | CD_MASK_GENERIC_DATA), | ||||
| }; | |||||
| const CustomData_Masks CD_MASK_DERIVEDMESH = { | |||||
| .vmask = (CD_MASK_ORIGINDEX | CD_MASK_MDEFORMVERT | CD_MASK_SHAPEKEY | CD_MASK_MVERT_SKIN | | |||||
| CD_MASK_ORCO | CD_MASK_CLOTH_ORCO | CD_MASK_GENERIC_DATA), | |||||
| .emask = (CD_MASK_ORIGINDEX | CD_MASK_FREESTYLE_EDGE | CD_MASK_GENERIC_DATA), | |||||
| .fmask = (CD_MASK_ORIGINDEX | CD_MASK_ORIGSPACE | CD_MASK_PREVIEW_MCOL | CD_MASK_TANGENT), | |||||
| .lmask = (CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_PREVIEW_MLOOPCOL | | |||||
| CD_MASK_ORIGSPACE_MLOOP | CD_MASK_TANGENT | CD_MASK_GENERIC_DATA), | |||||
| .pmask = (CD_MASK_ORIGINDEX | CD_MASK_RECAST | CD_MASK_FREESTYLE_FACE | CD_MASK_FACEMAP | CD_MASK_GENERIC_DATA), | |||||
| }; | |||||
| const CustomData_Masks CD_MASK_BMESH = { | |||||
| .vmask = (CD_MASK_MDEFORMVERT | CD_MASK_BWEIGHT | CD_MASK_MVERT_SKIN | CD_MASK_SHAPEKEY | | |||||
| CD_MASK_SHAPE_KEYINDEX | CD_MASK_PAINT_MASK | CD_MASK_GENERIC_DATA), | |||||
| .emask = (CD_MASK_BWEIGHT | CD_MASK_CREASE | CD_MASK_FREESTYLE_EDGE | CD_MASK_GENERIC_DATA), | |||||
| .fmask = 0, | |||||
| .lmask = (CD_MASK_MDISPS | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_CUSTOMLOOPNORMAL | | |||||
| CD_MASK_GRID_PAINT_MASK | CD_MASK_GENERIC_DATA), | |||||
| .pmask = (CD_MASK_RECAST | CD_MASK_FREESTYLE_FACE | CD_MASK_FACEMAP | CD_MASK_GENERIC_DATA), | |||||
| }; | |||||
| /** | /** | ||||
| * cover values copied by #BKE_mesh_loops_to_tessdata | * cover values copied by #BKE_mesh_loops_to_tessdata | ||||
| */ | */ | ||||
| const CustomDataMask CD_MASK_FACECORNERS = | const CustomData_Masks CD_MASK_FACECORNERS = { | ||||
| CD_MASK_MTFACE | CD_MASK_MLOOPUV | | .vmask = 0, | ||||
| CD_MASK_MCOL | CD_MASK_MLOOPCOL | | .emask = 0, | ||||
| CD_MASK_PREVIEW_MCOL | CD_MASK_PREVIEW_MLOOPCOL | | .fmask = (CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_PREVIEW_MCOL | CD_MASK_ORIGSPACE | | ||||
| CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | | CD_MASK_TESSLOOPNORMAL | CD_MASK_TANGENT), | ||||
| CD_MASK_TESSLOOPNORMAL | CD_MASK_NORMAL | | .lmask = (CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_PREVIEW_MLOOPCOL | CD_MASK_ORIGSPACE_MLOOP | | ||||
| CD_MASK_TANGENT | CD_MASK_MLOOPTANGENT; | CD_MASK_NORMAL | CD_MASK_MLOOPTANGENT), | ||||
| const CustomDataMask CD_MASK_EVERYTHING = | .pmask = 0, | ||||
| CD_MASK_MVERT | CD_MASK_MDEFORMVERT | CD_MASK_MEDGE | CD_MASK_MFACE | | }; | ||||
| CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_NORMAL /* | CD_MASK_POLYINDEX */ | CD_MASK_PROP_FLT | | const CustomData_Masks CD_MASK_EVERYTHING = { | ||||
| CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_MLOOPUV | | .vmask = (CD_MASK_MVERT | CD_MASK_BM_ELEM_PYPTR | CD_MASK_ORIGINDEX | CD_MASK_NORMAL | CD_MASK_MDEFORMVERT | | ||||
| CD_MASK_MLOOPCOL | CD_MASK_TANGENT | CD_MASK_MDISPS | CD_MASK_PREVIEW_MCOL | CD_MASK_CLOTH_ORCO | CD_MASK_RECAST | | CD_MASK_BWEIGHT | CD_MASK_MVERT_SKIN | CD_MASK_ORCO | CD_MASK_CLOTH_ORCO | CD_MASK_SHAPEKEY | | ||||
| /* BMESH ONLY START */ | CD_MASK_SHAPE_KEYINDEX | CD_MASK_PAINT_MASK | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_MPOLY | CD_MASK_MLOOP | CD_MASK_SHAPE_KEYINDEX | CD_MASK_SHAPEKEY | CD_MASK_BWEIGHT | CD_MASK_CREASE | | .emask = (CD_MASK_MEDGE | CD_MASK_BM_ELEM_PYPTR | CD_MASK_ORIGINDEX | CD_MASK_BWEIGHT | CD_MASK_CREASE | | ||||
| CD_MASK_ORIGSPACE_MLOOP | CD_MASK_PREVIEW_MLOOPCOL | CD_MASK_BM_ELEM_PYPTR | | CD_MASK_FREESTYLE_EDGE | CD_MASK_GENERIC_DATA), | ||||
| /* BMESH ONLY END */ | .fmask = (CD_MASK_MFACE | CD_MASK_ORIGINDEX | CD_MASK_NORMAL | CD_MASK_MTFACE | CD_MASK_MCOL | | ||||
| CD_MASK_PAINT_MASK | CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | | CD_MASK_ORIGSPACE | CD_MASK_TANGENT | CD_MASK_TESSLOOPNORMAL | CD_MASK_PREVIEW_MCOL | | ||||
| CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE | | CD_MASK_GENERIC_DATA), | ||||
| CD_MASK_MLOOPTANGENT | CD_MASK_TESSLOOPNORMAL | CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP; | .lmask = (CD_MASK_MLOOP | CD_MASK_BM_ELEM_PYPTR | CD_MASK_MDISPS | CD_MASK_NORMAL | CD_MASK_MLOOPUV | | ||||
| CD_MASK_MLOOPCOL | CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_MLOOPTANGENT | CD_MASK_PREVIEW_MLOOPCOL | | |||||
| CD_MASK_ORIGSPACE_MLOOP | CD_MASK_GRID_PAINT_MASK | CD_MASK_GENERIC_DATA), | |||||
| .pmask = (CD_MASK_MPOLY | CD_MASK_BM_ELEM_PYPTR | CD_MASK_ORIGINDEX | CD_MASK_NORMAL | CD_MASK_RECAST | | |||||
| CD_MASK_FACEMAP | CD_MASK_FREESTYLE_FACE | CD_MASK_GENERIC_DATA), | |||||
| }; | |||||
| static const LayerTypeInfo *layerType_getInfo(int type) | static const LayerTypeInfo *layerType_getInfo(int type) | ||||
| { | { | ||||
| if (type < 0 || type >= CD_NUMTYPES) return NULL; | if (type < 0 || type >= CD_NUMTYPES) return NULL; | ||||
| return &LAYERTYPEINFO[type]; | return &LAYERTYPEINFO[type]; | ||||
| } | } | ||||
| static const char *layerType_getName(int type) | static const char *layerType_getName(int type) | ||||
| { | { | ||||
| if (type < 0 || type >= CD_NUMTYPES) return NULL; | if (type < 0 || type >= CD_NUMTYPES) return NULL; | ||||
| return LAYERTYPENAMES[type]; | return LAYERTYPENAMES[type]; | ||||
| } | } | ||||
| void customData_mask_layers__print(CustomDataMask mask) | void customData_mask_layers__print(const CustomData_Masks *mask) | ||||
| { | { | ||||
| int i; | int i; | ||||
| printf("mask=0x%lx:\n", (long unsigned int)mask); | printf("verts mask=0x%lx:\n", (long unsigned int)mask->vmask); | ||||
| for (i = 0; i < CD_NUMTYPES; i++) { | |||||
| if (mask->vmask & CD_TYPE_AS_MASK(i)) { | |||||
| printf(" %s\n", layerType_getName(i)); | |||||
| } | |||||
| } | |||||
| printf("edges mask=0x%lx:\n", (long unsigned int)mask->emask); | |||||
| for (i = 0; i < CD_NUMTYPES; i++) { | |||||
| if (mask->emask & CD_TYPE_AS_MASK(i)) { | |||||
| printf(" %s\n", layerType_getName(i)); | |||||
| } | |||||
| } | |||||
| printf("faces mask=0x%lx:\n", (long unsigned int)mask->fmask); | |||||
| for (i = 0; i < CD_NUMTYPES; i++) { | |||||
| if (mask->fmask & CD_TYPE_AS_MASK(i)) { | |||||
| printf(" %s\n", layerType_getName(i)); | |||||
| } | |||||
| } | |||||
| printf("loops mask=0x%lx:\n", (long unsigned int)mask->lmask); | |||||
| for (i = 0; i < CD_NUMTYPES; i++) { | |||||
| if (mask->lmask & CD_TYPE_AS_MASK(i)) { | |||||
| printf(" %s\n", layerType_getName(i)); | |||||
| } | |||||
| } | |||||
| printf("polys mask=0x%lx:\n", (long unsigned int)mask->pmask); | |||||
| for (i = 0; i < CD_NUMTYPES; i++) { | for (i = 0; i < CD_NUMTYPES; i++) { | ||||
| if (mask & CD_TYPE_AS_MASK(i)) { | if (mask->pmask & CD_TYPE_AS_MASK(i)) { | ||||
| printf(" %s\n", layerType_getName(i)); | printf(" %s\n", layerType_getName(i)); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /********************* CustomData functions *********************/ | /********************* CustomData functions *********************/ | ||||
| static void customData_update_offsets(CustomData *data); | static void customData_update_offsets(CustomData *data); | ||||
| ▲ Show 20 Lines • Show All 2,656 Lines • Show Last 20 Lines | |||||