From bc1254e427ed29f36a59c3ac15062324db2a50fe Mon Sep 17 00:00:00 2001 From: nigelbarink Date: Sun, 23 Oct 2022 12:57:58 +0200 Subject: [PATCH] Rendering a cube basics through ENTT --- .../src/Graphics/Memory/VertexArray.h | 2 + BarinkEngine/src/Graphics/Renderer.cpp | 26 ++++++- BarinkEngine/src/Scene/Components.h | 12 +++- BarinkEngine/src/Scene/Entity.h | 7 +- BarinkEngine/src/Scene/Scene.cpp | 9 ++- BarinkEngine/src/Shaders/fragment.shader | 2 +- SandboxApp/src/Sandbox.cpp | 71 +++++++++++++------ 7 files changed, 103 insertions(+), 26 deletions(-) diff --git a/BarinkEngine/src/Graphics/Memory/VertexArray.h b/BarinkEngine/src/Graphics/Memory/VertexArray.h index ea5f551..148c7d0 100644 --- a/BarinkEngine/src/Graphics/Memory/VertexArray.h +++ b/BarinkEngine/src/Graphics/Memory/VertexArray.h @@ -10,6 +10,8 @@ void Create(); void Bind(); void Unbind(); +unsigned int getID() { return id; } + void Delete(); void AttachAttribute(unsigned int index, int size, int stride); diff --git a/BarinkEngine/src/Graphics/Renderer.cpp b/BarinkEngine/src/Graphics/Renderer.cpp index c816229..886de01 100644 --- a/BarinkEngine/src/Graphics/Renderer.cpp +++ b/BarinkEngine/src/Graphics/Renderer.cpp @@ -1,4 +1,6 @@ #include "Renderer.h" +#include "../Scene/Components.h" +#include float Angle = 0.0; Camera cam = Camera(glm::vec3(16.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f), 90.0f); @@ -14,7 +16,29 @@ BarinkEngine::Renderer::~Renderer() void BarinkEngine::Renderer::Render(Scene& scene) -{} +{ + auto group = scene.getReg().view(); + group.each([](auto entity , TransformComponent& trans, Render3DComponent& render) + { + glBindVertexArray(render.VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, render.IBO); + + render.shader.Use(); + + render.shader.setUniformVec3("Color", render.color); + + render.shader.setUniformMat4("M", glm::mat4(1.0f)); + render.shader.setUniformMat4("V", cam.GetViewMatrix()); + render.shader.setUniformMat4("P", projection); + + + glDrawElements(GL_TRIANGLES, render.ElementCount, + GL_UNSIGNED_INT, NULL); + + glBindVertexArray(0); + }); + +} diff --git a/BarinkEngine/src/Scene/Components.h b/BarinkEngine/src/Scene/Components.h index 3f6c5c3..fe6beb3 100644 --- a/BarinkEngine/src/Scene/Components.h +++ b/BarinkEngine/src/Scene/Components.h @@ -1,7 +1,11 @@ #pragma once #include +#include "../Graphics/Primitives/Shader.h" namespace BarinkEngine { + struct IdentifierComponent { + std::string name; + }; struct TransformComponent { glm::mat4& transform = glm::mat4(1.0f); @@ -17,7 +21,13 @@ namespace BarinkEngine { struct Render3DComponent { unsigned int VAO; unsigned int IBO; - + unsigned int ElementCount; + glm::vec3 color; + Shader shader; + Render3DComponent() + : shader(Shader("build/Debug/test.vs", "build/Debug/test.fs") ) + { + } }; struct Render2DComponent { diff --git a/BarinkEngine/src/Scene/Entity.h b/BarinkEngine/src/Scene/Entity.h index 1d45ee0..18ca19e 100644 --- a/BarinkEngine/src/Scene/Entity.h +++ b/BarinkEngine/src/Scene/Entity.h @@ -10,10 +10,15 @@ public: template - T AddComponent() { + T& AddComponent() { return m_scene->m_registry.emplace(m_entity); } + template + T* GetComponent() { + return m_scene->m_registry.try_get(m_entity); + } + private: entt::entity m_entity; Scene* m_scene; diff --git a/BarinkEngine/src/Scene/Scene.cpp b/BarinkEngine/src/Scene/Scene.cpp index fab0863..98be8b8 100644 --- a/BarinkEngine/src/Scene/Scene.cpp +++ b/BarinkEngine/src/Scene/Scene.cpp @@ -1,5 +1,6 @@ #include "Scene.h" #include "Entity.h" +#include "Components.h" Scene::Scene() { } @@ -9,6 +10,12 @@ Scene::~Scene() Entity Scene::AddEntity(std::string& name) { - return { m_registry.create(), this }; + Entity entity = { m_registry.create(), this }; + + entity.AddComponent(); + entity.AddComponent(); + + + return entity; } diff --git a/BarinkEngine/src/Shaders/fragment.shader b/BarinkEngine/src/Shaders/fragment.shader index 8325702..5695671 100644 --- a/BarinkEngine/src/Shaders/fragment.shader +++ b/BarinkEngine/src/Shaders/fragment.shader @@ -7,5 +7,5 @@ uniform sampler2D Texture; void main(){ - FragColor = vec4(1.0f, 0.0f, 0.0f , 1.0f); // mix ( texture(Texture, TexCoord), vec4(Color, 1.0f), 1.0f); + FragColor = vec4(color , 1.0f); // mix ( texture(Texture, TexCoord), vec4(Color, 1.0f), 1.0f); } \ No newline at end of file diff --git a/SandboxApp/src/Sandbox.cpp b/SandboxApp/src/Sandbox.cpp index 8eca6c1..cffa393 100644 --- a/SandboxApp/src/Sandbox.cpp +++ b/SandboxApp/src/Sandbox.cpp @@ -2,43 +2,61 @@ #include "../../BarinkEngine/src/Scene/Components.h" #include "../../BarinkEngine/src/Scene/Scene.h" #include "../../BarinkEngine/src/Scene/Entity.h" +#include "../../BarinkEngine/src/AssetManager/ModelImporter.h" #include #include "GUI.h" #include "Util.h" #include + /* * Define globals */ -//Shader* shader; -const std::string vertexShaderSource = "build/Debug/test.vs"; -const std::string fragmentShaderSource = "build/Debug/test.fs"; - Scene scene; +VertexArray va = VertexArray(); +GpuBuffer vertexBuffer = GpuBuffer(); +GpuBuffer elementBuffer = GpuBuffer(); +BarinkEngine::Renderable* renderable; +BarinkEngine::SceneObject* object; +Entity cube; /* * Runs once at startup * - USe to initialize the game/sandbox/demo */ void Start() { - // shader = new Shader(vertexShaderSource, fragmentShaderSource); - auto cube = scene.AddEntity((std::string&)"cube"); - auto transform = cube.AddComponent(); - auto render3DComponent = cube.AddComponent(); + cube = scene.AddEntity((std::string&)"cube"); + auto& render3DComponent = cube.AddComponent(); + auto importer = BarinkEngine::ModelImporter(); - auto cube2 = scene.AddEntity((std::string&)"cube1"); + va.Create(); + va.Bind(); - auto cube3 = scene.AddEntity((std::string&)"cube2"); - auto Transform2 = cube3.AddComponent(); - auto render3DComponent2 = cube3.AddComponent(); + object = importer.Import("build/Debug/Models/Cube.obj"); + renderable = object->renderable; + render3DComponent.ElementCount = static_cast(renderable->mesh->elements.size()); + + vertexBuffer.createBuffer(); + vertexBuffer.Bind(false); + vertexBuffer.setBufferData((void*)&renderable->mesh->vertices[0], renderable->mesh->vertices.size() * sizeof(BarinkEngine::Vertex), false); - - // Run over every transform component - auto view = scene.getReg().view(); - view.each([](auto entity, auto& transform) { - std::cout << "Found a transform !" << std::endl; - }); - - + elementBuffer.createBuffer(); + elementBuffer.Bind(true); + elementBuffer.setBufferData((void*)&renderable->mesh->elements[0], renderable->mesh->elements.size() * sizeof(unsigned int), true); + + va.AttachAttribute(0, 3, sizeof(BarinkEngine::Vertex)); + + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(BarinkEngine::Vertex), (void*)0); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + va.Unbind(); + vertexBuffer.Unbind(false); + elementBuffer.Unbind(true); + + render3DComponent.VAO = va.getID(); + render3DComponent.IBO = elementBuffer.getBufferID(); + render3DComponent.color = glm::vec3(1.0f, 0.0f, 0.0f); + std::cout << render3DComponent.ElementCount << std::endl; } /* @@ -49,6 +67,18 @@ void ImmediateGraphicsDraw() { // Show internal BarinkEngine stats ShowStats(); + + ImGui::Begin("Render edit"); + + auto a = cube.GetComponent(); + + ImGui::DragFloat3("Color", &a->color[0], 0.01f, 0.0f, 1.0f); + + ImGui::End(); + + + + } /* @@ -57,7 +87,6 @@ void ImmediateGraphicsDraw() */ void Update() { - renderer.Render(scene); }