[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