tavli

changeset 13:f3c5134b4914

generalized the surfaces of revolution evaluator a bit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 27 Jun 2015 22:33:27 +0300
parents ae1c60726c41
children 283eb6e9f0a3
files src/board.cc
diffstat 1 files changed, 43 insertions(+), 25 deletions(-) [+]
line diff
     1.1 --- a/src/board.cc	Sat Jun 27 13:53:43 2015 +0300
     1.2 +++ b/src/board.cc	Sat Jun 27 22:33:27 2015 +0300
     1.3 @@ -60,44 +60,62 @@
     1.4  #define HINGE_HEIGHT	(VSIZE * 0.075)
     1.5  #define PIECE_RAD		(0.45 * HSIZE / 5.0)
     1.6  
     1.7 -static const float piece_cp[][3][2] = {
     1.8 -	{{0, 0.25}, {1, 0.25}, {2, 0.5}},
     1.9 -	{{2, 0.5}, {2.5, 0.5}, {3, 0.5}},
    1.10 -	{{3, 0.5}, {4, 0.5}, {4, 0}},
    1.11 -	{{4, 0}, {4, -0.5}, {3, -0.5}},
    1.12 -	{{3, -0.5}, {2.5, -0.5}, {0, -0.5}},
    1.13 -	//{{2, -0.5}, {1, -0.25}, {0, -0.25}}
    1.14 +struct BezCurve {
    1.15 +	int numcp;
    1.16 +	vec2_t *cp;
    1.17 +	float scale;
    1.18  };
    1.19 -static const int piece_ncurves = sizeof piece_cp / sizeof *piece_cp;
    1.20 +
    1.21 +static const vec2_t piece_cp[] = {
    1.22 +		{0, 0.25},
    1.23 +		{1, 0.25},	// mid0
    1.24 +		{2, 0.5},
    1.25 +		{2.5, 0.5},	// mid1
    1.26 +		{3, 0.5},
    1.27 +		{4, 0.5},	// mid2
    1.28 +		{4, 0},
    1.29 +		{4, -0.5},	// mid3
    1.30 +		{3, -0.5},
    1.31 +		{2.5, -0.5}, // mid4
    1.32 +		{0, -0.5}
    1.33 +};
    1.34 +static const BezCurve piece_curve = {sizeof piece_cp / sizeof *piece_cp, (vec2_t*)piece_cp, 0.25 * PIECE_RAD};
    1.35 +
    1.36  
    1.37  static Vector2 piece_revol(float u, float v, void *cls)
    1.38  {
    1.39 +	BezCurve *curve = (BezCurve*)cls;
    1.40 +	int nseg = (curve->numcp - 1) / 2;
    1.41 +
    1.42  	if(v >= 1.0) v = 1.0 - 1e-6;
    1.43 -	int idx = std::min((int)(v * piece_ncurves), piece_ncurves - 1);
    1.44 -	float t = fmod(v * (float)piece_ncurves, 1.0);
    1.45 +	int cidx = std::min((int)(v * nseg), nseg - 1);
    1.46 +	float t = fmod(v * (float)nseg, 1.0);
    1.47  
    1.48 -	Vector2 res;
    1.49 -	for(int i=0; i<2; i++) {
    1.50 -		float mid = piece_cp[idx][1][i];
    1.51 -		res[i] = bezier(piece_cp[idx][0][i], mid, mid, piece_cp[idx][2][i], t);
    1.52 -	}
    1.53 -	return res * 0.25 * PIECE_RAD;
    1.54 +	const vec2_t *cp = curve->cp + cidx * 2;
    1.55 +
    1.56 +	float resx = bezier(cp[0].x, cp[1].x, cp[1].x, cp[2].x, t);
    1.57 +	float resy = bezier(cp[0].y, cp[1].y, cp[1].y, cp[2].y, t);
    1.58 +	return Vector2(resx * curve->scale, resy * curve->scale);
    1.59  }
    1.60  
    1.61  static Vector2 piece_revol_normal(float u, float v, void *cls)
    1.62  {
    1.63 +	BezCurve *curve = (BezCurve*)cls;
    1.64 +	int nseg = (curve->numcp - 1) / 2;
    1.65 +
    1.66  	if(v >= 1.0) v = 1.0 - 1e-6;
    1.67 -	int idx = std::min((int)(v * piece_ncurves), piece_ncurves - 1);
    1.68 -	float t = fmod(v * (float)piece_ncurves, 1.0);
    1.69 +	int cidx = std::min((int)(v * nseg), nseg - 1);
    1.70 +	float t = fmod(v * (float)nseg, 1.0);
    1.71 +
    1.72 +	const vec2_t *cp = curve->cp + cidx * 2;
    1.73 +	Vector2 cp0 = cp[0];
    1.74 +	Vector2 cp1 = cp[1];
    1.75 +	Vector2 cp2 = cp[2];
    1.76  
    1.77  	Vector2 pprev, pnext;
    1.78  	for(int i=0; i<2; i++) {
    1.79 -		float start = piece_cp[idx][0][i];
    1.80 -		float mid = piece_cp[idx][1][i];
    1.81 -		float end = piece_cp[idx][2][i];
    1.82 -
    1.83 -		pprev[i] = bezier(start, mid, mid, end, t - 0.05);
    1.84 -		pnext[i] = bezier(start, mid, mid, end, t + 0.05);
    1.85 +		pprev[i] = bezier(cp0[i], cp1[i], cp1[i], cp2[i], t - 0.05);
    1.86 +		pnext[i] = bezier(cp0[i], cp1[i], cp1[i], cp2[i], t + 0.05);
    1.87  	}
    1.88  
    1.89  	float tx = pnext.x - pprev.x;
    1.90 @@ -232,7 +250,7 @@
    1.91  	*/
    1.92  
    1.93  	Mesh *piece = new Mesh;
    1.94 -	gen_revol(piece, 18, 17, piece_revol, piece_revol_normal, 0);
    1.95 +	gen_revol(piece, 18, 17, piece_revol, piece_revol_normal, (void*)&piece_curve);
    1.96  
    1.97  	Object *opiece = new Object;
    1.98  	opiece->set_mesh(piece);