From 57ec1f37e9a8c59a77f8cbdd1e22dd7b6c031c29 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 15 Jul 2020 16:42:17 +0200 Subject: CustomData: add float2 and float3 data types This adds `CD_PROP_FLOAT2` and `CD_PROP_FLOAT3`. Reviewers: brecht Differential Revision: https://developer.blender.org/D8251 --- source/blender/blenkernel/intern/customdata.c | 129 ++++++++++++++++++++++++- source/blender/makesdna/DNA_customdata_types.h | 12 ++- 2 files changed, 137 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index c11fa69db76..b3f1fb9d789 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -1464,6 +1464,102 @@ static int layerMaxNum_propcol(void) return MAX_MCOL; } +static void layerInterp_propfloat3( + const void **sources, const float *weights, const float *sub_weights, int count, void *dest) +{ + vec3f result = {0.0f, 0.0f, 0.0f}; + for (int i = 0; i < count; i++) { + float weight = weights ? weights[i] : 1.0f; + const vec3f *src = sources[i]; + if (sub_weights) { + madd_v3_v3fl(&result.x, &src->x, sub_weights[i] * weight); + } + else { + madd_v3_v3fl(&result.x, &src->x, weight); + } + } + copy_v3_v3((float *)dest, &result.x); +} + +static void layerMultiply_propfloat3(void *data, float fac) +{ + vec3f *vec = data; + vec->x *= fac; + vec->y *= fac; + vec->z *= fac; +} + +static void layerAdd_propfloat3(void *data1, const void *data2) +{ + vec3f *vec1 = data1; + const vec3f *vec2 = data2; + vec1->x += vec2->x; + vec1->y += vec2->y; + vec1->z += vec2->z; +} + +static bool layerValidate_propfloat3(void *data, const uint totitems, const bool do_fixes) +{ + float *values = data; + bool has_errors = false; + for (int i = 0; i < totitems * 3; i++) { + if (!isfinite(values[i])) { + if (do_fixes) { + values[i] = 0.0f; + } + has_errors = true; + } + } + return has_errors; +} + +static void layerInterp_propfloat2( + const void **sources, const float *weights, const float *sub_weights, int count, void *dest) +{ + vec2f result = {0.0f, 0.0f, 0.0f}; + for (int i = 0; i < count; i++) { + float weight = weights ? weights[i] : 1.0f; + const vec2f *src = sources[i]; + if (sub_weights) { + madd_v2_v2fl(&result.x, &src->x, sub_weights[i] * weight); + } + else { + madd_v2_v2fl(&result.x, &src->x, weight); + } + } + copy_v2_v2((float *)dest, &result.x); +} + +static void layerMultiply_propfloat2(void *data, float fac) +{ + vec2f *vec = data; + vec->x *= fac; + vec->y *= fac; +} + +static void layerAdd_propfloat2(void *data1, const void *data2) +{ + vec2f *vec1 = data1; + const vec2f *vec2 = data2; + vec1->x += vec2->x; + vec1->y += vec2->y; +} + +static bool layerValidate_propfloat2(void *data, const uint totitems, const bool do_fixes) +{ + float *values = data; + bool has_errors = false; + for (int i = 0; i < totitems * 2; i++) { + if (!isfinite(values[i])) { + if (do_fixes) { + values[i] = 0.0f; + } + has_errors = true; + } + } + return has_errors; +} + static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { /* 0: CD_MVERT */ {sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL}, @@ -1799,7 +1895,38 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { NULL, NULL, NULL, - layerMaxNum_propcol}}; + layerMaxNum_propcol}, + /* 48: CD_PROP_FLOAT3 */ + {sizeof(float[3]), + "vec3f", + 1, + N_("Float3"), + NULL, + NULL, + layerInterp_propfloat3, + NULL, + NULL, + layerValidate_propfloat3, + NULL, + layerMultiply_propfloat3, + NULL, + layerAdd_propfloat3}, + /* 49: CD_PROP_FLOAT2 */ + {sizeof(float[2]), + "vec2f", + 1, + N_("Float2"), + NULL, + NULL, + layerInterp_propfloat2, + NULL, + NULL, + layerValidate_propfloat2, + NULL, + layerMultiply_propfloat2, + NULL, + layerAdd_propfloat2}, +}; static const char *LAYERTYPENAMES[CD_NUMTYPES] = { /* 0-4 */ "CDMVert", diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h index c24bbccae1e..7a9744ed1c7 100644 --- a/source/blender/makesdna/DNA_customdata_types.h +++ b/source/blender/makesdna/DNA_customdata_types.h @@ -76,7 +76,7 @@ typedef struct CustomData { * MUST be >= CD_NUMTYPES, but we cant use a define here. * Correct size is ensured in CustomData_update_typemap assert(). */ - int typemap[48]; + int typemap[50]; char _pad[4]; /** Number of layers, size of layers array. */ int totlayer, maxlayer; @@ -154,8 +154,10 @@ typedef enum CustomDataType { CD_HAIRMAPPING = 46, CD_PROP_COLOR = 47, + CD_PROP_FLOAT3 = 48, + CD_PROP_FLOAT2 = 49, - CD_NUMTYPES = 48, + CD_NUMTYPES = 50, } CustomDataType; /* Bits for CustomDataMask */ @@ -205,9 +207,13 @@ typedef enum CustomDataType { #define CD_MASK_CUSTOMLOOPNORMAL (1LL << CD_CUSTOMLOOPNORMAL) #define CD_MASK_SCULPT_FACE_SETS (1LL << CD_SCULPT_FACE_SETS) #define CD_MASK_PROP_COLOR (1ULL << CD_PROP_COLOR) +#define CD_MASK_PROP_FLOAT3 (1ULL << CD_PROP_FLOAT3) +#define CD_MASK_PROP_FLOAT2 (1ULL << CD_PROP_FLOAT2) /** Data types that may be defined for all mesh elements types. */ -#define CD_MASK_GENERIC_DATA (CD_MASK_PROP_FLOAT | CD_MASK_PROP_INT32 | CD_MASK_PROP_STRING) +#define CD_MASK_GENERIC_DATA \ + (CD_MASK_PROP_FLOAT | CD_MASK_PROP_INT32 | CD_MASK_PROP_STRING | CD_MASK_PROP_FLOAT3 | \ + CD_MASK_PROP_FLOAT2) /** Multires loop data. */ #define CD_MASK_MULTIRES_GRIDS (CD_MASK_MDISPS | CD_GRID_PAINT_MASK) -- cgit v1.2.3