Browse Source

bullet: allow creation of BulletCapsuleShape from CollisionTube

Brian Lach 7 years ago
parent
commit
fd227f6492

+ 9 - 0
panda/src/bullet/bulletBodyNode.cxx

@@ -20,6 +20,7 @@
 #include "collisionPlane.h"
 #include "collisionSphere.h"
 #include "collisionPolygon.h"
+#include "collisionTube.h"
 
 TypeHandle BulletBodyNode::_type_handle;
 
@@ -804,6 +805,14 @@ add_shapes_from_collision_solids(CollisionNode *cnode) {
       do_add_shape(BulletBoxShape::make_from_solid(box), ts);
     }
 
+    // CollisionTube
+    else if (CollisionTube::get_class_type() == type) {
+      CPT(CollisionTube) tube = DCAST(CollisionTube, solid);
+      CPT(TransformState) ts = TransformState::make_pos((tube->get_point_b() + tube->get_point_a()) / 2.0);
+
+      do_add_shape(BulletCapsuleShape::make_from_solid(tube), ts);
+    }
+
     // CollisionPlane
     else if (CollisionPlane::get_class_type() == type) {
       CPT(CollisionPlane) plane = DCAST(CollisionPlane, solid);

+ 16 - 0
panda/src/bullet/bulletCapsuleShape.cxx

@@ -82,6 +82,22 @@ ptr() const {
   return _shape;
 }
 
+
+/**
+ * Constructs a new BulletCapsuleShape using the information from a
+ * CollisionTube from the builtin collision system.
+ */
+BulletCapsuleShape *BulletCapsuleShape::
+make_from_solid(const CollisionTube *solid) {
+  
+  PN_stdfloat radius = solid->get_radius();
+  // CollisionTube height includes the hemispheres, Bullet only wants the cylinder height.
+  PN_stdfloat height = (solid->get_point_b() - solid->get_point_a()).length() - (radius * 2);
+
+  // CollisionTubes are always Z-Up.
+  return new BulletCapsuleShape(radius, height, Z_up);
+}
+
 /**
  * Tells the BamReader how to create objects of type BulletShape.
  */

+ 4 - 0
panda/src/bullet/bulletCapsuleShape.h

@@ -20,6 +20,8 @@
 #include "bullet_utils.h"
 #include "bulletShape.h"
 
+#include "collisionTube.h"
+
 /**
  *
  */
@@ -33,6 +35,8 @@ PUBLISHED:
   BulletCapsuleShape(const BulletCapsuleShape &copy);
   INLINE ~BulletCapsuleShape();
 
+  static BulletCapsuleShape *make_from_solid(const CollisionTube *solid);
+
   INLINE PN_stdfloat get_radius() const;
   INLINE PN_stdfloat get_half_height() const;