2
0

BsForwardRenderer.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "BsForwardRenderer.h"
  2. #include "BsCamera.h"
  3. #include "BsSceneManager.h"
  4. #include "BsRenderable.h"
  5. #include "CmMaterial.h"
  6. #include "CmMesh.h"
  7. #include "CmPass.h"
  8. #include "CmBlendState.h"
  9. #include "CmRasterizerState.h"
  10. #include "CmDepthStencilState.h"
  11. #include "CmApplication.h"
  12. #include "CmViewport.h"
  13. #include "CmRenderTarget.h"
  14. #include "BsOverlayManager.h"
  15. #include "BsGUIManager.h"
  16. using namespace CamelotFramework;
  17. namespace BansheeEngine
  18. {
  19. ForwardRenderer::ForwardRenderer()
  20. {
  21. }
  22. ForwardRenderer::~ForwardRenderer()
  23. { }
  24. const String& ForwardRenderer::getName() const
  25. {
  26. static String name = "ForwardRenderer";
  27. return name;
  28. }
  29. void ForwardRenderer::renderAll()
  30. {
  31. CoreAccessor& coreAccessor = gMainCA();
  32. const Vector<HCamera>::type& allCameras = gSceneManager().getAllCameras();
  33. struct RenderTargetRenderInfo
  34. {
  35. RenderTargetPtr target;
  36. Vector<HCamera>::type cameras;
  37. };
  38. // Find all unique render targets
  39. Vector<RenderTargetRenderInfo>::type camerasPerRenderTarget;
  40. for(auto& camera : allCameras)
  41. {
  42. RenderTargetPtr target = camera->getViewport()->getTarget();
  43. auto findIter = std::find_if(begin(camerasPerRenderTarget), end(camerasPerRenderTarget), [&target] (const RenderTargetRenderInfo& x) { return x.target == target; });
  44. if(findIter == camerasPerRenderTarget.end())
  45. {
  46. camerasPerRenderTarget.push_back(RenderTargetRenderInfo());
  47. camerasPerRenderTarget[camerasPerRenderTarget.size() - 1].target = target;
  48. camerasPerRenderTarget[camerasPerRenderTarget.size() - 1].cameras.push_back(camera);
  49. }
  50. else
  51. findIter->cameras.push_back(camera);
  52. }
  53. // Sort everything based on priority
  54. auto cameraComparer = [&] (const HCamera& a, const HCamera& b) { return a->getPriority() > b->getPriority(); };
  55. auto renderTargetInfoComparer = [&] (const RenderTargetRenderInfo& a, const RenderTargetRenderInfo& b) { return a.target->getPriority() > b.target->getPriority(); };
  56. std::sort(begin(camerasPerRenderTarget), end(camerasPerRenderTarget), renderTargetInfoComparer);
  57. for(auto& camerasPerTarget : camerasPerRenderTarget)
  58. {
  59. Vector<HCamera>::type& cameras = camerasPerTarget.cameras;
  60. std::sort(begin(cameras), end(cameras), cameraComparer);
  61. }
  62. // Render everything, target by target
  63. for(auto& camerasPerTarget : camerasPerRenderTarget)
  64. {
  65. RenderTargetPtr target = camerasPerTarget.target;
  66. const Vector<HCamera>::type& cameras = camerasPerTarget.cameras;
  67. coreAccessor.beginFrame();
  68. for(auto& camera : cameras)
  69. {
  70. ViewportPtr viewport = camera->getViewport();
  71. coreAccessor.setViewport(viewport);
  72. UINT32 clearBuffers = 0;
  73. if(viewport->getRequiresColorClear())
  74. clearBuffers |= FBT_COLOR;
  75. if(viewport->getRequiresDepthClear())
  76. clearBuffers |= FBT_DEPTH;
  77. if(viewport->getRequiresStencilClear())
  78. clearBuffers |= FBT_STENCIL;
  79. if(clearBuffers != 0)
  80. coreAccessor.clearViewport(clearBuffers, viewport->getClearColor(), viewport->getClearDepthValue(), viewport->getClearStencilValue());
  81. // Render scene
  82. render(camera);
  83. // Render overlays
  84. OverlayManager::instance().render(camera->getViewport(), coreAccessor);
  85. // Render GUI elements
  86. GUIManager::instance().render(camera->getViewport(), coreAccessor);
  87. }
  88. coreAccessor.endFrame();
  89. coreAccessor.swapBuffers(target);
  90. }
  91. }
  92. void ForwardRenderer::render(const HCamera& camera)
  93. {
  94. Vector<HRenderable>::type allRenderables;
  95. if(!camera->getIgnoreSceneRenderables())
  96. allRenderables = gSceneManager().getVisibleRenderables(camera);
  97. CoreAccessor& coreAccessor = gMainCA();
  98. coreAccessor.setViewport(camera->getViewport());
  99. Matrix4 projMatrixCstm = camera->getProjectionMatrix();
  100. Matrix4 viewMatrixCstm = camera->getViewMatrix();
  101. Matrix4 viewProjMatrix = projMatrixCstm * viewMatrixCstm;
  102. // TODO - sort renderables by material/pass/parameters to minimize state changes
  103. for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
  104. {
  105. HMaterial material = (*iter)->getMaterial();
  106. if(material == nullptr || !material.isLoaded())
  107. continue;
  108. HMesh mesh = (*iter)->getMesh();
  109. if(mesh == nullptr || !mesh.isLoaded())
  110. continue;
  111. // TODO - Renderer should ensure shader is compatible with it, and it contains all the needed parameters
  112. // (probably at an earlier stage). e.g. I want the user to be warned if the shader doesn't contain matViewProjection param
  113. // (or should we just ignore such missing parameters?)
  114. material->setMat4("matViewProjection", viewProjMatrix);
  115. for(UINT32 i = 0; i < material->getNumPasses(); i++)
  116. {
  117. PassPtr pass = material->getPass(i);
  118. pass->activate(coreAccessor);
  119. PassParametersPtr paramsPtr = material->getPassParameters(i);
  120. pass->bindParameters(coreAccessor, paramsPtr);
  121. coreAccessor.render(mesh->getRenderOperation());
  122. }
  123. }
  124. // TODO - Sort renderables
  125. // Render them
  126. }
  127. }