From a93910a43d969f350f277eff963758bfbb26adda Mon Sep 17 00:00:00 2001 From: Isuru Samarathunga Date: Fri, 17 Oct 2025 00:51:28 +0530 Subject: [PATCH] Texture Fixes --- .../Imp/CPP/Components/TextureComponent.cpp | 4 +- Engine/Src/Imp/CPP/Renderer/Renderer.cpp | 251 +++++++++--------- Engine/Src/Imp/CPP/UI.cpp | 2 +- Engine/Src/Imp/HPP/Renderer/Renderer.hpp | 29 +- Engine/Src/Inc/IAEngine/Engine.hpp | 5 +- 5 files changed, 147 insertions(+), 144 deletions(-) diff --git a/Engine/Src/Imp/CPP/Components/TextureComponent.cpp b/Engine/Src/Imp/CPP/Components/TextureComponent.cpp index 961e779..c8161a7 100644 --- a/Engine/Src/Imp/CPP/Components/TextureComponent.cpp +++ b/Engine/Src/Imp/CPP/Components/TextureComponent.cpp @@ -41,9 +41,9 @@ namespace ia::iae Engine::SetRenderState_ColorOverlay(m_colorOverlay); Engine::SetRenderState_TextureOffset(m_textureOffset); Engine::SetRenderState_CameraRelative(m_isCameraRelative); - Engine::SetRenderState_Transform(m_node->GetPosition() + m_positionOffset, m_node->GetScale() * Vec2{t2.x, t2.y} * m_scaleOffset, m_node->GetRotation() + m_rotationOffset, m_node->Layer(), m_node->SortIndex()); + Engine::SetRenderState_Transform(m_node->GetPosition() + m_positionOffset, m_node->GetScale() * Vec2{t2.x, t2.y} * m_scaleOffset, m_node->GetRotation() + m_rotationOffset); - Engine::DrawGeometry(Engine::GetGeometry_Quad()); + Engine::DrawGeometry(Engine::GetGeometry_Quad(), m_node->Layer(), m_node->SortIndex()); } VOID TextureComponent::DebugDraw() diff --git a/Engine/Src/Imp/CPP/Renderer/Renderer.cpp b/Engine/Src/Imp/CPP/Renderer/Renderer.cpp index ddc8b3e..3584a48 100644 --- a/Engine/Src/Imp/CPP/Renderer/Renderer.cpp +++ b/Engine/Src/Imp/CPP/Renderer/Renderer.cpp @@ -25,6 +25,8 @@ #include #include +#include + namespace ia::iae { STATIC Mat4 IdentityMatrix(1.0f); @@ -37,7 +39,6 @@ namespace ia::iae SDL_GPUDevice *Renderer::s_gpuDevice{}; SDL_GPUTexture *Renderer::s_renderTargetSceneColor{}; - SDL_GPUTexture *Renderer::s_renderTargetSceneDepth{}; SDL_GPUTexture *Renderer::s_renderTargetDebugDrawColor{}; Pipeline *Renderer::s_geometryPipeline{}; @@ -45,6 +46,17 @@ namespace ia::iae Renderer::Geometry *Renderer::s_quadGeometry{}; + Vector Renderer::s_drawEntries; + + SDL_GPURenderPass *Renderer::s_activeRenderPass{}; + SDL_GPUCommandBuffer *Renderer::s_activeCommandBuffer{}; + SDL_GPUColorTargetInfo Renderer::s_colorTargetInfo{}; + class CameraComponent *Renderer::s_activeCamera{}; + + SDL_Rect Renderer::s_scissor{0, 0, 0, 0}; + SDL_GPUViewport Renderer::s_activeViewport{}; + Vec2 Renderer::s_sceneScaleFactor{1.0f, 1.0f}; + VOID Renderer::Initialize() { if (!(s_gpuDevice = SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV, Engine::IsDebugMode(), nullptr))) @@ -93,17 +105,9 @@ namespace ia::iae DebugDraw::Initialize(); - s_state.ColorTargetInfo.clear_color = SDL_FColor{0.0f, 0.0f, 0.0f, 1.0f}; - s_state.ColorTargetInfo.load_op = SDL_GPU_LOADOP_CLEAR; - s_state.ColorTargetInfo.store_op = SDL_GPU_STOREOP_STORE; - - s_state.DepthStencilTargetInfo.cycle = true; - s_state.DepthStencilTargetInfo.clear_depth = 0; - s_state.DepthStencilTargetInfo.clear_stencil = 0; - s_state.DepthStencilTargetInfo.load_op = SDL_GPU_LOADOP_CLEAR; - s_state.DepthStencilTargetInfo.store_op = SDL_GPU_STOREOP_STORE; - s_state.DepthStencilTargetInfo.stencil_load_op = SDL_GPU_LOADOP_CLEAR; - s_state.DepthStencilTargetInfo.stencil_store_op = SDL_GPU_STOREOP_STORE; + s_colorTargetInfo.clear_color = SDL_FColor{0.0f, 0.0f, 0.0f, 1.0f}; + s_colorTargetInfo.load_op = SDL_GPU_LOADOP_CLEAR; + s_colorTargetInfo.store_op = SDL_GPU_STOREOP_STORE; s_quadGeometry = CreateGeometry( { @@ -126,7 +130,6 @@ namespace ia::iae delete s_geometryPipeline; delete s_postprocessPipeline; - GPUResourceManager::DestroyTexture(s_renderTargetSceneDepth); GPUResourceManager::DestroyTexture(s_renderTargetSceneColor); GPUResourceManager::DestroyTexture(s_renderTargetDebugDrawColor); @@ -138,61 +141,108 @@ namespace ia::iae VOID Renderer::BeginFrame() { - if (!(s_state.ActiveCommandBuffer = SDL_AcquireGPUCommandBuffer(s_gpuDevice))) + s_drawEntries.clear(); + + if (!(s_activeCommandBuffer = SDL_AcquireGPUCommandBuffer(s_gpuDevice))) THROW_UNKNOWN("Failed to acquire SDL GPU command buffer: ", SDL_GetError()); const auto clearColor = WorldManager::GetActiveScene()->BackgroundColor().GetAsFloatVec(); - s_state.ColorTargetInfo.clear_color = SDL_FColor{clearColor.x, clearColor.y, clearColor.z, 1.0f}; - s_state.ColorTargetInfo.texture = s_renderTargetSceneColor; - s_state.DepthStencilTargetInfo.texture = s_renderTargetSceneDepth; - s_state.ActiveRenderPass = - SDL_BeginGPURenderPass(s_state.ActiveCommandBuffer, &s_state.ColorTargetInfo, 1, nullptr); + s_colorTargetInfo.clear_color = SDL_FColor{clearColor.x, clearColor.y, clearColor.z, 1.0f}; + s_colorTargetInfo.texture = s_renderTargetSceneColor; + s_activeRenderPass = SDL_BeginGPURenderPass(s_activeCommandBuffer, &s_colorTargetInfo, 1, nullptr); - SDL_BindGPUGraphicsPipeline(s_state.ActiveRenderPass, s_geometryPipeline->GetHandle()); - SDL_PushGPUVertexUniformData( - s_state.ActiveCommandBuffer, 0, - s_state.ActiveCamera ? s_state.ActiveCamera->GetProjectionMatrix() : &IdentityMatrix, sizeof(Mat4)); + SDL_BindGPUGraphicsPipeline(s_activeRenderPass, s_geometryPipeline->GetHandle()); + SDL_PushGPUVertexUniformData(s_activeCommandBuffer, 0, + s_activeCamera ? s_activeCamera->GetProjectionMatrix() : &IdentityMatrix, + sizeof(Mat4)); } VOID Renderer::EndFrame() { - SDL_EndGPURenderPass(s_state.ActiveRenderPass); +#pragma pack(push, 1) + + STATIC struct + { + INT32 FlippedH{false}; + INT32 FlippedV{false}; + Vec2 TextureOffset{0.0f, 0.0f}; + Vec4 ColorOverlay{1.0f, 1.0f, 1.0f, 1.0f}; + } s_fragmentUniform{}; + +#pragma pack(pop) + + std::sort(s_drawEntries.begin(), s_drawEntries.end(), [](IN CONST DrawEntry &a, IN CONST DrawEntry &b) { + if(a.Layer != b.Layer) + return a.Layer < b.Layer; + return a.SortIndex < b.SortIndex; + }); + + for (const auto &t : s_drawEntries) + { + SDL_PushGPUVertexUniformData( + s_activeCommandBuffer, 1, + (s_activeCamera && t.DrawState.CameraRelative) ? s_activeCamera->GetViewMatrix() : &IdentityMatrix, + sizeof(Mat4)); + + SDL_PushGPUVertexUniformData(Renderer::s_activeCommandBuffer, 2, &t.DrawState.ModelMatrix, sizeof(Mat4)); + + s_fragmentUniform.ColorOverlay = t.DrawState.ColorOverlay.GetAsFloatVec(); + s_fragmentUniform.FlippedH = t.DrawState.FlippedH; + s_fragmentUniform.FlippedV = t.DrawState.FlippedV; + s_fragmentUniform.TextureOffset = t.DrawState.TextureOffset; + SDL_GPUTextureSamplerBinding textureBinding{.texture = t.DrawState.ActiveTexture, + .sampler = ((t.DrawState.TextureOffset.x <= FLOAT32_EPSILON) && + (t.DrawState.TextureOffset.y <= FLOAT32_EPSILON)) + ? GPUResourceManager::GetSampler_LinearClamp() + : GPUResourceManager::GetSampler_LinearRepeat()}; + SDL_BindGPUFragmentSamplers(s_activeRenderPass, 0, &textureBinding, 1); + SDL_PushGPUFragmentUniformData(s_activeCommandBuffer, 0, &s_fragmentUniform, sizeof(s_fragmentUniform)); + + // SDL_SetGPUScissor(s_activeRenderPass, &s_scissor); + // SDL_SetGPUViewport(s_activeRenderPass, &s_activeViewport); + + SDL_GPUBufferBinding bufferBindings[] = {{.buffer = t.GeometryHandle->VertexBuffer, .offset = 0}, + {.buffer = t.GeometryHandle->IndexBuffer, .offset = 0}}; + SDL_BindGPUVertexBuffers(s_activeRenderPass, 0, bufferBindings, 1); + SDL_BindGPUIndexBuffer(s_activeRenderPass, &bufferBindings[1], SDL_GPU_INDEXELEMENTSIZE_32BIT); + SDL_DrawGPUIndexedPrimitives(s_activeRenderPass, t.GeometryHandle->IndexCount, 1, 0, 0, 0); + } + + SDL_EndGPURenderPass(s_activeRenderPass); DebugDraw::Render(); const auto imDrawData = ImGui::GetDrawData(); - ImGui_ImplSDLGPU3_PrepareDrawData(imDrawData, s_state.ActiveCommandBuffer); - s_state.ColorTargetInfo.load_op = SDL_GPU_LOADOP_CLEAR; - s_state.ColorTargetInfo.clear_color = SDL_FColor{0.0f, 0.0f, 0.0f, 0.0f}; - s_state.ColorTargetInfo.texture = s_renderTargetDebugDrawColor; - s_state.ActiveRenderPass = - SDL_BeginGPURenderPass(s_state.ActiveCommandBuffer, &s_state.ColorTargetInfo, 1, nullptr); - ImGui_ImplSDLGPU3_RenderDrawData(imDrawData, s_state.ActiveCommandBuffer, s_state.ActiveRenderPass); - SDL_EndGPURenderPass(s_state.ActiveRenderPass); + ImGui_ImplSDLGPU3_PrepareDrawData(imDrawData, s_activeCommandBuffer); + s_colorTargetInfo.load_op = SDL_GPU_LOADOP_CLEAR; + s_colorTargetInfo.clear_color = SDL_FColor{0.0f, 0.0f, 0.0f, 0.0f}; + s_colorTargetInfo.texture = s_renderTargetDebugDrawColor; + s_activeRenderPass = SDL_BeginGPURenderPass(s_activeCommandBuffer, &s_colorTargetInfo, 1, nullptr); + ImGui_ImplSDLGPU3_RenderDrawData(imDrawData, s_activeCommandBuffer, s_activeRenderPass); + SDL_EndGPURenderPass(s_activeRenderPass); SDL_GPUTexture *swapChainTexture{}; - if (!SDL_WaitAndAcquireGPUSwapchainTexture(s_state.ActiveCommandBuffer, g_windowHandle, &swapChainTexture, + if (!SDL_WaitAndAcquireGPUSwapchainTexture(s_activeCommandBuffer, g_windowHandle, &swapChainTexture, (PUINT32) &s_screenWidth, (PUINT32) &s_screenHeight)) THROW_UNKNOWN("Failed to acquire SDL GPU Swapchain texture: ", SDL_GetError()); if (!swapChainTexture) return; - s_state.ColorTargetInfo.clear_color = SDL_FColor{1.0f, 1.0f, 1.0f, 1.0f}; - s_state.ColorTargetInfo.load_op = SDL_GPU_LOADOP_CLEAR; - s_state.ColorTargetInfo.texture = swapChainTexture; + s_colorTargetInfo.clear_color = SDL_FColor{1.0f, 1.0f, 1.0f, 1.0f}; + s_colorTargetInfo.load_op = SDL_GPU_LOADOP_CLEAR; + s_colorTargetInfo.texture = swapChainTexture; - s_state.ActiveRenderPass = - SDL_BeginGPURenderPass(s_state.ActiveCommandBuffer, &s_state.ColorTargetInfo, 1, nullptr); - SDL_BindGPUGraphicsPipeline(s_state.ActiveRenderPass, s_postprocessPipeline->GetHandle()); + s_activeRenderPass = SDL_BeginGPURenderPass(s_activeCommandBuffer, &s_colorTargetInfo, 1, nullptr); + SDL_BindGPUGraphicsPipeline(s_activeRenderPass, s_postprocessPipeline->GetHandle()); SDL_GPUTextureSamplerBinding textureBindings[2] = { {.texture = s_renderTargetSceneColor, .sampler = GPUResourceManager::GetSampler_LinearClamp()}, {.texture = s_renderTargetDebugDrawColor, .sampler = GPUResourceManager::GetSampler_LinearClamp()}, }; - SDL_BindGPUFragmentSamplers(s_state.ActiveRenderPass, 0, textureBindings, 2); - SDL_DrawGPUPrimitives(s_state.ActiveRenderPass, 6, 1, 0, 0); - SDL_EndGPURenderPass(s_state.ActiveRenderPass); + SDL_BindGPUFragmentSamplers(s_activeRenderPass, 0, textureBindings, 2); + SDL_DrawGPUPrimitives(s_activeRenderPass, 6, 1, 0, 0); + SDL_EndGPURenderPass(s_activeRenderPass); - SDL_SubmitGPUCommandBuffer(s_state.ActiveCommandBuffer); + SDL_SubmitGPUCommandBuffer(s_activeCommandBuffer); } VOID Renderer::OnScreenResize(IN INT32 newWidth, IN INT32 newHeight) @@ -200,16 +250,11 @@ namespace ia::iae s_screenWidth = newWidth; s_screenHeight = newHeight; - if (s_renderTargetSceneDepth) - GPUResourceManager::DestroyTexture(s_renderTargetSceneDepth); if (s_renderTargetSceneColor) GPUResourceManager::DestroyTexture(s_renderTargetSceneColor); if (s_renderTargetDebugDrawColor) GPUResourceManager::DestroyTexture(s_renderTargetDebugDrawColor); - s_renderTargetSceneDepth = - GPUResourceManager::CreateTexture(SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, s_screenWidth, s_screenHeight, - nullptr, SDL_GPU_TEXTUREFORMAT_D16_UNORM); s_renderTargetSceneColor = GPUResourceManager::CreateTexture( SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_SAMPLER, s_screenWidth, s_screenHeight, nullptr, SDL_GetGPUSwapchainTextureFormat(s_gpuDevice, g_windowHandle)); @@ -217,26 +262,25 @@ namespace ia::iae SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_SAMPLER, s_screenWidth, s_screenHeight, nullptr, SDL_GetGPUSwapchainTextureFormat(s_gpuDevice, g_windowHandle)); - s_state.Scissor = {0, 0, newWidth, newHeight}; + s_scissor = {0, 0, newWidth, newHeight}; - s_state.ActiveViewport.x = 0; - s_state.ActiveViewport.y = 0; - s_state.ActiveViewport.w = newWidth; - s_state.ActiveViewport.h = newHeight; - s_state.ActiveViewport.min_depth = 0.0f; - s_state.ActiveViewport.max_depth = 1.0f; + s_activeViewport.x = 0; + s_activeViewport.y = 0; + s_activeViewport.w = newWidth; + s_activeViewport.h = newHeight; + s_activeViewport.min_depth = 0.0f; + s_activeViewport.max_depth = 1.0f; - if (s_state.ActiveCamera) - s_state.ActiveCamera->SetViewport(newWidth, newHeight); + if (s_activeCamera) + s_activeCamera->SetViewport(newWidth, newHeight); const auto activeScene = WorldManager::GetActiveScene(); if (activeScene) { const auto sceneViewport = activeScene->Viewport(); - s_state.SceneScaleFactor = {(FLOAT32) newWidth / (FLOAT32) sceneViewport.x, - (FLOAT32) newHeight / (FLOAT32) sceneViewport.y}; - IAE_LOG_INFO("Updated Scene Scale Factor: (", s_state.SceneScaleFactor.x, ", ", s_state.SceneScaleFactor.y, - ")"); + s_sceneScaleFactor = {(FLOAT32) newWidth / (FLOAT32) sceneViewport.x, + (FLOAT32) newHeight / (FLOAT32) sceneViewport.y}; + IAE_LOG_INFO("Updated Scene Scale Factor: (", s_sceneScaleFactor.x, ", ", s_sceneScaleFactor.y, ")"); } } @@ -264,45 +308,14 @@ namespace ia::iae delete handle; } - VOID Renderer::DrawGeometry(IN Geometry *handle) + VOID Renderer::DrawGeometry(IN Geometry *handle, IN UINT8 layer, IN UINT16 sortIndex) { -#pragma pack(push, 1) - - STATIC struct - { - INT32 FlippedH{false}; - INT32 FlippedV{false}; - Vec2 TextureOffset{0.0f, 0.0f}; - Vec4 ColorOverlay{1.0f, 1.0f, 1.0f, 1.0f}; - } s_fragmentUniform{}; - -#pragma pack(pop) - - SDL_PushGPUVertexUniformData( - s_state.ActiveCommandBuffer, 1, - (s_state.ActiveCamera && s_state.CameraRelative) ? s_state.ActiveCamera->GetViewMatrix() : &IdentityMatrix, - sizeof(Mat4)); - - s_fragmentUniform.ColorOverlay = s_state.ColorOverlay.GetAsFloatVec(); - s_fragmentUniform.FlippedH = s_state.FlippedH; - s_fragmentUniform.FlippedV = s_state.FlippedV; - s_fragmentUniform.TextureOffset = s_state.TextureOffset; - SDL_GPUTextureSamplerBinding textureBinding{ - .texture = s_state.ActiveTexture, - .sampler = ((s_state.TextureOffset.x <= FLOAT32_EPSILON) && (s_state.TextureOffset.y <= FLOAT32_EPSILON)) - ? GPUResourceManager::GetSampler_LinearClamp() - : GPUResourceManager::GetSampler_LinearRepeat()}; - SDL_BindGPUFragmentSamplers(s_state.ActiveRenderPass, 0, &textureBinding, 1); - SDL_PushGPUFragmentUniformData(s_state.ActiveCommandBuffer, 0, &s_fragmentUniform, sizeof(s_fragmentUniform)); - - SDL_SetGPUScissor(s_state.ActiveRenderPass, &s_state.Scissor); - SDL_SetGPUViewport(s_state.ActiveRenderPass, &s_state.ActiveViewport); - - SDL_GPUBufferBinding bufferBindings[] = {{.buffer = handle->VertexBuffer, .offset = 0}, - {.buffer = handle->IndexBuffer, .offset = 0}}; - SDL_BindGPUVertexBuffers(s_state.ActiveRenderPass, 0, bufferBindings, 1); - SDL_BindGPUIndexBuffer(s_state.ActiveRenderPass, &bufferBindings[1], SDL_GPU_INDEXELEMENTSIZE_32BIT); - SDL_DrawGPUIndexedPrimitives(s_state.ActiveRenderPass, handle->IndexCount, 1, 0, 0, 0); + const auto t = (UINT16) (sortIndex + ((UINT16) s_state.PositionY * s_state.YSortingEnabled)); + s_drawEntries.pushBack( + DrawEntry{.Layer = layer, + .SortIndex = t, + .DrawState = s_state, + .GeometryHandle = handle}); } VOID Renderer::WaitForGPUIdle() @@ -320,18 +333,18 @@ namespace ia::iae VOID Engine::SetActiveCamera(IN CameraComponent *cameraComponent) { - Renderer::s_state.ActiveCamera = cameraComponent; + Renderer::s_activeCamera = cameraComponent; Renderer::OnScreenResize(Renderer::s_screenWidth, Renderer::s_screenHeight); } CameraComponent *Engine::GetActiveCamera() { - return Renderer::s_state.ActiveCamera; + return Renderer::s_activeCamera; } Vec2 Engine::GetRendererScalingFactor() { - return Renderer::s_state.SceneScaleFactor; + return Renderer::s_sceneScaleFactor; } Handle Engine::CreateGeometry(IN CONST Vector &vertices, IN CONST Vector &indices) @@ -344,15 +357,15 @@ namespace ia::iae Renderer::DestroyGeometry((Renderer::Geometry *) geometry); } - VOID Engine::DrawGeometry(IN Handle handle) + VOID Engine::DrawGeometry(IN Handle handle, IN UINT8 layer, IN UINT16 sortIndex) { - Renderer::DrawGeometry((Renderer::Geometry *) handle); + Renderer::DrawGeometry((Renderer::Geometry *) handle, layer, sortIndex); } VOID Engine::SetRenderState_Scissor(IN IVec4 rect) { - Renderer::s_state.Scissor = rect.z ? SDL_Rect{0, 0, Renderer::s_screenWidth, Renderer::s_screenHeight} - : SDL_Rect{rect.x, rect.y, rect.z, rect.w}; + Renderer::s_scissor = rect.z ? SDL_Rect{0, 0, Renderer::s_screenWidth, Renderer::s_screenHeight} + : SDL_Rect{rect.x, rect.y, rect.z, rect.w}; } VOID Engine::SetRenderState_FlippedH(IN BOOL value) @@ -385,39 +398,25 @@ namespace ia::iae Renderer::s_state.ActiveTexture = ResourceManager::GetTextureFromImage(image); } - VOID Engine::SetRenderState_Transform(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN UINT8 layer, - IN INT16 sortIndex) + VOID Engine::SetRenderState_Transform(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation) { - IA_ASSERT(sortIndex <= 0x1FFF); + position *= Renderer::s_sceneScaleFactor; + scale *= Renderer::s_sceneScaleFactor; - if (Renderer::s_state.YSortingEnabled) - sortIndex += static_cast(position.y); + Renderer::s_state.PositionY = position.y; - position *= Renderer::s_state.SceneScaleFactor; - scale *= Renderer::s_state.SceneScaleFactor; - - Renderer::s_state.ModelMatrix = - glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, - static_cast((layer << 13) | (sortIndex & 0x1FFF))}); + Renderer::s_state.ModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0}); Renderer::s_state.ModelMatrix = glm::rotate(Renderer::s_state.ModelMatrix, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); Renderer::s_state.ModelMatrix = glm::scale(Renderer::s_state.ModelMatrix, glm::vec3{scale.x, scale.y, 1.0f}); - - SDL_PushGPUVertexUniformData(Renderer::s_state.ActiveCommandBuffer, 2, &Renderer::s_state.ModelMatrix, - sizeof(Mat4)); } VOID Engine::SetRenderState_TransformUI(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation) { - Renderer::s_state.ModelMatrix = - glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, - static_cast(0xFF << 13)}); + Renderer::s_state.ModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0}); Renderer::s_state.ModelMatrix = glm::rotate(Renderer::s_state.ModelMatrix, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); Renderer::s_state.ModelMatrix = glm::scale(Renderer::s_state.ModelMatrix, glm::vec3{scale.x, scale.y, 1.0f}); - - SDL_PushGPUVertexUniformData(Renderer::s_state.ActiveCommandBuffer, 2, &Renderer::s_state.ModelMatrix, - sizeof(Mat4)); } VOID Engine::SetRenderState_YSortingEnabled(IN BOOL value) diff --git a/Engine/Src/Imp/CPP/UI.cpp b/Engine/Src/Imp/CPP/UI.cpp index e134968..a596b79 100644 --- a/Engine/Src/Imp/CPP/UI.cpp +++ b/Engine/Src/Imp/CPP/UI.cpp @@ -498,7 +498,7 @@ namespace ia::iae Engine::SetRenderState_CameraRelative(false); Engine::SetRenderState_TransformUI({translation.x, translation.y}, {1.0f, 1.0f}, 0); - Engine::DrawGeometry((Handle) geometry); + Engine::DrawGeometry((Handle) geometry, 0xFF, 0); } void RmlUIRenderInterface::ReleaseGeometry(Rml::CompiledGeometryHandle geometry) diff --git a/Engine/Src/Imp/HPP/Renderer/Renderer.hpp b/Engine/Src/Imp/HPP/Renderer/Renderer.hpp index 9af0035..57948f3 100644 --- a/Engine/Src/Imp/HPP/Renderer/Renderer.hpp +++ b/Engine/Src/Imp/HPP/Renderer/Renderer.hpp @@ -42,19 +42,17 @@ namespace ia::iae BOOL YSortingEnabled{false}; Color ColorOverlay{}; Vec2 TextureOffset{0.0f, 0.0f}; - SDL_Rect Scissor{0, 0, 0, 0}; SDL_GPUTexture* ActiveTexture{nullptr}; - SDL_GPUViewport ActiveViewport{}; - Vec2 SceneScaleFactor{1.0f, 1.0f}; - Mat4 ModelMatrix{1.0f}; + FLOAT32 PositionY{}; + }; - SDL_GPURenderPass* ActiveRenderPass{}; - SDL_GPUCommandBuffer* ActiveCommandBuffer{}; - SDL_GPUColorTargetInfo ColorTargetInfo{}; - SDL_GPUDepthStencilTargetInfo DepthStencilTargetInfo{}; - - class CameraComponent *ActiveCamera{}; + struct DrawEntry + { + UINT8 Layer{}; + UINT16 SortIndex{}; + State DrawState{}; + Geometry* GeometryHandle{}; }; public: @@ -72,7 +70,7 @@ namespace ia::iae STATIC Geometry* CreateGeometry(IN CONST Vector &vertices, IN CONST Vector &indices); STATIC VOID DestroyGeometry(IN Geometry* handle); - STATIC VOID DrawGeometry(IN Geometry* handle); + STATIC VOID DrawGeometry(IN Geometry* handle, IN UINT8 layer, IN UINT16 sortIndex); STATIC SDL_GPUTextureFormat GetRenderTargetFormat(); @@ -87,11 +85,18 @@ namespace ia::iae STATIC INT32 s_screenHeight; STATIC SDL_GPUDevice *s_gpuDevice; STATIC SDL_GPUTexture *s_renderTargetSceneColor; - STATIC SDL_GPUTexture *s_renderTargetSceneDepth; STATIC SDL_GPUTexture *s_renderTargetDebugDrawColor; STATIC Pipeline* s_geometryPipeline; STATIC Pipeline* s_postprocessPipeline; STATIC Geometry* s_quadGeometry; + STATIC Vector s_drawEntries; + STATIC SDL_GPURenderPass* s_activeRenderPass; + STATIC SDL_GPUCommandBuffer* s_activeCommandBuffer; + STATIC SDL_GPUColorTargetInfo s_colorTargetInfo; + STATIC class CameraComponent *s_activeCamera; + STATIC SDL_Rect s_scissor; + STATIC SDL_GPUViewport s_activeViewport; + STATIC Vec2 s_sceneScaleFactor; friend class Engine; }; diff --git a/Engine/Src/Inc/IAEngine/Engine.hpp b/Engine/Src/Inc/IAEngine/Engine.hpp index 5094383..242262f 100644 --- a/Engine/Src/Inc/IAEngine/Engine.hpp +++ b/Engine/Src/Inc/IAEngine/Engine.hpp @@ -46,7 +46,7 @@ namespace ia::iae STATIC Handle GetGeometry_Quad(); STATIC Handle CreateGeometry(IN CONST Vector &vertices, IN CONST Vector &indices); STATIC VOID DestroyGeometry(IN Handle geometry); - STATIC VOID DrawGeometry(IN Handle handle); + STATIC VOID DrawGeometry(IN Handle handle, IN UINT8 layer, IN UINT16 sortIndex); STATIC IVec2 GetDisplayExtent(); STATIC VOID ResizeDisplay(IN INT32 newWidth, IN INT32 newHeight); @@ -59,8 +59,7 @@ namespace ia::iae STATIC VOID SetRenderState_ColorOverlay(IN Color color); STATIC VOID SetRenderState_CameraRelative(IN BOOL value); STATIC VOID SetRenderState_Texture(IN Handle image); - STATIC VOID SetRenderState_Transform(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN UINT8 layer, - IN INT16 sortIndex); + STATIC VOID SetRenderState_Transform(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation); STATIC VOID SetRenderState_TransformUI(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation); STATIC Vec2 GetRendererScalingFactor();