ld33_umonster

annotate src/revol.cc @ 6:3b4460b34d43

progress
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 23 Aug 2015 05:37:09 +0300
parents
children
rev   line source
nuclear@6 1 #include <algorithm>
nuclear@6 2 #include "revol.h"
nuclear@6 3
nuclear@6 4 Vector2 bezier_revol(float u, float v, void *cls)
nuclear@6 5 {
nuclear@6 6 BezCurve *curve = (BezCurve*)cls;
nuclear@6 7 int nseg = (curve->numcp - 1) / 2;
nuclear@6 8
nuclear@6 9 if(v >= 1.0) v = 1.0 - 1e-6;
nuclear@6 10 int cidx = std::min((int)(v * nseg), nseg - 1);
nuclear@6 11 float t = fmod(v * (float)nseg, 1.0);
nuclear@6 12
nuclear@6 13 const vec2_t *cp = curve->cp + cidx * 2;
nuclear@6 14
nuclear@6 15 float resx = bezier(cp[0].x, cp[1].x, cp[1].x, cp[2].x, t);
nuclear@6 16 float resy = bezier(cp[0].y, cp[1].y, cp[1].y, cp[2].y, t);
nuclear@6 17 return Vector2(resx * curve->scale, resy * curve->scale);
nuclear@6 18 }
nuclear@6 19
nuclear@6 20 Vector2 bezier_revol_normal(float u, float v, void *cls)
nuclear@6 21 {
nuclear@6 22 BezCurve *curve = (BezCurve*)cls;
nuclear@6 23 int nseg = (curve->numcp - 1) / 2;
nuclear@6 24
nuclear@6 25 if(v >= 1.0) v = 1.0 - 1e-6;
nuclear@6 26 int cidx = std::min((int)(v * nseg), nseg - 1);
nuclear@6 27 float t = fmod(v * (float)nseg, 1.0);
nuclear@6 28
nuclear@6 29 const vec2_t *cp = curve->cp + cidx * 2;
nuclear@6 30 Vector2 cp0 = cp[0];
nuclear@6 31 Vector2 cp1 = cp[1];
nuclear@6 32 Vector2 cp2 = cp[2];
nuclear@6 33
nuclear@6 34 Vector2 pprev, pnext;
nuclear@6 35 for(int i=0; i<2; i++) {
nuclear@6 36 pprev[i] = bezier(cp0[i], cp1[i], cp1[i], cp2[i], t - 0.05);
nuclear@6 37 pnext[i] = bezier(cp0[i], cp1[i], cp1[i], cp2[i], t + 0.05);
nuclear@6 38 }
nuclear@6 39
nuclear@6 40 float tx = pnext.x - pprev.x;
nuclear@6 41 float ty = pnext.y - pprev.y;
nuclear@6 42
nuclear@6 43 return Vector2(-ty, tx);
nuclear@6 44 }