2 * CITS2231 Graphics Scene Editor
\r
3 * @author Ashley Tyndall (20915779)
\r
12 #include <GL/glut.h>
\r
16 #include "globals.h"
\r
23 * Event hander for main menu events
\r
24 * @param id ID of menu item selected
\r
26 void processMainEvents(int id) {
\r
28 case M_ROTATE_MOVE_CAMERA:
\r
32 case M_POSITION_SCALE:
\r
36 case M_ROTATION_TEXTURE_SCALE:
\r
47 * Event hander for materials menu events
\r
48 * @param id ID of menu item selected
\r
50 void processMaterialEvents(int id) {
\r
52 case M_MATERIAL_ALL_RGB:
\r
56 case M_MATERIAL_AMBIENT_RGB:
\r
60 case M_MATERIAL_DIFFUSE_RGB:
\r
64 case M_MATERIAL_SPECULAR_RGB:
\r
68 case M_MATERIAL_ALL_ADSS:
\r
72 case M_MATERIAL_RED_ADSS:
\r
76 case M_MATERIAL_GREEN_ADSS:
\r
80 case M_MATERIAL_BLUE_ADSS:
\r
88 * Event hander for light menu events
\r
89 * @param id ID of menu item selected
\r
91 void processLightEvents(int id) {
\r
93 case M_LIGHT_MOVE_LIGHT_1:
\r
97 case M_LIGHT_RGBALL_LIGHT_1:
\r
101 case M_LIGHT_MOVE_LIGHT_2:
\r
105 case M_LIGHT_RGBALL_LIGHT_2:
\r
113 * Event hander for object menu events
\r
114 * @param id ID of object selected
\r
116 void processObjectEvents(int id) {
\r
121 * Event hander for texture menu events
\r
122 * @param id ID of texutre selected
\r
124 void processTextureEvents(int id) {
\r
129 * Event hander for ground texture menu events
\r
130 * @param id ID of ground texture selected
\r
132 void processGTextureEvents(int id) {
\r
137 * Creates menu for program
\r
140 // Construct material menu
\r
141 int materialMenu = glutCreateMenu(processMaterialEvents);
\r
142 glutAddMenuEntry("All R/G/B", M_MATERIAL_ALL_RGB);
\r
143 glutAddMenuEntry("Ambient R/G/B", M_MATERIAL_AMBIENT_RGB);
\r
144 glutAddMenuEntry("Diffuse R/G/B", M_MATERIAL_DIFFUSE_RGB);
\r
145 glutAddMenuEntry("Specular R/G/B", M_MATERIAL_SPECULAR_RGB);
\r
146 glutAddMenuEntry("All Amb/Diff/Spec/Shine", M_MATERIAL_ALL_ADSS);
\r
147 glutAddMenuEntry("Red Amb/Diff/Spec/Shine", M_MATERIAL_RED_ADSS);
\r
148 glutAddMenuEntry("Green Amb/Diff/Spec/Shine", M_MATERIAL_GREEN_ADSS);
\r
149 glutAddMenuEntry("Blue Amb/Diff/Spec/Shine", M_MATERIAL_BLUE_ADSS);
\r
151 // Construct light menu
\r
152 int lightMenu = glutCreateMenu(processLightEvents);
\r
153 glutAddMenuEntry("Move Light 1", M_LIGHT_MOVE_LIGHT_1);
\r
154 glutAddMenuEntry("R/G/B/All Light 1", M_LIGHT_RGBALL_LIGHT_1);
\r
155 glutAddMenuEntry("Move Light 2", M_LIGHT_MOVE_LIGHT_2);
\r
156 glutAddMenuEntry("R/G/B/All Light 2", M_LIGHT_RGBALL_LIGHT_2);
\r
158 // Construct object menu
\r
159 int objectMenu = makeSubmenuFromArray( objectMenuEntries, NMESH, processObjectEvents );
\r
161 // Construct texture / ground texture menus
\r
162 int textureMenu = makeSubmenuFromArray( textureMenuEntries, NTEXTURE, processTextureEvents );
\r
163 int gTextureMenu = makeSubmenuFromArray( textureMenuEntries, NTEXTURE, processGTextureEvents );
\r
165 // Construct main menu
\r
166 glutCreateMenu(processMainEvents);
\r
167 //glutAddMenuEntry("Rotate/Move Camera", M_ROTATE_MOVE_CAMERA);
\r
168 //glutAddSubMenu("Add object", objectMenu);
\r
169 //glutAddMenuEntry("Position/Scale", M_POSITION_SCALE);
\r
170 //glutAddMenuEntry("Rotation/Texture Scale", M_ROTATION_TEXTURE_SCALE);
\r
171 //glutAddSubMenu("Material", materialMenu);
\r
172 //glutAddSubMenu("Texture", textureMenu);
\r
173 //glutAddSubMenu("Ground texture", gTextureMenu);
\r
174 //glutAddSubMenu("Lights", lightMenu);
\r
175 glutAddMenuEntry("Exit", M_EXIT);
\r
177 // Bind to right mouse button
\r
178 glutAttachMenu(GLUT_RIGHT_BUTTON);
\r
182 * Called when window is resized
\r
183 * @param w New width
\r
184 * @param h New height
\r
186 void windowReshape(int w, int h) {
\r
187 glViewport(0, 0, (GLsizei) w, (GLsizei) h);
\r
188 glMatrixMode(GL_PROJECTION);
\r
191 glOrtho(near, far, near*(GLfloat)h/(GLfloat)w,
\r
192 far*(GLfloat)h/(GLfloat)w, near, far);
\r
194 glOrtho(near*(GLfloat)w/(GLfloat)h,
\r
195 far*(GLfloat)w/(GLfloat)h, near, far, near, far);
\r
196 glMatrixMode(GL_MODELVIEW);
\r
201 * Called when mouse event occurs
\r
202 * @param btn Mouse button
\r
203 * @param state State of mouse button
\r
204 * @param x Mouse x position
\r
205 * @param y Mouse y position
\r
207 void mouse(int button, int state, int x, int y) {
\r
208 if (button == GLUT_LEFT_BUTTON) {
\r
209 if (state == GLUT_DOWN) {
\r
214 if (state == GLUT_UP) {
\r
218 if (button == GLUT_MIDDLE_BUTTON) {
\r
219 if (state == GLUT_DOWN) {
\r
224 if (state == GLUT_UP) {
\r
231 * Called when motion event occurs
\r
232 * @param x Mouse x position
\r
233 * @param y Mouse y position
\r
235 void motion(int x, int y) {
\r
237 angle = angle + (x - startx);
\r
238 angle2 = angle2 + (y - starty);
\r
241 glutPostRedisplay();
\r
244 lightAngle += (x - lightStartX)/40.0;
\r
245 lightHeight += (lightStartY - y)/20.0;
\r
248 glutPostRedisplay();
\r
256 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
\r
259 0.0, 0.0, 10.0, /* eye is at (x,y,z) */
\r
260 0.0, 0.0, 0.0, /* center is at (x,y,z) */
\r
261 0.0, 1.0, 0.0 /* up is in postivie Y direction */
\r
265 // **NOTE: Currently this rotation function is all that moves the camera off
\r
266 // the flat surface. Need to integrate function into gluLookAt
\r
267 glRotatef(30.0, 1.0, 0.0, 0.0);
\r
269 /* Reposition the light source. */
\r
270 lightPosition[0] = 12*cos(lightAngle);
\r
271 lightPosition[1] = lightHeight;
\r
272 lightPosition[2] = 12*sin(lightAngle);
\r
273 lightPosition[3] = 0.0;
\r
277 /* Perform scene rotations based on user mouse input. */
\r
278 glRotatef(angle, 0.0, 1.0, 0.0);
\r
279 //glRotatef(angle2, 1.0, 0.0, 0.0); **NOTE: Only one degree of freedom
\r
281 glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
\r
287 // Draw teapot for a test object
\r
289 glTranslatef(0.0, 0.5, 0.0); // **NOTE: Teapot does not rest on surface
\r
290 glColor3f(0.5, 0.5, 0.5);
\r
291 glutSolidTeapot(1);
\r
294 // Draw a white ball over the light source
\r
296 glDisable(GL_LIGHTING);
\r
297 glColor3f(1.0, 1.0, 1.0);
\r
298 glTranslatef(lightPosition[0], lightPosition[1], lightPosition[2]);
\r
299 glutSolidSphere(1.0, 50, 50);
\r
300 glEnable(GL_LIGHTING);
\r
309 * init function; sets initial OpenGL state
\r
312 glMatrixMode(GL_PROJECTION);
\r
316 60.0, /* field of view in degree */
\r
317 1.0, /* aspect ratio */
\r
323 glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
\r
324 glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
\r
325 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
\r
326 glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);
\r
327 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, glightmodel);
\r
328 glEnable(GL_LIGHT0);
\r
329 glEnable(GL_LIGHTING);
\r
330 glEnable(GL_COLOR_MATERIAL);
\r
331 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
\r
332 glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, specular0);
\r
333 glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, emission0);
\r
337 glMatrixMode(GL_MODELVIEW);
\r
343 * @param argc Number of arguments
\r
344 * @param argv Array of arguments
\r
345 * @return Program exit code
\r
347 int main(int argc, char **argv) {
\r
349 strcpy(dataDir, argv[1]);
\r
350 else if(opendir(dirDefault1))
\r
351 strcpy(dataDir, dirDefault1);
\r
352 else if(opendir(dirDefault2))
\r
353 strcpy(dataDir, dirDefault2);
\r
354 else fileErr(dirDefault1);
\r
356 for(int i=0; i<NMESH; i++) meshes[i]=NULL;
\r
357 for(int i=0; i<NTEXTURE; i++) textures[i]=NULL;
\r
359 glutInit(&argc, argv);
\r
361 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
\r
363 glutInitWindowSize(500, 500);
\r
364 glutCreateWindow("Scene Editor");
\r
366 glShadeModel(GL_SMOOTH); // Enables Smooth Shading
\r
367 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
\r
368 glClearDepth(1.0f); // Depth Buffer Setup
\r
369 glEnable(GL_DEPTH_TEST); // Enables Depth Testing
\r
370 glDepthFunc(GL_LEQUAL); // the type
\r
371 glEnable(GL_CULL_FACE);
\r
372 glEnable(GL_TEXTURE_2D);
\r
375 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
\r
377 glutReshapeFunc(windowReshape);
\r
378 glutDisplayFunc(display);
\r
379 glutMouseFunc(mouse);
\r
380 glutMotionFunc(motion);
\r