[Bf-committers] vertex group subdividing -- weight propagation

bjornmose bjornmose at gmx.net
Sun Nov 7 22:52:06 CET 2004


ok this won't go to 2.35? but i don't want it to get lost..
first submission:
http://projects.blender.org/pipermail/bf-committers/2004-September/007454.html

when i switched (unofficial) softbodies *goal* to  *vertex group weight 
painting*  i felt this feature urgently misssing :)

/ole
-------------- next part --------------
Index: source/blender/src/editmesh_tools.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editmesh_tools.c,v
retrieving revision 1.14
diff -u -r1.14 editmesh_tools.c
--- source/blender/src/editmesh_tools.c	18 Oct 2004 22:47:26 -0000	1.14
+++ source/blender/src/editmesh_tools.c	29 Oct 2004 18:37:29 -0000
@@ -1063,6 +1063,54 @@
 /* ******************** SUBDIVIDE ********************************** */
 
 
+static void merge_weights(EditVert * vt, EditVert *vs )
+{
+	MDeformWeight *newdw;
+	int i,j,done;
+	for (j=0; j<vs->totweight; j++){
+		done=0;
+		/* Is vertex memeber of group */
+		/* If so: Change its weight */
+		for (i=0; i<vt->totweight; i++){
+			if (vt->dw[i].def_nr == vs->dw[j].def_nr)
+			{   /* taking the maximum makes it independant from order of occurance */
+				if (vt->dw[i].weight < vs->dw[j].weight) vt->dw[i].weight = vs->dw[j].weight;
+				done=1;
+				break;
+			}
+		}
+		/* If not: Add the group and set its weight */
+		if (!done){
+			newdw = MEM_callocN (sizeof(MDeformWeight)*(vt->totweight+1), "deformWeight");
+			if (vt->dw){
+				memcpy (newdw, vt->dw, sizeof(MDeformWeight)*vt->totweight);
+				MEM_freeN (vt->dw);
+			}
+			vt->dw=newdw;
+			vt->dw[vt->totweight].weight=vs->dw[j].weight;
+			vt->dw[vt->totweight].def_nr=vs->dw[j].def_nr;
+			vt->totweight++;
+		}
+	}
+}
+
+
+static void set_weights(EditVert * vt, EditVert *vs1,EditVert *vs2,EditVert *vs3,EditVert *vs4 )
+{
+/*
+vt is a new generated vertex with empty deform group information
+vs1..v4 are egde neighbours holding group information
+so let the information ooze into the new one
+*/
+	if (vs1) merge_weights(vt,vs1);
+	if (vs2) merge_weights(vt,vs2);
+	if (vs3) merge_weights(vt,vs3);
+	if (vs4) merge_weights(vt,vs4);
+}
+
+
+
+
 static unsigned int cpack_fact(unsigned int col1, unsigned int col2, float fact)
 {
 	char *cp1, *cp2, *cp;
@@ -1105,6 +1153,9 @@
 	else if(efa->v4 && vertex && efa->v4 == vertex) efa->tf.unwrap |= TF_PIN4;
 }
 
+
+
+
 static void set_wuv(int tot, EditFace *efa, int v1, int v2, int v3, int v4, EditFace *efapin)
 {
 	/* this weird function only to be used for subdivide, the 'w' in the name has no meaning! */
@@ -1486,6 +1537,7 @@
 				/* add edges here, to copy correct edge data */
 				eed= addedgelist(e1->v1, e1->vn, e1);
 				eed= addedgelist(e1->vn, e1->v2, e1);
+				set_weights(e1->vn, e1->v1,e1->v2,NULL,NULL);
 			}
 			if(e2 && e2->vn) {
 				test+= 2;
@@ -1493,6 +1545,7 @@
 				/* add edges here, to copy correct edge data */
 				eed= addedgelist(e2->v1, e2->vn, e2);
 				eed= addedgelist(e2->vn, e2->v2, e2);
+				set_weights(e2->vn, e2->v1,e2->v2,NULL,NULL);
 			}
 			if(e3 && e3->vn) {
 				test+= 4;
@@ -1500,6 +1553,7 @@
 				/* add edges here, to copy correct edge data */
 				eed= addedgelist(e3->v1, e3->vn, e3);
 				eed= addedgelist(e3->vn, e3->v2, e3);
+				set_weights(e3->vn, e3->v1,e3->v2,NULL,NULL);
 			}
 			if(e4 && e4->vn) {
 				test+= 8;
@@ -1507,6 +1561,7 @@
 				/* add edges here, to copy correct edge data */
 				eed= addedgelist(e4->v1, e4->vn, e4);
 				eed= addedgelist(e4->vn, e4->v2, e4);
+				set_weights(e4->vn, e4->v1,e4->v2,NULL,NULL);
 			}
 			if(test) {
 				if(efa->v4==0) {  /* All the permutations of 3 edges*/
@@ -1564,7 +1619,7 @@
 							smooth_subdiv_quad(efa, vec);	/* adds */
 						}
 						eve= addvertlist(vec);
-						
+						set_weights(eve, efa->v1,efa->v2,efa->v3,efa->v4);
 						eve->f |= flag;
 
 						addface_subdiv(efa, 2, 2+4, 9, 1+4, eve, &efapin);
@@ -1621,6 +1676,7 @@
 							vec[1]=(e1->vn->co[1]+e2->vn->co[1])/2;
 							vec[2]=(e1->vn->co[2]+e2->vn->co[2])/2;
 							eve= addvertlist(vec);
+							set_weights(eve, e1->vn,e2->vn,NULL,NULL);
 							eve->f |= flag;
 							/* Add new faces */
 							addface_subdiv(efa, 4, 10, 2+4, 3, eve, &efapin);
@@ -1639,6 +1695,7 @@
 							vec[1]=(e2->vn->co[1]+e3->vn->co[1])/2;
 							vec[2]=(e2->vn->co[2]+e3->vn->co[2])/2;
 							eve= addvertlist(vec);
+							set_weights(eve, e2->vn,e3->vn,NULL,NULL);
 							eve->f |= flag;
 							/*New faces*/
 							addface_subdiv(efa, 1, 11, 3+4, 4, eve, &efapin);
@@ -1657,6 +1714,7 @@
 							vec[1]=(e3->vn->co[1]+e4->vn->co[1])/2;
 							vec[2]=(e3->vn->co[2]+e4->vn->co[2])/2;
 							eve= addvertlist(vec);
+							set_weights(eve, e3->vn,e4->vn,NULL,NULL);
 							eve->f |= flag;
 							/*New Faces*/
 							addface_subdiv(efa, 2, 12, 4+4, 1, eve, &efapin);
@@ -1675,6 +1733,7 @@
 							vec[1]=(e1->vn->co[1]+e4->vn->co[1])/2;
 							vec[2]=(e1->vn->co[2]+e4->vn->co[2])/2;
 							eve= addvertlist(vec);
+							set_weights(eve, e1->vn,e4->vn,NULL,NULL);
 							eve->f |= flag;
 							/*New Faces*/
 							addface_subdiv(efa, 3, 13, 1+4, 2, eve, &efapin);


More information about the Bf-committers mailing list