[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17062] branches/etch-a-ton/source/blender : Skeleton Sketching

Martin Poirier theeth at yahoo.com
Tue Oct 14 01:41:39 CEST 2008


Revision: 17062
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17062
Author:   theeth
Date:     2008-10-14 01:41:38 +0200 (Tue, 14 Oct 2008)

Log Message:
-----------
Skeleton Sketching

- Delete Sketch button
- During continuous strokes, when moving out from and back into an embeding, interpolate depth of the stroke like is done when snapping

Modified Paths:
--------------
    branches/etch-a-ton/source/blender/include/BIF_sketch.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/include/BIF_sketch.h
===================================================================
--- branches/etch-a-ton/source/blender/include/BIF_sketch.h	2008-10-13 22:50:06 UTC (rev 17061)
+++ branches/etch-a-ton/source/blender/include/BIF_sketch.h	2008-10-13 23:41:38 UTC (rev 17062)
@@ -25,5 +25,6 @@
 
 int BIF_paintSketch();
 void BIF_convertSketch();
+void BIF_deleteSketch();
 
 #endif /* BIF_SKETCH_H */

Modified: branches/etch-a-ton/source/blender/src/drawview.c
===================================================================
--- branches/etch-a-ton/source/blender/src/drawview.c	2008-10-13 22:50:06 UTC (rev 17061)
+++ branches/etch-a-ton/source/blender/src/drawview.c	2008-10-13 23:41:38 UTC (rev 17062)
@@ -2269,6 +2269,11 @@
 	if(yco < 0) uiNewPanelHeight(block, height-yco);
 }
 
+static void delete_sketch_armature(void *arg1, void *arg2)
+{
+	BIF_deleteSketch();
+}
+
 static void convert_sketch_armature(void *arg1, void *arg2)
 {
 	BIF_convertSketch();
@@ -2296,8 +2301,10 @@
 		
 		/* use real flag instead of 1 */
 		uiDefButBitI(block, TOG, 1, B_REDR, "Use Bone Sketching", 10, 225, 150, 20, &G.bone_sketching, 0, 0, 0, 0, "Use sketching to create and edit bones");
-		but = uiDefBut(block, BUT, B_REDR, "Convert Sketch", 10,205,150,20, 0, 0, 0, 0, 0, "Convert sketch to armature");
+		but = uiDefBut(block, BUT, B_REDR, "Convert", 10,205,150,20, 0, 0, 0, 0, 0, "Convert sketch to armature");
 		uiButSetFunc(but, convert_sketch_armature, NULL, NULL);
+		but = uiDefBut(block, BUT, B_REDR, "Delete", 10,185,150,20, 0, 0, 0, 0, 0, "Delete sketch");
+		uiButSetFunc(but, delete_sketch_armature, NULL, NULL);
 	
 		uiBlockEndAlign(block);
 		

Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c	2008-10-13 22:50:06 UTC (rev 17061)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c	2008-10-13 23:41:38 UTC (rev 17062)
@@ -58,10 +58,18 @@
 	PT_EXACT,
 } SK_PType;
 
+typedef enum Method
+{
+	PT_EMBED,
+	PT_SNAP,
+	PT_PROJECT,
+} SK_PMode;
+
 typedef struct SK_Point
 {
 	float p[3];
 	SK_PType type;
+	SK_PMode mode;
 } SK_Point;
 
 typedef struct SK_Stroke
@@ -717,14 +725,38 @@
 	return distance; 
 }
 
+void sk_interpolateDepth(SK_Stroke *stk, int start, int end, float length, float distance)
+{
+	float progress = 0;
+	int i;
+	
+	progress = VecLenf(stk->points[start].p, stk->points[start - 1].p);
+	
+	for (i = start; i <= end; i++)
+	{
+		float ray_start[3], ray_normal[3];
+		float delta = VecLenf(stk->points[i].p, stk->points[i + 1].p);
+		short pval[2];
+		
+		project_short_noclip(stk->points[i].p, pval);
+		viewray(pval, ray_start, ray_normal);
+		
+		VecMulf(ray_normal, distance * progress / length);
+		VecAddf(stk->points[i].p, stk->points[i].p, ray_normal);
+
+		progress += delta ;
+	}
+}
+
 void sk_addStrokeSnapPoint(SK_Stroke *stk, SK_DrawData *dd, SK_Point *snap_pt)
 {
 	SK_Point pt;
 	float distance;
 	float length;
-	int i, j, total;
+	int i, total;
 	
 	pt.type = PT_EXACT;
+	pt.mode = PT_SNAP;
 	
 	sk_projectPaintData(stk, dd, pt.p);
 
@@ -745,24 +777,9 @@
 	
 	if (total > 1)
 	{
-		float progress = length - VecLenf(stk->points[stk->nb_points - 2].p, stk->points[stk->nb_points - 1].p);
-		
 		distance = sk_distanceDepth(snap_pt->p, stk->points[i].p);
 		
-		for (j = 1, i = stk->nb_points - 2; j < total; j++, i--)
-		{
-			float ray_start[3], ray_normal[3];
-			float delta = VecLenf(stk->points[i].p, stk->points[i - 1].p);
-			short pval[2];
-			
-			project_short_noclip(stk->points[i].p, pval);
-			viewray(pval, ray_start, ray_normal);
-			
-			VecMulf(ray_normal, distance * progress / length);
-			VecAddf(stk->points[i].p, stk->points[i].p, ray_normal);
-
-			progress -= delta ;
-		}
+		sk_interpolateDepth(stk, i + 1, stk->nb_points - 2, length, distance);
 	}
 
 	VECCOPY(stk->points[stk->nb_points - 1].p, snap_pt->p);
@@ -773,6 +790,7 @@
 	SK_Point pt;
 	
 	pt.type = dd->type;
+	pt.mode = PT_PROJECT;
 
 	sk_projectPaintData(stk, dd, pt.p);
 
@@ -849,12 +867,37 @@
 	else
 	{
 		SK_Point pt;
+		float length, distance;
+		int total;
+		int i;
 		
 		pt.type = dd->type;
+		pt.mode = PT_EMBED;
 		
-		VECCOPY(pt.p, p);
+		sk_projectPaintData(stk, dd, pt.p);
+		sk_appendStrokePoint(stk, &pt);
 		
-		sk_appendStrokePoint(stk, &pt);
+		/* update all previous point to give smooth Z progresion */
+		total = 0;
+		length = 0;
+		for (i = stk->nb_points - 2; i > 0; i--)
+		{
+			length += VecLenf(stk->points[i].p, stk->points[i + 1].p);
+			total++;
+			if (stk->points[i].mode == PT_EMBED || stk->points[i].type == PT_EXACT)
+			{
+				break;
+			}
+		}
+		
+		if (total > 1)
+		{
+			distance = sk_distanceDepth(p, stk->points[i].p);
+			
+			sk_interpolateDepth(stk, i + 1, stk->nb_points - 2, length, distance);
+		}
+		
+		VECCOPY(stk->points[stk->nb_points - 1].p, p);
 	}
 	
 	BLI_freelistN(&depth_peels);
@@ -1106,6 +1149,15 @@
 	}
 }
 
+void BIF_deleteSketch()
+{
+	if (GLOBAL_sketch != NULL)
+	{
+		sk_freeSketch(GLOBAL_sketch);
+		GLOBAL_sketch = NULL;
+	}
+}
+
 void BIF_convertSketch()
 {
 	if (G.bone_sketching & 1)





More information about the Bf-blender-cvs mailing list