From 72e1e9231a06f32843aae8eb5b78cd8c0f8dd743 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 18 Aug 2016 16:27:44 +0200 Subject: [PATCH] Add an update method to the ProjectionComponent that takes care of Shader rebuildin --- data/scene/rosetta.scene | 2 + .../rendering/renderablemodelprojection.cpp | 8 +++- .../rendering/renderablemodelprojection.h | 2 +- .../rendering/renderableplanetprojection.cpp | 2 + .../newhorizons/util/projectioncomponent.cpp | 47 +++++++++++-------- .../newhorizons/util/projectioncomponent.h | 2 + 6 files changed, 40 insertions(+), 23 deletions(-) diff --git a/data/scene/rosetta.scene b/data/scene/rosetta.scene index 39dc7b087b..54c810af07 100644 --- a/data/scene/rosetta.scene +++ b/data/scene/rosetta.scene @@ -31,6 +31,8 @@ function postInitialization() openspace.setPropertyValue("MilkyWay.renderable.transparency", 0.55) openspace.setPropertyValue("MilkyWay.renderable.segments", 50) + openspace.setPropertyValue('67P.renderable.performShading', false); + openspace.printInfo("Done setting default values") end diff --git a/modules/newhorizons/rendering/renderablemodelprojection.cpp b/modules/newhorizons/rendering/renderablemodelprojection.cpp index 477e2b62ca..aff65ca58b 100644 --- a/modules/newhorizons/rendering/renderablemodelprojection.cpp +++ b/modules/newhorizons/rendering/renderablemodelprojection.cpp @@ -199,11 +199,15 @@ void RenderableModelProjection::render(const RenderData& data) { } void RenderableModelProjection::update(const UpdateData& data) { - if (_programObject->isDirty()) + if (_programObject->isDirty()) { _programObject->rebuildFromFile(); + } - if (_fboProgramObject->isDirty()) + if (_fboProgramObject->isDirty()) { _fboProgramObject->rebuildFromFile(); + } + + _projectionComponent.update(); _time = data.time; diff --git a/modules/newhorizons/rendering/renderablemodelprojection.h b/modules/newhorizons/rendering/renderablemodelprojection.h index 644af7b905..9f9d0227ab 100644 --- a/modules/newhorizons/rendering/renderablemodelprojection.h +++ b/modules/newhorizons/rendering/renderablemodelprojection.h @@ -55,7 +55,7 @@ public: bool isReady() const override; void render(const RenderData& data) override; - void update(const UpdateData& data) override; + virtual void update(const UpdateData& data) final override; ghoul::opengl::Texture& baseTexture() const; diff --git a/modules/newhorizons/rendering/renderableplanetprojection.cpp b/modules/newhorizons/rendering/renderableplanetprojection.cpp index 51523d6d9b..35aac4f50d 100644 --- a/modules/newhorizons/rendering/renderableplanetprojection.cpp +++ b/modules/newhorizons/rendering/renderableplanetprojection.cpp @@ -368,6 +368,8 @@ void RenderablePlanetProjection::update(const UpdateData& data) { _programObject->rebuildFromFile(); } + _projectionComponent.update(); + _time = Time::ref().currentTime(); _capture = false; diff --git a/modules/newhorizons/util/projectioncomponent.cpp b/modules/newhorizons/util/projectioncomponent.cpp index 7d99849c7c..ecdc65fbd8 100644 --- a/modules/newhorizons/util/projectioncomponent.cpp +++ b/modules/newhorizons/util/projectioncomponent.cpp @@ -186,9 +186,9 @@ bool ProjectionComponent::initializeProjectionSettings(const Dictionary& diction _potentialTargets.resize(potentialTargets.size()); for (int i = 0; i < potentialTargets.size(); ++i) { -std::string target; -potentialTargets.getValue(std::to_string(i + 1), target); -_potentialTargets[i] = target; + std::string target; + potentialTargets.getValue(std::to_string(i + 1), target); + _potentialTargets[i] = target; } } @@ -267,13 +267,6 @@ bool ProjectionComponent::initializeParser(const ghoul::Dictionary& dictionary) } void ProjectionComponent::imageProjectBegin() { - if (_needsTextureMapDilation) { - if (_dilation.program->isDirty()) { - _dilation.program->rebuildFromFile(); - } - } - - // keep handle to the current bound FBO glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_defaultFBO); @@ -321,6 +314,14 @@ void ProjectionComponent::imageProjectEnd() { glViewport(_viewport[0], _viewport[1], _viewport[2], _viewport[3]); } +void ProjectionComponent::update() { + if (_needsTextureMapDilation) { + if (_dilation.program->isDirty()) { + _dilation.program->rebuildFromFile(); + } + } +} + bool ProjectionComponent::auxiliaryRendertarget() { bool completeSuccess = true; @@ -402,18 +403,24 @@ glm::mat4 ProjectionComponent::computeProjectorMatrix(const glm::vec3 loc, glm:: glm::vec3 e3 = glm::normalize(boreSight); glm::vec3 e1 = glm::normalize(glm::cross(uptmp, e3)); glm::vec3 e2 = glm::normalize(glm::cross(e3, e1)); - glm::mat4 projViewMatrix = glm::mat4(e1.x, e2.x, e3.x, 0.f, - e1.y, e2.y, e3.y, 0.f, - e1.z, e2.z, e3.z, 0.f, - -glm::dot(e1, loc), -glm::dot(e2, loc), -glm::dot(e3, loc), 1.f); + glm::mat4 projViewMatrix = glm::mat4( + e1.x, e2.x, e3.x, 0.f, + e1.y, e2.y, e3.y, 0.f, + e1.z, e2.z, e3.z, 0.f, + -glm::dot(e1, loc), -glm::dot(e2, loc), -glm::dot(e3, loc), 1.f + ); // create perspective projection matrix - glm::mat4 projProjectionMatrix = glm::perspective(glm::radians(fieldOfViewY), aspectRatio, nearPlane, farPlane); + glm::mat4 projProjectionMatrix = glm::perspective( + glm::radians(fieldOfViewY), aspectRatio, nearPlane, farPlane + ); // bias matrix - glm::mat4 projNormalizationMatrix = glm::mat4(0.5f, 0, 0, 0, - 0, 0.5f, 0, 0, - 0, 0, 0.5f, 0, - 0.5f, 0.5f, 0.5f, 1); - return projNormalizationMatrix*projProjectionMatrix*projViewMatrix; + glm::mat4 projNormalizationMatrix = glm::mat4( + 0.5f, 0.f, 0.f, 0.f, + 0.f, 0.5f, 0.f, 0.f, + 0.f, 0.f, 0.5f, 0.f, + 0.5f, 0.5f, 0.5f, 1.f + ); + return projNormalizationMatrix * projProjectionMatrix * projViewMatrix; } bool ProjectionComponent::doesPerformProjection() const { diff --git a/modules/newhorizons/util/projectioncomponent.h b/modules/newhorizons/util/projectioncomponent.h index 13731d9c24..3386b63a1d 100644 --- a/modules/newhorizons/util/projectioncomponent.h +++ b/modules/newhorizons/util/projectioncomponent.h @@ -57,6 +57,8 @@ public: void imageProjectBegin(); void imageProjectEnd(); + void update(); + bool generateProjectionLayerTexture(); bool auxiliaryRendertarget();