mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
Fix for bug #916732
This commit is contained in:
parent
ec18c967dd
commit
2e3667e7d4
@ -28,6 +28,32 @@ INLINE BulletBodyNode::
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: BulletBodyNode::set_into_collide_mask
|
||||||
|
// Access: Published
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void BulletBodyNode::
|
||||||
|
set_into_collide_mask(CollideMask mask) {
|
||||||
|
|
||||||
|
PandaNode::set_into_collide_mask(mask);
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO: we would need a handle to the BulletWorld first
|
||||||
|
possible, but has to be set/cleared upon attach/remove to world
|
||||||
|
|
||||||
|
if (!_world) return;
|
||||||
|
|
||||||
|
btBroadphaseProxy* proxy = get_object()->getBroadphaseHandle();
|
||||||
|
if (proxy) {
|
||||||
|
btBroadphaseInterface *broadphase = _world->get_broadphase();
|
||||||
|
btDispatcher *dispatcher = _world->get_dispatcher();
|
||||||
|
|
||||||
|
broadphase->getOverlappingPairCache()->cleanProxyFromPairs(proxy, dispatcher);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: BulletBodyNode::notify_collisions
|
// Function: BulletBodyNode::notify_collisions
|
||||||
// Access: Published
|
// Access: Published
|
||||||
|
@ -58,6 +58,8 @@ PUBLISHED:
|
|||||||
INLINE void set_kinematic(bool value);
|
INLINE void set_kinematic(bool value);
|
||||||
|
|
||||||
// Contacts
|
// Contacts
|
||||||
|
INLINE void set_into_collide_mask(CollideMask mask);
|
||||||
|
|
||||||
INLINE void notify_collisions(bool value);
|
INLINE void notify_collisions(bool value);
|
||||||
INLINE bool notifies_collisions() const;
|
INLINE bool notifies_collisions() const;
|
||||||
|
|
||||||
|
@ -52,9 +52,9 @@ BulletCharacterControllerNode(BulletShape *shape, PN_stdfloat step_height, const
|
|||||||
_up = get_default_up_axis();
|
_up = get_default_up_axis();
|
||||||
|
|
||||||
// Initialise movement
|
// Initialise movement
|
||||||
_linear_velocity_is_local = false;
|
_linear_movement_is_local = false;
|
||||||
_linear_velocity.set(0.0f, 0.0f, 0.0f);
|
_linear_movement.set(0.0f, 0.0f, 0.0f);
|
||||||
_angular_velocity = 0.0f;
|
_angular_movement = 0.0f;
|
||||||
|
|
||||||
// Character controller
|
// Character controller
|
||||||
_character = new btKinematicCharacterController(_ghost, convex, step_height, _up);
|
_character = new btKinematicCharacterController(_ghost, convex, step_height, _up);
|
||||||
@ -172,28 +172,28 @@ safe_to_transform() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: BulletCharacterControllerNode::set_linear_velocity
|
// Function: BulletCharacterControllerNode::set_linear_movement
|
||||||
// Access: Published
|
// Access: Published
|
||||||
// Description:
|
// Description:
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void BulletCharacterControllerNode::
|
void BulletCharacterControllerNode::
|
||||||
set_linear_velocity(const LVector3 &velocity, bool is_local) {
|
set_linear_movement(const LVector3 &movement, bool is_local) {
|
||||||
|
|
||||||
nassertv(!velocity.is_nan());
|
nassertv(!movement.is_nan());
|
||||||
|
|
||||||
_linear_velocity = velocity;
|
_linear_movement = movement;
|
||||||
_linear_velocity_is_local = is_local;
|
_linear_movement_is_local = is_local;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: BulletCharacterControllerNode::set_angular_velocity
|
// Function: BulletCharacterControllerNode::set_angular_movement
|
||||||
// Access: Published
|
// Access: Published
|
||||||
// Description:
|
// Description:
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void BulletCharacterControllerNode::
|
void BulletCharacterControllerNode::
|
||||||
set_angular_velocity(PN_stdfloat omega) {
|
set_angular_movement(PN_stdfloat omega) {
|
||||||
|
|
||||||
_angular_velocity = omega;
|
_angular_movement = omega;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -208,7 +208,7 @@ sync_p2b(PN_stdfloat dt, int num_substeps) {
|
|||||||
transform_changed();
|
transform_changed();
|
||||||
|
|
||||||
// Angular rotation
|
// Angular rotation
|
||||||
btScalar angle = dt * deg_2_rad(_angular_velocity);
|
btScalar angle = dt * deg_2_rad(_angular_movement);
|
||||||
|
|
||||||
btMatrix3x3 m = _ghost->getWorldTransform().getBasis();
|
btMatrix3x3 m = _ghost->getWorldTransform().getBasis();
|
||||||
btVector3 up = m[_up];
|
btVector3 up = m[_up];
|
||||||
@ -218,10 +218,10 @@ sync_p2b(PN_stdfloat dt, int num_substeps) {
|
|||||||
_ghost->getWorldTransform().setBasis(m);
|
_ghost->getWorldTransform().setBasis(m);
|
||||||
|
|
||||||
// Linear movement
|
// Linear movement
|
||||||
LVector3 vp = _linear_velocity / (btScalar)num_substeps;
|
LVector3 vp = _linear_movement / (btScalar)num_substeps;
|
||||||
|
|
||||||
btVector3 v;
|
btVector3 v;
|
||||||
if (_linear_velocity_is_local) {
|
if (_linear_movement_is_local) {
|
||||||
btTransform xform = _ghost->getWorldTransform();
|
btTransform xform = _ghost->getWorldTransform();
|
||||||
xform.setOrigin(btVector3(0.0f, 0.0f, 0.0f));
|
xform.setOrigin(btVector3(0.0f, 0.0f, 0.0f));
|
||||||
v = xform(LVecBase3_to_btVector3(vp));
|
v = xform(LVecBase3_to_btVector3(vp));
|
||||||
@ -232,7 +232,7 @@ sync_p2b(PN_stdfloat dt, int num_substeps) {
|
|||||||
|
|
||||||
//_character->setVelocityForTimeInterval(v, dt);
|
//_character->setVelocityForTimeInterval(v, dt);
|
||||||
_character->setWalkDirection(v * dt);
|
_character->setWalkDirection(v * dt);
|
||||||
_angular_velocity = 0.0f;
|
_angular_movement = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
@ -37,8 +37,8 @@ PUBLISHED:
|
|||||||
BulletCharacterControllerNode(BulletShape *shape, PN_stdfloat step_height, const char *name="character");
|
BulletCharacterControllerNode(BulletShape *shape, PN_stdfloat step_height, const char *name="character");
|
||||||
INLINE ~BulletCharacterControllerNode();
|
INLINE ~BulletCharacterControllerNode();
|
||||||
|
|
||||||
void set_linear_velocity(const LVector3 &velocity, bool is_local);
|
void set_linear_movement(const LVector3 &velocity, bool is_local);
|
||||||
void set_angular_velocity(PN_stdfloat omega);
|
void set_angular_movement(PN_stdfloat omega);
|
||||||
|
|
||||||
BulletShape *get_shape() const;
|
BulletShape *get_shape() const;
|
||||||
|
|
||||||
@ -86,9 +86,9 @@ private:
|
|||||||
|
|
||||||
PT(BulletShape) _shape;
|
PT(BulletShape) _shape;
|
||||||
|
|
||||||
LVector3 _linear_velocity;
|
LVector3 _linear_movement;
|
||||||
bool _linear_velocity_is_local;
|
bool _linear_movement_is_local;
|
||||||
PN_stdfloat _angular_velocity;
|
PN_stdfloat _angular_movement;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
public:
|
public:
|
||||||
|
@ -725,6 +725,25 @@ get_collision_object(PandaNode *node) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: BulletWorld::clean_manifolds_for_node
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void BulletWorld::
|
||||||
|
clean_manifolds_for_node(PandaNode *node) {
|
||||||
|
|
||||||
|
btCollisionObject *object = get_collision_object(node);
|
||||||
|
if (object) {
|
||||||
|
btBroadphaseProxy* proxy = object->getBroadphaseHandle();
|
||||||
|
if (proxy) {
|
||||||
|
_world->getPairCache()->cleanProxyFromPairs(proxy, _dispatcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: BulletWorld::get_collision_object
|
// Function: BulletWorld::get_collision_object
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -775,6 +794,11 @@ needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) co
|
|||||||
CollideMask mask0 = node0->get_into_collide_mask();
|
CollideMask mask0 = node0->get_into_collide_mask();
|
||||||
CollideMask mask1 = node1->get_into_collide_mask();
|
CollideMask mask1 = node1->get_into_collide_mask();
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
cout << node0->get_name() << " " << node1->get_name() << endl;
|
||||||
|
cout << mask0 << " " << mask1 << endl;
|
||||||
|
cout << ((mask0 & mask1) != 0) << endl;
|
||||||
|
|
||||||
return (mask0 & mask1) != 0;
|
return (mask0 & mask1) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user