SceneDrawer.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #include "SceneDrawer.h"
  2. #include "Math.h"
  3. #include "Material.h"
  4. #include "RenderableNode.h"
  5. #include "Camera.h"
  6. #include "Renderer.h"
  7. #include "App.h"
  8. #include "Scene.h"
  9. #include "MaterialRuntime.h"
  10. #include "GlStateMachine.h"
  11. //======================================================================================================================
  12. // Constructor =
  13. //======================================================================================================================
  14. SceneDrawer::UsrDefVarVisitor::UsrDefVarVisitor(const MaterialRuntimeUserDefinedVar& udvr_,
  15. const Renderer& r_, uint& texUnit_):
  16. udvr(udvr_),
  17. r(r_),
  18. texUnit(texUnit_)
  19. {}
  20. //======================================================================================================================
  21. // Visitor functors =
  22. //======================================================================================================================
  23. template<typename Type>
  24. void SceneDrawer::UsrDefVarVisitor::operator()(const Type& x) const
  25. {
  26. udvr.getUniVar().set(&x);
  27. }
  28. void SceneDrawer::UsrDefVarVisitor::operator()(const RsrcPtr<Texture>* x) const
  29. {
  30. const RsrcPtr<Texture>& texPtr = *x;
  31. texPtr->setRepeat(true);
  32. udvr.getUniVar().set(*texPtr, texUnit);
  33. ++texUnit;
  34. }
  35. template<>
  36. void SceneDrawer::UsrDefVarVisitor::operator()(const MtlUserDefinedVar::Fai& x) const
  37. {
  38. switch(x)
  39. {
  40. case MtlUserDefinedVar::MS_DEPTH_FAI:
  41. udvr.getUniVar().set(r.getMs().getDepthFai(), texUnit);
  42. break;
  43. case MtlUserDefinedVar::IS_FAI:
  44. udvr.getUniVar().set(r.getIs().getFai(), texUnit);
  45. break;
  46. case MtlUserDefinedVar::PPS_PRE_PASS_FAI:
  47. udvr.getUniVar().set(r.getPps().getPrePassFai(), texUnit);
  48. break;
  49. case MtlUserDefinedVar::PPS_POST_PASS_FAI:
  50. udvr.getUniVar().set(r.getPps().getPostPassFai(), texUnit);
  51. break;
  52. default:
  53. ASSERT(0);
  54. }
  55. ++texUnit;
  56. }
  57. //======================================================================================================================
  58. // setupShaderProg =
  59. //======================================================================================================================
  60. void SceneDrawer::setupShaderProg(const MaterialRuntime& mtlr, const Transform& nodeWorldTransform, const Camera& cam,
  61. const Renderer& r, float blurring)
  62. {
  63. uint textureUnit = 0;
  64. mtlr.getMaterial().getShaderProg().bind();
  65. //
  66. // FFP stuff
  67. //
  68. GlStateMachineSingleton::getInstance().enable(GL_BLEND, mtlr.isBlendingEnabled());
  69. if(mtlr.isBlendingEnabled())
  70. {
  71. glBlendFunc(mtlr.getBlendingSfactor(), mtlr.getBlendingDfactor());
  72. }
  73. GlStateMachineSingleton::getInstance().enable(GL_DEPTH_TEST, mtlr.isDepthTestingEnabled());
  74. if(mtlr.isWireframeEnabled())
  75. {
  76. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  77. }
  78. else
  79. {
  80. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  81. }
  82. //
  83. // calc needed matrices
  84. //
  85. Mat4 modelMat(nodeWorldTransform);
  86. const Mat4& projectionMat = cam.getProjectionMatrix();
  87. const Mat4& viewMat = cam.getViewMatrix();
  88. Mat4 modelViewMat;
  89. Mat3 normalMat;
  90. Mat4 modelViewProjectionMat;
  91. // should I calculate the modelViewMat ?
  92. if(mtlr.getStdUniVar(Material::SUV_MODELVIEW_MAT) ||
  93. mtlr.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT) ||
  94. mtlr.getStdUniVar(Material::SUV_NORMAL_MAT))
  95. {
  96. // Optimization
  97. if(modelMat == Mat4::getIdentity())
  98. {
  99. modelViewMat = viewMat;
  100. }
  101. else
  102. {
  103. modelViewMat = Mat4::combineTransformations(viewMat, modelMat);
  104. }
  105. }
  106. // set matrices
  107. if(mtlr.getStdUniVar(Material::SUV_MODEL_MAT))
  108. {
  109. mtlr.getStdUniVar(Material::SUV_MODEL_MAT)->set(&modelMat);
  110. }
  111. if(mtlr.getStdUniVar(Material::SUV_VIEW_MAT))
  112. {
  113. mtlr.getStdUniVar(Material::SUV_VIEW_MAT)->set(&viewMat);
  114. }
  115. if(mtlr.getStdUniVar(Material::SUV_PROJECTION_MAT))
  116. {
  117. mtlr.getStdUniVar(Material::SUV_PROJECTION_MAT)->set(&projectionMat);
  118. }
  119. if(mtlr.getStdUniVar(Material::SUV_MODELVIEW_MAT))
  120. {
  121. mtlr.getStdUniVar(Material::SUV_MODELVIEW_MAT)->set(&modelViewMat);
  122. }
  123. if(mtlr.getStdUniVar(Material::SUV_VIEWPROJECTION_MAT))
  124. {
  125. mtlr.getStdUniVar(Material::SUV_VIEWPROJECTION_MAT)->set(&r.getViewProjectionMat());
  126. }
  127. if(mtlr.getStdUniVar(Material::SUV_NORMAL_MAT))
  128. {
  129. normalMat = modelViewMat.getRotationPart();
  130. mtlr.getStdUniVar(Material::SUV_NORMAL_MAT)->set(&normalMat);
  131. }
  132. if(mtlr.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT))
  133. {
  134. modelViewProjectionMat = projectionMat * modelViewMat;
  135. mtlr.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT)->set(&modelViewProjectionMat);
  136. }
  137. //
  138. // FAis
  139. //
  140. if(mtlr.getStdUniVar(Material::SUV_MS_NORMAL_FAI))
  141. {
  142. mtlr.getStdUniVar(Material::SUV_MS_NORMAL_FAI)->set(r.getMs().getNormalFai(), textureUnit++);
  143. }
  144. if(mtlr.getStdUniVar(Material::SUV_MS_DIFFUSE_FAI))
  145. {
  146. mtlr.getStdUniVar(Material::SUV_MS_DIFFUSE_FAI)->set(r.getMs().getDiffuseFai(), textureUnit++);
  147. }
  148. if(mtlr.getStdUniVar(Material::SUV_MS_SPECULAR_FAI))
  149. {
  150. mtlr.getStdUniVar(Material::SUV_MS_SPECULAR_FAI)->set(r.getMs().getSpecularFai(), textureUnit++);
  151. }
  152. if(mtlr.getStdUniVar(Material::SUV_MS_DEPTH_FAI))
  153. {
  154. mtlr.getStdUniVar(Material::SUV_MS_DEPTH_FAI)->set(r.getMs().getDepthFai(), textureUnit++);
  155. }
  156. if(mtlr.getStdUniVar(Material::SUV_IS_FAI))
  157. {
  158. mtlr.getStdUniVar(Material::SUV_IS_FAI)->set(r.getIs().getFai(), textureUnit++);
  159. }
  160. if(mtlr.getStdUniVar(Material::SUV_PPS_PRE_PASS_FAI))
  161. {
  162. mtlr.getStdUniVar(Material::SUV_PPS_PRE_PASS_FAI)->set(r.getPps().getPrePassFai(), textureUnit++);
  163. }
  164. if(mtlr.getStdUniVar(Material::SUV_PPS_POST_PASS_FAI))
  165. {
  166. mtlr.getStdUniVar(Material::SUV_PPS_POST_PASS_FAI)->set(r.getPps().getPostPassFai(), textureUnit++);
  167. }
  168. //
  169. // Other
  170. //
  171. if(mtlr.getStdUniVar(Material::SUV_RENDERER_SIZE))
  172. {
  173. Vec2 v(r.getWidth(), r.getHeight());
  174. mtlr.getStdUniVar(Material::SUV_RENDERER_SIZE)->set(&v);
  175. }
  176. if(mtlr.getStdUniVar(Material::SUV_SCENE_AMBIENT_COLOR))
  177. {
  178. Vec3 col(SceneSingleton::getInstance().getAmbientCol());
  179. mtlr.getStdUniVar(Material::SUV_SCENE_AMBIENT_COLOR)->set(&col);
  180. }
  181. if(mtlr.getStdUniVar(Material::SUV_BLURRING))
  182. {
  183. /*blurring *= 10.0;
  184. INFO(blurring);*/
  185. float b = blurring;
  186. mtlr.getStdUniVar(Material::SUV_BLURRING)->set(&b);
  187. }
  188. //
  189. // set user defined vars
  190. //
  191. BOOST_FOREACH(const MaterialRuntimeUserDefinedVar& udvr, mtlr.getUserDefinedVars())
  192. {
  193. boost::apply_visitor(UsrDefVarVisitor(udvr, r, textureUnit), udvr.getDataVariant());
  194. }
  195. ON_GL_FAIL_THROW_EXCEPTION();
  196. }
  197. //======================================================================================================================
  198. // renderRenderableNode =
  199. //======================================================================================================================
  200. void SceneDrawer::renderRenderableNode(const RenderableNode& renderable, const Camera& cam,
  201. RenderingPassType rtype) const
  202. {
  203. const MaterialRuntime* mtlr;
  204. const Vao* vao;
  205. float blurring = 0.0;
  206. switch(rtype)
  207. {
  208. case RPT_COLOR:
  209. mtlr = &renderable.getCpMtlRun();
  210. vao = &renderable.getCpVao();
  211. blurring = (renderable.getWorldTransform().getOrigin() -
  212. renderable.getPrevWorldTransform().getOrigin()).getLength();
  213. break;
  214. case RPT_DEPTH:
  215. mtlr = &renderable.getDpMtlRun();
  216. vao = &renderable.getDpVao();
  217. break;
  218. }
  219. setupShaderProg(*mtlr, renderable.getWorldTransform(), cam, r, blurring);
  220. vao->bind();
  221. glDrawElements(GL_TRIANGLES, renderable.getVertIdsNum(), GL_UNSIGNED_SHORT, 0);
  222. vao->unbind();
  223. }