From e6fd46360712b8e964fb69e6d98c0dc5b2ec2538 Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 30 Oct 2003 05:55:37 +0000 Subject: [PATCH] fix incorrect nearly-concave-polygon rejection --- panda/src/collide/collisionPolygon.cxx | 25 +++++++++++++++++++------ panda/src/collide/collisionPolygon.h | 1 + panda/src/egg2pg/eggLoader.cxx | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/panda/src/collide/collisionPolygon.cxx b/panda/src/collide/collisionPolygon.cxx index dc1e62cc96..33f68fdbb6 100644 --- a/panda/src/collide/collisionPolygon.cxx +++ b/panda/src/collide/collisionPolygon.cxx @@ -36,6 +36,7 @@ #include "geomPolygon.h" #include "transformState.h" #include "clipPlaneAttrib.h" +#include "nearly_zero.h" #include @@ -139,13 +140,25 @@ verify_points(const LPoint3f *begin, const LPoint3f *end) { // Function: CollisionPolygon::is_valid // Access: Public // Description: Returns true if the CollisionPolygon is valid -// (that is, it has at least three vertices, and is not -// concave), or false otherwise. +// (that is, it has at least three vertices), or false +// otherwise. //////////////////////////////////////////////////////////////////// bool CollisionPolygon:: is_valid() const { + return (_points.size() >= 3); +} + +//////////////////////////////////////////////////////////////////// +// Function: CollisionPolygon::is_concave +// Access: Public +// Description: Returns true if the CollisionPolygon appears to be +// concave, or false if it is safely convex. +//////////////////////////////////////////////////////////////////// +bool CollisionPolygon:: +is_concave() const { if (_points.size() < 3) { - return false; + // It's not even a valid polygon. + return true; } LPoint2f p0 = _points[0]; @@ -171,12 +184,12 @@ is_valid() const { if (csum ^ asum) { // Oops, the polygon is concave. - return false; + return true; } } // The polygon is safely convex. - return true; + return false; } //////////////////////////////////////////////////////////////////// @@ -907,7 +920,7 @@ setup_points(const LPoint3f *begin, const LPoint3f *end) { #ifndef NDEBUG /* // Now make sure the points define a convex polygon. - if (!is_valid()) { + if (is_concave()) { collide_cat.error() << "Invalid concave CollisionPolygon defined:\n"; const LPoint3f *pi; for (pi = begin; pi != end; ++pi) { diff --git a/panda/src/collide/collisionPolygon.h b/panda/src/collide/collisionPolygon.h index 813c5281d3..391ba7956e 100644 --- a/panda/src/collide/collisionPolygon.h +++ b/panda/src/collide/collisionPolygon.h @@ -55,6 +55,7 @@ public: static bool verify_points(const LPoint3f *begin, const LPoint3f *end); bool is_valid() const; + bool is_concave() const; virtual void xform(const LMatrix4f &mat); virtual LPoint3f get_collision_origin() const; diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index 59ed18ea5a..ea8495dce2 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/panda/src/egg2pg/eggLoader.cxx @@ -2275,7 +2275,7 @@ create_collision_polygons(CollisionNode *cnode, EggPolygon *egg_poly, if (cspoly->is_valid()) { apply_collision_flags(cspoly, flags); cnode->add_solid(cspoly); - } + } } } }