[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58573] trunk/blender/source/blender: - add individual origin support for curves and improve the orientation calculations for curve handles ,
Campbell Barton
ideasman42 at gmail.com
Wed Jul 24 15:56:36 CEST 2013
Revision: 58573
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58573
Author: campbellbarton
Date: 2013-07-24 13:56:36 +0000 (Wed, 24 Jul 2013)
Log Message:
-----------
- add individual origin support for curves and improve the orientation calculations for curve handles,
- add support for using the active point's orientation.
- add support for creating new custom orientations from curves.
- fix error where only the last selected curve handle was taken into account for manipulator orientations.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_curve.h
trunk/blender/source/blender/blenkernel/intern/curve.c
trunk/blender/source/blender/editors/curve/editcurve.c
trunk/blender/source/blender/editors/transform/transform.c
trunk/blender/source/blender/editors/transform/transform.h
trunk/blender/source/blender/editors/transform/transform_conversions.c
trunk/blender/source/blender/editors/transform/transform_orientations.c
Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h 2013-07-24 12:58:27 UTC (rev 58572)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h 2013-07-24 13:56:36 UTC (rev 58573)
@@ -129,6 +129,14 @@
void BKE_nurb_points_add(struct Nurb *nu, int number);
void BKE_nurb_bezierPoints_add(struct Nurb *nu, int number);
+struct BezTriple *BKE_nurb_bezt_get_next(struct Nurb *nu, struct BezTriple *bezt);
+struct BezTriple *BKE_nurb_bezt_get_prev(struct Nurb *nu, struct BezTriple *bezt);
+struct BPoint *BKE_nurb_bpoint_get_next(struct Nurb *nu, struct BPoint *bp);
+struct BPoint *BKE_nurb_bpoint_get_prev(struct Nurb *nu, struct BPoint *bp);
+
+void BKE_nurb_bezt_calc_normal(struct Nurb *nu, struct BezTriple *bezt, float r_normal[3]);
+void BKE_nurb_bezt_calc_plane(struct Nurb *nu, struct BezTriple *bezt, float r_plane[3]);
+
void BKE_nurb_handle_calc(struct BezTriple *bezt, struct BezTriple *prev, struct BezTriple *next, int mode);
void BKE_nurb_handles_calc(struct Nurb *nu);
Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c 2013-07-24 12:58:27 UTC (rev 58572)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c 2013-07-24 13:56:36 UTC (rev 58573)
@@ -681,6 +681,143 @@
nu->pntsu += number;
}
+
+BezTriple *BKE_nurb_bezt_get_next(Nurb *nu, BezTriple *bezt)
+{
+ BezTriple *bezt_next;
+
+ BLI_assert(ARRAY_HAS_ITEM(bezt, nu->bezt, nu->pntsu));
+
+ if (bezt == &nu->bezt[nu->pntsu - 1]) {
+ if (nu->flagu & CU_NURB_CYCLIC) {
+ bezt_next = nu->bezt;
+ }
+ else {
+ bezt_next = NULL;
+ }
+ }
+ else {
+ bezt_next = bezt + 1;
+ }
+
+ return bezt_next;
+}
+
+BPoint *BKE_nurb_bpoint_get_next(Nurb *nu, BPoint *bp)
+{
+ BPoint *bp_next;
+
+ BLI_assert(ARRAY_HAS_ITEM(bp, nu->bp, nu->pntsu));
+
+ if (bp == &nu->bp[nu->pntsu - 1]) {
+ if (nu->flagu & CU_NURB_CYCLIC) {
+ bp_next = nu->bp;
+ }
+ else {
+ bp_next = NULL;
+ }
+ }
+ else {
+ bp_next = bp + 1;
+ }
+
+ return bp_next;
+}
+
+BezTriple *BKE_nurb_bezt_get_prev(Nurb *nu, BezTriple *bezt)
+{
+ BezTriple *bezt_prev;
+
+ BLI_assert(ARRAY_HAS_ITEM(bezt, nu->bezt, nu->pntsu));
+
+ if (bezt == nu->bezt) {
+ if (nu->flagu & CU_NURB_CYCLIC) {
+ bezt_prev = &nu->bezt[nu->pntsu - 1];
+ }
+ else {
+ bezt_prev = NULL;
+ }
+ }
+ else {
+ bezt_prev = bezt - 1;
+ }
+
+ return bezt_prev;
+}
+
+BPoint *BKE_nurb_bpoint_get_prev(Nurb *nu, BPoint *bp)
+{
+ BPoint *bp_prev;
+
+ BLI_assert(ARRAY_HAS_ITEM(bp, nu->bp, nu->pntsu));
+
+ if (bp == nu->bp) {
+ if (nu->flagu & CU_NURB_CYCLIC) {
+ bp_prev = &nu->bp[nu->pntsu - 1];
+ }
+ else {
+ bp_prev = NULL;
+ }
+ }
+ else {
+ bp_prev = bp - 1;
+ }
+
+ return bp_prev;
+}
+
+void BKE_nurb_bezt_calc_normal(struct Nurb *UNUSED(nu), struct BezTriple *bezt, float r_normal[3])
+{
+ /* calculate the axis matrix from the spline */
+ float dir_prev[3], dir_next[3];
+
+ sub_v3_v3v3(dir_prev, bezt->vec[0], bezt->vec[1]);
+ sub_v3_v3v3(dir_next, bezt->vec[1], bezt->vec[2]);
+
+ normalize_v3(dir_prev);
+ normalize_v3(dir_next);
+
+ add_v3_v3v3(r_normal, dir_prev, dir_next);
+ normalize_v3(r_normal);
+}
+
+void BKE_nurb_bezt_calc_plane(struct Nurb *nu, struct BezTriple *bezt, float r_plane[3])
+{
+ float dir_prev[3], dir_next[3];
+
+ sub_v3_v3v3(dir_prev, bezt->vec[0], bezt->vec[1]);
+ sub_v3_v3v3(dir_next, bezt->vec[1], bezt->vec[2]);
+
+ normalize_v3(dir_prev);
+ normalize_v3(dir_next);
+
+ cross_v3_v3v3(r_plane, dir_prev, dir_next);
+ if (normalize_v3(r_plane) < FLT_EPSILON) {
+ BezTriple *bezt_prev = BKE_nurb_bezt_get_prev(nu, bezt);
+ BezTriple *bezt_next = BKE_nurb_bezt_get_next(nu, bezt);
+
+ if (bezt_prev) {
+ sub_v3_v3v3(dir_prev, bezt_prev->vec[1], bezt->vec[1]);
+ normalize_v3(dir_prev);
+ }
+ if (bezt_next) {
+ sub_v3_v3v3(dir_next, bezt->vec[1], bezt_next->vec[1]);
+ normalize_v3(dir_next);
+ }
+ cross_v3_v3v3(r_plane, dir_prev, dir_next);
+ }
+
+ /* matches with bones more closely */
+ {
+ float dir_mid[3], tvec[3];
+ add_v3_v3v3(dir_mid, dir_prev, dir_next);
+ cross_v3_v3v3(tvec, r_plane, dir_mid);
+ copy_v3_v3(r_plane, tvec);
+ }
+
+ normalize_v3(r_plane);
+}
+
/* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */
Modified: trunk/blender/source/blender/editors/curve/editcurve.c
===================================================================
--- trunk/blender/source/blender/editors/curve/editcurve.c 2013-07-24 12:58:27 UTC (rev 58572)
+++ trunk/blender/source/blender/editors/curve/editcurve.c 2013-07-24 13:56:36 UTC (rev 58573)
@@ -2833,44 +2833,6 @@
/********************** subdivide operator *********************/
-static BezTriple *next_spline_bezier_point_get(Nurb *nu, BezTriple *bezt)
-{
- BezTriple *nextbezt;
-
- if (bezt == nu->bezt + nu->pntsu - 1) {
- if (nu->flagu & CU_NURB_CYCLIC) {
- nextbezt = nu->bezt;
- }
- else {
- nextbezt = NULL;
- }
- }
- else {
- nextbezt = bezt + 1;
- }
-
- return nextbezt;
-}
-
-static BPoint *next_spline_bpoint_get(Nurb *nu, BPoint *bp)
-{
- BPoint *nextbp;
-
- if (bp == nu->bp + nu->pntsu - 1) {
- if (nu->flagu & CU_NURB_CYCLIC) {
- nextbp = nu->bp;
- }
- else {
- nextbp = NULL;
- }
- }
- else {
- nextbp = bp + 1;
- }
-
- return nextbp;
-}
-
/** Divide the line segments associated with the currently selected
* curve nodes (Bezier or NURB). If there are no valid segment
* selections within the current selection, nothing happens.
@@ -2902,7 +2864,7 @@
a = nu->pntsu;
bezt = nu->bezt;
while (a--) {
- nextbezt = next_spline_bezier_point_get(nu, bezt);
+ nextbezt = BKE_nurb_bezt_get_next(nu, bezt);
if (nextbezt == NULL) {
break;
}
@@ -2924,7 +2886,7 @@
keyIndex_updateBezt(editnurb, bezt, beztn, 1);
beztn++;
- nextbezt = next_spline_bezier_point_get(nu, bezt);
+ nextbezt = BKE_nurb_bezt_get_next(nu, bezt);
if (nextbezt == NULL) {
break;
}
@@ -2988,7 +2950,7 @@
a = nu->pntsu;
bp = nu->bp;
while (a--) {
- nextbp = next_spline_bpoint_get(nu, bp);
+ nextbp = BKE_nurb_bpoint_get_next(nu, bp);
if (nextbp == NULL) {
break;
}
@@ -3013,7 +2975,7 @@
keyIndex_updateBP(editnurb, bp, bpn, 1);
bpn++;
- nextbp = next_spline_bpoint_get(nu, bp);
+ nextbp = BKE_nurb_bpoint_get_next(nu, bp);
if (nextbp == NULL) {
break;
}
Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c 2013-07-24 12:58:27 UTC (rev 58572)
+++ trunk/blender/source/blender/editors/transform/transform.c 2013-07-24 13:56:36 UTC (rev 58573)
@@ -110,7 +110,7 @@
{
return ((t->around == V3D_LOCAL) && (
(t->flag & (T_OBJECT | T_POSE)) ||
- (t->obedit && ELEM3(t->obedit->type, OB_MESH, OB_MBALL, OB_ARMATURE)) ||
+ (t->obedit && ELEM4(t->obedit->type, OB_MESH, OB_CURVE, OB_MBALL, OB_ARMATURE)) ||
(t->spacetype == SPACE_IPO))
);
}
@@ -7355,7 +7355,7 @@
{
/* currenly only checks for editmode */
if (t->flag & T_EDIT) {
- if ((t->around == V3D_LOCAL) && (ELEM3(t->obedit->type, OB_MESH, OB_MBALL, OB_ARMATURE))) {
+ if ((t->around == V3D_LOCAL) && (ELEM4(t->obedit->type, OB_MESH, OB_CURVE, OB_MBALL, OB_ARMATURE))) {
/* not all editmode supports axis-matrix */
return true;
}
Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h 2013-07-24 12:58:27 UTC (rev 58572)
+++ trunk/blender/source/blender/editors/transform/transform.h 2013-07-24 13:56:36 UTC (rev 58573)
@@ -725,7 +725,7 @@
/* Those two fill in mat and return non-zero on success */
bool createSpaceNormal(float mat[3][3], const float normal[3]);
-bool createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]);
+bool createSpaceNormalTangent(float mat[3][3], const float normal[3], const float tangent[3]);
struct TransformOrientation *addMatrixSpace(struct bContext *C, float mat[3][3], char name[], int overwrite);
void applyTransformOrientation(const struct bContext *C, float mat[3][3], char *name);
Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c 2013-07-24 12:58:27 UTC (rev 58572)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c 2013-07-24 13:56:36 UTC (rev 58573)
@@ -1417,7 +1417,24 @@
for (a = 0, bezt = nu->bezt; a < nu->pntsu; a++, bezt++) {
if (bezt->hide == 0) {
TransDataCurveHandleFlags *hdata = NULL;
+ float axismtx[3][3];
+ if (t->around == V3D_LOCAL) {
+ float normal[3], plane[3];
+
+ BKE_nurb_bezt_calc_normal(nu, bezt, normal);
+ BKE_nurb_bezt_calc_plane(nu, bezt, plane);
+
+ if (createSpaceNormalTangent(axismtx, normal, plane)) {
+ /* pass */
+ }
+ else {
+ normalize_v3(normal);
+ axis_dominant_v3_to_m3(axismtx, normal);
+ invert_m3(axismtx);
+ }
+ }
+
if (propmode ||
((bezt->f2 & SELECT) && hide_handles) ||
((bezt->f1 & SELECT) && hide_handles == 0))
@@ -1440,6 +1457,9 @@
copy_m3_m3(td->smtx, smtx);
copy_m3_m3(td->mtx, mtx);
+ if (t->around == V3D_LOCAL) {
+ copy_m3_m3(td->axismtx, axismtx);
+ }
td++;
count++;
@@ -1469,6 +1489,9 @@
copy_m3_m3(td->smtx, smtx);
copy_m3_m3(td->mtx, mtx);
+ if (t->around == V3D_LOCAL) {
+ copy_m3_m3(td->axismtx, axismtx);
+ }
if ((bezt->f1 & SELECT) == 0 && (bezt->f3 & SELECT) == 0)
/* If the middle is selected but the sides arnt, this is needed */
@@ -1504,6 +1527,9 @@
copy_m3_m3(td->smtx, smtx);
copy_m3_m3(td->mtx, mtx);
+ if (t->around == V3D_LOCAL) {
+ copy_m3_m3(td->axismtx, axismtx);
+ }
td++;
count++;
Modified: trunk/blender/source/blender/editors/transform/transform_orientations.c
===================================================================
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list