[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40240] trunk/blender/source/blender/ modifiers/intern: WeightVG: Made Edit and Proximity also use the new weightvg_update_vg MDeformWeight** parameter (to avoid another vgroup searching).

Bastien Montagne montagne29 at wanadoo.fr
Thu Sep 15 19:28:19 CEST 2011


Revision: 40240
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40240
Author:   mont29
Date:     2011-09-15 17:28:18 +0000 (Thu, 15 Sep 2011)
Log Message:
-----------
WeightVG: Made Edit and Proximity also use the new weightvg_update_vg MDeformWeight** parameter (to avoid another vgroup searching).
Also added to Proximity a check in case vgroup would have no vertices in it.
Plus a few minor edits...

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

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-09-15 16:51:55 UTC (rev 40239)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-09-15 17:28:18 UTC (rev 40240)
@@ -187,6 +187,7 @@
 	Mesh *ob_m = NULL;
 #endif
 	MDeformVert *dvert = NULL;
+	MDeformWeight **dw = NULL;
 	float *org_w; /* Array original weights. */
 	float *new_w; /* Array new weights. */
 	int numVerts;
@@ -257,14 +258,16 @@
 
 	/* Get org weights, assuming 0.0 for vertices not in given vgroup. */
 	org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
-	new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
+	new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, new_w");
+	dw = MEM_mallocN(sizeof(MDeformWeight*) * numVerts, "WeightVGEdit Modifier, dw");
 	for (i = 0; i < numVerts; i++) {
-		MDeformWeight *dw = defvert_find_index(&dvert[i], defgrp_idx);
-		org_w[i] = new_w[i] = wmd->default_weight;
-
-		if(dw) {
-			org_w[i] = new_w[i] = dw->weight;
+		dw[i] = defvert_find_index(&dvert[i], defgrp_idx);
+		if(dw[i]) {
+			org_w[i] = new_w[i] = dw[i]->weight;
 		}
+		else {
+			org_w[i] = new_w[i] = wmd->default_weight;
+		}
 	}
 
 	/* Do mapping. */
@@ -278,12 +281,13 @@
 	                 wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
 
 	/* Update/add/remove from vgroup. */
-	weightvg_update_vg(dvert, defgrp_idx, NULL, numVerts, NULL, org_w, do_add, wmd->add_threshold,
+	weightvg_update_vg(dvert, defgrp_idx, dw, numVerts, NULL, org_w, do_add, wmd->add_threshold,
 	                   do_rem, wmd->rem_threshold);
 
 	/* Freeing stuff. */
 	MEM_freeN(org_w);
 	MEM_freeN(new_w);
+	MEM_freeN(dw);
 
 	/* Return the vgroup-modified mesh. */
 	return ret;

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c	2011-09-15 16:51:55 UTC (rev 40239)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c	2011-09-15 17:28:18 UTC (rev 40240)
@@ -412,7 +412,7 @@
 	/* Update (add to) vgroup.
 	 * XXX Depending on the MOD_WVG_SET_xxx option chosen, we might have to add vertices to vgroup.
 	 */
-	weightvg_update_vg(dvert, defgrp_idx, dw1, numIdx, indices, org_w, TRUE, -FLT_MAX, 0, 0.0f);
+	weightvg_update_vg(dvert, defgrp_idx, dw1, numIdx, indices, org_w, TRUE, -FLT_MAX, FALSE, 0.0f);
 
 	/* Freeing stuff. */
 	MEM_freeN(org_w);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c	2011-09-15 16:51:55 UTC (rev 40239)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c	2011-09-15 17:28:18 UTC (rev 40240)
@@ -344,6 +344,7 @@
 	Mesh *ob_m = NULL;
 #endif
 	MDeformVert *dvert = NULL;
+	MDeformWeight **dw, **tdw;
 	int numVerts;
 	float (*v_cos)[3] = NULL; /* The vertices coordinates. */
 	Object *obr = NULL; /* Our target object. */
@@ -353,7 +354,7 @@
 	float *new_w =NULL;
 	int *tidx, *indices = NULL;
 	int numIdx = 0;
-	int i, j;
+	int i;
 	char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
 
 	/* Get number of verts. */
@@ -423,22 +424,34 @@
 	 */
 	tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGProximity Modifier, tidx");
 	tw = MEM_mallocN(sizeof(float) * numVerts, "WeightVGProximity Modifier, tw");
+	tdw = MEM_mallocN(sizeof(MDeformWeight*) * numVerts, "WeightVGProximity Modifier, tdw");
 	for (i = 0; i < numVerts; i++) {
-		for (j = 0; j < dvert[i].totweight; j++) {
-			if(dvert[i].dw[j].def_nr == defgrp_idx) {
-				tidx[numIdx] = i;
-				tw[numIdx++] = dvert[i].dw[j].weight;
-				break;
-			}
+		MDeformWeight *_dw = defvert_find_index(&dvert[i], defgrp_idx);
+		if(_dw) {
+			tidx[numIdx] = i;
+			tw[numIdx] = _dw->weight;
+			tdw[numIdx++] = _dw;
 		}
 	}
+	/* If no vertices found, return org data! */
+	if(numIdx == 0) {
+		MEM_freeN(tidx);
+		MEM_freeN(tw);
+		MEM_freeN(tdw);
+		if (rel_ret)
+			ret->release(ret);
+		return dm;
+	}
 	indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices");
 	memcpy(indices, tidx, sizeof(int) * numIdx);
 	org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, org_w");
 	new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, new_w");
 	memcpy(org_w, tw, sizeof(float) * numIdx);
+	dw = MEM_mallocN(sizeof(MDeformWeight*) * numIdx, "WeightVGProximity Modifier, dw");
+	memcpy(dw, tdw, sizeof(MDeformWeight*) * numIdx);
 	MEM_freeN(tidx);
 	MEM_freeN(tw);
+	MEM_freeN(tdw);
 
 	/* Get our vertex coordinates. */
 	v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos");
@@ -447,7 +460,7 @@
 
 	/* Compute wanted distances. */
 	if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJECT) {
-		float dist = get_ob2ob_distance(ob, obr);
+		const float dist = get_ob2ob_distance(ob, obr);
 		for(i = 0; i < numIdx; i++)
 			new_w[i] = dist;
 	}
@@ -482,8 +495,10 @@
 				                       target_dm, &loc2trgt);
 				for(i = 0; i < numIdx; i++) {
 					new_w[i] = dists_v ? dists_v[i] : FLT_MAX;
-					new_w[i] = dists_e ? minf(dists_e[i], new_w[i]) : new_w[i];
-					new_w[i] = dists_f ? minf(dists_f[i], new_w[i]) : new_w[i];
+					if(dists_e)
+						new_w[i] = minf(dists_e[i], new_w[i]);
+					if(dists_f)
+						new_w[i] = minf(dists_f[i], new_w[i]);
 				}
 				if(dists_v) MEM_freeN(dists_v);
 				if(dists_e) MEM_freeN(dists_e);
@@ -508,11 +523,12 @@
 	                 wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
 
 	/* Update vgroup. Note we never add nor remove vertices from vgroup here. */
-	weightvg_update_vg(dvert, defgrp_idx, NULL, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f);
+	weightvg_update_vg(dvert, defgrp_idx, dw, numIdx, indices, org_w, FALSE, 0.0f, FALSE, 0.0f);
 
 	/* Freeing stuff. */
 	MEM_freeN(org_w);
 	MEM_freeN(new_w);
+	MEM_freeN(dw);
 	MEM_freeN(indices);
 	MEM_freeN(v_cos);
 




More information about the Bf-blender-cvs mailing list