summaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorTim Redfern <tim@getdrop.com>2017-10-13 17:20:53 +0100
committerTim Redfern <tim@getdrop.com>2017-10-13 17:20:53 +0100
commit5116dea8815de81ddaef299fdcae15f56ae3a87b (patch)
tree815f04c61b88d2a7e7a612cba194ec8ae0c136ce /gui
parent182049bfe89913be4149b3b82ec1154107438406 (diff)
heisenbug
Diffstat (limited to 'gui')
-rw-r--r--gui/src/chainImage.cpp107
-rw-r--r--gui/src/chainImage.h7
-rw-r--r--gui/src/chainImageSet.cpp27
-rw-r--r--gui/src/chainImageSet.h2
-rw-r--r--gui/src/ofApp.cpp1
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;