78 FIntVector VoxelResolution = FIntVector::ZeroValue;
79 FIntVector HoleResolution = FIntVector::ZeroValue;
80 int32 VolumeCount = 0;
84 float GlobalAbsorption = 0.1f;
85 float SmokeSize = 128.0f;
86 float SmokeDensityFalloff = 0.2f;
87 FVector WindDirection = FVector(0.01f, 0.02f, 0.1f);
88 float VolumeRangeOffset = 0.1f;
89 float VolumeEdgeNoiseFadeOffset = 0.04f;
90 float VolumeEdgeFadeSharpness = 3.5f;
93 bool bEnableScattering =
true;
94 float ScatterScale = 0.5f;
95 float ScatteringAnisotropy = 0.5f;
96 FVector LightDirection = FVector(0.2f, 0.1f, 0.9f);
97 FLinearColor LightColor = FLinearColor::White;
98 float LightIntensity = 1.0f;
101 bool bEnableSelfShadowing =
true;
102 int32 LightMarchingSteps = 6;
103 float LightMarchingDistance = 0.0f;
104 float LightMarchingExpFactor = 2.0f;
105 float ShadowAmbient = 0.2f;
109 int32 NumCascades = 0;
110 TArray<FMatrix> CSMViewProjectionMatrices;
111 TArray<float> CSMSplitDistances;
112 TArray<FVector> CSMLightCameraPositions;
113 TArray<FVector> CSMLightCameraForwards;
114 float CascadeBlendRange = 0.1f;
115 float ShadowDepthBias = 1.0f;
116 float ExternalShadowAmbient = 0.3f;
119 bool bEnableVSM =
true;
120 float VSMMinVariance = 0.0001f;
121 float VSMLightBleedingReduction = 0.2f;
124 FVector CSMMainCameraPosition = FVector::ZeroVector;
127 bool bIsValid =
false;
130 float GameTime = 0.0f;
133 int UpSampleFilterType = 2;
134 float SharpenStrength = 0.0f;
135 float BlurStrength = 0.4f;
145 TArray<FIntVector> HoleTextureSizes;
149 TArray<FTextureRHIRef> CSMVSMTextures;
152 UMaterialInterface* SmokeVisualMaterial =
nullptr;
159 PackedVoxelBirthTimes.Empty();
160 PackedVoxelDeathTimes.Empty();
161 VolumeDataArray.Empty();
162 HoleTextures.Empty();
163 HoleTextureSizes.Empty();
169 CSMDepthTextures.Empty();
170 CSMVSMTextures.Empty();
171 CSMViewProjectionMatrices.Empty();
172 CSMSplitDistances.Empty();
173 CSMLightCameraPositions.Empty();
174 CSMLightCameraForwards.Empty();
176 SmokeVisualMaterial =
nullptr;
292 TSharedPtr<FPerWorldData> GetOrCreateWorldData(UWorld* World);
302 TSharedPtr<FPerWorldData> GetWorldData(UWorld* World);
311 void CleanupWorldData(UWorld* World);
314 bool bIsServerTimeSynced(UWorld* World);
317 void SetServerTimeOffset(UWorld* World,
float InServerTimeOffset);
323 static constexpr int32 MaxSupportedVolumes = 128;
337 FIVSmokePackedRenderData PrepareRenderData(UWorld* World,
const TArray<AIVSmokeVoxelVolume*>& InVolumes,
const FVector& CameraPosition);
359 FScreenPassTexture Render(
360 FRDGBuilder& GraphBuilder,
361 const FSceneView& View,
362 const FPostProcessMaterialInputs& Inputs
380 void RunPrePassPipeline(
381 FRDGBuilder& GraphBuilder,
382 const FSceneView& View,
383 const struct FRenderTargetBindingSlots& RenderTargets,
384 TRDGUniformBufferRef<FSceneTextureUniformParameters> SceneTextures
391 FIntVector GetAtlasTexCount(
const FIntVector& TexSize,
const int32 TexCount,
const int32 TexturePackInterval,
const int32 TexturePackMaxSize)
const;
396 void CreateNoiseVolume();
429 void AddMultiVolumeRayMarchPass(
430 FRDGBuilder& GraphBuilder,
431 const FSceneView& View,
433 FRDGTextureRef SmokeAlbedoTex,
434 FRDGTextureRef SmokeLocalPosAlpha,
435 FRDGTextureRef SmokeWorldPosDepth,
436 const FIntPoint& TexSize,
437 const FIntPoint& ViewportSize,
438 const FIntPoint& ViewRectMin,
439 FRDGTextureRef SceneDepthForDependency =
nullptr
453 FRDGTextureRef AddCopyPass(
454 FRDGBuilder& GraphBuilder,
455 const FSceneView& View,
456 FRDGTextureRef SourceTex,
457 const FIntPoint& DestSize,
471 FRDGBuilder& GraphBuilder,
472 const FSceneView& View,
473 FRDGTextureRef SourceTex,
474 FRDGTextureRef DestTex
489 FRDGTextureRef AddUpsampleFilterPass(
490 FRDGBuilder& GraphBuilder,
492 const FSceneView& View,
493 FRDGTextureRef SceneTex,
494 FRDGTextureRef SmokeAlbedo,
495 FRDGTextureRef SmokeLocalPosAlpha,
496 const FIntPoint& TexSize,
497 const FIntPoint& ViewRectMin
512 FRDGTextureRef AddSmokeVisualPass(FRDGBuilder& GraphBuilder,
const FIVSmokePackedRenderData& RenderData,
const FSceneView& View, FRDGTextureRef SmokeTex, FRDGTextureRef SmokeLocalPosAlphaTex, FRDGTextureRef SmokeWorldPosDepthTex, FRDGTextureRef SceneTex,
const FIntPoint& TexSize);
526 void AddCompositePass(
527 FRDGBuilder& GraphBuilder,
529 const FSceneView& View,
530 FRDGTextureRef SceneTex,
531 FRDGTextureRef SmokeVisualTex,
532 const FScreenPassRenderTarget& Output,
533 const FIntPoint& ViewportSize);
545 static bool IsPrimaryGameView(
const FSceneView& View);
559 void ExecuteDepthWrite(
560 FRDGBuilder& GraphBuilder,
561 const FSceneView& View,
562 const struct FRenderTargetBindingSlots& RenderTargets,
563 FRDGTextureRef SmokeWorldPosDepthTex,
564 FRDGTextureRef SmokeLocalPosAlphaTex,
565 const FIntPoint& ViewportSize,
566 const FIntPoint& ViewRectMin
581 FRDGTextureRef SmokeTex =
nullptr;
582 FRDGTextureRef LocalPosAlphaTex =
nullptr;
583 FRDGTextureRef WorldPosDepthTex =
nullptr;
584 FIntPoint ViewportSize = FIntPoint::ZeroValue;
585 FIntPoint ViewRectMin = FIntPoint::ZeroValue;
586 bool bIsValid =
false;
590 TMap<const FSceneViewStateInterface*, FPerViewData> ViewDataMap;
593 mutable FCriticalSection ViewDataMutex;
599 FScopeLock Lock(&ViewDataMutex);
601 for (
const FSceneView* View : ViewFamily.Views)
603 if (View && View->State)
605 ViewDataMap.Remove(View->State);
616 UTextureRenderTargetVolume* NoiseVolume =
nullptr;
619 bool bIsCapturingShadow =
false;
632 TMap<TObjectKey<UWorld>, TSharedPtr<FPerWorldData>> WorldDataMap;
635 mutable FCriticalSection WorldDataMutex;
638 TMap<TObjectKey<UWorld>, FDelegateHandle> WorldEndPlayHandles;
644 void InitializeCSM(TSharedPtr<FPerWorldData> WorldData, UWorld* World);
656 bool GetMainDirectionalLight(UWorld* World, FVector& OutDirection, FLinearColor& OutColor,
float& OutIntensity);
662 double LastStatUpdateTime = 0.0;
665 int64 CachedNoiseVolumeSize = 0;
666 int64 CachedCSMSize = 0;
667 int64 CachedPerFrameSize = 0;
673 int64 CalculatePerFrameTextureSize(
674 const FIntPoint& ViewportSize,
676 const FIntVector& VoxelResolution,
677 const FIntVector& HoleResolution
681 void UpdateAllStats();