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

@@ -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;