mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-09 20:08:57 +03:00
Fixed framebuffer resizing and transform rotation matrix
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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> framebuffer = Engine::GetCurrentWindow()->GetDeferredBuffer();
|
||||
if (framebuffer->GetSize() != viewportPanelSize)
|
||||
{
|
||||
Engine::GetCurrentWindow()->GetGBuffer()->QueueResize(viewportPanelSize);
|
||||
framebuffer->QueueResize(viewportPanelSize);
|
||||
}
|
||||
|
||||
Ref<Texture> texture = Engine::GetCurrentWindow()->GetFrameBuffer()->GetTexture();
|
||||
Ref<Texture> 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> 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> 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> 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> 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> 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> texture = Engine::GetCurrentWindow()->GetGBuffer()->GetTexture(GL_COLOR_ATTACHMENT2);
|
||||
ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
|
||||
|
||||
|
||||
}
|
||||
ImGui::End();
|
||||
//
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -7,12 +7,13 @@ namespace Nuake
|
||||
{
|
||||
m_Textures = std::map<int, Ref<Texture>>();
|
||||
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);
|
||||
|
||||
@@ -19,6 +19,7 @@ namespace Nuake
|
||||
|
||||
std::map<int, Ref<Texture>> m_Textures;
|
||||
Ref<Texture> m_Texture;
|
||||
bool m_HasRenderBuffer = false;
|
||||
|
||||
public:
|
||||
FrameBuffer(bool hasRenderBuffer, Vector2 size);
|
||||
|
||||
@@ -12,8 +12,8 @@ namespace Nuake
|
||||
Ref<FrameBuffer> shadowmap = CreateRef<FrameBuffer>(false, glm::vec2(4096, 4096));
|
||||
|
||||
Ref<Texture> texture = CreateRef<Texture>(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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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<TransformComponent, BSPBrushComponent>();
|
||||
|
||||
@@ -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<WrenScriptComponent>();
|
||||
for (auto& e : entities)
|
||||
{
|
||||
|
||||
@@ -49,32 +49,63 @@ namespace Nuake {
|
||||
auto [parent, transform] = transformView.get<ParentComponent, TransformComponent>(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<ParentComponent>();
|
||||
while (parentComponent.HasParent)
|
||||
{
|
||||
TransformComponent& transformComponent = parentComponent.Parent.GetComponent<TransformComponent>();
|
||||
|
||||
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<ParentComponent>();
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <glm/gtx/matrix_decompose.hpp>
|
||||
#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();
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user