[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42634] trunk/blender/source: more vertex weight edits,

Campbell Barton ideasman42 at gmail.com
Wed Dec 14 23:54:49 CET 2011


Revision: 42634
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42634
Author:   campbellbarton
Date:     2011-12-14 22:54:38 +0000 (Wed, 14 Dec 2011)
Log Message:
-----------
more vertex weight edits,
* replace inline loops with api calls.
* change constraints so verts with 0.0 weight are ignored like they are everywhere else.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/modifiers/intern/MOD_cast.c
    trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
    trunk/blender/source/blender/modifiers/intern/MOD_smooth.c
    trunk/blender/source/gameengine/Converter/BL_SkinDeformer.cpp
    trunk/blender/source/gameengine/Rasterizer/CMakeLists.txt
    trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.cpp

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2011-12-14 21:08:08 UTC (rev 42633)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2011-12-14 22:54:38 UTC (rev 42634)
@@ -924,7 +924,6 @@
 		float contrib = 0.0f;
 		float armature_weight = 1.0f;	/* default to 1 if no overall def group */
 		float prevco_weight = 1.0f;		/* weight for optional cached vertexcos */
-		int	  j;
 
 		if(use_quaternion) {
 			memset(&sumdq, 0, sizeof(DualQuat));
@@ -971,12 +970,14 @@
 		mul_m4_v3(premat, co);
 		
 		if(use_dverts && dvert && dvert->totweight) { // use weight groups ?
+			MDeformWeight *dw= dvert->dw;
 			int deformed = 0;
+			unsigned int j;
 			
-			for(j = 0; j < dvert->totweight; j++){
-				int index = dvert->dw[j].def_nr;
+			for (j= dvert->totweight; j != 0; j--, dw++) {
+				const int index = dw->def_nr;
 				if(index < defbase_tot && (pchan= defnrToPC[index])) {
-					float weight = dvert->dw[j].weight;
+					float weight = dw->weight;
 					Bone *bone= pchan->bone;
 					pdef_info= pdef_info_array + defnrToPCIndex[index];
 

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2011-12-14 21:08:08 UTC (rev 42633)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2011-12-14 22:54:38 UTC (rev 42634)
@@ -436,16 +436,15 @@
 	float vec[3] = {0.0f, 0.0f, 0.0f};
 	float normal[3] = {0.0f, 0.0f, 0.0f}, plane[3];
 	float imat[3][3], tmat[3][3];
-	int dgroup;
+	const int defgroup= defgroup_name_index(ob, substring);
 	short freeDM = 0;
 	
 	/* initialize target matrix using target matrix */
 	copy_m4_m4(mat, ob->obmat);
 	
 	/* get index of vertex group */
-	dgroup = defgroup_name_index(ob, substring);
-	if (dgroup < 0) return;
-	
+	if (defgroup == -1) return;
+
 	/* get DerivedMesh */
 	if (em) {
 		/* target is in editmode, so get a special derived mesh */
@@ -463,28 +462,25 @@
 	if (dm) {
 		MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
 		int numVerts = dm->getNumVerts(dm);
-		int i, j, count = 0;
+		int i, count = 0;
 		float co[3], nor[3];
 		
 		/* check that dvert is a valid pointers (just in case) */
 		if (dvert) {
+			MDeformVert *dv= dvert;
 			/* get the average of all verts with that are in the vertex-group */
-			for (i = 0; i < numVerts; i++) {	
-				for (j = 0; j < dvert[i].totweight; j++) {
-					/* does this vertex belong to nominated vertex group? */
-					if (dvert[i].dw[j].def_nr == dgroup) {
-						dm->getVertCo(dm, i, co);
-						dm->getVertNo(dm, i, nor);
-						add_v3_v3(vec, co);
-						add_v3_v3(normal, nor);
-						count++;
-						break;
-					}
+			for (i = 0; i < numVerts; i++, dv++) {
+				MDeformWeight *dw= defvert_find_index(dv, defgroup);
+				if (dw && dw->weight != 0.0f) {
+					dm->getVertCo(dm, i, co);
+					dm->getVertNo(dm, i, nor);
+					add_v3_v3(vec, co);
+					add_v3_v3(normal, nor);
+					count++;
 					
 				}
 			}
-			
-			
+
 			/* calculate averages of normal and coordinates */
 			if (count > 0) {
 				mul_v3_fl(vec, 1.0f / count);
@@ -535,43 +531,38 @@
 	float *co = dl?dl->verts:NULL;
 	BPoint *bp = lt->def;
 	
-	MDeformVert *dvert = lt->dvert;
+	MDeformVert *dv = lt->dvert;
 	int tot_verts= lt->pntsu*lt->pntsv*lt->pntsw;
 	float vec[3]= {0.0f, 0.0f, 0.0f}, tvec[3];
-	int dgroup=0, grouped=0;
+	int grouped=0;
 	int i, n;
+	const int defgroup= defgroup_name_index(ob, substring);
 	
 	/* initialize target matrix using target matrix */
 	copy_m4_m4(mat, ob->obmat);
-	
+
 	/* get index of vertex group */
-	dgroup = defgroup_name_index(ob, substring);
-	if (dgroup < 0) return;
-	if (dvert == NULL) return;
+	if (defgroup == -1) return;
+	if (dv == NULL) return;
 	
 	/* 1. Loop through control-points checking if in nominated vertex-group.
 	 * 2. If it is, add it to vec to find the average point.
 	 */
-	for (i=0; i < tot_verts; i++, dvert++) {
-		for (n= 0; n < dvert->totweight; n++) {
-			/* found match - vert is in vgroup */
-			if (dvert->dw[n].def_nr == dgroup) {
+	for (i=0; i < tot_verts; i++, dv++) {
+		for (n= 0; n < dv->totweight; n++) {
+			MDeformWeight *dw= defvert_find_index(dv, defgroup);
+			if (dw && dw->weight > 0.0f) {
 				/* copy coordinates of point to temporary vector, then add to find average */
-				if (co)
-					memcpy(tvec, co, 3*sizeof(float));
-				else
-					memcpy(tvec, bp->vec, 3*sizeof(float));
-					
+				memcpy(tvec, co ? co : bp->vec, 3 * sizeof(float));
+
 				add_v3_v3(vec, tvec);
 				grouped++;
-				
-				break;
 			}
 		}
 		
 		/* advance pointer to coordinate data */
-		if (co) co+= 3;
-		else bp++;
+		if (co) co += 3;
+		else    bp++;
 	}
 	
 	/* find average location, then multiply by ob->obmat to find world-space location */
@@ -1106,10 +1097,10 @@
 {
 	bKinematicConstraint *data= (bKinematicConstraint *)cdata;
 	
-	data->weight= (float)1.0;
-	data->orientweight= (float)1.0;
+	data->weight= 1.0f;
+	data->orientweight= 1.0f;
 	data->iterations = 500;
-	data->dist= (float)1.0;
+	data->dist= 1.0f;
 	data->flag= CONSTRAINT_IK_TIP|CONSTRAINT_IK_STRETCH|CONSTRAINT_IK_POS;
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2011-12-14 21:08:08 UTC (rev 42633)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2011-12-14 22:54:38 UTC (rev 42634)
@@ -539,6 +539,12 @@
 	return dw ? dw->weight : 0.0f;
 }
 
+/* take care with this the rationale is:
+ * - if the object has no vertex group. act like vertex group isnt set and return 1.0,
+ * - if the vertex group exists but the 'defgroup' isnt found on this vertex, _still_ return 0.0
+ *
+ * This is a bit confusing, just saves some checks from the caller.
+ */
 float defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup)
 {
 	if (defgroup == -1 || dvert == NULL)

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2011-12-14 21:08:08 UTC (rev 42633)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2011-12-14 22:54:38 UTC (rev 42634)
@@ -688,57 +688,51 @@
 	}
 }
 
-static void vgroup_copy_active_to_sel_single(Object *ob, int def_nr)
+static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
 {
 	EditVert *eve_act;
-	MDeformVert *dvert_act;
+	MDeformVert *dv_act;
 
-	act_vert_def(ob, &eve_act, &dvert_act);
+	act_vert_def(ob, &eve_act, &dv_act);
 
-	if(dvert_act==NULL) {
+	if(dv_act==NULL) {
 		return;
 	}
 	else {
 		Mesh *me= ob->data;
 		EditMesh *em = BKE_mesh_get_editmesh(me);
 		EditVert *eve;
-		MDeformVert *dvert;
+		MDeformVert *dv;
 		MDeformWeight *dw;
-		float act_weight = -1.0f;
-		int i;
+		float weight_act;
 		int index= 0;
 
-		for(i=0, dw=dvert_act->dw; i < dvert_act->totweight; i++, dw++) {
-			if(def_nr == dw->def_nr) {
-				act_weight= dw->weight;
-				break;
-			}
-		}
+		dw= defvert_find_index(dv_act, def_nr);
 
-		if(act_weight < -0.5f)
+		if(dw == NULL)
 			return;
 
-		for(eve= em->verts.first; eve; eve= eve->next, index++) {
-			if(eve->f & SELECT && eve != eve_act) {
-				dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-				if(dvert) {
-					for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++) {
-						if(def_nr == dw->def_nr) {
-							dw->weight= act_weight;
+		weight_act= dw->weight;
 
-							if(me->editflag & ME_EDIT_MIRROR_X)
-								editvert_mirror_update(ob, eve, -1, index);
+		for (eve= em->verts.first; eve; eve= eve->next, index++) {
+			if (eve->f & SELECT && eve != eve_act) {
+				dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+				if(dv) {
+					dw= defvert_find_index(dv, def_nr);
+					if (dw) {
+						dw->weight= weight_act;
 
-							break;
+						if (me->editflag & ME_EDIT_MIRROR_X) {
+							editvert_mirror_update(ob, eve, -1, index);
 						}
 					}
 				}
 			}
 		}
 
-		if(me->editflag & ME_EDIT_MIRROR_X)
+		if (me->editflag & ME_EDIT_MIRROR_X) {
 			editvert_mirror_update(ob, eve_act, -1, -1);
-
+		}
 	}
 }
 
@@ -808,14 +802,15 @@
 	Object *ob= OBACT;
 
 	EditVert *eve;
-	MDeformVert *dvert;
+	MDeformVert *dv;
 
-	act_vert_def(ob, &eve, &dvert);
+	act_vert_def(ob, &eve, &dv);
 
-	if(dvert && dvert->totweight) {
+	if(dv && dv->totweight) {
 		uiLayout *col;
 		bDeformGroup *dg;
-		int i;
+		MDeformWeight *dw = dv->dw;
+		unsigned int i;
 		int yco = 0;
 
 		uiBlockSetHandleFunc(block, do_view3d_vgroup_buttons, NULL);
@@ -825,11 +820,11 @@
 
 		uiBlockBeginAlign(block);
 
-		for (i=0; i<dvert->totweight; i++){
-			dg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr);
+		for (i= dv->totweight; i != 0; i--, dw++) {
+			dg = BLI_findlink (&ob->defbase, dw->def_nr);
 			if(dg) {
-				uiDefButF(block, NUM, B_VGRP_PNL_EDIT_SINGLE + dvert->dw[i].def_nr, dg->name,	0, yco, 180, 20, &dvert->dw[i].weight, 0.0, 1.0, 1, 3, "");
-				uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dvert->dw[i].def_nr, "C", 180,yco,20,20, NULL, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
+				uiDefButF(block, NUM, B_VGRP_PNL_EDIT_SINGLE + dw->def_nr, dg->name,	0, yco, 180, 20, &dw->weight, 0.0, 1.0, 1, 3, "");
+				uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dw->def_nr, "C", 180,yco,20,20, NULL, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
 				yco -= 20;
 			}
 		}

Modified: trunk/blender/source/blender/modifiers/intern/MOD_cast.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_cast.c	2011-12-14 21:08:08 UTC (rev 42633)
+++ trunk/blender/source/blender/modifiers/intern/MOD_cast.c	2011-12-14 22:54:38 UTC (rev 42634)
@@ -200,11 +200,11 @@
 	* with or w/o a vgroup. With lots of if's in the code below,
 	* further optimizations are possible, if needed */
 	if (dvert) { /* with a vgroup */
+		MDeformVert *dv= dvert;
 		float fac_orig = fac;
-		for (i = 0; i < numVerts; i++) {
-			MDeformWeight *dw = NULL;
-			int j;
+		for (i = 0; i < numVerts; i++, dv++) {
 			float tmp_co[3];
+			float weight;
 
 			copy_v3_v3(tmp_co, vertexCos[i]);
 			if(ctrl_ob) {
@@ -224,15 +224,10 @@
 				if (len_v3(vec) > cmd->radius) continue;
 			}
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list