[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38822] branches/soc-2011-radish: ' Fix Deforms' op added to weight paint tools to smooth (remove/reduce) spiking caused by bones by altering vgroup weights

Jason Hays jason_hays22 at mymail.eku.edu
Fri Jul 29 19:36:49 CEST 2011


Revision: 38822
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38822
Author:   jason_hays22
Date:     2011-07-29 17:36:49 +0000 (Fri, 29 Jul 2011)
Log Message:
-----------
'Fix Deforms' op added to weight paint tools to smooth (remove/reduce) spiking caused by bones by altering vgroup weights
--it's still really simplistic (and slow!) so don't try fixing an entire mesh! xD
Also, don't use it on a mesh with a mirror modifier yet, just noticed that it does both vertices instead of one.

Minor UI text update for Vertex Masking

Modified Paths:
--------------
    branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d.py
    branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py
    branches/soc-2011-radish/source/blender/editors/object/object_intern.h
    branches/soc-2011-radish/source/blender/editors/object/object_ops.c
    branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c
    branches/soc-2011-radish/source/blender/makesrna/intern/rna_mesh.c

Modified: branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d.py	2011-07-29 15:47:09 UTC (rev 38821)
+++ branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d.py	2011-07-29 17:36:49 UTC (rev 38822)
@@ -1072,6 +1072,8 @@
         layout.operator("object.vertex_group_invert", text="Invert")
         layout.operator("object.vertex_group_clean", text="Clean")
         layout.operator("object.vertex_group_levels", text="Levels")
+        #Jason
+        layout.operator("object.vertex_group_fix", text="Fix Deforms")
 
         layout.separator()
 

Modified: branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2011-07-29 15:47:09 UTC (rev 38821)
+++ branches/soc-2011-radish/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2011-07-29 17:36:49 UTC (rev 38822)
@@ -1052,6 +1052,7 @@
         col.operator("object.vertex_group_invert", text="Invert")
         col.operator("object.vertex_group_clean", text="Clean")
         col.operator("object.vertex_group_levels", text="Levels")
+        col.operator("object.vertex_group_fix", text="Fix Deforms")
 
 
 class VIEW3D_PT_tools_weightpaint_options(View3DPanel, bpy.types.Panel):

Modified: branches/soc-2011-radish/source/blender/editors/object/object_intern.h
===================================================================
--- branches/soc-2011-radish/source/blender/editors/object/object_intern.h	2011-07-29 15:47:09 UTC (rev 38821)
+++ branches/soc-2011-radish/source/blender/editors/object/object_intern.h	2011-07-29 17:36:49 UTC (rev 38822)
@@ -203,6 +203,7 @@
 void OBJECT_OT_vertex_group_lock_all(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_invert_locks(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_unlock_all(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_fix(struct wmOperatorType *ot);
 
 void OBJECT_OT_vertex_group_invert(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_blend(struct wmOperatorType *ot);

Modified: branches/soc-2011-radish/source/blender/editors/object/object_ops.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/object/object_ops.c	2011-07-29 15:47:09 UTC (rev 38821)
+++ branches/soc-2011-radish/source/blender/editors/object/object_ops.c	2011-07-29 17:36:49 UTC (rev 38822)
@@ -177,6 +177,7 @@
 	WM_operatortype_append(OBJECT_OT_vertex_group_invert_locks);
 	WM_operatortype_append(OBJECT_OT_vertex_group_lock_all);
 	WM_operatortype_append(OBJECT_OT_vertex_group_unlock_all);
+	WM_operatortype_append(OBJECT_OT_vertex_group_fix);
 
 	WM_operatortype_append(OBJECT_OT_vertex_group_invert);
 	WM_operatortype_append(OBJECT_OT_vertex_group_levels);

Modified: branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c	2011-07-29 15:47:09 UTC (rev 38821)
+++ branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c	2011-07-29 17:36:49 UTC (rev 38822)
@@ -60,6 +60,7 @@
 #include "BKE_global.h"
 #include "BKE_mesh.h"
 #include "BKE_report.h"
+#include "BKE_DerivedMesh.h"//Jason
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -749,7 +750,370 @@
 
 	if (dvert_array) MEM_freeN(dvert_array);
 }
+// Jason
+static int tryToAddVerts(int *verts, int length, int a, int b) {
+	char containsA = FALSE;
+	char containsB = FALSE;
+	int added = 0;
+	int i;
+	for(i = 0; i < length && (!containsA || !containsB); i++) {
+		if(verts[i] == a) {
+			containsA = TRUE;
+		} else if(verts[i] == b) {
+			containsB = TRUE;
+		} else if(verts[i] == -1) {
+			if(!containsA) {
+				verts[i] = a;
+				containsA = TRUE;
+				added++;
+			} else if(!containsB){
+				verts[i] = b;
+				containsB = TRUE;
+				added++;
+			}
+		}
+	}
+	return added;
+}
+//Jason
+static int* getSurroundingVerts(Mesh *me, int vert, int *count) {
+	int length = 0;
+	int *tverts;
+	int *verts = NULL;
+	MFace *mf = me->mface;
+	int totface = me->totface;
+	int found = 0;
+	int i;
+	for(i = 0; i < totface; i++, mf++) {
+		if(vert == mf->v1 || vert == mf->v2 || vert == mf->v3 || (mf->v4 &&vert == mf->v4)) {
+			length+=2;
+		}
+	}
+	if(!length) {
+		return 0;
+	}
+	tverts = MEM_mallocN(sizeof(int)*length, "tempSurroundingVerts");
+	mf = me->mface;
+	for(i = 0; i < length; i++) {
+		tverts[i] = -1;
+	}
+	for(i = 0; i < totface; i++, mf++) {
+		int a=-1, b=-1;
+		//printf("face %d verts: %d %d %d %d\n", i, mf->v1, mf->v2, mf->v3, mf->v4);
+		if(mf->v1 == vert) {
+			a = mf->v2;
+			if(mf->v4) {
+				b = mf->v4;
+			} else {
+				b = mf->v3;
+			}
+		} else if(mf->v2 == vert) {
+			a = mf->v1;
+			b = mf->v3;
+		} else if(mf->v3 == vert) {
+			a = mf->v2;
+			if(mf->v4) {
+				b = mf->v4;
+			} else {
+				b = mf->v1;
+			}
+		} else if (mf->v4 && mf->v4 == vert){
+			a = mf->v1;
+			b = mf->v3;
+		} else {
+			continue;
+		}
+		found += tryToAddVerts(tverts, length, a, b);
+	}
+	if(found) {
+		verts = MEM_mallocN(sizeof(int)* found, "surroundingVerts");
+		for(i = 0; i < found; i++) {
+			verts[i] = tverts[i];
+		}
+		count[0] = found;
+	}
+	MEM_freeN(tverts);
+	return verts;
+}
+static void getSingleCoordinate(MVert **points, int count, float *coord) {
+	int i, k;
+	for(k = 0; k < 3; k++) {
+		coord[k] = 0;
+	}
+	for(i = 0; i < count; i++) {
+		for(k = 0; k < 3; k++) {
+			coord[k] += points[i]->co[k];
+		}
+	}
+	for(k = 0; k < 3; k++) {
+		coord[k] /= count;
+	}
+}
+static void getNearestPointOnPlane(float *norm, float d, float *coord, float *point, float *dst) {
+	float *temp = MEM_callocN(sizeof(float)*3, "temp");
+	int i;
+	float dotprod = 0;
+	for(i = 0; i < 3; i++) {
+		temp[i] = point[i]-coord[i];
+	}
+	for(i = 0; i < 3; i++) {
+		dotprod += temp[i]*norm[i];
+	}
+	MEM_freeN(temp);
+	for(i = 0; i < 3; i++) {
+		dst[i] = point[i] - dotprod*norm[i];
+	}
+}
+static float distance(float* a, float *b, int length) {
+	int i;
+	float sum = 0;
+	for(i = 0; i < length; i++) {
+		sum += (b[i]-a[i])*(b[i]-a[i]);
+	}
+	return sqrt(sum);
+}
+static void getVerticalAndHorizontalChange(float *norm, float d, float *coord, float *start, float distToStart, float *end, float **changes, int index) {
+	// A=Q-((Q-P).N)N
+	// D = (a*x0 + b*y0 +c*z0 +d)
+	float *projA, *projB;
+	projA = MEM_callocN(sizeof(float)*3, "projectedA");
+	projB = MEM_callocN(sizeof(float)*3, "projectedB");
+	getNearestPointOnPlane(norm, d, coord, start, projA);
+	getNearestPointOnPlane(norm, d, coord, end, projB);
+	// vertical change
+	changes[index][0] = norm[0]*end[0] + norm[1]*end[1] + norm[2]*end[2] + d - distToStart;
+	//printf("vc %f %f\n", distance(end, projB, 3)-distance(start, projA, 3), changes[index][0]);
+	// horizontal change
+	changes[index][1] = distance(projA, projB, 3);
+	MEM_freeN(projA);
+	MEM_freeN(projB);
+}
+static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, int index, float *norm, float *coord, float d, float distToBe, float strength, float cp) {
+	DerivedMesh *dm;
+	MDeformWeight *dw;
+	MVert m;
+	MDeformVert *dvert = me->dvert+index;
+	int totweight = dvert->totweight;
+	float oldw = 0;
+	float *oldPos = MEM_callocN(sizeof(float)*3, "oldPosition");
+	float vc, hc;
+	int i, k;
+	float **changes = MEM_mallocN(sizeof(float)*totweight, "vertHorzChange");
+	int *upDown = MEM_callocN(sizeof(int)*totweight, "upDownTracker");// track if up or down moved it closer for each bone
+	int *dwIndices = MEM_callocN(sizeof(int)*totweight, "dwIndexTracker");
+	float distToStart;
+	float bestChange = 0;
+	int bestIndex = 0;
+	char wasChange;
+	char wasUp;
+	int lastIndex = -1;
+	float originalDistToBe = distToBe;
+	for(i = 0; i < totweight; i++) {
+		changes[i] = MEM_callocN(sizeof(float)*2, "vertHorzChange_"+i);
+	}
+	do {
+		wasChange = FALSE;
+		dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
+		dm->getVert(dm, index, &m);
+		oldPos[0] = m.co[0];
+		oldPos[1] = m.co[1];
+		oldPos[2] = m.co[2];
+		distToStart = norm[0]*oldPos[0] + norm[1]*oldPos[1] + norm[2]*oldPos[2] + d;
+		//printf("dist %f \n",distToStart);
+		//printf("mesh point %f %f %f dpoint %f %f %f \n", (me->mvert+index)->co[0], (me->mvert+index)->co[1], (me->mvert+index)->co[3], oldPos[0], oldPos[1], oldPos[2]);
+		if(distToBe == originalDistToBe) {
+			distToBe += distToStart - distToStart*strength;
+		}
+		for(i = 0; i < totweight; i++) {
+			dwIndices[i] = i;
+			dw = (dvert->dw+i);
+			vc = hc = 0;
+			if(!dw->weight) {
+				changes[i][0] = 0;
+				changes[i][1] = 0;
+				continue;
+			}
+			for(k = 0; k < 2; k++) {
+				if(dm) {
+					dm->needsFree = 1;
+					dm->release(dm);
+					dm = NULL;
+					ob->derivedDeform=NULL;
+				}
+				oldw = dw->weight;
+				if(k) {
+					dw->weight *= 1+cp;
+				} else {
+					dw->weight /= 1+cp;
+				}
+				if(dw->weight == oldw) {
+					changes[i][0] = 0;
+					changes[i][1] = 0;
+					break;
+				}
+				if(dw->weight > 1) {
+					dw->weight = 1;
+				}
+				dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
+				dm->getVert(dm, index, &m);
+				getVerticalAndHorizontalChange(norm, d, coord, oldPos, distToStart, m.co, changes, i);
+				dw->weight = oldw;
+				if(!k) {
+					vc = changes[i][0];
+					hc = changes[i][1];
+				} else {
+					if(fabs(distToStart+vc - distToBe) < fabs(distToStart+changes[i][0] - distToBe)) {
+						upDown[i] = 0;
+						changes[i][0] = vc;
+						changes[i][1] = hc;
+					} else {
+						upDown[i] = 1;
+					}
+					if(fabs(distToStart+changes[i][0] - distToBe) > fabs(distToStart - distToBe)) {
+						changes[i][0] = 0;
+						changes[i][1] = 0;
+					}
+				}
+			}
+			//printf("final vc: %f\n", changes[i][0]);
+		}
+		// sort the changes by the vertical change
+		for(k = 0; k < totweight; k++) {
+			float tf;
+			int ti;
+			bestChange = changes[k][0];
+			bestIndex = k;
+			for(i = k+1; i < totweight; i++) {
+				vc = changes[i][0];
 
+				if(fabs(vc) > fabs(bestChange)) {
+					bestIndex = i;
+					bestChange = vc;
+				}
+			}
+			// switch with k
+			if(bestIndex != k) {
+				ti = upDown[k];
+				upDown[k] = upDown[bestIndex];
+				upDown[bestIndex] = ti;
+
+				ti = dwIndices[k];
+				dwIndices[k] = dwIndices[bestIndex];
+				dwIndices[bestIndex] = ti;
+
+				tf = changes[k][0];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list