FogDensityComponent.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright (C) 2009-2023, 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/Components/FogDensityComponent.h>
  6. #include <AnKi/Scene/SceneNode.h>
  7. #include <AnKi/Scene/SceneGraph.h>
  8. namespace anki {
  9. FogDensityComponent::FogDensityComponent(SceneNode* node)
  10. : SceneComponent(node, getStaticClassId())
  11. , m_spatial(this)
  12. {
  13. m_gpuSceneOffset = U32(node->getSceneGraph().getAllGpuSceneContiguousArrays().allocate(
  14. GpuSceneContiguousArrayType::kFogDensityVolumes));
  15. }
  16. void FogDensityComponent::onDestroy(SceneNode& node)
  17. {
  18. m_spatial.removeFromOctree(node.getSceneGraph().getOctree());
  19. node.getSceneGraph().getAllGpuSceneContiguousArrays().deferredFree(GpuSceneContiguousArrayType::kFogDensityVolumes,
  20. m_gpuSceneOffset);
  21. }
  22. Error FogDensityComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
  23. {
  24. updated = m_dirty || info.m_node->movedThisFrame();
  25. if(updated)
  26. {
  27. m_dirty = false;
  28. m_worldPos = info.m_node->getWorldTransform().getOrigin().xyz();
  29. if(m_isBox)
  30. {
  31. const Aabb aabb(m_aabbMin + m_worldPos, m_aabbMax + m_worldPos);
  32. m_spatial.setBoundingShape(aabb);
  33. }
  34. else
  35. {
  36. const Sphere sphere(m_worldPos, m_sphereRadius);
  37. m_spatial.setBoundingShape(sphere);
  38. }
  39. // Upload to the GPU scene
  40. GpuSceneFogDensityVolume gpuVolume;
  41. if(m_isBox)
  42. {
  43. gpuVolume.m_aabbMinOrSphereCenter = m_aabbMin.xyz();
  44. gpuVolume.m_aabbMaxOrSphereRadiusSquared = m_aabbMax.xyz();
  45. }
  46. else
  47. {
  48. gpuVolume.m_aabbMaxOrSphereRadiusSquared = Vec3(m_sphereRadius * m_sphereRadius);
  49. gpuVolume.m_aabbMinOrSphereCenter = m_worldPos.xyz();
  50. }
  51. gpuVolume.m_isBox = m_isBox;
  52. gpuVolume.m_density = m_density;
  53. getExternalSubsystems(*info.m_node)
  54. .m_gpuSceneMicroPatcher->newCopy(*info.m_framePool, m_gpuSceneOffset, sizeof(gpuVolume), &gpuVolume);
  55. }
  56. const Bool spatialUpdated = m_spatial.update(info.m_node->getSceneGraph().getOctree());
  57. updated = updated || spatialUpdated;
  58. return Error::kNone;
  59. }
  60. } // end namespace anki