CSEngine
Loading...
Searching...
No Matches
SdfRenderGroup.cpp
1#include "SdfRenderGroup.h"
2#include "../../OGLDef.h"
3#include "../../Util/Render/STexture.h"
4#include "../../Util/GLProgramHandle.h"
5#include "../../Util/Render/SFrameBuffer.h"
6#include "../../Util/Render/ShaderUtil.h"
7#include "../../Component/CameraComponent.h"
8#include "../LightMgr.h"
9#include "../EngineCore.h"
10
11using namespace CSE;
12
13SdfRenderGroup::SdfRenderGroup(const RenderMgr& renderMgr) : SRenderGroup(renderMgr) {
14 m_envSize = 32;
15 m_nodeSize = vec3{ 10, 4, 4 };
16 m_nodeSpace = 0.5;
17
18 m_sdfMapBuffer = new SFrameBuffer();
19 m_sdfMapBuffer->SetName("SDF Render Group Texture");
20 float wh = m_nodeSize.x * m_nodeSize.y * m_nodeSize.z;
21 float wh_sqrt = sqrtf(wh);
22 m_cellSize = vec2{ ceilf(wh_sqrt), floorf(wh_sqrt) };
23 m_mapSize = vec2{ m_envSize * m_cellSize.x, m_envSize * m_cellSize.y };
24// m_mapSize = ivec2{ 256, 256 };
25 m_sdfMapBuffer->GenerateFramebuffer(SFrameBuffer::PLANE, m_mapSize.x, m_mapSize.y);
26
27 m_mapTexture = m_sdfMapBuffer->GenerateTexturebuffer(SFrameBuffer::RENDER, GL_RGBA);
28 m_sdfMapBuffer->GenerateRenderbuffer(SFrameBuffer::DEPTH, GL_DEPTH_COMPONENT);
29 m_sdfMapBuffer->RasterizeFramebuffer();
30
31 m_mapTexture->SetAbsoluteID("sdfmap.textureFakeCubeMap");
32 std::string hash = "CSEENV0000000005";
33 m_mapTexture->SetHash(hash);
34 m_mapTexture->GenerateMipmap();
35
36 // Codes for the SDF test
37 m_testTexture = SResource::Create<STexture>("File:test.png");
38 m_testTexture->GenerateMipmap();
39 m_sdfHandle = SResource::Create<GLProgramHandle>("File:Shader/SDF/sdfmap.post");
40 {
41 const auto& e = m_sdfHandle->UniformLocation("sdf.tex");
42 if (e != nullptr) m_testTextureId = m_sdfHandle->UniformLocation("sdf.tex")->id;
43 }
44 m_frameCount = 0;
45
46 m_lightMgr = CORE->GetCore(LightMgr);
47}
48
49SdfRenderGroup::~SdfRenderGroup() = default;
50
51void SdfRenderGroup::RegisterObject(SIRender* object) {
52}
53
54void SdfRenderGroup::RemoveObjects(SIRender* object) {
55}
56
57#include "../../Util/CaptureDef.h"
58#include "../../Util/AssetsDef.h"
59
60void SdfRenderGroup::RenderAll(const CameraBase& camera) const {
61 const auto& uniforms = m_sdfHandle->Uniforms;
62 const auto& cameraStruct = camera.GetCameraMatrixStruct();
63
64 m_sdfMapBuffer->AttachFrameBuffer();
65// glClear(GL_COLOR_BUFFER_BIT);
66 glViewport(0, 0, (int)m_mapSize.x, (int)m_mapSize.y);
67 glUseProgram(m_sdfHandle->Program);
68 m_testTexture->Bind(m_testTextureId, 0);
69 int layoutBegin = m_lightMgr->AttachLightToShader(m_sdfHandle);
70 glDisable(GL_CULL_FACE);
71 ShaderUtil::BindCameraToShader(*m_sdfHandle, cameraStruct.camera, cameraStruct.cameraPosition,
72 cameraStruct.projection, mat4::Identity());
73 glUniform2fv(uniforms.SourceBufferSize, 1, m_mapSize.Pointer());
74 BindShaderUniforms(*m_sdfHandle);
75
76 ShaderUtil::BindAttributeToPlane();
77 ++m_frameCount;
78 m_frameCount %= 100;
79
80// std::string save_str = CSE::AssetsPath() + "testmap" + ".png";
81// saveScreenshot(save_str.c_str());
82}
83
84void SdfRenderGroup::Exterminate() {
85}
86
87void SdfRenderGroup::BindShaderUniforms(const GLProgramHandle& handle) const {
88 const auto& uniforms = handle.Uniforms;
89
90 if(uniforms.SdfEnvSize != HANDLE_NULL)
91 glUniform1i(uniforms.SdfEnvSize, m_envSize);
92 if(uniforms.SdfCellSize != HANDLE_NULL)
93 glUniform2fv(uniforms.SdfCellSize, 1, m_cellSize.Pointer());
94 if(uniforms.SdfNodeSize != HANDLE_NULL)
95 glUniform3fv(uniforms.SdfNodeSize, 1, m_nodeSize.Pointer());
96 if(uniforms.SdfNodeSpace != HANDLE_NULL)
97 glUniform1f(uniforms.SdfNodeSpace, m_nodeSpace);
98 if(uniforms.SdfFrameCount != HANDLE_NULL)
99 glUniform1i(uniforms.SdfFrameCount, m_frameCount);
100}
101
102int SdfRenderGroup::BindShaderMap(const GLProgramHandle& handle, int textureLayout) const {
103 int steps = 0;
104 if(handle.Uniforms.SdfMap != HANDLE_NULL) {
105 m_mapTexture->Bind(handle.Uniforms.SdfMap, textureLayout);
106 ++steps;
107 }
108 return steps;
109}
int AttachLightToShader(const GLProgramHandle *handle) const
Definition LightMgr.cpp:15
Class for managing rendering operations.
Definition RenderMgr.h:24
static void BindCameraToShader(const GLProgramHandle &handle, const mat4 &camera, const vec3 &cameraPosition, const mat4 &projection, const mat4 &transform)
Binds the camera data to the shader.