diff options
-rw-r--r-- | src/Gal.hpp | 5 | ||||
-rw-r--r-- | src/GalOgl.cpp | 12 | ||||
-rw-r--r-- | src/Rml.cpp | 134 |
3 files changed, 75 insertions, 76 deletions
diff --git a/src/Gal.hpp b/src/Gal.hpp index ec00442..06850ea 100644 --- a/src/Gal.hpp +++ b/src/Gal.hpp @@ -3,6 +3,7 @@ #include <cstdint> #include <memory> #include <vector> +#include <string> #include <string_view> #include <glm/glm.hpp> @@ -91,6 +92,10 @@ namespace Gal { virtual void Cleanup() = 0; + virtual void SetScissor(size_t x=0, size_t y=0, size_t width=0, size_t height=0) = 0; + + virtual void SetScissor(bool enabled) = 0; + virtual std::shared_ptr<Buffer> CreateBuffer() = 0; diff --git a/src/GalOgl.cpp b/src/GalOgl.cpp index e39f5f0..7a662e8 100644 --- a/src/GalOgl.cpp +++ b/src/GalOgl.cpp @@ -584,6 +584,18 @@ public: } + virtual void SetScissor(size_t x = 0, size_t y = 0, size_t width = 0, size_t height = 0) override { + glEnable(GL_SCISSOR_TEST); + glScissor(x, y, width, height); + } + + virtual void SetScissor(bool enabled) override { + if (enabled) + glEnable(GL_SCISSOR_TEST); + else + glDisable(GL_SCISSOR_TEST); + } + virtual std::shared_ptr<Buffer> CreateBuffer() override { auto buff = std::make_shared<BufferOgl>(); diff --git a/src/Rml.cpp b/src/Rml.cpp index 4f5c0b9..d886377 100644 --- a/src/Rml.cpp +++ b/src/Rml.cpp @@ -3,7 +3,6 @@ #include <easylogging++.h> #include "AssetManager.hpp" -#include "Shader.hpp" #include "Utility.hpp" double RmlSystemInterface::GetElapsedTime() { @@ -46,110 +45,103 @@ void RmlSystemInterface::GetClipboardText(Rml::String& text) { } RmlRenderInterface::RmlRenderInterface(RenderState& renderState) { - auto gal = Gal::GetImplementation(); - auto pipelineConfig = gal->CreatePipelineConfig(); - pipelineConfig->AddShaderParameter("viewportSize", Gal::Type::Vec2u32); - pipelineConfig->AddShaderParameter("translation", Gal::Type::Vec2); - pipelineConfig->SetTarget(gal->GetDefaultFramebuffer()); - - auto vertAsset = AssetManager::GetAssetByAssetName("/altcraft/shaders/vert/rml"); - std::string vertSource((char*)vertAsset->data.data(), (char*)vertAsset->data.data() + vertAsset->data.size()); - auto pixelAsset = AssetManager::GetAssetByAssetName("/altcraft/shaders/frag/rml"); - std::string pixelSource((char*)pixelAsset->data.data(), (char*)pixelAsset->data.data() + pixelAsset->data.size()); - pipelineConfig->SetVertexShader(gal->LoadVertexShader(vertSource)); - pipelineConfig->SetPixelShader(gal->LoadPixelShader(pixelSource)); + std::string vertexSource, pixelSource, texPixelSource; + { + auto vertAsset = AssetManager::GetAssetByAssetName("/altcraft/shaders/vert/rml"); + vertexSource = std::string((char*)vertAsset->data.data(), (char*)vertAsset->data.data() + vertAsset->data.size()); - auto vertBuffBind = pipelineConfig->BindVertexBuffer({ - {"pos", Gal::Type::Vec2}, - {"color", Gal::Type::Vec4u8}, - {"", Gal::Type::Vec2}, //it's not used in shader, so driver optimizes it away - }); + auto pixelAsset = AssetManager::GetAssetByAssetName("/altcraft/shaders/frag/rml"); + pixelSource = std::string((char*)pixelAsset->data.data(), (char*)pixelAsset->data.data() + pixelAsset->data.size()); - auto indexBuffBind = pipelineConfig->BindIndexBuffer(); + auto texPixelAsset = AssetManager::GetAssetByAssetName("/altcraft/shaders/frag/rmltex"); + texPixelSource = std::string((char*)texPixelAsset->data.data(), (char*)texPixelAsset->data.data() + texPixelAsset->data.size()); + } - pipeline = gal->BuildPipeline(pipelineConfig); + auto gal = Gal::GetImplementation(); vertexBuffer = gal->CreateBuffer(); - indexBuffer = gal->CreateBuffer(); - pipelineInstance = pipeline->CreateInstance({ - {vertBuffBind, vertexBuffer}, - {indexBuffBind, indexBuffer}, - }); - - glCheckError(); + { + auto pipelineConfig = gal->CreatePipelineConfig(); + pipelineConfig->AddShaderParameter("viewportSize", Gal::Type::Vec2u32); + pipelineConfig->AddShaderParameter("translation", Gal::Type::Vec2); + pipelineConfig->SetTarget(gal->GetDefaultFramebuffer()); + pipelineConfig->SetVertexShader(gal->LoadVertexShader(vertexSource)); + pipelineConfig->SetPixelShader(gal->LoadPixelShader(pixelSource)); - auto texturePipelineConfig = gal->CreatePipelineConfig(); - texturePipelineConfig->AddShaderParameter("viewportSize", Gal::Type::Vec2u32); - texturePipelineConfig->AddShaderParameter("translation", Gal::Type::Vec2); - texturePipelineConfig->AddShaderParameter("fontTexture", Gal::Type::Int32); - texturePipelineConfig->SetTarget(gal->GetDefaultFramebuffer()); + auto vertBuffBind = pipelineConfig->BindVertexBuffer({ + {"pos", Gal::Type::Vec2}, + {"color", Gal::Type::Vec4u8}, + {"", Gal::Type::Vec2}, //it's not used in shader, so driver optimizes it away + }); - auto texturePixelAsset = AssetManager::GetAssetByAssetName("/altcraft/shaders/frag/rmltex"); - std::string texturePixelSource((char*)texturePixelAsset->data.data(), (char*)texturePixelAsset->data.data() + texturePixelAsset->data.size()); - texturePipelineConfig->SetVertexShader(gal->LoadVertexShader(vertSource)); - texturePipelineConfig->SetPixelShader(gal->LoadPixelShader(texturePixelSource)); + auto indexBuffBind = pipelineConfig->BindIndexBuffer(); - auto texVertBuffBind = texturePipelineConfig->BindVertexBuffer({ - {"pos", Gal::Type::Vec2}, - {"color", Gal::Type::Vec4u8}, - {"tex_coord", Gal::Type::Vec2}, - }); + pipeline = gal->BuildPipeline(pipelineConfig); - auto texIndexBuffBind = texturePipelineConfig->BindIndexBuffer(); - - texPipeline = gal->BuildPipeline(texturePipelineConfig); + pipelineInstance = pipeline->CreateInstance({ + {vertBuffBind, vertexBuffer}, + {indexBuffBind, indexBuffer}, + }); + } + + { + auto texPipelineConfig = gal->CreatePipelineConfig(); + texPipelineConfig->AddShaderParameter("viewportSize", Gal::Type::Vec2u32); + texPipelineConfig->AddShaderParameter("translation", Gal::Type::Vec2); + texPipelineConfig->AddShaderParameter("fontTexture", Gal::Type::Int32); + texPipelineConfig->SetTarget(gal->GetDefaultFramebuffer()); + texPipelineConfig->SetVertexShader(gal->LoadVertexShader(vertexSource)); + texPipelineConfig->SetPixelShader(gal->LoadPixelShader(texPixelSource)); + + auto texVertBuffBind = texPipelineConfig->BindVertexBuffer({ + {"pos", Gal::Type::Vec2}, + {"color", Gal::Type::Vec4u8}, + {"tex_coord", Gal::Type::Vec2}, + }); + + auto texIndexBuffBind = texPipelineConfig->BindIndexBuffer(); + + texPipeline = gal->BuildPipeline(texPipelineConfig); + + texPipelineInstance = texPipeline->CreateInstance({ + {texVertBuffBind, vertexBuffer}, + {texIndexBuffBind, indexBuffer}, + }); + } - texPipelineInstance = texPipeline->CreateInstance({ - {texVertBuffBind, vertexBuffer}, - {texIndexBuffBind, indexBuffer}, - }); - glCheckError(); + } RmlRenderInterface::~RmlRenderInterface() { - glCheckError(); } void RmlRenderInterface::RenderGeometry(Rml::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rml::TextureHandle texture, const Rml::Vector2f& translation) { indexBuffer->SetData({ reinterpret_cast<std::byte*>(indices), reinterpret_cast<std::byte*>(indices + num_indices) }); vertexBuffer->SetData({ reinterpret_cast<std::byte*>(vertices), reinterpret_cast<std::byte*>(vertices + num_vertices) }); - glCheckError(); auto tex = textures.find(texture); if (tex != textures.end()) { texPipeline->Activate(); - glCheckError(); texPipeline->SetShaderParameter("translation", glm::vec2(translation.x, translation.y)); - glCheckError(); texPipeline->SetDynamicTexture("fontTexture", tex->second); - glCheckError(); texPipelineInstance->Activate(); - glCheckError(); texPipelineInstance->Render(0, num_indices); } else { pipeline->Activate(); - glCheckError(); pipeline->SetShaderParameter("translation", glm::vec2(translation.x, translation.y)); - glCheckError(); pipelineInstance->Activate(); - glCheckError(); pipelineInstance->Render(0, num_indices); } - glCheckError(); } void RmlRenderInterface::EnableScissorRegion(bool enable) { - if (enable) - glEnable(GL_SCISSOR_TEST); - else - glDisable(GL_SCISSOR_TEST); + Gal::GetImplementation()->SetScissor(enable); } void RmlRenderInterface::SetScissorRegion(int x, int y, int width, int height) { - glScissor(x, vpHeight - (y + height), width, height); - glCheckError(); + Gal::GetImplementation()->SetScissor(x, y, width, height); } bool RmlRenderInterface::LoadTexture(Rml::TextureHandle& texture_handle, Rml::Vector2i& texture_dimensions, const Rml::String& source) { @@ -157,7 +149,6 @@ bool RmlRenderInterface::LoadTexture(Rml::TextureHandle& texture_handle, Rml::Ve } bool RmlRenderInterface::GenerateTexture(Rml::TextureHandle& texture_handle, const Rml::byte* source, const Rml::Vector2i& source_dimensions) { - glCheckError(); size_t textureId = textures.empty() ? 1 : textures.rbegin()->first + 1; auto gal = Gal::GetImplementation(); auto textureConfig = gal->CreateTexture2DConfig(source_dimensions.x, source_dimensions.y, Gal::Format::R8G8B8A8); @@ -165,26 +156,17 @@ bool RmlRenderInterface::GenerateTexture(Rml::TextureHandle& texture_handle, con texture->SetData({ reinterpret_cast<const std::byte*>(source),reinterpret_cast<const std::byte*>(source + (source_dimensions.x * source_dimensions.y) * 4) }); textures.insert({ textureId,texture }); texture_handle = textureId; - glCheckError(); return true; } void RmlRenderInterface::ReleaseTexture(Rml::TextureHandle texture) { - GLuint textures = texture; - glDeleteTextures(1, &textures); - glCheckError(); + textures.erase(textures.find(texture)); } void RmlRenderInterface::Update(unsigned int windowWidth, unsigned int windowHeight) { - - glCheckError(); - pipeline->SetShaderParameter("viewportSize", glm::uvec2(windowWidth, windowHeight)); texPipeline->SetShaderParameter("viewportSize", glm::uvec2(windowWidth, windowHeight)); - texPipeline->SetShaderParameter("fontTexture", 0); - - glCheckError(); vpWidth = windowWidth; vpHeight = windowHeight; |