DeferredRenderer.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. #include "DeferredRenderer.h"
  2. #include "RendererScene.h"
  3. #include "ShaderUniformUpdater.h"
  4. #include "WindowLocator.h"
  5. DeferredRenderer::SingleTriangle DeferredRenderer::m_fullscreenTriangle;
  6. DeferredRenderer::DeferredRenderer()
  7. {
  8. m_rendererState = new DeferredRendererState(this);
  9. m_currentObjectData = nullptr;
  10. m_gbuffer = nullptr;
  11. m_boundShaderHandle = 0;
  12. m_spotLightBufferHandle = 0;
  13. m_pointLightBufferHandle = 0;
  14. m_shaderGeometry = 0;
  15. m_shaderLightPass = 0;
  16. m_shaderFinalPass = 0;
  17. for(int i = 0; i < MaterialType_NumOfTypes; i++)
  18. m_boundTextureHandles[i] = 0;
  19. }
  20. DeferredRenderer::~DeferredRenderer()
  21. {
  22. delete m_gbuffer;
  23. }
  24. ErrorCode DeferredRenderer::init()
  25. {
  26. ErrorCode returnCode = ErrorCode::Success;
  27. // Get the current screen size
  28. m_screenSize.x = Config::graphicsVar().current_resolution_x;
  29. m_screenSize.y = Config::graphicsVar().current_resolution_y;
  30. // Initialize gbuffer (and also pass the screen size to be used as the buffer size)
  31. //m_gbuffer = new GeometryBuffer((unsigned int) m_screenSize.x, (unsigned int) m_screenSize.y);
  32. // Initialize gbuffer and check if it was successful
  33. //if(ErrHandlerLoc::get().ifSuccessful(m_gbuffer->init(), returnCode))
  34. {
  35. // Create a property-set used to load geometry shader
  36. PropertySet geomShaderProperties(Properties::Shaders);
  37. geomShaderProperties.addProperty(Properties::VertexShader, Config::rendererVar().geometry_pass_vert_shader);
  38. geomShaderProperties.addProperty(Properties::FragmentShader, Config::rendererVar().geometry_pass_frag_shader);
  39. // Create a property-set used to load lighting shader
  40. PropertySet lightShaderProperties(Properties::Shaders);
  41. lightShaderProperties.addProperty(Properties::VertexShader, Config::rendererVar().light_pass_vert_shader);
  42. lightShaderProperties.addProperty(Properties::FragmentShader, Config::rendererVar().light_pass_frag_shader);
  43. // Create a property-set used to load reflection shader
  44. PropertySet reflectionShaderProperties(Properties::Shaders);
  45. reflectionShaderProperties.addProperty(Properties::VertexShader, Config::rendererVar().reflection_pass_vert_shader);
  46. reflectionShaderProperties.addProperty(Properties::FragmentShader, Config::rendererVar().reflection_pass_frag_shader);
  47. // Create shaders
  48. m_shaderGeometry = Loaders::shader().load(geomShaderProperties);
  49. m_shaderLightPass = Loaders::shader().load(lightShaderProperties);
  50. m_shaderReflectionPass = Loaders::shader().load(reflectionShaderProperties);
  51. // Load geometry shader
  52. m_shaderGeometry->loadToMemory();
  53. //m_shaderGeometry->loadToVideoMemory();
  54. // Load lighting shader
  55. m_shaderLightPass->loadToMemory();
  56. //m_shaderLightPass->loadToVideoMemory();
  57. // Load reflection shader
  58. m_shaderReflectionPass->loadToMemory();
  59. //m_shaderReflectionPass->loadToVideoMemory();
  60. #ifndef SETTING_USE_BLIT_FRAMEBUFFER
  61. // Create a property-set used to load final shader
  62. PropertySet finalShaderProperties(Properties::Shaders);
  63. finalShaderProperties.addProperty(Properties::VertexShader, Config::rendererVar().final_pass_vert_shader);
  64. finalShaderProperties.addProperty(Properties::FragmentShader, Config::rendererVar().final_pass_frag_shader);
  65. // Create shader
  66. m_shaderFinalPass = Loaders::shader().load(finalShaderProperties);
  67. // Load final shader
  68. m_shaderFinalPass->loadToMemory();
  69. //m_shaderFinalPass->loadToVideoMemory();
  70. #endif // SETTING_USE_BLIT_FRAMEBUFFER
  71. // Load fullscreen triangle (used to render post-processing effects)
  72. m_fullscreenTriangle.load();
  73. // Enable / disable face culling
  74. //if(Config::rendererVar().face_culling)
  75. // glEnable(GL_CULL_FACE);
  76. //else
  77. // glDisable(GL_CULL_FACE);
  78. // Enable / disable depth test
  79. //if(Config::rendererVar().depth_test)
  80. // glEnable(GL_DEPTH_TEST);
  81. //else
  82. // glDisable(GL_DEPTH_TEST);
  83. //glDepthFunc(GL_LESS);
  84. // Set face culling mode
  85. //glCullFace(Config::rendererVar().face_culling_mode);
  86. // Set depth test function
  87. glDepthFunc(Config::rendererVar().depth_test_func);
  88. // Declare light buffer's block size variable
  89. GLint pointLightBlockSize = 0;
  90. GLint spotLightBlockSize = 0;
  91. //m_shaderLightPass->bind();
  92. // Get point light buffer's uniform block index
  93. auto pointLightBlockIndex = glGetUniformBlockIndex(m_shaderLightPass->getShaderHandle(), Config::shaderVar().pointLightBuffer.c_str());
  94. // Get point light buffer's uniform block size
  95. glGetActiveUniformBlockiv(m_shaderLightPass->getShaderHandle(), pointLightBlockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &pointLightBlockSize);
  96. // Bind the uniform buffer at point light binding point
  97. glUniformBlockBinding(m_shaderLightPass->getShaderHandle(), pointLightBlockIndex, PointLightBindingPoint);
  98. // Get spot light buffer's uniform block index
  99. auto spotLightBlockIndex = glGetUniformBlockIndex(m_shaderLightPass->getShaderHandle(), Config::shaderVar().spotLightBuffer.c_str());
  100. // Get spot light buffer's uniform block size
  101. glGetActiveUniformBlockiv(m_shaderLightPass->getShaderHandle(), spotLightBlockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &spotLightBlockSize);
  102. // Bind the uniform buffer at spot light binding point
  103. glUniformBlockBinding(m_shaderLightPass->getShaderHandle(), spotLightBlockIndex, SpotLightBindingPoint);
  104. // Calculate the maximum number of lights supported
  105. int maxNumPointLights = pointLightBlockSize / sizeof(PointLightDataSet);
  106. int maxNumSpotLights = spotLightBlockSize / sizeof(SpotLightDataSet);
  107. // Make sure the maximum number of lights does not exceed the supported amount
  108. if(Config::rendererVar().max_num_point_lights > maxNumPointLights)
  109. Config::m_rendererVar.max_num_point_lights = maxNumPointLights;
  110. if(Config::rendererVar().max_num_spot_lights > maxNumSpotLights)
  111. Config::m_rendererVar.max_num_spot_lights = maxNumSpotLights;
  112. // Allocate point light buffer on VRAM and bind it to uniform buffer in the shader
  113. glGenBuffers(1, &m_pointLightBufferHandle);
  114. glBindBuffer(GL_UNIFORM_BUFFER, m_pointLightBufferHandle);
  115. glBufferData(GL_UNIFORM_BUFFER, sizeof(PointLightDataSet) * Config::rendererVar().max_num_point_lights, NULL, GL_DYNAMIC_DRAW);
  116. glBindBufferBase(GL_UNIFORM_BUFFER, pointLightBlockIndex, m_pointLightBufferHandle);
  117. // Allocate spot light buffer on VRAM and bind it to uniform buffer in the shader
  118. glGenBuffers(1, &m_spotLightBufferHandle);
  119. glBindBuffer(GL_UNIFORM_BUFFER, m_spotLightBufferHandle);
  120. glBufferData(GL_UNIFORM_BUFFER, sizeof(SpotLightDataSet) * Config::rendererVar().max_num_spot_lights, NULL, GL_DYNAMIC_DRAW);
  121. glBindBufferBase(GL_UNIFORM_BUFFER, spotLightBlockIndex, m_spotLightBufferHandle);
  122. // Calculate projection matrix
  123. updateProjectionMatrix();
  124. }
  125. return returnCode;
  126. }
  127. void DeferredRenderer::beginRenderCycle(float p_deltaTime)
  128. {
  129. }
  130. void DeferredRenderer::endRenderCycle(float p_deltaTime)
  131. {
  132. }
  133. void DeferredRenderer::renderFrame(const SceneObjects &p_sceneObjects, const float p_deltaTime)
  134. {
  135. //// Load all the objects in the load-to-gpu queue. This needs to be done before any rendering, as objects in this
  136. //// array might have been also added to objects-to-render arrays, so they need to be loaded first
  137. //for(decltype(p_sceneObjects.m_objectsToLoad.size()) i = 0, size = p_sceneObjects.m_objectsToLoad.size(); i < size; i++)
  138. //{
  139. // p_sceneObjects.m_objectsToLoad[i]->loadToVideoMemory();
  140. // // In case shader failed to load or was not specified, assign a geometry shader
  141. // if(p_sceneObjects.m_objectsToLoad[i]->m_shader->isDefaultProgram())
  142. // p_sceneObjects.m_objectsToLoad[i]->m_shader = m_shaderGeometry;
  143. // else
  144. // {
  145. // p_sceneObjects.m_objectsToLoad[i]->m_shader->bind();
  146. // p_sceneObjects.m_objectsToLoad[i]->m_shader->getUniformUpdater().updateTextureUniforms(*m_rendererState);
  147. // }
  148. //}
  149. //
  150. //m_cubemap = p_sceneObjects.m_staticSkybox;
  151. //m_gbuffer->initFrame();
  152. //
  153. //m_currentCamera = p_sceneObjects.m_camera;
  154. //update();
  155. //geometryPass(p_sceneObjects, p_deltaTime);
  156. //lightingPass(p_sceneObjects, p_deltaTime);
  157. //reflectionPass(p_sceneObjects, p_deltaTime);
  158. //postLightingPass(p_sceneObjects, p_deltaTime);
  159. //
  160. //finalPass();
  161. }
  162. void DeferredRenderer::geometryPass(const SceneObjects &p_sceneObjects, const float p_deltaTime)
  163. {
  164. //m_objects.clear();
  165. //// Bind buffers
  166. //m_gbuffer->initGeometryPass();
  167. //
  168. //glEnable(GL_DEPTH_TEST); // Enable depth testing, as this is much like a regular forward render pass
  169. //glClear(GL_DEPTH_BUFFER_BIT); // Make sure to clear the depth buffer for the new frame
  170. //
  171. //m_objects.clear();
  172. //for(decltype(p_sceneObjects.m_modelObjects.size()) objIndex = 0, numObjects = p_sceneObjects.m_modelObjects.size(); objIndex < numObjects; objIndex++)
  173. // drawModelObjectTest(*p_sceneObjects.m_modelObjects[objIndex], m_shaderGeometry);
  174. //drawObjectsTest(m_objects);
  175. //return;
  176. //m_shaderGeometry->bind();
  177. //m_shaderGeometry->getUniformUpdater().updateFrame(*m_rendererState);
  178. //m_shaderGeometry->getUniformUpdater().updateTextureUniforms(*m_rendererState);
  179. //m_boundShaderHandle = m_shaderGeometry->getShaderHandle();
  180. //// Iterate over all objects to be rendered with geometry shader
  181. //for(decltype(p_sceneObjects.m_modelObjects.size()) objIndex = 0, numObjects = p_sceneObjects.m_modelObjects.size(); objIndex < numObjects; objIndex++)
  182. //{
  183. // drawModelObject(p_sceneObjects.m_modelObjects[objIndex], m_shaderGeometry);
  184. //}
  185. //// Iterate over all objects to be rendered with a custom shader
  186. //for(decltype(p_sceneObjects.m_customShaderObjects.size()) objIndex = 0, numObjects = p_sceneObjects.m_customShaderObjects.size(); objIndex < numObjects; objIndex++)
  187. //{
  188. // // If shader handle is not already bound, bind it
  189. // //if(p_sceneObjects.m_customShaderObjects[objIndex]->m_shader->getShaderHandle() != m_boundShaderHandle)
  190. // {
  191. // p_sceneObjects.m_customShaderObjects[objIndex]->m_shader->bind();
  192. // p_sceneObjects.m_customShaderObjects[objIndex]->m_shader->getUniformUpdater().updateFrame(*m_rendererState);
  193. // m_boundShaderHandle = p_sceneObjects.m_customShaderObjects[objIndex]->m_shader->getShaderHandle();
  194. // }
  195. // if(p_sceneObjects.m_customShaderObjects[objIndex]->m_shader->isTessellated())
  196. // drawTessellatedObject(p_sceneObjects.m_customShaderObjects[objIndex], p_sceneObjects.m_customShaderObjects[objIndex]->m_shader);
  197. // else
  198. // drawModelObject(p_sceneObjects.m_customShaderObjects[objIndex], p_sceneObjects.m_customShaderObjects[objIndex]->m_shader);
  199. //}
  200. // Unbind VBO so it is not changed from outside
  201. //glBindVertexArray(0);
  202. }
  203. void DeferredRenderer::lightingPass(const SceneObjects &p_sceneObjects, const float p_deltaTime)
  204. {
  205. //m_gbuffer->initLightPass();
  206. //glDisable(GL_DEPTH_TEST);
  207. //// Bind and update the point light buffer
  208. //glBindBuffer(GL_UNIFORM_BUFFER, m_pointLightBufferHandle);
  209. //glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(PointLightDataSet) * p_sceneObjects.m_pointLights.size(),
  210. // p_sceneObjects.m_pointLights.data());
  211. //// Bind and update the spot light buffer
  212. //glBindBuffer(GL_UNIFORM_BUFFER, m_spotLightBufferHandle);
  213. //glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(SpotLightDataSet) * p_sceneObjects.m_spotLights.size(),
  214. // p_sceneObjects.m_spotLights.data());
  215. //// Update the directional light data set (or clear it if there is no directional light in the scene)
  216. //if(p_sceneObjects.m_directionalLight != nullptr)
  217. // m_directionalLight = *p_sceneObjects.m_directionalLight;
  218. //else
  219. // m_directionalLight.clear();
  220. //// Update the current number of lights in the light buffers
  221. //m_numPointLights = p_sceneObjects.m_pointLights.size();
  222. //m_numSpotLights = p_sceneObjects.m_spotLights.size();
  223. //m_shaderLightPass->bind();
  224. //m_shaderLightPass->getUniformUpdater().updateTextureUniforms(*m_rendererState);
  225. //m_shaderLightPass->getUniformUpdater().updateFrame(*m_rendererState);
  226. //m_fullscreenTriangle.bind();
  227. //m_fullscreenTriangle.render();
  228. }
  229. void DeferredRenderer::postLightingPass(const SceneObjects & p_sceneObjects, const float p_deltaTime)
  230. {
  231. //glEnable(GL_DEPTH_TEST); // Enable depth testing, as this is much like a regular forward render pass
  232. //// Iterate over all objects to be rendered with a custom shader
  233. //for(decltype(p_sceneObjects.m_postLightingObjects.size()) objIndex = 0, numObjects = p_sceneObjects.m_postLightingObjects.size(); objIndex < numObjects; objIndex++)
  234. //{
  235. // // If shader handle is not already bound, bind it
  236. // //if(p_sceneObjects.m_postLightingObjects[objIndex]->m_shader->getShaderHandle() != m_boundShaderHandle)
  237. // {
  238. // p_sceneObjects.m_postLightingObjects[objIndex]->m_shader->bind();
  239. // p_sceneObjects.m_postLightingObjects[objIndex]->m_shader->getUniformUpdater().updateFrame(*m_rendererState);
  240. // p_sceneObjects.m_postLightingObjects[objIndex]->m_shader->getUniformUpdater().updateTextureUniforms(*m_rendererState);
  241. // m_boundShaderHandle = p_sceneObjects.m_postLightingObjects[objIndex]->m_shader->getShaderHandle();
  242. // }
  243. // drawModelObject(p_sceneObjects.m_postLightingObjects[objIndex], p_sceneObjects.m_postLightingObjects[objIndex]->m_shader);
  244. //}
  245. }
  246. void DeferredRenderer::reflectionPass(const SceneObjects & p_sceneObjects, const float p_deltaTime)
  247. {
  248. glEnable(GL_BLEND);
  249. glBlendFunc(GL_ONE, GL_ONE);
  250. glActiveTexture(GL_TEXTURE0 + StaticEnvMap);
  251. glBindTexture(GL_TEXTURE_CUBE_MAP, m_cubemap->getCubemapHandle());
  252. //m_shaderReflectionPass->bind();
  253. //m_shaderReflectionPass->getUniformUpdater().updateTextureUniforms(*m_rendererState);
  254. //m_shaderReflectionPass->getUniformUpdater().updateFrame(*m_rendererState);
  255. m_fullscreenTriangle.bind();
  256. m_fullscreenTriangle.render();
  257. glDisable(GL_BLEND);
  258. }
  259. void DeferredRenderer::finalPass()
  260. {
  261. m_gbuffer->initFinalPass();
  262. #ifdef SETTING_USE_BLIT_FRAMEBUFFER
  263. glBlitFramebuffer(0, 0, m_screenSize.x, m_screenSize.y,
  264. 0, 0, m_screenSize.x, m_screenSize.y, GL_COLOR_BUFFER_BIT, GL_NEAREST);
  265. #else
  266. glDisable(GL_DEPTH_TEST);
  267. //m_shaderFinalPass->bind();
  268. //m_shaderFinalPass->getUniformUpdater().updateTextureUniforms(*m_rendererState);
  269. //m_shaderFinalPass->getUniformUpdater().updateFrame(*m_rendererState);
  270. m_fullscreenTriangle.bind();
  271. m_fullscreenTriangle.render();
  272. #endif // SETTING_USE_BLIT_FRAMEBUFFER
  273. }
  274. void DeferredRenderer::update()
  275. {
  276. // If the resolution changed
  277. if(m_screenSize.x != Config::graphicsVar().current_resolution_x ||
  278. m_screenSize.y != Config::graphicsVar().current_resolution_y)
  279. {
  280. // Set the new resolution
  281. m_screenSize.x = Config::graphicsVar().current_resolution_x;
  282. m_screenSize.y = Config::graphicsVar().current_resolution_y;
  283. // Reload the geometry buffers with the new size
  284. m_gbuffer->setBufferSize((unsigned int)m_screenSize.x, (unsigned int)m_screenSize.y);
  285. // Update projection matrix and set OpenGL view-port with the new size
  286. updateProjectionMatrix();
  287. glViewport(0, 0, m_screenSize.x, m_screenSize.y);
  288. }
  289. m_viewProjMatrix = m_projMatrix * m_currentCamera->getBaseObjectData().m_modelMat;
  290. }
  291. void DeferredRenderer::drawModelObject(const RenderableObjectData *p_renderableObject, const ShaderLoader::ShaderProgram *p_shader)
  292. {
  293. //// Assign a current base object data
  294. //m_currentObjectData = &(p_renderableObject->m_baseObjectData);
  295. //
  296. //// Calculate matrices
  297. //m_modelViewMatrix = m_currentCamera->getBaseObjectData().m_modelMat * m_currentObjectData->m_modelMat;
  298. //m_modelViewProjMatrix = m_projMatrix * m_modelViewMatrix;
  299. //// Update per-model uniforms
  300. //p_shader->getUniformUpdater().updateModel(*m_rendererState);
  301. //
  302. //// Bind model's VAO
  303. //glBindVertexArray(p_renderableObject->m_model.getHandle());
  304. //// Iterate over all the meshes in the model
  305. //for(decltype(p_renderableObject->m_model.getNumMeshes()) meshIndex = 0, numMeshes = p_renderableObject->m_model.getNumMeshes(); meshIndex < numMeshes; meshIndex++)
  306. //{
  307. // // Update per-mesh uniforms
  308. // p_shader->getUniformUpdater().updateMesh(*m_rendererState);
  309. // // Iterate over all materials and bind them
  310. // for(int matType = 0; matType < Model::NumOfModelMaterials; matType++)
  311. // {
  312. // // Get texture handle
  313. // unsigned int textureHandle = p_renderableObject->m_materials[matType][p_renderableObject->m_model[meshIndex].m_materialIndex].getHandle();
  314. // // If texture handle is not already bound, bind it
  315. // //if(textureHandle != m_boundTextureHandles[matType])
  316. // //{
  317. // glActiveTexture(GL_TEXTURE0 + matType);
  318. // glBindTexture(GL_TEXTURE_2D, textureHandle);
  319. // // m_boundTextureHandles[matType] = textureHandle;
  320. // //}
  321. // }
  322. //
  323. // // Draw the actual geometry
  324. // glDrawElementsBaseVertex(GL_TRIANGLES,
  325. // p_renderableObject->m_model[meshIndex].m_numIndices,
  326. // GL_UNSIGNED_INT,
  327. // (void*)(sizeof(unsigned int) * p_renderableObject->m_model[meshIndex].m_baseIndex),
  328. // p_renderableObject->m_model[meshIndex].m_baseVertex);
  329. //}
  330. }
  331. void DeferredRenderer::drawTessellatedObject(const RenderableObjectData *p_renderableObject, const ShaderLoader::ShaderProgram *p_shader)
  332. {
  333. //glPatchParameteri(GL_PATCH_VERTICES, 3);
  334. //// Assign a current base object data
  335. //m_currentObjectData = &(p_renderableObject->m_baseObjectData);
  336. //// Calculate matrices
  337. //m_modelViewMatrix = m_currentCamera->getBaseObjectData().m_modelMat * m_currentObjectData->m_modelMat;
  338. //m_modelViewProjMatrix = m_projMatrix * m_modelViewMatrix;
  339. //// Update per-model uniforms
  340. //p_shader->getUniformUpdater().updateModel(*m_rendererState);
  341. ////p_shader->getUniformUpdater().updateTextureUniforms(*m_rendererState);
  342. //// Bind model's VAO
  343. //glBindVertexArray(p_renderableObject->m_model.getHandle());
  344. //// Iterate over all the meshes in the model
  345. //for(decltype(p_renderableObject->m_model.getNumMeshes()) meshIndex = 0, numMeshes = p_renderableObject->m_model.getNumMeshes(); meshIndex < numMeshes; meshIndex++)
  346. //{
  347. // // Update per-mesh uniforms
  348. // p_shader->getUniformUpdater().updateMesh(*m_rendererState);
  349. // // Iterate over all materials and bind them
  350. // for(int matType = 0; matType < Model::NumOfModelMaterials; matType++)
  351. // {
  352. // // Get texture handle
  353. // unsigned int textureHandle = p_renderableObject->m_materials[matType][p_renderableObject->m_model[meshIndex].m_materialIndex].getHandle();
  354. // // If texture handle is not already bound, bind it
  355. // //if(textureHandle != m_boundTextureHandles[matType])
  356. // {
  357. // glActiveTexture(GL_TEXTURE0 + matType);
  358. // glBindTexture(GL_TEXTURE_2D, textureHandle);
  359. // m_boundTextureHandles[matType] = textureHandle;
  360. // }
  361. // }
  362. // // Draw the actual geometry
  363. // glDrawElementsBaseVertex(GL_PATCHES,
  364. // p_renderableObject->m_model[meshIndex].m_numIndices,
  365. // GL_UNSIGNED_INT,
  366. // (void*)(sizeof(unsigned int) * p_renderableObject->m_model[meshIndex].m_baseIndex),
  367. // p_renderableObject->m_model[meshIndex].m_baseVertex);
  368. //}
  369. }
  370. void DeferredRenderer::drawModelObjectTest(const RenderableObjectData &p_object, const ShaderLoader::ShaderProgram *p_shader)
  371. {
  372. ////m_objects.emplace_back(0, RendererBackend::RenderDataset());
  373. //const unsigned int shaderHandle = p_shader->getShaderHandle();
  374. //const unsigned int modelHandle = p_object.m_model.getHandle();
  375. //const ShaderUniformUpdater &uniformUpdater = p_shader->getUniformUpdater();
  376. //for(decltype(p_object.m_model.getNumMeshes()) meshIndex = 0, numMeshes = p_object.m_model.getNumMeshes(); meshIndex < numMeshes; meshIndex++)
  377. //{
  378. // m_objects.emplace_back(0, RendererBackend::DrawCommand(
  379. // uniformUpdater,
  380. //
  381. // shaderHandle,
  382. // modelHandle,
  383. // p_object.m_model[meshIndex].m_numIndices,
  384. // p_object.m_model[meshIndex].m_baseVertex,
  385. // p_object.m_model[meshIndex].m_baseIndex
  386. // ));
  387. //}
  388. /*
  389. // Declare temp values used for indexing
  390. size_t shaderIndex = 0;
  391. size_t modelIndex = 0;
  392. // Get different object handles
  393. //auto shaderHandle = p_object.m_shader->getShaderHandle();
  394. auto shaderHandle = p_shader->getShaderHandle();
  395. auto modelVAOHandle = p_object.m_model.getHandle();
  396. // Loop through the shader array, to check if the current shader has already been added
  397. for(shaderIndex = 0; shaderIndex < m_objects.m_numShaders; shaderIndex++)
  398. if(m_objects.m_shaders[shaderIndex].m_shaderHandle == shaderHandle)
  399. break;
  400. // If the shader has not been added already, add it
  401. if(m_objects.m_shaders.empty() || m_objects.m_shaders[shaderIndex].m_shaderHandle != shaderHandle)
  402. {
  403. // Assign correct shader index
  404. shaderIndex = m_objects.m_shaders.size();
  405. // Add the current shader to the array
  406. //m_objects.m_shaders.push_back(RendererBackend::RendererShader(p_object.m_shader->getUniformUpdater(), shaderHandle));
  407. m_objects.m_shaders.push_back(RendererBackend::RendererShader(p_shader->getUniformUpdater(), shaderHandle));
  408. // Increment shader count
  409. m_objects.m_numShaders++;
  410. }
  411. // If the shader is not the first one in the shader array,
  412. // assign model index depending on the number of models from previous shader
  413. modelIndex = shaderIndex > 0 ? m_objects.m_shaders[shaderIndex - 1].m_numModels - 1 : 0;
  414. // Loop through the model array, to check if the current model has already been added
  415. for(; modelIndex < m_objects.m_shaders[shaderIndex].m_numModels; modelIndex++)
  416. if(m_objects.m_models[modelIndex].m_VAO == modelVAOHandle)
  417. break;
  418. // If the model has not been added already, add it
  419. if(m_objects.m_models.empty() || m_objects.m_models[modelIndex].m_VAO != modelVAOHandle)
  420. {
  421. // Assign correct model index
  422. modelIndex = m_objects.m_models.size();
  423. // Add the current model to the array
  424. m_objects.m_models.push_back(RendererBackend::RendererModel());
  425. // Increment model count
  426. m_objects.m_shaders[shaderIndex].m_numModels++;
  427. }
  428. for(decltype(p_object.m_model.getNumMeshes()) meshIndex = 0, numMeshes = p_object.m_model.getNumMeshes(); meshIndex < numMeshes; meshIndex++)
  429. {
  430. m_objects.m_meshes.push_back(RendererBackend::RendererMesh(p_object.m_model[meshIndex]));
  431. }
  432. m_objects.m_models[modelIndex].m_numMeshes += p_object.m_model.getNumMeshes() - 1;*/
  433. }
  434. void DeferredRenderer::drawObjectsTest(const RendererBackend::DrawCommands &p_objects)
  435. {
  436. for(decltype(p_objects.size()) i = 0, size = p_objects.size(); i < size; i++)
  437. {
  438. // Bind shader
  439. glUseProgram(p_objects[i].second.m_shaderHandle);
  440. //m_currentObjectData = &(p_objects[i].first);
  441. // Calculate matrices
  442. //m_modelViewMatrix = m_currentCamera->getBaseObjectData().m_modelMat * m_currentObjectData->m_modelMat;
  443. //m_modelViewProjMatrix = m_projMatrix * m_modelViewMatrix;
  444. //p_objects[i].second.m_uniformUpdater.updateTextureUniforms(*m_rendererState);
  445. //p_objects[i].second.m_uniformUpdater.updateFrame(*m_rendererState);
  446. //p_objects[i].second.m_uniformUpdater.updateModel(*m_rendererState);
  447. // Bind model's VAO
  448. glBindVertexArray(p_objects[i].second.m_modelHandle);
  449. // Draw the actual geometry
  450. glDrawElementsBaseVertex(GL_TRIANGLES,
  451. p_objects[i].second.m_numIndices,
  452. GL_UNSIGNED_INT,
  453. (void*)(sizeof(unsigned int) * p_objects[i].second.m_baseIndex),
  454. p_objects[i].second.m_baseVertex);
  455. }
  456. /*for(decltype(p_objects.m_numShaders) shaderIndex = 0; shaderIndex < p_objects.m_numShaders; shaderIndex++)
  457. {
  458. // Bind shader
  459. glUseProgram(p_objects.m_shaders[shaderIndex].m_shaderHandle);
  460. p_objects.m_shaders[shaderIndex].m_uniformUpdater.updateTextureUniforms(*m_rendererState);
  461. p_objects.m_shaders[shaderIndex].m_uniformUpdater.updateFrame(*m_rendererState);
  462. p_objects.m_shaders[shaderIndex].m_uniformUpdater.updateModel(*m_rendererState);
  463. for(decltype(p_objects.m_shaders[shaderIndex].m_numModels) modelIndex = 0; modelIndex < p_objects.m_shaders[shaderIndex].m_numModels; modelIndex++)
  464. {
  465. // Bind model's VAO
  466. glBindVertexArray(p_objects.m_models[modelIndex].m_VAO);
  467. for(decltype(p_objects.m_models[modelIndex].m_numMeshes) meshIndex = 0; meshIndex < p_objects.m_models[modelIndex].m_numMeshes; meshIndex++)
  468. {
  469. // Draw the actual geometry
  470. glDrawElementsBaseVertex(GL_TRIANGLES,
  471. p_objects.m_meshes[meshIndex].m_mesh.m_numIndices,
  472. GL_UNSIGNED_INT,
  473. (void*)(sizeof(unsigned int) * p_objects.m_meshes[meshIndex].m_mesh.m_baseIndex),
  474. p_objects.m_meshes[meshIndex].m_mesh.m_baseVertex);
  475. }
  476. }
  477. }*/
  478. }