Files
Webcam/include/modules/physic_bullet/bullet_world.h
2026-06-22 11:49:35 +02:00

128 lines
3.3 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
------------------------------------------------------------------------------*/
#ifndef __NBULLETPHYSICWORLD__
#define __NBULLETPHYSICWORLD__
#include "nstring/nstring.h"
/*
@short Enable multi-threading support in Bullet Dynamics.
Not working at the moment (need to let the API stabilize a bit first).
*/
#define __ENABLE_BULLET_MULTITHREAD__ 0
/*
@short Number of thread used by Bullet.
*/
#define __BULLET_THREAD_COUNT__ 3
#include "memory/nauto_ptr.h"
#include "memory/nshared_ptr.h"
#include "physic/physic_world.h"
#include "btBulletDynamicsCommon.h"
#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h"
#if __ENABLE_BULLET_MULTITHREAD__
#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h"
#include "BulletMultiThreaded/PlatformDefinitions.h"
#if __PLATFORM_WINDOWS__
#include "BulletMultiThreaded/Win32ThreadSupport.h"
#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h"
#elif __PLATFORM_LINUX__
#include "BulletMultiThreaded/PosixThreadSupport.h"
#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h"
#endif
#endif
namespace GS {
namespace S3D {
class Scene;
class BulletDebugDraw;
/// Bullet convex hull.
struct BulletConvex : public SharedObject
{
String name;
Vector4 center;
AutoPtr <btConvexHullShape> convex;
};
/// Bullet mesh.
struct BulletMesh : public SharedObject
{
String name;
String suffix;
Vector4 center;
Array <String> bt_mat;
Array <ushort> bt_id_mat;
Array <btScalar> bt_vtx;
Array <int> bt_idx;
AutoPtr <btTriangleIndexVertexArray> mesh_interface;
AutoPtr <btBvhTriangleMeshShape> mesh;
};
/*!
@short Bullet physic world.
@author Emmanuel Julien (ejulien@gsworks.fr)
*/
class BulletWorld : public PhysicWorld
{
protected:
SharedList <BulletMesh *> mesh_cache;
SharedList <BulletConvex *> convex_cache;
AutoPtr <btDiscreteDynamicsWorld> world;
AutoPtr <btBroadphaseInterface> broadphase;
AutoPtr <btCollisionDispatcher> dispatcher;
AutoPtr <btDefaultCollisionConfiguration> collision_config;
AutoPtr <btSequentialImpulseConstraintSolver> solver;
AutoPtr <btOverlappingPairCallback> pair_callback;
#if __ENABLE_BULLET_MULTITHREAD__
AutoPtr <btThreadSupportInterface> thread_support_collision;
#endif
AutoPtr <BulletDebugDraw> debug_draw;
public:
PhysicItem *NewItem();
PhysicConstraint *NewConstraint();
BulletConvex *LoadConvex(const char *);
BulletMesh *LoadMesh(const char *, const char *suffix);
void ClearConvexMeshCache();
bool HasDebugger() const;
void CreateDebugger(Renderer * = 0);
void DrawDebug(Renderer &, Camera *, RasterFont *, bool xray_first_pass);
/// Raytrace world, the callback object Process() method is called on each hit.
bool Raytrace(const Vector4 &s, const Vector4 &d, PhysicTrace &, int collision_mask = ~0, int shape_mask = ~0, float max_distance = -1.f);
uint GetCollisionPairCount();
bool GetCollisionPair(uint, CollisionPair &);
void Step(const Time &dt);
bool Create();
void Delete();
BulletWorld();
~BulletWorld();
};
} // S3D
} // GS
#endif // __NBULLETPHYSICWORLD__