CSEngine
Loading...
Searching...
No Matches
ForwardRenderGroup.cpp
1#include "ForwardRenderGroup.h"
2#include "../../Util/Render/CameraBase.h"
3#include "../../Util/Render/SMaterial.h"
4#include "../../Util/Render/SShaderGroup.h"
5#include "../../Util/Render/SFrameBuffer.h"
6#include "../../Util/Settings.h"
7#include "../../Component/CameraComponent.h"
8#include "RenderMgr.h"
9#include "../LightMgr.h"
10#include "../EngineCore.h"
11
12using namespace CSE;
13
14
16 m_lightMgr = CORE->GetCore(LightMgr);
17}
18
20
22 const auto& material = object->GetMaterialReference();
23 if (material == nullptr) return;
24
25 short orderLayer = material->GetOrderLayer();
26 const auto& shaders = material->GetShaders();
27 if (shaders == nullptr) return;
28
29 auto& layer = m_rendersLayer[orderLayer][shaders];
30 layer.push_back(object);
31}
32
34 const auto& material = object->GetMaterialReference();
35 if (material == nullptr) return;
36
37 short orderLayer = material->GetOrderLayer();
38 const auto& shaders = material->GetShaders();
39 if (shaders == nullptr) return;
40
41 auto orderLayerIter = m_rendersLayer.find(orderLayer);
42 if (orderLayerIter != m_rendersLayer.end()) {
43 auto& programLayer = orderLayerIter->second;
44 auto handlerPair = programLayer.find(shaders);
45 if (handlerPair != programLayer.end()) {
46 auto& layerVector = handlerPair->second;
47 layerVector.erase(std::remove(layerVector.begin(), layerVector.end(), object),
48 layerVector.end());
49
50 // 렌더링 객체가 제거된 뒤에도 공간이 비어 있는 경우, 그 공간을 제거한다.
51 if (layerVector.empty()) programLayer.erase(handlerPair);
52 }
53 if (programLayer.empty()) m_rendersLayer.erase(orderLayerIter);
54 }
55}
56
57void ForwardRenderGroup::RenderAll(const CameraBase& camera) const {
58 const auto cameraMatrix = camera.GetCameraMatrixStruct();
59 const auto& cameraBuffer = camera.GetFrameBuffer();
60 const auto& frameBuffer = cameraBuffer == nullptr
61 ? m_renderMgr->GetMainBuffer() : cameraBuffer;
62 OrderRenderLayer orderRenderLayer(m_rendersLayer.begin(), m_rendersLayer.end());
63 frameBuffer->AttachFrameBuffer();
64
65 for (const auto& orderLayerPair : orderRenderLayer) {
66 const auto& orderLayer = orderLayerPair.second;
67 ProgramRenderLayer programComp(orderLayer.begin(), orderLayer.end());
68
69 for (const auto& programPair : programComp) {
70 const auto& handler = *programPair.first->GetForwardHandle();
71 const auto& renderComp = programPair.second;
72
73 if (programPair.first == nullptr) continue;
74 if (renderComp.empty()) continue;
75
76 glUseProgram(handler.Program);
77 //Attach Light
78 int layoutBegin = m_lightMgr->AttachLightToShader(&handler);
79 layoutBegin += m_lightMgr->AttachLightMapToShader(&handler, layoutBegin);
80#ifdef CSE_SETTINGS_RENDER_SDFGI_SUPPORT
81 m_renderMgr->BindSdfMapUniforms(handler);
82 layoutBegin += m_renderMgr->BindSdfMapTextures(handler, layoutBegin);
83#endif
84 if (handler.CullFace == 0) {
85 glDisable(GL_CULL_FACE);
86 }else {
87 glEnable(GL_CULL_FACE);
88 glCullFace(handler.CullFace);
89 }
90
91 for (const auto& render : renderComp) {
92 if (render == nullptr) continue;
93 if (!render->isRenderActive) continue;
94
95 const auto& material = render->GetMaterial();
96 int materialLayout = material->AttachElement(layoutBegin);
97 render->SetMatrix(cameraMatrix, &handler);
98 BindSourceBuffer(*frameBuffer, handler, layoutBegin + materialLayout + 1);
99 render->Render(&handler);
100 }
101 }
102 }
103
105 glBindBuffer(GL_ARRAY_BUFFER, 0);
106 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
107}
108
110 m_rendersLayer.clear();
111}
void RenderAll(const CameraBase &camera) const override
~ForwardRenderGroup() override
void RegisterObject(SIRender *object) override
void RemoveObjects(SIRender *object) override
ForwardRenderGroup(const RenderMgr &renderMgr)
int AttachLightMapToShader(const GLProgramHandle *handle, int textureLayout) const
Definition LightMgr.cpp:47
int AttachLightToShader(const GLProgramHandle *handle) const
Definition LightMgr.cpp:15
Class for managing rendering operations.
Definition RenderMgr.h:24
static void BindSourceBuffer(const SFrameBuffer &buffer, const GLProgramHandle &handle, int layout)