SceneDrawer.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #include "anki/renderer/SceneDrawer.h"
  2. #include "anki/math/Math.h"
  3. #include "anki/resource/Material.h"
  4. #include "anki/scene/RenderableNode.h"
  5. #include "anki/scene/Camera.h"
  6. #include "anki/renderer/Renderer.h"
  7. #include "anki/core/App.h"
  8. #include "anki/scene/Scene.h"
  9. #include "anki/scene/MaterialRuntime.h"
  10. #include "anki/gl/GlStateMachine.h"
  11. #include <boost/foreach.hpp>
  12. namespace anki {
  13. //==============================================================================
  14. SceneDrawer::UsrDefVarVisitor::UsrDefVarVisitor(
  15. const MaterialRuntimeVariable& udvr_,
  16. const Renderer& r_, const PassLevelKey& pt_, uint& texUnit_)
  17. : udvr(udvr_), r(r_), key(pt_), texUnit(texUnit_)
  18. {}
  19. //==============================================================================
  20. // Visitor functors =
  21. //==============================================================================
  22. template<typename Type>
  23. void SceneDrawer::UsrDefVarVisitor::operator()(const Type& x) const
  24. {
  25. static_cast<const ShaderProgramUniformVariable&>(udvr.getMaterialVariable().
  26. getShaderProgramVariable(key)).set(x);
  27. }
  28. void SceneDrawer::UsrDefVarVisitor::operator()(
  29. const TextureResourcePointer* x) const
  30. {
  31. const TextureResourcePointer& texPtr = *x;
  32. texPtr->setRepeat(true);
  33. static_cast<const ShaderProgramUniformVariable&>(udvr.getMaterialVariable().
  34. getShaderProgramVariable(key)).set(*texPtr, texUnit);
  35. ++texUnit;
  36. }
  37. //==============================================================================
  38. // setupShaderProg =
  39. //==============================================================================
  40. void SceneDrawer::setupShaderProg(
  41. const MaterialRuntime& mtlr,
  42. const PassLevelKey& pt,
  43. const Transform& nodeWorldTransform,
  44. const Camera& cam,
  45. const Renderer& r,
  46. float blurring)
  47. {
  48. typedef MaterialVariable Mvb; // Short name
  49. uint textureUnit = 0;
  50. GlStateMachine& gl = GlStateMachineSingleton::get();
  51. const Material& mtl = mtlr.getMaterial();
  52. const ShaderProgram& sprog = mtl.getShaderProgram(pt);
  53. sprog.bind();
  54. //
  55. // FFP stuff
  56. //
  57. gl.enable(GL_BLEND, mtlr.isBlendingEnabled());
  58. if(mtlr.isBlendingEnabled())
  59. {
  60. glBlendFunc(mtlr.getBlendingSFactor(), mtlr.getBlendingDFactor());
  61. }
  62. gl.enable(GL_DEPTH_TEST, mtlr.getDepthTesting());
  63. if(mtlr.getWireframe())
  64. {
  65. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  66. }
  67. else
  68. {
  69. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  70. }
  71. //
  72. // Calc needed matrices
  73. //
  74. Mat4 modelMat(nodeWorldTransform);
  75. const Mat4& projectionMat = cam.getProjectionMatrix();
  76. const Mat4& viewMat = cam.getViewMatrix();
  77. Mat4 modelViewMat;
  78. Mat3 normalMat;
  79. Mat4 modelViewProjectionMat;
  80. // should I calculate the modelViewMat ?
  81. if(mtl.variableExistsAndInKey("modelViewMat", pt) ||
  82. mtl.variableExistsAndInKey("modeViewProjectionMat", pt) ||
  83. mtl.variableExistsAndInKey("normalMat", pt))
  84. {
  85. // Optimization
  86. modelViewMat = (modelMat == Mat4::getIdentity()) ? viewMat :
  87. Mat4::combineTransformations(viewMat, modelMat);
  88. }
  89. // set matrices
  90. if(mtl.variableExistsAndInKey("modelMat", pt))
  91. {
  92. static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("modelMat").
  93. getShaderProgramVariable(pt)).set(modelMat);
  94. }
  95. if(mtl.variableExistsAndInKey("viewMat", pt))
  96. {
  97. static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("viewMat").
  98. getShaderProgramVariable(pt)).set(viewMat);
  99. }
  100. if(mtl.variableExistsAndInKey("projectionMat", pt))
  101. {
  102. static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("projectionMat").
  103. getShaderProgramVariable(pt)).set(projectionMat);
  104. }
  105. if(mtl.variableExistsAndInKey("modelViewMat", pt))
  106. {
  107. static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("modelMat").
  108. getShaderProgramVariable(pt)).set(modelViewMat);
  109. }
  110. if(mtl.variableExistsAndInKey("viewProjectionMat", pt))
  111. {
  112. static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("viewProjectionMat").
  113. getShaderProgramVariable(pt)).set(r.getViewProjectionMat());
  114. }
  115. if(mtl.variableExistsAndInKey("normalMat", pt))
  116. {
  117. normalMat = modelViewMat.getRotationPart();
  118. static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("normalMat").
  119. getShaderProgramVariable(pt)).set(normalMat);
  120. }
  121. if(mtl.variableExistsAndInKey("modelViewProjectionMat", pt))
  122. {
  123. modelViewProjectionMat = projectionMat * modelViewMat;
  124. static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("modelViewProjectionMat").
  125. getShaderProgramVariable(pt)).set(modelViewProjectionMat);
  126. }
  127. //
  128. // FAis
  129. //
  130. /*if(mtl.variableExistsAndInKey(Mvb::MV_MS_NORMAL_FAI, pt))
  131. {
  132. mtl.getBuildinVariable(Mvb::MV_MS_NORMAL_FAI).
  133. getShaderProgramUniformVariable(pt).set(
  134. r.getMs().getNormalFai(), textureUnit++);
  135. }
  136. if(mtl.variableExistsAndInKey(Mvb::MV_MS_DIFFUSE_FAI, pt))
  137. {
  138. mtl.getBuildinVariable(Mvb::MV_MS_DIFFUSE_FAI).
  139. getShaderProgramUniformVariable(pt).set(
  140. r.getMs().getDiffuseFai(), textureUnit++);
  141. }
  142. if(mtl.variableExistsAndInKey(Mvb::MV_MS_SPECULAR_FAI, pt))
  143. {
  144. mtl.getBuildinVariable(Mvb::MV_MS_SPECULAR_FAI).
  145. getShaderProgramUniformVariable(pt).set(
  146. r.getMs().getSpecularFai(), textureUnit++);
  147. }
  148. if(mtl.variableExistsAndInKey(Mvb::MV_MS_DEPTH_FAI, pt))
  149. {
  150. mtl.getBuildinVariable(Mvb::MV_MS_DEPTH_FAI).
  151. getShaderProgramUniformVariable(pt).set(
  152. r.getMs().getDepthFai(), textureUnit++);
  153. }
  154. if(mtl.variableExistsAndInKey(Mvb::MV_IS_FAI, pt))
  155. {
  156. mtl.getBuildinVariable(Mvb::MV_IS_FAI).
  157. getShaderProgramUniformVariable(pt).set(
  158. r.getIs().getFai(), textureUnit++);
  159. }
  160. if(mtl.variableExistsAndInKey(Mvb::MV_PPS_PRE_PASS_FAI, pt))
  161. {
  162. mtl.getBuildinVariable(Mvb::MV_PPS_PRE_PASS_FAI).
  163. getShaderProgramUniformVariable(pt).set(
  164. r.getPps().getPrePassFai(), textureUnit++);
  165. }
  166. if(mtl.variableExistsAndInKey(Mvb::MV_PPS_POST_PASS_FAI, pt))
  167. {
  168. mtl.getBuildinVariable(Mvb::MV_PPS_POST_PASS_FAI).
  169. getShaderProgramUniformVariable(pt).set(
  170. r.getPps().getPostPassFai(), textureUnit++);
  171. }
  172. //
  173. // Other
  174. //
  175. if(mtl.variableExistsAndInKey(Mvb::MV_RENDERER_SIZE, pt))
  176. {
  177. Vec2 v(r.getWidth(), r.getHeight());
  178. mtl.getBuildinVariable(Mvb::MV_RENDERER_SIZE).
  179. getShaderProgramUniformVariable(pt).set(&v);
  180. }
  181. if(mtl.variableExistsAndInKey(Mvb::MV_SCENE_AMBIENT_COLOR, pt))
  182. {
  183. Vec3 col(SceneSingleton::get().getAmbientColor());
  184. mtl.getBuildinVariable(Mvb::MV_SCENE_AMBIENT_COLOR).
  185. getShaderProgramUniformVariable(pt).set(&col);
  186. }
  187. if(mtl.variableExistsAndInKey(Mvb::MV_BLURRING, pt))
  188. {
  189. blurring *= 10.0;
  190. ANKI_INFO(blurring);
  191. float b = blurring;
  192. mtl.getBuildinVariable(Mvb::MV_BLURRING).
  193. getShaderProgramUniformVariable(pt).set(&b);
  194. }*/
  195. //
  196. // set user defined vars
  197. //
  198. BOOST_FOREACH(const MaterialRuntimeVariable& udvr, mtlr.getVariables())
  199. {
  200. if(!udvr.getMaterialVariable().inPass(pt) ||
  201. udvr.getMaterialVariable().getShaderProgramVariableType() ==
  202. ShaderProgramVariable::T_ATTRIBUTE)
  203. {
  204. continue;
  205. }
  206. boost::apply_visitor(UsrDefVarVisitor(udvr, r, pt, textureUnit),
  207. udvr.getDataVariant());
  208. }
  209. ANKI_CHECK_GL_ERROR();
  210. }
  211. //==============================================================================
  212. // renderRenderableNode =
  213. //==============================================================================
  214. void SceneDrawer::renderRenderableNode(const RenderableNode& node,
  215. const Camera& cam, const PassLevelKey& key) const
  216. {
  217. float blurring = 0.0;
  218. const MaterialRuntime& mtlr = node.getMaterialRuntime();
  219. const Material& mtl = mtlr.getMaterial();
  220. // Calc the blur if needed
  221. if(mtl.variableExistsAndInKey("blurring", key))
  222. {
  223. float prev = (node.getPrevWorldTransform().getOrigin() -
  224. cam.getPrevWorldTransform().getOrigin()).getLength();
  225. float crnt = (node.getWorldTransform().getOrigin() -
  226. cam.getWorldTransform().getOrigin()).getLength();
  227. blurring = abs(crnt - prev);
  228. }
  229. setupShaderProg(mtlr, key, node.getWorldTransform(), cam, r, blurring);
  230. node.getVao(key).bind();
  231. glDrawElements(GL_TRIANGLES, node.getVertIdsNum(key), GL_UNSIGNED_SHORT, 0);
  232. node.getVao(key).unbind();
  233. }
  234. //==============================================================================
  235. void SceneDrawer::setTheBuildins(MaterialRuntime& m)
  236. {
  237. }
  238. } // end namespace