Implement proper movement and camera controls
[opengl.git] / main.cpp
similarity index 87%
rename from assignment1.cpp
rename to main.cpp
index 4676882fe80ec1c061ead0589e7e547714bf3052..503f469bba97524bf92b10a64164a8d4bdbed39d 100644 (file)
+++ b/main.cpp
@@ -34,7 +34,7 @@ void display() {
        for (int i = 0; i < 100; i++) {
 
                GLuint projId = glGetUniformLocation(progId, "projection");
-               glm::mat4 proj = glm::perspective(glm::radians(45.f), 1.33f, 0.01f, 100.f);
+               glm::mat4 proj = glm::perspective(glm::radians(45.f), 1.33f, 0.01f, 10000.f);
                glUniformMatrix4fv(projId, 1, GL_FALSE, glm::value_ptr(proj));
 
                GLuint viewId = glGetUniformLocation(progId, "view");
@@ -45,7 +45,7 @@ void display() {
                float d = (float)glutGet(GLUT_ELAPSED_TIME) * 0.001f;
                glm::mat4 model = glm::mat4(1.f);
 
-               model = glm::translate(model, glm::vec3(sin(i * 30) * 2, cos(i * 30) * 2, i * 2));
+               model = glm::translate(model, glm::vec3(sin(i * 30) * 10, cos(i * 30) * 10, i * 2));
                
                if (doRotate) {
                        model = glm::rotate(model, d * glm::radians(30.f), glm::vec3(0.f, 1.f, 0.f));
@@ -53,10 +53,10 @@ void display() {
                }
                
                if (doScale)
-                       model = glm::scale(model, glm::vec3(1.f, 0.3f + 0.7f * (1 + sin(d * (i + 3))), 1.f));
+                       model = glm::scale(model, glm::vec3(1.f, 0.7f + 0.7f * (1 + sin(d + (i + 3))), 1.f));
 
                if (doTranslate)
-                       model = glm::translate(model, glm::vec3(sin(d), cos(d), sin(d)));
+                       model = glm::translate(model, glm::vec3(sin(d + (i + 1)), cos(d + (i + -3)), sin(d + (i + 4))));
        
 
                glUniformMatrix4fv(modelId, 1, GL_FALSE, glm::value_ptr(model));
@@ -207,29 +207,40 @@ void init() {
        glEnable(GL_DEPTH_TEST); 
 }
 
+bool* keyStates = new bool[256];
+
 void keyboard(unsigned char key, int x, int y) {
-       if (key == 'w')
-               camPos.z += 0.1f;
-       if (key == 's')
-               camPos.z -= 0.1f;
-       if (key == 'a')
-               camPos.x += 0.1f;
-       if (key == 'd')
-               camPos.x -= 0.1f;
-       if (key == 'q')
-               camPos.y += 0.1f;
-       if (key == 'e')
-               camPos.y -= 0.1f;
+       keyStates[key] = true;
        if (key == 'z')
                doScale = !doScale;
        if (key == 'x')
                doRotate = !doRotate;
        if (key == 'c')
                doTranslate = !doTranslate;
-       glutPostRedisplay();
+}
+
+void keyboardUp(unsigned char key, int x, int y) {
+       keyStates[key] = false;
 }
 
 void idle(int _) {
+       float xSpeed = 0.f, ySpeed = 0.f, zSpeed = 0.f;
+       if (keyStates['w'])
+               zSpeed = 0.1f;
+       if (keyStates['s'])
+               zSpeed = -0.1f;
+       if (keyStates['a'])
+               xSpeed = 0.1f;
+       if (keyStates['d'])
+               xSpeed = -0.1f;
+       if (keyStates['q'])
+               ySpeed = 0.1f;
+       if (keyStates['e'])
+               ySpeed = -0.1f;
+
+       camPos.x += xSpeed * sin(yaw) + zSpeed * cos(yaw);
+       camPos.y += ySpeed;
+       camPos.z += zSpeed * sin(yaw) - xSpeed * cos(yaw);
        glutPostRedisplay();
        glutTimerFunc(16, idle, 0);
 }
@@ -276,6 +287,7 @@ int main(int argc, char** argv) {
        init();
 
        glutKeyboardFunc(keyboard);
+       glutKeyboardUpFunc(keyboardUp);
        glutTimerFunc(16, idle, 0);
        glutMotionFunc(motion);
        glutMouseFunc(mouse);