BsRenderBeast.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. RenderableHandlerCore* renderable;
  22. Vector<BeastRenderableElement> elements;
  23. RenderableController* 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 CameraHandlerCore*> cameras;
  59. };
  60. /**
  61. * @brief Data used by the renderer for a camera.
  62. */
  63. struct CameraData
  64. {
  65. RenderQueuePtr renderQueue;
  66. };
  67. /**
  68. * @brief Data used by the renderer for lights.
  69. */
  70. struct LightData
  71. {
  72. LightInternalCore* internal;
  73. };
  74. public:
  75. RenderBeast();
  76. ~RenderBeast() { }
  77. /**
  78. * @copydoc Renderer::getName
  79. */
  80. virtual const StringID& getName() const override;
  81. /**
  82. * @copydoc Renderer::renderAll
  83. */
  84. virtual void renderAll() override;
  85. /**
  86. * @brief Sets options used for controlling the rendering.
  87. */
  88. void setOptions(const SPtr<CoreRendererOptions>& options) override;
  89. /**
  90. * @brief Returns current set of options used for controlling the rendering.
  91. */
  92. SPtr<CoreRendererOptions> getOptions() const override;
  93. /**
  94. * @copydoc Renderer::_onActivated
  95. */
  96. virtual void _onActivated() override;
  97. /**
  98. * @copydoc Renderer::_onDeactivated
  99. */
  100. virtual void _onDeactivated() override;
  101. private:
  102. /**
  103. * @copydoc Renderer::_notifyCameraAdded
  104. */
  105. void _notifyCameraAdded(const CameraHandlerCore* camera) override;
  106. /**
  107. * @copydoc Renderer::_notifyCameraRemoved
  108. */
  109. void _notifyCameraRemoved(const CameraHandlerCore* camera) override;
  110. /**
  111. * @copydoc Renderer::_notifyLightAdded
  112. */
  113. void _notifyLightAdded(LightInternalCore* light) override;
  114. /**
  115. * @copydoc Renderer::_notifyLightUpdated
  116. */
  117. void _notifyLightUpdated(LightInternalCore* light) override;
  118. /**
  119. * @copydoc Renderer::_notifyLightRemoved
  120. */
  121. void _notifyLightRemoved(LightInternalCore* light) override;
  122. /**
  123. * @copydoc Renderer::_notifyRenderableAdded
  124. */
  125. void _notifyRenderableAdded(RenderableHandlerCore* renderable) override;
  126. /**
  127. * @copydoc Renderer::_notifyRenderableUpdated
  128. */
  129. void _notifyRenderableUpdated(RenderableHandlerCore* renderable) override;
  130. /**
  131. * @copydoc Renderer::_notifyRenderableRemoved
  132. */
  133. void _notifyRenderableRemoved(RenderableHandlerCore* renderable) override;
  134. /**
  135. * @brief Adds a new set of objects to the cameras render queue.
  136. *
  137. * @param proxy Proxy of the render queues camera to add the objects to.
  138. * @param renderQueue Objects to add to the cameras queue.
  139. *
  140. * @note Core thread only.
  141. */
  142. void addToRenderQueue(const SPtr<CameraHandlerCore>& proxy, RenderQueuePtr renderQueue);
  143. /**
  144. * @brief Updates the render options on the core thread.
  145. *
  146. * @note Core thread only.
  147. */
  148. void syncRenderOptions(const RenderBeastOptions& options);
  149. /**
  150. * @brief Performs rendering over all camera proxies.
  151. *
  152. * @param time Current frame time in milliseconds.
  153. *
  154. * @note Core thread only.
  155. */
  156. void renderAllCore(float time);
  157. /**
  158. * @brief Renders all objects visible by the provided camera.
  159. *
  160. * @param camera Camera used for determining destination render target and visibility.
  161. * @param renderQueue Optionally non-empty queue of manually added objects to render.
  162. *
  163. * @note Core thread only.
  164. */
  165. virtual void render(const CameraHandlerCore& camera, RenderQueuePtr& renderQueue);
  166. /**
  167. * @brief Creates data used by the renderer on the core thread.
  168. */
  169. void initializeCore();
  170. /**
  171. * @brief Destroys data used by the renderer on the core thread.
  172. */
  173. void destroyCore();
  174. /**
  175. * @brief Creates a dummy shader to be used when no other is available.
  176. */
  177. SPtr<ShaderCore> createDefaultShader();
  178. /**
  179. * @brief Checks all sampler overrides in case material sampler states changed,
  180. * and updates them.
  181. *
  182. * @param force If true, all sampler overrides will be updated, regardless of a change
  183. * in the material was detected or not.
  184. */
  185. void refreshSamplerOverrides(bool force = false);
  186. /**
  187. * @brief Activates the specified pass on the pipeline.
  188. *
  189. * @param material Parent material of the pass.
  190. * @param passIdx Index of the pass in the parent material.
  191. * @param samplerOverrides Optional samplers to use instead of the those in the material.
  192. * Number of samplers must match the number in the material.
  193. * @note Core thread.
  194. */
  195. static void setPass(const SPtr<MaterialCore>& material, UINT32 passIdx, PassSamplerOverrides* samplerOverrides);
  196. Vector<RenderTargetData> mRenderTargets; // Core thread
  197. UnorderedMap<const CameraHandlerCore*, CameraData> mCameraData; // Core thread
  198. UnorderedMap<SPtr<MaterialCore>, MaterialSamplerOverrides*> mSamplerOverrides; // Core thread
  199. SPtr<MaterialCore> mDummyMaterial; // Core thread
  200. Vector<RenderableData> mRenderables; // Core thread
  201. Vector<Matrix4> mWorldTransforms; // Core thread
  202. Vector<Bounds> mWorldBounds; // Core thread
  203. Vector<LightData> mLights; // Core thread
  204. Vector<Sphere> mLightWorldBounds; // Core thread
  205. SPtr<RenderBeastOptions> mCoreOptions; // Core thread
  206. LitTexRenderableController* mLitTexHandler;
  207. SPtr<RenderBeastOptions> mOptions;
  208. bool mOptionsDirty;
  209. };
  210. }