BsObjectRendering.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsRenderBeastPrerequisites.h"
  5. #include "BsGpuParamDesc.h"
  6. #include "BsGpuParam.h"
  7. #include "BsRenderableElement.h"
  8. #include "BsRendererMaterial.h"
  9. #include "BsParamBlocks.h"
  10. namespace BansheeEngine
  11. {
  12. /** @addtogroup RenderBeast
  13. * @{
  14. */
  15. BS_PARAM_BLOCK_BEGIN(PerFrameParamBuffer)
  16. BS_PARAM_BLOCK_ENTRY(float, gTime)
  17. BS_PARAM_BLOCK_END
  18. BS_PARAM_BLOCK_BEGIN(PerCameraParamBuffer)
  19. BS_PARAM_BLOCK_ENTRY(Vector3, gViewDir)
  20. BS_PARAM_BLOCK_ENTRY(Vector3, gViewOrigin)
  21. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatViewProj)
  22. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatView)
  23. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatProj)
  24. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatInvProj)
  25. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatInvViewProj)
  26. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatScreenToWorld)
  27. BS_PARAM_BLOCK_ENTRY(Vector2, gDeviceZToWorldZ)
  28. BS_PARAM_BLOCK_ENTRY(Vector4, gClipToUVScaleOffset)
  29. BS_PARAM_BLOCK_END
  30. BS_PARAM_BLOCK_BEGIN(PerObjectParamBuffer)
  31. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatWorldViewProj)
  32. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatWorld)
  33. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatInvWorld)
  34. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatWorldNoScale)
  35. BS_PARAM_BLOCK_ENTRY(Matrix4, gMatInvWorldNoScale)
  36. BS_PARAM_BLOCK_ENTRY(float, gWorldDeterminantSign)
  37. BS_PARAM_BLOCK_END
  38. /** Data bound to the shader when rendering a specific renderable object. */
  39. struct RenderableShaderData
  40. {
  41. Matrix4 worldTransform;
  42. Matrix4 invWorldTransform;
  43. Matrix4 worldNoScaleTransform;
  44. Matrix4 invWorldNoScaleTransform;
  45. float worldDeterminantSign;
  46. };
  47. /** Data bound to the shader when rendering a with a specific camera. */
  48. struct CameraShaderData
  49. {
  50. Vector3 viewDir;
  51. Vector3 viewOrigin;
  52. Matrix4 view;
  53. Matrix4 proj;
  54. Matrix4 viewProj;
  55. Matrix4 invProj;
  56. Matrix4 invViewProj;
  57. Matrix4 screenToWorld;
  58. Vector2 deviceZToWorldZ;
  59. Vector4 clipToUVScaleOffset;
  60. };
  61. /** Manages initialization and rendering of individual renderable object, represented as RenderableElement%s. */
  62. class BS_BSRND_EXPORT ObjectRenderer
  63. {
  64. public:
  65. ObjectRenderer();
  66. /** Initializes the specified renderable element, making it ready to be used. */
  67. void initElement(RenderableElement& element);
  68. /** Updates global per frame parameter buffers with new values. To be called at the start of every frame. */
  69. void updatePerFrameBuffers(float time);
  70. /**
  71. * Updates global per frame parameter buffers with new values. To be called at the start of rendering for every
  72. * camera.
  73. */
  74. void updatePerCameraBuffers(const CameraShaderData& cameraData);
  75. /**
  76. * Updates object specific parameter buffers with new values. To be called whenever object specific values change.
  77. */
  78. void updatePerObjectBuffers(const RenderableElement& element, const RenderableShaderData& data, const Matrix4& wvpMatrix);
  79. /** Returns a buffer that stores per-camera parameters. */
  80. const PerCameraParamBuffer& getPerCameraParams() const { return mPerCameraParams; }
  81. protected:
  82. PerFrameParamBuffer mPerFrameParams;
  83. PerCameraParamBuffer mPerCameraParams;
  84. PerObjectParamBuffer mPerObjectParams;
  85. };
  86. /** Basic shader that is used when no other is available. */
  87. class DefaultMaterial : public RendererMaterial<DefaultMaterial> { RMAT_DEF("Default.bsl"); };
  88. /** @} */
  89. }