Fixed leaks
Former-commit-id: 61b219e69fb048eef08ce03dca3a9cb2741760b4
This commit is contained in:
parent
87a4da40bc
commit
18cc3b16df
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue