forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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
 |