Framebuffer resizing
- Added 'Camera::OnResize()' for keeping the aspect ratio updated to prevent streching/squashing the scene - Added 'FrameBuffe::Resize()' - Enabled ImGui docking and viewport - 'MirrorLayer::m_Camera' & 'MirrorLayer::m_Framebuffer' now adjust their properties when ImGui's available region changes
This commit is contained in:
parent
e8b86931b2
commit
2061abadd8
11 changed files with 103 additions and 20 deletions
|
@ -25,6 +25,12 @@ namespace Light {
|
||||||
FLT_MAX, FLT_MIN);
|
FLT_MAX, FLT_MIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::OnResize(const glm::vec2& size)
|
||||||
|
{
|
||||||
|
m_AspectRatio = size.x / size.y;
|
||||||
|
CalculateProjection();
|
||||||
|
}
|
||||||
|
|
||||||
void Camera::Move(const glm::vec2& position)
|
void Camera::Move(const glm::vec2& position)
|
||||||
{
|
{
|
||||||
m_Position += position;
|
m_Position += position;
|
||||||
|
|
|
@ -25,6 +25,8 @@ namespace Light {
|
||||||
void CalculateView();
|
void CalculateView();
|
||||||
void CalculateProjection();
|
void CalculateProjection();
|
||||||
|
|
||||||
|
void OnResize(const glm::vec2& size);
|
||||||
|
|
||||||
inline const glm::mat4& GetView() const { return m_View; }
|
inline const glm::mat4& GetView() const { return m_View; }
|
||||||
inline const glm::mat4& GetProjection() const { return m_Projection; }
|
inline const glm::mat4& GetProjection() const { return m_Projection; }
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,8 @@ namespace Light {
|
||||||
virtual void BindAsTarget() = 0;
|
virtual void BindAsTarget() = 0;
|
||||||
virtual void BindAsResource() = 0;
|
virtual void BindAsResource() = 0;
|
||||||
|
|
||||||
|
virtual void Resize(const glm::vec2& size) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Framebuffer() = default;
|
Framebuffer() = default;
|
||||||
};
|
};
|
||||||
|
|
|
@ -54,4 +54,20 @@ namespace Light {
|
||||||
LT_ENGINE_ERROR("dxFramebuffer::BindAsResource: NO_IMPLEMENT");
|
LT_ENGINE_ERROR("dxFramebuffer::BindAsResource: NO_IMPLEMENT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dxFramebuffer::Resize(const glm::vec2& size)
|
||||||
|
{
|
||||||
|
D3D11_TEXTURE2D_DESC textureDesc;
|
||||||
|
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||||
|
|
||||||
|
m_ColorAttachment->GetDesc(&textureDesc);
|
||||||
|
m_RenderTargetView->GetDesc(&rtvDesc);
|
||||||
|
m_ResourceView->GetDesc(&srvDesc);
|
||||||
|
|
||||||
|
HRESULT hr;
|
||||||
|
DXC(m_Context->GetDevice()->CreateTexture2D(&textureDesc, nullptr, &m_ColorAttachment));
|
||||||
|
DXC(m_Context->GetDevice()->CreateRenderTargetView(m_ColorAttachment.Get(), &rtvDesc, &m_RenderTargetView));
|
||||||
|
DXC(m_Context->GetDevice()->CreateShaderResourceView(m_ColorAttachment.Get(), &srvDesc, &m_ResourceView));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -31,6 +31,7 @@ namespace Light {
|
||||||
void BindAsTarget() override;
|
void BindAsTarget() override;
|
||||||
void BindAsResource() override;
|
void BindAsResource() override;
|
||||||
|
|
||||||
|
void Resize(const glm::vec2& size) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
|
@ -22,6 +22,12 @@ namespace Light {
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
||||||
|
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
|
||||||
|
|
||||||
|
io.ConfigFlags |= ImGuiBackendFlags_PlatformHasViewports;
|
||||||
|
io.ConfigFlags |= ImGuiBackendFlags_RendererHasViewports;
|
||||||
|
|
||||||
// style
|
// style
|
||||||
ImGui::StyleColorsDark();
|
ImGui::StyleColorsDark();
|
||||||
|
|
||||||
|
@ -51,6 +57,9 @@ namespace Light {
|
||||||
{
|
{
|
||||||
ImGui::Render();
|
ImGui::Render();
|
||||||
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
|
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
|
||||||
|
|
||||||
|
ImGui::UpdatePlatformWindows();
|
||||||
|
ImGui::RenderPlatformWindowsDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
void dxUserInterface::LogDebugData()
|
void dxUserInterface::LogDebugData()
|
||||||
|
|
|
@ -1,13 +1,48 @@
|
||||||
#include "ltpch.h"
|
#include "ltpch.h"
|
||||||
#include "glFramebuffer.h"
|
#include "glFramebuffer.h"
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
|
|
||||||
namespace Light {
|
namespace Light {
|
||||||
|
|
||||||
glFramebuffer::glFramebuffer(const FramebufferSpecification& specification)
|
glFramebuffer::glFramebuffer(const FramebufferSpecification& specification)
|
||||||
: m_Specification(specification)
|
: m_Specification(specification), m_BufferID(0u), m_ColorAttachment(0u), m_DepthStencilAttachment(0u)
|
||||||
{
|
{
|
||||||
|
Resize({ specification.width, specification.height });
|
||||||
|
}
|
||||||
|
|
||||||
|
glFramebuffer::~glFramebuffer()
|
||||||
|
{
|
||||||
|
glDeleteFramebuffers(1, &m_BufferID);
|
||||||
|
glDeleteTextures(1, &m_ColorAttachment);
|
||||||
|
// glDeleteTextures(1, &m_DepthStencilAttachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void glFramebuffer::BindAsTarget()
|
||||||
|
{
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferID);
|
||||||
|
glViewport(0, 0, m_Specification.width, m_Specification.height);
|
||||||
|
|
||||||
|
glClearColor(m_Specification.defaultColor.r, m_Specification.defaultColor.g, m_Specification.defaultColor.b, m_Specification.defaultColor.a);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void glFramebuffer::BindAsResource()
|
||||||
|
{
|
||||||
|
LT_ENGINE_ERROR("glFramebuffer::BindAsResource: NO_IMPLEMENT!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void glFramebuffer::Resize(const glm::vec2& size)
|
||||||
|
{
|
||||||
|
if (m_BufferID)
|
||||||
|
{
|
||||||
|
glDeleteFramebuffers(1, &m_BufferID);
|
||||||
|
glDeleteTextures(1, &m_ColorAttachment);
|
||||||
|
// glDeleteTextures(1, &m_DepthStencilAttachment);
|
||||||
|
}
|
||||||
|
|
||||||
glCreateFramebuffers(1, &m_BufferID);
|
glCreateFramebuffers(1, &m_BufferID);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferID);
|
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferID);
|
||||||
|
|
||||||
|
@ -32,21 +67,4 @@ namespace Light {
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
glFramebuffer::~glFramebuffer()
|
|
||||||
{
|
|
||||||
glDeleteFramebuffers(1, &m_BufferID);
|
|
||||||
}
|
|
||||||
|
|
||||||
void glFramebuffer::BindAsTarget()
|
|
||||||
{
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferID);
|
|
||||||
glClearColor(m_Specification.defaultColor.r, m_Specification.defaultColor.g, m_Specification.defaultColor.b, m_Specification.defaultColor.a);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void glFramebuffer::BindAsResource()
|
|
||||||
{
|
|
||||||
LT_ENGINE_ERROR("glFramebuffer::BindAsResource: NO_IMPLEMENT!");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -20,6 +20,8 @@ namespace Light {
|
||||||
|
|
||||||
void BindAsTarget() override;
|
void BindAsTarget() override;
|
||||||
void BindAsResource() override;
|
void BindAsResource() override;
|
||||||
|
|
||||||
|
void Resize(const glm::vec2& size) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
|
@ -5,9 +5,12 @@
|
||||||
#include <imgui_impl_glfw.h>
|
#include <imgui_impl_glfw.h>
|
||||||
#include <imgui_impl_opengl3.h>
|
#include <imgui_impl_opengl3.h>
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
namespace Light {
|
namespace Light {
|
||||||
|
|
||||||
glUserInterface::glUserInterface(GLFWwindow* windowHandle)
|
glUserInterface::glUserInterface(GLFWwindow* windowHandle)
|
||||||
|
: m_WindowHandle(windowHandle)
|
||||||
{
|
{
|
||||||
// create context
|
// create context
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
|
@ -16,6 +19,11 @@ namespace Light {
|
||||||
// configure io
|
// configure io
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
|
||||||
|
|
||||||
|
io.ConfigFlags |= ImGuiBackendFlags_PlatformHasViewports;
|
||||||
|
io.ConfigFlags |= ImGuiBackendFlags_RendererHasViewports;
|
||||||
|
|
||||||
// style color
|
// style color
|
||||||
ImGui::StyleColorsDark();
|
ImGui::StyleColorsDark();
|
||||||
|
@ -46,6 +54,10 @@ namespace Light {
|
||||||
{
|
{
|
||||||
ImGui::Render();
|
ImGui::Render();
|
||||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||||
|
|
||||||
|
ImGui::UpdatePlatformWindows();
|
||||||
|
ImGui::RenderPlatformWindowsDefault();
|
||||||
|
glfwMakeContextCurrent(m_WindowHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void glUserInterface::LogDebugData()
|
void glUserInterface::LogDebugData()
|
||||||
|
|
|
@ -3,10 +3,15 @@
|
||||||
#include "Base.h"
|
#include "Base.h"
|
||||||
#include "UserInterface/UserInterface.h"
|
#include "UserInterface/UserInterface.h"
|
||||||
|
|
||||||
|
class GLFWwindow;
|
||||||
|
|
||||||
namespace Light {
|
namespace Light {
|
||||||
|
|
||||||
class glUserInterface : public UserInterface
|
class glUserInterface : public UserInterface
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
GLFWwindow* m_WindowHandle;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
glUserInterface(GLFWwindow* windowHandle);
|
glUserInterface(GLFWwindow* windowHandle);
|
||||||
~glUserInterface();
|
~glUserInterface();
|
||||||
|
|
|
@ -53,10 +53,20 @@ public:
|
||||||
{
|
{
|
||||||
ImGui::Begin("GameView");
|
ImGui::Begin("GameView");
|
||||||
|
|
||||||
|
static ImVec2 regionAvailPrev = {0, 0};
|
||||||
|
ImVec2 regionAvail = ImGui::GetContentRegionAvail();
|
||||||
|
|
||||||
|
if (regionAvail.x != regionAvailPrev.x || regionAvail.y != regionAvailPrev.y)
|
||||||
|
{
|
||||||
|
m_Framebuffer->Resize({ regionAvail.x, regionAvail.y });
|
||||||
|
m_Camera->OnResize({ regionAvail.x, regionAvail.y });
|
||||||
|
regionAvailPrev = regionAvail;
|
||||||
|
}
|
||||||
|
|
||||||
if(Light::GraphicsContext::GetGraphicsAPI() == Light::GraphicsAPI::DirectX)
|
if(Light::GraphicsContext::GetGraphicsAPI() == Light::GraphicsAPI::DirectX)
|
||||||
ImGui::Image(m_Framebuffer->GetColorAttachment(), ImVec2(400, 300));
|
ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail);
|
||||||
else
|
else
|
||||||
ImGui::Image(m_Framebuffer->GetColorAttachment(), ImVec2(400, 300), ImVec2(0, 1), ImVec2(1, 0));
|
ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue