{
const { regl, blend } = reglDrawer;
const position = [
[-1, -1],
[3, -1],
[-1, 3]
];
function drawField(secs = 0) {
const { vert, frag } = shaderDrawField,
draw = regl({
vert,
frag,
attributes: { position },
count: position.length,
depth: { enable: false },
blend,
uniforms: {
secs,
spatialZoom,
speedUp
}
});
draw();
}
function drawScatter(secs = 0, src, field) {
const { vert, frag } = shaderDrawScatter,
draw = regl({
vert,
frag,
attributes: { position },
count: position.length,
depth: { enable: false },
blend,
uniforms: {
densityLic,
src,
field
}
});
draw();
}
function drawScreen(secs = 0, field) {
const { vert, frag } = shaderDrawScreen,
draw = regl({
vert,
frag,
attributes: { position },
count: position.length,
depth: { enable: false },
blend,
uniforms: {
field
}
});
draw();
}
function drawScreenOverlap(secs = 0, scatter) {
const { vert, frag } = shaderDrawScreenOverlap,
draw = regl({
vert,
frag,
attributes: { position },
count: position.length,
depth: { enable: false },
blend,
uniforms: {
scatter
}
});
draw();
}
var secs = 0,
secsNext = 0,
bellFlag,
even = false,
srcFbo,
dstFbo;
function draw(secs) {
bellFlag = secs > secsNext;
if (bellFlag) secsNext = secs + 100;
even = !even;
fieldFbo.fbo.use(() => {
regl.clear({ color: [0, 0, 0, 1] });
drawField(secs);
});
if (bellFlag) {
scatterFbo.fbo.use(() => {
regl.clear({ color: [0, 0, 0, 0] });
});
scatterFbo2.fbo.use(() => {
regl.clear({ color: [0, 0, 0, 0] });
});
}
if (even) {
srcFbo = scatterFbo.fbo;
dstFbo = scatterFbo2.fbo;
} else {
srcFbo = scatterFbo2.fbo;
dstFbo = scatterFbo.fbo;
}
dstFbo.use(() => {
drawScatter(secs, srcFbo, fieldFbo.fbo);
});
srcFbo.use(() => {
regl.clear({ color: [0, 0, 0, 0] });
});
regl.clear({ color: [1, 0, 1, 0.1] });
if (toggleField) drawScreen(secs, fieldFbo.fbo);
else regl.clear({ color: [0, 0, 0, 1] });
if (toggleOverlay) drawScreenOverlap(secs, dstFbo);
statsMonitor.update();
}
draw(secs);
for (;;) {
secs = parseFloat((performance.now() / 1000) % 10000);
draw(secs);
yield secs;
}
}