[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17062] branches/etch-a-ton/source/blender : Skeleton Sketching
Martin Poirier
theeth at yahoo.com
Tue Oct 14 01:41:39 CEST 2008
Revision: 17062
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17062
Author: theeth
Date: 2008-10-14 01:41:38 +0200 (Tue, 14 Oct 2008)
Log Message:
-----------
Skeleton Sketching
- Delete Sketch button
- During continuous strokes, when moving out from and back into an embeding, interpolate depth of the stroke like is done when snapping
Modified Paths:
--------------
branches/etch-a-ton/source/blender/include/BIF_sketch.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/include/BIF_sketch.h
===================================================================
--- branches/etch-a-ton/source/blender/include/BIF_sketch.h 2008-10-13 22:50:06 UTC (rev 17061)
+++ branches/etch-a-ton/source/blender/include/BIF_sketch.h 2008-10-13 23:41:38 UTC (rev 17062)
@@ -25,5 +25,6 @@
int BIF_paintSketch();
void BIF_convertSketch();
+void BIF_deleteSketch();
#endif /* BIF_SKETCH_H */
Modified: branches/etch-a-ton/source/blender/src/drawview.c
===================================================================
--- branches/etch-a-ton/source/blender/src/drawview.c 2008-10-13 22:50:06 UTC (rev 17061)
+++ branches/etch-a-ton/source/blender/src/drawview.c 2008-10-13 23:41:38 UTC (rev 17062)
@@ -2269,6 +2269,11 @@
if(yco < 0) uiNewPanelHeight(block, height-yco);
}
+static void delete_sketch_armature(void *arg1, void *arg2)
+{
+ BIF_deleteSketch();
+}
+
static void convert_sketch_armature(void *arg1, void *arg2)
{
BIF_convertSketch();
@@ -2296,8 +2301,10 @@
/* use real flag instead of 1 */
uiDefButBitI(block, TOG, 1, B_REDR, "Use Bone Sketching", 10, 225, 150, 20, &G.bone_sketching, 0, 0, 0, 0, "Use sketching to create and edit bones");
- but = uiDefBut(block, BUT, B_REDR, "Convert Sketch", 10,205,150,20, 0, 0, 0, 0, 0, "Convert sketch to armature");
+ but = uiDefBut(block, BUT, B_REDR, "Convert", 10,205,150,20, 0, 0, 0, 0, 0, "Convert sketch to armature");
uiButSetFunc(but, convert_sketch_armature, NULL, NULL);
+ but = uiDefBut(block, BUT, B_REDR, "Delete", 10,185,150,20, 0, 0, 0, 0, 0, "Delete sketch");
+ uiButSetFunc(but, delete_sketch_armature, NULL, NULL);
uiBlockEndAlign(block);
Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2008-10-13 22:50:06 UTC (rev 17061)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2008-10-13 23:41:38 UTC (rev 17062)
@@ -58,10 +58,18 @@
PT_EXACT,
} SK_PType;
+typedef enum Method
+{
+ PT_EMBED,
+ PT_SNAP,
+ PT_PROJECT,
+} SK_PMode;
+
typedef struct SK_Point
{
float p[3];
SK_PType type;
+ SK_PMode mode;
} SK_Point;
typedef struct SK_Stroke
@@ -717,14 +725,38 @@
return distance;
}
+void sk_interpolateDepth(SK_Stroke *stk, int start, int end, float length, float distance)
+{
+ float progress = 0;
+ int i;
+
+ progress = VecLenf(stk->points[start].p, stk->points[start - 1].p);
+
+ for (i = start; i <= end; i++)
+ {
+ float ray_start[3], ray_normal[3];
+ float delta = VecLenf(stk->points[i].p, stk->points[i + 1].p);
+ short pval[2];
+
+ project_short_noclip(stk->points[i].p, pval);
+ viewray(pval, ray_start, ray_normal);
+
+ VecMulf(ray_normal, distance * progress / length);
+ VecAddf(stk->points[i].p, stk->points[i].p, ray_normal);
+
+ progress += delta ;
+ }
+}
+
void sk_addStrokeSnapPoint(SK_Stroke *stk, SK_DrawData *dd, SK_Point *snap_pt)
{
SK_Point pt;
float distance;
float length;
- int i, j, total;
+ int i, total;
pt.type = PT_EXACT;
+ pt.mode = PT_SNAP;
sk_projectPaintData(stk, dd, pt.p);
@@ -745,24 +777,9 @@
if (total > 1)
{
- float progress = length - VecLenf(stk->points[stk->nb_points - 2].p, stk->points[stk->nb_points - 1].p);
-
distance = sk_distanceDepth(snap_pt->p, stk->points[i].p);
- for (j = 1, i = stk->nb_points - 2; j < total; j++, i--)
- {
- float ray_start[3], ray_normal[3];
- float delta = VecLenf(stk->points[i].p, stk->points[i - 1].p);
- short pval[2];
-
- project_short_noclip(stk->points[i].p, pval);
- viewray(pval, ray_start, ray_normal);
-
- VecMulf(ray_normal, distance * progress / length);
- VecAddf(stk->points[i].p, stk->points[i].p, ray_normal);
-
- progress -= delta ;
- }
+ sk_interpolateDepth(stk, i + 1, stk->nb_points - 2, length, distance);
}
VECCOPY(stk->points[stk->nb_points - 1].p, snap_pt->p);
@@ -773,6 +790,7 @@
SK_Point pt;
pt.type = dd->type;
+ pt.mode = PT_PROJECT;
sk_projectPaintData(stk, dd, pt.p);
@@ -849,12 +867,37 @@
else
{
SK_Point pt;
+ float length, distance;
+ int total;
+ int i;
pt.type = dd->type;
+ pt.mode = PT_EMBED;
- VECCOPY(pt.p, p);
+ sk_projectPaintData(stk, dd, pt.p);
+ sk_appendStrokePoint(stk, &pt);
- sk_appendStrokePoint(stk, &pt);
+ /* update all previous point to give smooth Z progresion */
+ total = 0;
+ length = 0;
+ for (i = stk->nb_points - 2; i > 0; i--)
+ {
+ length += VecLenf(stk->points[i].p, stk->points[i + 1].p);
+ total++;
+ if (stk->points[i].mode == PT_EMBED || stk->points[i].type == PT_EXACT)
+ {
+ break;
+ }
+ }
+
+ if (total > 1)
+ {
+ distance = sk_distanceDepth(p, stk->points[i].p);
+
+ sk_interpolateDepth(stk, i + 1, stk->nb_points - 2, length, distance);
+ }
+
+ VECCOPY(stk->points[stk->nb_points - 1].p, p);
}
BLI_freelistN(&depth_peels);
@@ -1106,6 +1149,15 @@
}
}
+void BIF_deleteSketch()
+{
+ if (GLOBAL_sketch != NULL)
+ {
+ sk_freeSketch(GLOBAL_sketch);
+ GLOBAL_sketch = NULL;
+ }
+}
+
void BIF_convertSketch()
{
if (G.bone_sketching & 1)
More information about the Bf-blender-cvs
mailing list