Panda3D
|
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 ¢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