149 lines
4.8 KiB
C++
149 lines
4.8 KiB
C++
|
/*
|
||
|
Bullet Continuous Collision Detection and Physics Library
|
||
|
Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
|
||
|
|
||
|
This software is provided 'as-is', without any express or implied warranty.
|
||
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
||
|
Permission is granted to anyone to use this software for any purpose,
|
||
|
including commercial applications, and to alter it and redistribute it freely,
|
||
|
subject to the following restrictions:
|
||
|
|
||
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
||
|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||
|
3. This notice may not be removed or altered from any source distribution.
|
||
|
*/
|
||
|
|
||
|
#ifndef BT_SOFT_BODY_HELPERS_H
|
||
|
#define BT_SOFT_BODY_HELPERS_H
|
||
|
|
||
|
#include "btSoftBody.h"
|
||
|
|
||
|
//
|
||
|
// Helpers
|
||
|
//
|
||
|
|
||
|
/* fDrawFlags */
|
||
|
struct fDrawFlags { enum _ {
|
||
|
Nodes = 0x0001,
|
||
|
Links = 0x0002,
|
||
|
Faces = 0x0004,
|
||
|
Tetras = 0x0008,
|
||
|
Normals = 0x0010,
|
||
|
Contacts = 0x0020,
|
||
|
Anchors = 0x0040,
|
||
|
Notes = 0x0080,
|
||
|
Clusters = 0x0100,
|
||
|
NodeTree = 0x0200,
|
||
|
FaceTree = 0x0400,
|
||
|
ClusterTree = 0x0800,
|
||
|
Joints = 0x1000,
|
||
|
/* presets */
|
||
|
Std = Links+Faces+Tetras+Anchors+Notes+Joints,
|
||
|
StdTetra = Std-Faces+Tetras
|
||
|
};};
|
||
|
|
||
|
struct btSoftBodyHelpers
|
||
|
{
|
||
|
/* Draw body */
|
||
|
static void Draw( btSoftBody* psb,
|
||
|
btIDebugDraw* idraw,
|
||
|
int drawflags=fDrawFlags::Std);
|
||
|
/* Draw body infos */
|
||
|
static void DrawInfos( btSoftBody* psb,
|
||
|
btIDebugDraw* idraw,
|
||
|
bool masses,
|
||
|
bool areas,
|
||
|
bool stress);
|
||
|
/* Draw node tree */
|
||
|
static void DrawNodeTree( btSoftBody* psb,
|
||
|
btIDebugDraw* idraw,
|
||
|
int mindepth=0,
|
||
|
int maxdepth=-1);
|
||
|
/* Draw face tree */
|
||
|
static void DrawFaceTree( btSoftBody* psb,
|
||
|
btIDebugDraw* idraw,
|
||
|
int mindepth=0,
|
||
|
int maxdepth=-1);
|
||
|
/* Draw cluster tree */
|
||
|
static void DrawClusterTree(btSoftBody* psb,
|
||
|
btIDebugDraw* idraw,
|
||
|
int mindepth=0,
|
||
|
int maxdepth=-1);
|
||
|
/* Draw rigid frame */
|
||
|
static void DrawFrame( btSoftBody* psb,
|
||
|
btIDebugDraw* idraw);
|
||
|
/* Create a rope */
|
||
|
static btSoftBody* CreateRope( btSoftBodyWorldInfo& worldInfo,
|
||
|
const btVector3& from,
|
||
|
const btVector3& to,
|
||
|
int res,
|
||
|
int fixeds);
|
||
|
/* Create a patch */
|
||
|
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);
|
||
|
/* Create a patch with UV Texture Coordinates */
|
||
|
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 float CalculateUV(int resx,int resy,int ix,int iy,int id);
|
||
|
/* Create an ellipsoid */
|
||
|
static btSoftBody* CreateEllipsoid(btSoftBodyWorldInfo& worldInfo,
|
||
|
const btVector3& center,
|
||
|
const btVector3& radius,
|
||
|
int res);
|
||
|
/* Create from trimesh */
|
||
|
static btSoftBody* CreateFromTriMesh( btSoftBodyWorldInfo& worldInfo,
|
||
|
const btScalar* vertices,
|
||
|
const int* triangles,
|
||
|
int ntriangles,
|
||
|
bool randomizeConstraints = true);
|
||
|
/* Create from convex-hull */
|
||
|
static btSoftBody* CreateFromConvexHull( btSoftBodyWorldInfo& worldInfo,
|
||
|
const btVector3* vertices,
|
||
|
int nvertices,
|
||
|
bool randomizeConstraints = true);
|
||
|
|
||
|
|
||
|
/* Export TetGen compatible .smesh file */
|
||
|
// static void ExportAsSMeshFile( btSoftBody* psb,
|
||
|
// const char* filename);
|
||
|
/* Create from TetGen .ele, .face, .node files */
|
||
|
// static btSoftBody* CreateFromTetGenFile( btSoftBodyWorldInfo& worldInfo,
|
||
|
// const char* ele,
|
||
|
// const char* face,
|
||
|
// const char* node,
|
||
|
// bool bfacelinks,
|
||
|
// bool btetralinks,
|
||
|
// bool bfacesfromtetras);
|
||
|
/* Create from TetGen .ele, .face, .node data */
|
||
|
static btSoftBody* CreateFromTetGenData( btSoftBodyWorldInfo& worldInfo,
|
||
|
const char* ele,
|
||
|
const char* face,
|
||
|
const char* node,
|
||
|
bool bfacelinks,
|
||
|
bool btetralinks,
|
||
|
bool bfacesfromtetras);
|
||
|
|
||
|
/// Sort the list of links to move link calculations that are dependent upon earlier
|
||
|
/// ones as far as possible away from the calculation of those values
|
||
|
/// This tends to make adjacent loop iterations not dependent upon one another,
|
||
|
/// so out-of-order processors can execute instructions from multiple iterations at once
|
||
|
static void ReoptimizeLinkOrder(btSoftBody *psb );
|
||
|
};
|
||
|
|
||
|
#endif //BT_SOFT_BODY_HELPERS_H
|