#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; 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() ); if ( bTextureDragging ) { ofVec2f curPos = ofVec2f(x, y); ofVec2f dist = curPos - clickPosition; 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) { 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; igetVertex(i); } updateProjectionHitarea(); ofVec2f textureSize = ofVec2f(surface->getTexture()->getWidth(), surface->getTexture()->getHeight()); for ( int i=0; igetTexCoord(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; igetVertex(projectionMappingJoints.size()-1); updateProjectionHitarea(); } void ofxSurfaceGui::addNumProjectionMappingJoints(int num) { for ( int i=0; igetTexture()->getWidth(), surface->getTexture()->getHeight()); textureMappingJoints.back().position = surface->getTexCoord(textureMappingJoints.size()-1) * textureSize; updateTextureHitarea(); } void ofxSurfaceGui::addNumTextureMappingJoints(int num) { for ( int i=0; i 2 ) { return true; } else { return false; } } bool ofxSurfaceGui::textureAreaExists() { if ( textureHitarea.size() > 2 ) { return true; } else { return false; } }