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 00032 #include "ivaria/collisions.h" 00033 00038 struct iParticleSystemBase; 00039 00049 enum csParticleSortMode 00050 { 00052 CS_PARTICLE_SORT_NONE, 00054 CS_PARTICLE_SORT_DISTANCE, 00056 CS_PARTICLE_SORT_DOT 00057 }; 00058 00064 enum csParticleRenderOrientation 00065 { 00070 CS_PARTICLE_CAMERAFACE, 00077 CS_PARTICLE_CAMERAFACE_APPROX, 00082 CS_PARTICLE_ORIENT_COMMON, 00089 CS_PARTICLE_ORIENT_COMMON_APPROX, 00095 CS_PARTICLE_ORIENT_VELOCITY, 00101 CS_PARTICLE_ORIENT_SELF, 00109 CS_PARTICLE_ORIENT_SELF_FORWARD 00110 }; 00111 00116 enum csParticleRotationMode 00117 { 00119 CS_PARTICLE_ROTATE_NONE, 00121 CS_PARTICLE_ROTATE_TEXCOORD, 00123 CS_PARTICLE_ROTATE_VERTICES 00124 }; 00125 00131 enum csParticleIntegrationMode 00132 { 00134 CS_PARTICLE_INTEGRATE_NONE, 00136 CS_PARTICLE_INTEGRATE_LINEAR, 00141 CS_PARTICLE_INTEGRATE_BOTH 00142 }; 00143 00149 enum csParticleTransformMode 00150 { 00155 CS_PARTICLE_LOCAL_MODE, 00163 CS_PARTICLE_LOCAL_EMITTER, 00168 CS_PARTICLE_WORLD_MODE 00169 }; 00170 00174 struct csParticle 00175 { 00181 csVector3 position; 00182 00186 float mass; 00187 00194 csQuaternion orientation; 00195 00201 csVector3 linearVelocity; 00202 00206 float timeToLive; 00207 00211 csVector3 angularVelocity; 00212 00213 // Pad to make this struct 64 bytes 00214 float pad; 00215 }; 00216 00220 struct csParticleAux 00221 { 00225 csColor4 color; 00226 00231 csVector2 particleSize; 00232 00233 // Pad to make this 32 bytes 00234 float pad[2]; 00235 }; 00236 00240 struct csParticleBuffer 00241 { 00243 csParticle* particleData; 00244 00246 csParticleAux* particleAuxData; 00247 00249 size_t particleCount; 00250 }; 00251 00257 struct iParticleEmitter : public virtual iBase 00258 { 00259 SCF_INTERFACE(iParticleEmitter,1,0,0); 00260 00265 virtual void SetEnabled (bool enabled) = 0; 00266 00270 virtual bool GetEnabled () const = 0; 00271 00278 virtual void SetStartTime (float time) = 0; 00279 00283 virtual float GetStartTime () const = 0; 00284 00292 virtual void SetDuration (float time) = 0; 00293 00297 virtual float GetDuration () const = 0; 00298 00302 virtual void SetEmissionRate (float particlesPerSecond) = 0; 00303 00307 virtual float GetEmissionRate () const = 0; 00308 00313 virtual void SetInitialTTL (float min, float max) = 0; 00314 00318 virtual void GetInitialTTL (float& min, float& max) const= 0; 00319 00324 virtual void SetInitialMass (float min, float max) = 0; 00325 00329 virtual void GetInitialMass (float& min, float& max) const = 0; 00330 00334 virtual csPtr<iParticleEmitter> Clone () const = 0; 00335 00345 virtual size_t ParticlesToEmit (iParticleSystemBase* system, 00346 float dt, float totalTime) = 0; 00347 00362 virtual void EmitParticles (iParticleSystemBase* system, 00363 const csParticleBuffer& particleBuffer, float dt, float totalTime, 00364 const csReversibleTransform* const emitterToParticle = 0) = 0; 00365 00366 }; 00367 00373 struct iParticleEffector : public virtual iBase 00374 { 00375 SCF_INTERFACE(iParticleEffector,1,0,0); 00376 00380 virtual csPtr<iParticleEffector> Clone () const = 0; 00381 00385 virtual void EffectParticles (iParticleSystemBase* system, 00386 const csParticleBuffer& particleBuffer, float dt, float totalTime) = 0; 00387 }; 00388 00389 00396 struct iParticleSystemBase : public virtual iBase 00397 { 00398 SCF_INTERFACE(iParticleSystemBase, 1,0,0); 00399 00401 virtual void SetParticleRenderOrientation (csParticleRenderOrientation o) = 0; 00402 00404 virtual csParticleRenderOrientation GetParticleRenderOrientation () const = 0; 00405 00407 virtual void SetRotationMode (csParticleRotationMode mode) = 0; 00408 00410 virtual csParticleRotationMode GetRotationMode () const = 0; 00411 00413 virtual void SetSortMode (csParticleSortMode mode) = 0; 00414 00416 virtual csParticleSortMode GetSortMode () const = 0; 00417 00419 virtual void SetIntegrationMode (csParticleIntegrationMode mode) = 0; 00420 00422 virtual csParticleIntegrationMode GetIntegrationMode () = 0; 00423 00425 virtual void SetCommonDirection (const csVector3& direction) = 0; 00426 00428 virtual const csVector3& GetCommonDirection () const = 0; 00429 00431 virtual void SetTransformMode (csParticleTransformMode mode) = 0; 00432 00434 virtual csParticleTransformMode GetTransformMode () const = 0; 00435 00437 virtual void SetUseIndividualSize (bool individual) = 0; 00438 00440 virtual bool GetUseIndividualSize () const = 0; 00441 00443 virtual void SetParticleSize (const csVector2& size) = 0; 00444 00446 virtual const csVector2& GetParticleSize () const = 0; 00447 00449 virtual void SetMinBoundingBox (const csBox3& box) = 0; 00450 00452 virtual const csBox3& GetMinBoundingBox () const = 0; 00453 00455 virtual void AddEmitter (iParticleEmitter* emitter) = 0; 00456 00458 virtual iParticleEmitter* GetEmitter (size_t index) const = 0; 00459 00461 virtual void RemoveEmitter (size_t index) = 0; 00462 00464 virtual size_t GetEmitterCount () const = 0; 00465 00467 virtual void AddEffector (iParticleEffector* effector) = 0; 00468 00470 virtual iParticleEffector* GetEffector (size_t index) const = 0; 00471 00473 virtual void RemoveEffector (size_t index) = 0; 00474 00476 virtual size_t GetEffectorCount () const = 0; 00477 00478 }; 00479 00480 00484 struct iParticleSystemFactory : public iParticleSystemBase 00485 { 00486 SCF_INTERFACE(iParticleSystemFactory,1,0,0); 00487 00492 virtual void SetDeepCreation (bool deep) = 0; 00493 00495 virtual bool GetDeepCreation () const = 0; 00496 }; 00497 00498 00502 struct iParticleSystem : public iParticleSystemBase 00503 { 00504 SCF_INTERFACE(iParticleSystem,1,0,1); 00505 00507 virtual size_t GetParticleCount () const = 0; 00508 00510 virtual csParticle* GetParticle (size_t index) = 0; 00511 00513 virtual csParticleAux* GetParticleAux (size_t index) = 0; 00514 00523 virtual csParticleBuffer* LockForExternalControl (size_t maxParticles) = 0; 00524 00532 virtual void Advance (csTicks time) = 0; 00533 }; 00534 00540 00541 enum csParticleBuiltinEmitterPlacement 00542 { 00544 CS_PARTICLE_BUILTIN_CENTER, 00546 CS_PARTICLE_BUILTIN_VOLUME, 00548 CS_PARTICLE_BUILTIN_SURFACE 00549 }; 00550 00554 struct iParticleBuiltinEmitterBase : public iParticleEmitter 00555 { 00556 SCF_INTERFACE(iParticleBuiltinEmitterBase,1,0,0); 00557 00563 virtual void SetPosition (const csVector3& position) = 0; 00564 00566 virtual const csVector3& GetPosition () const = 0; 00567 00569 virtual void SetParticlePlacement (csParticleBuiltinEmitterPlacement place) = 0; 00570 00572 virtual csParticleBuiltinEmitterPlacement GetParticlePlacement () const = 0; 00573 00586 virtual void SetUniformVelocity (bool uniform) = 0; 00587 00589 virtual bool GetUniformVelocity () const = 0; 00590 00592 virtual void SetInitialVelocity (const csVector3& linear, 00593 const csVector3& angular) = 0; 00594 00596 virtual void GetInitialVelocity (csVector3& linear, 00597 csVector3& angular) const = 0; 00598 }; 00599 00603 struct iParticleBuiltinEmitterSphere : public iParticleBuiltinEmitterBase 00604 { 00605 SCF_INTERFACE(iParticleBuiltinEmitterSphere,1,0,0); 00606 00608 virtual void SetRadius (float radius) = 0; 00609 00611 virtual float GetRadius () const = 0; 00612 }; 00613 00617 struct iParticleBuiltinEmitterCone : public iParticleBuiltinEmitterBase 00618 { 00619 SCF_INTERFACE(iParticleBuiltinEmitterCone,1,0,0); 00620 00622 virtual void SetExtent (const csVector3& extent) = 0; 00623 00625 virtual const csVector3& GetExtent () const = 0; 00626 00631 virtual void SetConeAngle (float angle) = 0; 00632 00634 virtual float GetConeAngle () const = 0; 00635 }; 00636 00640 struct iParticleBuiltinEmitterBox : public iParticleBuiltinEmitterBase 00641 { 00642 SCF_INTERFACE(iParticleBuiltinEmitterBox,1,0,0); 00643 00645 virtual void SetBox (const csOBB& box) = 0; 00646 00648 virtual const csOBB& GetBox () const = 0; 00649 }; 00650 00654 struct iParticleBuiltinEmitterCylinder : public iParticleBuiltinEmitterBase 00655 { 00656 SCF_INTERFACE(iParticleBuiltinEmitterCylinder,1,0,0); 00657 00659 virtual void SetRadius (float radius) = 0; 00660 00662 virtual float GetRadius () const = 0; 00663 00665 virtual void SetExtent (const csVector3& extent) = 0; 00666 00668 virtual const csVector3& GetExtent () const = 0; 00669 }; 00670 00674 struct iParticleBuiltinEmitterFactory : public virtual iBase 00675 { 00676 SCF_INTERFACE(iParticleBuiltinEmitterFactory,1,0,0); 00677 00679 virtual csPtr<iParticleBuiltinEmitterSphere> CreateSphere () const = 0; 00680 00682 virtual csPtr<iParticleBuiltinEmitterCone> CreateCone () const = 0; 00683 00685 virtual csPtr<iParticleBuiltinEmitterBox> CreateBox () const = 0; 00686 00688 virtual csPtr<iParticleBuiltinEmitterCylinder> CreateCylinder () const = 0; 00689 }; 00690 00709 struct iParticleBuiltinEffectorForce : public iParticleEffector 00710 { 00711 SCF_INTERFACE(iParticleBuiltinEffectorForce,2,0,0); 00712 00714 virtual void SetAcceleration (const csVector3& acceleration) = 0; 00716 virtual const csVector3& GetAcceleration () const = 0; 00717 00719 virtual void SetForce (const csVector3& force) = 0; 00721 virtual const csVector3& GetForce () const = 0; 00722 00724 virtual void SetRandomAcceleration (const csVector3& magnitude) = 0; 00726 virtual const csVector3& GetRandomAcceleration () const = 0; 00727 }; 00728 00747 struct iParticleBuiltinEffectorPhysical : public iParticleBuiltinEffectorForce 00748 { 00749 SCF_INTERFACE(iParticleBuiltinEffectorPhysical,1,0,0); 00750 00758 virtual void SetRestitution (const csVector2& rest) = 0; 00759 00761 virtual csVector2 GetRestitution () const = 0; 00762 00770 virtual void SetRestitutionMagnitude (float rest) = 0; 00771 00773 virtual float GetRestitutionMagnitude () const = 0; 00774 }; 00775 00784 struct iParticleBuiltinEffectorLinColor : public iParticleEffector 00785 { 00786 SCF_INTERFACE(iParticleBuiltinEffectorLinColor,1,1,0); 00787 00792 virtual size_t AddColor (const csColor4& color, float endTTL) = 0; 00793 00797 virtual void RemoveColor (size_t index) = 0; 00798 00802 virtual void Clear () = 0; 00803 00807 virtual void SetColor (size_t index, const csColor4& color) = 0; 00808 00812 virtual void SetEndTTL (size_t index, float ttl) = 0; 00813 00817 virtual void GetColor (size_t index, csColor4& color, float& endTTL) const = 0; 00818 00822 virtual const csColor4& GetColor (size_t index) const = 0; 00826 virtual float GetEndTTL (size_t index) const = 0; 00827 00831 virtual size_t GetColorCount () const = 0; 00832 }; 00833 00839 enum csParticleBuiltinEffectorVFType 00840 { 00848 CS_PARTICLE_BUILTIN_SPIRAL, 00849 00856 CS_PARTICLE_BUILTIN_RADIALPOINT 00857 }; 00858 00870 struct iParticleBuiltinEffectorVelocityField : public iParticleEffector 00871 { 00872 SCF_INTERFACE(iParticleBuiltinEffectorVelocityField,2,0,0); 00873 00877 virtual void SetType (csParticleBuiltinEffectorVFType type) = 0; 00878 00882 virtual csParticleBuiltinEffectorVFType GetType () const = 0; 00883 00887 virtual void SetFParameter (size_t parameterNumber, float value) = 0; 00888 00892 virtual float GetFParameter (size_t parameterNumber) const = 0; 00893 00897 virtual size_t GetFParameterCount () const = 0; 00898 00902 virtual void AddFParameter(float value) = 0; 00903 00907 virtual void RemoveFParameter(size_t index) = 0; 00908 00912 virtual void SetVParameter (size_t parameterNumber, const csVector3& value) = 0; 00913 00917 virtual csVector3 GetVParameter (size_t parameterNumber) const = 0; 00918 00922 virtual size_t GetVParameterCount () const = 0; 00923 00927 virtual void AddVParameter(const csVector3& value) = 0; 00928 00932 virtual void RemoveVParameter(size_t index) = 0; 00933 00934 }; 00935 00940 enum csParticleParameterMask 00941 { 00943 CS_PARTICLE_MASK_MASS = 1, 00945 CS_PARTICLE_MASK_LINEARVELOCITY = 2, 00947 CS_PARTICLE_MASK_ANGULARVELOCITY = 4, 00949 CS_PARTICLE_MASK_COLOR = 8, 00951 CS_PARTICLE_MASK_PARTICLESIZE = 16, 00952 00954 CS_PARTICLE_MASK_ALL = CS_PARTICLE_MASK_MASS | CS_PARTICLE_MASK_LINEARVELOCITY | 00955 CS_PARTICLE_MASK_ANGULARVELOCITY | CS_PARTICLE_MASK_COLOR | CS_PARTICLE_MASK_PARTICLESIZE 00956 }; 00957 00962 struct csParticleParameterSet 00963 { 00965 float mass; 00967 csVector3 linearVelocity; 00969 csVector3 angularVelocity; 00971 csColor4 color; 00973 csVector2 particleSize; 00974 00975 csParticleParameterSet () 00976 { 00977 Clear (); 00978 } 00979 00981 void Clear () 00982 { 00983 mass = 0.0; 00984 linearVelocity.Set (0, 0, 0); 00985 angularVelocity.Set (0, 0, 0); 00986 color.Set (0, 0, 0, 0); 00987 particleSize.Set (0, 0); 00988 } 00989 }; 00990 00999 struct iParticleBuiltinEffectorLinear : public iParticleEffector 01000 { 01001 SCF_INTERFACE(iParticleBuiltinEffectorLinear,1,1,0); 01002 01007 virtual void SetMask (int mask) = 0; 01008 01012 virtual int GetMask () const = 0; 01013 01018 virtual size_t AddParameterSet (const csParticleParameterSet& param, float endTTL) = 0; 01019 01023 virtual void RemoveParameterSet (size_t index) = 0; 01024 01028 virtual void Clear () = 0; 01029 01033 virtual void SetParameterSet (size_t index, const csParticleParameterSet& param) = 0; 01034 01038 virtual void SetEndTTL (size_t index, float ttl) = 0; 01039 01043 virtual void GetParameterSet (size_t index, csParticleParameterSet& param, float& endTTL) const = 0; 01044 01048 virtual const csParticleParameterSet& GetParameterSet (size_t index) const = 0; 01049 01053 virtual float GetEndTTL (size_t index) const = 0; 01054 01058 virtual size_t GetParameterSetCount () const = 0; 01059 }; 01060 01069 struct iParticleBuiltinEffectorLight : public iParticleEffector 01070 { 01071 SCF_INTERFACE(iParticleBuiltinEffectorLight,1,0,0); 01072 01078 virtual void SetInitialCutoffDistance (float distance) = 0; 01079 01081 virtual float GetInitialCutoffDistance () const = 0; 01082 }; 01083 01087 struct iParticleBuiltinEffectorFactory : public virtual iBase 01088 { 01089 SCF_INTERFACE(iParticleBuiltinEffectorFactory,1,0,3); 01090 01092 virtual csPtr<iParticleBuiltinEffectorForce> CreateForce () const = 0; 01093 01095 virtual csPtr<iParticleBuiltinEffectorLinColor> CreateLinColor () const = 0; 01096 01098 virtual csPtr<iParticleBuiltinEffectorVelocityField> CreateVelocityField () const = 0; 01099 01101 virtual csPtr<iParticleBuiltinEffectorLinear> CreateLinear () const = 0; 01102 01104 virtual csPtr<iParticleBuiltinEffectorLight> CreateLight () const = 0; 01105 01107 virtual csPtr<iParticleBuiltinEffectorPhysical> CreatePhysical () const = 0; 01108 }; 01109 01115 #endif // __CS_IMESH_PARTICLES_H__
Generated for Crystal Space 2.1 by doxygen 1.6.1
