Added copy/move constructor/operator to Material

Former-commit-id: a96676391754ee027bdd6c7b04118db3ea044eb3
This commit is contained in:
Lynix 2012-12-27 22:22:11 +01:00
parent 91b85589d9
commit e5650698d2
2 changed files with 68 additions and 0 deletions

View File

@ -32,6 +32,8 @@ class NAZARA_API NzMaterial : public NzResource
public:
NzMaterial();
NzMaterial(const NzMaterial& material);
NzMaterial(NzMaterial&& material);
~NzMaterial();
void Apply() const;
@ -81,6 +83,9 @@ class NAZARA_API NzMaterial : public NzResource
void SetSrcBlend(nzBlendFunc func);
void SetZTestCompare(nzRendererComparison compareFunc);
NzMaterial& operator=(const NzMaterial& material);
NzMaterial& operator=(NzMaterial&& material);
static const NzMaterial* GetDefault();
private:

View File

@ -5,6 +5,7 @@
#include <Nazara/Renderer/Material.hpp>
#include <Nazara/Renderer/Renderer.hpp>
#include <Nazara/Renderer/Shader.hpp>
#include <cstring>
#include <Nazara/Renderer/Debug.hpp>
bool NzMaterialParams::IsValid() const
@ -19,6 +20,32 @@ m_specularMap(nullptr)
Reset();
}
NzMaterial::NzMaterial(const NzMaterial& material)
{
std::memcpy(this, &material, sizeof(NzMaterial)); // Autorisé dans notre cas, et plus rapide
if (m_diffuseMap)
m_diffuseMap->AddResourceReference();
if (m_specularMap)
m_specularMap->AddResourceReference();
}
NzMaterial::NzMaterial(NzMaterial&& material)
{
if (m_diffuseMap)
m_diffuseMap->RemoveResourceReference();
if (m_specularMap)
m_specularMap->RemoveResourceReference();
std::memcpy(this, &material, sizeof(NzMaterial)); // Autorisé dans notre cas, et plus rapide
// Comme ça nous volons la référence du matériau
material.m_diffuseMap = nullptr;
material.m_specularMap = nullptr;
}
NzMaterial::~NzMaterial()
{
if (m_diffuseMap)
@ -325,6 +352,42 @@ void NzMaterial::SetZTestCompare(nzRendererComparison compareFunc)
m_zTestEnabled = compareFunc;
}
NzMaterial& NzMaterial::operator=(const NzMaterial& material)
{
if (m_diffuseMap)
m_diffuseMap->RemoveResourceReference();
if (m_specularMap)
m_specularMap->RemoveResourceReference();
std::memcpy(this, &material, sizeof(NzMaterial)); // Autorisé dans notre cas, et plus rapide
if (m_diffuseMap)
m_diffuseMap->AddResourceReference();
if (m_specularMap)
m_specularMap->AddResourceReference();
return *this;
}
NzMaterial& NzMaterial::operator=(NzMaterial&& material)
{
if (m_diffuseMap)
m_diffuseMap->RemoveResourceReference();
if (m_specularMap)
m_specularMap->RemoveResourceReference();
std::memcpy(this, &material, sizeof(NzMaterial)); // Autorisé dans notre cas, et plus rapide
// Comme ça nous volons la référence du matériau
material.m_diffuseMap = nullptr;
material.m_specularMap = nullptr;
return *this;
}
const NzMaterial* NzMaterial::GetDefault()
{
static NzMaterial defaultMaterial;