BsRenderBeast.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #pragma once
  2. #include "BsRenderBeastPrerequisites.h"
  3. #include "BsRenderer.h"
  4. #include "BsBounds.h"
  5. #include "BsRenderableElement.h"
  6. #include "BsSamplerOverrides.h"
  7. namespace BansheeEngine
  8. {
  9. class BeastRenderableElement;
  10. /**
  11. * Semantics that may be used for signaling the renderer
  12. * for what is a certain shader parameter used for.
  13. */
  14. static StringID RPS_Time = "Time";
  15. static StringID RPS_LightDir = "LightDir";
  16. /**
  17. * @brief Data used by the renderer when rendering renderable handlers.
  18. */
  19. struct RenderableData
  20. {
  21. RenderableCore* renderable;
  22. Vector<BeastRenderableElement> elements;
  23. RenderableHandler* controller;
  24. };
  25. /**
  26. * @copydoc RenderableElement
  27. *
  28. * Contains additional data specific to RenderBeast renderer.
  29. */
  30. class BS_BSRND_EXPORT BeastRenderableElement : public RenderableElement
  31. {
  32. public:
  33. /**
  34. * @brief Optional overrides for material sampler states.
  35. * Used when renderer wants to override certain sampling
  36. * properties on a global scale (e.g. filtering most commonly).
  37. */
  38. MaterialSamplerOverrides* samplerOverrides;
  39. /**
  40. * @brief Id of the owner renderable.
  41. */
  42. UINT32 renderableId;
  43. };
  44. /**
  45. * @brief Default renderer for Banshee. Performs frustum culling, sorting and
  46. * renders objects in custom ways determine by renderable handlers.
  47. *
  48. * @note Sim thread unless otherwise noted.
  49. */
  50. class BS_BSRND_EXPORT RenderBeast : public Renderer
  51. {
  52. /**
  53. * @brief Render data for a single render target.
  54. */
  55. struct RenderTargetData
  56. {
  57. SPtr<RenderTargetCore> target;
  58. Vector<const CameraCore*> cameras;
  59. };
  60. /**
  61. * @brief Data used by the renderer for a camera.
  62. */
  63. struct CameraData
  64. {
  65. RenderQueuePtr opaqueQueue;
  66. RenderQueuePtr transparentQueue;
  67. SPtr<RenderTargets> gbuffer;
  68. };
  69. /**
  70. * @brief Data used by the renderer for lights.
  71. */
  72. struct LightData
  73. {
  74. LightCore* internal;
  75. };
  76. public:
  77. RenderBeast();
  78. ~RenderBeast() { }
  79. /**
  80. * @copydoc Renderer::getName
  81. */
  82. virtual const StringID& getName() const override;
  83. /**
  84. * @copydoc Renderer::renderAll
  85. */
  86. virtual void renderAll() override;
  87. /**
  88. * @brief Sets options used for controlling the rendering.
  89. */
  90. void setOptions(const SPtr<CoreRendererOptions>& options) override;
  91. /**
  92. * @brief Returns current set of options used for controlling the rendering.
  93. */
  94. SPtr<CoreRendererOptions> getOptions() const override;
  95. /**
  96. * @copydoc Renderer::_onActivated
  97. */
  98. virtual void _onActivated() override;
  99. /**
  100. * @copydoc Renderer::_onDeactivated
  101. */
  102. virtual void _onDeactivated() override;
  103. private:
  104. /**
  105. * @copydoc Renderer::_notifyCameraAdded
  106. */
  107. void _notifyCameraAdded(const CameraCore* camera) override;
  108. /**
  109. * @copydoc Renderer::_notifyCameraRemoved
  110. */
  111. void _notifyCameraRemoved(const CameraCore* camera) override;
  112. /**
  113. * @copydoc Renderer::_notifyLightAdded
  114. */
  115. void _notifyLightAdded(LightCore* light) override;
  116. /**
  117. * @copydoc Renderer::_notifyLightUpdated
  118. */
  119. void _notifyLightUpdated(LightCore* light) override;
  120. /**
  121. * @copydoc Renderer::_notifyLightRemoved
  122. */
  123. void _notifyLightRemoved(LightCore* light) override;
  124. /**
  125. * @copydoc Renderer::_notifyRenderableAdded
  126. */
  127. void _notifyRenderableAdded(RenderableCore* renderable) override;
  128. /**
  129. * @copydoc Renderer::_notifyRenderableUpdated
  130. */
  131. void _notifyRenderableUpdated(RenderableCore* renderable) override;
  132. /**
  133. * @copydoc Renderer::_notifyRenderableRemoved
  134. */
  135. void _notifyRenderableRemoved(RenderableCore* renderable) override;
  136. /**
  137. * @brief Updates the render options on the core thread.
  138. *
  139. * @note Core thread only.
  140. */
  141. void syncRenderOptions(const RenderBeastOptions& options);
  142. /**
  143. * @brief Performs rendering over all camera proxies.
  144. *
  145. * @param time Current frame time in milliseconds.
  146. *
  147. * @note Core thread only.
  148. */
  149. void renderAllCore(float time);
  150. /**
  151. * @brief Populates camera render queues by determining visible renderable object.
  152. *
  153. * @param camera The camera to determine visibility for.
  154. */
  155. void determineVisible(const CameraCore& camera);
  156. /**
  157. * @brief Renders all objects visible by the provided camera.
  158. *
  159. * @param rtData Render target data containing the camera to render.
  160. * @param camIdx Index of the camera to render.
  161. *
  162. * @note Core thread only.
  163. */
  164. void render(RenderTargetData& rtData, UINT32 camIdx);
  165. /**
  166. * @brief Renders all objects visible by the provided camera.
  167. *
  168. * @param camera Camera used for determining destination render target and visibility.
  169. *
  170. * @note Core thread only.
  171. */
  172. void renderOLD(const CameraCore& camera);
  173. /**
  174. * @brief Creates data used by the renderer on the core thread.
  175. */
  176. void initializeCore();
  177. /**
  178. * @brief Destroys data used by the renderer on the core thread.
  179. */
  180. void destroyCore();
  181. /**
  182. * @brief Creates a dummy shader to be used when no other is available.
  183. */
  184. SPtr<ShaderCore> createDefaultShader();
  185. /**
  186. * @brief Checks all sampler overrides in case material sampler states changed,
  187. * and updates them.
  188. *
  189. * @param force If true, all sampler overrides will be updated, regardless of a change
  190. * in the material was detected or not.
  191. */
  192. void refreshSamplerOverrides(bool force = false);
  193. /**
  194. * @brief Activates the specified pass on the pipeline.
  195. *
  196. * @param pass Pass to activate.
  197. *
  198. * @note Core thread.
  199. */
  200. static void setPass(const SPtr<PassCore>& pass);
  201. /**
  202. * @brief Sets parameters (textures, samplers, buffers) for the currently active pass.
  203. *
  204. * @param passParams Structure containing parameters for all stages of the pass.
  205. * @param samplerOverrides Optional samplers to use instead of the those in the pass parameters.
  206. * Number of samplers must match number in pass parameters.
  207. * @note Core thread.
  208. */
  209. static void setPassParams(const SPtr<PassParametersCore>& passParams, const PassSamplerOverrides* samplerOverrides);
  210. Vector<RenderTargetData> mRenderTargets; // Core thread
  211. UnorderedMap<const CameraCore*, CameraData> mCameraData; // Core thread
  212. UnorderedMap<SPtr<MaterialCore>, MaterialSamplerOverrides*> mSamplerOverrides; // Core thread
  213. SPtr<MaterialCore> mDummyMaterial; // Core thread
  214. Vector<RenderableData> mRenderables; // Core thread
  215. Vector<Matrix4> mWorldTransforms; // Core thread
  216. Vector<Bounds> mWorldBounds; // Core thread
  217. Vector<LightData> mLights; // Core thread
  218. Vector<Sphere> mLightWorldBounds; // Core thread
  219. SPtr<RenderBeastOptions> mCoreOptions; // Core thread
  220. StaticRenderableHandler* mStaticHandler;
  221. SPtr<RenderBeastOptions> mOptions;
  222. bool mOptionsDirty;
  223. };
  224. }