Skip to content

Commit 341332b

Browse files
Merge pull request #17 from adriengivry/feature/framebuffer_wrapping
Framebuffer wrapping implemented
2 parents 0559e10 + c5140b4 commit 341332b

6 files changed

Lines changed: 166 additions & 36 deletions

File tree

Sources/Overload/OvEditor/include/OvEditor/Panels/AView.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <OvUI/Panels/PanelWindow.h>
1111
#include <OvUI/Widgets/Visual/Image.h>
1212
#include <OvRendering/Buffers/UniformBuffer.h>
13+
#include <OvRendering/Buffers/Framebuffer.h>
1314
#include <OvRendering/LowRenderer/Camera.h>
1415

1516
namespace OvEditor::Core { class EditorRenderer; }
@@ -35,11 +36,6 @@ namespace OvEditor::Panels
3536
const OvUI::Settings::PanelWindowSettings& p_windowSettings
3637
);
3738

38-
/**
39-
* Destructor
40-
*/
41-
~AView();
42-
4339
/**
4440
* Update the view
4541
* @param p_deltaTime
@@ -117,8 +113,6 @@ namespace OvEditor::Panels
117113
OvMaths::FVector3 m_gridColor = OvMaths::FVector3::One;
118114

119115
private:
120-
uint32_t m_fbo;
121-
uint32_t m_renderTexture;
122-
uint32_t m_depthStencilBuffer;
116+
OvRendering::Buffers::Framebuffer m_fbo;
123117
};
124118
}

Sources/Overload/OvEditor/src/OvEditor/Panels/AView.cpp

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,11 @@ OvEditor::Panels::AView::AView
1616
const OvUI::Settings::PanelWindowSettings& p_windowSettings
1717
) : PanelWindow(p_title, p_opened, p_windowSettings), m_editorRenderer(EDITOR_RENDERER())
1818
{
19-
glGenFramebuffers(1, &m_fbo);
20-
glGenTextures(1, &m_renderTexture);
21-
glGenRenderbuffers(1, &m_depthStencilBuffer);
22-
2319
m_cameraPosition = { -10.0f, 4.0f, 10.0f };
2420
m_camera.SetPitch(-10.0f);
2521
m_camera.SetYaw(-45.f);
2622

27-
m_image = &CreateWidget<OvUI::Widgets::Visual::Image>(m_renderTexture, OvMaths::FVector2{ 0.f, 0.f });
28-
}
29-
30-
OvEditor::Panels::AView::~AView()
31-
{
32-
glDeleteBuffers(1, &m_fbo);
33-
glDeleteTextures(1, &m_renderTexture);
34-
glGenRenderbuffers(1, &m_depthStencilBuffer);
23+
m_image = &CreateWidget<OvUI::Widgets::Visual::Image>(m_fbo.GetTextureID(), OvMaths::FVector2{ 0.f, 0.f });
3524
}
3625

3726
void OvEditor::Panels::AView::Update(float p_deltaTime)
@@ -42,20 +31,7 @@ void OvEditor::Panels::AView::Update(float p_deltaTime)
4231

4332
m_image->size = OvMaths::FVector2(static_cast<float>(winWidth), static_cast<float>(winHeight));
4433

45-
/* Setup texture */
46-
glBindTexture(GL_TEXTURE_2D, m_renderTexture);
47-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, winWidth, winHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
48-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
49-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
50-
51-
/* Setup depth-stencil buffer (24 + 8 bits) */
52-
glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer);
53-
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, winWidth, winHeight);
54-
55-
/* Setup frame buffer */
56-
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
57-
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
58-
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_renderTexture, 0);
34+
m_fbo.Resize(winWidth, winHeight);
5935

6036
Unbind();
6137
}
@@ -66,12 +42,12 @@ void OvEditor::Panels::AView::Bind()
6642

6743
glViewport(0, 0, winWidth, winHeight);
6844

69-
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
45+
m_fbo.Bind();
7046
}
7147

7248
void OvEditor::Panels::AView::Unbind()
7349
{
74-
glBindFramebuffer(GL_FRAMEBUFFER, 0);
50+
m_fbo.Unbind();
7551
}
7652

7753
void OvEditor::Panels::AView::_Draw_Impl()

Sources/Overload/OvRendering/OvRendering.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ xcopy "$(SolutionDir)..\..\Dependencies\assimp\bin\*.dll" "$(SolutionDir)..\..\B
129129
<ItemGroup>
130130
<ClInclude Include="include\OvRendering\API\Export.h" />
131131
<ClInclude Include="include\OvRendering\Buffers\EAccessSpecifier.h" />
132+
<ClInclude Include="include\OvRendering\Buffers\Framebuffer.h" />
132133
<ClInclude Include="include\OvRendering\Buffers\IndexBuffer.h" />
133134
<ClInclude Include="include\OvRendering\Buffers\ShaderStorageBuffer.h" />
134135
<ClInclude Include="include\OvRendering\Buffers\UniformBuffer.h" />
@@ -163,6 +164,7 @@ xcopy "$(SolutionDir)..\..\Dependencies\assimp\bin\*.dll" "$(SolutionDir)..\..\B
163164
<ClInclude Include="include\OvRendering\Settings\ETextureFilteringMode.h" />
164165
</ItemGroup>
165166
<ItemGroup>
167+
<ClCompile Include="src\OvRendering\Buffers\Framebuffer.cpp" />
166168
<ClCompile Include="src\OvRendering\Core\ShapeDrawer.cpp" />
167169
<ClCompile Include="src\OvRendering\Buffers\IndexBuffer.cpp" />
168170
<ClCompile Include="src\OvRendering\Buffers\ShaderStorageBuffer.cpp" />

Sources/Overload/OvRendering/OvRendering.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@
117117
<ClInclude Include="include\OvRendering\Core\ShapeDrawer.h">
118118
<Filter>Header Files</Filter>
119119
</ClInclude>
120+
<ClInclude Include="include\OvRendering\Buffers\Framebuffer.h">
121+
<Filter>Header Files</Filter>
122+
</ClInclude>
120123
</ItemGroup>
121124
<ItemGroup>
122125
<ClCompile Include="src\OvRendering\Context\Driver.cpp">
@@ -170,6 +173,9 @@
170173
<ClCompile Include="src\OvRendering\Core\ShapeDrawer.cpp">
171174
<Filter>Source Files</Filter>
172175
</ClCompile>
176+
<ClCompile Include="src\OvRendering\Buffers\Framebuffer.cpp">
177+
<Filter>Source Files</Filter>
178+
</ClCompile>
173179
</ItemGroup>
174180
<ItemGroup>
175181
<None Include="include\OvRendering\Buffers\UniformBuffer.inl">
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* @project: Overload
3+
* @author: Overload Tech.
4+
* @restrictions: This software may not be resold, redistributed or otherwise conveyed to a third party.
5+
*/
6+
7+
#pragma once
8+
9+
#include <vector>
10+
11+
#include "OvRendering/Context/Driver.h"
12+
13+
namespace OvRendering::Buffers
14+
{
15+
/**
16+
* Wraps OpenGL EBO
17+
*/
18+
class API_OVRENDERING Framebuffer
19+
{
20+
public:
21+
/**
22+
* Create the framebuffer
23+
* @param p_width
24+
* @param p_height
25+
*/
26+
Framebuffer(uint16_t p_width = 0, uint16_t p_height = 0);
27+
28+
/**
29+
* Destructor
30+
*/
31+
~Framebuffer();
32+
33+
/**
34+
* Bind the framebuffer
35+
*/
36+
void Bind();
37+
38+
/**
39+
* Unbind the framebuffer
40+
*/
41+
void Unbind();
42+
43+
/**
44+
* Defines a new size for the framebuffer
45+
* @param p_width
46+
* @param p_height
47+
*/
48+
void Resize(uint16_t p_width, uint16_t p_height);
49+
50+
/**
51+
* Returns the ID of the OpenGL framebuffer
52+
*/
53+
uint32_t GetID();
54+
55+
/**
56+
* Returns the ID of the OpenGL render texture
57+
*/
58+
uint32_t GetTextureID();
59+
60+
/**
61+
* Returns the ID of the OpenGL render buffer
62+
*/
63+
uint32_t GetRenderBufferID();
64+
65+
private:
66+
uint32_t m_bufferID = 0;
67+
uint32_t m_renderTexture = 0;
68+
uint32_t m_depthStencilBuffer = 0;
69+
};
70+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* @project: Overload
3+
* @author: Overload Tech.
4+
* @restrictions: This software may not be resold, redistributed or otherwise conveyed to a third party.
5+
*/
6+
7+
#include <GL/glew.h>
8+
9+
#include "OvRendering/Buffers/Framebuffer.h"
10+
11+
OvRendering::Buffers::Framebuffer::Framebuffer(uint16_t p_width, uint16_t p_height)
12+
{
13+
/* Generate OpenGL objects */
14+
glGenFramebuffers(1, &m_bufferID);
15+
glGenTextures(1, &m_renderTexture);
16+
glGenRenderbuffers(1, &m_depthStencilBuffer);
17+
18+
/* Setup texture */
19+
glBindTexture(GL_TEXTURE_2D, m_renderTexture);
20+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
21+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
22+
glBindTexture(GL_TEXTURE_2D, 0);
23+
24+
/* Setup framebuffer */
25+
Bind();
26+
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_renderTexture, 0);
27+
Unbind();
28+
29+
Resize(p_width, p_height);
30+
}
31+
32+
OvRendering::Buffers::Framebuffer::~Framebuffer()
33+
{
34+
/* Destroy OpenGL objects */
35+
glDeleteBuffers(1, &m_bufferID);
36+
glDeleteTextures(1, &m_renderTexture);
37+
glGenRenderbuffers(1, &m_depthStencilBuffer);
38+
}
39+
40+
void OvRendering::Buffers::Framebuffer::Bind()
41+
{
42+
glBindFramebuffer(GL_FRAMEBUFFER, m_bufferID);
43+
}
44+
45+
void OvRendering::Buffers::Framebuffer::Unbind()
46+
{
47+
glBindFramebuffer(GL_FRAMEBUFFER, 0);
48+
}
49+
50+
void OvRendering::Buffers::Framebuffer::Resize(uint16_t p_width, uint16_t p_height)
51+
{
52+
/* Resize texture */
53+
glBindTexture(GL_TEXTURE_2D, m_renderTexture);
54+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, p_width, p_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
55+
glBindTexture(GL_TEXTURE_2D, 0);
56+
57+
/* Setup depth-stencil buffer (24 + 8 bits) */
58+
glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer);
59+
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, p_width, p_height);
60+
glBindRenderbuffer(GL_RENDERBUFFER, 0);
61+
62+
/* Attach depth and stencil buffer to the framebuffer */
63+
Bind();
64+
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
65+
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
66+
Unbind();
67+
}
68+
69+
uint32_t OvRendering::Buffers::Framebuffer::GetID()
70+
{
71+
return m_bufferID;
72+
}
73+
74+
uint32_t OvRendering::Buffers::Framebuffer::GetTextureID()
75+
{
76+
return m_renderTexture;
77+
}
78+
79+
uint32_t OvRendering::Buffers::Framebuffer::GetRenderBufferID()
80+
{
81+
return m_depthStencilBuffer;
82+
}

0 commit comments

Comments
 (0)