diff --git a/panda/src/collide/collisionHandlerGravity.cxx b/panda/src/collide/collisionHandlerGravity.cxx index 06cbf9649c..e8f6f2b543 100755 --- a/panda/src/collide/collisionHandlerGravity.cxx +++ b/panda/src/collide/collisionHandlerGravity.cxx @@ -63,9 +63,16 @@ CollisionHandlerGravity:: float CollisionHandlerGravity:: set_highest_collision(const NodePath &target_node_path, const NodePath &from_node_path, const Entries &entries) { // Get the maximum height for all collisions with this node. + // This is really the distance to-the-ground, so it will + // be negative when the avatar is above the ground. + // Larger values (less negative) are higher elevation (assuming + // the avatar is right-side-up (or the ray is plumb)). bool got_max = false; + bool got_min = false; float max_height = 0.0f; + float min_height = 0.0f; CollisionEntry *highest = NULL; + CollisionEntry *lowest = NULL; Entries::const_iterator ei; for (ei = entries.begin(); ei != entries.end(); ++ei) { @@ -81,13 +88,27 @@ set_highest_collision(const NodePath &target_node_path, const NodePath &from_nod } float height = point[2]; - if (!got_max || height > max_height) { + if (height < _offset && + (!got_max || height > max_height)) { got_max = true; max_height = height; highest = entry; } + if (!got_min || height < min_height) { + got_min = true; + min_height = height; + lowest = entry; + } } } + if (!got_max && got_min) { + // We've fallen through the world, but we're also under some walkable + // geometry. + // Move us up to the lowest surface: + got_max = true; + max_height = min_height; + highest = lowest; + } //#*#_has_contact = got_max; #if 0 @@ -99,7 +120,7 @@ set_highest_collision(const NodePath &target_node_path, const NodePath &from_nod highest->write(cout, 2); cout< 0.0f || !IS_THRESHOLD_ZERO(adjust, 0.001)) { if (collide_cat.is_debug()) { collide_cat.debug() @@ -202,6 +223,7 @@ handle_entries() { return okflag; } + //////////////////////////////////////////////////////////////////// // Function: CollisionHandlerGravity::apply_linear_force // Access: Protected, Virtual