101 for (
int i = 1,
ni =
items.size(); i <
ni; ++i)
110template <
typename T,
typename Q>
113 for (
int i = 0,
ni =
items.size(); i <
ni; ++i)
120template <
typename T,
typename Q>
123 for (
int i = 0,
ni =
items.size(); i <
ni; ++i)
201#define USE_NEW_CONVEX_HULL_COMPUTER
202#ifdef USE_NEW_CONVEX_HULL_COMPUTER
205 int count = vertices.
size();
209 for (
int i = 0; i <
computer.faces.size(); i++)
220 int v2 =
edge->getTargetVertex();
232 hdsc.mMaxVertices = vertices.
size();
235 add(
hres.m_OutputVertices, -center);
237 add(
hres.m_OutputVertices, center);
240 const int idx[] = {
hres.m_Indices[
j * 3 + 0],
hres.m_Indices[
j * 3 + 1],
hres.m_Indices[
j * 3 + 2]};
331 const btVector3 c = (x[0] + x[1] + x[2]) / 3;
332 idraw->drawTriangle((x[0] - c) *
scl + c,
333 (x[1] - c) *
scl + c,
334 (x[2] - c) *
scl + c,
348 const btVector3 x[] = {
t.m_n[0]->m_x,
t.m_n[1]->m_x,
t.m_n[2]->m_x,
t.m_n[3]->m_x};
349 const btVector3 c = (x[0] + x[1] + x[2] + x[3]) / 4;
350 idraw->drawTriangle((x[0] - c) *
scl + c, (x[1] - c) *
scl + c, (x[2] - c) *
scl + c,
col,
alp);
351 idraw->drawTriangle((x[0] - c) *
scl + c, (x[1] - c) *
scl + c, (x[3] - c) *
scl + c,
col,
alp);
352 idraw->drawTriangle((x[1] - c) *
scl + c, (x[2] - c) *
scl + c, (x[3] - c) *
scl + c,
col,
alp);
353 idraw->drawTriangle((x[2] - c) *
scl + c, (x[0] - c) *
scl + c, (x[3] - c) *
scl + c,
col,
alp);
423 const btVector3 a0 =
pj->m_bodies[0].xform().getBasis() *
pj->m_refs[0];
424 const btVector3 a1 =
pj->m_bodies[1].xform().getBasis() *
pj->m_refs[1];
449 char text[2048] = {0};
471 drawTree(
idraw, psb->
m_ndbvt.
m_root, 0,
btVector3(1, 0, 1),
btVector3(1, 1, 1),
mindepth, maxdepth);
480 drawTree(
idraw, psb->
m_fdbvt.
m_root, 0,
btVector3(0, 1, 0),
btVector3(1, 0, 0),
mindepth, maxdepth);
489 drawTree(
idraw, psb->
m_cdbvt.
m_root, 0,
btVector3(0, 1, 1),
btVector3(1, 0, 0),
mindepth, maxdepth);
540#define REOP_NOT_DEPENDENT -1
541#define REOP_NODE_COMPLETE -2
566 for (i = 0; i <
nNodes + 1; i++)
570 for (i = 0; i <
nLinks; i++)
577 for (i = 0; i <
nLinks; i++)
697 const int r =
res + 2;
702 for (i = 0; i < r; ++i)
714 for (i = 1; i < r; ++i)
733#define IDX(_x_, _y_) ((_y_)*rx + (_x_))
735 if ((
resx < 2) || (
resy < 2))
return (0);
774 const bool mdx = (
ix + 1) <
rx;
775 const bool mdy = (
iy + 1) <
ry;
885#define IDX(_x_, _y_) ((_y_)*rx + (_x_))
887 if ((
resx < 2) || (
resy < 2))
return (0);
927 const bool mdx = (
ix + 1) <
rx;
928 const bool mdy = (
iy + 1) <
ry;
1011 tc = (1.0f / ((
resx - 1)) * (
ix + 1));
1024 for (
int i = 0; i < n; i++)
1027 for (
int j = i;
j; p *= 0.5,
j >>= 1)
1038 Hammersley::Generate(&
vtx[0],
vtx.size());
1039 for (
int i = 0; i <
vtx.size(); ++i)
1063 for (i = 0,
j = 0,
ni =
maxidx * 3; i <
ni; ++
j, i += 3)
1065 vtx[
j] =
btVector3(vertices[i], vertices[i + 1], vertices[i + 2]);
1071#define IDX(_x_, _y_) ((_y_)*maxidx + (_x_))
1072 for (
int j = 2,
k = 0;
k < 3;
j =
k++)
1085 if (randomizeConstraints)
1095 int nvertices,
bool randomizeConstraints)
1103 &
hres.m_OutputVertices[0], 0);
1104 for (
int i = 0; i < (
int)
hres.mNumFaces; ++i)
1106 const int idx[] = {
static_cast<int>(
hres.m_Indices[i * 3 + 0]),
1107 static_cast<int>(
hres.m_Indices[i * 3 + 1]),
1108 static_cast<int>(
hres.m_Indices[i * 3 + 2])};
1115 if (randomizeConstraints)
1159 for (
int i = 0; i <
pos.size(); ++i)
1164 sscanf(node,
"%d %f %f %f", &index, &x, &y, &z);
1186 for(
int i=0;i<
nface;++i)
1214 for (
int i = 0; i <
ntetra; ++i)
1264 while (std::getline(
fs,
line))
1266 std::stringstream
ss(
line);
1267 if (
line.size() == (
size_t)(0))
1270 else if (
line.substr(0, 6) ==
"POINTS")
1274 ss.ignore(128,
' ');
1278 else if (
line.substr(0, 5) ==
"CELLS")
1282 ss.ignore(128,
' ');
1286 else if (
line.substr(0, 10) ==
"CELL_TYPES")
1309 printf(
"Load deformable failed: Only Tetrahedra are supported in VTK file.\n");
1313 ss.ignore(128,
' ');
1316 for (
size_t i = 0; i < 4; i++)
1327 for (
int i = 0; i <
n_tets; ++i)
1364 for (
int i = 0; i <
indices.size(); ++i)
1367 index.push_back(psb->
m_tetras[i].m_n[0]->index);
1368 index.push_back(psb->
m_tetras[i].m_n[1]->index);
1369 index.push_back(psb->
m_tetras[i].m_n[2]->index);
1370 index.push_back(psb->
m_tetras[i].m_n[3]->index);
1374 std::map<std::vector<int>, std::vector<int> >
dict;
1375 for (
int i = 0; i <
indices.size(); ++i)
1377 for (
int j = 0;
j < 4; ++
j)
1419 std::vector<int> f =
it->second;
1435 std::map<int, int>
dict;
1438 for (
int d = 0; d < 3; d++)
1440 int index = psb->
m_faces[i].m_n[d]->index;
1441 if (
dict.find(index) ==
dict.end())
1446 for (
int k = 0;
k < 3;
k++)
1458 for (
int n = 0; n < 3; n++)
1471 for (
int d = 0; d < 3; d++)
1481 for (
int n = 0; n < 3; n++)
1483 fs <<
" " << psb->
m_faces[i].m_n[n]->index + 1;
1497 fs << std::scientific << std::setprecision(16);
1503 for (
int d = 0; d < 3; d++)
1513 for (
int d = 0; d < 3; d++)
1531 std::stringstream
ss(
line);
1535 else if (
line[0] ==
'f')
1556 for (
int n = 0; n < 3; n++)
1588 btVector3 v0 = b - a, v1 = c - a, v2 = p - a;
1620 for (
int k = 1;
k < 4; ++
k)
1669 for (
int k = 1;
k < 3; ++
k)
const T & btMax(const T &a, const T &b)
const T & btMin(const T &a, const T &b)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btSqrt(btScalar y)
btScalar btSin(btScalar x)
btScalar btFabs(btScalar x)
btScalar btCos(btScalar x)
static T average(const btAlignedObjectArray< T > &items)
#define REOP_NODE_COMPLETE
static void drawTree(btIDebugDraw *idraw, const btDbvtNode *node, int depth, const btVector3 &ncolor, const btVector3 &lcolor, int mindepth, int maxdepth)
static void mul(btAlignedObjectArray< T > &items, const Q &value)
static int nextLine(const char *buffer)
static void add(btAlignedObjectArray< T > &items, const Q &value)
static T sum(const btAlignedObjectArray< T > &items)
static void drawBox(btIDebugDraw *idraw, const btVector3 &mins, const btVector3 &maxs, const btVector3 &color)
#define REOP_NOT_DEPENDENT
static void drawVertex(btIDebugDraw *idraw, const btVector3 &x, btScalar s, const btVector3 &c)
btSoftBodyHelpers.cpp by Nathanael Presson
LinkDeps_t * LinkDepsPtr_t
btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
btVector3 btCross(const btVector3 &v1, const btVector3 &v2)
Return the cross product of two vectors.
btVector3 lerp(const btVector3 &v1, const btVector3 &v2, const btScalar &t)
Return the linear interpolation between two vectors.
The HullLibrary class can create a convex hull from a collection of vertices, using the ComputeHull m...
HullError CreateConvexHull(const HullDesc &desc, HullResult &result)
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
void resize(int newsize, const T &fillData=T())
void push_back(const T &_Val)
btTransform & getWorldTransform()
const Edge * getNextEdgeOfFace() const
int getSourceVertex() const
Convex hull implementation based on Preparata and Hong See http://code.google.com/p/bullet/issues/det...
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
The btSoftBody is an class to simulate cloth and volumetric soft bodies.
void appendFace(int model=-1, Material *mat=0)
void setMass(int node, btScalar mass)
btAlignedObjectArray< TetraScratch > m_tetraScratchesTn
void appendTetra(int model, Material *mat)
btAlignedObjectArray< TetraScratch > m_tetraScratches
btAlignedObjectArray< btVector4 > m_renderNodesInterpolationWeights
btAlignedObjectArray< btScalar > m_z
tRContactArray m_rcontacts
btAlignedObjectArray< btAlignedObjectArray< const btSoftBody::Node * > > m_renderNodesParents
tRenderNodeArray m_renderNodes
void randomizeConstraints()
void appendLink(int model=-1, Material *mat=0)
void initializeDmInverse()
btVector3 can be used to represent 3D points and vectors.
void setZ(btScalar _z)
Set the z value.
int minAxis() const
Return the axis with the smallest value Note return values are 0,1,2 for x, y, or z.
btVector3 normalized() const
Return a normalized version of this vector.
void setY(btScalar _y)
Set the y value.
void setX(btScalar _x)
Set the x value.
DBVT_INLINE btVector3 Extents() const
DBVT_INLINE btVector3 Center() const
DBVT_INLINE bool isinternal() const
DBVT_INLINE bool isleaf() const
static btSoftBody * CreatePatchUV(btSoftBodyWorldInfo &worldInfo, const btVector3 &corner00, const btVector3 &corner10, const btVector3 &corner01, const btVector3 &corner11, int resx, int resy, int fixeds, bool gendiags, float *tex_coords=0)
static void writeObj(const char *file, const btSoftBody *psb)
static btSoftBody * CreateFromTriMesh(btSoftBodyWorldInfo &worldInfo, const btScalar *vertices, const int *triangles, int ntriangles, bool randomizeConstraints=true)
static void extrapolateBarycentricWeights(btSoftBody *psb)
static void DrawNodeTree(btSoftBody *psb, btIDebugDraw *idraw, int mindepth=0, int maxdepth=-1)
static void getBarycentricWeights(const btVector3 &a, const btVector3 &b, const btVector3 &c, const btVector3 &d, const btVector3 &p, btVector4 &bary)
static btSoftBody * CreateFromTetGenData(btSoftBodyWorldInfo &worldInfo, const char *ele, const char *face, const char *node, bool bfacelinks, bool btetralinks, bool bfacesfromtetras)
static btSoftBody * CreateFromConvexHull(btSoftBodyWorldInfo &worldInfo, const btVector3 *vertices, int nvertices, bool randomizeConstraints=true)
static btSoftBody * CreateFromVtkFile(btSoftBodyWorldInfo &worldInfo, const char *vtk_file)
static void ReoptimizeLinkOrder(btSoftBody *psb)
Sort the list of links to move link calculations that are dependent upon earlier ones as far as possi...
static void DrawFaceTree(btSoftBody *psb, btIDebugDraw *idraw, int mindepth=0, int maxdepth=-1)
static void DrawInfos(btSoftBody *psb, btIDebugDraw *idraw, bool masses, bool areas, bool stress)
static btSoftBody * CreateEllipsoid(btSoftBodyWorldInfo &worldInfo, const btVector3 ¢er, const btVector3 &radius, int res)
static void DrawClusterTree(btSoftBody *psb, btIDebugDraw *idraw, int mindepth=0, int maxdepth=-1)
static float CalculateUV(int resx, int resy, int ix, int iy, int id)
static btSoftBody * CreatePatch(btSoftBodyWorldInfo &worldInfo, const btVector3 &corner00, const btVector3 &corner10, const btVector3 &corner01, const btVector3 &corner11, int resx, int resy, int fixeds, bool gendiags, btScalar perturbation=0.)
static void generateBoundaryFaces(btSoftBody *psb)
static void Draw(btSoftBody *psb, btIDebugDraw *idraw, int drawflags=fDrawFlags::Std)
static void duplicateFaces(const char *filename, const btSoftBody *psb)
static void DrawFrame(btSoftBody *psb, btIDebugDraw *idraw)
static void writeState(const char *file, const btSoftBody *psb)
static btSoftBody * CreateRope(btSoftBodyWorldInfo &worldInfo, const btVector3 &from, const btVector3 &to, int res, int fixeds)
static void interpolateBarycentricWeights(btSoftBody *psb)
btAlignedObjectArray< Node * > m_nodes