[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17001] branches/etch-a-ton/source/blender /src/editarmature_sketch.c: Stroke embedding.
Martin Poirier
theeth at yahoo.com
Fri Oct 10 04:59:11 CEST 2008
Revision: 17001
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17001
Author: theeth
Date: 2008-10-10 04:59:09 +0200 (Fri, 10 Oct 2008)
Log Message:
-----------
Stroke embedding. When doing continuous strokes, use the depth hit closests to last, so you can start on a limb and then continue drawing inside it even if things overlap.
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-09 22:44:52 UTC (rev 17000)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2008-10-10 02:59:09 UTC (rev 17001)
@@ -103,6 +103,7 @@
float p[3];
float no[3];
Object *ob;
+ int flag;
} SK_DepthPeel;
int cmpPeel(void *arg1, void *arg2)
@@ -133,6 +134,8 @@
VECCOPY(peel->no, no);
BLI_addtail(depth_peels, peel);
+
+ peel->flag = 0;
}
int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_start[3], float ray_normal[3], short mval[2], ListBase *depth_peels)
@@ -713,43 +716,80 @@
void sk_addStrokeEmbedPoint(SK_Stroke *stk, SK_DrawData *dd)
{
+ ListBase depth_peels;
SK_DepthPeel *p1, *p2;
- ListBase depth_peels;
+ SK_Point *last_pt = NULL;
+ float dist = FLT_MAX;
+ float p[3];
depth_peels.first = depth_peels.last = NULL;
peelObjects(&depth_peels, dd->mval);
- p1 = depth_peels.first;
- if (p1)
+ if (stk->nb_points > 0 && stk->points[stk->nb_points - 1].type == PT_CONTINUOUS)
{
+ last_pt = stk->points + (stk->nb_points - 1);
+ }
+
+
+ for (p1 = depth_peels.first; p1; p1 = p1->next)
+ {
+ if (p1->flag == 0)
+ {
+ float vec[3];
+ float new_dist;
+
+ p1->flag = 0;
+
+ for (p2 = p1->next; p2 && p2->ob != p1->ob; p2 = p2->next)
+ {
+ /* nothing to do here */
+ }
+
+
+ if (p2)
+ {
+ p2->flag = 1;
+
+ VecAddf(vec, p1->p, p2->p);
+ VecMulf(vec, 0.5f);
+ }
+ else
+ {
+ VECCOPY(vec, p1->p);
+ }
+
+ if (last_pt == NULL)
+ {
+ VECCOPY(p, vec);
+ break;
+ }
+
+ new_dist = VecLenf(last_pt->p, vec);
+
+ if (new_dist < dist)
+ {
+ VECCOPY(p, vec);
+ dist = new_dist;
+ }
+ }
+ }
+
+ if (dist == FLT_MAX)
+ {
+ sk_addStrokeDrawPoint(stk, dd);
+ }
+ else
+ {
SK_Point pt;
pt.type = dd->type;
-
- for (p2 = p1->next; p2 && p2->ob != p1->ob; p2 = p2->next)
- {
- /* nothing to do here */
- }
+ VECCOPY(pt.p, p);
- if (p2)
- {
- VecAddf(pt.p, p1->p, p2->p);
- VecMulf(pt.p, 0.5f);
- }
- else
- {
- VECCOPY(pt.p, p1->p);
- }
-
sk_appendStrokePoint(stk, &pt);
}
- else
- {
- sk_addStrokeDrawPoint(stk, dd);
- }
BLI_freelistN(&depth_peels);
}
More information about the Bf-blender-cvs
mailing list