#include "morphmesh.h" track::track() { } /* void track::addKey(float time,float weight) { keys.push_back(key(time,weight)); } */ float track::evaluate(float time) { //interpolate key track if (time<=keys.begin()->first) return keys.begin()->second; if (time>=keys.rbegin()->first) return keys.rbegin()->second; map< float,float >::iterator key2=keys.upper_bound( time ); map< float,float >::iterator key1=key2--; float interval=key2->first-key1->first; return (((1.0-((key2->first-time)/interval))*key2->second)+((1.0-((time-key1->first)/interval))*key1->second)); } sequence::sequence(string _name,float _length,float _fadeinTime,float _fadeoutTime) { name=_name; length=_length; startTime=0; stopTime=0; fadeinTime=_fadeinTime; fadeoutTime=_fadeoutTime; active=false; } //----------------------------------------------------- // stopTime & startTime are absolute // // all other time markers are relative to the sequence // // void sequence::reset(){ active=false; fadeinTime=-1; fadeoutTime=-1; startTime=0; stopTime=0; } void sequence::start(){ reset(); active=true; startTime=ofGetElapsedTimef(); } void sequence::startAt(float time){ reset(); active=true; startTime=ofGetElapsedTimef()+time; } void sequence::stopAt(float time){ reset(); active=true; stopTime=ofGetElapsedTimef()+time; } void sequence::fadeout(float time){ if(active==true) { reset(); active=true; startTime=ofGetElapsedTimef(); fadeoutTime=0; stopTime=ofGetElapsedTimef()+time; } } void sequence::fadein(float time){ reset(); active=true; fadeinTime=time; startTime=ofGetElapsedTimef(); } void sequence::stop(){ reset(); } vector sequence::evaluate(float time){ float now=ofGetElapsedTimef(); float seqtime=time-startTime; float looptime=fmod(seqtime,length); float fadeWeight=(seqtimefadeoutTime&&fadeoutTime>-1?1.0-(seqtime/(stopTime-startTime)):1.0); vector weights; map::iterator i; for( i = tracks.begin(); i != tracks.end(); i++ ) { weights.push_back(morphWeight(i->first,(i->second.evaluate(looptime))*fadeWeight)); } return weights; } morphmesh::morphmesh() { loaded=false; /* //testing track function track testrack; testrack.keys.insert( pair(0.0,2.0) ); testrack.keys.insert( pair(1.0,4.0) ); testrack.keys.insert( pair(0.5,10.0) ); for (float f=-0.4;f<1.4;f+=0.1) { printf("%f : %f\n",f,testrack.evaluate(f)); } */ } morphmesh::morphmesh(string filename) { morphmesh(); loadMesh(filename); } int morphmesh::getNumTargets(){ return morphs.size(); } int morphmesh::getNumSequences(){ return sequences.size(); } void morphmesh::draw() { draw(0); } void morphmesh::draw(int target){ map >::iterator it=morphs.begin(); for ( int i=0;ifirst); } void morphmesh::draw(string target){ clearVertices(); addVertices(morphs[target]); ofMesh::draw(); } void morphmesh::draw(const vector& weights){ clearVertices(); //normalise weights float totalWeights=0; for (int i=0;isecond.size();j++) { bx=by=bz=0; for (int i=0;i weights; map::iterator i; for( i = sequences.begin(); i != sequences.end(); i++ ) { if (i->second.active) { vector newWeights=i->second.evaluate(time); weights.insert(weights.end(),newWeights.begin(),newWeights.end()); if (i->second.stopTime>0&&time>i->second.stopTime) i->second.active=false; } } draw(weights); } bool morphmesh::loadSeqs(string filename){ loaded=false; ofxXmlSettings XML; if( !XML.loadFile(filename) ){ printf("unable to load %s check data/ folder\n",filename.c_str()); }else{ if(XML.pushTag("Gauntletanim")) { int numSeqs=XML.getNumTags("Sequence"); vector seqnames; for (int i=0;i targnames; for (int j=0;j times; string keystring=XML.getAttribute("Keys","Times","none",0); stringstream ks(keystring); istream_iterator kbegin(ks); istream_iterator kend; vector kstrings(kbegin, kend); vector values; string valstring=XML.getAttribute("Keys","Values","none",0); stringstream vs(valstring); istream_iterator vbegin(vs); istream_iterator vend; vector vstrings(vbegin, vend); track tr; for (int k=0;k meshnames; for (int i=0;i verts; string vertstring=XML.getAttribute("Attribute","Data","none",0); stringstream ss(vertstring); istream_iterator begin(ss); istream_iterator end; vector vstrings(begin, end); for (int j=0;j norms; string normstring=XML.getAttribute("Attribute","Data","none",1); stringstream ns(normstring); istream_iterator nbegin(ns); istream_iterator nend; vector nstrings(nbegin, nend); for (int j=0;j texcords; string texstring=XML.getAttribute("Attribute","Data","none",2); stringstream ts(texstring); istream_iterator tbegin(ts); istream_iterator tend; vector tstrings(tbegin, tend); for (int j=0;j faces; string facestring=XML.getAttribute("Index","Data","none",0); stringstream fs(facestring); istream_iterator fbegin(fs); istream_iterator fend; vector fstrings(fbegin, fend); for (int j=0;j