FogDensityNode.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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/FogDensityNode.h>
  6. #include <AnKi/Scene/Components/MoveComponent.h>
  7. #include <AnKi/Scene/Components/FogDensityComponent.h>
  8. #include <AnKi/Scene/Components/SpatialComponent.h>
  9. namespace anki {
  10. class FogDensityNode::MoveFeedbackComponent : public SceneComponent
  11. {
  12. ANKI_SCENE_COMPONENT(FogDensityNode::MoveFeedbackComponent)
  13. public:
  14. MoveFeedbackComponent(SceneNode* node)
  15. : SceneComponent(node, getStaticClassId(), true)
  16. {
  17. }
  18. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  19. {
  20. updated = false;
  21. const MoveComponent& movec = node.getFirstComponentOfType<MoveComponent>();
  22. if(movec.getTimestamp() == node.getGlobalTimestamp())
  23. {
  24. static_cast<FogDensityNode&>(node).onMoveUpdated(movec);
  25. }
  26. return Error::NONE;
  27. }
  28. };
  29. ANKI_SCENE_COMPONENT_STATICS(FogDensityNode::MoveFeedbackComponent)
  30. class FogDensityNode::DensityShapeFeedbackComponent : public SceneComponent
  31. {
  32. ANKI_SCENE_COMPONENT(FogDensityNode::DensityShapeFeedbackComponent)
  33. public:
  34. DensityShapeFeedbackComponent(SceneNode* node)
  35. : SceneComponent(node, getStaticClassId(), true)
  36. {
  37. }
  38. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  39. {
  40. updated = false;
  41. const FogDensityComponent& fogc = node.getFirstComponentOfType<FogDensityComponent>();
  42. if(fogc.getTimestamp() == node.getGlobalTimestamp())
  43. {
  44. static_cast<FogDensityNode&>(node).onDensityShapeUpdated(fogc);
  45. }
  46. return Error::NONE;
  47. }
  48. };
  49. ANKI_SCENE_COMPONENT_STATICS(FogDensityNode::DensityShapeFeedbackComponent)
  50. FogDensityNode::FogDensityNode(SceneGraph* scene, CString name)
  51. : SceneNode(scene, name)
  52. {
  53. newComponent<MoveComponent>();
  54. newComponent<MoveFeedbackComponent>();
  55. newComponent<FogDensityComponent>();
  56. newComponent<DensityShapeFeedbackComponent>();
  57. newComponent<SpatialComponent>();
  58. }
  59. FogDensityNode::~FogDensityNode()
  60. {
  61. }
  62. void FogDensityNode::onMoveUpdated(const MoveComponent& movec)
  63. {
  64. getFirstComponentOfType<FogDensityComponent>().setWorldPosition(movec.getWorldTransform().getOrigin().xyz());
  65. getFirstComponentOfType<SpatialComponent>().setSpatialOrigin(movec.getWorldTransform().getOrigin().xyz());
  66. }
  67. void FogDensityNode::onDensityShapeUpdated(const FogDensityComponent& fogc)
  68. {
  69. SpatialComponent& spatialc = getFirstComponentOfType<SpatialComponent>();
  70. if(fogc.isAabb())
  71. {
  72. spatialc.setAabbWorldSpace(fogc.getAabbWorldSpace());
  73. }
  74. else
  75. {
  76. ANKI_ASSERT(fogc.isSphere());
  77. spatialc.setSphereWorldSpace(fogc.getSphereWorldSpace());
  78. }
  79. }
  80. } // end namespace anki