125 lines
3.0 KiB
HLSL
125 lines
3.0 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "../RayTracing/RayTracingCommon.ush"
|
|
#include "/Engine/Shared/LumenDefinitions.h"
|
|
|
|
struct FLumenRayHitBookmark
|
|
{
|
|
uint2 PackedData;
|
|
};
|
|
|
|
#define LUMEN_RAYHIT_BOOKMARK_MISS 0xFFFFFFFF
|
|
|
|
#define MATERIAL_INDEX 0
|
|
#define NORMAL_INDEX 1
|
|
#define GPU_SCENE_INSTANCE_INDEX 2
|
|
|
|
// #lumen_todo: Pack more aggressively. HitT - 2 bytes, GPUSceneIndex - 3 bytes, MaterialIndex - 3 bytes
|
|
struct FLumenMinimalPayload : FMinimalPayload
|
|
{
|
|
uint PackedData[3];
|
|
|
|
void SetIsTranslucent(uint bIsTranslucent)
|
|
{
|
|
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0x7FFFFFFF) | ((bIsTranslucent & 0x01) << 31);
|
|
}
|
|
|
|
uint IsTranslucent()
|
|
{
|
|
uint bIsTranslucent = (PackedData[MATERIAL_INDEX] >> 31) & 0x1;
|
|
return bIsTranslucent;
|
|
}
|
|
|
|
void SetIsTwoSided(uint bIsTwoSided)
|
|
{
|
|
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xBFFFFFFF) | ((bIsTwoSided & 0x01) << 30);
|
|
}
|
|
|
|
uint IsTwoSided()
|
|
{
|
|
uint bIsTwoSided = (PackedData[MATERIAL_INDEX] >> 30) & 0x1;
|
|
return bIsTwoSided;
|
|
}
|
|
|
|
void SetIsShadowRay(uint bIsShadowRay)
|
|
{
|
|
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xDFFFFFFF) | ((bIsShadowRay & 0x01) << 29);
|
|
}
|
|
|
|
uint IsShadowRay()
|
|
{
|
|
uint bIsShadowRay = (PackedData[MATERIAL_INDEX] >> 29) & 0x1;
|
|
return bIsShadowRay;
|
|
}
|
|
|
|
void SetIsAlphaMasked(uint bIsAlphaMasked)
|
|
{
|
|
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xEFFFFFFF) | ((bIsAlphaMasked & 0x01) << 28);
|
|
}
|
|
|
|
uint IsAlphaMasked()
|
|
{
|
|
uint bIsAlphaMasked = (PackedData[MATERIAL_INDEX] >> 28) & 0x1;
|
|
return bIsAlphaMasked;
|
|
}
|
|
|
|
void SetFrontFace(bool bFrontFace)
|
|
{
|
|
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xF7FFFFFF) | ((bFrontFace ? 1u : 0u) << 27);
|
|
}
|
|
|
|
uint IsFrontFace()
|
|
{
|
|
uint bIsTwoSided = (PackedData[MATERIAL_INDEX] >> 27) & 0x1;
|
|
return bIsTwoSided;
|
|
}
|
|
|
|
void SetIsDynamicGeometry(uint bIsDynamicGoeometry)
|
|
{
|
|
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xFBFFFFFF) | ((bIsDynamicGoeometry ? 1u : 0u) << 26);
|
|
}
|
|
|
|
uint IsDynamicGeometry()
|
|
{
|
|
uint bIsDynamicGeometry = (PackedData[MATERIAL_INDEX] >> 26) & 0x1;
|
|
return bIsDynamicGeometry;
|
|
}
|
|
|
|
void SetMaterialShaderIndex(uint MaterialShaderIndex)
|
|
{
|
|
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xFF800000) | (MaterialShaderIndex & LUMEN_MATERIAL_SHADER_INDEX_MASK);
|
|
}
|
|
|
|
uint GetMaterialShaderIndex()
|
|
{
|
|
uint MaterialShaderIndex = PackedData[MATERIAL_INDEX] & LUMEN_MATERIAL_SHADER_INDEX_MASK;
|
|
return MaterialShaderIndex;
|
|
}
|
|
|
|
void SetWorldNormal(float3 WorldNormal)
|
|
{
|
|
PackedData[NORMAL_INDEX] = PackNormalToUInt32(WorldNormal);
|
|
}
|
|
|
|
float3 GetWorldNormal()
|
|
{
|
|
return UnpackNormalFromUInt32(PackedData[NORMAL_INDEX]);
|
|
}
|
|
|
|
void SetGPUSceneInstanceIndex(uint GPUSceneInstanceIndex)
|
|
{
|
|
PackedData[GPU_SCENE_INSTANCE_INDEX] = GPUSceneInstanceIndex;
|
|
}
|
|
|
|
uint GetGPUSceneInstanceIndex()
|
|
{
|
|
return asint(PackedData[GPU_SCENE_INSTANCE_INDEX]);
|
|
}
|
|
};
|
|
|
|
#if IS_PAYLOAD_ENABLED(RT_PAYLOAD_TYPE_LUMEN_MINIMAL)
|
|
CHECK_RT_PAYLOAD_SIZE(FLumenMinimalPayload)
|
|
#endif
|