Bs.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include <boost/ptr_container/ptr_vector.hpp>
  2. #include "Bs.h"
  3. #include "Renderer.h"
  4. #include "Scene/Scene.h"
  5. #include "Resources/ShaderProg.h"
  6. #include "Resources/Model.h"
  7. #include "Scene/ModelNode.h"
  8. #include "Resources/Material.h"
  9. #include "Resources/Mesh.h"
  10. //==============================================================================
  11. // createFbo =
  12. //==============================================================================
  13. void Bs::createFbo()
  14. {
  15. try
  16. {
  17. fbo.create();
  18. fbo.bind();
  19. fbo.setNumOfColorAttachements(1);
  20. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
  21. r.getPps().getPrePassFai().getGlId(), 0);
  22. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
  23. r.getMs().getDepthFai().getGlId(), 0);
  24. fbo.checkIfGood();
  25. fbo.unbind();
  26. }
  27. catch(std::exception& e)
  28. {
  29. throw EXCEPTION("Failed to create blending stage FBO");
  30. }
  31. }
  32. //==============================================================================
  33. // createRefractFbo =
  34. //==============================================================================
  35. void Bs::createRefractFbo()
  36. {
  37. try
  38. {
  39. refractFbo.create();
  40. refractFbo.bind();
  41. refractFbo.setNumOfColorAttachements(1);
  42. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, refractFai.getGlId(), 0);
  43. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
  44. r.getMs().getDepthFai().getGlId(), 0);
  45. refractFbo.checkIfGood();
  46. refractFbo.unbind();
  47. }
  48. catch(std::exception& e)
  49. {
  50. throw EXCEPTION("Failed to create blending stage refract FBO");
  51. }
  52. }
  53. //==============================================================================
  54. // init =
  55. //==============================================================================
  56. void Bs::init(const RendererInitializer& /*initializer*/)
  57. {
  58. createFbo();
  59. Renderer::createFai(r.getWidth(), r.getHeight(), GL_RGBA8, GL_RGBA, GL_FLOAT, refractFai);
  60. createRefractFbo();
  61. refractSProg.loadRsrc("shaders/BsRefract.glsl");
  62. }
  63. //==============================================================================
  64. // run =
  65. //==============================================================================
  66. void Bs::run()
  67. {
  68. /*Renderer::setViewport(0, 0, r.getWidth(), r.getHeight());
  69. glDepthMask(false);
  70. // render the models
  71. Scene::Types<ModelNode>::ConstIterator it = SceneSingleton::getInstance().getModelNodes().begin();
  72. for(; it != SceneSingleton::getInstance().getModelNodes().end(); ++it)
  73. {
  74. const ModelNode& mn = *(*it);
  75. boost::ptr_vector<ModelNodePatch>::const_iterator it = mn.getModelPatchNodes().begin();
  76. for(; it != mn.getModelPatchNodes().end(); it++)
  77. {
  78. const ModelNodePatch& sm = *it;
  79. if(!sm.getCpMtl().renderInBlendingStage())
  80. {
  81. continue;
  82. }
  83. // refracts ?
  84. if(sm.getCpMtl().getStdUniVar(Material::SUV_PPS_PRE_PASS_FAI))
  85. {
  86. //
  87. // Stage 0: Render to the temp FAI
  88. //
  89. refractFbo.bind();
  90. glEnable(GL_STENCIL_TEST);
  91. glClear(GL_STENCIL_BUFFER_BIT);
  92. glStencilFunc(GL_ALWAYS, 0x1, 0x1);
  93. glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  94. r.setupShaderProg(sm.getCpMtl(), mn, r.getCamera());
  95. GlStateMachineSingleton::getInstance().enable(GL_BLEND, false); // a hack
  96. sm.getCpVao().bind();
  97. glDrawElements(GL_TRIANGLES, sm.getModelPatchRsrc().getMesh().getVertIdsNum(), GL_UNSIGNED_SHORT, 0);
  98. sm.getCpVao().unbind();
  99. //
  100. // Stage 1: Render the temp FAI to prePassFai
  101. //
  102. fbo.bind();
  103. glStencilFunc(GL_EQUAL, 0x1, 0x1);
  104. glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  105. if(sm.getCpMtl().isBlendingEnabled())
  106. {
  107. GlStateMachineSingleton::getInstance().enable(GL_BLEND, true);
  108. glBlendFunc(sm.getCpMtl().getBlendingSfactor(), sm.getCpMtl().getBlendingDfactor());
  109. }
  110. else
  111. {
  112. GlStateMachineSingleton::getInstance().enable(GL_BLEND, false);
  113. }
  114. refractSProg->bind();
  115. refractSProg->findUniVar("fai")->setTexture(refractFai, 0);
  116. r.drawQuad();
  117. // cleanup
  118. glStencilFunc(GL_ALWAYS, 0x1, 0x1);
  119. glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  120. glClear(GL_STENCIL_BUFFER_BIT);
  121. glDisable(GL_STENCIL_TEST);
  122. }
  123. // no rafraction
  124. else
  125. {
  126. r.setupShaderProg(sm.getCpMtl(), mn, r.getCamera());
  127. sm.getCpVao().bind();
  128. glDrawElements(GL_TRIANGLES, sm.getModelPatchRsrc().getMesh().getVertIdsNum(), GL_UNSIGNED_SHORT, 0);
  129. sm.getCpVao().unbind();
  130. }
  131. } // end for all subModels
  132. } // end for all modelNodes
  133. glDepthMask(true);
  134. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // the rendering above fucks the polygon mode
  135. Fbo::unbind();*/
  136. }