Skip to content

Commit d5b9b90

Browse files
committed
- added shader support
- added automatic computation of inertia tensor for arbitrary triangle meshes - added bunny model to chain demo - added visualization mesh to rigid body - added OBJ file loader
1 parent 7468642 commit d5b9b90

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+46944
-187
lines changed

CMake/Common.cmake

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)
2-
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)
3-
set(CMAKE_DEBUG_POSTFIX "d")
1+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
2+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/bin")
3+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/bin")
4+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_SOURCE_DIR}/bin")
5+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_SOURCE_DIR}/bin")
6+
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib)
7+
set(CMAKE_DEBUG_POSTFIX "_d")
8+
set(CMAKE_RELWITHDEBINFO_POSTFIX "_rd")
9+
set(CMAKE_MINSIZEREL_POSTFIX "_ms")
410

511
if (WIN32)
612
set(CMAKE_USE_RELATIVE_PATHS "1")
@@ -15,9 +21,6 @@ if (UNIX)
1521
set(CMAKE_USE_RELATIVE_PATHS "1")
1622
# Set compiler flags for "release"
1723
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -fopenmp")
18-
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/${CMAKE_BUILD_TYPE})
1924
endif (UNIX)
2025

2126
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
22-
23-

Changelog.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
- added shader support
2+
- added automatic computation of inertia tensor for arbitrary triangle meshes
3+
- added bunny model to chain demo
4+
- added visualization mesh to rigid body
5+
- added OBJ file loader
16
- update to Eigen 3.2.7
27
- added target velocity motor slider joint
38
- added target position motor slider joint

Demos/BarDemo/CMakeLists.txt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@ add_executable(BarDemo
2323
${PROJECT_PATH}/Demos/Utils/IndexedFaceMesh.cpp
2424
${PROJECT_PATH}/Demos/Utils/IndexedFaceMesh.h
2525
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.cpp
26-
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.h
26+
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.h
27+
${PROJECT_PATH}/Demos/Utils/Utilities.cpp
28+
${PROJECT_PATH}/Demos/Utils/Utilities.h
29+
${PROJECT_PATH}/Demos/Utils/VolumeIntegration.cpp
30+
${PROJECT_PATH}/Demos/Utils/VolumeIntegration.h
2731
${PROJECT_PATH}/Demos/Simulation/TimeManager.cpp
28-
${PROJECT_PATH}/Demos/Simulation/TimeManager.h
32+
${PROJECT_PATH}/Demos/Simulation/TimeManager.h
33+
${PROJECT_PATH}/Demos/Simulation/RigidBodyGeometry.cpp
34+
${PROJECT_PATH}/Demos/Simulation/RigidBodyGeometry.h
2935
${PROJECT_PATH}/Demos/Simulation/RigidBody.h
3036
${PROJECT_PATH}/Demos/Simulation/Constraints.cpp
3137
${PROJECT_PATH}/Demos/Simulation/Constraints.h
@@ -49,6 +55,9 @@ include_directories(${PROJECT_PATH}/extern/freeglut/include)
4955
include_directories(${PROJECT_PATH}/extern/glew/include)
5056

5157
set_target_properties(BarDemo PROPERTIES FOLDER "Demos")
58+
set_target_properties(BarDemo PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
59+
set_target_properties(BarDemo PROPERTIES RELWITHDEBINFO_POSTFIX ${CMAKE_RELWITHDEBINFO_POSTFIX})
60+
set_target_properties(BarDemo PROPERTIES MINSIZEREL_POSTFIX ${CMAKE_MINSIZEREL_POSTFIX})
5261
add_dependencies(BarDemo ${SIMULATION_DEPENDENCIES})
5362
target_link_libraries(BarDemo ${SIMULATION_LINK_LIBRARIES})
5463
VIS_SOURCE_GROUPS()

Demos/BarDemo/main.cpp

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include "Demos/Simulation/SimulationModel.h"
88
#include "Demos/Simulation/TimeStepController.h"
99
#include <iostream>
10+
#include "Demos/Visualization/Visualization.h"
11+
#include "Demos/Utils/Utilities.h"
1012

1113
// Enable memory leak detection
1214
#ifdef _DEBUG
@@ -23,6 +25,7 @@ void createMesh();
2325
void render ();
2426
void cleanup();
2527
void reset();
28+
void initShader();
2629
void selection(const Eigen::Vector2i &start, const Eigen::Vector2i &end);
2730
void TW_CALL setTimeStep(const void *value, void *clientData);
2831
void TW_CALL getTimeStep(void *value, void *clientData);
@@ -48,19 +51,26 @@ const unsigned int height = 5;
4851
bool doPause = true;
4952
std::vector<unsigned int> selectedParticles;
5053
Eigen::Vector3f oldMousePos;
54+
Shader *shader;
55+
string exePath;
56+
string dataPath;
5157

5258
// main
5359
int main( int argc, char **argv )
5460
{
5561
REPORT_MEMORY_LEAKS
5662

63+
exePath = Utilities::getFilePath(argv[0]);
64+
dataPath = exePath + "/" + std::string(PBD_DATA_PATH);
65+
5766
// OpenGL
5867
MiniGL::init (argc, argv, 1024, 768, 0, 0, "Bar demo");
5968
MiniGL::initLights ();
6069
MiniGL::initTexture();
6170
MiniGL::setClientIdleFunc (50, timeStep);
6271
MiniGL::setKeyFunc(0, 'r', reset);
6372
MiniGL::setSelectionFunc(selection);
73+
initShader();
6474

6575
buildModel ();
6676

@@ -86,9 +96,28 @@ int main( int argc, char **argv )
8696
return 0;
8797
}
8898

99+
void initShader()
100+
{
101+
std::string vertFile = dataPath + "/shaders/vs_smooth.glsl";
102+
std::string fragFile = dataPath + "/shaders/fs_smooth.glsl";
103+
shader = MiniGL::createShader(vertFile, "", fragFile);
104+
105+
if (shader == NULL)
106+
return;
107+
108+
shader->begin();
109+
shader->addUniform("modelview_matrix");
110+
shader->addUniform("projection_matrix");
111+
shader->addUniform("surface_color");
112+
shader->addUniform("shininess");
113+
shader->addUniform("specular_factor");
114+
shader->end();
115+
}
116+
89117
void cleanup()
90118
{
91119
delete TimeManager::getCurrent();
120+
delete shader;
92121
}
93122

94123
void reset()
@@ -159,30 +188,30 @@ void renderTetModels()
159188
// Draw simulation model
160189

161190
const ParticleData &pd = model.getParticles();
191+
float surfaceColor[4] = { 0.2f, 0.5f, 1.0f, 1 };
192+
193+
if (shader)
194+
{
195+
shader->begin();
196+
glUniform3fv(shader->getUniform("surface_color"), 1, surfaceColor);
197+
glUniform1f(shader->getUniform("shininess"), 5.0f);
198+
glUniform1f(shader->getUniform("specular_factor"), 0.2f);
199+
200+
GLfloat matrix[16];
201+
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
202+
glUniformMatrix4fv(shader->getUniform("modelview_matrix"), 1, GL_FALSE, matrix);
203+
GLfloat pmatrix[16];
204+
glGetFloatv(GL_PROJECTION_MATRIX, pmatrix);
205+
glUniformMatrix4fv(shader->getUniform("projection_matrix"), 1, GL_FALSE, pmatrix);
206+
}
162207

163208
for (unsigned int i = 0; i < model.getTetModels().size(); i++)
164209
{
165210
const IndexedFaceMesh &visMesh = model.getTetModels()[i]->getVisMesh();
166-
const unsigned int *faces = visMesh.getFaces().data();
167-
const unsigned int nFaces = visMesh.numFaces();
168-
const Eigen::Vector3f *vertexNormals = visMesh.getVertexNormals().data();
169-
170-
float surfaceColor[4] = { 0.2f, 0.5f, 1.0f, 1 };
171-
float speccolor[4] = { 1.0, 1.0, 1.0, 1.0 };
172-
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, surfaceColor);
173-
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, surfaceColor);
174-
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, speccolor);
175-
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0);
176-
glColor3fv(surfaceColor);
177-
178-
glEnableClientState(GL_VERTEX_ARRAY);
179-
glEnableClientState(GL_NORMAL_ARRAY);
180-
glVertexPointer(3, GL_FLOAT, 0, &pd.getPosition(0)[0]);
181-
glNormalPointer(GL_FLOAT, 0, &vertexNormals[0][0]);
182-
glDrawElements(GL_TRIANGLES, (GLsizei)3 * visMesh.numFaces(), GL_UNSIGNED_INT, visMesh.getFaces().data());
183-
glDisableClientState(GL_VERTEX_ARRAY);
184-
glDisableClientState(GL_NORMAL_ARRAY);
211+
Visualization::drawMesh(pd, visMesh, surfaceColor);
185212
}
213+
if (shader)
214+
shader->end();
186215
}
187216

188217

Demos/CMakeLists.txt

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
include(Visualization/CMakeLists.txt)
2+
add_definitions(-DPBD_DATA_PATH="../data")
23

34
subdirs(BarDemo ClothDemo FluidDemo RigidBodyDemos CouplingDemos GenericConstraintsDemos)
45

5-
# A macro for copying the resources of a sample project
6-
MACRO(COPY_RESOURCES demoName)
7-
IF (WIN32)
8-
ADD_CUSTOM_COMMAND(
9-
TARGET ${demoName}
10-
POST_BUILD
11-
COMMAND xcopy /r /y \"${CMAKE_CURRENT_SOURCE_DIR}/Resources_${demoName}\" \"$\(TargetDir\)..\\..\\bin\\$\(ConfigurationName\)\\Resources_${demoName}\\\"
12-
)
13-
ENDIF (WIN32)
14-
ENDMACRO(COPY_RESOURCES)

Demos/ClothDemo/CMakeLists.txt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,15 @@ add_executable(ClothDemo
2323
${PROJECT_PATH}/Demos/Utils/IndexedFaceMesh.cpp
2424
${PROJECT_PATH}/Demos/Utils/IndexedFaceMesh.h
2525
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.cpp
26-
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.h
26+
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.h
27+
${PROJECT_PATH}/Demos/Utils/Utilities.cpp
28+
${PROJECT_PATH}/Demos/Utils/Utilities.h
29+
${PROJECT_PATH}/Demos/Utils/VolumeIntegration.cpp
30+
${PROJECT_PATH}/Demos/Utils/VolumeIntegration.h
2731
${PROJECT_PATH}/Demos/Simulation/TimeManager.cpp
28-
${PROJECT_PATH}/Demos/Simulation/TimeManager.h
32+
${PROJECT_PATH}/Demos/Simulation/TimeManager.h
33+
${PROJECT_PATH}/Demos/Simulation/RigidBodyGeometry.cpp
34+
${PROJECT_PATH}/Demos/Simulation/RigidBodyGeometry.h
2935
${PROJECT_PATH}/Demos/Simulation/RigidBody.h
3036
${PROJECT_PATH}/Demos/Simulation/Constraints.cpp
3137
${PROJECT_PATH}/Demos/Simulation/Constraints.h
@@ -49,6 +55,9 @@ include_directories(${PROJECT_PATH}/extern/freeglut/include)
4955
include_directories(${PROJECT_PATH}/extern/glew/include)
5056

5157
set_target_properties(ClothDemo PROPERTIES FOLDER "Demos")
58+
set_target_properties(ClothDemo PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
59+
set_target_properties(ClothDemo PROPERTIES RELWITHDEBINFO_POSTFIX ${CMAKE_RELWITHDEBINFO_POSTFIX})
60+
set_target_properties(ClothDemo PROPERTIES MINSIZEREL_POSTFIX ${CMAKE_MINSIZEREL_POSTFIX})
5261
add_dependencies(ClothDemo ${SIMULATION_DEPENDENCIES})
5362
target_link_libraries(ClothDemo ${SIMULATION_LINK_LIBRARIES})
5463
VIS_SOURCE_GROUPS()

Demos/ClothDemo/main.cpp

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include "Demos/Simulation/SimulationModel.h"
88
#include "Demos/Simulation/TimeStepController.h"
99
#include <iostream>
10+
#include "Demos/Visualization/Visualization.h"
11+
#include "Demos/Utils/Utilities.h"
1012

1113
// Enable memory leak detection
1214
#ifdef _DEBUG
@@ -23,6 +25,7 @@ void createMesh();
2325
void render ();
2426
void cleanup();
2527
void reset();
28+
void initShader();
2629
void selection(const Eigen::Vector2i &start, const Eigen::Vector2i &end);
2730
void TW_CALL setTimeStep(const void *value, void *clientData);
2831
void TW_CALL getTimeStep(void *value, void *clientData);
@@ -62,19 +65,26 @@ const float height = 10.0f;
6265
bool doPause = true;
6366
std::vector<unsigned int> selectedParticles;
6467
Eigen::Vector3f oldMousePos;
68+
Shader *shader;
69+
string exePath;
70+
string dataPath;
6571

6672
// main
6773
int main( int argc, char **argv )
6874
{
6975
REPORT_MEMORY_LEAKS
7076

77+
exePath = Utilities::getFilePath(argv[0]);
78+
dataPath = exePath + "/" + std::string(PBD_DATA_PATH);
79+
7180
// OpenGL
7281
MiniGL::init (argc, argv, 1024, 768, 0, 0, "Cloth demo");
7382
MiniGL::initLights ();
7483
MiniGL::initTexture();
7584
MiniGL::setClientIdleFunc (50, timeStep);
7685
MiniGL::setKeyFunc(0, 'r', reset);
7786
MiniGL::setSelectionFunc(selection);
87+
initShader();
7888

7989
buildModel ();
8090

@@ -109,9 +119,28 @@ int main( int argc, char **argv )
109119
return 0;
110120
}
111121

122+
void initShader()
123+
{
124+
std::string vertFile = dataPath + "/shaders/vs_smoothTex.glsl";
125+
std::string fragFile = dataPath + "/shaders/fs_smoothTex.glsl";
126+
shader = MiniGL::createShader(vertFile, "", fragFile);
127+
128+
if (shader == NULL)
129+
return;
130+
131+
shader->begin();
132+
shader->addUniform("modelview_matrix");
133+
shader->addUniform("projection_matrix");
134+
shader->addUniform("surface_color");
135+
shader->addUniform("shininess");
136+
shader->addUniform("specular_factor");
137+
shader->end();
138+
}
139+
112140
void cleanup()
113141
{
114142
delete TimeManager::getCurrent();
143+
delete shader;
115144
}
116145

117146
void reset()
@@ -180,39 +209,31 @@ void renderTriangleModels()
180209
// Draw simulation model
181210

182211
const ParticleData &pd = model.getParticles();
212+
float surfaceColor[4] = { 0.2f, 0.5f, 1.0f, 1 };
213+
214+
if (shader)
215+
{
216+
shader->begin();
217+
glUniform3fv(shader->getUniform("surface_color"), 1, surfaceColor);
218+
glUniform1f(shader->getUniform("shininess"), 5.0f);
219+
glUniform1f(shader->getUniform("specular_factor"), 0.2f);
220+
221+
GLfloat matrix[16];
222+
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
223+
glUniformMatrix4fv(shader->getUniform("modelview_matrix"), 1, GL_FALSE, matrix);
224+
GLfloat pmatrix[16];
225+
glGetFloatv(GL_PROJECTION_MATRIX, pmatrix);
226+
glUniformMatrix4fv(shader->getUniform("projection_matrix"), 1, GL_FALSE, pmatrix);
227+
}
183228

184229
for (unsigned int i = 0; i < model.getTriangleModels().size(); i++)
185230
{
186231
// mesh
187232
const IndexedFaceMesh &mesh = model.getTriangleModels()[i]->getParticleMesh();
188-
const unsigned int *faces = mesh.getFaces().data();
189-
const unsigned int nFaces = mesh.numFaces();
190-
const Eigen::Vector3f *vertexNormals = mesh.getVertexNormals().data();
191-
const Eigen::Vector2f *uvs = mesh.getUVs().data();
192-
193-
float surfaceColor[4] = { 0.2f, 0.5f, 1.0f, 1 };
194-
float speccolor[4] = { 1.0, 1.0, 1.0, 1.0 };
195-
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, surfaceColor);
196-
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, surfaceColor);
197-
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, speccolor);
198-
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0);
199-
glColor3fv(surfaceColor);
200-
201-
MiniGL::bindTexture();
202-
203-
glEnableClientState(GL_VERTEX_ARRAY);
204-
glEnableClientState(GL_NORMAL_ARRAY);
205-
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
206-
glVertexPointer(3, GL_FLOAT, 0, &pd.getPosition(model.getTriangleModels()[i]->getIndexOffset())[0]);
207-
glTexCoordPointer(2, GL_FLOAT, 0, &uvs[0][0]);
208-
glNormalPointer(GL_FLOAT, 0, &vertexNormals[0][0]);
209-
glDrawElements(GL_TRIANGLES, (GLsizei)3 * mesh.numFaces(), GL_UNSIGNED_INT, mesh.getFaces().data());
210-
glDisableClientState(GL_VERTEX_ARRAY);
211-
glDisableClientState(GL_NORMAL_ARRAY);
212-
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
213-
214-
MiniGL::unbindTexture();
233+
Visualization::drawTexturedMesh(pd, mesh, surfaceColor);
215234
}
235+
if (shader)
236+
shader->end();
216237
}
217238

218239

Demos/CouplingDemos/CMakeLists.txt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,18 @@ add_executable(RigidBodyClothCouplingDemo
2323
${PROJECT_PATH}/Demos/Utils/IndexedFaceMesh.cpp
2424
${PROJECT_PATH}/Demos/Utils/IndexedFaceMesh.h
2525
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.cpp
26-
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.h
26+
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.h
27+
${PROJECT_PATH}/Demos/Utils/OBJLoader.cpp
28+
${PROJECT_PATH}/Demos/Utils/OBJLoader.h
29+
${PROJECT_PATH}/Demos/Utils/Utilities.cpp
30+
${PROJECT_PATH}/Demos/Utils/Utilities.h
31+
${PROJECT_PATH}/Demos/Utils/VolumeIntegration.cpp
32+
${PROJECT_PATH}/Demos/Utils/VolumeIntegration.h
2733
${PROJECT_PATH}/Demos/Simulation/TimeManager.cpp
2834
${PROJECT_PATH}/Demos/Simulation/TimeManager.h
2935
${PROJECT_PATH}/Demos/Simulation/RigidBody.h
36+
${PROJECT_PATH}/Demos/Simulation/RigidBodyGeometry.cpp
37+
${PROJECT_PATH}/Demos/Simulation/RigidBodyGeometry.h
3038
${PROJECT_PATH}/Demos/Simulation/Constraints.cpp
3139
${PROJECT_PATH}/Demos/Simulation/Constraints.h
3240
${PROJECT_PATH}/Demos/Simulation/TetModel.cpp
@@ -42,6 +50,9 @@ add_executable(RigidBodyClothCouplingDemo
4250
)
4351

4452
set_target_properties(RigidBodyClothCouplingDemo PROPERTIES FOLDER "Demos")
53+
set_target_properties(RigidBodyClothCouplingDemo PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
54+
set_target_properties(RigidBodyClothCouplingDemo PROPERTIES RELWITHDEBINFO_POSTFIX ${CMAKE_RELWITHDEBINFO_POSTFIX})
55+
set_target_properties(RigidBodyClothCouplingDemo PROPERTIES MINSIZEREL_POSTFIX ${CMAKE_MINSIZEREL_POSTFIX})
4556
add_dependencies(RigidBodyClothCouplingDemo ${SIMULATION_DEPENDENCIES})
4657
target_link_libraries(RigidBodyClothCouplingDemo ${SIMULATION_LINK_LIBRARIES})
4758

0 commit comments

Comments
 (0)