Cleanup: minor changes to deform functions

- Use 'float (*)[3]' to avoid casts.
- Remove unnecessary float[3] copy in gpencil_deform_verts.
- Use MEM_SAFE_FREE
- Use const arguments.
This commit is contained in:
Campbell Barton 2020-06-12 14:29:59 +10:00
parent 24d39620fb
commit f79856f9fb
11 changed files with 30 additions and 43 deletions

View File

@ -31,7 +31,7 @@ extern "C" {
struct Mesh *BKE_mesh_wrapper_from_editmesh_with_coords(
struct BMEditMesh *em,
const struct CustomData_MeshMasks *cd_mask_extra,
float (*vertexCos)[3],
const float (*vert_coords)[3],
const struct Mesh *me_settings);
struct Mesh *BKE_mesh_wrapper_from_editmesh(struct BMEditMesh *em,
const struct CustomData_MeshMasks *cd_mask_extra,

View File

@ -1566,7 +1566,7 @@ static void armature_vert_task(void *__restrict userdata,
dq = &sumdq;
}
else {
sumvec[0] = sumvec[1] = sumvec[2] = 0.0f;
zero_v3(sumvec);
vec = sumvec;
if (vert_deform_mats) {
@ -1622,7 +1622,7 @@ static void armature_vert_task(void *__restrict userdata,
mul_m4_v3(data->premat, co);
if (use_dverts && dvert && dvert->totweight) { /* use weight groups ? */
MDeformWeight *dw = dvert->dw;
const MDeformWeight *dw = dvert->dw;
int deformed = 0;
unsigned int j;
for (j = dvert->totweight; j != 0; j--, dw++) {

View File

@ -53,7 +53,7 @@
Mesh *BKE_mesh_wrapper_from_editmesh_with_coords(BMEditMesh *em,
const CustomData_MeshMasks *cd_mask_extra,
float (*vertexCos)[3],
const float (*vert_coords)[3],
const Mesh *me_settings)
{
Mesh *me = BKE_id_new_nomain(ID_ME, NULL);
@ -83,7 +83,7 @@ Mesh *BKE_mesh_wrapper_from_editmesh_with_coords(BMEditMesh *em,
#endif
EditMeshData *edit_data = me->runtime.edit_data;
edit_data->vertexCos = vertexCos;
edit_data->vertexCos = vert_coords;
return me;
}

View File

@ -878,10 +878,7 @@ void BKE_modifier_free_temporary_data(ModifierData *md)
if (md->type == eModifierType_Armature) {
ArmatureModifierData *amd = (ArmatureModifierData *)md;
if (amd->prevCos) {
MEM_freeN(amd->prevCos);
amd->prevCos = NULL;
}
MEM_SAFE_FREE(amd->vert_coords_prev);
}
}

View File

@ -5595,7 +5595,7 @@ static void direct_link_modifiers(BlendDataReader *reader, ListBase *lb, Object
else if (md->type == eModifierType_Armature) {
ArmatureModifierData *amd = (ArmatureModifierData *)md;
amd->prevCos = NULL;
amd->vert_coords_prev = NULL;
}
else if (md->type == eModifierType_Cloth) {
ClothModifierData *clmd = (ClothModifierData *)md;

View File

@ -69,38 +69,34 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
static void gpencil_deform_verts(ArmatureGpencilModifierData *mmd, Object *target, bGPDstroke *gps)
{
bGPDspoint *pt = gps->points;
float *all_vert_coords = MEM_callocN(sizeof(float) * 3 * gps->totpoints, __func__);
float(*vert_coords)[3] = MEM_mallocN(sizeof(float[3]) * gps->totpoints, __func__);
int i;
BKE_gpencil_dvert_ensure(gps);
/* prepare array of points */
for (i = 0; i < gps->totpoints; i++, pt++) {
float *pt_coords = &all_vert_coords[3 * i];
float co[3];
copy_v3_v3(co, &pt->x);
copy_v3_v3(pt_coords, co);
copy_v3_v3(vert_coords[i], &pt->x);
}
/* deform verts */
BKE_armature_deform_coords_with_gpencil_stroke(mmd->object,
target,
(float(*)[3])all_vert_coords,
vert_coords,
NULL,
gps->totpoints,
mmd->deformflag,
(float(*)[3])mmd->prevCos,
mmd->vert_coords_prev,
mmd->vgname,
gps);
/* Apply deformed coordinates */
pt = gps->points;
for (i = 0; i < gps->totpoints; i++, pt++) {
float *pt_coords = &all_vert_coords[3 * i];
copy_v3_v3(&pt->x, pt_coords);
copy_v3_v3(&pt->x, vert_coords[i]);
}
MEM_SAFE_FREE(all_vert_coords);
MEM_freeN(vert_coords);
}
/* deform stroke */

View File

@ -655,12 +655,12 @@ typedef enum eSmoothGpencil_Flag {
typedef struct ArmatureGpencilModifierData {
GpencilModifierData modifier;
/** Deformflag replaces armature->deformflag. */
/** #eArmature_DeformFlag use instead of #bArmature.deformflag. */
short deformflag, multi;
int _pad;
struct Object *object;
/** Stored input of previous modifier, for vertexgroup blending. */
float *prevCos;
/** Stored input of previous modifier, for vertex-group blending. */
float (*vert_coords_prev)[3];
/** MAX_VGROUP_NAME. */
char vgname[64];

View File

@ -693,12 +693,12 @@ enum {
typedef struct ArmatureModifierData {
ModifierData modifier;
/** Deformflag replaces armature->deformflag. */
/** #eArmature_DeformFlag use instead of #bArmature.deformflag. */
short deformflag, multi;
char _pad2[4];
struct Object *object;
/** Stored input of previous modifier, for vertexgroup blending. */
float *prevCos;
/** Stored input of previous modifier, for vertex-group blending. */
float (*vert_coords_prev)[3];
/** MAX_VGROUP_NAME. */
char defgrp_name[64];
} ArmatureModifierData;

View File

@ -74,7 +74,7 @@ static void copyData(const ModifierData *md, ModifierData *target, const int fla
ArmatureModifierData *tamd = (ArmatureModifierData *)target;
BKE_modifier_copydata_generic(md, target, flag);
tamd->prevCos = NULL;
tamd->vert_coords_prev = NULL;
}
static void requiredDataMask(Object *UNUSED(ob),
@ -152,15 +152,12 @@ static void deformVerts(ModifierData *md,
NULL,
numVerts,
amd->deformflag,
(float(*)[3])amd->prevCos,
amd->vert_coords_prev,
amd->defgrp_name,
mesh);
/* free cache */
if (amd->prevCos) {
MEM_freeN(amd->prevCos);
amd->prevCos = NULL;
}
MEM_SAFE_FREE(amd->vert_coords_prev);
}
static void deformVertsEM(ModifierData *md,
@ -186,15 +183,12 @@ static void deformVertsEM(ModifierData *md,
NULL,
numVerts,
amd->deformflag,
(float(*)[3])amd->prevCos,
amd->vert_coords_prev,
amd->defgrp_name,
mesh_src);
/* free cache */
if (amd->prevCos) {
MEM_freeN(amd->prevCos);
amd->prevCos = NULL;
}
MEM_SAFE_FREE(amd->vert_coords_prev);
if (mesh_src != mesh) {
BKE_id_free(NULL, mesh_src);

View File

@ -169,12 +169,12 @@ void MOD_get_texture_coords(MappingInfoModifierData *dmd,
}
}
void MOD_previous_vcos_store(ModifierData *md, float (*vertexCos)[3])
void MOD_previous_vcos_store(ModifierData *md, const float (*vert_coords)[3])
{
while ((md = md->next) && md->type == eModifierType_Armature) {
ArmatureModifierData *amd = (ArmatureModifierData *)md;
if (amd->multi && amd->prevCos == NULL) {
amd->prevCos = MEM_dupallocN(vertexCos);
if (amd->multi && amd->vert_coords_prev == NULL) {
amd->vert_coords_prev = MEM_dupallocN(vert_coords);
}
else {
break;
@ -187,7 +187,7 @@ void MOD_previous_vcos_store(ModifierData *md, float (*vertexCos)[3])
Mesh *MOD_deform_mesh_eval_get(Object *ob,
struct BMEditMesh *em,
Mesh *mesh,
float (*vertexCos)[3],
const float (*vertexCos)[3],
const int num_verts,
const bool use_normals,
const bool use_orco)

View File

@ -40,12 +40,12 @@ void MOD_get_texture_coords(struct MappingInfoModifierData *dmd,
float (*cos)[3],
float (*r_texco)[3]);
void MOD_previous_vcos_store(struct ModifierData *md, float (*vertexCos)[3]);
void MOD_previous_vcos_store(struct ModifierData *md, const float (*vertexCos)[3]);
struct Mesh *MOD_deform_mesh_eval_get(struct Object *ob,
struct BMEditMesh *em,
struct Mesh *mesh,
float (*vertexCos)[3],
const float (*vertexCos)[3],
const int num_verts,
const bool use_normals,
const bool use_orco);