RenderComponent.h 3.1 KB

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