00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022
00023 #ifndef H_SPK_SPHERE
00024 #define H_SPK_SPHERE
00025
00026 #include "Core/SPK_Zone.h"
00027
00028 namespace SPK
00029 {
00034 class SPK_PREFIX Sphere : public Zone
00035 {
00036 SPK_IMPLEMENT_REGISTERABLE(Sphere)
00037
00038 public :
00039
00041
00043
00049 Sphere(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),float radius = 0.0f);
00050
00058 static Sphere* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),float radius = 0.0f);
00059
00061
00063
00071 void setRadius(float radius);
00072
00074
00076
00081 float getRadius() const;
00082
00084
00086
00087 virtual void generatePosition(Particle& particle,bool full) const;
00088 virtual bool contains(const Vector3D& v) const;
00089 virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const;
00090 virtual void moveAtBorder(Vector3D& v,bool inside) const;
00091 virtual Vector3D computeNormal(const Vector3D& point) const;
00092
00093 private :
00094
00095 float radius;
00096 };
00097
00098
00099 inline Sphere* Sphere::create(const Vector3D& position,float radius)
00100 {
00101 Sphere* obj = new Sphere(position,radius);
00102 registerObject(obj);
00103 return obj;
00104 }
00105
00106 inline void Sphere::setRadius(float radius)
00107 {
00108 this->radius = radius >= 0.0f ? radius : 0.0f;
00109 }
00110
00111 inline float Sphere::getRadius() const
00112 {
00113 return radius;
00114 }
00115 }
00116
00117 #endif