ParticleEmitterNode.cpp 3.2 KB

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