diff --git a/Editor/resources/Shaders/deferred.shader b/Editor/resources/Shaders/deferred.shader index 81c2bd9d..3a88594d 100644 --- a/Editor/resources/Shaders/deferred.shader +++ b/Editor/resources/Shaders/deferred.shader @@ -159,7 +159,6 @@ float ShadowCalculation(Light light, vec3 FragPos, vec3 normal) // transform to [0,1] range projCoords = projCoords * 0.5 + 0.5; // get closest depth value from light's perspective (using [0,1] range fragPosLight as coords) - float closestDepth = texture(light.ShadowMaps[0], projCoords.xy).r; // get depth of current fragment from light's perspective float currentDepth = projCoords.z; // check whether current frag pos is in shadow @@ -214,7 +213,14 @@ vec3 ComputeVolumetric(vec3 FragPos, Light light) if (closestDepth > currentDepth) accumFog += (ComputeScattering(dot(rayDirection, light.Direction)).xxx * light.Color); - currentPosition += step; + //float ditherPattern[4][4] = { + // { 0.0f, 0.5f, 0.125f, 0.625f}, + // { 0.75f, 0.22f, 0.875f, 0.375f}, + // { 0.1875f, 0.6875f, 0.0625f, 0.5625}, + // { 0.9375f, 0.4375f, 0.8125f, 0.3125} + //}; + + currentPosition += step; //* ditherPattern[int(gl_FragCoord.x) % 4][int(gl_FragCoord.y) % 4]; } accumFog /= u_FogStepCount; diff --git a/Editor/src/EditorInterface.cpp b/Editor/src/EditorInterface.cpp index 6e86d196..9616da01 100644 --- a/Editor/src/EditorInterface.cpp +++ b/Editor/src/EditorInterface.cpp @@ -69,10 +69,14 @@ namespace Nuake { ImVec2 regionAvail = ImGui::GetContentRegionAvail(); Vector2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); - if (Engine::GetCurrentWindow()->GetFrameBuffer()->GetSize() != viewportPanelSize) - Engine::GetCurrentWindow()->GetFrameBuffer()->QueueResize(viewportPanelSize); + Ref framebuffer = Engine::GetCurrentWindow()->GetDeferredBuffer(); + if (framebuffer->GetSize() != viewportPanelSize) + { + Engine::GetCurrentWindow()->GetGBuffer()->QueueResize(viewportPanelSize); + framebuffer->QueueResize(viewportPanelSize); + } - Ref texture = Engine::GetCurrentWindow()->GetFrameBuffer()->GetTexture(); + Ref texture = framebuffer->GetTexture(); ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); ImGuizmo::SetDrawlist(); @@ -131,23 +135,23 @@ namespace Nuake { if (m_IsEntitySelected) { - if (ImGui::Begin("DEFERRED")) - { - ImVec2 regionAvail = ImGui::GetContentRegionAvail(); - glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); - Ref texture = Engine::GetCurrentWindow()->GetDeferredBuffer()->GetTexture(GL_COLOR_ATTACHMENT0); - ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); - - } - ImGui::End(); - + //if (ImGui::Begin("DEFERRED")) + //{ + // ImVec2 regionAvail = ImGui::GetContentRegionAvail(); + // glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); + // Ref texture = Engine::GetCurrentWindow()->GetDeferredBuffer()->GetTexture(GL_COLOR_ATTACHMENT0); + // ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); + // + //} + //ImGui::End(); + // if (ImGui::Begin("GBUFFER")) { ImVec2 regionAvail = ImGui::GetContentRegionAvail(); glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); Ref texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_DEPTH_ATTACHMENT); ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); - + } ImGui::End(); if (ImGui::Begin("GBUFFER2")) @@ -156,7 +160,7 @@ namespace Nuake { glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); Ref texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_COLOR_ATTACHMENT0); ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); - + } ImGui::End(); if (ImGui::Begin("GBUFFER3")) @@ -165,7 +169,7 @@ namespace Nuake { glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); Ref texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_COLOR_ATTACHMENT1); ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); - + } ImGui::End(); if (ImGui::Begin("GBUFFER4")) @@ -174,7 +178,7 @@ namespace Nuake { glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); Ref texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_COLOR_ATTACHMENT2); ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); - + } ImGui::End(); // diff --git a/Nuake/Engine.cpp b/Nuake/Engine.cpp index c8d3604c..c6f42dbd 100644 --- a/Nuake/Engine.cpp +++ b/Nuake/Engine.cpp @@ -50,10 +50,11 @@ namespace Nuake // Dont update if no scene is loaded. if (CurrentWindow->GetScene()) { + CurrentWindow->Update(timestep); // Play mode update all the entities, Editor does not. if (Engine::IsPlayMode) { - CurrentWindow->Update(timestep); + m_FixedUpdateDifference += timestep; // Fixed update diff --git a/Nuake/src/Rendering/Buffers/Framebuffer.cpp b/Nuake/src/Rendering/Buffers/Framebuffer.cpp index cbfa61f6..873707cc 100644 --- a/Nuake/src/Rendering/Buffers/Framebuffer.cpp +++ b/Nuake/src/Rendering/Buffers/Framebuffer.cpp @@ -7,12 +7,13 @@ namespace Nuake { m_Textures = std::map>(); m_Size = size; + m_HasRenderBuffer = hasRenderBuffer; glGenFramebuffers(1, &m_FramebufferID); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FramebufferID); // Create render buffer and attach to frame buffer. - if (hasRenderBuffer) + if (m_HasRenderBuffer) { glGenRenderbuffers(1, &m_RenderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_RenderBuffer); @@ -94,25 +95,29 @@ namespace Nuake // Delete frame buffer and render buffer. glDeleteFramebuffers(1, &m_FramebufferID); - glDeleteRenderbuffers(1, &m_RenderBuffer); - - // Recreate resized texture. - for (auto t : m_Textures) - t.second->Resize(size); - + if(m_HasRenderBuffer) + glDeleteRenderbuffers(1, &m_RenderBuffer); + // New FBO and RBO. glGenFramebuffers(1, &m_FramebufferID); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FramebufferID); // Recreate resized texture. - for (auto t : m_Textures) - t.second->AttachToFramebuffer(t.first); + for (auto& t : m_Textures) + { + t.second->Resize(size); + SetTexture(t.second, t.first); + } // Recreate render buffer - glGenRenderbuffers(1, &m_RenderBuffer); - glBindRenderbuffer(GL_RENDERBUFFER, m_RenderBuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_Size.x, m_Size.y); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_RenderBuffer); + // TODO: move out render buffer. + if (m_HasRenderBuffer) + { + glGenRenderbuffers(1, &m_RenderBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_RenderBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_Size.x, m_Size.y); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_RenderBuffer); + } // Unbind. glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); diff --git a/Nuake/src/Rendering/Buffers/Framebuffer.h b/Nuake/src/Rendering/Buffers/Framebuffer.h index c473aa61..68a81269 100644 --- a/Nuake/src/Rendering/Buffers/Framebuffer.h +++ b/Nuake/src/Rendering/Buffers/Framebuffer.h @@ -19,6 +19,7 @@ namespace Nuake std::map> m_Textures; Ref m_Texture; + bool m_HasRenderBuffer = false; public: FrameBuffer(bool hasRenderBuffer, Vector2 size); diff --git a/Nuake/src/Rendering/Light.cpp b/Nuake/src/Rendering/Light.cpp index 72650c3d..c116a17c 100644 --- a/Nuake/src/Rendering/Light.cpp +++ b/Nuake/src/Rendering/Light.cpp @@ -12,8 +12,8 @@ namespace Nuake Ref shadowmap = CreateRef(false, glm::vec2(4096, 4096)); Ref texture = CreateRef(glm::vec2(4096, 4096), GL_DEPTH_COMPONENT); + texture->SetParameter(GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); shadowmap->SetTexture(texture, GL_DEPTH_ATTACHMENT); - m_ShadowMaps[i] = shadowmap; } } diff --git a/Nuake/src/Rendering/Renderer.cpp b/Nuake/src/Rendering/Renderer.cpp index 4df4ca44..07ad9eb5 100644 --- a/Nuake/src/Rendering/Renderer.cpp +++ b/Nuake/src/Rendering/Renderer.cpp @@ -138,7 +138,6 @@ namespace Nuake Matrix4 lightView = glm::lookAt(pos, pos - direction, glm::vec3(0.0f, 1.0f, 0.0f)); //light.m_Framebuffer->GetTexture(GL_DEPTH_ATTACHMENT)->Bind(17); - if (light.CastShadows) { for (unsigned int i = 0; i < CSM_AMOUNT; i++) @@ -171,7 +170,7 @@ namespace Nuake int idx = m_Lights.size(); Vector3 direction = light.GetDirection(); - Vector3 pos = transform.GlobalTranslation; + Vector3 pos = transform.GetTransform()[3]; Matrix4 lightView = glm::lookAt(pos, pos - direction, glm::vec3(0.0f, 1.0f, 0.0f)); //light.m_Framebuffer->GetTexture(GL_DEPTH_ATTACHMENT)->Bind(17); @@ -190,7 +189,7 @@ namespace Nuake deferredShader->SetUniform1i("LightCount", idx); deferredShader->SetUniform1i("Lights[" + std::to_string(idx - 1) + "].Type", light.Type); deferredShader->SetUniformMat4f("Lights[" + std::to_string(idx - 1) + "].LightTransform", light.GetProjection() * lightView); - deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Position", transform.GlobalTranslation.x, transform.GlobalTranslation.y, transform.GlobalTranslation.z); + deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Position",pos.x, pos.y, pos.z); deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Direction", direction.x, direction.y, direction.z); deferredShader->SetUniform3f("Lights[" + std::to_string(idx - 1) + "].Color", light.Color.r * light.Strength, light.Color.g * light.Strength, light.Color.b * light.Strength); deferredShader->SetUniform1i("Lights[" + std::to_string(idx - 1) + "].Volumetric", light.IsVolumetric); diff --git a/Nuake/src/Rendering/Textures/Texture.cpp b/Nuake/src/Rendering/Textures/Texture.cpp index d9b6de70..59245392 100644 --- a/Nuake/src/Rendering/Textures/Texture.cpp +++ b/Nuake/src/Rendering/Textures/Texture.cpp @@ -99,4 +99,11 @@ namespace Nuake { glBindTexture(GL_TEXTURE_2D, 0); } + + void Texture::SetParameter(const GLenum& param, const GLenum& value) + { + Bind(); + glTextureParameteri(GL_TEXTURE_2D, param, value); + Unbind(); + } } diff --git a/Nuake/src/Rendering/Textures/Texture.h b/Nuake/src/Rendering/Textures/Texture.h index 2d7138a3..714e9128 100644 --- a/Nuake/src/Rendering/Textures/Texture.h +++ b/Nuake/src/Rendering/Textures/Texture.h @@ -33,6 +33,8 @@ namespace Nuake void Bind(unsigned int slot = 0) const; void Unbind() const; + void SetParameter(const GLenum& param, const GLenum& value); + unsigned int GetID() const { return m_RendererId; } inline std::string GetPath() { return m_FilePath; } inline int GetWidth() const { return m_Width; } diff --git a/Nuake/src/Scene/Components/TransformComponent.cpp b/Nuake/src/Scene/Components/TransformComponent.cpp index 51d1e9c2..54335e3d 100644 --- a/Nuake/src/Scene/Components/TransformComponent.cpp +++ b/Nuake/src/Scene/Components/TransformComponent.cpp @@ -13,12 +13,12 @@ namespace Nuake glm::mat4 TransformComponent::GetTransform() { - Matrix4 transform = Matrix4(1.0f); - transform = glm::translate(transform, GlobalTranslation); - transform = glm::rotate(transform, glm::radians(Rotation.x), Vector3(1, 0, 0)); - transform = glm::rotate(transform, glm::radians(Rotation.y), Vector3(0, 1, 0)); - transform = glm::rotate(transform, glm::radians(Rotation.z), Vector3(0, 0, 1)); - transform = glm::scale(transform, Scale); - return transform; + //Matrix4 transform = Matrix4(1.0f); + //transform = glm::translate(transform, GlobalTranslation); + //transform = glm::rotate(transform, glm::radians(Rotation.x), Vector3(1, 0, 0)); + //transform = glm::rotate(transform, glm::radians(Rotation.y), Vector3(0, 1, 0)); + //transform = glm::rotate(transform, glm::radians(Rotation.z), Vector3(0, 0, 1)); + //transform = glm::scale(transform, Scale); + return Transform; } } diff --git a/Nuake/src/Scene/Components/TransformComponent.h b/Nuake/src/Scene/Components/TransformComponent.h index 5f49f6b5..dd662c05 100644 --- a/Nuake/src/Scene/Components/TransformComponent.h +++ b/Nuake/src/Scene/Components/TransformComponent.h @@ -1,6 +1,6 @@ #pragma once -#include "../Core/Maths.h" -#include "../Resource/Serializable.h" +#include "src/Core/Maths.h" +#include "src/Resource/Serializable.h" namespace Nuake { @@ -8,6 +8,7 @@ namespace Nuake public: Vector3 GlobalTranslation; Vector3 Translation; + Matrix4 Transform; Vector3 GlobalRotation; Vector3 Rotation; // TODO: Should use quaternions. diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.cpp b/Nuake/src/Scene/Systems/PhysicsSystem.cpp index 492e819e..c367fb5d 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.cpp +++ b/Nuake/src/Scene/Systems/PhysicsSystem.cpp @@ -90,6 +90,9 @@ namespace Nuake void PhysicsSystem::Update(Timestep ts) { + if (!Engine::IsPlayMode) + return; + PhysicsManager::Get()->Step(ts); auto brushes = m_Scene->m_Registry.view(); diff --git a/Nuake/src/Scene/Systems/ScriptingSystem.cpp b/Nuake/src/Scene/Systems/ScriptingSystem.cpp index c9e4690c..1266013e 100644 --- a/Nuake/src/Scene/Systems/ScriptingSystem.cpp +++ b/Nuake/src/Scene/Systems/ScriptingSystem.cpp @@ -1,6 +1,7 @@ #include "ScriptingSystem.h" #include "src/Scene/Components/WrenScriptComponent.h" #include "src/Scene/Scene.h" +#include "Engine.h" namespace Nuake { ScriptingSystem::ScriptingSystem(Scene* scene) @@ -36,6 +37,9 @@ namespace Nuake { void ScriptingSystem::Update(Timestep ts) { + if (!Engine::IsPlayMode) + return; + auto entities = m_Scene->m_Registry.view(); for (auto& e : entities) { diff --git a/Nuake/src/Scene/Systems/TransformSystem.cpp b/Nuake/src/Scene/Systems/TransformSystem.cpp index 83dcd6f8..24527918 100644 --- a/Nuake/src/Scene/Systems/TransformSystem.cpp +++ b/Nuake/src/Scene/Systems/TransformSystem.cpp @@ -49,32 +49,63 @@ namespace Nuake { auto [parent, transform] = transformView.get(e); Entity currentParent = Entity((entt::entity)e, m_Scene); + Matrix4 globalTransform = Matrix4(1.0f); Vector3 globalPosition = Vector3(); Vector3 globalRotation = Vector3(); Vector3 globalScale = Vector3(); if (parent.HasParent) { + globalTransform = glm::translate(globalTransform, transform.Translation); + + globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.x), Vector3(1, 0, 0)); + globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.y), Vector3(0, 1, 0)); + globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.z), Vector3(0, 0, 1)); + + globalTransform = glm::scale(globalTransform, transform.Scale); + ParentComponent parentComponent = currentParent.GetComponent(); while (parentComponent.HasParent) { TransformComponent& transformComponent = parentComponent.Parent.GetComponent(); + + Matrix4 currentParentMatrix = Matrix4(1.0f); + + currentParentMatrix = glm::translate(currentParentMatrix, transformComponent.Translation); + + currentParentMatrix = glm::rotate(currentParentMatrix, glm::radians(transformComponent.Rotation.x), Vector3(1, 0, 0)); + currentParentMatrix = glm::rotate(currentParentMatrix, glm::radians(transformComponent.Rotation.y), Vector3(0, 1, 0)); + currentParentMatrix = glm::rotate(currentParentMatrix, glm::radians(transformComponent.Rotation.z), Vector3(0, 0, 1)); + + currentParentMatrix = glm::scale(currentParentMatrix, transformComponent.Scale); + + globalTransform = currentParentMatrix * globalTransform; + globalPosition += transformComponent.Translation; globalRotation += transformComponent.Rotation; globalScale *= transformComponent.Scale; - + parentComponent = parentComponent.Parent.GetComponent(); } + transform.GlobalTranslation = globalPosition + transform.Translation; transform.GlobalRotation = globalRotation + transform.Rotation; transform.GlobalScale = globalScale * transform.Scale; + transform.Transform = globalTransform; } else { transform.GlobalTranslation = transform.Translation; transform.GlobalRotation = transform.Rotation; transform.Scale = transform.Scale; + + globalTransform = glm::translate(globalTransform, transform.Translation); + globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.x), Vector3(1, 0, 0)); + globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.y), Vector3(0, 1, 0)); + globalTransform = glm::rotate(globalTransform, glm::radians(transform.Rotation.z), Vector3(0, 0, 1)); + globalTransform = glm::scale(globalTransform, transform.Scale); + transform.Transform = globalTransform; } } } diff --git a/Nuake/src/Window.cpp b/Nuake/src/Window.cpp index 9df1e33d..a7bf4b96 100644 --- a/Nuake/src/Window.cpp +++ b/Nuake/src/Window.cpp @@ -17,7 +17,7 @@ #include #include #include "Resource/FontAwesome5.h" -#include "../Engine.h" +#include "Engine.h" namespace Nuake { // TODO: Use abstraction for vertex buffers @@ -133,6 +133,7 @@ namespace Nuake { // TODO: have clear color in environnement. glClearColor(0.019f, 0.501f, 1.0f, 1.0f); + glfwSwapInterval(1); glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); glEnable(GL_DEPTH_TEST); glEnable(GL_MULTISAMPLE); @@ -277,6 +278,8 @@ namespace Nuake { } m_Framebuffer->Unbind(); + + m_Scene->m_EditorCamera->OnWindowResize(m_GBuffer->GetSize().x, m_GBuffer->GetSize().y); m_GBuffer->Bind(); m_GBuffer->Clear(); {