Panda3D

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 LPoint3f &center, float radius);
00030   INLINE CollisionSphere(float cx, float cy, float cz, float radius);
00031 
00032   virtual LPoint3f 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 LMatrix4f &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 LPoint3f &center);
00055   INLINE void set_center(float x, float y, float z);
00056   INLINE const LPoint3f &get_center() const;
00057 
00058   INLINE void set_radius(float radius);
00059   INLINE float get_radius() const;
00060 
00061 protected:
00062   virtual PT(BoundingVolume) compute_internal_bounds() const;
00063 
00064   virtual PT(CollisionEntry)
00065   test_intersection_from_ds_solid(const CollisionEntry &entry) const;
00066   virtual PT(CollisionEntry)
00067   test_intersection_from_sphere(const CollisionEntry &entry) const;
00068   virtual PT(CollisionEntry)
00069   test_intersection_from_line(const CollisionEntry &entry) const;
00070   virtual PT(CollisionEntry)
00071   test_intersection_from_ray(const CollisionEntry &entry) const;
00072   virtual PT(CollisionEntry)
00073   test_intersection_from_segment(const CollisionEntry &entry) const;
00074   virtual PT(CollisionEntry)
00075   test_intersection_from_parabola(const CollisionEntry &entry) const;
00076   virtual PT(CollisionEntry)
00077   test_intersection_from_box(const CollisionEntry &entry) const;
00078 
00079   virtual void fill_viz_geom();
00080 
00081 protected:
00082   bool intersects_line(double &t1, double &t2,
00083                        const LPoint3f &from, const LVector3f &delta,
00084                        float inflate_radius) const;
00085   bool intersects_parabola(double &t, const Parabolaf &parabola,
00086                            double t1, double t2,
00087                            const LPoint3f &p1, const LPoint3f &p2) const;
00088   Vertexf compute_point(float latitude, float longitude) const;
00089 
00090 private:
00091   LPoint3f _center;
00092   float _radius;
00093 
00094   static PStatCollector _volume_pcollector;
00095   static PStatCollector _test_pcollector;
00096 
00097 public:
00098   static void register_with_read_factory();
00099   virtual void write_datagram(BamWriter *manager, Datagram &me);
00100 
00101 protected:
00102   static TypedWritable *make_CollisionSphere(const FactoryParams &params);
00103   void fillin(DatagramIterator &scan, BamReader *manager);
00104 
00105 public:
00106   static TypeHandle get_class_type() {
00107     return _type_handle;
00108   }
00109   static void init_type() {
00110     CollisionSolid::init_type();
00111     register_type(_type_handle, "CollisionSphere",
00112                   CollisionSolid::get_class_type());
00113   }
00114   virtual TypeHandle get_type() const {
00115     return get_class_type();
00116   }
00117   virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00118 
00119 private:
00120   static TypeHandle _type_handle;
00121 };
00122 
00123 #include "collisionSphere.I"
00124 
00125 #endif
00126 
00127 
 All Classes Functions Variables Enumerations