diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_weightvgedit.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvgedit.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index c8d7ab52ce8..e84ecffa74b 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -190,8 +190,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; - DerivedMesh *dm = derivedData; - DerivedMesh *ret; + DerivedMesh *dm = derivedData, *ret = NULL; + Mesh *ob_m = NULL; MDeformVert *dvert = NULL; float *org_w = NULL; /* Array original weights. */ float *new_w = NULL; /* Array new weights. */ @@ -217,30 +217,54 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if ((numVerts == 0) || (ob->defbase.first == NULL)) return dm; - /* Create a copy of our dmesh. - * TODO: This should be done only if needed, i.e. if dm has the org data ! + /* Get vgroup idx from its name. */ + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + if (defgrp_idx < 0) + 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 (1) { - /* XXX Seems to create problems with weightpaint mode... */ +#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; - - /* Get vgroup idx from its name. */ - defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); - - /* Get actual dverts (ie vertex group data). */ - if (defgrp_idx >= 0) - dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); - /* If no dverts, return unmodified data… */ - if ((defgrp_idx < 0) || (dvert == NULL)) { +#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 /* Get org weights, assuming 0.0 for vertices not in given vgroup. */ org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w"); |