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);
                }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to