#include using namespace metal; // New Leaked 3I/Atlas NASA Footage — msm01 // MSL port of dbz.vk.glsl. struct ShadertoyUBO { float iTime; float2 iResolution; }; struct PassthroughVOut { float4 pos [[position]]; float2 uv; }; constant float NBCaps = 3.0; static float2x2 r2d(float a) { float c = cos(a), s = sin(a); return float2x2(c, s, -s, c); } static float hash12(float2 p) { float3 p3 = fract(float3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); } static float fbm(float2 v_p) { float pvpx = v_p.x; float2 V1 = float2(floor(pvpx)); float2 V2 = float2(floor(pvpx + 1.0)); return mix(hash12(V1), hash12(V2), smoothstep(0.0, 1.0, fract(pvpx))); } #define S(a,b,c) smoothstep(a,b,c) fragment float4 dbz_fs(PassthroughVOut in [[stage_in]], constant ShadertoyUBO& U [[buffer(0)]]) { float2 fragCoord = in.uv * U.iResolution; float2 p = float2((1.0 / U.iResolution.y) * (fragCoord.x - U.iResolution.x / 2.0), fragCoord.y / U.iResolution.y - 0.5); p.x = -p.x; p *= 150.0; float4 col = float4(0.05, 0.05, 0.15, 1.0); float2 save1 = p; p = p * r2d(-0.05); col = mix(col, float4(0.2, 0.3, 0.5, 1.0), smoothstep(75.0, 0.0, abs(p.y - 5.0 * fbm(float2(0.01 * (p.x - 33.333 * U.iTime))) + 3.5))); p = p * r2d(0.05); p = p * r2d(-0.05); p *= 0.35; p += float2(-5.0 * U.iTime, 0.0); float2 b = fract(5.0 * p); p = floor(5.0 * p); if (fbm(float2(p.x * p.y)) > 0.996) { col += clamp(1.0 - pow(3.0 * length(b + float2(-0.5)), 0.5), 0.0, 1.0); } p = save1; float2 save3; float Nb_Capsules = clamp(NBCaps, 0.0, 4.0); for (float i = 0.0; i < Nb_Capsules; i++) { p = save1; p = p * r2d(-0.05); p *= 2.5; p *= 1.0 - 0.25 * i; p += float2(150.0 * fbm(float2(0.15 * U.iTime + i * 54.321)) - 75.0, 50.0 * sin(0.25 * U.iTime + i * 54.321) - 25.0); save3 = p; p *= 0.04; p.y = abs(p.y); if (p.x > 0.0) { col += float4(0.0, 1.0, 0.5, 1.0) * smoothstep(0.2, 0.0, abs(p.y - 0.05 * fbm(float2(1.5 * p.x - 40.0 * U.iTime))) - 0.05) * smoothstep(29.0, 0.0, abs(p.x)); col += float4(1.0, 1.0, 1.0, 1.0) * smoothstep(0.1, 0.0, abs(p.y - 0.05 * fbm(float2(1.5 * p.x - 40.0 * U.iTime))) - 0.05) * smoothstep(29.0, 0.0, abs(p.x)); } p = save3; p.y = abs(p.y); p += float2(-10.0, 0.0); p *= float2(0.75, 1.0); col += 0.8 * float4(0.0, 1.0, 0.5, 1.0) * S(20.0, 0.0, length(p) - 25.0 + 7.0 * sin(0.30 * length(p) * atan2(p.y, p.x) + 55.0 * U.iTime)); col += 0.8 * float4(1.0, 1.0, 1.0, 1.0) * S(20.0, 0.0, length(p) - 20.0 + 7.0 * sin(0.30 * length(p) * atan2(p.y, p.x) + 55.0 * U.iTime)); p = save3; col = mix(col, float4(1.0), 0.5 * S(10.0, 0.0, length(p + float2(5.0, 0.0)) - 20.0) * abs(sin(50.0 * U.iTime))); col = mix(col, float4(1.0), 0.5 * S(20.0, 0.0, length(p + float2(5.0, 0.0)) - 20.0)); col = mix(col, float4(1.0), S(0.01, 0.0, length(p) - 20.0)); if (length(p) - 20.0 < 0.0) { col = mix(col, float4(0.65, 0.68, 0.68 + 0.1 * (3.0 - i), 1.0), S(0.5, 0.0, length(p - float2(2.0, 0.0)) - 17.0)); if (S(0.0, 1.0, length(float2(3.0, 2.0) * p + float2(33.5, 0.0)) - 23.0) > 0.0) { col = mix(col, float4(0.45, 0.55, 0.55 + 0.1 * (3.0 - i), 1.0), 0.75 * S(0.5, 0.0, length(p - float2(2.0, 0.0) + 0.5 * fbm(float2(4.5 * atan2(p.y, p.x)))) - 9.0)); } col = mix(col, float4(0.0), S(0.2, 0.0, abs(length(p) - 19.9) - 0.20)); col = mix(col, float4(0.5, 0.2, 0.3, 1.0) - S(5.0, 0.0, length(p + float2(-6.0, 15.0)) - 20.0) - S(0.25, 0.0, abs(length(p + float2(0.0, 3.0)) - 15.0) - 0.4) - S(0.0, 1.5, p.y - 8.5) + 0.25 * float4(1.0, 0.5, 0.0, 1.0) * S(10.0, 0.0, abs(p.y)) , S(0.5, 0.0, length(float2(3.0, 2.0) * p + float2(35.0, 0.0)) - 19.9)); col = mix(col, float4(0.0, 0.0, 0.0, 1.0), S(1.0, 0.0, abs(length(float2(3.0, 2.0) * p + float2(35.0, 0.0)) - 19.9) - 0.1)); col = mix(col, float4(0.0, 0.0, 0.0, 1.0), S(1.0, 0.0, abs(length(float2(3.0, 2.0) * p + float2(33.5, 0.0)) - 23.0) - 0.1)); if (p.y > 0.0) col = mix(col, float4(0.0, 0.0, 0.0, 1.0), S(1.0, 0.0, abs(length(float2(3.0, 2.0) * p + float2(29.0, 0.0)) - 30.0) - 0.1)); if (p.y < 0.0) col = mix(col, float4(0.0, 0.0, 0.0, 1.0), S(1.0, 0.0, abs(length(float2(3.0, 2.0) * p + float2(-31.0, 0.0)) - 30.0) - 0.1)); } } return clamp(col, 0.0, 1.0); }