sh = () => raymarch({
eye: `vec3(6.2, 0, -5.2) * 1.5`,
distMin: 10e-5,
antiAliasing: 3,
sceneSDF: `
${iqSDF.opUnion()}
${iqSDF.opSmoothUnion()}
${iqSDF.opSubtraction()}
${iqSDF.opIntersection()}
${iqSDF.sdBox()}
${iqSDF.sdTorus()}
${iqSDF.sdCappedCylinder()}
${iqSDF.opSymXZ()}
${iqSDF.opSymXYZ()}
${iqSDF.opRep()}
${motionToolkit.easeInOutQuad()}
${motionToolkit.linearstep()}
${motionToolkit.linearstepUpDown()}
${glslSnippets.rotate3D()}
${glslSnippets.hg_sdf()}
vec3 fold(in vec3 p) {
const vec3 nc = vec3(-0.5,-0.809017,0.309017);
for(int i=0;i<5;i++) {
p.xy = abs(p.xy);
float t = 2.*min(0.,dot(p,nc));
p -= t*nc;
}
return p;
}
float glow = 0.;
float glow2 = 0.;
vec2 sceneSDF(vec3 p) {
p *= rotate3D(u_time * TAU, vec3(1, 1, 0));
vec3 pp = p;
vec2 d = vec2(1e10, 0.);
// const float N = 10.;
// for(float i = 0.; i < N; i ++) {
// float angle = (TAU / 4.) / (N - 1.) * i;
// vec3 q = vec3(cos(angle), 0., sin(angle)) * 3.2;
// float h = linearstepUpDown(.1, .15, .3, .35, mod(u_time + i * .01, .5)) * (cos(angle * 4.) * .3 + .3);
// d = opUnion(d, vec2(sdBox(opSymXZ(p) - q, vec3(vec2(.0001, h).xyx)), 1.));
// }
// glow += 0.01 / (0.01 + d.x * d.x * 50.) / (float(AA) * 4.);
float lasers = 10e5;
const float N2 = 6.;
p = fold(p);
p *= .5;
for(float i = 1.; i < N2; i ++) {
p = opSymXYZ(p);
p *= .95;
p -= .2 + sin(u_time * TAU) * .1;
p *= rotate3D(easeInOutQuad(mod(u_time + .2, 1.)) * TAU, vec3(0, 1, 1));
if (i > -1.) {
float l = (N2 - i) * .3;
float r = .1;
float dd = sdCappedCylinder(p, l, r);
dd = opUnion(dd, sdCappedCylinder(p.xzy, l, r));
dd = opUnion(dd, sdCappedCylinder(p.yxz, l, r));
if(mod(i, 3.) <= 1.) {
lasers = opUnion(lasers, sdCappedCylinder(p, l, .0001));
lasers = opUnion(lasers, sdCappedCylinder(p.xzy, l, .0001));
lasers = opUnion(lasers, sdCappedCylinder(p.yxz, l, .0001));
}
dd = opSubtraction(sdCappedCylinder(p, l + .1, r - .02), dd);
dd = opSubtraction(sdCappedCylinder(p.xzy, l + .1, r - .02), dd);
dd = opSubtraction(sdCappedCylinder(p.yxz, l + .1, r - .02), dd);
d = opUnion(d, vec2(dd, mod(i, 3.) + 1.));
//d = opUnion(d, vec2(dd, 1.));
}
}
d = opUnion(d, vec2(lasers, 0.));
glow2 += 0.01 / (0.01 + lasers * lasers * 50.) / (float(AA) * 4.);
return d;
}`,
computeColor: `
vec3 computeColor(vec3 ro, vec3 rd, vec3 pos, float d, float m) {
vec3 nor = calcNormal(pos);
vec3 ref = reflect(rd, nor); // reflected ray
// material
vec3 col = 0.45 + 0.35 * sin(vec3(0.05, 0.08, 0.10) * (m - 1.0));
if(m == 1.) col = vec3(0);
else if(m == 2.) col = vec3(1);
else if(m == 3.) col = vec3(1, 0, 0);
// lighting
float occ = calcAO(pos, nor); // ambient occlusion
vec3 lig = normalize(vec3(-0.4, 0.7, -0.6)); // sunlight
float amb = clamp(0.5 + 0.5 * nor.y, 0.0, 1.0); // ambient light
float dif = clamp(dot(nor, lig), 0.0, 1.0); // diffuse reflection from sunlight
// backlight
float bac = clamp(dot(nor, normalize(vec3(-lig.x, 0.0, -lig.z))), 0.0, 1.0) * clamp(1.0 - pos.y, 0.0, 1.0);
float dom = smoothstep(-0.1, 0.1, ref.y); // dome light
float fre = pow(clamp(1.0 + dot(nor, rd), 0.0, 1.0), 2.0); // fresnel
float spe = pow(clamp(dot(ref, lig), 0.0, 1.0), 16.0); // specular reflection
dif *= softshadow(pos, lig, 0.02, 2.5);
dom *= softshadow(pos, ref, 0.02, 2.5);
vec3 lin = vec3(0.0);
lin += 1.30 * dif * vec3(1.00, 0.80, 0.55);
lin += 2.00 * spe * vec3(1.00, 0.90, 0.70) * dif;
lin += 0.40 * amb * vec3(0.40, 0.60, 1.00) * occ;
lin += 0.50 * dom * vec3(0.40, 0.60, 1.00) * occ;
lin += 0.50 * bac * vec3(0.25, 0.25, 0.25) * occ;
lin += 0.25 * fre * vec3(1.00, 1.00, 1.00) * occ;
col = col * lin;
// mix in fog?
// col = mix(col, vec3(0.8, 0.9, 1.0), 1.0 - exp(-0.0002 * d * d * d));
col = mix( col, vec3(0.0), 1.0 - exp(-0.0005 * d * d * d));
// gamma
// col = pow(col, vec3(0.4545));
return col;
}`,
effect: `
vec3 effect(vec3 c) {
c += glow * vec3(.5, .2, 1.);
c += glow2 * vec3(1., .2, .2);
return c;
}`,
logShader: true
})