From 5531170862d4e0ada8ab349b48de7452b7d202ef Mon Sep 17 00:00:00 2001 From: Theodoros Papatheodorou Date: Fri, 5 Jan 2018 13:04:58 +0000 Subject: [PATCH] added ability not to update/draw fbo sources when they are not actively displayed --- src/MediaServer/MediaServer.cpp | 4 ++-- src/Sources/BaseSource.cpp | 15 ++++++++++++++- src/Sources/BaseSource.h | 7 ++++++- src/Surfaces/SurfaceManager.cpp | 18 +++++++++++++++++- src/Surfaces/SurfaceManager.h | 3 ++- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/MediaServer/MediaServer.cpp b/src/MediaServer/MediaServer.cpp index 78d1af8..4a63b13 100644 --- a/src/MediaServer/MediaServer.cpp +++ b/src/MediaServer/MediaServer.cpp @@ -37,13 +37,13 @@ void MediaServer::setup(){ void MediaServer::update(){ for(int i = 0; i < fboSources.size(); ++i){ - fboSources[i]->updateFbo(); + if (fboSources[i]->isActive() || fboSources[i]->runsInBackground()) fboSources[i]->updateFbo(); } } void MediaServer::draw(){ for(int i = 0; i < fboSources.size(); ++i){ - fboSources[i]->drawFbo(); + if (fboSources[i]->isActive() || fboSources[i]->runsInBackground()) fboSources[i]->drawFbo(); } } diff --git a/src/Sources/BaseSource.cpp b/src/Sources/BaseSource.cpp index 3ab1f92..bfaa746 100644 --- a/src/Sources/BaseSource.cpp +++ b/src/Sources/BaseSource.cpp @@ -6,6 +6,7 @@ namespace piMapper { BaseSource::BaseSource(){ //cout << "BaseSource" << endl; init(); + runInBackground = false; } BaseSource::BaseSource(ofTexture * newTexture){ @@ -49,6 +50,18 @@ void BaseSource::init(){ referenceCount = 1; // We have one instance on init } +void BaseSource::setActive(bool value){ + displayed = value; +} + +bool BaseSource::isActive(){ + return displayed; +} + +bool BaseSource::runsInBackground(){ + return runInBackground; +} + void BaseSource::setNameFromPath(string & fullPath){ vector pathParts; //cout << "fullPath: " << fullPath << endl; @@ -58,4 +71,4 @@ void BaseSource::setNameFromPath(string & fullPath){ } } // namespace piMapper -} // namespace ofx \ No newline at end of file +} // namespace ofx diff --git a/src/Sources/BaseSource.h b/src/Sources/BaseSource.h index c097359..b2b2176 100644 --- a/src/Sources/BaseSource.h +++ b/src/Sources/BaseSource.h @@ -20,6 +20,9 @@ class BaseSource { string & getPath(); virtual void clear(){} virtual void togglePause(){} + bool isActive(); + bool runsInBackground(); + void setActive(bool); virtual void reset(){} // called by surfaceManager to optionally allow users to reset a source's variables @@ -28,7 +31,7 @@ class BaseSource { int referenceCount; private: - void init(); + void init(); protected: void setNameFromPath(string & fullPath); @@ -38,6 +41,8 @@ class BaseSource { bool loadable; // If the source can be loaded from disk like image and video bool loaded; // Is the source loaded? SourceType type; + bool displayed; + bool runInBackground; }; } // namespace piMapper diff --git a/src/Surfaces/SurfaceManager.cpp b/src/Surfaces/SurfaceManager.cpp index 35d6e31..0d821b0 100644 --- a/src/Surfaces/SurfaceManager.cpp +++ b/src/Surfaces/SurfaceManager.cpp @@ -134,6 +134,8 @@ bool SurfaceManager::loadXmlSettings(string fileName){ exit(EXIT_FAILURE); } bool success = SettingsLoader::instance()->load(*this, *mediaServer, fileName); + + setPresetSourcesActiveState(_activePresetIndex, true); return success; } @@ -451,6 +453,14 @@ void SurfaceManager::setNextPreset(){ // TODO: Create command for this. } +void SurfaceManager::setPresetSourcesActiveState(unsigned int presetIndex, bool state){ + // tell sources associated with current preset that they are not displayed any more + // this is so that we can optionally update the buffers or not. + for (int j=0; j<_presets[presetIndex]->getSurfaces().size(); j++){ + _presets[_activePresetIndex]->getSurfaces()[j]->getSource()->setActive(state); + } +} + void SurfaceManager::setPreset(unsigned int i){ if(_presets.size() <= 1){ throw runtime_error("ofxPiMapper: No presets to set."); @@ -460,7 +470,13 @@ void SurfaceManager::setPreset(unsigned int i){ throw runtime_error("ofxPiMapper: Preset index out of bounds."); } - _activePresetIndex = i; + //let sources associated with OLD preset know that they are not being displayed any more + setPresetSourcesActiveState(_activePresetIndex, false); + //change preset + _activePresetIndex = i; + //let sources associated with NEW preset know that they are now being displayed + setPresetSourcesActiveState(_activePresetIndex, true); + //when preset it changed, call reset on all sources, if it's defined for (int i=0; i<_presets[_activePresetIndex]->getSurfaces().size(); i++){ diff --git a/src/Surfaces/SurfaceManager.h b/src/Surfaces/SurfaceManager.h index 7a296b4..58a0da8 100644 --- a/src/Surfaces/SurfaceManager.h +++ b/src/Surfaces/SurfaceManager.h @@ -76,6 +76,7 @@ class SurfaceManager { void setPreset(unsigned int i); void cloneActivePreset(); void eraseActivePreset(); + void setPresetSourcesActiveState(unsigned int presetIndex, bool state); private: BaseSurface * selectedSurface; @@ -90,4 +91,4 @@ class SurfaceManager { }; } // namespace piMapper -} // namespace ofx \ No newline at end of file +} // namespace ofx