diff options
Diffstat (limited to 'morpher')
| -rw-r--r-- | morpher/morpher.cbp | 8 | ||||
| -rw-r--r-- | morpher/morpher.layout | 20 | ||||
| -rw-r--r-- | morpher/src/morphmesh.cpp | 27 | ||||
| -rw-r--r-- | morpher/src/morphmesh.h | 21 | ||||
| -rw-r--r-- | morpher/src/testApp.cpp | 5 |
5 files changed, 60 insertions, 21 deletions
diff --git a/morpher/morpher.cbp b/morpher/morpher.cbp index 7b45ba2..26a8826 100644 --- a/morpher/morpher.cbp +++ b/morpher/morpher.cbp @@ -45,8 +45,12 @@ <Unit filename="src/morphmesh.h"> <Option virtualFolder="src/" /> </Unit> - <Unit filename="src/normBindTexture.cpp" /> - <Unit filename="src/normBindTexture.h" /> + <Unit filename="src/normBindTexture.cpp"> + <Option virtualFolder="src/" /> + </Unit> + <Unit filename="src/normBindTexture.h"> + <Option virtualFolder="src/" /> + </Unit> <Unit filename="src/testApp.cpp"> <Option virtualFolder="src/" /> </Unit> diff --git a/morpher/morpher.layout b/morpher/morpher.layout index ca95c9c..e0a0550 100644 --- a/morpher/morpher.layout +++ b/morpher/morpher.layout @@ -1,10 +1,22 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <CodeBlocks_layout_file> <ActiveTarget name="Debug" /> - <File name="src/morphmesh.h" open="0" top="0" tabpos="0"> - <Cursor position="159" topLine="0" /> + <File name="addons.make" open="1" top="0" tabpos="8"> + <Cursor position="14" topLine="0" /> </File> - <File name="src/testApp.h" open="0" top="0" tabpos="0"> - <Cursor position="59" topLine="0" /> + <File name="config.make" open="1" top="0" tabpos="9"> + <Cursor position="478" topLine="0" /> + </File> + <File name="src/morphmesh.cpp" open="1" top="0" tabpos="5"> + <Cursor position="245" topLine="0" /> + </File> + <File name="src/morphmesh.h" open="1" top="1" tabpos="4"> + <Cursor position="333" topLine="4" /> + </File> + <File name="src/testApp.cpp" open="1" top="0" tabpos="6"> + <Cursor position="460" topLine="0" /> + </File> + <File name="src/testApp.h" open="1" top="0" tabpos="7"> + <Cursor position="597" topLine="0" /> </File> </CodeBlocks_layout_file> diff --git a/morpher/src/morphmesh.cpp b/morpher/src/morphmesh.cpp index c617f6f..77cc8c9 100644 --- a/morpher/src/morphmesh.cpp +++ b/morpher/src/morphmesh.cpp @@ -1,8 +1,11 @@ #include "morphmesh.h" morphmesh::morphmesh() +{} + +morphmesh::morphmesh(string filename) { - //ctor + loadfile(filename); } morphmesh::~morphmesh() @@ -11,28 +14,28 @@ morphmesh::~morphmesh() } int morphmesh::getNumTargets(){ - return targets.size(); + return morphs.size(); } void morphmesh::draw(int target){ clearVertices(); - addVertices(targets[target]); + addVertices(morphs[target]); ofMesh::draw(); } -void morphmesh::draw(const vector<float>& targetBlend){ +void morphmesh::draw(const vector<int>& targets, const vector<float>& weights){ clearVertices(); //normalise weights - int weightsNum=min(targetBlend.size(),targets.size()); + int targetsNum=min(targets.size(),morphs.size()); float totalWeights=0; - for (int i=0;i<weightsNum;i++) totalWeights+=targetBlend[i]; + for (int i=0;i<targetsNum;i++) totalWeights+=weights[i]; float weightFactor=1.0/totalWeights; float bx,by,bz; - for (int j=0;j<targets[0].size();j++) { + for (int j=0;j<morphs[0].size();j++) { bx=by=bz=0; - for (int i=0;i<weightsNum;i++) { - bx+=targets[i][j].x*targetBlend[i]; - by+=targets[i][j].y*targetBlend[i]; - bz+=targets[i][j].z*targetBlend[i]; + for (int i=0;i<targetsNum;i++) { + bx+=morphs[targets[i]][j].x*weights[i]; + by+=morphs[targets[i]][j].y*weights[i]; + bz+=morphs[targets[i]][j].z*weights[i]; } addVertex(ofVec3f(bx*weightFactor,by*weightFactor,bz*weightFactor)); } @@ -61,7 +64,7 @@ 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]))); } - targets.push_back(verts); + morphs.push_back(verts); if (i==0) { addVertices(verts); diff --git a/morpher/src/morphmesh.h b/morpher/src/morphmesh.h index 303533c..7e3cb0b 100644 --- a/morpher/src/morphmesh.h +++ b/morpher/src/morphmesh.h @@ -7,20 +7,37 @@ #include <ofMesh.h> #include <ofxXmlSettings.h> +/* +Tim Redfern, March 2012 + +Loads meshes in Oak3D XML format + +Draws blended morph targets + +Multiple meshes are loaded as morph targets + +Coords are absolute + +TODO +draw(vector<int> targets, vector<float> weights); - m + +*/ + class morphmesh : public ofMesh { public: morphmesh(); + morphmesh(string filename); virtual ~morphmesh(); bool loadfile(string filename); void draw(int target); - void draw(const vector<float>& targetBlend); + void draw(const vector<int>& targets, const vector<float>& weights); int getNumTargets(); protected: private: //vector < <vector <ofVec3f> >targets; - vector< vector<ofVec3f> > targets; + vector< vector<ofVec3f> > morphs; }; #endif // MORPHMESH_H diff --git a/morpher/src/testApp.cpp b/morpher/src/testApp.cpp index 41b04eb..3b5779e 100644 --- a/morpher/src/testApp.cpp +++ b/morpher/src/testApp.cpp @@ -28,8 +28,11 @@ void testApp::update(){ void testApp::draw(){ //calculate morph targets float segment=(sin(ofGetElapsedTimef())*0.5)+0.5; + vector<int> targets; vector<float> weights; + targets.push_back(0); weights.push_back(segment); + targets.push_back(1); weights.push_back(1.0-segment); //printf("drawing %f %f\n",segment,1.0-segment); @@ -41,7 +44,7 @@ void testApp::draw(){ ofRotate(yr,1,0,0); ofRotate(180,1,0,0); ofScale(2.0,2.0,2.0); - mesh.draw(weights); + mesh.draw(targets,weights); ofPopMatrix(); unbindTexture(texture); |
