hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/core/application.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/application.cpp')
-rw-r--r--src/core/application.cpp149
1 files changed, 134 insertions, 15 deletions
diff --git a/src/core/application.cpp b/src/core/application.cpp
index 92bf211..b80ad84 100644
--- a/src/core/application.cpp
+++ b/src/core/application.cpp
@@ -9,6 +9,7 @@
#include <iostream>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
+#include <GLFW/glfw3.h>
namespace Donut
{
@@ -70,14 +71,78 @@ namespace Donut
else
m_minimized = false;
+ if (m_camera)
+ m_camera->set_projection(45.0f, (float)e.get_width() / (float)e.get_height(), 0.1f, 100.0f);
+
+ event.handled = true;
+ return true;
+ });
+
+ dispatcher.dispatch<WindowFocusEvent>([this, &event](WindowFocusEvent& e)
+ {
+ m_first_mouse = true;
+ m_mouse_dragging = false;
+ event.handled = true;
+ return true;
+ });
+
+ dispatcher.dispatch<WindowLostFocusEvent>([this, &event](WindowLostFocusEvent& e)
+ {
+ m_mouse_dragging = false;
event.handled = true;
return true;
});
dispatcher.dispatch<KeyPressedEvent>([this, &event](KeyPressedEvent& e)
{
- if (e.get_key_code() == 256)
- close();
+ m_keys[e.get_key_code()] = true;
+ return true;
+ });
+
+ dispatcher.dispatch<KeyReleasedEvent>([this, &event](KeyReleasedEvent& e)
+ {
+ m_keys[e.get_key_code()] = false;
+ return true;
+ });
+
+ dispatcher.dispatch<MouseMovedEvent>([this, &event](MouseMovedEvent& e)
+ {
+ if (!m_mouse_dragging)
+ return true;
+
+ if (m_first_mouse)
+ {
+ m_last_x = e.get_x();
+ m_last_y = e.get_y();
+ m_first_mouse = false;
+ }
+
+ float x_offset = m_last_x - e.get_x();
+ float y_offset = e.get_y() - m_last_y;
+
+ m_last_x = e.get_x();
+ m_last_y = e.get_y();
+
+ if (m_camera)
+ m_camera->on_mouse_move(x_offset, y_offset);
+
+ return true;
+ });
+
+ dispatcher.dispatch<MouseButtonPressedEvent>([this, &event](MouseButtonPressedEvent& e)
+ {
+ if (e.get_mouse_button() == GLFW_MOUSE_BUTTON_LEFT)
+ {
+ m_mouse_dragging = true;
+ m_first_mouse = true;
+ }
+ return true;
+ });
+
+ dispatcher.dispatch<MouseButtonReleasedEvent>([this, &event](MouseButtonReleasedEvent& e)
+ {
+ if (e.get_mouse_button() == GLFW_MOUSE_BUTTON_LEFT)
+ m_mouse_dragging = false;
return true;
});
}
@@ -86,14 +151,32 @@ namespace Donut
{
Renderer::init();
- float vertices[3 * 7] =
+ m_camera = std::make_unique<Camera>(45.0f, 1280.0f / 720.0f, 0.1f, 100.0f);
+ m_camera->set_position({ 0.0f, 0.0f, 3.0f });
+ m_camera->set_mouse_sensitivity(0.1f);
+ m_camera->set_movement_speed(5.0f);
+
+ float vertices[] =
{
- -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
- 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f
+ -0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f,
+ 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f,
+ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f,
+ -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f,
+ -0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 1.0f, 1.0f,
+ 0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f,
+ 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 1.0f,
+ -0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f
};
- uint32_t indices[3] = { 0, 1, 2 };
+ uint32_t indices[] =
+ {
+ 0, 1, 2, 2, 3, 0,
+ 1, 5, 6, 6, 2, 1,
+ 5, 4, 7, 7, 6, 5,
+ 4, 0, 3, 3, 7, 4,
+ 3, 2, 6, 6, 7, 3,
+ 4, 5, 1, 1, 0, 4
+ };
m_vertex_array = std::shared_ptr<VertexArray>(VertexArray::create());
m_vertex_buffer = std::shared_ptr<VertexBuffer>(VertexBuffer::create(vertices, sizeof(vertices)));
@@ -105,7 +188,7 @@ namespace Donut
m_vertex_array->add_vertex_buffer(m_vertex_buffer);
- m_index_buffer = std::shared_ptr<IndexBuffer>(IndexBuffer::create(indices, 3));
+ m_index_buffer = std::shared_ptr<IndexBuffer>(IndexBuffer::create(indices, 36));
m_vertex_array->set_index_buffer(m_index_buffer);
m_shader = std::shared_ptr<Shader>(Shader::create("assets/basic.glsl"));
@@ -118,19 +201,55 @@ namespace Donut
void Application::on_update()
{
+ float current_frame = (float)glfwGetTime();
+ m_delta_time = current_frame - m_last_frame;
+ m_last_frame = current_frame;
+
+ if (m_camera)
+ {
+ if (m_keys[GLFW_KEY_W])
+ m_camera->move_forward(m_delta_time);
+ if (m_keys[GLFW_KEY_S])
+ m_camera->move_backward(m_delta_time);
+ if (m_keys[GLFW_KEY_A])
+ m_camera->move_left(m_delta_time);
+ if (m_keys[GLFW_KEY_D])
+ m_camera->move_right(m_delta_time);
+ if (m_keys[GLFW_KEY_SPACE])
+ m_camera->move_up(m_delta_time);
+ if (m_keys[GLFW_KEY_LEFT_SHIFT])
+ m_camera->move_down(m_delta_time);
+ }
}
void Application::on_render()
{
- Renderer::set_clear_color({ 0.1f, 0.1f, 0.1f, 1.0f });
+ Renderer::set_clear_color({ 0.0f, 0.0f, 0.0f, 1.0f });
Renderer::clear();
- Renderer::begin_scene();
-
- glm::mat4 view_projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
+ glm::mat4 view_projection = m_camera ? m_camera->get_view_projection_matrix() : glm::mat4(1.0f);
- Renderer::submit(m_shader, m_vertex_array, glm::mat4(1.0f));
-
- Renderer::end_scene();
+ glm::vec3 center_pos(0.0f, 0.0f, 0.0f);
+ glm::vec3 right_pos(2.0f, 0.0f, 0.0f);
+ glm::vec3 left_pos(-2.0f, 0.0f, 0.0f);
+ glm::vec3 up_pos(0.0f, 2.0f, 0.0f);
+ glm::vec3 down_pos(0.0f, -2.0f, 0.0f);
+ glm::vec3 forward_pos(0.0f, 0.0f, 2.0f);
+ glm::vec3 back_pos(0.0f, 0.0f, -2.0f);
+
+ glm::mat4 transform = glm::translate(glm::mat4(1.0f), center_pos);
+ Renderer::submit(m_shader, m_vertex_array, transform, view_projection);
+ transform = glm::translate(glm::mat4(1.0f), right_pos);
+ Renderer::submit(m_shader, m_vertex_array, transform, view_projection);
+ transform = glm::translate(glm::mat4(1.0f), left_pos);
+ Renderer::submit(m_shader, m_vertex_array, transform, view_projection);
+ transform = glm::translate(glm::mat4(1.0f), up_pos);
+ Renderer::submit(m_shader, m_vertex_array, transform, view_projection);
+ transform = glm::translate(glm::mat4(1.0f), down_pos);
+ Renderer::submit(m_shader, m_vertex_array, transform, view_projection);
+ transform = glm::translate(glm::mat4(1.0f), forward_pos);
+ Renderer::submit(m_shader, m_vertex_array, transform, view_projection);
+ transform = glm::translate(glm::mat4(1.0f), back_pos);
+ Renderer::submit(m_shader, m_vertex_array, transform, view_projection);
}
}