silphius/app/react/components/particle-worker.js
2024-08-03 15:52:52 -05:00

61 lines
1.3 KiB
JavaScript

import Emitter from '@/particles/emitter.js';
import createEcs from '@/server/create/ecs.js';
import ClientEcs from './client-ecs.js';
const ecs = createEcs(ClientEcs);
ecs.$$caret = Math.pow(2, 31);
const emitter = new Emitter(ecs);
addEventListener('message', (particle) => {
if (!ecs.get(1)) {
ecs.createManySpecific([[1, particle.data]]);
return;
}
emitter.emit(particle.data)
.onEnd(() => {});
});
const memory = new Set();
let last = performance.now();
function tick(now) {
const elapsed = (now - last) / 1000;
last = now;
requestAnimationFrame(tick);
if (!ecs.get(1)) {
return;
}
ecs.tick(elapsed);
emitter.tick(elapsed);
const update = {};
const lastNearby = new Set(memory.values());
for (const id in ecs.$$entities) {
const entity = ecs.$$entities[id];
if (ecs.$$detached.has(entity.id)) {
continue;
}
lastNearby.delete(id);
if (!memory.has(id)) {
update[id] = entity.toJSON();
}
else if (ecs.diff[id]) {
update[id] = ecs.diff[id];
}
memory.add(id);
}
for (const id of lastNearby) {
memory.delete(id);
update[id] = false;
}
if ('1' in update) {
delete update['1'];
}
if (Object.keys(update).length > 0) {
postMessage(update);
}
ecs.setClean();
}
requestAnimationFrame(tick);