bullet: allow creation of BulletCapsuleShape from CollisionTube

This commit is contained in:
Brian Lach 2018-07-06 13:31:00 -04:00
parent d4d582484f
commit fd227f6492
3 changed files with 29 additions and 0 deletions

View File

@ -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);

View File

@ -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.
*/

View File

@ -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;