/** * PANDA 3D SOFTWARE * Copyright (c) Carnegie Mellon University. All rights reserved. * * All use of this software is subject to the terms of the revised BSD * license. You should have received a copy of this license along * with this source code in a file named "LICENSE." * * @file bulletWorld.h * @author enn0x * @date 2010-01-23 */ #ifndef __BULLET_WORLD_H__ #define __BULLET_WORLD_H__ #include "pandabase.h" #include "bullet_includes.h" #include "bullet_utils.h" #include "bulletClosestHitRayResult.h" #include "bulletAllHitsRayResult.h" #include "bulletClosestHitSweepResult.h" #include "bulletContactResult.h" #include "bulletDebugNode.h" #include "bulletBaseCharacterControllerNode.h" #include "bulletConstraint.h" #include "bulletGhostNode.h" #include "bulletRigidBodyNode.h" #include "bulletSoftBodyNode.h" #include "bulletVehicle.h" #include "typedReferenceCount.h" #include "transformState.h" #include "pandaNode.h" #include "callbackObject.h" #include "collideMask.h" #include "luse.h" #include "lightMutex.h" class BulletPersistentManifold; class BulletShape; class BulletSoftBodyWorldInfo; extern EXPCL_PANDABULLET PT(CallbackObject) bullet_contact_added_callback; /** * */ class EXPCL_PANDABULLET BulletWorld : public TypedReferenceCount { PUBLISHED: BulletWorld(); INLINE ~BulletWorld(); void set_gravity(const LVector3 &gravity); void set_gravity(PN_stdfloat gx, PN_stdfloat gy, PN_stdfloat gz); const LVector3 get_gravity() const; int do_physics(PN_stdfloat dt, int max_substeps=1, PN_stdfloat stepsize=1.0f/60.0f); BulletSoftBodyWorldInfo get_world_info(); // Debug void set_debug_node(BulletDebugNode *node); void clear_debug_node(); INLINE BulletDebugNode *get_debug_node() const; INLINE bool has_debug_node() const; // AttachRemove void attach(TypedObject *object); void remove(TypedObject *object); void attach_constraint(BulletConstraint *constraint, bool linked_collision=false); // Ghost object int get_num_ghosts() const; BulletGhostNode *get_ghost(int idx) const; MAKE_SEQ(get_ghosts, get_num_ghosts, get_ghost); // Rigid body int get_num_rigid_bodies() const; BulletRigidBodyNode *get_rigid_body(int idx) const; MAKE_SEQ(get_rigid_bodies, get_num_rigid_bodies, get_rigid_body); // Soft body int get_num_soft_bodies() const; BulletSoftBodyNode *get_soft_body(int idx) const; MAKE_SEQ(get_soft_bodies, get_num_soft_bodies, get_soft_body); // Character controller int get_num_characters() const; BulletBaseCharacterControllerNode *get_character(int idx) const; MAKE_SEQ(get_characters, get_num_characters, get_character); int get_num_vehicles() const; BulletVehicle *get_vehicle(int idx) const; MAKE_SEQ(get_vehicles, get_num_vehicles, get_vehicle); // Constraint int get_num_constraints() const; BulletConstraint *get_constraint(int idx) const; MAKE_SEQ(get_constraints, get_num_constraints, get_constraint); // Raycast and other queries BulletClosestHitRayResult ray_test_closest( const LPoint3 &from_pos, const LPoint3 &to_pos, const CollideMask &mask=CollideMask::all_on()) const; BulletAllHitsRayResult ray_test_all( const LPoint3 &from_pos, const LPoint3 &to_pos, const CollideMask &mask=CollideMask::all_on()) const; BulletClosestHitSweepResult sweep_test_closest( BulletShape *shape, const TransformState &from_ts, const TransformState &to_ts, const CollideMask &mask=CollideMask::all_on(), PN_stdfloat penetration=0.0f) const; BulletContactResult contact_test(PandaNode *node, bool use_filter=false) const; BulletContactResult contact_test_pair(PandaNode *node0, PandaNode *node1) const; bool filter_test(PandaNode *node0, PandaNode *node1) const; // Manifolds int get_num_manifolds() const; BulletPersistentManifold *get_manifold(int idx) const; MAKE_SEQ(get_manifolds, get_num_manifolds, get_manifold); // Collision filtering void set_group_collision_flag(unsigned int group1, unsigned int group2, bool enable); bool get_group_collision_flag(unsigned int group1, unsigned int group2) const; void set_force_update_all_aabbs(bool force); bool get_force_update_all_aabbs() const; // Callbacks void set_contact_added_callback(CallbackObject *obj); void clear_contact_added_callback(); void set_tick_callback(CallbackObject *obj, bool is_pretick=false); void clear_tick_callback(); void set_filter_callback(CallbackObject *obj); void clear_filter_callback(); // Configuration enum BroadphaseAlgorithm { BA_sweep_and_prune, BA_dynamic_aabb_tree, }; enum FilterAlgorithm { FA_mask, FA_groups_mask, FA_callback, }; MAKE_PROPERTY(gravity, get_gravity, set_gravity); MAKE_PROPERTY(world_info, get_world_info); MAKE_PROPERTY2(debug_node, has_debug_node, get_debug_node, set_debug_node, clear_debug_node); MAKE_SEQ_PROPERTY(ghosts, get_num_ghosts, get_ghost); MAKE_SEQ_PROPERTY(rigid_bodies, get_num_rigid_bodies, get_rigid_body); MAKE_SEQ_PROPERTY(soft_bodies, get_num_soft_bodies, get_soft_body); MAKE_SEQ_PROPERTY(characters, get_num_characters, get_character); MAKE_SEQ_PROPERTY(vehicles, get_num_vehicles, get_vehicle); MAKE_SEQ_PROPERTY(constraints, get_num_constraints, get_constraint); MAKE_SEQ_PROPERTY(manifolds, get_num_manifolds, get_manifold); MAKE_PROPERTY(force_update_all_aabbs, get_force_update_all_aabbs, set_force_update_all_aabbs); PUBLISHED: // Deprecated methods, will be removed soon void attach_ghost(BulletGhostNode *node); void remove_ghost(BulletGhostNode *node); void attach_rigid_body(BulletRigidBodyNode *node); void remove_rigid_body(BulletRigidBodyNode *node); void attach_soft_body(BulletSoftBodyNode *node); void remove_soft_body(BulletSoftBodyNode *node); void attach_character(BulletBaseCharacterControllerNode *node); void remove_character(BulletBaseCharacterControllerNode *node); void attach_vehicle(BulletVehicle *vehicle); void remove_vehicle(BulletVehicle *vehicle); void remove_constraint(BulletConstraint *constraint); public: static btCollisionObject *get_collision_object(PandaNode *node); INLINE btDynamicsWorld *get_world() const; INLINE btBroadphaseInterface *get_broadphase() const; INLINE btDispatcher *get_dispatcher() const; static LightMutex &get_global_lock(); private: void do_sync_p2b(PN_stdfloat dt, int num_substeps); void do_sync_b2p(); void do_attach_ghost(BulletGhostNode *node); void do_remove_ghost(BulletGhostNode *node); void do_attach_rigid_body(BulletRigidBodyNode *node); void do_remove_rigid_body(BulletRigidBodyNode *node); void do_attach_soft_body(BulletSoftBodyNode *node); void do_remove_soft_body(BulletSoftBodyNode *node); void do_attach_character(BulletBaseCharacterControllerNode *node); void do_remove_character(BulletBaseCharacterControllerNode *node); void do_attach_vehicle(BulletVehicle *vehicle); void do_remove_vehicle(BulletVehicle *vehicle); void do_attach_constraint(BulletConstraint *constraint, bool linked_collision=false); void do_remove_constraint(BulletConstraint *constraint); static void tick_callback(btDynamicsWorld *world, btScalar timestep); typedef PTA(PT(BulletRigidBodyNode)) BulletRigidBodies; typedef PTA(PT(BulletSoftBodyNode)) BulletSoftBodies; typedef PTA(PT(BulletGhostNode)) BulletGhosts; typedef PTA(PT(BulletBaseCharacterControllerNode)) BulletCharacterControllers; typedef PTA(PT(BulletVehicle)) BulletVehicles; typedef PTA(PT(BulletConstraint)) BulletConstraints; static PStatCollector _pstat_physics; static PStatCollector _pstat_simulation; static PStatCollector _pstat_p2b; static PStatCollector _pstat_b2p; struct btFilterCallback1 : public btOverlapFilterCallback { virtual bool needBroadphaseCollision( btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const; }; struct btFilterCallback2 : public btOverlapFilterCallback { virtual bool needBroadphaseCollision( btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const; CollideMask _collide[32]; }; struct btFilterCallback3 : public btOverlapFilterCallback { virtual bool needBroadphaseCollision( btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const; PT(CallbackObject) _filter_callback_obj; }; btBroadphaseInterface *_broadphase; btCollisionConfiguration *_configuration; btCollisionDispatcher *_dispatcher; btConstraintSolver *_solver; btSoftRigidDynamicsWorld *_world; btGhostPairCallback _ghost_cb; FilterAlgorithm _filter_algorithm; btFilterCallback1 _filter_cb1; btFilterCallback2 _filter_cb2; btFilterCallback3 _filter_cb3; btOverlapFilterCallback *_filter_cb; PT(CallbackObject) _tick_callback_obj; PT(BulletDebugNode) _debug; btSoftBodyWorldInfo _info; BulletRigidBodies _bodies; BulletSoftBodies _softbodies; BulletGhosts _ghosts; BulletCharacterControllers _characters; BulletVehicles _vehicles; BulletConstraints _constraints; public: static TypeHandle get_class_type() { return _type_handle; } static void init_type() { TypedReferenceCount::init_type(); register_type(_type_handle, "BulletWorld", TypedReferenceCount::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); } virtual TypeHandle force_init_type() { init_type(); return get_class_type(); } private: static TypeHandle _type_handle; }; EXPCL_PANDABULLET std::ostream & operator << (std::ostream &out, BulletWorld::BroadphaseAlgorithm algorithm); EXPCL_PANDABULLET std::istream & operator >> (std::istream &in, BulletWorld::BroadphaseAlgorithm &algorithm); EXPCL_PANDABULLET std::ostream & operator << (std::ostream &out, BulletWorld::FilterAlgorithm algorithm); EXPCL_PANDABULLET std::istream & operator >> (std::istream &in, BulletWorld::FilterAlgorithm &algorithm); #include "bulletWorld.I" #endif // __BULLET_WORLD_H__