Browse Source

Add move surfaces and joints with arrow keys

master
Krisjanis Rijnieks 11 years ago
parent
commit
6260e485f1
  1. 5
      src/ofxBaseJoint.cpp
  2. 1
      src/ofxBaseJoint.h
  3. 81
      src/ofxProjectionEditor.cpp
  4. 9
      src/ofxProjectionEditor.h
  5. 11
      src/ofxSurfaceManagerGui.cpp
  6. 77
      src/ofxTextureEditor.cpp
  7. 9
      src/ofxTextureEditor.h

5
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);

1
src/ofxBaseJoint.h

@ -24,6 +24,7 @@ public:
void select();
void unselect();
bool isDragged();
bool isSelected();
virtual void update(){};
virtual void draw(){};

81
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; i<joints.size(); i++ ) {
if ( joints[i]->isDragged() ) {
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; i<joints.size(); i++ ) {
if (joints[i]->isSelected()) {
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.size(); i++ ) {

9
src/ofxProjectionEditor.h

@ -14,10 +14,17 @@ public:
void unregisterAppEvents();
void registerMouseEvents();
void unregisterMouseEvents();
void registerKeyEvents();
void unregisterKeyEvents();
void enable();
void disable();
void update(ofEventArgs& args);
void draw();
void mouseDragged(ofMouseEventArgs& args);
void keyPressed(ofKeyEventArgs& args);
void keyReleased(ofKeyEventArgs& args);
void gotMessage(ofMessage& msg);
void setSurfaceManager(ofxSurfaceManager* newSurfaceManager);
void clearJoints();
@ -27,11 +34,13 @@ public:
void moveSelectedSurface(ofVec2f by);
void stopDragJoints();
void updateVertices();
void moveSelection(ofVec2f by);
ofxCircleJoint* hitTestJoints(ofVec2f pos);
private:
ofxSurfaceManager* surfaceManager;
vector<ofxCircleJoint*> joints;
bool bShiftKeyDown;
void drawJoints();
};

11
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();
}
}

77
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; i<joints.size(); i++ ) {
if ( joints[i]->isDragged() ) {
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; i<joints.size(); i++ ) {
if (joints[i]->isSelected()) {
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.size(); i++ ) {

9
src/ofxTextureEditor.h

@ -13,8 +13,14 @@ public:
void registerAppEvents();
void unregisterAppEvents();
void registerKeyEvents();
void unregisterKeyEvents();
void enable();
void disable();
void update(ofEventArgs& args);
void keyPressed(ofKeyEventArgs& args);
void keyReleased(ofKeyEventArgs& args);
void draw();
void drawJoints();
void setSurface(ofxBaseSurface* newSurface);
@ -24,12 +30,13 @@ public:
void unselectAllJoints();
void moveTexCoords(ofVec2f by);
void stopDragJoints();
void moveSelection(ofVec2f by);
ofxCircleJoint* hitTestJoints(ofVec2f pos);
private:
ofxBaseSurface* surface;
vector<ofxCircleJoint*> joints;
bool bShiftKeyDown;
};
#endif
Loading…
Cancel
Save