Small update
This commit is contained in:
parent
5702e5202c
commit
f7cd52d947
|
|
@ -65,6 +65,7 @@ namespace Ndk
|
||||||
void InvalidateRenderableData(const Nz::InstancedRenderable* renderable, Nz::UInt32 flags, std::size_t index);
|
void InvalidateRenderableData(const Nz::InstancedRenderable* renderable, Nz::UInt32 flags, std::size_t index);
|
||||||
void InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat);
|
void InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat);
|
||||||
inline void InvalidateRenderables();
|
inline void InvalidateRenderables();
|
||||||
|
void InvalidateReflectionMap();
|
||||||
inline void InvalidateTransformMatrix();
|
inline void InvalidateTransformMatrix();
|
||||||
|
|
||||||
void RegisterMaterial(Nz::Material* material, std::size_t count = 1);
|
void RegisterMaterial(Nz::Material* material, std::size_t count = 1);
|
||||||
|
|
@ -140,9 +141,10 @@ namespace Ndk
|
||||||
std::unordered_map<const Nz::Material*, MaterialEntry> m_materialEntries;
|
std::unordered_map<const Nz::Material*, MaterialEntry> m_materialEntries;
|
||||||
mutable Nz::BoundingVolumef m_boundingVolume;
|
mutable Nz::BoundingVolumef m_boundingVolume;
|
||||||
mutable Nz::Matrix4f m_transformMatrix;
|
mutable Nz::Matrix4f m_transformMatrix;
|
||||||
|
Nz::TextureRef m_reflectionMap;
|
||||||
mutable bool m_boundingVolumeUpdated;
|
mutable bool m_boundingVolumeUpdated;
|
||||||
bool m_shouldRenderReflectionMap;
|
|
||||||
mutable bool m_transformMatrixUpdated;
|
mutable bool m_transformMatrixUpdated;
|
||||||
|
unsigned int m_reflectionMapSize;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ namespace Ndk
|
||||||
*/
|
*/
|
||||||
inline bool GraphicsComponent::DoesRequireRealTimeReflections() const
|
inline bool GraphicsComponent::DoesRequireRealTimeReflections() const
|
||||||
{
|
{
|
||||||
return m_reflectiveMaterialCount != 0;
|
return m_reflectiveMaterialCount != 0 && m_reflectionMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,7 @@ namespace Ndk
|
||||||
|
|
||||||
void GraphicsComponent::InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat)
|
void GraphicsComponent::InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat)
|
||||||
{
|
{
|
||||||
|
// Don't listen to dormant materials
|
||||||
if (renderable->GetSkin() != skinIndex)
|
if (renderable->GetSkin() != skinIndex)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -97,19 +98,39 @@ namespace Ndk
|
||||||
UnregisterMaterial(oldMat);
|
UnregisterMaterial(oldMat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Ndk::GraphicsComponent::InvalidateReflectionMap()
|
||||||
|
{
|
||||||
|
m_entity->Invalidate();
|
||||||
|
|
||||||
|
if (m_reflectiveMaterialCount > 0)
|
||||||
|
{
|
||||||
|
if (!m_reflectionMap)
|
||||||
|
{
|
||||||
|
m_reflectionMap = Nz::Texture::New();
|
||||||
|
if (!m_reflectionMap->Create(Nz::ImageType_Cubemap, Nz::PixelFormatType_RGB8, m_reflectionMapSize, m_reflectionMapSize))
|
||||||
|
{
|
||||||
|
NazaraWarning("Failed to create reflection map, reflections will be disabled for this entity");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_reflectionMap.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
void GraphicsComponent::RegisterMaterial(Nz::Material* material, std::size_t count)
|
void GraphicsComponent::RegisterMaterial(Nz::Material* material, std::size_t count)
|
||||||
{
|
{
|
||||||
auto it = m_materialEntries.find(material);
|
auto it = m_materialEntries.find(material);
|
||||||
if (it == m_materialEntries.end())
|
if (it == m_materialEntries.end())
|
||||||
{
|
{
|
||||||
MaterialEntry matEntry;
|
MaterialEntry matEntry;
|
||||||
matEntry.reflectionModelChangeSlot.Connect(material->OnMaterialReflectionChange, this, &GraphicsComponent::OnMaterialReflectionChange);
|
matEntry.reflectionModelChangeSlot.Connect(material->OnMaterialReflectionModeChange, this, &GraphicsComponent::OnMaterialReflectionChange);
|
||||||
matEntry.renderableCounter = count;
|
matEntry.renderableCounter = count;
|
||||||
|
|
||||||
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
|
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
|
||||||
{
|
{
|
||||||
if (m_reflectiveMaterialCount++ == 0)
|
if (m_reflectiveMaterialCount++ == 0)
|
||||||
m_entity->Invalidate();
|
InvalidateReflectionMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_materialEntries.emplace(material, std::move(matEntry));
|
m_materialEntries.emplace(material, std::move(matEntry));
|
||||||
|
|
@ -199,12 +220,12 @@ namespace Ndk
|
||||||
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
|
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
|
||||||
{
|
{
|
||||||
if (--m_reflectiveMaterialCount == 0)
|
if (--m_reflectiveMaterialCount == 0)
|
||||||
m_entity->Invalidate();
|
InvalidateReflectionMap();
|
||||||
}
|
}
|
||||||
else if (reflectionMode == Nz::ReflectionMode_RealTime)
|
else if (reflectionMode == Nz::ReflectionMode_RealTime)
|
||||||
{
|
{
|
||||||
if (m_reflectiveMaterialCount++ == 0)
|
if (m_reflectiveMaterialCount++ == 0)
|
||||||
m_entity->Invalidate();
|
InvalidateReflectionMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -231,7 +252,7 @@ namespace Ndk
|
||||||
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
|
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
|
||||||
{
|
{
|
||||||
if (--m_reflectiveMaterialCount == 0)
|
if (--m_reflectiveMaterialCount == 0)
|
||||||
m_entity->Invalidate();
|
InvalidateReflectionMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_materialEntries.erase(it);
|
m_materialEntries.erase(it);
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ namespace Nz
|
||||||
template<typename... Args> static MaterialRef New(Args&&... args);
|
template<typename... Args> static MaterialRef New(Args&&... args);
|
||||||
|
|
||||||
// Signals:
|
// Signals:
|
||||||
NazaraSignal(OnMaterialReflectionChange, const Material* /*material*/, ReflectionMode /*newReflectionMode*/);
|
NazaraSignal(OnMaterialReflectionModeChange, const Material* /*material*/, ReflectionMode /*newReflectionMode*/);
|
||||||
NazaraSignal(OnMaterialRelease, const Material* /*material*/);
|
NazaraSignal(OnMaterialRelease, const Material* /*material*/);
|
||||||
NazaraSignal(OnMaterialReset, const Material* /*material*/);
|
NazaraSignal(OnMaterialReset, const Material* /*material*/);
|
||||||
|
|
||||||
|
|
@ -213,6 +213,7 @@ namespace Nz
|
||||||
bool m_shadowCastingEnabled;
|
bool m_shadowCastingEnabled;
|
||||||
float m_alphaThreshold;
|
float m_alphaThreshold;
|
||||||
float m_shininess;
|
float m_shininess;
|
||||||
|
unsigned int m_reflectionSize;
|
||||||
|
|
||||||
static std::array<int, TextureMap_Max + 1> s_textureUnits;
|
static std::array<int, TextureMap_Max + 1> s_textureUnits;
|
||||||
static MaterialLibrary::LibraryMap s_library;
|
static MaterialLibrary::LibraryMap s_library;
|
||||||
|
|
|
||||||
|
|
@ -1277,7 +1277,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
if (m_reflectionMode != reflectionMode)
|
if (m_reflectionMode != reflectionMode)
|
||||||
{
|
{
|
||||||
OnMaterialReflectionChange(this, reflectionMode);
|
OnMaterialReflectionModeChange(this, reflectionMode);
|
||||||
|
|
||||||
m_reflectionMode = reflectionMode;
|
m_reflectionMode = reflectionMode;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue