aboutsummaryrefslogtreecommitdiffstats
path: root/src/game/CelestialObject.cpp
blob: 40163911b2071d0bf27cf5459efd680d7d74f225 (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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <GL/glew.h>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

#include "CelestialObject.hpp"
#include "../graphics/Texture.hpp"
#include "../graphics/Mesh.hpp"
#include "../objects.hpp"

using namespace glm;

Mesh *CelestialObject::sphere = 0;
Mesh *CelestialObject::circle = 0;

#define FULL_TURN 360.0f

void CelestialObject::InitializeMesh()
{
	sphere = form_sphere(36, 36);
	circle = form_circle(36);
}

void CelestialObject::SetPeriod(float a_orbital, float a_rotation)
{
	orbital_period = a_orbital;
	rotation_period = a_rotation;
	orbital_speed = (a_orbital == 0.0f) ? 0.0f : FULL_TURN / orbital_period;
	rotation_speed = (a_rotation == 0.0f) ? 0.0f : FULL_TURN / rotation_period;
}

void CelestialObject::SetRadius(float object_r, float orbital_r)
{
	object_radius = object_r;
	orbital_radius = orbital_r;
}

void CelestialObject::SetTilt(float angle)
{
	tilt_angle = radians(angle);
}

void CelestialObject::SetPosition(glm::vec3 orbital)
{
	orbital_pos = orbital;
}

void CelestialObject::Draw(float time, float game_speed,
	unsigned int model_loc)
{
	float
		orb_speed = orbital_speed * game_speed,
		rot_speed = rotation_speed * game_speed,
		moveX = sin(radians(time) * orb_speed) * orbital_radius,
		moveZ = cos(radians(time) * orb_speed) * orbital_radius;

	texture->Bind();

	mat4 sphere_model(1.0f);
	vec3 pos(orbital_pos.x - moveX, orbital_pos.y, orbital_pos.z - moveZ);
	sphere_model = translate(sphere_model, pos);
	sphere_model = rotate(sphere_model, tilt_angle, vec3(1.0f, 0.0f, 0.0f));
	sphere_model = rotate(sphere_model, radians(time) * rot_speed, vec3(0.0f, 0.0f, 1.0f));
	sphere_model = scale(sphere_model, vec3(object_radius, object_radius, object_radius));
	glUniformMatrix4fv(model_loc, 1, GL_FALSE, value_ptr(sphere_model));
	sphere->Draw();

	if(orbital_radius != 0.0f) {
		mat4 circle_model(1.0f);
		circle_model = translate(circle_model, orbital_pos);
		circle_model = scale(circle_model, vec3(orbital_radius, orbital_radius, orbital_radius));
		glUniformMatrix4fv(model_loc, 1, GL_FALSE, value_ptr(circle_model));
		circle->Draw();
	}
}