BsObjectRendering.h 3.5 KB

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