diff options
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 11 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 21 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/customdata.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/dynamicpaint.c | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 16 | ||||
-rw-r--r-- | 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: */ |