BsRenderer.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsStringID.h"
  6. #include "BsRendererMeshData.h"
  7. namespace bs
  8. {
  9. class RendererExtension;
  10. class LightProbeVolume;
  11. struct PostProcessSettings;
  12. namespace ct
  13. {
  14. /** @addtogroup Renderer-Internal
  15. * @{
  16. */
  17. /** Technique tags. */
  18. static StringID RTag_Skinned = "Skinned";
  19. static StringID RTag_Morph = "Morph";
  20. static StringID RTag_SkinnedMorph = "SkinnedMorph";
  21. /** Set of options that can be used for controlling the renderer. */
  22. struct BS_CORE_EXPORT RendererOptions
  23. {
  24. virtual ~RendererOptions() { }
  25. };
  26. /**
  27. * Primarily rendering class that allows you to specify how to render objects that exist in the scene graph. You need
  28. * to provide your own implementation of your class.
  29. *
  30. * @note
  31. * Normally you would iterate over all cameras, find visible objects for each camera and render those objects in some
  32. * way.
  33. */
  34. class BS_CORE_EXPORT Renderer
  35. {
  36. public:
  37. Renderer();
  38. virtual ~Renderer() { }
  39. /** Initializes the renderer. Must be called before using the renderer. */
  40. virtual void initialize() { }
  41. /** Cleans up the renderer. Must be called before the renderer is deleted. */
  42. virtual void destroy() { }
  43. /** Name of the renderer. Used by materials to find an appropriate technique for this renderer. */
  44. virtual const StringID& getName() const = 0;
  45. /** Called in order to render all currently active cameras. */
  46. virtual void renderAll() = 0;
  47. /**
  48. * Called whenever a new camera is created.
  49. *
  50. * @note Core thread.
  51. */
  52. virtual void notifyCameraAdded(Camera* camera) { }
  53. /**
  54. * Called whenever a camera's position or rotation is updated.
  55. *
  56. * @param[in] camera Camera that was updated.
  57. * @param[in] updateFlag Optional flag that allows the camera to signal to the renderer exactly what was updated.
  58. *
  59. * @note Core thread.
  60. */
  61. virtual void notifyCameraUpdated(Camera* camera, UINT32 updateFlag) { }
  62. /**
  63. * Called whenever a camera is destroyed.
  64. *
  65. * @note Core thread.
  66. */
  67. virtual void notifyCameraRemoved(Camera* camera) { }
  68. /**
  69. * Called whenever a new renderable is created.
  70. *
  71. * @note Core thread.
  72. */
  73. virtual void notifyRenderableAdded(Renderable* renderable) { }
  74. /**
  75. * Called whenever a renderable is updated.
  76. *
  77. * @note Core thread.
  78. */
  79. virtual void notifyRenderableUpdated(Renderable* renderable) { }
  80. /**
  81. * Called whenever a renderable is destroyed.
  82. *
  83. * @note Core thread.
  84. */
  85. virtual void notifyRenderableRemoved(Renderable* renderable) { }
  86. /**
  87. * Called whenever a new light is created.
  88. *
  89. * @note Core thread.
  90. */
  91. virtual void notifyLightAdded(Light* light) { }
  92. /**
  93. * Called whenever a light is updated.
  94. *
  95. * @note Core thread.
  96. */
  97. virtual void notifyLightUpdated(Light* light) { }
  98. /**
  99. * Called whenever a light is destroyed.
  100. *
  101. * @note Core thread.
  102. */
  103. virtual void notifyLightRemoved(Light* light) { }
  104. /**
  105. * Called whenever a new reflection probe is created.
  106. *
  107. * @note Core thread.
  108. */
  109. virtual void notifyReflectionProbeAdded(ReflectionProbe* probe) { }
  110. /**
  111. * Called whenever a reflection probe is updated.
  112. *
  113. * @note Core thread.
  114. */
  115. virtual void notifyReflectionProbeUpdated(ReflectionProbe* probe) { }
  116. /**
  117. * Called whenever a reflection probe is destroyed.
  118. *
  119. * @note Core thread.
  120. */
  121. virtual void notifyReflectionProbeRemoved(ReflectionProbe* probe) { }
  122. /**
  123. * Called whenever a new light probe volume is created.
  124. *
  125. * @note Core thread.
  126. */
  127. virtual void notifyLightProbeVolumeAdded(LightProbeVolume* volume) { }
  128. /**
  129. * Called whenever a light probe volume is updated.
  130. *
  131. * @note Core thread.
  132. */
  133. virtual void notifyLightProbeVolumeUpdated(LightProbeVolume* volume) { }
  134. /**
  135. * Called whenever a light probe volume is destroyed.
  136. *
  137. * @note Core thread.
  138. */
  139. virtual void notifyLightProbeVolumeRemoved(LightProbeVolume* volume) { }
  140. /**
  141. * Called whenever a skybox is created.
  142. *
  143. * @note Core thread.
  144. */
  145. virtual void notifySkyboxAdded(Skybox* skybox) { }
  146. /**
  147. * Called whenever the texture assigned to a skybox is changed.
  148. *
  149. * @note Core thread.
  150. */
  151. virtual void notifySkyboxTextureChanged(Skybox* skybox) { }
  152. /**
  153. * Called whenever a skybox is destroyed.
  154. *
  155. * @note Core thread.
  156. */
  157. virtual void notifySkyboxRemoved(Skybox* skybox) { }
  158. /**
  159. * Creates a new empty renderer mesh data.
  160. *
  161. * @note Sim thread.
  162. *
  163. * @see RendererMeshData
  164. */
  165. virtual SPtr<RendererMeshData> _createMeshData(UINT32 numVertices, UINT32 numIndices, VertexLayout layout,
  166. IndexType indexType = IT_32BIT);
  167. /**
  168. * Creates a new renderer mesh data using an existing generic mesh data buffer.
  169. *
  170. * @note Sim thread.
  171. *
  172. * @see RendererMeshData
  173. */
  174. virtual SPtr<RendererMeshData> _createMeshData(const SPtr<MeshData>& meshData);
  175. /**
  176. * Registers an extension object that will be called every frame by the renderer. Allows external code to perform
  177. * custom rendering interleaved with the renderer's output.
  178. *
  179. * @note Core thread.
  180. */
  181. void addPlugin(RendererExtension* plugin) { mCallbacks.insert(plugin); }
  182. /**
  183. * Unregisters an extension registered with addPlugin().
  184. *
  185. * @note Core thread.
  186. */
  187. void removePlugin(RendererExtension* plugin) { mCallbacks.erase(plugin); }
  188. /** Sets options used for controlling the rendering. */
  189. virtual void setOptions(const SPtr<RendererOptions>& options) { }
  190. /** Returns current set of options used for controlling the rendering. */
  191. virtual SPtr<RendererOptions> getOptions() const { return SPtr<RendererOptions>(); }
  192. protected:
  193. /** Contains information about a render callback. */
  194. struct RenderCallbackData
  195. {
  196. bool overlay;
  197. std::function<void()> callback;
  198. };
  199. /** Callback to trigger when comparing the order in which renderer extensions are called. */
  200. static bool compareCallback(const RendererExtension* a, const RendererExtension* b);
  201. Set<RendererExtension*, std::function<bool(const RendererExtension*, const RendererExtension*)>> mCallbacks;
  202. };
  203. /** Provides easy access to Renderer. */
  204. SPtr<Renderer> BS_CORE_EXPORT gRenderer();
  205. /** @} */
  206. }}