00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef PHYSXACTOR_H
00016 #define PHYSXACTOR_H
00017
00018 #include "pandabase.h"
00019 #include "nodePath.h"
00020 #include "luse.h"
00021
00022 #include "physxObject.h"
00023 #include "physxObjectCollection.h"
00024 #include "physxEnums.h"
00025 #include "physx_includes.h"
00026
00027 class PhysxController;
00028 class PhysxScene;
00029 class PhysxShape;
00030 class PhysxShapeDesc;
00031 class PhysxActorDesc;
00032 class PhysxBodyDesc;
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 class EXPCL_PANDAPHYSX PhysxActor : public PhysxObject, public PhysxEnums {
00049
00050 PUBLISHED:
00051 INLINE PhysxActor();
00052 INLINE ~PhysxActor();
00053
00054 bool save_body_to_desc(PhysxBodyDesc &bodyDesc) const;
00055 void save_to_desc(PhysxActorDesc &actorDesc) const;
00056
00057 void set_name(const char *name);
00058 void set_global_pos(const LPoint3f &pos);
00059 void set_global_mat(const LMatrix4f &mat);
00060 void set_global_hpr(float h, float p, float r);
00061 void set_body_flag(PhysxBodyFlag flag, bool value);
00062 void set_actor_flag(PhysxActorFlag flag, bool value);
00063 void set_contact_report_flag(PhysxContactPairFlag flag, bool value);
00064 void set_contact_report_threshold(float threshold);
00065 void set_group(unsigned int group);
00066 void set_dominance_group(unsigned int group);
00067 void set_shape_group( unsigned int group );
00068
00069 const char *get_name() const;
00070 LPoint3f get_global_pos() const;
00071 LMatrix4f get_global_mat() const;
00072 LQuaternionf get_global_quat() const;
00073 bool get_body_flag(PhysxBodyFlag flag) const;
00074 bool get_actor_flag(PhysxActorFlag flag) const;
00075 unsigned int get_group() const;
00076 unsigned int get_dominance_group() const;
00077
00078 bool is_dynamic() const;
00079 float compute_kinetic_energy() const;
00080 bool update_mass_from_shapes(float density, float totalMass);
00081
00082 PhysxScene *get_scene() const;
00083
00084
00085 void attach_node_path(const NodePath &np);
00086 void detach_node_path();
00087 NodePath get_node_path() const;
00088
00089
00090 unsigned int get_num_shapes() const;
00091 PhysxShape *create_shape(PhysxShapeDesc &desc);
00092 PhysxShape *get_shape(unsigned int idx) const;
00093 PhysxShape *get_shape_by_name(const char *name) const;
00094 MAKE_SEQ(get_shapes, get_num_shapes, get_shape);
00095
00096
00097 void add_force(const LVector3f force,
00098 PhysxForceMode mode=FM_force, bool wakeup=true);
00099 void add_force_at_pos(const LVector3f force, const LPoint3f &pos,
00100 PhysxForceMode mode=FM_force, bool wakeup=true);
00101 void add_force_at_local_pos(const LVector3f force, const LPoint3f &pos,
00102 PhysxForceMode mode=FM_force, bool wakeup=true);
00103 void add_torque(const LVector3f torque,
00104 PhysxForceMode mode=FM_force, bool wakeup=true);
00105 void add_local_force(const LVector3f force,
00106 PhysxForceMode mode=FM_force, bool wakeup=true);
00107 void add_local_force_at_pos(const LVector3f force, const LPoint3f &pos,
00108 PhysxForceMode mode=FM_force, bool wakeup=true);
00109 void add_local_force_at_local_pos(const LVector3f force, const LPoint3f &pos,
00110 PhysxForceMode mode=FM_force, bool wakeup=true);
00111 void add_local_torque(const LVector3f torque,
00112 PhysxForceMode mode=FM_force, bool wakeup=true);
00113
00114
00115 void set_mass(float mass);
00116 void set_c_mass_offset_local_mat(const LMatrix4f &mat);
00117 void set_c_mass_offset_local_pos(const LPoint3f &pos);
00118 void set_c_mass_offset_local_orientation(const LMatrix3f &mat);
00119 void set_c_mass_offset_global_mat(const LMatrix4f &mat);
00120 void set_c_mass_offset_global_pos(const LPoint3f &pos);
00121 void set_c_mass_offset_global_orientation(const LMatrix3f &mat);
00122 void set_c_mass_global_mat(const LMatrix4f &mat);
00123 void set_c_mass_global_pos(const LPoint3f &pos);
00124 void set_c_mass_global_orientation(const LMatrix3f &mat);
00125 void set_mass_space_inertia_tensor(const LVector3f &m);
00126
00127 float get_mass() const;
00128 LMatrix4f get_c_mass_global_mat() const;
00129 LPoint3f get_c_mass_global_pos() const;
00130 LMatrix3f get_c_mass_global_orientation() const;
00131 LMatrix4f get_c_mass_local_mat() const;
00132 LPoint3f get_c_mass_local_pos() const;
00133 LMatrix3f get_c_mass_local_orientation() const;
00134 LVector3f get_mass_space_inertia_tensor() const;
00135 LMatrix3f get_global_inertia_tensor() const;
00136 LMatrix3f get_global_inertia_tensor_inverse() const;
00137
00138
00139 void set_linear_damping(float linDamp);
00140 void set_angular_damping(float angDamp);
00141 float get_linear_damping() const;
00142 float get_angular_damping() const;
00143
00144
00145 void set_linear_velocity(const LVector3f &linVel);
00146 void set_angular_velocity(const LVector3f &angVel);
00147 void set_max_angular_velocity(float maxAngVel);
00148
00149 LVector3f get_linear_velocity() const;
00150 LVector3f get_angular_velocity() const;
00151 float get_max_angular_velocity() const;
00152
00153
00154 LVector3f get_point_velocity(const LPoint3f &point) const;
00155 LVector3f get_local_point_velocity(const LPoint3f &point) const;
00156
00157
00158 void set_linear_momentum(const LVector3f &momentum);
00159 void set_angular_momentum(const LVector3f &momentum);
00160 LVector3f get_linear_momentum() const;
00161 LVector3f get_angular_momentum() const;
00162
00163
00164 void set_sleep_linear_velocity(float threshold);
00165 void set_sleep_angular_velocity(float threshold);
00166 void set_sleep_energy_threshold(float threshold);
00167 float get_sleep_linear_velocity() const;
00168 float get_sleep_angular_velocity() const;
00169 float get_sleep_energy_threshold() const;
00170 bool is_sleeping() const;
00171 void wake_up(float wakeCounterValue=NX_SLEEP_INTERVAL);
00172 void put_to_sleep();
00173
00174
00175 void move_global_pos(const LPoint3f &pos);
00176 void move_global_mat(const LMatrix4f &mat);
00177 void move_global_hpr(float h, float p, float r);
00178
00179 INLINE void ls() const;
00180 INLINE void ls(ostream &out, int indent_level=0) const;
00181
00182 public:
00183 void update_transform(const LMatrix4f m);
00184
00185
00186 PUBLISHED:
00187 void release();
00188
00189 public:
00190 INLINE NxActor *ptr() const { return _ptr; };
00191
00192 void link_controller(PhysxController *controller);
00193 void link(NxActor *ptr);
00194 void unlink();
00195
00196 PhysxObjectCollection<PhysxShape> _shapes;
00197
00198 private:
00199 NxActor *_ptr;
00200 NodePath _np;
00201 PT(PhysxController) _controller;
00202 string _name;
00203
00204
00205 public:
00206 static TypeHandle get_class_type() {
00207 return _type_handle;
00208 }
00209 static void init_type() {
00210 PhysxObject::init_type();
00211 register_type(_type_handle, "PhysxActor",
00212 PhysxObject::get_class_type());
00213 }
00214 virtual TypeHandle get_type() const {
00215 return get_class_type();
00216 }
00217 virtual TypeHandle force_init_type() {
00218 init_type();
00219 return get_class_type();
00220 }
00221
00222 private:
00223 static TypeHandle _type_handle;
00224 };
00225
00226 #include "physxActor.I"
00227
00228 #endif // PHYSXACTOR_H