Skip to content

Commit 72aa6e8

Browse files
committed
Put mesh types into their own files
1 parent af80dc5 commit 72aa6e8

File tree

10 files changed

+167
-136
lines changed

10 files changed

+167
-136
lines changed

DynamicKelvinlets.xcodeproj/project.pbxproj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
94DB0D572900D4A7FBC91B4A /* ImpulseKelvinlet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 71E97097A1B27025B5CED38D /* ImpulseKelvinlet.cpp */; };
1414
A45326A57E9229CE9A63A959 /* PushKelvinlet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1131652AA8FE27683871AA9D /* PushKelvinlet.cpp */; };
1515
B8846EF8E504895A4A9EFEC0 /* ofxAssimpTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6F2EE44AD04FF549AB13699 /* ofxAssimpTexture.cpp */; };
16+
D3A299DF237B430800F777C8 /* StaticMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3A299DD237B430800F777C8 /* StaticMesh.cpp */; };
17+
D3A299E2237B435600F777C8 /* AnimatedMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3A299E0237B435600F777C8 /* AnimatedMesh.cpp */; };
1618
D4109EBB9ECF3D1E5EBD2BB3 /* Kelvinlet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFC7DE22418FA5009C3C1BF1 /* Kelvinlet.cpp */; };
1719
D538F0F93EF7718FC14A162E /* DisplacedMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1E87D9B7A53530D81C9AC60C /* DisplacedMesh.cpp */; };
1820
E4B69E200A3A1BDC003C02F2 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4B69E1D0A3A1BDC003C02F2 /* main.cpp */; };
@@ -83,6 +85,12 @@
8385
CAFE4416C77C0E19B0D25FC5 /* PushKelvinlet.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = PushKelvinlet.h; path = src/PushKelvinlet.h; sourceTree = SOURCE_ROOT; };
8486
D1B370068072AAB890CD42D2 /* pstdint.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = pstdint.h; path = ../../../addons/ofxAssimpModelLoader/libs/assimp/include/assimp/Compiler/pstdint.h; sourceTree = SOURCE_ROOT; };
8587
D39728D32374B14900FAE014 /* shaders */ = {isa = PBXFileReference; lastKnownFileType = folder; name = shaders; path = bin/data/shaders; sourceTree = SOURCE_ROOT; };
88+
D3A299DC237B42D700F777C8 /* Mesh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Mesh.h; sourceTree = "<group>"; };
89+
D3A299DD237B430800F777C8 /* StaticMesh.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = StaticMesh.cpp; sourceTree = "<group>"; };
90+
D3A299DE237B430800F777C8 /* StaticMesh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StaticMesh.h; sourceTree = "<group>"; };
91+
D3A299E0237B435600F777C8 /* AnimatedMesh.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AnimatedMesh.cpp; sourceTree = "<group>"; };
92+
D3A299E1237B435600F777C8 /* AnimatedMesh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AnimatedMesh.h; sourceTree = "<group>"; };
93+
D3A299E4237B449000F777C8 /* constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants.h; sourceTree = "<group>"; };
8694
D501EB9AF5A65F43CB972589 /* matrix3x3.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = matrix3x3.h; path = ../../../addons/ofxAssimpModelLoader/libs/assimp/include/assimp/matrix3x3.h; sourceTree = SOURCE_ROOT; };
8795
D825FF1F1EA48B305BB428B7 /* scene.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = scene.h; path = ../../../addons/ofxAssimpModelLoader/libs/assimp/include/assimp/scene.h; sourceTree = SOURCE_ROOT; };
8896
E42962AC2163EDD300A6A9E2 /* ofCamera.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ofCamera.cpp; path = ../../../libs/openFrameworks/3d/ofCamera.cpp; sourceTree = SOURCE_ROOT; };
@@ -714,6 +722,7 @@
714722
E4B69E1C0A3A1BDC003C02F2 /* src */ = {
715723
isa = PBXGroup;
716724
children = (
725+
D3A299E4237B449000F777C8 /* constants.h */,
717726
D39728D32374B14900FAE014 /* shaders */,
718727
E4B69E1D0A3A1BDC003C02F2 /* main.cpp */,
719728
E4B69E1E0A3A1BDC003C02F2 /* ofApp.cpp */,
@@ -728,6 +737,11 @@
728737
CA9637455E8EF1837290DE41 /* DisplacedMesh.h */,
729738
BFC7DE22418FA5009C3C1BF1 /* Kelvinlet.cpp */,
730739
1131652AA8FE27683871AA9D /* PushKelvinlet.cpp */,
740+
D3A299DC237B42D700F777C8 /* Mesh.h */,
741+
D3A299DD237B430800F777C8 /* StaticMesh.cpp */,
742+
D3A299DE237B430800F777C8 /* StaticMesh.h */,
743+
D3A299E0237B435600F777C8 /* AnimatedMesh.cpp */,
744+
D3A299E1237B435600F777C8 /* AnimatedMesh.h */,
731745
);
732746
path = src;
733747
sourceTree = SOURCE_ROOT;
@@ -842,12 +856,14 @@
842856
E4B69E210A3A1BDC003C02F2 /* ofApp.cpp in Sources */,
843857
94DB0D572900D4A7FBC91B4A /* ImpulseKelvinlet.cpp in Sources */,
844858
D538F0F93EF7718FC14A162E /* DisplacedMesh.cpp in Sources */,
859+
D3A299DF237B430800F777C8 /* StaticMesh.cpp in Sources */,
845860
F7D4F1045C3F5CE0000DE92F /* Material.cpp in Sources */,
846861
D4109EBB9ECF3D1E5EBD2BB3 /* Kelvinlet.cpp in Sources */,
847862
A45326A57E9229CE9A63A959 /* PushKelvinlet.cpp in Sources */,
848863
3B8120368B4FCCD80883BAF3 /* ofxAssimpAnimation.cpp in Sources */,
849864
483FA4F6D5FA6422C559B1F5 /* ofxAssimpMeshHelper.cpp in Sources */,
850865
8DED5056525646FA71980866 /* ofxAssimpModelLoader.cpp in Sources */,
866+
D3A299E2237B435600F777C8 /* AnimatedMesh.cpp in Sources */,
851867
B8846EF8E504895A4A9EFEC0 /* ofxAssimpTexture.cpp in Sources */,
852868
);
853869
runOnlyForDeploymentPostprocessing = 0;

src/AnimatedMesh.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include "AnimatedMesh.h"
2+
#include "constants.h"
3+
4+
AnimatedMesh::AnimatedMesh(const ofxAssimpModelLoader& loaderMesh, const function<void(const vector<glm::vec3>&, const vector<glm::vec3>&)>& callback):
5+
original(loaderMesh),
6+
callback(callback)
7+
{
8+
mesh.addVertices(original.getCurrentAnimatedMesh(0).getVertices());
9+
mesh.addIndices(original.getCurrentAnimatedMesh(0).getIndices());
10+
}
11+
void AnimatedMesh::update(float t) {
12+
original.update();
13+
if (currentIndex == -1) {
14+
for (int i = vertices.size()-1; i > 0; --i) {
15+
times[i] = t - (vertices.size() - i) * 0.01;
16+
vertices[i] = getOriginalVertices();
17+
}
18+
}
19+
currentIndex = (currentIndex + 1) % vertices.size();
20+
times[currentIndex] = t;
21+
vertices[currentIndex] = getOriginalVertices();
22+
23+
int prevIndex = (currentIndex - 1 + vertices.size()) % vertices.size();
24+
int twicePrevIndex = (currentIndex - 2 + vertices.size()) % vertices.size();
25+
26+
vector<glm::vec3> accelerations(vertices[currentIndex].size());
27+
for (int i = 0; i < vertices[currentIndex].size(); ++i) {
28+
auto& current = vertices[currentIndex][i];
29+
auto& prev = vertices[prevIndex][i];
30+
auto& twicePrev = vertices[twicePrevIndex][i];
31+
32+
auto currentVelocity = (current - prev)/(times[currentIndex] - times[prevIndex]);
33+
auto prevVelocity = (prev - twicePrev)/(times[prevIndex] - times[twicePrevIndex]);
34+
35+
accelerations[i] = (currentVelocity - prevVelocity)/(times[currentIndex] - times[prevIndex]);
36+
}
37+
38+
callback(vertices[currentIndex], accelerations);
39+
}
40+
void AnimatedMesh::draw() {
41+
if (USE_SHADER) {
42+
original.drawFaces();
43+
} else {
44+
mesh.draw();
45+
}
46+
}
47+
void AnimatedMesh::drawWireframe() {
48+
if (USE_SHADER) {
49+
original.drawWireframe();
50+
} else {
51+
mesh.drawWireframe();
52+
}
53+
}
54+
vector<glm::vec3>& AnimatedMesh::getVertices() {
55+
return mesh.getVertices();
56+
}
57+
vector<glm::vec3> AnimatedMesh::getOriginalVertices() {
58+
return original.getCurrentAnimatedMesh(0).getVertices();
59+
}
60+
61+
62+
AnimatedMesh::TransformFreeScene::TransformFreeScene(const ofxAssimpModelLoader& other): ofxAssimpModelLoader(other) {}
63+
void AnimatedMesh::TransformFreeScene::update() {
64+
ofxAssimpModelLoader::update();
65+
modelMeshes[0].matrix.makeIdentityMatrix();
66+
modelMatrix.makeIdentityMatrix();
67+
}

src/AnimatedMesh.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "Mesh.h"
2+
#include "ofxAssimpModelLoader.h"
3+
4+
class AnimatedMesh: public Mesh {
5+
public:
6+
AnimatedMesh(const ofxAssimpModelLoader& mesh, const function<void(const vector<glm::vec3>&, const vector<glm::vec3>&)>& callback);
7+
virtual void update(float t) override;
8+
virtual void draw() override;
9+
virtual void drawWireframe() override;
10+
virtual vector<glm::vec3>& getVertices() override;
11+
virtual vector<glm::vec3> getOriginalVertices() override;
12+
13+
private:
14+
class TransformFreeScene: public ofxAssimpModelLoader {
15+
public:
16+
TransformFreeScene(const ofxAssimpModelLoader& other);
17+
void update();
18+
};
19+
20+
TransformFreeScene original;
21+
22+
ofMesh mesh;
23+
function<void(const vector<glm::vec3>&, const vector<glm::vec3>&)> callback;
24+
array<vector<glm::vec3>, 3> vertices;
25+
array<float, 3> times;
26+
int currentIndex = -1;
27+
};

src/DisplacedMesh.cpp

Lines changed: 1 addition & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
#include "DisplacedMesh.h"
2-
3-
constexpr bool USE_SHADER = true;
4-
constexpr int MAX_KELVINLETS = 40;
2+
#include "constants.h"
53

64
string slurp(string path) {
75
return ofFile(path).readToBuffer().getText();
@@ -134,84 +132,3 @@ const vector<glm::vec3>& DisplacedMesh::TimeShiftedKelvinlet::displacements(Mate
134132

135133
return result;
136134
}
137-
138-
139-
DisplacedMesh::StaticMesh::StaticMesh(const ofMesh& mesh): original(mesh), mesh(mesh) {}
140-
void DisplacedMesh::StaticMesh::update(float t) {}
141-
void DisplacedMesh::StaticMesh::draw() {
142-
mesh.draw();
143-
}
144-
void DisplacedMesh::StaticMesh::drawWireframe() {
145-
mesh.drawWireframe();
146-
}
147-
vector<glm::vec3>& DisplacedMesh::StaticMesh::getVertices() {
148-
return mesh.getVertices();
149-
}
150-
vector<glm::vec3> DisplacedMesh::StaticMesh::getOriginalVertices() {
151-
return original.getVertices();
152-
}
153-
154-
DisplacedMesh::AnimatedMesh::AnimatedMesh(const ofxAssimpModelLoader& loaderMesh, const function<void(const vector<glm::vec3>&, const vector<glm::vec3>&)>& callback):
155-
original(loaderMesh),
156-
callback(callback)
157-
{
158-
mesh.addVertices(original.getCurrentAnimatedMesh(0).getVertices());
159-
mesh.addIndices(original.getCurrentAnimatedMesh(0).getIndices());
160-
}
161-
void DisplacedMesh::AnimatedMesh::update(float t) {
162-
original.update();
163-
if (currentIndex == -1) {
164-
for (int i = vertices.size()-1; i > 0; --i) {
165-
times[i] = t - (vertices.size() - i) * 0.01;
166-
vertices[i] = getOriginalVertices();
167-
}
168-
}
169-
currentIndex = (currentIndex + 1) % vertices.size();
170-
times[currentIndex] = t;
171-
vertices[currentIndex] = getOriginalVertices();
172-
173-
int prevIndex = (currentIndex - 1 + vertices.size()) % vertices.size();
174-
int twicePrevIndex = (currentIndex - 2 + vertices.size()) % vertices.size();
175-
176-
vector<glm::vec3> accelerations(vertices[currentIndex].size());
177-
for (int i = 0; i < vertices[currentIndex].size(); ++i) {
178-
auto& current = vertices[currentIndex][i];
179-
auto& prev = vertices[prevIndex][i];
180-
auto& twicePrev = vertices[twicePrevIndex][i];
181-
182-
auto currentVelocity = (current - prev)/(times[currentIndex] - times[prevIndex]);
183-
auto prevVelocity = (prev - twicePrev)/(times[prevIndex] - times[twicePrevIndex]);
184-
185-
accelerations[i] = (currentVelocity - prevVelocity)/(times[currentIndex] - times[prevIndex]);
186-
}
187-
188-
callback(vertices[currentIndex], accelerations);
189-
}
190-
void DisplacedMesh::AnimatedMesh::draw() {
191-
if (USE_SHADER) {
192-
original.drawFaces();
193-
} else {
194-
mesh.draw();
195-
}
196-
}
197-
void DisplacedMesh::AnimatedMesh::drawWireframe() {
198-
if (USE_SHADER) {
199-
original.drawWireframe();
200-
} else {
201-
mesh.drawWireframe();
202-
}
203-
}
204-
vector<glm::vec3>& DisplacedMesh::AnimatedMesh::getVertices() {
205-
return mesh.getVertices();
206-
}
207-
vector<glm::vec3> DisplacedMesh::AnimatedMesh::getOriginalVertices() {
208-
return original.getCurrentAnimatedMesh(0).getVertices();
209-
}
210-
211-
212-
DisplacedMesh::AnimatedMesh::TransformFreeScene::TransformFreeScene(const ofxAssimpModelLoader& other): ofxAssimpModelLoader(other) {}
213-
void DisplacedMesh::AnimatedMesh::TransformFreeScene::update() {
214-
ofxAssimpModelLoader::update();
215-
modelMeshes[0].matrix.makeIdentityMatrix();
216-
modelMatrix.makeIdentityMatrix();
217-
}

src/DisplacedMesh.h

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,61 +4,14 @@
44
#include "Kelvinlet.h"
55
#include "ImpulseKelvinlet.h"
66
#include "PushKelvinlet.h"
7+
#include "Mesh.h"
78

89
#include <functional>
910

1011
#include "ofxAssimpModelLoader.h"
1112

1213
class DisplacedMesh {
1314
public:
14-
15-
// Abstract class representing any displaceable mesh
16-
class Mesh {
17-
public:
18-
virtual void update(float t) = 0;
19-
virtual void draw() = 0;
20-
virtual void drawWireframe() = 0;
21-
virtual vector<glm::vec3>& getVertices() = 0;
22-
virtual vector<glm::vec3> getOriginalVertices() = 0;
23-
};
24-
25-
class StaticMesh: public Mesh {
26-
public:
27-
StaticMesh(const ofMesh& mesh);
28-
virtual void update(float t) override;
29-
virtual void draw() override;
30-
virtual void drawWireframe() override;
31-
virtual vector<glm::vec3>& getVertices() override;
32-
virtual vector<glm::vec3> getOriginalVertices() override;
33-
34-
private:
35-
ofMesh original;
36-
ofMesh mesh;
37-
};
38-
39-
class AnimatedMesh: public Mesh {
40-
public:
41-
AnimatedMesh(const ofxAssimpModelLoader& mesh, const function<void(const vector<glm::vec3>&, const vector<glm::vec3>&)>& callback);
42-
virtual void update(float t) override;
43-
virtual void draw() override;
44-
virtual void drawWireframe() override;
45-
virtual vector<glm::vec3>& getVertices() override;
46-
virtual vector<glm::vec3> getOriginalVertices() override;
47-
48-
private:
49-
class TransformFreeScene: public ofxAssimpModelLoader {
50-
public:
51-
TransformFreeScene(const ofxAssimpModelLoader& other);
52-
void update();
53-
};
54-
TransformFreeScene original;
55-
ofMesh mesh;
56-
function<void(const vector<glm::vec3>&, const vector<glm::vec3>&)> callback;
57-
array<vector<glm::vec3>, 3> vertices;
58-
array<float, 3> times;
59-
int currentIndex = -1;
60-
};
61-
6215
template<typename MeshType>
6316
DisplacedMesh(const MeshType& mesh, Material material):
6417
mesh(make_shared<MeshType>(mesh)),

src/Mesh.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
#include "ofMain.h"
4+
5+
// Abstract class representing any displaceable mesh
6+
class Mesh {
7+
public:
8+
virtual void update(float t) = 0;
9+
virtual void draw() = 0;
10+
virtual void drawWireframe() = 0;
11+
virtual vector<glm::vec3>& getVertices() = 0;
12+
virtual vector<glm::vec3> getOriginalVertices() = 0;
13+
};

src/StaticMesh.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#include "StaticMesh.h"
2+
3+
StaticMesh::StaticMesh(const ofMesh& mesh): original(mesh), mesh(mesh) {}
4+
void StaticMesh::update(float t) {}
5+
void StaticMesh::draw() {
6+
mesh.draw();
7+
}
8+
void StaticMesh::drawWireframe() {
9+
mesh.drawWireframe();
10+
}
11+
vector<glm::vec3>& StaticMesh::getVertices() {
12+
return mesh.getVertices();
13+
}
14+
vector<glm::vec3> StaticMesh::getOriginalVertices() {
15+
return original.getVertices();
16+
}

src/StaticMesh.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include "Mesh.h"
4+
5+
class StaticMesh: public Mesh {
6+
public:
7+
StaticMesh(const ofMesh& mesh);
8+
virtual void update(float t) override;
9+
virtual void draw() override;
10+
virtual void drawWireframe() override;
11+
virtual vector<glm::vec3>& getVertices() override;
12+
virtual vector<glm::vec3> getOriginalVertices() override;
13+
14+
private:
15+
ofMesh original;
16+
ofMesh mesh;
17+
};

src/constants.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#pragma once
2+
3+
constexpr bool USE_SHADER = true;
4+
constexpr int MAX_KELVINLETS = 40;
5+
constexpr int FRAME_RATE = 30;
6+
constexpr bool SAVE_SCREENSHOTS = false;

src/ofApp.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
#include "ofApp.h"
2+
#include "constants.h"
3+
#include "AnimatedMesh.h"
24

3-
constexpr int FRAME_RATE = 30;
4-
5-
constexpr bool SAVE_SCREENSHOTS = false;
65

76
//--------------------------------------------------------------
87
void ofApp::setup() {
@@ -27,7 +26,7 @@ void ofApp::setup() {
2726
// vertex.y += 1.5;
2827
// }
2928

30-
displacedMesh = make_shared<DisplacedMesh>(DisplacedMesh::AnimatedMesh(loader, [&](const vector<glm::vec3>& vertices, const vector<glm::vec3>& accelerations) {
29+
displacedMesh = make_shared<DisplacedMesh>(AnimatedMesh(loader, [&](const vector<glm::vec3>& vertices, const vector<glm::vec3>& accelerations) {
3130
if (ofGetFrameNum() < 3) return;
3231

3332
list<ImpulseKelvinlet> potentialKelvinlets;

0 commit comments

Comments
 (0)