GpuParticleEmitterNode.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. #include <AnKi/Scene/GpuParticleEmitterNode.h>
  6. #include <AnKi/Scene/Components/MoveComponent.h>
  7. #include <AnKi/Scene/Components/SpatialComponent.h>
  8. #include <AnKi/Scene/Components/GenericGpuComputeJobComponent.h>
  9. #include <AnKi/Scene/Components/RenderComponent.h>
  10. #include <AnKi/Scene/Components/GpuParticleEmitterComponent.h>
  11. namespace anki
  12. {
  13. /// Feedback component
  14. class GpuParticleEmitterNode::MoveFeedbackComponent : public SceneComponent
  15. {
  16. ANKI_SCENE_COMPONENT(GpuParticleEmitterNode::MoveFeedbackComponent)
  17. public:
  18. MoveFeedbackComponent(SceneNode* node)
  19. : SceneComponent(node, getStaticClassId(), true)
  20. {
  21. }
  22. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  23. {
  24. updated = false;
  25. const MoveComponent& move = node.getFirstComponentOfType<MoveComponent>();
  26. if(move.getTimestamp() == node.getGlobalTimestamp())
  27. {
  28. GpuParticleEmitterNode& mnode = static_cast<GpuParticleEmitterNode&>(node);
  29. mnode.onMoveComponentUpdate(move);
  30. }
  31. return Error::NONE;
  32. }
  33. };
  34. ANKI_SCENE_COMPONENT_STATICS(GpuParticleEmitterNode::MoveFeedbackComponent)
  35. /// Feedback component
  36. class GpuParticleEmitterNode::ShapeFeedbackComponent : public SceneComponent
  37. {
  38. ANKI_SCENE_COMPONENT(GpuParticleEmitterNode::ShapeFeedbackComponent)
  39. public:
  40. ShapeFeedbackComponent(SceneNode* node)
  41. : SceneComponent(node, getStaticClassId(), true)
  42. {
  43. }
  44. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  45. {
  46. updated = false;
  47. const GpuParticleEmitterComponent& pec = node.getFirstComponentOfType<GpuParticleEmitterComponent>();
  48. if(pec.getTimestamp() == node.getGlobalTimestamp())
  49. {
  50. GpuParticleEmitterNode& mnode = static_cast<GpuParticleEmitterNode&>(node);
  51. mnode.onShapeUpdate(pec);
  52. }
  53. return Error::NONE;
  54. }
  55. };
  56. ANKI_SCENE_COMPONENT_STATICS(GpuParticleEmitterNode::ShapeFeedbackComponent)
  57. GpuParticleEmitterNode::GpuParticleEmitterNode(SceneGraph* scene, CString name)
  58. : SceneNode(scene, name)
  59. {
  60. // Create the components
  61. newComponent<MoveComponent>();
  62. newComponent<MoveFeedbackComponent>();
  63. GpuParticleEmitterComponent* pec = newComponent<GpuParticleEmitterComponent>();
  64. newComponent<ShapeFeedbackComponent>();
  65. newComponent<SpatialComponent>();
  66. GenericGpuComputeJobComponent* gpuComp = newComponent<GenericGpuComputeJobComponent>();
  67. gpuComp->setCallback(GpuParticleEmitterComponent::simulateCallback, pec);
  68. RenderComponent* rcomp = newComponent<RenderComponent>();
  69. const U64 noMerging = 0;
  70. rcomp->initRaster(GpuParticleEmitterComponent::drawCallback, pec, noMerging);
  71. }
  72. GpuParticleEmitterNode::~GpuParticleEmitterNode()
  73. {
  74. }
  75. Error GpuParticleEmitterNode::frameUpdate(Second prevUpdateTime, Second crntTime)
  76. {
  77. const GpuParticleEmitterComponent& pec = getFirstComponentOfType<GpuParticleEmitterComponent>();
  78. if(pec.isEnabled())
  79. {
  80. RenderComponent& rc = getFirstComponentOfType<RenderComponent>();
  81. rc.setFlagsFromMaterial(pec.getParticleEmitterResource()->getMaterial());
  82. }
  83. return Error::NONE;
  84. }
  85. void GpuParticleEmitterNode::onMoveComponentUpdate(const MoveComponent& movec)
  86. {
  87. getFirstComponentOfType<SpatialComponent>().setSpatialOrigin(movec.getWorldTransform().getOrigin().xyz());
  88. getFirstComponentOfType<GpuParticleEmitterComponent>().setWorldTransform(movec.getWorldTransform());
  89. }
  90. void GpuParticleEmitterNode::onShapeUpdate(const GpuParticleEmitterComponent& pec)
  91. {
  92. getFirstComponentOfType<SpatialComponent>().setAabbWorldSpace(pec.getBoundingVolumeWorldSpace());
  93. }
  94. } // end namespace anki