93 lines
2.7 KiB
C
93 lines
2.7 KiB
C
#include "state.h"
|
|
|
|
extern vec3 camera_position;
|
|
extern vec3 camera_rotation;
|
|
extern Entity *player_entity, *sky_entity;
|
|
|
|
float delta_time;
|
|
int last_time;
|
|
|
|
void
|
|
game_state_init (int ticks)
|
|
{
|
|
last_time = ticks;
|
|
}
|
|
|
|
void
|
|
game_state_tick (int ticks)
|
|
{
|
|
/* Caluclate stuff per frame. */
|
|
delta_time = (ticks - last_time) / 1000.0;
|
|
last_time = ticks;
|
|
|
|
/* We pin the camera to the player position, with eye level 20
|
|
centimeters below the height. */
|
|
glm_vec3_copy (player_entity->position, camera_position);
|
|
camera_position[1] += player_entity->scale[1] - 0.2;
|
|
player_entity->rotation[1] = camera_rotation[1];
|
|
/* The sky needs to be in the center of the world all the time,
|
|
otherwise, as we explore the world, we might reach the end of the
|
|
sky. */
|
|
sky_entity->position[0] = camera_position[0];
|
|
sky_entity->position[2] = camera_position[2];
|
|
|
|
int speed = 5;
|
|
|
|
if (flags_get ("flight_enabled") && flags_get ("flying_fast"))
|
|
{
|
|
speed = 10;
|
|
}
|
|
|
|
if (flags_get ("moving_forward"))
|
|
{
|
|
vec3 dir, change, new_pos;
|
|
camera_get_direction (dir);
|
|
glm_vec3_scale (dir, delta_time * speed, change);
|
|
glm_vec3_add (player_entity->position, change, new_pos);
|
|
glm_vec3_copy (new_pos, player_entity->position);
|
|
}
|
|
|
|
if (flags_get ("moving_backward"))
|
|
{
|
|
vec3 dir, change, new_pos;
|
|
camera_get_direction (dir);
|
|
glm_vec3_scale (dir, delta_time * speed, change);
|
|
glm_vec3_sub (player_entity->position, change, new_pos);
|
|
glm_vec3_copy (new_pos, player_entity->position);
|
|
}
|
|
|
|
if (flags_get ("moving_right"))
|
|
{
|
|
vec3 right, change, new_pos;
|
|
camera_get_right (right);
|
|
glm_vec3_scale (right, delta_time * speed, change);
|
|
glm_vec3_add (player_entity->position, change, new_pos);
|
|
glm_vec3_copy (new_pos, player_entity->position);
|
|
}
|
|
|
|
if (flags_get ("moving_left"))
|
|
{
|
|
vec3 right, change, new_pos;
|
|
camera_get_right (right);
|
|
glm_vec3_scale (right, delta_time * speed, change);
|
|
glm_vec3_sub (player_entity->position, change, new_pos);
|
|
glm_vec3_copy (new_pos, player_entity->position);
|
|
}
|
|
|
|
if (flags_get ("flying_up") && flags_get ("flight_enabled"))
|
|
{
|
|
vec3 change, new_pos;
|
|
glm_vec3_scale (GLM_YUP, delta_time * speed, change);
|
|
glm_vec3_add (player_entity->position, change, new_pos);
|
|
glm_vec3_copy (new_pos, player_entity->position);
|
|
}
|
|
|
|
if (flags_get ("flying_down") && flags_get ("flight_enabled"))
|
|
{
|
|
vec3 change, new_pos;
|
|
glm_vec3_scale (GLM_YUP, delta_time * speed, change);
|
|
glm_vec3_sub (player_entity->position, change, new_pos);
|
|
glm_vec3_copy (new_pos, player_entity->position);
|
|
}
|
|
}
|