@@ -4,6 +4,7 @@ precision mediump float;
4
4
5
5
uniform vec3 resolution;
6
6
uniform float pixelRatio;
7
+ uniform float time;
7
8
uniform vec3 eye;
8
9
uniform vec3 center;
9
10
uniform int example;
@@ -25,17 +26,27 @@ float sdCylinder(vec3 p, vec3 c) {
25
26
}
26
27
27
28
float sdTorus(vec3 p, vec2 t) {
28
- vec2 q = vec2 (length (p.xz)- t.x,p.y);
29
- return length (q)- t.y;
29
+ vec2 q = vec2 (length (p.xz)- t.x,p.y);
30
+ return length (q)- t.y;
30
31
}
31
32
33
+ float sdVerticalCapsule(vec3 p, float h, float r) {
34
+ p.y -= clamp (p.y, 0.0 , h);
35
+ return length (p) - r;
36
+ }
37
+
38
+
32
39
// End primitive SDFs --
33
40
34
41
float opSmoothUnion( float d1, float d2, float k ) {
35
42
float h = clamp ( 0.5 + 0.5 * (d2- d1)/ k, 0.0 , 1.0 );
36
43
return mix ( d2, d1, h ) - k* h* (1.0 - h);
37
44
}
38
45
46
+ mat2 rotate(float theta) {
47
+ return mat2 (cos (theta), - sin (theta), sin (theta), cos (theta));
48
+ }
49
+
39
50
float map(vec3 pos) {
40
51
if (example == 1 ) {
41
52
float torus = sdTorus(pos, vec2 (1.0 , 0.15 ));
@@ -47,6 +58,17 @@ float map(vec3 pos) {
47
58
float cyl2 = sdCylinder(pos.yzx, vec3 (0.0 , 0.0 , 0.5 ));
48
59
float cyl3 = sdCylinder(pos.zxy, vec3 (0.0 , 0.0 , 0.5 ));
49
60
return max (- min (cyl1, min (cyl2, cyl3)), base);
61
+ } else if (example == 3 ) {
62
+ const float tau = 6.28318 ;
63
+ float phase = time / 10.0 ;
64
+ float torus1 = sdTorus(vec3 (rotate(tau * phase) * pos.xy, pos.z), vec2 (0.8 , 0.2 ));
65
+ float torus2 = sdTorus(vec3 (pos.x, rotate(tau * (phase + 0.6 )) * pos.yz), vec2 (0.8 , 0.2 ));
66
+
67
+ vec3 vpos = vec3 (rotate(2.0 * tau * phase) * pos.xy, pos.z);
68
+ vpos.y += 0.8 + 0.1 * sin (tau * phase * 1.2 );
69
+ float rod = sdVerticalCapsule(vpos, 1.6 , 0.2 );
70
+
71
+ return opSmoothUnion(opSmoothUnion(torus1, torus2, 0.4 ), rod, 0.6 );
50
72
}
51
73
}
52
74
@@ -115,6 +137,10 @@ vec3 calcColor(vec3 pos, vec3 normal) {
115
137
} else if (example == 2 ) {
116
138
mag += 6.0 * phong(pos, normal, vec3 (2.5 , 3.0 , 1.0 ));
117
139
mag += 10.0 * phong(pos, normal, vec3 (0.0 , 8.0 , 0.0 ));
140
+ } else if (example == 3 ) {
141
+ mag += 5.0 * phong(pos, normal, vec3 (0.0 , 4.0 , 0.0 ));
142
+ mag += 4.0 * phong(pos, normal, vec3 (2.5 , 3.0 , 1.0 ));
143
+ mag += 1.5 * phong(pos, normal, vec3 (- 5.0 , - 1.0 , - 5.0 ));
118
144
}
119
145
return vec3 (sqrt (mag + 0.001 )); // inverse gamma correction
120
146
}
0 commit comments