Small update

This commit is contained in:
Lynix 2017-04-17 17:39:26 +02:00
parent 5702e5202c
commit f7cd52d947
5 changed files with 33 additions and 9 deletions

View File

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

View File

@ -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;
} }
/*! /*!

View File

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

View File

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

View File

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