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
 |