CrystalSpace

Public API Reference

imesh/particles.h
Go to the documentation of this file.
00001 /*
00002   Copyright (C) 2006 by Marten Svanfeldt
00003 
00004   This library is free software; you can redistribute it and/or
00005   modify it under the terms of the GNU Library General Public
00006   License as published by the Free Software Foundation; either
00007   version 2 of the License, or (at your option) any later version.
00008 
00009   This library is distributed in the hope that it will be useful,
00010   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012   Library General Public License for more details.
00013 
00014   You should have received a copy of the GNU Library General Public
00015   License along with this library; if not, write to the Free
00016   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 */
00018 
00019 #ifndef __CS_IMESH_PARTICLES_H__
00020 #define __CS_IMESH_PARTICLES_H__
00021 
00022 #include "csutil/scf_interface.h"
00023 
00024 #include "csgeom/obb.h"
00025 #include "csgeom/vector2.h"
00026 #include "csgeom/vector3.h"
00027 #include "csgeom/quaternion.h"
00028 #include "csutil/array.h"
00029 #include "csutil/cscolor.h"
00030 #include "csutil/ref.h"
00031 
00036 struct iParticleSystemBase;
00037 
00047 enum csParticleSortMode
00048 {
00050   CS_PARTICLE_SORT_NONE,
00052   CS_PARTICLE_SORT_DISTANCE,
00054   CS_PARTICLE_SORT_DOT
00055 };
00056 
00062 enum csParticleRenderOrientation
00063 {
00068   CS_PARTICLE_CAMERAFACE,
00075   CS_PARTICLE_CAMERAFACE_APPROX,
00080   CS_PARTICLE_ORIENT_COMMON,
00087   CS_PARTICLE_ORIENT_COMMON_APPROX,
00093   CS_PARTICLE_ORIENT_VELOCITY,
00099   CS_PARTICLE_ORIENT_SELF,
00107   CS_PARTICLE_ORIENT_SELF_FORWARD
00108 };
00109 
00114 enum csParticleRotationMode
00115 {
00117   CS_PARTICLE_ROTATE_NONE,
00119   CS_PARTICLE_ROTATE_TEXCOORD,
00121   CS_PARTICLE_ROTATE_VERTICES
00122 };
00123 
00129 enum csParticleIntegrationMode
00130 {
00132   CS_PARTICLE_INTEGRATE_NONE,
00134   CS_PARTICLE_INTEGRATE_LINEAR,
00139   CS_PARTICLE_INTEGRATE_BOTH
00140 };
00141 
00147 enum csParticleTransformMode
00148 {
00153   CS_PARTICLE_LOCAL_MODE,
00161   CS_PARTICLE_LOCAL_EMITTER,
00166   CS_PARTICLE_WORLD_MODE
00167 };
00168 
00172 struct csParticle
00173 {
00179   csVector3 position;
00180 
00184   float mass;
00185 
00192   csQuaternion orientation;
00193   
00199   csVector3 linearVelocity;
00200 
00204   float timeToLive;
00205 
00209   csVector3 angularVelocity;
00210 
00211   // Pad to make this struct 64 bytes
00212   float pad;
00213 };
00214 
00218 struct csParticleAux
00219 {
00223   csColor4 color;
00224 
00229   csVector2 particleSize;
00230 
00231   // Pad to make this 32 bytes
00232   float pad[2];
00233 };
00234 
00238 struct csParticleBuffer
00239 {
00241   csParticle* particleData;
00242   
00244   csParticleAux* particleAuxData;
00245 
00247   size_t particleCount;
00248 };
00249 
00255 struct iParticleEmitter : public virtual iBase
00256 {
00257   SCF_INTERFACE(iParticleEmitter,1,0,0);
00258 
00263   virtual void SetEnabled (bool enabled) = 0;
00264 
00268   virtual bool GetEnabled () const = 0;
00269 
00276   virtual void SetStartTime (float time) = 0;
00277 
00281   virtual float GetStartTime () const = 0;
00282 
00290   virtual void SetDuration (float time) = 0;
00291 
00295   virtual float GetDuration () const = 0;
00296 
00300   virtual void SetEmissionRate (float particlesPerSecond) = 0;
00301 
00305   virtual float GetEmissionRate () const = 0;
00306 
00311   virtual void SetInitialTTL (float min, float max) = 0;
00312 
00316   virtual void GetInitialTTL (float& min, float& max) const= 0;
00317 
00322   virtual void SetInitialMass (float min, float max) = 0;
00323 
00327   virtual void GetInitialMass (float& min, float& max) const = 0;
00328 
00332   virtual csPtr<iParticleEmitter> Clone () const = 0;
00333 
00343   virtual size_t ParticlesToEmit (iParticleSystemBase* system,
00344     float dt, float totalTime) = 0;
00345 
00360   virtual void EmitParticles (iParticleSystemBase* system,
00361     const csParticleBuffer& particleBuffer, float dt, float totalTime,
00362     const csReversibleTransform* const emitterToParticle = 0) = 0;
00363 
00364 };
00365 
00371 struct iParticleEffector : public virtual iBase
00372 {
00373   SCF_INTERFACE(iParticleEffector,1,0,0);
00374 
00378   virtual csPtr<iParticleEffector> Clone () const = 0;
00379 
00383   virtual void EffectParticles (iParticleSystemBase* system,
00384     const csParticleBuffer& particleBuffer, float dt, float totalTime) = 0;
00385 };
00386 
00387 
00394 struct iParticleSystemBase : public virtual iBase
00395 {
00396   SCF_INTERFACE(iParticleSystemBase, 1,0,0);
00397 
00399   virtual void SetParticleRenderOrientation (csParticleRenderOrientation o) = 0;
00400 
00402   virtual csParticleRenderOrientation GetParticleRenderOrientation () const = 0;
00403 
00405   virtual void SetRotationMode (csParticleRotationMode mode) = 0;
00406 
00408   virtual csParticleRotationMode GetRotationMode () const = 0;
00409 
00411   virtual void SetSortMode (csParticleSortMode mode) = 0;
00412 
00414   virtual csParticleSortMode GetSortMode () const = 0;
00415 
00417   virtual void SetIntegrationMode (csParticleIntegrationMode mode) = 0;
00418 
00420   virtual csParticleIntegrationMode GetIntegrationMode () = 0;
00421 
00423   virtual void SetCommonDirection (const csVector3& direction) = 0;
00424 
00426   virtual const csVector3& GetCommonDirection () const = 0;
00427 
00429   virtual void SetTransformMode (csParticleTransformMode mode) = 0;
00430 
00432   virtual csParticleTransformMode GetTransformMode () const = 0;
00433 
00435   virtual void SetUseIndividualSize (bool individual) = 0;
00436 
00438   virtual bool GetUseIndividualSize () const = 0;
00439 
00441   virtual void SetParticleSize (const csVector2& size) = 0;
00442 
00444   virtual const csVector2& GetParticleSize () const = 0;
00445 
00447   virtual void SetMinBoundingBox (const csBox3& box) = 0;
00448   
00450   virtual const csBox3& GetMinBoundingBox () const = 0;
00451 
00453   virtual void AddEmitter (iParticleEmitter* emitter) = 0;
00454 
00456   virtual iParticleEmitter* GetEmitter (size_t index) const = 0;
00457 
00459   virtual void RemoveEmitter (size_t index) = 0;
00460 
00462   virtual size_t GetEmitterCount () const = 0;
00463 
00465   virtual void AddEffector (iParticleEffector* effector) = 0;
00466 
00468   virtual iParticleEffector* GetEffector (size_t index) const = 0;
00469 
00471   virtual void RemoveEffector (size_t index) = 0;
00472 
00474   virtual size_t GetEffectorCount () const = 0;
00475 
00476 };
00477 
00478 
00482 struct iParticleSystemFactory : public iParticleSystemBase
00483 {
00484   SCF_INTERFACE(iParticleSystemFactory,1,0,0);
00485 
00490   virtual void SetDeepCreation (bool deep) = 0;
00491 
00493   virtual bool GetDeepCreation () const = 0;
00494 };
00495 
00496 
00500 struct iParticleSystem : public iParticleSystemBase
00501 {
00502   SCF_INTERFACE(iParticleSystem,1,0,1);
00503 
00505   virtual size_t GetParticleCount () const = 0;
00506 
00508   virtual csParticle* GetParticle (size_t index) = 0;
00509 
00511   virtual csParticleAux* GetParticleAux (size_t index) = 0;
00512 
00521   virtual csParticleBuffer* LockForExternalControl (size_t maxParticles) = 0;
00522   
00530   virtual void Advance (csTicks time) = 0;
00531 };
00532 
00538 
00539 enum csParticleBuiltinEmitterPlacement
00540 {
00542   CS_PARTICLE_BUILTIN_CENTER,
00544   CS_PARTICLE_BUILTIN_VOLUME,
00546   CS_PARTICLE_BUILTIN_SURFACE
00547 };
00548 
00552 struct iParticleBuiltinEmitterBase : public iParticleEmitter
00553 {
00554   SCF_INTERFACE(iParticleBuiltinEmitterBase,1,0,0);
00555 
00561   virtual void SetPosition (const csVector3& position) = 0;
00562 
00564   virtual const csVector3& GetPosition () const = 0;
00565 
00567   virtual void SetParticlePlacement (csParticleBuiltinEmitterPlacement place) = 0;
00568 
00570   virtual csParticleBuiltinEmitterPlacement GetParticlePlacement () const = 0;
00571 
00584   virtual void SetUniformVelocity (bool uniform) = 0;
00585 
00587   virtual bool GetUniformVelocity () const = 0;
00588 
00590   virtual void SetInitialVelocity (const csVector3& linear, 
00591     const csVector3& angular) = 0;
00592 
00594   virtual void GetInitialVelocity (csVector3& linear, 
00595     csVector3& angular) const = 0;
00596 };
00597 
00601 struct iParticleBuiltinEmitterSphere : public iParticleBuiltinEmitterBase
00602 {
00603   SCF_INTERFACE(iParticleBuiltinEmitterSphere,1,0,0);
00604 
00606   virtual void SetRadius (float radius) = 0;
00607 
00609   virtual float GetRadius () const = 0;
00610 };
00611 
00615 struct iParticleBuiltinEmitterCone : public iParticleBuiltinEmitterBase
00616 {
00617   SCF_INTERFACE(iParticleBuiltinEmitterCone,1,0,0);
00618 
00620   virtual void SetExtent (const csVector3& extent) = 0;
00621 
00623   virtual const csVector3& GetExtent () const = 0;
00624 
00629   virtual void SetConeAngle (float angle) = 0;
00630 
00632   virtual float GetConeAngle () const = 0;
00633 };
00634 
00638 struct iParticleBuiltinEmitterBox : public iParticleBuiltinEmitterBase
00639 {
00640   SCF_INTERFACE(iParticleBuiltinEmitterBox,1,0,0);
00641 
00643   virtual void SetBox (const csOBB& box) = 0;
00644 
00646   virtual const csOBB& GetBox () const = 0;
00647 };
00648 
00652 struct iParticleBuiltinEmitterCylinder : public iParticleBuiltinEmitterBase
00653 {
00654   SCF_INTERFACE(iParticleBuiltinEmitterCylinder,1,0,0);
00655 
00657   virtual void SetRadius (float radius) = 0;
00658 
00660   virtual float GetRadius () const = 0;
00661 
00663   virtual void SetExtent (const csVector3& extent) = 0;
00664 
00666   virtual const csVector3& GetExtent () const = 0;
00667 };
00668 
00672 struct iParticleBuiltinEmitterFactory : public virtual iBase
00673 {
00674   SCF_INTERFACE(iParticleBuiltinEmitterFactory,1,0,0);
00675 
00677   virtual csPtr<iParticleBuiltinEmitterSphere> CreateSphere () const = 0;
00678 
00680   virtual csPtr<iParticleBuiltinEmitterCone> CreateCone () const = 0;
00681 
00683   virtual csPtr<iParticleBuiltinEmitterBox> CreateBox () const = 0;
00684 
00686   virtual csPtr<iParticleBuiltinEmitterCylinder> CreateCylinder () const = 0;
00687 };
00688 
00707 struct iParticleBuiltinEffectorForce : public iParticleEffector
00708 {
00709   SCF_INTERFACE(iParticleBuiltinEffectorForce,2,0,0);
00710   
00712   virtual void SetAcceleration (const csVector3& acceleration) = 0;
00713 
00715   virtual const csVector3& GetAcceleration () const = 0;
00716 
00718   virtual void SetForce (const csVector3& force) = 0;
00719 
00721   virtual const csVector3& GetForce () const = 0;
00722 
00724   virtual void SetRandomAcceleration (const csVector3& magnitude) = 0;
00725 
00727   virtual const csVector3& GetRandomAcceleration () const = 0;
00728 };
00729 
00738 struct iParticleBuiltinEffectorLinColor : public iParticleEffector
00739 {
00740   SCF_INTERFACE(iParticleBuiltinEffectorLinColor,1,1,0);
00741 
00746   virtual size_t AddColor (const csColor4& color, float endTTL) = 0;
00747 
00751   virtual void RemoveColor (size_t index) = 0;
00752 
00756   virtual void Clear () = 0;
00757 
00761   virtual void SetColor (size_t index, const csColor4& color) = 0;
00762 
00766   virtual void SetEndTTL (size_t index, float ttl) = 0;
00767 
00771   virtual void GetColor (size_t index, csColor4& color, float& endTTL) const = 0;
00772 
00776   virtual const csColor4& GetColor (size_t index) const = 0;
00780   virtual float GetEndTTL (size_t index) const = 0;
00781 
00785   virtual size_t GetColorCount () const = 0;
00786 };
00787 
00793 enum csParticleBuiltinEffectorVFType
00794 {
00802   CS_PARTICLE_BUILTIN_SPIRAL,
00803 
00810   CS_PARTICLE_BUILTIN_RADIALPOINT
00811 };
00812 
00824 struct iParticleBuiltinEffectorVelocityField : public iParticleEffector
00825 {
00826   SCF_INTERFACE(iParticleBuiltinEffectorVelocityField,2,0,0);
00827 
00831   virtual void SetType (csParticleBuiltinEffectorVFType type) = 0;
00832 
00836   virtual csParticleBuiltinEffectorVFType GetType () const = 0;
00837 
00841   virtual void SetFParameter (size_t parameterNumber, float value) = 0;
00842   
00846   virtual float GetFParameter (size_t parameterNumber) const = 0;
00847 
00851   virtual size_t GetFParameterCount () const = 0;
00852 
00856   virtual void AddFParameter(float value) = 0;
00857 
00861   virtual void RemoveFParameter(size_t index) = 0;
00862 
00866   virtual void SetVParameter (size_t parameterNumber, const csVector3& value) = 0;
00867   
00871   virtual csVector3 GetVParameter (size_t parameterNumber) const = 0;
00872 
00876   virtual size_t GetVParameterCount () const = 0;
00877 
00881   virtual void AddVParameter(const csVector3& value) = 0;
00882 
00886   virtual void RemoveVParameter(size_t index) = 0;
00887 
00888 };
00889 
00894 enum csParticleParameterMask
00895 {
00897   CS_PARTICLE_MASK_MASS = 1,
00899   CS_PARTICLE_MASK_LINEARVELOCITY = 2,
00901   CS_PARTICLE_MASK_ANGULARVELOCITY = 4,
00903   CS_PARTICLE_MASK_COLOR = 8,
00905   CS_PARTICLE_MASK_PARTICLESIZE = 16,
00906 
00908   CS_PARTICLE_MASK_ALL = CS_PARTICLE_MASK_MASS | CS_PARTICLE_MASK_LINEARVELOCITY |
00909     CS_PARTICLE_MASK_ANGULARVELOCITY | CS_PARTICLE_MASK_COLOR | CS_PARTICLE_MASK_PARTICLESIZE
00910 };
00911 
00916 struct csParticleParameterSet
00917 {
00919   float mass;
00921   csVector3 linearVelocity;
00923   csVector3 angularVelocity;
00925   csColor4 color;
00927   csVector2 particleSize;
00928 
00929   csParticleParameterSet ()
00930   {
00931     Clear ();
00932   }
00933 
00935   void Clear ()
00936   {
00937     mass = 0.0;
00938     linearVelocity.Set (0, 0, 0);
00939     angularVelocity.Set (0, 0, 0);
00940     color.Set (0, 0, 0, 0);
00941     particleSize.Set (0, 0);
00942   }
00943 };
00944 
00953 struct iParticleBuiltinEffectorLinear : public iParticleEffector
00954 {
00955   SCF_INTERFACE(iParticleBuiltinEffectorLinear,1,1,0);
00956 
00961   virtual void SetMask (int mask) = 0;
00962 
00966   virtual int GetMask () const = 0;
00967 
00972   virtual size_t AddParameterSet (const csParticleParameterSet& param, float endTTL) = 0;
00973 
00977   virtual void RemoveParameterSet (size_t index) = 0;
00978 
00982   virtual void Clear () = 0;
00983 
00987   virtual void SetParameterSet (size_t index, const csParticleParameterSet& param) = 0;
00988 
00992   virtual void SetEndTTL (size_t index, float ttl) = 0;
00993 
00997   virtual void GetParameterSet (size_t index, csParticleParameterSet& param, float& endTTL) const = 0;
00998 
01002   virtual const csParticleParameterSet& GetParameterSet (size_t index) const = 0;
01003 
01007   virtual float GetEndTTL (size_t index) const = 0;
01008 
01012   virtual size_t GetParameterSetCount () const = 0;
01013 };
01014 
01023 struct iParticleBuiltinEffectorLight : public iParticleEffector
01024 {
01025   SCF_INTERFACE(iParticleBuiltinEffectorLight,1,0,0);
01026 
01032   virtual void SetInitialCutoffDistance (float distance) = 0;
01033 
01035   virtual float GetInitialCutoffDistance () const = 0;
01036 };
01037 
01041 struct iParticleBuiltinEffectorFactory : public virtual iBase
01042 {
01043   SCF_INTERFACE(iParticleBuiltinEffectorFactory,1,0,2);
01044 
01046   virtual csPtr<iParticleBuiltinEffectorForce> CreateForce () const = 0;
01047 
01049   virtual csPtr<iParticleBuiltinEffectorLinColor> CreateLinColor () const = 0;
01050 
01052   virtual csPtr<iParticleBuiltinEffectorVelocityField> CreateVelocityField () const = 0;
01053 
01055   virtual csPtr<iParticleBuiltinEffectorLinear> CreateLinear () const = 0;
01056 
01058   virtual csPtr<iParticleBuiltinEffectorLight> CreateLight () const = 0;
01059 };
01060 
01066 #endif // __CS_IMESH_PARTICLES_H__

Generated for Crystal Space 2.0 by doxygen 1.7.6.1