BsObjectRendering.h 3.5 KB

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