00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef PHYSXCLOTH_H
00016 #define PHYSXCLOTH_H
00017
00018 #include "pandabase.h"
00019 #include "luse.h"
00020
00021 #include "physxObject.h"
00022 #include "physxObjectCollection.h"
00023 #include "physxEnums.h"
00024 #include "physx_includes.h"
00025
00026 class PhysxScene;
00027 class PhysxGroupsMask;
00028 class PhysxClothNode;
00029
00030
00031
00032
00033
00034 class EXPCL_PANDAPHYSX PhysxCloth : public PhysxObject, public PhysxEnums {
00035
00036 PUBLISHED:
00037 INLINE PhysxCloth();
00038 INLINE ~PhysxCloth();
00039
00040 PhysxScene *get_scene() const;
00041 PhysxClothNode *get_cloth_node() const;
00042 PhysxClothNode *create_cloth_node(const char *name);
00043
00044 void set_name(const char *name);
00045 void set_group(unsigned int group);
00046 void set_groups_mask(const PhysxGroupsMask &mask);
00047 void set_flag(PhysxClothFlag flag, bool value);
00048 void set_thickness(float thickness);
00049
00050 const char *get_name() const;
00051 unsigned int get_num_particles();
00052 unsigned int get_group() const;
00053 PhysxGroupsMask get_groups_mask() const;
00054 bool get_flag(PhysxClothFlag flag) const;
00055 float get_thickness() const;
00056 float get_density() const;
00057 float get_relative_grid_spacing() const;
00058
00059
00060 void attach_vertex_to_global_pos(unsigned int vertexId, LPoint3f const &pos);
00061 void free_vertex(unsigned int vertexId);
00062 void attach_to_shape(PhysxShape *shape);
00063 void attach_to_colliding_shapes();
00064 void detach_from_shape(PhysxShape *shape);
00065 void attach_vertex_to_shape(unsigned int vertexId, PhysxShape *shape, LPoint3f const &localPos);
00066 PhysxVertexAttachmentStatus get_vertex_attachment_status(unsigned int vertexId) const;
00067 PhysxShape *get_vertex_attachment_shape(unsigned int vertexId) const;
00068 LPoint3f get_vertex_attachment_pos(unsigned int vertexId) const;
00069
00070
00071 bool is_sleeping() const;
00072 void wake_up(float wakeCounterValue=NX_SLEEP_INTERVAL);
00073 void put_to_sleep();
00074 void set_sleep_linear_velocity(float threshold);
00075 float get_sleep_linear_velocity() const;
00076
00077
00078 void set_external_acceleration(LVector3f const &acceleration);
00079 LVector3f get_external_acceleration() const;
00080
00081 void set_wind_acceleration(LVector3f const &acceleration);
00082 LVector3f get_wind_acceleration() const;
00083
00084 void add_force_at_vertex(LVector3f const &force, int vertexId,
00085 PhysxForceMode mode=FM_force);
00086 void add_force_at_pos(LPoint3f const &pos, float magnitude, float radius,
00087 PhysxForceMode mode=FM_force);
00088 void add_directed_force_at_pos(LPoint3f const &pos, LVector3f const &force, float radius,
00089 PhysxForceMode mode=FM_force);
00090
00091 INLINE void ls() const;
00092 INLINE void ls(ostream &out, int indent_level=0) const;
00093
00094 public:
00095 void update();
00096
00097
00098 PUBLISHED:
00099 void release();
00100
00101 public:
00102 INLINE NxCloth *ptr() const { return _ptr; };
00103
00104 void link(NxCloth *ptr);
00105 void unlink();
00106
00107 private:
00108 NxCloth *_ptr;
00109 PT(PhysxClothNode) _node;
00110 string _name;
00111
00112
00113 public:
00114 static TypeHandle get_class_type() {
00115 return _type_handle;
00116 }
00117 static void init_type() {
00118 PhysxObject::init_type();
00119 register_type(_type_handle, "PhysxCloth",
00120 PhysxObject::get_class_type());
00121 }
00122 virtual TypeHandle get_type() const {
00123 return get_class_type();
00124 }
00125 virtual TypeHandle force_init_type() {
00126 init_type();
00127 return get_class_type();
00128 }
00129
00130 private:
00131 static TypeHandle _type_handle;
00132 };
00133
00134 #include "physxCloth.I"
00135
00136 #endif // PHYSXCLOTH_H