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(){
// Store surface location by copying vertices
_previousVertices = _surface->getVertices();
_surface->setMoved(false);
}
void MoveSurfaceCommand::undo(){
//for (auto i = 0; i < _previousVertices.size(); i++) {
//_surface->setVertex(i, _previousVertices[i]);
//}
_surface->moveBy(_previousVertices[0] - _surface->getVertices()[0]);
_projectionEditor->updateJoints();
_previousVertices.clear();

20
src/Surfaces/BaseSurface.cpp

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

1
src/Surfaces/QuadSurface.cpp

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

70
src/Surfaces/SurfaceManagerGui.cpp

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

Loading…
Cancel
Save