Improved (Fixed ?) Material Copy/Move
Former-commit-id: 8eb9b716e2b028c6d2e249f9706ad6f5567c95dc
This commit is contained in:
parent
96743375d9
commit
5eec0d2abe
|
|
@ -140,6 +140,7 @@ class NAZARA_API NzMaterial : public NzResource
|
||||||
};
|
};
|
||||||
|
|
||||||
void Copy(const NzMaterial& material);
|
void Copy(const NzMaterial& material);
|
||||||
|
void Move(NzMaterial&& material);
|
||||||
void GenerateShader(nzUInt32 flags) const;
|
void GenerateShader(nzUInt32 flags) const;
|
||||||
void InvalidateShaders();
|
void InvalidateShaders();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,16 +36,7 @@ NzResource()
|
||||||
|
|
||||||
NzMaterial::NzMaterial(NzMaterial&& material)
|
NzMaterial::NzMaterial(NzMaterial&& material)
|
||||||
{
|
{
|
||||||
Copy(material);
|
Move(material);
|
||||||
|
|
||||||
// Nous "volons" la référence du matériau
|
|
||||||
material.m_alphaMap.Reset();
|
|
||||||
material.m_diffuseMap.Reset();
|
|
||||||
material.m_emissiveMap.Reset();
|
|
||||||
material.m_heightMap.Reset();
|
|
||||||
material.m_normalMap.Reset();
|
|
||||||
material.m_specularMap.Reset();
|
|
||||||
material.m_uberShader.Reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NzMaterial::~NzMaterial()
|
NzMaterial::~NzMaterial()
|
||||||
|
|
@ -624,16 +615,7 @@ NzMaterial& NzMaterial::operator=(const NzMaterial& material)
|
||||||
|
|
||||||
NzMaterial& NzMaterial::operator=(NzMaterial&& material)
|
NzMaterial& NzMaterial::operator=(NzMaterial&& material)
|
||||||
{
|
{
|
||||||
Copy(material);
|
Move(material);
|
||||||
|
|
||||||
// Comme ça nous volons la référence du matériau
|
|
||||||
material.m_alphaMap.Reset();
|
|
||||||
material.m_diffuseMap.Reset();
|
|
||||||
material.m_emissiveMap.Reset();
|
|
||||||
material.m_heightMap.Reset();
|
|
||||||
material.m_normalMap.Reset();
|
|
||||||
material.m_specularMap.Reset();
|
|
||||||
material.m_uberShader.Reset();
|
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
@ -645,33 +627,62 @@ NzMaterial* NzMaterial::GetDefault()
|
||||||
|
|
||||||
void NzMaterial::Copy(const NzMaterial& material)
|
void NzMaterial::Copy(const NzMaterial& material)
|
||||||
{
|
{
|
||||||
// On relache les références proprement
|
// Copie des états de base
|
||||||
m_alphaMap.Reset();
|
m_alphaTestEnabled = material.m_alphaTestEnabled;
|
||||||
m_diffuseMap.Reset();
|
m_alphaThreshold = material.m_alphaThreshold;
|
||||||
m_emissiveMap.Reset();
|
m_ambientColor = material.m_ambientColor;
|
||||||
m_heightMap.Reset();
|
m_diffuseColor = material.m_diffuseColor;
|
||||||
m_normalMap.Reset();
|
m_diffuseSampler = material.m_diffuseSampler;
|
||||||
m_specularMap.Reset();
|
m_lightingEnabled = material.m_lightingEnabled;
|
||||||
m_uberShader.Reset();
|
m_shininess = material.m_shininess;
|
||||||
|
m_specularColor = material.m_specularColor;
|
||||||
std::memcpy(this, &material, sizeof(NzMaterial)); // Autorisé dans notre cas, et bien plus rapide
|
m_specularSampler = material.m_specularSampler;
|
||||||
|
m_states = material.m_states;
|
||||||
// Ensuite une petite astuce pour récupérer correctement les références
|
m_transformEnabled = material.m_transformEnabled;
|
||||||
m_alphaMap.Release();
|
|
||||||
m_diffuseMap.Release();
|
|
||||||
m_emissiveMap.Release();
|
|
||||||
m_heightMap.Release();
|
|
||||||
m_normalMap.Release();
|
|
||||||
m_specularMap.Release();
|
|
||||||
m_uberShader.Release();
|
|
||||||
|
|
||||||
|
// Copie des références de texture
|
||||||
m_alphaMap = material.m_alphaMap;
|
m_alphaMap = material.m_alphaMap;
|
||||||
m_diffuseMap = material.m_diffuseMap;
|
m_diffuseMap = material.m_diffuseMap;
|
||||||
m_emissiveMap = material.m_emissiveMap;
|
m_emissiveMap = material.m_emissiveMap;
|
||||||
m_heightMap = material.m_heightMap;
|
m_heightMap = material.m_heightMap;
|
||||||
m_normalMap = material.m_normalMap;
|
m_normalMap = material.m_normalMap;
|
||||||
m_specularMap = material.m_specularMap;
|
m_specularMap = material.m_specularMap;
|
||||||
|
|
||||||
|
// Copie de la référence vers l'Über-Shader
|
||||||
m_uberShader = material.m_uberShader;
|
m_uberShader = material.m_uberShader;
|
||||||
|
|
||||||
|
// On copie les instances de shader par la même occasion
|
||||||
|
std::memcpy(&m_shaders[0], &material.m_shaders[0], (nzShaderFlags_Max+1)*sizeof(ShaderInstance));
|
||||||
|
}
|
||||||
|
|
||||||
|
void NzMaterial::Move(NzMaterial&& material)
|
||||||
|
{
|
||||||
|
// Copie des états de base
|
||||||
|
m_alphaTestEnabled = material.m_alphaTestEnabled;
|
||||||
|
m_alphaThreshold = material.m_alphaThreshold;
|
||||||
|
m_ambientColor = material.m_ambientColor;
|
||||||
|
m_diffuseColor = material.m_diffuseColor;
|
||||||
|
m_diffuseSampler = material.m_diffuseSampler;
|
||||||
|
m_lightingEnabled = material.m_lightingEnabled;
|
||||||
|
m_shininess = material.m_shininess;
|
||||||
|
m_specularColor = material.m_specularColor;
|
||||||
|
m_specularSampler = material.m_specularSampler;
|
||||||
|
m_states = material.m_states;
|
||||||
|
m_transformEnabled = material.m_transformEnabled;
|
||||||
|
|
||||||
|
// Vol des références de texture
|
||||||
|
m_alphaMap = std::move(material.m_alphaMap);
|
||||||
|
m_diffuseMap = std::move(material.m_diffuseMap);
|
||||||
|
m_emissiveMap = std::move(material.m_emissiveMap);
|
||||||
|
m_heightMap = std::move(material.m_heightMap);
|
||||||
|
m_normalMap = std::move(material.m_normalMap);
|
||||||
|
m_specularMap = std::move(material.m_specularMap);
|
||||||
|
|
||||||
|
// Vol de la référence vers l'Über-Shader
|
||||||
|
m_uberShader = std::move(material.m_uberShader);
|
||||||
|
|
||||||
|
// On copie les instances de shader par la même occasion
|
||||||
|
std::memcpy(&m_shaders[0], &material.m_shaders[0], (nzShaderFlags_Max+1)*sizeof(ShaderInstance));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzMaterial::GenerateShader(nzUInt32 flags) const
|
void NzMaterial::GenerateShader(nzUInt32 flags) const
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue