diff options
Diffstat (limited to 'source/blender/blenkernel/intern/curve.c')
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 3abe3c58562..e88a8ecde8e 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -593,6 +593,10 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv) newnu->pntsu = pntsu; newnu->pntsv = pntsv; + /* caller can manually handle these arrays */ + newnu->knotsu = NULL; + newnu->knotsv = NULL; + if (src->bezt) { newnu->bezt = (BezTriple *)MEM_mallocN(pntsu * pntsv * sizeof(BezTriple), "copyNurb2"); } @@ -1738,7 +1742,7 @@ void BKE_curve_bevel_make(Scene *scene, Object *ob, ListBase *disp, /* half a circle */ fp = dl->verts; - dangle = (0.5 * M_PI / (dnr - 1)); + dangle = ((float)M_PI_2 / (dnr - 1)); angle = -(nr - 1) * dangle; for (a = 0; a < nr; a++) { @@ -1797,7 +1801,7 @@ void BKE_curve_bevel_make(Scene *scene, Object *ob, ListBase *disp, /* half a circle */ fp = dl->verts; angle = 0.0; - dangle = (0.5 * M_PI / (dnr - 1)); + dangle = ((float)M_PI_2 / (dnr - 1)); for (a = 0; a < nr; a++) { fp[0] = 0.0; @@ -1939,7 +1943,7 @@ static void calc_bevel_sin_cos(float x1, float y1, float x2, float y2, t02 = x1 * x2 + y1 * y2; if (fabsf(t02) >= 1.0f) - t02 = 0.5 * M_PI; + t02 = M_PI_2; else t02 = (saacos(t02)) / 2.0f; @@ -2472,7 +2476,7 @@ static void make_bevel_list_2D(BevList *bl) /* first */ bevp = bl->bevpoints; - angle = atan2f(bevp->dir[0], bevp->dir[1]) - (float)(M_PI / 2.0f); + angle = atan2f(bevp->dir[0], bevp->dir[1]) - (float)M_PI_2; bevp->sina = sinf(angle); bevp->cosa = cosf(angle); vec_to_quat(bevp->quat, bevp->dir, 5, 1); @@ -2480,7 +2484,7 @@ static void make_bevel_list_2D(BevList *bl) /* last */ bevp = bl->bevpoints; bevp += (bl->nr - 1); - angle = atan2f(bevp->dir[0], bevp->dir[1]) - (float)(M_PI / 2.0f); + angle = atan2f(bevp->dir[0], bevp->dir[1]) - (float)M_PI_2; bevp->sina = sinf(angle); bevp->cosa = cosf(angle); vec_to_quat(bevp->quat, bevp->dir, 5, 1); @@ -3347,6 +3351,21 @@ void BKE_nurb_handle_calc_simple(Nurb *nu, BezTriple *bezt) } } +void BKE_nurb_handle_calc_simple_auto(Nurb *nu, BezTriple *bezt) +{ + if (nu->pntsu > 1) { + const char h1_back = bezt->h1, h2_back = bezt->h2; + + bezt->h1 = bezt->h2 = HD_AUTO; + + /* Override handle types to HD_AUTO and recalculate */ + BKE_nurb_handle_calc_simple(nu, bezt); + + bezt->h1 = h1_back; + bezt->h2 = h2_back; + } +} + /** * Use when something has changed handle positions. * @@ -3604,24 +3623,12 @@ void BKE_nurbList_handles_recalculate(ListBase *editnurb, const bool calc_length if (h1_select || h2_select) { - /* Override handle types to HD_AUTO and recalculate */ - - char h1_back, h2_back; float co1_back[3], co2_back[3]; - h1_back = bezt->h1; - h2_back = bezt->h2; - - bezt->h1 = HD_AUTO; - bezt->h2 = HD_AUTO; - copy_v3_v3(co1_back, bezt->vec[0]); copy_v3_v3(co2_back, bezt->vec[2]); - BKE_nurb_handle_calc_simple(nu, bezt); - - bezt->h1 = h1_back; - bezt->h2 = h2_back; + BKE_nurb_handle_calc_simple_auto(nu, bezt); if (h1_select) { if (!calc_length) { |