00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef COLLISIONPOLYGON_H
00020 #define COLLISIONPOLYGON_H
00021
00022 #include <pandabase.h>
00023
00024 #include "collisionPlane.h"
00025
00026 #include <vector_LPoint2f.h>
00027
00028
00029
00030
00031
00032 class EXPCL_PANDA CollisionPolygon : public CollisionPlane {
00033 PUBLISHED:
00034 INLINE CollisionPolygon(const LPoint3f &a, const LPoint3f &b,
00035 const LPoint3f &c);
00036 INLINE CollisionPolygon(const LPoint3f &a, const LPoint3f &b,
00037 const LPoint3f &c, const LPoint3f &d);
00038 INLINE CollisionPolygon(const LPoint3f *begin, const LPoint3f *end);
00039
00040 public:
00041 CollisionPolygon(const CollisionPolygon ©);
00042
00043 virtual CollisionSolid *make_copy();
00044
00045 INLINE static bool verify_points(const LPoint3f &a, const LPoint3f &b,
00046 const LPoint3f &c);
00047 INLINE static bool verify_points(const LPoint3f &a, const LPoint3f &b,
00048 const LPoint3f &c, const LPoint3f &d);
00049 static bool verify_points(const LPoint3f *begin, const LPoint3f *end);
00050
00051
00052 virtual void xform(const LMatrix4f &mat);
00053 virtual LPoint3f get_collision_origin() const;
00054
00055 virtual void output(ostream &out) const;
00056
00057 protected:
00058 INLINE CollisionPolygon(void);
00059 virtual BoundingVolume *recompute_bound();
00060
00061 protected:
00062 virtual PT(CollisionEntry)
00063 test_intersection_from_sphere(const CollisionEntry &entry) const;
00064 virtual PT(CollisionEntry)
00065 test_intersection_from_ray(const CollisionEntry &entry) const;
00066 virtual PT(CollisionEntry)
00067 test_intersection_from_segment(const CollisionEntry &entry) const;
00068
00069 virtual void fill_viz_geom();
00070
00071 private:
00072 bool is_inside(const LPoint2f &p) const;
00073 bool is_concave() const;
00074
00075 void setup_points(const LPoint3f *begin, const LPoint3f *end);
00076 LPoint2f to_2d(const LPoint3f &point3d) const;
00077 LPoint3f to_3d(const LPoint2f &point2d) const;
00078
00079 private:
00080 typedef vector_LPoint2f Points;
00081 Points _points;
00082 LPoint2f _median;
00083
00084 enum AxisType {
00085 AT_x, AT_y, AT_z
00086 };
00087 AxisType _axis;
00088 bool _reversed;
00089
00090 public:
00091 static void register_with_read_factory(void);
00092 virtual void write_datagram(BamWriter* manager, Datagram &me);
00093
00094 static TypedWritable *make_CollisionPolygon(const FactoryParams ¶ms);
00095
00096 protected:
00097 void fillin(DatagramIterator& scan, BamReader* manager);
00098
00099 public:
00100 static TypeHandle get_class_type() {
00101 return _type_handle;
00102 }
00103 static void init_type() {
00104 CollisionPlane::init_type();
00105 register_type(_type_handle, "CollisionPolygon",
00106 CollisionPlane::get_class_type());
00107 }
00108 virtual TypeHandle get_type() const {
00109 return get_class_type();
00110 }
00111 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00112
00113 private:
00114 static TypeHandle _type_handle;
00115 };
00116
00117 #include "collisionPolygon.I"
00118
00119 #endif
00120
00121