BsCoreRenderer.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsGameObject.h"
  4. #include "BsEvent.h"
  5. #include "BsStringID.h"
  6. #include "BsRendererMeshData.h"
  7. namespace BansheeEngine
  8. {
  9. /**
  10. * Available parameter block semantics that allow the renderer to identify
  11. * the use of a GPU program parameter block specified in a shader.
  12. */
  13. static StringID RBS_Static = "Static";
  14. static StringID RBS_PerCamera = "PerCamera";
  15. static StringID RBS_PerFrame = "PerFrame";
  16. static StringID RBS_PerObject = "PerObject";
  17. /**
  18. * Available parameter semantics that allow the renderer to identify
  19. * the use of a GPU parameter specified in a shader.
  20. */
  21. static StringID RPS_WorldViewProjTfrm = "WVP";
  22. static StringID RPS_ViewProjTfrm = "VP";
  23. static StringID RPS_ProjTfrm = "P";
  24. static StringID RPS_ViewTfrm = "V";
  25. static StringID RPS_WorldTfrm = "W";
  26. static StringID RPS_InvWorldTfrm = "IW";
  27. static StringID RPS_WorldNoScaleTfrm = "WNoScale";
  28. static StringID RPS_InvWorldNoScaleTfrm = "IWNoScale";
  29. static StringID RPS_WorldDeterminantSign = "WorldDeterminantSign";
  30. static StringID RPS_Diffuse = "Diffuse";
  31. static StringID RPS_ViewDir = "ViewDir";
  32. /**
  33. * @brief Set of options that can be used for controlling the renderer.
  34. */
  35. struct BS_CORE_EXPORT CoreRendererOptions
  36. {
  37. virtual ~CoreRendererOptions() { }
  38. };
  39. /**
  40. * @brief Primarily rendering class that allows you to specify how to render objects that exist
  41. * in the scene graph. You need to provide your own implementation of your class.
  42. *
  43. * @note Normally you would iterate over all cameras, find visible objects for each camera and render
  44. * those objects in some way.
  45. */
  46. class BS_CORE_EXPORT CoreRenderer
  47. {
  48. public:
  49. CoreRenderer();
  50. virtual ~CoreRenderer() { }
  51. /**
  52. * @brief Initializes the renderer. Must be called before using the renderer.
  53. *
  54. * @note Internal method.
  55. */
  56. virtual void initialize() { }
  57. /**
  58. * @brief Cleans up the renderer. Must be called before the renderer is deleted.
  59. *
  60. * @note Internal method.
  61. */
  62. virtual void destroy() { }
  63. /**
  64. * @brief Name of the renderer. Used by materials to find
  65. * an appropriate technique for this renderer.
  66. */
  67. virtual const StringID& getName() const = 0;
  68. /**
  69. * @brief Called in order to render all currently active cameras.
  70. */
  71. virtual void renderAll() = 0;
  72. /**
  73. * @brief Called whenever a new camera is created.
  74. *
  75. * @note Core thread.
  76. * Internal method.
  77. */
  78. virtual void _notifyCameraAdded(const CameraCore* camera) { }
  79. /**
  80. * @brief Called whenever a camera is destroyed.
  81. *
  82. * @note Core thread.
  83. * Internal method.
  84. */
  85. virtual void _notifyCameraRemoved(const CameraCore* camera) { }
  86. /**
  87. * @brief Creates a new empty renderer mesh data.
  88. *
  89. * @note Sim thread.
  90. * Internal method.
  91. *
  92. * @see RendererMeshData
  93. */
  94. virtual RendererMeshDataPtr _createMeshData(UINT32 numVertices, UINT32 numIndices, VertexLayout layout, IndexType indexType = IT_32BIT);
  95. /**
  96. * @brief Creates a new renderer mesh data using an existing generic mesh data buffer.
  97. *
  98. * @note Sim thread.
  99. * Internal method.
  100. *
  101. * @see RendererMeshData
  102. */
  103. virtual RendererMeshDataPtr _createMeshData(const MeshDataPtr& meshData);
  104. /**
  105. * @brief Registers a new callback that will be executed when the the specify camera is being rendered.
  106. *
  107. * @param camera Camera for which to trigger the callback.
  108. * @param index Index that determines the order of rendering when there are multiple registered callbacks.
  109. * This must be unique. Lower indices get rendered sooner. Indices below 0 get rendered before the
  110. * main viewport elements, while indices equal or greater to zero after.
  111. * @param callback Callback to trigger when the specified camera is being rendered.
  112. * @param isOverlay If true the render callback guarantees that it will only render overlay data. Overlay data doesn't
  113. * require a depth buffer, a multisampled render target and is usually cheaper to render (although
  114. * this depends on the exact renderer).
  115. *
  116. * Overlay callbacks are always rendered after all other callbacks, even if their index is negative.
  117. *
  118. * @note Core thread.
  119. * Internal method.
  120. */
  121. void _registerRenderCallback(const CameraCore* camera, INT32 index, const std::function<void()>& callback, bool isOverlay = false);
  122. /**
  123. * @brief Removes a previously registered callback registered with "_registerRenderCallback".
  124. */
  125. void _unregisterRenderCallback(const CameraCore* camera, INT32 index);
  126. /**
  127. * @brief Sets options used for controlling the rendering.
  128. */
  129. virtual void setOptions(const SPtr<CoreRendererOptions>& options) { }
  130. /**
  131. * @brief Returns current set of options used for controlling the rendering.
  132. */
  133. virtual SPtr<CoreRendererOptions> getOptions() const { return SPtr<CoreRendererOptions>(); }
  134. protected:
  135. /**
  136. * @brief Contains information about a render callback.
  137. */
  138. struct RenderCallbackData
  139. {
  140. bool overlay;
  141. std::function<void()> callback;
  142. };
  143. UnorderedMap<const CameraCore*, Map<INT32, RenderCallbackData>> mRenderCallbacks;
  144. };
  145. }