SceneDrawer.cpp 7.2 KB

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