#define AS_LIB 1
int get_shape() {
return int(iTime) % 52;
}
#include "/forest/shader/implicit.glsl"
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = 2.*(fragCoord-iResolution.xy/2.)/iResolution.y; // contains [-1,1]^2
vec3 col = vec3(0.);
// Camera rays
vec3 camPos = vec3(4.,0.,0.);
vec3 camDir = - normalize(camPos);
vec3 rayPos, rayDir;
float zoom = 1.3; // 1.8*cos(iTime);
// if (checkKey(KEY_E)) zoom = 0.5;
float fov = 0.4*zoom;
float fov_ortho = 1.5*zoom;
#if perspective
// perspective cam
rayPos = camPos;
rayDir = normalize(camDir + fov*vec3(0., uv.x, uv.y));
#else
// orthographic cam
rayPos = camPos + fov_ortho*vec3(0., uv.x, uv.y);
rayDir = camDir;
#endif
// for perspective background in orthographic mode
vec3 cubemapDir = normalize(camDir + fov*vec3(0., uv.x, uv.y));
// Mouse-controlled rotation
vec2 mouse = initMouse + vec2(0.015625*sin(iTime*PI), 0.0); // initMouse; // iMouse.xy == vec2(0.,0.) ? initMouse : (iMouse.xy/iResolution.xy - 0.5);
float yaw = clamp(- mouse.x * 2.*PI * 1., -PI,PI);
float pitch = clamp( mouse.y * PI * 1.2, -PI*0.5, PI*0.5);
// pitch and yaw rotations (column-wise matrices)
mat3 rot = mat3(cos(yaw), sin(yaw), 0., -sin(yaw), cos(yaw), 0., 0., 0., 1.);
rot = rot * mat3(cos(pitch), 0., -sin(pitch), 0., 1., 0., sin(pitch), 0., cos(pitch));
// apply
camPos = rot*camPos;
camDir = rot*camDir;
rayPos = rot*rayPos;
rayDir = rot*rayDir;
cubemapDir = rot*cubemapDir;
//cubemapDir = vec3(cubemapDir.x, cubemapDir.z, cubemapDir.y);
vec3 hitPoint = raycast(rayPos, rayDir);
if (hitPoint == BINGO) { fragColor = vec4(BINGO,1.0); return; }
//if (hitPoint == NOHIT) { fragColor = vec4(NOHIT,1.0); return; }
//if (hitPoint == NOBOUNDHIT) { fragColor = vec4(NOBOUNDHIT,1.0); return; }
//if (hitPoint == ESCAPEDBOUNDS) { fragColor = vec4(ESCAPEDBOUNDS,1.0); return; }
//if (hitPoint == MAXDISTREACHED) { fragColor = vec4(MAXDISTREACHED,1.0); return; }
//if (hitPoint == MAXITERREACHED) { fragColor = vec4(MAXITERREACHED,1.0); return; }
if (hitPoint == NOBOUNDHIT || hitPoint == NOHIT || hitPoint == ESCAPEDBOUNDS || hitPoint == MAXITERREACHED) {
//fragColor = vec4(vec3(0.2),1.0); return;
// make background transparent
fragColor = vec4(0.0,0.0,0.0,0.0); return;
col = with_background(cubemapDir);
#if showBoundingCube
// darken bounding cube
if (hitPoint != NOBOUNDHIT) { col *= vec3(0.7); }
#endif
fragColor = vec4(col,1.0); return;
}
vec3 grad = gradf(hitPoint+1.1*EPS*(-rayDir));
float s = -sign(dot(grad,rayDir));
col = with_color_mode(grad, s, hitPoint, camPos);
col = clamp(col, 0., 1.);
col = with_surface_pattern(col, hitPoint);
col = with_shading(col, grad, s, rayDir);
col = clamp(col, 0., 1.);
fragColor = vec4(col,1.0);
}
adapted from Rogolop's Implicit surfaces