Skip to main content

Support React.js

Live Editor
function Canvas() {
        const gl = useGL({
                frag: `
                #version 300 es
                precision mediump float;
                uniform vec2 iResolution;
                uniform float iTime;
                uniform float ellipseRadius;
                uniform float ellipseXCoord;
                uniform float ellipseYCoord;
                uniform float ellipseStroke;
                out vec4 fragColor;
                #define PI 3.141592
                mat2 rotate(float x, float y, float angle) {
                        mat2 scale = mat2(1.0 / x, 0.0, 0.0, 1.0 / y);
                        mat2 rotation = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));
                        return scale * rotation;
                }
                float circle(vec2 p) {
                        return length(p) - ellipseRadius;
                }
                float ellipse(vec2 p, float angle) {
                        mat2 transform = rotate(ellipseXCoord, ellipseYCoord, angle);
                        return circle(transform * p);
                }
                float onion(float d, vec2 p, float angle) {
                        return min(d, abs(ellipse(p, angle)) - ellipseStroke);
                }
                void main() {
                        vec2 uv = fract(gl_FragCoord.xy / iResolution);
                        vec2 p = uv * 2.4 - 1.2;
                        p.x *= iResolution.x / iResolution.y;
                        float d = circle(p);
                        d = onion(d, p, PI / 2.0 + iTime);
                        d = onion(d, p, PI / 6.0 + iTime);
                        d = onion(d, p, -PI / 6.0 + iTime);
                        if (d < 0.0) {
                                fragColor = vec4(96.0 / 255.0, 219.0 / 255.0, 251.0 / 255.0, 0.8);
                        }
                }
                `,
                resize() {
                        resize(gl)
                },
        })
        gl.uniform(
                useControls({
                        ellipseRadius: { min: 0, value: 0.2, max: 0.4 },
                        ellipseXCoord: { min: 0, value: 2.2, max: 4.4 },
                        ellipseYCoord: { min: 0, value: 5.4, max: 10.8 },
                        ellipseStroke: { min: 0, value: 0.01, max: 0.02 },
                })
        )
        return <canvas ref={gl.ref} />
}
Result
Loading...