X-Git-Url: https://git.ucc.asn.au/?p=atyndall%2Fcits2231.git;a=blobdiff_plain;f=scene.c;h=914f3a6526010fd36e9d5f9b33f0945646bbb8b6;hp=04818827bd925b7b809f3b05fec64dd1f1bda0dd;hb=6bc2cf448a219d515341068e044b9610e060c747;hpb=1c41675b235ffe68ffb6238bb0a252261360ae04 diff --git a/scene.c b/scene.c index 0481882..914f3a6 100644 --- a/scene.c +++ b/scene.c @@ -110,13 +110,6 @@ char *dirDefault2 = "/cslinux/examples/CITS2231/project-files/models-textures"; char dataDir[200]; // Stores the directory name for the meshes and textures. -static GLfloat floorVertices[4][3] = { - { -1000.0, 0.0, 1000.0 }, - { 1000.0, 0.0, 1000.0 }, - { 1000.0, 0.0, -1000.0 }, - { -1000.0, 0.0, -1000.0 }, -}; - static GLfloat lightColor[] = {1.0, 1.0, 1.0, 1.0}; // White light static GLfloat lightPosition[4]; @@ -125,10 +118,32 @@ int lightMoving = 0, lightStartX, lightStartY; /* Time varying or user-controled variables. */ static float jump = 0.0; -static float lightAngle = 0.0, lightHeight = 20; +static float lightAngle = 0.0, lightHeight = 5; GLfloat angle = -150; /* in degrees */ GLfloat angle2 = 30; /* in degrees */ +/* Near and far parameters */ +GLfloat near = -100; +GLfloat far = 100; + +/* Zoom factor for mouse movements */ +GLfloat zoomFactor = 1.0; + +/* Recursion level for floor drawing */ +int drawFloorRecurse = 5; + +/* Size of floor, from -n to n */ +int floorSize = 100; + +/* Light 0 parameters */ +GLfloat diffuse0[] = {1.0, 1.0, 1.0, 1.0}; +GLfloat ambient0[] = {0.0, 0.0, 0.0, 1.0}; +GLfloat specular0[] = {1.0, 1.0, 1.0, 1.0}; +GLfloat emission0[] = {0.0, 0.0, 0.0, 0.0}; +GLfloat light0_pos[] ={1.0, 1.0, 0,0, 1.0}; +GLfloat glightmodel[] = {0.2,0.2,0.2,1}; + + /** * Prints out error message when file cannot be read * @param fileName Name of file that could not be read @@ -484,11 +499,8 @@ void makeMenu() { * @param h New height */ void windowReshape(int w, int h) { - GLdouble near = -1000.0; - GLdouble far = 1000.0; - glViewport(0, 0, (GLsizei) w, (GLsizei) h); - glMatrixMode(GL_PROJECTION); + /*glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(near, far, near*(GLfloat)h/(GLfloat)w, @@ -497,7 +509,7 @@ void windowReshape(int w, int h) { glOrtho(near*(GLfloat)w/(GLfloat)h, far*(GLfloat)w/(GLfloat)h, near, far, near, far); glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); + glLoadIdentity();*/ } /** @@ -507,12 +519,7 @@ void windowReshape(int w, int h) { * @param x Mouse x position * @param y Mouse y position */ -/*void mouse(int btn, int state, int x, int y) { - -}*//* -static void -mouse(int button, int state, int x, int y) -{ +void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON) { if (state == GLUT_DOWN) { moving = 1; @@ -535,9 +542,12 @@ mouse(int button, int state, int x, int y) } } -static void -motion(int x, int y) -{ +/** + * Called when motion event occurs + * @param x Mouse x position + * @param y Mouse y position + */ +void motion(int x, int y) { if (moving) { angle = angle + (x - startx); angle2 = angle2 + (y - starty); @@ -552,79 +562,72 @@ motion(int x, int y) lightStartY = y; glutPostRedisplay(); } -}*/ - -void idle() { - angle = (int)(angle + 10) % 360; - //angle2 = (int)(angle2 + 10) % 360; - printf("Angle 1: %f, Angle 2: %f\n", angle, angle2); - sleep(25); - glutPostRedisplay(); } /** - * Draw a floor. + * Recursive function to draw a square by drawing smaller and smaller + * divisions of the square, determined by drawFloorRecurse. + * @param recurseLevel Current level of recursion, only pass 0 + * @param x1 top-left x + * @param z1 top-left z + * @param x2 bottom-left x + * @param z2 bottom-left z */ -void drawFloor() { - glDisable(GL_LIGHTING); - - //if (useTexture) { - // glEnable(GL_TEXTURE_2D); - //} - - /*glBegin(GL_QUADS); - glTexCoord2f(0.0, 0.0); - glVertex3fv(floorVertices[0]); - glTexCoord2f(0.0, 16.0); - glVertex3fv(floorVertices[1]); - glTexCoord2f(16.0, 16.0); - glVertex3fv(floorVertices[2]); - glTexCoord2f(16.0, 0.0); - glVertex3fv(floorVertices[3]); - glEnd();*/ - -drawSquare(0, -10.0, -10.0, 10.0, 10.0); - - /*if (useTexture) { - glDisable(GL_TEXTURE_2D); - }*/ - - glEnable(GL_LIGHTING); -} - -int drawFloorRecurse = 2; -/*void drawSquare(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { - drawSquare(0, x1, y1, x2, y2); -}*/ - -void drawSquare(int recurseLevel, float x1, float y1, float x2, float y2) { - - printf("%d, %d, %d, %d\n", x1, y2, x2, y2); +void drawSquare(int recurseLevel, float x1, float z1, float x2, float z2) { if ( drawFloorRecurse != recurseLevel ) { + // Calculate middle points float xm = (x1 + x2) / 2.0; - float ym = (y1 + y2) / 2.0; + float zm = (z1 + z2) / 2.0; + + // Increment recursion level int rnew = recurseLevel + 1; - printf("Recursing to level %d\n", rnew); // Split into four sub-quads - drawSquare(rnew, x1, y1, xm, ym); - drawSquare(rnew, x1, ym, xm, y2); - drawSquare(rnew, xm, ym, x2, y2); - drawSquare(rnew, xm, y1, x2, ym); - + drawSquare(rnew, x1, z1, xm, zm); + drawSquare(rnew, x1, zm, xm, z2); + drawSquare(rnew, xm, zm, x2, z2); + drawSquare(rnew, xm, z1, x2, zm); + } else { - printf("Drawing (%.10f, %.10f) -> (%.10f, %.10f)\n", x1, y2, x2, y2); + // Draw square. + // **NOTE: Is the polygon facing in the right direction? glBegin(GL_QUADS); - glVertex3f(x1, 0.0, y1); - glVertex3f(x1, 0.0, y2); - glVertex3f(x2, 0.0, y2); - glVertex3f(x2, 0.0, y1); + glVertex3f(x1, 0.0, z1); + glVertex3f(x1, 0.0, z2); + glVertex3f(x2, 0.0, z2); + glVertex3f(x2, 0.0, z1); glEnd(); } } +/** + * Draw a floor by calling the drawSquare recursion + */ +void drawFloor() { + drawSquare(0, -floorSize, -floorSize, floorSize, floorSize); +} + +/** + * Draw x, z axis on floor + */ +void drawLine() { + // **NOTE: fix function + glDisable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4ub( 0.0, 0.0, 0.0, 0.5 ); + + glBegin(GL_LINES); + glVertex3i( 10.0, 0.1, 10.0); + glVertex3i( -10.0, 0.1, -10.0); + glEnd(); + + glDisable(GL_BLEND); + glEnable(GL_TEXTURE_2D); +} + /** * Display function */ @@ -632,11 +635,16 @@ void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt( - 0.0, 0.0, 60.0, /* eye is at (x,y,z) */ + 0.0, 10.0, 10.0, /* eye is at (x,y,z) */ 0.0, 0.0, 0.0, /* center is at (x,y,z) */ 0.0, 1.0, 0.0 /* up is in postivie Y direction */ ); + + // **NOTE: Currently this rotation function is all that moves the camera off + // the flat surface. Need to integrate function into gluLookAt + glRotatef(30.0, 1.0, 0.0, 0.0); + /* Reposition the light source. */ lightPosition[0] = 12*cos(lightAngle); lightPosition[1] = lightHeight; @@ -644,31 +652,30 @@ void display() { lightPosition[3] = 0.0; glPushMatrix(); - /* Perform scene rotations based on user mouse input. */ - glRotatef(angle2, 1.0, 0.0, 0.0); + + /* Perform scene rotations based on user mouse input. */ glRotatef(angle, 0.0, 1.0, 0.0); + //glRotatef(angle2, 1.0, 0.0, 0.0); **NOTE: Only one degree of freedom glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); drawFloor(); - glDisable(GL_BLEND); - glPushMatrix(); + drawLine(); - //glTranslatef(0.0, 0.0, 0.0); - glutWireTeapot(30); // Draw teapot for test + // Draw teapot for a test object + glPushMatrix(); + glTranslatef(0.0, 0.5, 0.0); // **NOTE: Teapot does not rest on surface + glColor3f(0.5, 0.5, 0.5); + glutSolidTeapot(1); glPopMatrix(); + // Draw a white ball over the light source glPushMatrix(); glDisable(GL_LIGHTING); glColor3f(1.0, 1.0, 1.0); - - /* Draw a yellow ball at the light source. */ glTranslatef(lightPosition[0], lightPosition[1], lightPosition[2]); - glutSolidSphere(1.0, 5, 5); - + glutSolidSphere(1.0, 50, 50); glEnable(GL_LIGHTING); glPopMatrix(); @@ -685,18 +692,26 @@ void init() { glLoadIdentity(); gluPerspective( - 60.0, /* field of view in degree */ - 1.0, /* aspect ratio */ - -1000.0, /* Z near */ - 1000.0 /* Z far */ - ); - - glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); - glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor); - glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1); - glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05); + 60.0, /* field of view in degree */ + 1.0, /* aspect ratio */ + near, /* Z near */ + far /* Z far */ + ); + + + glLightfv(GL_LIGHT0, GL_POSITION, light0_pos); + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular0); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, glightmodel); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); + glEnable(GL_COLOR_MATERIAL); + glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ); + glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, specular0); + glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, emission0); + + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -740,9 +755,8 @@ int main(int argc, char **argv) { glutReshapeFunc(windowReshape); glutDisplayFunc(display); - //glutMouseFunc(mouse); - //glutMotionFunc(motion); - glutIdleFunc(idle); + glutMouseFunc(mouse); + glutMotionFunc(motion); makeMenu();