From 265fe859adc58220a3d55682471238046061f077 Mon Sep 17 00:00:00 2001 From: Dave Schuyler Date: Thu, 15 Apr 2004 00:27:42 +0000 Subject: [PATCH] working on adding reach --- panda/src/collide/collisionHandlerFloor.I | 22 +++++ panda/src/collide/collisionHandlerFloor.cxx | 90 +++++++++++++++++++ panda/src/collide/collisionHandlerFloor.h | 5 ++ panda/src/collide/collisionHandlerGravity.I | 22 +++++ panda/src/collide/collisionHandlerGravity.cxx | 61 ++++++++++++- panda/src/collide/collisionHandlerGravity.h | 4 + 6 files changed, 202 insertions(+), 2 deletions(-) diff --git a/panda/src/collide/collisionHandlerFloor.I b/panda/src/collide/collisionHandlerFloor.I index f270b656ae..f4e91507ae 100644 --- a/panda/src/collide/collisionHandlerFloor.I +++ b/panda/src/collide/collisionHandlerFloor.I @@ -41,6 +41,28 @@ get_offset() const { return _offset; } +//////////////////////////////////////////////////////////////////// +// Function: CollisionHandlerFloor::set_reach +// Access: Public +// Description: Sets the reach to add to (or subtract from) +// the highest collision point +//////////////////////////////////////////////////////////////////// +INLINE void CollisionHandlerFloor:: +set_reach(float reach) { + _reach = reach; +} + +//////////////////////////////////////////////////////////////////// +// Function: CollisionHandlerFloor::get_reach +// Access: Public +// Description: Returns the reach to add to (or subtract from) +// the highest collision point +//////////////////////////////////////////////////////////////////// +INLINE float CollisionHandlerFloor:: +get_reach() const { + return _reach; +} + //////////////////////////////////////////////////////////////////// // Function: CollisionHandlerFloor::set_max_velocity // Access: Public diff --git a/panda/src/collide/collisionHandlerFloor.cxx b/panda/src/collide/collisionHandlerFloor.cxx index 0478ad8f3e..2358ef6ae8 100644 --- a/panda/src/collide/collisionHandlerFloor.cxx +++ b/panda/src/collide/collisionHandlerFloor.cxx @@ -33,6 +33,7 @@ TypeHandle CollisionHandlerFloor::_type_handle; CollisionHandlerFloor:: CollisionHandlerFloor() { _offset = 0.0f; + _reach = 1.0f; _max_velocity = 0.0f; } @@ -45,6 +46,88 @@ CollisionHandlerFloor:: ~CollisionHandlerFloor() { } +//////////////////////////////////////////////////////////////////// +// Function: CollisionHandlerGravity::set_highest_collision +// Access: Protected +// Description: +// +// +// +// +// +// +//////////////////////////////////////////////////////////////////// +float CollisionHandlerFloor:: +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) { + CollisionEntry *entry = (*ei); + nassertr(entry != (CollisionEntry *)NULL, 0.0f); + nassertr(from_node_path == entry->get_from_node_path(), 0.0f); + + if (entry->has_surface_point()) { + LPoint3f point = entry->get_surface_point(target_node_path); + if (collide_cat.is_debug()) { + collide_cat.debug() + << "Intersection point detected at " << point << "\n"; + } + + float height = point[2]; + if (height < _offset + _reach && + (!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 + cout<<"\ncolliding with:\n"; + for (Colliding::const_iterator i = _current_colliding.begin(); i != _current_colliding.end(); ++i) { + (**i).write(cout, 2); + } + cout<<"\nhighest:\n"; + highest->write(cout, 2); + cout<get_from_node_path(), 0.0f); + + if (entry->has_surface_point()) { + LPoint3f point = entry->get_surface_point(target_node_path); + if (collide_cat.is_debug()) { + collide_cat.debug() + << "Intersection point detected at " << point << "\n"; + } + + float height = point[2]; + if (!got_max || height > max_height) { + got_max = true; + max_height = height; + highest = entry; + } + } + } + //#*#_has_contact = got_max; + + #if 0 + cout<<"\ncolliding with:\n"; + for (Colliding::const_iterator i = _current_colliding.begin(); i != _current_colliding.end(); ++i) { + (**i).write(cout, 2); + } + cout<<"\nhighest:\n"; + highest->write(cout, 2); + cout< max_height)) { got_max = true; max_height = height; @@ -129,6 +181,7 @@ set_highest_collision(const NodePath &target_node_path, const NodePath &from_nod return max_height; } +#endif //////////////////////////////////////////////////////////////////// // Function: CollisionHandlerGravity::handle_entries @@ -165,7 +218,11 @@ handle_entries() { float max_height = set_highest_collision(def._target, from_node_path, entries); // Now set our height accordingly. - float adjust = max_height; // #*# + _offset; + #if OLD_COLLISION_HANDLER_GRAVITY + float adjust = max_height + _offset; + #else + float adjust = max_height + _offset; + #endif if (_current_velocity > 0.0f || !IS_THRESHOLD_ZERO(adjust, 0.001)) { if (collide_cat.is_debug()) { collide_cat.debug() diff --git a/panda/src/collide/collisionHandlerGravity.h b/panda/src/collide/collisionHandlerGravity.h index 5d173eb8ea..38aae8f8b4 100755 --- a/panda/src/collide/collisionHandlerGravity.h +++ b/panda/src/collide/collisionHandlerGravity.h @@ -40,6 +40,9 @@ PUBLISHED: INLINE void set_offset(float offset); INLINE float get_offset() const; + INLINE void set_reach(float reach); + INLINE float get_reach() const; + INLINE float get_airborne_height() const; INLINE bool is_on_ground() const; INLINE float get_impact_velocity() const; @@ -61,6 +64,7 @@ protected: private: float _offset; + float _reach; float _airborne_height; float _impact_velocity; float _gravity;