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 LPoint3f ¢er, 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 ©); 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 ¢er); 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 ¶bola, 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 ¶ms); 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