From 572635706969e8229f43d5b642ac56dc3a6d73b6 Mon Sep 17 00:00:00 2001 From: Krisjanis Rijnieks Date: Tue, 2 Feb 2016 19:21:36 +0100 Subject: [PATCH] Make surfaces emit events when vertices change --- src/Surfaces/BaseSurface.h | 2 ++ src/Surfaces/GridWarpSurface.cpp | 10 +++++++++- src/Surfaces/QuadSurface.cpp | 8 ++++++++ src/Surfaces/SurfaceManager.cpp | 14 ++++++++++---- src/Surfaces/SurfaceManager.h | 7 ++++++- src/Surfaces/SurfaceManagerGui.cpp | 13 +++++++++++++ src/Surfaces/SurfaceManagerGui.h | 3 +++ src/Surfaces/SurfaceStack.cpp | 14 ++++++++++++++ src/Surfaces/SurfaceStack.h | 6 ++++++ src/Surfaces/TriangleSurface.cpp | 10 +++++++++- 10 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/Surfaces/BaseSurface.h b/src/Surfaces/BaseSurface.h index 86e29f0..8fc96dd 100644 --- a/src/Surfaces/BaseSurface.h +++ b/src/Surfaces/BaseSurface.h @@ -42,6 +42,8 @@ class BaseSurface { ofMesh getMesh(); // TODO: The surface should emit an event once vertex has changed + ofEvent > verticesChangedEvent; + ofEvent vertexChangedEvent; protected: ofMesh mesh; diff --git a/src/Surfaces/GridWarpSurface.cpp b/src/Surfaces/GridWarpSurface.cpp index 04949d8..d06127c 100644 --- a/src/Surfaces/GridWarpSurface.cpp +++ b/src/Surfaces/GridWarpSurface.cpp @@ -25,10 +25,13 @@ void GridWarpSurface::draw(){ void GridWarpSurface::moveBy(ofVec2f v){ vector & vertices = getVertices(); + for(int i = 0; i < vertices.size(); i++){ vertices[i] += v; } + setMoved(true); + ofNotifyEvent(verticesChangedEvent, mesh.getVertices(), this); } int GridWarpSurface::getType(){ @@ -139,7 +142,10 @@ void GridWarpSurface::setVertex(int index, ofVec2f p){ if(index >= mesh.getVertices().size()){ throw runtime_error("Vertex with provided index does not exist"); } + mesh.setVertex(index, p); + ofVec3f v = mesh.getVertex(index); + ofNotifyEvent(vertexChangedEvent, v, this); } void GridWarpSurface::setVertices(vector v){ @@ -150,6 +156,8 @@ void GridWarpSurface::setVertices(vector v){ for(int i = 0; i < v.size(); ++i){ mesh.setVertex(i, v[i]); } + + ofNotifyEvent(verticesChangedEvent, mesh.getVertices(), this); } void GridWarpSurface::setTexCoord(int index, ofVec2f t){ @@ -220,7 +228,7 @@ void GridWarpSurface::createGridMesh(){ } } - + ofNotifyEvent(verticesChangedEvent, mesh.getVertices(), this); } diff --git a/src/Surfaces/QuadSurface.cpp b/src/Surfaces/QuadSurface.cpp index 61c4ba0..b88f0dc 100644 --- a/src/Surfaces/QuadSurface.cpp +++ b/src/Surfaces/QuadSurface.cpp @@ -96,15 +96,20 @@ void QuadSurface::setVertex(int index, ofVec2f p){ } mesh.setVertex(index, p); + ofVec3f v = mesh.getVertex(index); + ofNotifyEvent(vertexChangedEvent, v, this); } void QuadSurface::setVertices(vector v){ if(v.size() != 4){ throw runtime_error("Wrong number of vertices"); } + for(int i = 0; i < 4; ++i){ mesh.setVertex(i, v[i]); } + + ofNotifyEvent(verticesChangedEvent, mesh.getVertices(), this); } void QuadSurface::setTexCoord(int index, ofVec2f t){ @@ -128,10 +133,13 @@ void QuadSurface::setTexCoords(vector t){ void QuadSurface::moveBy(ofVec2f v){ vector & vertices = getVertices(); + for(int i = 0; i < vertices.size(); i++){ vertices[i] += v; } + setMoved(true); + ofNotifyEvent(verticesChangedEvent, mesh.getVertices(), this); } int QuadSurface::getType(){ diff --git a/src/Surfaces/SurfaceManager.cpp b/src/Surfaces/SurfaceManager.cpp index 503093e..fb20ccd 100644 --- a/src/Surfaces/SurfaceManager.cpp +++ b/src/Surfaces/SurfaceManager.cpp @@ -6,10 +6,8 @@ namespace piMapper { SurfaceManager::SurfaceManager(){ mediaServer = 0; selectedSurface = 0; -} - -SurfaceManager::~SurfaceManager(){ - clear(); + ofAddListener(_surfaces.vertexChangedEvent, this, &SurfaceManager::onVertexChanged); + ofAddListener(_surfaces.verticesChangedEvent, this, &SurfaceManager::onVerticesChanged); } void SurfaceManager::draw(){ @@ -115,5 +113,13 @@ int SurfaceManager::size(){ return _surfaces.size(); } +void SurfaceManager::onVertexChanged(ofVec3f & vertex){ + ofNotifyEvent(vertexChangedEvent, vertex, this); +} + +void SurfaceManager::onVerticesChanged(vector & vertices){ + ofNotifyEvent(verticesChangedEvent, vertices, this); +} + } // namespace piMapper } // namespace ofx diff --git a/src/Surfaces/SurfaceManager.h b/src/Surfaces/SurfaceManager.h index c4a0f58..634337d 100644 --- a/src/Surfaces/SurfaceManager.h +++ b/src/Surfaces/SurfaceManager.h @@ -23,7 +23,6 @@ class SurfaceManager { public: SurfaceManager(); - ~SurfaceManager(); void draw(); @@ -44,6 +43,12 @@ class SurfaceManager { int size(); + ofEvent vertexChangedEvent; + ofEvent > verticesChangedEvent; + + void onVertexChanged(ofVec3f & vertex); + void onVerticesChanged(vector & vertices); + private: BaseSurface * selectedSurface; ofxXmlSettings xmlSettings; diff --git a/src/Surfaces/SurfaceManagerGui.cpp b/src/Surfaces/SurfaceManagerGui.cpp index 7bccec7..4327606 100644 --- a/src/Surfaces/SurfaceManagerGui.cpp +++ b/src/Surfaces/SurfaceManagerGui.cpp @@ -228,6 +228,10 @@ void SurfaceManagerGui::mouseDragged(ofMouseEventArgs & args){ void SurfaceManagerGui::setSurfaceManager(SurfaceManager * newSurfaceManager){ surfaceManager = newSurfaceManager; + + ofAddListener(newSurfaceManager->vertexChangedEvent, this, &SurfaceManagerGui::onVertexChanged); + ofAddListener(newSurfaceManager->verticesChangedEvent, this, &SurfaceManagerGui::onVerticesChanged); + projectionEditor.setSurfaceManager(surfaceManager); sourcesEditor.setSurfaceManager(surfaceManager); } @@ -328,5 +332,14 @@ ProjectionEditor * SurfaceManagerGui::getProjectionEditor(){ return &projectionEditor; } +void SurfaceManagerGui::onVertexChanged(ofVec3f & vertex){ + //cout << "VERTEX CHANGED: " << vertex.x << ", " << vertex.y << endl; +} + +void SurfaceManagerGui::onVerticesChanged(vector & vertices){ + //cout << "VERTICES CHANGED: " << vertices.size() << endl; + projectionEditor.createJoints(); +} + } // namespace piMapper } // namespace ofx \ No newline at end of file diff --git a/src/Surfaces/SurfaceManagerGui.h b/src/Surfaces/SurfaceManagerGui.h index dc5c06c..1cb6eb3 100644 --- a/src/Surfaces/SurfaceManagerGui.h +++ b/src/Surfaces/SurfaceManagerGui.h @@ -46,6 +46,9 @@ class SurfaceManagerGui { void stopDrag(); ProjectionEditor * getProjectionEditor(); + + void onVertexChanged(ofVec3f & vertex); + void onVerticesChanged(vector & vertices); private: SurfaceManager * surfaceManager; diff --git a/src/Surfaces/SurfaceStack.cpp b/src/Surfaces/SurfaceStack.cpp index f3e784f..b3c3c7c 100644 --- a/src/Surfaces/SurfaceStack.cpp +++ b/src/Surfaces/SurfaceStack.cpp @@ -6,14 +6,20 @@ namespace piMapper { SurfaceStack::SurfaceStack(){} void SurfaceStack::push_back(BaseSurface * s){ + ofAddListener(s->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged); + ofAddListener(s->vertexChangedEvent, this, &SurfaceStack::onVertexChanged); _surfaces.push_back(s); } void SurfaceStack::pop_back(){ + ofRemoveListener(_surfaces.back()->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged); + ofRemoveListener(_surfaces.back()->vertexChangedEvent, this, &SurfaceStack::onVertexChanged); _surfaces.pop_back(); } void SurfaceStack::erase(int i){ + ofRemoveListener(_surfaces[i]->verticesChangedEvent, this, &SurfaceStack::onVerticesChanged); + ofRemoveListener(_surfaces[i]->vertexChangedEvent, this, &SurfaceStack::onVertexChanged); _surfaces.erase(_surfaces.begin() + i); } @@ -42,5 +48,13 @@ BaseSurface * SurfaceStack::back(){ return _surfaces.back(); } +void SurfaceStack::onVerticesChanged(vector & vertices){ + ofNotifyEvent(verticesChangedEvent, vertices, this); +} + +void SurfaceStack::onVertexChanged(ofVec3f & vertex){ + ofNotifyEvent(vertexChangedEvent, vertex, this); +} + } // namespace piMapper } // namespace ofx \ No newline at end of file diff --git a/src/Surfaces/SurfaceStack.h b/src/Surfaces/SurfaceStack.h index 1eb1b1f..950a48e 100644 --- a/src/Surfaces/SurfaceStack.h +++ b/src/Surfaces/SurfaceStack.h @@ -22,6 +22,12 @@ class SurfaceStack { BaseSurface * operator[](int i); BaseSurface * back(); + ofEvent > verticesChangedEvent; + ofEvent vertexChangedEvent; + + void onVerticesChanged(vector & vertices); + void onVertexChanged(ofVec3f & vertex); + private: vector _surfaces; }; diff --git a/src/Surfaces/TriangleSurface.cpp b/src/Surfaces/TriangleSurface.cpp index 9872158..d54518f 100644 --- a/src/Surfaces/TriangleSurface.cpp +++ b/src/Surfaces/TriangleSurface.cpp @@ -61,17 +61,22 @@ void TriangleSurface::setVertex(int index, ofVec2f p){ ofLog() << "Vertex with this index does not exist: " << index << endl; return; } - + mesh.setVertex(index, p); + ofVec3f v = mesh.getVertex(index); + ofNotifyEvent(vertexChangedEvent, v, this); } void TriangleSurface::setVertices(vector v){ if(v.size() != 3){ throw runtime_error("Wrong number of vertices"); } + for(int i = 0; i < 3; ++i){ mesh.setVertex(i, v[i]); } + + ofNotifyEvent(verticesChangedEvent, mesh.getVertices(), this); } void TriangleSurface::setTexCoord(int index, ofVec2f t){ @@ -95,10 +100,13 @@ void TriangleSurface::setTexCoords(vector t){ void TriangleSurface::moveBy(ofVec2f v){ vector & vertices = getVertices(); + for(int i = 0; i < vertices.size(); i++){ vertices[i] += v; } + setMoved(true); + ofNotifyEvent(verticesChangedEvent, mesh.getVertices(), this); } int TriangleSurface::getType(){