Modifiers: Refactor MOD_deform_mesh_eval_get() helper a bit.

Now that function also takes expected number of vertices, and do the
checks against generated mesh internally.
This commit is contained in:
2018-11-27 17:21:16 +01:00
parent 4543da6ca6
commit b4087ea639
21 changed files with 54 additions and 42 deletions

View File

@@ -136,7 +136,7 @@ static void deformVertsEM(
Mesh *mesh, float (*vertexCos)[3], int numVerts)
{
ArmatureModifierData *amd = (ArmatureModifierData *) md;
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, em, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false);
MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */
@@ -160,7 +160,7 @@ static void deformMatricesEM(
float (*defMats)[3][3], int numVerts)
{
ArmatureModifierData *amd = (ArmatureModifierData *) md;
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, em, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false);
armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, defMats, numVerts,
amd->deformflag, NULL, amd->defgrp_name, NULL);
@@ -175,7 +175,7 @@ static void deformMatrices(
float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
{
ArmatureModifierData *amd = (ArmatureModifierData *) md;
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
armature_deform_verts(amd->object, ctx->object, mesh_src, vertexCos, defMats, numVerts,
amd->deformflag, NULL, amd->defgrp_name, NULL);

View File

@@ -433,7 +433,7 @@ static void deformVerts(
if (ctx->object->type == OB_MESH) {
/* mesh_src is only needed for vgroups. */
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);
}
@@ -455,7 +455,7 @@ static void deformVertsEM(
Mesh *mesh, float (*vertexCos)[3], int numVerts)
{
CastModifierData *cmd = (CastModifierData *)md;
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);

View File

@@ -93,7 +93,7 @@ static void deformVerts(
}
if (mesh == NULL) {
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, NULL, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, NULL, NULL, numVerts, false, false);
}
else {
/* Not possible to use get_mesh() in this case as we'll modify its vertices

View File

@@ -105,7 +105,7 @@ static void deformVerts(
ModifierData *md, const ModifierEvalContext *ctx,
Mesh *mesh,
float (*vertexCos)[3],
int UNUSED(numVerts))
int numVerts)
{
CollisionModifierData *collmd = (CollisionModifierData *) md;
Mesh *mesh_src;
@@ -113,7 +113,7 @@ static void deformVerts(
Object *ob = ctx->object;
if (mesh == NULL) {
mesh_src = MOD_get_mesh_eval(ob, NULL, NULL, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ob, NULL, NULL, NULL, numVerts, false, false);
}
else {
/* Not possible to use get_mesh() in this case as we'll modify its vertices

View File

@@ -717,7 +717,7 @@ static void deformVerts(
ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh,
float (*vertexCos)[3], int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
correctivesmooth_modifier_do(md, ctx->object, mesh_src, vertexCos, (unsigned int)numVerts, NULL);
@@ -731,7 +731,7 @@ static void deformVertsEM(
ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData,
Mesh *mesh, float (*vertexCos)[3], int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
correctivesmooth_modifier_do(md, ctx->object, mesh_src, vertexCos, (unsigned int)numVerts, editData);

View File

@@ -116,7 +116,7 @@ static void deformVerts(
if (ctx->object->type == OB_MESH) {
/* mesh_src is only needed for vgroups. */
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);
}
@@ -141,7 +141,7 @@ static void deformVertsEM(
float (*vertexCos)[3],
int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, em, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);

View File

@@ -376,7 +376,7 @@ static void deformVerts(
float (*vertexCos)[3],
int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);
@@ -391,7 +391,7 @@ static void deformVertsEM(
ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData,
Mesh *mesh, float (*vertexCos)[3], int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);

View File

@@ -354,7 +354,7 @@ static void deformVerts(
float (*vertexCos)[3], int numVerts)
{
HookModifierData *hmd = (HookModifierData *)md;
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
deformVerts_do(hmd, ctx->object, mesh_src, vertexCos, numVerts);
@@ -369,7 +369,7 @@ static void deformVertsEM(
struct Mesh *mesh, float (*vertexCos)[3], int numVerts)
{
HookModifierData *hmd = (HookModifierData *)md;
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
deformVerts_do(hmd, ctx->object, mesh_src, vertexCos, numVerts);

View File

@@ -734,7 +734,7 @@ static void deformVerts(
ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh,
float (*vertexCos)[3], int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts);
if (mesh_src != mesh) {
@@ -746,7 +746,7 @@ static void deformVertsEM(
ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData,
Mesh *mesh, float (*vertexCos)[3], int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ctx->object, mesh_src,
vertexCos, numVerts);
if (mesh_src != mesh) {

View File

@@ -507,7 +507,7 @@ static void deformVerts(
if (numVerts == 0)
return;
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ctx->object, mesh_src,
vertexCos, numVerts);
@@ -525,7 +525,7 @@ static void deformVertsEM(
if (numVerts == 0)
return;
mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ctx->object, mesh_src,
vertexCos, numVerts);

View File

@@ -100,7 +100,7 @@ static void deformVerts(
int numVerts)
{
LatticeModifierData *lmd = (LatticeModifierData *) md;
struct Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
struct Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */
@@ -115,7 +115,7 @@ static void deformVertsEM(
ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em,
struct Mesh *mesh, float (*vertexCos)[3], int numVerts)
{
struct Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, em, mesh, NULL, false, false);
struct Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false);
deformVerts(md, ctx, mesh_src, vertexCos, numVerts);

View File

@@ -415,7 +415,7 @@ static void deformVerts(
float (*vertexCos)[3],
int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */
@@ -433,7 +433,7 @@ static void deformVertsEM(
float (*vertexCos)[3],
int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
meshdeformModifier_do(md, ctx, mesh_src, vertexCos, numVerts);

View File

@@ -104,7 +104,7 @@ static void deformVerts(
ModifierData *md, const ModifierEvalContext *ctx,
Mesh *mesh,
float (*vertexCos)[3],
int UNUSED(numVerts))
int numVerts)
{
Mesh *mesh_src = mesh;
ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md;
@@ -120,7 +120,7 @@ static void deformVerts(
return;
if (mesh_src == NULL) {
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, NULL, vertexCos, false, true);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, NULL, vertexCos, numVerts, false, true);
if (mesh_src == NULL) {
return;
}

View File

@@ -111,7 +111,7 @@ static void deformVerts(
if (ctx->object->type == OB_MESH) {
/* mesh_src is only needed for vgroups. */
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);
}

View File

@@ -390,7 +390,7 @@ static void deformVerts(
if (ctx->object->type == OB_MESH) {
/* mesh_src is only needed for vgroups. */
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);
}
@@ -408,7 +408,7 @@ static void deformVertsEM(
float (*vertexCos)[3],
int numVerts)
{
Mesh *mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
SimpleDeformModifier_do((SimpleDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts);

View File

@@ -218,7 +218,7 @@ static void deformVerts(
if (ctx->object->type == OB_MESH) {
/* mesh_src is needed for vgroups, and taking edges into account. */
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);
}

View File

@@ -91,7 +91,7 @@ static void deformVerts(
ModifierData *md, const ModifierEvalContext *ctx,
Mesh *mesh,
float (*vertexCos)[3],
int UNUSED(numVerts))
int numVerts)
{
SurfaceModifierData *surmd = (SurfaceModifierData *) md;
const int cfra = (int)DEG_get_ctime(ctx->depsgraph);
@@ -111,7 +111,9 @@ static void deformVerts(
LIB_ID_COPY_NO_PREVIEW,
false);
}
else surmd->mesh = MOD_get_mesh_eval(ctx->object, NULL, NULL, NULL, false, false);
else {
surmd->mesh = MOD_deform_mesh_eval_get(ctx->object, NULL, NULL, NULL, numVerts, false, false);
}
if (!ctx->object->pd) {
printf("SurfaceModifier deformVerts: Should not happen!\n");

View File

@@ -168,11 +168,12 @@ void MOD_previous_vcos_store(ModifierData *md, float (*vertexCos)[3])
}
/* returns a mesh if mesh == NULL, for deforming modifiers that need it */
Mesh *MOD_get_mesh_eval(
Mesh *MOD_deform_mesh_eval_get(
Object *ob, struct BMEditMesh *em, Mesh *mesh,
float (*vertexCos)[3], bool use_normals, bool use_orco)
float (*vertexCos)[3], const int num_verts,
const bool use_normals, const bool use_orco)
{
if (mesh) {
if (mesh != NULL) {
/* pass */
}
else if (ob->type == OB_MESH) {
@@ -207,6 +208,12 @@ Mesh *MOD_get_mesh_eval(
else if (ELEM(ob->type, OB_FONT, OB_CURVE, OB_SURF)) {
/* TODO(sybren): get evaluated mesh from depsgraph once that's properly generated for curves. */
mesh = BKE_mesh_new_nomain_from_curve(ob);
/* Currently, that may not be the case everytime
* (texts e.g. tend to give issues, also when deforming curve points instead of generated curve geometry... ). */
if (mesh != NULL && mesh->totvert != num_verts) {
BKE_id_free(NULL, mesh);
}
}
if (use_normals) {
@@ -215,6 +222,8 @@ Mesh *MOD_get_mesh_eval(
}
}
BLI_assert(mesh == NULL || mesh->totvert == num_verts);
return mesh;
}

View File

@@ -51,9 +51,10 @@ void MOD_get_texture_coords(
void MOD_previous_vcos_store(struct ModifierData *md, float (*vertexCos)[3]);
struct Mesh *MOD_get_mesh_eval(
struct Mesh *MOD_deform_mesh_eval_get(
struct Object *ob, struct BMEditMesh *em, struct Mesh *mesh,
float (*vertexCos)[3], bool use_normals, bool use_orco);
float (*vertexCos)[3], const int num_verts,
const bool use_normals, const bool use_orco);
void MOD_get_vgroup(
struct Object *ob, struct Mesh *mesh,

View File

@@ -319,7 +319,7 @@ static void deformVerts(
if (ctx->object->type == OB_MESH) {
/* mesh_src is only needed for vgroups and textures, which only work on meshes. */
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
BLI_assert(mesh_src->totvert == numVerts);
}

View File

@@ -308,9 +308,9 @@ static void deformVerts(
WaveModifierData *wmd = (WaveModifierData *)md;
if (wmd->flag & MOD_WAVE_NORM)
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, vertexCos, true, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, vertexCos, numVerts, true, false);
else if (wmd->texture || wmd->defgrp_name[0])
mesh_src = MOD_get_mesh_eval(ctx->object, NULL, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
waveModifier_do(wmd, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);
@@ -327,9 +327,9 @@ static void deformVertsEM(
WaveModifierData *wmd = (WaveModifierData *)md;
if (wmd->flag & MOD_WAVE_NORM)
mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, vertexCos, true, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, vertexCos, numVerts, true, false);
else if (wmd->texture || wmd->defgrp_name[0])
mesh_src = MOD_get_mesh_eval(ctx->object, editData, mesh, NULL, false, false);
mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
waveModifier_do(wmd, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);