mirror of
https://github.com/drewcassidy/KSP-Conformal-Decals.git
synced 2024-09-01 18:23:54 +00:00
45 lines
1.1 KiB
HLSL
45 lines
1.1 KiB
HLSL
#ifndef SDF_INCLUDED
|
|
#define SDF_INCLUDED
|
|
|
|
// based on functions by Inigo Quilez
|
|
// https://iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm
|
|
|
|
// SDF of a box
|
|
float sdBox( in float2 p, in float2 b ) {
|
|
float2 d = abs(p)-b;
|
|
return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
|
|
}
|
|
|
|
// SDF of a box with corner radius r
|
|
float sdRoundedBox( in float2 p, in float2 b, in float r ) {
|
|
float2 d = abs(p)-b+r;
|
|
return min(max(d.x,d.y),0.0) + length(max(d,0.0)) - r;
|
|
}
|
|
|
|
// SDF of a box with corner radius r, based on the current UV position
|
|
// UV must be ∈ (0,1), with (0,0) on one corner
|
|
float sdRoundedUVBox( float2 uv, float r ) {
|
|
float dx = ddx(uv.x);
|
|
float dy = ddy(uv.y);
|
|
|
|
float2 dim = abs(float2(1/dx, 1/dy));
|
|
float2 halfDim = dim / 2;
|
|
float2 pos = (dim * uv) - halfDim;
|
|
|
|
return sdRoundedBox(pos, halfDim, r);
|
|
}
|
|
|
|
inline float SDFdDist(float dist) {
|
|
return length(float2(ddx(dist), ddy(dist)));
|
|
}
|
|
|
|
inline float SDFAA(float dist, float ddist) {
|
|
float pixelDist = dist / ddist;
|
|
return saturate(0.5-pixelDist);
|
|
}
|
|
|
|
inline float SDFAA(float dist) {
|
|
return SDFAA(dist, SDFdDist(dist));
|
|
}
|
|
|
|
#endif |