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_ZONE
00024 #define H_SPK_ZONE
00025
00026 #include "Core/SPK_DEF.h"
00027 #include "Core/SPK_Registerable.h"
00028 #include "Core/SPK_Transformable.h"
00029 #include "Core/SPK_Vector3D.h"
00030
00031
00032 namespace SPK
00033 {
00034 class Particle;
00035
00046 class SPK_PREFIX Zone : public Registerable, public Transformable
00047 {
00048 public :
00049
00051
00053
00058 Zone(const Vector3D& position = Vector3D());
00059
00061
00063
00065 virtual ~Zone() {}
00066
00068
00070
00075 virtual void setPosition(const Vector3D& v);
00076
00078
00080
00085 const Vector3D& getPosition() const;
00086
00092 const Vector3D& getTransformedPosition() const;
00093
00095
00097
00103 virtual void generatePosition(Particle& particle,bool full) const = 0;
00104
00110 virtual bool contains(const Vector3D& point) const = 0;
00111
00124 virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const = 0;
00125
00131 virtual void moveAtBorder(Vector3D& point,bool inside) const = 0;
00132
00139 virtual Vector3D computeNormal(const Vector3D& point) const = 0;
00140
00141 protected :
00142
00144 static const float APPROXIMATION_VALUE;
00145
00155 static void normalizeOrRandomize(Vector3D& v);
00156
00157 virtual void innerUpdateTransform();
00158
00159 private :
00160
00161 Vector3D position;
00162 Vector3D tPosition;
00163 };
00164
00165
00166 inline void Zone::setPosition(const Vector3D& v)
00167 {
00168 position = tPosition = v;
00169 notifyForUpdate();
00170 }
00171
00172 inline const Vector3D& Zone::getPosition() const
00173 {
00174 return position;
00175 }
00176
00177 inline const Vector3D& Zone::getTransformedPosition() const
00178 {
00179 return tPosition;
00180 }
00181
00182 inline void Zone::normalizeOrRandomize(Vector3D& v)
00183 {
00184 while(!v.normalize())
00185 {
00186 do v = Vector3D(random(-1.0f,1.0f),random(-1.0f,1.0f),random(-1.0f,1.0f));
00187 while (v.getSqrNorm() > 1.0f);
00188 }
00189 }
00190
00191 inline void Zone::innerUpdateTransform()
00192 {
00193 transformPos(tPosition,position);
00194 }
00195 }
00196
00197 #endif