Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Bantle <hairbat@yahoo.com>2006-03-01 06:33:45 +0300
committerGeoffrey Bantle <hairbat@yahoo.com>2006-03-01 06:33:45 +0300
commit13a1a4c15e965f5b9bc99dc88eb379ff3b919567 (patch)
tree02a0ec3424ad0a1ac7a2b1b330db59d862ff220e
parentfc9615f15e69ead939de1731586df042b9130f63 (diff)
-> Vertex Group/Weight support in removedoublesflag()
Remove doubles didn't previously deal with vertex groups/weights properly. Now it averages the weights of vertices when they are doubles and share the same group. Verts that get merged but don't belong to all the same groups are dealt with as well.
-rw-r--r--source/blender/src/editmesh_tools.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index c5c3a1e14e1..c751443471d 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -212,7 +212,8 @@ int removedoublesflag(short flag, float limit) /* return amount */
xvertsort *sortblock, *sb, *sb1;
struct facesort *vlsortblock, *vsb, *vsb1;
float dist;
- int a, b, test, amount;
+ int a, b, test, amount, currweight, doubweight, targetweight;
+ MDeformWeight *newdw;
/* flag 128 is cleared, count */
eve= em->verts.first;
@@ -271,6 +272,51 @@ int removedoublesflag(short flag, float limit) /* return amount */
}
MEM_freeN(sortblock);
+
+ for(eve = em->verts.first; eve; eve=eve->next){
+
+ if(eve->f & flag) {
+ if(eve->f & 128) {
+
+ v1 = eve->tmp.v;
+
+ if(v1->dw && eve->dw){
+
+ for(doubweight=0; doubweight < eve->totweight; doubweight++){
+ targetweight = -1;
+ for(currweight = 0; currweight < v1->totweight; currweight++){
+ if(v1->dw[currweight].def_nr == eve->dw[doubweight].def_nr){
+ targetweight = currweight;
+ break;
+ }
+ }
+
+ if(targetweight != -1){ /*average*/
+ v1->dw[targetweight].weight = (v1->dw[targetweight].weight + eve->dw[doubweight].weight) / 2;
+ }
+ else{ /*append*/
+ newdw = MEM_callocN(sizeof(MDeformWeight)*(v1->totweight+1), "MDeformWeight Append");
+ memcpy(newdw, v1->dw, sizeof(MDeformVert)*v1->totweight);
+ MEM_freeN(v1->dw);
+
+ v1->dw= newdw;
+ v1->dw[v1->totweight].weight = eve->dw[doubweight].weight;
+ v1->dw[v1->totweight].def_nr = eve->dw[doubweight].def_nr;
+ v1->totweight++;
+ }
+ }
+ }
+ else if(eve->dw){ /*just straight copy vert weights*/
+
+ newdw = MEM_mallocN(sizeof(MDeformWeight) * (eve->totweight), "MDeformWeight Copy");
+ memcpy(newdw, eve->dw, sizeof(MDeformWeight)*eve->totweight);
+ v1->dw= newdw;
+
+ }
+ }
+ }
+ }
+
/* test edges and insert again */
eed= em->edges.first;
while(eed) {