CmForwardRenderer.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "CmForwardRenderer.h"
  2. #include "CmCamera.h"
  3. #include "CmSceneManager.h"
  4. #include "CmPass.h"
  5. #include "CmRenderSystem.h"
  6. #include "CmRenderSystemManager.h"
  7. namespace CamelotEngine
  8. {
  9. const String& ForwardRenderer::getName() const
  10. {
  11. static String name = "ForwardRenderer";
  12. return name;
  13. }
  14. void ForwardRenderer::renderAll()
  15. {
  16. const vector<CameraPtr>::type& allCameras = gSceneManager().getAllCameras();
  17. for(auto iter = allCameras.begin(); iter != allCameras.end(); ++iter)
  18. {
  19. render(*iter);
  20. }
  21. }
  22. void ForwardRenderer::render(const CameraPtr camera)
  23. {
  24. vector<RenderablePtr>::type allRenderables = gSceneManager().getVisibleRenderables(camera);
  25. // TODO - Sort renderables
  26. // Render them
  27. }
  28. void ForwardRenderer::setPass(const Pass* pass)
  29. {
  30. RenderSystem* renderSystem = RenderSystemManager::getActive();
  31. GpuProgramRef vertProgram = pass->getVertexProgram();
  32. if(vertProgram)
  33. {
  34. renderSystem->bindGpuProgram(vertProgram->_getBindingDelegate());
  35. }
  36. else
  37. {
  38. if(renderSystem->isGpuProgramBound(GPT_VERTEX_PROGRAM))
  39. renderSystem->unbindGpuProgram(GPT_VERTEX_PROGRAM);
  40. }
  41. GpuProgramRef fragProgram = pass->getFragmentProgram();
  42. if(fragProgram)
  43. {
  44. renderSystem->bindGpuProgram(fragProgram->_getBindingDelegate());
  45. }
  46. else
  47. {
  48. if(renderSystem->isGpuProgramBound(GPT_FRAGMENT_PROGRAM))
  49. renderSystem->unbindGpuProgram(GPT_FRAGMENT_PROGRAM);
  50. }
  51. GpuProgramRef geomProgram = pass->getGeometryProgram();
  52. if(geomProgram)
  53. {
  54. renderSystem->bindGpuProgram(geomProgram->_getBindingDelegate());
  55. }
  56. else
  57. {
  58. if(renderSystem->isGpuProgramBound(GPT_GEOMETRY_PROGRAM))
  59. renderSystem->unbindGpuProgram(GPT_GEOMETRY_PROGRAM);
  60. }
  61. // The rest of the settings are the same no matter whether we use programs or not
  62. // Set scene blending
  63. if ( pass->hasSeparateSceneBlending( ) )
  64. {
  65. renderSystem->_setSeparateSceneBlending(
  66. pass->getSourceBlendFactor(), pass->getDestBlendFactor(),
  67. pass->getSourceBlendFactorAlpha(), pass->getDestBlendFactorAlpha(),
  68. pass->getSceneBlendingOperation(),
  69. pass->hasSeparateSceneBlendingOperations() ? pass->getSceneBlendingOperation() : pass->getSceneBlendingOperationAlpha() );
  70. }
  71. else
  72. {
  73. if(pass->hasSeparateSceneBlendingOperations( ) )
  74. {
  75. renderSystem->_setSeparateSceneBlending(
  76. pass->getSourceBlendFactor(), pass->getDestBlendFactor(),
  77. pass->getSourceBlendFactor(), pass->getDestBlendFactor(),
  78. pass->getSceneBlendingOperation(), pass->getSceneBlendingOperationAlpha() );
  79. }
  80. else
  81. {
  82. renderSystem->_setSceneBlending(
  83. pass->getSourceBlendFactor(), pass->getDestBlendFactor(), pass->getSceneBlendingOperation() );
  84. }
  85. }
  86. // Set point parameters
  87. renderSystem->_setPointParameters(
  88. pass->getPointSize(),
  89. false,
  90. false,
  91. false,
  92. false,
  93. pass->getPointMinSize(),
  94. pass->getPointMaxSize());
  95. // TODO - Set texture sampler states!
  96. // TODO - Try to limit amount of state changes, if previous state is already the same (especially with textures)
  97. // TODO: Disable remaining texture units
  98. //renderSystem->_disableTextureUnitsFrom(pass->getNumTextureUnitStates());
  99. // Set up non-texture related material settings
  100. // Depth buffer settings
  101. renderSystem->_setDepthBufferFunction(pass->getDepthFunction());
  102. renderSystem->_setDepthBufferCheckEnabled(pass->getDepthCheckEnabled());
  103. renderSystem->_setDepthBufferWriteEnabled(pass->getDepthWriteEnabled());
  104. renderSystem->_setDepthBias(pass->getDepthBiasConstant(), pass->getDepthBiasSlopeScale());
  105. // Alpha-reject settings
  106. renderSystem->_setAlphaRejectSettings(
  107. pass->getAlphaRejectFunction(), pass->getAlphaRejectValue(), pass->isAlphaToCoverageEnabled());
  108. // Set colour write mode
  109. // Right now we only use on/off, not per-channel
  110. bool colWrite = pass->getColourWriteEnabled();
  111. renderSystem->_setColourBufferWriteEnabled(colWrite, colWrite, colWrite, colWrite);
  112. // Culling mode
  113. renderSystem->_setCullingMode(pass->getCullingMode());
  114. // Polygon mode
  115. renderSystem->_setPolygonMode(pass->getPolygonMode());
  116. }
  117. }