add LICENSE, shaders, Cargo.lock, and AUR package
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
#extension GL_OES_standard_derivatives : enable
|
||||
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
|
||||
uniform float time;
|
||||
uniform vec2 mouse;
|
||||
uniform vec2 resolution;
|
||||
|
||||
const float PI = 3.14159265;
|
||||
|
||||
mat2 rot(float a){
|
||||
float c = cos(a),s = sin(a);
|
||||
return mat2(c,s,-s,c);
|
||||
}
|
||||
|
||||
mat3 rot3D(float a){
|
||||
float c = cos(a),s = sin(a);
|
||||
return mat3(c,-s,0.,
|
||||
s,c,0.,
|
||||
0.,0.,1.0);
|
||||
}
|
||||
|
||||
float sphere(vec3 p){
|
||||
return length(p)-0.5;
|
||||
}
|
||||
|
||||
|
||||
|
||||
float deMengerSponge2(vec3 p, vec3 offset, float scale) {
|
||||
vec4 z = vec4(p, 1.0);
|
||||
for (int i = 0; i < 10; i++) {
|
||||
z = abs(z);
|
||||
if (z.x < z.y) z.xy = z.yx;
|
||||
if (z.x < z.z) z.xz = z.zx;
|
||||
if (z.y < z.z) z.yz = z.zy;
|
||||
z *= scale;
|
||||
z.xyz -= offset * (scale - 1.0);
|
||||
if (z.z < -0.5 * offset.z * (scale - 1.0))
|
||||
z.z += offset.z * (scale - 1.0);
|
||||
}
|
||||
return (length(max(abs(z.xyz) - vec3(1.0, 1.0, 1.0), 0.0))) / z.w;
|
||||
}
|
||||
|
||||
|
||||
|
||||
float de(vec3 p) {
|
||||
p.xy *= rot(time);
|
||||
p.yz *= rot(time);
|
||||
return deMengerSponge2(p, vec3(1.0), 3.0);
|
||||
}
|
||||
|
||||
float dist(vec3 p){
|
||||
|
||||
|
||||
|
||||
float d = de(p);
|
||||
//p.xy = vec2(0.0);
|
||||
p.xyz *= rot3D(time);
|
||||
p = abs(p);
|
||||
|
||||
for(int i = 0; i < 10; i++){
|
||||
//p.xy = mod(p.xy,4.0);
|
||||
|
||||
p.xzy *= rot3D(0.3);
|
||||
p.xyz *= rot3D(0.3);
|
||||
p.yz = mod(p.yz,2.0);
|
||||
|
||||
}
|
||||
|
||||
p.xyz *= rot3D(sin(time));
|
||||
d = min(d,sphere(p));
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
vec3 getnormal(vec3 p){
|
||||
float d = 0.0001;
|
||||
return normalize(vec3(
|
||||
dist(p+vec3(d,0.,0.))-dist(p+vec3(-d,0.,0.)),
|
||||
dist(p+vec3(0.,d,0.))-dist(p+vec3(0.,-d,0.)),
|
||||
dist(p+vec3(0.,0.,d))-dist(p+vec3(0.,0.,-d))
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
void main( void ) {
|
||||
|
||||
vec2 p = ( gl_FragCoord.xy *2.0 -resolution ) / min(resolution.x,resolution.y);
|
||||
|
||||
float angle = 60.0;
|
||||
float fov = angle * 0.5 * PI/180.0;
|
||||
vec3 cPos = vec3(0.0,0.0,4.0);
|
||||
vec3 LightDir = vec3(-0.577,0.577,0.577);
|
||||
|
||||
vec3 ray = normalize(vec3(sin(fov)*p.x,sin(fov)*p.y,-cos(fov)));
|
||||
|
||||
vec2 d = vec2(float(0.0));
|
||||
float rLen = 0.0;
|
||||
vec3 rPos = cPos;
|
||||
|
||||
for(int i = 0; i <99; i++){
|
||||
d.x = dist(rPos);
|
||||
d.y = de(rPos);
|
||||
rLen +=d.x;
|
||||
rPos = rLen*ray+cPos;
|
||||
}
|
||||
|
||||
if(abs(d.x)<0.001){
|
||||
vec3 normal = getnormal(rPos);
|
||||
float diff = clamp(dot(normal,LightDir),0.2,1.0);
|
||||
gl_FragColor = vec4( vec3(cos(time)*diff*cos(time)+0.5,cos(time)+0.5*diff,sin(time)*diff+0.5),1.0);
|
||||
if(abs(d.y)<0.001){
|
||||
gl_FragColor = vec4(vec3(diff*ray*cos(time)+0.25),1.0);
|
||||
}
|
||||
}else{
|
||||
gl_FragColor = vec4( vec3(0.0),1.0);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user