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);