app = {
const gl = canvas3.gl;
const ratio = canvas3.ratio;
const program = compileShaders(gl, vertexShaderSource3, fragmentShaderSource3);
const sliderDates = slider.map(d => d3.timeDay.offset(dateDomain[0], d))
const data = dataset.filter(f => sliderDates[0] < f.d && f.d < sliderDates[1]);
console.log("eval")
const vertices = new Float32Array(data.flatMap((d) => [d.x, d.y]));
const colors = new Float32Array(data.flatMap((d) => d.color));
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
const aPosition = gl.getAttribLocation(program, "aPosition");
gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(aPosition);
const colorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
const aColor = gl.getAttribLocation(program, "aColor");
gl.vertexAttribPointer(aColor, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(aColor);
const uTranslation = gl.getUniformLocation(program, "u_translation");
const uScale = gl.getUniformLocation(program, "u_scale");
const uPointSize = gl.getUniformLocation(program, "uPointSize");
const uAlpha = gl.getUniformLocation(program, "uAlpha");
const blendingMethods = {
standard: {srcFactor: gl.SRC_ALPHA, destFactor: gl.ONE_MINUS_SRC_ALPHA},
additive: {srcFactor: gl.SRC_ALPHA, destFactor: gl.ONE},
multiplicative: {srcFactor: gl.DST_ALPHA, destFactor: gl.ZERO},
screen: {srcFactor: gl.ONE, destFactor: gl.ONE_MINUS_SRC_ALPHA},
}
const bm = blendingMethods[blendingMethod || "screen"];
gl.enable(gl.BLEND);
gl.blendFunc(bm.srcFactor, bm.destFactor);
const aScale = d3.scaleLinear([1,20], [0.1, 1]).clamp(true);
const sScale = d3.scaleLinear([1,10], [1.5, 3]).clamp(true);
const state = {
zoom: 2,
panX: 0,
panY: 0,
isDragging: false,
lastX: 0,
lastY: 0,
}
function render() {
gl.useProgram(program);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
const visible = sliderDates[0]
gl.uniform2fv(uTranslation, [state.panX, state.panY]);
gl.uniform2fv(uScale, [state.zoom, state.zoom]);
gl.uniform1f(uAlpha, aScale(state.zoom));
gl.uniform1f(uPointSize, sScale(state.zoom) * ratio);
gl.drawArrays(gl.POINTS, 0, data.length);
}
function setState(prop, value){
state[prop] = value;
return state[prop];
}
render();
return {render, setState, state};
}