summaryrefslogtreecommitdiff
path: root/morpher
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2012-03-31 16:44:02 +0100
committerTim Redfern <tim@eclectronics.org>2012-03-31 16:44:02 +0100
commit0e8f0361c1068eb4c2f634dfcf4e1762d87f40d2 (patch)
tree96a4eb154c1ac2dbe5ad4e04d4e33b281832e441 /morpher
parent623e1924aeea83ea70c8ae7f645b067f17a293ea (diff)
implementing trap door
Diffstat (limited to 'morpher')
-rw-r--r--morpher/morpher.cbp8
-rw-r--r--morpher/morpher.layout20
-rw-r--r--morpher/src/morphmesh.cpp27
-rw-r--r--morpher/src/morphmesh.h21
-rw-r--r--morpher/src/testApp.cpp5
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);