76 lines
2.9 KiB
HLSL
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
|
|
} |