RenderComponent.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. #pragma once
  6. #include <AnKi/Scene/Components/SceneComponent.h>
  7. #include <AnKi/Resource/MaterialResource.h>
  8. #include <AnKi/Core/StagingGpuMemoryManager.h>
  9. #include <AnKi/Renderer/RenderQueue.h>
  10. namespace anki
  11. {
  12. /// @addtogroup scene
  13. /// @{
  14. enum class RenderComponentFlag : U8
  15. {
  16. NONE = 0,
  17. CASTS_SHADOW = 1 << 0,
  18. FORWARD_SHADING = 1 << 1,
  19. SORT_LAST = 1 << 2, ///< Push it last when sorting the visibles.
  20. };
  21. ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(RenderComponentFlag)
  22. using FillRayTracingInstanceQueueElementCallback = void (*)(U32 lod, const void* userData,
  23. RayTracingInstanceQueueElement& el);
  24. /// Render component interface. Implemented by renderable scene nodes
  25. class RenderComponent : public SceneComponent
  26. {
  27. ANKI_SCENE_COMPONENT(RenderComponent)
  28. public:
  29. RenderComponent(SceneNode* node)
  30. : SceneComponent(node, getStaticClassId())
  31. {
  32. }
  33. Bool isEnabled() const
  34. {
  35. return m_callback != nullptr;
  36. }
  37. RenderComponentFlag getFlags() const
  38. {
  39. return m_flags;
  40. }
  41. void setFlags(RenderComponentFlag flags)
  42. {
  43. m_flags = flags;
  44. }
  45. void setFlagsFromMaterial(const MaterialResourcePtr& mtl)
  46. {
  47. RenderComponentFlag flags =
  48. (mtl->isForwardShading()) ? RenderComponentFlag::FORWARD_SHADING : RenderComponentFlag::NONE;
  49. flags |= (mtl->castsShadow()) ? RenderComponentFlag::CASTS_SHADOW : RenderComponentFlag::NONE;
  50. setFlags(flags);
  51. }
  52. void initRaster(RenderQueueDrawCallback callback, const void* userData, U64 mergeKey)
  53. {
  54. ANKI_ASSERT(callback != nullptr);
  55. ANKI_ASSERT(userData != nullptr);
  56. ANKI_ASSERT(mergeKey != MAX_U64);
  57. m_callback = callback;
  58. m_userData = userData;
  59. m_mergeKey = mergeKey;
  60. }
  61. void initRayTracing(FillRayTracingInstanceQueueElementCallback callback, const void* userData)
  62. {
  63. m_rtCallback = callback;
  64. m_rtCallbackUserData = userData;
  65. }
  66. void setupRenderableQueueElement(RenderableQueueElement& el) const
  67. {
  68. ANKI_ASSERT(el.m_callback != nullptr);
  69. el.m_callback = m_callback;
  70. ANKI_ASSERT(el.m_userData != nullptr);
  71. el.m_userData = m_userData;
  72. ANKI_ASSERT(el.m_mergeKey != MAX_U64);
  73. el.m_mergeKey = m_mergeKey;
  74. el.m_distanceFromCamera = -1.0f;
  75. el.m_lod = MAX_U8;
  76. }
  77. void setupRayTracingInstanceQueueElement(U32 lod, RayTracingInstanceQueueElement& el) const
  78. {
  79. ANKI_ASSERT(m_rtCallback);
  80. m_rtCallback(lod, m_rtCallbackUserData, el);
  81. }
  82. Bool getSupportsRayTracing() const
  83. {
  84. return m_rtCallback != nullptr;
  85. }
  86. /// Helper function.
  87. static void allocateAndSetupUniforms(const MaterialResourcePtr& mtl, const RenderQueueDrawContext& ctx,
  88. ConstWeakArray<Mat4> transforms, ConstWeakArray<Mat4> prevTransforms,
  89. StagingGpuMemoryManager& alloc);
  90. private:
  91. RenderQueueDrawCallback m_callback = nullptr;
  92. const void* m_userData = nullptr;
  93. U64 m_mergeKey = MAX_U64;
  94. FillRayTracingInstanceQueueElementCallback m_rtCallback = nullptr;
  95. const void* m_rtCallbackUserData = nullptr;
  96. RenderComponentFlag m_flags = RenderComponentFlag::NONE;
  97. };
  98. /// @}
  99. } // end namespace anki