From e5650698d2bd132c04d48e88677b19f93d36f27c Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 27 Dec 2012 22:22:11 +0100 Subject: [PATCH] Added copy/move constructor/operator to Material Former-commit-id: a96676391754ee027bdd6c7b04118db3ea044eb3 --- include/Nazara/Renderer/Material.hpp | 5 +++ src/Nazara/Renderer/Material.cpp | 63 ++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/include/Nazara/Renderer/Material.hpp b/include/Nazara/Renderer/Material.hpp index 52638ab48..9b1422618 100644 --- a/include/Nazara/Renderer/Material.hpp +++ b/include/Nazara/Renderer/Material.hpp @@ -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: diff --git a/src/Nazara/Renderer/Material.cpp b/src/Nazara/Renderer/Material.cpp index 7bdbe6064..195667220 100644 --- a/src/Nazara/Renderer/Material.cpp +++ b/src/Nazara/Renderer/Material.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include 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;