ParticleEmitterNode.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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/ParticleEmitterNode.h>
  6. #include <AnKi/Scene/Components/MoveComponent.h>
  7. #include <AnKi/Scene/Components/SpatialComponent.h>
  8. #include <AnKi/Scene/Components/ParticleEmitterComponent.h>
  9. #include <AnKi/Scene/Components/RenderComponent.h>
  10. namespace anki
  11. {
  12. /// Feedback component
  13. class ParticleEmitterNode::MoveFeedbackComponent : public SceneComponent
  14. {
  15. ANKI_SCENE_COMPONENT(ParticleEmitterNode::MoveFeedbackComponent)
  16. public:
  17. MoveFeedbackComponent(SceneNode* node)
  18. : SceneComponent(node, getStaticClassId(), true)
  19. {
  20. }
  21. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  22. {
  23. updated = false; // Don't care about updates for this component
  24. MoveComponent& move = node.getFirstComponentOfType<MoveComponent>();
  25. if(move.getTimestamp() == node.getGlobalTimestamp())
  26. {
  27. static_cast<ParticleEmitterNode&>(node).onMoveComponentUpdate(move);
  28. }
  29. return Error::NONE;
  30. }
  31. };
  32. ANKI_SCENE_COMPONENT_STATICS(ParticleEmitterNode::MoveFeedbackComponent)
  33. /// Feedback component
  34. class ParticleEmitterNode::ShapeFeedbackComponent : public SceneComponent
  35. {
  36. ANKI_SCENE_COMPONENT(ParticleEmitterNode::ShapeFeedbackComponent)
  37. public:
  38. ShapeFeedbackComponent(SceneNode* node)
  39. : SceneComponent(node, getStaticClassId(), false // Not feedback because it's always being called
  40. )
  41. {
  42. }
  43. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  44. {
  45. updated = false;
  46. static_cast<ParticleEmitterNode&>(node).onShapeUpdate();
  47. return Error::NONE;
  48. }
  49. };
  50. ANKI_SCENE_COMPONENT_STATICS(ParticleEmitterNode::ShapeFeedbackComponent)
  51. ParticleEmitterNode::ParticleEmitterNode(SceneGraph* scene, CString name)
  52. : SceneNode(scene, name)
  53. {
  54. // Components
  55. newComponent<MoveComponent>();
  56. newComponent<MoveFeedbackComponent>();
  57. ParticleEmitterComponent* particleEmitterc = newComponent<ParticleEmitterComponent>();
  58. newComponent<ShapeFeedbackComponent>();
  59. newComponent<SpatialComponent>();
  60. RenderComponent* rcomp = newComponent<RenderComponent>();
  61. rcomp->initRaster(ParticleEmitterComponent::drawCallback, particleEmitterc, 0); // No merging
  62. }
  63. ParticleEmitterNode::~ParticleEmitterNode()
  64. {
  65. }
  66. void ParticleEmitterNode::onMoveComponentUpdate(MoveComponent& move)
  67. {
  68. getFirstComponentOfType<ParticleEmitterComponent>().setWorldTransform(move.getWorldTransform());
  69. getFirstComponentOfType<SpatialComponent>().setSpatialOrigin(move.getWorldTransform().getOrigin().xyz());
  70. }
  71. void ParticleEmitterNode::onShapeUpdate()
  72. {
  73. const ParticleEmitterComponent& pec = getFirstComponentOfType<ParticleEmitterComponent>();
  74. getFirstComponentOfType<SpatialComponent>().setAabbWorldSpace(pec.getAabbWorldSpace());
  75. }
  76. Error ParticleEmitterNode::frameUpdate(Second prevUpdateTime, Second crntTime)
  77. {
  78. const ParticleEmitterComponent& pec = getFirstComponentOfType<ParticleEmitterComponent>();
  79. if(pec.isEnabled())
  80. {
  81. RenderComponent& rc = getFirstComponentOfType<RenderComponent>();
  82. rc.setFlagsFromMaterial(pec.getParticleEmitterResource()->getMaterial());
  83. }
  84. return Error::NONE;
  85. }
  86. } // end namespace anki