From 5531170862d4e0ada8ab349b48de7452b7d202ef Mon Sep 17 00:00:00 2001 From: Theodoros Papatheodorou Date: Fri, 5 Jan 2018 13:04:58 +0000 Subject: [PATCH 1/4] 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 From df78944c1215314320304111c5050175e0adc988 Mon Sep 17 00:00:00 2001 From: Theodoros Papatheodorou Date: Sat, 6 Jan 2018 20:38:42 +0000 Subject: [PATCH 2/4] made default state of display equal to true so that preview of source is possible --- src/Sources/BaseSource.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Sources/BaseSource.cpp b/src/Sources/BaseSource.cpp index bfaa746..0bb8958 100644 --- a/src/Sources/BaseSource.cpp +++ b/src/Sources/BaseSource.cpp @@ -7,6 +7,7 @@ BaseSource::BaseSource(){ //cout << "BaseSource" << endl; init(); runInBackground = false; + displayed = true; } BaseSource::BaseSource(ofTexture * newTexture){ From 7099fee8f5b9c8c244266e8485408f4306da1c11 Mon Sep 17 00:00:00 2001 From: Theodoros Papatheodorou Date: Sun, 7 Jan 2018 14:35:37 +0000 Subject: [PATCH 3/4] fixed minor bugs here and there and made sure media server sets displayed flag to false once source is unloaded --- src/MediaServer/MediaServer.cpp | 7 +++++-- src/Sources/BaseSource.cpp | 2 +- src/Surfaces/SurfaceManager.cpp | 6 ++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/MediaServer/MediaServer.cpp b/src/MediaServer/MediaServer.cpp index 4a63b13..b55489f 100644 --- a/src/MediaServer/MediaServer.cpp +++ b/src/MediaServer/MediaServer.cpp @@ -363,7 +363,8 @@ BaseSource * MediaServer::loadFboSource(string & fboSourceName){ // Is loaded, increase reference count and return existing loadedSources[fboSourceName]->referenceCount++; ofLogNotice("MediaServer") << "Current " << fboSourceName << "reference count: " << loadedSources[fboSourceName]->referenceCount; - return loadedSources[fboSourceName]; + source->setActive(true); + return loadedSources[fboSourceName]; } // else // Not loaded, add to loaded sources and activate @@ -372,7 +373,8 @@ BaseSource * MediaServer::loadFboSource(string & fboSourceName){ source->referenceCount = 1; ofLogNotice("MediaServer") << "Current " << fboSourceName << " reference count: " << source->referenceCount; loadedSources[fboSourceName] = source; - return loadedSources[fboSourceName]; + source->setActive(true); + return loadedSources[fboSourceName]; } // loadFboSource void MediaServer::unloadFboSource(string & fboSourceName){ @@ -392,6 +394,7 @@ void MediaServer::unloadFboSource(string & fboSourceName){ if(source->referenceCount <= 0){ ofLogNotice("MediaServer") << fboSourceName << " reference count <= 0, removing from loaded sources"; source->referenceCount = 0; + source->setActive(false); //source->removeAppListeners(); map ::iterator it = loadedSources.find(fboSourceName); loadedSources.erase(it); diff --git a/src/Sources/BaseSource.cpp b/src/Sources/BaseSource.cpp index 0bb8958..77f9c7f 100644 --- a/src/Sources/BaseSource.cpp +++ b/src/Sources/BaseSource.cpp @@ -7,7 +7,7 @@ BaseSource::BaseSource(){ //cout << "BaseSource" << endl; init(); runInBackground = false; - displayed = true; + displayed = false; } BaseSource::BaseSource(ofTexture * newTexture){ diff --git a/src/Surfaces/SurfaceManager.cpp b/src/Surfaces/SurfaceManager.cpp index 0d821b0..160c3bd 100644 --- a/src/Surfaces/SurfaceManager.cpp +++ b/src/Surfaces/SurfaceManager.cpp @@ -457,11 +457,12 @@ void SurfaceManager::setPresetSourcesActiveState(unsigned int presetIndex, bool // 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); + _presets[presetIndex]->getSurfaces()[j]->getSource()->setActive(state); } } void SurfaceManager::setPreset(unsigned int i){ + cout << "CALLED IT" << endl; if(_presets.size() <= 1){ throw runtime_error("ofxPiMapper: No presets to set."); } @@ -470,8 +471,9 @@ void SurfaceManager::setPreset(unsigned int i){ throw runtime_error("ofxPiMapper: Preset index out of bounds."); } - //let sources associated with OLD preset know that they are not being displayed any more + //let sources associated with all 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 From f38f8b7449c7d8061795288304cf18d344012fc3 Mon Sep 17 00:00:00 2001 From: Theodoros Papatheodorou Date: Mon, 8 Jan 2018 18:02:59 +0000 Subject: [PATCH 4/4] set all sources associated with presets to display=false when loaded vial xml --- src/Surfaces/SurfaceManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Surfaces/SurfaceManager.cpp b/src/Surfaces/SurfaceManager.cpp index 160c3bd..939e4b0 100644 --- a/src/Surfaces/SurfaceManager.cpp +++ b/src/Surfaces/SurfaceManager.cpp @@ -135,6 +135,10 @@ bool SurfaceManager::loadXmlSettings(string fileName){ } bool success = SettingsLoader::instance()->load(*this, *mediaServer, fileName); + for (int i=0; i<_presets.size(); i++){ + setPresetSourcesActiveState(i, false); + } + setPresetSourcesActiveState(_activePresetIndex, true); return success; }