Fixed leaks

Former-commit-id: 61b219e69fb048eef08ce03dca3a9cb2741760b4
This commit is contained in:
Lynix 2013-07-09 01:13:14 +02:00
parent 87a4da40bc
commit 18cc3b16df
2 changed files with 65 additions and 22 deletions

View File

@ -26,7 +26,7 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue, NzResource
public: public:
NzForwardRenderQueue() = default; NzForwardRenderQueue() = default;
~NzForwardRenderQueue() = default; ~NzForwardRenderQueue();
void AddDrawable(const NzDrawable* drawable); void AddDrawable(const NzDrawable* drawable);
void AddLight(const NzLight* light); void AddLight(const NzLight* light);
@ -39,14 +39,6 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue, NzResource
private: private:
void OnResourceDestroy(const NzResource* resource, int index); void OnResourceDestroy(const NzResource* resource, int index);
struct BillboardData
{
NzColor color;
NzVector3f position;
NzVector2f size;
float rotation;
};
struct MaterialComparator struct MaterialComparator
{ {
bool operator()(const NzMaterial* mat1, const NzMaterial* mat2); bool operator()(const NzMaterial* mat1, const NzMaterial* mat2);
@ -85,17 +77,18 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue, NzResource
NzStaticMesh* mesh; NzStaticMesh* mesh;
}; };
typedef std::map<NzSkeletalMesh*, std::vector<SkeletalData>, SkeletalMeshComparator> SkeletalMeshContainer; typedef std::map<const NzSkeletalMesh*, std::vector<SkeletalData>, SkeletalMeshComparator> SkeletalMeshContainer;
typedef std::map<NzStaticMesh*, std::vector<NzMatrix4f>, StaticMeshComparator> StaticMeshContainer; typedef std::map<const NzStaticMesh*, std::vector<NzMatrix4f>, StaticMeshComparator> StaticMeshContainer;
typedef std::map<const NzMaterial*, std::pair<SkeletalMeshContainer, StaticMeshContainer>, MaterialComparator> MeshContainer;
std::map<NzMaterial*, std::vector<BillboardData>, MaterialComparator> billboards; std::map<const NzMaterial*, std::vector<BillboardData>, MaterialComparator> billboards;
std::map<NzMaterial*, std::pair<SkeletalMeshContainer, StaticMeshContainer>, MaterialComparator> visibleModels; MeshContainer opaqueModels;
std::vector<std::pair<unsigned int, bool>> visibleTransparentsModels; std::vector<std::pair<unsigned int, bool>> transparentsModels;
std::vector<TransparentSkeletalModel> transparentSkeletalModels; std::vector<TransparentSkeletalModel> transparentSkeletalModels;
std::vector<TransparentStaticModel> transparentStaticModels; std::vector<TransparentStaticModel> transparentStaticModels;
std::vector<const NzDrawable*> otherDrawables; std::vector<const NzDrawable*> otherDrawables;
std::vector<const NzLight*> directionnalLights; std::vector<const NzLight*> directionnalLights;
std::vector<const NzLight*> visibleLights; std::vector<const NzLight*> lights;
}; };
#endif // NAZARA_FORWARDRENDERQUEUE_HPP #endif // NAZARA_FORWARDRENDERQUEUE_HPP

View File

@ -11,6 +11,21 @@
#include <Nazara/Utility/StaticMesh.hpp> #include <Nazara/Utility/StaticMesh.hpp>
#include <Nazara/Graphics/Debug.hpp> #include <Nazara/Graphics/Debug.hpp>
namespace
{
enum ResourceType
{
ResourceType_Material,
ResourceType_SkeletalMesh,
ResourceType_StaticMesh
};
}
NzForwardRenderQueue::~NzForwardRenderQueue()
{
Clear(true);
}
void NzForwardRenderQueue::AddDrawable(const NzDrawable* drawable) void NzForwardRenderQueue::AddDrawable(const NzDrawable* drawable)
{ {
#if NAZARA_GRAPHICS_SAFE #if NAZARA_GRAPHICS_SAFE
@ -42,7 +57,7 @@ void NzForwardRenderQueue::AddLight(const NzLight* light)
case nzLightType_Point: case nzLightType_Point:
case nzLightType_Spot: case nzLightType_Spot:
visibleLights.push_back(light); lights.push_back(light);
break; break;
#ifdef NAZARA_DEBUG #ifdef NAZARA_DEBUG
@ -113,10 +128,22 @@ void NzForwardRenderQueue::AddModel(const NzModel* model)
data.mesh = staticMesh; data.mesh = staticMesh;
data.transformMatrix = transformMatrix; data.transformMatrix = transformMatrix;
visibleTransparentsModels.push_back(std::make_pair(index, true)); transparentsModels.push_back(std::make_pair(index, true));
} }
else else
visibleModels[material].second[staticMesh].push_back(transformMatrix); {
auto pair = opaqueModels.insert(std::make_pair(material, MeshContainer::mapped_type()));
if (pair.second)
material->AddResourceListener(this, ResourceType_Material);
auto& meshMap = pair.first->second.second;
auto pair2 = meshMap.insert(std::make_pair(staticMesh, StaticMeshContainer::mapped_type()));
if (pair2.second)
staticMesh->AddResourceListener(this, ResourceType_StaticMesh);
pair2.first->second.push_back(transformMatrix);
}
break; break;
} }
@ -127,14 +154,14 @@ void NzForwardRenderQueue::AddModel(const NzModel* model)
void NzForwardRenderQueue::Clear(bool fully) void NzForwardRenderQueue::Clear(bool fully)
{ {
directionnalLights.clear(); directionnalLights.clear();
lights.clear();
otherDrawables.clear(); otherDrawables.clear();
visibleLights.clear(); transparentsModels.clear();
visibleTransparentsModels.clear();
transparentSkeletalModels.clear(); transparentSkeletalModels.clear();
transparentStaticModels.clear(); transparentStaticModels.clear();
if (fully) if (fully)
visibleModels.clear(); opaqueModels.clear();
} }
void NzForwardRenderQueue::Sort(const NzCamera& camera) void NzForwardRenderQueue::Sort(const NzCamera& camera)
@ -163,12 +190,35 @@ void NzForwardRenderQueue::Sort(const NzCamera& camera)
}; };
TransparentModelComparator comparator {this, camera.GetFrustum().GetPlane(nzFrustumPlane_Near), camera.GetForward()}; TransparentModelComparator comparator {this, camera.GetFrustum().GetPlane(nzFrustumPlane_Near), camera.GetForward()};
std::sort(visibleTransparentsModels.begin(), visibleTransparentsModels.end(), comparator); std::sort(transparentsModels.begin(), transparentsModels.end(), comparator);
} }
void NzForwardRenderQueue::OnResourceDestroy(const NzResource* resource, int index) void NzForwardRenderQueue::OnResourceDestroy(const NzResource* resource, int index)
{ {
switch (index)
{
case ResourceType_Material:
opaqueModels.erase(static_cast<const NzMaterial*>(resource));
break;
case ResourceType_SkeletalMesh:
{
for (auto& pair : opaqueModels)
pair.second.first.erase(static_cast<const NzSkeletalMesh*>(resource));
break;
}
case ResourceType_StaticMesh:
{
for (auto& pair : opaqueModels)
pair.second.second.erase(static_cast<const NzStaticMesh*>(resource));
break;
}
}
resource->RemoveResourceListener(this);
} }
bool NzForwardRenderQueue::SkeletalMeshComparator::operator()(const NzSkeletalMesh* subMesh1, const NzSkeletalMesh* subMesh2) bool NzForwardRenderQueue::SkeletalMeshComparator::operator()(const NzSkeletalMesh* subMesh1, const NzSkeletalMesh* subMesh2)