BsForwardRenderer.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. using namespace CamelotFramework;
  16. namespace BansheeEngine
  17. {
  18. ForwardRenderer::ForwardRenderer()
  19. {
  20. }
  21. ForwardRenderer::~ForwardRenderer()
  22. { }
  23. const String& ForwardRenderer::getName() const
  24. {
  25. static String name = "ForwardRenderer";
  26. return name;
  27. }
  28. void ForwardRenderer::renderAll()
  29. {
  30. RenderContext& renderContext = gMainRC();
  31. const vector<HCamera>::type& allCameras = gSceneManager().getAllCameras();
  32. // Find all unique render targets
  33. std::unordered_set<RenderTargetPtr> renderTargets;
  34. for(auto& camera : allCameras)
  35. {
  36. RenderTargetPtr target = camera->getViewport()->getTarget();
  37. auto findIter = renderTargets.find(target);
  38. if(findIter == renderTargets.end())
  39. {
  40. renderTargets.insert(target);
  41. }
  42. }
  43. // Clear all targets
  44. for(auto& target : renderTargets)
  45. renderContext.clear(target, FBT_COLOR | FBT_DEPTH, Color::Blue);
  46. renderContext.beginFrame();
  47. // Render all cameras
  48. for(auto& camera : allCameras)
  49. render(camera);
  50. // Render overlays for all targets
  51. for(auto& camera : allCameras)
  52. OverlayManager::instance().render(camera->getViewport(), renderContext);
  53. renderContext.endFrame();
  54. // Swap all targets
  55. for(auto& target : renderTargets)
  56. renderContext.swapBuffers(target);
  57. }
  58. void ForwardRenderer::render(const HCamera& camera)
  59. {
  60. vector<HRenderable>::type allRenderables;
  61. if(!camera->getIgnoreSceneRenderables())
  62. allRenderables = gSceneManager().getVisibleRenderables(camera);
  63. RenderContext& renderContext = gMainRC();
  64. renderContext.setViewport(camera->getViewport());
  65. Matrix4 projMatrixCstm = camera->getProjectionMatrix();
  66. Matrix4 viewMatrixCstm = camera->getViewMatrix();
  67. Matrix4 viewProjMatrix = projMatrixCstm * viewMatrixCstm;
  68. // TODO - sort renderables by material/pass/parameters to minimize state changes
  69. for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
  70. {
  71. HMaterial material = (*iter)->getMaterial();
  72. if(material == nullptr || !material.isLoaded())
  73. continue;
  74. HMesh mesh = (*iter)->getMesh();
  75. if(mesh == nullptr || !mesh.isLoaded())
  76. continue;
  77. // TODO - Renderer should ensure shader is compatible with it, and it contains all the needed parameters
  78. // (probably at an earlier stage). e.g. I want the user to be warned if the shader doesn't contain matViewProjection param
  79. // (or should we just ignore such missing parameters?)
  80. material->setMat4("matViewProjection", viewProjMatrix);
  81. for(UINT32 i = 0; i < material->getNumPasses(); i++)
  82. {
  83. PassPtr pass = material->getPass(i);
  84. pass->activate(renderContext);
  85. PassParametersPtr paramsPtr = material->getPassParameters(i);
  86. pass->bindParameters(renderContext, paramsPtr);
  87. renderContext.render(mesh->getRenderOperation());
  88. }
  89. }
  90. // TODO - Sort renderables
  91. // Render them
  92. }
  93. }