From fad38c0bfbf8b4f4ce53a3305ed502963774ff88 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 14 Jan 2016 15:16:05 -0800 Subject: [PATCH] Add uniform buffer to LightStage --- libraries/render-utils/src/LightStage.cpp | 19 ++++++++++++++++--- libraries/render-utils/src/LightStage.h | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/libraries/render-utils/src/LightStage.cpp b/libraries/render-utils/src/LightStage.cpp index f6c2e14f2b..2217de6f28 100644 --- a/libraries/render-utils/src/LightStage.cpp +++ b/libraries/render-utils/src/LightStage.cpp @@ -16,6 +16,8 @@ LightStage::Shadow::Shadow(model::LightPointer light) : _light{ light}, _frustum{ std::make_shared() } { framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::createShadowmap(MAP_SIZE)); map = framebuffer->getDepthStencilBuffer(); + Schema schema{glm::mat4(), glm::mat4(), 0, MAP_SIZE}; + _schemaBuffer = std::make_shared(sizeof(Schema), (const gpu::Byte*) &schema); } void LightStage::Shadow::setKeylightFrustum(ViewFrustum* viewFrustum, float nearDepth, float farDepth) { @@ -36,8 +38,8 @@ void LightStage::Shadow::setKeylightFrustum(ViewFrustum* viewFrustum, float near // Position the keylight frustum _frustum->setPosition(viewFrustum->getPosition() - (nearDepth + farDepth)*direction); - _view = _frustum->getView(); - const Transform viewInverse{ _view.getInverseMatrix() }; + const Transform view{ _frustum->getView()}; + const Transform viewInverse{ view.getInverseMatrix() }; viewFrustum->calculate(); auto nearCorners = viewFrustum->getCorners(nearDepth); @@ -67,7 +69,18 @@ void LightStage::Shadow::setKeylightFrustum(ViewFrustum* viewFrustum, float near glm::mat4 ortho = glm::ortho(min.x, max.x, min.y, max.y, -max.z, -min.z); _frustum->setProjection(ortho); - _projection = ortho; + + // Update the buffer + _schemaBuffer.edit().projection = ortho; + _schemaBuffer.edit().view = view.getMatrix(); +} + +const glm::mat4& LightStage::Shadow::getView() const { + return _frustum->getView(); +} + +const glm::mat4& LightStage::Shadow::getProjection() const { + return _frustum->getProjection(); } const LightStage::LightPointer LightStage::addLight(model::LightPointer light) { diff --git a/libraries/render-utils/src/LightStage.h b/libraries/render-utils/src/LightStage.h index 3d59de6164..10c8227ff3 100644 --- a/libraries/render-utils/src/LightStage.h +++ b/libraries/render-utils/src/LightStage.h @@ -23,6 +23,7 @@ class LightStage { public: class Shadow { public: + using UniformBufferView = gpu::BufferView; const int MAP_SIZE = 2048; Shadow(model::LightPointer light); @@ -30,16 +31,27 @@ public: void setKeylightFrustum(ViewFrustum* viewFrustum, float nearDepth, float farDepth); const std::shared_ptr getFrustum() const { return _frustum; } - const glm::mat4& getProjection() const { return _projection; } - const Transform& getView() const { return _view; } + + const glm::mat4& getView() const; + const glm::mat4& getProjection() const; + + const UniformBufferView& getBuffer() const { return _schemaBuffer; } gpu::FramebufferPointer framebuffer; gpu::TexturePointer map; protected: model::LightPointer _light; std::shared_ptr _frustum; - glm::mat4 _projection; - Transform _view; + + class Schema { + public: + glm::mat4 projection; + glm::mat4 view; + + glm::float32 bias; + glm::float32 scale; + }; + UniformBufferView _schemaBuffer = nullptr; }; using ShadowPointer = std::shared_ptr;