3#include "IVSmokeSceneViewExtension.h"
4#include "IVSmokeRenderer.h"
5#include "IVSmokeSettings.h"
6#include "IVSmokeShaders.h"
7#include "IVSmokeVoxelVolume.h"
8#include "PostProcess/PostProcessMaterialInputs.h"
10#include "RenderingThread.h"
11#include "EngineUtils.h"
12#include "GameFramework/GameStateBase.h"
13#include "PixelShaderUtils.h"
18#include "SceneTexturesConfig.h"
19#include "SceneRenderTargetParameters.h"
21TSharedPtr<FIVSmokeSceneViewExtension, ESPMode::ThreadSafe> FIVSmokeSceneViewExtension::Instance;
23FIVSmokeSceneViewExtension::FIVSmokeSceneViewExtension(
const FAutoRegister& AutoRegister)
24 : FSceneViewExtensionBase(AutoRegister)
30 if (!Instance.IsValid())
32 Instance = FSceneViewExtensions::NewExtension<FIVSmokeSceneViewExtension>();
41void FIVSmokeSceneViewExtension::BeginRenderViewFamily(FSceneViewFamily& InViewFamily)
49 UWorld* World =
nullptr;
50 if (InViewFamily.Scene)
52 World = InViewFamily.Scene->GetWorld();
64 if (GEditor && GEditor->IsPlayingSessionInEditor())
66 if (World->WorldType == EWorldType::Editor)
69 ENQUEUE_RENDER_COMMAND(IVSmokeClearEditorRenderData)(
70 [&Renderer, World](FRHICommandListImmediate& RHICmdList)
83 if (AGameStateBase* GS = World->GetGameState())
85 float LocalTime = World->GetTimeSeconds();
86 float ServerTime = GS->GetServerWorldTimeSeconds();
92 TArray<AIVSmokeVoxelVolume*> ValidVolumes;
93 for (TActorIterator<AIVSmokeVoxelVolume> It(World); It; ++It)
95 if (IsValid(*It) && It->ShouldRender())
97 ValidVolumes.Add(*It);
101 if (ValidVolumes.Num() == 0)
104 ENQUEUE_RENDER_COMMAND(IVSmokeClearRenderData)(
105 [&Renderer, World](FRHICommandListImmediate& RHICmdList)
114 FVector CameraPosition = FVector::ZeroVector;
115 if (InViewFamily.Views.Num() > 0 && InViewFamily.Views[0])
117 CameraPosition = InViewFamily.Views[0]->ViewLocation;
125 ENQUEUE_RENDER_COMMAND(IVSmokeSetRenderData)(
126 [&Renderer, World, RenderData = MoveTemp(RenderData)](FRHICommandListImmediate& RHICmdList)
mutable
133bool FIVSmokeSceneViewExtension::IsActiveThisFrame_Internal(
const FSceneViewExtensionContext& Context)
const
139void FIVSmokeSceneViewExtension::SubscribeToPostProcessingPass(
140 EPostProcessingPass Pass,
141 const FSceneView& InView,
142 FPostProcessingPassDelegateArray& InOutPassCallbacks,
147 if (InView.bIsSceneCapture || InView.bIsReflectionCapture || InView.bIsPlanarReflection)
153 if (Pass == EPostProcessingPass::AfterDOF)
155 InOutPassCallbacks.Add(
156 FPostProcessingPassDelegate::CreateRaw(
158 &FIVSmokeSceneViewExtension::Render_RenderThread
164FScreenPassTexture FIVSmokeSceneViewExtension::Render_RenderThread(
165 FRDGBuilder& GraphBuilder,
166 const FSceneView& View,
167 const FPostProcessMaterialInputs& Inputs)
169 return FIVSmokeRenderer::Get().
Render(GraphBuilder, View, Inputs);
172void FIVSmokeSceneViewExtension::PostRenderBasePassDeferred_RenderThread(
173 FRDGBuilder& GraphBuilder,
175 const FRenderTargetBindingSlots& RenderTargets,
176 TRDGUniformBufferRef<FSceneTextureUniformParameters> SceneTextures)
180 if (InView.bIsSceneCapture || InView.bIsReflectionCapture || InView.bIsPlanarReflection)
196 FIVSmokeRenderer::Get().
RunPrePassPipeline(GraphBuilder, InView, RenderTargets, SceneTextures);
200void FIVSmokeSceneViewExtension::PostRenderViewFamily_RenderThread(
201 FRDGBuilder& GraphBuilder,
202 FSceneViewFamily& InViewFamily)
void SetServerTimeOffset(UWorld *World, float InServerTimeOffset)
FScreenPassTexture Render(FRDGBuilder &GraphBuilder, const FSceneView &View, const FPostProcessMaterialInputs &Inputs)
void RunPrePassPipeline(FRDGBuilder &GraphBuilder, const FSceneView &View, const struct FRenderTargetBindingSlots &RenderTargets, TRDGUniformBufferRef< FSceneTextureUniformParameters > SceneTextures)
void SetCachedRenderData(UWorld *World, FIVSmokePackedRenderData &&InRenderData)
FIVSmokePackedRenderData PrepareRenderData(UWorld *World, const TArray< AIVSmokeVoxelVolume * > &InVolumes, const FVector &CameraPosition)
bool bIsServerTimeSynced(UWorld *World)
void ClearViewDataForViewFamily(const FSceneViewFamily &ViewFamily)
static const UIVSmokeSettings * Get()
bool bEnableSmokeRendering