ofxPiMapper fixed for C++17 & oF 12.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

297 lines
6.6 KiB

#include "SurfaceManager.h"
namespace ofx {
namespace piMapper {
SurfaceManager::SurfaceManager(){
mediaServer = 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(
_presets[0]->vertexChangedEvent,
this,
&SurfaceManager::onVertexChanged);
ofAddListener(
_presets[0]->verticesChangedEvent,
this,
&SurfaceManager::onVerticesChanged);
_selectedVertexIndex = -1;
}
void SurfaceManager::draw(){
_presets[0]->draw();
}
void SurfaceManager::addSurface(BaseSurface * surface){
_presets[0]->push_back(surface);
}
void SurfaceManager::removeSelectedSurface(){
if(selectedSurface == 0){
return;
}
for(int i = 0; i < _presets[0]->size(); i++){
if(_presets[0]->at(i) == selectedSurface){
_presets[0]->erase(i);
selectedSurface = 0;
_selectedVertexIndex = -1;
break;
}
}
}
void SurfaceManager::removeSurface(){
if(_presets[0]->size() <= 0){
return;
}
BaseSurface * s = _presets[0]->back();
_presets[0]->pop_back();
delete s;
}
void SurfaceManager::deleteSurface(ofx::piMapper::BaseSurface * surface){
for(int i = 0; i < _presets[0]->size(); ++i){
if(_presets[0]->at(i) == surface){
_presets[0]->erase(i);
break;
}
}
}
void SurfaceManager::clear(){
while(_presets[0]->size()){
delete _presets[0]->back();
_presets[0]->pop_back();
}
}
void SurfaceManager::saveXmlSettings(string fileName){
if(mediaServer == 0){
ofLogFatalError("SurfaceManager") << "Media server not set";
exit(EXIT_FAILURE);
}
SettingsLoader::instance()->save(*_presets[0], fileName);
}
bool SurfaceManager::loadXmlSettings(string fileName){
if(mediaServer == 0){
ofLogFatalError("SurfaceManager") << "Media server not set";
exit(EXIT_FAILURE);
}
return SettingsLoader::instance()->load(*_presets[0], *mediaServer, fileName);
}
void SurfaceManager::setMediaServer(MediaServer * newMediaServer){
mediaServer = newMediaServer;
}
BaseSurface * SurfaceManager::selectSurface(int index){
if(index >= _presets[0]->size()){
throw runtime_error("Surface index out of bounds.");
}
selectedSurface = _presets[0]->at(index);
_selectedVertexIndex = -1;
ofSendMessage("surfaceSelected");
return selectedSurface;
}
BaseSurface * SurfaceManager::selectSurface(BaseSurface * surface){
cout << "SurfaceManager::selectSurface()" << endl;
for(int i = 0; i < _presets[0]->size(); i++){
if(_presets[0]->at(i) == surface){
selectedSurface = surface;
_selectedVertexIndex = -1;
ofSendMessage("surfaceSelected");
ofNotifyEvent(surfaceSelectedEvent, i, this);
return selectedSurface;
}
}
deselectSurface();
return 0;
}
BaseSurface * SurfaceManager::selectNextSurface(){
int next;
_selectedVertexIndex = -1;
if(selectedSurface == 0){
next = 0;
selectedSurface = selectSurface(next);
ofNotifyEvent(surfaceSelectedEvent, next, this);
return selectedSurface;
}
for(int i = 0; i < _presets[0]->size(); ++i){
if(_presets[0]->at(i) == selectedSurface){
if(i < _presets[0]->size() - 1){
next = i + 1;
}else{
next = 0;
}
selectedSurface = _presets[0]->at(next);
ofNotifyEvent(surfaceSelectedEvent, next, this);
return selectedSurface;
}
}
return 0;
}
BaseSurface * SurfaceManager::selectPrevSurface(){
int prev;
_selectedVertexIndex = -1;
if(selectedSurface == 0){
prev = _presets[0]->size() - 1;
selectedSurface = selectSurface(prev);
ofNotifyEvent(surfaceSelectedEvent, prev, this);
return selectedSurface;
}
for(int i = 0; i < _presets[0]->size(); ++i){
if(_presets[0]->at(i) == selectedSurface){
if(i > 0){
prev = i - 1;
}else{
prev = _presets[0]->size() - 1;
}
selectedSurface = _presets[0]->at(prev);
ofNotifyEvent(surfaceSelectedEvent, prev, this);
return selectedSurface;
}
}
return 0;
}
BaseSurface * SurfaceManager::getSelectedSurface(){
return selectedSurface;
}
// TODO: select vertex should be implemented ad BaseSurface level
void SurfaceManager::selectNextVertex(){
if(selectedSurface == 0){
return;
}
int numVertices = selectedSurface->getVertices().size();
if(_selectedVertexIndex == -1){
_selectedVertexIndex = 0;
}else if(_selectedVertexIndex < numVertices - 1){
_selectedVertexIndex += 1;
}else{
_selectedVertexIndex = 0;
}
ofNotifyEvent(vertexSelectedEvent, _selectedVertexIndex, this);
}
// TODO: select vertex should be implemented at BaseSurface level
void SurfaceManager::selectPrevVertex(){
if(selectedSurface == 0){
return;
}
int numVertices = selectedSurface->getVertices().size();
if(_selectedVertexIndex > 0){
_selectedVertexIndex -= 1;
}else{
_selectedVertexIndex = numVertices - 1;
}
ofNotifyEvent(vertexSelectedEvent, _selectedVertexIndex, this);
}
void SurfaceManager::selectVertex(int i){
if(selectedSurface == 0){
return;
}
if(i > selectedSurface->getVertices().size() - 1){
ofLogError("SurfaceManager::selectVertex") << "index (" << i << ") out of bounds" << endl;
int prevVertIndex = _selectedVertexIndex;
ofNotifyEvent(vertexUnselectedEvent, prevVertIndex, this);
_selectedVertexIndex = -1;
return;
}
_selectedVertexIndex = i;
ofNotifyEvent(vertexSelectedEvent, _selectedVertexIndex, this);
}
void SurfaceManager::moveSelectionBy(ofVec2f v){
if(selectedSurface == 0){
moveAllSurfacesBy(v);
return;
}
if(_selectedVertexIndex != -1){
selectedSurface->getVertices()[_selectedVertexIndex] += v;
ofNotifyEvent(vertexChangedEvent, _selectedVertexIndex, this);
}else{
selectedSurface->moveBy(v);
}
// TODO: instead of having single selected surface
// we want to have a selection of one or more.
// it could be implemented as vector here.
}
void SurfaceManager::moveAllSurfacesBy(ofVec2f v){
for(int i = 0; i < _presets[0]->size(); ++i){
_presets[0]->at(i)->moveBy(v);
}
}
void SurfaceManager::deselectSurface(){
selectedSurface = 0;
_selectedVertexIndex = -1;
}
BaseSurface * SurfaceManager::getSurface(int index){
if(index >= _presets[0]->size()){
throw runtime_error("Surface index out of bounds.");
return 0;
}
return _presets[0]->at(index);
}
int SurfaceManager::size(){
return _presets[0]->size();
}
int SurfaceManager::getSelectedVertexIndex(){
return _selectedVertexIndex;
}
void SurfaceManager::onVertexChanged(int & i){
ofNotifyEvent(vertexChangedEvent, i, this);
}
void SurfaceManager::onVerticesChanged(vector<ofVec3f> & vertices){
ofNotifyEvent(verticesChangedEvent, vertices, this);
}
SurfaceStack * SurfaceManager::getActivePreset(){
return _presets[0];
}
} // namespace piMapper
} // namespace ofx