void ofxTLFlags::draw(){ if(bounds.height < 2){ return; } ofPushStyle(); ofxTLBangs::draw(); ofFill(); ofSetLineWidth(5); for(int i = keyframes.size()-1; i >= 0; i--){ ofxTLFlag* key = (ofxTLFlag*)keyframes[i]; if(isKeyframeIsInBounds(key)){ int screenX = millisToScreenX(key->time); ofSetColor(timeline->getColors().backgroundColor); int textHeight = bounds.y + 10 + ( (20*i) % int(MAX(bounds.height-15, 15))); key->display = ofRectangle(MIN(screenX+3, bounds.getMaxX() - key->textField.bounds.width), textHeight-10, 100, 15); ofRect(key->display); ofSetColor(timeline->getColors().textColor); key->textField.bounds.x = key->display.x; key->textField.bounds.y = key->display.y; key->textField.draw(); } } ofPopStyle(); }
void ofxTLKeyframes::recomputePreviews(){ preview.clear(); // cout << "ofxTLKeyframes::recomputePreviews " << endl; // if(keyframes.size() == 0 || keyframes.size() == 1){ // preview.addVertex(ofPoint(bounds.x, bounds.y + bounds.height - sampleAtPercent(.5f)*bounds.height)); // preview.addVertex(ofPoint(bounds.x+bounds.width, bounds.y + bounds.height - sampleAtPercent(.5f)*bounds.height)); // } // else{ for(int p = bounds.getMinX(); p <= bounds.getMaxX(); p+=2){ preview.addVertex(p, bounds.y + bounds.height - sampleAtPercent(screenXtoNormalizedX(p)) * bounds.height); } // } // int size = preview.getVertices().size(); preview.simplify(); //cout << "simplify pre " << size << " post: " << preview.getVertices().size() << " dif: " << (size - preview.getVertices().size()) << endl; ofVec2f lastPoint; keyPoints.clear(); for(int i = 0; i < keyframes.size(); i++){ if(!isKeyframeIsInBounds(keyframes[i])){ continue; } ofVec2f screenpoint = screenPositionForKeyframe(keyframes[i]); if(lastPoint.squareDistance(screenpoint) > 5*5){ keyPoints.push_back(screenpoint); } lastPoint = screenpoint; } shouldRecomputePreviews = false; }
void ofxTLKeyframes::draw(){ if(bounds.width == 0 || bounds.height < 2){ return; } if(shouldRecomputePreviews || viewIsDirty){ recomputePreviews(); } ofPushStyle(); //draw current value indicator as a big transparent rectangle ofSetColor(timeline->getColors().disabledColor, 30); float currentPercent = sampleAtTime(timeline->getCurrentTimeMillis()); ofFill(); ofRect(bounds.x, bounds.getMaxY(), bounds.width, -bounds.height*currentPercent); //***** DRAW KEYFRAME LINES ofSetColor(timeline->getColors().keyColor); ofNoFill(); preview.draw(); //**** DRAW KEYFRAME DOTS //**** HOVER FRAME if(hoverKeyframe != NULL){ ofPushStyle(); ofFill(); ofSetColor(timeline->getColors().highlightColor); ofVec2f hoverKeyPoint = screenPositionForKeyframe( hoverKeyframe ); ofCircle(hoverKeyPoint.x, hoverKeyPoint.y, 6); ofPopStyle(); } //**** ALL CACHED VISIBLE KEYS ofSetColor(timeline->getColors().textColor); ofNoFill(); for(int i = 0; i < keyPoints.size(); i++){ ofRect(keyPoints[i].x-1, keyPoints[i].y-1, 3, 3); } //**** SELECTED KEYS ofSetColor(timeline->getColors().textColor); ofFill(); for(int i = 0; i < selectedKeyframes.size(); i++){ if(isKeyframeIsInBounds(selectedKeyframes[i])){ ofVec2f screenpoint = screenPositionForKeyframe(selectedKeyframes[i]); float keysValue = ofMap(selectedKeyframes[i]->value, 0, 1.0, valueRange.min, valueRange.max, true); if(keysAreDraggable){ string frameString = timeline->formatTime(selectedKeyframes[i]->time); timeline->getFont().drawString(ofToString(keysValue, 4), screenpoint.x+5, screenpoint.y-5); } ofCircle(screenpoint.x, screenpoint.y, 4); } } ofPopStyle(); }
void ofxTLKeyframes::getSnappingPoints(set<unsigned long long>& points){ for(int i = 0; i < keyframes.size(); i++){ if (isKeyframeIsInBounds(keyframes[i]) && !isKeyframeSelected(keyframes[i])) { points.insert(keyframes[i]->time); } } }
//draw your keyframes into bounds void ofxTLEmptyKeyframes::draw(){ ofPushStyle(); ofFill(); //show the current color as background based on the playhead position ofSetColor(getCurrentColor(), 100); ofDrawRectangle(bounds); for(int i = 0; i < keyframes.size(); i++){ //make sure it's on screen if(isKeyframeIsInBounds(keyframes[i])){ //we know the type because we created it in newKeyframe() //so we can safely cast ofxTLEmptyKeyframe* emptyKeyframe = (ofxTLEmptyKeyframe*)keyframes[i]; if(hoverKeyframe == emptyKeyframe){ ofSetColor(timeline->getColors().highlightColor); } else if(isKeyframeSelected(emptyKeyframe)){ ofSetColor(timeline->getColors().textColor); } else{ ofSetColor(timeline->getColors().keyColor); } ofVec2f screenPoint = screenPositionForKeyframe(emptyKeyframe); ofDrawCircle(screenPoint, 7); ofSetColor(emptyKeyframe->color); ofDrawCircle(screenPoint, 5); } } ofPopStyle(); }
void ofxTLCameraTrack::draw(){ //draw your keyframes into bounds ofPushStyle(); if(lockCameraToTrack){ ofSetColor(timeline->getColors().keyColor, 40*(sin(ofGetElapsedTimef()*5)*.5+.5)+25); ofFill(); ofRect(bounds); } ofSetColor(timeline->getColors().keyColor); ofNoFill(); // for(int i = 0; i < track.getSamples().size(); i++){ for(int i = 0; i < keyframes.size(); i++){ if(!isKeyframeIsInBounds(keyframes[i])){ continue; } ofxTLCameraFrame* sample =(ofxTLCameraFrame*)keyframes[i]; float screenX = millisToScreenX(keyframes[i]->time); float screenY = bounds.y; ofPoint screenPoint = ofPoint(screenX,screenY); // if(keyframes[i] == selectedKeyframe){ if(isKeyframeSelected(sample)){ if(sample->easeInSelected){ ofSetColor(timeline->getColors().highlightColor); draweEase(sample->easeIn, screenPoint, true); ofSetColor(timeline->getColors().keyColor); draweEase(sample->easeOut, screenPoint, false); } else { ofSetColor(timeline->getColors().keyColor); draweEase(sample->easeIn, screenPoint, true); ofSetColor(timeline->getColors().highlightColor); draweEase(sample->easeOut,screenPoint, false); } } else{ ofSetColor(timeline->getColors().keyColor); draweEase(sample->easeIn, screenPoint, true); draweEase(sample->easeOut, screenPoint, false); } } ofFill(); ofSetColor(timeline->getColors().highlightColor); for(int i = 0; i < selectedKeyframes.size(); i++){ float screenX = millisToScreenX( selectedKeyframes[i]->time ); float screenY = bounds.y+bounds.height/2; ofCircle(screenX, screenY, 4); } ofPopStyle(); }
void ofxTLSwitches::getSnappingPoints(set<unsigned long>& points){ for(int i = 0; i < keyframes.size(); i++){ ofxTLSwitch* switchKey = (ofxTLSwitch*)keyframes[i]; if (isKeyframeIsInBounds(switchKey) && !isKeyframeSelected(switchKey) && !switchKey->startSelected && !switchKey->endSelected) { points.insert(switchKey->timeRange.min); points.insert(switchKey->timeRange.max); } } }
void ofxTLFileSelectFlags::drawModalContent() { for(int i = keyframes.size()-1; i >= 0; i--) { ofxTLFileSelectFlag* key = (ofxTLFileSelectFlag*)keyframes[i]; if(isKeyframeIsInBounds(key)) { key->flagButton->draw(); } } }
ofxTLKeyframe* ofxTLKeyframes::keyframeAtScreenpoint(ofVec2f p){ if(!bounds.inside(p)){ return NULL; } float minDistanceSquared = 15*15; for(int i = 0; i < keyframes.size(); i++){ if(isKeyframeIsInBounds(keyframes[i]) && p.squareDistance(screenPositionForKeyframe(keyframes[i])) < minDistanceSquared) { return keyframes[i]; } } return NULL; }
//draw your keyframes into bounds void ofxTLLFO::draw(){ //we draw keys our own way //ofxTLKeyframes::draw(); if(bounds.width == 0 || bounds.height < 2){ return; } if(shouldRecomputePreviews || viewIsDirty){ recomputePreviews(); } ofSetColor(timeline->getColors().disabledColor, 30); float currentPercent = sampleAtTime(currentTrackTime()); ofFill(); ofRect(bounds.x, bounds.getMaxY(), bounds.width, -bounds.height*currentPercent); ofPushStyle(); ofSetColor(timeline->getColors().keyColor); preview.draw(); for(int i = 0; i < keyframes.size(); i++){ //make sure it's on screen if(isKeyframeIsInBounds(keyframes[i])){ //we know the type because we created it in newKeyframe() //so we can safely cast ofxTLLFOKey* lfoKey = (ofxTLLFOKey*)keyframes[i]; if(isKeyframeSelected(keyframes[i])){ ofSetLineWidth(2); ofSetColor(timeline->getColors().textColor); } else if(keyframes[i] == hoverKeyframe){ ofSetLineWidth(4); ofSetColor(timeline->getColors().highlightColor); } else{ ofSetLineWidth(4); ofSetColor(timeline->getColors().keyColor); } float screenX = millisToScreenX(keyframes[i]->time); ofLine(screenX, bounds.y, screenX, bounds.y+bounds.height); } } ofPopStyle(); }
void ofxTLBangs::draw(){ if(bounds.height < 2){ return; } ofPushStyle(); ofFill(); //float currentPercent = powf(MIN(ofGetElapsedTimef() - lastBangTime, .5), 2); float currentPercent = powf(ofMap(ofGetElapsedTimef() - lastBangTime, 0, .5, 1.0, 0,true), 2); if(currentPercent > 0){ ofSetColor(timeline->getColors().disabledColor, 100*(currentPercent)); ofFill(); ofRect(bounds.x, bounds.y, bounds.width, bounds.height); } for(int i = keyframes.size()-1; i >= 0; i--){ if(!isKeyframeIsInBounds(keyframes[i])){ continue; } //int screenX = normalizedXtoScreenX(keyframes[i]->position.x); int screenX = millisToScreenX(keyframes[i]->time); if(isKeyframeSelected(keyframes[i])){ ofSetLineWidth(2); ofSetColor(timeline->getColors().textColor); } else if(keyframes[i] == hoverKeyframe){ ofSetLineWidth(4); ofSetColor(timeline->getColors().highlightColor); } else{ ofSetLineWidth(4); ofSetColor(timeline->getColors().keyColor); } ofLine(screenX, bounds.y, screenX, bounds.y+bounds.height); } ofPopStyle(); }
void ofxTLFileSelectFlags::draw() { if(bounds.height < 2){ return; } ofPushStyle(); ofxTLBangs::draw(); ofFill(); ofSetLineWidth(5); for(int i = keyframes.size()-1; i >= 0; i--){ ofxTLFileSelectFlag* key = (ofxTLFileSelectFlag*)keyframes[i]; if(isKeyframeIsInBounds(key)){ int screenX = millisToScreenX(key->time); int textHeight = bounds.y + 10 + ( (20*i) % int(MAX(bounds.height-15, 15))); // ofSetColor(timeline->getColors().backgroundColor); // key->display = ofRectangle(MIN(screenX+3, bounds.getMaxX() - key->textField.bounds.width), // textHeight-10, 180, 30); // ofRect(key->display); // // ofSetColor(timeline->getColors().textColor); int x = MIN(screenX+3, bounds.getMaxX());// - key->textField.bounds.width); int y = textHeight - 10; //key->textField.draw(); //DatGUI key->flagButton->setPosition(x,y); key->flagButton->draw(); } } ofPopStyle(); }
void ofxTLFileSelectFlags::update() { ofxTLBangs::update(); // if (enteringText) cout << "TLDropDown :: Editing Text : " << ofGetElapsedTimef() << endl; for(int i = keyframes.size()-1; i >= 0; i--) { ofxTLFileSelectFlag* key = (ofxTLFileSelectFlag*)keyframes[i]; if(isKeyframeIsInBounds(key)) { key->flagButton->update(true); /* if(timeline->isModal()) { key->menu->update(true); } else { key->menu->update(false); } */ } } }
void ofxTLColorTrack::draw() { if(bounds.height == 0) { return; } if(viewIsDirty || shouldRecomputePreviews) { updatePreviewPalette(); } if(keyframes.size() == 0) { ofPushStyle(); ofSetColor(defaultColor); ofFill(); ofRect(bounds); ofPopStyle(); } else if(keyframes.size() == 1) { ofPushStyle(); ofxTLColorSample* s = (ofxTLColorSample*)keyframes[0]; ofSetColor(s->color); ofFill(); ofRect(bounds); ofPopStyle(); } else { previewPalette.draw(bounds); } for(int i = 0; i < keyframes.size(); i++) { if(!isKeyframeIsInBounds(keyframes[i])) { continue; } float screenX = millisToScreenX(keyframes[i]->time); ofPoint a = ofPoint(screenX-10,bounds.y); ofPoint b = ofPoint(screenX+10,bounds.y); ofPoint c = ofPoint(screenX,bounds.y+10); ofPushStyle(); ofFill(); ofxTLColorSample* s = (ofxTLColorSample*)keyframes[i]; ofSetColor(s->color); ofTriangle(a,b,c); ofNoFill(); ofSetColor(s->color.getInverted()); ofSetLineWidth(1); ofTriangle(a,b,c); if(keyframes[i] == hoverKeyframe) { ofSetColor(timeline->getColors().highlightColor); ofSetLineWidth(3); } else if(isKeyframeSelected(keyframes[i])) { ofSetColor(timeline->getColors().textColor); ofSetLineWidth(2); } else { ofSetColor(s->color.getInverted()); } ofLine(c, ofVec2f(screenX, bounds.getMaxY())); ofPopStyle(); } }