float sdBox(vec2 p, vec2 size)
{
vec2 q = abs(p) - size;
return length(max(q, 0.0))
+ min(max(q.x, q.y), 0.0);
}
float sdCircle(vec2 p, float r)
{
return length(p) - r;
}
float sdCar(vec2 p)
{
float d = sdBox(p, vec2(20.0, 30.0));
d = min(d, sdBox(p - vec2(-24.0, 21.0),
vec2(5.0, 9.0)));
d = min(d, sdBox(p - vec2(-24.0, -21.0),
vec2(5.0, 9.0)));
d = min(d, sdBox(p - vec2(24.0, 21.0),
vec2(5.0, 9.0)));
d = min(d, sdBox(p - vec2(24.0, -21.0),
vec2(5.0, 9.0)));
return d;
}
float sdBlinksOnRoad(vec2 p, float x)
{
float y = mod(p.y, 80.0) - 40.0;
return sdBox(
vec2(p.x - x, y),
vec2(3.0, 20.0)
);
}
float sdTree(vec2 p, float x)
{
float y = mod(p.y, 120.0) - 60.0;
vec2 treeP = vec2(p.x - x, y);
float d = sdBox(
treeP - vec2(0.0, -20.0),
vec2(3.0, 20.0)
);
d = min(d, sdCircle(treeP + vec2(0.0, 15.0), 15.0));
return d;
}
float sdRoad(vec2 p, float roadWight)
{
return abs(p.x) - (roadWight / 2.0);
}
float random(float x)
{
return fract(sin(x) * 963758.5453);
}
float objectY(float id)
{
float speed = 150.0;
float fallTime =
(iResolution.y + 80.0) / speed;
// Max пауза
float maxDelay = 1.0;
float period = fallTime + maxDelay;
float cycle = floor(iTime / period);
// Для каждого появления новая задержка
float delay = random(id + cycle) * maxDelay;
float time = mod(iTime, period);
if (time < delay)
return -100.0;
return iResolution.y + 20.0
- (time - delay) * speed;
}
float objectTree()
{
float speed = 150.0;
float fallTime =
(iResolution.y + 80.0) / speed;
float period = fallTime;
float cycle = floor(iTime / period);
float time = mod(iTime, period);
if (time < cycle)
return -100.0;
return iResolution.y + 20.0
- (time - cycle) * speed;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
vec3 color = vec3(57.0 / 255.0, 255.0 / 225.0, 40.0 / 255.0);
vec2 roadPos =
fragCoord - vec2(iResolution.x / 2.0, 0.0);
if (sdRoad(roadPos, iResolution.x / 2.0) < 0.0)
color = vec3(
128.0 / 255.0,
128.0 / 255.0,
128.0 / 255.0
);
float roadWidth = iResolution.x / 2.0;
if (sdBlinksOnRoad(roadPos, -roadWidth / 6.0) < 0.0)
color = vec3(1.0);
if (sdBlinksOnRoad(roadPos, roadWidth / 6.0) < 0.0)
color = vec3(1.0);
float treeSpeed = 150.0;
vec2 movingTreePos = roadPos;
movingTreePos.y += iTime * treeSpeed;
if (sdTree(movingTreePos, roadWidth / 2.0 + 30.0) < 0.0)
color = vec3(1.0);
if (sdTree(movingTreePos, -roadWidth / 2.0 - 30.0) < 0.0)
color = vec3(1.0);
float carX =
texelFetch(iChannel0, ivec2(0, 0), 0).r;
vec2 carPos =
vec2(carX, 60.0);
if (sdCar(fragCoord - carPos) < 0.0)
color = vec3(
220.0 / 255.0,
20.0 / 255.0,
60.0 / 255.0
);
vec2 object1 =
vec2(iResolution.x * 0.35, objectY(1.0));
if (sdCircle(fragCoord - object1, 20.0) < 0.0)
color = vec3(0.0, 0.0, 1.0);
vec2 object2 =
vec2(iResolution.x * 0.65, objectY(2.0));
if (sdBox(fragCoord - object2,
vec2(20.0)) < 0.0)
color = vec3(1.0, 1.0, 0.0);
fragColor = vec4(color, 1.0);
}