summaryrefslogtreecommitdiff
path: root/scene.cpp
blob: 47b76bf051c0f00ec3db3feb7153cf6f350f78a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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;
}