diff --git a/src/ofxBaseJoint.cpp b/src/ofxBaseJoint.cpp index 525d2c3..bedede5 100644 --- a/src/ofxBaseJoint.cpp +++ b/src/ofxBaseJoint.cpp @@ -69,6 +69,11 @@ bool ofxBaseJoint::isDragged() return bDrag; } +bool ofxBaseJoint::isSelected() +{ + return selected; +} + void ofxBaseJoint::setDefaultColors() { fillColor = ofColor(0, 255, 255, 0); diff --git a/src/ofxBaseJoint.h b/src/ofxBaseJoint.h index 85be110..25b0f55 100644 --- a/src/ofxBaseJoint.h +++ b/src/ofxBaseJoint.h @@ -24,6 +24,7 @@ public: void select(); void unselect(); bool isDragged(); + bool isSelected(); virtual void update(){}; virtual void draw(){}; diff --git a/src/ofxProjectionEditor.cpp b/src/ofxProjectionEditor.cpp index 6b8eb89..946a168 100644 --- a/src/ofxProjectionEditor.cpp +++ b/src/ofxProjectionEditor.cpp @@ -3,17 +3,15 @@ ofxProjectionEditor::ofxProjectionEditor() { surfaceManager = NULL; - registerAppEvents(); - registerMouseEvents(); + bShiftKeyDown = false; + enable(); } ofxProjectionEditor::~ofxProjectionEditor() { clearJoints(); surfaceManager = NULL; - unregisterAppEvents(); - unregisterMouseEvents(); - + disable(); } void ofxProjectionEditor::registerAppEvents() @@ -38,11 +36,37 @@ void ofxProjectionEditor::unregisterMouseEvents() ofRemoveListener(ofEvents().mouseDragged, this, &ofxProjectionEditor::mouseDragged); } +void ofxProjectionEditor::registerKeyEvents() +{ + ofAddListener(ofEvents().keyPressed, this, &ofxProjectionEditor::keyPressed); + ofAddListener(ofEvents().keyReleased, this, &ofxProjectionEditor::keyReleased); +} + +void ofxProjectionEditor::unregisterKeyEvents() +{ + ofRemoveListener(ofEvents().keyPressed, this, &ofxProjectionEditor::keyPressed); + ofRemoveListener(ofEvents().keyReleased, this, &ofxProjectionEditor::keyReleased); +} + +void ofxProjectionEditor::enable() +{ + registerAppEvents(); + registerMouseEvents(); + registerKeyEvents(); +} + +void ofxProjectionEditor::disable() +{ + unregisterAppEvents(); + unregisterMouseEvents(); + unregisterKeyEvents(); +} + void ofxProjectionEditor::update(ofEventArgs &args) { // update surface if one of the joints is being dragged for ( int i=0; iisDragged() ) { + if ( joints[i]->isDragged() || joints[i]->isSelected() ) { // update vertex to new location surfaceManager->getSelectedSurface()->setVertex(i, joints[i]->position); break; @@ -63,6 +87,31 @@ void ofxProjectionEditor::mouseDragged(ofMouseEventArgs &args) // } +void ofxProjectionEditor::keyPressed(ofKeyEventArgs &args) +{ + int key = args.key; + float moveStep; + + if (bShiftKeyDown) moveStep = 10.0f; + else moveStep = 0.5f; + + switch (key) { + case OF_KEY_LEFT: moveSelection(ofVec2f(-moveStep,0.0f)); break; + case OF_KEY_RIGHT: moveSelection(ofVec2f(moveStep,0.0f)); break; + case OF_KEY_UP: moveSelection(ofVec2f(0.0f,-moveStep)); break; + case OF_KEY_DOWN: moveSelection(ofVec2f(0.0f,moveStep)); break; + case OF_KEY_SHIFT: bShiftKeyDown = true; break; + } +} + +void ofxProjectionEditor::keyReleased(ofKeyEventArgs &args) +{ + int key = args.key; + switch (key) { + case OF_KEY_SHIFT: bShiftKeyDown = false; break; + } +} + void ofxProjectionEditor::gotMessage(ofMessage& msg) { if (msg.message == "surfaceSelected") { @@ -136,6 +185,26 @@ void ofxProjectionEditor::stopDragJoints() } } +void ofxProjectionEditor::moveSelection(ofVec2f by) +{ + // check if joints selected + bool bJointSelected = false; + ofxBaseJoint* selectedJoint; + for ( int i=0; iisSelected()) { + bJointSelected = true; + selectedJoint = joints[i]; + break; + } + } + + if ( bJointSelected ) { + selectedJoint->position += by; + } else { + moveSelectedSurface(by); + } +} + ofxCircleJoint* ofxProjectionEditor::hitTestJoints(ofVec2f pos) { for ( int i=0; i joints; + bool bShiftKeyDown; void drawJoints(); }; diff --git a/src/ofxSurfaceManagerGui.cpp b/src/ofxSurfaceManagerGui.cpp index 655f03e..49d5a1e 100644 --- a/src/ofxSurfaceManagerGui.cpp +++ b/src/ofxSurfaceManagerGui.cpp @@ -93,6 +93,8 @@ void ofxSurfaceManagerGui::mousePressed(ofMouseEventArgs &args) hitJoint->select(); hitJoint->startDrag(); bSurfaceSelected = true; + } else { + textureEditor.unselectAllJoints(); } if ( surfaceManager->getSelectedSurface() != NULL && !bSurfaceSelected ) { @@ -200,8 +202,17 @@ void ofxSurfaceManagerGui::setMode(int newGuiMode) } if ( guiMode == ofxGuiMode::TEXTURE_MAPPING ) { + textureEditor.enable(); // refresh texture editor surface reference textureEditor.setSurface(surfaceManager->getSelectedSurface()); + } else { + textureEditor.disable(); + } + + if (guiMode == ofxGuiMode::PROJECTION_MAPPING) { + projectionEditor.enable(); + } else { + projectionEditor.disable(); } } diff --git a/src/ofxTextureEditor.cpp b/src/ofxTextureEditor.cpp index fd49cdb..0a1aa41 100644 --- a/src/ofxTextureEditor.cpp +++ b/src/ofxTextureEditor.cpp @@ -3,13 +3,13 @@ ofxTextureEditor::ofxTextureEditor() { clear(); - registerAppEvents(); + enable(); } ofxTextureEditor::~ofxTextureEditor() { clear(); - unregisterAppEvents(); + disable(); } void ofxTextureEditor::registerAppEvents() @@ -22,6 +22,31 @@ void ofxTextureEditor::unregisterAppEvents() ofRemoveListener(ofEvents().update, this, &ofxTextureEditor::update); } +void ofxTextureEditor::registerKeyEvents() +{ + ofAddListener(ofEvents().keyPressed, this, &ofxTextureEditor::keyPressed); + ofAddListener(ofEvents().keyReleased, this, &ofxTextureEditor::keyReleased); +} + +void ofxTextureEditor::unregisterKeyEvents() +{ + ofRemoveListener(ofEvents().keyPressed, this, &ofxTextureEditor::keyPressed); + ofRemoveListener(ofEvents().keyReleased, this, &ofxTextureEditor::keyReleased); +} + +void ofxTextureEditor::enable() +{ + registerAppEvents(); + registerKeyEvents(); + bShiftKeyDown = false; +} + +void ofxTextureEditor::disable() +{ + unregisterAppEvents(); + unregisterKeyEvents(); +} + void ofxTextureEditor::update(ofEventArgs &args) { if ( surface == NULL ) return; @@ -29,7 +54,7 @@ void ofxTextureEditor::update(ofEventArgs &args) // update surface if one of the joints is being dragged ofVec2f textureSize = ofVec2f( surface->getTexture()->getWidth(), surface->getTexture()->getHeight() ); for ( int i=0; iisDragged() ) { + if ( joints[i]->isDragged() || joints[i]->isSelected() ) { // update vertex to new location surface->setTexCoord(i, joints[i]->position / textureSize); break; @@ -37,6 +62,32 @@ void ofxTextureEditor::update(ofEventArgs &args) } } +void ofxTextureEditor::keyPressed(ofKeyEventArgs &args) +{ + int key = args.key; + float moveStep; + + if (bShiftKeyDown) moveStep = 10.0f; + else moveStep = 0.5f; + + switch (key) { + case OF_KEY_LEFT: moveSelection(ofVec2f(-moveStep,0.0f)); break; + case OF_KEY_RIGHT: moveSelection(ofVec2f(moveStep,0.0f)); break; + case OF_KEY_UP: moveSelection(ofVec2f(0.0f,-moveStep)); break; + case OF_KEY_DOWN: moveSelection(ofVec2f(0.0f,moveStep)); break; + case OF_KEY_SHIFT: bShiftKeyDown = true; break; + } +} + +void ofxTextureEditor::keyReleased(ofKeyEventArgs &args) +{ + int key = args.key; + switch (key) { + case OF_KEY_SHIFT: bShiftKeyDown = false; break; + } +} + + void ofxTextureEditor::draw() { if (surface == NULL) return; @@ -109,6 +160,26 @@ void ofxTextureEditor::stopDragJoints() } } +void ofxTextureEditor::moveSelection(ofVec2f by) +{ + // check if joints selected + bool bJointSelected = false; + ofxBaseJoint* selectedJoint; + for ( int i=0; iisSelected()) { + bJointSelected = true; + selectedJoint = joints[i]; + break; + } + } + + if ( bJointSelected ) { + selectedJoint->position += by; + } else { + moveTexCoords(by); + } +} + ofxCircleJoint* ofxTextureEditor::hitTestJoints(ofVec2f pos) { for ( int i=0; i joints; - + bool bShiftKeyDown; }; #endif \ No newline at end of file