//////////////////////////////////////////////////////////// //~ Shader math types #define Pi ((f32)3.14159265358979323846) #define Tau ((f32)6.28318530717958647693) #define GoldenRatio ((f32)1.61803398874989484820) typedef float2 Vec2; typedef float3 Vec3; typedef float4 Vec4; typedef int2 Vec2I32; typedef int3 Vec3I32; typedef int4 Vec4I32; typedef uint2 Vec2U32; typedef uint3 Vec3U32; typedef uint4 Vec4U32; typedef float2x3 Xform; typedef float4 Rect; typedef float4 ClipRect; typedef float4 Aabb; typedef float4 Quad; typedef float4x4 Mat4x4; //////////////////////////////////////////////////////////// //~ Handle dereference wrappers /* TODO: Non-uniform resource access is assumed as the default behavior. We * may want to add explicit "uniform" variants for optimization on AMD devices * in the future. */ template StructuredBuffer StructuredBufferFromHandle(StructuredBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } template RWStructuredBuffer RWStructuredBufferFromHandle(RWStructuredBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } ByteAddressBuffer ByteAddressBufferFromHandle(ByteAddressBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } RWByteAddressBuffer RWByteAddressBufferFromHandle(RWByteAddressBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } template Texture1D Texture1DFromHandle(Texture1DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } template Texture3D Texture3DFromHandle(Texture3DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } template RWTexture1D RWTexture1DFromHandle(RWTexture1DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } template Texture2D Texture2DFromHandle(Texture2DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } template RWTexture2D RWTexture2DFromHandle(RWTexture2DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } template RWTexture3D RWTexture3DFromHandle(RWTexture3DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } SamplerState SamplerStateFromHandle(SamplerStateHandle h) { return SamplerDescriptorHeap[NonUniformResourceIndex(h.v)]; } //////////////////////////////////////////////////////////// //~ Countof template u32 countof(T arr[N]) { return N; } template u32 countof(StructuredBuffer buff) { u32 result; buff.GetDimensions(result); return result; } template u32 countof(RWStructuredBuffer buff) { u32 result; buff.GetDimensions(result); return result; } u32 countof(ByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; } u32 countof(RWByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; } u32 countof(Texture1D tex) { u32 result; tex.GetDimensions(result); return result; } template u32 countof(RWTexture1D tex) { u32 result; tex.GetDimensions(result); return result; } Vec2U32 countof(Texture2D tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; } template Vec2U32 countof(RWTexture2D tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; } Vec3U32 countof(Texture3D tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; } template Vec3U32 countof(RWTexture3D tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; } //////////////////////////////////////////////////////////// //~ Color helpers Vec4 Vec4FromU32(u32 v) { Vec4 result; result.x = ((v >> 0) & 0xFF) / 255.0; result.y = ((v >> 8) & 0xFF) / 255.0; result.z = ((v >> 16) & 0xFF) / 255.0; result.w = ((v >> 24) & 0xFF) / 255.0; return result; } u32 U32FromVec4(Vec4 v) { u32 result; result |= (((u32)(v.x * 255.0)) & 0xFF) << 0; result |= (((u32)(v.y * 255.0)) & 0xFF) << 8; result |= (((u32)(v.z * 255.0)) & 0xFF) << 16; result |= (((u32)(v.w * 255.0)) & 0xFF) << 24; return result; } //////////////////////////////////////////////////////////// //~ Vertex ID helpers Vec2 RectUvFromVertexId(u32 id) { static const Vec2 uvs[4] = { Vec2(0, 0), Vec2(1, 0), Vec2(1, 1), Vec2(0, 1) }; return uvs[id]; } //////////////////////////////////////////////////////////// //~ Ndc helpers Vec2 NdcFromPos(Vec2 pos, Vec2 size) { Vec2 result; result = pos / size; result *= Vec2(2, -2); result += Vec2(-1, 1); return result; } Vec2 NdcFromUv(Vec2 uv) { Vec2 result; result = uv; result *= Vec2(2, -2); result += Vec2(-1, 1); return result; }