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_SYSTEM
00024 #define H_SPK_SYSTEM
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 Group;
00035 class Vector3D;
00036
00037
00043 enum StepMode
00044 {
00045 STEP_REAL,
00046 STEP_CONSTANT,
00047 STEP_ADAPTIVE,
00048 };
00049
00063 class SPK_PREFIX System : public Registerable, public Transformable
00064 {
00065 SPK_IMPLEMENT_REGISTERABLE(System)
00066
00067 public :
00068
00070
00072
00074 System();
00075
00081 static System* create();
00082
00084
00086
00087 virtual ~System() {}
00088
00090
00092
00102 static void setCameraPosition(const Vector3D& cameraPosition);
00103
00119 static void setClampStep(bool useClampStep,float clamp = 1.0f);
00120
00133 static void useConstantStep(float constantStep);
00134
00150 static void useAdaptiveStep(float minStep,float maxStep);
00151
00163 static void useRealStep();
00164
00173 void enableAABBComputing(bool AABB);
00174
00176
00178
00186 static const Vector3D& getCameraPosition();
00187
00192 static StepMode getStepMode();
00193
00204 size_t getNbParticles() const;
00205
00219 size_t computeNbParticles();
00220
00225 size_t getNbGroups() const;
00226
00235 const std::vector<Group*>& getGroups() const;
00236
00246 Group* getGroup(size_t index);
00247
00255 bool isAABBComputingEnabled() const;
00256
00265 const Vector3D& getAABBMin() const;
00266
00275 const Vector3D& getAABBMax() const;
00276
00278
00280
00285 void addGroup(Group* group);
00286
00294 void removeGroup(Group* group);
00295
00304 virtual bool update(float deltaTime);
00305
00311 virtual void render() const;
00312
00324 void grow(float time,float step);
00325
00332 void empty();
00333
00344 void sortParticles();
00345
00356 void computeDistances();
00357
00371 void computeAABB();
00372
00373 virtual Registerable* findByName(const std::string& name);
00374
00375 protected :
00376
00377 std::vector<Group*> groups;
00378
00379 virtual void registerChildren(bool registerAll);
00380 virtual void copyChildren(const Registerable& object,bool keepChildren);
00381 virtual void destroyChildren(bool createBase);
00382
00383 virtual void propagateUpdateTransform();
00384
00385 private :
00386
00387 static Vector3D cameraPosition;
00388
00389 static StepMode stepMode;
00390 static float constantStep;
00391 static float minStep;
00392 static float maxStep;
00393
00394 static bool clampStepEnabled;
00395 static float clampStep;
00396
00397 float deltaStep;
00398
00399 size_t nbParticles;
00400
00401 bool boundingBoxEnabled;
00402 Vector3D AABBMin;
00403 Vector3D AABBMax;
00404
00405 bool innerUpdate(float deltaTime);
00406 };
00407
00408
00409 inline System* System::create()
00410 {
00411 System* obj = new System;
00412 registerObject(obj);
00413 return obj;
00414 }
00415
00416 inline void System::enableAABBComputing(bool AABB)
00417 {
00418 boundingBoxEnabled = AABB;
00419 }
00420
00421 inline size_t System::getNbParticles() const
00422 {
00423 return nbParticles;
00424 }
00425
00426 inline size_t System::getNbGroups() const
00427 {
00428 return groups.size();
00429 }
00430
00431 inline const std::vector<Group*>& System::getGroups() const
00432 {
00433 return groups;
00434 }
00435
00436 inline Group* System::getGroup(size_t index)
00437 {
00438 return groups[index];
00439 }
00440
00441 inline bool System::isAABBComputingEnabled() const
00442 {
00443 return boundingBoxEnabled;
00444 }
00445
00446 inline const Vector3D& System::getAABBMin() const
00447 {
00448 return AABBMin;
00449 }
00450
00451 inline const Vector3D& System::getAABBMax() const
00452 {
00453 return AABBMax;
00454 }
00455 }
00456
00457 #endif