From 41c992ce852c9ffc83a52041cee73e8ce6b4ec04 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 19 Dec 2011 14:09:36 +0000 Subject: Much cleaner and satisfying code in weightvg modifiers' "init": copy only the CD_DEFORMVERT data layer (if it's the org one), and not the whole DerivedMesh! Quite oddly, for Proximity mod, this increases the performances of the apply func (about 20-25%, e.g. from 0.04 to 0.03 sec), but decreases the global framerate (e.g. in TEST_5 scene of testing file, I lose about 7%, from 4.6 to 4.3fps (open ATI driver)...). --- source/blender/modifiers/intern/MOD_weightvgmix.c | 56 ++--------------------- 1 file changed, 4 insertions(+), 52 deletions(-) (limited to 'source/blender/modifiers/intern/MOD_weightvgmix.c') diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 221deeef1a6..fd7e47cc4bf 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -219,10 +219,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; - DerivedMesh *dm = derivedData, *ret = NULL; -#if 0 - Mesh *ob_m = NULL; -#endif + DerivedMesh *dm = derivedData; MDeformVert *dvert = NULL; MDeformWeight **dw1, **tdw1, **dw2, **tdw2; int numVerts; @@ -232,7 +229,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der int *tidx, *indices = NULL; int numIdx = 0; int i; - char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ /* Get number of verts. */ numVerts = dm->getNumVerts(dm); @@ -254,49 +250,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der return dm; } - /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute - * time! See scene 5 of the WeighVG test file... - */ -#if 0 - /* Get actual dverts (ie vertex group data). */ - dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - /* If no dverts, return unmodified data... */ - if (dvert == NULL) - return dm; - - /* Get org mesh, only to test whether affected cdata layer has already been copied - * somewhere up in the modifiers stack. - */ - ob_m = get_mesh(ob); - if (ob_m == NULL) - return dm; - - /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ - if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { - /* XXX Seems to create problems with weightpaint mode??? - * I'm missing something here, I guess... - */ -// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ - ret = CDDM_copy(dm); - dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); - if (dvert == NULL) { - ret->release(ret); - return dm; - } - rel_ret = 1; - } - else - ret = dm; -#else - ret = CDDM_copy(dm); - rel_ret = 1; - dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); - if (dvert == NULL) { - if (rel_ret) - ret->release(ret); - return dm; - } -#endif + dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts); /* Find out which vertices to work on. */ tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx"); @@ -364,8 +318,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der MEM_freeN(tdw1); MEM_freeN(tdw2); MEM_freeN(tidx); - if (rel_ret) - ret->release(ret); return dm; } if (numIdx != -1) { @@ -400,7 +352,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } /* Do masking. */ - weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant, + weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant, wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); @@ -419,7 +371,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der MEM_freeN(indices); /* Return the vgroup-modified mesh. */ - return ret; + return dm; } static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, -- cgit v1.2.3