7 changed files with 110 additions and 486 deletions
@ -1,384 +0,0 @@ |
|||
#include "ofxSurfaceGui.h" |
|||
|
|||
ofxSurfaceGui::ofxSurfaceGui() |
|||
{ |
|||
surface = NULL; |
|||
mode = NONE; |
|||
bProjectionMappingJointSelected = false; |
|||
bTextureMappingJointSelected = false; |
|||
bTextureDragging = false; |
|||
bProjectionDragging = false; |
|||
bSelected = false; |
|||
} |
|||
|
|||
ofxSurfaceGui::~ofxSurfaceGui() |
|||
{ |
|||
|
|||
} |
|||
|
|||
void ofxSurfaceGui::setup(ofxTriangleSurface& surfaceForGui) |
|||
{ |
|||
surface = &surfaceForGui; |
|||
addNumProjectionMappingJoints(3); |
|||
addNumTextureMappingJoints(3); |
|||
} |
|||
|
|||
void ofxSurfaceGui::update() |
|||
{ |
|||
if (surface == NULL) return; |
|||
if (mode == NONE) return; |
|||
|
|||
if (mode == PROJECTION_MAPPING) { |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionMappingJoints[i].update(); |
|||
} |
|||
} else if (mode == TEXTURE_MAPPING) { |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureMappingJoints[i].update(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::draw() |
|||
{ |
|||
if (surface == NULL) return; |
|||
if (mode == NONE) return; |
|||
|
|||
// This has to be on bottom, so is drawn first
|
|||
if (bSelected && mode == TEXTURE_MAPPING) { |
|||
ofPolyline line; |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
line.addVertex( ofPoint(textureMappingJoints[i].position.x, |
|||
textureMappingJoints[i].position.y) ); |
|||
} |
|||
line.close(); |
|||
line.draw(); |
|||
|
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureMappingJoints[i].draw(); |
|||
} |
|||
} |
|||
|
|||
// Draw line around projection surface always when selected
|
|||
if ( bSelected ) { |
|||
ofPolyline line; |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
line.addVertex( ofPoint(projectionMappingJoints[i].position.x, |
|||
projectionMappingJoints[i].position.y) ); |
|||
} |
|||
line.close(); |
|||
line.draw(); |
|||
} |
|||
|
|||
// Draw projection surface joints
|
|||
if (bSelected && mode == PROJECTION_MAPPING) { |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionMappingJoints[i].draw(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::mousePressed(int x, int y, int button) |
|||
{ |
|||
if (surface == NULL) return; |
|||
if (mode == NONE) return; |
|||
if (!bSelected) return; |
|||
|
|||
if (mode == PROJECTION_MAPPING) { |
|||
bProjectionMappingJointSelected = false; |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionMappingJoints[i].selected = false; |
|||
projectionMappingJoints[i].mousePressed(x, y, button); |
|||
if ( !isProjectionMappingJointSelected() && projectionMappingJoints[i].hitTest(ofVec2f(x, y)) ) { |
|||
projectionMappingJoints[i].selected = true; |
|||
projectionMappingJoints[i].startDrag(); |
|||
bProjectionMappingJointSelected = true; |
|||
} |
|||
} |
|||
|
|||
if ( !bProjectionMappingJointSelected ) { |
|||
// Check if we are hitting projection hitarea
|
|||
if ( projectionHitarea.inside(x, y) ) { |
|||
clickPosition = ofVec2f(x, y); |
|||
stopDrag(); |
|||
dragProjectionArea(); |
|||
} |
|||
} |
|||
} else if (mode == TEXTURE_MAPPING) { |
|||
bTextureMappingJointSelected = false; |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureMappingJoints[i].selected = false; |
|||
textureMappingJoints[i].mousePressed(x, y, button); |
|||
if ( !isTextureMappingJointSelected() && textureMappingJoints[i].hitTest(ofVec2f(x, y)) ) { |
|||
textureMappingJoints[i].selected = true; |
|||
textureMappingJoints[i].startDrag(); |
|||
bTextureMappingJointSelected = true; |
|||
} |
|||
} |
|||
|
|||
if ( !bTextureMappingJointSelected ) { |
|||
// Check if we are hitting the texture mapping hitarea
|
|||
if ( textureHitarea.inside(x, y) ) { |
|||
clickPosition = ofVec2f(x, y); |
|||
stopDrag(); |
|||
dragTextureArea(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::mouseReleased(int x, int y, int button) |
|||
{ |
|||
if (surface == NULL) return; |
|||
stopDrag(); |
|||
if (mode == NONE) return; |
|||
|
|||
if (mode == PROJECTION_MAPPING) { |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionMappingJoints[i].mouseReleased(x, y, button); |
|||
} |
|||
} else if (mode == TEXTURE_MAPPING) { |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureMappingJoints[i].mouseReleased(x, y, button); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::mouseDragged(int x, int y, int button) |
|||
{ |
|||
if (surface == NULL) return; |
|||
if (mode == NONE) return; |
|||
if (!bSelected) return; |
|||
|
|||
if (mode == PROJECTION_MAPPING) { |
|||
if ( bProjectionDragging ) { |
|||
ofVec2f curPos = ofVec2f(x, y); |
|||
ofVec2f dist = curPos - clickPosition; |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionMappingJoints[i].position += dist; |
|||
surface->setVertex(i, projectionMappingJoints[i].position); |
|||
} |
|||
updateProjectionHitarea(); |
|||
clickPosition = curPos; |
|||
} else { |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionMappingJoints[i].mouseDragged(x, y, button); |
|||
if ( projectionMappingJoints[i].isDragged() ) { |
|||
surface->setVertex(i, projectionMappingJoints[i].position); |
|||
updateProjectionHitarea(); |
|||
} |
|||
} // for
|
|||
} // if ( bProjectionDragging
|
|||
} else if (mode == TEXTURE_MAPPING) { |
|||
ofVec2f textureSize = ofVec2f( surface->getTexture()->getWidth(), surface->getTexture()->getHeight() ); |
|||
if ( bTextureDragging ) { |
|||
ofVec2f curPos = ofVec2f(x, y); |
|||
ofVec2f dist = curPos - clickPosition; |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureMappingJoints[i].position += dist; |
|||
surface->setTexCoord(i, textureMappingJoints[i].position/textureSize); |
|||
} |
|||
updateTextureHitarea(); |
|||
clickPosition = curPos; |
|||
} else { |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureMappingJoints[i].mouseDragged(x, y, button); |
|||
if ( textureMappingJoints[i].isDragged() ) { |
|||
surface->setTexCoord(i, textureMappingJoints[i].position/textureSize); |
|||
updateTextureHitarea(); |
|||
} |
|||
} // for
|
|||
} // if ( bTextureDragging
|
|||
} // if (mode
|
|||
} |
|||
|
|||
void ofxSurfaceGui::setMode(ofxSurfaceGui::editMode newMode) |
|||
{ |
|||
if (mode != NONE && |
|||
mode != PROJECTION_MAPPING && |
|||
mode != TEXTURE_MAPPING) { |
|||
throw std::runtime_error("Trying to set invalid mode."); |
|||
}; |
|||
|
|||
mode = newMode; |
|||
} |
|||
|
|||
void ofxSurfaceGui::select() |
|||
{ |
|||
bSelected = true; |
|||
} |
|||
|
|||
void ofxSurfaceGui::unselect() |
|||
{ |
|||
bSelected = false; |
|||
} |
|||
|
|||
void ofxSurfaceGui::updateTextureHitarea() |
|||
{ |
|||
textureHitarea.clear(); |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureHitarea.addVertex( ofPoint(textureMappingJoints[i].position.x, |
|||
textureMappingJoints[i].position.y) ); |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::updateProjectionHitarea() |
|||
{ |
|||
projectionHitarea.clear(); |
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionHitarea.addVertex( ofPoint(projectionMappingJoints[i].position.x, |
|||
projectionMappingJoints[i].position.y) ); |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::updateHitarea() |
|||
{ |
|||
updateProjectionHitarea(); |
|||
updateTextureHitarea(); |
|||
} |
|||
|
|||
void ofxSurfaceGui::updateJoints() |
|||
{ |
|||
// move joints to their positions
|
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
projectionMappingJoints[i].position = surface->getVertex(i); |
|||
} |
|||
updateProjectionHitarea(); |
|||
|
|||
ofVec2f textureSize = ofVec2f(surface->getTexture()->getWidth(), surface->getTexture()->getHeight()); |
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
textureMappingJoints[i].position = surface->getTexCoord(i) * textureSize; |
|||
} |
|||
updateTextureHitarea(); |
|||
} |
|||
|
|||
bool ofxSurfaceGui::hitTest(float x, float y) |
|||
{ |
|||
if (mode == PROJECTION_MAPPING){ |
|||
return hitTestProjectionArea(x, y); |
|||
} else if (mode == TEXTURE_MAPPING) { |
|||
return hitTestTextureArea(x, y); |
|||
} |
|||
} |
|||
|
|||
bool ofxSurfaceGui::hitTestTextureArea(float x, float y) |
|||
{ |
|||
if ( textureAreaExists() ) { |
|||
if ( textureHitarea.inside(x, y) ) { |
|||
return true; |
|||
} else { |
|||
// are we hitting texture mapping joints?
|
|||
for ( int i=0; i<textureMappingJoints.size(); i++ ) { |
|||
if ( textureMappingJoints[i].hitTest(ofVec2f(x, y)) ) { |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
} else { |
|||
return false; |
|||
} // textureAreaExists()
|
|||
} |
|||
|
|||
bool ofxSurfaceGui::hitTestProjectionArea(float x, float y) |
|||
{ |
|||
if ( projectionAreaExists() ) { |
|||
if ( projectionHitarea.inside(x, y) ) { |
|||
return true; |
|||
} else { |
|||
// hitting one of the projection mappting joints also counts,
|
|||
// so let's check that
|
|||
for ( int i=0; i<projectionMappingJoints.size(); i++ ) { |
|||
if ( projectionMappingJoints[i].hitTest(ofVec2f(x, y)) ) { |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
} else { |
|||
return false; |
|||
} // projectionAreaExists()
|
|||
} |
|||
|
|||
bool ofxSurfaceGui::isSelected() |
|||
{ |
|||
return bSelected; |
|||
} |
|||
|
|||
ofxSurfaceGui::editMode ofxSurfaceGui::getMode() |
|||
{ |
|||
return mode; |
|||
} |
|||
|
|||
void ofxSurfaceGui::addProjectionMappingJoint() |
|||
{ |
|||
projectionMappingJoints.push_back(ofxCircleJoint()); |
|||
projectionMappingJoints.back().position = surface->getVertex(projectionMappingJoints.size()-1); |
|||
updateProjectionHitarea(); |
|||
} |
|||
|
|||
void ofxSurfaceGui::addNumProjectionMappingJoints(int num) |
|||
{ |
|||
for ( int i=0; i<num; i++ ) { |
|||
addProjectionMappingJoint(); |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::addTextureMappingJoint() |
|||
{ |
|||
textureMappingJoints.push_back(ofxCircleJoint()); |
|||
ofVec2f textureSize = ofVec2f(surface->getTexture()->getWidth(), surface->getTexture()->getHeight()); |
|||
textureMappingJoints.back().position = surface->getTexCoord(textureMappingJoints.size()-1) * textureSize; |
|||
updateTextureHitarea(); |
|||
} |
|||
|
|||
void ofxSurfaceGui::addNumTextureMappingJoints(int num) |
|||
{ |
|||
for ( int i=0; i<num; i++ ) { |
|||
addTextureMappingJoint(); |
|||
} |
|||
} |
|||
|
|||
void ofxSurfaceGui::dragTextureArea() |
|||
{ |
|||
bTextureDragging = true; |
|||
} |
|||
|
|||
void ofxSurfaceGui::dragProjectionArea() |
|||
{ |
|||
bProjectionDragging = true; |
|||
} |
|||
|
|||
void ofxSurfaceGui::stopDrag() |
|||
{ |
|||
bTextureDragging = false; |
|||
bProjectionDragging = false; |
|||
} |
|||
|
|||
bool ofxSurfaceGui::isProjectionMappingJointSelected() |
|||
{ |
|||
return bProjectionMappingJointSelected; |
|||
} |
|||
|
|||
bool ofxSurfaceGui::isTextureMappingJointSelected() |
|||
{ |
|||
return bTextureMappingJointSelected; |
|||
} |
|||
|
|||
bool ofxSurfaceGui::projectionAreaExists() |
|||
{ |
|||
if ( projectionHitarea.size() > 2 ) { |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
bool ofxSurfaceGui::textureAreaExists() |
|||
{ |
|||
if ( textureHitarea.size() > 2 ) { |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
@ -1,71 +0,0 @@ |
|||
#ifndef H_OFX_SURFACE_GUI |
|||
#define H_OFX_SURFACE_GUI |
|||
|
|||
#include "ofMain.h" |
|||
#include "ofxTriangleSurface.h" |
|||
#include "ofxCircleJoint.h" |
|||
|
|||
class ofxSurfaceGui |
|||
{ |
|||
public: |
|||
ofxSurfaceGui(); |
|||
~ofxSurfaceGui(); |
|||
|
|||
enum editMode { |
|||
NONE, |
|||
TEXTURE_MAPPING, |
|||
PROJECTION_MAPPING |
|||
}; |
|||
|
|||
void setup(ofxTriangleSurface& surfaceForGui); |
|||
void update(); |
|||
void draw(); |
|||
void mousePressed(int x, int y, int button); |
|||
void mouseReleased(int x, int y, int button); |
|||
void mouseDragged(int x, int y, int button); |
|||
void setMode(editMode newMode); |
|||
void select(); |
|||
void unselect(); |
|||
void updateTextureHitarea(); |
|||
void updateProjectionHitarea(); |
|||
void updateHitarea(); // update both
|
|||
void updateJoints(); |
|||
|
|||
bool hitTest(float x, float y); |
|||
bool hitTestTextureArea(float x, float y); |
|||
bool hitTestProjectionArea(float x, float y); |
|||
bool isSelected(); |
|||
|
|||
editMode getMode(); |
|||
|
|||
private: |
|||
editMode mode; |
|||
ofxTriangleSurface* surface; |
|||
ofPolyline textureHitarea; |
|||
ofPolyline projectionHitarea; |
|||
ofVec2f clickPosition; |
|||
|
|||
vector<ofxCircleJoint> projectionMappingJoints; |
|||
vector<ofxCircleJoint> textureMappingJoints; |
|||
|
|||
bool bTextureMappingJointSelected; |
|||
bool bProjectionMappingJointSelected; |
|||
bool bTextureDragging; |
|||
bool bProjectionDragging; |
|||
bool bSelected; |
|||
|
|||
bool isProjectionMappingJointSelected(); |
|||
bool isTextureMappingJointSelected(); |
|||
bool projectionAreaExists(); |
|||
bool textureAreaExists(); |
|||
|
|||
void addProjectionMappingJoint(); |
|||
void addNumProjectionMappingJoints(int num); |
|||
void addTextureMappingJoint(); |
|||
void addNumTextureMappingJoints(int num); |
|||
void dragTextureArea(); |
|||
void dragProjectionArea(); |
|||
void stopDrag(); |
|||
}; |
|||
|
|||
#endif |
Loading…
Reference in new issue