Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / curve.c
index 8a6d9f57093b2e37839deb3cefbd390fbc4b2e54..2863a9250004b28a3853f73a4b631eef4a7be585 100644 (file)
@@ -748,6 +748,7 @@ BezTriple *BKE_nurb_bezt_get_prev(Nurb *nu, BezTriple *bezt)
        BezTriple *bezt_prev;
 
        BLI_assert(ARRAY_HAS_ITEM(bezt, nu->bezt, nu->pntsu));
+       BLI_assert(nu->pntsv == 1);
 
        if (bezt == nu->bezt) {
                if (nu->flagu & CU_NURB_CYCLIC) {
@@ -769,6 +770,7 @@ BPoint *BKE_nurb_bpoint_get_prev(Nurb *nu, BPoint *bp)
        BPoint *bp_prev;
 
        BLI_assert(ARRAY_HAS_ITEM(bp, nu->bp, nu->pntsu));
+       BLI_assert(nu->pntsv == 1);
 
        if (bp == nu->bp) {
                if (nu->flagu & CU_NURB_CYCLIC) {
@@ -785,7 +787,7 @@ BPoint *BKE_nurb_bpoint_get_prev(Nurb *nu, BPoint *bp)
        return bp_prev;
 }
 
-void BKE_nurb_bezt_calc_normal(struct Nurb *UNUSED(nu), struct BezTriple *bezt, float r_normal[3])
+void BKE_nurb_bezt_calc_normal(struct Nurb *UNUSED(nu), BezTriple *bezt, float r_normal[3])
 {
        /* calculate the axis matrix from the spline */
        float dir_prev[3], dir_next[3];
@@ -800,7 +802,7 @@ void BKE_nurb_bezt_calc_normal(struct Nurb *UNUSED(nu), struct BezTriple *bezt,
        normalize_v3(r_normal);
 }
 
-void BKE_nurb_bezt_calc_plane(struct Nurb *nu, struct BezTriple *bezt, float r_plane[3])
+void BKE_nurb_bezt_calc_plane(struct Nurb *nu, BezTriple *bezt, float r_plane[3])
 {
        float dir_prev[3], dir_next[3];
 
@@ -837,7 +839,7 @@ void BKE_nurb_bezt_calc_plane(struct Nurb *nu, struct BezTriple *bezt, float r_p
        normalize_v3(r_plane);
 }
 
-void BKE_nurb_bpoint_calc_normal(struct Nurb *nu, struct BPoint *bp, float r_normal[3])
+void BKE_nurb_bpoint_calc_normal(struct Nurb *nu, BPoint *bp, float r_normal[3])
 {
        BPoint *bp_prev = BKE_nurb_bpoint_get_prev(nu, bp);
        BPoint *bp_next = BKE_nurb_bpoint_get_next(nu, bp);
@@ -860,6 +862,34 @@ void BKE_nurb_bpoint_calc_normal(struct Nurb *nu, struct BPoint *bp, float r_nor
        normalize_v3(r_normal);
 }
 
+void BKE_nurb_bpoint_calc_plane(struct Nurb *nu, BPoint *bp, float r_plane[3])
+{
+       BPoint *bp_prev = BKE_nurb_bpoint_get_prev(nu, bp);
+       BPoint *bp_next = BKE_nurb_bpoint_get_next(nu, bp);
+
+       float dir_prev[3] = {0.0f}, dir_next[3] = {0.0f};
+
+       if (bp_prev) {
+               sub_v3_v3v3(dir_prev, bp_prev->vec, bp->vec);
+               normalize_v3(dir_prev);
+       }
+       if (bp_next) {
+               sub_v3_v3v3(dir_next, bp->vec, bp_next->vec);
+               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 ~~~~~~~~~~~ */