GpuParticleEmitterComponent.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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/Collision/Aabb.h>
  8. #include <AnKi/Renderer/RenderQueue.h>
  9. #include <AnKi/Resource/ParticleEmitterResource.h>
  10. namespace anki {
  11. /// @addtogroup scene
  12. /// @{
  13. /// GPU particle emitter.
  14. class GpuParticleEmitterComponent : public SceneComponent
  15. {
  16. ANKI_SCENE_COMPONENT(GpuParticleEmitterComponent)
  17. public:
  18. GpuParticleEmitterComponent(SceneNode* node);
  19. ~GpuParticleEmitterComponent();
  20. ANKI_USE_RESULT Error loadParticleEmitterResource(CString filename);
  21. void setWorldTransform(const Transform& trf);
  22. ParticleEmitterResourcePtr getParticleEmitterResource() const
  23. {
  24. return m_particleEmitterResource;
  25. }
  26. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override;
  27. /// Callback that will be used by the GenericGpuComputeJobComponent
  28. static void simulateCallback(GenericGpuComputeJobQueueElementContext& ctx, const void* userData)
  29. {
  30. ANKI_ASSERT(userData);
  31. static_cast<const GpuParticleEmitterComponent*>(userData)->simulate(ctx);
  32. }
  33. /// Callback that will be used by the RenderComponent
  34. static void drawCallback(RenderQueueDrawContext& ctx, ConstWeakArray<void*> userData)
  35. {
  36. ANKI_ASSERT(userData.getSize() == 1);
  37. static_cast<const GpuParticleEmitterComponent*>(userData[0])->draw(ctx);
  38. }
  39. const Aabb& getBoundingVolumeWorldSpace() const
  40. {
  41. return m_worldAabb;
  42. }
  43. Bool isEnabled() const
  44. {
  45. return m_particleEmitterResource.isCreated();
  46. }
  47. private:
  48. static constexpr U32 MAX_RAND_FACTORS = 32;
  49. SceneNode* m_node;
  50. ShaderProgramResourcePtr m_prog;
  51. ShaderProgramPtr m_grProg;
  52. U32 m_workgroupSizeX = 0;
  53. ParticleEmitterResourcePtr m_particleEmitterResource;
  54. BufferPtr m_propsBuff; ///< Constant buffer with particle properties.
  55. BufferPtr m_particlesBuff; ///< Particles buffer.
  56. BufferPtr m_randFactorsBuff; ///< Contains flots with random values. Values in range [0.0, 1.0].
  57. SamplerPtr m_nearestAnyClampSampler;
  58. Aabb m_emitterBoundingBoxLocal = Aabb(Vec3(0.0f), Vec3(1.0f));
  59. U32 m_maxParticleCount = 0;
  60. Second m_dt = 0.0;
  61. Vec3 m_worldPosition = Vec3(0.0f); //< Cache it.
  62. Mat3x4 m_worldRotation = Mat3x4::getIdentity();
  63. Aabb m_worldAabb = Aabb(Vec3(0.0f), Vec3(1.0f));
  64. ImageResourcePtr m_dbgImage;
  65. Bool m_markedForUpdate = true;
  66. void simulate(GenericGpuComputeJobQueueElementContext& ctx) const;
  67. void draw(RenderQueueDrawContext& ctx) const;
  68. };
  69. /// @}
  70. } // end namespace anki