Browse Source

Remove MoveSurfaceCommand from command stack via undo if surface not moved

master
Krisjanis Rijnieks 10 years ago
parent
commit
24fe4fdc94
  1. 5
      src/Commands/MoveSurfaceCommand.cpp
  2. 20
      src/Surfaces/BaseSurface.cpp
  3. 19
      src/Surfaces/BaseSurface.h
  4. 1
      src/Surfaces/QuadSurface.cpp
  5. 70
      src/Surfaces/SurfaceManagerGui.cpp
  6. 1
      src/Surfaces/TriangleSurface.cpp

5
src/Commands/MoveSurfaceCommand.cpp

@ -12,14 +12,11 @@ namespace ofx{
} }
void MoveSurfaceCommand::exec(){ void MoveSurfaceCommand::exec(){
// Store surface location by copying vertices
_previousVertices = _surface->getVertices(); _previousVertices = _surface->getVertices();
_surface->setMoved(false);
} }
void MoveSurfaceCommand::undo(){ void MoveSurfaceCommand::undo(){
//for (auto i = 0; i < _previousVertices.size(); i++) {
//_surface->setVertex(i, _previousVertices[i]);
//}
_surface->moveBy(_previousVertices[0] - _surface->getVertices()[0]); _surface->moveBy(_previousVertices[0] - _surface->getVertices()[0]);
_projectionEditor->updateJoints(); _projectionEditor->updateJoints();
_previousVertices.clear(); _previousVertices.clear();

20
src/Surfaces/BaseSurface.cpp

@ -1,12 +1,13 @@
#include "BaseSurface.h" #include "BaseSurface.h"
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
BaseSurface::BaseSurface() { BaseSurface::BaseSurface() {
_moved = false;
ofEnableNormalizedTexCoords(); ofEnableNormalizedTexCoords();
createDefaultTexture(); createDefaultTexture();
} }
BaseSurface::~BaseSurface() { BaseSurface::~BaseSurface() {
delete defaultSource; delete defaultSource;
@ -14,7 +15,7 @@ BaseSurface::BaseSurface() {
defaultTexture.clear(); defaultTexture.clear();
} }
void BaseSurface::createDefaultTexture() { void BaseSurface::createDefaultTexture() {
ofPixels pixels; ofPixels pixels;
pixels.allocate(500, 500, 1); pixels.allocate(500, 500, 1);
for (int i = 0; i < pixels.size(); i++) { for (int i = 0; i < pixels.size(); i++) {
@ -47,9 +48,9 @@ void BaseSurface::createDefaultTexture() {
// Create new source to be the default // Create new source to be the default
defaultSource = new BaseSource(&defaultTexture); defaultSource = new BaseSource(&defaultTexture);
source = defaultSource; source = defaultSource;
} }
void BaseSurface::drawTexture(ofVec2f position) { void BaseSurface::drawTexture(ofVec2f position) {
if (source->getTexture() == NULL) { if (source->getTexture() == NULL) {
ofLogWarning("BaseSurface") << "Source texture empty. Not drawing."; ofLogWarning("BaseSurface") << "Source texture empty. Not drawing.";
return; return;
@ -70,7 +71,7 @@ void BaseSurface::drawTexture(ofVec2f position) {
source->getTexture()->bind(); source->getTexture()->bind();
texMesh.draw(); texMesh.draw();
source->getTexture()->unbind(); source->getTexture()->unbind();
} }
//void BaseSurface::setTexture(ofTexture* texturePtr) { texture = texturePtr; } //void BaseSurface::setTexture(ofTexture* texturePtr) { texture = texturePtr; }
void BaseSurface::setSource(BaseSource* newSource) { void BaseSurface::setSource(BaseSource* newSource) {
@ -86,5 +87,8 @@ void BaseSurface::drawTexture(ofVec2f position) {
BaseSource* BaseSurface::getDefaultSource() { BaseSource* BaseSurface::getDefaultSource() {
return defaultSource; return defaultSource;
} }
}
void BaseSurface::setMoved(bool moved){ _moved = moved; }
bool BaseSurface::getMoved(){ return _moved; }
}
} }

19
src/Surfaces/BaseSurface.h

@ -7,8 +7,8 @@
using namespace std; using namespace std;
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
class BaseSurface { class BaseSurface {
public: public:
BaseSurface(); BaseSurface();
~BaseSurface(); ~BaseSurface();
@ -24,24 +24,21 @@ class BaseSurface {
virtual vector<ofVec3f>& getVertices() {}; virtual vector<ofVec3f>& getVertices() {};
virtual vector<ofVec2f>& getTexCoords() {}; virtual vector<ofVec2f>& getTexCoords() {};
// Draws a texture using ofMesh
void drawTexture(ofVec2f position); void drawTexture(ofVec2f position);
//void setTexture(ofTexture* texturePtr);
void setSource(BaseSource* newSource); void setSource(BaseSource* newSource);
//ofTexture* getTexture();
//ofTexture* getDefaultTexture();
BaseSource* getSource(); BaseSource* getSource();
BaseSource* getDefaultSource(); BaseSource* getDefaultSource();
void setMoved(bool moved);
bool getMoved();
protected: protected:
ofMesh mesh; ofMesh mesh;
//ofTexture* texture;
ofTexture defaultTexture; ofTexture defaultTexture;
BaseSource* source; BaseSource* source;
BaseSource* defaultSource; BaseSource* defaultSource;
void createDefaultTexture(); void createDefaultTexture();
}; bool _moved;
} };
}
} }

1
src/Surfaces/QuadSurface.cpp

@ -117,6 +117,7 @@ void QuadSurface::moveBy(ofVec2f v) {
vertices[i] += v; vertices[i] += v;
} }
calculate4dTextureCoords(); calculate4dTextureCoords();
setMoved(true);
} }
int QuadSurface::getType() { return SurfaceType::QUAD_SURFACE; } int QuadSurface::getType() { return SurfaceType::QUAD_SURFACE; }

70
src/Surfaces/SurfaceManagerGui.cpp

@ -1,41 +1,41 @@
#include "SurfaceManagerGui.h" #include "SurfaceManagerGui.h"
namespace ofx { namespace ofx {
namespace piMapper { namespace piMapper {
SurfaceManagerGui::SurfaceManagerGui() { SurfaceManagerGui::SurfaceManagerGui() {
surfaceManager = NULL; surfaceManager = NULL;
guiMode = GuiMode::NONE; guiMode = GuiMode::NONE;
bDrag = false; bDrag = false;
registerMouseEvents(); registerMouseEvents();
ofHideCursor(); ofHideCursor();
_commandManager = 0; _commandManager = 0;
} }
SurfaceManagerGui::~SurfaceManagerGui() { SurfaceManagerGui::~SurfaceManagerGui() {
unregisterMouseEvents(); unregisterMouseEvents();
surfaceManager = NULL; surfaceManager = NULL;
_commandManager = 0; _commandManager = 0;
} }
void SurfaceManagerGui::registerMouseEvents() { void SurfaceManagerGui::registerMouseEvents() {
ofAddListener(ofEvents().mousePressed, this, ofAddListener(ofEvents().mousePressed, this,
&SurfaceManagerGui::mousePressed); &SurfaceManagerGui::mousePressed);
ofAddListener(ofEvents().mouseReleased, this, ofAddListener(ofEvents().mouseReleased, this,
&SurfaceManagerGui::mouseReleased); &SurfaceManagerGui::mouseReleased);
ofAddListener(ofEvents().mouseDragged, this, ofAddListener(ofEvents().mouseDragged, this,
&SurfaceManagerGui::mouseDragged); &SurfaceManagerGui::mouseDragged);
} }
void SurfaceManagerGui::unregisterMouseEvents() { void SurfaceManagerGui::unregisterMouseEvents() {
ofRemoveListener(ofEvents().mousePressed, this, ofRemoveListener(ofEvents().mousePressed, this,
&SurfaceManagerGui::mousePressed); &SurfaceManagerGui::mousePressed);
ofRemoveListener(ofEvents().mouseReleased, this, ofRemoveListener(ofEvents().mouseReleased, this,
&SurfaceManagerGui::mouseReleased); &SurfaceManagerGui::mouseReleased);
ofRemoveListener(ofEvents().mouseDragged, this, ofRemoveListener(ofEvents().mouseDragged, this,
&SurfaceManagerGui::mouseDragged); &SurfaceManagerGui::mouseDragged);
} }
void SurfaceManagerGui::draw() { void SurfaceManagerGui::draw() {
if (surfaceManager == NULL) return; if (surfaceManager == NULL) return;
if (guiMode == GuiMode::NONE) { if (guiMode == GuiMode::NONE) {
@ -80,9 +80,9 @@ void SurfaceManagerGui::draw() {
sourcesEditor.draw(); sourcesEditor.draw();
} }
} }
void SurfaceManagerGui::mousePressed(ofMouseEventArgs& args) { void SurfaceManagerGui::mousePressed(ofMouseEventArgs& args) {
if (guiMode == GuiMode::NONE) { if (guiMode == GuiMode::NONE) {
return; return;
} else if (guiMode == GuiMode::TEXTURE_MAPPING) { } else if (guiMode == GuiMode::TEXTURE_MAPPING) {
@ -124,6 +124,9 @@ void SurfaceManagerGui::mousePressed(ofMouseEventArgs& args) {
if (!bSurfaceSelected) { if (!bSurfaceSelected) {
for (int i = surfaceManager->size() - 1; i >= 0; i--) { for (int i = surfaceManager->size() - 1; i >= 0; i--) {
if (surfaceManager->getSurface(i)->hitTest(ofVec2f(args.x, args.y))) { if (surfaceManager->getSurface(i)->hitTest(ofVec2f(args.x, args.y))) {
// TODO: Do not repeat this command if attempting to select an
// already selected surface.
_commandManager->exec(new SelectSurfaceCommand( _commandManager->exec(new SelectSurfaceCommand(
surfaceManager, surfaceManager,
surfaceManager->getSurface(i), surfaceManager->getSurface(i),
@ -140,6 +143,7 @@ void SurfaceManagerGui::mousePressed(ofMouseEventArgs& args) {
clickPosition = ofVec2f(args.x, args.y); clickPosition = ofVec2f(args.x, args.y);
startDrag(); startDrag();
// TODO: Undo this command if surface not moved on mouse release
_commandManager->exec( _commandManager->exec(
new MoveSurfaceCommand( new MoveSurfaceCommand(
surfaceManager->getSelectedSurface(), surfaceManager->getSelectedSurface(),
@ -153,15 +157,21 @@ void SurfaceManagerGui::mousePressed(ofMouseEventArgs& args) {
} }
} else if (guiMode == GuiMode::SOURCE_SELECTION) { } else if (guiMode == GuiMode::SOURCE_SELECTION) {
} }
} }
void SurfaceManagerGui::mouseReleased(ofMouseEventArgs& args) { void SurfaceManagerGui::mouseReleased(ofMouseEventArgs& args) {
stopDrag(); stopDrag();
projectionEditor.stopDragJoints(); projectionEditor.stopDragJoints();
textureEditor.stopDragJoints(); textureEditor.stopDragJoints();
}
void SurfaceManagerGui::mouseDragged(ofMouseEventArgs& args) { // Check if surface has moved
if (!surfaceManager->getSelectedSurface()->getMoved()) {
_commandManager->undo();
}
}
void SurfaceManagerGui::mouseDragged(ofMouseEventArgs& args) {
if (bDrag) { if (bDrag) {
ofVec2f mousePosition = ofVec2f(args.x, args.y); ofVec2f mousePosition = ofVec2f(args.x, args.y);
ofVec2f distance = mousePosition - clickPosition; ofVec2f distance = mousePosition - clickPosition;
@ -174,13 +184,13 @@ void SurfaceManagerGui::mouseDragged(ofMouseEventArgs& args) {
} }
clickPosition = mousePosition; clickPosition = mousePosition;
} }
} }
void SurfaceManagerGui::setSurfaceManager(SurfaceManager* newSurfaceManager) { void SurfaceManagerGui::setSurfaceManager(SurfaceManager* newSurfaceManager) {
surfaceManager = newSurfaceManager; surfaceManager = newSurfaceManager;
projectionEditor.setSurfaceManager(surfaceManager); projectionEditor.setSurfaceManager(surfaceManager);
sourcesEditor.setSurfaceManager(surfaceManager); sourcesEditor.setSurfaceManager(surfaceManager);
} }
// Set external media server so we can access it from wherever we need // Set external media server so we can access it from wherever we need
void SurfaceManagerGui::setMediaServer(MediaServer* newMediaServer) { void SurfaceManagerGui::setMediaServer(MediaServer* newMediaServer) {
@ -193,7 +203,7 @@ void SurfaceManagerGui::setSurfaceManager(SurfaceManager* newSurfaceManager) {
_commandManager = commandManager; _commandManager = commandManager;
} }
void SurfaceManagerGui::setMode(int newGuiMode) { void SurfaceManagerGui::setMode(int newGuiMode) {
if (newGuiMode != GuiMode::NONE && newGuiMode != GuiMode::TEXTURE_MAPPING && if (newGuiMode != GuiMode::NONE && newGuiMode != GuiMode::TEXTURE_MAPPING &&
newGuiMode != GuiMode::PROJECTION_MAPPING && newGuiMode != GuiMode::PROJECTION_MAPPING &&
newGuiMode != GuiMode::SOURCE_SELECTION) { newGuiMode != GuiMode::SOURCE_SELECTION) {
@ -229,34 +239,30 @@ void SurfaceManagerGui::setMode(int newGuiMode) {
} else { } else {
projectionEditor.disable(); projectionEditor.disable();
} }
} }
void SurfaceManagerGui::drawSelectedSurfaceHighlight() { void SurfaceManagerGui::drawSelectedSurfaceHighlight() {
if (surfaceManager->getSelectedSurface() == NULL) return; if (surfaceManager->getSelectedSurface() == NULL) return;
ofPolyline line = surfaceManager->getSelectedSurface()->getHitArea(); ofPolyline line = surfaceManager->getSelectedSurface()->getHitArea();
ofPushStyle(); ofPushStyle();
ofSetLineWidth(1); ofSetLineWidth(1);
ofSetColor(255, 255, 255, 255); ofSetColor(255, 255, 255, 255);
line.draw(); line.draw();
ofPopStyle(); ofPopStyle();
} }
void SurfaceManagerGui::drawSelectedSurfaceTextureHighlight() { void SurfaceManagerGui::drawSelectedSurfaceTextureHighlight() {
if (surfaceManager->getSelectedSurface() == NULL) return; if (surfaceManager->getSelectedSurface() == NULL) return;
ofPolyline line = surfaceManager->getSelectedSurface()->getTextureHitArea(); ofPolyline line = surfaceManager->getSelectedSurface()->getTextureHitArea();
ofPushStyle(); ofPushStyle();
ofSetLineWidth(1); ofSetLineWidth(1);
ofSetColor(255, 255, 0, 255); ofSetColor(255, 255, 0, 255);
line.draw(); line.draw();
ofPopStyle(); ofPopStyle();
} }
void SurfaceManagerGui::startDrag() { bDrag = true; } void SurfaceManagerGui::startDrag() { bDrag = true; }
void SurfaceManagerGui::stopDrag() { bDrag = false; } void SurfaceManagerGui::stopDrag() { bDrag = false; }
} }
} }

1
src/Surfaces/TriangleSurface.cpp

@ -76,6 +76,7 @@ void TriangleSurface::moveBy(ofVec2f v) {
for (int i = 0; i < vertices.size(); i++) { for (int i = 0; i < vertices.size(); i++) {
vertices[i] += v; vertices[i] += v;
} }
setMoved(true);
} }
int TriangleSurface::getType() { return SurfaceType::TRIANGLE_SURFACE; } int TriangleSurface::getType() { return SurfaceType::TRIANGLE_SURFACE; }

Loading…
Cancel
Save