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...
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. */
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");
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;
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 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.
*/
- if (1) {
- /* XXX Seems to create problems with weightpaint mode... */
+ 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");
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;
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.
*/