00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef COLLISIONSPHERE_H
00016 #define COLLISIONSPHERE_H
00017
00018 #include "pandabase.h"
00019 #include "collisionSolid.h"
00020 #include "parabola.h"
00021 #include "collisionBox.h"
00022
00023
00024
00025
00026
00027 class EXPCL_PANDA_COLLIDE CollisionSphere : public CollisionSolid {
00028 PUBLISHED:
00029 INLINE CollisionSphere(const LPoint3 ¢er, PN_stdfloat radius);
00030 INLINE CollisionSphere(PN_stdfloat cx, PN_stdfloat cy, PN_stdfloat cz, PN_stdfloat radius);
00031
00032 virtual LPoint3 get_collision_origin() const;
00033
00034 protected:
00035 INLINE CollisionSphere();
00036
00037 public:
00038 INLINE CollisionSphere(const CollisionSphere ©);
00039 virtual CollisionSolid *make_copy();
00040
00041 virtual PT(CollisionEntry)
00042 test_intersection(const CollisionEntry &entry) const;
00043
00044 virtual void xform(const LMatrix4 &mat);
00045
00046 virtual PStatCollector &get_volume_pcollector();
00047 virtual PStatCollector &get_test_pcollector();
00048
00049 virtual void output(ostream &out) const;
00050
00051 INLINE static void flush_level();
00052
00053 PUBLISHED:
00054 INLINE void set_center(const LPoint3 ¢er);
00055 INLINE void set_center(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
00056 INLINE const LPoint3 &get_center() const;
00057
00058 INLINE void set_radius(PN_stdfloat radius);
00059 INLINE PN_stdfloat get_radius() const;
00060
00061 protected:
00062 virtual PT(BoundingVolume) compute_internal_bounds() const;
00063
00064 virtual PT(CollisionEntry)
00065 test_intersection_from_sphere(const CollisionEntry &entry) const;
00066 virtual PT(CollisionEntry)
00067 test_intersection_from_line(const CollisionEntry &entry) const;
00068 virtual PT(CollisionEntry)
00069 test_intersection_from_ray(const CollisionEntry &entry) const;
00070 virtual PT(CollisionEntry)
00071 test_intersection_from_segment(const CollisionEntry &entry) const;
00072 virtual PT(CollisionEntry)
00073 test_intersection_from_parabola(const CollisionEntry &entry) const;
00074 virtual PT(CollisionEntry)
00075 test_intersection_from_box(const CollisionEntry &entry) const;
00076
00077 virtual void fill_viz_geom();
00078
00079 protected:
00080 bool intersects_line(double &t1, double &t2,
00081 const LPoint3 &from, const LVector3 &delta,
00082 PN_stdfloat inflate_radius) const;
00083 bool intersects_parabola(double &t, const LParabola ¶bola,
00084 double t1, double t2,
00085 const LPoint3 &p1, const LPoint3 &p2) const;
00086 LVertex compute_point(PN_stdfloat latitude, PN_stdfloat longitude) const;
00087
00088 private:
00089 LPoint3 _center;
00090 PN_stdfloat _radius;
00091
00092 static PStatCollector _volume_pcollector;
00093 static PStatCollector _test_pcollector;
00094
00095 public:
00096 static void register_with_read_factory();
00097 virtual void write_datagram(BamWriter *manager, Datagram &me);
00098
00099 protected:
00100 static TypedWritable *make_CollisionSphere(const FactoryParams ¶ms);
00101 void fillin(DatagramIterator &scan, BamReader *manager);
00102
00103 public:
00104 static TypeHandle get_class_type() {
00105 return _type_handle;
00106 }
00107 static void init_type() {
00108 CollisionSolid::init_type();
00109 register_type(_type_handle, "CollisionSphere",
00110 CollisionSolid::get_class_type());
00111 }
00112 virtual TypeHandle get_type() const {
00113 return get_class_type();
00114 }
00115 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00116
00117 private:
00118 static TypeHandle _type_handle;
00119 };
00120
00121 #include "collisionSphere.I"
00122
00123 #endif
00124
00125