CE325 - 3D Programming

Assignment 1

Heightmap

Assignment 2

Uses keyframe animation with smoothing


Coloured Cubes Demo

WebGL Port

Source Code

#include <windows.h> 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <GL/glut.h> 
 
float distance = 8.0, angle = 0.0;
float lightPos = 0.0;
bool fullscreenMode = false, rotateGrid = true;
int windowWidth = 800, windowHeight = 600;
 
void dumpCubePos(void);
 
struct cube {
	float r, g, b, a;
	float x, y, z;
};
 
cube cubeArray[10 * 10 * 10];
 
void centerWindow(void) {
	int screenWidth = glutGet(GLUT_SCREEN_WIDTH);
	int screenHeight = glutGet(GLUT_SCREEN_HEIGHT);
 
	glutPositionWindow((screenWidth / 2) - (windowWidth / 2),
			(screenHeight / 2) - (windowHeight / 2));
}
 
void keyboard(unsigned char key, int x, int y) {
	switch (key) {
	case 27:
	case 'q':
	case 'Q':
		exit(EXIT_SUCCESS);
		break;
	case 'f':
	case 'F':
		fullscreenMode = !fullscreenMode;
		if (fullscreenMode)
			glutFullScreen();
		else {
			glutReshapeWindow(800, 600);
			centerWindow();
		}
		break;
	case 't':
	case 'T':
		dumpCubePos();
		break;
	case 'w':
	case 'W':
		distance-=0.5;
		break;
	case 's':
	case 'S':
		distance+=0.5;
		break;
	}
}
 
float xc, zc;
 
void idle(void) {
	//float xc, zc;
	angle = angle + 0.05;
	if (angle > 360.0)
		angle = 0.0;
	xc = distance * cos(angle / 180.0 * M_PI);
	zc = distance * sin(angle / 180.0 * M_PI);
	glLoadIdentity();
	gluLookAt(xc, 0.0, zc, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	glutPostRedisplay();
}
 
int count = 0, miniCount = 0;
 
void initCubes(void) {
	int count = 0;
 
	for (int x = 0; x < 10; x++) {
		for (int y = 0; y < 10; y++) {
			for (int z = 0; z < 10; z++) {
				cubeArray[count].r = (float) x / 10;
				cubeArray[count].g = (float) y / 10;
				cubeArray[count].b = (float) z / 10;
 
				cubeArray[count].x = x;
				cubeArray[count].y = y;
				cubeArray[count].z = z;
 
				count++;
			}
		}
	}
}
 
void dumpCubePos(void) {
	for (int k = 0; k < 1000; k++) {
		std::cout << cubeArray[k].x << " " << cubeArray[k].y << " "
				<< cubeArray[k].z << std::endl;
	}
}
 
void display(void) {
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0);
 
	float scale = 3.0;
	float prevX = 5.0f, prevY = 5.0f, prevZ = 5.0f;
 
	glPushMatrix();
	for (int k = 0; k < 1000; k++) {
		glTranslatef((prevX - cubeArray[k].x) / scale,
				(prevY - cubeArray[k].y) / scale,
				(prevZ - cubeArray[k].z) / scale);
 
		prevX = cubeArray[k].x;
		prevY = cubeArray[k].y;
		prevZ = cubeArray[k].z;
 
		glColor3f(cubeArray[k].r, cubeArray[k].g, cubeArray[k].b);
		glutSolidCube(0.2f);
		glColor3f(1.0, 1.0, 1.0);
		//glColor3f(0.0, 0.0, 0.0);
		glutWireCube(0.22f);
	}
	glPopMatrix();
 
	glutSwapBuffers();
}
 
void reshape(int w, int h) {
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(50.0, (GLfloat) w / (GLfloat) h, 3.0, 10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
 
int main(int argc, char *argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutCreateWindow(argv[0]);
	glMatrixMode(GL_PROJECTION);
	glEnable(GL_DEPTH_TEST);
 
	glClearColor(0.0, 0.0, 0.0, 0.0);
	//glClearColor(1.0, 1.0, 1.0, 0.0);
	glutReshapeWindow(windowWidth, windowHeight);
 
	glLoadIdentity();
	gluPerspective(50.0, 1.0, 3.0, 10.0);
	glMatrixMode(GL_MODELVIEW);
	glutKeyboardFunc(keyboard);
	glutDisplayFunc(display);
	glutIdleFunc(idle);
	glutReshapeFunc(reshape);
	centerWindow(); //Center window
	initCubes();
	glutMainLoop();
	return EXIT_SUCCESS;
}