Add BKE_nurb_bpoint_calc_normal
authorCampbell Barton <ideasman42@gmail.com>
Wed, 8 Jul 2015 16:56:04 +0000 (02:56 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 8 Jul 2015 16:56:04 +0000 (02:56 +1000)
source/blender/blenkernel/BKE_curve.h
source/blender/blenkernel/intern/curve.c

index 9bae2ad948d28c5c947fbd3cfb4188d7ceb1156e..20b66a59b12a77b6209a78757b279e1a55bbf48b 100644 (file)
@@ -174,6 +174,8 @@ 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_bpoint_calc_normal(struct Nurb *nu, struct BPoint *bp, float r_normal[3]);
+
 void BKE_nurb_handle_calc(struct BezTriple *bezt, struct BezTriple *prev,  struct BezTriple *next,
                           const bool is_fcurve);
 void BKE_nurb_handle_calc_simple(struct Nurb *nu, struct BezTriple *bezt);
index 1a67ac76937a46cb232a957d19b3a48a50f6eb24..01e443cdb0d0dbe8836013228b76abc333891eca 100644 (file)
@@ -873,6 +873,29 @@ 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])
+{
+       BPoint *bp_prev = BKE_nurb_bpoint_get_prev(nu, bp);
+       BPoint *bp_next = BKE_nurb_bpoint_get_next(nu, bp);
+
+       zero_v3(r_normal);
+
+       if (bp_prev) {
+               float dir_prev[3];
+               sub_v3_v3v3(dir_prev, bp_prev->vec, bp->vec);
+               normalize_v3(dir_prev);
+               add_v3_v3(r_normal, dir_prev);
+       }
+       if (bp_next) {
+               float dir_next[3];
+               sub_v3_v3v3(dir_next, bp->vec, bp_next->vec);
+               normalize_v3(dir_next);
+               add_v3_v3(r_normal, dir_next);
+       }
+
+       normalize_v3(r_normal);
+}
+
 /* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */