Redering cube in editor

main
Nigel Barink 2022-11-03 15:06:42 +01:00
parent 3e75406783
commit c62f3615d4
16 changed files with 271 additions and 100 deletions

View File

@ -8,7 +8,7 @@ int main(int argc, char* argv[]) {
EngineInstrumentation::PerfomanceSamplerInit();
// Startup services
BarinkWindow MainWindow = BarinkWindow(800, 600);
BarinkWindow MainWindow = BarinkWindow(1200, 700);
renderer = BarinkEngine::Renderer();
InputSystem = BarinkEngine::InputManager();

View File

@ -2,6 +2,7 @@
#include "imgui.h"
#include "backends/imgui_impl_opengl3.h"
#include <backends/imgui_impl_glfw.h>
#include "../../libs/guizmo/ImGuizmo.h"
#include "../BarinkEngine.h"
GUIManager::GUIManager(BarinkWindow* window)
@ -35,8 +36,17 @@ void GUIManager::Render()
ImGui::NewFrame();
ImGuizmo::SetOrthographic(true);
ImGuizmo::BeginFrame();
ImmediateGraphicsDraw();
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

View File

@ -1,15 +1,15 @@
#include "Buffer.h"
int GpuBuffer::getBufferID() {
int Buffer::getBufferID() {
return id;
}
void GpuBuffer::createBuffer() {
void Buffer::createBuffer() {
glGenBuffers(1, (GLuint*) &id);
}
void GpuBuffer::setBufferData(void* data, size_t dataSize, bool elementBuffer = false ) {
void Buffer::setBufferData(void* data, size_t dataSize, bool elementBuffer = false ) {
if (elementBuffer) {
glBufferData(GL_ELEMENT_ARRAY_BUFFER, dataSize, data, GL_STATIC_DRAW);
@ -21,7 +21,7 @@ void GpuBuffer::setBufferData(void* data, size_t dataSize, bool elementBuffer =
}
void GpuBuffer::Bind(bool elementBuffer = false ) {
void Buffer::Bind(bool elementBuffer = false ) {
if (elementBuffer) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id);
@ -32,7 +32,7 @@ void GpuBuffer::Bind(bool elementBuffer = false ) {
}
}
void GpuBuffer::Unbind(bool elementBuffer = false) {
void Buffer::Unbind(bool elementBuffer = false) {
if (elementBuffer) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
@ -42,6 +42,6 @@ void GpuBuffer::Unbind(bool elementBuffer = false) {
}
}
void GpuBuffer::Delete() {
void Buffer::Delete() {
glDeleteBuffers(1, (GLuint*) &id);
}

View File

@ -1,8 +1,7 @@
#pragma once
#include <glad/glad.h>
class GpuBuffer {
private:
unsigned int id;
class Buffer {
public:
int getBufferID();
@ -16,4 +15,7 @@ public:
void Delete();
private:
unsigned int id;
};

View File

@ -9,24 +9,44 @@ Framebuffer::Framebuffer()
// Create a colour texture!
glGenTextures(1, &ColourAttachment);
glBindTexture(GL_TEXTURE_2D, ColourAttachment);
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ColourAttachment, 0);
glBindTexture(GL_TEXTURE_2D, 0);
// Create a depth buffer
glGenRenderbuffers(1, &DepthAttachment);
glBindRenderbuffer(GL_RENDERBUFFER, DepthAttachment);
glGenTextures(1, &DepthAttachment);
glBindTexture(GL_TEXTURE_2D, DepthAttachment);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferRenderbuffer(GL_RENDERBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, DepthAttachment);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, DepthAttachment, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
/*
* // Render buffer
glGenRenderbuffers(1, &DepthAttachment);
glBindRenderbuffer(GL_RENDERBUFFER, DepthAttachment);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(GL_RENDERBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, DepthAttachment);
*/
@ -39,6 +59,8 @@ Framebuffer::Framebuffer()
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
Framebuffer::~Framebuffer()

View File

@ -8,13 +8,14 @@ public:
Framebuffer();
~Framebuffer();
unsigned int GetId() { return Id; }
unsigned int GetColourAttachment() { return ColourAttachment; }
GLuint GetId() { return Id; }
GLuint GetColourAttachment() { return ColourAttachment; }
GLuint GetDepthAttachment() { return DepthAttachment; }
private:
unsigned int Id = 0;
unsigned int ColourAttachment = 0;
unsigned int DepthAttachment = 0;
GLuint Id = 0;
GLuint ColourAttachment = 0;
GLuint DepthAttachment = 0;
};

View File

@ -0,0 +1,31 @@
#include "UniformBuffer.h"
#include <glad/glad.h>
UniformBuffer::UniformBuffer(unsigned int size)
{
glGenBuffers(1, &Id );
glBindBuffer(GL_ARRAY_BUFFER, Id);
glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
UniformBuffer::~UniformBuffer()
{
glDeleteBuffers(1, &Id);
}
void UniformBuffer::setData( unsigned int offset , unsigned int size , void* data)
{
glBindBuffer(GL_ARRAY_BUFFER, Id);
glBufferSubData(GL_ARRAY_BUFFER, offset , size, data);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void UniformBuffer::setDescriptor(unsigned int index, unsigned int size , unsigned int stride, void* pointer)
{
glBindBuffer(GL_ARRAY_BUFFER, Id);
glVertexAttribPointer(index, size, GL_FLOAT, GL_FALSE, stride, pointer);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

View File

@ -0,0 +1,15 @@
#pragma once
class UniformBuffer {
public:
UniformBuffer (unsigned int size);
~UniformBuffer();
void setData(unsigned int offset, unsigned int size, void* data);
void setDescriptor(unsigned int index, unsigned int size, unsigned int stride, void* pointer);
private:
unsigned int Id;
};

View File

@ -22,8 +22,8 @@ private:
std::vector<unsigned int > indices;
GpuBuffer vertexBuffer;
GpuBuffer elementBuffer;
Buffer vertexBuffer;
Buffer elementBuffer;
VertexArray VAO;

View File

@ -16,8 +16,8 @@ void BarinkEngine::Renderer::Prepare(Scene& scene ) {
auto group = scene.getReg().view<BarinkEngine::Render3DComponent>();
group.each([](auto enity, BarinkEngine::Render3DComponent& renderComponent) {
VertexArray va = VertexArray();
GpuBuffer vertexBuffer = GpuBuffer();
GpuBuffer elementBuffer = GpuBuffer();
Buffer vertexBuffer = Buffer();
Buffer elementBuffer = Buffer();
va.Create();
va.Bind();
@ -45,6 +45,8 @@ void BarinkEngine::Renderer::Prepare(Scene& scene ) {
});
}
void BarinkEngine::Renderer::Render(Scene& scene)
{
auto group = scene.getReg().view<TransformComponent, Render3DComponent>();
@ -66,7 +68,7 @@ void BarinkEngine::Renderer::Render(Scene& scene)
renderComponent.shader.setUniformMat4("V", cam.GetViewMatrix());
renderComponent.shader.setUniformMat4("P", projection);
//std::cout << "Draw " << renderComponent.mesh.elements.size() << " elements" << std::endl;
glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(renderComponent.mesh.elements.size()) ,
GL_UNSIGNED_INT, NULL);
@ -75,5 +77,17 @@ void BarinkEngine::Renderer::Render(Scene& scene)
}
void Render(Framebuffer& framebuffer)
{}
void BarinkEngine::Renderer::Render(Framebuffer& framebuffer, Scene& scene)
{
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.GetId());
glClearColor(.5f, .0f, .5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Render(scene);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

View File

@ -22,6 +22,6 @@ namespace BarinkEngine {
void Prepare(Scene& scene);
void Render(Scene& scene );
void Render(Framebuffer& framebuffer);
void Render(Framebuffer& framebuffer, Scene& scene);
};
}

View File

@ -1,4 +1,4 @@
#include "src/PerfCounter.h"
#include "PerfCounter.h"
#include <imgui.h>
#include <iostream>
@ -66,5 +66,5 @@ void PerfSampler::Stop()
auto ms = durationInuSeconds * 0.001f;
std::cout << "[" << name << "]" << "Took: " << durationInuSeconds << " us (" << ms << " ms)" << std::endl;
// std::cout << "[" << name << "]" << "Took: " << durationInuSeconds << " us (" << ms << " ms)" << std::endl;
}

View File

@ -3,6 +3,7 @@
#include "Components.h"
Scene::Scene()
{
m_registry = entt::basic_registry();
}
Scene::~Scene()

View File

@ -4,7 +4,8 @@ kind "ConsoleApp"
buildmessage "Building editor ..."
links{
"BarinkEngine"
"BarinkEngine",
"ImGuizmo"
}
includedirs{
@ -24,7 +25,9 @@ includedirs{
"./../libs/glew/include",
"./../libs/glm",
"./../libs/ImGui",
"./../libs/guizmo",
"./../libs/entt/src",
"./include"
@ -37,4 +40,5 @@ libdirs {
files {
"./include/*.h",
"./src/*.cpp"
}
}

View File

@ -1,83 +1,79 @@
#include "../../BarinkEngine/src/BarinkEngine.h"
#include "../../BarinkEngine/src/Scene/SceneManager.h"
#include "../../BarinkEngine/src/Scene/SceneNodeTypes.h"
#include "../../BarinkEngine/src/AssetManager/ModelImporter.h"
#include "../../BarinkEngine/src/Graphics/Framebuffer.h"
#include "../../BarinkEngine/src/Graphics/Memory/Framebuffer.h"
#include <imgui.h>
#include "../../BarinkEngine/src/PerfCounter.cpp"
#include "../../BarinkEngine/src/Scene/Entity.h"
#include "stb_image.h"
#include "../../libs/guizmo/ImGuizmo.h"
#include "../../libs/glm/glm/gtc/type_ptr.hpp"
#include <glm/gtc/matrix_transform.hpp>
#include "widgets/widgets.h"
/*
* Define globals
*/
Shader* shader;
char* code = new char[254];
const std::string vertexShaderSource = "build/Debug/test.vs";
const std::string fragmentShaderSource = "build/Debug/test.fs";
BarinkEngine::ModelImporter* MI = new BarinkEngine::ModelImporter();
Framebuffer* framebuffer;
Scene* Level1;
BarinkEngine::SceneObject* cube;
Scene Level1;
BarinkEngine::SceneObject* Model;
Entity cube;
/*
* Runs once at startup
* - USe to initialize the game/sandbox/demo
*/
void Start() {
auto io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/Roboto-Regular.ttf", 18);
framebuffer = new Framebuffer();
// Build a basic test scene
// NOTE: This will later be done through an editor
// Create a level and load it as the current level
std::string levelName("Test Level");
Level1 = SceneManager::CreateScene(levelName);
SceneManager::LoadScene(*Level1);
auto importer = BarinkEngine::ModelImporter();
// Create a cube
Model = importer.Import("build/Debug/Models/Cube.obj");
cube = Level1.AddEntity("cube");
auto& render3DComponent = cube.AddComponent<BarinkEngine::Render3DComponent>();
render3DComponent.mesh = *(Model->renderable->mesh);
shader = new Shader(vertexShaderSource, fragmentShaderSource);
cube.GetComponent<BarinkEngine::TransformComponent>().transform = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 0.0f, 5.0f));
renderer.Prepare(Level1);
// Create a cube node
// create an ambient light source
auto AmbientLight = Level1.AddEntity("AmbientLight");
AmbientLight.AddComponent<BarinkEngine::LightComponent>();
cube = MI->Import("build/Debug/Models/cube.obj");
cube->renderable->material = new Material(*shader);
cube->renderable->material->Color = glm::vec3(1.0f, 0.0f, 0.0f);
std::cout << "Colour attachment id; " << framebuffer->GetColourAttachment() << std::endl;
// What is in cube now ??
std::cout << "mesh vertices: " << cube->renderable->mesh->vertices.size() << std::endl;
std::cout << "mesh elements: " << cube->renderable->mesh->elements.size() << std::endl;
renderer.Prepare(Level1);
Level1->GetRoot().addChild(*cube);
memset(code, '\0', 254);
framebuffer = new Framebuffer();
std::cout << "Colour attachment id; " << framebuffer->GetColourAttachment() << std::endl;
// TODO: Move to runtime/ Engine
// NOTE: Submits should later be done through walking the sceneTree
renderer.Submit(cube->renderable);
}
/*
* Runs every frame
* - Use to draw Immediate mode graphics (Not meant for HUD's )
*/
void ImmediateGraphicsDraw()
{
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport());
{ ImGui::DockSpaceOverViewport(ImGui::GetMainViewport());
// Show a menu bar
ImGui::BeginMainMenuBar();
if (ImGui::BeginMenu("Application")) {
if (ImGui::MenuItem("Preferences")) {
}
if (ImGui::MenuItem("Exit")) {
// TODO: Exit application
}
ImGui::EndMenu();
}
@ -85,45 +81,43 @@ void ImmediateGraphicsDraw()
// Show internal BarinkEngine stats
ShowStats();
//ShowStats();
Viewport(*framebuffer , Level1);
Inspector();
SceneExplorer(Level1);
Settings();
AssetsFinder();
Console();
ImGui::Begin("Viewport");
ImGui::Image((void*)(intptr_t)framebuffer->GetColourAttachment(), ImVec2{ 800,600 });
ImGui::End();
static float Zoom = 90;
static glm::vec3 Position = glm::vec3(0.0f, 0.0f, 0.0f);
static glm::vec3 Rotation = glm::vec3(0.0f, 0.0f, 0.0f);
ImGui::Begin("Camera");
ImGui::SliderFloat("Zoom", &Zoom, 10, 190);
ImGui::InputFloat3("Position:", &Position[0]);
ImGui::InputFloat3("Rotation:", &Rotation[0]);
ImGui::End();
ImGui::Begin("Scripting");
ImGui::Text("Lua Code");
ImGui::InputTextMultiline("##", code, 255);
bool runCode = ImGui::Button("Run");
ImGui::End();
ImGui::Begin("Scene Explorer");
ImGui::End();
ImGui::ShowMetricsWindow();
}
void Render()
{
renderer.Render( *framebuffer, Level1);
}
/*
* Runs every frame
* - Meant for game logic ( non-physics related)
*/
void Update()
{
// glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->GetId());
renderer.Render(*framebuffer);
}
// glBindFramebuffer(GL_FRAMEBUFFER, 0);
/*
* Runs every physics update
*/
void fixed_update()
{
}
/*
@ -133,6 +127,4 @@ void Update()
void Stop()
{
delete framebuffer;
delete MI;
delete shader;
}

View File

@ -0,0 +1,79 @@
#pragma once
#include <glm/glm.hpp>
#include <imgui.h>
inline void Inspector () {
ImGui::Begin("Inspector");
static float Zoom = 90;
static glm::vec3 Position = glm::vec3(0.0f, 0.0f, 0.0f);
static glm::vec3 Rotation = glm::vec3(0.0f, 0.0f, 0.0f);
ImGui::BeginChild("Camera");
ImGui::SliderFloat("Zoom", &Zoom, 10, 190);
ImGui::InputFloat3("Position:", &Position[0]);
ImGui::InputFloat3("Rotation:", &Rotation[0]);
ImGui::EndChild();
ImGui::BeginChild("Scripting");
ImGui::Text("Hello world!");
ImGui::EndChild();
ImGui::End();
}
inline void SceneExplorer(Scene& scene)
{
ImGui::Begin("Scene Explorer");
scene.getReg().each([&](auto entity) {
auto id = scene.getReg().get<BarinkEngine::IdentifierComponent>(entity);
ImGui::LabelText("##myObject", "%s", id.name.c_str());
});
ImGui::End();
}
inline void Viewport(Framebuffer& framebuffer , Scene& scene ) {
unsigned int viewportWindowFlags = ImGuiWindowFlags_NoTitleBar
| ImGuiWindowFlags_NoDecoration
| ImGuiWindowFlags_NoScrollbar
| ImGuiWindowFlags_NoMove
| ImGuiWindowFlags_NoCollapse;
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{ 0,0 });
ImGui::Begin("Viewport", false, viewportWindowFlags );
ImGui::Image((void*)(intptr_t)framebuffer.GetColourAttachment(), ImVec2{ (float)800,(float)600 });
ImGuizmo::SetDrawlist();
ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, ImGui::GetWindowWidth(), ImGui::GetWindowHeight());
ImGuizmo::Enable(true);
auto cam = glm::mat4(1.0f);
//ImGuizmo::Manipulate(glm::value_ptr(static_cam), glm::value_ptr(static_projection), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(trans));
ImGuizmo::ViewManipulate(glm::value_ptr(cam), 8.0f, ImVec2{ 0.0f,0.0f }, ImVec2{ 128.0f,128.0f }, 0x10101010);
ImGui::End();
ImGui::PopStyleVar();
}
inline void Settings() {
ImGui::Begin("Settings");
ImGui::LabelText("##title-settings", "Fine grain control over your engine... ");
ImGui::End();
}
inline void Console() {
ImGui::Begin("Console", false );
ImGui::Dummy(ImVec2{ 128, 128 });
ImGui::End();
}
inline void AssetsFinder() {
ImGui::Begin("Asset-Finder", false );
ImGui::Dummy(ImVec2{ 128, 128 });
ImGui::End();
}