[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38764] branches/vgroup_modifiers/source/ blender/modifiers/intern: vgroup_modifiers: coded a way to test whether the dm needs to be copied (i.e.

Bastien Montagne montagne29 at wanadoo.fr
Wed Jul 27 20:48:24 CEST 2011


Revision: 38764
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38764
Author:   mont29
Date:     2011-07-27 18:48:23 +0000 (Wed, 27 Jul 2011)
Log Message:
-----------
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...

Modified Paths:
--------------
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c

Modified: branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-07-27 18:38:44 UTC (rev 38763)
+++ branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-07-27 18:48:23 UTC (rev 38764)
@@ -190,8 +190,8 @@
                                   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 @@
 	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");

Modified: branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c	2011-07-27 18:38:44 UTC (rev 38763)
+++ branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c	2011-07-27 18:48:23 UTC (rev 38764)
@@ -220,8 +220,8 @@
                                   int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
 {
 	WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
-	DerivedMesh *dm = derivedData;
-	DerivedMesh *ret;
+	DerivedMesh *dm = derivedData, *ret = NULL;
+	Mesh *ob_m = NULL;
 	MDeformVert *dvert = NULL;
 	int numVerts;
 	int defgrp_idx, defgrp_idx2 = -1;
@@ -241,34 +241,60 @@
 	if ((numVerts == 0) || (ob->defbase.first == NULL))
 		return dm;
 
-	/* Create a copy of our dmesh.
-	 * TODO: This should be done only if needed !
+	/* Get vgroup idx from its name. */
+	defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+	if (defgrp_idx < 0)
+		return dm;
+	/* Get seconf vgroup idx from its name, if given. */
+	if (wmd->defgrp_name2[0] != (char)0) {
+		defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2);
+		if (defgrp_idx2 < 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 first vgroup idx from its name. */
-	defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
-
-	/* Get seconf vgroup idx from its name, if given. */
-	if (wmd->defgrp_name2)
-		defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2);
-
-	/* 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
 
 	/* Find out which vertices to work on. */
 	tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");

Modified: branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c	2011-07-27 18:38:44 UTC (rev 38763)
+++ branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c	2011-07-27 18:48:23 UTC (rev 38764)
@@ -314,12 +314,12 @@
                                   int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
 {
 	WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
-	DerivedMesh *dm = derivedData;
-	DerivedMesh *ret;
+	DerivedMesh *dm = derivedData, *ret = NULL;
+	Mesh *ob_m = NULL;
 	MDeformVert *dvert = NULL;
 	int numVerts;
 	float (*v_cos)[3] = NULL; /* The vertices coordinates. */
-	Object *obr; /* Our target object. */
+	Object *obr = NULL; /* Our target object. */
 	int defgrp_idx;
 	float *tw = NULL;
 	float *org_w = NULL;
@@ -338,32 +338,59 @@
 	if ((numVerts == 0) || (ob->defbase.first == NULL))
 		return dm;
 
-	/* Create a copy of our dmesh.
-	 * TODO: This should be done only if needed !
+	/* Get our target object. */
+	obr = wmd->proximity_ob_target;
+	if (obr == NULL)
+		return dm;
+
+	/* 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);
-	/* Get our target object. */
-	obr = wmd->proximity_ob_target;
-	/* If no dverts or target object, return unmodified data… */
-	if ((defgrp_idx < 0) || (dvert == NULL) || (!obr)) {
+#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
 
 	/* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight.
 	 */




More information about the Bf-blender-cvs mailing list