Revision: 18423 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18423 Author: theeth Date: 2009-01-08 19:23:48 +0100 (Thu, 08 Jan 2009)
Log Message: ----------- display overdrawn stroke in gray, to easily see what is being replaced. 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 2009-01-08 18:20:47 UTC (rev 18422) +++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2009-01-08 18:23:48 UTC (rev 18423) @@ -96,6 +96,7 @@ { SK_Stroke *target; int start, end; + int count; } SK_Adjustment; #define SK_Stroke_BUFFER_INIT_SIZE 20 @@ -200,6 +201,9 @@ void sk_applyConvertGesture(SK_Gesture *gest, SK_Sketch *sketch); +void sk_resetAdjust(SK_Sketch *sketch); +int sk_hasAdjust(SK_Sketch *sketch, SK_Stroke *stk); + /******************** GESTURE ACTIONS ******************************/ SK_GestureAction GESTURE_ACTIONS[] = @@ -1013,6 +1017,7 @@ { if (sketch->active_stroke != NULL) { + sk_resetAdjust(sketch); sk_removeStroke(sketch, sketch->active_stroke); } } @@ -1122,7 +1127,7 @@ return pt; } -void sk_drawStroke(SK_Stroke *stk, int id, float color[3]) +void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end) { float rgb[3]; int i; @@ -1153,7 +1158,14 @@ for (i = 0; i < stk->nb_points; i++) { - glColor3fv(rgb); + if (i >= start && i <= end) + { + glColor3f(0.3, 0.3, 0.3); + } + else + { + glColor3fv(rgb); + } glVertex3fv(stk->points[i].p); VecAddf(rgb, rgb, d_rgb); } @@ -1345,12 +1357,25 @@ return pt; } +void sk_resetAdjust(SK_Sketch *sketch) +{ + sketch->adj.target = NULL; + sketch->adj.start = 0; + sketch->adj.end = 0; + sketch->adj.count = 0; +} + +int sk_hasAdjust(SK_Sketch *sketch, SK_Stroke *stk) +{ + return sketch->adj.target && sketch->adj.count >= 3 && (sketch->adj.target == stk || stk == NULL); +} + void sk_updateAdjust(SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) { if (sketch->adj.target == NULL) { SK_Stroke *target; - int closest_index = 0; + int closest_index = -1; int dist = SNAP_MIN_DISTANCE * 2; for (target = sketch->strokes.first; target; target = target->next) @@ -1371,6 +1396,11 @@ if (sketch->adj.target != NULL) { + if (closest_index > -1) + { + sketch->adj.count++; + } + if (stk->nb_points == 1) { sketch->adj.start = closest_index; @@ -1379,7 +1409,6 @@ { sketch->adj.end = closest_index; } - sketch->adj.target->selected = 1; } } else if (sketch->adj.target != NULL) @@ -1392,49 +1421,69 @@ if (closest_pt != NULL) { + sketch->adj.count++; sketch->adj.end = index; } else { - sketch->adj.end = 0; + sketch->adj.end = -1; } } } +/* return 1 on reverse needed */ +int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end) +{ + int retval = 0; + + *start = sketch->adj.start; + *end = sketch->adj.end; + + if (*end == -1) + { + *end = sketch->adj.target->nb_points - 1; + } + + if (*end < *start) + { + int tmp = *start; + *start = *end; + *end = tmp; + retval = 1; + } + + return retval; +} + void sk_endAdjust(SK_Sketch *sketch) { SK_Stroke *stk = sketch->active_stroke; - if (sketch->adj.target) + if (sk_hasAdjust(sketch, NULL)) { - int start = sketch->adj.start; - int end = sketch->adj.end; + int start; + int end; - if (end == 0) + if (sk_adjustIndexes(sketch, &start, &end)) { - end = sketch->adj.target->nb_points - 1; + sk_reverseStroke(stk); } - else - { - sk_lastStrokePoint(stk)->type = PT_CONTINUOUS; - } if (start != 0) { stk->points->type = PT_CONTINUOUS; } - if (end < start) + if (end != sketch->adj.target->nb_points - 1) { - int tmp = start; - start = end; - end = tmp; - sk_reverseStroke(stk); + sk_lastStrokePoint(stk)->type = PT_CONTINUOUS; } sk_inserStrokePoints(sketch->adj.target, stk->points, stk->nb_points, start, end); sk_removeStroke(sketch, stk); + + sk_resetAdjust(sketch); } } @@ -1445,10 +1494,8 @@ BLI_addtail(&sketch->strokes, stk); sketch->active_stroke = stk; - - sketch->adj.target = NULL; - sketch->adj.start = 0; - sketch->adj.end = 0; + + sk_resetAdjust(sketch); } void sk_endStroke(SK_Sketch *sketch) @@ -2812,7 +2859,7 @@ int id; for (id = 1, stk = sketch->strokes.first; stk; id++, stk = stk->next) { - sk_drawStroke(stk, id, NULL); + sk_drawStroke(stk, id, NULL, -1, -1); } glLoadName(-1); @@ -2824,7 +2871,15 @@ for (stk = sketch->strokes.first; stk; stk = stk->next) { - sk_drawStroke(stk, -1, (stk->selected==1?selected_rgb:unselected_rgb)); + int start = -1; + int end = -1; + + if (sk_hasAdjust(sketch, stk)) + { + sk_adjustIndexes(sketch, &start, &end); + } + + sk_drawStroke(stk, -1, (stk->selected==1?selected_rgb:unselected_rgb), start, end); if (stk->selected == 1) { @@ -2836,7 +2891,7 @@ if (sketch->gesture != NULL && area_is_active_area(G.vd->area)) { float gesture_rgb[3] = {0, 0.5, 1}; - sk_drawStroke(sketch->gesture, -1, gesture_rgb); + sk_drawStroke(sketch->gesture, -1, gesture_rgb, -1, -1); } if (sketch->active_stroke != NULL) @@ -2860,7 +2915,7 @@ } glEnable(GL_LINE_STIPPLE); - glColor3f(1, 0.5, 0); + glColor3fv(selected_rgb); glBegin(GL_LINE_STRIP); glVertex3fv(last->p); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs