[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17153] branches/etch-a-ton/source/blender : Fixed Subdivision method (subdivide in a set number of bones).

Martin Poirier theeth at yahoo.com
Wed Oct 22 00:38:32 CEST 2008


Revision: 17153
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17153
Author:   theeth
Date:     2008-10-22 00:38:32 +0200 (Wed, 22 Oct 2008)

Log Message:
-----------
Fixed Subdivision method (subdivide in a set number of bones).

Subdivision method cleanup (reuse more code)

Modified Paths:
--------------
    branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
    branches/etch-a-ton/source/blender/src/drawview.c
    branches/etch-a-ton/source/blender/src/editarmature_sketch.c

Modified: branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h	2008-10-21 20:21:48 UTC (rev 17152)
+++ branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h	2008-10-21 22:38:32 UTC (rev 17153)
@@ -440,10 +440,11 @@
 	
 	/* Skeleton Sketching */
 	char bone_sketching;
+	char skgen_subdivision_number;
 	
 	/* Alt+RMB option */
 	char edge_mode;
-	char pad3[3];
+	char pad3[2];
 } ToolSettings;
 
 /* Used by all brushes to store their properties, which can be directly set
@@ -846,6 +847,7 @@
 #define	SKGEN_CUT_LENGTH		8
 #define	SKGEN_CUT_ANGLE			16
 #define	SKGEN_CUT_CORRELATION	32
+#define	SKGEN_CUT_FIXED			64
 
 #define	SKGEN_SUB_LENGTH		0
 #define	SKGEN_SUB_ANGLE			1

Modified: branches/etch-a-ton/source/blender/src/drawview.c
===================================================================
--- branches/etch-a-ton/source/blender/src/drawview.c	2008-10-21 20:21:48 UTC (rev 17152)
+++ branches/etch-a-ton/source/blender/src/drawview.c	2008-10-21 22:38:32 UTC (rev 17153)
@@ -2317,6 +2317,9 @@
 		uiDefButBitS(block, TOG, SKGEN_CUT_CORRELATION, B_DIFF, "Correlation",	10, 135, 60, 19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Subdivide arcs based on correlation");
 		uiDefButF(block, NUM, B_DIFF, 							"T:",			70, 135, 90, 19, &G.scene->toolsettings->skgen_correlation_limit,0.0, 1.0, 0.01, 0,	"Specify the threshold correlation for subdivision");
 	
+		uiDefButBitS(block, TOG, SKGEN_CUT_FIXED, B_DIFF, 		"Fixed",		10, 115, 60, 19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Subdivide arcs based on a fixed number of bones");
+		uiDefButC(block, NUM, B_DIFF, 							"N:",			70, 115, 90, 19, &G.scene->toolsettings->skgen_subdivision_number,0, 100, 1, 0,	"Specify the bones to subdivide into");
+
 		uiBlockEndAlign(block);
 		
 		if(yco < 0) uiNewPanelHeight(block, height-yco);

Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c	2008-10-21 20:21:48 UTC (rev 17152)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c	2008-10-21 22:38:32 UTC (rev 17153)
@@ -118,9 +118,12 @@
 
 /******************** PROTOTYPES ******************************/
 
+typedef int(NextSubdivisionFunc)(SK_Stroke*, int, int, float[3], float[3]);
+
 void sk_freeStroke(SK_Stroke *stk);
 void sk_freeSketch(SK_Sketch *sketch);
 
+int nextFixedSubdivision(SK_Stroke *stk, int start, int end, float head[3], float p[3]);
 int nextLengthSubdivision(SK_Stroke *stk, int start, int end, float head[3], float p[3]);
 int nextCorrelationSubdivision(SK_Stroke *stk, int start, int end, float head[3], float p[3]);
 
@@ -673,73 +676,29 @@
 //	glEnd();
 }
 
-
-int drawStrokeByCorrelation(SK_Stroke *stk, int start, int end)
+void drawSubdividedStrokeBy(SK_Stroke *stk, int start, int end, NextSubdivisionFunc next_subdividion)
 {
-	if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
-	{
-		float head[3], tail[3];
-		int bone_start = start;
-		int index;
+	float head[3], tail[3];
+	int bone_start = start;
+	int index;
 
-		VECCOPY(head, stk->points[start].p);
-		
-		glColor3f(0, 1, 1);
-		glBegin(GL_POINTS);
-		
-		index = nextCorrelationSubdivision(stk, bone_start, end, head, tail);
-		while (index != -1)
-		{
-			glVertex3fv(tail);
-			
-			VECCOPY(head, tail);
-			bone_start = index; // start next bone from current index
-
-			index = nextCorrelationSubdivision(stk, bone_start, end, head, tail);
-		}
-		
-		glEnd();
-
-		return 1;
-	}
-	else
+	VECCOPY(head, stk->points[start].p);
+	
+	glColor3f(0, 1, 1);
+	glBegin(GL_POINTS);
+	
+	index = next_subdividion(stk, bone_start, end, head, tail);
+	while (index != -1)
 	{
-		return 0;
-	}
-}
-
-int drawStrokeByLength(SK_Stroke *stk, int start, int end)
-{
-	if (G.scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH)
-	{
-		float head[3], tail[3];
-		int bone_start = start;
-		int index;
-
-		VECCOPY(head, stk->points[start].p);
+		glVertex3fv(tail);
 		
-		glColor3f(0, 1, 1);
-		glBegin(GL_POINTS);
-		
-		index = nextLengthSubdivision(stk, bone_start, end, head, tail);
-		while (index != -1)
-		{
-			glVertex3fv(tail);
-			
-			VECCOPY(head, tail);
-			bone_start = index; // start next bone from current index
+		VECCOPY(head, tail);
+		bone_start = index; // start next bone from current index
 
-			index = nextLengthSubdivision(stk, bone_start, end, head, tail);
-		}
-		
-		glEnd();
-		
-		return 1;
+		index = next_subdividion(stk, bone_start, end, head, tail);
 	}
-	else
-	{
-		return 0;
-	}
+	
+	glEnd();
 }
 
 void sk_drawStrokeSubdivision(SK_Stroke *stk)
@@ -759,16 +718,21 @@
 			}
 			else
 			{
-				int done = 0;
-				
 				if (i - head_index > 1)
 				{
-					done = drawStrokeByCorrelation(stk, head_index, i);
-					
-					if (done == 0)
+					if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
 					{
-						done = drawStrokeByLength(stk, head_index, i);
+						drawSubdividedStrokeBy(stk, head_index, i, nextCorrelationSubdivision);
 					}
+					else if (G.scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH)
+					{
+						drawSubdividedStrokeBy(stk, head_index, i, nextLengthSubdivision);
+					}
+					else if (G.scene->toolsettings->skgen_options & SKGEN_CUT_FIXED)
+					{
+						drawSubdividedStrokeBy(stk, head_index, i, nextFixedSubdivision);
+					}
+					
 				}
 
 				head_index = i;
@@ -1311,70 +1275,64 @@
 	}
 }
 
-int nextCorrelationSubdivision(SK_Stroke *stk, int start, int end, float head[3], float p[3])
+int nextFixedSubdivision(SK_Stroke *stk, int start, int end, float head[3], float p[3])
 {
-	float correlation_threshold = G.scene->toolsettings->skgen_correlation_limit;
-	float n[3];
+	static float stroke_length = 0;
+	static float current_length;
+	static char n;
+	float length_threshold;
 	int i;
 	
-	for (i = start + 2; i < end; i++)
+	if (stroke_length == 0)
 	{
-		/* Calculate normal */
-		VecSubf(n, stk->points[i].p, head);
+		current_length = 0;
+		for (i = start + 1; i < end; i++)
+		{
+			stroke_length += VecLenf(stk->points[i].p, stk->points[i - 1].p);
+		}
+		
+		n = 0;
+		current_length = 0;
+	}
+	
+	n++;
+	
+	length_threshold = n * stroke_length / G.scene->toolsettings->skgen_subdivision_number;
+	
+	for (i = start + 1; i < end; i++)
+	{
+		current_length += VecLenf(stk->points[i].p, stk->points[i - 1].p);
 
-		if (calcStrokeCorrelation(stk, start, i, stk->points[start].p, n) < correlation_threshold)
+		if (current_length >= length_threshold)
 		{
-			VECCOPY(p, stk->points[i - 1].p);
-			return i - 1;
+			VECCOPY(p, stk->points[i].p);
+			return i;
 		}
 	}
 	
+	stroke_length = 0;
+	
 	return -1;
 }
-
-EditBone * subdivideStrokeByCorrelation(SK_Stroke *stk, int start, int end, float invmat[][4], float tmat[][3])
+int nextCorrelationSubdivision(SK_Stroke *stk, int start, int end, float head[3], float p[3])
 {
-	bArmature *arm= G.obedit->data;
-	EditBone *lastBone = NULL;
+	float correlation_threshold = G.scene->toolsettings->skgen_correlation_limit;
+	float n[3];
+	int i;
 	
-	if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
+	for (i = start + 2; i <= end; i++)
 	{
-		EditBone *child = NULL;
-		EditBone *parent = NULL;
-		int bone_start = start;
-		int index;
+		/* Calculate normal */
+		VecSubf(n, stk->points[i].p, head);
 
-		parent = addEditBone("Bone", &G.edbo, arm);
-		VECCOPY(parent->head, stk->points[start].p);
-		
-		index = nextCorrelationSubdivision(stk, bone_start, end, parent->head, parent->tail);
-		while (index != -1)
+		if (calcStrokeCorrelation(stk, start, i, stk->points[start].p, n) < correlation_threshold)
 		{
-			setBoneRollFromPoint(parent, &stk->points[end], invmat, tmat);
-			
-			Mat4MulVecfl(invmat, parent->head); /* going to next bone, fix previous head */
-
-			child = addEditBone("Bone", &G.edbo, arm);
-			VECCOPY(child->head, parent->tail);
-			child->parent = parent;
-			child->flag |= BONE_CONNECTED;
-			
-			parent = child; // new child is next parent
-			bone_start = index; // start next bone from current index
-
-			index = nextCorrelationSubdivision(stk, bone_start, end, parent->head, parent->tail);
+			VECCOPY(p, stk->points[i - 1].p);
+			return i - 1;
 		}
-
-		VECCOPY(parent->tail, stk->points[end].p);
-
-		setBoneRollFromPoint(parent, &stk->points[end], invmat, tmat);
-
-		Mat4MulVecfl(invmat, parent->head);
-		Mat4MulVecfl(invmat, parent->tail);
-		lastBone = parent;
 	}
 	
-	return lastBone;
+	return -1;
 }
 
 int nextLengthSubdivision(SK_Stroke *stk, int start, int end, float head[3], float p[3])
@@ -1384,7 +1342,7 @@
 	int i;
 	
 	i = start + 1;
-	while (i < end)
+	while (i <= end)
 	{
 		float *vec0 = stk->points[i - 1].p;
 		float *vec1 = stk->points[i].p;
@@ -1445,50 +1403,47 @@
 	return -1;
 }
 
-EditBone * subdivideStrokeByLength(SK_Stroke *stk, int start, int end, float invmat[][4], float tmat[][3])
+EditBone * subdivideStrokeBy(SK_Stroke *stk, int start, int end, float invmat[][4], float tmat[][3], NextSubdivisionFunc next_subdividion)
 {
-	bArmature *arm= G.obedit->data;
+	bArmature *arm = G.obedit->data;
 	EditBone *lastBone = NULL;
+	EditBone *child = NULL;
+	EditBone *parent = NULL;
+	int bone_start = start;
+	int index;
 	
-	if (G.scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH)
+	parent = addEditBone("Bone", &G.edbo, arm);
+	VECCOPY(parent->head, stk->points[start].p);
+	
+	index = next_subdividion(stk, bone_start, end, parent->head, parent->tail);
+	while (index != -1)
 	{
-		EditBone *child = NULL;
-		EditBone *parent = NULL;
-		int bone_start = start;
-		int index;
+		setBoneRollFromPoint(parent, &stk->points[index], invmat, tmat);
+		Mat4MulVecfl(invmat, parent->head); /* going to next bone, fix previous head */
+
+		child = addEditBone("Bone", &G.edbo, arm);
+		VECCOPY(child->head, parent->tail);
+		child->parent = parent;
+		child->flag |= BONE_CONNECTED;
 		
-		parent = addEditBone("Bone", &G.edbo, arm);
-		VECCOPY(parent->head, stk->points[start].p);
-		
-		index = nextLengthSubdivision(stk, bone_start, end, parent->head, parent->tail);
-		while (index != -1)
-		{
-			setBoneRollFromPoint(parent, &stk->points[index], invmat, tmat);
-			Mat4MulVecfl(invmat, parent->head); /* going to next bone, fix previous head */
+		parent = child; // new child is next parent
+		bone_start = index; // start next bone from current index
 
-			child = addEditBone("Bone", &G.edbo, arm);
-			VECCOPY(child->head, parent->tail);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list