From d77ba76d33f2278d9b96a6ba206019b840ba5080 Mon Sep 17 00:00:00 2001 From: Sebastian Piwell Date: Fri, 18 Mar 2016 11:11:42 -0400 Subject: [PATCH 1/2] Crop framebuffers --- .../base/rendering/screenspaceframebuffer.cpp | 28 +++++++++++++++++-- .../base/rendering/screenspaceframebuffer.h | 6 ++++ src/rendering/renderengine.cpp | 7 +++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/modules/base/rendering/screenspaceframebuffer.cpp b/modules/base/rendering/screenspaceframebuffer.cpp index 4827b2f719..a6ccc5fa2e 100644 --- a/modules/base/rendering/screenspaceframebuffer.cpp +++ b/modules/base/rendering/screenspaceframebuffer.cpp @@ -34,11 +34,17 @@ namespace openspace { ScreenSpaceFramebuffer::ScreenSpaceFramebuffer() :ScreenSpaceRenderable() + ,_size("size", "Size", glm::vec4(0, 0, 1020,720), glm::vec4(0), glm::vec4(2000)) ,_framebuffer(nullptr) { _id = id(); setName("ScreenSpaceFramebuffer" + std::to_string(_id)); registerProperties(); + glm::vec2 resolution = OsEng.windowWrapper().currentWindowResolution(); + + addProperty(_size); + OsEng.gui()._property.registerProperty(&_size); + _size.set(glm::vec4(0, 0, resolution.x,resolution.y)); } ScreenSpaceFramebuffer::~ScreenSpaceFramebuffer(){} @@ -76,12 +82,20 @@ bool ScreenSpaceFramebuffer::deinitialize(){ _framebuffer->detachAll(); + removeAllRenderFunctions(); + return true; } void ScreenSpaceFramebuffer::render(){ + glm::vec2 resolution = OsEng.windowWrapper().currentWindowResolution(); + glm::vec4 size = _size.value(); + + float xratio = _originalViewportSize.x / (size.z-size.x); + float yratio = _originalViewportSize.y / (size.w-size.y);; + if(!_renderFunctions.empty()){ - glViewport (0, 0, _originalViewportSize.x, _originalViewportSize.y); + glViewport (-size.x*xratio, -size.y*yratio, _originalViewportSize.x*xratio, _originalViewportSize.y*yratio); GLint defaultFBO = _framebuffer->getActiveObject(); _framebuffer->activate(); @@ -96,13 +110,13 @@ void ScreenSpaceFramebuffer::render(){ _framebuffer->deactivate(); glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); - glm::vec2 resolution = OsEng.windowWrapper().currentWindowResolution(); + glViewport (0, 0, resolution.x, resolution.y); glm::mat4 rotation = rotationMatrix(); glm::mat4 translation = translationMatrix(); glm::mat4 scale = scaleMatrix(); - scale = glm::scale(scale, glm::vec3(1.0f, -1.0f, 1.0f)); + scale = glm::scale(scale, glm::vec3((1.0/xratio), -(1.0/yratio), 1.0f)); glm::mat4 modelTransform = rotation*translation*scale; draw(modelTransform); } @@ -143,7 +157,15 @@ void ScreenSpaceFramebuffer::createFragmentbuffer(){ // glDrawBuffers(1, DrawBuffers); } +void ScreenSpaceFramebuffer::setSize(glm::vec4 size){ + _size.set(size); +} + void ScreenSpaceFramebuffer::addRenderFunction(std::shared_ptr> renderFunction){ _renderFunctions.push_back(renderFunction); } + +void ScreenSpaceFramebuffer::removeAllRenderFunctions(){ + _renderFunctions.clear(); +} } //namespace openspace \ No newline at end of file diff --git a/modules/base/rendering/screenspaceframebuffer.h b/modules/base/rendering/screenspaceframebuffer.h index 6d033e334b..c79cccde32 100644 --- a/modules/base/rendering/screenspaceframebuffer.h +++ b/modules/base/rendering/screenspaceframebuffer.h @@ -41,15 +41,21 @@ public: void render() override; void update() override; bool isReady() const override; + + void setSize(glm::vec4); void addRenderFunction(std::shared_ptr> renderFunction); + void removeAllRenderFunctions(); private: void createFragmentbuffer(); static int id(); std::unique_ptr _framebuffer; + int _id; std::vector>> _renderFunctions; + properties::Vec4Property _size; + }; } //namespace openspace diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 9a8889f085..e344311a88 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -208,14 +208,17 @@ bool RenderEngine::initialize() { ghoul::io::TextureReader::ref().addReader(std::make_shared()); //For testing screenspacerenderables - ssr = std::make_shared("${OPENSPACE_DATA}/test2.jpg"); - registerScreenSpaceRenderable(ssr); + std::shared_ptr ssfb = std::make_shared(); ssfb->addRenderFunction(std::make_shared>([this](){renderInformation();})); ssfb->addRenderFunction(std::make_shared>([this](){ssr->render();})); registerScreenSpaceRenderable(ssfb); + + ssr = std::make_shared("${OPENSPACE_DATA}/test2.jpg"); + registerScreenSpaceRenderable(ssr); + return true; } From 48021a46e28c6401e3ccc03bbb98c3ff97d1277f Mon Sep 17 00:00:00 2001 From: Sebastian Piwell Date: Fri, 18 Mar 2016 12:02:46 -0400 Subject: [PATCH 2/2] Sort screenspacerenderables in correct render order --- include/openspace/rendering/renderengine.h | 1 + include/openspace/rendering/screenspacerenderable.h | 3 +++ modules/base/rendering/screenspaceframebuffer.cpp | 4 +++- src/rendering/renderengine.cpp | 9 +++++++++ src/rendering/screenspacerenderable.cpp | 2 ++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index ecc93ca856..345ead1292 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -138,6 +138,7 @@ public: // Temporary fade functionality void startFading(int direction, float fadeDuration); + void sortScreenspaceRenderables(); // This is temporary until a proper screenspace solution is found ---abock struct { glm::vec2 _position; diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 62c877618e..ffb55bd74b 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -55,8 +55,11 @@ public: virtual void update() = 0; virtual bool isReady() const = 0; bool isEnabled() const; + glm::vec2 euclideanPosition() const {return _euclideanPosition.value();}; glm::vec2 sphericalPosition() const {return _sphericalPosition.value();}; + float depth() const {return _depth.value();}; + void move(glm::vec2 v){ if(_useFlatScreen.value()){ glm::vec2 pos = _euclideanPosition.value(); diff --git a/modules/base/rendering/screenspaceframebuffer.cpp b/modules/base/rendering/screenspaceframebuffer.cpp index a6ccc5fa2e..df5d320e6f 100644 --- a/modules/base/rendering/screenspaceframebuffer.cpp +++ b/modules/base/rendering/screenspaceframebuffer.cpp @@ -45,6 +45,8 @@ ScreenSpaceFramebuffer::ScreenSpaceFramebuffer() addProperty(_size); OsEng.gui()._property.registerProperty(&_size); _size.set(glm::vec4(0, 0, resolution.x,resolution.y)); + + _depth.set(1.0f); } ScreenSpaceFramebuffer::~ScreenSpaceFramebuffer(){} @@ -101,7 +103,7 @@ void ScreenSpaceFramebuffer::render(){ glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - + glEnable(GL_ALPHA_TEST); for(auto renderFunction : _renderFunctions){ (*renderFunction)(); diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index e344311a88..8d0d200499 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -96,6 +96,7 @@ namespace { const std::string RenderFsPath = "${SHADERS}/render.frag"; } + namespace openspace { const std::string RenderEngine::PerformanceMeasurementSharedData = @@ -1132,6 +1133,7 @@ void RenderEngine::setDisableRenderingOnMaster(bool enabled) { void RenderEngine::registerScreenSpaceRenderable(std::shared_ptr s){ s->initialize(); _screenSpaceRenderables.push_back(s); + sortScreenspaceRenderables(); } void RenderEngine::unregisterScreenSpaceRenderable(std::shared_ptr s){ @@ -1470,4 +1472,11 @@ void RenderEngine::renderScreenLog() { } } +void RenderEngine::sortScreenspaceRenderables(){ + std::sort(_screenSpaceRenderables.begin(), _screenSpaceRenderables.end(), + [](std::shared_ptr j, std::shared_ptr i){ + return i->depth() > j->depth(); + }); +} + }// namespace openspace diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 309f8f1a30..ac125b065b 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -58,6 +58,8 @@ ScreenSpaceRenderable::ScreenSpaceRenderable() _radius = _planeDepth; _sphericalPosition.set(toSpherical(_euclideanPosition.value())); + + _depth.onChange([this](){ OsEng.renderEngine().sortScreenspaceRenderables(); }); } ScreenSpaceRenderable::~ScreenSpaceRenderable(){}