#include "Layer.h" #include "conversion.h" #include "ofAppRunner.h" #include "ofGraphics.h" #include "ofUtils.h" namespace ofxVariableLab { Layer::Layer(){ } Layer::~Layer(){ } MsdfLayer::MsdfLayer(){ } MsdfLayer::~MsdfLayer(){ } void Layer::update(){ if(isDirty){ isDirty = false; } } void MsdfLayer::draw(glm::vec3 position) const { const ofImage & atlasImage = atlas->getAtlasImage(); ofDisableAlphaBlending(); ofEnableDepthTest(); shader->begin(); shader->setUniformTexture("msdf", atlasImage.getTexture(), 0); shader->setUniform4f("fontColor", ofFloatColor::white); float pixelRange = 2; int atlas_w = atlasImage.getWidth(); int atlas_h = atlasImage.getHeight(); int atlas_x = 0; int atlas_y = 0; glm::vec2 unitRange = glm::vec2(pixelRange) / glm::vec2(atlas_w, atlas_h); shader->setUniform2f("unitRange", unitRange); shader->end(); ofPushMatrix(); //cout << "drawing letters (" << ofToString(propsBuffer.size()) << ")" << endl; for(const char c : propsBuffer[0].text){ ofxMsdfgen::GlyphGeometry gg = atlas->getGlyphGeometry(c); int x, y, w, h; gg.getBoxRect(x, y, w, h); y = atlas_h - (y + h); if(y < 0){ // FIXME: make sure this does not happen ofLogError("MsdfLayer::draw") << "y smaller 0, this is not good" << endl; } ofPushStyle(); ofNoFill(); ofSetColor(ofFloatColor(sin(ofGetElapsedTimeMicros() * 0.0001) * 0.5 + 0.5, 0, 0, 1)); double pl, pb, pr, pt, il, ib, ir, it; gg.getQuadPlaneBounds(pl, pb, pr, pt); gg.getQuadAtlasBounds(il, ib, ir, it); ofPushMatrix(); float magic = ofMap(sin(ofGetElapsedTimeMicros() * 0.000001), -1, 1, 1, 1000); ofTranslate(pr * magic, pt * magic, 0); //if(ofGetFrameNum() % 30 == 0){ //cout << "drawing letter " << c << endl //<< "\tpl: " << ofToString(pl) //<< "\tpb: " << ofToString(pb) //<< "\tpr: " << ofToString(pr) //<< "\tpt: " << ofToString(pt) //<< endl; //} ofFill(); shader->begin(); ofSetColor(ofFloatColor(1, 1, 1, 1)); atlasImage.drawSubsection(0, 0, w, h, x, y, w, h); shader->end(); ofPopMatrix(); ofPopStyle(); ofTranslate(w, 0, 0); } ofPopMatrix(); //atlasImage.draw(x, y); ofDisableDepthTest(); ofEnableAlphaBlending(); } void Layer::setProps(const Props & props){ while(propsBuffer.size() > max(0, int(settings.maxBufferSize - 1))){ propsBuffer.pop_back(); } propsBuffer.push_front(props); } void Layer::clearPropsBuffer(){ propsBuffer.clear(); } void Layer::setId(const string & id){ this->id = id; } const string & Layer::getId(){ return id; } }