BsForwardRenderer.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. for(auto iter = allCameras.begin(); iter != allCameras.end(); ++iter)
  33. {
  34. render(*iter);
  35. ViewportPtr vp = (*iter)->getViewport();
  36. if(vp != nullptr)
  37. {
  38. RenderTargetPtr rt = vp->getTarget();
  39. if(rt != nullptr)
  40. renderContext.swapBuffers(rt); // TODO - This is wrong as potentially multiple viewports can share a single render target, and swap shouldn't
  41. // be done for every one of them
  42. }
  43. }
  44. }
  45. void ForwardRenderer::render(const HCamera& camera)
  46. {
  47. vector<HRenderable>::type allRenderables;
  48. if(!camera->getIgnoreSceneRenderables())
  49. allRenderables = gSceneManager().getVisibleRenderables(camera);
  50. RenderContext& renderContext = gMainRC();
  51. renderContext.setViewport(camera->getViewport());
  52. Matrix4 projMatrixCstm = camera->getProjectionMatrix();
  53. Matrix4 viewMatrixCstm = camera->getViewMatrix();
  54. Matrix4 viewProjMatrix = projMatrixCstm * viewMatrixCstm;
  55. renderContext.clear(camera->getViewport()->getTarget(), FBT_COLOR | FBT_DEPTH, Color::Blue);
  56. renderContext.beginFrame();
  57. // TODO - sort renderables by material/pass/parameters to minimize state changes
  58. for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
  59. {
  60. HMaterial material = (*iter)->getMaterial();
  61. if(material == nullptr || !material.isLoaded())
  62. continue;
  63. HMesh mesh = (*iter)->getMesh();
  64. if(mesh == nullptr || !mesh.isLoaded())
  65. continue;
  66. // TODO - Renderer should ensure shader is compatible with it, and it contains all the needed parameters
  67. // (probably at an earlier stage). e.g. I want the user to be warned if the shader doesn't contain matViewProjection param
  68. // (or should we just ignore such missing parameters?)
  69. material->setMat4("matViewProjection", viewProjMatrix);
  70. for(UINT32 i = 0; i < material->getNumPasses(); i++)
  71. {
  72. PassPtr pass = material->getPass(i);
  73. pass->activate(renderContext);
  74. PassParametersPtr paramsPtr = material->getPassParameters(i);
  75. pass->bindParameters(renderContext, paramsPtr);
  76. renderContext.render(mesh->getRenderOperation());
  77. }
  78. }
  79. // Render overlays for this camera
  80. OverlayManager::instance().render(camera.get(), renderContext);
  81. renderContext.endFrame();
  82. // TODO - Sort renderables
  83. // Render them
  84. }
  85. }