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
This commit is contained in:
parent
e06a346458
commit
57ec1f37e9
|
@ -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",
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue