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.
108 lines
2.7 KiB
C++
108 lines
2.7 KiB
C++
#include "MySimple3DScene.h"
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include <cmath>
|
|
#include <iostream>
|
|
|
|
#include "constants.h"
|
|
|
|
#include "DrawMode.h"
|
|
#include "MeshFactory.h"
|
|
|
|
MySimple3DScene::MySimple3DScene(Application& application)
|
|
: Scene(application),
|
|
m_shape(MeshFactory<MySimpleShaderProgram::Vertex, MySimpleShaderProgram::Index>::gen(
|
|
DrawMode::DRAW_TRIANGLES,
|
|
MySimpleShaderProgram::Vertex(-1.0f, 1.0f, 0.0f),
|
|
MySimpleShaderProgram::Vertex(1.0f, 1.0f, 0.0f),
|
|
MySimpleShaderProgram::Vertex(-2.0f, -1.0f, 0.0f),
|
|
MySimpleShaderProgram::Vertex(2.0f, -1.0f, 0.0f)
|
|
), DrawMode::DRAW_TRIANGLES),
|
|
m_batch(&m_shape, 2),
|
|
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))
|
|
{}
|
|
|
|
MySimple3DScene::~MySimple3DScene()
|
|
{}
|
|
|
|
void MySimple3DScene::init()
|
|
{
|
|
m_batch.init();
|
|
}
|
|
|
|
void MySimple3DScene::use()
|
|
{
|
|
glEnable(GL_DEPTH_TEST);
|
|
glDepthFunc(GL_LESS);
|
|
}
|
|
|
|
void MySimple3DScene::unuse()
|
|
{
|
|
|
|
}
|
|
|
|
void MySimple3DScene::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.update_position(vec3(3 * (float)cos(radians), 0.0f, -1.0f));
|
|
}
|
|
|
|
{
|
|
MySimpleShaderProgram::Color& color = m_batch.get_color(1);
|
|
color.r = 1.0f - brightness;
|
|
color.g = 1.0f - brightness;
|
|
color.b = 1.0f - brightness;
|
|
color.a = 1.0f;
|
|
|
|
Poseable& pose = m_batch.get_pose(1);
|
|
pose.update_position(vec3(0.0f, 3 * (float)sin(radians), 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);
|
|
}
|
|
|
|
void MySimple3DScene::prerender()
|
|
{
|
|
m_camera.prerender();
|
|
m_batch.prerender();
|
|
}
|
|
|
|
void MySimple3DScene::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();
|
|
}
|