From d7f51f83f65799b447324d1738239cffdc5e1918 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 30 May 2013 18:09:19 +0000 Subject: remove CD_MASK_NORMAL from CD_MASK_DERIVEDMESH, bmesh merge included this but its not needed. Now add asserts to make sure this layer is only added once the modifier stack has been calculated. this saves normal layer being calculated whenver vertex normals need updating. --- source/blender/blenkernel/intern/DerivedMesh.c | 11 +++++++++++ source/blender/blenkernel/intern/cdderivedmesh.c | 21 +++++++++++++++++++-- source/blender/blenkernel/intern/customdata.c | 2 +- source/blender/blenkernel/intern/dynamicpaint.c | 3 +-- source/blender/blenkernel/intern/mesh.c | 16 ++++++++++++---- source/blender/modifiers/intern/MOD_boolean_util.c | 4 ++-- 6 files changed, 46 insertions(+), 11 deletions(-) diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 4a5aaa65f90..fc5b91a93cc 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -843,6 +843,8 @@ static DerivedMesh *modwrap_applyModifier( ModifierApplyFlag flag) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); + BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } @@ -856,6 +858,8 @@ static DerivedMesh *modwrap_applyModifierEM( ModifierApplyFlag flag) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); + BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } @@ -869,6 +873,8 @@ static void modwrap_deformVerts( ModifierApplyFlag flag) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); + BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } @@ -881,6 +887,8 @@ static void modwrap_deformVertsEM( float (*vertexCos)[3], int numVerts) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); + BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) { DM_ensure_normals(dm); } @@ -1437,6 +1445,9 @@ static void add_shapekey_layers(DerivedMesh *dm, Mesh *me, Object *UNUSED(ob)) */ static void dm_ensure_display_normals(DerivedMesh *dm) { + /* this is for final output only, up until now this layer should be missing */ + BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + if ((dm->type == DM_TYPE_CDDM) && ((dm->dirty & DM_DIRTY_NORMALS) || CustomData_has_layer(&dm->faceData, CD_NORMAL) == FALSE)) { diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 80bd71e7b59..af0dadeccab 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1712,7 +1712,7 @@ static CDDerivedMesh *cdDM_create(const char *desc) dm->getEdgeDataArray = DM_get_edge_data_layer; dm->getTessFaceDataArray = DM_get_tessface_data_layer; - dm->calcNormals = CDDM_calc_normals_mapping; + dm->calcNormals = CDDM_calc_normals; dm->recalcTessellation = CDDM_recalc_tessellation; dm->getVertCos = cdDM_getVertCos; @@ -2264,7 +2264,6 @@ void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const short only_face_normals cddm->dm.dirty &= ~DM_DIRTY_NORMALS; } - void CDDM_calc_normals_mapping(DerivedMesh *dm) { /* use this to skip calculating normals on original vert's, this may need to be changed */ @@ -2273,6 +2272,7 @@ void CDDM_calc_normals_mapping(DerivedMesh *dm) CDDM_calc_normals_mapping_ex(dm, only_face_normals); } +#if 0 /* bmesh note: this matches what we have in trunk */ void CDDM_calc_normals(DerivedMesh *dm) { @@ -2295,6 +2295,23 @@ void CDDM_calc_normals(DerivedMesh *dm) cddm->dm.dirty &= ~DM_DIRTY_NORMALS; } +#else + +/* poly normal layer is now only for final display */ +void CDDM_calc_normals(DerivedMesh *dm) +{ + CDDerivedMesh *cddm = (CDDerivedMesh *)dm; + + /* we don't want to overwrite any referenced layers */ + cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData); + + BKE_mesh_calc_normals_poly(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm), + dm->numLoopData, dm->numPolyData, NULL); + + cddm->dm.dirty &= ~DM_DIRTY_NORMALS; +} + +#endif void CDDM_calc_normals_tessface(DerivedMesh *dm) { diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 99ee6a803c8..b6c608661cd 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -1185,7 +1185,7 @@ const CustomDataMask CD_MASK_DERIVEDMESH = CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_PREVIEW_MLOOPCOL | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT | - CD_MASK_PREVIEW_MCOL | CD_MASK_NORMAL | CD_MASK_SHAPEKEY | CD_MASK_RECAST | + CD_MASK_PREVIEW_MCOL | CD_MASK_SHAPEKEY | CD_MASK_RECAST | CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE; const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 812c0cf674b..9d1c0e40d54 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -1893,8 +1893,7 @@ static DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, } } - if (update_normals) - CDDM_calc_normals(result); + result->dirty |= DM_DIRTY_NORMALS; } /* make a copy of dm to use as brush data */ if (pmd->brush) { diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 7db724aa11d..babaadf2d17 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1998,16 +1998,24 @@ void BKE_mesh_calc_normals_poly(MVert *mverts, int numVerts, MLoop *mloop, MPoly { float (*pnors)[3] = r_polynors; float (*tnorms)[3]; - float tpnor[3]; /* temp poly normal */ int i; MPoly *mp; /* first go through and calculate normals for all the polys */ tnorms = MEM_callocN(sizeof(*tnorms) * numVerts, __func__); - mp = mpolys; - for (i = 0; i < numPolys; i++, mp++) { - mesh_calc_normals_poly_accum(mp, mloop + mp->loopstart, mverts, pnors ? pnors[i] : tpnor, tnorms); + if (pnors) { + mp = mpolys; + for (i = 0; i < numPolys; i++, mp++) { + mesh_calc_normals_poly_accum(mp, mloop + mp->loopstart, mverts, pnors[i], tnorms); + } + } + else { + float tpnor[3]; /* temp poly normal */ + mp = mpolys; + for (i = 0; i < numPolys; i++, mp++) { + mesh_calc_normals_poly_accum(mp, mloop + mp->loopstart, mverts, tpnor, tnorms); + } } /* following Mesh convention; we use vertex coordinate itself for normal in this case */ diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c index 75a05633507..02ec6108733 100644 --- a/source/blender/modifiers/intern/MOD_boolean_util.c +++ b/source/blender/modifiers/intern/MOD_boolean_util.c @@ -362,9 +362,9 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh( /* create a new DerivedMesh */ result = CDDM_new(vertex_it->num_elements, 0, face_it->num_elements, 0, 0); - CustomData_merge(&dm1->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~(CD_MASK_NORMAL | CD_MASK_ORIGINDEX), + CustomData_merge(&dm1->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~CD_MASK_ORIGINDEX, CD_DEFAULT, face_it->num_elements); - CustomData_merge(&dm2->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~(CD_MASK_NORMAL | CD_MASK_ORIGINDEX), + CustomData_merge(&dm2->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~CD_MASK_ORIGINDEX, CD_DEFAULT, face_it->num_elements); /* step through the vertex iterators: */ -- cgit v1.2.3