#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>


#define D_PI 2*3.14159265358979


/* Draw a torus */
int main (int argc, char **argv)
{
	int i=0, j, k, nb_pts, numc = 50, numt = 200, indic = 0;
	double s, t, x1, y1, z1, x2, y2, z2, x, y, z, tex, x_0 = 0.0, y_0 = 0.0, z_0 = 0.0;
	double alpha=0, beta=0, Ray = 0.15, r = 0.015, rr;
	char fsortie[100];
	
	while ( ++i < argc )
	{
		if ( strcmp( argv[i], "-X" ) == 0 )		//nombre de points de la section du tore
			numc = atof( argv[++i] );
		if (strcmp(argv[i], "-Y") == 0)			//nombre de points le long du tore
			numt = atof(argv[++i]);
		if ( strcmp( argv[i], "-Xc" ) == 0 )	//coordonnée en X du centre du tore
			x_0 = atof( argv[++i] );
		if (strcmp(argv[i], "-Yc") == 0)		//coordonnée en Y du centre du tore
			y_0 = atof(argv[++i]);
		if ( strcmp( argv[i], "-Zc" ) == 0 )	//coordonnée en Z du centre du tore
			z_0 = atof( argv[++i] );
		if (strcmp(argv[i], "-R") == 0)			//rayon du tore
			Ray = atof(argv[++i]);
		if (strcmp(argv[i], "-r") == 0)			//rayon de la section du tore
			r = atof(argv[++i]);
		if (strcmp(argv[i], "-a") == 0)			//angle de rotation autou de l'axe Oy
			alpha = atof(argv[++i]);
		if (strcmp(argv[i], "-b") == 0)			//angle de rotation autou de l'axe Ox
			beta = atof(argv[++i]);
		if ( strcmp( argv[i], "-fout" ) == 0 )	//fichier de sortie
		{
			strcpy( fsortie, argv[++i] );
			indic += 1;
		}
	}
	if ( indic != 1 )
	{
		fprintf(stderr, "Usage complet : -R Ray -r r -X nb1 -Y nb2 -Xc xc -Yc yc -Zc zc -a alpha -b beta -fout output\n");
		fprintf(stderr, "Usage minimum : -fout output\n");
		fprintf(stderr, "      R	: rayon du tore\n");
		fprintf(stderr, "      r	: rayon de la section du tore\n");
		fprintf(stderr, "      nb1	: nombre de sommets de la section du tore\n");
		fprintf(stderr, "      nb2	: nombre de sommet de la longueur du tore\n");
		fprintf(stderr, "      xc, yc, zc	: coordonnees du centre du tore \n");
		fprintf(stderr, "      alpha	: angle d'orientation selon l'axe Y \n");
		fprintf(stderr, "      beta	: angle d'orientation selon l'axe X \n");
		fprintf(stderr, "      output	: fichier de sortie \n");
		exit( 1 );
	} 

	nb_pts = numc*numt*2;
	
	FILE *file;
	file = fopen(fsortie, "w");
	fprintf(file, "%d\n", nb_pts);
	
	for (i = 0; i < numc; i++) 
	{
		for (j = 0; j < numt; j++) 
		{
			for (k = 1; k >= 0; k--) 
			{
				s = (i + k) % numc;
				t = j % numt;

				//Calcul des points si le tore se trouvait en (x_0, y_0, z_0)
				x1 = (Ray+r*cos(s*D_PI/numc))*cos(t*D_PI/numt)+x_0;
				y1 = (Ray+r*cos(s*D_PI/numc))*sin(t*D_PI/numt)+y_0;
				z1 = r * sin(s * D_PI / numc)+z_0;
				
				//Rotation selon Ox
				x2 = x1;
				y2 = cos(beta)*y1-sin(beta)*z1;
				z2 = sin(beta)*y1+cos(beta)*z1;
				
				//Rotation selon Oy
				x = cos(alpha)*x2+sin(alpha)*z2;
				y = y2;
				z = -sin(alpha)*x2+cos(alpha)*z2;
				
				//Valeur de la texture
				rr = sqrt(x*x + y*y + z*z);
				tex = rr-1;
				//tex = 1-y/1.4;
				
				fprintf(file, "%f %f %f %f\n", x, y, z, tex);
			}
		}
	}
	fclose(file);
	
}