nuclear@0: #include nuclear@0: #include "revol.h" nuclear@0: nuclear@0: Vector2 bezier_revol(float u, float v, void *cls) nuclear@0: { nuclear@0: BezCurve *curve = (BezCurve*)cls; nuclear@0: int nseg = (curve->numcp - 1) / 2; nuclear@0: nuclear@0: if(v >= 1.0) v = 1.0 - 1e-6; nuclear@0: int cidx = std::min((int)(v * nseg), nseg - 1); nuclear@0: float t = fmod(v * (float)nseg, 1.0); nuclear@0: nuclear@0: const vec2_t *cp = curve->cp + cidx * 2; nuclear@0: nuclear@0: float resx = bezier(cp[0].x, cp[1].x, cp[1].x, cp[2].x, t); nuclear@0: float resy = bezier(cp[0].y, cp[1].y, cp[1].y, cp[2].y, t); nuclear@0: return Vector2(resx * curve->scale, resy * curve->scale); nuclear@0: } nuclear@0: nuclear@0: Vector2 bezier_revol_normal(float u, float v, void *cls) nuclear@0: { nuclear@0: BezCurve *curve = (BezCurve*)cls; nuclear@0: int nseg = (curve->numcp - 1) / 2; nuclear@0: nuclear@0: if(v >= 1.0) v = 1.0 - 1e-6; nuclear@0: int cidx = std::min((int)(v * nseg), nseg - 1); nuclear@0: float t = fmod(v * (float)nseg, 1.0); nuclear@0: nuclear@0: const vec2_t *cp = curve->cp + cidx * 2; nuclear@0: Vector2 cp0 = cp[0]; nuclear@0: Vector2 cp1 = cp[1]; nuclear@0: Vector2 cp2 = cp[2]; nuclear@0: nuclear@0: Vector2 pprev, pnext; nuclear@0: for(int i=0; i<2; i++) { nuclear@0: pprev[i] = bezier(cp0[i], cp1[i], cp1[i], cp2[i], t - 0.05); nuclear@0: pnext[i] = bezier(cp0[i], cp1[i], cp1[i], cp2[i], t + 0.05); nuclear@0: } nuclear@0: nuclear@0: float tx = pnext.x - pprev.x; nuclear@0: float ty = pnext.y - pprev.y; nuclear@0: nuclear@0: return Vector2(-ty, tx); nuclear@0: }