diff --git a/src/ofxSurfaceGui.cpp b/src/ofxSurfaceGui.cpp index b3b881d..27e5cf0 100644 --- a/src/ofxSurfaceGui.cpp +++ b/src/ofxSurfaceGui.cpp @@ -6,6 +6,8 @@ ofxSurfaceGui::ofxSurfaceGui() mode = NONE; bProjectionMappingJointSelected = false; bTextureMappingJointSelected = false; + bTextureDragging = false; + bProjectionDragging = false; } ofxSurfaceGui::~ofxSurfaceGui() @@ -85,6 +87,15 @@ void ofxSurfaceGui::mousePressed(int x, int y, int button) 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; isetVertex(i, projectionMappingJoints[i].position); } - } + updateProjectionHitarea(); + clickPosition = curPos; + } else { + for ( int i=0; isetVertex(i, projectionMappingJoints[i].position); + updateProjectionHitarea(); + } + } // for + } // if ( bProjectionDragging } else if (mode == TEXTURE_MAPPING) { ofVec2f textureSize = ofVec2f( surface->getTexture()->getWidth(), surface->getTexture()->getHeight() ); - for ( int i=0; isetTexCoord(i, textureMappingJoints[i].position/textureSize); } - } - } + updateTextureHitarea(); + clickPosition = curPos; + } else { + for ( int i=0; isetTexCoord(i, textureMappingJoints[i].position/textureSize); + updateTextureHitarea(); + } + } // for + } // if ( bTextureDragging + } // if (mode } void ofxSurfaceGui::setMode(ofxSurfaceGui::editMode newMode) @@ -158,6 +203,7 @@ void ofxSurfaceGui::addProjectionMappingJoint() { projectionMappingJoints.push_back(ofxCircleJoint()); projectionMappingJoints.back().position = surface->getVertex(projectionMappingJoints.size()-1); + updateProjectionHitarea(); } void ofxSurfaceGui::addNumProjectionMappingJoints(int num) @@ -172,6 +218,7 @@ 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) @@ -181,6 +228,40 @@ void ofxSurfaceGui::addNumTextureMappingJoints(int num) } } +void ofxSurfaceGui::updateTextureHitarea() +{ + textureHitarea.clear(); + for ( int i=0; i projectionMappingJoints; vector textureMappingJoints; bool bTextureMappingJointSelected; bool bProjectionMappingJointSelected; + bool bTextureDragging; + bool bProjectionDragging; + bool isProjectionMappingJointSelected(); bool isTextureMappingJointSelected(); @@ -43,6 +49,11 @@ private: void addNumProjectionMappingJoints(int num); void addTextureMappingJoint(); void addNumTextureMappingJoints(int num); + void updateTextureHitarea(); + void updateProjectionHitarea(); + void dragTextureArea(); + void dragProjectionArea(); + void stopDrag(); }; #endif \ No newline at end of file