From 36f8631028e2961f583fcac1c5efc8d6a5f3ee60 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Apr 2013 14:26:14 +0200 Subject: [PATCH] Added user-friendly method for accessing materials Former-commit-id: 6f254ea6e324b3467a811ba5282f67b6ea078d51 --- include/Nazara/Graphics/Model.hpp | 4 ++ src/Nazara/Graphics/Model.cpp | 114 ++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/include/Nazara/Graphics/Model.hpp b/include/Nazara/Graphics/Model.hpp index 505aca95d..bff162ee0 100644 --- a/include/Nazara/Graphics/Model.hpp +++ b/include/Nazara/Graphics/Model.hpp @@ -49,7 +49,9 @@ class NAZARA_API NzModel : public NzSceneNode, public NzUpdatable NzAnimation* GetAnimation() const; const NzBoundingBoxf& GetBoundingBox() const; + NzMaterial* GetMaterial(const NzString& subMeshName) const; NzMaterial* GetMaterial(unsigned int matIndex) const; + NzMaterial* GetMaterial(unsigned int skinIndex, const NzString& subMeshName) const; NzMaterial* GetMaterial(unsigned int skinIndex, unsigned int matIndex) const; unsigned int GetMaterialCount() const; unsigned int GetSkin() const; @@ -71,7 +73,9 @@ class NAZARA_API NzModel : public NzSceneNode, public NzUpdatable void Reset(); bool SetAnimation(NzAnimation* animation); + bool SetMaterial(const NzString& subMeshName, NzMaterial* material); void SetMaterial(unsigned int matIndex, NzMaterial* material); + bool SetMaterial(unsigned int skinIndex, const NzString& subMeshName, NzMaterial* material); void SetMaterial(unsigned int skinIndex, unsigned int matIndex, NzMaterial* material); void SetMesh(NzMesh* mesh); bool SetSequence(const NzString& sequenceName); diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index a069530a1..10ba81fec 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -179,6 +179,33 @@ const NzBoundingBoxf& NzModel::GetBoundingBox() const return m_boundingBox; } +NzMaterial* NzModel::GetMaterial(const NzString& subMeshName) const +{ + #if NAZARA_GRAPHICS_SAFE + if (!m_mesh) + { + NazaraError("Model has no mesh"); + return nullptr; + } + #endif + + NzSubMesh* subMesh = m_mesh->GetSubMesh(subMeshName); + if (!subMesh) + { + NazaraError("Mesh has no submesh \"" + subMeshName + '"'); + return nullptr; + } + + unsigned int matIndex = subMesh->GetMaterialIndex(); + if (matIndex >= m_matCount) + { + NazaraError("Material index out of range (" + NzString::Number(matIndex) + " >= " + NzString::Number(m_matCount)); + return nullptr; + } + + return m_materials[m_skin*m_matCount + matIndex]; +} + NzMaterial* NzModel::GetMaterial(unsigned int matIndex) const { #if NAZARA_GRAPHICS_SAFE @@ -192,6 +219,33 @@ NzMaterial* NzModel::GetMaterial(unsigned int matIndex) const return m_materials[m_skin*m_matCount + matIndex]; } +NzMaterial* NzModel::GetMaterial(unsigned int skinIndex, const NzString& subMeshName) const +{ + #if NAZARA_GRAPHICS_SAFE + if (skinIndex >= m_skinCount) + { + NazaraError("Skin index out of range (" + NzString::Number(skinIndex) + " >= " + NzString::Number(m_skinCount)); + return nullptr; + } + #endif + + NzSubMesh* subMesh = m_mesh->GetSubMesh(subMeshName); + if (!subMesh) + { + NazaraError("Mesh has no submesh \"" + subMeshName + '"'); + return nullptr; + } + + unsigned int matIndex = subMesh->GetMaterialIndex(); + if (matIndex >= m_matCount) + { + NazaraError("Material index out of range (" + NzString::Number(matIndex) + " >= " + NzString::Number(m_matCount)); + return nullptr; + } + + return m_materials[skinIndex*m_matCount + matIndex]; +} + NzMaterial* NzModel::GetMaterial(unsigned int skinIndex, unsigned int matIndex) const { #if NAZARA_GRAPHICS_SAFE @@ -342,6 +396,32 @@ bool NzModel::SetAnimation(NzAnimation* animation) return true; } +bool NzModel::SetMaterial(const NzString& subMeshName, NzMaterial* material) +{ + NzSubMesh* subMesh = m_mesh->GetSubMesh(subMeshName); + if (!subMesh) + { + NazaraError("Mesh has no submesh \"" + subMeshName + '"'); + return false; + } + + unsigned int matIndex = subMesh->GetMaterialIndex(); + if (matIndex >= m_matCount) + { + NazaraError("Material index out of range (" + NzString::Number(matIndex) + " >= " + NzString::Number(m_matCount)); + return false; + } + + unsigned int index = m_skin*m_matCount + matIndex; + + if (material) + m_materials[index] = material; + else + m_materials[index] = NzMaterial::GetDefault(); + + return true; +} + void NzModel::SetMaterial(unsigned int matIndex, NzMaterial* material) { #if NAZARA_GRAPHICS_SAFE @@ -360,6 +440,40 @@ void NzModel::SetMaterial(unsigned int matIndex, NzMaterial* material) m_materials[index] = NzMaterial::GetDefault(); } +bool NzModel::SetMaterial(unsigned int skinIndex, const NzString& subMeshName, NzMaterial* material) +{ + #if NAZARA_GRAPHICS_SAFE + if (skinIndex >= m_skinCount) + { + NazaraError("Skin index out of range (" + NzString::Number(skinIndex) + " >= " + NzString::Number(m_skinCount)); + return false; + } + #endif + + NzSubMesh* subMesh = m_mesh->GetSubMesh(subMeshName); + if (!subMesh) + { + NazaraError("Mesh has no submesh \"" + subMeshName + '"'); + return false; + } + + unsigned int matIndex = subMesh->GetMaterialIndex(); + if (matIndex >= m_matCount) + { + NazaraError("Material index out of range (" + NzString::Number(matIndex) + " >= " + NzString::Number(m_matCount)); + return false; + } + + unsigned int index = skinIndex*m_matCount + matIndex; + + if (material) + m_materials[index] = material; + else + m_materials[index] = NzMaterial::GetDefault(); + + return true; +} + void NzModel::SetMaterial(unsigned int skinIndex, unsigned int matIndex, NzMaterial* material) { #if NAZARA_GRAPHICS_SAFE