Browse Source

Make SurfaceStack not a singleton

master
Krisjanis Rijnieks 9 years ago
parent
commit
5076b39c89
  1. 2
      src/Application/Application.cpp
  2. 7
      src/Application/Modes/ProjectionMappingMode.cpp
  3. 6
      src/Commands/ClearSurfacesCmd.cpp
  4. 13
      src/Commands/MvLayerDnCmd.cpp
  5. 4
      src/Commands/MvLayerDnCmd.h
  6. 15
      src/Commands/MvLayerUpCmd.cpp
  7. 3
      src/Commands/MvLayerUpCmd.h
  8. 83
      src/Surfaces/SurfaceManager.cpp
  9. 4
      src/Surfaces/SurfaceManager.h
  10. 9
      src/Surfaces/SurfaceStack.cpp
  11. 10
      src/Surfaces/SurfaceStack.h

2
src/Application/Application.cpp

@ -73,7 +73,7 @@ void Application::onKeyPressed(ofKeyEventArgs & args){
if(_keySequence.size() >= 3){ if(_keySequence.size() >= 3){
_keySequence = _keySequence.substr(_keySequence.size() - 3, 3); _keySequence = _keySequence.substr(_keySequence.size() - 3, 3);
if(_keySequence == "new"){ if(_keySequence == "new"){
if(SurfaceStack::instance()->size()){ if(_surfaceManager.getActivePreset()->size()){
_cmdManager.exec(new ClearSurfacesCmd(getSurfaceManager())); _cmdManager.exec(new ClearSurfacesCmd(getSurfaceManager()));
} }
return; return;

7
src/Application/Modes/ProjectionMappingMode.cpp

@ -234,12 +234,14 @@ void ProjectionMappingMode::onKeyPressed(Application * app, ofKeyEventArgs & arg
case '0': // Move selected surface up the layer stack case '0': // Move selected surface up the layer stack
if(app->getSurfaceManager()->getSelectedSurface() != 0){ if(app->getSurfaceManager()->getSelectedSurface() != 0){
if(app->getSurfaceManager()->getSelectedSurface() == if(app->getSurfaceManager()->getSelectedSurface() ==
SurfaceStack::instance()->at(SurfaceStack::instance()->size() - 1)){ app->getSurfaceManager()->getActivePreset()->at(
app->getSurfaceManager()->getActivePreset()->size() - 1)){
return; return;
} }
app->getCmdManager()->exec( app->getCmdManager()->exec(
new MvLayerUpCmd( new MvLayerUpCmd(
app->getSurfaceManager()->getActivePreset(),
app->getSurfaceManager()->getSelectedSurface()) app->getSurfaceManager()->getSelectedSurface())
); );
} }
@ -248,12 +250,13 @@ void ProjectionMappingMode::onKeyPressed(Application * app, ofKeyEventArgs & arg
case '9': // Move selected surface down the layer stack case '9': // Move selected surface down the layer stack
if(app->getSurfaceManager()->getSelectedSurface() != 0){ if(app->getSurfaceManager()->getSelectedSurface() != 0){
if(app->getSurfaceManager()->getSelectedSurface() == if(app->getSurfaceManager()->getSelectedSurface() ==
SurfaceStack::instance()->at(0)){ app->getSurfaceManager()->getActivePreset()->at(0)){
return; return;
} }
app->getCmdManager()->exec( app->getCmdManager()->exec(
new MvLayerDnCmd( new MvLayerDnCmd(
app->getSurfaceManager()->getActivePreset(),
app->getSurfaceManager()->getSelectedSurface()) app->getSurfaceManager()->getSelectedSurface())
); );
} }

6
src/Commands/ClearSurfacesCmd.cpp

@ -6,18 +6,18 @@ namespace piMapper {
ClearSurfacesCmd::ClearSurfacesCmd(SurfaceManager * sm){ ClearSurfacesCmd::ClearSurfacesCmd(SurfaceManager * sm){
_surfaceManager = sm; _surfaceManager = sm;
_selectedSurface = _surfaceManager->getSelectedSurface(); _selectedSurface = _surfaceManager->getSelectedSurface();
_surfaces = SurfaceStack::instance()->getSurfaces(); _surfaces = sm->getActivePreset()->getSurfaces();
} }
void ClearSurfacesCmd::exec(){ void ClearSurfacesCmd::exec(){
_surfaceManager->deselectSurface(); _surfaceManager->deselectSurface();
SurfaceStack::instance()->clear(); _surfaceManager->getActivePreset()->clear();
} }
void ClearSurfacesCmd::undo(){ void ClearSurfacesCmd::undo(){
ofLogNotice("ClearSurfacesCmd", "undo"); ofLogNotice("ClearSurfacesCmd", "undo");
for(unsigned int i = 0; i < _surfaces.size(); ++i){ for(unsigned int i = 0; i < _surfaces.size(); ++i){
SurfaceStack::instance()->push_back(_surfaces[i]); _surfaceManager->getActivePreset()->push_back(_surfaces[i]);
} }
_surfaceManager->selectSurface(_selectedSurface); _surfaceManager->selectSurface(_selectedSurface);
} }

13
src/Commands/MvLayerDnCmd.cpp

@ -3,7 +3,8 @@
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
MvLayerDnCmd::MvLayerDnCmd(BaseSurface * selectedSurface){ MvLayerDnCmd::MvLayerDnCmd(SurfaceStack * stack, BaseSurface * selectedSurface){
_stack = stack;
_selectedSurface = selectedSurface; _selectedSurface = selectedSurface;
_selectedSurfaceIndex = -1; _selectedSurfaceIndex = -1;
} }
@ -12,8 +13,8 @@ void MvLayerDnCmd::exec(){
ofLogNotice("MvLayerDnCmd", "exec"); ofLogNotice("MvLayerDnCmd", "exec");
// Find selected surface index in SurfaceStack. // Find selected surface index in SurfaceStack.
for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ for(int i = 0; i < _stack->size(); ++i){
if(_selectedSurface == SurfaceStack::instance()->at(i)){ if(_selectedSurface == _stack->at(i)){
_selectedSurfaceIndex = i; _selectedSurfaceIndex = i;
break; break;
} }
@ -27,17 +28,17 @@ void MvLayerDnCmd::exec(){
throw runtime_error("Check if selected surface is not bottom before using MvLayerUpCmd"); throw runtime_error("Check if selected surface is not bottom before using MvLayerUpCmd");
} }
if(SurfaceStack::instance()->size() <= 1){ if(_stack->size() <= 1){
throw runtime_error("Check if there is more than one surface before using MvLayerUpCmd"); throw runtime_error("Check if there is more than one surface before using MvLayerUpCmd");
} }
// Swap it with the previous surface // Swap it with the previous surface
SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1); _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1);
} }
void MvLayerDnCmd::undo(){ void MvLayerDnCmd::undo(){
ofLogNotice("MvLayerDnCmd", "undo"); ofLogNotice("MvLayerDnCmd", "undo");
SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1); _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex - 1);
} }
} // namespace piMapper } // namespace piMapper

4
src/Commands/MvLayerDnCmd.h

@ -10,11 +10,13 @@ namespace piMapper {
class MvLayerDnCmd : public BaseUndoCmd { class MvLayerDnCmd : public BaseUndoCmd {
public: public:
MvLayerDnCmd(BaseSurface * selectedSurface); MvLayerDnCmd(SurfaceStack * stack, BaseSurface * selectedSurface);
void exec(); void exec();
void undo(); void undo();
private: private:
SurfaceStack * _stack;
BaseSurface * _selectedSurface; BaseSurface * _selectedSurface;
int _selectedSurfaceIndex; int _selectedSurfaceIndex;

15
src/Commands/MvLayerUpCmd.cpp

@ -3,7 +3,8 @@
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
MvLayerUpCmd::MvLayerUpCmd(BaseSurface * selectedSurface){ MvLayerUpCmd::MvLayerUpCmd(SurfaceStack * stack, BaseSurface * selectedSurface){
_stack = stack;
_selectedSurface = selectedSurface; _selectedSurface = selectedSurface;
_selectedSurfaceIndex = -1; _selectedSurfaceIndex = -1;
} }
@ -12,8 +13,8 @@ void MvLayerUpCmd::exec(){
ofLogNotice("MvLayerUpCmd", "exec"); ofLogNotice("MvLayerUpCmd", "exec");
// Find selected surface index in SurfaceStack. // Find selected surface index in SurfaceStack.
for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ for(int i = 0; i < _stack->size(); ++i){
if(_selectedSurface == SurfaceStack::instance()->at(i)){ if(_selectedSurface == _stack->at(i)){
_selectedSurfaceIndex = i; _selectedSurfaceIndex = i;
break; break;
} }
@ -23,21 +24,21 @@ void MvLayerUpCmd::exec(){
throw runtime_error("MvLayerUpCmd used with no surface selected"); throw runtime_error("MvLayerUpCmd used with no surface selected");
} }
if(_selectedSurfaceIndex == SurfaceStack::instance()->size() - 1){ if(_selectedSurfaceIndex == _stack->size() - 1){
throw runtime_error("Check if selected surface is not top before using MvLayerUpCmd"); throw runtime_error("Check if selected surface is not top before using MvLayerUpCmd");
} }
if(SurfaceStack::instance()->size() <= 1){ if(_stack->size() <= 1){
throw runtime_error("Check if there is more than one surface before using MvLayerUpCmd"); throw runtime_error("Check if there is more than one surface before using MvLayerUpCmd");
} }
// Swap it with the next surface // Swap it with the next surface
SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1); _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1);
} }
void MvLayerUpCmd::undo(){ void MvLayerUpCmd::undo(){
ofLogNotice("MvLayerUoCmd", "undo"); ofLogNotice("MvLayerUoCmd", "undo");
SurfaceStack::instance()->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1); _stack->swap(_selectedSurfaceIndex, _selectedSurfaceIndex + 1);
} }
} // namespace piMapper } // namespace piMapper

3
src/Commands/MvLayerUpCmd.h

@ -10,11 +10,12 @@ namespace piMapper {
class MvLayerUpCmd : public BaseUndoCmd { class MvLayerUpCmd : public BaseUndoCmd {
public: public:
MvLayerUpCmd(BaseSurface * selectedSurface); MvLayerUpCmd(SurfaceStack * stack, BaseSurface * selectedSurface);
void exec(); void exec();
void undo(); void undo();
private: private:
SurfaceStack * _stack;
BaseSurface * _selectedSurface; BaseSurface * _selectedSurface;
int _selectedSurfaceIndex; int _selectedSurfaceIndex;

83
src/Surfaces/SurfaceManager.cpp

@ -6,23 +6,30 @@ namespace piMapper {
SurfaceManager::SurfaceManager(){ SurfaceManager::SurfaceManager(){
mediaServer = 0; mediaServer = 0;
selectedSurface = 0; selectedSurface = 0;
// Create one SurfaceStack instance in the beginning as interphase towards full
// preset functionality.
SurfaceStack * preset = new SurfaceStack();
_presets.push_back(preset);
ofAddListener( ofAddListener(
SurfaceStack::instance()->vertexChangedEvent, _presets[0]->vertexChangedEvent,
this, this,
&SurfaceManager::onVertexChanged); &SurfaceManager::onVertexChanged);
ofAddListener( ofAddListener(
SurfaceStack::instance()->verticesChangedEvent, _presets[0]->verticesChangedEvent,
this, this,
&SurfaceManager::onVerticesChanged); &SurfaceManager::onVerticesChanged);
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
} }
void SurfaceManager::draw(){ void SurfaceManager::draw(){
SurfaceStack::instance()->draw(); _presets[0]->draw();
} }
void SurfaceManager::addSurface(BaseSurface * surface){ void SurfaceManager::addSurface(BaseSurface * surface){
SurfaceStack::instance()->push_back(surface); _presets[0]->push_back(surface);
} }
void SurfaceManager::removeSelectedSurface(){ void SurfaceManager::removeSelectedSurface(){
@ -30,9 +37,9 @@ void SurfaceManager::removeSelectedSurface(){
return; return;
} }
for(int i = 0; i < SurfaceStack::instance()->size(); i++){ for(int i = 0; i < _presets[0]->size(); i++){
if(SurfaceStack::instance()->at(i) == selectedSurface){ if(_presets[0]->at(i) == selectedSurface){
SurfaceStack::instance()->erase(i); _presets[0]->erase(i);
selectedSurface = 0; selectedSurface = 0;
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
break; break;
@ -41,27 +48,27 @@ void SurfaceManager::removeSelectedSurface(){
} }
void SurfaceManager::removeSurface(){ void SurfaceManager::removeSurface(){
if(SurfaceStack::instance()->size() <= 0){ if(_presets[0]->size() <= 0){
return; return;
} }
BaseSurface * s = SurfaceStack::instance()->back(); BaseSurface * s = _presets[0]->back();
SurfaceStack::instance()->pop_back(); _presets[0]->pop_back();
delete s; delete s;
} }
void SurfaceManager::deleteSurface(ofx::piMapper::BaseSurface * surface){ void SurfaceManager::deleteSurface(ofx::piMapper::BaseSurface * surface){
for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ for(int i = 0; i < _presets[0]->size(); ++i){
if(SurfaceStack::instance()->at(i) == surface){ if(_presets[0]->at(i) == surface){
SurfaceStack::instance()->erase(i); _presets[0]->erase(i);
break; break;
} }
} }
} }
void SurfaceManager::clear(){ void SurfaceManager::clear(){
while(SurfaceStack::instance()->size()){ while(_presets[0]->size()){
delete SurfaceStack::instance()->back(); delete _presets[0]->back();
SurfaceStack::instance()->pop_back(); _presets[0]->pop_back();
} }
} }
@ -71,7 +78,7 @@ void SurfaceManager::saveXmlSettings(string fileName){
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
SettingsLoader::instance()->save(*SurfaceStack::instance(), fileName); SettingsLoader::instance()->save(*_presets[0], fileName);
} }
bool SurfaceManager::loadXmlSettings(string fileName){ bool SurfaceManager::loadXmlSettings(string fileName){
@ -80,7 +87,7 @@ bool SurfaceManager::loadXmlSettings(string fileName){
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return SettingsLoader::instance()->load(*SurfaceStack::instance(), *mediaServer, fileName); return SettingsLoader::instance()->load(*_presets[0], *mediaServer, fileName);
} }
void SurfaceManager::setMediaServer(MediaServer * newMediaServer){ void SurfaceManager::setMediaServer(MediaServer * newMediaServer){
@ -88,11 +95,11 @@ void SurfaceManager::setMediaServer(MediaServer * newMediaServer){
} }
BaseSurface * SurfaceManager::selectSurface(int index){ BaseSurface * SurfaceManager::selectSurface(int index){
if(index >= SurfaceStack::instance()->size()){ if(index >= _presets[0]->size()){
throw runtime_error("Surface index out of bounds."); throw runtime_error("Surface index out of bounds.");
} }
selectedSurface = SurfaceStack::instance()->at(index); selectedSurface = _presets[0]->at(index);
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
ofSendMessage("surfaceSelected"); ofSendMessage("surfaceSelected");
return selectedSurface; return selectedSurface;
@ -101,8 +108,8 @@ BaseSurface * SurfaceManager::selectSurface(int index){
BaseSurface * SurfaceManager::selectSurface(BaseSurface * surface){ BaseSurface * SurfaceManager::selectSurface(BaseSurface * surface){
cout << "SurfaceManager::selectSurface()" << endl; cout << "SurfaceManager::selectSurface()" << endl;
for(int i = 0; i < SurfaceStack::instance()->size(); i++){ for(int i = 0; i < _presets[0]->size(); i++){
if(SurfaceStack::instance()->at(i) == surface){ if(_presets[0]->at(i) == surface){
selectedSurface = surface; selectedSurface = surface;
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
ofSendMessage("surfaceSelected"); ofSendMessage("surfaceSelected");
@ -126,15 +133,15 @@ BaseSurface * SurfaceManager::selectNextSurface(){
return selectedSurface; return selectedSurface;
} }
for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ for(int i = 0; i < _presets[0]->size(); ++i){
if(SurfaceStack::instance()->at(i) == selectedSurface){ if(_presets[0]->at(i) == selectedSurface){
if(i < SurfaceStack::instance()->size() - 1){ if(i < _presets[0]->size() - 1){
next = i + 1; next = i + 1;
}else{ }else{
next = 0; next = 0;
} }
selectedSurface = SurfaceStack::instance()->at(next); selectedSurface = _presets[0]->at(next);
ofNotifyEvent(surfaceSelectedEvent, next, this); ofNotifyEvent(surfaceSelectedEvent, next, this);
return selectedSurface; return selectedSurface;
} }
@ -148,21 +155,21 @@ BaseSurface * SurfaceManager::selectPrevSurface(){
_selectedVertexIndex = -1; _selectedVertexIndex = -1;
if(selectedSurface == 0){ if(selectedSurface == 0){
prev = SurfaceStack::instance()->size() - 1; prev = _presets[0]->size() - 1;
selectedSurface = selectSurface(prev); selectedSurface = selectSurface(prev);
ofNotifyEvent(surfaceSelectedEvent, prev, this); ofNotifyEvent(surfaceSelectedEvent, prev, this);
return selectedSurface; return selectedSurface;
} }
for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ for(int i = 0; i < _presets[0]->size(); ++i){
if(SurfaceStack::instance()->at(i) == selectedSurface){ if(_presets[0]->at(i) == selectedSurface){
if(i > 0){ if(i > 0){
prev = i - 1; prev = i - 1;
}else{ }else{
prev = SurfaceStack::instance()->size() - 1; prev = _presets[0]->size() - 1;
} }
selectedSurface = SurfaceStack::instance()->at(prev); selectedSurface = _presets[0]->at(prev);
ofNotifyEvent(surfaceSelectedEvent, prev, this); ofNotifyEvent(surfaceSelectedEvent, prev, this);
return selectedSurface; return selectedSurface;
} }
@ -247,8 +254,8 @@ void SurfaceManager::moveSelectionBy(ofVec2f v){
} }
void SurfaceManager::moveAllSurfacesBy(ofVec2f v){ void SurfaceManager::moveAllSurfacesBy(ofVec2f v){
for(int i = 0; i < SurfaceStack::instance()->size(); ++i){ for(int i = 0; i < _presets[0]->size(); ++i){
SurfaceStack::instance()->at(i)->moveBy(v); _presets[0]->at(i)->moveBy(v);
} }
} }
@ -258,16 +265,16 @@ void SurfaceManager::deselectSurface(){
} }
BaseSurface * SurfaceManager::getSurface(int index){ BaseSurface * SurfaceManager::getSurface(int index){
if(index >= SurfaceStack::instance()->size()){ if(index >= _presets[0]->size()){
throw runtime_error("Surface index out of bounds."); throw runtime_error("Surface index out of bounds.");
return 0; return 0;
} }
return SurfaceStack::instance()->at(index); return _presets[0]->at(index);
} }
int SurfaceManager::size(){ int SurfaceManager::size(){
return SurfaceStack::instance()->size(); return _presets[0]->size();
} }
int SurfaceManager::getSelectedVertexIndex(){ int SurfaceManager::getSelectedVertexIndex(){
@ -282,5 +289,9 @@ void SurfaceManager::onVerticesChanged(vector<ofVec3f> & vertices){
ofNotifyEvent(verticesChangedEvent, vertices, this); ofNotifyEvent(verticesChangedEvent, vertices, this);
} }
SurfaceStack * SurfaceManager::getActivePreset(){
return _presets[0];
}
} // namespace piMapper } // namespace piMapper
} // namespace ofx } // namespace ofx

4
src/Surfaces/SurfaceManager.h

@ -70,12 +70,16 @@ class SurfaceManager {
void onVertexChanged(int & i); void onVertexChanged(int & i);
void onVerticesChanged(vector<ofVec3f> & vertices); void onVerticesChanged(vector<ofVec3f> & vertices);
SurfaceStack * getActivePreset();
private: private:
BaseSurface * selectedSurface; BaseSurface * selectedSurface;
ofxXmlSettings xmlSettings; ofxXmlSettings xmlSettings;
MediaServer * mediaServer; MediaServer * mediaServer;
int _selectedVertexIndex; int _selectedVertexIndex;
vector <SurfaceStack *> _presets;
}; };
} // namespace piMapper } // namespace piMapper

9
src/Surfaces/SurfaceStack.cpp

@ -3,15 +3,6 @@
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
SurfaceStack * SurfaceStack::_instance = 0;
SurfaceStack * SurfaceStack::instance(){
if(_instance == 0){
_instance = new ofx::piMapper::SurfaceStack();
}
return _instance;
}
void SurfaceStack::push_back(BaseSurface * s){ void SurfaceStack::push_back(BaseSurface * s){
ofAddListener(s->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged); ofAddListener(s->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged);
ofAddListener(s->vertexChangedEvent, this, &SurfaceStack::onVertexChanged); ofAddListener(s->vertexChangedEvent, this, &SurfaceStack::onVertexChanged);

10
src/Surfaces/SurfaceStack.h

@ -6,14 +6,8 @@
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
/* TODO: Do not use singleton here.
* For presets we need multiple instances of surface stacks.
*/
class SurfaceStack { class SurfaceStack {
public: public:
static SurfaceStack * instance();
void push_back(BaseSurface * s); void push_back(BaseSurface * s);
void pop_back(); void pop_back();
void erase(int i); void erase(int i);
@ -36,10 +30,6 @@ class SurfaceStack {
vector<BaseSurface *> & getSurfaces(){ return _surfaces; }; vector<BaseSurface *> & getSurfaces(){ return _surfaces; };
private: private:
SurfaceStack(){}
static SurfaceStack * _instance;
vector<BaseSurface *> _surfaces; vector<BaseSurface *> _surfaces;
}; };

Loading…
Cancel
Save