Add simple renderer class, add example implementation
This commit is contained in:
@@ -1,12 +1,16 @@
|
|||||||
#include <glad/glad.h>
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include "inferno/application.h"
|
#include "inferno/application.h"
|
||||||
#include "inferno/core.h"
|
#include "inferno/core.h"
|
||||||
#include "inferno/event/applicationevent.h"
|
#include "inferno/event/applicationevent.h"
|
||||||
#include "inferno/event/event.h"
|
#include "inferno/event/event.h"
|
||||||
|
#include "inferno/input.h"
|
||||||
#include "inferno/log.h"
|
#include "inferno/log.h"
|
||||||
#include "inferno/settings.h"
|
#include "inferno/settings.h"
|
||||||
|
#include "inferno/render/buffer.h"
|
||||||
|
#include "inferno/render/context.h"
|
||||||
|
#include "inferno/render/renderer.h"
|
||||||
|
#include "inferno/render/shader.h"
|
||||||
#include "inferno/window.h"
|
#include "inferno/window.h"
|
||||||
|
|
||||||
namespace Inferno {
|
namespace Inferno {
|
||||||
@@ -17,6 +21,39 @@ namespace Inferno {
|
|||||||
{
|
{
|
||||||
NF_CORE_ASSERT(!s_instance, "Application already exists!");
|
NF_CORE_ASSERT(!s_instance, "Application already exists!");
|
||||||
s_instance = this;
|
s_instance = this;
|
||||||
|
|
||||||
|
// Initialize Settings
|
||||||
|
new Settings();
|
||||||
|
|
||||||
|
m_window = std::make_unique<Window>();
|
||||||
|
m_window->setEventCallback(NF_BIND_EVENT(Application::onEvent));
|
||||||
|
|
||||||
|
float vertices[] = {
|
||||||
|
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
|
||||||
|
0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32_t indices[] = {
|
||||||
|
0, 1, 2, 2, 3, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
m_vertexArray = std::make_shared<VertexArray>();
|
||||||
|
|
||||||
|
std::shared_ptr<VertexBuffer> vertexBuffer = std::make_shared<VertexBuffer>(vertices, sizeof(vertices));
|
||||||
|
vertexBuffer->setLayout({
|
||||||
|
{ BufferElementType::Vec3, "a_position" },
|
||||||
|
{ BufferElementType::Vec4, "a_color" },
|
||||||
|
});
|
||||||
|
|
||||||
|
m_vertexArray->addVertexBuffer(vertexBuffer);
|
||||||
|
|
||||||
|
std::shared_ptr<IndexBuffer> indexBuffer = std::make_shared<IndexBuffer>(indices, sizeof(indices));
|
||||||
|
|
||||||
|
m_vertexArray->setIndexBuffer(indexBuffer);
|
||||||
|
|
||||||
|
m_shader = std::make_unique<Shader>("assets/glsl/simple.vert", "assets/glsl/simple.frag");
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::~Application()
|
Application::~Application()
|
||||||
@@ -27,20 +64,19 @@ namespace Inferno {
|
|||||||
{
|
{
|
||||||
NF_CORE_LOG("Application startup");
|
NF_CORE_LOG("Application startup");
|
||||||
|
|
||||||
// Initialize Settings
|
|
||||||
new Settings();
|
|
||||||
|
|
||||||
m_window = std::make_unique<Window>();
|
|
||||||
m_window->setEventCallback(NF_BIND_EVENT(Application::onEvent));
|
|
||||||
|
|
||||||
while(!glfwWindowShouldClose(m_window->getWindow())) {
|
while(!glfwWindowShouldClose(m_window->getWindow())) {
|
||||||
|
|
||||||
if(glfwGetKey(m_window->getWindow(), GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
if(glfwGetKey(m_window->getWindow(), GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
||||||
glfwSetWindowShouldClose(m_window->getWindow(), GL_TRUE);
|
glfwSetWindowShouldClose(m_window->getWindow(), GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
Command::clearColor({ 0.2f, 0.3f, 0.3f, 1.0f });
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
Command::clear();
|
||||||
|
|
||||||
|
Renderer::beginScene(); // camera, lights, environment
|
||||||
|
m_shader->bind();
|
||||||
|
Renderer::submit(m_vertexArray);
|
||||||
|
Renderer::endScene();
|
||||||
|
|
||||||
m_window->update();
|
m_window->update();
|
||||||
}
|
}
|
||||||
@@ -57,7 +93,9 @@ namespace Inferno {
|
|||||||
|
|
||||||
bool Application::onWindowClose(WindowCloseEvent &e)
|
bool Application::onWindowClose(WindowCloseEvent &e)
|
||||||
{
|
{
|
||||||
|
// Suppress unused warning
|
||||||
(void)e;
|
(void)e;
|
||||||
|
|
||||||
NF_CORE_INFO("WindowCloseEvent triggered");
|
NF_CORE_INFO("WindowCloseEvent triggered");
|
||||||
|
|
||||||
glfwSetWindowShouldClose(m_window->getWindow(), GL_TRUE);
|
glfwSetWindowShouldClose(m_window->getWindow(), GL_TRUE);
|
||||||
@@ -67,9 +105,13 @@ namespace Inferno {
|
|||||||
|
|
||||||
bool Application::onWindowResize(WindowResizeEvent &e)
|
bool Application::onWindowResize(WindowResizeEvent &e)
|
||||||
{
|
{
|
||||||
|
// Suppress unused warning
|
||||||
(void)e;
|
(void)e;
|
||||||
|
|
||||||
NF_CORE_INFO("WindowResizeEvent %dx%d triggered", e.getWidth(), e.getHeight());
|
NF_CORE_INFO("WindowResizeEvent %dx%d triggered", e.getWidth(), e.getHeight());
|
||||||
|
|
||||||
|
m_window->getContext()->setViewport(0, 0, e.getWidth(), e.getHeight());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ namespace Inferno {
|
|||||||
class WindowResizeEvent;
|
class WindowResizeEvent;
|
||||||
class Window;
|
class Window;
|
||||||
|
|
||||||
|
class VertexArray;
|
||||||
|
class Shader;
|
||||||
|
|
||||||
class Application {
|
class Application {
|
||||||
public:
|
public:
|
||||||
Application();
|
Application();
|
||||||
@@ -23,11 +26,18 @@ namespace Inferno {
|
|||||||
|
|
||||||
// -----------------------------------------
|
// -----------------------------------------
|
||||||
|
|
||||||
|
inline Window &getWindow() { return *m_window; }
|
||||||
|
|
||||||
static inline Application &get() { return *s_instance; }
|
static inline Application &get() { return *s_instance; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<Window> m_window;
|
std::unique_ptr<Window> m_window;
|
||||||
|
|
||||||
|
//
|
||||||
|
std::shared_ptr<VertexArray> m_vertexArray;
|
||||||
|
std::unique_ptr<Shader> m_shader;
|
||||||
|
//
|
||||||
|
|
||||||
static Application* s_instance;
|
static Application* s_instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -37,3 +47,30 @@ namespace Inferno {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif // APPLICATION_H
|
#endif // APPLICATION_H
|
||||||
|
|
||||||
|
// Gameplan
|
||||||
|
// v Entrypoint
|
||||||
|
// v Logging
|
||||||
|
// v Events
|
||||||
|
// v Window
|
||||||
|
// v Settings loader (json)
|
||||||
|
// v Input polling
|
||||||
|
// v OpenGL context
|
||||||
|
// - GPUDriver (?)
|
||||||
|
// v Renderer
|
||||||
|
// v Buffers
|
||||||
|
// ~ Shader
|
||||||
|
// - Schene (camera, lights, environment)
|
||||||
|
// - Texture loading
|
||||||
|
// - Model loading
|
||||||
|
// - Entity Component System
|
||||||
|
// - Serialization
|
||||||
|
// - Level format
|
||||||
|
// - Tools (Tiled?)
|
||||||
|
// - Scripting (Lua)
|
||||||
|
|
||||||
|
// - Global object access can be done in 3 ways:
|
||||||
|
// - Singleton, static, extern
|
||||||
|
|
||||||
|
// @Todo
|
||||||
|
// - Settings should contain all file paths (ex: shaders)
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#include <glad/glad.h>
|
||||||
|
|
||||||
|
#include "inferno/render/buffer.h"
|
||||||
|
#include "inferno/render/renderer.h"
|
||||||
|
|
||||||
|
namespace Inferno {
|
||||||
|
|
||||||
|
void Command::clear()
|
||||||
|
{
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Command::clearColor(const glm::vec4 &color)
|
||||||
|
{
|
||||||
|
glClearColor(color.r, color.g, color.b, color.a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Command::drawIndexed(const std::shared_ptr<VertexArray> &vertexArray)
|
||||||
|
{
|
||||||
|
glDrawElements(GL_TRIANGLES, vertexArray->getIndexBuffer()->getCount(), GL_UNSIGNED_INT, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
void Renderer::beginScene()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Renderer::endScene()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Renderer::submit(const std::shared_ptr<VertexArray> &vertexArray)
|
||||||
|
{
|
||||||
|
vertexArray->bind();
|
||||||
|
Command::drawIndexed(vertexArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#ifndef RENDERER_H
|
||||||
|
#define RENDERER_H
|
||||||
|
|
||||||
|
#include <memory> // std::shared_ptr
|
||||||
|
|
||||||
|
#include <glm/vec4.hpp>
|
||||||
|
|
||||||
|
namespace Inferno {
|
||||||
|
|
||||||
|
class VertexArray;
|
||||||
|
|
||||||
|
class Command {
|
||||||
|
public:
|
||||||
|
static void clear();
|
||||||
|
static void clearColor(const glm::vec4 &color);
|
||||||
|
|
||||||
|
static void drawIndexed(const std::shared_ptr<VertexArray> &vertexArray);
|
||||||
|
};
|
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
class Renderer {
|
||||||
|
public:
|
||||||
|
static void beginScene();
|
||||||
|
static void endScene();
|
||||||
|
|
||||||
|
static void submit(const std::shared_ptr<VertexArray> &vertexArray);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RENDERER_H
|
||||||
Reference in New Issue
Block a user