/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/RendererCore/Components/Implementation/SkyBoxComponent.cpp
252 строки
8 KB
Jan Krassnigg
Introduced attribute to mark properties as required (#1981)
09 июл 2026, 19:48
Не верифицирован
09 июл 2026, 19:48
111b7a7
Код
Авторство
О чём код?
#include <RendererCore/RendererCorePCH.h> #include <Core/Graphics/Geometry.h> #include <Core/WorldSerializer/WorldReader.h> #include <Core/WorldSerializer/WorldWriter.h> #include <RendererCore/Components/SkyBoxComponent.h> #include <RendererCore/Pipeline/RenderDataManager.h> #include <RendererCore/Pipeline/View.h> #include <RendererCore/Textures/TextureCubeResource.h> // clang-format off EZ_BEGIN_COMPONENT_TYPE(ezSkyBoxComponent, 4, ezComponentMode::Static) { EZ_BEGIN_PROPERTIES { EZ_RESOURCE_ACCESSOR_PROPERTY("CubeMap", GetCubeMap, SetCubeMap)->AddAttributes(new ezAssetBrowserAttribute("CompatibleAsset_Texture_Cube"), new ezRequiredAttribute()), EZ_ACCESSOR_PROPERTY("ExposureBias", GetExposureBias, SetExposureBias)->AddAttributes(new ezClampValueAttribute(-32.0f, 32.0f)), EZ_ACCESSOR_PROPERTY("InverseTonemap", GetInverseTonemap, SetInverseTonemap), EZ_ACCESSOR_PROPERTY("UseFog", GetUseFog, SetUseFog)->AddAttributes(new ezDefaultValueAttribute(true)), EZ_ACCESSOR_PROPERTY("VirtualDistance", GetVirtualDistance, SetVirtualDistance)->AddAttributes(new ezClampValueAttribute(0.0f, ezVariant()), new ezDefaultValueAttribute(1000.0f)), } EZ_END_PROPERTIES; EZ_BEGIN_ATTRIBUTES { new ezCategoryAttribute("Rendering"), } EZ_END_ATTRIBUTES; EZ_BEGIN_MESSAGEHANDLERS { EZ_MESSAGE_HANDLER(ezMsgExtractRenderData, OnMsgExtractRenderData), } EZ_END_MESSAGEHANDLERS; } EZ_END_COMPONENT_TYPE; // clang-format on ezSkyBoxComponent::ezSkyBoxComponent() = default; ezSkyBoxComponent::~ezSkyBoxComponent() = default; void ezSkyBoxComponent::Initialize() { SUPER::Initialize(); const char* szBufferResourceName = "SkyBoxBuffer"; ezMeshBufferResourceHandle hMeshBuffer = ezResourceManager::GetExistingResource<ezMeshBufferResource>(szBufferResourceName); if (!hMeshBuffer.IsValid()) { ezGeometry geom; geom.AddRect(ezVec2(2.0f)); ezMeshBufferResourceDescriptor desc; desc.AddStream(ezMeshVertexStreamType::Position); desc.AllocateStreamsFromGeometry(geom, ezGALPrimitiveTopology::Triangles); hMeshBuffer = ezResourceManager::GetOrCreateResource<ezMeshBufferResource>(szBufferResourceName, std::move(desc), szBufferResourceName); } const char* szMeshResourceName = "SkyBoxMesh"; m_hMesh = ezResourceManager::GetExistingResource<ezMeshResource>(szMeshResourceName); if (!m_hMesh.IsValid()) { ezMeshResourceDescriptor desc; desc.UseExistingMeshBuffer(hMeshBuffer); desc.AddSubMesh(2, 0, 0); desc.ComputeBounds(); m_hMesh = ezResourceManager::GetOrCreateResource<ezMeshResource>(szMeshResourceName, std::move(desc), szMeshResourceName); } ezStringBuilder cubeMapMaterialName = "SkyBoxMaterial_CubeMap"; cubeMapMaterialName.AppendFormat("_{0}", ezArgP(GetWorld())); // make the resource unique for each world m_hCubeMapMaterial = ezResourceManager::GetExistingResource<ezMaterialResource>(cubeMapMaterialName); if (!m_hCubeMapMaterial.IsValid()) { ezMaterialResourceDescriptor desc; desc.m_hBaseMaterial = ezResourceManager::LoadResource<ezMaterialResource>("{ b4b75b1c-c2c8-4a0e-8076-780bdd46d18b }"); // Sky.ezMaterialAsset m_hCubeMapMaterial = ezResourceManager::CreateResource<ezMaterialResource>(cubeMapMaterialName, std::move(desc), cubeMapMaterialName); } UpdateMaterials(); } void ezSkyBoxComponent::OnActivated() { SUPER::OnActivated(); UpdateMaterials(); } void ezSkyBoxComponent::OnDeactivated() { ezRenderDataManager* pRenderDataManager = GetWorld()->GetModule<ezRenderDataManager>(); pRenderDataManager->DeleteInstanceData(m_InstanceDataOffset); SUPER::OnDeactivated(); } ezResult ezSkyBoxComponent::GetLocalBounds(ezBoundingBoxSphere& ref_bounds, bool& ref_bAlwaysVisible, ezMsgUpdateLocalBounds& ref_msg) { ref_bAlwaysVisible = true; return EZ_SUCCESS; } void ezSkyBoxComponent::OnMsgExtractRenderData(ezMsgExtractRenderData& msg) const { // Don't extract sky render data for selection or in orthographic views. if (msg.m_OverrideCategory != ezInvalidRenderDataCategory || msg.m_pView->GetCamera()->IsOrthographic()) return; const bool bDynamic = GetOwner()->IsDynamic(); ezTransform globalTransform = GetOwner()->GetGlobalTransform(); globalTransform.m_vPosition.SetZero(); // skybox should always be at the origin auto hInstanceDataBuffer = msg.m_pRenderDataManager->GetOrCreateInstanceDataAndFill(*this, bDynamic, globalTransform, m_InstanceDataOffset, GetUniqueIdForRendering()); ezMeshRenderData* pRenderData = msg.m_pRenderDataManager->CreateRenderDataForThisFrame<ezMeshRenderData>(GetOwner()); pRenderData->Fill(m_InstanceDataOffset, hInstanceDataBuffer, m_hCubeMapMaterial, m_hMesh); msg.AddRenderData(pRenderData, ezDefaultRenderDataCategories::Sky, ezRenderData::Caching::IfStatic); } void ezSkyBoxComponent::SerializeComponent(ezWorldWriter& inout_stream) const { SUPER::SerializeComponent(inout_stream); ezStreamWriter& s = inout_stream.GetStream(); s << m_fExposureBias; s << m_bInverseTonemap; s << m_bUseFog; s << m_fVirtualDistance; s << m_hCubeMap; } void ezSkyBoxComponent::DeserializeComponent(ezWorldReader& inout_stream) { SUPER::DeserializeComponent(inout_stream); const ezUInt32 uiVersion = inout_stream.GetComponentTypeVersion(GetStaticRTTI()); ezStreamReader& s = inout_stream.GetStream(); s >> m_fExposureBias; s >> m_bInverseTonemap; if (uiVersion >= 4) { s >> m_bUseFog; s >> m_fVirtualDistance; } if (uiVersion >= 3) { s >> m_hCubeMap; } else { ezTexture2DResourceHandle dummyHandle; for (int i = 0; i < 6; i++) { s >> dummyHandle; } } } void ezSkyBoxComponent::SetExposureBias(float fExposureBias) { m_fExposureBias = fExposureBias; UpdateMaterials(); } void ezSkyBoxComponent::SetInverseTonemap(bool bInverseTonemap) { m_bInverseTonemap = bInverseTonemap; UpdateMaterials(); } void ezSkyBoxComponent::SetUseFog(bool bUseFog) { m_bUseFog = bUseFog; UpdateMaterials(); } void ezSkyBoxComponent::SetVirtualDistance(float fVirtualDistance) { m_fVirtualDistance = fVirtualDistance; UpdateMaterials(); } void ezSkyBoxComponent::SetCubeMap(const ezTextureCubeResourceHandle& hCubeMap) { m_hCubeMap = hCubeMap; UpdateMaterials(); } const ezTextureCubeResourceHandle& ezSkyBoxComponent::GetCubeMap() const { return m_hCubeMap; } void ezSkyBoxComponent::UpdateMaterials() { if (m_hCubeMapMaterial.IsValid()) { ezResourceLock<ezMaterialResource> pMaterial(m_hCubeMapMaterial, ezResourceAcquireMode::AllowLoadingFallback); pMaterial->SetParameter("ExposureBias", m_fExposureBias); pMaterial->SetParameter("InverseTonemap", m_bInverseTonemap); pMaterial->SetParameter("UseFog", m_bUseFog); pMaterial->SetParameter("VirtualDistance", m_fVirtualDistance); pMaterial->SetTextureCubeBinding("CubeMap", m_hCubeMap); pMaterial->PreserveCurrentDesc(); } } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// #include <Foundation/Serialization/AbstractObjectGraph.h> #include <Foundation/Serialization/GraphPatch.h> class ezSkyBoxComponentPatch_1_2 : public ezGraphPatch { public: ezSkyBoxComponentPatch_1_2() : ezGraphPatch("ezSkyBoxComponent", 2) { } virtual void Patch(ezGraphPatchContext& ref_context, ezAbstractObjectGraph* pGraph, ezAbstractObjectNode* pNode) const override { pNode->RenameProperty("Exposure Bias", "ExposureBias"); pNode->RenameProperty("Inverse Tonemap", "InverseTonemap"); pNode->RenameProperty("Left Texture", "LeftTexture"); pNode->RenameProperty("Front Texture", "FrontTexture"); pNode->RenameProperty("Right Texture", "RightTexture"); pNode->RenameProperty("Back Texture", "BackTexture"); pNode->RenameProperty("Up Texture", "UpTexture"); pNode->RenameProperty("Down Texture", "DownTexture"); } }; ezSkyBoxComponentPatch_1_2 g_ezSkyBoxComponentPatch_1_2; EZ_STATICLINK_FILE(RendererCore, RendererCore_Components_Implementation_SkyBoxComponent);