From 1d7efc8eba12b05ad96af2c6e68ba037b2138140 Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Mon, 9 Apr 2012 22:02:25 +0100 Subject: sequence blending almost there --- morpher/src/morphmesh.cpp | 141 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 18 deletions(-) (limited to 'morpher/src/morphmesh.cpp') diff --git a/morpher/src/morphmesh.cpp b/morpher/src/morphmesh.cpp index e68e526..63d58f7 100644 --- a/morpher/src/morphmesh.cpp +++ b/morpher/src/morphmesh.cpp @@ -1,9 +1,5 @@ #include "morphmesh.h" -sequence::sequence() -{ -} - track::track() { } @@ -19,17 +15,49 @@ 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; - multimap< float,float >::iterator key2=keys.upper_bound( time ); - multimap< float,float >::iterator key1=key2--; + 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.0; + stopTime=0.0; + fadeinTime=_fadeinTime; + fadeoutTime=_fadeoutTime; + active=false; +} + +void sequence::start(){ + active=true; + startTime=ofGetElapsedTimef(); +} +void sequence::stop(){ + active=true; +} + +vector sequence::evaluate(float time){ + float seqtime=time-startTime; + float fadeWeight=(seqtimestopTime-fadeoutTime&&stopTime>0&&fadeoutTime>0?(seqtime-fadeoutTime)/(stopTime-fadeoutTime):1.0); + vector weights; + map::iterator i; + for( i = tracks.begin(); i != tracks.end(); i++ ) { + weights.push_back(morphWeight(i->first,(i->second.evaluate(seqtime))*fadeWeight)); + } + return weights; +} + + morphmesh::morphmesh() { loaded=false; - /* + + /* //testing track function track testrack; testrack.keys.insert( pair(0.0,2.0) ); @@ -38,7 +66,7 @@ morphmesh::morphmesh() for (float f=-0.4;f<1.4;f+=0.1) { printf("%f : %f\n",f,testrack.evaluate(f)); } - */ + */ } morphmesh::morphmesh(string filename) @@ -51,6 +79,9 @@ morphmesh::morphmesh(string filename) int morphmesh::getNumTargets(){ return morphs.size(); } +int morphmesh::getNumSequences(){ + return sequences.size(); +} void morphmesh::draw() { draw(0); } @@ -64,26 +95,101 @@ void morphmesh::draw(string target){ addVertices(morphs[target]); ofMesh::draw(); } -void morphmesh::draw(const vector& targets, const vector& weights){ +void morphmesh::draw(const vector& weights){ + morphWeight mw[2]; + 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(fmod(time-i->second.startTime,i->second.length)); + int nnw= newWeights.size(); //test + weights.insert(weights.end(),newWeights.begin(),newWeights.end()); + int nw= weights.size(); //test + 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 verts; - string vertstring=XML.getAttribute("Attribute","Data","none",0); stringstream ss(vertstring); istream_iterator begin(ss); -- cgit v1.2.3