#include "dmcgl.h"
void stretch(double *x, double *y, double *z, double r)
{
double length;
length = vector_length(*x,*y,*z);
(*x)=(*x)/length*r;
(*y)=(*y)/length*r;
(*z)=(*z)/length*r;
}
void save_buffer_to_ppm(unsigned char *buffer, int width, int height,\
char *filename)
{
FILE *f;
f = fopen( filename, "w" );
if (f) {
int i, x, y;
fprintf(f,"P6\n");
fprintf(f,"# ppm-file\n");
fprintf(f,"%i %i\n", width, height);
fprintf(f,"255\n");
fclose(f);
f = fopen( filename, "ab" );
for (y=height-1; y>=0; y--) {
for (x=0; x<width; x++) {
i = (y*width + x) * 4;
fputc(buffer[i], f);
fputc(buffer[i+1], f);
fputc(buffer[i+2], f);
}
}
fclose(f);
}
}
int read_ppm_to_buffer(unsigned char **buffer, int *width, int *height,\
const char *filename)
{
FILE *f;
f = fopen( filename, "r" );
if (f) {
int i, x, y;
char *temp;
fscanf(f,"P6\n");
temp=(char *)malloc(255);
fgets(temp,255,f);
free(temp);
fscanf(f,"%i %i\n", width, height);
fscanf(f,"255\n");
*buffer=(unsigned char *)malloc((*width)*(*height)*4);
if(*buffer==NULL){
fprintf(stderr,"read_buffer_to_ppm failed on malloc\n");
fflush(stderr);
exit(1);
}
for (y=(*height)-1; y>=0; y--) {
for (x=0; x<(*width); x++) {
i = (y*(*width) + x) * 4;
(*buffer)[i]=fgetc(f);
(*buffer)[i+1]=fgetc(f);
(*buffer)[i+2]=fgetc(f);
}
}
fclose(f);
return(1);
} else return(0);
}
int generate_checkerboard_texture(unsigned char **buffer, int *width, int *height)
{
int i = 0;
*width = 2;
*height = 2;
*buffer=(unsigned char *)malloc((*width)*(*height)*4);
if(*buffer==NULL){
fprintf(stderr,"read_buffer_to_ppm failed on malloc\n");
fflush(stderr);
exit(1);
}
(*buffer)[i++] = 255;
(*buffer)[i++] = 0;
(*buffer)[i++] = 0;
(*buffer)[i++] = 0;
(*buffer)[i++] = 0;
(*buffer)[i++] = 255;
(*buffer)[i++] = 0;
(*buffer)[i++] = 0;
(*buffer)[i++] = 0;
(*buffer)[i++] = 0;
(*buffer)[i++] = 255;
(*buffer)[i++] = 0
;
(*buffer)[i++] = 255;
(*buffer)[i++] = 255;
(*buffer)[i++] = 255;
(*buffer)[i++] = 0;
}
void xyz2rtp(double *r, double *t, double *p, double x, double y, double z)
{
*r=vector_length(x,y,z);
*p=asin(z/(*r));
*t=atan2(y,x);
}
void rtp2xyz(double *x, double *y, double *z, double r, double t, double p)
{
*z=sin(p)*r;
*x=cos(t)*cos(p)*r;
*y=sin(t)*cos(p)*r;
}
double vector_length(double x, double y, double z)
{
return(sqrt(x*x+y*y+z*z));
}
void rand_vector(double *x, double *y, double *z)
{
int done;
done=0;
while(!done){
*x=randfn1();
*y=randfn1();
*z=randfn1();
if(vector_length(*x,*y,*z)<=1) done=1;
}
}
void draw_line_cube(double r)
{
glPushMatrix();
glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex3f(r,r,r);
glVertex3f(r,r,-r);
glEnd();
glBegin(GL_LINES);
glVertex3f(r,r,r);
glVertex3f(r,-r,r);
glEnd();
glBegin(GL_LINES);
glVertex3f(r,r,r);
glVertex3f(-r,r,r);
glEnd();
glBegin(GL_LINES);
glVertex3f(-r,-r,-r);
glVertex3f(-r,-r,r);
glEnd();
glBegin(GL_LINES);
glVertex3f(-r,-r,-r);
glVertex3f(-r,r,-r);
glEnd();
glBegin(GL_LINES);
glVertex3f(-r,-r,-r);
glVertex3f(r,-r,-r);
glEnd();
glBegin(GL_LINES);
glVertex3f(-r,-r,r);
glVertex3f(r,-r,r);
glEnd();
glBegin(GL_LINES);
glVertex3f(-r,-r,r);
glVertex3f(-r,r,r);
glEnd();
glBegin(GL_LINES);
glVertex3f(r,r,-r);
glVertex3f(-r,r,-r);
glEnd();
glBegin(GL_LINES);
glVertex3f(r,r,-r);
glVertex3f(r,-r,-r);
glEnd();
glBegin(GL_LINES);
glVertex3f(-r,r,-r);
glVertex3f(-r,r,r);
glEnd();
glBegin(GL_LINES);
glVertex3f(r,-r,-r);
glVertex3f(r,-r,r);
glEnd();
glPopMatrix();
}
void draw_diamond()
{
GLfloat va[3]={0.0,+1.0,0.0};
GLfloat vb[3]={-1.0,0.0,0.0};
GLfloat vc[3]={0.0,0.0,-1.0};
GLfloat vd[3]={+1.0,0.0,0.0};
GLfloat ve[3]={0.0,0.0,+1.0};
GLfloat vf[3]={0.0,-1.0,0.0};
glEnable(GL_COLOR_MATERIAL);
glColor3f(1, 0, 0);
glBegin(GL_POLYGON);
glNormal3fv(va);
glVertex3fv(va);
glNormal3fv(vb);
glVertex3fv(vb);
glNormal3fv(vc);
glVertex3fv(vc);
glEnd();
glColor3f(0, 1, 0);
glBegin(GL_POLYGON);
glNormal3fv(va);
glVertex3fv(va);
glNormal3fv(vd);
glVertex3fv(vd);
glNormal3fv(vc);
glVertex3fv(vc);
glEnd();
glColor3f(0, 0, 1);
glBegin(GL_POLYGON);
glNormal3fv(va);
glVertex3fv(va);
glNormal3fv(vb);
glVertex3fv(vb);
glNormal3fv(ve);
glVertex3fv(ve);
glEnd();
glColor3f(1, 0, 1);
glBegin(GL_POLYGON);
glNormal3fv(va);
glVertex3fv(va);
glNormal3fv(vd);
glVertex3fv(vd);
glNormal3fv(ve);
glVertex3fv(ve);
glEnd();
glColor3f(1, 0, 0);
glBegin(GL_POLYGON);
glNormal3fv(vf);
glVertex3fv(vf);
glNormal3fv(vb);
glVertex3fv(vb);
glNormal3fv(vc);
glVertex3fv(vc);
glEnd();
glColor3f(0, 1, 0);
glBegin(GL_POLYGON);
glNormal3fv(vf);
glVertex3fv(vf);
glNormal3fv(vd);
glVertex3fv(vd);
glNormal3fv(vc);
glVertex3fv(vc);
glEnd();
glColor3f(0, 0, 1);
glBegin(GL_POLYGON);
glNormal3fv(vf);
glVertex3fv(vf);
glNormal3fv(vb);
glVertex3fv(vb);
glNormal3fv(ve);
glVertex3fv(ve);
glEnd();
glColor3f(1, 0, 1);
glBegin(GL_POLYGON);
glNormal3fv(vf);
glVertex3fv(vf);
glNormal3fv(vd);
glVertex3fv(vd);
glNormal3fv(ve);
glVertex3fv(ve);
glEnd();
glDisable(GL_COLOR_MATERIAL);
}
void fbnSolidTexturedCube(double size)
{
static GLfloat n[6][3] =
{
{-1.0, 0.0, 0.0},
{0.0, 1.0, 0.0},
{1.0, 0.0, 0.0},
{0.0, -1.0, 0.0},
{0.0, 0.0, 1.0},
{0.0, 0.0, -1.0}
};
static GLint faces[6][4] =
{
{0, 1, 2, 3},
{3, 2, 6, 7},
{7, 6, 5, 4},
{4, 5, 1, 0},
{5, 6, 2, 1},
{7, 4, 0, 3}
};
GLfloat v[8][3];
GLint i;
v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
for (i = 5; i >= 0; i--) {
glBegin(GL_QUADS);
glNormal3fv(&n[i][0]);
glTexCoord2f(1.0, 0.0);
glVertex3fv(&v[faces[i][0]][0]);
glTexCoord2f(0.0, 0.0);
glVertex3fv(&v[faces[i][1]][0]);
glTexCoord2f(0.0, 1.0);
glVertex3fv(&v[faces[i][2]][0]);
glTexCoord2f(1.0, 1.0);
glVertex3fv(&v[faces[i][3]][0]);
glEnd();
}
}
void copy_vertex(GLfloat *dest, GLfloat *src)
{
dest[0]=src[0];
dest[1]=src[1];
dest[2]=src[2];
}
void set_vertex(GLfloat *dest, GLfloat x, GLfloat y, GLfloat z)
{
dest[0]=x;
dest[1]=y;
dest[2]=z;
}
float randf01()
{
return((float)(rand()/(RAND_MAX+1.0)));
}
float randfn1()
{
return(2*((float)(rand()/(RAND_MAX+1.0)))-1);
}