Texture1D tex : WAVEFORMDATA;
SamplerState sTex
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
};
struct VS_IN
{
float2 pos : POSITION;
float2 tc : TEXCOORD0;
};
struct PS_IN
{
float4 pos : SV_POSITION;
float2 tc : TEXCOORD0;
};
float4 backgroundColor : BACKGROUNDCOLOR;
float4 highlightColor : HIGHLIGHTCOLOR;
float4 selectionColor : SELECTIONCOLOR;
float4 textColor : TEXTCOLOR;
float cursorPos : CURSORPOSITION;
bool cursorVisible : CURSORVISIBLE;
float seekPos : SEEKPOSITION;
bool seeking : SEEKING;
float4 replayGain : REPLAYGAIN; // album gain, track gain, album peak, track peak
float2 viewportSize : VIEWPORTSIZE;
bool horizontal : ORIENTATION;
bool shade_played : SHADEPLAYED;
PS_IN VS( VS_IN input )
{
PS_IN output = (PS_IN)0;
float2 half_pixel = float2(1,-1) / viewportSize;
output.pos = float4(input.pos - half_pixel, 0, 1);
if (horizontal)
output.tc = float2((input.tc.x + 1.0) / 2.0, input.tc.y);
else
output.tc = float2((-input.tc.y + 1.0) / 2.0, input.tc.x);
return output;
}
float4 bar( float pos, float2 tc, float4 fg, float4 bg, float width, bool show )
{
float dist
= abs(pos
- tc.
x); float4 c = (show && dist < width)
? lerp(fg, bg, smoothstep(0, width, dist))
: bg;
return c;
}
float4 evaluate(float4 bg, float4 fg, float factor)
{
return saturate(lerp(bg, fg, factor));
}
float4 played( float pos, float2 tc, float4 bg, float factor)
{
float4 c = bg;
if (pos < tc.x)
{
c = evaluate(backgroundColor, highlightColor, factor);
}
else
{
c = evaluate(highlightColor, backgroundColor, factor);
}
return c;
}
float RMSfactor( float2 tc, float border )
{
// alpha 1 indicates biased texture
float4 minmaxrms = tex.Sample(sTex, tc.x);
if (replayGain.g != -1000) {
minmaxrms.
rgb *= pow(10,(replayGain.
g) / 20) * 2; //use track gain } else if (replayGain.r != -1000) {
minmaxrms.
rgb *= pow(10,(replayGain.
r) / 20) * 2; //use album gain }
minmaxrms.rgb -= 0.5 * minmaxrms.a;
minmaxrms.rgb *= 1.0 + minmaxrms.a;
float belowWave = tc.y + border - minmaxrms.r;
float aboveWave = tc.y - border - minmaxrms.g;
float factorWave
= min
(abs(belowWave
), abs(aboveWave
)); bool insideWave = (belowWave > 0 && aboveWave < 0);
float factor = insideWave ? (saturate(factorWave / border / 2)) : 0.0;
return factor;
}
float4 PS( PS_IN input ) : SV_Target
{
float dx, dy;
if (horizontal)
{
dx = 1/viewportSize.x;
dy = 1/viewportSize.y;
}
else
{
dx = 1/viewportSize.y;
dy = 1/viewportSize.x;
}
float factor = RMSfactor(input.tc, 2.5 * dy);
float4 c0 = evaluate(backgroundColor, textColor, factor);
if (shade_played)
c0 = played(cursorPos, input.tc, c0, factor);
c0 = bar(cursorPos, input.tc, selectionColor, c0, dx, cursorVisible);
c0 = bar(seekPos, input.tc, selectionColor, c0, dx, seeking );
return c0;
}
technique Render9
{
pass
{
VertexShader = compile vs_2_0 VS();
PixelShader = compile ps_2_0 PS();
}
}
VGV4dHVyZTFEIHRleCA6IFdBVkVGT1JNREFUQTsKClNhbXBsZXJTdGF0ZSBzVGV4CnsKICAgIEZpbHRlciA9IE1JTl9NQUdfTUlQX0xJTkVBUjsKICAgIEFkZHJlc3NVID0gQ2xhbXA7Cn07CgpzdHJ1Y3QgVlNfSU4KewoJZmxvYXQyIHBvcyA6IFBPU0lUSU9OOwoJZmxvYXQyIHRjIDogVEVYQ09PUkQwOwp9OwoKc3RydWN0IFBTX0lOCnsKCWZsb2F0NCBwb3MgOiBTVl9QT1NJVElPTjsKCWZsb2F0MiB0YyA6IFRFWENPT1JEMDsKfTsKCgpmbG9hdDQgYmFja2dyb3VuZENvbG9yIDogQkFDS0dST1VORENPTE9SOwpmbG9hdDQgaGlnaGxpZ2h0Q29sb3IgIDogSElHSExJR0hUQ09MT1I7CmZsb2F0NCBzZWxlY3Rpb25Db2xvciAgOiBTRUxFQ1RJT05DT0xPUjsKZmxvYXQ0IHRleHRDb2xvciAgICAgICA6IFRFWFRDT0xPUjsKZmxvYXQgY3Vyc29yUG9zICAgICAgICA6IENVUlNPUlBPU0lUSU9OOwpib29sIGN1cnNvclZpc2libGUgICAgIDogQ1VSU09SVklTSUJMRTsKZmxvYXQgc2Vla1BvcyAgICAgICAgICA6IFNFRUtQT1NJVElPTjsKYm9vbCBzZWVraW5nICAgICAgICAgICA6IFNFRUtJTkc7CmZsb2F0NCByZXBsYXlHYWluICAgICAgOiBSRVBMQVlHQUlOOyAvLyBhbGJ1bSBnYWluLCB0cmFjayBnYWluLCBhbGJ1bSBwZWFrLCB0cmFjayBwZWFrCmZsb2F0MiB2aWV3cG9ydFNpemUgICAgOiBWSUVXUE9SVFNJWkU7CmJvb2wgaG9yaXpvbnRhbCAgICAgICAgOiBPUklFTlRBVElPTjsKYm9vbCBzaGFkZV9wbGF5ZWQgICAgICA6IFNIQURFUExBWUVEOwoKUFNfSU4gVlMoIFZTX0lOIGlucHV0ICkKewoJUFNfSU4gb3V0cHV0ID0gKFBTX0lOKTA7CgoJZmxvYXQyIGhhbGZfcGl4ZWwgPSBmbG9hdDIoMSwtMSkgLyB2aWV3cG9ydFNpemU7CglvdXRwdXQucG9zID0gZmxvYXQ0KGlucHV0LnBvcyAtIGhhbGZfcGl4ZWwsIDAsIDEpOwoJaWYgKGhvcml6b250YWwpCgkJb3V0cHV0LnRjID0gZmxvYXQyKChpbnB1dC50Yy54ICsgMS4wKSAvIDIuMCwgaW5wdXQudGMueSk7CgllbHNlCgkJb3V0cHV0LnRjID0gZmxvYXQyKCgtaW5wdXQudGMueSArIDEuMCkgLyAyLjAsIGlucHV0LnRjLngpOwoKCXJldHVybiBvdXRwdXQ7Cn0KCmZsb2F0NCBiYXIoIGZsb2F0IHBvcywgZmxvYXQyIHRjLCBmbG9hdDQgZmcsIGZsb2F0NCBiZywgZmxvYXQgd2lkdGgsIGJvb2wgc2hvdyApCnsKCWZsb2F0IGRpc3QgPSBhYnMocG9zIC0gdGMueCk7CglmbG9hdDQgYyA9IChzaG93ICYmIGRpc3QgPCB3aWR0aCkKCQk/IGxlcnAoZmcsIGJnLCBzbW9vdGhzdGVwKDAsIHdpZHRoLCBkaXN0KSkKCQk6IGJnOwoJcmV0dXJuIGM7Cn0KCmZsb2F0NCBldmFsdWF0ZShmbG9hdDQgYmcsIGZsb2F0NCBmZywgZmxvYXQgZmFjdG9yKQp7CglyZXR1cm4gc2F0dXJhdGUobGVycChiZywgZmcsIGZhY3RvcikpOwp9CgpmbG9hdDQgcGxheWVkKCBmbG9hdCBwb3MsIGZsb2F0MiB0YywgZmxvYXQ0IGJnLCBmbG9hdCBmYWN0b3IpCnsKCWZsb2F0NCBjID0gYmc7CglpZiAocG9zIDwgdGMueCkKCXsKCQljID0gZXZhbHVhdGUoYmFja2dyb3VuZENvbG9yLCBoaWdobGlnaHRDb2xvciwgZmFjdG9yKTsKCX0KCWVsc2UKCXsKCQljID0gZXZhbHVhdGUoaGlnaGxpZ2h0Q29sb3IsIGJhY2tncm91bmRDb2xvciwgZmFjdG9yKTsKCX0KCXJldHVybiBjOwp9CgpmbG9hdCBSTVNmYWN0b3IoIGZsb2F0MiB0YywgZmxvYXQgYm9yZGVyICkKewoJLy8gYWxwaGEgMSBpbmRpY2F0ZXMgYmlhc2VkIHRleHR1cmUKCWZsb2F0NCBtaW5tYXhybXMgPSB0ZXguU2FtcGxlKHNUZXgsIHRjLngpOwoJaWYgKHJlcGxheUdhaW4uZyAhPSAtMTAwMCkgewoJCW1pbm1heHJtcy5yZ2IgKj0gcG93KDEwLChyZXBsYXlHYWluLmcpIC8gMjApICogMjsgLy91c2UgdHJhY2sgZ2FpbgoJfSBlbHNlIGlmIChyZXBsYXlHYWluLnIgIT0gLTEwMDApIHsKCQltaW5tYXhybXMucmdiICo9IHBvdygxMCwocmVwbGF5R2Fpbi5yKSAvIDIwKSAqIDI7IC8vdXNlIGFsYnVtIGdhaW4KCX0KCW1pbm1heHJtcy5yZ2IgLT0gMC41ICogbWlubWF4cm1zLmE7CgltaW5tYXhybXMucmdiICo9IDEuMCArIG1pbm1heHJtcy5hOwoKCWZsb2F0IGJlbG93V2F2ZSA9IHRjLnkgKyBib3JkZXIgLSBtaW5tYXhybXMucjsKCWZsb2F0IGFib3ZlV2F2ZSA9IHRjLnkgLSBib3JkZXIgLSBtaW5tYXhybXMuZzsKCWZsb2F0IGZhY3RvcldhdmUgPSBtaW4oYWJzKGJlbG93V2F2ZSksIGFicyhhYm92ZVdhdmUpKTsKCWJvb2wgaW5zaWRlV2F2ZSA9IChiZWxvd1dhdmUgPiAwICYmIGFib3ZlV2F2ZSA8IDApOwoKCWZsb2F0IGZhY3RvciA9IGluc2lkZVdhdmUgPyAoc2F0dXJhdGUoZmFjdG9yV2F2ZSAvIGJvcmRlciAvIDIpKSA6IDAuMDsKCglyZXR1cm4gZmFjdG9yOwp9CgpmbG9hdDQgUFMoIFBTX0lOIGlucHV0ICkgOiBTVl9UYXJnZXQKewoJZmxvYXQgZHgsIGR5OwoJaWYgKGhvcml6b250YWwpCgl7CgkJZHggPSAxL3ZpZXdwb3J0U2l6ZS54OwoJCWR5ID0gMS92aWV3cG9ydFNpemUueTsKCX0KCWVsc2UKCXsKCQlkeCA9IDEvdmlld3BvcnRTaXplLnk7CgkJZHkgPSAxL3ZpZXdwb3J0U2l6ZS54OwoJfQoKCWZsb2F0IGZhY3RvciA9IFJNU2ZhY3RvcihpbnB1dC50YywgMi41ICogZHkpOwoKCWZsb2F0NCBjMCA9IGV2YWx1YXRlKGJhY2tncm91bmRDb2xvciwgdGV4dENvbG9yLCBmYWN0b3IpOwoJaWYgKHNoYWRlX3BsYXllZCkKCQljMCA9IHBsYXllZChjdXJzb3JQb3MsIGlucHV0LnRjLCBjMCwgZmFjdG9yKTsKCWMwID0gYmFyKGN1cnNvclBvcywgaW5wdXQudGMsIHNlbGVjdGlvbkNvbG9yLCBjMCwgZHgsIGN1cnNvclZpc2libGUpOwoJYzAgPSBiYXIoc2Vla1BvcywgICBpbnB1dC50Yywgc2VsZWN0aW9uQ29sb3IsIGMwLCBkeCwgc2Vla2luZyAgICAgICk7CglyZXR1cm4gYzA7Cn0KCnRlY2huaXF1ZSBSZW5kZXI5CnsKCXBhc3MKCXsKCQlWZXJ0ZXhTaGFkZXIgPSBjb21waWxlIHZzXzJfMCBWUygpOwoJCVBpeGVsU2hhZGVyID0gY29tcGlsZSBwc18yXzAgUFMoKTsKCX0KfQo=