From f77bef6b28113e497497d1e6e1d3723188e3c2b7 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sun, 11 Jul 2021 15:43:39 -0400 Subject: [PATCH] Depth sorting --- Nuake/src/Scene/Scene.cpp | 92 ++++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 15 deletions(-) diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index 047c3ebb..a4940d2a 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -142,6 +142,18 @@ void Scene::UpdatePositions() } } +struct BSPDrawObject +{ + float distance; + BSPBrushComponent brush; + Matrix4 transform; +}; + +bool DepthSort(BSPDrawObject& one, BSPDrawObject& two) +{ + return one.distance < two.distance; +} + void Scene::DrawShadows() { auto modelView = m_Registry.view(); @@ -179,15 +191,35 @@ void Scene::DrawShadows() Renderer::m_ShadowmapShader->SetUniformMat4f("model", transform.GetTransform()); model.Draw(); } + std::vector sortedBrushes = std::vector(); Renderer::m_ShadowmapShader->SetUniformMat4f("lightSpaceMatrix", light.mViewProjections[i]); auto quakeView = m_Registry.view(); for (auto e : quakeView) { auto [transform, model] = quakeView.get(e); Renderer::m_ShadowmapShader->SetUniformMat4f("model", transform.GetTransform()); + if (model.IsTransparent) continue; - for (auto& e : model.Meshes) { + + float dist = glm::length(transform.GlobalTranslation - cam->GetTranslation()); + sortedBrushes.push_back({ + dist, + model, + transform.GetTransform() + }); + + //for (auto& e : model.Meshes) { + // e->Draw(false); + //} + } + + std::sort(sortedBrushes.begin(), sortedBrushes.end(), DepthSort); + + for (auto& b : sortedBrushes) + { + Renderer::m_ShadowmapShader->SetUniformMat4f("model", b.transform); + for (auto& e : b.brush.Meshes) { e->Draw(false); } } @@ -204,6 +236,8 @@ void Scene::DrawInterface(Vector2 screensize) } } + + void Scene::Draw() { // Find the camera of the scene. @@ -224,8 +258,8 @@ void Scene::Draw() if (env->ProceduralSkybox) { env->ProceduralSkybox->Draw(cam); - } + Renderer::m_Shader->Bind(); env->Push(); glEnable(GL_DEPTH_TEST); @@ -260,22 +294,35 @@ void Scene::Draw() model.Draw(); } + + std::vector sortedBrushes = std::vector(); + auto quakeView = m_Registry.view(); for (auto e : quakeView) { auto [transform, model, parent] = quakeView.get(e); if (model.IsTransparent) continue; - Renderer::m_Shader->SetUniformMat4f("u_View", cam->GetTransform()); - Renderer::m_Shader->SetUniformMat4f("u_Projection", cam->GetPerspective()); - Renderer::m_Shader->SetUniformMat4f("u_Model", transform.GetTransform()); - - for (auto& e : model.Meshes) - { - e->Draw(); - } + float dist = glm::length(transform.GlobalTranslation - cam->GetTranslation()); + sortedBrushes.push_back({ + dist, + model, + transform.GetTransform() + }); } + std::sort(sortedBrushes.begin(), sortedBrushes.end(), DepthSort); + + for (auto& b : sortedBrushes) + { + Renderer::m_Shader->SetUniformMat4f("u_View", cam->GetTransform()); + Renderer::m_Shader->SetUniformMat4f("u_Projection", cam->GetPerspective()); + Renderer::m_Shader->SetUniformMat4f("u_Model", b.transform); + + for (auto& e : b.brush.Meshes) + e->Draw(); + } + Renderer::m_DebugShader->SetUniformMat4f("u_View", cam->GetTransform()); Renderer::m_DebugShader->SetUniformMat4f("u_Projection", cam->GetPerspective()); @@ -328,6 +375,9 @@ void Scene::EditorDraw() model.Draw(); } + std::vector sortedBrushes = std::vector(); + + auto quakeView = m_Registry.view(); for (auto e : quakeView) { auto [transform, model, parent] = quakeView.get(e); @@ -335,15 +385,27 @@ void Scene::EditorDraw() if (model.IsTransparent) continue; + float dist = glm::length(transform.GlobalTranslation - m_EditorCamera->GetTranslation()); + sortedBrushes.push_back({ + dist, + model, + transform.GetTransform() + }); + Renderer::m_Shader->SetUniformMat4f("u_View", m_EditorCamera->GetTransform()); Renderer::m_Shader->SetUniformMat4f("u_Projection", m_EditorCamera->GetPerspective()); - Renderer::m_Shader->SetUniformMat4f("u_Model", transform.GetTransform()); - - for (auto& e : model.Meshes) { - e->Draw(); - } } + + std::sort(sortedBrushes.begin(), sortedBrushes.end(), DepthSort); + for (auto& b : sortedBrushes) + { + Renderer::m_Shader->SetUniformMat4f("u_Model", b.transform); + + for (auto& d : b.brush.Meshes) + d->Draw(); + } + Renderer::m_DebugShader->Bind(); auto boxCollider = m_Registry.view(); for (auto e : boxCollider) {