00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __BULLET_WORLD_H__
00016 #define __BULLET_WORLD_H__
00017
00018 #include "pandabase.h"
00019
00020 #include "bullet_includes.h"
00021 #include "bullet_utils.h"
00022
00023 #include "bulletClosestHitRayResult.h"
00024 #include "bulletAllHitsRayResult.h"
00025 #include "bulletClosestHitSweepResult.h"
00026 #include "bulletContactResult.h"
00027 #include "bulletDebugNode.h"
00028 #include "bulletBaseCharacterControllerNode.h"
00029 #include "bulletConstraint.h"
00030 #include "bulletGhostNode.h"
00031 #include "bulletRigidBodyNode.h"
00032 #include "bulletSoftBodyNode.h"
00033 #include "bulletVehicle.h"
00034
00035 #include "typedReferenceCount.h"
00036 #include "transformState.h"
00037 #include "pandaNode.h"
00038 #include "collideMask.h"
00039 #include "luse.h"
00040
00041 class BulletPersistentManifold;
00042 class BulletShape;
00043 class BulletSoftBodyWorldInfo;
00044
00045
00046
00047
00048
00049 class EXPCL_PANDABULLET BulletWorld : public TypedReferenceCount {
00050
00051 PUBLISHED:
00052 BulletWorld();
00053 INLINE ~BulletWorld();
00054
00055 void set_gravity(const LVector3 &gravity);
00056 void set_gravity(PN_stdfloat gx, PN_stdfloat gy, PN_stdfloat gz);
00057 const LVector3 get_gravity() const;
00058
00059 int do_physics(PN_stdfloat dt, int max_substeps=1, PN_stdfloat stepsize=1.0f/60.0f);
00060
00061 void set_debug_node(BulletDebugNode *node);
00062 void clear_debug_node();
00063
00064 BulletSoftBodyWorldInfo get_world_info();
00065
00066
00067 void attach_ghost(BulletGhostNode *node);
00068 void remove_ghost(BulletGhostNode *node);
00069
00070 INLINE int get_num_ghosts() const;
00071 INLINE BulletGhostNode *get_ghost(int idx) const;
00072 MAKE_SEQ(get_ghosts, get_num_ghosts, get_ghost);
00073
00074
00075 void attach_rigid_body(BulletRigidBodyNode *node);
00076 void remove_rigid_body(BulletRigidBodyNode *node);
00077
00078 INLINE int get_num_rigid_bodies() const;
00079 INLINE BulletRigidBodyNode *get_rigid_body(int idx) const;
00080 MAKE_SEQ(get_rigid_bodies, get_num_rigid_bodies, get_rigid_body);
00081
00082
00083 void attach_soft_body(BulletSoftBodyNode *node);
00084 void remove_soft_body(BulletSoftBodyNode *node);
00085
00086 INLINE int get_num_soft_bodies() const;
00087 INLINE BulletSoftBodyNode *get_soft_body(int idx) const;
00088 MAKE_SEQ(get_soft_bodies, get_num_soft_bodies, get_soft_body);
00089
00090
00091 void attach_character(BulletBaseCharacterControllerNode *node);
00092 void remove_character(BulletBaseCharacterControllerNode *node);
00093
00094 INLINE int get_num_characters() const;
00095 INLINE BulletBaseCharacterControllerNode *get_character(int idx) const;
00096 MAKE_SEQ(get_characters, get_num_characters, get_character);
00097
00098
00099 void attach_vehicle(BulletVehicle *vehicle);
00100 void remove_vehicle(BulletVehicle *vehicle);
00101
00102 INLINE int get_num_vehicles() const;
00103 INLINE BulletVehicle *get_vehicle(int idx) const;
00104 MAKE_SEQ(get_vehicles, get_num_vehicles, get_vehicle);
00105
00106
00107 void attach_constraint(BulletConstraint *constraint);
00108 void remove_constraint(BulletConstraint *constraint);
00109
00110 INLINE int get_num_constraints() const;
00111 INLINE BulletConstraint *get_constraint(int idx) const;
00112 MAKE_SEQ(get_constraints, get_num_constraints, get_constraint);
00113
00114
00115 BulletClosestHitRayResult ray_test_closest(
00116 const LPoint3 &from_pos,
00117 const LPoint3 &to_pos,
00118 const CollideMask &mask=CollideMask::all_on()) const;
00119
00120 BulletAllHitsRayResult ray_test_all(
00121 const LPoint3 &from_pos,
00122 const LPoint3 &to_pos,
00123 const CollideMask &mask=CollideMask::all_on()) const;
00124
00125 BulletClosestHitSweepResult sweep_test_closest(
00126 BulletShape *shape,
00127 const TransformState &from_ts,
00128 const TransformState &to_ts,
00129 const CollideMask &mask=CollideMask::all_on(),
00130 PN_stdfloat penetration=0.0f) const;
00131
00132 BulletContactResult contact_test(PandaNode *node) const;
00133 BulletContactResult contact_test_pair(PandaNode *node0, PandaNode *node1) const;
00134
00135
00136 INLINE int get_num_manifolds() const;
00137 BulletPersistentManifold *get_manifold(int idx) const;
00138 MAKE_SEQ(get_manifolds, get_num_manifolds, get_manifold);
00139
00140
00141 void set_group_collision_flag(unsigned int group1, unsigned int group2, bool enable);
00142 bool get_group_collision_flag(unsigned int group1, unsigned int group2) const;
00143
00144
00145 enum BroadphaseAlgorithm {
00146 BA_sweep_and_prune,
00147 BA_dynamic_aabb_tree,
00148 };
00149
00150 enum FilterAlgorithm {
00151 FA_mask,
00152 FA_groups_mask,
00153 };
00154
00155 public:
00156 static btCollisionObject *get_collision_object(PandaNode *node);
00157
00158 INLINE btDynamicsWorld *get_world() const;
00159 INLINE btBroadphaseInterface *get_broadphase() const;
00160 INLINE btDispatcher *get_dispatcher() const;
00161
00162 private:
00163 void sync_p2b(PN_stdfloat dt, int num_substeps);
00164 void sync_b2p();
00165
00166 typedef PTA(PT(BulletRigidBodyNode)) BulletRigidBodies;
00167 typedef PTA(PT(BulletSoftBodyNode)) BulletSoftBodies;
00168 typedef PTA(PT(BulletGhostNode)) BulletGhosts;
00169 typedef PTA(PT(BulletBaseCharacterControllerNode)) BulletCharacterControllers;
00170 typedef PTA(PT(BulletVehicle)) BulletVehicles;
00171 typedef PTA(PT(BulletConstraint)) BulletConstraints;
00172
00173 static PStatCollector _pstat_physics;
00174 static PStatCollector _pstat_simulation;
00175 static PStatCollector _pstat_debug;
00176 static PStatCollector _pstat_p2b;
00177 static PStatCollector _pstat_b2p;
00178
00179 struct btFilterCallback1 : public btOverlapFilterCallback {
00180 virtual bool needBroadphaseCollision(
00181 btBroadphaseProxy* proxy0,
00182 btBroadphaseProxy* proxy1) const;
00183 };
00184
00185 struct btFilterCallback2 : public btOverlapFilterCallback {
00186 virtual bool needBroadphaseCollision(
00187 btBroadphaseProxy* proxy0,
00188 btBroadphaseProxy* proxy1) const;
00189
00190 CollideMask _collide[32];
00191 };
00192
00193 btBroadphaseInterface *_broadphase;
00194 btCollisionConfiguration *_configuration;
00195 btCollisionDispatcher *_dispatcher;
00196 btConstraintSolver *_solver;
00197 btSoftRigidDynamicsWorld *_world;
00198
00199 btGhostPairCallback _ghost_cb;
00200
00201 btFilterCallback1 _filter_cb1;
00202 btFilterCallback2 _filter_cb2;
00203
00204 btSoftBodyWorldInfo _info;
00205
00206 PT(BulletDebugNode) _debug;
00207
00208 BulletRigidBodies _bodies;
00209 BulletSoftBodies _softbodies;
00210 BulletGhosts _ghosts;
00211 BulletCharacterControllers _characters;
00212 BulletVehicles _vehicles;
00213 BulletConstraints _constraints;
00214
00215
00216 public:
00217 static TypeHandle get_class_type() {
00218 return _type_handle;
00219 }
00220 static void init_type() {
00221 TypedReferenceCount::init_type();
00222 register_type(_type_handle, "BulletWorld",
00223 TypedReferenceCount::get_class_type());
00224 }
00225 virtual TypeHandle get_type() const {
00226 return get_class_type();
00227 }
00228 virtual TypeHandle force_init_type() {
00229 init_type();
00230 return get_class_type();
00231 }
00232
00233 private:
00234 static TypeHandle _type_handle;
00235 };
00236
00237 EXPCL_PANDABULLET ostream &
00238 operator << (ostream &out, BulletWorld::BroadphaseAlgorithm algorithm);
00239 EXPCL_PANDABULLET istream &
00240 operator >> (istream &in, BulletWorld::BroadphaseAlgorithm &algorithm);
00241
00242 EXPCL_PANDABULLET ostream &
00243 operator << (ostream &out, BulletWorld::FilterAlgorithm algorithm);
00244 EXPCL_PANDABULLET istream &
00245 operator >> (istream &in, BulletWorld::FilterAlgorithm &algorithm);
00246
00247 #include "bulletWorld.I"
00248
00249 #endif // __BULLET_WORLD_H__