CSEngine
Loading...
Searching...
No Matches
RenderMgr.cpp
1#include "RenderMgr.h"
2#include "../LightMgr.h"
3#include "../EngineCore.h"
4#include "../../Util/Render/SFrameBuffer.h"
5#include "../../Util/Render/SEnvironmentMgr.h"
6#include "../../Util/Render/SGBuffer.h"
7#include "../CameraMgr.h"
8#include "../../Component/RenderComponent.h"
9#include "../../Util/Settings.h"
10#include "../../Util/GLProgramHandle.h"
11
12#include "ForwardRenderGroup.h"
13#include "DeferredRenderGroup.h"
14#include "DepthOnlyRenderGroup.h"
15#include "SdfRenderGroup.h"
16
17using namespace CSE;
18
19//TODO: 포스트 프로세싱 테스트용 코드 반드시 제거 요망!
20GLProgramHandle* postHandle = nullptr;
21
22RenderMgr::RenderMgr() = default;
23
24RenderMgr::~RenderMgr() {
26}
27
29 m_cameraMgr = CORE->GetCore(CameraMgr);
30 m_lightMgr = CORE->GetCore(LightMgr);
31
32 m_width = SEnvironmentMgr::GetPointerWidth();
33 m_height = SEnvironmentMgr::GetPointerHeight();
34
35 InitBuffers((int) *m_width, (int) *m_height);
36#ifdef CSE_SETTINGS_RENDER_FORWARD_SUPPORT
37 m_forwardRenderGroup = new ForwardRenderGroup(*this);
38#endif
39#ifdef CSE_SETTINGS_RENDER_DEFERRED_SUPPORT
40 m_deferredRenderGroup = new DeferredRenderGroup(*this);
41#endif
42 m_depthOnlyRenderGroup = new DepthOnlyRenderGroup(*this);
43#ifdef CSE_SETTINGS_RENDER_SDFGI_SUPPORT
44 m_sdfRenderGroup = new SdfRenderGroup(*this);
45#endif
46
47 //TODO: 포스트 프로세싱 테스트용 코드 반드시 제거 요망!
48// postHandle = SResource::Create<GLProgramHandle>("File:Shader/Post/dof.post");
49}
50
52#ifdef CSE_SETTINGS_RENDER_DEFERRED_SUPPORT
53 if (m_deferredRenderGroup != nullptr)
54 static_cast<DeferredRenderGroup*>(m_deferredRenderGroup)->SetViewport();
55#endif
56 ResizeBuffers((int) *m_width, (int) *m_height);
57}
58
59void RenderMgr::Render() const {
60 // 0. Render depth buffer for shadows.
61 RenderShadows();
62
63#ifdef CSE_SETTINGS_RENDER_SDFGI_SUPPORT
64 // 1. Render SDF Map.
65 RenderSdfMap();
66#endif
67
68 // 2. Render active sub cameras.
69 RenderSubCameras();
70
71 // 3. Main Render Buffer
72 RenderMainCamera();
73}
74
75void RenderMgr::RenderShadows() const {
76 const auto& lightObjects = m_lightMgr->GetAll();
77 for (const auto& light: lightObjects) {
78 if (!light->IsShadow()) continue;
79 m_depthOnlyRenderGroup->RenderAll(*light);
80 }
81 m_lightMgr->RefreshShadowCount();
82}
83
84void RenderMgr::RenderSubCameras() const {
85 const auto& cameraObjects = m_cameraMgr->GetAll();
86 const auto& mainCamera = m_cameraMgr->GetCurrentCamera();
87
88 for (const auto& camera: cameraObjects) {
89 if (!camera->GetIsEnable() || camera == mainCamera || camera->GetFrameBuffer() == nullptr) continue;
90 ResetBuffer(*camera);
91 RenderAllGroup(*camera);
92 }
93}
94
95void RenderMgr::RenderMainCamera() const {
96 const auto& mainCamera = m_cameraMgr->GetCurrentCamera();
97 if (mainCamera == nullptr) return;
98
99 ResetBuffer(*mainCamera);
100 RenderAllGroup(*mainCamera);
101
102 //TODO: 포스트 프로세싱 테스트용 코드 반드시 제거 요망!
103 const auto& mainBuffer = GetMainBuffer();
104// mainBuffer->PostFrameBuffer(postHandle, *mainCamera);
105 mainBuffer->AttachFrameBuffer(GL_READ_FRAMEBUFFER);
106 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_deviceBuffer);
107 glBlitFramebuffer(0, 0, *m_width, *m_height, 0, 0, *m_width, *m_height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
108}
109
110void RenderMgr::RenderSdfMap() const {
111 const auto& mainCamera = m_cameraMgr->GetCurrentCamera();
112 if (mainCamera == nullptr) return;
113 m_sdfRenderGroup->RenderAll(*mainCamera);
114}
115
117 RenderContainer::Exterminate();
118}
119
120void RenderMgr::ResetBuffer(const CameraBase& camera) const {
121 auto frameBuffer = camera.GetFrameBuffer();
122 if (frameBuffer == nullptr) {
123 frameBuffer = GetMainBuffer();
124 }
125 frameBuffer->AttachFrameBuffer();
126 camera.RenderBackground();
127}
128
129void RenderMgr::BindSdfMapUniforms(const GLProgramHandle& handle) const {
130 static_cast<SdfRenderGroup*>(m_sdfRenderGroup)->BindShaderUniforms(handle);
131}
132
133int RenderMgr::BindSdfMapTextures(const GLProgramHandle& handle, int textureLayout) const {
134 return static_cast<SdfRenderGroup*>(m_sdfRenderGroup)->BindShaderMap(handle, textureLayout);
135}
136
137void RenderMgr::RenderAllGroup(const CameraBase& camera) const {
138#ifdef CSE_SETTINGS_RENDER_DEFERRED_SUPPORT
139 m_deferredRenderGroup->RenderAll(camera); // Deferred Render
140#endif
141#ifdef CSE_SETTINGS_RENDER_FORWARD_SUPPORT
142 m_forwardRenderGroup->RenderAll(camera); // Forward Render
143#endif
144}
void RefreshShadowCount(int shadowCount=-1) const
Definition LightMgr.cpp:61
void Init() override
Initialization of resources required for rendering.
Definition RenderMgr.cpp:28
void SetViewport()
Modify the framebuffer to fit the modified screen size.
Definition RenderMgr.cpp:51
RenderMgr()
Constructor for RenderMgr.
void Exterminate() override
Destroy all resources used for rendering.
void Render() const override
Rendering all stuffs.
Definition RenderMgr.cpp:59