72 lines
2.2 KiB
HLSL
72 lines
2.2 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
// Must match LumenRadianceCacheInternal.h
|
|
#define RADIANCE_CACHE_TRACE_TILE_SIZE_2D 8
|
|
#define RADIANCE_CACHE_TRACE_TILE_SIZE_1D (RADIANCE_CACHE_TRACE_TILE_SIZE_2D * RADIANCE_CACHE_TRACE_TILE_SIZE_2D)
|
|
#define TRACE_TILE_GROUP_STRIDE 128
|
|
|
|
struct FProbeTraceData
|
|
{
|
|
float3 ProbeWorldCenter; // LUMEN_LWC_TODO
|
|
uint ClipmapIndex;
|
|
uint ProbeIndex;
|
|
bool bForceDownsample;
|
|
};
|
|
|
|
float4 PackProbeTraceData(float3 ProbeWorldPosition, uint ClipmapIndex, uint ProbeIndex, bool bForceDownsample)
|
|
{
|
|
float4 Packed;
|
|
Packed.xyz = ProbeWorldPosition;
|
|
|
|
uint PackedW = (ClipmapIndex << 24u) | ProbeIndex;
|
|
PackedW |= bForceDownsample ? (1u << 31u) : 0;
|
|
Packed.w = asfloat(PackedW);
|
|
|
|
return Packed;
|
|
}
|
|
|
|
FProbeTraceData GetProbeTraceDataNoOffset(float4 InProbeTraceData)
|
|
{
|
|
FProbeTraceData ProbeTraceData;
|
|
ProbeTraceData.ProbeWorldCenter = InProbeTraceData.xyz;
|
|
uint PackedW = asuint(InProbeTraceData.w);
|
|
ProbeTraceData.ClipmapIndex = (PackedW >> 24u) & 0x7F;
|
|
ProbeTraceData.ProbeIndex = PackedW & 0xFFFFFF;
|
|
ProbeTraceData.bForceDownsample = (PackedW >> 31u) & 0x1 ? true : false;
|
|
|
|
return ProbeTraceData;
|
|
}
|
|
|
|
FProbeTraceData GetProbeTraceData(float4 InProbeTraceData)
|
|
{
|
|
FProbeTraceData ProbeTraceData = GetProbeTraceDataNoOffset(InProbeTraceData);
|
|
//#lumen_todo: start using it or completely remove
|
|
// ProbeTraceData.ProbeWorldCenter += ProbeWorldOffset[ProbeIndex].xyz;
|
|
return ProbeTraceData;
|
|
}
|
|
|
|
uint GetProbeIndexFromProbeTraceData(float4 InProbeTraceData)
|
|
{
|
|
return GetProbeTraceDataNoOffset(InProbeTraceData).ProbeIndex;
|
|
}
|
|
|
|
uint2 PackTraceTileInfo(uint2 TraceTileCoord, uint Level, uint ProbeTraceIndex)
|
|
{
|
|
return uint2((TraceTileCoord.x & 0xFF) | ((TraceTileCoord.y & 0xFF) << 8) | ((Level & 0xFF) << 16), ProbeTraceIndex);
|
|
}
|
|
|
|
uint2 UnpackTraceTileInfo(uint2 TraceTileInfo)
|
|
{
|
|
uint2 TraceTileCoord;
|
|
TraceTileCoord.x = TraceTileInfo.x & 0xFF;
|
|
TraceTileCoord.y = (TraceTileInfo.x >> 8) & 0xFF;
|
|
return TraceTileCoord;
|
|
}
|
|
|
|
void UnpackTraceTileInfo(uint2 TraceTileInfo, out uint2 TraceTileCoord, out uint Level, out uint ProbeTraceIndex)
|
|
{
|
|
TraceTileCoord = UnpackTraceTileInfo(TraceTileInfo);
|
|
Level = (TraceTileInfo.x >> 16) & 0xFF;
|
|
ProbeTraceIndex = TraceTileInfo.y;
|
|
}
|