[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18412] branches/etch-a-ton/source/blender : adjust strokes by redrawing over them
Martin Poirier
theeth at yahoo.com
Wed Jan 7 22:46:13 CET 2009
Revision: 18412
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18412
Author: theeth
Date: 2009-01-07 22:46:10 +0100 (Wed, 07 Jan 2009)
Log Message:
-----------
adjust strokes by redrawing over them
(has to be turned on in the panel because it can give unexpected results sometimes right now)
http://vimeo.com/2753749
http://blenderartists.org/~theeth/bf/etch-a-ton/adjust.ogv
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 2009-01-07 21:05:51 UTC (rev 18411)
+++ branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h 2009-01-07 21:46:10 UTC (rev 18412)
@@ -881,6 +881,7 @@
/* toolsettings->bone_sketching */
#define BONE_SKETCHING 1
#define BONE_SKETCHING_QUICK 2
+#define BONE_SKETCHING_ADJUST 4
/* toolsettings->bone_sketching_convert */
#define SK_CONVERT_CUT_FIXED 1
Modified: branches/etch-a-ton/source/blender/src/drawview.c
===================================================================
--- branches/etch-a-ton/source/blender/src/drawview.c 2009-01-07 21:05:51 UTC (rev 18411)
+++ branches/etch-a-ton/source/blender/src/drawview.c 2009-01-07 21:46:10 UTC (rev 18412)
@@ -2312,7 +2312,8 @@
uiBlockBeginAlign(block);
/* use real flag instead of 1 */
- uiDefButBitC(block, TOG, BONE_SKETCHING, B_REDR, "Use Bone Sketching", 10, yco, 180, 20, &G.scene->toolsettings->bone_sketching, 0, 0, 0, 0, "Use sketching to create and edit bones");
+ uiDefButBitC(block, TOG, BONE_SKETCHING, B_REDR, "Use Bone Sketching", 10, yco, 160, 20, &G.scene->toolsettings->bone_sketching, 0, 0, 0, 0, "Use sketching to create and edit bones");
+ uiDefButBitC(block, TOG, BONE_SKETCHING_ADJUST, B_REDR, "A", 170, yco, 20, 20, &G.scene->toolsettings->bone_sketching, 0, 0, 0, 0, "Adjust strokes by drawing near them");
uiDefButBitC(block, TOG, BONE_SKETCHING_QUICK, B_REDR, "Q", 190, yco, 20, 20, &G.scene->toolsettings->bone_sketching, 0, 0, 0, 0, "Automatically convert and delete on stroke end");
yco -= 20;
Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2009-01-07 21:05:51 UTC (rev 18411)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2009-01-07 21:46:10 UTC (rev 18412)
@@ -92,6 +92,12 @@
int selected;
} SK_Stroke;
+typedef struct SK_Adjustment
+{
+ SK_Stroke *target;
+ int start, end;
+} SK_Adjustment;
+
#define SK_Stroke_BUFFER_INIT_SIZE 20
typedef struct SK_DrawData
@@ -118,6 +124,7 @@
SK_Stroke *active_stroke;
SK_Stroke *gesture;
SK_Point next_point;
+ SK_Adjustment adj;
} SK_Sketch;
typedef struct SK_StrokeIterator {
@@ -836,6 +843,26 @@
}
}
+void sk_growStrokeBufferN(SK_Stroke *stk, int n)
+{
+ if (stk->nb_points + n > stk->buf_size)
+ {
+ SK_Point *old_points = stk->points;
+
+ while (stk->nb_points + n > stk->buf_size)
+ {
+ stk->buf_size *= 2;
+ }
+
+ sk_allocStrokeBuffer(stk);
+
+ memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points);
+
+ MEM_freeN(old_points);
+ }
+}
+
+
void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n)
{
memcpy(stk->points + n, pt, sizeof(SK_Point));
@@ -863,6 +890,24 @@
stk->nb_points++;
}
+void sk_inserStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end)
+{
+ int size = end - start + 1;
+
+ sk_growStrokeBufferN(stk, len - size);
+
+ if (len != size)
+ {
+ int tail_size = stk->nb_points - end + 1;
+
+ memmove(stk->points + start + len, stk->points + end + 1, tail_size * sizeof(SK_Point));
+ }
+
+ memcpy(stk->points + start, pts, len * sizeof(SK_Point));
+
+ stk->nb_points += len - size;
+}
+
void sk_trimStroke(SK_Stroke *stk, int start, int end)
{
int size = end - start + 1;
@@ -1221,14 +1266,14 @@
}
}
-SK_Point *sk_snapPointStroke(SK_Stroke *stk, short mval[2], int *dist)
+SK_Point *sk_snapPointStroke(SK_Stroke *stk, short mval[2], int *dist, int *index)
{
SK_Point *pt = NULL;
int i;
for (i = 0; i < stk->nb_points; i++)
{
- if (stk->points[i].type == PT_EXACT)
+ if (1) // stk->points[i].type == PT_EXACT)
{
short pval[2];
int pdist;
@@ -1241,6 +1286,11 @@
{
*dist = pdist;
pt = stk->points + i;
+
+ if (index != NULL)
+ {
+ *index = i;
+ }
}
}
}
@@ -1295,17 +1345,121 @@
return pt;
}
+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 dist = SNAP_MIN_DISTANCE * 2;
+
+ for (target = sketch->strokes.first; target; target = target->next)
+ {
+ if (target != stk)
+ {
+ int index;
+
+ SK_Point *spt = sk_snapPointStroke(target, dd->mval, &dist, &index);
+
+ if (spt != NULL)
+ {
+ sketch->adj.target = target;
+ closest_index = index;
+ }
+ }
+ }
+
+ if (sketch->adj.target != NULL)
+ {
+ if (stk->nb_points == 1)
+ {
+ sketch->adj.start = closest_index;
+ }
+ else
+ {
+ sketch->adj.end = closest_index;
+ }
+ sketch->adj.target->selected = 1;
+ }
+ }
+ else if (sketch->adj.target != NULL)
+ {
+ SK_Point *closest_pt = NULL;
+ int dist = SNAP_MIN_DISTANCE * 2;
+ int index;
+
+ closest_pt = sk_snapPointStroke(sketch->adj.target, dd->mval, &dist, &index);
+
+ if (closest_pt != NULL)
+ {
+ sketch->adj.end = index;
+ }
+ else
+ {
+ sketch->adj.end = 0;
+ }
+ }
+}
+
+void sk_endAdjust(SK_Sketch *sketch)
+{
+ SK_Stroke *stk = sketch->active_stroke;
+
+ if (sketch->adj.target)
+ {
+ int start = sketch->adj.start;
+ int end = sketch->adj.end;
+
+ if (end == 0)
+ {
+ end = sketch->adj.target->nb_points - 1;
+ }
+ else
+ {
+ sk_lastStrokePoint(stk)->type = PT_CONTINUOUS;
+ }
+
+ if (start != 0)
+ {
+ stk->points->type = PT_CONTINUOUS;
+ }
+
+ if (end < start)
+ {
+ int tmp = start;
+ start = end;
+ end = tmp;
+ sk_reverseStroke(stk);
+ }
+
+ sk_inserStrokePoints(sketch->adj.target, stk->points, stk->nb_points, start, end);
+
+ sk_removeStroke(sketch, stk);
+ }
+}
+
+
void sk_startStroke(SK_Sketch *sketch)
{
SK_Stroke *stk = sk_createStroke();
BLI_addtail(&sketch->strokes, stk);
sketch->active_stroke = stk;
+
+ sketch->adj.target = NULL;
+ sketch->adj.start = 0;
+ sketch->adj.end = 0;
}
void sk_endStroke(SK_Sketch *sketch)
{
sk_shrinkStrokeBuffer(sketch->active_stroke);
+
+ if (G.scene->toolsettings->bone_sketching & BONE_SKETCHING_ADJUST)
+ {
+ sk_endAdjust(sketch);
+ }
+
sketch->active_stroke = NULL;
}
@@ -1412,7 +1566,7 @@
for (stk = sketch->strokes.first; stk; stk = stk->next)
{
- SK_Point *spt = sk_snapPointStroke(stk, dd->mval, &dist);
+ SK_Point *spt = sk_snapPointStroke(stk, dd->mval, &dist, NULL);
if (spt != NULL)
{
@@ -1648,7 +1802,12 @@
if (point_added == 0)
{
point_added = sk_addStrokeDrawPoint(sketch, stk, dd);
- }
+ }
+
+ if (G.scene->toolsettings->bone_sketching & BONE_SKETCHING_ADJUST)
+ {
+ sk_updateAdjust(sketch, stk, dd);
+ }
}
void sk_getStrokePoint(SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short qual)
@@ -2749,6 +2908,9 @@
if (sketch->active_stroke == NULL)
{
sk_startStroke(sketch);
+ sk_selectAllSketch(sketch, -1);
+
+ sketch->active_stroke->selected = 1;
}
sk_initDrawData(&dd);
@@ -2806,11 +2968,6 @@
sk_removeStroke(sketch, stk);
allqueue(REDRAWBUTSEDIT, 0);
}
- else
- {
- sk_selectAllSketch(sketch, -1);
- stk->selected = 1;
- }
allqueue(REDRAWVIEW3D, 0);
}
More information about the Bf-blender-cvs
mailing list