BsForwardRenderer.cpp 3.1 KB

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