BsBansheeRenderer.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #pragma once
  2. #include "BsBansheeRendererPrerequisites.h"
  3. #include "BsRenderer.h"
  4. #include "BsMaterialProxy.h"
  5. #include "BsBounds.h"
  6. namespace BansheeEngine
  7. {
  8. /**
  9. * @brief Semantics that may be used for signaling the renderer
  10. * for what is a certain shader parameter used for.
  11. */
  12. enum BansheeRendererParamSemantic
  13. {
  14. RPS_Time = 1000,
  15. RPS_LightDir = 1001
  16. };
  17. /**
  18. * @brief Default renderer for Banshee. Performs frustum culling, sorting and
  19. * renders objects in custom ways determine by renderable handlers.
  20. *
  21. * @note Sim thread unless otherwise noted.
  22. */
  23. class BS_BSRND_EXPORT BansheeRenderer : public Renderer
  24. {
  25. /**
  26. * @brief Render data for a single render target.
  27. */
  28. struct RenderTargetData
  29. {
  30. RenderTargetPtr target;
  31. Vector<CameraProxyPtr> cameras;
  32. };
  33. public:
  34. BansheeRenderer();
  35. ~BansheeRenderer();
  36. /**
  37. * @copydoc Renderer::getName
  38. */
  39. virtual const String& getName() const;
  40. /**
  41. * @copydoc Renderer::renderAll
  42. */
  43. virtual void renderAll();
  44. /**
  45. * @copydoc Renderer::_onActivated
  46. */
  47. virtual void _onActivated();
  48. /**
  49. * @copydoc Renderer::_onDeactivated
  50. */
  51. virtual void _onDeactivated();
  52. private:
  53. /**
  54. * @brief Adds a new renderable proxy which will be considered for rendering next frame.
  55. *
  56. * @note Core thread only.
  57. */
  58. void addRenderableProxy(RenderableProxyPtr proxy);
  59. /**
  60. * @brief Removes a previously existing renderable proxy so it will no longer be considered
  61. * for rendering.
  62. *
  63. * @note Core thread only.
  64. */
  65. void removeRenderableProxy(RenderableProxyPtr proxy);
  66. /**
  67. * @brief Updates an existing renderable proxy with new data. This includes data that changes
  68. * often. For other data it is best to remove old proxy and add new one.
  69. *
  70. * @param proxy Proxy to update.
  71. * @param localToWorld Local to world transform of the parent Renderable.
  72. *
  73. * @note Core thread only.
  74. */
  75. void updateRenderableProxy(RenderableProxyPtr proxy, Matrix4 localToWorld);
  76. /**
  77. * @brief Adds a new camera proxy will be used for rendering renderable proxy objects.
  78. *
  79. * @note Core thread only.
  80. */
  81. void addCameraProxy(CameraProxyPtr proxy);
  82. /**
  83. * @brief Removes an existing camera proxy, meaning the camera will no longer be rendered from.
  84. *
  85. * @note Core thread only.
  86. */
  87. void removeCameraProxy(CameraProxyPtr proxy);
  88. /**
  89. * @brief Updates an existing camera proxy with new data. This includes data that changes
  90. * often. For other data it is best to remove old proxy and add new one.
  91. *
  92. * @param proxy Proxy to update.
  93. * @param worldPosition World position of the camera.
  94. * @param worldMatrix World transform matrix of the camera.
  95. * @param viewMatrix View transform matrix of the camera.
  96. *
  97. * @note Core thread only.
  98. */
  99. void updateCameraProxy(CameraProxyPtr proxy, Vector3 worldPosition, Matrix4 worldMatrix, Matrix4 viewMatrix);
  100. /**
  101. * @brief Adds a new set of objects to the cameras render queue.
  102. *
  103. * @param proxy Proxy of the render queues camera to add the objects to.
  104. * @param renderQueue Objects to add to the cameras queue.
  105. *
  106. * @note Core thread only.
  107. */
  108. void addToRenderQueue(CameraProxyPtr proxy, RenderQueuePtr renderQueue);
  109. /**
  110. * @brief Updates a material proxy with new parameter data. Usually called when parameters are manually
  111. * updated from the sim thread.
  112. *
  113. * @param proxy Material proxy to update.
  114. * @param dirtyParams A list of parameter buffers that need updating.
  115. *
  116. * @note Core thread only.
  117. */
  118. void updateMaterialProxy(MaterialProxyPtr proxy, MaterialProxy::DirtyParamsInfo* dirtyParams);
  119. /**
  120. * @brief Performs rendering over all camera proxies.
  121. *
  122. * @param time Current frame time in milliseconds.
  123. *
  124. * @note Core thread only.
  125. */
  126. void renderAllCore(float time);
  127. /**
  128. * @brief Renders all objects visible by the provided camera.
  129. *
  130. * @param cameraProxy Camera used for determining destination render target and visibility.
  131. * @param renderQueue Optionally non-empty queue of manually added objects to render.
  132. *
  133. * @note Core thread only.
  134. */
  135. virtual void render(const CameraProxy& cameraProxy, const RenderQueuePtr& renderQueue);
  136. /**
  137. * @brief Called by the scene manager whenever a Renderable component has been
  138. * removed from the scene.
  139. */
  140. void renderableRemoved(const HRenderable& renderable);
  141. /**
  142. * @brief Called by the scene manager whenever a Camera component has been
  143. * removed from the scene.
  144. */
  145. void cameraRemoved(const HCamera& camera);
  146. Vector<RenderableProxyPtr> mDeletedRenderableProxies;
  147. Vector<CameraProxyPtr> mDeletedCameraProxies;
  148. UnorderedMap<UINT64, CameraProxyPtr> mCameraProxies;
  149. Vector<RenderTargetData> mRenderTargets;
  150. Vector<RenderableElement*> mRenderableElements;
  151. Vector<Matrix4> mWorldTransforms;
  152. Vector<Bounds> mWorldBounds;
  153. LitTexRenderableHandler* mLitTexHandler;
  154. HEvent mRenderableRemovedConn;
  155. HEvent mCameraRemovedConn;
  156. };
  157. }