All pastes #800135 Raw Edit

Miscellany

public text v1 · immutable
#800135 ·published 2007-11-28 03:59 UTC
rendered paste body
/*
Model's filename is: mymodel.dat

Commands
--------
1: Turn on the directional light.
2: Turn on the positional light.
0: Turn off the directional and positional light.

A: Increase the ambient light.
a: Decrease the ambient light.

D: Increase the diffuse light.
d: Decrease the diffuse light.

S: Increase the specular component of the positional light.
s: Decrease the specular component of the positional light.

H: Increase the shininess of the object.
h: Decrease the shininess of the object.

E: Increase the emissive light of the object.
e: Decrease the emissive light of the object.

+: Increase the cutoff angle of the positional light.
-: Decrease the cutoff angle of the positional light.

P, p: Rotate the positional light about the Z-axis that is on the XY principal plane.
O, o: Rotate the objects about the Y-axis about the center of objects.
*/
	
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#define  MAXLINE 161200

static GLint width, height;
static GLfloat LR = -3.0; 

GLfloat light1_position[] = {2.0, 0.0, 0.0, 1.0};
GLfloat light2_position[] = {-2.0, 0.0, 0.0, 1.0};

GLfloat ambient_light[] = {0.5, 0.5, 0.5, 1.0};
GLfloat diffuse_light[] = {0.5, 0.5, 0.5, 1.0};
GLfloat specular_light[] = { 0.5f, 0.5f, 0.5f, 1.0f};
GLfloat specular_property[] =  { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat emission_light[] = {0.5, 0.5, 0.5, 1.0};

GLfloat light1_diffuse_light[] = {1.0, 0.0, 0.0, 1.0};
GLfloat light2_diffuse_light[] = {0.0, 1.0, 0.0, 1.0};

GLint shininess = 5;

GLint count;
GLint numPoints;
FILE *fp;
float target[MAXLINE][3];
float maxX, maxY, maxZ, minX, minY, minZ, avgX, avgY, avgZ;

//Mouse movement stuff
static int      left_click = GLUT_UP;	
static int      right_click = GLUT_UP;	
static int      xold;					
static int      yold;					
static float    rotate_x = 30;			
static float    rotate_y = 15;			
static float    alpha = 0;				
static float    beta = 0;

//Object and viewport manipulation
GLfloat xRot, yRot, zRot;
GLfloat xPos, yPos, zPos;
GLfloat vpXPos, vpYPos, vpZPos;
GLfloat scale, vpScale;

/*
Prompts to enter a filename, and reads it if it is found
and displays an error message if not found
*/
void prompt_open_file()
{
	int flag = 1;
	int file_name_length;
	char file_name[256] = "mymodel.dat";
	
	while(flag)
	{
		printf("Enter file name : ");
		scanf("%s", file_name);
		if ((fp = fopen(file_name, "r")) == NULL)
			printf("\n%s file not found!\n", file_name);
		else
			flag = 0;
	}
}

/*
Reads the data from the filename and calculates
the model's minimum and maximum sizes
*/
void read_data()
{
	char buffer[256];
	int x, y, z;
	maxX = maxY = maxZ = -9999;
	minX = minY = minZ =  9999;
	avgX = avgY = avgZ =  0;
	numPoints = 0;

	while ((fgets(buffer, 256, fp)) != NULL)
	{
		if (buffer[0] == 'j' || buffer[0] == 'J')
		{
			target[count][0] = -9999;
			count++;
		}
		else
		{
			sscanf(buffer, "%d %d %d", &x, &y, &z);
			target[count][0] = x;
			target[count][1] = y;
			target[count][2] = z;
			
			avgX += x;
			avgY += y;
			avgZ += z;

			if (x > maxX)
				maxX = x;
			if (y > maxY)
				maxY = y;
			if (z > maxZ)
				maxZ = z;

			if (x < minX)
				minX = x;
			if (y < minY)
				minY = y;
			if (z < minZ)
				minZ = z;
			
			count++;
			numPoints++;
		}
	}

	
	avgX = avgX / numPoints;
	avgY = avgY / numPoints;
	avgZ = avgZ / numPoints;
	

	for (int i = 0; i < count; i++)
	{
		if (target[i][0] == -9999)
		{
			continue;
		}
		else
		{
			target[i][0] -= avgX;
			target[i][1] -= avgY;
			target[i][2] -= avgZ;
		}
	}
}

/*
Reading the file
*/
void read_file()
{
	prompt_open_file();
	read_data();
}

/*
Creating the model
*/
void createModel (void)
{      
	int i, flag;
	flag = 1;

	//Perform required manipulation
	glColor3f(0.0f, 1.0f, 0.0f);

	glTranslatef(xPos, yPos, zPos);

	glScalef(scale, scale, scale);

	glRotatef(xRot, 1.0f, 0.0f, 0.0f);
	glRotatef(yRot, 0.0f, 1.0f, 0.0f);
	glRotatef(zRot, 0.0f, 0.0f, 1.0f);

	glRotatef (beta, 1, 0, 0);
	glRotatef (alpha, 0, 1, 0);

	//Create the model based on the information read in
	glLineWidth(1.0);
	for (i = 0; i < count; i++)
	{
		if (target[i][0] == -9999)
		{
			flag = 0;
		}
		else
		{
			if (flag == 1)
			{
				glBegin(GL_POLYGON);
				glVertex3f(target[i - 1][0], target[i - 1][1], target[i - 1][2]);
				glVertex3f(target[i][0], target[i][1], target[i][2]);
				glEnd();
			}
			else    flag = 1;
		}
	}
}


/***TEST***/


void other_init()
{
	glClearColor (0.0, 0.0, 0.0, 0.0);
	glShadeModel (GL_SMOOTH);
	glMatrixMode(GL_MODELVIEW);

	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient_light);
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse_light);

	//Directional Light
	glLoadIdentity();
	glLightfv(GL_LIGHT0, GL_POSITION, light1_position);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_light);		

	//Positional Light
	glLoadIdentity();
	glLightfv(GL_LIGHT1, GL_POSITION, light2_position);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse_light);
	glLightfv(GL_LIGHT1, GL_AMBIENT, ambient_light);
	glLightfv(GL_LIGHT1, GL_SPECULAR, specular_light);
	glMaterialfv(GL_FRONT, GL_SPECULAR,specular_property);
	//glMaterialfv(GL_FRONT, GL_EMISSION, emission_light);

	glEnable(GL_LIGHTING);
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
	glMateriali(GL_FRONT,GL_SHININESS,shininess);
	glEnable(GL_DEPTH_TEST);
}

void display(void)
{
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glPushMatrix();	
	/*
	glTranslatef(-1.2, 1.2, 0.0);
	glutSolidTeapot(0.8);
	glTranslatef(2.0, -2.0, 0.0);
	glutSolidSphere (0.8, 20, 16);
	*/
	createModel(); //New
	glPopMatrix();
	glFlush ();
}

void keyboard(unsigned char key, int x, int y)
{
	switch (key)
	{
		//Light Switches
		case '0':
			glDisable(GL_LIGHT0);
			glDisable(GL_LIGHT1);
			break;
		case '1': 
			glEnable(GL_LIGHT0);
			break;
		case '2':
			glEnable(GL_LIGHT1);
			break;

		//Ambient Light
		case 'A':
			if (ambient_light[0] < 1.0) 
			{
				ambient_light[0] += 0.1;		
				ambient_light[1] += 0.1;
				ambient_light[2] += 0.1;
				glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient_light);
			}
			break;
		case 'a':
			if (ambient_light[0] >= 0.1) 
			{
				ambient_light[0] -= 0.1;
				ambient_light[1] -= 0.1;
				ambient_light[2] -= 0.1;
				glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient_light);
			}
			break;

		//Diffuse Light (Not working)
		case 'D':
			if (diffuse_light[0] < 1.0)
			{
				diffuse_light[0] += 0.1;
				diffuse_light[1] += 0.1;
				diffuse_light[2] += 0.1;
			}
			break;
		case 'd':
			if (diffuse_light[0] >= 0.1) 
			{
				diffuse_light[0] -= 0.1;
				diffuse_light[1] -= 0.1;
				diffuse_light[2] -= 0.1;
			}
			break;

		//Specular component **INCOMPLETE**
		case 's':
			break;
		case 'S':
			break;

		//Emissive light of the object
		case 'e':
			break;
		case 'E':
			break;

		//Shiness of the object
		case 'h':
			if (shininess > 2)
				shininess -= 2;		
			glMateriali(GL_FRONT,GL_SHININESS,shininess);
			break;
		case 'H':
			if (shininess < 126)
				shininess += 2;		
			glMateriali(GL_FRONT,GL_SHININESS,shininess);
			break;
		case 'Q':	case 'q': exit(1);
	}
	glutPostRedisplay();
}

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
	if (w <= h)
		glOrtho(LR, -LR, LR * (GLfloat) h / (GLfloat) w,
            -LR * (GLfloat) h / (GLfloat) w, LR, -LR);
    else
        glOrtho(LR * (GLfloat) w / (GLfloat) h,
            -LR * (GLfloat) w / (GLfloat) h, LR, -LR, LR, -LR);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	width = w;	height = h;
}

void init_window(int argc, char** argv)
{
    glutInit(&argc,argv);
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	width = height = 500;
	glutInitWindowSize(width, height); 
	glutInitWindowPosition(50, 50); 
	glutCreateWindow("Project 5"); 
}

void main(int argc, char** argv)
{
	read_file();
	fclose(fp);

	//Defaulting some values
	xRot = yRot = zRot = 0.0f;
	xPos = yPos = zPos = 0.0f;
	vpXPos = width/4;
	vpYPos = height/4;
	scale = 1.0f;
	vpScale = 1.0f;

    init_window(argc,argv);
	other_init();
	glutDisplayFunc(display); 
	glutKeyboardFunc(keyboard);
	glutReshapeFunc(reshape);
	glutMainLoop();
}