BsRenderQueue.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #pragma once
  2. #include "BsPrerequisites.h"
  3. #include "BsVector3.h"
  4. #include "BsSubMesh.h"
  5. namespace BansheeEngine
  6. {
  7. /**
  8. * @brief Contains data needed for performing a single rendering pass.
  9. */
  10. struct BS_EXPORT RenderQueueElement
  11. {
  12. RenderQueueElement()
  13. :passIdx(0)
  14. { }
  15. RenderableElement* renderElem;
  16. SPtr<MaterialCore> material;
  17. SPtr<MeshCoreBase> mesh;
  18. SubMesh subMesh;
  19. UINT32 passIdx;
  20. };
  21. /**
  22. * @brief Render objects determines rendering order of objects contained within it. Rendering order
  23. * is determined by object material, and can influence rendering of transparent or opaque objects,
  24. * or be used to improve performance by grouping similar objects together.
  25. */
  26. class BS_EXPORT RenderQueue
  27. {
  28. /**
  29. * @brief Data used for renderable elemnt sorting.
  30. */
  31. struct SortData
  32. {
  33. RenderQueueElement element;
  34. QueueSortType sortType;
  35. UINT32 seqIdx;
  36. UINT32 priority;
  37. float distFromCamera;
  38. };
  39. public:
  40. RenderQueue();
  41. /**
  42. * @brief Adds a new entry to the render queue.
  43. *
  44. * @param element Renderable element to add to the queue.
  45. * @param distFromCamera Distance of this object from the camera. Used for distance sorting.
  46. */
  47. void add(RenderableElement* element, float distFromCamera);
  48. /**
  49. * @brief Adds a new entry to the render queue.
  50. *
  51. * @param material Material that will be used for rendering the object.
  52. * @param mesh Mesh representing the geometry of the object.
  53. * @param subMesh Portion of the mesh to draw.
  54. * @param distFromCamera Distance of this object from the camera. Used for distance sorting.
  55. */
  56. void add(const SPtr<MaterialCore>& material, const SPtr<MeshCoreBase>& mesh, const SubMesh& subMesh, float distFromCamera);
  57. /**
  58. * @brief Adds new entries from the provided render queue to this queue.
  59. */
  60. void add(const RenderQueue& renderQueue);
  61. /**
  62. * @brief Clears all render operations from the queue.
  63. */
  64. void clear();
  65. /**
  66. * @brief Sorts all the render operations using user-defined rules.
  67. */
  68. virtual void sort();
  69. /**
  70. * @brief Returns a list of sorted render elements. Caller must ensure
  71. * "sort" is called before this method.
  72. */
  73. const Vector<RenderQueueElement>& getSortedElements() const;
  74. protected:
  75. /**
  76. * @brief Callback used for sorting elements.
  77. */
  78. static bool elementSorter(const SortData&, const SortData&);
  79. Set<SortData, std::function<bool(const SortData&, const SortData&)>> mRenderElements;
  80. Vector<RenderQueueElement> mSortedRenderElements;
  81. };
  82. }