+/**\r
+ * Called when window is resized\r
+ * @param w New width\r
+ * @param h New height\r
+ */\r
+void windowReshape(int w, int h) {\r
+ glViewport(0, 0, (GLsizei) w, (GLsizei) h);\r
+ glMatrixMode(GL_PROJECTION);\r
+ glLoadIdentity();\r
+ if (w <= h) \r
+ glOrtho(near, far, near*(GLfloat)h/(GLfloat)w,\r
+ far*(GLfloat)h/(GLfloat)w, near, far);\r
+ else\r
+ glOrtho(near*(GLfloat)w/(GLfloat)h,\r
+ far*(GLfloat)w/(GLfloat)h, near, far, near, far);\r
+ glMatrixMode(GL_MODELVIEW); \r
+ glLoadIdentity();\r
+}\r
+\r
+/**\r
+ * Called when mouse event occurs\r
+ * @param btn Mouse button\r
+ * @param state State of mouse button\r
+ * @param x Mouse x position\r
+ * @param y Mouse y position\r
+ */\r
+/*void mouse(int btn, int state, int x, int y) {\r
+ \r
+}*/\r
+static void\r
+mouse(int button, int state, int x, int y)\r
+{\r
+ if (button == GLUT_LEFT_BUTTON) {\r
+ if (state == GLUT_DOWN) {\r
+ moving = 1;\r
+ startx = x;\r
+ starty = y;\r
+ }\r
+ if (state == GLUT_UP) {\r
+ moving = 0;\r
+ }\r
+ }\r
+ if (button == GLUT_MIDDLE_BUTTON) {\r
+ if (state == GLUT_DOWN) {\r
+ lightMoving = 1;\r
+ lightStartX = x;\r
+ lightStartY = y;\r
+ }\r
+ if (state == GLUT_UP) {\r
+ lightMoving = 0;\r
+ }\r
+ }\r
+}\r
+\r
+static void\r
+motion(int x, int y)\r
+{\r
+ if (moving) {\r
+ angle = angle + (x - startx);\r
+ angle2 = angle2 + (y - starty);\r
+ startx = x;\r
+ starty = y;\r
+ glutPostRedisplay();\r
+ }\r
+ if (lightMoving) {\r
+ lightAngle += (x - lightStartX)/40.0;\r
+ lightHeight += (lightStartY - y)/20.0;\r
+ lightStartX = x;\r
+ lightStartY = y;\r
+ glutPostRedisplay();\r
+ }\r
+}\r
+\r
+void idle() {\r
+ angle = (int)(angle + 10) % 360;\r
+ //angle2 = (int)(angle2 + 10) % 360;\r
+ printf("Angle 1: %f, Angle 2: %f\n", angle, angle2);\r
+ sleep(1);\r
+ glutPostRedisplay();\r
+}\r
+\r
+\r
+int drawFloorRecurse = 5;\r
+\r
+void drawSquare(int recurseLevel, float x1, float y1, float x2, float y2) {\r
+\r
+ if ( drawFloorRecurse != recurseLevel ) {\r
+ float xm = (x1 + x2) / 2.0;\r
+ float ym = (y1 + y2) / 2.0;\r
+ int rnew = recurseLevel + 1;\r
+\r
+ // Split into four sub-quads\r
+ drawSquare(rnew, x1, y1, xm, ym);\r
+ drawSquare(rnew, x1, ym, xm, y2);\r
+ drawSquare(rnew, xm, ym, x2, y2);\r
+ drawSquare(rnew, xm, y1, x2, ym);\r
+\r
+ } else {\r
+ glBegin(GL_QUADS);\r
+ glVertex3f(x1, 0.0, y1);\r
+ glVertex3f(x1, 0.0, y2);\r
+ glVertex3f(x2, 0.0, y2);\r
+ glVertex3f(x2, 0.0, y1);\r
+ glEnd();\r
+ }\r
+\r
+}\r
+\r
+/**\r
+ * Draw a floor.\r
+ */\r
+void drawFloor() {\r
+ \r
+drawSquare(0, -100.0, -100.0, 100.0, 100.0);\r
+\r
+ /*if (useTexture) {\r
+ glDisable(GL_TEXTURE_2D);\r
+ }*/\r
+\r
+}\r
+\r
+/*void drawSquare(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) {\r
+ drawSquare(0, x1, y1, x2, y2);\r
+}*/\r
+\r
+/**\r
+ * Display function\r
+ */\r