BsForwardRenderer.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. // Find all unique render targets
  34. UnorderedSet<RenderTargetPtr>::type renderTargets;
  35. for(auto& camera : allCameras)
  36. {
  37. RenderTargetPtr target = camera->getViewport()->getTarget();
  38. auto findIter = renderTargets.find(target);
  39. if(findIter == renderTargets.end())
  40. {
  41. renderTargets.insert(target);
  42. }
  43. }
  44. // Clear all targets
  45. for(auto& target : renderTargets)
  46. coreAccessor.clear(target, FBT_COLOR | FBT_DEPTH, Color::Blue);
  47. coreAccessor.beginFrame();
  48. // TODO - Attempt to render all different elements in such a way that there is only 1 render target switch per render target
  49. // Render all cameras
  50. for(auto& camera : allCameras)
  51. render(camera);
  52. // Render overlays for all targets
  53. for(auto& camera : allCameras)
  54. OverlayManager::instance().render(camera->getViewport(), coreAccessor);
  55. // Render all GUI elements
  56. for(auto& camera : allCameras)
  57. GUIManager::instance().render(camera->getViewport(), coreAccessor);
  58. coreAccessor.endFrame();
  59. // Swap all targets
  60. for(auto& target : renderTargets)
  61. coreAccessor.swapBuffers(target);
  62. }
  63. void ForwardRenderer::render(const HCamera& camera)
  64. {
  65. Vector<HRenderable>::type allRenderables;
  66. if(!camera->getIgnoreSceneRenderables())
  67. allRenderables = gSceneManager().getVisibleRenderables(camera);
  68. CoreAccessor& coreAccessor = gMainCA();
  69. coreAccessor.setViewport(camera->getViewport());
  70. Matrix4 projMatrixCstm = camera->getProjectionMatrix();
  71. Matrix4 viewMatrixCstm = camera->getViewMatrix();
  72. Matrix4 viewProjMatrix = projMatrixCstm * viewMatrixCstm;
  73. // TODO - sort renderables by material/pass/parameters to minimize state changes
  74. for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
  75. {
  76. HMaterial material = (*iter)->getMaterial();
  77. if(material == nullptr || !material.isLoaded())
  78. continue;
  79. HMesh mesh = (*iter)->getMesh();
  80. if(mesh == nullptr || !mesh.isLoaded())
  81. continue;
  82. // TODO - Renderer should ensure shader is compatible with it, and it contains all the needed parameters
  83. // (probably at an earlier stage). e.g. I want the user to be warned if the shader doesn't contain matViewProjection param
  84. // (or should we just ignore such missing parameters?)
  85. material->setMat4("matViewProjection", viewProjMatrix);
  86. for(UINT32 i = 0; i < material->getNumPasses(); i++)
  87. {
  88. PassPtr pass = material->getPass(i);
  89. pass->activate(coreAccessor);
  90. PassParametersPtr paramsPtr = material->getPassParameters(i);
  91. pass->bindParameters(coreAccessor, paramsPtr);
  92. coreAccessor.render(mesh->getRenderOperation());
  93. }
  94. }
  95. // TODO - Sort renderables
  96. // Render them
  97. }
  98. }