Modifiers: add back dirty normal flag
This commit is contained in:
@@ -372,7 +372,7 @@ static Mesh *arrayModifier_doArray(
|
||||
int tot_doubles;
|
||||
|
||||
const bool use_merge = (amd->flags & MOD_ARR_MERGE) != 0;
|
||||
const bool use_recalc_normals = /* (dm->dirty & DM_DIRTY_NORMALS) || */ use_merge;
|
||||
const bool use_recalc_normals = (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) || use_merge;
|
||||
const bool use_offset_ob = ((amd->offset_type & MOD_ARR_OFF_OBJ) && amd->offset_ob);
|
||||
|
||||
int start_cap_nverts = 0, start_cap_nedges = 0, start_cap_npolys = 0, start_cap_nloops = 0;
|
||||
@@ -733,8 +733,11 @@ static Mesh *arrayModifier_doArray(
|
||||
MEM_freeN(full_doubles_map);
|
||||
}
|
||||
|
||||
/* In case org dm has dirty normals, or we made some merging, mark normals as dirty in new mesh!
|
||||
* TODO: we may need to set other dirty flags as well?
|
||||
*/
|
||||
if (use_recalc_normals) {
|
||||
BKE_mesh_calc_normals(result);
|
||||
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
|
||||
}
|
||||
|
||||
if (vgroup_start_cap_remap) {
|
||||
|
||||
@@ -184,6 +184,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
|
||||
bm->ftoolflagpool == NULL); /* make sure we never alloc'd these */
|
||||
BM_mesh_free(bm);
|
||||
|
||||
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -297,6 +297,10 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx,
|
||||
MEM_freeN(edgeMap);
|
||||
MEM_freeN(faceMap);
|
||||
|
||||
if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) {
|
||||
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
|
||||
}
|
||||
|
||||
/* TODO(sybren): also copy flags & tags? */
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -337,8 +337,10 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx,
|
||||
MirrorModifierData *mmd = (MirrorModifierData *) md;
|
||||
|
||||
result = mirrorModifier__doMirror(mmd, ctx->object, mesh);
|
||||
BKE_mesh_calc_normals(result);
|
||||
|
||||
if (result != mesh) {
|
||||
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user