3205680062
Also added a required prerender function to scene and application. This function is intended to be used as a way to prepare the scene to be rendered in its current state. For that reason, the delta time and the current clock tick are not passed to it.
101 lines
2.9 KiB
C++
101 lines
2.9 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_4, (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;
|
|
|
|
float camera_rotation = 0.0f;
|
|
if (m_input_manager.is_key_down(GLFW_KEY_Z)) camera_rotation += 1;
|
|
if (m_input_manager.is_key_down(GLFW_KEY_C)) camera_rotation -= 1;
|
|
|
|
m_camera.translate(camera_translation * delta_time);
|
|
m_camera.rotate(vec3(0.0f, 1.0f, 0.0f), camera_rotation * (float)egm::TAU_1_8 * delta_time);
|
|
}
|
|
|
|
void MySimpleCubeScene::prerender()
|
|
{
|
|
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();
|
|
} |