BsForwardRenderer.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. #include "BsDefaultRendererSort.h"
  17. using namespace CamelotFramework;
  18. namespace BansheeEngine
  19. {
  20. ForwardRenderer::ForwardRenderer()
  21. {
  22. mRenderOpSorter = cm_new<DefaultRendererSort>();
  23. }
  24. ForwardRenderer::~ForwardRenderer()
  25. {
  26. cm_delete(mRenderOpSorter);
  27. }
  28. const String& ForwardRenderer::getName() const
  29. {
  30. static String name = "ForwardRenderer";
  31. return name;
  32. }
  33. void ForwardRenderer::renderAll()
  34. {
  35. gSceneManager().updateRenderableBounds();
  36. CoreAccessor& coreAccessor = gMainCA();
  37. const Vector<HCamera>::type& allCameras = gSceneManager().getAllCameras();
  38. struct RenderTargetRenderInfo
  39. {
  40. RenderTargetPtr target;
  41. Vector<HCamera>::type cameras;
  42. };
  43. // Find all unique render targets
  44. Vector<RenderTargetRenderInfo>::type camerasPerRenderTarget;
  45. for(auto& camera : allCameras)
  46. {
  47. RenderTargetPtr target = camera->getViewport()->getTarget();
  48. auto findIter = std::find_if(begin(camerasPerRenderTarget), end(camerasPerRenderTarget), [&target] (const RenderTargetRenderInfo& x) { return x.target == target; });
  49. if(findIter == camerasPerRenderTarget.end())
  50. {
  51. camerasPerRenderTarget.push_back(RenderTargetRenderInfo());
  52. camerasPerRenderTarget[camerasPerRenderTarget.size() - 1].target = target;
  53. camerasPerRenderTarget[camerasPerRenderTarget.size() - 1].cameras.push_back(camera);
  54. }
  55. else
  56. findIter->cameras.push_back(camera);
  57. }
  58. // Sort everything based on priority
  59. auto cameraComparer = [&] (const HCamera& a, const HCamera& b) { return a->getPriority() > b->getPriority(); };
  60. auto renderTargetInfoComparer = [&] (const RenderTargetRenderInfo& a, const RenderTargetRenderInfo& b) { return a.target->getPriority() > b.target->getPriority(); };
  61. std::sort(begin(camerasPerRenderTarget), end(camerasPerRenderTarget), renderTargetInfoComparer);
  62. for(auto& camerasPerTarget : camerasPerRenderTarget)
  63. {
  64. Vector<HCamera>::type& cameras = camerasPerTarget.cameras;
  65. std::sort(begin(cameras), end(cameras), cameraComparer);
  66. }
  67. // Render everything, target by target
  68. for(auto& camerasPerTarget : camerasPerRenderTarget)
  69. {
  70. RenderTargetPtr target = camerasPerTarget.target;
  71. const Vector<HCamera>::type& cameras = camerasPerTarget.cameras;
  72. coreAccessor.beginFrame();
  73. for(auto& camera : cameras)
  74. {
  75. ViewportPtr viewport = camera->getViewport();
  76. coreAccessor.setViewport(viewport);
  77. UINT32 clearBuffers = 0;
  78. if(viewport->getRequiresColorClear())
  79. clearBuffers |= FBT_COLOR;
  80. if(viewport->getRequiresDepthClear())
  81. clearBuffers |= FBT_DEPTH;
  82. if(viewport->getRequiresStencilClear())
  83. clearBuffers |= FBT_STENCIL;
  84. if(clearBuffers != 0)
  85. coreAccessor.clearViewport(clearBuffers, viewport->getClearColor(), viewport->getClearDepthValue(), viewport->getClearStencilValue());
  86. render(camera);
  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. Vector<RenderOperation>::type renderOperations;
  103. for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
  104. {
  105. UINT32 numOps = (*iter)->getNumRenderOperations();
  106. for(UINT32 i = 0; i < numOps; i++)
  107. renderOperations.push_back((*iter)->getRenderOperation(i));
  108. }
  109. // TODO - Do different things depending on render op settings
  110. for(auto& renderOp : renderOperations)
  111. {
  112. // TODO - Renderer should ensure shader is compatible with it, and it contains all the needed parameters
  113. // (probably at an earlier stage). e.g. I want the user to be warned if the shader doesn't contain matViewProjection param
  114. // (or should we just ignore such missing parameters?)
  115. renderOp.material->setMat4("matViewProjection", viewProjMatrix);
  116. }
  117. // TODO - Material queue is completely ignored
  118. Vector<SortedRenderOp>::type sortedROps = mRenderOpSorter->sort(camera, renderOperations, DepthSortOrder::FrontToBack, true);
  119. for(auto iter = sortedROps.begin(); iter != sortedROps.end(); ++iter)
  120. {
  121. const RenderOperation& renderOp = iter->baseOperation;
  122. HMaterial material = renderOp.material;
  123. PassPtr pass = material->getPass(iter->passIdx);
  124. pass->activate(coreAccessor);
  125. PassParametersPtr paramsPtr = material->getPassParameters(iter->passIdx);
  126. pass->bindParameters(coreAccessor, paramsPtr);
  127. coreAccessor.render(renderOp.meshData);
  128. }
  129. // Render overlays
  130. OverlayManager::instance().render(camera->getViewport(), coreAccessor);
  131. // Render GUI elements
  132. GUIManager::instance().render(camera->getViewport(), coreAccessor);
  133. }
  134. }