BsObjectRendering.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsObjectRendering.h"
  4. #include "Material/BsShader.h"
  5. #include "RenderAPI/BsGpuParams.h"
  6. #include "BsRenderBeast.h"
  7. #include "Material/BsMaterial.h"
  8. #include "Mesh/BsMesh.h"
  9. #include "Animation/BsSkeleton.h"
  10. #include "RenderAPI/BsGpuBuffer.h"
  11. #include "Material/BsGpuParamsSet.h"
  12. #include "Animation/BsMorphShapes.h"
  13. #include "Animation/BsAnimationManager.h"
  14. namespace bs { namespace ct
  15. {
  16. PerFrameParamDef gPerFrameParamDef;
  17. ObjectRenderer::ObjectRenderer()
  18. {
  19. mPerFrameParamBuffer = gPerFrameParamDef.createBuffer();
  20. }
  21. void ObjectRenderer::initElement(RendererObject& owner, BeastRenderableElement& element)
  22. {
  23. SPtr<Shader> shader = element.material->getShader();
  24. if (shader == nullptr)
  25. {
  26. LOGWRN("Missing shader on material.");
  27. return;
  28. }
  29. SPtr<GpuParams> gpuParams = element.params->getGpuParams();
  30. // Note: Perhaps perform buffer validation to ensure expected buffer has the same size and layout as the provided
  31. // buffer, and show a warning otherwise. But this is perhaps better handled on a higher level.
  32. gpuParams->setParamBlockBuffer("PerFrame", mPerFrameParamBuffer);
  33. gpuParams->setParamBlockBuffer("PerObject", owner.perObjectParamBuffer);
  34. gpuParams->setParamBlockBuffer("PerCall", owner.perCallParamBuffer);
  35. gpuParams->getParamInfo()->getBindings(
  36. GpuPipelineParamInfoBase::ParamType::ParamBlock,
  37. "PerCamera",
  38. element.perCameraBindings
  39. );
  40. if (gpuParams->hasBuffer(GPT_VERTEX_PROGRAM, "boneMatrices"))
  41. gpuParams->setBuffer(GPT_VERTEX_PROGRAM, "boneMatrices", element.boneMatrixBuffer);
  42. const bool isTransparent = (shader->getFlags() & (UINT32)ShaderFlags::Transparent) != 0;
  43. const bool usesForwardRendering = isTransparent;
  44. if(usesForwardRendering)
  45. {
  46. const bool supportsClusteredForward = gRenderBeast()->getFeatureSet() == RenderBeastFeatureSet::Desktop;
  47. if(supportsClusteredForward)
  48. {
  49. gpuParams->getParamInfo()->getBindings(
  50. GpuPipelineParamInfoBase::ParamType::ParamBlock,
  51. "GridParams",
  52. element.gridParamsBindings
  53. );
  54. if (gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gLights"))
  55. gpuParams->getBufferParam(GPT_FRAGMENT_PROGRAM, "gLights", element.lightsBufferParam);
  56. if (gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gGridLightOffsetsAndSize"))
  57. gpuParams->getBufferParam(GPT_FRAGMENT_PROGRAM, "gGridLightOffsetsAndSize",
  58. element.gridLightOffsetsAndSizeParam);
  59. if (gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gLightIndices"))
  60. gpuParams->getBufferParam(GPT_FRAGMENT_PROGRAM, "gLightIndices", element.gridLightIndicesParam);
  61. if (gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gGridProbeOffsetsAndSize"))
  62. gpuParams->getBufferParam(GPT_FRAGMENT_PROGRAM, "gGridProbeOffsetsAndSize",
  63. element.gridProbeOffsetsAndSizeParam);
  64. }
  65. else
  66. {
  67. gpuParams->getParamInfo()->getBinding(
  68. GPT_FRAGMENT_PROGRAM,
  69. GpuPipelineParamInfoBase::ParamType::ParamBlock,
  70. "Lights",
  71. element.lightsParamBlockBinding
  72. );
  73. gpuParams->getParamInfo()->getBinding(
  74. GPT_FRAGMENT_PROGRAM,
  75. GpuPipelineParamInfoBase::ParamType::ParamBlock,
  76. "LightAndReflProbeParams",
  77. element.lightAndReflProbeParamsParamBlockBinding
  78. );
  79. }
  80. element.imageBasedParams.populate(gpuParams, GPT_FRAGMENT_PROGRAM, true, supportsClusteredForward,
  81. supportsClusteredForward);
  82. }
  83. }
  84. void ObjectRenderer::setParamFrameParams(float time)
  85. {
  86. gPerFrameParamDef.gTime.set(mPerFrameParamBuffer, time);
  87. }
  88. }}