[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