diff options
| author | Tim Redfern <tim@eclectronics.org> | 2012-04-06 00:00:16 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2012-04-06 00:00:16 +0100 |
| commit | adc1fe0182495151eba174f7ab5b99a900e10b5e (patch) | |
| tree | 2b7baf06b652f8191d999ce10c1a1fb1ac1137c4 /morpher/src/morphmesh.cpp | |
| parent | 13efc34b839db4f16fcfb4ea0aa3f768f144cd65 (diff) | |
changed morphmesh to use associative keys for targets
Diffstat (limited to 'morpher/src/morphmesh.cpp')
| -rw-r--r-- | morpher/src/morphmesh.cpp | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/morpher/src/morphmesh.cpp b/morpher/src/morphmesh.cpp index 77cc8c9..5fc7182 100644 --- a/morpher/src/morphmesh.cpp +++ b/morpher/src/morphmesh.cpp @@ -1,11 +1,14 @@ #include "morphmesh.h" morphmesh::morphmesh() -{} - +{ + loaded=false; +} + morphmesh::morphmesh(string filename) { - loadfile(filename); + morphmesh(); + loadMesh(filename); } morphmesh::~morphmesh() @@ -16,13 +19,17 @@ morphmesh::~morphmesh() int morphmesh::getNumTargets(){ return morphs.size(); } - +void morphmesh::draw() { + draw(0); +} void morphmesh::draw(int target){ clearVertices(); - addVertices(morphs[target]); + map<string,vector<ofVec3f> >::iterator it=morphs.begin(); + for ( int i=0;i<target;i++ ) it++; + addVertices(it->second); ofMesh::draw(); } -void morphmesh::draw(const vector<int>& targets, const vector<float>& weights){ +void morphmesh::draw(const vector<string>& targets, const vector<float>& weights){ clearVertices(); //normalise weights int targetsNum=min(targets.size(),morphs.size()); @@ -30,7 +37,7 @@ void morphmesh::draw(const vector<int>& targets, const vector<float>& weights){ for (int i=0;i<targetsNum;i++) totalWeights+=weights[i]; float weightFactor=1.0/totalWeights; float bx,by,bz; - for (int j=0;j<morphs[0].size();j++) { + for (int j=0;j<morphs[targets[0]].size();j++) { bx=by=bz=0; for (int i=0;i<targetsNum;i++) { bx+=morphs[targets[i]][j].x*weights[i]; @@ -42,8 +49,8 @@ void morphmesh::draw(const vector<int>& targets, const vector<float>& weights){ ofMesh::draw(); } -bool morphmesh::loadfile(string filename){ - bool loaded=false; +bool morphmesh::loadMesh(string filename){ + loaded=false; ofxXmlSettings XML; if( !XML.loadFile(filename) ){ printf("unable to load %s check data/ folder\n",filename.c_str()); @@ -51,11 +58,13 @@ bool morphmesh::loadfile(string filename){ if(XML.pushTag("Oak3DModelDocument")) { if(XML.pushTag("MeshList")) { int numMeshes=XML.getNumTags("Mesh"); + vector<string> meshnames; + for (int i=0;i<numMeshes;i++) meshnames.push_back(XML.getAttribute("Mesh","Name","none",i)); for (int i=0;i<numMeshes;i++) { XML.pushTag("Mesh",i); if (XML.pushTag("AttributeList")) { vector<ofVec3f> verts; - + string vertstring=XML.getAttribute("Attribute","Data","none",0); stringstream ss(vertstring); istream_iterator<string> begin(ss); @@ -64,11 +73,11 @@ bool morphmesh::loadfile(string filename){ for (int j=0;j<vstrings.size();j+=3) { verts.push_back(ofVec3f(ofToFloat(vstrings[j]),ofToFloat(vstrings[j+1]),ofToFloat(vstrings[j+2]))); } - morphs.push_back(verts); - + morphs[meshnames[i]]=verts; + if (i==0) { addVertices(verts); - + vector<ofVec3f> norms; string normstring=XML.getAttribute("Attribute","Data","none",1); stringstream ns(normstring); @@ -79,7 +88,7 @@ bool morphmesh::loadfile(string filename){ norms.push_back(ofVec3f(ofToFloat(nstrings[j]),ofToFloat(nstrings[j+1]),ofToFloat(nstrings[j+2]))); } addNormals(norms); - + vector<ofVec2f> texcords; string texstring=XML.getAttribute("Attribute","Data","none",2); stringstream ts(texstring); @@ -90,9 +99,9 @@ bool morphmesh::loadfile(string filename){ texcords.push_back(ofVec2f(ofToFloat(tstrings[j]),ofToFloat(tstrings[j+1]))); } addTexCoords(texcords); - + XML.popTag(); - + if (XML.pushTag("IndexList")) { vector<ofIndexType> faces; string facestring=XML.getAttribute("Index","Data","none",0); @@ -120,4 +129,9 @@ bool morphmesh::loadfile(string filename){ XML.popTag(); } return loaded; -}
\ No newline at end of file +} + +bool morphmesh::isLoaded() +{ + return loaded; +} |
