Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2011-07-27 22:48:23 +0400
committerBastien Montagne <montagne29@wanadoo.fr>2011-07-27 22:48:23 +0400
commit048eabf302b024a6f98907ece0d22c63b1c95dca (patch)
tree34d284a2454a50464356eb699decddf1259000c0 /source/blender/modifiers/intern/MOD_weightvgedit.c
parentaf286ac95b5dbd0a09e433ba672c75f126b206c2 (diff)
vgroup_modifiers: coded a way to test whether the dm needs to be copied (i.e. if the affected cdata layer is or not the original one).
However, as this piece of code tends to slow down things (see e.g. scene 5 of WeightVG test blend file), I deactivated it for now...
Diffstat (limited to 'source/blender/modifiers/intern/MOD_weightvgedit.c')
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c54
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");