[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40232] trunk/blender/source/blender/ modifiers/intern: WeightVG Mix modifier: updated code to use defgrp_find_index, and make MDeformWeights be searched only once.

Bastien Montagne montagne29 at wanadoo.fr
Thu Sep 15 16:48:50 CEST 2011


Revision: 40232
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40232
Author:   mont29
Date:     2011-09-15 14:48:50 +0000 (Thu, 15 Sep 2011)
Log Message:
-----------
WeightVG Mix modifier: updated code to use defgrp_find_index, and make MDeformWeights be searched only once.
Also fixed a bug: when another set mode than "All Vertices" was used and resulting set of verts was empty, all vertices was used, instead of just returning org, unmodified data!

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

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-09-15 13:44:25 UTC (rev 40231)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-09-15 14:48:50 UTC (rev 40232)
@@ -259,7 +259,7 @@
 	org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
 	new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
 	for (i = 0; i < numVerts; i++) {
-		MDeformWeight *dw= defvert_find_index(&dvert[i], defgrp_idx);
+		MDeformWeight *dw = defvert_find_index(&dvert[i], defgrp_idx);
 		org_w[i] = new_w[i] = wmd->default_weight;
 
 		if(dw) {

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c	2011-09-15 13:44:25 UTC (rev 40231)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c	2011-09-15 14:48:50 UTC (rev 40232)
@@ -229,13 +229,14 @@
 	Mesh *ob_m = NULL;
 #endif
 	MDeformVert *dvert = NULL;
+	MDeformWeight **dw1, **tdw1, **dw2, **tdw2;
 	int numVerts;
 	int defgrp_idx, defgrp_idx2 = -1;
 	float *org_w;
 	float *new_w;
 	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. */
@@ -304,78 +305,91 @@
 
 	/* Find out which vertices to work on. */
 	tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");
+	tdw1 = MEM_mallocN(sizeof(MDeformWeight*) * numVerts, "WeightVGMix Modifier, tdw1");
+	tdw2 = MEM_mallocN(sizeof(MDeformWeight*) * numVerts, "WeightVGMix Modifier, tdw2");
 	switch (wmd->mix_set) {
 	case MOD_WVG_SET_A:
 		/* All vertices in first vgroup. */
 		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;
-					break;
-				}
+			MDeformWeight *dw = defvert_find_index(&dvert[i], defgrp_idx);
+			if(dw) {
+				tdw1[numIdx] = dw;
+				tdw2[numIdx] = defvert_find_index(&dvert[i], defgrp_idx2);
+				tidx[numIdx++] = i;
 			}
 		}
 		break;
 	case MOD_WVG_SET_B:
 		/* All vertices in second vgroup. */
 		for (i = 0; i < numVerts; i++) {
-			for (j = 0; j < dvert[i].totweight; j++) {
-				if(dvert[i].dw[j].def_nr == defgrp_idx2) {
-					tidx[numIdx++] = i;
-					break;
-				}
+			MDeformWeight *dw = defvert_find_index(&dvert[i], defgrp_idx2);
+			if(dw) {
+				tdw1[numIdx] = defvert_find_index(&dvert[i], defgrp_idx);
+				tdw2[numIdx] = dw;
+				tidx[numIdx++] = i;
 			}
 		}
 		break;
 	case MOD_WVG_SET_OR:
 		/* All vertices in one vgroup or the other. */
 		for (i = 0; i < numVerts; i++) {
-			for (j = 0; j < dvert[i].totweight; j++) {
-				if(dvert[i].dw[j].def_nr == defgrp_idx || dvert[i].dw[j].def_nr == defgrp_idx2) {
-					tidx[numIdx++] = i;
-					break;
-				}
+			MDeformWeight *adw = defvert_find_index(&dvert[i], defgrp_idx);
+			MDeformWeight *bdw = defvert_find_index(&dvert[i], defgrp_idx2);
+			if(adw || bdw) {
+				tdw1[numIdx] = adw;
+				tdw2[numIdx] = bdw;
+				tidx[numIdx++] = i;
 			}
 		}
 		break;
 	case MOD_WVG_SET_AND:
 		/* All vertices in both vgroups. */
 		for (i = 0; i < numVerts; i++) {
-			int idx1 = FALSE;
-			int idx2 = FALSE;
-			for (j = 0; j < dvert[i].totweight; j++) {
-				if(dvert[i].dw[j].def_nr == defgrp_idx) {
-					if (idx2 == TRUE) {
-						tidx[numIdx++] = i;
-						break;
-					}
-					else {
-						idx1 = TRUE;
-					}
-				}
-				else if(dvert[i].dw[j].def_nr == defgrp_idx2) {
-					if (idx1 == TRUE) {
-						tidx[numIdx++] = i;
-						break;
-					}
-					else {
-						idx2 = TRUE;
-					}
-				}
+			MDeformWeight *adw = defvert_find_index(&dvert[i], defgrp_idx);
+			MDeformWeight *bdw = defvert_find_index(&dvert[i], defgrp_idx2);
+			if(adw && bdw) {
+				tdw1[numIdx] = adw;
+				tdw2[numIdx] = bdw;
+				tidx[numIdx++] = i;
 			}
 		}
 		break;
 	case MOD_WVG_SET_ALL:
 	default:
-		/* Use all vertices, no need to do anything here. */
+		/* Use all vertices. */
+		for (i = 0; i < numVerts; i++) {
+			tdw1[i] = defvert_find_index(&dvert[i], defgrp_idx);
+			tdw2[i] = defvert_find_index(&dvert[i], defgrp_idx2);
+		}
+		numIdx = -1;
 		break;
 	}
-	if (numIdx) {
+	if(numIdx == 0) {
+		/* Use no vertices! Hence, return org data. */
+		MEM_freeN(tdw1);
+		MEM_freeN(tdw2);
+		MEM_freeN(tidx);
+		if (rel_ret)
+			ret->release(ret);
+		return dm;
+	}
+	if (numIdx != -1) {
 		indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGMix Modifier, indices");
 		memcpy(indices, tidx, sizeof(int) * numIdx);
+		dw1 = MEM_mallocN(sizeof(MDeformWeight*) * numIdx, "WeightVGMix Modifier, dw1");
+		memcpy(dw1, tdw1, sizeof(MDeformWeight*) * numIdx);
+		MEM_freeN(tdw1);
+		dw2 = MEM_mallocN(sizeof(MDeformWeight*) * numIdx, "WeightVGMix Modifier, dw2");
+		memcpy(dw2, tdw2, sizeof(MDeformWeight*) * numIdx);
+		MEM_freeN(tdw2);
 	}
-	else
+	else {
+		/* Use all vertices. */
 		numIdx = numVerts;
+		/* Just copy MDeformWeight pointers arrays, they will be freed at the end. */
+		dw1 = tdw1;
+		dw2 = tdw2;
+	}
 	MEM_freeN(tidx);
 
 	org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGMix Modifier, org_w");
@@ -384,27 +398,9 @@
 	/* Mix weights. */
 	for (i = 0; i < numIdx; i++) {
 		float weight2 = 0.0;
-		int w1 = FALSE;
-		int w2 = FALSE;
-		int idx = indices ? indices[i] : i;
-		for (j = 0; j < dvert[idx].totweight; j++) {
-			if(dvert[idx].dw[j].def_nr == defgrp_idx) {
-				org_w[i] = dvert[idx].dw[j].weight;
-				w1 = TRUE;
-				if (w2 == TRUE)
-					break;
-			}
-			else if(dvert[idx].dw[j].def_nr == defgrp_idx2) {
-				weight2 = dvert[idx].dw[j].weight;
-				w2 = TRUE;
-				if (w1 == TRUE)
-					break;
-			}
-		}
-		if (w1 == FALSE)
-			org_w[i] = wmd->default_weight_a;
-		if (w2 == FALSE)
-			weight2 = wmd->default_weight_b;
+		org_w[i] = dw1[i] ? dw1[i]->weight : wmd->default_weight_a;
+		weight2  = dw2[i] ? dw2[i]->weight : wmd->default_weight_b;
+
 		new_w[i] = mix_weight(org_w[i], weight2, wmd->mix_mode);
 	}
 
@@ -421,6 +417,8 @@
 	/* Freeing stuff. */
 	MEM_freeN(org_w);
 	MEM_freeN(new_w);
+	MEM_freeN(dw1);
+	MEM_freeN(dw2);
 
 	if (indices)
 		MEM_freeN(indices);




More information about the Bf-blender-cvs mailing list