ParticleEmitterComponent.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Scene/Components/SceneComponent.h>
  7. #include <AnKi/Resource/ParticleEmitterResource.h>
  8. #include <AnKi/Collision/Aabb.h>
  9. #include <AnKi/Util/WeakArray.h>
  10. namespace anki {
  11. // Forward
  12. class RenderQueueDrawContext;
  13. /// @addtogroup scene
  14. /// @{
  15. /// Interface for particle emitters.
  16. class ParticleEmitterComponent : public SceneComponent
  17. {
  18. ANKI_SCENE_COMPONENT(ParticleEmitterComponent)
  19. public:
  20. ParticleEmitterComponent(SceneNode* node);
  21. ~ParticleEmitterComponent();
  22. ANKI_USE_RESULT Error loadParticleEmitterResource(CString filename);
  23. Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override;
  24. void setWorldTransform(const Transform& transform)
  25. {
  26. m_transform = transform;
  27. }
  28. const Aabb& getAabbWorldSpace() const
  29. {
  30. return m_worldBoundingVolume;
  31. }
  32. ParticleEmitterResourcePtr getParticleEmitterResource() const
  33. {
  34. return m_particleEmitterResource;
  35. }
  36. /// RenderComponent callback. The userData is the component.
  37. static void drawCallback(RenderQueueDrawContext& ctx, ConstWeakArray<void*> userData)
  38. {
  39. ANKI_ASSERT(userData.getSize() == 1);
  40. static_cast<const ParticleEmitterComponent*>(userData[0])->draw(ctx);
  41. }
  42. Bool isEnabled() const
  43. {
  44. return m_particleEmitterResource.isCreated();
  45. }
  46. private:
  47. class ParticleBase;
  48. class SimpleParticle;
  49. class PhysicsParticle;
  50. enum class SimulationType : U8
  51. {
  52. UNDEFINED,
  53. SIMPLE,
  54. PHYSICS_ENGINE
  55. };
  56. static constexpr U32 VERTEX_SIZE = 5 * sizeof(F32);
  57. SceneNode* m_node = nullptr;
  58. ParticleEmitterProperties m_props;
  59. ParticleEmitterResourcePtr m_particleEmitterResource;
  60. DynamicArray<SimpleParticle> m_simpleParticles;
  61. DynamicArray<PhysicsParticle> m_physicsParticles;
  62. Second m_timeLeftForNextEmission = 0.0;
  63. U32 m_aliveParticleCount = 0;
  64. Transform m_transform = Transform::getIdentity();
  65. Aabb m_worldBoundingVolume = Aabb(Vec3(-1.0f), Vec3(1.0f));
  66. U32 m_vertBuffSize = 0;
  67. void* m_verts = nullptr;
  68. ImageResourcePtr m_dbgImage;
  69. SimulationType m_simulationType = SimulationType::UNDEFINED;
  70. template<typename TParticle>
  71. void simulate(Second prevUpdateTime, Second crntTime, WeakArray<TParticle> particles);
  72. void draw(RenderQueueDrawContext& ctx) const;
  73. };
  74. /// @}
  75. } // end namespace anki