CmForwardRenderer.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "CmForwardRenderer.h"
  2. #include "CmCamera.h"
  3. #include "CmSceneManager.h"
  4. #include "CmDeferredRenderContext.h"
  5. #include "CmRenderable.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 "CmOverlayManager.h"
  16. namespace CamelotEngine
  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. DeferredRenderContextPtr renderContext = gApplication().getPrimaryRenderContext();
  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. rt->swapBuffers(); // 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 = gSceneManager().getVisibleRenderables(camera);
  48. DeferredRenderContextPtr renderContext = gApplication().getPrimaryRenderContext();
  49. renderContext->setViewport(camera->getViewport());
  50. Matrix4 projMatrixCstm = camera->getProjectionMatrix();
  51. Matrix4 viewMatrixCstm = camera->getViewMatrix();
  52. Matrix4 viewProjMatrix = projMatrixCstm * viewMatrixCstm;
  53. renderContext->clear(camera->getViewport()->getTarget(), FBT_COLOUR | FBT_DEPTH, Color::Blue);
  54. renderContext->beginFrame();
  55. // TODO - sort renderables by material/pass/parameters to minimize state changes
  56. for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
  57. {
  58. HMaterial material = (*iter)->getMaterial();
  59. if(material == nullptr || !material.isLoaded())
  60. continue;
  61. HMesh mesh = (*iter)->getMesh();
  62. if(mesh == nullptr || !mesh.isLoaded())
  63. continue;
  64. // TODO - Renderer should ensure shader is compatible with it, and it contains all the needed parameters
  65. // (probably at an earlier stage). e.g. I want the user to be warned if the shader doesn't contain matViewProjection param
  66. // (or should we just ignore such missing parameters?)
  67. material->setMat4("matViewProjection", viewProjMatrix);
  68. for(UINT32 i = 0; i < material->getNumPasses(); i++)
  69. {
  70. PassPtr pass = material->getPass(i);
  71. pass->activate(renderContext);
  72. PassParametersPtr paramsPtr = material->getPassParameters(i);
  73. pass->bindParameters(renderContext, paramsPtr);
  74. renderContext->render(mesh->getRenderOperation());
  75. }
  76. }
  77. // Render overlays for this camera
  78. OverlayManager::instance().render(camera.get(), renderContext);
  79. renderContext->endFrame();
  80. // TODO - Sort renderables
  81. // Render them
  82. }
  83. }