[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17151] branches/etch-a-ton/source/blender : Auto Roll:
Martin Poirier
theeth at yahoo.com
Tue Oct 21 19:59:56 CEST 2008
Revision: 17151
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17151
Author: theeth
Date: 2008-10-21 19:59:56 +0200 (Tue, 21 Oct 2008)
Log Message:
-----------
Auto Roll:
Bone roll to face the screen on painted strokes.
Modified Paths:
--------------
branches/etch-a-ton/source/blender/include/BIF_editarmature.h
branches/etch-a-ton/source/blender/src/editarmature.c
branches/etch-a-ton/source/blender/src/editarmature_sketch.c
Modified: branches/etch-a-ton/source/blender/include/BIF_editarmature.h
===================================================================
--- branches/etch-a-ton/source/blender/include/BIF_editarmature.h 2008-10-21 16:40:42 UTC (rev 17150)
+++ branches/etch-a-ton/source/blender/include/BIF_editarmature.h 2008-10-21 17:59:56 UTC (rev 17151)
@@ -70,6 +70,8 @@
EditBone *addEditBone(char *name, struct ListBase *ebones, struct bArmature *arm);
+float rollBoneToVector(EditBone *bone, float new_up_axis[3]);
+
void adduplicate_armature(void);
void addvert_armature(void);
void add_primitiveArmature(int type);
Modified: branches/etch-a-ton/source/blender/src/editarmature.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature.c 2008-10-21 16:40:42 UTC (rev 17150)
+++ branches/etch-a-ton/source/blender/src/editarmature.c 2008-10-21 17:59:56 UTC (rev 17151)
@@ -1817,6 +1817,31 @@
}
}
+/* adjust bone roll to align Z axis with vector
+ * vec is in local space and is normalized
+ */
+float rollBoneToVector(EditBone *bone, float new_up_axis[3])
+{
+ float mat[3][3], nor[3], up_axis[3], vec[3];
+ float roll;
+
+ VecSubf(nor, bone->tail, bone->head);
+
+ vec_roll_to_mat3(nor, 0, mat);
+ VECCOPY(up_axis, mat[2]);
+
+ roll = NormalizedVecAngle2(new_up_axis, up_axis);
+
+ Crossf(vec, up_axis, new_up_axis);
+
+ if (Inpf(vec, nor) < 0)
+ {
+ roll = -roll;
+ }
+
+ return roll;
+}
+
/* Sets the roll value of selected bones, depending on the mode
* mode == 0: their z-axes point upwards
* mode == 1: their z-axes point towards 3d-cursor
Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2008-10-21 16:40:42 UTC (rev 17150)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c 2008-10-21 17:59:56 UTC (rev 17151)
@@ -70,6 +70,7 @@
typedef struct SK_Point
{
float p[3];
+ float no[3];
SK_PType type;
SK_PMode mode;
} SK_Point;
@@ -373,6 +374,18 @@
return sketch;
}
+void sk_initPoint(SK_Point *pt)
+{
+ VECCOPY(pt->no, G.vd->viewinv[2]);
+ Normalize(pt->no);
+ /* more init code here */
+}
+
+void sk_copyPoint(SK_Point *dst, SK_Point *src)
+{
+ memcpy(dst, src, sizeof(SK_Point));
+}
+
void sk_allocStrokeBuffer(SK_Stroke *stk)
{
stk->points = MEM_callocN(sizeof(SK_Point) * stk->buf_size, "SK_Point buffer");
@@ -519,7 +532,8 @@
SK_Point pt;
float vec[3];
- pt.type = PT_CONTINUOUS;
+ sk_copyPoint(&pt, &old_points[j+1]);
+
pt.p[0] = 0;
pt.p[1] = 0;
pt.p[2] = 0;
@@ -936,6 +950,8 @@
{
SK_Point pt;
+ sk_initPoint(&pt);
+
sk_getStrokeDrawPoint(&pt, sketch, stk, dd);
sk_appendStrokePoint(stk, &pt);
@@ -983,9 +999,11 @@
int sk_addStrokeSnapPoint(SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
+ int point_added = 0;
SK_Point pt;
- int point_added = 0;
+ sk_initPoint(&pt);
+
point_added = sk_getStrokeSnapPoint(&pt, sketch, stk, dd);
if (point_added)
@@ -1105,9 +1123,11 @@
int sk_addStrokeEmbedPoint(SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
+ int point_added;
SK_Point pt;
- int point_added;
+ sk_initPoint(&pt);
+
point_added = sk_getStrokeEmbedPoint(&pt, sketch, stk, dd);
if (point_added)
@@ -1224,6 +1244,22 @@
}
/********************************************/
+/* bone is assumed to be in GLOBAL space */
+void setBoneRollFromPoint(EditBone *bone, SK_Point *pt, float invmat[][4], float tmat[][3])
+{
+ float tangent[3], cotangent[3], normal[3];
+
+ VecSubf(tangent, bone->tail, bone->head);
+ Crossf(cotangent, tangent, pt->no);
+ Crossf(normal, cotangent, tangent);
+
+ Mat3MulVecfl(tmat, normal);
+ Normalize(normal);
+
+ bone->roll = rollBoneToVector(bone, normal);
+
+}
+
float calcStrokeCorrelation(SK_Stroke *stk, int start, int end, float v0[3], float n[3])
{
int len = 2 + abs(end - start);
@@ -1296,7 +1332,7 @@
return -1;
}
-EditBone * subdivideStrokeByCorrelation(SK_Stroke *stk, int start, int end, float invmat[][4])
+EditBone * subdivideStrokeByCorrelation(SK_Stroke *stk, int start, int end, float invmat[][4], float tmat[][3])
{
bArmature *arm= G.obedit->data;
EditBone *lastBone = NULL;
@@ -1314,6 +1350,8 @@
index = nextCorrelationSubdivision(stk, bone_start, end, parent->head, parent->tail);
while (index != -1)
{
+ setBoneRollFromPoint(parent, &stk->points[end], invmat, tmat);
+
Mat4MulVecfl(invmat, parent->head); /* going to next bone, fix previous head */
child = addEditBone("Bone", &G.edbo, arm);
@@ -1327,9 +1365,11 @@
index = nextCorrelationSubdivision(stk, bone_start, end, parent->head, parent->tail);
}
+ VECCOPY(parent->tail, stk->points[end].p);
+
+ setBoneRollFromPoint(parent, &stk->points[end], invmat, tmat);
+
Mat4MulVecfl(invmat, parent->head);
-
- VECCOPY(parent->tail, stk->points[end].p);
Mat4MulVecfl(invmat, parent->tail);
lastBone = parent;
}
@@ -1405,7 +1445,7 @@
return -1;
}
-EditBone * subdivideStrokeByLength(SK_Stroke *stk, int start, int end, float invmat[][4])
+EditBone * subdivideStrokeByLength(SK_Stroke *stk, int start, int end, float invmat[][4], float tmat[][3])
{
bArmature *arm= G.obedit->data;
EditBone *lastBone = NULL;
@@ -1419,10 +1459,11 @@
parent = addEditBone("Bone", &G.edbo, arm);
VECCOPY(parent->head, stk->points[start].p);
-
+
index = nextLengthSubdivision(stk, bone_start, end, parent->head, parent->tail);
while (index != -1)
{
+ setBoneRollFromPoint(parent, &stk->points[index], invmat, tmat);
Mat4MulVecfl(invmat, parent->head); /* going to next bone, fix previous head */
child = addEditBone("Bone", &G.edbo, arm);
@@ -1436,9 +1477,11 @@
index = nextLengthSubdivision(stk, bone_start, end, parent->head, parent->tail);
}
+ VECCOPY(parent->tail, stk->points[end].p);
+
+ setBoneRollFromPoint(parent, &stk->points[end], invmat, tmat);
+
Mat4MulVecfl(invmat, parent->head);
-
- VECCOPY(parent->tail, stk->points[end].p);
Mat4MulVecfl(invmat, parent->tail);
lastBone = parent;
}
@@ -1452,6 +1495,7 @@
SK_Point *head;
EditBone *parent = NULL;
float invmat[4][4]; /* move in caller function */
+ float tmat[3][3];
int head_index = 0;
int i;
@@ -1459,6 +1503,9 @@
Mat4Invert(invmat, G.obedit->obmat);
+ Mat3CpyMat4(tmat, G.obedit->obmat);
+ Mat3Transp(tmat);
+
for (i = 0; i < stk->nb_points; i++)
{
SK_Point *pt = stk->points + i;
@@ -1477,11 +1524,11 @@
if (i - head_index > 1)
{
- bone = subdivideStrokeByCorrelation(stk, head_index, i, invmat);
+ bone = subdivideStrokeByCorrelation(stk, head_index, i, invmat, tmat);
if (bone == NULL)
{
- bone = subdivideStrokeByLength(stk, head_index, i, invmat);
+ bone = subdivideStrokeByLength(stk, head_index, i, invmat, tmat);
}
}
@@ -1491,6 +1538,7 @@
VECCOPY(bone->head, head->p);
VECCOPY(bone->tail, pt->p);
+ setBoneRollFromPoint(bone, pt, invmat, tmat);
Mat4MulVecfl(invmat, bone->head);
Mat4MulVecfl(invmat, bone->tail);
More information about the Bf-blender-cvs
mailing list