94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
#include "MySimpleCubeScene.h"
|
|
|
|
#include "constants.h"
|
|
|
|
#include "MeshFactory.h"
|
|
#include "DrawMode.h"
|
|
|
|
MySimpleCubeScene::MySimpleCubeScene(Application& application)
|
|
: Scene(application),
|
|
m_shape(MeshFactory<MySimpleShaderProgram::Vertex, MySimpleShaderProgram::Index>::gen_cube(
|
|
DrawMode::DRAW_TRIANGLES,
|
|
MySimpleShaderProgram::Vertex(-1.0f, 1.0f, -1.0f),
|
|
MySimpleShaderProgram::Vertex(-1.0f, -1.0f, -1.0f),
|
|
MySimpleShaderProgram::Vertex( 1.0f, 1.0f, -1.0f),
|
|
MySimpleShaderProgram::Vertex( 1.0f, -1.0f, -1.0f),
|
|
MySimpleShaderProgram::Vertex(-1.0f, 1.0f, 1.0f),
|
|
MySimpleShaderProgram::Vertex(-1.0f, -1.0f, 1.0f),
|
|
MySimpleShaderProgram::Vertex( 1.0f, 1.0f, 1.0f),
|
|
MySimpleShaderProgram::Vertex( 1.0f, -1.0f, 1.0f)
|
|
), DrawMode::DRAW_TRIANGLES),
|
|
m_batch(&m_shape, 1),
|
|
m_camera((float)egm::TAU_1_8, (float)m_screen_size.x / m_screen_size.y, 1.0f, 10.0f, vec3(0.0f, 0.0f, -5.0f))
|
|
{}
|
|
|
|
MySimpleCubeScene::~MySimpleCubeScene()
|
|
{}
|
|
|
|
void MySimpleCubeScene::init()
|
|
{
|
|
m_batch.init();
|
|
}
|
|
|
|
void MySimpleCubeScene::use()
|
|
{
|
|
glEnable(GL_DEPTH_TEST);
|
|
glDepthFunc(GL_LESS);
|
|
}
|
|
|
|
void MySimpleCubeScene::unuse()
|
|
{
|
|
|
|
}
|
|
|
|
void MySimpleCubeScene::update(float delta_time, clock_t clock)
|
|
{
|
|
float brightness;
|
|
float radians;
|
|
|
|
clock_t c;
|
|
const clock_t intervals = 512 * CLOCKS_PER_SEC / 100;
|
|
const clock_t half_interval = 256 * CLOCKS_PER_SEC / 100;
|
|
c = clock % intervals;
|
|
if (c < half_interval)
|
|
brightness = (float)c / half_interval;
|
|
else
|
|
brightness = (float)(intervals - c) / half_interval;
|
|
|
|
radians = (float)egm::TAU * c / intervals;
|
|
|
|
{
|
|
MySimpleShaderProgram::Color& color = m_batch.get_color(0);
|
|
color.r = brightness;
|
|
color.g = brightness;
|
|
color.b = brightness;
|
|
color.a = 1.0f;
|
|
|
|
Poseable& pose = m_batch.get_pose(0);
|
|
pose.rotate(glm::normalize(vec3(1.0f, 1.0f, 0.0f)), (float)egm::TAU_1_2 * delta_time);
|
|
pose.update_position(vec3(3 * (float)cos(radians), 0.0f, 0.0f));
|
|
}
|
|
|
|
vec3 camera_translation(0.0f, 0.0f, 0.0f);
|
|
|
|
if (m_input_manager.is_key_down(GLFW_KEY_W)) camera_translation.y += 1;
|
|
if (m_input_manager.is_key_down(GLFW_KEY_S)) camera_translation.y -= 1;
|
|
if (m_input_manager.is_key_down(GLFW_KEY_A)) camera_translation.x -= 1;
|
|
if (m_input_manager.is_key_down(GLFW_KEY_D)) camera_translation.x += 1;
|
|
if (m_input_manager.is_key_down(GLFW_KEY_Q)) camera_translation.z -= 1;
|
|
if (m_input_manager.is_key_down(GLFW_KEY_E)) camera_translation.z += 1;
|
|
|
|
m_camera.translate(camera_translation * delta_time);
|
|
|
|
// TODO: Make a prerender function or move this to render
|
|
m_camera.prerender();
|
|
m_batch.prerender();
|
|
}
|
|
|
|
void MySimpleCubeScene::render()
|
|
{
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
m_shader_program.use();
|
|
glUniformMatrix4fv(0, 1, GL_FALSE, &m_camera.get_world_to_view_matrix()[0][0]);
|
|
m_batch.render();
|
|
} |