Skip to content

Commit 9ced4ca

Browse files
author
bender
committed
- Initial commit
1 parent f01748c commit 9ced4ca

File tree

423 files changed

+113788
-0
lines changed

Some content is hidden

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

423 files changed

+113788
-0
lines changed

CMake/AntTweakBar.cmake

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
INCLUDE_DIRECTORIES(${PROJECT_PATH}/extern/AntTweakBar)
2+
LINK_DIRECTORIES(${PROJECT_PATH}/extern/AntTweakBar)
3+
IF (CMAKE_CL_64)
4+
SET(ANTTWEAKBAR_LIB_NAME AntTweakBar64)
5+
ELSE (CMAKE_CL_64)
6+
SET(ANTTWEAKBAR_LIB_NAME AntTweakBar)
7+
ENDIF (CMAKE_CL_64)
8+
SET(ANTTWEAKBAR_LIBS ${ANTTWEAKBAR_LIB_NAME}.lib)
9+
10+
# A macro for copying the solid dll
11+
MACRO(COPY_ANTTWEAKBAR_DLL targetName)
12+
IF (WIN32)
13+
ADD_CUSTOM_COMMAND(
14+
TARGET ${targetName}
15+
POST_BUILD
16+
COMMAND xcopy /r /y \"${PROJECT_PATH}/extern/AntTweakBar\\${ANTTWEAKBAR_LIB_NAME}.dll" \"$\(TargetDir\)..\\..\\bin\\$\(ConfigurationName\)\\"
17+
)
18+
ENDIF (WIN32)
19+
ENDMACRO(COPY_ANTTWEAKBAR_DLL)

CMake/Common.cmake

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)
2+
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)
3+
SET(CMAKE_DEBUG_POSTFIX "d")
4+
5+
IF (WIN32)
6+
SET(CMAKE_USE_RELATIVE_PATHS "1")
7+
# Set compiler flags for "release"
8+
SET(CMAKE_CXX_FLAGS_RELEASE "/MD /Ox /Ob2 /Oi /Ot /GL /D NDEBUG")
9+
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
10+
SET(IBDS_STATIC_LIBRARY_FLAGS_RELEASE "/INCREMENTAL:NO /LTCG")
11+
ENDIF (WIN32)
12+
13+
IF (UNIX)
14+
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/${CMAKE_BUILD_TYPE})
15+
ENDIF (UNIX)
16+
17+
ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
18+
19+

CMake/FindEigen3.cmake

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# - Try to find Eigen3 lib
2+
#
3+
# This module supports requiring a minimum version, e.g. you can do
4+
# find_package(Eigen3 3.1.2)
5+
# to require version 3.1.2 or newer of Eigen3.
6+
#
7+
# Once done this will define
8+
#
9+
# EIGEN3_FOUND - system has eigen lib with correct version
10+
# EIGEN3_INCLUDE_DIR - the eigen include directory
11+
# EIGEN3_VERSION - eigen version
12+
13+
# Copyright (c) 2006, 2007 Montel Laurent, <[email protected]>
14+
# Copyright (c) 2008, 2009 Gael Guennebaud, <[email protected]>
15+
# Copyright (c) 2009 Benoit Jacob <[email protected]>
16+
# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
17+
18+
if(NOT Eigen3_FIND_VERSION)
19+
if(NOT Eigen3_FIND_VERSION_MAJOR)
20+
set(Eigen3_FIND_VERSION_MAJOR 2)
21+
endif(NOT Eigen3_FIND_VERSION_MAJOR)
22+
if(NOT Eigen3_FIND_VERSION_MINOR)
23+
set(Eigen3_FIND_VERSION_MINOR 91)
24+
endif(NOT Eigen3_FIND_VERSION_MINOR)
25+
if(NOT Eigen3_FIND_VERSION_PATCH)
26+
set(Eigen3_FIND_VERSION_PATCH 0)
27+
endif(NOT Eigen3_FIND_VERSION_PATCH)
28+
29+
set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
30+
endif(NOT Eigen3_FIND_VERSION)
31+
32+
macro(_eigen3_check_version)
33+
file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
34+
35+
string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
36+
set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
37+
string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
38+
set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
39+
string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
40+
set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
41+
42+
set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
43+
if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
44+
set(EIGEN3_VERSION_OK FALSE)
45+
else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
46+
set(EIGEN3_VERSION_OK TRUE)
47+
endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
48+
49+
if(NOT EIGEN3_VERSION_OK)
50+
51+
message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
52+
"but at least version ${Eigen3_FIND_VERSION} is required")
53+
endif(NOT EIGEN3_VERSION_OK)
54+
endmacro(_eigen3_check_version)
55+
56+
if (EIGEN3_INCLUDE_DIR)
57+
58+
# in cache already
59+
_eigen3_check_version()
60+
set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
61+
62+
else (EIGEN3_INCLUDE_DIR)
63+
64+
find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
65+
PATHS
66+
${PROJECT_PATH}/extern/eigen
67+
${CMAKE_INSTALL_PREFIX}/include
68+
${KDE4_INCLUDE_DIR}
69+
PATH_SUFFIXES eigen3 eigen
70+
)
71+
72+
if(EIGEN3_INCLUDE_DIR)
73+
_eigen3_check_version()
74+
endif(EIGEN3_INCLUDE_DIR)
75+
76+
include(FindPackageHandleStandardArgs)
77+
find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
78+
79+
mark_as_advanced(EIGEN3_INCLUDE_DIR)
80+
81+
endif(EIGEN3_INCLUDE_DIR)
82+

CMakeLists.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
cmake_minimum_required(VERSION 2.8)
2+
3+
PROJECT(PositionBasedDynamics)
4+
5+
SET(PROJECT_PATH ${PROJECT_SOURCE_DIR})
6+
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})
7+
8+
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
9+
10+
INCLUDE(${PROJECT_PATH}/CMake/Common.cmake)
11+
INCLUDE(${PROJECT_PATH}/CMake/AntTweakBar.cmake)
12+
13+
SUBDIRS(extern/freeglut Demos PositionBasedDynamics)
14+
15+
16+
17+
18+

Demos/BarDemo/CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
SET(SIMULATION_LINK_LIBRARIES freeglut PositionBasedDynamics opengl32.lib glu32.lib ${ANTTWEAKBAR_LIBS})
2+
SET (SIMULATION_DEPENDENCIES freeglut PositionBasedDynamics)
3+
4+
ADD_EXECUTABLE(BarDemo
5+
main.cpp
6+
7+
TimeStepTetModel.cpp
8+
TimeStepTetModel.h
9+
TetModel.cpp
10+
TetModel.h
11+
12+
${VIS_FILES}
13+
${PROJECT_PATH}/Demos/Utils/Config.h
14+
${PROJECT_PATH}/Demos/Utils/TimeManager.cpp
15+
${PROJECT_PATH}/Demos/Utils/TimeManager.h
16+
${PROJECT_PATH}/Demos/Utils/IndexedFaceMesh.h
17+
${PROJECT_PATH}/Demos/Utils/IndexedTetMesh.h
18+
${PROJECT_PATH}/Demos/Utils/ParticleData.h
19+
20+
CMakeLists.txt
21+
)
22+
23+
find_package( Eigen3 REQUIRED )
24+
include_directories( ${EIGEN3_INCLUDE_DIR} )
25+
INCLUDE_DIRECTORIES(${PROJECT_PATH}/extern/freeglut/include)
26+
27+
ADD_DEPENDENCIES(BarDemo ${SIMULATION_DEPENDENCIES})
28+
TARGET_LINK_LIBRARIES(BarDemo ${SIMULATION_LINK_LIBRARIES})
29+
VIS_SOURCE_GROUPS()
30+
COPY_ANTTWEAKBAR_DLL(BarDemo)

Demos/BarDemo/TetModel.cpp

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
#include "TetModel.h"
2+
#include "PositionBasedDynamics\PositionBasedDynamics.h"
3+
4+
using namespace PBD;
5+
6+
TetModel::TetModel() :
7+
m_visMesh(),
8+
m_particleMesh()
9+
{
10+
m_stiffness = 1.0f;
11+
m_poissonRatio = 0.3f;
12+
m_normalizeShear = false;
13+
m_normalizeStretch = false;
14+
}
15+
16+
TetModel::~TetModel(void)
17+
{
18+
cleanupModel();
19+
}
20+
21+
void TetModel::cleanupModel()
22+
{
23+
m_particleMesh.release();
24+
}
25+
26+
TetModel::ParticleMesh &TetModel::getParticleMesh()
27+
{
28+
return m_particleMesh;
29+
}
30+
31+
TetModel::VisMesh &TetModel::getVisMesh()
32+
{
33+
return m_visMesh;
34+
}
35+
36+
void TetModel::setGeometry(const unsigned int nPoints, Eigen::Vector3f* coords, const unsigned int nTets, unsigned int* indices)
37+
{
38+
m_particleMesh.release();
39+
m_particleMesh.initMemory(nPoints, nTets * 6, nTets * 4, nTets);
40+
41+
ParticleData& pd = m_particleMesh.getVertexData();
42+
for (unsigned int i = 0; i < nPoints; i++)
43+
{
44+
m_particleMesh.addVertex(coords[i]);
45+
}
46+
for (unsigned int i = 0; i < nTets; i++)
47+
{
48+
m_particleMesh.addTet(&indices[4 * i]);
49+
}
50+
m_particleMesh.buildNeighbors();
51+
52+
createVisMesh();
53+
54+
initConstraints();
55+
}
56+
57+
void TetModel::reset()
58+
{
59+
const unsigned int nPoints = m_particleMesh.numVertices();
60+
ParticleData &pd = m_particleMesh.getVertexData();
61+
62+
for (unsigned int i = 0; i < nPoints; i++)
63+
{
64+
const Eigen::Vector3f& x0 = pd.getPosition0(i);
65+
pd.getPosition(i) = x0;
66+
pd.getLastPosition(i) = pd.getPosition(i);
67+
pd.getVelocity(i).setZero();
68+
pd.getAcceleration(i).setZero();
69+
}
70+
}
71+
72+
void TetModel::initConstraints()
73+
{
74+
initTetConstraints();
75+
}
76+
77+
void TetModel::initTetConstraints()
78+
{
79+
m_tetConstraints.clear();
80+
unsigned int nTets = getParticleMesh().numTets();
81+
const unsigned int *tets = getParticleMesh().getTets().data();
82+
const ParticleData &pd = getParticleMesh().getVertexData();
83+
for (unsigned int i = 0; i < nTets; i++)
84+
{
85+
const Eigen::Vector3f &x1 = pd.getPosition(tets[4 * i]);
86+
const Eigen::Vector3f &x2 = pd.getPosition(tets[4 * i + 1]);
87+
const Eigen::Vector3f &x3 = pd.getPosition(tets[4 * i + 2]);
88+
const Eigen::Vector3f &x4 = pd.getPosition(tets[4 * i + 3]);
89+
90+
TetConstraint tc;
91+
PositionBasedDynamics::computeStrainTetraInvRestMat(x1, x2, x3, x4, tc.invRestMat_SBD);
92+
PositionBasedDynamics::computeFEMTetraInvRestMat(x1, x2, x3, x4, tc.tetVolume, tc.invRestMat_FEM);
93+
m_tetConstraints.push_back(tc);
94+
}
95+
}
96+
97+
std::vector<TetModel::TetConstraint> & TetModel::getTetConstraints()
98+
{
99+
return m_tetConstraints;
100+
}
101+
102+
void TetModel::createVisMesh()
103+
{
104+
const unsigned int nVerts = m_particleMesh.numVertices();
105+
const ParticleData &pd = getParticleMesh().getVertexData();
106+
107+
m_visMesh.initMemory(nVerts, m_particleMesh.numEdges(), m_particleMesh.numFaces());
108+
109+
// Add points
110+
for (unsigned int i = 0; i < nVerts; i++)
111+
{
112+
m_visMesh.addVertex(pd.getPosition0(i));
113+
}
114+
115+
// Search for all border faces of the tet mesh
116+
const IndexedTetMesh<ParticleData>::Face *faceData = m_particleMesh.getFaceData().data();
117+
const unsigned int *faces = m_particleMesh.getFaces().data();
118+
for (unsigned int i = 0; i < m_particleMesh.numFaces(); i++)
119+
{
120+
const IndexedTetMesh<ParticleData>::Face &face = faceData[i];
121+
// Found border face
122+
if ((face.m_tets[1] == 0xffffffff) || (face.m_tets[0] == 0xffffffff))
123+
{
124+
m_visMesh.addFace(&faces[3 * i]);
125+
}
126+
}
127+
m_visMesh.buildNeighbors();
128+
129+
m_visMesh.updateNormals();
130+
m_visMesh.updateVertexNormals();
131+
}
132+

Demos/BarDemo/TetModel.h

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#ifndef __TETMODEL_H__
2+
#define __TETMODEL_H__
3+
4+
#include "Demos/Utils/Config.h"
5+
#include "Demos/Utils/IndexedFaceMesh.h"
6+
#include "Demos/Utils/IndexedTetMesh.h"
7+
#include "Demos/Utils/ParticleData.h"
8+
#include <vector>
9+
10+
namespace PBD
11+
{
12+
class TetModel
13+
{
14+
public:
15+
struct TetConstraint
16+
{
17+
float tetVolume;
18+
Eigen::Matrix3f invRestMat_SBD;
19+
Eigen::Matrix3f invRestMat_FEM;
20+
};
21+
22+
TetModel();
23+
virtual ~TetModel();
24+
25+
typedef IndexedFaceMesh<VertexData> VisMesh;
26+
typedef IndexedTetMesh<ParticleData> ParticleMesh;
27+
28+
protected:
29+
/** Tet mesh of particles which represents the simulation model */
30+
ParticleMesh m_particleMesh;
31+
VisMesh m_visMesh;
32+
std::vector<TetConstraint> m_tetConstraints;
33+
float m_stiffness;
34+
float m_poissonRatio;
35+
bool m_normalizeStretch;
36+
bool m_normalizeShear;
37+
38+
void initConstraints();
39+
void initTetConstraints();
40+
void createVisMesh();
41+
42+
public:
43+
VisMesh &getVisMesh();
44+
ParticleMesh &getParticleMesh();
45+
void cleanupModel();
46+
47+
float getStiffness() const { return m_stiffness; }
48+
void setStiffness(float val) { m_stiffness = val; }
49+
float getPoissonRatio() { return m_poissonRatio; }
50+
void setPoissonRatio(const float val) { m_poissonRatio = val; }
51+
bool getNormalizeStretch() const { return m_normalizeStretch; }
52+
void setNormalizeStretch(bool val) { m_normalizeStretch = val; }
53+
bool getNormalizeShear() const { return m_normalizeShear; }
54+
void setNormalizeShear(bool val) { m_normalizeShear = val; }
55+
56+
void setGeometry(const unsigned int nPoints, Eigen::Vector3f* coords, const unsigned int nTets, unsigned int* indices);
57+
virtual void reset();
58+
59+
std::vector<TetConstraint> &getTetConstraints();
60+
61+
};
62+
}
63+
64+
#endif

0 commit comments

Comments
 (0)