/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/RendererCore/Components/Implementation/FogComponent.cpp
216 строк
6 KB
C-Core
Render Pipeline Blackboards (#1974)
06 июл 2026, 13:55
Не верифицирован
06 июл 2026, 13:55
5715bdc
Код
Авторство
О чём код?
#include <RendererCore/RendererCorePCH.h> #include <Core/Messages/UpdateLocalBoundsMessage.h> #include <Core/WorldSerializer/WorldReader.h> #include <Core/WorldSerializer/WorldWriter.h> #include <RendererCore/Components/FogComponent.h> #include <RendererCore/Pipeline/RenderDataManager.h> #include <RendererCore/Utils/BlackboardHelper.h> // clang-format off EZ_BEGIN_DYNAMIC_REFLECTED_TYPE(ezFogRenderData, 1, ezRTTIDefaultAllocator<ezFogRenderData>) EZ_END_DYNAMIC_REFLECTED_TYPE; EZ_BEGIN_COMPONENT_TYPE(ezFogComponent, 3, ezComponentMode::Static) { EZ_BEGIN_PROPERTIES { EZ_ACCESSOR_PROPERTY("Color", GetColor, SetColor)->AddAttributes(new ezDefaultValueAttribute(ezColorGammaUB(ezColor(0.2f, 0.2f, 0.3f)))), EZ_ACCESSOR_PROPERTY("Density", GetDensity, SetDensity)->AddAttributes(new ezClampValueAttribute(0.0f, ezVariant()), new ezDefaultValueAttribute(1.0f)), EZ_ACCESSOR_PROPERTY("StartDistance", GetStartDistance, SetStartDistance), EZ_ACCESSOR_PROPERTY("HeightFalloff", GetHeightFalloff, SetHeightFalloff)->AddAttributes(new ezClampValueAttribute(0.0f, ezVariant()), new ezDefaultValueAttribute(10.0f)), EZ_ACCESSOR_PROPERTY("ModulateWithSkyColor", GetModulateWithSkyColor, SetModulateWithSkyColor), EZ_ACCESSOR_PROPERTY("SkyDistance", GetSkyDistance, SetSkyDistance)->AddAttributes(new ezClampValueAttribute(0.0f, ezVariant()), new ezDefaultValueAttribute(1000.0f)), } EZ_END_PROPERTIES; EZ_BEGIN_MESSAGEHANDLERS { EZ_MESSAGE_HANDLER(ezMsgUpdateLocalBounds, OnUpdateLocalBounds), EZ_MESSAGE_HANDLER(ezMsgExtractRenderData, OnMsgExtractRenderData), } EZ_END_MESSAGEHANDLERS; EZ_BEGIN_ATTRIBUTES { new ezCategoryAttribute("Effects"), } EZ_END_ATTRIBUTES; } EZ_END_COMPONENT_TYPE // clang-format on ezFogComponent::ezFogComponent() = default; ezFogComponent::~ezFogComponent() = default; void ezFogComponent::Deinitialize() { ezRenderWorld::DeleteCachedRenderData(GetOwner()->GetHandle(), GetHandle()); SUPER::Deinitialize(); } void ezFogComponent::OnActivated() { GetOwner()->UpdateLocalBounds(); } void ezFogComponent::OnDeactivated() { GetOwner()->UpdateLocalBounds(); } void ezFogComponent::SetColor(ezColor color) { m_Color = color; if (IsActiveAndInitialized()) { ezRenderWorld::DeleteCachedRenderData(GetOwner()->GetHandle(), GetHandle()); } } ezColor ezFogComponent::GetColor() const { return m_Color; } void ezFogComponent::SetDensity(float fDensity) { m_fDensity = ezMath::Max(fDensity, 0.0f); if (IsActiveAndInitialized()) { ezRenderWorld::DeleteCachedRenderData(GetOwner()->GetHandle(), GetHandle()); } } float ezFogComponent::GetDensity() const { return m_fDensity; } void ezFogComponent::SetHeightFalloff(float fHeightFalloff) { m_fHeightFalloff = ezMath::Max(fHeightFalloff, 0.0f); if (IsActiveAndInitialized()) { ezRenderWorld::DeleteCachedRenderData(GetOwner()->GetHandle(), GetHandle()); } } float ezFogComponent::GetHeightFalloff() const { return m_fHeightFalloff; } void ezFogComponent::SetModulateWithSkyColor(bool bModulate) { m_bModulateWithSkyColor = bModulate; if (IsActiveAndInitialized()) { ezRenderWorld::DeleteCachedRenderData(GetOwner()->GetHandle(), GetHandle()); } } bool ezFogComponent::GetModulateWithSkyColor() const { return m_bModulateWithSkyColor; } void ezFogComponent::SetSkyDistance(float fDistance) { m_fSkyDistance = fDistance; if (IsActiveAndInitialized()) { ezRenderWorld::DeleteCachedRenderData(GetOwner()->GetHandle(), GetHandle()); } } float ezFogComponent::GetSkyDistance() const { return m_fSkyDistance; } void ezFogComponent::SetStartDistance(float fDistance) { m_fStartDistance = fDistance; if (IsActiveAndInitialized()) { ezRenderWorld::DeleteCachedRenderData(GetOwner()->GetHandle(), GetHandle()); } } float ezFogComponent::GetStartDistance() const { return m_fStartDistance; } void ezFogComponent::OnUpdateLocalBounds(ezMsgUpdateLocalBounds& msg) { msg.SetAlwaysVisible(GetOwner()->IsDynamic() ? ezDefaultSpatialDataCategories::RenderDynamic : ezDefaultSpatialDataCategories::RenderStatic); } void ezFogComponent::OnMsgExtractRenderData(ezMsgExtractRenderData& msg) const { if (msg.m_OverrideCategory != ezInvalidRenderDataCategory) return; const ezBlackboard& blackboard = *GetWorld()->GetBlackboard().Borrow(); const ezColor color = EZ_APPLY_BLACKBOARD_VALUE_WITH_STRENGTH(m_Color, blackboard, Fog.Color); const float fDensity = EZ_APPLY_BLACKBOARD_VALUE_WITH_STRENGTH(m_fDensity, blackboard, Fog.Density); const float fHeightFalloff = EZ_APPLY_BLACKBOARD_VALUE_WITH_STRENGTH(m_fHeightFalloff, blackboard, Fog.HeightFalloff); const float fStartDistance = EZ_APPLY_BLACKBOARD_VALUE_WITH_STRENGTH(m_fStartDistance, blackboard, Fog.StartDistance); auto pRenderData = msg.m_pRenderDataManager->CreateRenderDataForThisFrame<ezFogRenderData>(GetOwner()); pRenderData->m_Color = color; pRenderData->m_fDensity = fDensity / 100.0f; pRenderData->m_fBaseHeight = GetOwner()->GetGlobalTransform().m_vPosition.z; pRenderData->m_fHeightFalloff = fHeightFalloff; pRenderData->m_fInvSkyDistance = m_bModulateWithSkyColor ? 1.0f / m_fSkyDistance : 0.0f; pRenderData->m_fFogStartDistance = fStartDistance; pRenderData->m_uiSortingKey = ezInvalidIndex; msg.AddRenderData(pRenderData, ezDefaultRenderDataCategories::Light, ezRenderData::Caching::Never); } void ezFogComponent::SerializeComponent(ezWorldWriter& inout_stream) const { SUPER::SerializeComponent(inout_stream); ezStreamWriter& s = inout_stream.GetStream(); s << m_Color; s << m_fDensity; s << m_fHeightFalloff; s << m_fSkyDistance; s << m_bModulateWithSkyColor; s << m_fStartDistance; } void ezFogComponent::DeserializeComponent(ezWorldReader& inout_stream) { SUPER::DeserializeComponent(inout_stream); const ezUInt32 uiVersion = inout_stream.GetComponentTypeVersion(GetStaticRTTI()); ezStreamReader& s = inout_stream.GetStream(); s >> m_Color; s >> m_fDensity; s >> m_fHeightFalloff; if (uiVersion >= 2) { s >> m_fSkyDistance; s >> m_bModulateWithSkyColor; } if (uiVersion >= 3) { s >> m_fStartDistance; } } EZ_STATICLINK_FILE(RendererCore, RendererCore_Components_Implementation_FogComponent);