85 lines
2.2 KiB
HLSL
85 lines
2.2 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "VirtualShadowMapPageCacheCommon.ush"
|
|
#include "../ViewData.ush"
|
|
#include "../Nanite/NaniteSceneCommon.ush"
|
|
|
|
struct FShadowCasterDrawParameters
|
|
{
|
|
float3 Color;
|
|
bool bShowBounds;
|
|
};
|
|
|
|
FShadowCasterDrawParameters GetShadowCasterDrawParameters(
|
|
in FNaniteView NaniteView,
|
|
in FInstanceSceneData InstanceData,
|
|
in FInstanceViewData InstanceViewData,
|
|
in FInstanceDynamicData InstanceDynamicData,
|
|
in FPrimitiveSceneData PrimitiveData)
|
|
{
|
|
FShadowCasterDrawParameters Result;
|
|
|
|
const uint PrimitiveId = InstanceData.PrimitiveId;
|
|
const uint InstanceId = InstanceData.InstanceId;
|
|
|
|
const bool bCastShadow = (PrimitiveData.Flags & PRIMITIVE_SCENE_DATA_FLAG_CAST_SHADOWS) != 0;
|
|
if (bCastShadow)
|
|
{
|
|
// TODO: We need to figure out a way to try and better visualize shadow clipmap WPO distances
|
|
const bool bAllowWPO = VirtualShadowMapIsWPOAllowed(PrimitiveData, -1);
|
|
const bool bCastShadowAsStatic = ShouldCacheInstanceAsStatic(InstanceId, false, bAllowWPO, NaniteView.SceneRendererPrimaryViewId);
|
|
const bool bIsDeforming = InstanceViewData.bIsDeforming;
|
|
if (bCastShadowAsStatic)
|
|
{
|
|
if (InstanceDynamicData.bHasMoved || bIsDeforming)
|
|
{
|
|
Result.Color = float3(1, 0, 0);
|
|
Result.bShowBounds = true;
|
|
}
|
|
else
|
|
{
|
|
Result.Color = float3(0, 1, 0);
|
|
Result.bShowBounds = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Might not actually invalidate if outside WPO range.
|
|
bool bMayInvalidate = bAllowWPO;
|
|
bool bDefinitelyInvalidating = InstanceDynamicData.bHasMoved || bIsDeforming;
|
|
if (bDefinitelyInvalidating)
|
|
{
|
|
Result.Color = float3(0.5f, 0, 0.5f);
|
|
Result.bShowBounds = true;
|
|
}
|
|
else if (bMayInvalidate)
|
|
{
|
|
Result.Color = float3(0, 0, 1);
|
|
Result.bShowBounds = true;
|
|
}
|
|
else
|
|
{
|
|
Result.Color = float3(0, 1, 1);
|
|
Result.bShowBounds = false;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
const bool bCastContactShadow = (PrimitiveData.Flags & PRIMITIVE_SCENE_DATA_FLAG_HAS_CAST_CONTACT_SHADOW) != 0;
|
|
if (bCastContactShadow)
|
|
{
|
|
Result.Color = float3(1, 1, 0);
|
|
Result.bShowBounds = false;
|
|
}
|
|
else
|
|
{
|
|
Result.Color = float3(0.5f, 0.5f, 0.5f);
|
|
Result.bShowBounds = false;
|
|
}
|
|
}
|
|
|
|
return Result;
|
|
} |