rendering = {
let frame;
let then;
(function idraw(now) {
now *= 0.001;
let deltaTime;
if (then) {
deltaTime = now-then;
} else {
deltaTime = 0;
}
then = now;
for (let i=0; i<numElements; i++) {
points.points[i].propagate(deltaTime);
points.tData[i*18+1] = points.points[i].y;
points.tData[i*18+4] = points.points[i].y;
points.tData[i*18+7] = points.points[i].y;
points.tData[i*18] = points.points[i].x;
points.tData[i*18+3] = points.points[i].x;
points.tData[i*18+6] = points.points[i].x;
points.tData[i*18+2] = points.points[i].z;
points.tData[i*18+5] = points.points[i].z;
points.tData[i*18+8] = points.points[i].z;
points.tData[i*18+9] = points.points[i].x;
points.tData[i*18+10] = points.points[i].y;
points.tData[i*18+11] = points.points[i].z;
points.tData[i*18+12] = points.points[i].x;
points.tData[i*18+13] = points.points[i].y;
points.tData[i*18+14] = points.points[i].z;
points.tData[i*18+15] = points.points[i].x;
points.tData[i*18+16] = points.points[i].y;
points.tData[i*18+17] = points.points[i].z;
}
// Tell the attribute how to get data out of positionBuffer (ARRAY_BUFFER)
const size = 3; // 3 components per iteration
let type = canvas.gl.FLOAT; // the data is 32bit floats
const normalize = false; // don't normalize the data
const stride = 0; // 0 = move forward size * sizeof(type) each iteration to get the next position
let offset = 0; // start at the beginning of the buffer
//define viewport size
canvas.gl.viewport(0, 0, canvas.width, canvas.height);
canvas.gl.clearColor(0.15, 0.15, 0.15, 1);
canvas.gl.clear(canvas.gl.COLOR_BUFFER_BIT | canvas.gl.DEPTH_BUFFER_BIT);
// Compute the matrix
const aspect = canvas.width / canvas.height;
const zNear = 1;
const zFar = 2000;
const matrix = m4.perspective(fieldOfViewRadians, aspect, zNear, zFar);
// Compute a matrix for the camera
let cameraMatrix = twgl.m4.rotateY(twgl.m4.identity(), cameraAngleRadians);
cameraMatrix = twgl.m4.rotateX(cameraMatrix, cameraAngleRadiansX);
cameraMatrix = twgl.m4.translate(cameraMatrix, [0,0,cameraZ]);
// Get the camera's position from the matrix we computed
const cameraPosition = [
cameraMatrix[12],
cameraMatrix[13],
cameraMatrix[14],
];
const up = [0, 1, 0];
// Compute the camera's matrix using look at.
cameraMatrix = twgl.m4.lookAt(cameraPosition, [imageWidth/20,0,imageHeight/20], up);
// Make a view matrix from the camera matrix
const viewMatrix = twgl.m4.inverse(cameraMatrix);
//vectors for billboard shader
const cameraRight = [viewMatrix[0], viewMatrix[4], viewMatrix[8]];
const cameraUp = [viewMatrix[1], viewMatrix[5], viewMatrix[9]];
// Compute a view projection matrix
const viewProjectionMatrix = twgl.m4.multiply(matrix, viewMatrix);
const internalFormat = canvas.gl.RGBA;
const border = 0;
const format = canvas.gl.RGBA;
type = canvas.gl.UNSIGNED_BYTE;
canvas.gl.bindTexture(canvas.gl.TEXTURE_2D, tallyTextures.particleTexture);
canvas.gl.texImage2D(canvas.gl.TEXTURE_2D, 0, internalFormat,
imageWidth, imageHeight, border,
format, type, hitGrid.values);
//first pass of gaussian smoother rendered to framebuffer
smooth(viewProjectionMatrix);
//disable rendering to framebuffer
canvas.gl.bindFramebuffer(canvas.gl.FRAMEBUFFER, null);
//draw planes, one black slightly below the color
drawPlane(viewProjectionMatrix, tallyTextures.combinedTexture, planeVertices2);
drawPlane(viewProjectionMatrix, tallyTextures.existingTexture, planeVertices);
//draw particle billboards
canvas.gl.useProgram(program);
type = canvas.gl.FLOAT;
canvas.gl.bindBuffer(canvas.gl.ARRAY_BUFFER, buffers.trans);
canvas.gl.bufferData(canvas.gl.ARRAY_BUFFER, points.tData, canvas.gl.STATIC_DRAW);
canvas.gl.enableVertexAttribArray(locations.trans);
canvas.gl.vertexAttribPointer(locations.trans, 3, type, normalize, stride, offset);
canvas.gl.bindBuffer(canvas.gl.ARRAY_BUFFER, buffers.square);
canvas.gl.bufferData(canvas.gl.ARRAY_BUFFER, points.vData, canvas.gl.STATIC_DRAW);
canvas.gl.enableVertexAttribArray(locations.square);
canvas.gl.vertexAttribPointer(locations.square, 3, type, normalize, stride, offset);
// Set the matrix.
canvas.gl.uniformMatrix4fv(locations.matrix, false, viewProjectionMatrix);
canvas.gl.uniform3f(locations.right, cameraRight[0], cameraRight[1], cameraRight[2]);
canvas.gl.uniform3f(locations.up, cameraUp[0], cameraUp[1], cameraUp[2]);
canvas.gl.activeTexture(canvas.gl.TEXTURE0);
canvas.gl.bindTexture(canvas.gl.TEXTURE_2D, tallyTextures.circleTexture);
canvas.gl.uniform1i(locations.circle, 0);
var primitiveType = canvas.gl.TRIANGLES;
offset = 0;
var count = 6;
canvas.gl.drawArrays(primitiveType, offset, numElements*count);
for (let i=0; i<numElements; i++) {
points.points[i].resetY();
}
//request another frame
frame=requestAnimationFrame(idraw);
})()
invalidation.then(() => cancelAnimationFrame(frame));
}