ParticleEmitterComponent.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. {
  12. // Forward
  13. class RenderQueueDrawContext;
  14. /// @addtogroup scene
  15. /// @{
  16. /// Interface for particle emitters.
  17. class ParticleEmitterComponent : public SceneComponent
  18. {
  19. ANKI_SCENE_COMPONENT(ParticleEmitterComponent)
  20. public:
  21. ParticleEmitterComponent(SceneNode* node);
  22. ~ParticleEmitterComponent();
  23. ANKI_USE_RESULT Error loadParticleEmitterResource(CString filename);
  24. Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override;
  25. void setWorldTransform(const Transform& transform)
  26. {
  27. m_transform = transform;
  28. }
  29. const Aabb& getAabbWorldSpace() const
  30. {
  31. return m_worldBoundingVolume;
  32. }
  33. ParticleEmitterResourcePtr getParticleEmitterResource() const
  34. {
  35. return m_particleEmitterResource;
  36. }
  37. /// RenderComponent callback. The userData is the component.
  38. static void drawCallback(RenderQueueDrawContext& ctx, ConstWeakArray<void*> userData)
  39. {
  40. ANKI_ASSERT(userData.getSize() == 1);
  41. static_cast<const ParticleEmitterComponent*>(userData[0])->draw(ctx);
  42. }
  43. Bool isEnabled() const
  44. {
  45. return m_particleEmitterResource.isCreated();
  46. }
  47. private:
  48. class ParticleBase;
  49. class SimpleParticle;
  50. class PhysicsParticle;
  51. enum class SimulationType : U8
  52. {
  53. UNDEFINED,
  54. SIMPLE,
  55. PHYSICS_ENGINE
  56. };
  57. static constexpr U32 VERTEX_SIZE = 5 * sizeof(F32);
  58. SceneNode* m_node = nullptr;
  59. ParticleEmitterProperties m_props;
  60. ParticleEmitterResourcePtr m_particleEmitterResource;
  61. DynamicArray<SimpleParticle> m_simpleParticles;
  62. DynamicArray<PhysicsParticle> m_physicsParticles;
  63. Second m_timeLeftForNextEmission = 0.0;
  64. U32 m_aliveParticleCount = 0;
  65. Transform m_transform = Transform::getIdentity();
  66. Aabb m_worldBoundingVolume = Aabb(Vec3(-1.0f), Vec3(1.0f));
  67. U32 m_vertBuffSize = 0;
  68. void* m_verts = nullptr;
  69. ImageResourcePtr m_dbgImage;
  70. SimulationType m_simulationType = SimulationType::UNDEFINED;
  71. template<typename TParticle>
  72. void simulate(Second prevUpdateTime, Second crntTime, WeakArray<TParticle> particles);
  73. void draw(RenderQueueDrawContext& ctx) const;
  74. };
  75. /// @}
  76. } // end namespace anki