ParticleEmitterComponent.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright (C) 2009-present, 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/Scene/RenderStateBucket.h>
  8. #include <AnKi/Scene/GpuSceneArray.h>
  9. #include <AnKi/Resource/ParticleEmitterResource.h>
  10. #include <AnKi/GpuMemory/UnifiedGeometryBuffer.h>
  11. #include <AnKi/Collision/Aabb.h>
  12. #include <AnKi/Util/WeakArray.h>
  13. namespace anki {
  14. // Forward
  15. class RenderableQueueElement;
  16. /// @addtogroup scene
  17. /// @{
  18. /// Interface for particle emitters.
  19. class ParticleEmitterComponent : public SceneComponent
  20. {
  21. ANKI_SCENE_COMPONENT(ParticleEmitterComponent)
  22. public:
  23. ParticleEmitterComponent(SceneNode* node);
  24. ~ParticleEmitterComponent();
  25. void loadParticleEmitterResource(CString filename);
  26. Bool isEnabled() const
  27. {
  28. return m_particleEmitterResource.isCreated();
  29. }
  30. private:
  31. class ParticleBase;
  32. class SimpleParticle;
  33. class PhysicsParticle;
  34. enum class SimulationType : U8
  35. {
  36. kUndefined,
  37. kSimple,
  38. kPhysicsEngine
  39. };
  40. ParticleEmitterProperties m_props;
  41. ParticleEmitterResourcePtr m_particleEmitterResource;
  42. SceneDynamicArray<SimpleParticle> m_simpleParticles;
  43. SceneDynamicArray<PhysicsParticle> m_physicsParticles;
  44. Second m_timeLeftForNextEmission = 0.0;
  45. U32 m_aliveParticleCount = 0;
  46. UnifiedGeometryBufferAllocation m_quadPositions;
  47. UnifiedGeometryBufferAllocation m_quadUvs;
  48. UnifiedGeometryBufferAllocation m_quadIndices;
  49. GpuSceneBufferAllocation m_gpuScenePositions;
  50. GpuSceneBufferAllocation m_gpuSceneAlphas;
  51. GpuSceneBufferAllocation m_gpuSceneScales;
  52. GpuSceneBufferAllocation m_gpuSceneConstants;
  53. GpuSceneArrays::ParticleEmitter::Allocation m_gpuSceneParticleEmitter;
  54. GpuSceneArrays::Renderable::Allocation m_gpuSceneRenderable;
  55. GpuSceneArrays::MeshLod::Allocation m_gpuSceneMeshLods;
  56. GpuSceneArrays::RenderableBoundingVolumeGBuffer::Allocation m_gpuSceneRenderableAabbGBuffer;
  57. GpuSceneArrays::RenderableBoundingVolumeDepth::Allocation m_gpuSceneRenderableAabbDepth;
  58. GpuSceneArrays::RenderableBoundingVolumeForward::Allocation m_gpuSceneRenderableAabbForward;
  59. Array<RenderStateBucketIndex, U32(RenderingTechnique::kCount)> m_renderStateBuckets;
  60. Bool m_resourceUpdated = true;
  61. SimulationType m_simulationType = SimulationType::kUndefined;
  62. void update(SceneComponentUpdateInfo& info, Bool& updated) override;
  63. template<typename TParticle>
  64. void simulate(Second prevUpdateTime, Second crntTime, const Transform& worldTransform, WeakArray<TParticle> particles, Vec3*& positions,
  65. F32*& scales, F32*& alphas, Aabb& aabbWorld);
  66. };
  67. /// @}
  68. } // end namespace anki