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_PLANE
00024 #define H_SPK_PLANE
00025
00026 #include "Core/SPK_Zone.h"
00027 #include "Core/SPK_Particle.h"
00028
00029 namespace SPK
00030 {
00045 class SPK_PREFIX Plane : public Zone
00046 {
00047 SPK_IMPLEMENT_REGISTERABLE(Plane)
00048
00049 public :
00050
00052
00054
00060 Plane(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& normal = Vector3D(0.0f,1.0f,0.0f));
00061
00069 static Plane* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& normal = Vector3D(0.0f,1.0f,0.0f));
00070
00072
00074
00082 void setNormal(const Vector3D& normal);
00083
00085
00087
00092 const Vector3D& getNormal() const;
00093
00099 const Vector3D& getTransformedNormal() const;
00100
00102
00104
00105 virtual void generatePosition(Particle& particle,bool full) const;
00106 virtual bool contains(const Vector3D& v) const;
00107 virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const;
00108 virtual void moveAtBorder(Vector3D& v,bool inside) const;
00109 virtual Vector3D computeNormal(const Vector3D& point) const;
00110
00111 protected :
00112
00113 virtual void innerUpdateTransform();
00114
00115 private :
00116
00117 Vector3D normal;
00118 Vector3D tNormal;
00119 };
00120
00121
00122 inline Plane* Plane::create(const Vector3D& position,const Vector3D& normal)
00123 {
00124 Plane* obj = new Plane(position,normal);
00125 registerObject(obj);
00126 return obj;
00127 }
00128
00129 inline void Plane::setNormal(const Vector3D& normal)
00130 {
00131 this->normal = normal;
00132 this->normal.normalize();
00133 tNormal = this->normal;
00134 notifyForUpdate();
00135 }
00136
00137 inline const Vector3D& Plane::getNormal() const
00138 {
00139 return normal;
00140 }
00141
00142 inline const Vector3D& Plane::getTransformedNormal() const
00143 {
00144 return tNormal;
00145 }
00146
00147 inline void Plane::generatePosition(Particle& particle,bool full) const
00148 {
00149 particle.position() = getTransformedPosition();
00150 }
00151
00152 inline bool Plane::contains(const Vector3D& v) const
00153 {
00154 return dotProduct(normal,v - getTransformedPosition()) <= 0.0f;
00155 }
00156
00157 inline Vector3D Plane::computeNormal(const Vector3D& point) const
00158 {
00159 return tNormal;
00160 }
00161 }
00162
00163 #endif