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_POINTMASS
00024 #define H_SPK_POINTMASS
00025
00026 #include "Core/SPK_Modifier.h"
00027
00028 namespace SPK
00029 {
00038 class SPK_PREFIX PointMass : public Modifier
00039 {
00040 SPK_IMPLEMENT_REGISTERABLE(PointMass)
00041
00042 public :
00043
00045
00047
00055 PointMass(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE,float mass = 1.0f,float minDistance = 0.05f);
00056
00066 static PointMass* create(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE,float mass = 1.0f,float minDistance = 0.05f);
00067
00069
00071
00077 void setPosition(const Vector3D& pos);
00078
00088 void setMass(float mass);
00089
00099 void setMinDistance(float minDistance);
00100
00102
00104
00110 const Vector3D& getPosition() const;
00111
00117 const Vector3D& getTransformedPosition() const;
00118
00123 float getMass() const;
00124
00129 float getMinDistance() const;
00130
00131 protected :
00132
00133 virtual void innerUpdateTransform();
00134
00135 private :
00136
00137 Vector3D position;
00138 Vector3D tPosition;
00139
00140 float mass;
00141 float minDistance;
00142 float sqrMinDistance;
00143
00144 virtual void modify(Particle& particle,float deltaTime) const;
00145 };
00146
00147
00148 inline PointMass* PointMass::create(Zone* zone,ModifierTrigger trigger,float mass,float minDistance)
00149 {
00150 PointMass* obj = new PointMass(zone,trigger,mass,minDistance);
00151 registerObject(obj);
00152 return obj;
00153 }
00154
00155 inline void PointMass::setPosition(const Vector3D& pos)
00156 {
00157 position = tPosition = pos;
00158 notifyForUpdate();
00159 }
00160
00161 inline void PointMass::setMass(float mass)
00162 {
00163 this->mass = mass;
00164 }
00165
00166 inline void PointMass::setMinDistance(float minDistance)
00167 {
00168 this->minDistance = minDistance;
00169 sqrMinDistance = minDistance * minDistance;
00170 }
00171
00172 inline const Vector3D& PointMass::getPosition() const
00173 {
00174 return position;
00175 }
00176
00177 inline const Vector3D& PointMass::getTransformedPosition() const
00178 {
00179 return tPosition;
00180 }
00181
00182 inline float PointMass::getMass() const
00183 {
00184 return mass;
00185 }
00186
00187 inline float PointMass::getMinDistance() const
00188 {
00189 return minDistance;
00190 }
00191
00192 inline void PointMass::innerUpdateTransform()
00193 {
00194 Modifier::innerUpdateTransform();
00195 transformDir(tPosition,position);
00196 }
00197 }
00198
00199 #endif