Cleanup: Use functions for accessing mesh normal dirty state

It's better not to expose the details of where the dirty flags are
stored to every place that wants to know if the normals are dirty.
Some of these places are relics from before vertex normals were
computed lazily anyway, so this is more of an incrememtal cleanup.
This will make part of the fix for T95839 simpler.
This commit is contained in:
Hans Goudey 2022-02-18 13:21:36 -06:00
parent eaa4aa8644
commit 969c4a45ce
Notes: blender-bot 2023-02-14 00:13:36 +01:00
Referenced by commit b7171d1b82, Cleanup: Use function to check if normals are dirty
7 changed files with 14 additions and 20 deletions

View File

@ -1981,9 +1981,8 @@ Mesh *mesh_get_eval_final(struct Depsgraph *depsgraph,
mesh_eval = BKE_object_get_evaluated_mesh(ob);
}
if (mesh_eval != nullptr) {
BLI_assert(!(mesh_eval->runtime.cd_dirty_vert & CD_MASK_NORMAL));
}
BKE_mesh_assert_normals_dirty_or_calculated(mesh_eval);
return mesh_eval;
}

View File

@ -265,7 +265,7 @@ static DerivedMesh *cdDM_from_mesh_ex(Mesh *mesh,
dm->deformedOnly = 1;
dm->cd_flag = mesh->cd_flag;
if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) {
if (BKE_mesh_vertex_normals_are_dirty(mesh)) {
dm->dirty |= DM_DIRTY_NORMALS;
}
/* TODO: DM_DIRTY_TESS_CDLAYERS ? Maybe not though,

View File

@ -1116,11 +1116,9 @@ Mesh *BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src,
/* Ensure that when no normal layers exist, they are marked dirty, because
* normals might not have been included in the mask of copied layers. */
if (!CustomData_has_layer(&me_dst->vdata, CD_NORMAL)) {
me_dst->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
}
if (!CustomData_has_layer(&me_dst->pdata, CD_NORMAL)) {
me_dst->runtime.cd_dirty_poly |= CD_MASK_NORMAL;
if (!CustomData_has_layer(&me_dst->vdata, CD_NORMAL) ||
!CustomData_has_layer(&me_dst->pdata, CD_NORMAL)) {
BKE_mesh_normals_tag_dirty(me_dst);
}
/* The destination mesh should at least have valid primary CD layers,

View File

@ -1500,11 +1500,9 @@ void BKE_mesh_nomain_to_mesh(Mesh *mesh_src,
/* Ensure that when no normal layers exist, they are marked dirty, because
* normals might not have been included in the mask of copied layers. */
if (!CustomData_has_layer(&tmp.vdata, CD_NORMAL)) {
tmp.runtime.cd_dirty_vert |= CD_MASK_NORMAL;
}
if (!CustomData_has_layer(&tmp.pdata, CD_NORMAL)) {
tmp.runtime.cd_dirty_poly |= CD_MASK_NORMAL;
if (!CustomData_has_layer(&tmp.vdata, CD_NORMAL) ||
!CustomData_has_layer(&tmp.pdata, CD_NORMAL)) {
BKE_mesh_normals_tag_dirty(&tmp);
}
if (CustomData_has_layer(&mesh_src->vdata, CD_SHAPEKEY)) {

View File

@ -387,7 +387,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd,
int tot_doubles;
const bool use_merge = (amd->flags & MOD_ARR_MERGE) != 0;
const bool use_recalc_normals = (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) || use_merge;
const bool use_recalc_normals = BKE_mesh_vertex_normals_are_dirty(mesh) || use_merge;
const bool use_offset_ob = ((amd->offset_type & MOD_ARR_OFF_OBJ) && amd->offset_ob != NULL);
int start_cap_nverts = 0, start_cap_nedges = 0, start_cap_npolys = 0, start_cap_nloops = 0;

View File

@ -329,8 +329,7 @@ static void displaceModifier_do(DisplaceModifierData *dmd,
if (CustomData_has_layer(ldata, CD_CUSTOMLOOPNORMAL)) {
float(*clnors)[3] = NULL;
if ((mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) ||
!CustomData_has_layer(ldata, CD_NORMAL)) {
if (!CustomData_has_layer(ldata, CD_NORMAL)) {
BKE_mesh_calc_normals_split(mesh);
}

View File

@ -967,7 +967,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex
}
/* must recalculate normals with vgroups since they can displace unevenly T26888. */
if ((mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) || do_rim || dvert) {
if (BKE_mesh_vertex_normals_are_dirty(mesh) || do_rim || dvert) {
BKE_mesh_normals_tag_dirty(result);
}
else if (do_shell) {
@ -1023,9 +1023,9 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex
#define SOLIDIFY_SIDE_NORMALS
#ifdef SOLIDIFY_SIDE_NORMALS
/* NOTE(@sybren): due to the code setting cd_dirty_vert a few lines above,
/* NOTE(@sybren): due to the code setting normals dirty a few lines above,
* do_side_normals is always false. */
const bool do_side_normals = !(result->runtime.cd_dirty_vert & CD_MASK_NORMAL);
const bool do_side_normals = !BKE_mesh_vertex_normals_are_dirty(result);
/* annoying to allocate these since we only need the edge verts, */
float(*edge_vert_nos)[3] = do_side_normals ?
MEM_calloc_arrayN(numVerts, sizeof(float[3]), __func__) :