00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022 #ifndef H_SPK_MODIFIERGROUP
00023 #define H_SPK_MODIFIERGROUP
00024
00025 #include "Core/SPK_Modifier.h"
00026 #include "Core/SPK_Particle.h"
00027 #include "Core/SPK_Zone.h"
00028
00029 namespace SPK
00030 {
00044 class SPK_PREFIX ModifierGroup : public Modifier
00045 {
00046 SPK_IMPLEMENT_REGISTERABLE(ModifierGroup)
00047
00048 public :
00049
00051
00053
00059 ModifierGroup(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE);
00060
00068 static ModifierGroup* create(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE);
00069
00071
00073
00086 void useGlobalGroup(bool useIntersection = false,bool useNormal = false);
00087
00099 void usePartitionGroup(bool handleWrongSide = false);
00100
00102
00104
00109 size_t getNb() const;
00110
00115 const std::vector<Modifier*>& getModifiers() const;
00116
00124 bool isGlobalGroup() const;
00125
00133 bool isPartitionGroup() const;
00134
00150 bool handlesWrongSide() const;
00151
00166 bool usesIntersection() const;
00167
00182 bool usesNormal() const;
00183
00185
00187
00192 void addModifier(Modifier* modifier);
00193
00199 bool removeModifier(const Modifier* modifier);
00200
00204 void clear();
00205
00206 virtual void createBuffers(const Group& group);
00207 virtual void destroyBuffers(const Group& group);
00208
00209 virtual Registerable* findByName(const std::string& name);
00210
00211 protected :
00212
00213 virtual void registerChildren(bool registerAll);
00214 virtual void copyChildren(const Registerable& object,bool createBase);
00215 virtual void destroyChildren(bool keepChildren);
00216
00217 virtual bool checkBuffers(const Group& group);
00218
00219 private :
00220
00221 std::vector<Modifier*> modifiers;
00222
00223 bool globalZone;
00224 bool handleWrongSide;
00225
00226 virtual void modify(Particle& particle,float deltaTime) const;
00227 virtual void modifyWrongSide(Particle& particle,bool inside) const;
00228 };
00229
00230
00231 inline ModifierGroup* ModifierGroup::create(Zone* zone,ModifierTrigger trigger)
00232 {
00233 ModifierGroup* obj = new ModifierGroup(zone,trigger);
00234 registerObject(obj);
00235 return obj;
00236 }
00237
00238 inline void ModifierGroup::useGlobalGroup(bool useIntersection,bool useNormal)
00239 {
00240 globalZone = true;
00241 needsIntersection = useIntersection;
00242 needsNormal = useNormal;
00243 }
00244
00245 inline void ModifierGroup::usePartitionGroup(bool handleWrongSide)
00246 {
00247 globalZone = false;
00248 this->handleWrongSide = handleWrongSide;
00249 }
00250
00251 inline size_t ModifierGroup::getNb() const
00252 {
00253 return modifiers.size();
00254 }
00255
00256 inline const std::vector<Modifier*>& ModifierGroup::getModifiers() const
00257 {
00258 return modifiers;
00259 }
00260
00261 inline bool ModifierGroup::isGlobalGroup() const
00262 {
00263 return globalZone;
00264 }
00265
00266 inline bool ModifierGroup::isPartitionGroup() const
00267 {
00268 return !globalZone;
00269 }
00270
00271 inline bool ModifierGroup::handlesWrongSide() const
00272 {
00273 return handleWrongSide;
00274 }
00275
00276 inline bool ModifierGroup::usesIntersection() const
00277 {
00278 return needsIntersection;
00279 }
00280
00281 inline bool ModifierGroup::usesNormal() const
00282 {
00283 return needsNormal;
00284 }
00285 }
00286
00287 #endif