Panda3D
 All Classes Functions Variables Enumerations
bulletSoftBodyNode.h
00001 // Filename: bulletSoftBodyNode.h
00002 // Created by:  enn0x (27Dec10)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #ifndef __BULLET_SOFT_BODY_NODE_H__
00016 #define __BULLET_SOFT_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 "collideMask.h"
00025 #include "geom.h"
00026 #include "geomNode.h"
00027 #include "geomVertexFormat.h"
00028 #include "boundingBox.h"
00029 #include "nurbsCurveEvaluator.h"
00030 #include "nurbsSurfaceEvaluator.h"
00031 #include "pta_LVecBase3.h"
00032 
00033 class BulletSoftBodyConfig;
00034 class BulletSoftBodyMaterial;
00035 class BulletSoftBodyWorldInfo;
00036 
00037 ////////////////////////////////////////////////////////////////////
00038 //       Class : BulletSoftBodyNodeElement
00039 // Description : 
00040 ////////////////////////////////////////////////////////////////////
00041 class BulletSoftBodyNodeElement {
00042 
00043 PUBLISHED:
00044   INLINE ~BulletSoftBodyNodeElement();
00045   INLINE static BulletSoftBodyNodeElement empty();
00046 
00047   INLINE LPoint3 get_pos() const;
00048   INLINE LVector3 get_velocity() const;
00049   INLINE LVector3 get_normal() const;
00050   INLINE PN_stdfloat get_inv_mass() const;
00051   INLINE PN_stdfloat get_area() const;
00052   INLINE int is_attached() const;
00053 
00054 public:
00055   BulletSoftBodyNodeElement(btSoftBody::Node &node);
00056 
00057 private:
00058   btSoftBody::Node &_node;
00059 };
00060 
00061 ////////////////////////////////////////////////////////////////////
00062 //       Class : BulletSoftBodyNode
00063 // Description : 
00064 ////////////////////////////////////////////////////////////////////
00065 class EXPCL_PANDABULLET BulletSoftBodyNode : public BulletBodyNode {
00066 
00067 public:
00068   BulletSoftBodyNode(btSoftBody *body, const char *name="softbody");
00069 
00070 PUBLISHED:
00071   INLINE ~BulletSoftBodyNode();
00072 
00073   BulletSoftBodyConfig get_cfg();
00074   BulletSoftBodyWorldInfo get_world_info();
00075 
00076   void generate_bending_constraints(int distance, BulletSoftBodyMaterial *material=NULL);
00077   void randomize_constraints(); 
00078 
00079   // Mass, volume, density
00080   void set_volume_mass(PN_stdfloat mass);
00081   void set_volume_density(PN_stdfloat density);
00082   void set_total_mass(PN_stdfloat mass, bool fromfaces=false);
00083   void set_total_density(PN_stdfloat density);
00084   void set_mass(int node, PN_stdfloat mass);
00085 
00086   PN_stdfloat get_mass(int node) const;
00087   PN_stdfloat get_total_mass() const;
00088   PN_stdfloat get_volume() const;
00089 
00090   // Force
00091   void add_force(const LVector3 &force);
00092   void add_force(const LVector3 &force, int node);
00093 
00094   void set_velocity(const LVector3 &velocity);
00095   void add_velocity(const LVector3 &velocity);
00096   void add_velocity(const LVector3 &velocity, int node);
00097 
00098   void set_pose(bool bvolume, bool bframe);
00099 
00100   BoundingBox get_aabb() const;
00101 
00102   // Cluster
00103   void generate_clusters(int k, int maxiterations=8192);
00104   void release_cluster(int index);
00105   void release_clusters();
00106   int get_num_clusters() const;
00107   LVecBase3 cluster_com(int cluster) const;
00108 
00109   // Rendering
00110   void link_geom(Geom *geom);
00111   void unlink_geom();
00112 
00113   void link_curve(NurbsCurveEvaluator *curve);
00114   void unlink_curve();
00115 
00116   void link_surface(NurbsSurfaceEvaluator *surface);
00117   void unlink_surface();
00118 
00119   // Anchors
00120   void append_anchor(int node, BulletRigidBodyNode *body, 
00121       bool disable=false);
00122   void append_anchor(int node, BulletRigidBodyNode *body, 
00123       const LVector3 &pivot,
00124       bool disable=false);
00125 
00126   // Materials
00127   int get_num_materials() const;
00128   BulletSoftBodyMaterial get_material(int idx) const;
00129   MAKE_SEQ(get_materials, get_num_materials, get_material);
00130 
00131   BulletSoftBodyMaterial append_material();
00132 
00133   // Nodes
00134   int get_num_nodes() const;
00135   BulletSoftBodyNodeElement get_node(int idx) const;
00136   MAKE_SEQ(get_nodes, get_num_nodes, get_node);
00137 
00138   int get_closest_node_index(LVecBase3 point, bool local);
00139 
00140   // Factory
00141   static PT(BulletSoftBodyNode) make_rope(
00142       BulletSoftBodyWorldInfo &info,
00143       const LPoint3 &from,
00144       const LPoint3 &to,
00145       int res,
00146       int fixeds);
00147 
00148   static PT(BulletSoftBodyNode) make_patch(
00149       BulletSoftBodyWorldInfo &info,
00150       const LPoint3 &corner00,
00151       const LPoint3 &corner10,
00152       const LPoint3 &corner01,
00153       const LPoint3 &corner11,
00154       int resx,
00155       int resy,
00156       int fixeds,
00157       bool gendiags);
00158 
00159   static PT(BulletSoftBodyNode) make_ellipsoid(
00160       BulletSoftBodyWorldInfo &info,
00161       const LPoint3 &center,
00162       const LVecBase3 &radius,
00163       int res);
00164 
00165   static PT(BulletSoftBodyNode) make_tri_mesh(
00166       BulletSoftBodyWorldInfo &info,
00167       const Geom *geom,
00168       bool randomizeConstraints=true);
00169 
00170   static PT(BulletSoftBodyNode) make_tri_mesh(
00171       BulletSoftBodyWorldInfo &info,
00172       PTA_LVecBase3 points, 
00173       PTA_int indices,
00174       bool randomizeConstraints=true);
00175 
00176   static PT(BulletSoftBodyNode) make_tet_mesh(
00177       BulletSoftBodyWorldInfo &info,
00178       PTA_LVecBase3 points,
00179       PTA_int indices,
00180       bool tetralinks=true);
00181 
00182   static PT(BulletSoftBodyNode) make_tet_mesh(
00183       BulletSoftBodyWorldInfo &info,
00184       const char *ele,
00185       const char *face,
00186       const char *node);
00187 
00188 public:
00189   virtual btCollisionObject *get_object() const;
00190 
00191   void sync_p2b();
00192   void sync_b2p();
00193 
00194 protected:
00195   virtual void transform_changed();
00196 
00197 private:
00198   btSoftBody *_soft;
00199 
00200   CPT(TransformState) _sync;
00201   bool _sync_disable;
00202 
00203   PT(Geom) _geom;
00204   PT(NurbsCurveEvaluator) _curve;
00205   PT(NurbsSurfaceEvaluator) _surface;
00206 
00207   static int get_point_index(LVecBase3 p, PTA_LVecBase3 points);
00208   static int next_line(const char *buffer);
00209 
00210 ////////////////////////////////////////////////////////////////////
00211 public:
00212   static TypeHandle get_class_type() {
00213     return _type_handle;
00214   }
00215   static void init_type() {
00216     BulletBodyNode::init_type();
00217     register_type(_type_handle, "BulletSoftBodyNode", 
00218                   BulletBodyNode::get_class_type());
00219   }
00220   virtual TypeHandle get_type() const {
00221     return get_class_type();
00222   }
00223   virtual TypeHandle force_init_type() {
00224     init_type();
00225     return get_class_type();
00226   }
00227 
00228 private:
00229   static TypeHandle _type_handle;
00230 };
00231 
00232 #include "bulletSoftBodyNode.I"
00233 
00234 #endif // __BULLET_SOFT_BODY_NODE_H__
00235 
 All Classes Functions Variables Enumerations