39 lines
1.5 KiB
HLSL
39 lines
1.5 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
/*=============================================================================
|
|
MeshDistanceFieldCommon.ush
|
|
=============================================================================*/
|
|
|
|
#pragma once
|
|
|
|
float DistanceToNearestSurfaceForObject(FDFObjectData DFObjectData, FDFVector3 WorldPosition, float MaxDistance)
|
|
{
|
|
const float3 VolumePosition = DFMultiplyDemote(WorldPosition, DFObjectData.WorldToVolume);
|
|
|
|
const float3 ClampedVolumePosition = clamp(VolumePosition, -DFObjectData.VolumePositionExtent, DFObjectData.VolumePositionExtent);
|
|
|
|
const float3 ToBox = (abs(VolumePosition) - DFObjectData.VolumePositionExtent) * DFObjectData.VolumeToWorldScale;
|
|
const float DistanceToBoxOutside = length(max(0.0f, ToBox));
|
|
const float DistanceToBoxInside = min(0.0f, max3(ToBox.x, ToBox.y, ToBox.z));
|
|
const float DistanceToBox = DistanceToBoxOutside + DistanceToBoxInside;
|
|
|
|
float DistanceToOccluder = MaxDistance;
|
|
|
|
BRANCH
|
|
if (DistanceToBox < MaxDistance)
|
|
{
|
|
DistanceToOccluder = DistanceToMeshSurfaceStandalone(ClampedVolumePosition, DFObjectData) * DFObjectData.VolumeScale + max(0.0f, DistanceToBox);
|
|
|
|
// Don't allow negative SDF distance to stick out of the bounding box
|
|
DistanceToOccluder = max(DistanceToOccluder, DistanceToBox);
|
|
}
|
|
|
|
return DistanceToOccluder;
|
|
}
|
|
|
|
float DistanceToNearestSurfaceForObject(uint ObjectIndex, FDFVector3 WorldPosition, float MaxDistance)
|
|
{
|
|
FDFObjectData DFObjectData = LoadDFObjectData(ObjectIndex);
|
|
return DistanceToNearestSurfaceForObject(DFObjectData, WorldPosition, MaxDistance);
|
|
}
|