From dab4ba2164a893ce8ade9b3a325910d4bc854318 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 8 Jan 2016 14:12:09 +0100 Subject: [PATCH] Pointlights are now using the pointlight component and the Light renderqueue to draw. --- include/Engine/Rendering/LightCullingPass.h | 5 +-- include/Engine/Rendering/RenderQueue.h | 11 +++--- src/Engine/Rendering/LightCullingPass.cpp | 41 +++++++++++++++------ src/Engine/Rendering/RenderQueueFactory.cpp | 28 ++++++++++++++ src/Engine/Rendering/Renderer.cpp | 1 + 5 files changed, 67 insertions(+), 19 deletions(-) diff --git a/include/Engine/Rendering/LightCullingPass.h b/include/Engine/Rendering/LightCullingPass.h index f0ed5d6b..e08aacdf 100644 --- a/include/Engine/Rendering/LightCullingPass.h +++ b/include/Engine/Rendering/LightCullingPass.h @@ -17,6 +17,7 @@ public: void GenerateNewFrustum(); void CullLights(); + void FillLightList(RenderQueueCollection& rq); GLuint FrustumSSBO() const { return m_FrustumSSBO; } GLuint LightSSBO() const { return m_LightSSBO; } @@ -49,8 +50,6 @@ private: }; Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution - void TEMPCreateLights(); - //This should be a component struct PointLight { glm::vec4 Position = glm::vec4(0.f); @@ -60,7 +59,7 @@ private: float Falloff = 0.3f; float Padding = 1337; }; - PointLight m_PointLights[NUM_LIGHTS]; + std::vector m_PointLights; struct LightGrid { float Start; diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 2942c743..44d5e172 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -82,11 +82,12 @@ struct SpriteJob : RenderJob struct PointLightJob : RenderJob { - glm::vec3 Position; - glm::vec3 SpecularColor = glm::vec3(1, 1, 1); - glm::vec3 DiffuseColor = glm::vec3(1, 1, 1); - float Radius = 1.f; - float Intensity = 0.8f; + glm::vec4 Position; + glm::vec4 Color; + float Radius; + float Intensity; + float Falloff; + float padding = 123; void CalculateHash() override { diff --git a/src/Engine/Rendering/LightCullingPass.cpp b/src/Engine/Rendering/LightCullingPass.cpp index 85f27a37..5a3e7609 100644 --- a/src/Engine/Rendering/LightCullingPass.cpp +++ b/src/Engine/Rendering/LightCullingPass.cpp @@ -3,7 +3,6 @@ LightCullingPass::LightCullingPass(IRenderer* renderer) { m_Renderer = renderer; - TEMPCreateLights(); InitializeSSBOs(); InitializeShaderPrograms(); GenerateNewFrustum(); @@ -35,6 +34,14 @@ void LightCullingPass::CullLights() glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO); + if (m_PointLights.size() > 0) { + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(PointLight) * m_PointLights.size(), &(m_PointLights[0]), GL_DYNAMIC_COPY); + } else { + GLfloat zero = 0.f; + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLfloat), &zero , GL_DYNAMIC_COPY); + + } glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); m_LightCullProgram->Bind(); @@ -49,6 +56,25 @@ void LightCullingPass::CullLights() GLERROR("CullLights Error: End"); } +void LightCullingPass::FillLightList(RenderQueueCollection& rq) +{ + m_PointLights.clear(); + for(auto &job : rq.Lights) { + auto pointLightjob = std::dynamic_pointer_cast(job); + if (pointLightjob) { + PointLight p; + p.Color = pointLightjob->Color; + p.Falloff = pointLightjob->Falloff; + p.Intensity = pointLightjob->Intensity; + p.Position = glm::vec4(glm::vec3(pointLightjob->Position), 1.f); + p.Radius = pointLightjob->Radius; + p.Padding = 123.f; + m_PointLights.push_back(p); + continue; + } + } +} + void LightCullingPass::InitializeSSBOs() { glGenBuffers(1, &m_FrustumSSBO); @@ -59,7 +85,9 @@ void LightCullingPass::InitializeSSBOs() glGenBuffers(1, &m_LightSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_PointLights), &m_PointLights, GL_DYNAMIC_COPY); + if(m_PointLights.size() > 0) { + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(PointLight) * m_PointLights.size(), &(m_PointLights[0]), GL_DYNAMIC_COPY); + } glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); GLERROR("m_LightSSBO"); @@ -96,12 +124,3 @@ void LightCullingPass::InitializeShaderPrograms() m_LightCullProgram->Link(); } -void LightCullingPass::TEMPCreateLights() -{ - for (int i = 0; i < NUM_LIGHTS; i++) { - glm::vec3 pos = glm::vec3(cos(i) * i/10.f, 0.5f, sin(i) * i/10.f); - m_PointLights[i].Position = glm::vec4(pos, 1.f); - m_PointLights[i].Color = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand()%255 / 255.f, 1.f); - m_PointLights[i].Radius = glm::length(pos) / 5.f; - } -} diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 8d5bb420..015c6477 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -111,6 +111,34 @@ void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue) void RenderQueueFactory::FillLights(World* world, RenderQueue* renderQueue) { + auto pointLights = world->GetComponents("PointLight"); + if(pointLights == nullptr) { + return; + } + for(auto& pointlightC : *pointLights) { + bool visible = pointlightC["Visible"]; + if(!visible) { + continue; + } + auto transformC = world->GetComponent(pointlightC.EntityID, "Transform"); + if(&transformC == nullptr) { + return; + } + + glm::vec4 color = pointlightC["Color"]; + float radius = (double)pointlightC["Radius"]; + float intensity = (double)pointlightC["Intensity"]; + float falloff = (double)pointlightC["Falloff"]; + + PointLightJob job; + job.Position = transformC["Position"]; + job.Color = color; + job.Radius = radius; + job.Intensity = intensity; + job.Falloff = falloff; + + renderQueue->Add(job); + } } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 752dd8c0..8d3863e2 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -92,6 +92,7 @@ void Renderer::Draw(RenderQueueCollection& rq) { m_PickingPass->Draw(rq); //DrawScreenQuad(m_PickingPass->PickingTexture()); + m_LightCullingPass->FillLightList(rq); m_LightCullingPass->CullLights(); //m_DrawScenePass->Draw(rq);