import { TerrainState } from "./terrain-state.js"; import { loadLightProperties } from "./light-properties.js"; const state = loadLightProperties().then(properties => new TerrainState(properties)); let timer = null; const send = message => { const buffers = message.type === "light" ? [message.field.data.buffer, message.field.blockLevels.buffer, message.field.skyLevels.buffer] : message.vertices ? [message.vertices.buffer, message.transparent.buffer] : []; self.postMessage(message, buffers); }; self.onmessage = ({ data }) => { state.then(terrain => { if (data.type === "sync") { if (!terrain.sync(data)) return; clearTimeout(timer); timer = setTimeout(() => { timer = null; try { send(terrain.light({dirty:!data.independentMeshes})); } catch (error) { send({ type: "error", epoch: terrain.epoch, version: terrain.version, error: error.message }); } }, data.independentMeshes ? 225 : 0); } else if (data.type === "mesh") { try { send(terrain.mesh(data)); } catch (error) { send({ ...data, error: error.message }); } } }).catch(error => send({ type: "error", epoch: data.epoch, version: data.version, error: error.message })); };