Files
UnrealEngine/Engine/Shaders/Private/Nanite/NaniteSceneCommon.ush
2025-05-18 13:04:45 +08:00

76 lines
2.9 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 )
{
float4x4 LocalToTranslatedWorld = DFFastToTranslatedWorld(InstanceData.LocalToWorld, NaniteView.PreViewTranslation);
float4x4 PrevLocalToTranslatedWorld = DFFastToTranslatedWorld(InstanceData.PrevLocalToWorld, NaniteView.PrevPreViewTranslation);
FInstanceDynamicData DynamicData;
DynamicData.LocalToTranslatedWorld = LocalToTranslatedWorld;
DynamicData.PrevLocalToTranslatedWorld = PrevLocalToTranslatedWorld;
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;
}
float4x4 LoadNaniteAssemblyTransform(FInstanceSceneData InstanceData, FVisibleCluster VisibleCluster)
{
// This function is currently included by code that can't compile with HLSL 2021, so stub it
#if COMPILER_SUPPORTS_HLSL2021
checkSlow(IsAssemblyPartCluster(VisibleCluster));
return LoadNaniteAssemblyTransform(InstanceData.NaniteAssemblyTransformOffset, VisibleCluster.AssemblyTransformIndex);
#else
checkSlow(false);
return float4x4(float4(1, 0, 0, 0), float4(0, 1, 0, 0), float4(0, 0, 1, 0), float4(0, 0, 0, 1));
#endif
}