[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17203] branches/etch-a-ton/source/blender /src/editarmature_sketch.c: Sketching: Gesture to flip stroke ( circular arc intersecting the stroke twice).

Martin Poirier theeth at yahoo.com
Tue Oct 28 00:25:08 CET 2008


Revision: 17203
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17203
Author:   theeth
Date:     2008-10-28 00:25:08 +0100 (Tue, 28 Oct 2008)

Log Message:
-----------
Sketching: Gesture to flip stroke (circular arc intersecting the stroke twice).

Some name cleanup.

Modified Paths:
--------------
    branches/etch-a-ton/source/blender/src/editarmature_sketch.c

Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c	2008-10-27 20:14:45 UTC (rev 17202)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c	2008-10-27 23:25:08 UTC (rev 17203)
@@ -98,8 +98,9 @@
 {
 	struct SK_Intersection *next, *prev;
 	SK_Stroke *stroke;
-	int			start;
-	int			end;
+	int			before;
+	int			after;
+	int			gesture_index;
 	float		p[3];
 } SK_Intersection;
 
@@ -499,6 +500,22 @@
 	sk_freeStroke(stk);
 }
 
+void sk_reverseStroke(SK_Stroke *stk)
+{
+	SK_Point *old_points = stk->points;
+	int i = 0;
+	
+	sk_allocStrokeBuffer(stk);
+	
+	for (i = 0; i < stk->nb_points; i++)
+	{
+		sk_copyPoint(stk->points + i, old_points + stk->nb_points - 1 - i);
+	}
+	
+	MEM_freeN(old_points);
+}
+
+
 void sk_cancelStroke(SK_Sketch *sketch)
 {
 	if (sketch->active_stroke != NULL)
@@ -1577,8 +1594,9 @@
 			{
 				SK_Intersection *isect = MEM_callocN(sizeof(SK_Intersection), "Intersection");
 				
-				isect->start = s_i;
-				isect->end = g_i + 1;
+				isect->gesture_index = g_i;
+				isect->before = s_i;
+				isect->after = s_i + 1;
 				isect->stroke = gesture;
 				
 				VecSubf(isect->p, gesture->points[s_i + 1].p, gesture->points[s_i].p);
@@ -1632,8 +1650,9 @@
 					float ray_start[3], ray_end[3];
 					short mval[2];
 					
-					isect->start = s_i;
-					isect->end = s_i + 1;
+					isect->gesture_index = g_i;
+					isect->before = s_i;
+					isect->after = s_i + 1;
 					isect->stroke = stk;
 					
 					mval[0] = (short)(vi[0]);
@@ -1703,7 +1722,7 @@
 		pt.mode = PT_PROJECT; /* take mode from neighbouring points */
 		VECCOPY(pt.p, isect->p);
 		
-		sk_insertStrokePoint(isect->stroke, &pt, isect->end);
+		sk_insertStrokePoint(isect->stroke, &pt, isect->after);
 	}
 }
 
@@ -1743,19 +1762,19 @@
 		pt.mode = PT_PROJECT; /* take mode from neighbouring points */
 		VECCOPY(pt.p, isect->p);
 		
-		VecSubf(stroke_dir, isect->stroke->points[isect->end].p, isect->stroke->points[isect->start].p);
+		VecSubf(stroke_dir, isect->stroke->points[isect->after].p, isect->stroke->points[isect->before].p);
 		
 		/* same direction, trim end */
 		if (Inpf(stroke_dir, trim_dir) > 0)
 		{
-			sk_replaceStrokePoint(isect->stroke, &pt, isect->end);
-			sk_trimStroke(isect->stroke, 0, isect->end);
+			sk_replaceStrokePoint(isect->stroke, &pt, isect->after);
+			sk_trimStroke(isect->stroke, 0, isect->after);
 		}
 		/* else, trim start */
 		else
 		{
-			sk_replaceStrokePoint(isect->stroke, &pt, isect->start);
-			sk_trimStroke(isect->stroke, isect->start, isect->stroke->nb_points - 1);
+			sk_replaceStrokePoint(isect->stroke, &pt, isect->before);
+			sk_trimStroke(isect->stroke, isect->before, isect->stroke->nb_points - 1);
 		}
 	
 	}
@@ -1821,8 +1840,8 @@
 				int start_index, end_index;
 				int i;
 				
-				start_index = MIN2(isect->end, isect->next->end);
-				end_index = MAX2(isect->start, isect->next->start);
+				start_index = MIN2(isect->after, isect->next->after);
+				end_index = MAX2(isect->before, isect->next->before);
 
 				for (i = start_index; i <= end_index; i++)
 				{
@@ -1852,14 +1871,14 @@
 	/* check if it circled around an exact point */
 	for (isect = list->first; isect; isect = isect->next)
 	{
-		/* only delete strokes that are crossed twice */
+		/* only merge strokes that are crossed twice */
 		if (isect->next && isect->next->stroke == isect->stroke)
 		{
 			int start_index, end_index;
 			int i;
 			
-			start_index = MIN2(isect->end, isect->next->end);
-			end_index = MAX2(isect->start, isect->next->start);
+			start_index = MIN2(isect->after, isect->next->after);
+			end_index = MAX2(isect->before, isect->next->before);
 
 			for (i = start_index; i <= end_index; i++)
 			{
@@ -1876,6 +1895,62 @@
 	}
 }
 
+int sk_detectReverseGesture(SK_Sketch *sketch, SK_Stroke *gesture, ListBase *list, SK_Stroke *segments)
+{
+	SK_Intersection *isect;
+	
+	/* check if it circled around an exact point */
+	for (isect = list->first; isect; isect = isect->next)
+	{
+		/* only delete strokes that are crossed twice */
+		if (isect->next && isect->next->stroke == isect->stroke)
+		{
+			float start_v[3], end_v[3];
+			float angle;
+			
+			if (isect->gesture_index < isect->next->gesture_index)
+			{
+				VecSubf(start_v, isect->p, gesture->points[0].p);
+				VecSubf(end_v, sk_lastStrokePoint(gesture)->p, isect->next->p);
+			}
+			else
+			{
+				VecSubf(start_v, isect->next->p, gesture->points[0].p);
+				VecSubf(end_v, sk_lastStrokePoint(gesture)->p, isect->p);
+			}
+			
+			angle = VecAngle2(start_v, end_v);
+			
+			if (angle > 120)
+			{
+				return 1;
+			}
+
+			/* skip next */				
+			isect = isect->next;
+		}
+	}
+		
+	return 0;
+}
+
+void sk_applyReverseGesture(SK_Sketch *sketch, SK_Stroke *gesture, ListBase *list, SK_Stroke *segments)
+{
+	SK_Intersection *isect;
+	
+	for (isect = list->first; isect; isect = isect->next)
+	{
+		/* only reverse strokes that are crossed twice */
+		if (isect->next && isect->next->stroke == isect->stroke)
+		{
+			sk_reverseStroke(isect->stroke);
+
+			/* skip next */				
+			isect = isect->next;
+		}
+	}
+}
+
 void sk_applyGesture(SK_Sketch *sketch)
 {
 	ListBase intersections;
@@ -1907,6 +1982,10 @@
 	{
 		sk_applyMergeGesture(sketch, sketch->gesture, &intersections, segments);
 	}
+	else if (nb_segments > 2 && nb_intersections == 2 && sk_detectReverseGesture(sketch, sketch->gesture, &intersections, segments))
+	{
+		sk_applyReverseGesture(sketch, sketch->gesture, &intersections, segments);
+	}
 	else if (nb_segments > 2 && nb_self_intersections == 1)
 	{
 		sk_convert(sketch);
@@ -1916,7 +1995,6 @@
 	else if (nb_segments > 2 && nb_self_intersections == 2)
 	{
 		sk_deleteSelectedStrokes(sketch);
-		BIF_undo_push("Convert Sketch");
 	}
 	
 	sk_freeStroke(segments);





More information about the Bf-blender-cvs mailing list