fix own regression [#36154] Simple deform modifier doesn't recalculate normals
get_cddm and get_dm are called within modifiers so they wont ensure normals are valid, added an arg to optionally ensure valid normals.
This commit is contained in:
@@ -453,7 +453,7 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
DerivedMesh *dm = NULL;
|
||||
CastModifierData *cmd = (CastModifierData *)md;
|
||||
|
||||
dm = get_dm(ob, NULL, derivedData, NULL, 0);
|
||||
dm = get_dm(ob, NULL, derivedData, NULL, false, false);
|
||||
|
||||
if (cmd->type == MOD_CAST_TYPE_CUBOID) {
|
||||
cuboid_do(cmd, ob, dm, vertexCos, numVerts);
|
||||
@@ -470,7 +470,7 @@ static void deformVertsEM(
|
||||
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||
{
|
||||
DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, 0);
|
||||
DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false);
|
||||
CastModifierData *cmd = (CastModifierData *)md;
|
||||
|
||||
if (cmd->type == MOD_CAST_TYPE_CUBOID) {
|
||||
|
||||
@@ -82,7 +82,7 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
||||
return;
|
||||
}
|
||||
|
||||
dm = get_dm(ob, NULL, derivedData, NULL, 0);
|
||||
dm = get_dm(ob, NULL, derivedData, NULL, false, false);
|
||||
if (dm == derivedData)
|
||||
dm = CDDM_copy(dm);
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
int numVerts,
|
||||
ModifierApplyFlag UNUSED(flag))
|
||||
{
|
||||
DerivedMesh *dm = get_cddm(ob, NULL, derivedData, vertexCos);
|
||||
DerivedMesh *dm = get_cddm(ob, NULL, derivedData, vertexCos, dependsOnNormals(md));
|
||||
|
||||
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
|
||||
vertexCos, numVerts);
|
||||
@@ -278,7 +278,7 @@ static void deformVertsEM(
|
||||
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||
{
|
||||
DerivedMesh *dm = get_cddm(ob, editData, derivedData, vertexCos);
|
||||
DerivedMesh *dm = get_cddm(ob, editData, derivedData, vertexCos, dependsOnNormals(md));
|
||||
|
||||
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
|
||||
vertexCos, numVerts);
|
||||
|
||||
@@ -252,7 +252,7 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
||||
DerivedMesh *dm = derivedData;
|
||||
/* We need a valid dm for meshes when a vgroup is set... */
|
||||
if (!dm && ob->type == OB_MESH && hmd->name[0] != '\0')
|
||||
dm = get_dm(ob, NULL, dm, NULL, 0);
|
||||
dm = get_dm(ob, NULL, dm, NULL, false, false);
|
||||
|
||||
deformVerts_do(hmd, ob, dm, vertexCos, numVerts);
|
||||
|
||||
@@ -267,7 +267,7 @@ static void deformVertsEM(ModifierData *md, Object *ob, struct BMEditMesh *editD
|
||||
DerivedMesh *dm = derivedData;
|
||||
/* We need a valid dm for meshes when a vgroup is set... */
|
||||
if (!dm && ob->type == OB_MESH && hmd->name[0] != '\0')
|
||||
dm = get_dm(ob, editData, dm, NULL, 0);
|
||||
dm = get_dm(ob, editData, dm, NULL, false, false);
|
||||
|
||||
deformVerts_do(hmd, ob, dm, vertexCos, numVerts);
|
||||
|
||||
|
||||
@@ -669,7 +669,7 @@ static void laplaciansmoothModifier_do(
|
||||
static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
||||
float (*vertexCos)[3], int numVerts, ModifierApplyFlag UNUSED(flag))
|
||||
{
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, 0);
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false);
|
||||
|
||||
laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ob, dm,
|
||||
vertexCos, numVerts);
|
||||
@@ -682,7 +682,7 @@ static void deformVertsEM(
|
||||
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||
{
|
||||
DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, 0);
|
||||
DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false);
|
||||
|
||||
laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ob, dm,
|
||||
vertexCos, numVerts);
|
||||
|
||||
@@ -212,7 +212,7 @@ static void meshdeformModifier_do(
|
||||
/* if we don't have one computed, use derivedmesh from data
|
||||
* without any modifiers */
|
||||
if (!cagedm) {
|
||||
cagedm = get_dm(mmd->object, NULL, NULL, NULL, 0);
|
||||
cagedm = get_dm(mmd->object, NULL, NULL, NULL, false, false);
|
||||
if (cagedm)
|
||||
cagedm->needsFree = 1;
|
||||
}
|
||||
@@ -343,7 +343,7 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
int numVerts,
|
||||
ModifierApplyFlag UNUSED(flag))
|
||||
{
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, 0);
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false);
|
||||
|
||||
modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
|
||||
|
||||
@@ -359,7 +359,7 @@ static void deformVertsEM(ModifierData *md, Object *ob,
|
||||
float (*vertexCos)[3],
|
||||
int numVerts)
|
||||
{
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, 0);
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false);
|
||||
|
||||
meshdeformModifier_do(md, ob, dm, vertexCos, numVerts);
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
return;
|
||||
|
||||
if (dm == NULL) {
|
||||
dm = get_dm(ob, NULL, NULL, vertexCos, 1);
|
||||
dm = get_dm(ob, NULL, NULL, vertexCos, false, true);
|
||||
|
||||
if (!dm)
|
||||
return;
|
||||
|
||||
@@ -48,6 +48,8 @@
|
||||
|
||||
#include "MOD_util.h"
|
||||
|
||||
static bool dependsOnNormals(ModifierData *md);
|
||||
|
||||
|
||||
static void initData(ModifierData *md)
|
||||
{
|
||||
@@ -120,8 +122,9 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
CustomDataMask dataMask = requiredDataMask(ob, md);
|
||||
|
||||
/* ensure we get a CDDM with applied vertex coords */
|
||||
if (dataMask)
|
||||
dm = get_cddm(ob, NULL, dm, vertexCos);
|
||||
if (dataMask) {
|
||||
dm = get_cddm(ob, NULL, dm, vertexCos, dependsOnNormals(md));
|
||||
}
|
||||
|
||||
shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts);
|
||||
|
||||
@@ -136,8 +139,9 @@ static void deformVertsEM(ModifierData *md, Object *ob, struct BMEditMesh *editD
|
||||
CustomDataMask dataMask = requiredDataMask(ob, md);
|
||||
|
||||
/* ensure we get a CDDM with applied vertex coords */
|
||||
if (dataMask)
|
||||
dm = get_cddm(ob, editData, dm, vertexCos);
|
||||
if (dataMask) {
|
||||
dm = get_cddm(ob, editData, dm, vertexCos, dependsOnNormals(md));
|
||||
}
|
||||
|
||||
shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts);
|
||||
|
||||
|
||||
@@ -317,7 +317,7 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
/* we implement requiredDataMask but thats not really useful since
|
||||
* mesh_calc_modifiers pass a NULL derivedData */
|
||||
if (dataMask)
|
||||
dm = get_dm(ob, NULL, dm, NULL, 0);
|
||||
dm = get_dm(ob, NULL, dm, NULL, false, false);
|
||||
|
||||
SimpleDeformModifier_do((SimpleDeformModifierData *)md, ob, dm, vertexCos, numVerts);
|
||||
|
||||
@@ -337,7 +337,7 @@ static void deformVertsEM(ModifierData *md, Object *ob,
|
||||
/* we implement requiredDataMask but thats not really useful since
|
||||
* mesh_calc_modifiers pass a NULL derivedData */
|
||||
if (dataMask)
|
||||
dm = get_dm(ob, editData, dm, NULL, 0);
|
||||
dm = get_dm(ob, editData, dm, NULL, false, false);
|
||||
|
||||
SimpleDeformModifier_do((SimpleDeformModifierData *)md, ob, dm, vertexCos, numVerts);
|
||||
|
||||
|
||||
@@ -221,7 +221,7 @@ static void smoothModifier_do(
|
||||
static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
||||
float (*vertexCos)[3], int numVerts, ModifierApplyFlag UNUSED(flag))
|
||||
{
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, 0);
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false);
|
||||
|
||||
smoothModifier_do((SmoothModifierData *)md, ob, dm,
|
||||
vertexCos, numVerts);
|
||||
@@ -234,7 +234,7 @@ static void deformVertsEM(
|
||||
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||
{
|
||||
DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, 0);
|
||||
DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false);
|
||||
|
||||
smoothModifier_do((SmoothModifierData *)md, ob, dm,
|
||||
vertexCos, numVerts);
|
||||
|
||||
@@ -98,7 +98,7 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
|
||||
/* if possible use/create DerivedMesh */
|
||||
if (derivedData) surmd->dm = CDDM_copy(derivedData);
|
||||
else surmd->dm = get_dm(ob, NULL, NULL, NULL, 0);
|
||||
else surmd->dm = get_dm(ob, NULL, NULL, NULL, false, false);
|
||||
|
||||
if (!ob->pd) {
|
||||
printf("SurfaceModifier deformVerts: Should not happen!\n");
|
||||
|
||||
@@ -179,30 +179,33 @@ void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3])
|
||||
}
|
||||
|
||||
/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */
|
||||
DerivedMesh *get_cddm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float (*vertexCos)[3])
|
||||
DerivedMesh *get_cddm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], bool use_normals)
|
||||
{
|
||||
if (dm && dm->type == DM_TYPE_CDDM)
|
||||
return dm;
|
||||
if (dm) {
|
||||
if (dm->type != DM_TYPE_CDDM) {
|
||||
dm = CDDM_copy(dm);
|
||||
CDDM_apply_vert_coords(dm, vertexCos);
|
||||
}
|
||||
|
||||
if (!dm) {
|
||||
dm = get_dm(ob, em, dm, vertexCos, 0);
|
||||
if (use_normals) {
|
||||
DM_ensure_normals(dm);
|
||||
}
|
||||
}
|
||||
else {
|
||||
dm = CDDM_copy(dm);
|
||||
CDDM_apply_vert_coords(dm, vertexCos);
|
||||
dm->dirty |= DM_DIRTY_NORMALS;
|
||||
dm = get_dm(ob, em, dm, vertexCos, use_normals, false);
|
||||
}
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
/* returns a derived mesh if dm == NULL, for deforming modifiers that need it */
|
||||
DerivedMesh *get_dm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco)
|
||||
DerivedMesh *get_dm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm,
|
||||
float (*vertexCos)[3], bool use_normals, bool use_orco)
|
||||
{
|
||||
if (dm)
|
||||
return dm;
|
||||
|
||||
if (ob->type == OB_MESH) {
|
||||
if (dm) {
|
||||
/* pass */
|
||||
}
|
||||
else if (ob->type == OB_MESH) {
|
||||
if (em) dm = CDDM_from_editbmesh(em, FALSE, FALSE);
|
||||
else dm = CDDM_from_mesh((struct Mesh *)(ob->data), ob);
|
||||
|
||||
@@ -211,13 +214,20 @@ DerivedMesh *get_dm(Object *ob, struct BMEditMesh *em, DerivedMesh *dm, float (*
|
||||
dm->dirty |= DM_DIRTY_NORMALS;
|
||||
}
|
||||
|
||||
if (orco)
|
||||
if (use_orco) {
|
||||
DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, BKE_mesh_orco_verts_get(ob));
|
||||
}
|
||||
}
|
||||
else if (ELEM3(ob->type, OB_FONT, OB_CURVE, OB_SURF)) {
|
||||
dm = CDDM_from_curve(ob);
|
||||
}
|
||||
|
||||
if (use_normals) {
|
||||
if (LIKELY(dm)) {
|
||||
DM_ensure_normals(dm);
|
||||
}
|
||||
}
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,9 +46,9 @@ void get_texture_coords(struct MappingInfoModifierData *dmd, struct Object *ob,
|
||||
float (*co)[3], float (*texco)[3], int numVerts);
|
||||
void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]);
|
||||
struct DerivedMesh *get_cddm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm,
|
||||
float (*vertexCos)[3]);
|
||||
float (*vertexCos)[3], bool use_normals);
|
||||
struct DerivedMesh *get_dm(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *dm,
|
||||
float (*vertexCos)[3], int orco);
|
||||
float (*vertexCos)[3], bool use_normals, bool use_orco);
|
||||
void modifier_get_vgroup(struct Object *ob, struct DerivedMesh *dm,
|
||||
const char *name, struct MDeformVert **dvert, int *defgrp_index);
|
||||
|
||||
|
||||
@@ -327,7 +327,7 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
||||
int use_dm = warp_needs_dm((WarpModifierData *)md);
|
||||
|
||||
if (use_dm) {
|
||||
dm = get_cddm(ob, NULL, derivedData, vertexCos);
|
||||
dm = get_cddm(ob, NULL, derivedData, vertexCos, false);
|
||||
}
|
||||
|
||||
warpModifier_do((WarpModifierData *)md, ob, dm, vertexCos, numVerts);
|
||||
|
||||
@@ -346,9 +346,9 @@ static void deformVerts(ModifierData *md, Object *ob,
|
||||
WaveModifierData *wmd = (WaveModifierData *)md;
|
||||
|
||||
if (wmd->flag & MOD_WAVE_NORM)
|
||||
dm = get_cddm(ob, NULL, dm, vertexCos);
|
||||
dm = get_cddm(ob, NULL, dm, vertexCos, false);
|
||||
else if (wmd->texture || wmd->defgrp_name[0])
|
||||
dm = get_dm(ob, NULL, dm, NULL, 0);
|
||||
dm = get_dm(ob, NULL, dm, NULL, false, false);
|
||||
|
||||
waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
|
||||
|
||||
@@ -364,9 +364,9 @@ static void deformVertsEM(
|
||||
WaveModifierData *wmd = (WaveModifierData *)md;
|
||||
|
||||
if (wmd->flag & MOD_WAVE_NORM)
|
||||
dm = get_cddm(ob, editData, dm, vertexCos);
|
||||
dm = get_cddm(ob, editData, dm, vertexCos, false);
|
||||
else if (wmd->texture || wmd->defgrp_name[0])
|
||||
dm = get_dm(ob, editData, dm, NULL, 0);
|
||||
dm = get_dm(ob, editData, dm, NULL, false, false);
|
||||
|
||||
waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user