Create GlSl explosion in x,y

by yiiBoy

HTML

<!--
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-min.js"></script>
-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.4.0/gl-matrix-min.js"></script>

<canvas id="canvas" width="640" height="480"></canvas>

JavaScript

function createShader(gl, type, source) {
    const shader = gl.createShader(type);
    gl.shaderSource(shader, source);
    gl.compileShader(shader);

    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
        console.error('Shader compilation error:', gl.getShaderInfoLog(shader));
        gl.deleteShader(shader);
        return null;
    }

    return shader;
}

function createProgram(gl, vertexShader, fragmentShader) {
    const program = gl.createProgram();
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
    gl.linkProgram(program);

    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
        console.error('Program linking error:', gl.getProgramInfoLog(program));
        gl.deleteProgram(program);
        return null;
    }

    return program;
}

function createCircle(gl, radius, segments) {
    const vertices = [];
    const indices = [];

    vertices.push(0, 0, 0); // Center vertex

    for (let i = 0; i <= segments; i++) {
        const theta = i * 2 * Math.PI / segments;
        const x = radius * Math.cos(theta);
        const y = radius * Math.sin(theta);
        vertices.push(x, y, 0);
    }

    for (let i = 1; i <= segments; i++) {
        indices.push(0, i, i + 1);
    }

    return {
        vertices,
        indices
    };
}


function createBuffer(gl, target, data, usage) {
    const buffer = gl.createBuffer();
    gl.bindBuffer(target, buffer);
    gl.bufferData(target, data, usage);
    gl.bindBuffer(target, null);
    return buffer;
}


function createShaderProgram(gl) {
    // Create the vertex shader
    const vertexShaderSource = `
    attribute vec3 a_position;

    uniform mat4 u_modelViewMatrix;
    uniform mat4 u_projectionMatrix;

    varying vec3 v_position;

    void main() {
      gl_Position = u_projectionMatrix * u_modelViewMatrix * vec4(a_position, 1.0);
      v_position = a_position;
    }
  `;
    const vertexShader = createShader(gl, gl.VERTEX_SHADER,...