diff options
Diffstat (limited to 'gui')
| -rw-r--r-- | gui/src/chainImage.cpp | 107 | ||||
| -rw-r--r-- | gui/src/chainImage.h | 7 | ||||
| -rw-r--r-- | gui/src/chainImageSet.cpp | 27 | ||||
| -rw-r--r-- | gui/src/chainImageSet.h | 2 | ||||
| -rw-r--r-- | gui/src/ofApp.cpp | 1 |
5 files changed, 113 insertions, 31 deletions
diff --git a/gui/src/chainImage.cpp b/gui/src/chainImage.cpp index d91a633..4eb0417 100644 --- a/gui/src/chainImage.cpp +++ b/gui/src/chainImage.cpp @@ -30,10 +30,48 @@ void chainImage::start(bool reverse){ */ } +void chainImage::updateRotationTimeline(){ + + rotationTimeline.clear(); + + //need to compare 5 points to generate this segment + + //quick and dirty approach, bezier handles take the slope between the + //previous and subsequent points, unless it's a horizontal turning point + + //rotation curve always starts at the origin as it's relative to where we have already rotated to + rotationTimeline.addVertex(0,0); + + ofPoint cp1,cp2,p; + + if(linked->linkRot==0.0f){ //hmm, shouldn't use float equality + cp1=ofPoint(ROTATION_BEZIER_FRACTION, 0); + } + else { + float slope=link->linkRot-linked->linkRot; + cp1=ofPoint(ROTATION_BEZIER_FRACTION,slope/ROTATION_BEZIER_FRACTION); + } + + if(link->linkRot==link->link->linkRot){ //hmm, shouldn't use float equality + cp2=ofPoint(1.0f-ROTATION_BEZIER_FRACTION, link->linkRot); + } + else { + float slope=link->link->linkRot-linkRot; + cp2=ofPoint(1.0f-ROTATION_BEZIER_FRACTION, link->linkRot); + } + + p=ofPoint(1.0f, link->linkRot); + + rotationTimeline.bezierTo(cp1,cp2,p); + +} + int chainImage::updateOutput(float decayRatio){ //where there is rotation of the link, the path needs to be rotated + updateRotationTimeline(); + path.clear(); path.addVertex(linkPos); @@ -112,7 +150,8 @@ float chainImage::getRotation(){ //when we switch image, link->linkRot becomes linkRot //linkRot is no longer seen - return linkRot+(transition*link->linkRot); //linkRot+ + //return linkRot+(transition*link->linkRot); //linkRot+ + return linkRot+rotationTimeline.getPointAtPercent(transition).y; }; void chainImage::makeThumbnail(){ thumbnail.setUseTexture(false); @@ -143,50 +182,64 @@ void chainImage::makeThumbnail(){ thumbnail.setAnchorPoint(thumbnail.getWidth()/2,thumbnail.getHeight()/2); } -void chainImage::drawChain(float fadeIn,bool additive, float intensity){ +void chainImage::drawChain(float fadeIn,bool additive,float intensity,float zoomMultiplier){ //printf("Drawing chain transition: %f\n",transition); //we are correctly geting to 1 //the transformw don't quite add up? + //we are drawing each image twice? glPushMatrix(); - if (additive){ - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - ofSetColor(255,255,255,255*(1.0f-min(1.0,transition/fadeIn))*intensity); - } - else { - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - ofSetColor(255,255,255,255*intensity); - } + if (additive){ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + ofSetColor(255,255,255,255*(1.0f-min(1.0,transition/fadeIn))*intensity); + } + else { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + ofSetColor(255,255,255,255*intensity); + } - //ofDisableAlphaBlending(); + //ofDisableAlphaBlending(); - + + + setAnchorPoint(getWidth()/2,getHeight()/2); + + //add a scale factor to the outgoing image that builds up over the transition + + glPushMatrix(); + //if this is linear we see the jump from the unaccelerated phase + //float zoomFactor=((zoomMultiplier-1.0f)*transition)+1.0f; - setAnchorPoint(getWidth()/2,getHeight()/2); + //this is worse why? + float zoomFactor=pow(zoomMultiplier,1.0f+transition); - draw(0,0,getWidth(),getHeight()); + glScalef(zoomFactor,zoomFactor,zoomFactor); - glTranslatef(linkPos.x,linkPos.y,0); + draw(0,0,getWidth(),getHeight()); - glRotatef(linkRot,0,0,1); + glPopMatrix(); - glScalef(linkScale,linkScale,linkScale); + glTranslatef(linkPos.x,linkPos.y,0); - //ofEnableAlphaBlending(); - glEnable(GL_BLEND); - - ofSetColor(255,255,255,255*min(1.0,transition/fadeIn)*intensity); + glRotatef(linkRot,0,0,1); - link->setAnchorPoint(link->getWidth()/2,link->getHeight()/2); + glScalef(linkScale,linkScale,linkScale); - link->draw(0,0,link->getWidth(),link->getHeight()); + //ofEnableAlphaBlending(); + glEnable(GL_BLEND); + + ofSetColor(255,255,255,255*min(1.0,transition/fadeIn)*intensity); + + link->setAnchorPoint(link->getWidth()/2,link->getHeight()/2); - glDisable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + link->draw(0,0,link->getWidth(),link->getHeight()); + + glDisable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPopMatrix(); } diff --git a/gui/src/chainImage.h b/gui/src/chainImage.h index 367d051..23e9338 100644 --- a/gui/src/chainImage.h +++ b/gui/src/chainImage.h @@ -8,6 +8,7 @@ #define DEFAULT_FADEIN 1.0 #define BEZIER_OUT 0.2 #define BEZIER_IN 0.5 +#define ROTATION_BEZIER_FRACTION 0.1 #define SWITCH_NONE 0 #define SWITCH_FORWARD 1 @@ -47,7 +48,9 @@ class chainImage : public ofImage{ float getScale(); float getRotation(); - void drawChain(float fadeIn=DEFAULT_FADEIN,bool additive =false, float intensity=1.0f); + void updateRotationTimeline(); + + void drawChain(float fadeIn=DEFAULT_FADEIN,bool additive =false, float intensity=1.0f, float zoomMultiplier=1.0f); ofImage thumbnail; void makeThumbnail(); @@ -57,6 +60,7 @@ class chainImage : public ofImage{ bool fromJson(Json::Value json); chainImage *link; + chainImage *linked; ofPoint linkPos; float linkScale; @@ -70,6 +74,7 @@ class chainImage : public ofImage{ float scale; ofPolyline path; + ofPolyline rotationTimeline; bool isLoaded; diff --git a/gui/src/chainImageSet.cpp b/gui/src/chainImageSet.cpp index ce977d1..e415173 100644 --- a/gui/src/chainImageSet.cpp +++ b/gui/src/chainImageSet.cpp @@ -29,7 +29,7 @@ void chainImageSet::drawOutput(){ (*currentImage)->getTransform().x*4 ); */ - glScalef(8,8,8); //easy way to avoid camera cutoff + glScalef(8,8,8); //easy way to limit camera cutoff gluLookAt( (*currentImage)->getTransform().x, (*currentImage)->getTransform().y, // i1.linkPos.y+(xform.y*intervalpoint), @@ -44,7 +44,7 @@ void chainImageSet::drawOutput(){ - (*currentImage)->drawChain(DEFAULT_FADEIN,additive,intensity); + (*currentImage)->drawChain(DEFAULT_FADEIN,additive,intensity,zoomMultiplier); } @@ -284,7 +284,15 @@ void chainImageSet::keyPressed(ofKeyEventArgs &keyargs){ else { previous--; } + + auto next=selected; + next++; + if (next==images.end()){ + next=images.begin(); + } + (*previous)->link=(*selected)->link; + (*next)->linked=&(*(*previous)); images.erase(selected); selected=previous; selected++; @@ -339,6 +347,20 @@ void chainImageSet::keyPressed(ofKeyEventArgs &keyargs){ break; } + case 'q':{ + zoomMultiplier/=1.01; + if (zoomMultiplier==1.0f) { + printf("zoomMultiplier: %f\r\n",zoomMultiplier); + } + break; + } + case 'w':{ + zoomMultiplier*=1.01; + if (zoomMultiplier==1.0f) { + printf("zoomMultiplier: %f\r\n",zoomMultiplier); + } + break; + } } } @@ -443,6 +465,7 @@ void chainImageSet::updateOutput(){ images.push_back(std::move(*i)); (*images.rbegin())->link=&(*(*images.begin())); + (*images.begin())->linked=&(*(*images.rbegin())); (*images.rbegin())->setUseTexture(true); printf("Linked: %s to %s\n", diff --git a/gui/src/chainImageSet.h b/gui/src/chainImageSet.h index b7bf868..05a7cdf 100644 --- a/gui/src/chainImageSet.h +++ b/gui/src/chainImageSet.h @@ -19,6 +19,7 @@ class chainImageSet{ dragScale=0.0f; dragRotate=0.0f; dragPoint=ofPoint(0,0); + zoomMultiplier=1.0f; } chainImageSet(const chainImageSet& mom){ chainImageSet(); @@ -55,6 +56,7 @@ class chainImageSet{ float dragScale; float dragRotate; float fitFactor; + float zoomMultiplier; std::string filename; diff --git a/gui/src/ofApp.cpp b/gui/src/ofApp.cpp index 9f29388..afdaf4f 100644 --- a/gui/src/ofApp.cpp +++ b/gui/src/ofApp.cpp @@ -231,7 +231,6 @@ void ofApp::newMidiMessage(ofxMidiMessage& msg) { void ofApp::keyPressed(ofKeyEventArgs &args){ sets[selected_set].keyPressed(args); - if(args.key == '\''){ selected_set-=1; if (selected_set<0) selected_set=sets.size()-1; |
