CSEngine
Loading...
Searching...
No Matches
SGBuffer.cpp
1#include "SGBuffer.h"
2#include "STexture.h"
3#include "SMaterial.h"
4#include "SFrameBuffer.h"
5#include "ShaderUtil.h"
6#include "../GLProgramHandle.h"
7#include "../../Manager/EngineCore.h"
8#include "RenderInterfaces.h"
9
10using namespace CSE;
11
12SGBuffer::SGBuffer() {
13 m_resMgr = CORE->GetCore(ResMgr);
14}
15
16SGBuffer::~SGBuffer() = default;
17
18void SGBuffer::GenerateGBuffer(int width, int height) {
19 if(m_geometryFrameBuffer != nullptr) return;
20
21 m_width = width;
22 m_height = height;
23
24 m_geometryFrameBuffer = new SFrameBuffer();
25 m_geometryFrameBuffer->SetName(m_geometryFrameBuffer->GetName() + " - GBuffer");
26 m_geometryFrameBuffer->GenerateFramebuffer(SFrameBuffer::PLANE, width, height);
27
28 m_firstTexture = m_geometryFrameBuffer->GenerateTexturebuffer(SFrameBuffer::RENDER, GL_RGBA);
29 m_secondTexture = m_geometryFrameBuffer->GenerateTexturebuffer(SFrameBuffer::RENDER, GL_RGBA);
30 m_depthTexture = m_geometryFrameBuffer->GenerateTexturebuffer(SFrameBuffer::DEPTH, GL_DEPTH_COMPONENT);
31 m_geometryFrameBuffer->RasterizeFramebuffer();
32
33// if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
34// SafeLog::Log("Framebuffer not complete!");
35}
36
37void SGBuffer::AttachGeometryFrameBuffer() const {
38 if(m_geometryFrameBuffer == nullptr) return;
39 m_geometryFrameBuffer->AttachFrameBuffer();
40}
41
42void SGBuffer::AttachGeometryFrameBuffer(int target) const {
43 if(m_geometryFrameBuffer == nullptr) return;
44
45 m_geometryFrameBuffer->AttachFrameBuffer(target);
46}
47
48void SGBuffer::ResizeGBuffer(int width, int height) {
49 ReleaseGBuffer();
50 GenerateGBuffer(width, height);
51}
52
53void SGBuffer::ReleaseGBuffer() {
54 if(m_geometryFrameBuffer != nullptr) {
55 m_resMgr->Remove(m_geometryFrameBuffer);
56 m_geometryFrameBuffer = nullptr;
57 }
58}
59
60void SGBuffer::BindLightPass(GLProgramHandle* lightPassHandle) {
61 if(lightPassHandle == nullptr || m_lightPassHandle != nullptr) return;
62
63 m_lightPassHandle = lightPassHandle;
64 m_firstTextureId = m_lightPassHandle->UniformLocation("geo.normal.mr")->id;
65 m_secondTextureId = m_lightPassHandle->UniformLocation("geo.albedo.a")->id;
66 m_depthTextureId = m_lightPassHandle->UniformLocation("geo.depth")->id;
67}
68
69void SGBuffer::AttachLightPass() const {
70 glUseProgram(m_lightPassHandle->Program);
71}
72
73void SGBuffer::AttachLightPassTexture(int textureLayout) const {
74 m_firstTexture->Bind(m_firstTextureId, textureLayout);
75 m_secondTexture->Bind(m_secondTextureId, textureLayout + 1);
76 m_depthTexture->Bind(m_depthTextureId, textureLayout + 2);
77}
78
79void SGBuffer::RenderLightPass() const {
80 ShaderUtil::BindAttributeToPlane();
81}
82
83const std::vector<SIRender*>& SGBuffer::GetRendersLayer() const {
84 return m_rendersLayer;
85}
86
87void SGBuffer::PushBackToLayer(SIRender* render) {
88 m_rendersLayer.push_back(render);
89}
90
91void SGBuffer::RemoveToLayer(SIRender* render) {
92 m_rendersLayer.erase(std::remove(m_rendersLayer.begin(), m_rendersLayer.end(), render), m_rendersLayer.end());
93}
94
95int SGBuffer::GetWidth() const {
96 return m_width;
97}
98
99int SGBuffer::GetHeight() const {
100 return m_height;
101}
102
103GLProgramHandle* SGBuffer::GetLightPassHandle() const {
104 return m_lightPassHandle;
105}
STexture * GenerateTexturebuffer(BufferType type, int channel, int level=0)
void GenerateFramebuffer(BufferDimension dimension, int width, int height)