60 lines
2.7 KiB
Plaintext
60 lines
2.7 KiB
Plaintext
float rectMask(float2 uv, float2 minUv, float2 maxUv)
|
|
{
|
|
float2 insideMin = step(minUv, uv);
|
|
float2 insideMax = step(uv, maxUv);
|
|
return insideMin.x * insideMin.y * insideMax.x * insideMax.y;
|
|
}
|
|
|
|
float denoiseLevel(float value)
|
|
{
|
|
float gate = saturate(noiseGate);
|
|
float clean = saturate((value - gate) / max(1.0 - gate, 0.001));
|
|
return smoothstep(0.0, 1.0, clean);
|
|
}
|
|
|
|
float4 shadeVideo(ShaderContext context)
|
|
{
|
|
float4 color = context.sourceColor;
|
|
float2 size = orientation == 0 ? float2(meterScale, meterScale * 0.18) : float2(meterScale * 0.18, meterScale);
|
|
float2 minUv = clamp(meterPosition, 0.0, 1.0 - size);
|
|
float2 local = (context.uv - minUv) / max(size, float2(0.001));
|
|
float inside = rectMask(local, float2(0.0), float2(1.0));
|
|
if (inside <= 0.0)
|
|
return color;
|
|
|
|
float3 bg = lerp(color.rgb, float3(0.0), saturate(backgroundOpacity));
|
|
float leftLevel = denoiseLevel(context.audioRms.x * 2.4);
|
|
float rightLevel = denoiseLevel(context.audioRms.y * 2.4);
|
|
float leftPeak = denoiseLevel(context.audioPeak.x);
|
|
float rightPeak = denoiseLevel(context.audioPeak.y);
|
|
|
|
float bar = 0.0;
|
|
float peak = 0.0;
|
|
if (orientation == 0)
|
|
{
|
|
float leftRow = rectMask(local, float2(0.04, 0.58), float2(0.96, 0.86));
|
|
float rightRow = rectMask(local, float2(0.04, 0.14), float2(0.96, 0.42));
|
|
float leftFill = rectMask(local, float2(0.04, 0.58), float2(0.04 + 0.92 * leftLevel, 0.86));
|
|
float rightFill = rectMask(local, float2(0.04, 0.14), float2(0.04 + 0.92 * rightLevel, 0.42));
|
|
float leftPeakLine = rectMask(local, float2(0.04 + 0.92 * leftPeak - 0.006, 0.55), float2(0.04 + 0.92 * leftPeak + 0.006, 0.89));
|
|
float rightPeakLine = rectMask(local, float2(0.04 + 0.92 * rightPeak - 0.006, 0.11), float2(0.04 + 0.92 * rightPeak + 0.006, 0.45));
|
|
bar = max(leftFill, rightFill);
|
|
peak = max(leftPeakLine * leftRow, rightPeakLine * rightRow);
|
|
}
|
|
else
|
|
{
|
|
float leftColumn = rectMask(local, float2(0.14, 0.04), float2(0.42, 0.96));
|
|
float rightColumn = rectMask(local, float2(0.58, 0.04), float2(0.86, 0.96));
|
|
float leftFill = rectMask(local, float2(0.14, 0.04), float2(0.42, 0.04 + 0.92 * leftLevel));
|
|
float rightFill = rectMask(local, float2(0.58, 0.04), float2(0.86, 0.04 + 0.92 * rightLevel));
|
|
float leftPeakLine = rectMask(local, float2(0.11, 0.04 + 0.92 * leftPeak - 0.006), float2(0.45, 0.04 + 0.92 * leftPeak + 0.006));
|
|
float rightPeakLine = rectMask(local, float2(0.55, 0.04 + 0.92 * rightPeak - 0.006), float2(0.89, 0.04 + 0.92 * rightPeak + 0.006));
|
|
bar = max(leftFill * leftColumn, rightFill * rightColumn);
|
|
peak = max(leftPeakLine, rightPeakLine);
|
|
}
|
|
|
|
float3 metered = lerp(bg, meterColor.rgb, bar * saturate(meterOpacity) * meterColor.a);
|
|
metered = lerp(metered, peakColor.rgb, peak * saturate(meterOpacity) * peakColor.a);
|
|
return float4(metered, color.a);
|
|
}
|