Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/curve.c
| Show First 20 Lines • Show All 706 Lines • ▼ Show 20 Lines | while (a--) { | ||||
| /* Surfaces doesn't use bevel, so no need to take radius into account. */ | /* Surfaces doesn't use bevel, so no need to take radius into account. */ | ||||
| minmax_v3v3_v3(min, max, bp->vec); | minmax_v3v3_v3(min, max, bp->vec); | ||||
| } | } | ||||
| bp++; | bp++; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| float BKE_nurb_length_get(Nurb *nu) | |||||
| { | |||||
| BezTriple *bezt, *prevbezt; | |||||
| BPoint *bp, *prevbp; | |||||
| int a, b; | |||||
| float length = 0.0f; | |||||
| int resolu = nu->resolu; | |||||
| int pntsu = nu->pntsu; | |||||
| float *points, *pntsit, *prevpntsit; | |||||
| if (nu->type == CU_POLY) { | |||||
| a = nu->pntsu - 1; | |||||
| bp = nu->bp; | |||||
| if (nu->flagu & CU_NURB_CYCLIC) { | |||||
| ++a; | |||||
| prevbp = nu->bp + (nu->pntsu - 1); | |||||
| } | |||||
| else { | |||||
| prevbp = bp; | |||||
| bp++; | |||||
| } | |||||
| while (a--) { | |||||
| length += len_v3v3(prevbp->vec, bp->vec); | |||||
| prevbp = bp; | |||||
| ++bp; | |||||
| } | |||||
| } | |||||
| else if (nu->type == CU_BEZIER) { | |||||
| points = (float *)MEM_mallocN(3 * sizeof(float) * (resolu + 1), "getLength_bezier"); | |||||
| a = nu->pntsu - 1; | |||||
| bezt = nu->bezt; | |||||
| if (nu->flagu & CU_NURB_CYCLIC) { | |||||
| ++a; | |||||
| prevbezt = nu->bezt + (nu->pntsu - 1); | |||||
| } | |||||
| else { | |||||
| prevbezt = bezt; | |||||
| ++bezt; | |||||
| } | |||||
| while (a--) { | |||||
| if (prevbezt->h2 == HD_VECT && bezt->h1 == HD_VECT) { | |||||
| length += len_v3v3(prevbezt->vec[1], bezt->vec[1]); | |||||
| } | |||||
| else { | |||||
| for (int j = 0; j < 3; j++) { | |||||
| BKE_curve_forward_diff_bezier(prevbezt->vec[1][j], prevbezt->vec[2][j], | |||||
| bezt->vec[0][j], bezt->vec[1][j], | |||||
| points + j, resolu, 3 * sizeof(float)); | |||||
| } | |||||
| prevpntsit = pntsit = points; | |||||
| b = resolu; | |||||
| while (b--) { | |||||
| pntsit += 3; | |||||
| length += len_v3v3(prevpntsit, pntsit); | |||||
| prevpntsit = pntsit; | |||||
| } | |||||
| } | |||||
| prevbezt = bezt; | |||||
| ++bezt; | |||||
| } | |||||
| MEM_freeN(points); | |||||
| } | |||||
| else if (nu->type == CU_NURBS) { | |||||
| if (nu->pntsv == 1) { | |||||
| points = (float *)MEM_callocN(3 * sizeof(float) * pntsu * resolu, "getLength_nurbs"); | |||||
| BKE_nurb_makeCurve(nu, points, | |||||
| NULL, NULL, NULL, | |||||
| resolu, 3 * sizeof(float)); | |||||
| if (nu->flagu & CU_NURB_CYCLIC) { | |||||
| b = pntsu * resolu + 1; | |||||
| prevpntsit = points + 3 * (pntsu * resolu - 1); | |||||
| pntsit = points; | |||||
| } | |||||
| else { | |||||
| b = (pntsu - 1) * resolu; | |||||
| prevpntsit = points; | |||||
| pntsit = points + 3; | |||||
| } | |||||
| while (--b) { | |||||
| length += len_v3v3(prevpntsit, pntsit); | |||||
| prevpntsit = pntsit; | |||||
| pntsit += 3; | |||||
| } | |||||
| MEM_freeN(points); | |||||
| } | |||||
| } | |||||
| return length; | |||||
| } | |||||
| /* be sure to call makeknots after this */ | /* be sure to call makeknots after this */ | ||||
| void BKE_nurb_points_add(Nurb *nu, int number) | void BKE_nurb_points_add(Nurb *nu, int number) | ||||
| { | { | ||||
| BPoint *bp; | BPoint *bp; | ||||
| int i; | int i; | ||||
| nu->bp = MEM_recallocN(nu->bp, (nu->pntsu + number) * sizeof(BPoint)); | nu->bp = MEM_recallocN(nu->bp, (nu->pntsu + number) * sizeof(BPoint)); | ||||
| ▲ Show 20 Lines • Show All 3,943 Lines • Show Last 20 Lines | |||||