charcoal/Example/MySimple3DScene.cpp

106 lines
2.7 KiB
C++
Raw Normal View History

2018-09-11 05:18:17 +00:00
#include "MySimple3DScene.h"
#include <charcoal/deps.h>
#include <charcoal/constants.h>
#include <charcoal/DrawMode.h>
#include <charcoal/MeshFactory.h>
#include <cmath>
#include <iostream>
2018-09-11 05:18:17 +00:00
MySimple3DScene::MySimple3DScene(Application& application)
: Scene(application),
2018-09-11 05:18:17 +00:00
m_shape(MeshFactory<MySimpleShaderProgram::Vertex, MySimpleShaderProgram::Index>::gen(
DrawMode::DRAW_TRIANGLES,
2018-09-11 05:18:17 +00:00
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)TAU_1_4, (float)m_screen_size.x / m_screen_size.y, 1.0f, 10.0f, vec3(0.0f, 0.0f, 5.0f))
{}
2018-09-11 05:18:17 +00:00
MySimple3DScene::~MySimple3DScene()
{}
2018-09-11 05:18:17 +00:00
void MySimple3DScene::init()
{
m_batch.init();
}
2018-09-11 05:18:17 +00:00
void MySimple3DScene::use()
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
}
2018-09-11 05:18:17 +00:00
void MySimple3DScene::unuse()
{
}
2018-09-11 05:18:17 +00:00
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;
2018-09-12 21:03:46 +00:00
radians = (float)TAU * c / intervals;
{
2018-09-11 05:18:17 +00:00
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));
}
{
2018-09-11 05:18:17 +00:00
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()
{
2018-09-12 13:46:55 +00:00
m_camera.prerender();
m_batch.prerender();
}
2018-09-11 05:18:17 +00:00
void MySimple3DScene::render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_shader_program.use();
2018-09-11 05:18:17 +00:00
glUniformMatrix4fv(0, 1, GL_FALSE, &m_camera.get_world_to_view_matrix()[0][0]);
m_batch.render();
}