//////////////////////////////////////////////////////////// //~ Base 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 Affine; typedef float4 Rect; typedef float4 ClipRect; typedef float4 Aabb; typedef float4 Quad; typedef float4x4 Mat4x4; //////////////////////////////////////////////////////////// //~ Range types Struct(Rng) { f32 min; f32 max; }; Struct(RngI32) { i32 min; i32 max; }; Struct(RngU32) { u32 min; u32 max; }; Struct(Rng2) { Vec2 p0; Vec2 p1; }; Struct(Rng2I32) { Vec2I32 p0; Vec2I32 p1; }; Struct(Rng2U32) { Vec2U32 p0; Vec2U32 p1; }; Struct(Rng3) { Vec3 p0; Vec3 p1; }; Struct(Rng3I32) { Vec3I32 p0; Vec3I32 p1; }; Struct(Rng3U32) { Vec3U32 p0; Vec3U32 p1; }; //////////////////////////////////////////////////////////// //~ Countof template u32 countof(T arr[N]) { return N; } //////////////////////////////////////////////////////////// //~ C -> HLSL interoperability stubs //- Min #define MinU8 min #define MinI8 min #define MinU32 min #define MinI32 min #define MinF32 min #define MinU64 min #define MinI64 min #define MinF64 min //- Max #define MaxU8 max #define MaxI8 max #define MaxU32 max #define MaxI32 max #define MaxF32 max #define MaxU64 max #define MaxI64 max #define MaxF64 max //- Clamp #define ClampU32 clamp #define ClampI32 clamp #define ClampF32 clamp #define ClampU64 clamp #define ClampI64 clamp #define ClampF64 clamp //- Round #define RoundF32 round #define RoundF64 round //- Floor #define FloorF32 floor #define FloorF64 floor //- Ceil #define CeilF32 ceil #define CeilF64 ceil //- Trunc #define TruncF32 trunc #define TruncF64 trunc //- Mod #define ModF32 fmod #define ModF64 fmod //- Abs #define AbsF32 abs #define AbsF64 abs //- Sign #define SignF32 sign #define SignF64 sign //- Smoothstep #define SmoothstepF32 smoothstep #define SmoothstepF64 smoothstep //- Matchfloor #define MatchFloor(a, b) all(floor(a) == floor(b)) //////////////////////////////////////////////////////////// //~ Derivative helpers #define fwidth_fine(v) (abs(ddx_fine((v))) + abs(ddy_fine((v)))) //////////////////////////////////////////////////////////// //~ Color helpers Inline Vec4 Vec4FromU32(u32 v) { Vec4 result = 0; 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; } Inline u32 U32FromVec4(Vec4 v) { u32 result = 0; 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; } Inline f32 LinearFromSrgbF32(f32 srgb) { f32 result; if (srgb <= 0.04045f) { result = srgb / 12.92f; } else { result = pow((srgb + 0.055f) / 1.055f, 2.4f); } return result; } Inline Vec4 LinearFromSrgb(Vec4 srgb) { Vec4 result; result.x = LinearFromSrgbF32(srgb.x); result.y = LinearFromSrgbF32(srgb.y); result.z = LinearFromSrgbF32(srgb.z); result.w = srgb.w; return result; } Inline Vec4 Premul(Vec4 v) { Vec4 result; result.rgb = v.rgb * v.a; result.a = v.a; return result; } Inline Vec4 Unpremul(Vec4 v) { Vec4 result = 0; if (v.a > 0.0) { result.rgb = v.rgb / v.a; } result.a = v.a; return result; } Inline Vec4 BlendPremul(Vec4 src, Vec4 dst) { Vec4 result; result.rgb = src.rgb + (dst.rgb * (1.0 - src.a)); result.a = src.a + (dst.a * (1.0 - src.a)); return result; } //////////////////////////////////////////////////////////// //~ Vertex ID helpers Inline Vec2 RectUvFromIdx(u32 idx) { static const Vec2 uvs[4] = { Vec2(0, 0), Vec2(1, 0), Vec2(1, 1), Vec2(0, 1) }; return uvs[idx]; } //////////////////////////////////////////////////////////// //~ Ndc helpers Inline Vec2 NdcFromPos(Vec2 pos, Vec2 size) { Vec2 result; result = pos / size; result *= Vec2(2, -2); result += Vec2(-1, 1); return result; } Inline Vec2 NdcFromUv(Vec2 uv) { Vec2 result; result = uv; result *= Vec2(2, -2); result += Vec2(-1, 1); return result; } //////////////////////////////////////////////////////////// //~ String helpers // https://therealmjp.github.io/posts/hlsl-printf/ template u32 U32FromChar(in T c) { if(c == ' ') return 32; if(c == '!') return 33; if(c == '\"' || c == '\"') return 34; if(c == '#') return 35; if(c == '$') return 36; if(c == '%') return 37; if(c == '&') return 38; if(c == '\'') return 39; if(c == '(') return 40; if(c == ')') return 41; if(c == '*') return 42; if(c == '+') return 43; if(c == ',') return 44; if(c == '-') return 45; if(c == '.') return 46; if(c == '/') return 47; if(c == '0') return 48; if(c == '1') return 49; if(c == '2') return 50; if(c == '3') return 51; if(c == '4') return 52; if(c == '5') return 53; if(c == '6') return 54; if(c == '7') return 55; if(c == '8') return 56; if(c == '9') return 57; if(c == ':') return 58; if(c == ';') return 59; if(c == '<') return 60; if(c == '=') return 61; if(c == '>') return 62; if(c == '?') return 63; if(c == '@') return 64; if(c == 'A') return 65; if(c == 'B') return 66; if(c == 'C') return 67; if(c == 'D') return 68; if(c == 'E') return 69; if(c == 'F') return 70; if(c == 'G') return 71; if(c == 'H') return 72; if(c == 'I') return 73; if(c == 'J') return 74; if(c == 'K') return 75; if(c == 'L') return 76; if(c == 'M') return 77; if(c == 'N') return 78; if(c == 'O') return 79; if(c == 'P') return 80; if(c == 'Q') return 81; if(c == 'R') return 82; if(c == 'S') return 83; if(c == 'T') return 84; if(c == 'U') return 85; if(c == 'V') return 86; if(c == 'W') return 87; if(c == 'X') return 88; if(c == 'Y') return 89; if(c == 'Z') return 90; if(c == '[') return 91; if(c == '\\') return 92; if(c == ']') return 93; if(c == '^') return 94; if(c == '_') return 95; if(c == '`') return 96; if(c == 'a') return 97; if(c == 'b') return 98; if(c == 'c') return 99; if(c == 'd') return 100; if(c == 'e') return 101; if(c == 'f') return 102; if(c == 'g') return 103; if(c == 'h') return 104; if(c == 'i') return 105; if(c == 'j') return 106; if(c == 'k') return 107; if(c == 'l') return 108; if(c == 'm') return 109; if(c == 'n') return 110; if(c == 'o') return 111; if(c == 'p') return 112; if(c == 'q') return 113; if(c == 'r') return 114; if(c == 's') return 115; if(c == 't') return 116; if(c == 'u') return 117; if(c == 'v') return 118; if(c == 'w') return 119; if(c == 'x') return 120; if(c == 'y') return 121; if(c == 'z') return 122; if(c == '{') return 123; if(c == '|') return 124; if(c == '}') return 125; if(c == '~') return 126; return 0; }