From 52d34f48abc785fabf5f977edeb63fdbbee1e7ad Mon Sep 17 00:00:00 2001 From: Arnau Alier Torres Date: Wed, 7 May 2025 15:47:13 +0200 Subject: [PATCH] Refactor and make Shader and Mesh managment systems --- Deer/Include/Deer/Asset.h | 87 ------------------- Deer/Include/Deer/DataStore.h | 5 +- Deer/Include/DeerRender/Components.h | 20 +++-- Deer/Include/DeerRender/Mesh.h | 9 +- Deer/Include/DeerRender/Render/Shader.h | 3 +- Deer/Include/DeerRender/Render/VertexArray.h | 6 +- Deer/Include/DeerRender/Shader.h | 36 ++++++++ Deer/src/Deer/Asset/AssetManager.cpp | 6 -- Deer/src/Deer/Scene/Entity.cpp | 6 +- Deer/src/Deer/Scene/Enviroment.cpp | 1 - Deer/src/Deer/Scene/Scene.cpp | 4 + .../Scene/Serialization/EntitySerialization.h | 4 +- ...MeshGPULoader.cpp => MeshModelLoading.cpp} | 42 ++++++++- Deer/src/DeerRender/Render/MeshUtils.cpp | 21 ----- Deer/src/DeerRender/Render/MeshUtils.h | 12 --- Deer/src/DeerRender/Render/Render.cpp | 8 +- Deer/src/DeerRender/Render/Render.h | 4 +- Deer/src/DeerRender/Render/RenderAPI.h | 4 +- Deer/src/DeerRender/Render/RenderCommand.h | 5 +- Deer/src/DeerRender/Render/RenderUtils.cpp | 32 +++---- Deer/src/DeerRender/Render/RenderUtils.h | 8 +- Deer/src/DeerRender/Scene/Environment.cpp | 47 +++++----- Deer/src/DeerRender/Scene/GizmoRenderer.cpp | 4 +- .../MeshRenderComponentSerialization.h | 4 +- .../src/DeerRender/Shader/ShaderDataStore.cpp | 61 +++++++++++++ Deer/src/DeerRender/Shader/ShaderLoad.cpp | 38 ++++++++ Deer/src/DeerRender/Voxels/VoxelWorld.cpp | 3 +- .../DeerRender/Voxels/VoxelWorldRenderData.h | 2 +- .../VoxelWorld_AmbientLightPropagation.cpp | 1 - .../VoxelWorld_SolidVoxelGeneration.cpp | 5 +- Deer/src/Plattform/OpenGL/OpenGLRenderAPI.cpp | 10 ++- Deer/src/Plattform/OpenGL/OpenGLRenderAPI.h | 4 +- Deer/src/Plattform/OpenGL/OpenGLShader.cpp | 4 +- Deer/src/Plattform/OpenGL/OpenGLShader.h | 1 + .../Plattform/OpenGL/OpenGLVertexArray.cpp | 8 +- Deer/src/Plattform/OpenGL/OpenGLVertexArray.h | 1 - DeerStudio/src/DeerStudio/DeerStudio.cpp | 7 +- roe/imgui.ini | 20 ++--- 38 files changed, 300 insertions(+), 243 deletions(-) delete mode 100755 Deer/Include/Deer/Asset.h create mode 100644 Deer/Include/DeerRender/Shader.h delete mode 100755 Deer/src/Deer/Asset/AssetManager.cpp rename Deer/src/DeerRender/Mesh/{MeshGPULoader.cpp => MeshModelLoading.cpp} (56%) delete mode 100755 Deer/src/DeerRender/Render/MeshUtils.cpp delete mode 100755 Deer/src/DeerRender/Render/MeshUtils.h create mode 100644 Deer/src/DeerRender/Shader/ShaderDataStore.cpp create mode 100644 Deer/src/DeerRender/Shader/ShaderLoad.cpp diff --git a/Deer/Include/Deer/Asset.h b/Deer/Include/Deer/Asset.h deleted file mode 100755 index 29c9eb2..0000000 --- a/Deer/Include/Deer/Asset.h +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once -#include -#include - -#include "Deer/DataStore.h" -#include "Deer/Log.h" -#include "Deer/Path.h" -#include "Deer/Memory.h" - -// File to manage Assets -// TODO: Delete Assets and set a custom method of loading - -namespace Deer { - template - struct Asset { - public: - Asset() : id(0), name("null") {} - Asset(uint32_t id, const std::filesystem::path& assetLocation) - : id(id), name(assetLocation) { - try { - uint32_t size; - uint8_t* data = DataStore::readFile(assetLocation, &size); - - value = T::create(data, size); - - delete[] data; - } catch (const std::string& error) { - DEER_CORE_ERROR("Error loading asset {0}\n{1}", - assetLocation.generic_string().c_str(), - error.c_str()); - } - } - - inline uint32_t getAssetID() const { return id; } - inline Path& getAssetLocation() { return name; } - inline T& getValue() { return value; } - - private: - Path name; - uint32_t id; - - Scope value; - }; - - template <> - class Asset { - public: - Asset() : id(0), name("null") {} - Asset(uint32_t id, const std::filesystem::path& assetLocation) - : id(id), name(assetLocation) {} - - inline uint32_t getAssetID() const { return id; } - inline Path& getAssetLocation() { return name; } - - Ref value; - - private: - uint32_t id; - Path name; - }; - - namespace AssetManager { - extern std::vector> assets; - - template - inline Asset& getAsset(uint32_t assetID) { - return *(Asset*)&(assets[assetID]); - } - - template - inline uint32_t loadAsset(const std::filesystem::path& assetLocation) { - for (size_t id = 0; id < assets.size(); ++id) { - if (assets[id].getAssetLocation() == assetLocation) return id; - } - - uint32_t assetID = assets.size(); - - Asset asset(assetID, assetLocation); - assets.push_back(*(Asset*)&(asset)); - return assetID; - } - - inline const std::filesystem::path getAssetLocation(uint32_t assetID) { - return assets[assetID].getAssetLocation(); - } - } // namespace AssetManager -} // namespace Deer diff --git a/Deer/Include/Deer/DataStore.h b/Deer/Include/Deer/DataStore.h index ccae3b6..94a2beb 100755 --- a/Deer/Include/Deer/DataStore.h +++ b/Deer/Include/Deer/DataStore.h @@ -17,6 +17,7 @@ #define DEER_MESH_PATH "meshes" #define DEER_MESH_EXTENSION ".dmesh" +#define DEER_SHADER_EXTENSION ".glsl" #define DEER_BIN_PATH "bin" #define DEER_TEMP_PATH "tmp" @@ -38,9 +39,9 @@ namespace Deer { // TODO: Add safety // Returns the data of the specified file path - bool loadFileData(const Path& id, const Path& name,uint8_t** data, uint32_t* size); + bool loadFileData(const Path& id, const Path& name, uint8_t** data, uint32_t* size); // Returns the data of the specified file path avoiding extension - bool loadGlobalFileData(const Path& id, const Path& name,uint8_t** data, uint32_t* size); + bool loadGlobalFileData(const Path& id, const Path& name, uint8_t** data, uint32_t* size); void freeFileData(uint8_t*); void createFolder(const Path& path); diff --git a/Deer/Include/DeerRender/Components.h b/Deer/Include/DeerRender/Components.h index c06d4c2..724934c 100755 --- a/Deer/Include/DeerRender/Components.h +++ b/Deer/Include/DeerRender/Components.h @@ -12,16 +12,20 @@ #define MAX_TEXTURE_BINDINGS 4 namespace Deer { - struct MeshRenderComponent { - MeshRenderComponent() = default; - MeshRenderComponent(const MeshRenderComponent&) = default; - MeshRenderComponent(uint32_t _mesh, uint32_t _shader) : shaderAssetID(_shader), meshAssetID(_mesh) { } + struct MeshComponent { + MeshComponent() = default; + MeshComponent(uint16_t _meshId) : meshId(_meshId) { } + MeshComponent(const MeshComponent&) = default; - Ref shader; - Ref vertexArray; + uint16_t meshId; + }; - uint32_t shaderAssetID = 0; - uint32_t meshAssetID = 0; + struct ShaderComponent { + ShaderComponent() = default; + ShaderComponent(uint16_t _shaderId) : shaderId(_shaderId) { } + ShaderComponent(const ShaderComponent&) = default; + + uint16_t shaderId; }; struct TextureBindingComponent { diff --git a/Deer/Include/DeerRender/Mesh.h b/Deer/Include/DeerRender/Mesh.h index 163cb60..c0adaf7 100644 --- a/Deer/Include/DeerRender/Mesh.h +++ b/Deer/Include/DeerRender/Mesh.h @@ -4,6 +4,8 @@ #include "Deer/Path.h" #include "DeerRender/Render/VertexArray.h" +#define SCENE_MAX_MESH_COUNT 1024 + namespace Deer { // The real position is the axis divided by 256, the model precition is 1 / 256.0f struct VertexPosition { @@ -56,8 +58,11 @@ namespace Deer { } }; - namespace Mesh { - Ref loadModelToGPU(const MeshData&); + namespace MeshManager { + uint16_t loadModel(const MeshData&); + VertexArray& getModel(uint16_t model_id); + + void unloadAllModels(); } namespace DataStore { diff --git a/Deer/Include/DeerRender/Render/Shader.h b/Deer/Include/DeerRender/Render/Shader.h index 4fe06b9..889daa0 100755 --- a/Deer/Include/DeerRender/Render/Shader.h +++ b/Deer/Include/DeerRender/Render/Shader.h @@ -21,6 +21,7 @@ namespace Deer { static Ref create(const std::string& filePath); static Ref create(uint8_t* data, uint32_t size); - static Ref create(const std::string& vertexSrc, const std::string& fragmentSrc); + + static Shader* create(const std::string& vertexSrc, const std::string& fragmentSrc); }; } \ No newline at end of file diff --git a/Deer/Include/DeerRender/Render/VertexArray.h b/Deer/Include/DeerRender/Render/VertexArray.h index 78807ec..9ba8bdb 100755 --- a/Deer/Include/DeerRender/Render/VertexArray.h +++ b/Deer/Include/DeerRender/Render/VertexArray.h @@ -19,8 +19,10 @@ namespace Deer { virtual const Ref& getIndexBuffer() = 0; - static Ref create(); - static Ref create(uint8_t* data, uint32_t size); + //static Ref create(); + //static Ref create(uint8_t* data, uint32_t size); + static VertexArray* create(); + static VertexArray* create(uint8_t* data, uint32_t size); }; } diff --git a/Deer/Include/DeerRender/Shader.h b/Deer/Include/DeerRender/Shader.h new file mode 100644 index 0000000..eac7536 --- /dev/null +++ b/Deer/Include/DeerRender/Shader.h @@ -0,0 +1,36 @@ +#pragma once +#include "DeerRender/Render/Shader.h" +#include "Deer/Path.h" + +#include + +#define SCENE_MAX_SHADER_COUNT 1024 + +namespace Deer { + struct ShaderData { + std::string vertexShader; + std::string fragmentShader; + + ShaderData() = default; + ~ShaderData() = default; + + ShaderData(const ShaderData&) = delete; + ShaderData& operator=(const ShaderData&) = delete; + + void freeData() { + vertexShader.clear(); + fragmentShader.clear(); + } + }; + + namespace ShaderManager { + uint16_t loadShader(const ShaderData&); + Shader& getShader(uint16_t); + + void unloadAllShaders(); + } + + namespace DataStore { + void loadShader(ShaderData& data, const Path& name); + } // namespace DataStore +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/Deer/Asset/AssetManager.cpp b/Deer/src/Deer/Asset/AssetManager.cpp deleted file mode 100755 index 34e3716..0000000 --- a/Deer/src/Deer/Asset/AssetManager.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "Deer/Asset.h" - -namespace Deer { - std::vector> AssetManager::assets; -} - diff --git a/Deer/src/Deer/Scene/Entity.cpp b/Deer/src/Deer/Scene/Entity.cpp index 45fb2d6..8f34bdd 100755 --- a/Deer/src/Deer/Scene/Entity.cpp +++ b/Deer/src/Deer/Scene/Entity.cpp @@ -55,10 +55,10 @@ namespace Deer { getComponent(); #ifdef DEER_RENDER - if (m_environment->m_registry.any_of( + if (m_environment->m_registry.any_of( m_entityHandle)) - creation.addComponent( - getComponent()); + creation.addComponent( + getComponent()); if (m_environment->m_registry.any_of(m_entityHandle)) creation.addComponent( diff --git a/Deer/src/Deer/Scene/Enviroment.cpp b/Deer/src/Deer/Scene/Enviroment.cpp index 8a65518..111e906 100755 --- a/Deer/src/Deer/Scene/Enviroment.cpp +++ b/Deer/src/Deer/Scene/Enviroment.cpp @@ -1,7 +1,6 @@ #include "Deer/Enviroment.h" #include "Deer/Application.h" -#include "Deer/Asset.h" #include "Deer/Components.h" #include "Deer/Log.h" #include "DeerRender/Render/Render.h" diff --git a/Deer/src/Deer/Scene/Scene.cpp b/Deer/src/Deer/Scene/Scene.cpp index ebe4890..dc057a0 100755 --- a/Deer/src/Deer/Scene/Scene.cpp +++ b/Deer/src/Deer/Scene/Scene.cpp @@ -17,12 +17,16 @@ #ifdef DEER_RENDER #include "DeerRender/Voxels/VoxelWorldRenderData.h" +#include "DeerRender/Mesh.h" #endif namespace Deer { void Scene::clear() { environment.clear(); VoxelWorld::clear(); +#ifdef DEER_RENDER + MeshManager::unloadAllModels(); +#endif } bool Scene::getExecutingState() { diff --git a/Deer/src/Deer/Scene/Serialization/EntitySerialization.h b/Deer/src/Deer/Scene/Serialization/EntitySerialization.h index e150d6d..f587eaf 100755 --- a/Deer/src/Deer/Scene/Serialization/EntitySerialization.h +++ b/Deer/src/Deer/Scene/Serialization/EntitySerialization.h @@ -48,7 +48,7 @@ namespace Deer { #ifdef DEER_RENDER if (!is_server_serialization) { - saveComponent( + saveComponent( archive, "meshRenderComponent", entity); saveComponent(archive, "cameraComponent", entity); @@ -76,7 +76,7 @@ namespace Deer { entity.setParent(m_entity.env->getEntity(rc.parent_id)); #ifdef DEER_RENDER if (!is_server_serialization) { - loadComponent( + loadComponent( archive, "meshRenderComponent", entity); loadComponent(archive, "cameraComponent", entity); diff --git a/Deer/src/DeerRender/Mesh/MeshGPULoader.cpp b/Deer/src/DeerRender/Mesh/MeshModelLoading.cpp similarity index 56% rename from Deer/src/DeerRender/Mesh/MeshGPULoader.cpp rename to Deer/src/DeerRender/Mesh/MeshModelLoading.cpp index 05ef863..d2791c1 100644 --- a/Deer/src/DeerRender/Mesh/MeshGPULoader.cpp +++ b/Deer/src/DeerRender/Mesh/MeshModelLoading.cpp @@ -1,10 +1,44 @@ #include "DeerRender/Mesh.h" #include "Deer/Log.h" -#include "DeerRender/Render/Buffer.h" -namespace Deer{ - Ref Mesh::loadModelToGPU(const MeshData& data) { - Ref vertexArray = VertexArray::create(); +namespace Deer { + namespace MeshManager { + size_t minModelId = 0; + VertexArray* meshes[SCENE_MAX_MESH_COUNT]{}; + VertexArray* loadModelToGPU(const MeshData& data); + } + + void MeshManager::unloadAllModels() { + for (uint16_t i = 0; i < minModelId; i++) { + delete meshes[i]; + meshes[i] = nullptr; + } + + minModelId = 0; + } + + uint16_t MeshManager::loadModel(const MeshData& meshData) { + if (minModelId >= SCENE_MAX_MESH_COUNT) { + DEER_CORE_ERROR("Max model loaded into a scene"); + return -1; + } + + uint16_t modelId = minModelId; + minModelId++; + + meshes[modelId] = loadModelToGPU(meshData); + + return modelId; + } + + VertexArray& MeshManager::getModel(uint16_t model_id) { + DEER_CORE_ASSERT(model_id > 0 && model_id < minModelId, "Invalid model id, id is not loaded"); + + return *meshes[model_id]; + } + + VertexArray* MeshManager::loadModelToGPU(const MeshData& data) { + VertexArray* vertexArray = VertexArray::create(); vertexArray->bind(); Ref vertexPositionBuffer = VertexBuffer::create(data.vertexPositionsData, data.vertexCount * sizeof(VertexPosition)); diff --git a/Deer/src/DeerRender/Render/MeshUtils.cpp b/Deer/src/DeerRender/Render/MeshUtils.cpp deleted file mode 100755 index 68c4ce7..0000000 --- a/Deer/src/DeerRender/Render/MeshUtils.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "MeshUtils.h" -#include "DeerRender/Render/Buffer.h" -#include "DeerRender/Render/VertexArray.h" - -namespace Deer { - Ref MeshUtils::createMesh(int vertexCount, float* vertices, int indexCount, unsigned int* m_indices) { - Ref vBuffer = VertexBuffer::create(vertices, vertexCount * sizeof(float)); - Ref iBuffer = IndexBuffer::create(m_indices, indexCount * sizeof(unsigned int), IndexDataType::Unsigned_Int); - - BufferLayout layout({ - {"a_Position", DataType::Float3, ShaderDataType::FloatingPoint} - }); - vBuffer->setLayout(layout); - - Ref vertexArray = VertexArray::create(); - vertexArray->addVertexBuffer(vBuffer); - vertexArray->setIndexBuffer(iBuffer); - - return vertexArray; - } -} diff --git a/Deer/src/DeerRender/Render/MeshUtils.h b/Deer/src/DeerRender/Render/MeshUtils.h deleted file mode 100755 index b909dc6..0000000 --- a/Deer/src/DeerRender/Render/MeshUtils.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "Deer/Memory.h" - -namespace Deer { - class VertexArray; - - class MeshUtils { - public: - static Ref createMesh(int vertexCount, float* vertices, int indexCount, unsigned int* m_indices); - }; -} - diff --git a/Deer/src/DeerRender/Render/Render.cpp b/Deer/src/DeerRender/Render/Render.cpp index c6f57e9..eea9b03 100755 --- a/Deer/src/DeerRender/Render/Render.cpp +++ b/Deer/src/DeerRender/Render/Render.cpp @@ -12,13 +12,13 @@ namespace Deer { } - void Render::submit(const Ref& vertexArray) { - vertexArray->bind(); + void Render::submit(VertexArray& vertexArray) { + vertexArray.bind(); RenderCommand::drawIndex(vertexArray); } - void Render::submitLine(const Ref& vertexArray) { - vertexArray->bind(); + void Render::submitLine(VertexArray& vertexArray) { + vertexArray.bind(); RenderCommand::drawLines(vertexArray); } diff --git a/Deer/src/DeerRender/Render/Render.h b/Deer/src/DeerRender/Render/Render.h index c7a3cd3..0d8440b 100755 --- a/Deer/src/DeerRender/Render/Render.h +++ b/Deer/src/DeerRender/Render/Render.h @@ -9,8 +9,8 @@ namespace Deer { static void beginExecution(); static void endExecution(); - static void submit(const Ref& vertexArray); - static void submitLine(const Ref& vertexArray); + static void submit(VertexArray& vertexArray); + static void submitLine(VertexArray& vertexArray); static RenderAPI::API getAPI() { return RenderAPI::getAPI(); } }; } \ No newline at end of file diff --git a/Deer/src/DeerRender/Render/RenderAPI.h b/Deer/src/DeerRender/Render/RenderAPI.h index d898090..ea976cf 100755 --- a/Deer/src/DeerRender/Render/RenderAPI.h +++ b/Deer/src/DeerRender/Render/RenderAPI.h @@ -20,8 +20,8 @@ namespace Deer { virtual void setBackfaceCulling(bool enable) = 0; virtual void clear() = 0; - virtual void drawIndex(const Ref& vertexArray) = 0; - virtual void drawLines(const Ref& vertexArray) = 0; + virtual void drawIndex(VertexArray& vertexArray) = 0; + virtual void drawLines(VertexArray& vertexArray) = 0; inline static API getAPI() { return s_API; } private: diff --git a/Deer/src/DeerRender/Render/RenderCommand.h b/Deer/src/DeerRender/Render/RenderCommand.h index 5ddf526..c905c3c 100755 --- a/Deer/src/DeerRender/Render/RenderCommand.h +++ b/Deer/src/DeerRender/Render/RenderCommand.h @@ -1,6 +1,7 @@ #pragma once #include "Deer/Memory.h" #include "DeerRender/Render/RenderAPI.h" +#include "DeerRender/Render/VertexArray.h" #include "glm/glm.hpp" @@ -18,11 +19,11 @@ namespace Deer { s_renderAPI->clear(); } - static inline void drawIndex(const Ref& vertexArray) { + static inline void drawIndex(VertexArray& vertexArray) { s_renderAPI->drawIndex(vertexArray); } - static inline void drawLines(const Ref& vertexArray) { + static inline void drawLines(VertexArray& vertexArray) { s_renderAPI->drawLines(vertexArray); } diff --git a/Deer/src/DeerRender/Render/RenderUtils.cpp b/Deer/src/DeerRender/Render/RenderUtils.cpp index 3620a2c..14de635 100755 --- a/Deer/src/DeerRender/Render/RenderUtils.cpp +++ b/Deer/src/DeerRender/Render/RenderUtils.cpp @@ -7,15 +7,15 @@ namespace Deer { namespace RenderUtils { - Ref m_lineVertexArray; - Ref m_faceVertexArray; - Ref m_lineShader; - Ref m_faceShader; + Scope m_lineVertexArray; + Scope m_faceVertexArray; + Scope m_lineShader; + Scope m_faceShader; - Ref genLineVertexArray(); - Ref genFaceVertexArray(); - Ref getLineShader(); - Ref getFaceShader(); + Scope genLineVertexArray(); + Scope genFaceVertexArray(); + Scope getLineShader(); + Scope getFaceShader(); } void RenderUtils::initializeRenderUtils() { @@ -25,10 +25,10 @@ namespace Deer { m_faceShader = getFaceShader(); } - Ref RenderUtils::genLineVertexArray() { + Scope RenderUtils::genLineVertexArray() { unsigned int vertices[2] = { 0, 1 }; - Ref vertexArray = VertexArray::create(); + Scope vertexArray = Scope(VertexArray::create()); vertexArray->bind(); Ref vertexBuffer = VertexBuffer::create(vertices, sizeof(vertices)); @@ -45,7 +45,7 @@ namespace Deer { return vertexArray; } - Ref RenderUtils::getLineShader() { + Scope RenderUtils::getLineShader() { std::string vertexSrc = R"( #version 410 core @@ -82,10 +82,10 @@ void main() fragColor = vec4(u_color, 1.0); })"; - return Shader::create(vertexSrc, fragmentSrc); + return Scope(Shader::create(vertexSrc, fragmentSrc)); } - Ref RenderUtils::genFaceVertexArray() { + Scope RenderUtils::genFaceVertexArray() { unsigned int vertices[4] = { 0, 1, 2, 3 }; @@ -93,7 +93,7 @@ void main() 0, 2, 1, 1, 2, 3 }; - Ref vertexArray = VertexArray::create(); + Scope vertexArray = Scope(VertexArray::create()); vertexArray->bind(); Ref vertexBuffer = VertexBuffer::create(vertices, sizeof(vertices)); @@ -110,7 +110,7 @@ void main() return vertexArray; } - Ref RenderUtils::getFaceShader() { + Scope RenderUtils::getFaceShader() { std::string vertexSrc = R"( #version 410 core @@ -175,7 +175,7 @@ void main() fragColor = color; })"; - return Shader::create(vertexSrc, fragmentSrc); + return Scope(Shader::create(vertexSrc, fragmentSrc)); } } diff --git a/Deer/src/DeerRender/Render/RenderUtils.h b/Deer/src/DeerRender/Render/RenderUtils.h index b45f5c8..b0caa27 100755 --- a/Deer/src/DeerRender/Render/RenderUtils.h +++ b/Deer/src/DeerRender/Render/RenderUtils.h @@ -6,10 +6,10 @@ namespace Deer { class Shader; namespace RenderUtils { - extern Ref m_lineVertexArray; - extern Ref m_faceVertexArray; - extern Ref m_lineShader; - extern Ref m_faceShader; + extern Scope m_lineVertexArray; + extern Scope m_faceVertexArray; + extern Scope m_lineShader; + extern Scope m_faceShader; void initializeRenderUtils(); } diff --git a/Deer/src/DeerRender/Scene/Environment.cpp b/Deer/src/DeerRender/Scene/Environment.cpp index df9888c..861009a 100755 --- a/Deer/src/DeerRender/Scene/Environment.cpp +++ b/Deer/src/DeerRender/Scene/Environment.cpp @@ -1,11 +1,12 @@ #include "Deer/Enviroment.h" #include "Deer/Application.h" -#include "Deer/Asset.h" #include "Deer/Components.h" #include "Deer/Voxel.h" +#include "DeerRender/Shader.h" +#include "DeerRender/Mesh.h" #include "DeerRender/Render/Render.h" #include "DeerRender/Render/RenderUtils.h" #include "DeerRender/Render/Texture.h" @@ -21,30 +22,26 @@ namespace Deer { // Lets invert the z axis for engine convenience glm::mat4 cameraProjectionMatrix = projectionMatrix * invertZ * camMatrix; { - auto view = m_registry.view(); + auto view = m_registry.view(); for (auto entityId : view) { - auto& meshRender = view.get(entityId); - //if (meshRender.shaderAssetID == 0) - // continue; - - //if (meshRender.meshAssetID == 0) - // continue; - - auto& tag = view.get(entityId); - Entity& entity = getEntity(tag.entityUID); + auto& meshComponent = view.get(entityId); + auto& shaderComponent = view.get(entityId); + auto& tagComponent = view.get(entityId); + Entity& entity = getEntity(tagComponent.entityUID); glm::mat4 matrix = entity.getWorldMatrix(); - //Asset& shaderAsset = AssetManager::getAsset(meshRender.shaderAssetID); - - meshRender.shader->bind(); - meshRender.shader->uploadUniformMat4("u_viewMatrix", cameraProjectionMatrix); - meshRender.shader->uploadUniformMat4("u_worldMatrix", matrix); - meshRender.shader->uploadUniformInt("u_objectID", tag.entityUID); - //Asset meshAsset = AssetManager::getAsset(meshRender.meshAssetID); - meshRender.vertexArray->bind(); + Shader& shader = ShaderManager::getShader(shaderComponent.shaderId); - Render::submit(meshRender.vertexArray); + shader.bind(); + shader.uploadUniformMat4("u_viewMatrix", cameraProjectionMatrix); + shader.uploadUniformMat4("u_worldMatrix", matrix); + shader.uploadUniformInt("u_objectID", entity.getId()); + + VertexArray& vertexArray = MeshManager::getModel(meshComponent.meshId); + vertexArray.bind(); + + Render::submit(vertexArray); } } @@ -57,13 +54,13 @@ namespace Deer { RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", glm::vec3(x, 0, 0)); RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", glm::vec3(x, 0, CHUNK_SIZE_Z)); - Render::submitLine(RenderUtils::m_lineVertexArray); + Render::submitLine(*RenderUtils::m_lineVertexArray.get()); } for (int z = 0; z < CHUNK_SIZE_Z + 1; z++) { RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", glm::vec3(0, 0, z)); RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", glm::vec3(CHUNK_SIZE_X, 0, z)); - Render::submitLine(RenderUtils::m_lineVertexArray); + Render::submitLine(*RenderUtils::m_lineVertexArray.get()); } } @@ -110,7 +107,7 @@ namespace Deer { RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", cameraAxisPoints[posA]); RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", cameraAxisPoints[posB]); - Render::submitLine(RenderUtils::m_lineVertexArray); + Render::submitLine(*RenderUtils::m_lineVertexArray); } } @@ -122,7 +119,7 @@ namespace Deer { RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", cameraAxisPoints[posA]); RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", cameraAxisPoints[posB]); - Render::submitLine(RenderUtils::m_lineVertexArray); + Render::submitLine(*RenderUtils::m_lineVertexArray); } } @@ -134,7 +131,7 @@ namespace Deer { RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", cameraAxisPoints[posA]); RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", cameraAxisPoints[posB]); - Render::submitLine(RenderUtils::m_lineVertexArray); + Render::submitLine(*RenderUtils::m_lineVertexArray); } } } diff --git a/Deer/src/DeerRender/Scene/GizmoRenderer.cpp b/Deer/src/DeerRender/Scene/GizmoRenderer.cpp index b2b5204..eaf607f 100755 --- a/Deer/src/DeerRender/Scene/GizmoRenderer.cpp +++ b/Deer/src/DeerRender/Scene/GizmoRenderer.cpp @@ -139,7 +139,7 @@ namespace Deer { RenderUtils::m_faceShader->uploadUniformFloat3( "u_posD", face.positions[3]); - Render::submit(RenderUtils::m_faceVertexArray); + Render::submit(*RenderUtils::m_faceVertexArray); } } @@ -154,7 +154,7 @@ namespace Deer { RenderUtils::m_lineShader->uploadUniformFloat3("u_posA", line[0]); RenderUtils::m_lineShader->uploadUniformFloat3("u_posB", line[1]); - Render::submitLine(RenderUtils::m_lineVertexArray); + Render::submitLine(*RenderUtils::m_lineVertexArray); } } diff --git a/Deer/src/DeerRender/Scene/Serialization/Components/MeshRenderComponentSerialization.h b/Deer/src/DeerRender/Scene/Serialization/Components/MeshRenderComponentSerialization.h index c53917b..32d1b02 100755 --- a/Deer/src/DeerRender/Scene/Serialization/Components/MeshRenderComponentSerialization.h +++ b/Deer/src/DeerRender/Scene/Serialization/Components/MeshRenderComponentSerialization.h @@ -4,7 +4,7 @@ namespace Deer{ template void save(Archive& archive, - MeshRenderComponent const& meshRender) { + MeshComponent const& meshRender) { // TO IMPLEMENT /* @@ -17,7 +17,7 @@ namespace Deer{ template void load(Archive& archive, - MeshRenderComponent& meshRender) { + MeshComponent& meshRender) { // TO IMPLEMENT /* diff --git a/Deer/src/DeerRender/Shader/ShaderDataStore.cpp b/Deer/src/DeerRender/Shader/ShaderDataStore.cpp new file mode 100644 index 0000000..e52dde2 --- /dev/null +++ b/Deer/src/DeerRender/Shader/ShaderDataStore.cpp @@ -0,0 +1,61 @@ +#include "DeerRender/Shader.h" +#include "Deer/DataStore.h" + +#include + +namespace Deer { + namespace DataStore { + std::unordered_map preProcess(const std::string& source); + } + + void DataStore::loadShader(ShaderData& shader_data, const Path& name) { + Path realName; + realName = name.string() + DEER_SHADER_EXTENSION; + + uint32_t size; + uint8_t* data = DataStore::readFile(realName, &size); + + DataStore::loadFileData(DEER_SHADER_PATH, realName, &data, &size); + + std::string str_data((char*)data, size); + + DataStore::freeFileData(data); + + std::unordered_map types = preProcess(str_data); + + shader_data.freeData(); + if (types.contains("vertex")) { + shader_data.vertexShader = types["vertex"]; + } + + if (types.contains("fragment")) { + shader_data.fragmentShader = types["fragment"]; + } + } + + std::unordered_map preProcess(const std::string& source) { + std::unordered_map shaderSource; + + const std::string typeToken = "#type "; + size_t pos = 0; + + while (pos < source.size()) { + size_t typePos = source.find(typeToken, pos); + if (typePos == std::string::npos) break; + + size_t typeEnd = source.find_first_of("\n\r", typePos); + if (typeEnd == std::string::npos) break; + + std::string shaderType = source.substr(typePos + typeToken.size(), typeEnd - typePos - typeToken.size()); + size_t nextTypePos = source.find(typeToken, typeEnd); + + std::string shaderSourceStr = source.substr(typeEnd + 1, nextTypePos - typeEnd - 1); + shaderSource[shaderType] = shaderSourceStr; + + pos = nextTypePos; + } + + return shaderSource; + } + +} \ No newline at end of file diff --git a/Deer/src/DeerRender/Shader/ShaderLoad.cpp b/Deer/src/DeerRender/Shader/ShaderLoad.cpp new file mode 100644 index 0000000..847ca85 --- /dev/null +++ b/Deer/src/DeerRender/Shader/ShaderLoad.cpp @@ -0,0 +1,38 @@ +#include "DeerRender/Shader.h" +#include "Deer/Log.h" + +namespace Deer { + namespace ShaderManager { + size_t minShaderId = 0; + Shader* shaders[SCENE_MAX_SHADER_COUNT]{}; + } + + void ShaderManager::unloadAllShaders() { + for (uint16_t i = 0; i < minShaderId; i++) { + delete shaders[i]; + shaders[i] = nullptr; + } + + minShaderId = 0; + } + + uint16_t ShaderManager::loadShader(const ShaderData& data) { + if (minShaderId >= SCENE_MAX_SHADER_COUNT) { + DEER_CORE_ERROR("Max shader loaded into a scene"); + return -1; + } + + uint16_t shaderId = minShaderId; + minShaderId++; + + shaders[shaderId] = Shader::create(data.vertexShader, data.fragmentShader); + + return shaderId; + } + + Shader& ShaderManager::getShader(uint16_t shaderId) { + DEER_CORE_ASSERT(shaderId > 0 && shaderId < minShaderId, "Invalid shader id, id is not loaded"); + + return *shaders[shaderId]; + } +} \ No newline at end of file diff --git a/Deer/src/DeerRender/Voxels/VoxelWorld.cpp b/Deer/src/DeerRender/Voxels/VoxelWorld.cpp index 8ddd821..25843dc 100755 --- a/Deer/src/DeerRender/Voxels/VoxelWorld.cpp +++ b/Deer/src/DeerRender/Voxels/VoxelWorld.cpp @@ -1,7 +1,6 @@ #include "Deer/VoxelWorld.h" #include "Deer/Application.h" -#include "Deer/Asset.h" #include "Deer/Components.h" #include "Deer/Log.h" #include "Deer/Memory.h" @@ -80,7 +79,7 @@ namespace Deer { shader->uploadUniformInt("u_chunkID_y", chunkID.y); shader->uploadUniformInt("u_chunkID_z", chunkID.z); - Render::submit(chunkRender.solidVoxel); + Render::submit(*chunkRender.solidVoxel); } } } // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerRender/Voxels/VoxelWorldRenderData.h b/Deer/src/DeerRender/Voxels/VoxelWorldRenderData.h index 5d7c80a..e4da28c 100644 --- a/Deer/src/DeerRender/Voxels/VoxelWorldRenderData.h +++ b/Deer/src/DeerRender/Voxels/VoxelWorldRenderData.h @@ -10,7 +10,7 @@ namespace Deer { struct ChunkRender { - Ref solidVoxel; + Scope solidVoxel; bool hasData = false; }; diff --git a/Deer/src/DeerRender/Voxels/VoxelWorld_AmbientLightPropagation.cpp b/Deer/src/DeerRender/Voxels/VoxelWorld_AmbientLightPropagation.cpp index f306f64..186d72e 100755 --- a/Deer/src/DeerRender/Voxels/VoxelWorld_AmbientLightPropagation.cpp +++ b/Deer/src/DeerRender/Voxels/VoxelWorld_AmbientLightPropagation.cpp @@ -1,7 +1,6 @@ #include "Deer/VoxelWorld.h" #include "Deer/Voxels/Chunk.h" #include "Deer/Application.h" -#include "Deer/Asset.h" #include "Deer/Components.h" #include "Deer/Voxels/VoxelWorldData.h" diff --git a/Deer/src/DeerRender/Voxels/VoxelWorld_SolidVoxelGeneration.cpp b/Deer/src/DeerRender/Voxels/VoxelWorld_SolidVoxelGeneration.cpp index a070b7d..94163fc 100755 --- a/Deer/src/DeerRender/Voxels/VoxelWorld_SolidVoxelGeneration.cpp +++ b/Deer/src/DeerRender/Voxels/VoxelWorld_SolidVoxelGeneration.cpp @@ -1,5 +1,4 @@ #include "Deer/Application.h" -#include "Deer/Asset.h" #include "Deer/Components.h" #include "Deer/VoxelWorld.h" #include "Deer/Voxels/Chunk.h" @@ -34,7 +33,7 @@ namespace Deer { } // Pass the data to the GPU - Ref va = VertexArray::create(); + Scope va = Scope(VertexArray::create()); va->bind(); Ref vb = VertexBuffer::create( vertexData.data(), @@ -87,7 +86,7 @@ namespace Deer { // Update the data to the chunk render int id = worldProps.getWorldChunkID(nextChunk); ChunkRender& chunkRender = chunksRender[id]; - chunkRender.solidVoxel = va; + chunkRender.solidVoxel = std::move(va); chunkRender.hasData = true; } diff --git a/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.cpp b/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.cpp index 50391f7..939e0d0 100755 --- a/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.cpp +++ b/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.cpp @@ -48,11 +48,13 @@ namespace Deer { glDisable(GL_CULL_FACE); } - void OpenGLRenderAPI::drawIndex(const Ref& vertexArray) { - glDrawElements(GL_TRIANGLES, vertexArray->getIndexBuffer()->getCount(), getOpenGLIndexDataType(vertexArray->getIndexBuffer()->getIndexDataType()), nullptr); + void OpenGLRenderAPI::drawIndex(VertexArray& vertexArray) { + const Ref& ib = vertexArray.getIndexBuffer(); + glDrawElements(GL_TRIANGLES, ib->getCount(), getOpenGLIndexDataType(ib->getIndexDataType()), nullptr); } - void OpenGLRenderAPI::drawLines(const Ref& vertexArray) { - glDrawElements(GL_LINES, vertexArray->getIndexBuffer()->getCount(), getOpenGLIndexDataType(vertexArray->getIndexBuffer()->getIndexDataType()), nullptr); + void OpenGLRenderAPI::drawLines(VertexArray& vertexArray) { + const Ref& ib = vertexArray.getIndexBuffer(); + glDrawElements(GL_LINES, ib->getCount(), getOpenGLIndexDataType(ib->getIndexDataType()), nullptr); } } \ No newline at end of file diff --git a/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.h b/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.h index 96ef956..e95fa99 100755 --- a/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.h +++ b/Deer/src/Plattform/OpenGL/OpenGLRenderAPI.h @@ -11,8 +11,8 @@ namespace Deer { void setBackfaceCulling(bool enable) override; void clear() override; - void drawIndex(const Ref& vertexArray) override; - void drawLines(const Ref& vertexArray) override; + void drawIndex(VertexArray& vertexArray) override; + void drawLines(VertexArray& vertexArray) override; }; } diff --git a/Deer/src/Plattform/OpenGL/OpenGLShader.cpp b/Deer/src/Plattform/OpenGL/OpenGLShader.cpp index 0e90119..483a80e 100755 --- a/Deer/src/Plattform/OpenGL/OpenGLShader.cpp +++ b/Deer/src/Plattform/OpenGL/OpenGLShader.cpp @@ -21,8 +21,8 @@ namespace Deer { return Ref(new OpenGLShader(data, size)); } - Ref Shader::create(const std::string& vertexSrc, const std::string& fragmentSrc) { - return Ref(new OpenGLShader(vertexSrc, fragmentSrc)); + Shader* Shader::create(const std::string& vertexSrc, const std::string& fragmentSrc) { + return new OpenGLShader(vertexSrc, fragmentSrc); } OpenGLShader::OpenGLShader(const std::string& filePath) { diff --git a/Deer/src/Plattform/OpenGL/OpenGLShader.h b/Deer/src/Plattform/OpenGL/OpenGLShader.h index 8e4ad4d..0fa8305 100755 --- a/Deer/src/Plattform/OpenGL/OpenGLShader.h +++ b/Deer/src/Plattform/OpenGL/OpenGLShader.h @@ -26,6 +26,7 @@ namespace Deer { private: std::string readFile(const std::string& source); std::unordered_map preProcess(const std::string& source); + void compile(const std::string& vertexSrc, const std::string& fragmentSrc); unsigned int m_shaderID; }; diff --git a/Deer/src/Plattform/OpenGL/OpenGLVertexArray.cpp b/Deer/src/Plattform/OpenGL/OpenGLVertexArray.cpp index 8d1235c..48c7a72 100755 --- a/Deer/src/Plattform/OpenGL/OpenGLVertexArray.cpp +++ b/Deer/src/Plattform/OpenGL/OpenGLVertexArray.cpp @@ -7,12 +7,12 @@ #include "GLFW/glfw3.h" namespace Deer { - Ref VertexArray::create() { - return Ref(new OpenGLVertexArray()); + VertexArray* VertexArray::create() { + return new OpenGLVertexArray(); } - Ref VertexArray::create(uint8_t* data, uint32_t size) { - return Ref(new OpenGLVertexArray(data, size)); + VertexArray* VertexArray::create(uint8_t* data, uint32_t size) { + return new OpenGLVertexArray(data, size); } OpenGLVertexArray::OpenGLVertexArray() { diff --git a/Deer/src/Plattform/OpenGL/OpenGLVertexArray.h b/Deer/src/Plattform/OpenGL/OpenGLVertexArray.h index 723c5cf..bfa72d5 100755 --- a/Deer/src/Plattform/OpenGL/OpenGLVertexArray.h +++ b/Deer/src/Plattform/OpenGL/OpenGLVertexArray.h @@ -2,7 +2,6 @@ #include "DeerRender/Render/VertexArray.h" #include "DeerRender/Render/Buffer.h" - #include #include diff --git a/DeerStudio/src/DeerStudio/DeerStudio.cpp b/DeerStudio/src/DeerStudio/DeerStudio.cpp index 17b78f7..caee9d5 100755 --- a/DeerStudio/src/DeerStudio/DeerStudio.cpp +++ b/DeerStudio/src/DeerStudio/DeerStudio.cpp @@ -57,13 +57,14 @@ namespace Deer { Environment& env = Scene::environment; Entity& exampleObject = env.createEntity("Example"); - MeshRenderComponent& renderComponent = exampleObject.addComponent(); + MeshComponent& renderComponent = exampleObject.addComponent(); MeshData meshData; DataStore::loadModel(meshData, "example"); - renderComponent.shader = Shader::create(DataStore::rootPath / DEER_SHADER_PATH / "shader.glsl"); - renderComponent.vertexArray = Mesh::loadModelToGPU(meshData); + renderComponent.meshId = MeshManager::loadModel(meshData); + // Shader::create(DataStore::rootPath / DEER_SHADER_PATH / "shader.glsl"); + //renderComponent.vertexArray = Mesh::loadModelToGPU(meshData); return 0; } diff --git a/roe/imgui.ini b/roe/imgui.ini index f13c3ea..2e2690a 100644 --- a/roe/imgui.ini +++ b/roe/imgui.ini @@ -16,7 +16,7 @@ DockId=0x00000004,1 [Window][Game Window] Pos=258,24 -Size=620,403 +Size=620,474 Collapsed=0 DockId=0x00000006,0 @@ -28,13 +28,13 @@ DockId=0x00000001,0 [Window][Terrain Editor] Pos=880,24 -Size=400,403 +Size=400,474 Collapsed=0 DockId=0x00000004,1 [Window][Viewport] Pos=258,24 -Size=620,403 +Size=620,474 Collapsed=0 DockId=0x00000006,1 @@ -57,14 +57,14 @@ Collapsed=0 DockId=0x00000008,1 [Window][MeshExplorer] -Pos=0,429 -Size=1280,291 +Pos=0,500 +Size=1280,220 Collapsed=0 DockId=0x00000008,0 [Window][TreePannel] Pos=0,24 -Size=256,403 +Size=256,474 Collapsed=0 DockId=0x00000005,0 @@ -80,7 +80,7 @@ Collapsed=0 [Window][PropertiesPannel] Pos=880,24 -Size=400,403 +Size=400,474 Collapsed=0 DockId=0x00000004,0 @@ -92,12 +92,12 @@ DockId=0x00000004,1 [Docking][Data] DockSpace ID=0xA1672E74 Window=0x4647B76E Pos=0,24 Size=1280,696 Split=Y - DockNode ID=0x00000007 Parent=0xA1672E74 SizeRef=1280,403 Split=Y + DockNode ID=0x00000007 Parent=0xA1672E74 SizeRef=1280,474 Split=Y DockNode ID=0x00000001 Parent=0x00000007 SizeRef=2560,363 Split=X Selected=0x13926F0B DockNode ID=0x00000003 Parent=0x00000001 SizeRef=878,338 Split=X Selected=0x13926F0B DockNode ID=0x00000005 Parent=0x00000003 SizeRef=256,446 Selected=0xE45B9F93 DockNode ID=0x00000006 Parent=0x00000003 SizeRef=620,446 CentralNode=1 Selected=0x13926F0B - DockNode ID=0x00000004 Parent=0x00000001 SizeRef=400,338 Selected=0x2A2C795E + DockNode ID=0x00000004 Parent=0x00000001 SizeRef=400,338 Selected=0xA35A27E3 DockNode ID=0x00000002 Parent=0x00000007 SizeRef=2560,331 Selected=0xCF339702 - DockNode ID=0x00000008 Parent=0xA1672E74 SizeRef=1280,291 Selected=0xD962995A + DockNode ID=0x00000008 Parent=0xA1672E74 SizeRef=1280,220 Selected=0xD962995A