summaryrefslogtreecommitdiff
path: root/scene.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene.cpp')
-rw-r--r--scene.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/scene.cpp b/scene.cpp
new file mode 100644
index 0000000..47b76bf
--- /dev/null
+++ b/scene.cpp
@@ -0,0 +1,46 @@
+#include "scene.h"
+
+#include <SDL_opengl.h>
+
+#include <cmath>
+
+#define inrange(a, b, c) ((a) >= (b) && (a) <= (c))
+
+void Scene::lookat() {
+ /* calculate cartesian coordinates for the center vector where yaw is Φ and pitch is θ
+ * x = cos Φ sin θ
+ * y = cos θ
+ * z = sin Φ sin θ
+ */
+ Vector3 center(sinf(pitch) * cosf(yaw), cosf(pitch), sinf(pitch) * sinf(yaw));
+ center += pos;
+ center.y += 1;
+ //Vector3 up(cosf(yaw) * cosf(pitch), sinf(pitch), sinf(yaw) * cosf(pitch));
+ Vector3 up(-cosf(pitch) * cosf(yaw), sinf(pitch), -cosf(pitch) * sinf(yaw));
+ gluLookAt(pos.x, pos.y+1, pos.z,
+ center.x, center.y, center.z,
+ up.x, up.y, up.z);
+}
+
+void Scene::move(float forward, float right, int steps) {
+ Vector2 dir;
+ dir.x += forward*cosf(yaw);
+ dir.y += forward*sinf(yaw);
+
+ dir.x += right*cosf(yaw+M_PI_2);
+ dir.y += right*sinf(yaw+M_PI_2);
+
+ // ensure that the vector length is 1.0
+ dir /= dir.length();
+ dir *= 0.005;
+ dir *= steps;
+
+ float x = pos.x + dir.x;
+ //if(inrange(x, -2, 2))
+ pos.x = x;
+ float z = pos.z + dir.y;
+ //if(inrange(z, -2, 2))
+ pos.z = z;
+ //pos.x += dir.x;
+ //pos.z += dir.y;
+}