/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; (function() { if (self.kiri.codec) return; const BASE = self.base, KIRI = self.kiri, handlers = {}; const codec = KIRI.codec = { encode: encode, decode: decode, registerDecoder: registerDecoder, allocFloat32Array: allocFloat32Array }; function allocFloat32Array(len) { if (Array.isArray(len)) { return new Float32Array(len); } return new Float32Array(len); } function encode(o, state) { state = state || {}; if (o === null) return null; if (o === undefined) return undefined; if (Array.isArray(o)) { let arr = new Array(o.length), i=0; while (i < o.length) arr[i] = encode(o[i++], state); return arr; } switch (typeof(o)) { case 'string': case 'number': return o; case 'object': if (o.encode) return o.encode(state); return genOEncode(o, state); } return null; } function decode(o, state) { state = state || {}; if (o === null) return null; if (o === undefined) return undefined; if (Array.isArray(o)) { for (let i=0; i < o.length; i++) o[i] = decode(o[i],state); return o; } switch (typeof(o)) { case 'string': case 'number': return o; case 'object': if (o.type && handlers[o.type]) return handlers[o.type](o,state); return genODecode(o, state); } return null; } function registerDecoder(type, handler) { handlers[type] = handler; } function genOEncode(o, state) { if (o instanceof Float32Array) return o; let out = {}; for (let k in o) { if (o.hasOwnProperty(k)) out[k] = encode(o[k], state); } return out; } function genODecode(o, state) { if (o instanceof Float32Array) return o; let out = {}; for (let k in o) { if (o.hasOwnProperty(k)) out[k] = decode(o[k], state); } return out; } /** ****************************************************************** * Object CODEC Functions ******************************************************************* */ KIRI.Slice.prototype.encode = function(state) { return { type: 'slice', z: this.z, index: this.index, render: encode(this.render, state) }; }; registerDecoder('slice', function(v, state) { let slice = KIRI.newSlice(v.z, state.mesh ? state.mesh.newGroup() : null); slice.index = v.index; slice.render = decode(v.render, state) return slice; }); KIRI.Render.prototype.encode = function(state) { let enc = { type: 'render', layers: Object.keys(this.layers), data: Object.values(this.layers).map(layer => { return { polys: encode(layer.polys, state), lines: encodePointArray(layer.lines, state), faces: codec.allocFloat32Array(layer.faces), color: layer.color, paths: layer.paths, cpath: layer.cpath } }) }; return enc; }; registerDecoder('render', function(v, state) { let render = new KIRI.Render(); for (let i=0; i