#include "chainImage.h" #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) void chainImage::init(ofPoint _linkPos,float _linkScale,float _linkRot){ linkPos=_linkPos; linkScale=_linkScale; linkRot=_linkRot; setAnchorPercent(0.5,0.5); } void chainImage::start(){ transition=0.0f; time=ofGetElapsedTimef(); setUseTexture(true); scale=linkScale; } bool chainImage::update(float decayRatio){ scale*=decayRatio; transition=-(scale-linkScale)/(linkScale-(linkScale*link->linkScale)); if (scale>linkScale*link->linkScale) return false; else { transition = 1.0f; return true; } } ofVec3f chainImage::getTransform(){ ofVec3f _scaledTarget = link->linkPos * linkScale; return linkPos + ( _scaledTarget * transition ); } float chainImage::getScale(){ return scale; } void chainImage::makeThumbnail(){ thumbnail=(const ofImage)*this; //copy the ofImage itself float thumbheight=ofGetHeight()*THUMB_BORDER_RATIO; float thumbwidth=(thumbnail.getWidth()/thumbnail.getHeight())*thumbheight; float borderwidth=ofGetHeight()*(1.0-THUMB_BORDER_RATIO)*0.5; printf("Rescaling: %fx%f to %fx%f for screen %fx%f, border %f\n", thumbnail.getWidth(),thumbnail.getHeight(), thumbwidth,thumbheight, (float)ofGetWidth(),(float)ofGetHeight(), borderwidth); thumbnail.resize(thumbwidth,thumbheight); thumbnail.setAnchorPoint(thumbnail.getWidth()/2,thumbnail.getHeight()/2); } void chainImage::drawChain(float fadeIn){ glPushMatrix(); ofDisableAlphaBlending(); ofSetColor(255,255,255,255); draw(0,0,getWidth(),getHeight()); glTranslatef(linkPos.x,linkPos.y,0); glScalef(linkScale,linkScale,linkScale); ofEnableAlphaBlending(); ofSetColor(255,255,255,255*min(1.0,transition/fadeIn)); link->draw(0,0,link->getWidth(),link->getHeight()); glPopMatrix(); } void chainImageSet::drawGui(){ float t_xoffs=0.0; float borderwidth=ofGetHeight()*(1.0-THUMB_BORDER_RATIO)*0.5; //draw each image, outlined for(std::list::iterator ii=images.begin(); ii != images.end(); ii++){ float thumbx=ii->thumbnail.getWidth()/2; float thumby=ii->thumbnail.getHeight()/2; float thumbscale=ii->thumbnail.getWidth()/ii->getWidth(); //why do I have to set this every time?? ii->thumbnail.setAnchorPercent(0.5,0.5); ii->thumbnail.draw( t_xoffs+borderwidth+thumbx, borderwidth+thumby, ii->thumbnail.getWidth(), ii->thumbnail.getHeight() ); ofSetColor(255,255,255); ofDrawLine(t_xoffs+borderwidth,borderwidth, t_xoffs+borderwidth+ii->thumbnail.getWidth(),borderwidth); ofDrawLine(t_xoffs+borderwidth+ii->thumbnail.getWidth(),borderwidth, t_xoffs+borderwidth+ii->thumbnail.getWidth(),borderwidth+ii->thumbnail.getHeight()); ofDrawLine(t_xoffs+borderwidth+ii->thumbnail.getWidth(),borderwidth+ii->thumbnail.getHeight(), t_xoffs+borderwidth,borderwidth+ii->thumbnail.getHeight()); ofDrawLine(t_xoffs+borderwidth,borderwidth+ii->thumbnail.getHeight(), t_xoffs+borderwidth,borderwidth); if (ii->link){ float subpictx=t_xoffs+borderwidth+thumbx+(ii->linkPos.x*thumbscale); float subpicty=borderwidth+thumby+(ii->linkPos.y*thumbscale); ofDrawLine( subpictx, subpicty, t_xoffs+(borderwidth*3)+ii->thumbnail.getWidth(), borderwidth+thumby ); //printf("Sub image: centre at %f,%f \n",ii->link->thumbnail.getAnchorPoint().x,ii->link->thumbnail.getAnchorPoint().y); ii->link->thumbnail.setAnchorPercent(0.5,0.5); ii->link->thumbnail.draw( subpictx, subpicty, ii->link->thumbnail.getWidth()*ii->linkScale, ii->link->thumbnail.getHeight()*ii->linkScale ); ofPoint p1=ofPoint( subpictx-(ii->link->thumbnail.getWidth()*ii->linkScale*0.5), subpicty-(ii->link->thumbnail.getHeight()*ii->linkScale*0.5)); ofPoint p2=ofPoint( subpictx+(ii->link->thumbnail.getWidth()*ii->linkScale*0.5), subpicty-(ii->link->thumbnail.getHeight()*ii->linkScale*0.5)); ofPoint p3=ofPoint( subpictx+(ii->link->thumbnail.getWidth()*ii->linkScale*0.5), subpicty+(ii->link->thumbnail.getHeight()*ii->linkScale*0.5)); ofPoint p4=ofPoint( subpictx-(ii->link->thumbnail.getWidth()*ii->linkScale*0.5), subpicty+(ii->link->thumbnail.getHeight()*ii->linkScale*0.5)); ofDrawLine(p1,p2); ofDrawLine(p2,p3); ofDrawLine(p3,p4); ofDrawLine(p4,p1); } t_xoffs+=ii->thumbnail.getWidth()+(borderwidth*2) ; } } bool chainImageSet::add(std::string filename,glm::vec2 pos){ printf("Dropped file: %s at %f,%f \n",filename.c_str(),pos.x,pos.y); /* attempt to add file to chain. find if file exists in data folder if not make a symbolic link */ chainImage image; if (image.load(filename)){ image.makeThumbnail(); //could there be a way to load without committing the texture image.setUseTexture(false); image.init(ofPoint(0,0), currentDefaultImageRatio, 0 //default rotation ); printf("Loaded file: %s at %f,%f \n",filename.c_str(),pos.x,pos.y); images.push_back(image); (*images.rbegin()).link=&(*images.begin()); printf("Linked: %s to %s\n", images.rbegin()->filename.c_str(), images.begin()->filename.c_str()); if (images.size()>1){ (++images.rbegin())->link=&(*(images.rbegin())); printf("Linked: %s to %s\n", (++images.rbegin())->filename.c_str(), images.rbegin()->filename.c_str()); } return true; } printf("Could not load file: %s \n",filename.c_str()); return false; }