From e0ead2631280df9c18f966169a7e3fd561e33e1b Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sun, 1 Apr 2012 15:02:19 +0000 Subject: [PATCH] Partial fix [#30744] BMesh: Particle system face/volume emission doesn't work if there is a constructive modifier earlier. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When ORIGSPACE is added, it is now a loop data, so we need to mark tessdata as dirty too. Also fixed DM_ensure_tessface to check DM_DIRTY_TESS_CDLAYERS flag! This fixes problems with subsurf + dynapaint + particles, however, some modifiers, like remesh, seems to create a new dm from scratch, hence loosing completely those CD layers… Note this bug already existed in 2.62, so this is not a regression. --- source/blender/blenkernel/intern/DerivedMesh.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 0041553ec44..65ef4e5b431 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -382,6 +382,13 @@ void DM_ensure_tessface(DerivedMesh *dm) __func__, numPolys, dm->type); } } + + else if (dm->dirty && DM_DIRTY_TESS_CDLAYERS) { + BLI_assert(CustomData_has_layer(&dm->faceData, CD_POLYINDEX)); + DM_update_tessface_data(dm); + } + + dm->dirty &= ~DM_DIRTY_TESS_CDLAYERS; } /* Update tessface CD data from loop/poly ones. Needed when not retessellating after modstack evaluation. */ @@ -1629,7 +1636,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos deformedVerts = NULL; } - } + } /* create an orco derivedmesh in parallel */ if (nextmask & CD_MASK_ORCO) { @@ -3061,6 +3068,8 @@ void DM_init_origspace(DerivedMesh *dm) } } } + + dm->dirty |= DM_DIRTY_TESS_CDLAYERS; }