Panda3D
 All Classes Functions Variables Enumerations
collisionSphere.h
00001 // Filename: collisionSphere.h
00002 // Created by:  drose (24Apr00)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
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 //       Class : CollisionSphere
00025 // Description : A spherical collision volume or object.
00026 ////////////////////////////////////////////////////////////////////
00027 class EXPCL_PANDA_COLLIDE CollisionSphere : public CollisionSolid {
00028 PUBLISHED:
00029   INLINE CollisionSphere(const LPoint3 &center, 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 &copy);
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 &center);
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 &parabola,
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 &params);
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 
 All Classes Functions Variables Enumerations