precision highp float;
#define MAX_STEPS 100
#define MAX_DIST 100.0
#define INF 1000000.0
uniform vec2 resolution;
uniform vec2 mouse;
uniform float time;
float sdSphere(vec3 p, float r) {
return max(0.0, length(p) - r);
}
float sdBox(vec3 p, vec3 b) {
vec3 q = abs(p) - b;
return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0);
}
float sdCross(vec3 p) {
float da = sdBox(p.xyz,vec3(INF,1.0,1.0));
float db = sdBox(p.yzx,vec3(1.0,INF,1.0));
float dc = sdBox(p.zxy,vec3(1.0,1.0,INF));
return min(da,min(db,dc));
}
float map(in vec3 p) {
/*
vec3 m = vec3(1.0, 0.5, 1.0);
p = mod(vec3(0.0) - p, m) - m / 2.0;
return sphere(p);
*/
float box = sdBox(p, vec3(1.0));
float cr = sdCross(p*3.0)/3.0;
return max(box, -cr);
}
float raymarch(vec3 ro, vec3 rd, out float st) {
float t = 0.0;
int s = 0;
for (int i = 0; i < MAX_STEPS; i++) {
s = i;
vec3 p = ro + rd * t;
float d = map(p);
t += d;
if (t > MAX_DIST || d < 0.001) break;
}
st = 1.0 - float(s) / float(MAX_STEPS);
return t;
}
void main() {
vec3 ro = vec3(cos(mouse.x*3.0+time/5.0)*3.0, 0.0, sin(mouse.x*3.0+time/5.0)*3.0);
vec2 px = gl_FragCoord.xy;
vec2 uv = (px - 0.5 * resolution) / resolution.y;
vec3 rd = normalize(vec3(uv, -1.0));
float st = 0.0;
float t = raymarch(ro, rd, st);
vec3 color = t / 9.0 * vec3(1.0);
//vec3 color = vec3(rd);
gl_FragColor = vec4(color, 1.0);
}