summaryrefslogtreecommitdiff
path: root/morpher/src
diff options
context:
space:
mode:
Diffstat (limited to 'morpher/src')
-rw-r--r--morpher/src/morphmesh.cpp27
-rw-r--r--morpher/src/morphmesh.h21
-rw-r--r--morpher/src/testApp.cpp5
3 files changed, 38 insertions, 15 deletions
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);