Files
havox/projects/tsp/tsp-gl.js
2026-03-31 22:19:53 +01:00

56 lines
1.5 KiB
JavaScript

// tsp-gl.js
import { updateLines } from './utils.js';
export function draw(
gl,
points,
program,
lineProgram,
positionBuffer,
lineBuffer,
pointOrder,
aspectRatio
) {
gl.clear(gl.COLOR_BUFFER_BIT);
// Draw Circles
updateCircleUniforms(gl, points, program, positionBuffer);
// Draw Lines
const lineVertices = updateLines(points, pointOrder);
drawLines(gl, lineProgram, lineBuffer, lineVertices);
}
function updateCircleUniforms(gl, points, program, positionBuffer) {
const centerArray = new Float32Array(points.length * 2);
points.forEach((point, i) => {
centerArray[i * 2] = point.cx;
centerArray[i * 2 + 1] = point.cy;
});
gl.useProgram(program);
gl.uniform2fv(gl.getUniformLocation(program, 'u_centers'), centerArray);
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
const positionAttribLoc = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttribLoc);
gl.vertexAttribPointer(positionAttribLoc, 2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 3);
}
function drawLines(gl, program, buffer, lineVertices) {
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, lineVertices, gl.DYNAMIC_DRAW);
const positionAttribLoc = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttribLoc);
gl.vertexAttribPointer(positionAttribLoc, 2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.LINES, 0, lineVertices.length / 2);
}