Files
UnrealEngine/Engine/Shaders/Private/Nanite/NaniteSceneCommon.ush
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

70 lines
2.5 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "../Common.ush"
#include "../SceneData.ush"
#include "/Engine/Shared/NaniteDefinitions.h"
#include "NaniteDataDecode.ush"
#ifndef DISABLE_DISPLACEMENT_BOUNDS
#define DISABLE_DISPLACEMENT_BOUNDS 0
#endif
FInstanceSceneData GetInstanceSceneDataUnchecked(inout FVisibleCluster VisibleCluster)
{
FInstanceSceneData InstanceData = GetInstanceSceneDataUnchecked( VisibleCluster.InstanceId );
#if NANITE_IMPOSTERS_SUPPORTED
// Couldn't have been stored so signals this is an imposter
if( VisibleCluster.Flags == (1 << NANITE_NUM_CULLING_FLAG_BITS) )
{
const uint MaxStreamingPages = 1 << 12;
VisibleCluster.PageIndex = MaxStreamingPages + (InstanceData.NaniteRuntimeResourceID & NANITE_MAX_GPU_PAGES_MASK);
}
#endif
return InstanceData;
}
FInstanceDynamicData CalculateInstanceDynamicData( FNaniteView NaniteView, FInstanceSceneData InstanceData, bool bSetUpForCulling = false)
{
FInstanceDynamicData DynamicData;
DynamicData.LocalToTranslatedWorld = DFFastToTranslatedWorld(InstanceData.LocalToWorld, NaniteView.PreViewTranslation);
if (bSetUpForCulling)
{
DynamicData.PrevLocalToTranslatedWorld = DFFastToTranslatedWorld(InstanceData.PrevLocalToWorld, NaniteView.PrevPreViewTranslationHZB);
}
else
{
DynamicData.PrevLocalToTranslatedWorld = DFFastToTranslatedWorld(InstanceData.PrevLocalToWorld, NaniteView.PrevPreViewTranslation);
}
DynamicData.bHasMoved = GetSceneData().FrameNumber == InstanceData.LastUpdateSceneFrameNumber;
return DynamicData;
}
float GetAbsMaxMaterialDisplacement(FPrimitiveSceneData PrimitiveData)
{
#if DISABLE_DISPLACEMENT_BOUNDS
return 0.0f;
#else
return max(-PrimitiveData.MinMaterialDisplacement, PrimitiveData.MaxMaterialDisplacement);
#endif
}
float GetMaxMaterialDisplacementExtent(FPrimitiveSceneData PrimitiveData, bool bFallbackRaster, bool bIsShadowPass)
{
const bool bDisplacementEnabled = !bFallbackRaster || bIsShadowPass ||
(PrimitiveData.PixelProgrammableDistanceSquared <= 0.0f && PrimitiveData.MaterialDisplacementFadeOutSize <= 0.0f);
return bDisplacementEnabled ? GetAbsMaxMaterialDisplacement(PrimitiveData) : 0.0f;
}
float3 GetLocalMaxWPOExtent(FPrimitiveSceneData PrimitiveData, FInstanceSceneData InstanceData, bool bEnableWPO = true)
{
const bool bHasAlwaysEvalWPOMaterial = (PrimitiveData.Flags & PRIMITIVE_SCENE_DATA_FLAG_HAS_ALWAYS_EVALUATE_WPO_MATERIALS) != 0;
return (bEnableWPO || bHasAlwaysEvalWPOMaterial) ? abs(PrimitiveData.MaxWPOExtent * InstanceData.InvNonUniformScale) : (float3)0;
}