From 245d6e105e02d8453077d7d409efb7c6c46d509a Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 26 Jun 2013 15:20:07 +0200 Subject: [PATCH] Experimental new algorithm to sort transparents objets Former-commit-id: ad8704584598e1edcd3699d234abaa132d88e581 --- .../Nazara/Graphics/ForwardRenderQueue.hpp | 2 ++ src/Nazara/Graphics/ForwardRenderQueue.cpp | 22 ++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/Nazara/Graphics/ForwardRenderQueue.hpp b/include/Nazara/Graphics/ForwardRenderQueue.hpp index 4c83d4245..e9037e5be 100644 --- a/include/Nazara/Graphics/ForwardRenderQueue.hpp +++ b/include/Nazara/Graphics/ForwardRenderQueue.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -57,6 +58,7 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue struct TransparentModel { + NzBoxf aabb; NzMatrix4f transformMatrix; NzMaterial* material; }; diff --git a/src/Nazara/Graphics/ForwardRenderQueue.cpp b/src/Nazara/Graphics/ForwardRenderQueue.cpp index f5f0dfce4..b65319e1e 100644 --- a/src/Nazara/Graphics/ForwardRenderQueue.cpp +++ b/src/Nazara/Graphics/ForwardRenderQueue.cpp @@ -107,6 +107,8 @@ void NzForwardRenderQueue::AddModel(const NzModel* model) transparentStaticModels.resize(index+1); TransparentStaticModel& data = transparentStaticModels.back(); + data.aabb = staticMesh->GetAABB(); + data.aabb.Transform(transformMatrix); data.material = material; data.mesh = staticMesh; data.transformMatrix = transformMatrix; @@ -139,22 +141,26 @@ void NzForwardRenderQueue::Sort(const NzCamera& camera) { bool operator()(const std::pair& index1, const std::pair& index2) { - const NzMatrix4f& matrix1 = (index1.second) ? - queue->transparentStaticModels[index1.first].transformMatrix : - queue->transparentSkeletalModels[index1.first].transformMatrix; + const NzBoxf& aabb1 = (index1.second) ? + queue->transparentStaticModels[index1.first].aabb : + queue->transparentSkeletalModels[index1.first].aabb; - const NzMatrix4f& matrix2 = (index1.second) ? - queue->transparentStaticModels[index2.first].transformMatrix : - queue->transparentSkeletalModels[index2.first].transformMatrix; + const NzBoxf& aabb2 = (index1.second) ? + queue->transparentStaticModels[index2.first].aabb : + queue->transparentSkeletalModels[index2.first].aabb; - return nearPlane.Distance(matrix1.GetTranslation()) < nearPlane.Distance(matrix2.GetTranslation()); + NzVector3f position1 = aabb1.GetNegativeVertex(cameraNormal); + NzVector3f position2 = aabb2.GetNegativeVertex(cameraNormal); + + return nearPlane.Distance(position1) < nearPlane.Distance(position2); } NzForwardRenderQueue* queue; NzPlanef nearPlane; + NzVector3f cameraNormal; }; - TransparentModelComparator comparator {this, camera.GetFrustum().GetPlane(nzFrustumPlane_Near)}; + TransparentModelComparator comparator {this, camera.GetFrustum().GetPlane(nzFrustumPlane_Near), camera.GetForward()}; std::sort(visibleTransparentsModels.begin(), visibleTransparentsModels.end(), comparator); }