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 InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat);
inline void InvalidateRenderables();
void InvalidateReflectionMap();
inline void InvalidateTransformMatrix();
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;
mutable Nz::BoundingVolumef m_boundingVolume;
mutable Nz::Matrix4f m_transformMatrix;
Nz::TextureRef m_reflectionMap;
mutable bool m_boundingVolumeUpdated;
bool m_shouldRenderReflectionMap;
mutable bool m_transformMatrixUpdated;
unsigned int m_reflectionMapSize;
};
}

View File

@ -93,7 +93,7 @@ namespace Ndk
*/
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)
{
// Don't listen to dormant materials
if (renderable->GetSkin() != skinIndex)
return;
@ -97,19 +98,39 @@ namespace Ndk
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)
{
auto it = m_materialEntries.find(material);
if (it == m_materialEntries.end())
{
MaterialEntry matEntry;
matEntry.reflectionModelChangeSlot.Connect(material->OnMaterialReflectionChange, this, &GraphicsComponent::OnMaterialReflectionChange);
matEntry.reflectionModelChangeSlot.Connect(material->OnMaterialReflectionModeChange, this, &GraphicsComponent::OnMaterialReflectionChange);
matEntry.renderableCounter = count;
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
{
if (m_reflectiveMaterialCount++ == 0)
m_entity->Invalidate();
InvalidateReflectionMap();
}
m_materialEntries.emplace(material, std::move(matEntry));
@ -199,12 +220,12 @@ namespace Ndk
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
{
if (--m_reflectiveMaterialCount == 0)
m_entity->Invalidate();
InvalidateReflectionMap();
}
else if (reflectionMode == Nz::ReflectionMode_RealTime)
{
if (m_reflectiveMaterialCount++ == 0)
m_entity->Invalidate();
InvalidateReflectionMap();
}
}
@ -231,7 +252,7 @@ namespace Ndk
if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime)
{
if (--m_reflectiveMaterialCount == 0)
m_entity->Invalidate();
InvalidateReflectionMap();
}
m_materialEntries.erase(it);

View File

@ -182,7 +182,7 @@ namespace Nz
template<typename... Args> static MaterialRef New(Args&&... args);
// Signals:
NazaraSignal(OnMaterialReflectionChange, const Material* /*material*/, ReflectionMode /*newReflectionMode*/);
NazaraSignal(OnMaterialReflectionModeChange, const Material* /*material*/, ReflectionMode /*newReflectionMode*/);
NazaraSignal(OnMaterialRelease, const Material* /*material*/);
NazaraSignal(OnMaterialReset, const Material* /*material*/);
@ -213,6 +213,7 @@ namespace Nz
bool m_shadowCastingEnabled;
float m_alphaThreshold;
float m_shininess;
unsigned int m_reflectionSize;
static std::array<int, TextureMap_Max + 1> s_textureUnits;
static MaterialLibrary::LibraryMap s_library;

View File

@ -1277,7 +1277,7 @@ namespace Nz
{
if (m_reflectionMode != reflectionMode)
{
OnMaterialReflectionChange(this, reflectionMode);
OnMaterialReflectionModeChange(this, reflectionMode);
m_reflectionMode = reflectionMode;
}