Added textures

This commit is contained in:
2026-05-02 19:46:48 +10:00
parent 8ce556330f
commit 4308e0b6f6
7 changed files with 318 additions and 75 deletions

View File

@@ -1,9 +1,15 @@
{
"id": "dvd-bounce",
"name": "DVD Bounce",
"description": "A transparent DVD-style logo that bounces endlessly and changes color on each screen hit.",
"description": "A transparent bouncing DVD logo sprite that changes color on each screen hit.",
"category": "Built-in",
"entryPoint": "shadeVideo",
"textures": [
{
"id": "dvdLogoTexture",
"path": "DVD_Logo.png"
}
],
"parameters": [
{
"id": "logoScale",

View File

@@ -1,22 +1,3 @@
float sdBox(float2 p, float2 b)
{
float2 d = abs(p) - b;
return length(max(d, float2(0.0, 0.0))) + min(max(d.x, d.y), 0.0);
}
float sdRoundedBox(float2 p, float2 b, float r)
{
return sdBox(p, b - r) - r;
}
float sdSegment(float2 p, float2 a, float2 b)
{
float2 pa = p - a;
float2 ba = b - a;
float h = saturate(dot(pa, ba) / max(dot(ba, ba), 0.0001));
return length(pa - ba * h);
}
float pingPong(float x, float lengthValue)
{
float safeLength = max(lengthValue, 0.0001);
@@ -32,38 +13,14 @@ float3 hsvToRgb(float3 hsv)
return hsv.z * lerp(float3(1.0, 1.0, 1.0), rgb, hsv.y);
}
float letterD(float2 p, float scale)
{
float2 offset = p;
float stem = sdBox(offset + float2(scale * 0.18, 0.0), float2(scale * 0.065, scale * 0.47));
float outer = sdRoundedBox(offset + float2(scale * 0.03, 0.0), float2(scale * 0.30, scale * 0.47), scale * 0.23);
float inner = sdRoundedBox(offset + float2(scale * 0.11, 0.0), float2(scale * 0.15, scale * 0.24), scale * 0.12);
float bowl = max(outer, -inner);
return min(stem, bowl);
}
float letterV(float2 p, float scale)
{
float leftStroke = sdSegment(p, float2(-scale * 0.30, -scale * 0.48), float2(0.0, scale * 0.48)) - scale * 0.085;
float rightStroke = sdSegment(p, float2(scale * 0.30, -scale * 0.48), float2(0.0, scale * 0.48)) - scale * 0.085;
return min(leftStroke, rightStroke);
}
float logoLetters(float2 p, float scale)
{
float left = letterD(p + float2(scale * 0.92, 0.0), scale);
float middle = letterV(p, scale);
float right = letterD(p - float2(scale * 0.92, 0.0), scale);
return min(left, min(middle, right));
}
float4 shadeVideo(ShaderContext context)
{
float2 resolution = max(context.outputResolution, float2(1.0, 1.0));
float minDimension = min(resolution.x, resolution.y);
float logoAspect = 2.0;
float safeScale = max(logoScale, 0.05);
float2 logoHalfSize = float2(minDimension * safeScale * 0.82, minDimension * safeScale * 0.28);
float2 logoHalfSize = float2(minDimension * safeScale, minDimension * safeScale / logoAspect);
float2 paddingPx = float2(minDimension * max(edgePadding, 0.0), minDimension * max(edgePadding, 0.0));
float2 minCenterPx = logoHalfSize + paddingPx;
float2 maxCenterPx = resolution - logoHalfSize - paddingPx;
@@ -86,31 +43,30 @@ float4 shadeVideo(ShaderContext context)
float3 glowColor = hsvToRgb(float3(frac(hue + 0.06), 0.72, 1.0));
float2 fragPx = context.uv * resolution;
float2 p = fragPx - centerPx;
float2 logoMin = centerPx - logoHalfSize;
float2 logoSize = logoHalfSize * 2.0;
float2 logoUv = (fragPx - logoMin) / max(logoSize, float2(1.0, 1.0));
float insideX = step(0.0, logoUv.x) * step(logoUv.x, 1.0);
float insideY = step(0.0, logoUv.y) * step(logoUv.y, 1.0);
float inside = insideX * insideY;
float badgeDist = sdRoundedBox(p, logoHalfSize, logoHalfSize.y * 0.42);
float innerBadgeDist = sdRoundedBox(p, logoHalfSize - float2(minDimension * 0.012, minDimension * 0.012), logoHalfSize.y * 0.34);
float4 logoSample = dvdLogoTexture.Sample(logoUv);
logoSample *= inside;
float letterScale = logoHalfSize.y * 0.88;
float letterDist = logoLetters(p, letterScale);
float logoAlpha = logoSample.a;
float logoLuma = dot(logoSample.rgb, float3(0.299, 0.587, 0.114));
float3 tintedLogo = lerp(logoSample.rgb, badgeColor * max(logoLuma, 0.35), 0.88);
float aa = 1.5;
float badgeMask = 1.0 - smoothstep(0.0, aa, badgeDist);
float rimMask = 1.0 - smoothstep(0.0, aa, abs(badgeDist + minDimension * 0.01));
float innerShade = 1.0 - smoothstep(0.0, aa, innerBadgeDist);
float lettersMask = 1.0 - smoothstep(0.0, aa, letterDist);
float glowMask = (1.0 - smoothstep(0.0, minDimension * 0.04, badgeDist)) * glowAmount;
float2 edgeDistancePx = min(logoUv, 1.0 - logoUv) * logoSize;
float innerEdgePx = min(edgeDistancePx.x, edgeDistancePx.y);
float rim = (1.0 - smoothstep(0.0, 5.0, innerEdgePx)) * logoAlpha;
float glow = (1.0 - smoothstep(0.0, minDimension * 0.06, innerEdgePx + minDimension * 0.025)) * glowAmount * logoAlpha;
float3 color = float3(0.0, 0.0, 0.0);
color += glowColor * glowMask * 0.55;
color = lerp(color, badgeColor * 0.95, badgeMask);
color = lerp(color, badgeColor * 0.55 + float3(0.08, 0.08, 0.1), innerShade * 0.35);
color = lerp(color, float3(1.0, 1.0, 1.0), rimMask * 0.8);
color = lerp(color, float3(0.98, 0.99, 1.0), lettersMask);
float3 color = tintedLogo;
color += glowColor * glow * 0.6;
color = lerp(color, float3(1.0, 1.0, 1.0), rim * 0.32);
float alpha = max(badgeMask, glowMask * 0.45);
alpha = max(alpha, lettersMask);
alpha *= saturate(baseAlpha);
return float4(saturate(color), saturate(alpha));
float alpha = saturate(max(logoAlpha, glow * 0.5) * baseAlpha);
float3 premultipliedColor = saturate(color) * alpha;
return float4(premultipliedColor, alpha);
}