SceneDrawer.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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. //======================================================================================================================
  10. // setupShaderProg =
  11. //======================================================================================================================
  12. void SceneDrawer::setupShaderProg(const Material& mtl, const Transform& nodeWorldTransform, const Camera& cam,
  13. const Renderer& r)
  14. {
  15. uint textureUnit = 0;
  16. mtl.getShaderProg().bind();
  17. //
  18. // FFP stuff
  19. //
  20. if(mtl.isBlendingEnabled())
  21. {
  22. glEnable(GL_BLEND);
  23. //glDisable(GL_BLEND);
  24. glBlendFunc(mtl.getBlendingSfactor(), mtl.getBlendingDfactor());
  25. }
  26. else
  27. {
  28. glDisable(GL_BLEND);
  29. }
  30. if(mtl.isDepthTestingEnabled())
  31. {
  32. glEnable(GL_DEPTH_TEST);
  33. }
  34. else
  35. {
  36. glDisable(GL_DEPTH_TEST);
  37. }
  38. if(mtl.isWireframeEnabled())
  39. {
  40. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  41. }
  42. else
  43. {
  44. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  45. }
  46. //
  47. // calc needed matrices
  48. //
  49. Mat4 modelMat(nodeWorldTransform);
  50. const Mat4& projectionMat = cam.getProjectionMatrix();
  51. const Mat4& viewMat = cam.getViewMatrix();
  52. Mat4 modelViewMat;
  53. Mat3 normalMat;
  54. Mat4 modelViewProjectionMat;
  55. // should I calculate the modelViewMat ?
  56. if(mtl.getStdUniVar(Material::SUV_MODELVIEW_MAT) ||
  57. mtl.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT) ||
  58. mtl.getStdUniVar(Material::SUV_NORMAL_MAT))
  59. {
  60. modelViewMat = Mat4::combineTransformations(viewMat, modelMat);
  61. }
  62. // set matrices
  63. if(mtl.getStdUniVar(Material::SUV_MODEL_MAT))
  64. {
  65. mtl.getStdUniVar(Material::SUV_MODEL_MAT)->setMat4(&modelMat);
  66. }
  67. if(mtl.getStdUniVar(Material::SUV_VIEW_MAT))
  68. {
  69. mtl.getStdUniVar(Material::SUV_VIEW_MAT)->setMat4(&viewMat);
  70. }
  71. if(mtl.getStdUniVar(Material::SUV_PROJECTION_MAT))
  72. {
  73. mtl.getStdUniVar(Material::SUV_PROJECTION_MAT)->setMat4(&projectionMat);
  74. }
  75. if(mtl.getStdUniVar(Material::SUV_MODELVIEW_MAT))
  76. {
  77. mtl.getStdUniVar(Material::SUV_MODELVIEW_MAT)->setMat4(&modelViewMat);
  78. }
  79. if(mtl.getStdUniVar(Material::SUV_VIEWPROJECTION_MAT))
  80. {
  81. mtl.getStdUniVar(Material::SUV_VIEWPROJECTION_MAT)->setMat4(&r.getViewProjectionMat());
  82. }
  83. if(mtl.getStdUniVar(Material::SUV_NORMAL_MAT))
  84. {
  85. normalMat = modelViewMat.getRotationPart();
  86. mtl.getStdUniVar(Material::SUV_NORMAL_MAT)->setMat3(&normalMat);
  87. }
  88. if(mtl.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT))
  89. {
  90. modelViewProjectionMat = projectionMat * modelViewMat;
  91. mtl.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT)->setMat4(&modelViewProjectionMat);
  92. }
  93. //
  94. // FAis
  95. //
  96. if(mtl.getStdUniVar(Material::SUV_MS_NORMAL_FAI))
  97. {
  98. mtl.getStdUniVar(Material::SUV_MS_NORMAL_FAI)->setTexture(r.getMs().getNormalFai(), textureUnit++);
  99. }
  100. if(mtl.getStdUniVar(Material::SUV_MS_DIFFUSE_FAI))
  101. {
  102. mtl.getStdUniVar(Material::SUV_MS_DIFFUSE_FAI)->setTexture(r.getMs().getDiffuseFai(), textureUnit++);
  103. }
  104. if(mtl.getStdUniVar(Material::SUV_MS_SPECULAR_FAI))
  105. {
  106. mtl.getStdUniVar(Material::SUV_MS_SPECULAR_FAI)->setTexture(r.getMs().getSpecularFai(), textureUnit++);
  107. }
  108. if(mtl.getStdUniVar(Material::SUV_MS_DEPTH_FAI))
  109. {
  110. mtl.getStdUniVar(Material::SUV_MS_DEPTH_FAI)->setTexture(r.getMs().getDepthFai(), textureUnit++);
  111. }
  112. if(mtl.getStdUniVar(Material::SUV_IS_FAI))
  113. {
  114. mtl.getStdUniVar(Material::SUV_IS_FAI)->setTexture(r.getIs().getFai(), textureUnit++);
  115. }
  116. if(mtl.getStdUniVar(Material::SUV_PPS_PRE_PASS_FAI))
  117. {
  118. mtl.getStdUniVar(Material::SUV_PPS_PRE_PASS_FAI)->setTexture(r.getPps().getPrePassFai(), textureUnit++);
  119. }
  120. if(mtl.getStdUniVar(Material::SUV_PPS_POST_PASS_FAI))
  121. {
  122. mtl.getStdUniVar(Material::SUV_PPS_POST_PASS_FAI)->setTexture(r.getPps().getPostPassFai(), textureUnit++);
  123. }
  124. //
  125. // Other
  126. //
  127. if(mtl.getStdUniVar(Material::SUV_RENDERER_SIZE))
  128. {
  129. Vec2 v(r.getWidth(), r.getHeight());
  130. mtl.getStdUniVar(Material::SUV_RENDERER_SIZE)->setVec2(&v);
  131. }
  132. if(mtl.getStdUniVar(Material::SUV_SCENE_AMBIENT_COLOR))
  133. {
  134. Vec3 col(SceneSingleton::getInstance().getAmbientCol());
  135. mtl.getStdUniVar(Material::SUV_SCENE_AMBIENT_COLOR)->setVec3(&col);
  136. }
  137. //
  138. // set user defined vars
  139. //
  140. boost::ptr_vector<MtlUserDefinedVar>::const_iterator it = mtl.getUserDefinedVars().begin();
  141. for(; it != mtl.getUserDefinedVars().end(); it++)
  142. {
  143. const MtlUserDefinedVar& udv = *it;
  144. switch(udv.getUniVar().getGlDataType())
  145. {
  146. // texture or FAI
  147. case GL_SAMPLER_2D:
  148. if(udv.getTexture() != NULL)
  149. {
  150. udv.getTexture()->setRepeat(true);
  151. udv.getUniVar().setTexture(*udv.getTexture(), textureUnit);
  152. }
  153. else
  154. {
  155. switch(udv.getFai())
  156. {
  157. case MtlUserDefinedVar::MS_DEPTH_FAI:
  158. udv.getUniVar().setTexture(r.getMs().getDepthFai(), textureUnit);
  159. break;
  160. case MtlUserDefinedVar::IS_FAI:
  161. udv.getUniVar().setTexture(r.getIs().getFai(), textureUnit);
  162. break;
  163. case MtlUserDefinedVar::PPS_PRE_PASS_FAI:
  164. udv.getUniVar().setTexture(r.getPps().getPrePassFai(), textureUnit);
  165. break;
  166. case MtlUserDefinedVar::PPS_POST_PASS_FAI:
  167. udv.getUniVar().setTexture(r.getPps().getPostPassFai(), textureUnit);
  168. break;
  169. default:
  170. ASSERT(0);
  171. }
  172. }
  173. ++textureUnit;
  174. break;
  175. // float
  176. case GL_FLOAT:
  177. udv.getUniVar().setFloat(udv.getFloat());
  178. break;
  179. // vec2
  180. case GL_FLOAT_VEC2:
  181. udv.getUniVar().setVec2(&udv.getVec2());
  182. break;
  183. // vec3
  184. case GL_FLOAT_VEC3:
  185. udv.getUniVar().setVec3(&udv.getVec3());
  186. break;
  187. // vec4
  188. case GL_FLOAT_VEC4:
  189. udv.getUniVar().setVec4(&udv.getVec4());
  190. break;
  191. }
  192. }
  193. ON_GL_FAIL_THROW_EXCEPTION();
  194. }
  195. //======================================================================================================================
  196. // renderRenderableNode =
  197. //======================================================================================================================
  198. void SceneDrawer::renderRenderableNode(const RenderableNode& renderable, const Camera& cam,
  199. RenderingPassType rtype) const
  200. {
  201. const Material* mtl;
  202. const Vao* vao;
  203. switch(rtype)
  204. {
  205. case RPT_COLOR:
  206. mtl = &renderable.getCpMtl();
  207. vao = &renderable.getCpVao();
  208. break;
  209. case RPT_DEPTH:
  210. mtl = &renderable.getDpMtl();
  211. vao = &renderable.getDpVao();
  212. break;
  213. }
  214. setupShaderProg(*mtl, renderable.getWorldTransform(), cam, r);
  215. vao->bind();
  216. glDrawElements(GL_TRIANGLES, renderable.getVertIdsNum(), GL_UNSIGNED_SHORT, 0);
  217. vao->unbind();
  218. }