BsForwardRenderer.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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 "CmRenderOperation.h"
  15. #include "CmDefaultRenderQueue.h"
  16. #include "BsOverlayManager.h"
  17. #include "BsDebugDraw.h"
  18. #include "BsGUIManager.h"
  19. using namespace CamelotFramework;
  20. namespace BansheeEngine
  21. {
  22. ForwardRenderer::ForwardRenderer()
  23. {
  24. mRenderQueue = cm_new<DefaultRenderQueue>();
  25. }
  26. ForwardRenderer::~ForwardRenderer()
  27. {
  28. cm_delete(mRenderQueue);
  29. }
  30. const String& ForwardRenderer::getName() const
  31. {
  32. static String name = "ForwardRenderer";
  33. return name;
  34. }
  35. void ForwardRenderer::renderAll()
  36. {
  37. gSceneManager().updateRenderableBounds();
  38. CoreAccessor& coreAccessor = gMainCA();
  39. const Vector<HCamera>::type& allCameras = gSceneManager().getAllCameras();
  40. struct RenderTargetRenderInfo
  41. {
  42. RenderTargetPtr target;
  43. Vector<HCamera>::type cameras;
  44. };
  45. // Find all unique render targets
  46. Vector<RenderTargetRenderInfo>::type camerasPerRenderTarget;
  47. for(auto& camera : allCameras)
  48. {
  49. RenderTargetPtr target = camera->getViewport()->getTarget();
  50. auto findIter = std::find_if(begin(camerasPerRenderTarget), end(camerasPerRenderTarget), [&target] (const RenderTargetRenderInfo& x) { return x.target == target; });
  51. if(findIter == camerasPerRenderTarget.end())
  52. {
  53. camerasPerRenderTarget.push_back(RenderTargetRenderInfo());
  54. camerasPerRenderTarget[camerasPerRenderTarget.size() - 1].target = target;
  55. camerasPerRenderTarget[camerasPerRenderTarget.size() - 1].cameras.push_back(camera);
  56. }
  57. else
  58. findIter->cameras.push_back(camera);
  59. }
  60. // Sort everything based on priority
  61. auto cameraComparer = [&] (const HCamera& a, const HCamera& b) { return a->getPriority() > b->getPriority(); };
  62. auto renderTargetInfoComparer = [&] (const RenderTargetRenderInfo& a, const RenderTargetRenderInfo& b) { return a.target->getPriority() > b.target->getPriority(); };
  63. std::sort(begin(camerasPerRenderTarget), end(camerasPerRenderTarget), renderTargetInfoComparer);
  64. for(auto& camerasPerTarget : camerasPerRenderTarget)
  65. {
  66. Vector<HCamera>::type& cameras = camerasPerTarget.cameras;
  67. std::sort(begin(cameras), end(cameras), cameraComparer);
  68. }
  69. // Render everything, target by target
  70. for(auto& camerasPerTarget : camerasPerRenderTarget)
  71. {
  72. RenderTargetPtr target = camerasPerTarget.target;
  73. const Vector<HCamera>::type& cameras = camerasPerTarget.cameras;
  74. coreAccessor.beginFrame();
  75. for(auto& camera : cameras)
  76. {
  77. ViewportPtr viewport = camera->getViewport();
  78. coreAccessor.setViewport(viewport);
  79. UINT32 clearBuffers = 0;
  80. if(viewport->getRequiresColorClear())
  81. clearBuffers |= FBT_COLOR;
  82. if(viewport->getRequiresDepthClear())
  83. clearBuffers |= FBT_DEPTH;
  84. if(viewport->getRequiresStencilClear())
  85. clearBuffers |= FBT_STENCIL;
  86. if(clearBuffers != 0)
  87. coreAccessor.clearViewport(clearBuffers, viewport->getClearColor(), viewport->getClearDepthValue(), viewport->getClearStencilValue());
  88. render(camera);
  89. }
  90. coreAccessor.endFrame();
  91. coreAccessor.swapBuffers(target);
  92. }
  93. }
  94. void ForwardRenderer::render(const HCamera& camera)
  95. {
  96. Vector<HRenderable>::type allRenderables;
  97. if(!camera->getIgnoreSceneRenderables())
  98. allRenderables = gSceneManager().getVisibleRenderables(camera);
  99. CoreAccessor& coreAccessor = gMainCA();
  100. coreAccessor.setViewport(camera->getViewport());
  101. Matrix4 projMatrixCstm = camera->getProjectionMatrix();
  102. Matrix4 viewMatrixCstm = camera->getViewMatrix();
  103. Matrix4 viewProjMatrix = projMatrixCstm * viewMatrixCstm;
  104. mRenderQueue->clear();
  105. // Get scene render operations
  106. for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
  107. {
  108. UINT32 numMaterials = (*iter)->getNumMaterials();
  109. for(UINT32 i = 0; i < numMaterials; i++)
  110. {
  111. // TODO - Do different things depending on material and renderable settings
  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. HMaterial& material = (*iter)->getMaterial(i);
  116. material->setMat4("matViewProjection", viewProjMatrix);
  117. }
  118. (*iter)->render(*mRenderQueue);
  119. }
  120. // Get GUI render operations
  121. GUIManager::instance().render(camera->getViewport(), *mRenderQueue);
  122. // Get overlay render operations
  123. OverlayManager::instance().render(camera->getViewport(), *mRenderQueue);
  124. // Get debug render operations
  125. DebugDraw::instance().render(*mRenderQueue);
  126. // TODO - Material queue is completely ignored
  127. mRenderQueue->sort();
  128. const Vector<SortedRenderOp>::type& sortedROps = mRenderQueue->getSortedRenderOps();
  129. for(auto iter = sortedROps.begin(); iter != sortedROps.end(); ++iter)
  130. {
  131. const RenderOperation& renderOp = *iter->baseOperation;
  132. HMaterial material = renderOp.material;
  133. PassPtr pass = material->getPass(iter->passIdx);
  134. pass->activate(coreAccessor);
  135. PassParametersPtr paramsPtr = material->getPassParameters(iter->passIdx);
  136. pass->bindParameters(coreAccessor, paramsPtr);
  137. coreAccessor.render(renderOp.meshData);
  138. }
  139. }
  140. }