/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace AZ { namespace Render { CommonSystemComponent::CommonSystemComponent() = default; CommonSystemComponent::~CommonSystemComponent() = default; void CommonSystemComponent::Reflect(ReflectContext* context) { AuxGeomFeatureProcessor::Reflect(context); TransformServiceFeatureProcessor::Reflect(context); ProjectedShadowFeatureProcessor::Reflect(context); SkyAtmosphereFeatureProcessor::Reflect(context); SkyBoxFeatureProcessor::Reflect(context); SkyBoxFogSettings::Reflect(context); UseTextureFunctor::Reflect(context); SubsurfaceTransmissionParameterFunctor::Reflect(context); Transform2DFunctor::Reflect(context); MeshFeatureProcessor::Reflect(context); ImageBasedLightFeatureProcessor::Reflect(context); AcesDisplayMapperFeatureProcessor::Reflect(context); DisplayMapperConfigurationDescriptor::Reflect(context); DisplayMapperPassData::Reflect(context); ConvertEmissiveUnitFunctor::Reflect(context); LookupTableAsset::Reflect(context); ReflectionProbeFeatureProcessor::Reflect(context); SpecularReflectionsFeatureProcessor::Reflect(context); CubeMapCaptureFeatureProcessor::Reflect(context); DecalTextureArrayFeatureProcessor::Reflect(context); SMAAFeatureProcessor::Reflect(context); SilhouetteFeatureProcessor::Reflect(context); PostProcessFeatureProcessor::Reflect(context); ImGuiPassData::Reflect(context); RayTracingPassData::Reflect(context); TaaPassData::Reflect(context); RenderDebugFeatureProcessor::Reflect(context); SplashScreenFeatureProcessor::Reflect(context); SplashScreenSettings::Reflect(context); LightingPreset::Reflect(context); ModelPreset::Reflect(context); RayTracingFeatureProcessor::Reflect(context); OcclusionCullingPlaneFeatureProcessor::Reflect(context); LightingChannelConfiguration::Reflect(context); if (SerializeContext* serialize = azrtti_cast(context)) { serialize->Class() ->Version(0); if (AZ::EditContext* ec = serialize->GetEditContext()) { ec->Class("CommonSystemComponent", "System Component for common render features") ->ClassElement(Edit::ClassElements::EditorData, "") ->Attribute(Edit::Attributes::AutoExpand, true) ; } } } void CommonSystemComponent::GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided) { provided.push_back(AZ_CRC("CommonService", 0x6398eec4)); } void CommonSystemComponent::GetIncompatibleServices(ComponentDescriptor::DependencyArrayType& incompatible) { incompatible.push_back(AZ_CRC("CommonService", 0x6398eec4)); } void CommonSystemComponent::GetRequiredServices(ComponentDescriptor::DependencyArrayType& required) { required.push_back(AZ_CRC("RPISystem", 0xf2add773)); } void CommonSystemComponent::GetDependentServices(ComponentDescriptor::DependencyArrayType& dependent) { AZ_UNUSED(dependent); } void CommonSystemComponent::Init() { } void CommonSystemComponent::Activate() { AZ::ApplicationTypeQuery appType; ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationBus::Events::QueryApplicationType, appType); if (!appType.IsHeadless()) { AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessor(); } AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface(); auto* passSystem = RPI::PassSystemInterface::Get(); AZ_Assert(passSystem, "Cannot get the pass system."); // Add Sky Atmosphere Parent pass passSystem->AddPassCreator(Name("SkyAtmosphereParentPass"), &SkyAtmosphereParentPass::Create); // Add DisplayMapper pass passSystem->AddPassCreator(Name("AcesOutputTransformLutPass"), &AcesOutputTransformLutPass::Create); passSystem->AddPassCreator(Name("AcesOutputTransformPass"), &AcesOutputTransformPass::Create); passSystem->AddPassCreator(Name("ApplyShaperLookupTablePass"), &ApplyShaperLookupTablePass::Create); passSystem->AddPassCreator(Name("BakeAcesOutputTransformLutPass"), &BakeAcesOutputTransformLutPass::Create); passSystem->AddPassCreator(Name("DisplayMapperPass"), &DisplayMapperPass::Create); passSystem->AddPassCreator(Name("DisplayMapperFullScreenPass"), &DisplayMapperFullScreenPass::Create); passSystem->AddPassCreator(Name("OutputTransformPass"), &OutputTransformPass::Create); passSystem->AddPassCreator(Name("EyeAdaptationPass"), &EyeAdaptationPass::Create); passSystem->AddPassCreator(Name("ImGuiPass"), &ImGuiPass::Create); passSystem->AddPassCreator(Name("LightCullingPass"), &LightCullingPass::Create); passSystem->AddPassCreator(Name("LightCullingRemapPass"), &LightCullingRemap::Create); passSystem->AddPassCreator(Name("LightCullingTilePreparePass"), &LightCullingTilePreparePass::Create); passSystem->AddPassCreator(Name("BlendColorGradingLutsPass"), &BlendColorGradingLutsPass::Create); passSystem->AddPassCreator(Name("HDRColorGradingPass"), &HDRColorGradingPass::Create); passSystem->AddPassCreator(Name("FullscreenShadowPass"), &FullscreenShadowPass::Create); passSystem->AddPassCreator(Name("LookModificationCompositePass"), &LookModificationCompositePass::Create); passSystem->AddPassCreator(Name("LookModificationTransformPass"), &LookModificationPass::Create); passSystem->AddPassCreator(Name("LutGenerationPass"), &LutGenerationPass::Create); passSystem->AddPassCreator(Name("SMAAEdgeDetectionPass"), &SMAAEdgeDetectionPass::Create); passSystem->AddPassCreator(Name("SMAABlendingWeightCalculationPass"), &SMAABlendingWeightCalculationPass::Create); passSystem->AddPassCreator(Name("SMAANeighborhoodBlendingPass"), &SMAANeighborhoodBlendingPass::Create); // Add Depth Downsample/Upsample passes passSystem->AddPassCreator(Name("DepthUpsamplePass"), &DepthUpsamplePass::Create); // Add Taa Pass passSystem->AddPassCreator(Name("TaaPass"), &TaaPass::Create); // Add DepthOfField pass passSystem->AddPassCreator(Name("DepthOfFieldCompositePass"), &DepthOfFieldCompositePass::Create); passSystem->AddPassCreator(Name("DepthOfFieldBokehBlurPass"), &DepthOfFieldBokehBlurPass::Create); passSystem->AddPassCreator(Name("DepthOfFieldMaskPass"), &DepthOfFieldMaskPass::Create); passSystem->AddPassCreator(Name("DepthOfFieldParentPass"), &DepthOfFieldParentPass::Create); passSystem->AddPassCreator(Name("DepthOfFieldReadBackFocusDepthPass"), &DepthOfFieldReadBackFocusDepthPass::Create); passSystem->AddPassCreator(Name("DepthOfFieldWriteFocusDepthFromGpuPass"), &DepthOfFieldWriteFocusDepthFromGpuPass::Create); passSystem->AddPassCreator(Name("NewDepthOfFieldParentPass"), &NewDepthOfFieldParentPass::Create); passSystem->AddPassCreator(Name("NewDepthOfFieldTileReducePass"), &NewDepthOfFieldTileReducePass::Create); passSystem->AddPassCreator(Name("NewDepthOfFieldFilterPass"), &NewDepthOfFieldFilterPass::Create); // Add FastDepthAwareBlur passes passSystem->AddPassCreator(Name("FastDepthAwareBlurHorPass"), &FastDepthAwareBlurHorPass::Create); passSystem->AddPassCreator(Name("FastDepthAwareBlurVerPass"), &FastDepthAwareBlurVerPass::Create); // Add SSAO passes passSystem->AddPassCreator(Name("SsaoParentPass"), &SsaoParentPass::Create); passSystem->AddPassCreator(Name("SsaoComputePass"), &SsaoComputePass::Create); // Add Subsurface Scattering pass passSystem->AddPassCreator(Name("SubsurfaceScatteringPass"), &RPI::SubsurfaceScatteringPass::Create); // Add checkerboard rendering passes passSystem->AddPassCreator(Name("CheckerboardPass"), &Render::CheckerboardPass::Create); passSystem->AddPassCreator(Name("CheckerboardColorResolvePass"), &Render::CheckerboardColorResolvePass::Create); // Add bloom passes passSystem->AddPassCreator(Name("BloomParentPass"), &BloomParentPass::Create); passSystem->AddPassCreator(Name("BloomDownsamplePass"), &BloomDownsamplePass::Create); passSystem->AddPassCreator(Name("BloomBlurPass"), &BloomBlurPass::Create); passSystem->AddPassCreator(Name("BloomCompositePass"), &BloomCompositePass::Create); // Add Chromatic Aberration passSystem->AddPassCreator(Name("ChromaticAberrationPass"), &ChromaticAberrationPass::Create); // Add Panini Projection passSystem->AddPassCreator(Name("PaniniProjectionPass"), &PaniniProjectionPass::Create); // Add Film Grain passSystem->AddPassCreator(Name("FilmGrainPass"), &FilmGrainPass::Create); // Add White Balance pass passSystem->AddPassCreator(Name("WhiteBalancePass"), &WhiteBalancePass::Create); // Add Vignette passSystem->AddPassCreator(Name("VignettePass"), &VignettePass::Create); // Add Luminance Histogram pass passSystem->AddPassCreator(Name("LuminanceHistogramGeneratorPass"), &LuminanceHistogramGeneratorPass::Create); // Deferred Fog passSystem->AddPassCreator(Name("DeferredFogPass"), &DeferredFogPass::Create); // Add Reflection passes passSystem->AddPassCreator(Name("ReflectionScreenSpacePass"), &Render::ReflectionScreenSpacePass::Create); passSystem->AddPassCreator(Name("ReflectionScreenSpaceTracePass"), &Render::ReflectionScreenSpaceTracePass::Create); passSystem->AddPassCreator(Name("ReflectionScreenSpaceDownsampleDepthLinearPass"), &Render::ReflectionScreenSpaceDownsampleDepthLinearPass::Create); passSystem->AddPassCreator(Name("ReflectionScreenSpaceDownsampleDepthLinearChildPass"), &Render::ReflectionScreenSpaceDownsampleDepthLinearChildPass::Create); passSystem->AddPassCreator(Name("ReflectionScreenSpaceBlurPass"), &Render::ReflectionScreenSpaceBlurPass::Create); passSystem->AddPassCreator(Name("ReflectionScreenSpaceBlurChildPass"), &Render::ReflectionScreenSpaceBlurChildPass::Create); passSystem->AddPassCreator(Name("ReflectionScreenSpaceFilterPass"), &Render::ReflectionScreenSpaceFilterPass::Create); passSystem->AddPassCreator(Name("ReflectionScreenSpaceCompositePass"), &Render::ReflectionScreenSpaceCompositePass::Create); passSystem->AddPassCreator(Name("ReflectionCopyFrameBufferPass"), &Render::ReflectionCopyFrameBufferPass::Create); // Add RayTracing passes passSystem->AddPassCreator(Name("RayTracingAccelerationStructurePass"), &Render::RayTracingAccelerationStructurePass::Create); passSystem->AddPassCreator(Name("RayTracingPass"), &Render::RayTracingPass::Create); // Add splash screen pass passSystem->AddPassCreator(Name("SplashScreenPass"), &Render::SplashScreenPass::Create); // setup handler for load pass template mappings m_loadTemplatesHandler = RPI::PassSystemInterface::OnReadyLoadTemplatesEvent::Handler([this]() { this->LoadPassTemplateMappings(); }); RPI::PassSystemInterface::Get()->ConnectEvent(m_loadTemplatesHandler); m_modelReloaderSystem = AZStd::make_unique(); } void CommonSystemComponent::Deactivate() { m_modelReloaderSystem.reset(); m_loadTemplatesHandler.Disconnect(); AZ::ApplicationTypeQuery appType; ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationBus::Events::QueryApplicationType, appType); if (!appType.IsHeadless()) { AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); } AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor(); } void CommonSystemComponent::LoadPassTemplateMappings() { const char* passTemplatesFile = "Passes/PassTemplates.azasset"; RPI::PassSystemInterface::Get()->LoadPassTemplateMappings(passTemplatesFile); } } // namespace Render } // namespace AZ