00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __BULLET_RIGID_BODY_NODE_H__
00016 #define __BULLET_RIGID_BODY_NODE_H__
00017
00018 #include "pandabase.h"
00019
00020 #include "bullet_includes.h"
00021 #include "bullet_utils.h"
00022 #include "bulletBodyNode.h"
00023
00024 #include "pandaNode.h"
00025 #include "collideMask.h"
00026
00027 class BulletShape;
00028
00029
00030
00031
00032
00033 class EXPCL_PANDABULLET BulletRigidBodyNode : public BulletBodyNode {
00034
00035 PUBLISHED:
00036 BulletRigidBodyNode(const char *name="rigid");
00037 INLINE ~BulletRigidBodyNode();
00038
00039
00040 void set_mass(PN_stdfloat mass);
00041 PN_stdfloat get_mass() const;
00042 void set_inertia(const LVecBase3 &inertia);
00043 LVector3 get_inertia() const;
00044
00045
00046 LVector3 get_linear_velocity() const;
00047 LVector3 get_angular_velocity() const;
00048 void set_linear_velocity(const LVector3 &velocity);
00049 void set_angular_velocity(const LVector3 &velocity);
00050
00051
00052 INLINE PN_stdfloat get_linear_damping() const;
00053 INLINE PN_stdfloat get_angular_damping() const;
00054 INLINE void set_linear_damping(PN_stdfloat value);
00055 INLINE void set_angular_damping(PN_stdfloat value);
00056
00057
00058 void clear_forces();
00059 void apply_force(const LVector3 &force, const LPoint3 &pos);
00060 void apply_central_force(const LVector3 &force);
00061 void apply_impulse(const LVector3 &impulse, const LPoint3 &pos);
00062 void apply_central_impulse(const LVector3 &impulse);
00063 void apply_torque(const LVector3 &torque);
00064 void apply_torque_impulse(const LVector3 &torque);
00065
00066
00067 PN_stdfloat get_linear_sleep_threshold() const;
00068 PN_stdfloat get_angular_sleep_threshold() const;
00069 void set_linear_sleep_threshold(PN_stdfloat threshold);
00070 void set_angular_sleep_threshold(PN_stdfloat threshold);
00071
00072
00073 void set_gravity(const LVector3 &gravity);
00074 LVector3 get_gravity() const;
00075
00076
00077 void set_linear_factor(const LVector3 &factor);
00078 void set_angular_factor(const LVector3 &factor);
00079
00080 public:
00081 virtual btCollisionObject *get_object() const;
00082
00083 virtual void output(ostream &out) const;
00084
00085 void sync_p2b();
00086 void sync_b2p();
00087
00088 protected:
00089 virtual void transform_changed();
00090
00091 private:
00092 virtual void shape_changed();
00093
00094
00095
00096
00097 class MotionState : public btMotionState {
00098
00099 public:
00100 MotionState(CPT(TransformState) & sync) : _sync(sync) {};
00101 ~MotionState() {};
00102
00103 virtual void getWorldTransform(btTransform &trans) const;
00104 virtual void setWorldTransform(const btTransform &trans);
00105
00106 private:
00107 CPT(TransformState) &_sync;
00108 };
00109
00110 CPT(TransformState) _sync;
00111 bool _sync_disable;
00112
00113 btRigidBody *_rigid;
00114
00115
00116 public:
00117 static TypeHandle get_class_type() {
00118 return _type_handle;
00119 }
00120 static void init_type() {
00121 BulletBodyNode::init_type();
00122 register_type(_type_handle, "BulletRigidBodyNode",
00123 BulletBodyNode::get_class_type());
00124 }
00125 virtual TypeHandle get_type() const {
00126 return get_class_type();
00127 }
00128 virtual TypeHandle force_init_type() {
00129 init_type();
00130 return get_class_type();
00131 }
00132
00133 private:
00134 static TypeHandle _type_handle;
00135 };
00136
00137 #include "bulletRigidBodyNode.I"
00138
00139 #endif // __BULLET_RIGID_BODY_NODE_H__
00140