@maptalks/3dtiles 0.117.1 → 0.118.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -80
- package/dist/maptalks.3dtiles.d.ts +2 -1
- package/dist/maptalks.3dtiles.es.js +4 -4
- package/dist/maptalks.3dtiles.es.js.map +1 -1
- package/dist/maptalks.3dtiles.gpu.es.js +4 -4
- package/dist/maptalks.3dtiles.js +4 -4
- package/dist/maptalks.3dtiles.js.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maptalks.3dtiles.js","sources":["../../../node_modules/.pnpm/frustum-intersects@0.2.4/node_modules/frustum-intersects/src/index.js","../../../node_modules/.pnpm/simple-swizzle@0.2.2/node_modules/simple-swizzle/index.js","../../../node_modules/.pnpm/is-arrayish@0.3.2/node_modules/is-arrayish/index.js","../../../node_modules/.pnpm/color-string@1.9.1/node_modules/color-string/index.js","../../../node_modules/.pnpm/color-name@1.1.4/node_modules/color-name/index.js","../../../node_modules/.pnpm/color-convert@1.9.3/node_modules/color-convert/conversions.js","../../../node_modules/.pnpm/color-name@1.1.3/node_modules/color-name/index.js","../../../node_modules/.pnpm/color-convert@1.9.3/node_modules/color-convert/route.js","../../../node_modules/.pnpm/color-convert@1.9.3/node_modules/color-convert/index.js","../../../node_modules/.pnpm/color@3.2.1/node_modules/color/index.js","../src/common/Util.js","../src/common/UrlUtil.js","../src/common/Constants.js","../../gl/dist/transcoders.js","../src/layer/Geo3DTilesWorkerConnection.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/common.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/mat4.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/vec3.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/quat.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/vec4.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/mat3.js","../src/common/GLTFHelpers.js","../src/common/Transform.js","../src/common/Math.js","../src/common/TileHelper.js","../../../node_modules/.pnpm/colorin@0.5.0/node_modules/colorin/index.js","../../../node_modules/.pnpm/@maptalks+function-type@1.4.1/node_modules/@maptalks/function-type/index.js","../src/layer/renderer/TileMeshPainter.js","../src/layer/i3s/Util.js","../src/layer/i3s/I3SNode.js","../src/layer/i3s/I3SHelper.js","../src/layer/renderer/Geo3DTilesRenderer.js","../src/layer/renderer/LRUCache.js","../src/common/intersects_oriented_box.js","../src/layer/renderer/Rectangle.js","../src/layer/renderer/TileBoundingRegion.js","../src/layer/Geo3DTilesLayer.ts","../src/loaders/transcoders.js","../src/loaders/B3DMLoader.js","../src/loaders/I3DMLoader.js","../src/loaders/PNTSLoader.js","../src/loaders/CMPTLoader.js","../build/index.js"],"sourcesContent":["/*!\r\n* Contains code from THREE.js\r\n* MIT License\r\n* https://github.com/mrdoob/three.js\r\n*/\r\n\r\nvar planes = [];\r\nfor (var i = 0; i < 6; i++) {\r\n planes[i] = [];\r\n}\r\n\r\nexport function intersectsSphere(matrix, sphere, mask) {\r\n setPlanes(matrix);\r\n var center = sphere[0];\r\n var negRadius = -sphere[1];\r\n for (var i = 0; i < 6; i++) {\r\n if (mask && mask.charAt(i) === '0') {\r\n continue;\r\n }\r\n var distance = distanceToPoint(planes[i], center);\r\n if (distance < negRadius) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nvar p = [];\r\n\r\nexport function intersectsBox(matrix, box, mask) {\r\n setPlanes(matrix);\r\n for (var i = 0; i < 6; i++) {\r\n if (mask && mask.charAt(i) === '0') {\r\n continue;\r\n }\r\n var plane = planes[i];\r\n // corner at max distance\r\n p[0] = plane[0] > 0 ? box[1][0] : box[0][0];\r\n p[1] = plane[1] > 0 ? box[1][1] : box[0][1];\r\n p[2] = plane[2] > 0 ? box[1][2] : box[0][2];\r\n\r\n if (distanceToPoint(plane, p) < 0) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function intersectsOrientedBox(matrix, box, mask) {\r\n setPlanes(matrix);\r\n for (var i = 0; i < 6; i++) {\r\n if (mask && mask.charAt(i) === '0') {\r\n continue;\r\n }\r\n var plane = planes[i];\r\n if (!intersectsPlane(plane, box)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nvar COLUMN0ROW0 = 0 + 3, COLUMN0ROW1 = 1 + 3, COLUMN0ROW2 = 2 + 3, COLUMN1ROW0 = 3 + 3, COLUMN1ROW1 = 4 + 3, COLUMN1ROW2 = 5 + 3, COLUMN2ROW0 = 6 + 3, COLUMN2ROW1 = 7 + 3, COLUMN2ROW2 = 8 + 3;\r\n// const COLUMN0ROW0 = 0, COLUMN0ROW1 = 1, COLUMN0ROW2 = 2, COLUMN1ROW0 = 3, COLUMN1ROW1 = 4, COLUMN1ROW2 = 5, COLUMN2ROW0 = 6, COLUMN2ROW1 = 7, COLUMN2ROW2 = 8;\r\nvar BOX_CENTER = [];\r\nvar HALF_AXES = [];\r\n\r\nfunction intersectsPlane(plane, box) {\r\n var center = box;\r\n var normal = plane;\r\n var halfAxes = box;\r\n var normalX = normal[0], normalY = normal[1], normalZ = normal[2];\r\n // plane is used as if it is its normal; the first three components are assumed to be normalized\r\n var radEffective = Math.abs(normalX * halfAxes[COLUMN0ROW0] + normalY * halfAxes[COLUMN0ROW1] + normalZ * halfAxes[COLUMN0ROW2]) +\r\n Math.abs(normalX * halfAxes[COLUMN1ROW0] + normalY * halfAxes[COLUMN1ROW1] + normalZ * halfAxes[COLUMN1ROW2]) +\r\n Math.abs(normalX * halfAxes[COLUMN2ROW0] + normalY * halfAxes[COLUMN2ROW1] + normalZ * halfAxes[COLUMN2ROW2]);\r\n var distanceToPlane = distanceToPoint(plane, center);\r\n\r\n if (distanceToPlane <= -radEffective) {\r\n // The entire box is on the negative side of the plane normal\r\n // return Intersect.OUTSIDE;\r\n return false;\r\n } else if (distanceToPlane >= radEffective) {\r\n // The entire box is on the positive side of the plane normal\r\n // return Intersect.INSIDE;\r\n return true;\r\n }\r\n return true;\r\n // return Intersect.INTERSECTING;\r\n}\r\n\r\nfunction setPlanes(m) {\r\n var me = m;\r\n var me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3];\r\n var me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7];\r\n var me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11];\r\n var me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15];\r\n\r\n //right\r\n setComponents(planes[0], me3 - me0, me7 - me4, me11 - me8, me15 - me12);\r\n //left\r\n setComponents(planes[1], me3 + me0, me7 + me4, me11 + me8, me15 + me12);\r\n //bottom\r\n setComponents(planes[2], me3 + me1, me7 + me5, me11 + me9, me15 + me13);\r\n //top\r\n setComponents(planes[3], me3 - me1, me7 - me5, me11 - me9, me15 - me13);\r\n //z-far\r\n setComponents(planes[4], me3 - me2, me7 - me6, me11 - me10, me15 - me14);\r\n //z-near\r\n setComponents(planes[5], me3 + me2, me7 + me6, me11 + me10, me15 + me14);\r\n}\r\n\r\nfunction setComponents(out, x, y, z, w) {\r\n // THREE.js Plane.js\r\n var inverseNormalLength = 1 / Math.sqrt(x * x + y * y + z * z);\r\n out[0] = x * inverseNormalLength;\r\n out[1] = y * inverseNormalLength;\r\n out[2] = z * inverseNormalLength;\r\n out[3] = w * inverseNormalLength;\r\n return out;\r\n}\r\n\r\nfunction distanceToPoint(plane, p) {\r\n return plane[0] * p[0] + plane[1] * p[1] + plane[2] * p[2] + plane[3];\r\n}\r\n","'use strict';\n\nvar isArrayish = require('is-arrayish');\n\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\n\nvar swizzle = module.exports = function swizzle(args) {\n\tvar results = [];\n\n\tfor (var i = 0, len = args.length; i < len; i++) {\n\t\tvar arg = args[i];\n\n\t\tif (isArrayish(arg)) {\n\t\t\t// http://jsperf.com/javascript-array-concat-vs-push/98\n\t\t\tresults = concat.call(results, slice.call(arg));\n\t\t} else {\n\t\t\tresults.push(arg);\n\t\t}\n\t}\n\n\treturn results;\n};\n\nswizzle.wrap = function (fn) {\n\treturn function () {\n\t\treturn fn(swizzle(arguments));\n\t};\n};\n","module.exports = function isArrayish(obj) {\n\tif (!obj || typeof obj === 'string') {\n\t\treturn false;\n\t}\n\n\treturn obj instanceof Array || Array.isArray(obj) ||\n\t\t(obj.length >= 0 && (obj.splice instanceof Function ||\n\t\t\t(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));\n};\n","/* MIT license */\nvar colorNames = require('color-name');\nvar swizzle = require('simple-swizzle');\nvar hasOwnProperty = Object.hasOwnProperty;\n\nvar reverseNames = Object.create(null);\n\n// create a list of reverse color names\nfor (var name in colorNames) {\n\tif (hasOwnProperty.call(colorNames, name)) {\n\t\treverseNames[colorNames[name]] = name;\n\t}\n}\n\nvar cs = module.exports = {\n\tto: {},\n\tget: {}\n};\n\ncs.get = function (string) {\n\tvar prefix = string.substring(0, 3).toLowerCase();\n\tvar val;\n\tvar model;\n\tswitch (prefix) {\n\t\tcase 'hsl':\n\t\t\tval = cs.get.hsl(string);\n\t\t\tmodel = 'hsl';\n\t\t\tbreak;\n\t\tcase 'hwb':\n\t\t\tval = cs.get.hwb(string);\n\t\t\tmodel = 'hwb';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = cs.get.rgb(string);\n\t\t\tmodel = 'rgb';\n\t\t\tbreak;\n\t}\n\n\tif (!val) {\n\t\treturn null;\n\t}\n\n\treturn {model: model, value: val};\n};\n\ncs.get.rgb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar abbr = /^#([a-f0-9]{3,4})$/i;\n\tvar hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;\n\tvar rgba = /^rgba?\\(\\s*([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar keyword = /^(\\w+)$/;\n\n\tvar rgb = [0, 0, 0, 1];\n\tvar match;\n\tvar i;\n\tvar hexAlpha;\n\n\tif (match = string.match(hex)) {\n\t\thexAlpha = match[2];\n\t\tmatch = match[1];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\t// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19\n\t\t\tvar i2 = i * 2;\n\t\t\trgb[i] = parseInt(match.slice(i2, i2 + 2), 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(abbr)) {\n\t\tmatch = match[1];\n\t\thexAlpha = match[3];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(rgba)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i + 1], 0);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(per)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(keyword)) {\n\t\tif (match[1] === 'transparent') {\n\t\t\treturn [0, 0, 0, 0];\n\t\t}\n\n\t\tif (!hasOwnProperty.call(colorNames, match[1])) {\n\t\t\treturn null;\n\t\t}\n\n\t\trgb = colorNames[match[1]];\n\t\trgb[3] = 1;\n\n\t\treturn rgb;\n\t} else {\n\t\treturn null;\n\t}\n\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] = clamp(rgb[i], 0, 255);\n\t}\n\trgb[3] = clamp(rgb[3], 0, 1);\n\n\treturn rgb;\n};\n\ncs.get.hsl = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hsl = /^hsla?\\(\\s*([+-]?(?:\\d{0,3}\\.)?\\d+)(?:deg)?\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*(?:[,|\\/]\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hsl);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar s = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar l = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\n\t\treturn [h, s, l, a];\n\t}\n\n\treturn null;\n};\n\ncs.get.hwb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hwb = /^hwb\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hwb);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar w = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar b = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\treturn [h, w, b, a];\n\t}\n\n\treturn null;\n};\n\ncs.to.hex = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn (\n\t\t'#' +\n\t\thexDouble(rgba[0]) +\n\t\thexDouble(rgba[1]) +\n\t\thexDouble(rgba[2]) +\n\t\t(rgba[3] < 1\n\t\t\t? (hexDouble(Math.round(rgba[3] * 255)))\n\t\t\t: '')\n\t);\n};\n\ncs.to.rgb = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'\n\t\t: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';\n};\n\ncs.to.rgb.percent = function () {\n\tvar rgba = swizzle(arguments);\n\n\tvar r = Math.round(rgba[0] / 255 * 100);\n\tvar g = Math.round(rgba[1] / 255 * 100);\n\tvar b = Math.round(rgba[2] / 255 * 100);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'\n\t\t: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';\n};\n\ncs.to.hsl = function () {\n\tvar hsla = swizzle(arguments);\n\treturn hsla.length < 4 || hsla[3] === 1\n\t\t? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'\n\t\t: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';\n};\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\ncs.to.hwb = function () {\n\tvar hwba = swizzle(arguments);\n\n\tvar a = '';\n\tif (hwba.length >= 4 && hwba[3] !== 1) {\n\t\ta = ', ' + hwba[3];\n\t}\n\n\treturn 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';\n};\n\ncs.to.keyword = function (rgb) {\n\treturn reverseNames[rgb.slice(0, 3)];\n};\n\n// helpers\nfunction clamp(num, min, max) {\n\treturn Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n\tvar str = Math.round(num).toString(16).toUpperCase();\n\treturn (str.length < 2) ? '0' + str : str;\n}\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","/* MIT license */\nvar cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","var conversions = require('./conversions');\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","var conversions = require('./conversions');\nvar route = require('./route');\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","'use strict';\n\nvar colorString = require('color-string');\nvar convert = require('color-convert');\n\nvar _slice = [].slice;\n\nvar skippedModels = [\n\t// to be honest, I don't really feel like keyword belongs in color convert, but eh.\n\t'keyword',\n\n\t// gray conflicts with some method names, and has its own method defined.\n\t'gray',\n\n\t// shouldn't really be in color-convert either...\n\t'hex'\n];\n\nvar hashedModelKeys = {};\nObject.keys(convert).forEach(function (model) {\n\thashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model;\n});\n\nvar limiters = {};\n\nfunction Color(obj, model) {\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj, model);\n\t}\n\n\tif (model && model in skippedModels) {\n\t\tmodel = null;\n\t}\n\n\tif (model && !(model in convert)) {\n\t\tthrow new Error('Unknown model: ' + model);\n\t}\n\n\tvar i;\n\tvar channels;\n\n\tif (obj == null) { // eslint-disable-line no-eq-null,eqeqeq\n\t\tthis.model = 'rgb';\n\t\tthis.color = [0, 0, 0];\n\t\tthis.valpha = 1;\n\t} else if (obj instanceof Color) {\n\t\tthis.model = obj.model;\n\t\tthis.color = obj.color.slice();\n\t\tthis.valpha = obj.valpha;\n\t} else if (typeof obj === 'string') {\n\t\tvar result = colorString.get(obj);\n\t\tif (result === null) {\n\t\t\tthrow new Error('Unable to parse color from string: ' + obj);\n\t\t}\n\n\t\tthis.model = result.model;\n\t\tchannels = convert[this.model].channels;\n\t\tthis.color = result.value.slice(0, channels);\n\t\tthis.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;\n\t} else if (obj.length) {\n\t\tthis.model = model || 'rgb';\n\t\tchannels = convert[this.model].channels;\n\t\tvar newArr = _slice.call(obj, 0, channels);\n\t\tthis.color = zeroArray(newArr, channels);\n\t\tthis.valpha = typeof obj[channels] === 'number' ? obj[channels] : 1;\n\t} else if (typeof obj === 'number') {\n\t\t// this is always RGB - can be converted later on.\n\t\tobj &= 0xFFFFFF;\n\t\tthis.model = 'rgb';\n\t\tthis.color = [\n\t\t\t(obj >> 16) & 0xFF,\n\t\t\t(obj >> 8) & 0xFF,\n\t\t\tobj & 0xFF\n\t\t];\n\t\tthis.valpha = 1;\n\t} else {\n\t\tthis.valpha = 1;\n\n\t\tvar keys = Object.keys(obj);\n\t\tif ('alpha' in obj) {\n\t\t\tkeys.splice(keys.indexOf('alpha'), 1);\n\t\t\tthis.valpha = typeof obj.alpha === 'number' ? obj.alpha : 0;\n\t\t}\n\n\t\tvar hashedKeys = keys.sort().join('');\n\t\tif (!(hashedKeys in hashedModelKeys)) {\n\t\t\tthrow new Error('Unable to parse color from object: ' + JSON.stringify(obj));\n\t\t}\n\n\t\tthis.model = hashedModelKeys[hashedKeys];\n\n\t\tvar labels = convert[this.model].labels;\n\t\tvar color = [];\n\t\tfor (i = 0; i < labels.length; i++) {\n\t\t\tcolor.push(obj[labels[i]]);\n\t\t}\n\n\t\tthis.color = zeroArray(color);\n\t}\n\n\t// perform limitations (clamping, etc.)\n\tif (limiters[this.model]) {\n\t\tchannels = convert[this.model].channels;\n\t\tfor (i = 0; i < channels; i++) {\n\t\t\tvar limit = limiters[this.model][i];\n\t\t\tif (limit) {\n\t\t\t\tthis.color[i] = limit(this.color[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.valpha = Math.max(0, Math.min(1, this.valpha));\n\n\tif (Object.freeze) {\n\t\tObject.freeze(this);\n\t}\n}\n\nColor.prototype = {\n\ttoString: function () {\n\t\treturn this.string();\n\t},\n\n\ttoJSON: function () {\n\t\treturn this[this.model]();\n\t},\n\n\tstring: function (places) {\n\t\tvar self = this.model in colorString.to ? this : this.rgb();\n\t\tself = self.round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to[self.model](args);\n\t},\n\n\tpercentString: function (places) {\n\t\tvar self = this.rgb().round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to.rgb.percent(args);\n\t},\n\n\tarray: function () {\n\t\treturn this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);\n\t},\n\n\tobject: function () {\n\t\tvar result = {};\n\t\tvar channels = convert[this.model].channels;\n\t\tvar labels = convert[this.model].labels;\n\n\t\tfor (var i = 0; i < channels; i++) {\n\t\t\tresult[labels[i]] = this.color[i];\n\t\t}\n\n\t\tif (this.valpha !== 1) {\n\t\t\tresult.alpha = this.valpha;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tunitArray: function () {\n\t\tvar rgb = this.rgb().color;\n\t\trgb[0] /= 255;\n\t\trgb[1] /= 255;\n\t\trgb[2] /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.push(this.valpha);\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tunitObject: function () {\n\t\tvar rgb = this.rgb().object();\n\t\trgb.r /= 255;\n\t\trgb.g /= 255;\n\t\trgb.b /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.alpha = this.valpha;\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tround: function (places) {\n\t\tplaces = Math.max(places || 0, 0);\n\t\treturn new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);\n\t},\n\n\talpha: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(this.color.concat(Math.max(0, Math.min(1, val))), this.model);\n\t\t}\n\n\t\treturn this.valpha;\n\t},\n\n\t// rgb\n\tred: getset('rgb', 0, maxfn(255)),\n\tgreen: getset('rgb', 1, maxfn(255)),\n\tblue: getset('rgb', 2, maxfn(255)),\n\n\thue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, function (val) { return ((val % 360) + 360) % 360; }), // eslint-disable-line brace-style\n\n\tsaturationl: getset('hsl', 1, maxfn(100)),\n\tlightness: getset('hsl', 2, maxfn(100)),\n\n\tsaturationv: getset('hsv', 1, maxfn(100)),\n\tvalue: getset('hsv', 2, maxfn(100)),\n\n\tchroma: getset('hcg', 1, maxfn(100)),\n\tgray: getset('hcg', 2, maxfn(100)),\n\n\twhite: getset('hwb', 1, maxfn(100)),\n\twblack: getset('hwb', 2, maxfn(100)),\n\n\tcyan: getset('cmyk', 0, maxfn(100)),\n\tmagenta: getset('cmyk', 1, maxfn(100)),\n\tyellow: getset('cmyk', 2, maxfn(100)),\n\tblack: getset('cmyk', 3, maxfn(100)),\n\n\tx: getset('xyz', 0, maxfn(100)),\n\ty: getset('xyz', 1, maxfn(100)),\n\tz: getset('xyz', 2, maxfn(100)),\n\n\tl: getset('lab', 0, maxfn(100)),\n\ta: getset('lab', 1),\n\tb: getset('lab', 2),\n\n\tkeyword: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn convert[this.model].keyword(this.color);\n\t},\n\n\thex: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn colorString.to.hex(this.rgb().round().color);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.rgb().color;\n\t\treturn ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.rgb().color;\n\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tisDark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.rgb().color;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tisLight: function () {\n\t\treturn !this.isDark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = this.rgb();\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb.color[i] = 255 - rgb.color[i];\n\t\t}\n\t\treturn rgb;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] += hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] -= hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] += hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] -= hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[1] += hwb.color[1] * ratio;\n\t\treturn hwb;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[2] += hwb.color[2] * ratio;\n\t\treturn hwb;\n\t},\n\n\tgrayscale: function () {\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar rgb = this.rgb().color;\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\treturn Color.rgb(val, val, val);\n\t},\n\n\tfade: function (ratio) {\n\t\treturn this.alpha(this.valpha - (this.valpha * ratio));\n\t},\n\n\topaquer: function (ratio) {\n\t\treturn this.alpha(this.valpha + (this.valpha * ratio));\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.hsl();\n\t\tvar hue = hsl.color[0];\n\t\thue = (hue + degrees) % 360;\n\t\thue = hue < 0 ? 360 + hue : hue;\n\t\thsl.color[0] = hue;\n\t\treturn hsl;\n\t},\n\n\tmix: function (mixinColor, weight) {\n\t\t// ported from sass implementation in C\n\t\t// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t\tif (!mixinColor || !mixinColor.rgb) {\n\t\t\tthrow new Error('Argument to \"mix\" was not a Color instance, but rather an instance of ' + typeof mixinColor);\n\t\t}\n\t\tvar color1 = mixinColor.rgb();\n\t\tvar color2 = this.rgb();\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn Color.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue(),\n\t\t\t\tcolor1.alpha() * p + color2.alpha() * (1 - p));\n\t}\n};\n\n// model conversion methods and static constructors\nObject.keys(convert).forEach(function (model) {\n\tif (skippedModels.indexOf(model) !== -1) {\n\t\treturn;\n\t}\n\n\tvar channels = convert[model].channels;\n\n\t// conversion methods\n\tColor.prototype[model] = function () {\n\t\tif (this.model === model) {\n\t\t\treturn new Color(this);\n\t\t}\n\n\t\tif (arguments.length) {\n\t\t\treturn new Color(arguments, model);\n\t\t}\n\n\t\tvar newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha;\n\t\treturn new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model);\n\t};\n\n\t// 'static' construction methods\n\tColor[model] = function (color) {\n\t\tif (typeof color === 'number') {\n\t\t\tcolor = zeroArray(_slice.call(arguments), channels);\n\t\t}\n\t\treturn new Color(color, model);\n\t};\n});\n\nfunction roundTo(num, places) {\n\treturn Number(num.toFixed(places));\n}\n\nfunction roundToPlace(places) {\n\treturn function (num) {\n\t\treturn roundTo(num, places);\n\t};\n}\n\nfunction getset(model, channel, modifier) {\n\tmodel = Array.isArray(model) ? model : [model];\n\n\tmodel.forEach(function (m) {\n\t\t(limiters[m] || (limiters[m] = []))[channel] = modifier;\n\t});\n\n\tmodel = model[0];\n\n\treturn function (val) {\n\t\tvar result;\n\n\t\tif (arguments.length) {\n\t\t\tif (modifier) {\n\t\t\t\tval = modifier(val);\n\t\t\t}\n\n\t\t\tresult = this[model]();\n\t\t\tresult.color[channel] = val;\n\t\t\treturn result;\n\t\t}\n\n\t\tresult = this[model]().color[channel];\n\t\tif (modifier) {\n\t\t\tresult = modifier(result);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nfunction maxfn(max) {\n\treturn function (v) {\n\t\treturn Math.max(0, Math.min(max, v));\n\t};\n}\n\nfunction assertArray(val) {\n\treturn Array.isArray(val) ? val : [val];\n}\n\nfunction zeroArray(arr, length) {\n\tfor (var i = 0; i < length; i++) {\n\t\tif (typeof arr[i] !== 'number') {\n\t\t\tarr[i] = 0;\n\t\t}\n\t}\n\n\treturn arr;\n}\n\nmodule.exports = Color;\n","import Color from 'color';\r\nexport function isNil(v) {\r\n return v === undefined || v === null;\r\n}\r\n\r\nexport function extend(dest) { // (Object[, Object, ...]) ->\r\n for (let i = 1; i < arguments.length; i++) {\r\n const src = arguments[i];\r\n for (const k in src) {\r\n dest[k] = src[k];\r\n }\r\n }\r\n return dest;\r\n}\r\n\r\nexport function isFunction(obj) {\r\n if (obj === null || obj === undefined) {\r\n return false;\r\n }\r\n return typeof obj === 'function' || (obj.constructor !== null && obj.constructor === Function);\r\n}\r\n\r\n/**\r\n * Whether the obj is a javascript object.\r\n * @param {Object} obj - object\r\n * @return {Boolean}\r\n * @memberOf Util\r\n */\r\nexport function isObject(obj) {\r\n return typeof obj === 'object' && !!obj;\r\n}\r\n\r\n/**\r\n * Whether val is a number and not a NaN.\r\n * @param {Object} val - val\r\n * @return {Boolean}\r\n * @memberOf Util\r\n */\r\nexport function isNumber(val) {\r\n return (typeof val === 'number') && !isNaN(val);\r\n}\r\n\r\nexport function toRadian(d) {\r\n return d * Math.PI / 180;\r\n}\r\n\r\nexport function toDegree(d) {\r\n return d / Math.PI * 180;\r\n}\r\n\r\nexport function getAbsoluteURL(url) {\r\n let a = document.createElement('a');\r\n a.href = url;\r\n url = a.href;\r\n a = null;\r\n return url;\r\n}\r\n\r\nexport function sign(x) {\r\n if (Math.sign) {\r\n return Math.sign(x);\r\n }\r\n x = +x; // convert to a number\r\n if (x === 0 || isNaN(x)) {\r\n return Number(x);\r\n }\r\n return x > 0 ? 1 : -1;\r\n}\r\n\r\nconst extraByteMap = [1, 1, 1, 1, 2, 2, 3, 0];\r\n\r\nexport function stringFromUTF8Array(data) {\r\n const count = data.length;\r\n let str = '';\r\n\r\n for (let index = 0; index < count;) {\r\n let ch = data[index++];\r\n if (ch & 0x80) {\r\n let extra = extraByteMap[(ch >> 3) & 0x07];\r\n if (!(ch & 0x40) || !extra || ((index + extra) > count))\r\n return null;\r\n\r\n ch = ch & (0x3F >> extra);\r\n for (;extra > 0; extra -= 1) {\r\n const chx = data[index++];\r\n if ((chx & 0xC0) !== 0x80)\r\n return null;\r\n\r\n ch = (ch << 6) | (chx & 0x3F);\r\n }\r\n }\r\n\r\n str += String.fromCharCode(ch);\r\n }\r\n return str;\r\n}\r\n\r\n// 给 Matrix3 指定某列设置数据\r\nexport function setColumn3(out, arr, col) {\r\n out[3 * col] = arr[0];\r\n out[3 * col + 1] = arr[1];\r\n out[3 * col + 2] = arr[2];\r\n return out;\r\n}\r\n\r\nexport function flatArr(arr) {\r\n if (arr.flat) {\r\n return arr.flat(Infinity);\r\n } else {\r\n return arr.reduce((acc, val) => acc.concat(val), []);\r\n }\r\n}\r\n\r\nexport function getBatchIdArrayType(max) {\r\n if (max < 256) return Uint8Array;\r\n if (max < 65536) return Uint16Array;\r\n return Uint32Array;\r\n}\r\n\r\n// const base64Matcher = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\r\n\r\nexport function isBase64(url) {\r\n return url.indexOf('data:') === 0;\r\n}\r\n\r\nexport function base64URLToArrayBuffer(url) {\r\n const firstDot = url.indexOf('base64,');\r\n const base64 = url.substring(firstDot + 7);\r\n const binary_string = window.atob(base64);\r\n const len = binary_string.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) {\r\n bytes[i] = binary_string.charCodeAt(i);\r\n }\r\n return bytes.buffer;\r\n}\r\n\r\nexport function pushIn(dest) {\r\n for (let i = 1; i < arguments.length; i++) {\r\n const src = arguments[i];\r\n if (src) {\r\n for (let ii = 0, ll = src.length; ii < ll; ii++) {\r\n dest.push(src[ii]);\r\n }\r\n }\r\n }\r\n return dest.length;\r\n}\r\n\r\nconst colorCache = {};\r\nexport function normalizeColor(out, color) {\r\n if (!Array.isArray(color)) {\r\n const key = color;\r\n color = colorCache[key] = colorCache[key] || Color(color).array().map(v => { return v / 255; });\r\n }\r\n for (let i = 0; i < color.length; i++) {\r\n out[i] = color[i];\r\n }\r\n if (color.length === 3) {\r\n out[3] = 1;\r\n }\r\n return out;\r\n}\r\n","export function isRelativeURL(url) {\r\n return url.indexOf('http://') === -1 && url.indexOf('https://') === -1 && url.indexOf('file://') === -1;\r\n}\r\n\r\nexport function prepareFetchOptions(fetchOptions) {\r\n fetchOptions = fetchOptions || {};\r\n fetchOptions.referrerPolicy = fetchOptions.referrerPolicy || 'origin';\r\n fetchOptions.referrer = window && window.location.href;\r\n return fetchOptions;\r\n}\r\n","export const CANDIDATE_MAX_ERROR = 500;\r\nexport const DEFAULT_MAXIMUMSCREENSPACEERROR = 16;\r\n","/*!\n * @maptalks/gl v0.117.1\n * LICENSE : UNLICENSED\n * (c) 2016-2025 maptalks.com\n */\nconst n = function() {\n if (\"undefined\" != typeof globalThis) return globalThis;\n if (\"undefined\" != typeof self) return self;\n if (\"undefined\" != typeof window) return window;\n if (\"undefined\" != typeof global) return global;\n throw new Error(\"unable to locate global object\");\n}, t = n(), e = t.gl_trans__coders = t.gl_trans__coders || {};\n\nfunction r(n) {\n return e[n];\n}\n\nfunction _(n, t) {\n e[n] = t;\n}\n\nfunction o() {\n return n().maptalks_gltf_loader;\n}\n\nfunction l(t) {\n n().maptalks_gltf_loader_bundle = t;\n}\n\ne.inject = function(e) {\n const r = e.toString(), _ = r.indexOf(\"{\") + 1, o = r.substring(0, _), l = t.gl_trans__coders = t.gl_trans__coders || {};\n let s = `${o}\\n const _____getGlobal = ${n.toString()};\\n const g___lobals = _____getGlobal()\\n const tran_____scoders = g___lobals['gl_trans__coders'] = g___lobals['gl_trans__coders'] || {};`;\n for (const n in l) \"inject\" !== n && \"getTranscoder\" !== n && \"registerTranscoder\" !== n && (s += 'tran_____scoders[\"' + n + '\"] =' + l[n].toString() + \"\\n;\");\n return s += \"\\n(\" + n().maptalks_gltf_loader_bundle.toString() + \")({});\\n\", s += \"\\n\" + r.substring(o.length), \n s;\n}, e.registerTranscoder = _, e.getTranscoder = r;\n\nexport { e as default, o as getGLTFLoaderBundle, r as getTranscoder, l as registerGLTFLoaderBundle, _ as registerTranscoder };\n","import * as maptalks from 'maptalks';\r\n\r\nconst canvas = typeof document === 'undefined' ? null : document.createElement('canvas');\r\n\r\nexport default class Geo3DTilesWorkerConnection extends maptalks.worker.Actor {\r\n constructor(workerKey, mapId, supportNPOT) {\r\n super(workerKey);\r\n this.mapId = mapId;\r\n this._supportNPOT = supportNPOT;\r\n }\r\n\r\n initialize(cb) {\r\n cb(null);\r\n }\r\n\r\n loadTile(layerId, params, cb) {\r\n let buffers = null;\r\n if (params && params.arraybuffer) {\r\n buffers = [params.arraybuffer];\r\n }\r\n const data = {\r\n mapId : this.mapId,\r\n layerId,\r\n command : 'loadTile',\r\n params\r\n };\r\n this.send(data, buffers, cb);\r\n }\r\n\r\n abortTileLoading(layerId, url, cb) {\r\n const data = {\r\n mapId : this.mapId,\r\n layerId,\r\n command : 'abortTileLoading',\r\n params : {\r\n url\r\n }\r\n };\r\n this.broadcast(data, null, cb);\r\n }\r\n\r\n addLayer(layerId, options, cb) {\r\n const data = {\r\n actorId: this.actorId,\r\n mapId : this.mapId,\r\n layerId,\r\n command : 'addLayer',\r\n params : {\r\n options\r\n }\r\n };\r\n\r\n this.broadcast(data, null, cb);\r\n }\r\n\r\n removeLayer(layerId, cb) {\r\n const data = {\r\n mapId : this.mapId,\r\n layerId,\r\n command : 'removeLayer'\r\n };\r\n this.broadcast(data, null, cb);\r\n }\r\n\r\n requestImage({ url }, cb) {\r\n const image = new Image();\r\n image.onload = () => {\r\n if (!this.isActive()) {\r\n return;\r\n }\r\n if (!canvas) {\r\n cb(new Error('There is no canvas to draw image!'));\r\n return;\r\n }\r\n const img = this._supportNPOT ? image : resize(image);\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n ctx.drawImage(img, 0, 0, img.width, img.height);\r\n const imgData = ctx.getImageData(0, 0, img.width, img.height);\r\n //TODO, retina may need special operations\r\n const result = { width : img.width, height : img.height, data : new Uint8Array(imgData.data) };\r\n cb(null, result, [result.data.buffer]);\r\n };\r\n image.onerror = function (err) {\r\n cb(err);\r\n };\r\n image.src = url;\r\n }\r\n}\r\n\r\nfunction resize(image) {\r\n if (isPowerOfTwo(image.width) && isPowerOfTwo(image.height)) {\r\n return image;\r\n }\r\n let width = image.width;\r\n let height = image.height;\r\n if (!isPowerOfTwo(width)) {\r\n width = floorPowerOfTwo(width);\r\n }\r\n if (!isPowerOfTwo(height)) {\r\n height = floorPowerOfTwo(height);\r\n }\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width;\r\n canvas.height = height;\r\n canvas.getContext('2d').drawImage(image, 0, 0, width, height);\r\n const url = image.src;\r\n const idx = url.lastIndexOf('/') + 1;\r\n const filename = url.substring(idx);\r\n console.warn(`Texture(${filename})'s size is not power of two, resize from (${image.width}, ${image.height}) to (${width}, ${height})`);\r\n return canvas;\r\n}\r\n\r\nfunction isPowerOfTwo(value) {\r\n return (value & (value - 1)) === 0 && value !== 0;\r\n}\r\n\r\nfunction floorPowerOfTwo(value) {\r\n return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));\r\n}\r\n","/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\r\nimport { mat4, quat } from 'gl-matrix';\r\n\r\nconst { GLTFLoader } = getGLTFLoaderBundle();\r\n\r\nexport function iterateMesh(gltf, cb) {\r\n if (!gltf.scenes || !gltf.scenes.length) {\r\n return;\r\n }\r\n for (let i0 = 0, l0 = gltf.scenes.length; i0 < l0; i0++) {\r\n const nodes = gltf.scenes[i0].nodes;\r\n for (let i = 0, l = nodes.length; i < l; i++) {\r\n const matrices = [];\r\n const node = nodes[i];\r\n iterateNode(node, matrices, gltf, cb);\r\n // if (node.children && node.children.length) {\r\n // for (let ii = 0, ll = node.children.length; ii < ll; ii++) {\r\n // iterateNode(node.children[i], matrices, gltf, cb);\r\n // }\r\n // }\r\n }\r\n }\r\n}\r\n\r\nconst TMAT = [];\r\nconst RMAT = [];\r\nconst SMAT = [];\r\nconst EMPTY_T = [0, 0, 0];\r\nconst EMTPY_Q = quat.identity([]);\r\nconst EMPTY_S = [1, 1, 1];\r\n\r\nfunction iterateNode(node, nodeMatrices, gltf, cb) {\r\n const matrices = nodeMatrices.slice(0);\r\n if (node.matrix) {\r\n matrices.push(node.matrix);\r\n } else if (node.rotation || node.translation || node.scale) {\r\n const tm = mat4.fromTranslation(TMAT, node.translation || EMPTY_T);\r\n const rm = mat4.fromQuat(RMAT, node.rotation || EMTPY_Q);\r\n const sm = mat4.fromScaling(SMAT, node.scale || EMPTY_S);\r\n mat4.multiply(sm, rm, sm);\r\n const matrix = mat4.multiply([], tm, sm);\r\n matrices.push(matrix);\r\n }\r\n if (node.children && node.children.length) {\r\n for (let ii = 0, ll = node.children.length; ii < ll; ii++) {\r\n iterateNode(node.children[ii], matrices, gltf, cb);\r\n }\r\n }\r\n if (node.mesh !== undefined) {\r\n const meshIndex = node.mesh;\r\n const mesh = gltf.meshes[meshIndex];\r\n if (mesh) {\r\n const mat = matrices.slice(0);\r\n const primitives = mesh.primitives;\r\n for (let ii = 0, ll = primitives.length; ii < ll; ii++) {\r\n const primitive = primitives[ii];\r\n if (primitive) {\r\n primitive.matrices = mat;\r\n cb(primitive, meshIndex, ii, gltf);\r\n }\r\n }\r\n }\r\n }\r\n // if (node.meshes && node.meshes.length) {\r\n // for (let i = 0, l = node.meshes.length; i < l; i++) {\r\n // const mesh = node.meshes[i];\r\n // if (mesh) {\r\n // const mat = matrices.slice(0);\r\n // const primitives = mesh.primitives;\r\n // for (let ii = 0, ll = primitives.length; ii < ll; ii++) {\r\n // const primitive = primitives[ii];\r\n // if (primitive) {\r\n // primitive.matrices = mat;\r\n // cb(primitive, gltf);\r\n // }\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n}\r\n\r\n// 遍历 GLTF-Loader 返回的bufferData\r\nexport function iterateBufferData(arr, cb) {\r\n let { byteOffset, byteStride: stride, count } = arr;\r\n const { componentType, itemSize } = arr;\r\n const arrayBuffer = arr.array.buffer;\r\n const ctor = componentType ? GLTFLoader.getTypedArrayCtor(componentType) : arr.array.constructor;\r\n byteOffset = byteOffset === undefined ? arr.array.byteOffset : byteOffset;\r\n stride = stride || 0;\r\n count = count || arr.array.length / itemSize;\r\n if ((!stride || stride === itemSize * ctor.BYTES_PER_ELEMENT) && byteOffset % ctor.BYTES_PER_ELEMENT === 0) {\r\n const src = new ctor(arrayBuffer, byteOffset, count * itemSize);\r\n for (let i = 0; i < count * itemSize; i+= itemSize) {\r\n const tempTypeArray = new ctor(src.buffer, byteOffset + i * ctor.BYTES_PER_ELEMENT, itemSize);\r\n cb(tempTypeArray, i / itemSize);\r\n }\r\n return;\r\n }\r\n const tempUint8 = new Uint8Array(itemSize * ctor.BYTES_PER_ELEMENT);\r\n if (!stride) {\r\n stride = itemSize * ctor.BYTES_PER_ELEMENT;\r\n }\r\n for (let i = 0; i < count; i++) {\r\n const start = stride * i + byteOffset;\r\n const uint8Arr = new Uint8Array(arrayBuffer, start, itemSize * ctor.BYTES_PER_ELEMENT);\r\n tempUint8.set(uint8Arr);\r\n const item = new ctor(tempUint8.buffer);\r\n cb(item, i);\r\n uint8Arr.set(tempUint8);\r\n }\r\n}\r\n\r\n\r\n// 从 GLTF-Loader 返回的bufferData获取指定位置的数据\r\nexport function getItemAtBufferData(out, arr, index) {\r\n let { byteOffset, byteStride: stride } = arr;\r\n const { componentType, itemSize } = arr;\r\n const arrayBuffer = arr.array.buffer;\r\n const ctor = componentType ? GLTFLoader.getTypedArrayCtor(componentType) : arr.array.constructor;\r\n byteOffset = byteOffset === undefined ? arr.array.byteOffset : byteOffset;\r\n stride = stride || 0;\r\n if (!stride || (stride === itemSize * ctor.BYTES_PER_ELEMENT && byteOffset % ctor.BYTES_PER_ELEMENT === 0)) {\r\n const src = new ctor(arrayBuffer, byteOffset + index * itemSize * ctor.BYTES_PER_ELEMENT, itemSize);\r\n out.set(src);\r\n return out;\r\n }\r\n if (!stride) {\r\n stride = itemSize * ctor.BYTES_PER_ELEMENT;\r\n }\r\n const start = stride * index + byteOffset;\r\n const uint8Arr = new Uint8Array(arrayBuffer, start, itemSize * ctor.BYTES_PER_ELEMENT);\r\n const tempUint8 = new Uint8Array(out.buffer);\r\n tempUint8.set(uint8Arr);\r\n return out;\r\n\r\n}\r\n\r\nexport function setInstanceData(out, idx, matrix, row) {\r\n out[idx * 4] = matrix[row];\r\n out[idx * 4 + 1] = matrix[row + 4];\r\n out[idx * 4 + 2] = matrix[row + 8];\r\n out[idx * 4 + 3] = matrix[row + 12];\r\n}\r\n\r\n\r\nexport function binarizeGLTF(rawGLTF, glb) {\r\n const encoder = new TextEncoder();\r\n const rawGLTFData = encoder.encode(JSON.stringify(rawGLTF));\r\n // const binaryGLTFData = new Uint8Array(rawGLTFData.byteLength + 20);\r\n\r\n let chunkPadding = 0;\r\n if (rawGLTFData.byteLength % 4 !== 0) {\r\n chunkPadding = 4 - rawGLTFData.byteLength % 4;\r\n }\r\n // JSON的长度是 rawGLTFData.byteLength + 20\r\n const binaryGLTFData = new Uint8Array(rawGLTFData.byteLength + 20 + chunkPadding + glb.byteLength + 8);\r\n const binaryGLTF = {\r\n magic: new Uint8Array(binaryGLTFData.buffer, 0, 4),\r\n version: new Uint32Array(binaryGLTFData.buffer, 4, 1),\r\n length: new Uint32Array(binaryGLTFData.buffer, 8, 1),\r\n chunkLength: new Uint32Array(binaryGLTFData.buffer, 12, 1),\r\n chunkType: new Uint32Array(binaryGLTFData.buffer, 16, 1),\r\n chunkData: new Uint8Array(\r\n binaryGLTFData.buffer,\r\n 20,\r\n rawGLTFData.byteLength\r\n ),\r\n chunk1Length: new Uint32Array(binaryGLTFData.buffer, chunkPadding + 20 + rawGLTFData.byteLength, 1),\r\n chunk1Type: new Uint32Array(binaryGLTFData.buffer, chunkPadding + 24 + rawGLTFData.byteLength, 1),\r\n chunk1Data: new Uint8Array(\r\n binaryGLTFData.buffer,\r\n chunkPadding + 20 + rawGLTFData.byteLength + 4 + 4,\r\n glb.byteLength\r\n )\r\n };\r\n\r\n for (let i = 0; i < chunkPadding; i++) {\r\n // chunkPadding 用空格补充\r\n binaryGLTFData[rawGLTFData.byteLength + 20 + i] = 32;\r\n }\r\n\r\n binaryGLTF.magic[0] = \"g\".charCodeAt();\r\n binaryGLTF.magic[1] = \"l\".charCodeAt();\r\n binaryGLTF.magic[2] = \"T\".charCodeAt();\r\n binaryGLTF.magic[3] = \"F\".charCodeAt();\r\n\r\n binaryGLTF.version[0] = 2;\r\n binaryGLTF.length[0] = binaryGLTFData.byteLength;\r\n binaryGLTF.chunkLength[0] = rawGLTFData.byteLength + chunkPadding;\r\n binaryGLTF.chunkType[0] = 0x4e4f534a; // JSON\r\n binaryGLTF.chunkData.set(rawGLTFData);\r\n\r\n binaryGLTF.chunk1Length[0] = glb.byteLength;\r\n binaryGLTF.chunk1Type[0] = 0x004E4942;\r\n binaryGLTF.chunk1Data.set(glb);\r\n\r\n return binaryGLTFData;\r\n}\r\n\r\nexport function binarizeB3DM(featureTableJSON, batchTabelJSON, binaryGLTFData) {\r\n const encoder = new TextEncoder();\r\n\r\n // Feature Table\r\n const featureTableOffset = 28;\r\n const featureTableJSONData = encoder.encode(featureTableJSON);\r\n const featureTableLength = featureTableJSONData.byteLength;\r\n\r\n // Batch Table\r\n const batchTableOffset = featureTableOffset + featureTableLength;\r\n const batchTableJSONData = encoder.encode(batchTabelJSON);\r\n\r\n // Calculate alignment buffer by padding the remainder of the batch table\r\n const paddingCount = (batchTableOffset + batchTableJSONData.byteLength) % 8;\r\n const batchTableLength = batchTableJSONData.byteLength + paddingCount;\r\n const paddingStart = batchTableJSONData.byteLength;\r\n const paddingStop = batchTableLength;\r\n\r\n // Binary GLTF\r\n const binaryGLTFOffset = batchTableOffset + batchTableLength;\r\n const binaryGLTFLength = binaryGLTFData.byteLength;\r\n\r\n const dataSize = featureTableLength + batchTableLength + binaryGLTFLength;\r\n const b3dmRawData = new Uint8Array(28 + dataSize);\r\n\r\n const b3dmData = {\r\n magic: new Uint8Array(b3dmRawData.buffer, 0, 4),\r\n version: new Uint32Array(b3dmRawData.buffer, 4, 1),\r\n byteLength: new Uint32Array(b3dmRawData.buffer, 8, 1),\r\n featureTableJSONByteLength: new Uint32Array(b3dmRawData.buffer, 12, 1),\r\n featureTableBinaryByteLength: new Uint32Array(b3dmRawData.buffer, 16, 1),\r\n batchTableJSONByteLength: new Uint32Array(b3dmRawData.buffer, 20, 1),\r\n batchTableBinaryByteLength: new Uint32Array(b3dmRawData.buffer, 24, 1),\r\n featureTable: new Uint8Array(\r\n b3dmRawData.buffer,\r\n featureTableOffset,\r\n featureTableLength\r\n ),\r\n batchTable: new Uint8Array(\r\n b3dmRawData.buffer,\r\n batchTableOffset,\r\n batchTableLength\r\n ),\r\n binaryGLTF: new Uint8Array(\r\n b3dmRawData.buffer,\r\n binaryGLTFOffset,\r\n binaryGLTFLength\r\n ),\r\n };\r\n\r\n b3dmData.magic[0] = \"b\".charCodeAt();\r\n b3dmData.magic[1] = \"3\".charCodeAt();\r\n b3dmData.magic[2] = \"d\".charCodeAt();\r\n b3dmData.magic[3] = \"m\".charCodeAt();\r\n\r\n b3dmData.version[0] = 1;\r\n b3dmData.byteLength[0] = b3dmRawData.byteLength;\r\n\r\n b3dmData.featureTable.set(featureTableJSONData);\r\n b3dmData.featureTableJSONByteLength[0] = featureTableLength;\r\n b3dmData.featureTableBinaryByteLength[0] = 0;\r\n\r\n b3dmData.batchTable.set(batchTableJSONData);\r\n for(let index = paddingStart; index < paddingStop; ++index) {\r\n b3dmData.batchTable[index] = 0x20;\r\n }\r\n b3dmData.batchTableJSONByteLength[0] = batchTableLength;\r\n b3dmData.batchTableBinaryByteLength[0] = 0;\r\n b3dmData.binaryGLTF.set(binaryGLTFData);\r\n\r\n return b3dmRawData;\r\n}\r\n","//---------------------------\r\n// Cesium Codes for catersian and quaternion transformation\r\n//\r\n// All credit goes to Cesium team and Cesium Contributors\r\n// LICENSE : Apache License\r\n//---------------------------\r\nimport { vec3 } from 'gl-matrix';\r\nimport { toDegree, sign } from './Util';\r\n\r\n\r\n//reusable variables for radianToCartesian3\r\nconst scratchN = new Array(3),\r\n scratchK = new Array(3);\r\n\r\nconst wgs84RadiiSquared = [6378137.0 * 6378137.0, 6378137.0 * 6378137.0, 6356752.3142451793 * 6356752.3142451793];\r\n\r\n/**\r\n * from Cesium\r\n * Convert radians to Cartesian3 coordinate\r\n * from Cesium Cartesian3.fromRadians\r\n * @param {Number} longitude in radians\r\n * @param {Number} latitude in radians\r\n * @param {Number} height in meters\r\n * @param {Number} radius earth sphere's radius\r\n * @returns {Number[]} coordinate in Cartesian3\r\n */\r\nexport function radianToCartesian3(out, longitude, latitude, height) {\r\n const radiiSquared = wgs84RadiiSquared;\r\n\r\n const cosLatitude = Math.cos(latitude);\r\n scratchN[0] = cosLatitude * Math.cos(longitude);\r\n scratchN[1] = cosLatitude * Math.sin(longitude);\r\n scratchN[2] = Math.sin(latitude);\r\n normalizeCartesian(scratchN, scratchN);\r\n\r\n vec3.multiply(scratchK, radiiSquared, scratchN);\r\n const gamma = Math.sqrt(vec3.dot(scratchN, scratchK));\r\n divideByScalar(scratchK, scratchK, gamma);\r\n vec3.scale(scratchN, scratchN, height);\r\n\r\n return vec3.add(out, scratchK, scratchN);\r\n}\r\n\r\n//reusable variables for cartesian3ToDegree\r\nconst wgs84OneOverRadii = [1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.3142451793];\r\nconst wgs84OneOverRadiiSquared = [1.0 / (6378137 * 6378137), 1.0 / (6378137 * 6378137), 1.0 / (6356752.3142451793 * 6356752.3142451793)];\r\n\r\nconst cartesianToCartographicP = new Array(3);\r\nconst cartesianToCartographicN = new Array(3);\r\nconst cartesianToCartographicH = new Array(3);\r\n\r\n/**\r\n * from Cesium\r\n * Creates a new Cartographic instance from a Cartesian position. The values in the\r\n * resulting object will be in radians.\r\n *\r\n * @param cartesian The Cartesian position to convert to cartographic representation.\r\n * @returns {Cartographic} The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.\r\n */\r\nexport function cartesian3ToDegree(result, cartesian) {\r\n const oneOverRadii = wgs84OneOverRadii;\r\n const oneOverRadiiSquared = wgs84OneOverRadiiSquared;\r\n const centerToleranceSquared = 0.1;\r\n\r\n //`cartesian is required.` is thrown from scaleToGeodeticSurface\r\n const p = scaleToGeodeticSurface(cartesianToCartographicP, cartesian, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared);\r\n\r\n let n = vec3.mul(cartesianToCartographicN, p, oneOverRadiiSquared);\r\n n = normalizeCartesian(n, n);\r\n\r\n const h = vec3.sub(cartesianToCartographicH, cartesian, p);\r\n\r\n const longitude = Math.atan2(n[1], n[0]);\r\n const latitude = Math.asin(n[2]);\r\n const height = sign(vec3.dot(h, cartesian)) * magnitude(h);\r\n\r\n result[0] = toDegree(longitude);\r\n result[1] = toDegree(latitude);\r\n result[2] = height;\r\n return result;\r\n}\r\n\r\n//reusable variables for scaleToGeodeticSurface\r\nconst scaleToGeodeticSurfaceIntersection = new Array(3);\r\nconst scaleToGeodeticSurfaceGradient = new Array(3);\r\nconst EPSILON12 = 1E-12;\r\n\r\n/**\r\n * from Cesium\r\n * Scales the provided Cartesian position along the geodetic surface normal\r\n * so that it is on the surface of this ellipsoid. If the position is\r\n * at the center of the ellipsoid, this function returns undefined.\r\n *\r\n * @param {Cartesian3} cartesian The Cartesian position to scale.\r\n * @param {Cartesian3} oneOverRadii One over radii of the ellipsoid.\r\n * @param {Cartesian3} oneOverRadiiSquared One over radii squared of the ellipsoid.\r\n * @param {Number} centerToleranceSquared Tolerance for closeness to the center.\r\n * @param {Cartesian3} [result] The object onto which to store the result.\r\n * @returns {Cartesian3} The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center.\r\n *\r\n * @exports scaleToGeodeticSurface\r\n *\r\n * @private\r\n */\r\nfunction scaleToGeodeticSurface(result, cartesian, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared) {\r\n\r\n const positionX = cartesian[0];\r\n const positionY = cartesian[1];\r\n const positionZ = cartesian[2];\r\n\r\n const oneOverRadiiX = oneOverRadii[0];\r\n const oneOverRadiiY = oneOverRadii[1];\r\n const oneOverRadiiZ = oneOverRadii[2];\r\n\r\n const x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX;\r\n const y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY;\r\n const z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ;\r\n\r\n // Compute the squared ellipsoid norm.\r\n const squaredNorm = x2 + y2 + z2;\r\n const ratio = Math.sqrt(1.0 / squaredNorm);\r\n\r\n // As an initial approximation, assume that the radial intersection is the projection point.\r\n // const intersection = Cartesian3.multiplyByScalar(cartesian, ratio, scaleToGeodeticSurfaceIntersection);\r\n const intersection = vec3.scale(scaleToGeodeticSurfaceIntersection, cartesian, ratio);\r\n\r\n // If the position is near the center, the iteration will not converge.\r\n if (squaredNorm < centerToleranceSquared) {\r\n return !isFinite(ratio) ? undefined : intersection;\r\n }\r\n\r\n const oneOverRadiiSquaredX = oneOverRadiiSquared[0];\r\n const oneOverRadiiSquaredY = oneOverRadiiSquared[1];\r\n const oneOverRadiiSquaredZ = oneOverRadiiSquared[2];\r\n\r\n // Use the gradient at the intersection point in place of the true unit normal.\r\n // The difference in magnitude will be absorbed in the multiplier.\r\n const gradient = scaleToGeodeticSurfaceGradient;\r\n gradient[0] = intersection[0] * oneOverRadiiSquaredX * 2.0;\r\n gradient[1] = intersection[1] * oneOverRadiiSquaredY * 2.0;\r\n gradient[2] = intersection[2] * oneOverRadiiSquaredZ * 2.0;\r\n\r\n // Compute the initial guess at the normal vector multiplier, lambda.\r\n let lambda = (1.0 - ratio) * magnitude(cartesian) / (0.5 * magnitude(gradient));\r\n let correction = 0.0;\r\n\r\n let func;\r\n let denominator;\r\n let xMultiplier;\r\n let yMultiplier;\r\n let zMultiplier;\r\n let xMultiplier2;\r\n let yMultiplier2;\r\n let zMultiplier2;\r\n let xMultiplier3;\r\n let yMultiplier3;\r\n let zMultiplier3;\r\n\r\n do {\r\n lambda -= correction;\r\n\r\n xMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredX);\r\n yMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredY);\r\n zMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredZ);\r\n\r\n xMultiplier2 = xMultiplier * xMultiplier;\r\n yMultiplier2 = yMultiplier * yMultiplier;\r\n zMultiplier2 = zMultiplier * zMultiplier;\r\n\r\n xMultiplier3 = xMultiplier2 * xMultiplier;\r\n yMultiplier3 = yMultiplier2 * yMultiplier;\r\n zMultiplier3 = zMultiplier2 * zMultiplier;\r\n\r\n func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;\r\n\r\n // \"denominator\" here refers to the use of this expression in the velocity and acceleration\r\n // computations in the sections to follow.\r\n denominator = x2 * xMultiplier3 * oneOverRadiiSquaredX + y2 * yMultiplier3 * oneOverRadiiSquaredY + z2 * zMultiplier3 * oneOverRadiiSquaredZ;\r\n\r\n const derivative = -2.0 * denominator;\r\n\r\n correction = func / derivative;\r\n } while (Math.abs(func) > EPSILON12);\r\n\r\n result[0] = positionX * xMultiplier;\r\n result[1] = positionY * yMultiplier;\r\n result[2] = positionZ * zMultiplier;\r\n return result;\r\n}\r\n\r\nfunction magnitude(v) {\r\n return vec3.length(v);\r\n}\r\n\r\nfunction divideByScalar(result, cartesian, scalar) {\r\n result[0] = cartesian[0] / scalar;\r\n result[1] = cartesian[1] / scalar;\r\n result[2] = cartesian[2] / scalar;\r\n return result;\r\n}\r\n\r\nexport function normalizeCartesian(out, a) {\r\n const x = a[0],\r\n y = a[1],\r\n z = a[2];\r\n let len = x * x + y * y + z * z;\r\n if (len > 0) {\r\n len = Math.sqrt(len);\r\n out[0] = a[0] / len;\r\n out[1] = a[1] / len;\r\n out[2] = a[2] / len;\r\n }\r\n return out;\r\n}\r\n\r\nexport function geodeticSurfaceNormal(origin, out) {\r\n vec3.multiply(\r\n out,\r\n origin,\r\n wgs84OneOverRadiiSquared\r\n );\r\n return vec3.normalize(out, out);\r\n}\r\n\r\n\r\nexport function geodeticSurfaceNormalCartographic(\r\n cartographic,\r\n result\r\n) {\r\n const longitude = cartographic[0];\r\n const latitude = cartographic[1];\r\n const cosLatitude = Math.cos(latitude);\r\n\r\n const x = cosLatitude * Math.cos(longitude);\r\n const y = cosLatitude * Math.sin(longitude);\r\n const z = Math.sin(latitude);\r\n\r\n result.x = x;\r\n result.y = y;\r\n result.z = z;\r\n return vec3.normalize(result, result);\r\n}\r\n","export const EPSILON14 = 0.00000000000001;\r\nexport const EPSILON15 = 0.000000000000001;\r\nexport const EPSILON6 = 0.000001;\r\n\r\nexport function equalsEpsilon (\r\n left,\r\n right,\r\n relativeEpsilon,\r\n absoluteEpsilon\r\n) { //>>includeEnd('debug');\r\n\r\n relativeEpsilon = (relativeEpsilon || 0.0);\r\n absoluteEpsilon = (absoluteEpsilon || relativeEpsilon);\r\n const absDiff = Math.abs(left - right);\r\n return (\r\n absDiff <= absoluteEpsilon ||\r\n absDiff <= relativeEpsilon * Math.max(Math.abs(left), Math.abs(right))\r\n );\r\n}\r\n","import { stringFromUTF8Array, sign as mathSign } from './Util.js';\r\nimport { vec3, mat3, mat4 } from 'gl-matrix';\r\nimport { cartesian3ToDegree, geodeticSurfaceNormal, radianToCartesian3 } from './Transform';\r\nimport { EPSILON14, equalsEpsilon } from './Math';\r\n\r\nexport function readMagic(view, offset) {\r\n let magic = '';\r\n for (let i = 0; i < 4; i++) {\r\n const code = view.getUint8(offset + i);\r\n magic += String.fromCharCode(code);\r\n }\r\n return magic;\r\n}\r\n\r\nconst textDecoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8') : null;\r\n\r\nexport function readFeatureTableJSON(buffer, byteOffset, byteLength) {\r\n const arr = new Uint8Array(buffer, byteOffset, byteLength);\r\n if (textDecoder) {\r\n return JSON.parse(textDecoder.decode(arr));\r\n } else {\r\n return JSON.parse(stringFromUTF8Array(arr));\r\n }\r\n}\r\n\r\nexport function readFeatureTableBin(buffer, byteOffset, byteLength) {\r\n return {\r\n offset: byteOffset,\r\n byteLength: byteLength\r\n };\r\n}\r\n\r\n\r\nexport function readBatchTableJSON(buffer, byteOffset, byteLength) {\r\n const arr = new Uint8Array(buffer, byteOffset, byteLength);\r\n if (textDecoder) {\r\n return JSON.parse(textDecoder.decode(arr));\r\n } else {\r\n return JSON.parse(stringFromUTF8Array(arr));\r\n }\r\n}\r\n\r\nexport function readBatchTableBin(buffer, byteOffset, byteLength) {\r\n return {\r\n offset: byteOffset,\r\n byteLength\r\n };\r\n}\r\n\r\nexport function readBatchArray(batchId, buf, offset, count) {\r\n const { byteOffset, componentType, type } = batchId;\r\n const { ctor, type: reglType } = getComponentCtor(componentType || 'UNSIGNED_SHORT');\r\n const itemSize = getItemSize(type);\r\n return {\r\n byteStride: 0,\r\n byteOffset: byteOffset + offset,\r\n itemSize,\r\n count: count * itemSize,\r\n componentType: reglType,\r\n array: new ctor(buf, offset + byteOffset, count * itemSize)\r\n }\r\n}\r\n\r\nexport function readBatchId(batchId, buf, offset, count) {\r\n const batchIdData = readBatchArray(batchId, buf, offset, count);\r\n if (batchIdData.array.buffer.byteLength !== buf.byteLength) {\r\n batchIdData.array = batchIdData.array.slice();\r\n }\r\n return batchIdData;\r\n}\r\n\r\nexport function readBatchData(batchId, buf, count, index) {\r\n const { byteOffset, componentType, type } = batchId;\r\n const { ctor } = getComponentCtor(componentType || 'UNSIGNED_SHORT');\r\n const itemSize = getItemSize(type);\r\n const array = new ctor(buf, byteOffset, count * itemSize);\r\n if (itemSize === 1) {\r\n return array[index];\r\n } else {\r\n return array.subarray(index * itemSize, index * itemSize + itemSize);\r\n }\r\n\r\n}\r\n\r\nconst TYPE_SIZES = {\r\n 'SCALAR': 1,\r\n 'VEC2': 2,\r\n 'VEC3': 3,\r\n 'VEC4': 4\r\n};\r\n\r\nexport function getItemSize(type) {\r\n if (!type) {\r\n return 1;\r\n }\r\n return TYPE_SIZES[type];\r\n}\r\n\r\nconst typeMap = {\r\n \"BYTE\": { ctor: Int8Array, type: 0x1400, name: 'Int8Array' },\r\n \"UNSIGNED_BYTE\": { ctor: Uint8Array, type: 0x1401, name: 'Uint8Array' },\r\n \"SHORT\": { ctor: Int16Array, type: 0x1402, name: 'Int16Array' },\r\n \"UNSIGNED_SHORT\": { ctor: Uint16Array, type: 0x1403, name: 'Uint16Array' },\r\n \"INT\": { ctor: Int32Array, type: 0x1404, name: 'Int32Array' },\r\n \"UNSIGNED_INT\": { ctor: Uint32Array, type: 0x1405, name: 'Uint32Array' },\r\n \"FLOAT\": { ctor: Float32Array, type: 0x1406, name: 'Float32Array' },\r\n \"DOUBLE\": { ctor: Float64Array, type: 0x1406, name: 'Float64Array' }\r\n};\r\n\r\nexport function getComponentCtor(componentType) {\r\n return typeMap[componentType];\r\n}\r\n\r\nexport function getComponentFromCtor(ctor) {\r\n for (const p in typeMap) {\r\n if (ctor === typeMap[p].ctor) {\r\n return typeMap[p].type;\r\n }\r\n }\r\n throw new Error('unrecognized ctor:' + ctor);\r\n}\r\n\r\nexport function convertQuantizedPosition(out, arr, offset, scale) {\r\n const position = out;\r\n const count = arr.length / 3;\r\n for (let i = 0; i < count; i++) {\r\n position[i * 3] = (arr[i * 3] / 65535.0) * scale[0] + offset[0];\r\n position[i * 3 + 1] = (arr[i * 3 + 1] / 65535.0) * scale[1] + offset[1];\r\n position[i * 3 + 2] = (arr[i * 3 + 2] / 65535.0) * scale[2] + offset[2];\r\n }\r\n return position;\r\n}\r\n\r\n\r\nexport function readFeatureTableBatchTable(view, byteOffset, transferables) {\r\n const featureTableJsonByteLength = view.getUint32(12, true);\r\n const featureTableBinaryByteLength = view.getUint32(16, true);\r\n const batchTableJsonByteLength = view.getUint32(20, true);\r\n const batchTableBinaryByteLength = view.getUint32(24, true);\r\n\r\n const i3dmBuf = view.buffer;\r\n let featureTable = {}, featureTableBin;\r\n let batchTable = {}, batchTableBin = null;\r\n if (featureTableJsonByteLength > 0) {\r\n featureTable = readFeatureTableJSON(i3dmBuf, byteOffset, featureTableJsonByteLength);\r\n byteOffset += featureTableJsonByteLength;\r\n }\r\n if (featureTableBinaryByteLength > 0) {\r\n featureTableBin = readFeatureTableBin(i3dmBuf, byteOffset, featureTableBinaryByteLength);\r\n byteOffset += featureTableBinaryByteLength;\r\n }\r\n if (batchTableJsonByteLength > 0) {\r\n batchTable = readBatchTableJSON(i3dmBuf, byteOffset, batchTableJsonByteLength);\r\n byteOffset += batchTableJsonByteLength;\r\n }\r\n const batchTableBinInfo = readBatchTableBin(i3dmBuf, byteOffset, batchTableBinaryByteLength);\r\n batchTableBin = i3dmBuf.slice(batchTableBinInfo.offset, batchTableBinInfo.offset + batchTableBinInfo.byteLength);\r\n transferables.push(batchTableBin);\r\n\r\n return {\r\n featureTable, featureTableBin, batchTable, batchTableBin\r\n };\r\n}\r\n\r\n\r\nconst vectorProductLocalFrame = {\r\n up: {\r\n south: \"east\",\r\n north: \"west\",\r\n west: \"south\",\r\n east: \"north\",\r\n },\r\n down: {\r\n south: \"west\",\r\n north: \"east\",\r\n west: \"north\",\r\n east: \"south\",\r\n },\r\n south: {\r\n up: \"west\",\r\n down: \"east\",\r\n west: \"down\",\r\n east: \"up\",\r\n },\r\n north: {\r\n up: \"east\",\r\n down: \"west\",\r\n west: \"up\",\r\n east: \"down\",\r\n },\r\n west: {\r\n up: \"north\",\r\n down: \"south\",\r\n north: \"down\",\r\n south: \"up\",\r\n },\r\n east: {\r\n up: \"south\",\r\n down: \"north\",\r\n north: \"up\",\r\n south: \"down\",\r\n },\r\n};\r\n\r\nconst degeneratePositionLocalFrame = {\r\n north: [-1, 0, 0],\r\n east: [0, 1, 0],\r\n up: [0, 0, 1],\r\n south: [1, 0, 0],\r\n west: [0, -1, 0],\r\n down: [0, 0, -1],\r\n};\r\nconst localFrameToFixedFrameCache = {};\r\nconst scratchCalculateCartesian = {\r\n east:[],\r\n north:[],\r\n up:[],\r\n west:[],\r\n south:[],\r\n down:[],\r\n};\r\nlet scratchFirstCartesian = [];\r\nlet scratchSecondCartesian = [];\r\nlet scratchThirdCartesian = [];\r\n\r\nconst ZERO = [0, 0, 0];\r\n\r\nfunction localFrameToFixedFrameGenerator(firstAxis, secondAxis) {\r\n const thirdAxis = vectorProductLocalFrame[firstAxis][secondAxis];\r\n\r\n /**\r\n * Computes a 4x4 transformation matrix from a reference frame\r\n * centered at the provided origin to the provided ellipsoid's fixed reference frame.\r\n * @callback Transforms.LocalFrameToFixedFrame\r\n * @param {Cartesian3} origin The center point of the local reference frame.\r\n * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.\r\n * @param {Matrix4} [result] The object onto which to store the result.\r\n * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.\r\n */\r\n let resultat;\r\n const hashAxis = firstAxis + secondAxis;\r\n if (localFrameToFixedFrameCache[hashAxis]) {\r\n resultat = localFrameToFixedFrameCache[hashAxis];\r\n } else {\r\n resultat = function (origin, ellipsoid, result) {\r\n if (\r\n vec3.equals(origin, ZERO)\r\n ) {\r\n // If x, y, and z are zero, use the degenerate local frame, which is a special case\r\n vec3.copy(scratchFirstCartesian, degeneratePositionLocalFrame[firstAxis]);\r\n vec3.copy(scratchSecondCartesian, degeneratePositionLocalFrame[secondAxis]);\r\n vec3.copy(scratchThirdCartesian, degeneratePositionLocalFrame[thirdAxis]);\r\n } else if (\r\n equalsEpsilon(origin[0], 0.0, EPSILON14) &&\r\n equalsEpsilon(origin[1], 0.0, EPSILON14)\r\n ) {\r\n // If x and y are zero, assume origin is at a pole, which is a special case.\r\n const sign = mathSign(origin[2]);\r\n\r\n vec3.copy(scratchFirstCartesian, degeneratePositionLocalFrame[firstAxis]);\r\n if (firstAxis !== \"east\" && firstAxis !== \"west\") {\r\n vec3.scale(scratchFirstCartesian, scratchFirstCartesian, sign);\r\n }\r\n\r\n vec3.copy(scratchSecondCartesian, degeneratePositionLocalFrame[secondAxis]);\r\n if (secondAxis !== \"east\" && secondAxis !== \"west\") {\r\n vec3.scale(scratchSecondCartesian, scratchSecondCartesian, sign);\r\n }\r\n\r\n vec3.copy(scratchThirdCartesian, degeneratePositionLocalFrame[thirdAxis]);\r\n if (thirdAxis !== \"east\" && thirdAxis !== \"west\") {\r\n vec3.scale(scratchThirdCartesian, scratchThirdCartesian, sign);\r\n }\r\n } else {\r\n geodeticSurfaceNormal(origin, scratchCalculateCartesian.up);\r\n\r\n const up = scratchCalculateCartesian.up;\r\n const east = scratchCalculateCartesian.east;\r\n east[0] = -origin[1];\r\n east[1] = origin[0];\r\n east[2] = 0.0;\r\n vec3.normalize(scratchCalculateCartesian.east, east);\r\n vec3.cross(scratchCalculateCartesian.north, up, east);\r\n\r\n vec3.scale(\r\n scratchCalculateCartesian.down,\r\n scratchCalculateCartesian.up,\r\n -1\r\n );\r\n vec3.scale(\r\n scratchCalculateCartesian.west,\r\n scratchCalculateCartesian.east,\r\n -1\r\n );\r\n vec3.scale(\r\n scratchCalculateCartesian.south,\r\n scratchCalculateCartesian.north,\r\n -1\r\n );\r\n\r\n scratchFirstCartesian = scratchCalculateCartesian[firstAxis];\r\n scratchSecondCartesian = scratchCalculateCartesian[secondAxis];\r\n scratchThirdCartesian = scratchCalculateCartesian[thirdAxis];\r\n }\r\n result[0] = scratchFirstCartesian[0];\r\n result[1] = scratchFirstCartesian[1];\r\n result[2] = scratchFirstCartesian[2];\r\n result[3] = 0.0;\r\n result[4] = scratchSecondCartesian[0];\r\n result[5] = scratchSecondCartesian[1];\r\n result[6] = scratchSecondCartesian[2];\r\n result[7] = 0.0;\r\n result[8] = scratchThirdCartesian[0];\r\n result[9] = scratchThirdCartesian[1];\r\n result[10] = scratchThirdCartesian[2];\r\n result[11] = 0.0;\r\n result[12] = origin[0];\r\n result[13] = origin[1];\r\n result[14] = origin[2];\r\n result[15] = 1.0;\r\n return result;\r\n };\r\n localFrameToFixedFrameCache[hashAxis] = resultat;\r\n }\r\n return resultat;\r\n}\r\n\r\nfunction multiplyByMatrix3 (matrix, rotation, result) {\r\n //>>includeEnd('debug');\r\n\r\n const left0 = matrix[0];\r\n const left1 = matrix[1];\r\n const left2 = matrix[2];\r\n const left4 = matrix[4];\r\n const left5 = matrix[5];\r\n const left6 = matrix[6];\r\n const left8 = matrix[8];\r\n const left9 = matrix[9];\r\n const left10 = matrix[10];\r\n\r\n const right0 = rotation[0];\r\n const right1 = rotation[1];\r\n const right2 = rotation[2];\r\n const right4 = rotation[3];\r\n const right5 = rotation[4];\r\n const right6 = rotation[5];\r\n const right8 = rotation[6];\r\n const right9 = rotation[7];\r\n const right10 = rotation[8];\r\n\r\n const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2;\r\n const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2;\r\n const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2;\r\n\r\n const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6;\r\n const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6;\r\n const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6;\r\n\r\n const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10;\r\n const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10;\r\n const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10;\r\n\r\n result[0] = column0Row0;\r\n result[1] = column0Row1;\r\n result[2] = column0Row2;\r\n result[3] = 0.0;\r\n result[4] = column1Row0;\r\n result[5] = column1Row1;\r\n result[6] = column1Row2;\r\n result[7] = 0.0;\r\n result[8] = column2Row0;\r\n result[9] = column2Row1;\r\n result[10] = column2Row2;\r\n result[11] = 0.0;\r\n result[12] = matrix[12];\r\n result[13] = matrix[13];\r\n result[14] = matrix[14];\r\n result[15] = matrix[15];\r\n return result;\r\n}\r\n\r\n// function fromRowMajor(\r\n// column0Row0,\r\n// column1Row0,\r\n// column2Row0,\r\n// column3Row0,\r\n// column0Row1,\r\n// column1Row1,\r\n// column2Row1,\r\n// column3Row1,\r\n// column0Row2,\r\n// column1Row2,\r\n// column2Row2,\r\n// column3Row2,\r\n// column0Row3,\r\n// column1Row3,\r\n// column2Row3,\r\n// column3Row3) {\r\n// const out = [];\r\n// out[0] = column0Row0 || 0.0;\r\n// out[1] = column0Row1 || 0.0;\r\n// out[2] = column0Row2 || 0.0;\r\n// out[3] = column0Row3 || 0.0;\r\n// out[4] = column1Row0 || 0.0;\r\n// out[5] = column1Row1 || 0.0;\r\n// out[6] = column1Row2 || 0.0;\r\n// out[7] = column1Row3 || 0.0;\r\n// out[8] = column2Row0 || 0.0;\r\n// out[9] = column2Row1 || 0.0;\r\n// out[10] = column2Row2 || 0.0;\r\n// out[11] = column2Row3 || 0.0;\r\n// out[12] = column3Row0 || 0.0;\r\n// out[13] = column3Row1 || 0.0;\r\n// out[14] = column3Row2 || 0.0;\r\n// out[15] = column3Row3 || 0.0;\r\n// return out;\r\n// }\r\n\r\nexport function setTranslation(matrix, translation, result) {\r\n\r\n result[0] = matrix[0];\r\n result[1] = matrix[1];\r\n result[2] = matrix[2];\r\n result[3] = matrix[3];\r\n\r\n result[4] = matrix[4];\r\n result[5] = matrix[5];\r\n result[6] = matrix[6];\r\n result[7] = matrix[7];\r\n\r\n result[8] = matrix[8];\r\n result[9] = matrix[9];\r\n result[10] = matrix[10];\r\n result[11] = matrix[11];\r\n\r\n result[12] = translation[0];\r\n result[13] = translation[1];\r\n result[14] = translation[2];\r\n result[15] = matrix[15];\r\n\r\n return result;\r\n}\r\n\r\nexport function getTranslation(out, matrix) {\r\n vec3.set(out, matrix[12], matrix[13], matrix[14]);\r\n return out;\r\n}\r\n\r\n\r\nexport const eastNorthUpToFixedFrame = localFrameToFixedFrameGenerator(\r\n \"east\",\r\n \"north\"\r\n);\r\nconst scratchRTCCoord = [];\r\nconst scratchCenter = [];\r\nconst scratchCartographic = [];\r\nconst projectedPosition = []\r\nconst scratchFromENU = [];\r\nconst scratchToENU = [];\r\nconst scratchRotation = [];\r\nconst coord = { x: 0, y: 0 };\r\nconst prjResult = { x: 0, y: 0 };\r\nconst RADIAN = Math.PI / 180;\r\n\r\nexport function basisTo2D(result, rtcCoord, matrix, projection, res, heightScale, heightOffset) {\r\n rtcCoord = vec3.copy(scratchRTCCoord, rtcCoord);\r\n const viewCenter = radianToCartesian3(scratchRTCCoord, rtcCoord[0] * RADIAN, rtcCoord[1] * RADIAN, rtcCoord[2]);\r\n const rtcCenter = mat4.getTranslation(scratchCenter, matrix);\r\n const ellipsoid = projection.ellipsoid;\r\n\r\n let cartographic;\r\n if (vec3.len(rtcCenter) === 0) {\r\n cartographic = vec3.set(scratchCartographic, 0, 0, -6378137);\r\n } else {\r\n // Get the 2D Center\r\n cartographic = cartesian3ToDegree(\r\n scratchCartographic,\r\n rtcCenter\r\n );\r\n }\r\n coord.x = cartographic[0];\r\n coord.y = cartographic[1];\r\n const prjCoord = projection.project(\r\n coord,\r\n prjResult\r\n );\r\n\r\n projectedPosition[0] = prjCoord.x / res;\r\n projectedPosition[1] = prjCoord.y / res;\r\n projectedPosition[2] = (cartographic[2] + heightOffset) * heightScale;\r\n\r\n // cartographic[0] *= Math.PI / 180;\r\n // cartographic[1] *= Math.PI / 180;\r\n\r\n // Assuming the instance are positioned in WGS84, invert the WGS84 transform to get the local transform and then convert to 2D\r\n const fromENU = eastNorthUpToFixedFrame(\r\n viewCenter,\r\n ellipsoid,\r\n scratchFromENU\r\n );\r\n const toENU = mat4.invert(scratchToENU, fromENU);\r\n const rotation = mat3.fromMat4(scratchRotation, matrix);\r\n const local = multiplyByMatrix3(toENU, rotation, result);\r\n // mat4.multiply(result, swizzleMatrix, local); // Swap x, y, z for 2D\r\n setTranslation(local, projectedPosition, result); // Use the projected center\r\n return result;\r\n}\r\n\r\n\r\nconst component_ctors = {\r\n 5120: Int8Array,\r\n 5122: Int16Array,\r\n 5124: Int32Array,\r\n 5121: Uint8Array,\r\n 5123: Uint16Array,\r\n 5125: Uint32Array,\r\n 5126: Float32Array\r\n};\r\n\r\nexport function getTypedArrayCtor(type) {\r\n return component_ctors[type];\r\n}\r\n\r\nexport function getComponentType(ctor) {\r\n for (const p in component_ctors) {\r\n if (ctor === component_ctors[p]) {\r\n return +p;\r\n }\r\n }\r\n throw new Error('unrecognized ctor:' + ctor);\r\n}\r\n\r\n// 用数据的width获得数据的类型\r\nexport function getAttrType(width) {\r\n if (width === 1) {\r\n return 'FLOAT';\r\n }\r\n return 'VEC' + width;\r\n}\r\n","let canvas;\r\nconst OPTIONS = {\r\n width: 100,\r\n height: 10\r\n};\r\n// const ISNODE = typeof global === 'object';\r\n\r\nlet offscreenCanvas = false;\r\ntry {\r\n const canvas = new OffscreenCanvas(1, 1);\r\n const ctx = canvas.getContext('2d');\r\n ctx.fillText('hello', 0, 0);\r\n offscreenCanvas = true;\r\n} catch (err) {\r\n offscreenCanvas = false;\r\n}\r\n\r\nfunction getCanvas() {\r\n if (!canvas) {\r\n const { width, height } = OPTIONS;\r\n if (offscreenCanvas) {\r\n canvas = new OffscreenCanvas(width, height);\r\n } else {\r\n canvas = document.createElement('canvas');\r\n canvas.width = width;\r\n canvas.height = height;\r\n }\r\n }\r\n return canvas;\r\n}\r\n\r\nexport function registerCanvas(canvasInstance) {\r\n if (canvasInstance) {\r\n canvas = canvasInstance;\r\n }\r\n}\r\n\r\nexport class ColorIn {\r\n constructor(colors, options = {}) {\r\n if (!Array.isArray(colors)) {\r\n console.error('colors is not array');\r\n return;\r\n }\r\n if (colors.length < 2) {\r\n console.error('colors.length should >1');\r\n return;\r\n }\r\n this.colors = colors;\r\n let min = Infinity, max = -Infinity;\r\n for (let i = 0, len = colors.length; i < len; i++) {\r\n const value = colors[i][0];\r\n min = Math.min(value, min);\r\n max = Math.max(value, max);\r\n }\r\n this.min = min;\r\n this.max = max;\r\n this.valueOffset = this.max - this.min;\r\n this.options = Object.assign({}, OPTIONS, options);\r\n this._initImgData();\r\n }\r\n\r\n getImageData() {\r\n return this.imgData;\r\n }\r\n\r\n _initImgData() {\r\n const canvas = getCanvas();\r\n const { width, height } = this.options;\r\n canvas.width = width;\r\n canvas.height = height;\r\n const ctx = canvas.getContext('2d');\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n const { colors, valueOffset } = this;\r\n for (let i = 0, len = colors.length; i < len; i++) {\r\n const [stop, color] = colors[i];\r\n const s = (stop - this.min) / valueOffset;\r\n gradient.addColorStop(s, color);\r\n }\r\n ctx.fillStyle = gradient;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n this.imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n getColor(stop) {\r\n stop = Math.max(this.min, stop);\r\n stop = Math.min(stop, this.max);\r\n const s = (stop - this.min) / this.valueOffset;\r\n let x = Math.round(s * this.imgData.width);\r\n x = Math.min(x, this.imgData.width - 1);\r\n const idx = x * 4;\r\n const r = this.imgData.data[idx];\r\n const g = this.imgData.data[idx + 1];\r\n const b = this.imgData.data[idx + 2];\r\n const a = this.imgData.data[idx + 3];\r\n return [r, g, b, a];\r\n }\r\n}\r\n","import { ColorIn } from 'colorin';\r\nvar isMapSupported = typeof Map === 'function';\r\nvar colorInCache;\r\nif (isMapSupported) {\r\n colorInCache = new Map();\r\n}\r\n\r\n\r\nfunction isNull(value) {\r\n return value === null || value === undefined;\r\n}\r\n\r\nfunction isNotNull(value) {\r\n return !isNull(value);\r\n}\r\n\r\nfunction isEmptyString(value) {\r\n return value === '';\r\n}\r\n\r\n/*eslint-disable no-var, prefer-const*/\r\nfunction createFunction(parameters, defaultType) {\r\n var fun;\r\n var isFeatureConstant, isZoomConstant;\r\n if (!isFunctionDefinition(parameters)) {\r\n fun = function () {\r\n return parameters;\r\n };\r\n isFeatureConstant = true;\r\n isZoomConstant = true;\r\n } else {\r\n var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';\r\n var featureDependent = zoomAndFeatureDependent || isNotNull(parameters.property);\r\n var zoomDependent = zoomAndFeatureDependent || !featureDependent;\r\n var type = parameters.type || defaultType || 'exponential';\r\n\r\n var innerFun;\r\n if (type === 'exponential') {\r\n innerFun = evaluateExponentialFunction;\r\n } else if (type === 'interval') {\r\n innerFun = evaluateIntervalFunction;\r\n } else if (type === 'categorical') {\r\n innerFun = evaluateCategoricalFunction;\r\n } else if (type === 'identity') {\r\n innerFun = evaluateIdentityFunction;\r\n } else if (type === 'color-interpolate') {\r\n innerFun = evaluateColorInterpolateFunction;\r\n } else if (type === 'calculate-expression') {\r\n innerFun = evaluateCalculateExpressionFunction;\r\n } else {\r\n throw new Error('Unknown function type \"' + type + '\"');\r\n }\r\n\r\n if (zoomAndFeatureDependent) {\r\n var featureFunctions = {};\r\n var featureFunctionStops = [];\r\n for (let s = 0; s < parameters.stops.length; s++) {\r\n var stop = parameters.stops[s];\r\n if (featureFunctions[stop[0].zoom] === undefined) {\r\n featureFunctions[stop[0].zoom] = {\r\n zoom: stop[0].zoom,\r\n type: parameters.type,\r\n property: parameters.property,\r\n default: parameters.default,\r\n stops: []\r\n };\r\n }\r\n featureFunctions[stop[0].zoom].stops.push([stop[0].value, stop[1]]);\r\n }\r\n\r\n for (let z in featureFunctions) {\r\n featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z])]);\r\n }\r\n fun = function (zoom, feature) {\r\n const value = evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, zoom)(zoom, feature);\r\n return typeof value === 'function' ? value(zoom, feature) : value;\r\n };\r\n isFeatureConstant = false;\r\n isZoomConstant = false;\r\n } else if (zoomDependent) {\r\n fun = function (zoom) {\r\n const value = innerFun(parameters, zoom);\r\n return typeof value === 'function' ? value(zoom) : value;\r\n };\r\n isFeatureConstant = true;\r\n isZoomConstant = false;\r\n } else {\r\n fun = function (zoom, feature) {\r\n const value = innerFun(parameters, feature ? feature[parameters.property] : null);\r\n return typeof value === 'function' ? value(zoom, feature) : value;\r\n };\r\n isFeatureConstant = false;\r\n isZoomConstant = true;\r\n }\r\n }\r\n fun.isZoomConstant = isZoomConstant;\r\n fun.isFeatureConstant = isFeatureConstant;\r\n return fun;\r\n}\r\n\r\nfunction coalesce(a, b, c) {\r\n if (isNotNull(a)) return a;\r\n if (isNotNull(b)) return b;\r\n if (isNotNull(c)) return c;\r\n return null;\r\n}\r\n\r\nfunction evaluateCategoricalFunction(parameters, input) {\r\n for (let i = 0; i < parameters.stops.length; i++) {\r\n if (input === parameters.stops[i][0]) {\r\n return parameters.stops[i][1];\r\n }\r\n }\r\n return parameters.default;\r\n}\r\n\r\nfunction evaluateIntervalFunction(parameters, input) {\r\n for (var i = 0; i < parameters.stops.length; i++) {\r\n if (input < parameters.stops[i][0]) break;\r\n }\r\n return parameters.stops[Math.max(i - 1, 0)][1];\r\n}\r\n\r\nfunction evaluateExponentialFunction(parameters, input) {\r\n var base = isNotNull(parameters.base) && !isEmptyString(parameters.base) ? parameters.base : 1;\r\n\r\n var i = 0;\r\n while (true) {\r\n if (i >= parameters.stops.length) break;\r\n else if (input <= parameters.stops[i][0]) break;\r\n else i++;\r\n }\r\n\r\n if (i === 0) {\r\n return parameters.stops[i][1];\r\n } else if (i === parameters.stops.length) {\r\n return parameters.stops[i - 1][1];\r\n } else {\r\n return interpolate(input, base, parameters.stops[i - 1][0], parameters.stops[i][0], parameters.stops[i - 1][1], parameters.stops[i][1]);\r\n }\r\n}\r\nconst COLORIN_OPTIONS = {\r\n width: 100,\r\n height: 1\r\n};\r\nfunction evaluateColorInterpolateFunction(parameters, input) {\r\n const stops = parameters.stops;\r\n if (stops && stops.length > 1) {\r\n let colorIn;\r\n if (colorInCache) {\r\n const key = JSON.stringify(stops);\r\n if (!colorInCache.has(key)) {\r\n const colorIn = new ColorIn(stops, COLORIN_OPTIONS);\r\n colorInCache.set(key, colorIn);\r\n }\r\n colorIn = colorInCache.get(key);\r\n } else {\r\n colorIn = new ColorIn(stops, COLORIN_OPTIONS);\r\n }\r\n const [r, g, b, a] = colorIn.getColor(input);\r\n return [r / 255, g / 255, b / 255, a / 255];\r\n } else if (stops && stops.length === 1) {\r\n return stops[0][1];\r\n }\r\n return null;\r\n}\r\n\r\nfunction evaluateIdentityFunction(parameters, input) {\r\n return coalesce(input, parameters.default);\r\n}\r\n// 2添加修改计算函数\r\n// 处理空字符串和未定义属性的函数\r\nfunction evaluateCalculateExpressionFunction(parameters, input) {\r\n const targetVariable = String(parameters.property);\r\n const expression = parameters.expression;\r\n const newValue = input;\r\n\r\n // 定义函数来替换表达式中的变量\r\n function traverseAndAssign(expression, targetVariable, newValue) {\r\n const newValueAsNumber = Number(newValue);\r\n const targetVariableAsString = String(targetVariable);\r\n\r\n if (Array.isArray(expression)) {\r\n return expression.map(subExpr => traverseAndAssign(subExpr, targetVariableAsString, newValueAsNumber));\r\n } else if (expression === targetVariableAsString) {\r\n return newValueAsNumber;\r\n } else {\r\n return expression;\r\n }\r\n }\r\n\r\n // 定义函数来计算表达式的结果\r\n function evaluateExpression(expression) {\r\n if (Array.isArray(expression)) {\r\n const operator = expression[0];\r\n\r\n if (!['+', '-', '*', '/'].includes(operator)) {\r\n throw new Error(`Unknown operator: ${operator}`);\r\n }\r\n\r\n const operands = expression.slice(1).map(op => evaluateExpression(op));\r\n switch (operator) {\r\n case '+':\r\n return operands.reduce((acc, curr) => acc + curr, 0);\r\n case '-':\r\n return operands.reduce((acc, curr) => acc - curr);\r\n case '*':\r\n return operands.reduce((acc, curr) => acc * curr, 1);\r\n case '/':\r\n // 如果发现有零作为除数,返回默认值\r\n if (operands.some(op => op === 0)) {\r\n return parameters.default;\r\n }\r\n return operands.reduce((acc, curr) => acc / curr);\r\n default:\r\n throw new Error(`Unsupported operator: ${operator}`);\r\n }\r\n } else if (typeof expression === 'number') {\r\n return expression;\r\n } else {\r\n throw new Error('Invalid expression format');\r\n }\r\n }\r\n\r\n // 使用 coalesce 函数处理结果中的默认值\r\n function coalesce(value) {\r\n return (isNull(value) || isEmptyString(value) || isNaN(value)) ? parameters.default : value;\r\n }\r\n\r\n // 如果 input 存在且大于0,则处理表达式\r\n if (isNotNull(input) && !isEmptyString(input) && !isNaN(input) && !(input < 0)) {\r\n const updatedExpression = traverseAndAssign(expression, targetVariable, newValue);\r\n return coalesce(evaluateExpression(updatedExpression));\r\n } else {\r\n return coalesce(parameters.default);\r\n }\r\n}\r\n\r\nfunction interpolate(input, base, inputLower, inputUpper, outputLower, outputUpper) {\r\n if (typeof outputLower === 'function') {\r\n return function () {\r\n var evaluatedLower = outputLower.apply(undefined, arguments);\r\n var evaluatedUpper = outputUpper.apply(undefined, arguments);\r\n return interpolate(input, base, inputLower, inputUpper, evaluatedLower, evaluatedUpper);\r\n };\r\n } else if (outputLower.length) {\r\n return interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper);\r\n } else {\r\n return interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper);\r\n }\r\n}\r\n\r\nfunction interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper) {\r\n var difference = inputUpper - inputLower;\r\n var progress = input - inputLower;\r\n\r\n var ratio;\r\n if (base === 1) {\r\n ratio = progress / difference;\r\n } else {\r\n ratio = (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\r\n }\r\n\r\n return outputLower * (1 - ratio) + outputUpper * ratio;\r\n}\r\n\r\nfunction interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper) {\r\n var output = [];\r\n for (let i = 0; i < outputLower.length; i++) {\r\n output[i] = interpolateNumber(input, base, inputLower, inputUpper, outputLower[i], outputUpper[i]);\r\n }\r\n return output;\r\n}\r\n\r\n/**\r\n * Check if object is a definition of function type\r\n * @param {Object} obj object\r\n * @return {Boolean}\r\n * @memberOf MapboxUtil\r\n */\r\nexport function isFunctionDefinition(obj) {\r\n return (\r\n obj &&\r\n typeof obj === 'object' &&\r\n (obj.stops || (obj.property && obj.type === 'identity') || (obj.expression && obj.type === 'calculate-expression'))\r\n );\r\n}\r\n\r\n// export function isFunctionDefinition(obj) {\r\n// return obj && typeof obj === 'object' && (obj.stops || (obj.property && obj.type === 'identity'));\r\n// }\r\n\r\n/**\r\n * Check if obj's properties has function definition\r\n * @param {Object} obj object to check\r\n * @return {Boolean}\r\n * @memberOf MapboxUtil\r\n */\r\nexport function hasFunctionDefinition(obj) {\r\n for (const p in obj) {\r\n if (isFunctionDefinition(obj[p])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function interpolated(parameters) {\r\n return createFunction1(parameters, 'exponential');\r\n}\r\n\r\nexport function piecewiseConstant(parameters) {\r\n return createFunction1(parameters, 'interval');\r\n}\r\n\r\n/**\r\n * Load function types defined in object\r\n * @param {Object[]} parameters parameters\r\n * @return {Object} loaded object\r\n * @memberOf MapboxUtil\r\n */\r\n\r\nexport function loadFunctionTypes(obj, argFn) {\r\n if (!obj) {\r\n return null;\r\n }\r\n var hit = false;\r\n if (Array.isArray(obj)) {\r\n var multResult = [],\r\n loaded;\r\n for (let i = 0; i < obj.length; i++) {\r\n loaded = loadFunctionTypes(obj[i], argFn);\r\n if (!loaded) {\r\n multResult.push(obj[i]);\r\n } else {\r\n multResult.push(loaded);\r\n hit = true;\r\n }\r\n }\r\n return hit ? multResult : obj;\r\n }\r\n var result = { '__fn_types_loaded': true },\r\n props = [],\r\n p;\r\n for (p in obj) {\r\n if (obj.hasOwnProperty(p)) {\r\n props.push(p);\r\n }\r\n }\r\n\r\n const buildFn = function (p) {\r\n Object.defineProperty(result, p, {\r\n get: function () {\r\n if (!this['__fn_' + p]) {\r\n this['__fn_' + p] = interpolated(this['_' + p]);\r\n }\r\n return this['__fn_' + p].apply(this, argFn());\r\n },\r\n set: function (v) {\r\n this['_' + p] = v;\r\n },\r\n configurable: true,\r\n enumerable: true\r\n });\r\n };\r\n\r\n for (let i = 0, len = props.length; i < len; i++) {\r\n p = props[i];\r\n if (isFunctionDefinition(obj[p])) {\r\n hit = true;\r\n result['_' + p] = obj[p];\r\n buildFn(p);\r\n } else {\r\n result[p] = obj[p];\r\n }\r\n }\r\n return hit ? result : obj;\r\n}\r\n\r\n/**\r\n * Get external resources in the function type\r\n * @param {Object} t Function type definition\r\n * @return {String[]} resouces\r\n * @memberOf MapboxUtil\r\n */\r\nexport function getFunctionTypeResources(t) {\r\n if (!t || !t.stops) {\r\n return [];\r\n }\r\n const res = [];\r\n for (let i = 0, l = t.stops.length; i < l; i++) {\r\n res.push(t.stops[i][1]);\r\n }\r\n return res;\r\n}\r\n/*eslint-enable no-var, prefer-const*/\r\n\r\nfunction createFunction1(parameters, defaultType) {\r\n if (!isFunctionDefinition(parameters)) {\r\n return function () {\r\n return parameters;\r\n };\r\n }\r\n parameters = JSON.parse(JSON.stringify(parameters));\r\n let isZoomConstant = true;\r\n let isFeatureConstant = true;\r\n const stops = parameters.stops;\r\n if (stops) {\r\n for (let i = 0; i < stops.length; i++) {\r\n if (isFunctionDefinition(stops[i][1])) {\r\n const fn = createFunction1(stops[i][1], defaultType);\r\n isZoomConstant = isZoomConstant && fn.isZoomConstant;\r\n isFeatureConstant = isFeatureConstant && fn.isFeatureConstant;\r\n stops[i] = [stops[i][0], fn];\r\n }\r\n }\r\n }\r\n const fn = createFunction(parameters, defaultType);\r\n fn.isZoomConstant = isZoomConstant && fn.isZoomConstant;\r\n fn.isFeatureConstant = isFeatureConstant && fn.isFeatureConstant;\r\n return fn;\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { reshader, vec3, vec4, mat3, mat4, quat, HighlightUtil, ContextUtil } from '@maptalks/gl';\r\nimport { iterateMesh, iterateBufferData, getItemAtBufferData, setInstanceData, } from '../../common/GLTFHelpers';\r\nimport pickingVert from './glsl/picking.vert';\r\nimport pntsVert from './glsl/pnts.vert';\r\nimport pntsFrag from './glsl/pnts.frag';\r\nimport { isFunction, isNil, extend, setColumn3, flatArr, isNumber, normalizeColor, pushIn } from '../../common/Util';\r\nimport { intersectsBox } from 'frustum-intersects';\r\nimport { basisTo2D, setTranslation, getTranslation, readBatchData } from '../../common/TileHelper';\r\nimport { isFunctionDefinition, interpolated } from '@maptalks/function-type';\r\n// import { getKHR_techniques } from './s3m/S3MTechnique';\r\n\r\n\r\nconst { getTextureMagFilter, getTextureMinFilter,\r\n getTextureWrap, getMaterialType, getMaterialFormat,\r\n getPrimitive, getUniqueREGLBuffer, getArrayType } = reshader.REGLHelper;\r\n\r\nconst Y_TO_Z = [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1];\r\nconst X_TO_Z = [0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1];\r\n\r\nconst { loginIBLResOnCanvas, logoutIBLResOnCanvas, getIBLResOnCanvas, getPBRUniforms } = reshader.pbr.PBRUtils;\r\n\r\nconst DEFAULT_POLYGON_OFFSET = {\r\n factor : 0,\r\n units : 0\r\n};\r\n\r\nconst DEFAULT_POLYGONFILL = [1, 1, 1, 1], DEFAULT_HSV = [0, 0, 0];\r\n\r\nconst DEFAULT_MATERIAL_INFO = {\r\n specularStrength: 0,\r\n materialShininess: 1\r\n};\r\n\r\nconst IDENTITY_SCALE = [1, 1, 1];\r\nconst IDENTITY_MATRIX = mat4.identity([]);\r\nconst EMPTY_TRANSLATION = [0, 0, 0];\r\nconst EMPTY_COORD_OFFSET = [0, 0];\r\n\r\nconst LIGHT_DIR = [];\r\n// const P0 = [], P1 = [];\r\n\r\nconst phongFilter = m => {\r\n return m.material instanceof reshader.PhongMaterial;\r\n};\r\n\r\nconst StandardFilter = m => {\r\n return m.material instanceof reshader.pbr.StandardMaterial;\r\n};\r\n\r\n// const colorOff = [false, false, false, false];\r\n// const colorOn = [true, true, true, true];\r\n\r\nconst TEMP_RTCCENTER = [];\r\nconst TEMP_CENTER = new maptalks.Coordinate(0, 0);\r\nconst TEMP_POINT = new maptalks.Point(0, 0);\r\nconst TEMP_POINT1 = new maptalks.Point(0, 0);\r\nconst TEMP_POINT2 = new maptalks.Point(0, 0);\r\nconst TEMP_OFFSET = [];\r\nconst TEMP_TRANSLATION = [];\r\nconst TEMP_MATRIX1 = [];\r\nconst TEMP_MATRIX2 = [];\r\nconst TEMP_TILE_ROT_QUAT = [];\r\nconst TEMP_SCALING = [];\r\nconst TEMP_TILE_SCALING_MAT = [];\r\n\r\nconst TEMP_TILE_TRANSFORM = [];\r\nconst TEMP_TRANSLATION_MAT = [];\r\n\r\nconst TEMP_SERVICE_MAT = [];\r\n\r\nconst TEMP_PROJ_SCALE = [];\r\nconst TEMP_DIST_SCALE = [];\r\nconst TEMP_DIST_TO_PROJ_SCALE = [];\r\n\r\nconst TEMP_MATRIX_SCALE = [];\r\n\r\nconst DEFAULT_SEMANTICS = {\r\n 'POSITION': 'POSITION',\r\n 'NORMAL': 'NORMAL',\r\n 'TEXCOORD_0': 'TEXCOORD_0',\r\n 'TEXCOORD_1': 'TEXCOORD_1',\r\n 'COLOR_0': 'COLOR_0',\r\n 'TANGENT': 'TANGENT',\r\n '_BATCHID': '_BATCHID',\r\n};\r\n\r\nconst BOX_INDEX = [\r\n 0, 1,\r\n 1, 2,\r\n 2, 3,\r\n 3, 0,\r\n 0, 4,\r\n 1, 5,\r\n 2, 6,\r\n 3, 7,\r\n 4, 5,\r\n 5, 6,\r\n 6, 7,\r\n 7, 4,\r\n\r\n // center axis\r\n // 8, 9,\r\n // 8, 10,\r\n // 8, 11\r\n];\r\nconst SPHERE_POS = generateSphere(100, 1);\r\nconst BOX_ROTATE = [0, 0, 0, 1], BOX_SCALE = [1, 1, 1];\r\n\r\nexport default class TileMeshPainter {\r\n constructor(regl, layer) {\r\n this._layer = layer;\r\n this._canvas = layer.getRenderer().canvas;\r\n this.pickingFBO = layer.getRenderer().pickingFBO;\r\n this._regl = regl;\r\n this._renderer = new reshader.Renderer(regl);\r\n this._loading = {};\r\n this._modelMeshes = {};\r\n this._pntsMeshes = {};\r\n this._i3dmMeshes = {};\r\n this._cmptMeshes = {};\r\n this._cachedGLTF = {};\r\n this._modelScene = new reshader.Scene();\r\n this._pntsScene = new reshader.Scene();\r\n this._i3dmScene = new reshader.Scene();\r\n this._boxScene = new reshader.Scene();\r\n this._resLoader = new reshader.ResourceLoader(regl.texture(2));\r\n this._bindedListener = (...args) => {\r\n return this._onResourceLoad.call(this, ...args);\r\n };\r\n // this._defaultMaterial = new reshader.PhongMaterial({\r\n // 'baseColorFactor' : [1, 1, 1, 1]\r\n // });\r\n this._khrTechniqueWebglManager = new reshader.KHRTechniquesWebglManager(this._regl, this._getExtraCommandProps(), this._resLoader);\r\n const map = this.getMap();\r\n this._heightScale = map.altitudeToPoint(100, map.getGLRes()) / 100;\r\n }\r\n\r\n getI3DMMeshes() {\r\n return this._i3dmMeshes;\r\n }\r\n\r\n getPNTSMeshes() {\r\n return this._pntsMeshes;\r\n }\r\n\r\n getB3DMMeshes() {\r\n return this._modelMeshes;\r\n }\r\n\r\n getPaintedMeshes() {\r\n return this._paintedMeshes;\r\n }\r\n\r\n getMap() {\r\n return this._layer.getMap();\r\n }\r\n\r\n paint(tiles, boxMeshes, parentContext) {\r\n // const testMesh = { bloom: 1 };\r\n // if (!parentContext.sceneFilter(testMesh)) {\r\n // return;\r\n // }\r\n const renderTarget = parentContext && parentContext.renderTarget;\r\n const filter = parentContext && parentContext.sceneFilter;\r\n const map = this.getMap();\r\n if (!tiles.length || !map) {\r\n return null;\r\n }\r\n const uniforms = this._getUniformValues();\r\n const projViewMatrix = map.projViewMatrix;\r\n const oneMeshArray = [];\r\n const parentMeshes = [];\r\n const b3dmMeshes = [];\r\n const pntsMeshes = [];\r\n const i3dmMeshes = [];\r\n\r\n for (let i = 0, l = tiles.length; i < l; i++) {\r\n const node = tiles[i].data.node;\r\n let mesh = this._getMesh(node);\r\n if (!mesh) {\r\n continue;\r\n }\r\n const service = this._layer._getNodeService(node._rootIdx);\r\n const debugNodes = service.debugNodes;\r\n const heightOffset = service.heightOffset || 0;\r\n const coordOffset = service.coordOffset || EMPTY_COORD_OFFSET;\r\n if (this._cmptMeshes[node.id]) {\r\n mesh = this._cmptMeshes[node.id];\r\n mesh = flatArr(mesh);\r\n }\r\n // if (node._error > maxError) {\r\n // continue;\r\n // }\r\n\r\n let polygonOffset = service.polygonOffset || DEFAULT_POLYGON_OFFSET;\r\n if (isFunction(polygonOffset)) {\r\n polygonOffset = polygonOffset();\r\n }\r\n // const ambientColor = service.ambientLight;\r\n if (!Array.isArray(mesh)) {\r\n oneMeshArray[0] = mesh;\r\n mesh = oneMeshArray;\r\n }\r\n for (let ii = 0, ll = mesh.length; ii < ll; ii++) {\r\n if (!mesh[ii] || !mesh[ii].isValid || !mesh[ii].isValid()) {\r\n continue;\r\n }\r\n const magic = mesh[ii].properties.magic;\r\n if (mesh[ii].properties.heightOffset !== heightOffset || mesh[ii].properties.coordOffset[0] !== coordOffset[0] || mesh[ii].properties.coordOffset[1] !== coordOffset[1]) {\r\n this._updateMeshLocalTransform(mesh[ii]);\r\n mesh[ii]._originLocalTransform = mat4.copy([], mesh[ii].localTransform);\r\n }\r\n mesh[ii]._node = node;\r\n if (magic === 'b3dm') {\r\n if (mesh[ii].getBoundingBox && !intersectsBox(projViewMatrix, mesh[ii].getBoundingBox())) {\r\n continue;\r\n }\r\n const { batchIdData, batchIdMap } = mesh[ii].geometry.properties;\r\n if (batchIdData && batchIdMap) {\r\n const rootIdx = mesh[ii].properties.node._rootIdx;\r\n if (this._highlighted && this._highlighted[rootIdx]) {\r\n HighlightUtil.highlightMesh(this._regl, mesh[ii], this._highlighted[rootIdx], this._highlightTimestamp, batchIdMap);\r\n } else if (!this._highlighted || !this._highlighted[rootIdx]) {\r\n HighlightUtil.highlightMesh(this._regl, mesh[ii], null, this._highlightTimestamp, batchIdMap);\r\n }\r\n HighlightUtil.showOnly(this._regl, mesh[ii], this._showOnlys && this._showOnlys[rootIdx], this._showOnlyTimeStamp, batchIdMap);\r\n }\r\n if (debugNodes && debugNodes.length && debugNodes.indexOf(mesh[ii]._node.id) < 0) {\r\n continue;\r\n }\r\n if (parentContext && parentContext.bloom && mesh[ii].properties.hlBloomMesh) {\r\n mesh[ii].properties.hlBloomMesh.properties.depthFunc = 'always';\r\n b3dmMeshes.push(mesh[ii].properties.hlBloomMesh);\r\n }\r\n b3dmMeshes.push(mesh[ii]);\r\n } else if (magic === 'pnts') {\r\n pntsMeshes.push(mesh[ii]);\r\n } else if (magic === 'i3dm') {\r\n i3dmMeshes.push(mesh[ii]);\r\n }\r\n // mesh[ii].setUniform('level', tiles[i].selectionDepth);\r\n // mesh[ii].setUniform('id', node.id);\r\n // mesh[ii].setUniform('polygonOffset', polygonOffset);\r\n mesh[ii].properties.isLeaf = tiles[i].leave;\r\n mesh[ii].properties.branchRootId = tiles[i].branchRootId;\r\n // GroupGLLayer中,stencil默认值为0xFF,与GroupGLLayer保持一致\r\n const selectionDepth = 255 - tiles[i].selectionDepth;\r\n mesh[ii].properties.selectionDepth = selectionDepth;\r\n mesh[ii].properties.polygonOffset = polygonOffset;\r\n const cullFace = service.cullFace === undefined || !!service.cullFace;\r\n mesh[ii].properties.cullFace = cullFace;\r\n\r\n const hlBloomMesh = mesh[ii].properties.hlBloomMesh;\r\n if (hlBloomMesh) {\r\n const bloomProperties = hlBloomMesh.properties;\r\n bloomProperties.branchRootId = tiles[i].branchRootId;\r\n bloomProperties.selectionDepth = selectionDepth;\r\n bloomProperties.polygonOffset = polygonOffset;\r\n bloomProperties.cullFace = cullFace;\r\n }\r\n // if (!Object.prototype.hasOwnProperty.call(mesh[ii].uniforms, 'ambientColor')) {\r\n // Object.defineProperty(mesh[ii].uniforms, 'ambientColor', {\r\n // enumerable: true,\r\n // get: function () {\r\n // if (ambientColor) {\r\n // return ambientColor;\r\n // }\r\n // return uniforms['ambientColor'];\r\n // }\r\n // });\r\n // }\r\n\r\n if (!tiles[i].leave) {\r\n parentMeshes.push(mesh[ii]);\r\n }\r\n this._updateMaskDefines(mesh[ii]);\r\n this._updateServiceMatrix(mesh[ii], node);\r\n }\r\n }\r\n\r\n // const testMesh = { bloom: 1 };\r\n // if (parentContext.sceneFilter(testMesh)) {\r\n // if (parentContext.bloom) {\r\n // const bloomMeshes = meshes.filter(m => m.bloom);\r\n // if (bloomMeshes.length) {\r\n // meshes = bloomMeshes;\r\n // }\r\n // }\r\n\r\n\r\n // meshes.sort(meshCompare);\r\n // console.log(meshes.map(m => m.properties.id));\r\n let drawCount = 0;\r\n const khrExludeFilter = this._khrTechniqueWebglManager.getExcludeFilter();\r\n ContextUtil.setIncludeUniformValues(uniforms, parentContext);\r\n drawCount += this._callShader(this._phongShader, uniforms, [filter, phongFilter, khrExludeFilter], renderTarget, parentMeshes, b3dmMeshes, i3dmMeshes);\r\n drawCount += this._callShader(this._standardShader, uniforms, [filter, StandardFilter, khrExludeFilter], renderTarget, parentMeshes, b3dmMeshes, i3dmMeshes);\r\n\r\n this._khrTechniqueWebglManager.forEachShader((shader, shaderFilter, uniformSemantics) => {\r\n const uniforms = this._getUniformValues(uniformSemantics);\r\n drawCount += this._callShader(shader, uniforms, [filter, shaderFilter], renderTarget, parentMeshes, b3dmMeshes, i3dmMeshes);\r\n });\r\n this._pntsScene.setMeshes(pntsMeshes);\r\n const pntsUniforms = this._getPntsUniforms();\r\n drawCount += this._renderer.render(this._pntsShader, pntsUniforms, this._pntsScene, renderTarget && renderTarget.fbo);\r\n\r\n this._paintedMeshes = {\r\n pntsMeshes,\r\n i3dmMeshes,\r\n b3dmMeshes\r\n };\r\n // boxMeshes.forEach(mesh => {\r\n // this._updateBBoxMatrix(mesh);\r\n // });\r\n this._boxScene.setMeshes(boxMeshes);\r\n this._renderer.render(this._edgeShader, uniforms, this._boxScene, renderTarget && renderTarget.fbo);\r\n\r\n return drawCount;\r\n }\r\n\r\n prepareRender(context) {\r\n this._prepareShaders(context);\r\n }\r\n\r\n _prepareShaders(context) {\r\n if (context && context.states && context.states.includesChanged) {\r\n this._standardShader.dispose();\r\n delete this._standardShader;\r\n this._phongShader.dispose();\r\n delete this._phongShader;\r\n }\r\n this._createShaders(context);\r\n }\r\n\r\n // _updateBBoxMatrix(mesh) {\r\n // const serviceTransform = this._layer._getServiceTransform(TEMP_BBOX_MAT, mesh.properties.node);\r\n // mat4.multiply(mesh.localTransform, serviceTransform, mesh._originLocalTransform);\r\n // }\r\n\r\n _callShader(shader, uniforms, filter, renderTarget, parentMeshes, meshes, i3dmMeshes) {\r\n shader.filter = filter.filter(fn => !!fn);\r\n\r\n // this._modelScene.setMeshes(meshes);\r\n\r\n // uniforms['debug'] = true;\r\n // uniforms['stencilEnable'] = false;\r\n // uniforms['cullFace'] = 'front';\r\n // uniforms['colorMask'] = colorOff;\r\n // this._renderer.render(shader, uniforms, this._modelScene, renderTarget && renderTarget.fbo);\r\n\r\n\r\n // uniforms['stencilEnable'] = true;\r\n uniforms.stencilEnable = false;\r\n uniforms.cullFace = 'back';\r\n // uniforms['cullFace'] = 'back';\r\n // uniforms['colorMask'] = colorOn;\r\n const fbo = renderTarget && renderTarget.fbo;\r\n let drawCount = 0;\r\n\r\n const branchMeshes = [];\r\n const leafMeshes = [];\r\n let hasUnresolved = false;\r\n\r\n let currentBranchRootId = meshes[0] && meshes[0].properties.branchRootId;\r\n for (let i = 0; i < meshes.length; i++) {\r\n const { branchRootId } = meshes[i].properties;\r\n if (branchRootId !== currentBranchRootId) {\r\n // branch 发生变化\r\n if (!hasUnresolved) {\r\n // 如果branch中不存在 unresolved 瓦片,则放到leafMeshes中,和其他的leaf瓦片一起绘制,无需分开绘制,减少drawcall\r\n pushIn(leafMeshes, branchMeshes);\r\n } else {\r\n if (leafMeshes.length) {\r\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, false, leafMeshes);\r\n leafMeshes.length = 0;\r\n }\r\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, hasUnresolved, branchMeshes);\r\n }\r\n currentBranchRootId = branchRootId;\r\n hasUnresolved = false;\r\n branchMeshes.length = 0;\r\n }\r\n branchMeshes.push(meshes[i]);\r\n if (meshes[i].properties.selectionDepth < 255) {\r\n hasUnresolved = true;\r\n }\r\n if (i === meshes.length - 1) {\r\n if (!hasUnresolved) {\r\n pushIn(leafMeshes, branchMeshes);\r\n branchMeshes.length = 0;\r\n }\r\n if (leafMeshes.length) {\r\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, false, leafMeshes);\r\n }\r\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, hasUnresolved, branchMeshes);\r\n }\r\n }\r\n // pick功能需要把meshes设置到modelScene中,为了避免pick逻辑出错,这里暂时只允许选择叶子节点\r\n //FIXME 因为父亲节点不在modelScene中,会出现父亲节点无法被选中的问题\r\n this._modelScene.setMeshes(meshes.filter(m => m.properties.isLeaf));\r\n\r\n this._i3dmScene.setMeshes(i3dmMeshes);\r\n drawCount += this._renderer.render(shader, uniforms, this._i3dmScene, renderTarget && renderTarget.fbo);\r\n return drawCount;\r\n }\r\n\r\n _drawBranchMeshes(shader, uniforms, fbo, hasUnresolved, branchMeshes) {\r\n if (!branchMeshes.length) {\r\n return 0;\r\n }\r\n this._modelScene.setMeshes(branchMeshes);\r\n // 如果branch中不存在unresolved瓦片\r\n // 关闭stencil直接绘制\r\n uniforms.stencilEnable = false;\r\n if (hasUnresolved) {\r\n // branch 中存在 unresolved 瓦片。\r\n // 解释:\r\n // 如果某个瓦片的selectionDepth不为0 (mesh.properties.selectionDepth为255),则说明它的子瓦片也参与绘制,标记此类瓦片为unsolved\r\n // * selectionDepth 的逻辑在 Geo3DTilesRenderer._sortTiles 方法中\r\n // 这种情况一般出现在某个分支的子节点不满足要求(没有下载下来或者error不符合设定),需要将父亲节点与子节点一起绘制\r\n // 绘制步骤:\r\n // 1. 清除 stencil 缓冲,避免上一次绘制的stencil影响本次绘制\r\n // 2. 先绘制所有瓦片的背面,避免后面的子节点,会在视觉上 \"透过\" 前面的unresolved瓦片\r\n // 3. 打开stencil,先绘制叶子节点,再绘制父亲节点,保证父节点的绘制不会覆盖掉子节点\r\n this._clearStencil(fbo);\r\n uniforms.stencilEnable = false;\r\n uniforms.cullFace = 'front';\r\n this._renderer.render(shader, uniforms, this._modelScene, fbo);\r\n uniforms.cullFace = 'back';\r\n uniforms.stencilEnable = true;\r\n }\r\n return this._renderer.render(shader, uniforms, this._modelScene, fbo);\r\n }\r\n\r\n _clearStencil(fbo) {\r\n this._regl.clear({\r\n stencil: 0xFF,\r\n framebuffer: fbo\r\n });\r\n }\r\n\r\n getCurrentB3DMMeshes() {\r\n return this._modelScene.getMeshes();\r\n }\r\n\r\n getCurrentI3DMMeshes() {\r\n return this._i3dmScene.getMeshes();\r\n }\r\n\r\n _sort(a, b) {\r\n // const cameraPosition = this.getMap().cameraPosition;\r\n // vec3.transformMat4(P0, a.geometry.boundingBox.getCenter(), a.localTransform);\r\n // vec3.transformMat4(P1, b.geometry.boundingBox.getCenter(), b.localTransform);\r\n // return vec3.dist(P1, cameraPosition) - vec3.dist(P0, cameraPosition);\r\n return b._node._cameraDistance - a._node._cameraDistance;\r\n }\r\n\r\n deleteTile(tileData) {\r\n const node = tileData.node;\r\n if (node._boxMesh) {\r\n node._boxMesh.geometry.dispose();\r\n node._boxMesh.dispose();\r\n delete node._boxMesh;\r\n }\r\n const id = node.id;\r\n this._disposeMesh(id);\r\n }\r\n\r\n _disposeMesh(id) {\r\n const mesh = this._modelMeshes[id] || this._pntsMeshes[id] || this._i3dmMeshes[id] || this._cmptMeshes[id] || this._loading[id];\r\n if (this._cmptMeshes[id]) {\r\n this._disposeCMPT(id);\r\n } else if (mesh) {\r\n this._deleteOne(mesh);\r\n delete this._modelMeshes[id];\r\n delete this._pntsMeshes[id];\r\n delete this._i3dmMeshes[id];\r\n delete this._loading[id];\r\n }\r\n }\r\n\r\n _disposeCMPT(id) {\r\n let mesh = this._cmptMeshes[id];\r\n mesh = flatArr(mesh);\r\n for (let i = 0; i < mesh.length; i++) {\r\n const { id } = mesh[i].properties;\r\n this._disposeMesh(id);\r\n }\r\n delete this._cmptMeshes[id];\r\n }\r\n\r\n _deleteOne(mesh) {\r\n if (Array.isArray(mesh)) {\r\n for (let i = 0, l = mesh.length; i < l; i++) {\r\n this._deleteOne(mesh[i]);\r\n }\r\n } else {\r\n // clear showOnly and highlights\r\n HighlightUtil.showOnly(this._regl, mesh);\r\n HighlightUtil.highlightMesh(this._regl, mesh);\r\n const url = mesh.geometry.properties.url;\r\n if (!url) {\r\n mesh.geometry.dispose();\r\n if (mesh.material) {\r\n mesh.material.dispose();\r\n }\r\n } else {\r\n const cached = this._cachedGLTF[url];\r\n if (cached && cached.refMeshes) {\r\n cached.refMeshes.delete(mesh.uuid);\r\n if (!cached.refMeshes.size) {\r\n cached.geometry.dispose();\r\n cached.material.dispose();\r\n delete this._cachedGLTF[url];\r\n }\r\n }\r\n }\r\n mesh.dispose();\r\n }\r\n }\r\n\r\n remove() {\r\n const layer = this._layer;\r\n logoutIBLResOnCanvas(layer.getRenderer().canvas, layer.getMap());\r\n for (const id in this._cmptMeshes) {\r\n this._disposeCMPT(id);\r\n }\r\n this._cmptMeshes = {};\r\n for (const id in this._modelMeshes) {\r\n this._disposeMesh(id);\r\n }\r\n this._modelMeshes = {};\r\n for (const id in this._pntsMeshes) {\r\n this._disposeMesh(id);\r\n }\r\n this._pntsMeshes = {};\r\n for (const id in this._i3dmMeshes) {\r\n this._disposeMesh(id);\r\n }\r\n this._i3dmMeshes = {};\r\n\r\n for (const id in this._loading) {\r\n this._disposeMesh(id);\r\n }\r\n this._loading = {};\r\n if (this._phongShader) {\r\n this._phongShader.dispose();\r\n delete this._phongShader;\r\n }\r\n if (this._standardShader) {\r\n this._standardShader.dispose();\r\n delete this._standardShader;\r\n }\r\n if (this._pntsShader) {\r\n this._pntsShader.dispose();\r\n delete this._pntsShader;\r\n }\r\n\r\n if (this._edgeShader) {\r\n this._edgeShader.dispose();\r\n delete this._edgeShader;\r\n }\r\n\r\n this._khrTechniqueWebglManager.dispose();\r\n\r\n if (this.picking) {\r\n this.picking.dispose();\r\n }\r\n }\r\n\r\n _getMesh(node) {\r\n return this._modelMeshes[node.id] || this._pntsMeshes[node.id] || this._i3dmMeshes[node.id] || this._cmptMeshes[node.id];\r\n }\r\n\r\n has(node) {\r\n return this._getMesh(node) || this._loading[node.id];\r\n }\r\n\r\n _updateMeshLocalTransform(mesh) {\r\n const magic = mesh.properties.magic;\r\n if (magic === 'b3dm') {\r\n this._updateB3DMLocalMatrix(mesh);\r\n } else if (magic === 'i3dm') {\r\n this._updateI3DMLocalTransform(mesh);\r\n } else if (magic === 'pnts') {\r\n this._updatePNTSLocalTransform(mesh);\r\n }\r\n }\r\n\r\n createPntsMesh(data, id, node, cb) {\r\n if (this._pntsMeshes[id]) {\r\n const meshes = this._pntsMeshes[id];\r\n console.warn(`pnts mesh with id(${id}) was already created.`);\r\n cb(null, { id : id, mesh : meshes });\r\n return meshes;\r\n }\r\n const { pnts, featureTable, rootIdx, compressed_int16_params } = data;\r\n const count = featureTable['POINTS_LENGTH'];\r\n if (!pnts['BATCH_ID']) {\r\n pnts['BATCH_ID'] = new Uint8Array(count);\r\n pnts['BATCH_ID'].fill(0);\r\n }\r\n\r\n const geometry = new reshader.Geometry(\r\n pnts,\r\n null,\r\n count,\r\n {\r\n static: true,\r\n primitive: 'points',\r\n positionAttribute: 'POSITION',\r\n pickingIdAttribute: 'BATCH_ID'\r\n }\r\n );\r\n geometry.generateBuffers(this._regl);\r\n const defines = {};\r\n if (pnts['POSITION']) {\r\n defines['HAS_POSITION'] = 1;\r\n } else if (pnts['POSITION_QUANTIZED']) {\r\n defines['HAS_POSITION_QUANTIZED'] = 1;\r\n }\r\n if (pnts['RGB']) {\r\n defines['HAS_RGB'] = 1;\r\n } else if (pnts['RGBA']) {\r\n defines['HAS_RGBA'] = 1;\r\n } else if (pnts['RGB565']) {\r\n defines['HAS_RGB565'] = 1;\r\n }\r\n if (pnts['NORMAL'] || pnts['NORMAL_OCT16P']) {\r\n defines['HAS_NORMAL'] = 1;\r\n if (pnts['NORMAL_OCT16P']) {\r\n defines['HAS_NORMAL_OCT16P'] = 1;\r\n }\r\n }\r\n this._setCompressedInt16Defines(defines, compressed_int16_params);\r\n if (data.featureTable['CONSTANT_RGBA']) {\r\n data.featureTable['CONSTANT_RGBA'] = data.featureTable['CONSTANT_RGBA'].map(c => c / 255);\r\n }\r\n\r\n const { rtcCenter, rtcCoord, projCenter } = data;\r\n\r\n const service = this._layer._getNodeService(rootIdx);\r\n\r\n const mesh = new reshader.Mesh(geometry);\r\n mesh.properties.magic = 'pnts';\r\n mesh.properties.id = id;\r\n mesh.properties.node = node;\r\n mesh.properties.count = count;\r\n mesh.properties.batchTable = data.batchTable;\r\n mesh.properties.batchTableBin = data.batchTableBin;\r\n mesh.properties.serviceIndex = rootIdx;\r\n mesh.properties.rtcCoord = rtcCoord;\r\n mesh.properties.rtcCenter = rtcCenter;\r\n mesh.properties.projCenter = projCenter;\r\n mesh.setDefines(defines);\r\n mesh.setFunctionUniform('pointColor', function () {\r\n if (data.featureTable['CONSTANT_RGBA']) {\r\n return data.featureTable['CONSTANT_RGBA'];\r\n }\r\n return service && service.pointColor || [1, 1, 1, 1];\r\n });\r\n const map = this.getMap();\r\n let pointSizeValue = null;\r\n let pointSizeFn = null;\r\n\r\n mesh.setFunctionUniform('pointSize', function () {\r\n if (!service) {\r\n return 2;\r\n }\r\n if (isFunctionDefinition(service.pointSize)) {\r\n const key = JSON.stringify(service.pointSize);\r\n if (key !== pointSizeValue) {\r\n pointSizeFn = interpolated(service.pointSize);\r\n pointSizeValue = key;\r\n }\r\n const size = pointSizeFn(map.getZoom());\r\n return size;\r\n }\r\n return service.pointSize || 2;\r\n });\r\n\r\n let pointOpacityValue = null;\r\n let pointOpacityFn = null;\r\n\r\n mesh.setFunctionUniform('pointOpacity', function () {\r\n if (!service) {\r\n return 1;\r\n }\r\n if (isFunctionDefinition(service.pointOpacity)) {\r\n const key = JSON.stringify(service.pointOpacity);\r\n if (key !== pointOpacityValue) {\r\n pointOpacityFn = interpolated(service.pointOpacity);\r\n pointOpacityValue = key;\r\n }\r\n const opacity = pointOpacityFn(map.getZoom());\r\n return opacity;\r\n }\r\n return service.pointOpacity || 1;\r\n });\r\n this._setCompressedInt16Uniforms(mesh, compressed_int16_params);\r\n this._updatePNTSLocalTransform(mesh);\r\n mesh._originLocalTransform = mat4.copy([], mesh.localTransform);\r\n this._pntsMeshes[id] = mesh;\r\n cb(null, { id: id, mesh: [mesh] });\r\n return [mesh];\r\n }\r\n\r\n\r\n _updatePNTSLocalTransform(mesh) {\r\n const localTransform = mesh.localTransform || [];\r\n const { rtcCoord, node, projCenter } = mesh.properties;\r\n this._getB3DMTransform(localTransform, rtcCoord, projCenter, node._rootIdx);\r\n mesh.setLocalTransform(localTransform);\r\n }\r\n\r\n\r\n createI3DMMesh(data, id, node, cb) {\r\n if (this._i3dmMeshes[id]) {\r\n const meshes = this._i3dmMeshes[id];\r\n console.warn(`i3dm mesh with id(${id}) was already created.`);\r\n if (!this._loading[id]) {\r\n cb(null, { id: id, mesh: meshes });\r\n }\r\n return meshes;\r\n }\r\n const service = this._layer._getNodeService(node._rootIdx);\r\n const upAxisTransform = this._getUpAxisTransform(node._upAxis);\r\n const { i3dm, featureTable, gltf, batchTable, batchTableBin, count } = data;\r\n const instanceCount = featureTable['INSTANCES_LENGTH'];\r\n\r\n const { rtcCenter, rtcCoord, projCenter } = data;\r\n const projectedMatrix = this._computeProjectedTransform(TEMP_MATRIX2, node, rtcCenter, rtcCoord);\r\n setTranslation(projectedMatrix, EMPTY_TRANSLATION, projectedMatrix);\r\n\r\n const tileRotQuat = mat4.getRotation(TEMP_TILE_ROT_QUAT, projectedMatrix);\r\n quat.normalize(tileRotQuat, tileRotQuat);\r\n\r\n // quat.normalize(rotation, rotation);\r\n const scaling = mat4.getScaling(TEMP_SCALING, projectedMatrix);\r\n const tileScalingMat4 = mat4.fromScaling(TEMP_TILE_SCALING_MAT, scaling);\r\n\r\n const tileTransform = this._getI3DMTileTransform(TEMP_TILE_TRANSFORM, projCenter, node);\r\n\r\n const projScale = this._getProjScale(TEMP_PROJ_SCALE);\r\n const distScale = this._getDistanceScale(TEMP_DIST_SCALE, rtcCoord);\r\n const distToProjScale = vec3.div(TEMP_DIST_TO_PROJ_SCALE, distScale, projScale);\r\n const distToProjScaleTransform = mat4.fromScaling(TEMP_MATRIX_SCALE, distToProjScale);\r\n\r\n const { POSITION, NORMAL_UP, NORMAL_RIGHT, SCALE, SCALE_NON_UNIFORM } = i3dm;\r\n const instanceData = {\r\n 'instance_vectorA': new Float32Array(instanceCount * 4),\r\n 'instance_vectorB': new Float32Array(instanceCount * 4),\r\n 'instance_vectorC': new Float32Array(instanceCount * 4),\r\n 'aPickingId': new Uint16Array(instanceCount)\r\n };\r\n for (let i = 0; i < instanceCount; i++) {\r\n instanceData['aPickingId'][i] = i;\r\n }\r\n\r\n const normalUp = new Float32Array(3);\r\n const normalRight = new Float32Array(3);\r\n const normalForward = [];\r\n const scaleItem = new Float32Array(1);\r\n const scaleNonUniform = new Float32Array(3);\r\n const rotationMat3 = [];\r\n const quaternion = [];\r\n const scale = [];\r\n const matrix = [];\r\n iterateBufferData(POSITION, (vertex, index) => {\r\n if (NORMAL_UP) {\r\n getItemAtBufferData(normalRight, NORMAL_RIGHT, index);\r\n getItemAtBufferData(normalUp, NORMAL_UP, index);\r\n vec3.cross(normalForward, normalRight, normalUp)\r\n vec3.normalize(normalForward, normalForward);\r\n setColumn3(rotationMat3, normalRight, 0);\r\n setColumn3(rotationMat3, normalUp, 1);\r\n setColumn3(rotationMat3, normalForward, 2);\r\n quat.fromMat3(quaternion, rotationMat3);\r\n quat.normalize(quaternion, quaternion);\r\n quat.multiply(quaternion, tileRotQuat, quaternion);\r\n } else {\r\n quat.identity(quaternion);\r\n }\r\n if (SCALE) {\r\n getItemAtBufferData(scaleItem, SCALE, index);\r\n vec3.set(scale, scaleItem[0], scaleItem[0], scaleItem[0]);\r\n } else if (SCALE_NON_UNIFORM) {\r\n getItemAtBufferData(scaleNonUniform, SCALE_NON_UNIFORM, index);\r\n vec3.set(scale, ...scaleNonUniform);\r\n } else {\r\n vec3.set(scale, 1, 1, 1);\r\n }\r\n\r\n mat4.fromRotationTranslationScale(matrix, quaternion, vertex, scale);\r\n\r\n setInstanceData(instanceData['instance_vectorA'], index, matrix, 0);\r\n setInstanceData(instanceData['instance_vectorB'], index, matrix, 1);\r\n setInstanceData(instanceData['instance_vectorC'], index, matrix, 2);\r\n\r\n });\r\n\r\n const instanceBuffers = {};\r\n // 所有mesh共享一个 instance buffer,以节省内存\r\n for (const p in instanceData) {\r\n instanceBuffers[p] = {\r\n buffer: this._regl.buffer({\r\n dimension: instanceData[p].length / instanceCount,\r\n data: instanceData[p],\r\n name: p\r\n }),\r\n divisor: 1\r\n };\r\n }\r\n\r\n const shader = service.shader || 'pbr';\r\n let unreadyCount = 0;\r\n let ready = true;\r\n const meshes = [];\r\n const gltfWeakResources = [];\r\n iterateMesh(gltf, (gltfMesh, meshId, primId, gltf) => {\r\n const gltfResource = this._processGLTF(gltfMesh, meshId, primId, gltf, node, true, shader, gltfWeakResources);\r\n const { geometry, material } = gltfResource;\r\n if (material && !material.isReady()) {\r\n ready = false;\r\n unreadyCount++;\r\n }\r\n const mesh = new reshader.InstancedMesh(instanceBuffers, instanceCount, geometry, material);\r\n if (!gltfResource.refMeshes) {\r\n gltfResource.refMeshes = new Set();\r\n gltfResource.refMeshes.add(mesh.uuid);\r\n }\r\n mesh.properties.magic = 'i3dm';\r\n mesh.properties.id = id;\r\n mesh.properties.count = count;\r\n mesh.properties.batchTable = batchTable;\r\n mesh.properties.batchTableBin = batchTableBin;\r\n mesh.properties.serviceIndex = node._rootIdx;\r\n mesh.properties.rtcCoord = rtcCoord;\r\n mesh.properties.rtcCenter = rtcCenter;\r\n mesh.properties.projCenter = projCenter;\r\n mesh.properties.node = node;\r\n const defines = this._getGLTFMeshDefines(gltfMesh, geometry, material, node._rootIdx, gltf);\r\n if (gltfMesh.compressed_int16_params) {\r\n this._setCompressedInt16Uniforms(mesh, gltfMesh.compressed_int16_params);\r\n }\r\n this._setWEB3DDecodeUniforms(mesh, gltfMesh.attributes);\r\n // GLTF模型默认y为up\r\n // https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#coordinate-system-and-units\r\n const nodeMatrix = mat4.identity([]);\r\n // mat4.multiply(mat, mat, node.matrix);\r\n if (gltfMesh.matrices && gltfMesh.matrices.length) {\r\n for (let i = 0; i < gltfMesh.matrices.length; i++) {\r\n mat4.multiply(nodeMatrix, nodeMatrix, gltfMesh.matrices[i]);\r\n }\r\n }\r\n mat4.multiply(nodeMatrix, upAxisTransform, nodeMatrix);\r\n mat4.multiply(nodeMatrix, distToProjScaleTransform, nodeMatrix);\r\n // 如果没有 NORMAL_UP,需要把原来在 instance_vector 中计入的enu以及node上的transform应用在positionMatrix中\r\n if (!featureTable['EAST_NORTH_UP'] && !NORMAL_UP) {\r\n mat4.multiply(nodeMatrix, projectedMatrix, nodeMatrix);\r\n } else {\r\n mat4.multiply(nodeMatrix, tileScalingMat4, nodeMatrix);\r\n }\r\n mesh.setPositionMatrix(nodeMatrix);\r\n\r\n this._updateI3DMLocalTransform(mesh, tileTransform);\r\n mesh.setDefines(defines);\r\n mesh.properties.polygonOffset = { offset: 0, factor: 0 };\r\n meshes.push(mesh);\r\n delete gltfMesh.attributes;\r\n mesh._originLocalTransform = mat4.copy([], mesh.localTransform);\r\n });\r\n\r\n trimGLTFWeakResources(gltfWeakResources);\r\n\r\n if (ready) {\r\n this._i3dmMeshes[id] = meshes;\r\n cb(null, { id: id, mesh: meshes });\r\n } else {\r\n this._loading[id] = { meshes: meshes, count: unreadyCount };\r\n meshes._callback = cb;\r\n }\r\n return meshes;\r\n }\r\n\r\n _updateI3DMLocalTransform(mesh, tileTransform) {\r\n const { rtcCoord, node, projCenter } = mesh.properties;\r\n\r\n if (!tileTransform) {\r\n tileTransform = this._getI3DMTileTransform(TEMP_TILE_TRANSFORM, projCenter, node);\r\n }\r\n\r\n const service = this._layer._getNodeService(node._rootIdx);\r\n const matrix = mesh.localTransform || [];\r\n if (service.coordOffset) {\r\n const coordOffsetMatrix = this._computeCoordOffsetMatrix(TEMP_MATRIX2, node._rootIdx, rtcCoord);\r\n mat4.multiply(matrix, coordOffsetMatrix, tileTransform);\r\n } else {\r\n mat4.copy(matrix, tileTransform);\r\n }\r\n mesh.setLocalTransform(matrix);\r\n mesh.properties.heightOffset = service.heightOffset || 0;\r\n mesh.properties.coordOffset = service.coordOffset && service.coordOffset.slice(0) || EMPTY_COORD_OFFSET;\r\n }\r\n\r\n _getI3DMTileTransform(out, projCenter, node) {\r\n mat4.fromScaling(out, this._getProjScale(TEMP_PROJ_SCALE));\r\n const translation = this._getCenterTranslation(TEMP_TRANSLATION, projCenter, node._rootIdx);\r\n mat4.multiply(out, mat4.fromTranslation(TEMP_TRANSLATION_MAT, translation), out);\r\n return out;\r\n }\r\n\r\n createB3DMMesh(data, id, node, cb) {\r\n if (data.gltf) {\r\n data.gltf.transferables = null;\r\n }\r\n if (this._modelMeshes[id] || this._loading[id]) {\r\n const meshes = this._modelMeshes[id];\r\n console.warn(`mesh with id(${id}) was already created.`);\r\n if (!this._loading[id]) {\r\n cb(null, { id: id, mesh: meshes });\r\n }\r\n return meshes;\r\n }\r\n let maxPrjExtent;\r\n if (node.maxExtent) {\r\n const extent = new maptalks.Extent(node.maxExtent).convertTo(c => this._pointToPrj(c));\r\n maxPrjExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax];\r\n }\r\n\r\n\r\n const gltf = data.gltf;\r\n //for model matrix\r\n const { projCenter } = gltf.extensions['MAPTALKS_RTC'];\r\n const { rtcCoord, center: rtcCenter } = gltf.extensions['CESIUM_RTC'];\r\n\r\n const isSharedPosition = gltf.asset.sharePosition;\r\n const upAxisTransform = this._getUpAxisTransform(node._upAxis);\r\n const tileTransform = this._getB3DMTileTransform(TEMP_TILE_TRANSFORM, isSharedPosition, rtcCoord, rtcCenter, projCenter, node);\r\n const service = this._layer._getNodeService(node._rootIdx);\r\n let shader = service.shader || 'pbr';\r\n if (service.unlit) {\r\n shader = 'phong';\r\n } else if (gltf.materials) {\r\n for (let i = 0; i < gltf.materials.length; i++) {\r\n if (gltf.materials[i] && gltf.materials[i].extensions && gltf.materials[i].extensions['KHR_materials_unlit']) {\r\n shader = 'phong';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const gltfWeakResources = [];\r\n const meshes = [];\r\n let unreadyCount = 0;\r\n let ready = true;\r\n\r\n iterateMesh(gltf, (gltfMesh, meshId, primId, gltf) => {\r\n const gltfResource = this._processGLTF(gltfMesh, meshId, primId, gltf, node, false, shader, gltfWeakResources);\r\n const { geometry, material } = gltfResource;\r\n if (material && !material.isReady()) {\r\n ready = false;\r\n unreadyCount++;\r\n }\r\n const mesh = new reshader.Mesh(geometry, material);\r\n if (!gltfResource.refMeshes) {\r\n gltfResource.refMeshes = new Set();\r\n gltfResource.refMeshes.add(mesh.uuid);\r\n }\r\n mesh.properties.magic = 'b3dm';\r\n mesh.properties.id = id;\r\n mesh.properties.node = node;\r\n if (data.batchTable) {\r\n mesh.properties.batchTable = data.batchTable;\r\n mesh.properties.batchTableBin = data.batchTableBin;\r\n }\r\n mesh.properties.count = data.featureTable && data.featureTable['BATCH_LENGTH'] || 0;\r\n mesh.properties.serviceIndex = node._rootIdx;\r\n const defines = this._getGLTFMeshDefines(gltfMesh, geometry, material, node._rootIdx, gltf);\r\n mesh.setDefines(defines);\r\n const compressUniforms = gltfMesh.compressUniforms;\r\n if (compressUniforms) {\r\n for (const u in compressUniforms) {\r\n mesh.setUniform(u, compressUniforms[u]);\r\n }\r\n }\r\n if (gltfMesh.compressed_int16_params) {\r\n this._setCompressedInt16Uniforms(mesh, gltfMesh.compressed_int16_params);\r\n }\r\n this._setWEB3DDecodeUniforms(mesh, gltfMesh.attributes);\r\n if (maxPrjExtent) {\r\n defines['USE_MAX_EXTENT'] = 1;\r\n mesh.setUniform('maxPrjExtent', maxPrjExtent);\r\n // mesh.setUniform('prjCenter', projCenter);\r\n }\r\n\r\n if (!mesh.hasFunctionUniform('polygonOpacity')) {\r\n mesh.setFunctionUniform('polygonOpacity', function () {\r\n return isNumber(service.opacity) ? service.opacity : 1;\r\n });\r\n }\r\n if (!mesh.hasFunctionUniform('polygonFill')) {\r\n mesh.setFunctionUniform('polygonFill', function () {\r\n return normalizeColor([], service.polygonFill || DEFAULT_POLYGONFILL);\r\n });\r\n }\r\n if (!mesh.material.hasFunctionUniform('hsv')) {\r\n mesh.material.setFunctionUniform('hsv', function () {\r\n return service.hsv || DEFAULT_HSV;\r\n });\r\n }\r\n\r\n\r\n // gltfMesh.matrices 已经在 layerWorker转换坐标时,加入计算了,所以这里不用再重复计算\r\n const nodeMatrix = mat4.identity([]);\r\n // mat4.multiply(mat, mat, node.matrix);\r\n if (isSharedPosition && gltfMesh.matrices && gltfMesh.matrices.length) {\r\n for (let i = 0; i < gltfMesh.matrices.length; i++) {\r\n mat4.multiply(nodeMatrix, nodeMatrix, gltfMesh.matrices[i]);\r\n }\r\n }\r\n\r\n if (isSharedPosition) {\r\n mat4.multiply(nodeMatrix, upAxisTransform, nodeMatrix);\r\n }\r\n\r\n // const coordOffsetMatrix = this._computeCoordOffsetMatrix(node._rootIdx, rtcCoord);\r\n // if (coordOffsetMatrix) {\r\n // mat4.multiply(nodeMatrix, coordOffsetMatrix, nodeMatrix);\r\n // }\r\n mesh.properties.node = node;\r\n mesh.properties.projCenter = projCenter;\r\n mesh.properties.nodeMatrix = nodeMatrix;\r\n mesh.properties.isSharedPosition = isSharedPosition;\r\n mesh.properties.rtcCoord = rtcCoord;\r\n mesh.properties.rtcCenter = rtcCenter;\r\n\r\n this._updateB3DMLocalMatrix(mesh, tileTransform);\r\n meshes.push(mesh);\r\n delete gltfMesh.attributes;\r\n mesh._originLocalTransform = mat4.copy([], mesh.localTransform);\r\n });\r\n\r\n // trim indices/material images to save memories\r\n trimGLTFWeakResources(gltfWeakResources);\r\n\r\n if (ready) {\r\n this._modelMeshes[id] = meshes;\r\n cb(null, { id : id, mesh : meshes });\r\n } else {\r\n this._loading[id] = { meshes: meshes, count: unreadyCount };\r\n meshes._callback = cb;\r\n }\r\n return meshes;\r\n }\r\n\r\n _createBoxMesh(node) {\r\n const nodeBox = this._layer._getNodeBox(node.id);\r\n if (!nodeBox || node._boxMesh) {\r\n return;\r\n }\r\n let vertices, indices, translate, scale;\r\n if (nodeBox.obbox) { //region、box\r\n vertices = nodeBox.boxPosition;\r\n indices = BOX_INDEX;\r\n translate = nodeBox.boxCenter;\r\n scale = BOX_SCALE;\r\n } else if (nodeBox.sphereBox) { //sphere\r\n const sphereCenter = nodeBox.sphereBox[0], radius = nodeBox.sphereBox[1];\r\n vertices = SPHERE_POS.vertices;\r\n indices = SPHERE_POS.indices;\r\n translate = sphereCenter;\r\n scale = [radius, radius, radius];\r\n }\r\n const geometry = new reshader.Geometry({\r\n POSITION: vertices\r\n },\r\n indices,\r\n 0,\r\n {\r\n primitive : 'lines',\r\n positionAttribute: 'POSITION'\r\n });\r\n const mesh = new reshader.Mesh(geometry, new reshader.Material({ lineColor: [0.8, 0.8, 0.1, 1.0], lineOpacity: 1 }));\r\n const localTransform = [];\r\n mat4.fromRotationTranslationScale(localTransform, BOX_ROTATE, translate, scale);\r\n mesh.localTransform = localTransform;\r\n mesh._originLocalTransform = mat4.copy([], localTransform);\r\n mesh.properties.node = node;\r\n node._boxMesh = mesh;\r\n }\r\n\r\n _deleteBoxMesh(node) {\r\n if (node._boxMesh) {\r\n node._boxMesh.geometry.dispose();\r\n node._boxMesh.dispose();\r\n delete node._boxMesh;\r\n }\r\n }\r\n\r\n _setCompressedInt16Uniforms(mesh, compressed_int16_params) {\r\n if (compressed_int16_params['POSITION']) {\r\n mesh.setUniform('compressedPositionRange', compressed_int16_params['POSITION']);\r\n }\r\n if (compressed_int16_params['TEXCOORD_0']) {\r\n mesh.setUniform('compressedTexcoordRange_0', compressed_int16_params['TEXCOORD_0']);\r\n }\r\n if (compressed_int16_params['TEXCOORD_1']) {\r\n mesh.setUniform('compressedTexcoordRange_1', compressed_int16_params['TEXCOORD_0']);\r\n }\r\n if (compressed_int16_params['NORMAL']) {\r\n mesh.setUniform('compressedNormalRange', compressed_int16_params['NORMAL']);\r\n }\r\n if (compressed_int16_params['TANGENT']) {\r\n mesh.setUniform('compressedTangentRange', compressed_int16_params['TANGENT']);\r\n }\r\n if (compressed_int16_params['compressed_ratio']) {\r\n mesh.setUniform('compressed_ratio', compressed_int16_params['compressed_ratio']);\r\n }\r\n }\r\n\r\n _updateB3DMLocalMatrix(mesh, tileTransform) {\r\n const { isSharedPosition, rtcCoord, rtcCenter, projCenter, nodeMatrix, node } = mesh.properties;\r\n if (!tileTransform) {\r\n tileTransform = this._getB3DMTileTransform(tileTransform || TEMP_TILE_TRANSFORM, isSharedPosition, rtcCoord, rtcCenter, projCenter, node)\r\n }\r\n\r\n const matrix = mesh.localTransform || mat4.identity([]);\r\n\r\n mat4.multiply(matrix, tileTransform, nodeMatrix);\r\n const service = this._layer._getNodeService(node._rootIdx);\r\n if (service.coordOffset) {\r\n const coordOffsetMatrix = this._computeCoordOffsetMatrix(TEMP_MATRIX2, node._rootIdx, rtcCoord);\r\n mat4.multiply(matrix, coordOffsetMatrix, matrix);\r\n }\r\n mesh.setLocalTransform(matrix);\r\n mesh.properties.heightOffset = service.heightOffset || 0;\r\n mesh.properties.coordOffset = service.coordOffset && service.coordOffset.slice(0) || EMPTY_COORD_OFFSET;\r\n }\r\n\r\n _getB3DMTileTransform(out, isSharedPosition, rtcCoord, rtcCenter, projCenter, node) {\r\n if (isSharedPosition) {\r\n // position被共享的模型,只能采用basisTo2D来绘制\r\n // 电信的模型如tokyo.html中的模型\r\n const distanceScale = this._getDistanceScale(TEMP_DIST_SCALE, rtcCoord);\r\n const localTransform = mat4.fromScaling(TEMP_MATRIX1, distanceScale);\r\n const projectedMatrix = this._computeProjectedTransform(TEMP_MATRIX2, node, rtcCenter, rtcCoord);\r\n mat4.multiply(out, projectedMatrix, localTransform);\r\n } else {\r\n this._getB3DMTransform(out, rtcCoord, projCenter, node._rootIdx);\r\n }\r\n return out;\r\n }\r\n\r\n _setWEB3DDecodeUniforms(mesh, attributes) {\r\n if (attributes && attributes['TEXCOORD_0'] && attributes['TEXCOORD_0'].extensions && attributes['TEXCOORD_0'].extensions['WEB3D_quantized_attributes']) {\r\n const decodeMatrix = attributes['TEXCOORD_0'].extensions['WEB3D_quantized_attributes'].decodeMatrix;\r\n mesh.setUniform('decodeMatrix', decodeMatrix);\r\n }\r\n }\r\n\r\n _computeProjectedTransform(out, node, rtcCenter, rtcCoord) {\r\n const map = this.getMap();\r\n const heightOffset = this._layer._getNodeService(node._rootIdx).heightOffset || 0;\r\n\r\n const nodeTransform = node.matrix ? mat4.copy(out, node.matrix) : mat4.identity(out);\r\n if (rtcCenter) {\r\n const realCenter = vec3.transformMat4(TEMP_RTCCENTER, rtcCenter, nodeTransform);\r\n setTranslation(nodeTransform, realCenter, nodeTransform);\r\n }\r\n // const computedTransform = mat4.multiply([], nodeTransform, Y_TO_Z);\r\n const computedTransform = nodeTransform;\r\n const projection = map.getProjection();\r\n const glRes = map.getGLRes();\r\n const projectedTransform = basisTo2D(computedTransform, rtcCoord, computedTransform, projection, glRes, this._heightScale, heightOffset);\r\n const translation = getTranslation(TEMP_TRANSLATION, projectedTransform);\r\n let offset = this._layer.options['offset'];\r\n if (isFunction(offset)) {\r\n const center = this._layer._getNodeBox(node.id).boxCoord;\r\n offset = offset.call(this._layer, center);\r\n }\r\n vec3.set(TEMP_OFFSET, offset[0], offset[1], 0);\r\n vec3.sub(translation, translation, TEMP_OFFSET);\r\n\r\n setTranslation(projectedTransform, translation, projectedTransform);\r\n return projectedTransform;\r\n\r\n }\r\n\r\n _computeCoordOffsetMatrix(out, rootIdx, center) {\r\n const service = this._layer._getNodeService(rootIdx);\r\n if (!service.coordOffset) {\r\n return null;\r\n }\r\n const map = this.getMap();\r\n const glRes = map.getGLRes();\r\n TEMP_CENTER.set(center[0], center[1]);\r\n const point0 = map.coordToPointAtRes(TEMP_CENTER, glRes, TEMP_POINT1);\r\n const coordOffset = service.coordOffset;\r\n const target = TEMP_CENTER.set(center[0] + coordOffset[0], center[1] + coordOffset[1]);\r\n const point1 = map.coordToPointAtRes(target, glRes, TEMP_POINT2);\r\n const dx = point1.x - point0.x;\r\n const dy = point1.y - point0.y;\r\n const heightScale = this._heightScale;\r\n\r\n const translation = vec3.set(TEMP_OFFSET, dx, dy, (coordOffset[2] || 0) * heightScale);\r\n const matrix = mat4.fromTranslation(out, translation);\r\n return matrix;\r\n }\r\n\r\n createCMPTMesh(data, id, node, cb) {\r\n if (this._cmptMeshes[id]) {\r\n const meshes = this._cmptMeshes[id];\r\n console.warn(`mesh with id(${id}) was already created.`);\r\n cb(null, { id: id, mesh: meshes });\r\n return meshes;\r\n }\r\n // if (node.content.uri !== 'NoLod_2.cmpt') {\r\n // return [];\r\n // }\r\n const { content } = data;\r\n const meshes = [];\r\n for (let i = 0; i < content.length; i++) {\r\n const { magic } = content[i];\r\n const childId = id + '.' + i;\r\n if (magic === 'b3dm') {\r\n this.createB3DMMesh(content[i], childId, node, (err, { mesh }) => {\r\n meshes.push(mesh);\r\n });\r\n } else if (magic === 'i3dm') {\r\n this.createI3DMMesh(content[i], childId, node, (err, { mesh }) => {\r\n meshes.push(mesh);\r\n });\r\n } else if (magic === 'pnts') {\r\n this.createPntsMesh(content[i], childId, node, (err, { mesh }) => {\r\n meshes.push(mesh);\r\n });\r\n } else if (magic === 'cmpt') {\r\n this.createCMPTMesh(content[i], childId, node, (err, { mesh }) => {\r\n meshes.push(mesh);\r\n });\r\n }\r\n }\r\n this._cmptMeshes[id] = meshes;\r\n cb(null, { id: id, mesh: meshes });\r\n return meshes;\r\n }\r\n\r\n _getGLTFMeshDefines(gltfMesh, geometry, material, rootIdx, gltf) {\r\n const shader = this._layer._getNodeService(rootIdx).shader || 'pbr';\r\n const runShader = shader === 'phong' ? this._phongShader : this._standardShader;\r\n const defines = runShader.getGeometryDefines(geometry);\r\n if (gltf.asset && gltf.asset.generator === 'S3M') {\r\n this._appendS3MDefines(defines, geometry);\r\n }\r\n if (geometry.data.uvRegion) {\r\n defines['HAS_I3S_UVREGION'] = 1;\r\n }\r\n\r\n if (geometry.data[geometry.desc.normalAttribute]) {\r\n defines['VertexNormal'] = 1;\r\n }\r\n if (geometry.data[geometry.desc.color0Attribute]) {\r\n defines['VertexColor'] = 1;\r\n }\r\n if (geometry.data[geometry.desc.uv0Attribute]) {\r\n defines['TexCoord'] = 1;\r\n }\r\n if (geometry.data[geometry.desc.textureCoordMatrixAttribute]) {\r\n defines['HAS_TextureCoordMatrix'] = 1;\r\n }\r\n if (material.get('uTexture')) {\r\n defines['COMPUTE_TEXCOORD'] = 1;\r\n }\r\n if (material.get('uTexture2')) {\r\n defines['TexCoord2'] = 1;\r\n }\r\n if(this._layer._vertexCompressionType === 'MESHOPT') {\r\n defines['MeshOPT_Compress'] = 1;\r\n }\r\n if (this.hasIBL()) {\r\n defines['HAS_IBL_LIGHTING'] = 1;\r\n }\r\n if (gltfMesh.attributes && gltfMesh.attributes['TEXCOORD_0'] && gltfMesh.attributes['TEXCOORD_0'].extensions === 'WEB3D_quantized_attributes') {\r\n defines['HAS_WEB3D_quantized_attributes_TEXCOORD'] = 1;\r\n }\r\n defines['HAS_MIN_ALTITUDE'] = 1;\r\n this._setCompressedInt16Defines(defines, gltfMesh.compressed_int16_params);\r\n const compressDefines = gltfMesh.compressDefines;\r\n extend(defines, compressDefines);\r\n return defines;\r\n }\r\n\r\n _setCompressedInt16Defines(defines, compressed_int16_params) {\r\n if (compressed_int16_params && Object.keys(compressed_int16_params).length > 0) {\r\n defines['HAS_COMPRESSED_INT16'] = 1;\r\n if (compressed_int16_params['POSITION']) {\r\n defines['HAS_COMPRESSED_INT16_POSITION'] = 1;\r\n }\r\n if (compressed_int16_params['TEXCOORD_0']) {\r\n defines['HAS_COMPRESSED_INT16_TEXCOORD_0'] = 1;\r\n }\r\n if (compressed_int16_params['TEXCOORD_1']) {\r\n defines['HAS_COMPRESSED_INT16_TEXCOORD_1'] = 1;\r\n }\r\n if (compressed_int16_params['NORMAL']) {\r\n defines['HAS_COMPRESSED_INT16_NORMAL'] = 1;\r\n }\r\n if (compressed_int16_params['TANGENT']) {\r\n defines['HAS_COMPRESSED_INT16_TANGENT'] = 1;\r\n }\r\n if (compressed_int16_params['compressed_ratio']) {\r\n defines['HAS_COMPRESSED_INT16_RATIO'] = 1;\r\n }\r\n }\r\n }\r\n\r\n _updateMaskDefines(mesh) {\r\n const renderer = this._layer.getRenderer();\r\n if (renderer) {\r\n renderer.updateMaskDefines(mesh);\r\n }\r\n }\r\n\r\n _appendS3MDefines(defines, geometry) {\r\n if (geometry.data['aNormal']) {\r\n defines['VertexNormal'] = 1;\r\n }\r\n if (geometry.data['instanceId']) {\r\n defines['Instance'] = 1;\r\n }\r\n if (geometry.data['aTexCoord0']) {\r\n defines['TexCoord'] = 1;\r\n }\r\n if (geometry.data['aColor']) {\r\n defines['VertexColor'] = 1;\r\n }\r\n if (geometry.data['aTexCoord1']) {\r\n defines['TexCoord2'] = 1;\r\n }\r\n if (geometry.data['uv2']) {\r\n defines['InstanceBim'] = 1;\r\n }\r\n }\r\n\r\n _processGLTF(gltfMesh, meshId, primId, gltf, node, isI3DM, shader, gltfWeakResources) {\r\n let isS3M = false;\r\n if (gltf.asset && gltf.asset.generator === 'S3M') {\r\n isS3M = true;\r\n // is a s3mType\r\n gltf.extensions = gltf.extensions || {};\r\n // gltf.extensions['KHR_techniques_webgl'] = getKHR_techniques(gltf.asset.s3mVersion);\r\n }\r\n const url = gltf.url + '-' + meshId + '-' + primId;\r\n if (this._cachedGLTF[url]) {\r\n return this._cachedGLTF[url];\r\n }\r\n gltfWeakResources.push(gltfMesh);\r\n let material, geometry;\r\n //TODO 有些B3DM或I3DM里,多个 gltf.mesh 会共享同一个POSITION,MESH,TEXCOORD。\r\n // 效率更高的做法是为他们单独创建buffer后赋给Geometry\r\n // 程序中无需管理buffer的销毁,Geometry中会维护buffer的引用计数来管理buffer的销毁\r\n const matInfo = gltf.materials && gltf.materials[gltfMesh.material];\r\n const khrTechniquesWebgl = gltf.extensions && gltf.extensions['KHR_techniques_webgl'];\r\n const service = this._layer._getNodeService(node._rootIdx);\r\n if (khrTechniquesWebgl && matInfo.extensions && matInfo.extensions['KHR_techniques_webgl']) {\r\n const isWebGPU = this.getMap().getRenderer().isWebGPU();\r\n if (isWebGPU) {\r\n throw new Error('3dtiles with KHR_techniques_webgl extension is not supported in webgpu');\r\n }\r\n // s3m.vert 和 s3m.frag 是用webgl 2写的,所以是s3m时,要开启webgl2\r\n const khrMesh = this._createTechniqueMesh(gltfMesh, gltf, isI3DM, isS3M);\r\n material = khrMesh.material;\r\n geometry = khrMesh.geometry;\r\n if (service['fillEmptyDataInMissingAttribute']) {\r\n geometry.desc.fillEmptyDataInMissingAttribute = true;\r\n }\r\n } else {\r\n geometry = this._createGeometry(gltfMesh, isI3DM, DEFAULT_SEMANTICS);\r\n const materialInfo = service.material;\r\n material = this._createMaterial(gltfMesh.material, gltf, shader, materialInfo || DEFAULT_MATERIAL_INFO, gltfWeakResources, service);\r\n }\r\n if (material) {\r\n material.setFunctionUniform('alphaTest', function () {\r\n const alphaTest = service['alphaTest'];\r\n if (!isNil(alphaTest)) {\r\n return alphaTest;\r\n }\r\n return 0.1;\r\n });\r\n\r\n material.setFunctionUniform('environmentExposure', () => {\r\n // maptalks/issues#661\r\n const ambientLight = service.ambientLight;\r\n let environmentExposure = service.environmentExposure;\r\n const lights = this.getMap().getLightManager();\r\n const mapAmbient = lights && lights.getAmbientLight();\r\n if (ambientLight && (!mapAmbient || mapAmbient.color) && environmentExposure === undefined) {\r\n const ambientValue = mapAmbient && mapAmbient.color ? mapAmbient.color[0] : 0.2;\r\n // 老的ambientLight设置的兼容性代码\r\n environmentExposure = ambientLight[0] / ambientValue;\r\n }\r\n return environmentExposure || 1;\r\n });\r\n }\r\n\r\n if (material && !material.isReady()) {\r\n material._nodeId = node.id;\r\n } else if (!material) {\r\n material = new reshader.PhongMaterial({\r\n 'baseColorFactor' : [1, 1, 1, 1]\r\n });\r\n }\r\n\r\n const gltfGeo = {\r\n geometry, material\r\n };\r\n geometry.properties.url = url;\r\n this._cachedGLTF[url] = gltfGeo;\r\n return gltfGeo;\r\n }\r\n\r\n _createTechniqueMesh(gltfMesh, gltf, isI3DM, useWebGL2) {\r\n const { geometry, material } = this._khrTechniqueWebglManager.createMesh(gltfMesh, gltf, isI3DM, useWebGL2)\r\n return { geometry, material };\r\n }\r\n\r\n _createGeometry(gltfMesh, isI3DM, attributeSemantics) {\r\n const attributes = gltfMesh.attributes;\r\n const color0Name = 'COLOR_0';\r\n // 把Float32类型的color0改为uint8类型数组\r\n let batchIdData = attributes['_BATCHID'] && attributes['_BATCHID'].array;\r\n if (batchIdData) {\r\n if (batchIdData.byteOffset) {\r\n batchIdData = new batchIdData.constructor(batchIdData);\r\n }\r\n }\r\n if (attributes[color0Name]) {\r\n const colors = attributes[color0Name].array || attributes[color0Name];\r\n if (colors instanceof Float32Array) {\r\n const color = new Uint8Array(colors.length);\r\n for (let i = 0; i < color.length; i++) {\r\n color[i] = Math.round(colors[i] * 255);\r\n }\r\n if (attributes[color0Name].array) {\r\n attributes[color0Name].array = color;\r\n attributes[color0Name].componentType = 5121;\r\n } else {\r\n attributes[color0Name] = color;\r\n }\r\n\r\n }\r\n }\r\n const isWebGPU = this.getMap().getRenderer().isWebGPU();\r\n const attrs = {};\r\n let positionSize = 0;\r\n let vertexCount = 0;\r\n for (const p in attributes) {\r\n // 优先采用 attributeSemantics中定义的属性\r\n const name = attributeSemantics[p] || p;\r\n const isPosition = name === attributeSemantics['POSITION'];\r\n if (isPosition) {\r\n positionSize = attributes[p].itemSize;\r\n }\r\n if (isWebGPU) {\r\n const array = attributes[p].array;\r\n const newArray = reshader.Geometry.padGPUBufferAlignment(attributes[p].array, attributes[p].count);\r\n if (array !== newArray) {\r\n if (isPosition) {\r\n positionSize += 1;\r\n }\r\n attributes[p].array = newArray;\r\n attributes[p].byteLength = newArray.byteLength;\r\n attributes[p].itemSize += 1;\r\n const type = attributes[p].type;\r\n attributes[p].type = type.substring(0, type.length - 1) + attributes[p].itemSize;\r\n //TODO attributes[p].byteStride 可能不为0\r\n }\r\n }\r\n const buffer = getUniqueREGLBuffer(this._regl, attributes[p], { dimension: attributes[p].itemSize, name: p });\r\n\r\n attrs[name] = extend({}, attributes[p]);\r\n attrs[name].buffer = buffer;\r\n attrs[name].type = getArrayType(attrs[name].array);\r\n delete attrs[name].array;\r\n if (name === attributeSemantics['POSITION']) {\r\n attrs[name].array = attributes[p].array;\r\n vertexCount = attributes[p].array.length / 3;\r\n }\r\n }\r\n // 补上缺失的_BATHCID属性,解决macos下 vertex buffer not big enough 报错\r\n const pickingIdAttribute = attributeSemantics['_BATCHID'];\r\n if (!attrs[pickingIdAttribute] && !isI3DM) {\r\n const pickingData = new Uint8Array(vertexCount);\r\n attrs[pickingIdAttribute] = pickingData;\r\n }\r\n // createColorArray(attrs);\r\n const indices = gltfMesh.indices ? (gltfMesh.indices.array ? gltfMesh.indices.array.slice() : gltfMesh.indices) : null;\r\n const geometry = new reshader.Geometry(\r\n attrs,\r\n indices,\r\n 0,\r\n {\r\n // static: true,\r\n positionSize,\r\n positionAttribute: attributeSemantics['POSITION'],\r\n normalAttribute: attributeSemantics['NORMAL'],\r\n uv0Attribute: attributeSemantics['TEXCOORD_0'],\r\n uv1Attribute: attributeSemantics['TEXCOORD_1'],\r\n color0Attribute: attributeSemantics['COLOR_0'],\r\n tangentAttribute: attributeSemantics['TANGENT'],\r\n pickingIdAttribute: attributeSemantics['_BATCHID'],\r\n primitive: gltfMesh.mode === undefined ? 'triangles' : getPrimitive(gltfMesh.mode)\r\n }\r\n );\r\n if (batchIdData && indices) {\r\n geometry.properties.batchIdData = batchIdData;\r\n geometry.properties.batchIdMap = generateFeatureIndiceIndex(batchIdData, indices);\r\n }\r\n geometry.generateBuffers(this._regl, { excludeElementsInVAO: isI3DM });\r\n return geometry;\r\n }\r\n\r\n _getB3DMTransform(out, rtcCoord, projCenter, rootIdx) {\r\n const localTransform = mat4.identity(out);\r\n\r\n const scale = this._getProjScale(IDENTITY_SCALE);\r\n this._getCenterTranslation(TEMP_TRANSLATION, projCenter, rootIdx);\r\n\r\n mat4.translate(localTransform, localTransform, TEMP_TRANSLATION);\r\n mat4.scale(localTransform, localTransform, scale);\r\n return localTransform;\r\n }\r\n\r\n _getCenterTranslation(out, projCenter, rootIdx) {\r\n const heightScale = this._heightScale\r\n TEMP_CENTER.x = projCenter[0];\r\n TEMP_CENTER.y = projCenter[1];\r\n const center = this._prjToPoint(TEMP_CENTER);\r\n let offset = this._layer.options['offset'];\r\n if (isFunction(offset)) {\r\n offset = offset.call(this._layer, TEMP_CENTER);\r\n }\r\n const heightOffset = this._layer._getNodeService(rootIdx).heightOffset || 0;\r\n vec3.set(out, center.x - offset[0], center.y - offset[1], heightScale * projCenter[2] + heightScale * heightOffset);\r\n return out;\r\n }\r\n\r\n _updateServiceMatrix(mesh, node) {\r\n const serviceTransform = this._layer._getServiceTransform(TEMP_SERVICE_MAT, node);\r\n mesh.localTransform = mat4.multiply(mesh.localTransform, serviceTransform, mesh._originLocalTransform);\r\n }\r\n\r\n _getDistanceScale(out, rtcCoord) {\r\n // heightOffset 在 _computeProjectedTransform 中计算了,所以这里不用再重复计算。\r\n const map = this.getMap();\r\n TEMP_CENTER.x = rtcCoord[0];\r\n TEMP_CENTER.y = rtcCoord[1];\r\n const zoomScale = map.distanceToPointAtRes(100, 100, map.getGLRes(), TEMP_CENTER);\r\n const heightScale = this._heightScale;\r\n vec3.set(out, zoomScale.x / 100, zoomScale.y / 100, heightScale);\r\n return out;\r\n }\r\n\r\n _createShaders(context) {\r\n if (this._standardShader) {\r\n return;\r\n }\r\n const viewport = {\r\n x : 0,\r\n y : 0,\r\n width : () => {\r\n return this._canvas ? this._canvas.width : 1;\r\n },\r\n height : () => {\r\n return this._canvas ? this._canvas.height : 1;\r\n }\r\n };\r\n const modelNormalMatrix = [];\r\n const projViewModelMatrix = [];\r\n this._pntsShader = new reshader.MeshShader({\r\n vert: pntsVert,\r\n frag: pntsFrag,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: (_, props) => {\r\n return mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n }\r\n },\r\n {\r\n name: 'modelNormalMatrix',\r\n type: 'function',\r\n fn: (_, props) => {\r\n return mat3.fromMat4(modelNormalMatrix, props['modelMatrix']);\r\n }\r\n }\r\n ],\r\n extraCommandProps: {\r\n viewport,\r\n blend: {\r\n enable: true,\r\n func: {\r\n src: 'one',\r\n dst: 'one minus src alpha'\r\n },\r\n equation: 'add'\r\n },\r\n depth: {\r\n enable: true,\r\n func: '<'\r\n }\r\n }\r\n });\r\n\r\n const defines = {};\r\n const uniformDeclares = [];\r\n ContextUtil.fillIncludes(defines, uniformDeclares, context);\r\n const extraCommandProps = this._getExtraCommandProps();\r\n\r\n this._phongShader = new reshader.PhongShader({\r\n uniforms: uniformDeclares,\r\n defines,\r\n extraCommandProps\r\n });\r\n\r\n this._standardShader = new reshader.pbr.StandardShader({\r\n uniforms: uniformDeclares,\r\n defines,\r\n extraCommandProps\r\n // uniforms : [\r\n // 'ambientLight',\r\n // 'baseColor',\r\n // 'debug',\r\n // 'linearColor',\r\n // {\r\n // name : 'projViewModelMatrix',\r\n // type : 'function',\r\n // fn : (context, props) => {\r\n // return mat4.multiply([], props['projViewMatrix'], props['modelMatrix']);\r\n // }\r\n // },\r\n // {\r\n // name : 'maxExtent',\r\n // type : 'function',\r\n // fn : (context, props) => {\r\n // const maxExtent = props['maxPrjExtent'],\r\n // prjCenter = props['prjCenter'];\r\n // if (!maxExtent) {\r\n // return null;\r\n // }\r\n // const extent = [\r\n // maxExtent[0] - prjCenter[0], maxExtent[1] - prjCenter[1],\r\n // maxExtent[2] - prjCenter[0], maxExtent[3] - prjCenter[1],\r\n // ];\r\n // return extent;\r\n // }\r\n // }\r\n // ],\r\n\r\n });\r\n //用于绘制bbox\r\n this._edgeShader = new reshader.EdgeShader({ extraCommandProps: {\r\n viewport: {\r\n x : 0,\r\n y : 0,\r\n width : () => {\r\n return this._canvas ? this._canvas.width : 1;\r\n },\r\n height : () => {\r\n return this._canvas ? this._canvas.height : 1;\r\n }\r\n },\r\n blend: {\r\n enable: true,\r\n func: {\r\n srcRGB: 'src alpha',\r\n srcAlpha: 1,\r\n dstRGB: 'one minus src alpha',\r\n dstAlpha: 'one minus src alpha'\r\n },\r\n equation: 'add'\r\n }\r\n } });\r\n\r\n const layer = this._layer;\r\n loginIBLResOnCanvas(layer.getRenderer().canvas, this._regl, layer.getMap());\r\n\r\n this.picking = new reshader.FBORayPicking(\r\n this._renderer,\r\n {\r\n vert: pickingVert,\r\n extraCommandProps,\r\n uniforms: this._standardShader.uniforms,\r\n defines: {\r\n 'PICKING_MODE': 1,\r\n 'ENABLE_PICKING': 1,\r\n 'HAS_PICKING_ID': 1\r\n },\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n );\r\n this._pntsPicking = new reshader.FBORayPicking(\r\n this._renderer,\r\n {\r\n vert: pntsVert,\r\n extraCommandProps,\r\n uniforms: this._pntsShader.uniforms,\r\n defines: {\r\n 'PICKING_MODE': 1,\r\n 'ENABLE_PICKING': 1,\r\n 'HAS_PICKING_ID': 1\r\n }\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n );\r\n // this._modelShader.filter = mesh => {\r\n // return mesh.material.isReady();\r\n // };\r\n }\r\n\r\n\r\n _getExtraCommandProps() {\r\n const viewport = {\r\n x : 0,\r\n y : 0,\r\n width : () => {\r\n return this._canvas ? this._canvas.width : 1;\r\n },\r\n height : () => {\r\n return this._canvas ? this._canvas.height : 1;\r\n }\r\n };\r\n return {\r\n viewport,\r\n // colorMask: (_, props) => {\r\n // return props['colorMask'] || colorOn;\r\n // },\r\n cull : {\r\n enable: (_, props) => {\r\n return props.meshProperties.cullFace;\r\n },\r\n face: (_, props) => {\r\n return props.cullFace || 'back';\r\n }\r\n },\r\n stencil: {\r\n enable: (_, props) => {\r\n return props.stencilEnable;\r\n },\r\n func: {\r\n cmp: '<=',\r\n ref: (_, props) => {\r\n return props.meshProperties.selectionDepth;\r\n },\r\n // mask: 0xff\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n func: (_, props) => {\r\n return props.meshProperties.depthFunc || '<=';\r\n }\r\n },\r\n blend: {\r\n enable: true,\r\n func: {\r\n src: 1,\r\n dst: 'one minus src alpha'\r\n },\r\n equation: 'add'\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: (_, props) => {\r\n return props.meshProperties.polygonOffset;\r\n }\r\n }\r\n };\r\n }\r\n\r\n _getPntsUniforms(options) {\r\n const map = this.getMap();\r\n const lightManager = map.getLightManager();\r\n const directionalLight = lightManager && lightManager.getDirectionalLight() || {};\r\n const lightDir = directionalLight.direction || [1, 1, -1];\r\n const pointOpacity = options && options.pointOpacity || 1;\r\n let layerOpacity = this._layer.options['opacity'];\r\n layerOpacity = isNil(layerOpacity) ? 1 : layerOpacity;\r\n return {\r\n projViewMatrix : map.projViewMatrix,\r\n pointOpacity,\r\n lightDir: vec3.normalize(LIGHT_DIR, lightDir),\r\n layerOpacity\r\n };\r\n }\r\n\r\n _getUniformValues() {\r\n const map = this.getMap();\r\n const layer = this._layer;\r\n const canvas = layer.getRenderer().canvas;\r\n const { iblTexes, dfgLUT } = getIBLResOnCanvas(canvas);\r\n const uniforms = getPBRUniforms(map, iblTexes, dfgLUT);\r\n const renderer = this._layer.getRenderer();\r\n const maskUniforms = renderer.getMaskUniforms();\r\n uniforms.minAltitude = layer.options.altitude || 0;\r\n let layerOpacity = layer.options['opacity'];\r\n layerOpacity = isNil(layerOpacity) ? 1 : layerOpacity;\r\n uniforms.layerOpacity = layerOpacity;\r\n extend(uniforms, {\r\n czm_lightDirectionEC: uniforms['light0_viewDirection'],\r\n lightSpecular: [1.0, 1.0, 1.0],\r\n viewMatrix: map.viewMatrix,\r\n projMatrix: map.projMatrix,\r\n projViewMatrix : map.projViewMatrix,\r\n outSize: [canvas.width, canvas.height],\r\n polygonFill: [1, 1, 1, 1],\r\n polygonOpacity: 1\r\n });\r\n if (!uniforms.ambientColor) {\r\n uniforms.ambientColor = [0.2, 0.2, 0.2];\r\n }\r\n extend(uniforms, maskUniforms);\r\n return uniforms;\r\n }\r\n\r\n _createMaterial(materialIndex, gltf, shader, materialInfo, gltfWeakResources, service) {\r\n const material = gltf.materials && gltf.materials[materialIndex];\r\n if (!material || !material.baseColorTexture && !material.pbrMetallicRoughness) {\r\n return null;\r\n }\r\n const matInfo = extend({}, materialInfo);\r\n if (material.baseColorTexture) {\r\n // GLTF 1.0\r\n const texInfo = gltf.textures[material.baseColorTexture.index];\r\n let texture;\r\n if (texInfo && !texInfo.image.color) {\r\n texture = this._getTexture(texInfo, gltfWeakResources);\r\n }\r\n matInfo.baseColorFactor = texInfo && texInfo.image.color || material.baseColorFactor || [1, 1, 1, 1];\r\n if (texture) {\r\n matInfo['baseColorTexture'] = texture;\r\n }\r\n } else {\r\n // GLTF 2.0\r\n\r\n if (material.normalTexture) {\r\n const texture = this._getTexture(gltf.textures[material.normalTexture.index], gltfWeakResources);\r\n if (texture) {\r\n const normalMapFactor = material.normalTexture.scale || 1;\r\n matInfo.normalTexture = texture;\r\n matInfo.normalMapFactor = normalMapFactor;\r\n }\r\n }\r\n if (material.occlusionTexture) {\r\n const texture = this._getTexture(gltf.textures[material.occlusionTexture.index], gltfWeakResources);\r\n if (texture) {\r\n const occlusionFactor = material.occlusionTexture.strength || 1;\r\n matInfo.occlusionTexture = texture;\r\n matInfo.occlusionFactor = occlusionFactor;\r\n }\r\n }\r\n if (material.emissiveTexture) {\r\n const texture = this._getTexture(gltf.textures[material.emissiveTexture.index], gltfWeakResources);\r\n if (texture) {\r\n matInfo.emissiveTexture = texture;\r\n }\r\n }\r\n if (material.emissiveFactor) {\r\n matInfo.emissiveFactor = material.emissiveFactor;\r\n }\r\n //TODO alphaMode, cutOff和doubleSided\r\n\r\n const pbrMetallicRoughness = material.pbrMetallicRoughness;\r\n if (pbrMetallicRoughness) {\r\n if (pbrMetallicRoughness.baseColorFactor) {\r\n matInfo.baseColorFactor = pbrMetallicRoughness.baseColorFactor;\r\n }\r\n if (pbrMetallicRoughness.baseColorTexture && pbrMetallicRoughness.baseColorTexture.index !== undefined) {\r\n const texInfo = gltf.textures[pbrMetallicRoughness.baseColorTexture.index];\r\n if (texInfo && texInfo.image && texInfo.image.color) {\r\n matInfo.baseColorFactor = matInfo.baseColorFactor ? vec4.multiply(matInfo.baseColorFactor, matInfo.baseColorFactor, texInfo.image.color) : texInfo.image.color;\r\n } else {\r\n const texture = this._getTexture(texInfo, gltfWeakResources);\r\n if (texture) {\r\n matInfo.baseColorTexture = texture;\r\n // 调用getREGLTexture以回收bitmap\r\n matInfo.baseColorTexture.getREGLTexture(this._regl);\r\n }\r\n }\r\n }\r\n if (!isNil(pbrMetallicRoughness.metallicFactor)) {\r\n matInfo.metallicFactor = pbrMetallicRoughness.metallicFactor;\r\n }\r\n if (!isNil(pbrMetallicRoughness.roughnessFactor)) {\r\n matInfo.roughnessFactor = pbrMetallicRoughness.roughnessFactor;\r\n }\r\n if (material.metallicRoughnessTexture) {\r\n const texture = this._getTexture(gltf.textures[material.metallicRoughnessTexture.index], gltfWeakResources);\r\n if (texture) {\r\n matInfo.metallicRoughnessTexture = texture;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n if (material.s3mMaterial) {\r\n return new reshader.Material(matInfo);\r\n }\r\n // matInfo.alphaTest = 0.1;\r\n if (service.unlit || material.extensions && material.extensions['KHR_materials_unlit']) {\r\n // matInfo.ambientColor = [1, 1, 1];\r\n // matInfo['light0_diffuse'] = [0, 0, 0, 0];\r\n // matInfo['lightSpecular'] = [0, 0, 0];\r\n const material = new reshader.PhongMaterial(matInfo);\r\n material.unlit = service.unlit === undefined || !!service.unlit;\r\n return material;\r\n }\r\n\r\n let meshMaterial = new reshader.pbr.StandardMaterial(matInfo);\r\n if (shader === 'phong') {\r\n meshMaterial = reshader.PhongMaterial.convertFrom(meshMaterial);\r\n }\r\n const pbrMetallicRoughness = material.pbrMetallicRoughness;\r\n const extensions = pbrMetallicRoughness && pbrMetallicRoughness.baseColorTexture && pbrMetallicRoughness.baseColorTexture.extensions;\r\n if (extensions && extensions['KHR_texture_transform']) {\r\n meshMaterial.set('khr_offset', extensions['KHR_texture_transform'].offset || [0, 0]);\r\n meshMaterial.set('khr_rotation', extensions['KHR_texture_transform'].rotation || 0);\r\n meshMaterial.set('khr_scale', extensions['KHR_texture_transform'].scale || [1, 1]);\r\n }\r\n meshMaterial.doubleSided = !!(service.doubleSided || material.doubleSided);\r\n meshMaterial.once('complete', this._bindedListener);\r\n return meshMaterial;\r\n }\r\n\r\n _getTexture(texInfo, gltfWeakResources) {\r\n if (!texInfo) {\r\n return null;\r\n }\r\n // texInfo.image.color 表示图片被精简成了颜色\r\n const config = {\r\n type: texInfo.type ? getMaterialType(texInfo.type) : 'uint8',\r\n format: texInfo.format ? getMaterialFormat(texInfo.format) : 'rgba',\r\n flipY: !!texInfo.flipY\r\n };\r\n //gltf 2.0\r\n const image = texInfo.image;\r\n gltfWeakResources.push(image);\r\n if (image.array) {\r\n config.data = image.array;\r\n } else if (image.mipmap) {\r\n config.mipmap = image.mipmap;\r\n }\r\n if (!config.data && !config.mipmap) {\r\n return null;\r\n }\r\n config.width = image.width;\r\n config.height = image.height;\r\n // dxt 纹理要求高宽必须大于4,否则regl中检查会报错\r\n if (config.mipmap && (config.width < 4 || config.height < 4)) {\r\n return null;\r\n }\r\n const sampler = texInfo.sampler || texInfo.texture && texInfo.texture.sampler;\r\n if (sampler) {\r\n if (sampler.magFilter) config['mag'] = getTextureMagFilter(sampler.magFilter);\r\n if (sampler.minFilter) config['min'] = getTextureMinFilter(sampler.minFilter);\r\n if (sampler.wrapS) config['wrapS'] = getTextureWrap(sampler.wrapS);\r\n if (sampler.wrapT) config['wrapT'] = getTextureWrap(sampler.wrapT);\r\n }\r\n\r\n return new reshader.Texture2D(config, this._resLoader);\r\n\r\n }\r\n\r\n _onResourceLoad({ target }) {\r\n const id = target._nodeId;\r\n const loading = this._loading[id];\r\n loading.count--;\r\n if (!loading.count) {\r\n const mesh = loading.meshes;\r\n this._modelMeshes[id] = mesh;\r\n delete this._loading[id];\r\n const cb = mesh._callback;\r\n delete mesh._callback;\r\n cb(null, { mesh: loading.meshes, id });\r\n }\r\n }\r\n\r\n // _unproject(pcoord) {\r\n // const map = this.getMap();\r\n // const sr = this._spatialReference;\r\n // if (!maptalks.SpatialReference.equals(sr.toJSON(), map.getSpatialReference().toJSON())) {\r\n // return map.getProjection().project(sr.getProjection().unproject(pcoord));\r\n // } else {\r\n // return pcoord;\r\n // }\r\n // }\r\n\r\n _getProjScale(out) {\r\n const map = this.getMap();\r\n const zoomScale = 1 / map.getGLRes();\r\n // 高度坐标是米\r\n const heightScale = this._heightScale;\r\n out[0] = out[1] = zoomScale;\r\n out[2] = heightScale;\r\n return out;\r\n }\r\n\r\n _coordToPoint(c) {\r\n return this._layer._coordToPoint(c);\r\n }\r\n\r\n _pointToPrj(c) {\r\n const map = this.getMap();\r\n if (map.getGLZoom) {\r\n return map['_pointToPrj'](c, map.getGLZoom());\r\n } else {\r\n return map['_pointToPrjAtRes'](c, map.getGLRes());\r\n }\r\n }\r\n\r\n _prjToPoint(c) {\r\n const map = this.getMap();\r\n if (map.getGLZoom) {\r\n return map['_prjToPoint'](c, map.getGLZoom());\r\n } else {\r\n return map['_prjToPointAtRes'](c, map.getGLRes(), TEMP_POINT);\r\n }\r\n }\r\n\r\n _getUpAxisTransform(axis) {\r\n if (axis === 'Y') {\r\n return Y_TO_Z;\r\n } else if (axis === 'X') {\r\n return X_TO_Z;\r\n } else {\r\n return IDENTITY_MATRIX;\r\n }\r\n }\r\n\r\n pick(x, y, tolerance = 3) {\r\n const layer = this._layer;\r\n if (!layer || !layer.options['picking']) {\r\n return [];\r\n }\r\n if (!this.pickingFBO || !this.picking) {\r\n return [];\r\n }\r\n const result = [];\r\n const uniforms = this._getUniformValues();\r\n const b3dm = this._pickMesh(this.picking, uniforms, this._modelScene, x, y, tolerance);\r\n if (b3dm) {\r\n result.push(b3dm);\r\n }\r\n const i3dm = this._pickMesh(this.picking, uniforms, this._i3dmScene, x, y, tolerance);\r\n if (i3dm) {\r\n result.push(i3dm);\r\n }\r\n const pntsUniforms = this._getPntsUniforms();\r\n const pnts = this._pickMesh(this._pntsPicking, pntsUniforms, this._pntsScene, x, y, tolerance);\r\n if (pnts) {\r\n result.push(pnts);\r\n }\r\n return result;\r\n\r\n }\r\n\r\n _pickMesh(picking, uniforms, scene, x, y, tolerance) {\r\n if (!scene.getMeshes().length) {\r\n return null;\r\n }\r\n const layer = this._layer;\r\n const map = this.getMap();\r\n\r\n picking.render(scene.getMeshes().filter(m => !m.bloom), uniforms, true);\r\n let picked = {};\r\n if (picking.getRenderedMeshes().length) {\r\n picked = picking.pick(x, y, tolerance, uniforms, {\r\n viewMatrix: map.viewMatrix,\r\n projMatrix: map.projMatrix,\r\n returnPoint: layer.options['pickingPoint']\r\n });\r\n }\r\n const { meshId, pickingId, point, coordinate } = picked;\r\n const mesh = (meshId === 0 || meshId) && picking.getMeshAt(meshId);\r\n if (!mesh || !mesh.geometry) {\r\n //有可能mesh已经被回收,geometry不再存在\r\n return null;\r\n }\r\n const props = mesh.properties;\r\n if (point && point.length) {\r\n point[0] = Math.round(point[0] * 1E5) / 1E5;\r\n point[1] = Math.round(point[1] * 1E5) / 1E5;\r\n point[2] = Math.round(point[2] * 1E5) / 1E5;\r\n }\r\n const data = {\r\n batchId: pickingId\r\n };\r\n const services = layer.options['services'];\r\n const service = services && services[mesh.properties.serviceIndex];\r\n if (service && service['debug']) {\r\n data.debugInfo = props;\r\n }\r\n if (props && props.batchTable) {\r\n const { batchTable, batchTableBin, count } = props;\r\n const batchId = pickingId;\r\n\r\n for (const p in batchTable) {\r\n if (batchTable[p].byteOffset !== undefined) {\r\n data[p] = readBatchData(batchTable[p], batchTableBin, count, batchId);\r\n } else {\r\n data[p] = batchTable[p][batchId];\r\n }\r\n }\r\n }\r\n\r\n return {\r\n service: mesh.properties.serviceIndex,\r\n data,\r\n point,\r\n coordinate\r\n };\r\n }\r\n\r\n highlight(highlights) {\r\n this._highlighted = highlights;\r\n const renderer = this._layer.getRenderer();\r\n this._highlightTimestamp = renderer.getFrameTimestamp();\r\n renderer.setToRedraw(true);\r\n }\r\n\r\n cancelAllHighlight() {\r\n this._highlighted = null;\r\n const renderer = this._layer.getRenderer();\r\n this._highlightTimestamp = renderer.getFrameTimestamp();\r\n renderer.setToRedraw(true);\r\n }\r\n\r\n showOnly(showOnlys) {\r\n this._showOnlys = showOnlys;\r\n const renderer = this._layer.getRenderer();\r\n this._showOnlyTimeStamp = renderer.getFrameTimestamp();\r\n renderer.setToRedraw(true);\r\n }\r\n\r\n cancelShowOnly() {\r\n this._showOnlys = null;\r\n const renderer = this._layer.getRenderer();\r\n this._showOnlyTimeStamp = renderer.getFrameTimestamp();\r\n renderer.setToRedraw(true);\r\n }\r\n\r\n _getCurrentBatchIDs() {\r\n if (!this._paintedMeshes) {\r\n return [];\r\n }\r\n const ids = {};\r\n const batchIds = [];\r\n for (const p in this._paintedMeshes) {\r\n const meshes = this._paintedMeshes[p];\r\n if (meshes) {\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n const geometry = mesh && mesh.geometry;\r\n if (!mesh || !geometry) {\r\n continue;\r\n }\r\n const serviceIndex = mesh.properties.serviceIndex;\r\n if (!ids[serviceIndex]) {\r\n ids[serviceIndex] = new Set();\r\n }\r\n const batchData = geometry.properties.batchIdData;\r\n if (batchData) {\r\n for (let ii = 0; ii < batchData.length; ii++) {\r\n if (!ids[serviceIndex].has(batchData[ii])) {\r\n batchIds.push({\r\n id: batchData[ii],\r\n service: serviceIndex\r\n });\r\n ids[serviceIndex].add(batchData[ii]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return batchIds;\r\n }\r\n\r\n hasIBL() {\r\n const lightManager = this.getMap().getLightManager();\r\n const resource = lightManager && lightManager.getAmbientResource();\r\n return !!resource;\r\n }\r\n}\r\n\r\n// function createColorArray(attrs) {\r\n// const vertexCount = attrs[attributeSemantics['POSITION']].array.length;\r\n// const color = {\r\n// array: new Uint8Array(),\r\n\r\n// }\r\n// color.array.fill(255);\r\n// return color;\r\n// }\r\n\r\n// function meshCompare(a, b) {\r\n// let levelA = a.properties.level;\r\n// let levelB = b.properties.level;\r\n// if (!a.properties.isLeaf) {\r\n// levelA += 255;\r\n// }\r\n// if (!b.properties.isLeaf) {\r\n// levelB += 255;\r\n// }\r\n// if (levelA >= 255 && levelB >= 255) {\r\n// return levelB - levelA;\r\n// }\r\n// return levelA - levelB;\r\n// }\r\n\r\n// function meshCompare(a, b) {\r\n// return a.properties.node._cameraDistance - b.properties.node._cameraDistance;\r\n// }\r\n\r\nfunction generateFeatureIndiceIndex(featureIds, indices) {\r\n if (!indices) {\r\n return null;\r\n }\r\n const indiceIndex = new Map();\r\n for (let i = 0; i < indices.length; i++) {\r\n const idx = indices[i];\r\n const id = featureIds[idx];\r\n let index = indiceIndex.get(id);\r\n if (!index) {\r\n index = [];\r\n indiceIndex.set(id, index);\r\n }\r\n index.push(idx);\r\n }\r\n return indiceIndex;\r\n}\r\n\r\nfunction trimGLTFWeakResources(gltfWeakResources) {\r\n for (let i = 0; i < gltfWeakResources.length; i++) {\r\n if (gltfWeakResources[i]) {\r\n if (gltfWeakResources[i].array) {\r\n gltfWeakResources[i].array = null;\r\n }\r\n if (gltfWeakResources[i].mipmap) {\r\n gltfWeakResources[i].mipmap = null;\r\n }\r\n if (gltfWeakResources[i].indices) {\r\n gltfWeakResources[i].indices = null;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction generateSphere(count, radius) {\r\n const angle = Math.PI * 2 / count;\r\n const vertices = [];\r\n const indices = [];\r\n for (let i = 0; i <= count; i++) {\r\n const posX = Math.cos(angle * i) * radius;\r\n const posY = Math.sin(angle * i) * radius;\r\n const posZ = 0;\r\n vertices[i * 3] = posX;\r\n vertices[i * 3 + 1] = posY;\r\n vertices[i * 3 + 2] = posZ;\r\n }\r\n for (let i = count; i <= count * 2; i++) {\r\n const posY = Math.cos(angle * i) * radius;\r\n const posZ = Math.sin(angle * i) * radius;\r\n const posX = 0;\r\n vertices[i * 3] = posX;\r\n vertices[i * 3 + 1] = posY;\r\n vertices[i * 3 + 2] = posZ;\r\n }\r\n for (let i = count * 2; i <= count * 3; i++) {\r\n const posX = Math.cos(angle * i) * radius;\r\n const posZ = Math.sin(angle * i) * radius;\r\n const posY = 0;\r\n vertices[i * 3] = posX;\r\n vertices[i * 3 + 1] = posY;\r\n vertices[i * 3 + 2] = posZ;\r\n }\r\n const len = vertices.length / 3 - 1;\r\n for (let i = 0; i < len; i++) {\r\n if (i === count - 1 || i === count * 2 -1) {\r\n continue;\r\n }\r\n indices[i * 2] = i;\r\n indices[i * 2 + 1] = i + 1;\r\n }\r\n vertices.push(0, 0, 0);\r\n vertices.push(radius, 0, 0);\r\n vertices.push(0, radius, 0);\r\n vertices.push(0, 0, radius);\r\n indices.push(len + 1, len + 2);\r\n indices.push(len + 1, len + 3);\r\n indices.push(len + 1, len + 4);\r\n return { vertices, indices };\r\n}\r\n","\r\n\r\nexport function fillNodepagesToCache(nodeCache, nodes) {\r\n if (!nodes) {\r\n return;\r\n }\r\n for (let i = 0; i < nodes.length; i++) {\r\n // 1.6版是id,1.7/1.8版是index\r\n const id = nodes[i].id || nodes[i].index;\r\n nodeCache[id] = nodes[i];\r\n }\r\n}\r\n","import { radianToCartesian3 } from '../../common/Transform';\r\nimport { toRadian } from '../../common/Util';\r\nimport { vec3, mat3, mat4 } from 'gl-matrix';\r\nimport { fillNodepagesToCache } from './Util';\r\n\r\nconst TEMP_VEC3 = [];\r\n\r\nexport default class I3SNode {\r\n constructor(url, rootIdx, nodeCache, layer, fnFetchNodepages) {\r\n this._layer = layer;\r\n this._url = url;\r\n this._rootIdx = rootIdx;\r\n this._fnFetchNodepages = fnFetchNodepages;\r\n this._version = nodeCache.version;\r\n if (url.indexOf('i3s:tileset:') < 0) {\r\n if (this._version <= 1.6) {\r\n this._index = 'root';\r\n } else {\r\n this._index = 0;\r\n }\r\n nodeCache.version = this._version;\r\n } else {\r\n this._index = url.substring('i3s:tileset:'.length);\r\n if (this._version > 1.6) {\r\n this._index = parseInt(this._index);\r\n }\r\n }\r\n this._url = url;\r\n this._nodeCache = nodeCache;\r\n }\r\n\r\n load() {\r\n const nodeCache = this._nodeCache;\r\n const baseUrl = nodeCache.layerScene.baseUrl;\r\n\r\n if (this._version <= 1.6) {\r\n if (nodeCache[this._index] && nodeCache[this._index].lodSelection) {\r\n this._nodeJSON = nodeCache[this._index];\r\n return this._loadNode();\r\n }\r\n return new Promise((resolve) => {\r\n let url = baseUrl + '/nodes/' + this._index;\r\n if (nodeCache.layerScene.eslpk) {\r\n url += '/3dNodeIndexDocument.json';\r\n }\r\n this._fnFetchNodepages(this._rootIdx, url, () => {\r\n this._nodeJSON = nodeCache[this._index];\r\n resolve(this._loadNode());\r\n });\r\n });\r\n } else if (this._version >= 1.7) {\r\n if (nodeCache[this._index]) {\r\n this._nodeJSON = nodeCache[this._index];\r\n return this._loadNode();\r\n }\r\n const nodepage = Math.floor(this._index / nodeCache.nodesPerPage);\r\n //root node\r\n\r\n return new Promise((resolve) => {\r\n let url = baseUrl + '/nodepages/' + nodepage;\r\n if (nodeCache.layerScene.eslpk) {\r\n url += '.json';\r\n }\r\n this._fnFetchNodepages(this._rootIdx, url, () => {\r\n this._nodeJSON = nodeCache[this._index];\r\n resolve(this._loadNode());\r\n });\r\n });\r\n } else {\r\n // leaf nodes\r\n return null;\r\n }\r\n }\r\n\r\n getTileset() {\r\n return this._tileset;\r\n }\r\n\r\n getChildrenURL() {\r\n return this._childrenURL;\r\n }\r\n\r\n _loadNode() {\r\n const nodeCache = this._nodeCache;\r\n const baseUrl = nodeCache.layerScene.baseUrl;\r\n const children = this._nodeJSON.children;\r\n const promises = [];\r\n const pendingReqs = {};\r\n if (children) {\r\n for (let i = 0; i < children.length; i++) {\r\n if (this._version <= 1.6) {\r\n const id = children[i].id;\r\n if (nodeCache[id]) {\r\n continue;\r\n }\r\n const childPageIndex = id;\r\n if (!pendingReqs[childPageIndex]) {\r\n pendingReqs[childPageIndex] = new Promise((resolve) => {\r\n let url = baseUrl + '/nodes/' + childPageIndex;\r\n if (nodeCache.layerScene.eslpk) {\r\n url += '/3dNodeIndexDocument.json';\r\n }\r\n this._fnFetchNodepages(this._rootIdx, url, () => {\r\n resolve();\r\n });\r\n });\r\n promises.push(pendingReqs[childPageIndex]);\r\n }\r\n } else {\r\n const id = children[i];\r\n if (nodeCache[id]) {\r\n continue;\r\n }\r\n const childPageIndex = Math.floor(id / nodeCache.nodesPerPage);\r\n if (!pendingReqs[childPageIndex]) {\r\n pendingReqs[childPageIndex] = new Promise((resolve) => {\r\n let url = baseUrl + '/nodepages/' + childPageIndex;\r\n if (nodeCache.layerScene.eslpk) {\r\n url += '.json';\r\n }\r\n this._fnFetchNodepages(this._rootIdx, url, () => {\r\n resolve();\r\n });\r\n });\r\n promises.push(pendingReqs[childPageIndex]);\r\n }\r\n }\r\n\r\n }\r\n }\r\n if (promises.length) {\r\n return Promise.all(promises).then(() => {\r\n return this._loadContent();\r\n });\r\n } else {\r\n return this._loadContent();\r\n }\r\n }\r\n\r\n _loadContent() {\r\n return Promise.resolve(this._createTileset());\r\n }\r\n\r\n _fillCache(nodes) {\r\n fillNodepagesToCache(this._nodeCache, nodes);\r\n }\r\n\r\n _createTileset() {\r\n const inPlaceTileset = {\r\n asset: {\r\n i3s: true,\r\n version: \"1.0\",\r\n gltfUpAxis: 'Z'\r\n },\r\n geometricError: Number.MAX_VALUE,\r\n root: this._convertNode(this._nodeJSON, true),\r\n };\r\n return inPlaceTileset;\r\n }\r\n\r\n _convertNode(nodeJSON) {\r\n const renderer = this._layer.getRenderer();\r\n const projection = this._nodeCache.projection;\r\n const is4326 = !projection || projection && projection.wkid === 4326;\r\n const version = this._version;\r\n const nodeCache = this._nodeCache;\r\n const nodeData = nodeJSON;\r\n const obb = nodeData.obb;\r\n const mbs = nodeData.mbs;\r\n\r\n const boundingVolume = {};\r\n let position;\r\n\r\n if (mbs) {\r\n position = vec3.set([], mbs[0], mbs[1], mbs[2]);\r\n if (!is4326) {\r\n position = renderer._tileCoordToLngLat(position, position);\r\n }\r\n position = _WGS84ToCartesian([], position[0], position[1], position[2]); // cartesian center of box\r\n boundingVolume.sphere = [\r\n ...position, // cartesian center of sphere\r\n mbs[3] // radius of sphere\r\n ];\r\n } else if (obb) {\r\n position = vec3.set([], obb.center[0], obb.center[1], obb.center[2]); // cartesian center of box;\r\n if (!is4326) {\r\n position = renderer._tileCoordToLngLat(position, position);\r\n }\r\n position = _WGS84ToCartesian([], position[0], position[1], position[2]); // cartesian center of box;\r\n const box = fromCenterHalfSizeQuaternion(\r\n position, // cartesian center of box\r\n obb.halfSize,\r\n obb.quaternion\r\n );\r\n // boundingVolume.box = box;\r\n // 计算box的半径\r\n const x = box[3] + box[6] + box[9];\r\n const y = box[4] + box[7] + box[10];\r\n const z = box[5] + box[8] + box[11];\r\n vec3.set(TEMP_VEC3, x, y, z);\r\n const radius = vec3.len(TEMP_VEC3);\r\n boundingVolume.sphere = [\r\n ...position,\r\n radius\r\n ];\r\n }\r\n\r\n // compute the geometric error\r\n let metersPerPixel = Infinity;\r\n\r\n let span = 0;\r\n if (nodeData.mbs) {\r\n span = nodeData.mbs[3];\r\n } else if (nodeData.obb) {\r\n span = Math.max(\r\n Math.max(nodeData.obb.halfSize[0], nodeData.obb.halfSize[1]),\r\n nodeData.obb.halfSize[2]\r\n );\r\n }\r\n\r\n // get the meters/pixel density required to pop the next LOD\r\n if (nodeData.lodThreshold !== undefined) {\r\n if (\r\n nodeCache.lodSelectionMetricType ===\r\n \"maxScreenThresholdSQ\"\r\n ) {\r\n const maxScreenThreshold =\r\n Math.sqrt(nodeData.lodThreshold) / (Math.PI * 0.25);\r\n metersPerPixel = span / maxScreenThreshold;\r\n } else {\r\n console.error(\"Unsupported lodSelectionMetricType in Layer\");\r\n }\r\n } else if (nodeData.lodSelection !== undefined) {\r\n for (\r\n let lodIndex = 0;\r\n lodIndex < nodeData.lodSelection.length;\r\n lodIndex++\r\n ) {\r\n if (\r\n nodeData.lodSelection[lodIndex].metricType === \"maxScreenThreshold\"\r\n ) {\r\n metersPerPixel = span / nodeData.lodSelection[lodIndex].maxError;\r\n }\r\n }\r\n }\r\n\r\n if (metersPerPixel === Infinity || isNaN(metersPerPixel)) {\r\n metersPerPixel = 100000;\r\n }\r\n\r\n // calculate the length of 16 pixels in order to trigger the screen space error\r\n const geometricError = metersPerPixel * 16;\r\n\r\n const globalTransforms = mat4.identity([]);\r\n // globalTransforms[12] = position[0];\r\n // globalTransforms[13] = position[1];\r\n // globalTransforms[14] = position[2];\r\n\r\n const localTransforms = globalTransforms;\r\n\r\n const children = nodeData.children;\r\n let childrenDefinition;\r\n // get children definition\r\n if (children) {\r\n childrenDefinition = [];\r\n const nodeCache = this._nodeCache;\r\n for (let i = 0; i < children.length; i++) {\r\n const childIndex = version <= 1.6 ? children[i].id : children[i];\r\n if (nodeCache[childIndex]) {\r\n childrenDefinition.push(\r\n this._convertNode(nodeCache[childIndex])\r\n );\r\n } else {\r\n childrenDefinition = null;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n\r\n // Create a tile set\r\n const inPlaceTileDefinition = {\r\n refine: \"REPLACE\",\r\n boundingVolume: boundingVolume,\r\n transform: localTransforms,\r\n geometricError: geometricError,\r\n };\r\n\r\n if (version <= 1.6) {\r\n if (!nodeJSON.lodSelection) {\r\n // 1.6的node即是个tileset,又是个mesh\r\n // 因为只在3DNodeDocumentIndex中存了children信息\r\n // 载入3DNodeDocumentIndex之前,是个tileset,载入后,就成为了mesh\r\n // 如果没有lodSelection,说明是个tileset\r\n inPlaceTileDefinition.content = {\r\n uri: 'i3s:tileset:' + (nodeJSON.id || nodeJSON.index),\r\n };\r\n } else if (nodeJSON.geometryData) {\r\n inPlaceTileDefinition.content = {\r\n uri: 'i3s:mesh:' + (nodeJSON.id || nodeJSON.index),\r\n };\r\n }\r\n } else {\r\n if (children && children.length && !childrenDefinition) {\r\n // a child\r\n inPlaceTileDefinition.content = {\r\n uri: 'i3s:tileset:' + (nodeJSON.id || nodeJSON.index),\r\n };\r\n } else if (nodeData.mesh) {\r\n inPlaceTileDefinition.content = {\r\n uri: 'i3s:mesh:' + (nodeJSON.id || nodeJSON.index),\r\n };\r\n }\r\n }\r\n\r\n if (childrenDefinition && childrenDefinition.length) {\r\n inPlaceTileDefinition.children = childrenDefinition;\r\n }\r\n\r\n return inPlaceTileDefinition;\r\n }\r\n\r\n getJSON() {\r\n return this._nodeJSON;\r\n }\r\n}\r\n\r\n\r\n\r\nfunction _WGS84ToCartesian(out, long, lat, height) {\r\n return radianToCartesian3(out, toRadian(long), toRadian(lat), height);\r\n}\r\n\r\nfunction fromCenterHalfSizeQuaternion(center ,halfSize, quaternion) {\r\n const directionsMatrix = mat3.fromQuat([], quaternion);\r\n directionsMatrix[0] = directionsMatrix[0] * halfSize[0];\r\n directionsMatrix[1] = directionsMatrix[1] * halfSize[0];\r\n directionsMatrix[2] = directionsMatrix[2] * halfSize[0];\r\n directionsMatrix[3] = directionsMatrix[3] * halfSize[1];\r\n directionsMatrix[4] = directionsMatrix[4] * halfSize[1];\r\n directionsMatrix[5] = directionsMatrix[5] * halfSize[1];\r\n directionsMatrix[6] = directionsMatrix[6] * halfSize[2];\r\n directionsMatrix[7] = directionsMatrix[7] * halfSize[2];\r\n directionsMatrix[8] = directionsMatrix[8] * halfSize[2];\r\n return [\r\n ...center,\r\n ...directionsMatrix\r\n ];\r\n}\r\n","import transcoders from '@maptalks/gl/dist/transcoders.js';\r\nimport I3SNode from './I3SNode';\r\n// import I3SMesh from './I3SMesh';\r\nimport { isObject } from '../../common/Util';\r\nimport { mat4 } from '@maptalks/gl';\r\n\r\nconst supportKTX2 = !!transcoders.ktx2;\r\nconst IDENTITY_MAT4 = mat4.identity([]);\r\n\r\nconst supportWASM = (() => {\r\n try {\r\n if (typeof WebAssembly === \"object\"\r\n && typeof WebAssembly.instantiate === \"function\") {\r\n const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));\r\n if (module instanceof WebAssembly.Module)\r\n return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;\r\n }\r\n /* eslint-disable no-empty */\r\n } catch (e) {\r\n }\r\n /* eslint-enable no-empty */\r\n return false;\r\n})();\r\n\r\nexport function parseI3SJSON(layer, json, rootIdx, service, url, nodeCache, fnFetchNodepages) {\r\n if (!nodeCache.layerScene) {\r\n // the scene layer\r\n nodeCache.layerScene = json;\r\n nodeCache.nodesPerPage = json.nodePages && json.nodePages.nodesPerPage || 64;\r\n nodeCache.lodSelectionMetricType = json.nodePages && json.nodePages.lodSelectionMetricType;\r\n let baseUrl = url;\r\n nodeCache.layerScene.eslpk = baseUrl.indexOf('3dSceneLayer.json') >= 0;\r\n const isUrlConfigFile = baseUrl.endsWith('.json');\r\n if (isUrlConfigFile) {\r\n const lastSlash = url.lastIndexOf('/');\r\n if (lastSlash < 0) {\r\n baseUrl = './';\r\n } else {\r\n baseUrl = url.substring(0, lastSlash);\r\n }\r\n }\r\n nodeCache.layerScene.baseUrl = regulateURL(baseUrl);\r\n }\r\n const node = new I3SNode(url, rootIdx, nodeCache, layer, fnFetchNodepages);\r\n return node.load();\r\n}\r\n\r\nexport function isI3STileset(url) {\r\n return url.indexOf('i3s:tileset') >= 0;\r\n}\r\n\r\nexport function isI3SMesh(url) {\r\n return url.indexOf('i3s:mesh') >= 0;\r\n}\r\n\r\nconst prefixIndex = 'i3s:mesh:'.length\r\nexport function getI3SNodeIndex(version, url) {\r\n const id = url.substring(prefixIndex);\r\n if (version >= 1.7) {\r\n return parseInt(id);\r\n } else {\r\n return id;\r\n }\r\n\r\n}\r\n\r\nexport function getI3SNodeInfo(url, nodeCache, regl, enableDraco, forceDraco) {\r\n const isESLPK = nodeCache.layerScene.eslpk;\r\n const nodeIndex = getI3SNodeIndex(nodeCache.version, url);\r\n const node = nodeCache[nodeIndex];\r\n const baseUrl = nodeCache.layerScene.baseUrl;\r\n const meshes = [];\r\n let hasCompression = false;\r\n const transform = IDENTITY_MAT4;\r\n let geometry, material;\r\n if (nodeCache.version <= 1.6) {\r\n // 1.6\r\n if (!node.geometryData) {\r\n return null;\r\n }\r\n const len = node.geometryData.length;\r\n if (!len) {\r\n return null;\r\n }\r\n let geoUrl = baseUrl + `/nodes/${node.id}/` + node.geometryData[len - 1].href;\r\n if (isESLPK) {\r\n geoUrl += '.bin';\r\n }\r\n const meshInfo = { geometry: { url: geoUrl, info: nodeCache.layerScene.store.defaultGeometrySchema } };\r\n let textureUrl = node.textureData && node.textureData[0] && node.textureData[0].href;\r\n if (textureUrl) {\r\n const mimeType = nodeCache.layerScene.store.textureEncoding[0];\r\n let format;\r\n if (mimeType === 'image/jpeg') {\r\n format = 'jpg';\r\n } else {\r\n format = 'png';\r\n }\r\n if (isESLPK) {\r\n textureUrl += '.' + format;\r\n }\r\n const matInfo = {\r\n pbrMetallicRoughness: {\r\n baseColorTexture: {\r\n url: baseUrl + `/nodes/${node.id}/` + textureUrl,\r\n factor: 1,\r\n format,\r\n mimeType\r\n },\r\n metallicFactor: 0.0,\r\n }\r\n }\r\n meshInfo.material = matInfo;\r\n }\r\n meshes.push(meshInfo);\r\n } else {\r\n // 1.7+\r\n geometry = node.mesh.geometry;\r\n material = node.mesh.material;\r\n const geoDefinitions = nodeCache.layerScene.geometryDefinitions;\r\n //read texture encode array\r\n const textureEncoding = (nodeCache.layerScene.store || {}).textureEncoding;\r\n const geoDef = geoDefinitions[geometry.definition];\r\n const { geometryBuffers } = geoDef;\r\n // geometryBuffers[1] is the draco version\r\n hasCompression = enableDraco && geometryBuffers.length === 2;\r\n const geometryInfo = transcoders['draco'] && hasCompression ? geometryBuffers[1] : geometryBuffers[0];\r\n const index = transcoders['draco'] && hasCompression ? 1 : 0;\r\n let geoUrl = baseUrl + `/nodes/${geometry.resource}/geometries/` + index;\r\n if (isESLPK) {\r\n geoUrl += '.bin';\r\n }\r\n const meshInfo = { geometry: { url: geoUrl, info: geometryInfo } };\r\n if (forceDraco && supportWASM && hasCompression && !transcoders['draco']) {\r\n throw new Error('Must import @maptalks/transcoder.draco to load i3s draco compressed geometry');\r\n }\r\n\r\n const materialDefinitions = nodeCache.layerScene.materialDefinitions;\r\n const textureSetDefinitions = nodeCache.layerScene.textureSetDefinitions;\r\n let materialDef = 0;\r\n if (material) {\r\n materialDef = materialDefinitions[material.definition];\r\n }\r\n let materialInfo;\r\n if (materialDefinitions) {\r\n const resource = material.resource;\r\n materialInfo = parseMaterial(textureEncoding, materialDef, textureSetDefinitions, baseUrl, resource, regl, nodeCache.layerScene.eslpk);\r\n } else {\r\n materialInfo = {\r\n pbrMetallicRoughness: {\r\n metallicFactor: 0.0,\r\n }\r\n };\r\n }\r\n meshInfo.material = materialInfo;\r\n meshes.push(meshInfo);\r\n }\r\n\r\n\r\n\r\n return {\r\n dracoCompression: hasCompression,\r\n meshes,\r\n nodeIndex,\r\n center: node.obb && node.obb.center || node.mbs && [node.mbs[0], node.mbs[1], node.mbs[2]],\r\n transform\r\n };\r\n}\r\n\r\nfunction parseMaterial(textureEncoding, materialDefinition, textureSetDefinitions, baseUrl, nodeIndex, regl, isESLPK) {\r\n const matInfo = JSON.parse(JSON.stringify(materialDefinition));\r\n\r\n resolveTextures(textureEncoding, matInfo, textureSetDefinitions, baseUrl, nodeIndex, regl, isESLPK);\r\n return matInfo;\r\n}\r\n\r\nfunction resolveTextures(textureEncoding, matInfo, textureSetDefinitions, baseUrl, resource, regl, isESLPK) {\r\n for (const p in matInfo) {\r\n // is a texture\r\n if (matInfo[p] && matInfo[p].textureSetDefinitionId >= 0) {\r\n const texDef = textureSetDefinitions[matInfo[p].textureSetDefinitionId];\r\n const mimeType = 'images/' + texDef.formats[0].format;\r\n const format = getSupportedTexture(texDef.formats, regl, textureEncoding);\r\n const texture = {\r\n url: baseUrl + `/nodes/${resource}/textures/${format.name}`,\r\n factor: matInfo[p].factor === undefined ? 1 : matInfo[p].factor,\r\n format: format.format,\r\n mimeType\r\n };\r\n if (isESLPK) {\r\n let ext = '';\r\n switch (format.format) {\r\n case 'dds':\r\n ext = 'bin.dds';\r\n break;\r\n case 'jpg':\r\n case 'png':\r\n ext = format.format;\r\n break;\r\n }\r\n texture.url += '.' + ext;\r\n }\r\n matInfo[p] = texture;\r\n } else if (isObject(matInfo[p])) {\r\n resolveTextures(textureEncoding, matInfo[p], textureSetDefinitions, baseUrl, resource, regl, isESLPK);\r\n }\r\n }\r\n}\r\n\r\nconst textureEnCodingMap = {\r\n \"image/jpeg\": 'jpg',\r\n \"image/jpg\": 'jpg',\r\n \"image/png\": 'jpg',\r\n \"image/vnd-ms.dds\": \"dds\",\r\n \"image/ktx\": 'jpg'\r\n};\r\n\r\nfunction getSupportedTexture(formats, regl, textureEncoding) {\r\n if (textureEncoding && textureEncoding.length) {\r\n const textureEncode = textureEncoding[textureEncoding.length - 1];\r\n const textureFormat = textureEnCodingMap[textureEncode];\r\n if (!textureFormat) {\r\n console.error(`i3s not find texture format type from:`, textureEnCodingMap, 'current textureEncoding:', textureEncode);\r\n } else {\r\n for (let i = 0, len = formats.length; i < len; i++) {\r\n const format = formats[i].format;\r\n if (format === textureFormat) {\r\n return formats[i];\r\n }\r\n }\r\n }\r\n\r\n }\r\n // for (let i = formats.length - 1; i >= 0; i--) {\r\n for (let i = 0; i <= formats.length; i++) {\r\n const format = formats[i].format;\r\n if (format === 'dds' && regl.hasExtension('WEBGL_compressed_texture_s3tc')) {\r\n //only support dxt1 and dtx5 compression\r\n return formats[i];\r\n } else if (format === 'jpg' || format === 'png') {\r\n // png or jpg\r\n return formats[i];\r\n } else if (format === 'ktx2' && supportKTX2) {\r\n return formats[i];\r\n } else if (format === 'ktx-etc2') {\r\n // not supported yet\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction regulateURL(url) {\r\n return url.split('?')[0];\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { reshader, CanvasCompatible } from '@maptalks/gl';\r\nimport { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\r\nimport { MaskRendererMixin } from '@maptalks/gl';\r\nimport Geo3DTilesWorkerConnection from '../Geo3DTilesWorkerConnection';\r\nimport LRUCache from './LRUCache';\r\nimport TileMeshPainter from './TileMeshPainter';\r\nimport { readBatchArray } from '../../common/TileHelper';\r\nimport { extend, isBase64, base64URLToArrayBuffer, pushIn } from '../../common/Util.js';\r\nimport { isRelativeURL, prepareFetchOptions } from '../../common/UrlUtil';\r\n// import { CANDIDATE_MAX_ERROR } from '../../common/Constants.js';\r\nimport { parseI3SJSON, isI3STileset, isI3SMesh, getI3SNodeInfo } from '../i3s/I3SHelper';\r\nimport { fillNodepagesToCache } from '../i3s/Util';\r\nimport I3SNode from '../i3s/I3SNode';\r\n\r\nconst { Ajax } = getGLTFLoaderBundle();\r\n\r\nconst COORD_IN = new maptalks.Coordinate(0, 0);\r\nconst COORD_OUT = new maptalks.Coordinate(0, 0);\r\n\r\nconst REPORTED_ERRORS = new Set();\r\n\r\nconst EMPTY_ARRAY = [];\r\n\r\nconst GlobalTieCache = new LRUCache((maptalks.Browser.mobile ? 32 : 1024) * 1024 * 1024, (tile => {\r\n const renderer = tile.renderer;\r\n delete tile.renderer;\r\n renderer.deleteTile(tile);\r\n}));\r\nlet TileCacheRefCount = 0;\r\n\r\n\r\n\r\nexport default class Geo3DTilesRenderer extends MaskRendererMixin(CanvasCompatible(maptalks.renderer.LayerAbstractRenderer)) {\r\n\r\n constructor(layer) {\r\n super(layer);\r\n const max = layer.options['maxGPUMemory'] * 1024 * 1024;\r\n if (max > GlobalTieCache.max) {\r\n GlobalTieCache.setMaxSize(max);\r\n }\r\n this.tileCache = GlobalTieCache;\r\n TileCacheRefCount++;\r\n this.tilesLoading = {};\r\n this._requests = {};\r\n this._modelQueue = [];\r\n this._fnFetchNodepages = (...args) => {\r\n return this._fetchI3DNodepages.call(this, ...args);\r\n };\r\n }\r\n\r\n getAnalysisMeshes() {\r\n if (!this.painter) {\r\n return EMPTY_ARRAY;\r\n }\r\n const paintedMeshes = this.painter.getPaintedMeshes();\r\n if (!paintedMeshes) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n const meshes = [];\r\n const { b3dmMeshes, pntsMeshes, i3dmMeshes } = paintedMeshes;\r\n if (b3dmMeshes.length) {\r\n pushIn(meshes, b3dmMeshes.filter(mesh => !!(mesh && mesh.geometry)));\r\n }\r\n if (pntsMeshes.length) {\r\n pushIn(meshes, pntsMeshes.filter(mesh => !!(mesh && mesh.geometry)));\r\n }\r\n if (i3dmMeshes.length) {\r\n pushIn(meshes, i3dmMeshes.filter(mesh => !!(mesh && mesh.geometry)));\r\n }\r\n return meshes;\r\n }\r\n\r\n needToRedraw() {\r\n // return true;\r\n const map = this.getMap();\r\n if (map.isInteracting()) {\r\n return true;\r\n }\r\n if (this._modelQueue.length) {\r\n return true;\r\n }\r\n return super.needToRedraw();\r\n }\r\n\r\n getFrameTimestamp() {\r\n return this._timestamp;\r\n }\r\n\r\n drawOnInteracting(event, timestamp, parentContext) {\r\n this.draw(timestamp, parentContext);\r\n }\r\n\r\n draw(timestamp, parentContext) {\r\n this._timestamp = timestamp;\r\n const mask2DExtent = this.prepareCanvas();\r\n if (mask2DExtent) {\r\n if (!mask2DExtent.intersects(this.canvasExtent2D)) {\r\n this.completeRender();\r\n return;\r\n }\r\n }\r\n const { root, tiles } = this.layer.getTiles();\r\n const count = tiles.length;\r\n if (!tiles || !count) {\r\n this.completeRender();\r\n return;\r\n }\r\n this.painter.prepareRender(parentContext);\r\n this._consumeI3SQueue();\r\n this._consumeModelQueue(parentContext);\r\n const { selectedTiles, requests } = this._selectTiles(root, tiles);\r\n\r\n if (requests.length) {\r\n this.loadTiles(requests);\r\n }\r\n this._drawTiles(selectedTiles, parentContext);\r\n this._abortUnusedTiles();\r\n if (!requests.length) {\r\n this.completeRender();\r\n }\r\n }\r\n // 遍历candidate瓦片,检查哪些可以获取到mesh,哪些需要去构造网络请求\r\n _selectTiles(root, tiles) {\r\n let requests = [];\r\n this._markTiles();\r\n let preLoadingCount = 0;\r\n const loadingLimit = this._getLoadLimit();\r\n\r\n const checked = {};\r\n let hit = false, loading = false;\r\n for (let i = 0; i < tiles.length; i++) {\r\n const tile = tiles[i];\r\n const node = tile.node;\r\n if (checked[node.id]) {\r\n continue;\r\n }\r\n checked[node.id] = 1;\r\n let tileLoading = false;\r\n const cached = this.getCachedTile(node.id);\r\n if (this._isLoadingTile(node.id)) {\r\n preLoadingCount++;\r\n tileLoading = loading = true;\r\n this.tilesLoading[node.id].current = true;\r\n } else if (cached) {\r\n if (this.getTileOpacity(cached) < 1) {\r\n tileLoading = loading = true;\r\n }\r\n // 剔除掉error相差过大的父级瓦片。否则会在有些情况下,覆盖范围很大的父级瓦片会绘制在场景中\r\n // 是在小丸子公司,由飞渡生成的模型中发现了该问题\r\n // if (!tile.node._error || rootNode.isS3M || !tile.node.children || tile.node._error <= CANDIDATE_MAX_ERROR) {\r\n\r\n // }\r\n hit = true;\r\n tile.selected = true;\r\n tile.data = cached;\r\n } else if (!this.painter.has(node)) {\r\n tileLoading = loading = true;\r\n requests.push(node);\r\n }\r\n if (!tileLoading) {\r\n continue;\r\n }\r\n //background tiles\r\n const parentTile = this._selectParentTile(tile);\r\n if (!parentTile) {\r\n const children = this._selectChildTile(tile);\r\n if (children.length) hit = true;\r\n } else {\r\n hit = true;\r\n }\r\n }\r\n\r\n const selectedTiles = hit ? this._sortTiles(root) : [];\r\n\r\n if (requests.length > 1) {\r\n requests.sort(compareRequests);\r\n if (loadingLimit) {\r\n const count = loadingLimit - preLoadingCount;\r\n if (count > 0) {\r\n requests = requests.slice(0, count);\r\n } else {\r\n requests = [];\r\n }\r\n }\r\n }\r\n\r\n return {\r\n loading,\r\n requests,\r\n selectedTiles\r\n };\r\n }\r\n\r\n //based on Cesium's traverseAndSelect in Cesium3DTilesetTraversal.js\r\n _sortTiles(root) {\r\n const selectedTiles = [];\r\n let lastAncestor;\r\n let branchRootId;\r\n const stack = [root],\r\n parentStack = [];\r\n while (stack.length > 0 || parentStack.length > 0) {\r\n if (parentStack.length > 0) {\r\n const waitingTile = parentStack[parentStack.length - 1];\r\n if (waitingTile._stackLength === stack.length) {\r\n parentStack.pop();\r\n if (waitingTile === lastAncestor) {\r\n waitingTile.leave = true;\r\n }\r\n waitingTile.branchRootId = branchRootId;\r\n selectedTiles.push(waitingTile);\r\n if (parentStack.length === 0) {\r\n branchRootId = null;\r\n }\r\n continue;\r\n }\r\n }\r\n const tile = stack.pop();\r\n const children = tile.children;\r\n if (tile.selected) {\r\n if (tile.node.refine === 'add') {\r\n tile.leave = true;\r\n tile.selectionDepth = parentStack.length;\r\n tile.branchRootId = branchRootId;\r\n selectedTiles.push(tile);\r\n } else {\r\n tile.selectionDepth = parentStack.length;\r\n\r\n lastAncestor = tile;\r\n\r\n if (children.length === 0) {\r\n tile.leave = true;\r\n tile.branchRootId = branchRootId;\r\n selectedTiles.push(tile);\r\n continue;\r\n }\r\n if (parentStack.length === 0) {\r\n branchRootId = tile.node.id;\r\n }\r\n parentStack.push(tile);\r\n tile._stackLength = stack.length;\r\n }\r\n }\r\n // if (children.length > 1) {\r\n // children.sort(compareTile);\r\n // }\r\n for (let i = 0; i < children.length; i++) {\r\n stack.push(children[i]);\r\n }\r\n }\r\n\r\n return selectedTiles;\r\n }\r\n\r\n _selectParentTile(node) {\r\n if (!node.parent) {\r\n return null;\r\n }\r\n let treeNode = node.parent;\r\n while (treeNode && treeNode.level >= 0) {\r\n const id = treeNode.node.id;\r\n const cached = this.tileCache.has(id);\r\n if (cached) {\r\n treeNode.selected = true;\r\n treeNode.data = this.tileCache.get(id);\r\n return treeNode;\r\n }\r\n treeNode = treeNode.parent;\r\n }\r\n return null;\r\n }\r\n\r\n _selectChildTile(tile) {\r\n const result = [];\r\n if (!tile.node.children || !tile.node.children.length) {\r\n return result;\r\n }\r\n const maxLevel = tile._level + 1;\r\n const queue = [tile.node];\r\n while (queue.length > 0) {\r\n const node = queue.pop();\r\n const children = node.children;\r\n for (let i = 0, l = children.length; i < l; i++) {\r\n if ((!children[i].content || !children[i].content.url) &&\r\n children[i].children && children[i].children.length) {\r\n queue.push(children[i]);\r\n continue;\r\n }\r\n const id = children[i].id;\r\n const cached = this.tileCache.has(id);\r\n if (cached) {\r\n const child = this.layer._createCandidate(children[i], tile);\r\n child.selected = true;\r\n child.data = this.tileCache.get(id);\r\n tile.children.push(child);\r\n result.push(child);\r\n } else if (children[i]._level <= maxLevel) {\r\n queue.push(children[i]);\r\n }\r\n }\r\n\r\n }\r\n return result;\r\n }\r\n\r\n _drawTiles(tiles, parentContext) {\r\n\r\n this.tileCache.markAll(this, false);\r\n const boxMeshes = [];\r\n for (let i = 0, l = tiles.length; i < l; i++) {\r\n const tileData = tiles[i].data;\r\n tileData.current = true;\r\n tileData.renderer = this;\r\n this.tileCache.add(tiles[i].node.id, tileData);\r\n const node = tileData.node;\r\n const service = this.layer._getNodeService(node._rootIdx);\r\n if (node._boxMesh && service['debug'] && !Array.isArray(service['debug'])) {\r\n boxMeshes.push(node._boxMesh);\r\n }\r\n }\r\n\r\n const services = this.layer.options.services;\r\n for (let i = 0; i < services.length; i++) {\r\n const service = services[i];\r\n const debugNodes = Array.isArray(service['debug']) && service['debug'];\r\n if (debugNodes) {\r\n for (const nodeId of debugNodes) {\r\n const nodeBox = this.layer._getNodeBox(nodeId);\r\n const node = nodeBox && nodeBox.node;\r\n if (!node || !node._boxMesh) {\r\n continue;\r\n }\r\n boxMeshes.push(node._boxMesh);\r\n }\r\n }\r\n }\r\n\r\n const context = { tiles };\r\n this.onDrawTileStart(context);\r\n const count = this.painter.paint(tiles, boxMeshes, parentContext);\r\n this.layer.fire('drawtiles', { count });\r\n\r\n this.onDrawTileEnd(context);\r\n if (count) {\r\n this.layer.fire('canvasisdirty', { renderCount: count });\r\n }\r\n // 改为绘制结束后,再 shrink cache,以免当前帧需要绘制的瓦片被delete掉, maptalks/issues#766\r\n this.tileCache.shrink();\r\n }\r\n\r\n onDrawTileStart() { }\r\n onDrawTileEnd() { }\r\n\r\n loadTiles(queue) {\r\n for (let i = 0, l = queue.length; i < l; i++) {\r\n const node = queue[i];\r\n // tile image's loading may not be async\r\n this.tilesLoading[node.id] = {\r\n current: true,\r\n node\r\n };\r\n this.loadTile(node);\r\n }\r\n }\r\n\r\n loadTile(node) {\r\n let url = node.content.url;\r\n if (isBase64(url)) {\r\n const binary = base64URLToArrayBuffer(url);\r\n this._loadTileContent(url, binary, node);\r\n return null;\r\n\r\n }\r\n\r\n if (isI3STileset(url)) {\r\n const rootIdx = node._rootIdx;\r\n const nodeCache = this._i3sNodeCache[rootIdx];\r\n const i3sNode = new I3SNode(url, rootIdx, nodeCache, this.layer, this._fnFetchNodepages);\r\n return i3sNode.load().then(tileset => {\r\n this.onTilesetLoad(tileset, node, url);\r\n });\r\n }\r\n\r\n if (node && isRelativeURL(url) && !isI3SMesh(url)) {\r\n url = node.baseUrl + url;\r\n }\r\n this._loadTileContent(url, null, node);\r\n return null;\r\n }\r\n\r\n _loadTileContent(url, arraybuffer, tile) {\r\n let supportedFormats = this._supportedFormats;\r\n if (!supportedFormats) {\r\n supportedFormats = reshader.Util.getSupportedFormats(this.gl || this.device && this.device.wgpu);\r\n this._supportedFormats = supportedFormats;\r\n }\r\n\r\n const service = this.layer._getNodeService(tile._rootIdx);\r\n if (service.isSuperMapiServer) {\r\n url = encodeSuperMapURI(url, tile.baseUrl);\r\n }\r\n const requestUrl = this.layer.getTileUrl(url, this.layer._roots[tile._rootIdx]);\r\n const params = { url: requestUrl, arraybuffer, rootIdx: tile._rootIdx, upAxis: tile._upAxis, transform: tile.matrix, supportedFormats };\r\n\r\n if (isI3SMesh(url)) {\r\n const nodeCache = this._i3sNodeCache[tile._rootIdx];\r\n params.projection = nodeCache.projection;\r\n params.i3sInfo = getI3SNodeInfo(url, nodeCache, this.regl || this.device, this.layer.options['enableI3SCompressedGeometry'], this.layer.options['forceI3SCompressedGeometry']);\r\n if (!params.i3sInfo) {\r\n this.onTileError({ status: 404 }, tile, url);\r\n return;\r\n }\r\n }\r\n\r\n // if (url.substring(url.length - 4, url.length) === 'b3dm') {\r\n // url = 'http://localhost/3dtiles/debug/xx/tile0/3/2/6.b3dm';\r\n // }\r\n params.service = extend({}, service);\r\n if (service.offset) {\r\n delete params.service.offset;\r\n }\r\n // fetchOptions定义在service中\r\n params.referrer = window && window.location.href;\r\n this.workerConn.loadTile(this.layer.getId(), params, (err, data) => {\r\n if (err) {\r\n this.onTileError(err, tile, url);\r\n return;\r\n }\r\n const { magic } = data;\r\n if (magic === 'b3dm' || magic === 'pnts' || magic === 'i3dm' || magic === 'cmpt' || magic === 'gltf') {\r\n this._modelQueue.push({ data, tile });\r\n } else {\r\n this.onTilesetLoad(data, tile, url);\r\n }\r\n\r\n // if (magic === 'b3dm') {\r\n // // this.painter.createB3DMMesh(data, tile.id, tile, (err, { mesh }) => {\r\n // // this._onMeshCreated(data, tile, err, mesh);\r\n // // });\r\n // } else if (magic === 'pnts') {\r\n // this.painter.createPntsMesh(data, tile.id, tile, (err, { mesh }) => {\r\n // this._onMeshCreated(data, tile, err, mesh);\r\n // });\r\n // } else if (magic === 'i3dm') {\r\n // this.painter.createI3DMMesh(data, tile.id, tile, (err, { mesh }) => {\r\n // this._onMeshCreated(data, tile, err, mesh);\r\n // });\r\n // } else if (magic === 'cmpt') {\r\n // this.painter.createCMPTMesh(data, tile.id, tile, (err, { mesh }) => {\r\n // this._onMeshCreated(data, tile, err, mesh);\r\n // });\r\n // }else {\r\n // this.onTilesetLoad(data, tile, url);\r\n // }\r\n });\r\n }\r\n\r\n _createBoxMesh(node) {\r\n if (!this.painter) {\r\n return;\r\n }\r\n this.painter._createBoxMesh(node);\r\n }\r\n\r\n _deleteBoxMesh(node) {\r\n if (!this.painter) {\r\n return;\r\n }\r\n this.painter._deleteBoxMesh(node);\r\n }\r\n\r\n _consumeModelQueue() {\r\n const map = this.getMap();\r\n const limit = this.layer.options['meshLimitPerFrame'];\r\n let count = 0;\r\n while (this._modelQueue.length && (count < limit || !map.isInteracting())) {\r\n const { data, tile } = this._modelQueue.shift();\r\n const { magic } = data;\r\n if (magic === 'b3dm' || magic === 'gltf') {\r\n this.painter.createB3DMMesh(data, tile.id, tile, (err, { mesh }) => {\r\n this._onMeshCreated(data, tile, err, mesh);\r\n });\r\n } else if (magic === 'pnts') {\r\n this.painter.createPntsMesh(data, tile.id, tile, (err, { mesh }) => {\r\n this._onMeshCreated(data, tile, err, mesh);\r\n });\r\n } else if (magic === 'i3dm') {\r\n this.painter.createI3DMMesh(data, tile.id, tile, (err, { mesh }) => {\r\n this._onMeshCreated(data, tile, err, mesh);\r\n });\r\n } else if (magic === 'cmpt') {\r\n this.painter.createCMPTMesh(data, tile.id, tile, (err, { mesh }) => {\r\n this._onMeshCreated(data, tile, err, mesh);\r\n });\r\n }\r\n count++;\r\n }\r\n }\r\n\r\n _onMeshCreated(data, tile, err, mesh) {\r\n this._enableLayerOpacity(mesh);\r\n if (err) {\r\n this.onTileError(err, tile);\r\n } else {\r\n const size = this._getMeshSize(mesh);\r\n tile.memorySize = size;\r\n this.onTileLoad(data, tile);\r\n }\r\n }\r\n\r\n _enableLayerOpacity(mesh) {\r\n if (Array.isArray(mesh)) {\r\n for (let i = 0; i < mesh.length; i++) {\r\n if (mesh[i]) {\r\n if (Array.isArray(mesh[i])) {\r\n this._enableLayerOpacity(mesh[i]);\r\n } else {\r\n const defines = mesh[i].defines || {};\r\n defines['HAS_LAYER_OPACITY'] = 1;\r\n mesh[i].setDefines(defines);\r\n }\r\n }\r\n }\r\n } else if (mesh) {\r\n if (Array.isArray(mesh)) {\r\n this._enableLayerOpacity(mesh);\r\n } else {\r\n const defines = mesh.defines || {};\r\n defines['HAS_LAYER_OPACITY'] = 1;\r\n mesh.setDefines(defines);\r\n }\r\n }\r\n }\r\n\r\n _getMeshSize(mesh) {\r\n let size = 0;\r\n if (Array.isArray(mesh)) {\r\n for (let i = 0; i < mesh.length; i++) {\r\n if (mesh[i]) {\r\n size += this._getMeshSize(mesh[i]);\r\n }\r\n }\r\n } else if (mesh) {\r\n size += mesh.getMemorySize();\r\n }\r\n return size;\r\n }\r\n\r\n onTileLoad(b3dm, node) {\r\n if (!this.layer) {\r\n return;\r\n }\r\n delete this.tilesLoading[node.id];\r\n this.layer.onTileLoad(b3dm, node);\r\n this._addTileToCache(node);\r\n this.setToRedraw();\r\n /**\r\n * tileload event, fired when tile is loaded.\r\n *\r\n * @event Geo3DTilesLayer#tileload\r\n * @type {Object}\r\n * @property {String} type - tileload\r\n * @property {Geo3DTilesLayer} target - tile layer\r\n * @property {Object} node - 3d tile node\r\n */\r\n this.layer.fire('tileload', { node });\r\n }\r\n\r\n onTilesetLoad(tileset, parent, url) {\r\n if (!this.layer) {\r\n return;\r\n }\r\n this.layer._vertexCompressionType = tileset.extensions && tileset.extensions['s3m:VertexCompressionType'];\r\n if (tileset.capabilities || tileset.layers && tileset.layers[0] && tileset.layers[0].capabilities) {\r\n //如果是i3s scene layer,还要再次请求root node信息\r\n this._parseI3SSceneLayer(tileset, parent, url);\r\n return;\r\n }\r\n delete this.tilesLoading[parent.id];\r\n this.layer.onTilesetLoad(tileset, parent, url);\r\n }\r\n\r\n onTileError(err, node, errorUrl) {\r\n if (!this.layer) {\r\n return;\r\n }\r\n // debugger\r\n const url = errorUrl || node.content.url;\r\n\r\n const info = err && err.message || err;\r\n if ((!err || err.status !== 404 && err.status !== 204) && !REPORTED_ERRORS.has(info)) {\r\n console.warn('failed to load 3d tile: ' + url);\r\n console.warn(err);\r\n REPORTED_ERRORS.add(info);\r\n }\r\n\r\n\r\n // const emptyB3DM = gltf.B3DMLoader.createEmptyB3DM();\r\n // emptyB3DM.loadTime = 0;\r\n delete this.tilesLoading[node.id];\r\n if (!this.layer.options['onlyCacheNoContentTileWhenError'] || err && !maptalks.Util.isNoContentHttpCode(err.status)) {\r\n this._addErrorToCache(node, err);\r\n }\r\n // this.setToRedraw();\r\n /**\r\n * tileerror event, fired when tile loading has error.\r\n *\r\n * @event Geo3DTilesLayer#tileerror\r\n * @type {Object}\r\n * @property {String} type - tileerror\r\n * @property {Geo3DTilesLayer} target - tile layer\r\n * @property {Object} node - 3d tile node\r\n * @property {Error} error - error message\r\n */\r\n this.layer.fire('tileerror', { node, error: err });\r\n }\r\n\r\n getCachedTile(id) {\r\n return this.tileCache.get(id);\r\n }\r\n\r\n getShadowMeshes() {\r\n if (!this.painter) {\r\n return [];\r\n }\r\n const meshes = [];\r\n const b3dmMeshes = this.painter.getCurrentB3DMMeshes();\r\n\r\n for (const p in b3dmMeshes) {\r\n if (b3dmMeshes[p] && b3dmMeshes[p].isValid && b3dmMeshes[p].isValid()) {\r\n meshes.push(b3dmMeshes[p]);\r\n }\r\n }\r\n const i3dmMeshes = this.painter.getCurrentI3DMMeshes();\r\n for (const p in i3dmMeshes) {\r\n if (i3dmMeshes[p] && i3dmMeshes[p].isValid && i3dmMeshes[p].isValid()) {\r\n meshes.push(i3dmMeshes[p]);\r\n }\r\n }\r\n return meshes;\r\n }\r\n\r\n _addErrorToCache(node, err) {\r\n const tileData = {\r\n // image : data,\r\n loadTime: maptalks.Util.now(),\r\n current: true,\r\n error: err,\r\n node\r\n };\r\n tileData.renderer = this;\r\n this.tileCache.add(node.id, tileData);\r\n }\r\n\r\n _addTileToCache(node) {\r\n const tileData = {\r\n // image : data,\r\n loadTime: maptalks.Util.now(),\r\n current: true,\r\n node\r\n };\r\n tileData.renderer = this;\r\n this.tileCache.add(node.id, tileData);\r\n }\r\n\r\n abortTileLoading(tile) {\r\n if (!tile || !this.workerConn) return;\r\n const url = tile.node.content.url;\r\n this.workerConn.abortTileLoading(this.layer.getId(), url);\r\n delete this._requests[url];\r\n }\r\n\r\n _markTiles() {\r\n if (this.tilesLoading) {\r\n for (const p in this.tilesLoading) {\r\n this.tilesLoading[p].current = false;\r\n }\r\n }\r\n }\r\n\r\n deleteTile(tile) {\r\n this.painter.deleteTile(tile);\r\n }\r\n\r\n initContext() {\r\n super.initContext();\r\n const layer = this.layer;\r\n const { regl, reglGL, device } = this.context;\r\n this.regl = regl;\r\n this.device = device;\r\n this.gl = reglGL;\r\n const graphics = regl || device;\r\n this.prepareWorker();\r\n this.canvas.pickingFBO = this.canvas.pickingFBO || graphics.framebuffer(this.canvas.width, this.canvas.height);\r\n this.pickingFBO = this.canvas.pickingFBO || graphics.framebuffer(this.canvas.width, this.canvas.height);\r\n this.painter = new TileMeshPainter(graphics, layer);\r\n\r\n this.layer._resumeHighlights();\r\n this.layer.fire('contextcreate', { regl, device });\r\n }\r\n\r\n prepareWorker() {\r\n const map = this.getMap();\r\n if (!this.workerConn) {\r\n this.workerConn = new Geo3DTilesWorkerConnection('@maptalks/3dtiles', map.id, reshader.Util.supportNPOT(this.regl || this.device));\r\n }\r\n const workerConn = this.workerConn;\r\n //setTimeout in case layer's style is set to layer after layer's creating.\r\n if (!workerConn.isActive()) {\r\n return;\r\n }\r\n let options = this.layer.options || {};\r\n options = extend({}, options);\r\n delete options['offset'];\r\n const spatialReference = map.options.spatialReference;\r\n options.projection = spatialReference && spatialReference.coordType || spatialReference && spatialReference.projection || map.getSpatialReference().getProjection().code;\r\n const id = this.layer.getId();\r\n workerConn.addLayer(id, options, err => {\r\n if (err) throw err;\r\n if (!this.layer) return;\r\n this.ready = true;\r\n this.layer.fire('workerready');\r\n });\r\n }\r\n\r\n onRemove() {\r\n if (this.painter) {\r\n this.painter.remove();\r\n }\r\n if (this.pickingFBO) {\r\n if (!this.canvas.pickingFBO) {\r\n this.pickingFBO.destroy();\r\n }\r\n delete this.pickingFBO;\r\n }\r\n if (this.workerConn) {\r\n this.workerConn.removeLayer(this.layer.getId(), err => {\r\n if (err) throw err;\r\n });\r\n this.workerConn.remove();\r\n delete this.workerConn;\r\n }\r\n TileCacheRefCount--;\r\n if (!TileCacheRefCount) {\r\n GlobalTieCache.reset();\r\n }\r\n this.clear();\r\n delete this.tileCache;\r\n delete this.gl;\r\n delete this.regl;\r\n super.onRemove();\r\n }\r\n\r\n clear() {\r\n this._abortUnusedTiles(true);\r\n this.tileCache.reset(this);\r\n this.tilesLoading = {};\r\n super.clear();\r\n }\r\n\r\n getTileOpacity(/* tileData */) {\r\n return 1;\r\n // if (!this.layer.options['fadeAnimation'] || !tileData.loadTime) {\r\n // return 1;\r\n // }\r\n // return Math.min(1, (maptalks.Util.now() - tileData.loadTime) / (1000 / 60 * 10));\r\n }\r\n\r\n getStencilValue() {\r\n return 0;\r\n }\r\n\r\n _abortUnusedTiles(force) {\r\n if (!this._preRetireTime) {\r\n this._preRetireTime = Date.now();\r\n }\r\n const now = Date.now();\r\n if (!force && now - this._preRetireTime < this.layer.options['retireInterval']) {\r\n return;\r\n }\r\n this._preRetireTime = now;\r\n const aborted = [];\r\n for (const i in this.tilesLoading) {\r\n const node = this.tilesLoading[i];\r\n if (force || !node.current) {\r\n aborted.push(i);\r\n // abort loading tiles\r\n this.abortTileLoading(node);\r\n // if (this.painter.has(node)) {\r\n // this.painter.deleteTile(node);\r\n // }\r\n }\r\n }\r\n\r\n for (let i = 0; i < aborted.length; i++) {\r\n delete this.tilesLoading[aborted[i]];\r\n }\r\n }\r\n\r\n // limit tile number to load when map is interacting\r\n _getLoadLimit() {\r\n if (this.getMap().isInteracting()) {\r\n return this.layer.options['loadingLimitOnInteracting'];\r\n }\r\n return this.layer.options['loadingLimit'];\r\n }\r\n\r\n _createGLContext(canvas, options) {\r\n const names = ['webgl', 'experimental-webgl'];\r\n let context = null;\r\n /* eslint-disable no-empty */\r\n for (let i = 0; i < names.length; ++i) {\r\n try {\r\n context = canvas.getContext(names[i], options);\r\n } catch (e) { }\r\n if (context) {\r\n break;\r\n }\r\n }\r\n return context;\r\n /* eslint-enable no-empty */\r\n }\r\n\r\n _isLoadingTile(tileId) {\r\n return !!this.tilesLoading[tileId];\r\n }\r\n\r\n getI3DMMeshes() {\r\n return this.painter.getI3DMMeshes();\r\n }\r\n\r\n getPNTSMeshes() {\r\n return this.painter.getPNTSMeshes();\r\n }\r\n\r\n getB3DMMeshes() {\r\n return this.painter.getB3DMMeshes();\r\n }\r\n\r\n readBatchData(batch, bin, count) {\r\n return readBatchArray(batch, bin, 0, count);\r\n }\r\n\r\n _consumeI3SQueue() {\r\n if (!this._i3sRequests) {\r\n return;\r\n }\r\n const limit = this.layer.options['i3sNodepageLimitPerFrame'] || Number.MAX_VALUE;\r\n let count = 0;\r\n const promises = [];\r\n for (const url in this._i3sRequests) {\r\n const callbacks = this._i3sRequests[url];\r\n if (callbacks.status === 'pending') {\r\n continue;\r\n }\r\n callbacks.status = 'pending';\r\n const rootIdx = callbacks.rootIdx;\r\n const service = this.layer._getNodeService(rootIdx);\r\n const fetchOptions = prepareFetchOptions(service.fetchOptions);\r\n promises.push(Ajax.getJSON(url, fetchOptions).then(json => {\r\n delete this._i3sRequests[url];\r\n const nodeCache = this._i3sNodeCache[rootIdx];\r\n if (!nodeCache) {\r\n this.setToRedraw();\r\n return;\r\n }\r\n if (json.nodes) {\r\n // 1.7, 1.8\r\n fillNodepagesToCache(nodeCache, json.nodes);\r\n } else {\r\n // 1.6\r\n nodeCache[json.id] = json;\r\n fillNodepagesToCache(nodeCache, json.children);\r\n }\r\n\r\n for (let i = 0; i < callbacks.length; i++) {\r\n callbacks[i]();\r\n }\r\n this.setToRedraw();\r\n }));\r\n count++;\r\n if (count >= limit) {\r\n break;\r\n }\r\n }\r\n if (promises.length) {\r\n Promise.all(promises);\r\n }\r\n }\r\n\r\n _fetchI3DNodepages(rootIdx, url, cb) {\r\n if (!this._i3sRequests) {\r\n this._i3sRequests = {};\r\n }\r\n this._i3sRequests[url] = this._i3sRequests[url] || [];\r\n this._i3sRequests[url].rootIdx = rootIdx;\r\n this._i3sRequests[url].push(cb);\r\n this.setToRedraw();\r\n }\r\n\r\n _parseI3SSceneLayer(tileset, parent, url) {\r\n if (!this._i3sNodeCache) {\r\n this._i3sNodeCache = [];\r\n }\r\n const rootIdx = parent._rootIdx;\r\n if (!this._i3sNodeCache[rootIdx]) {\r\n this._i3sNodeCache[rootIdx] = {};\r\n }\r\n const nodeCache = this._i3sNodeCache[rootIdx];\r\n const service = this.layer._getNodeService(rootIdx);\r\n if (tileset.layers) {\r\n tileset = tileset.layers[0];\r\n if (url[url.length - 1] !== '/') {\r\n url += '/';\r\n }\r\n url = url + 'layers/0'\r\n }\r\n nodeCache.version = +(service.i3sVersion || tileset.store.version);\r\n if (tileset.spatialReference && (!tileset.spatialReference.wkid || tileset.spatialReference.wkid !== 4326)) {\r\n console.warn('i3s has a spatialReference other than 4326.', tileset.spatialReference);\r\n }\r\n if (tileset.spatialReference && tileset.spatialReference.wkid === 4490) {\r\n console.warn('i3s spatialReference is 4490,auto set spatialReference to 4326,This may cause some location issues, please ensure that your service is 4326');\r\n tileset.spatialReference.wkid = 4326;\r\n }\r\n nodeCache.projection = tileset.spatialReference;\r\n parseI3SJSON(this.layer, tileset, rootIdx, service, url, nodeCache, this._fnFetchNodepages).then(json => {\r\n this.onTilesetLoad(json, parent, url);\r\n });\r\n }\r\n\r\n pick(x, y, options) {\r\n if (!this.painter) {\r\n return [];\r\n }\r\n const pickingFBO = this.pickingFBO;\r\n const { width, height } = this.canvas;\r\n if (this.pickingFBO && (pickingFBO.width !== width || pickingFBO.height !== height)) {\r\n pickingFBO.resize(width, height);\r\n }\r\n //TODO webgpu不支持sync read\r\n return this.painter.pick(x, y, options && options.tolerance);\r\n }\r\n\r\n highlight(highlights) {\r\n if (!this._highlighted) {\r\n this._highlighted = [];\r\n }\r\n if (Array.isArray(highlights)) {\r\n for (let i = 0; i < highlights.length; i++) {\r\n const service = highlights[i].service || 0;\r\n let serviceHighs = this._highlighted[service];\r\n if (!serviceHighs) {\r\n serviceHighs = this._highlighted[service] = new Map();\r\n }\r\n serviceHighs.set(highlights[i].id, highlights[i]);\r\n }\r\n } else {\r\n const service = highlights.service || 0;\r\n let serviceHighs = this._highlighted[service];\r\n if (!serviceHighs) {\r\n serviceHighs = this._highlighted[service] = new Map();\r\n }\r\n serviceHighs.set(highlights.id, highlights);\r\n }\r\n\r\n this.painter.highlight(this._highlighted);\r\n }\r\n\r\n cancelHighlight(service, ids) {\r\n if (!this._highlighted) {\r\n return;\r\n }\r\n const serviceHighs = this._highlighted[service];\r\n if (!serviceHighs) {\r\n return;\r\n }\r\n if (Array.isArray(ids)) {\r\n for (let i = 0; i < ids.length; i++) {\r\n serviceHighs.delete(ids[i]);\r\n }\r\n } else {\r\n serviceHighs.delete(ids);\r\n }\r\n if (!serviceHighs.size) {\r\n this._highlighted[service] = null;\r\n }\r\n this.painter.highlight(this._highlighted);\r\n }\r\n\r\n cancelAllHighlight() {\r\n delete this._highlighted;\r\n this.painter.cancelAllHighlight();\r\n }\r\n\r\n showOnly(items) {\r\n if (!this._showOnlys) {\r\n this._showOnlys = [];\r\n }\r\n if (Array.isArray(items)) {\r\n for (let i = 0; i < items.length; i++) {\r\n const service = items[i].service || 0;\r\n let serviceShowOnlys = this._showOnlys[service];\r\n if (!serviceShowOnlys) {\r\n serviceShowOnlys = this._showOnlys[service] = new Map();\r\n }\r\n serviceShowOnlys.set(items[i].id, items[i]);\r\n }\r\n } else {\r\n const service = items.service || 0;\r\n let serviceShowOnlys = this._showOnlys[service];\r\n if (!serviceShowOnlys) {\r\n serviceShowOnlys = this._showOnlys[service] = new Map();\r\n }\r\n serviceShowOnlys.set(items.id, items);\r\n }\r\n\r\n this.painter.showOnly(this._showOnlys);\r\n }\r\n\r\n cancelShowOnly() {\r\n delete this._showOnlys;\r\n this.painter.cancelShowOnly();\r\n }\r\n\r\n _getCurrentBatchIDs() {\r\n if (!this.painter) {\r\n return [];\r\n }\r\n return this.painter._getCurrentBatchIDs();\r\n }\r\n\r\n _tileCoordToLngLat(out, position) {\r\n const map = this.getMap();\r\n const code = map.getProjection().code.toLowerCase();\r\n if (code === 'identity') {\r\n const projection = this._getCoordProjection();\r\n COORD_IN.set(position[0], position[1]);\r\n projection.unproject(COORD_IN, COORD_OUT);\r\n out[0] = COORD_OUT.x;\r\n out[1] = COORD_OUT.y;\r\n return out;\r\n } else {\r\n COORD_IN.set(position[0], position[1]);\r\n map.getProjection().unproject(COORD_IN, COORD_OUT);\r\n out[0] = COORD_OUT.x;\r\n out[1] = COORD_OUT.y;\r\n return out;\r\n }\r\n }\r\n\r\n _lngLatToIdentityCoord(out, position) {\r\n const projection = this._getCoordProjection();\r\n COORD_IN.set(position[0], position[1]);\r\n projection.project(COORD_IN, COORD_OUT);\r\n out[0] = COORD_OUT.x;\r\n out[1] = COORD_OUT.y;\r\n return out;\r\n }\r\n\r\n _identityCoordToLngLat(out, coord) {\r\n const projection = this._getCoordProjection();\r\n COORD_IN.set(coord[0], coord[1]);\r\n projection.unproject(COORD_IN, COORD_OUT);\r\n out[0] = COORD_OUT.x;\r\n out[1] = COORD_OUT.y;\r\n return out;\r\n }\r\n\r\n _getCoordProjection() {\r\n const map = this.getMap();\r\n const coordType = map.options.spatialReference.coordType;\r\n if (!coordType) {\r\n throw new Error('Missing coordType in map spatialReference.');\r\n }\r\n if (!this._centerProjection) {\r\n this._centerProjection = maptalks.SpatialReference.getProjectionInstance(coordType);\r\n }\r\n return this._centerProjection;\r\n }\r\n}\r\n\r\n// function compareTile(a, b) {\r\n// return b.node._cameraDistance - a.node._cameraDistance;\r\n// }\r\n\r\nfunction compareRequests(a, b) {\r\n return a._cameraDistance - b._cameraDistance;\r\n}\r\n\r\n\r\nfunction encodeSuperMapURI(url, baseUrl) {\r\n const uriComponent = url.substring(baseUrl.length);\r\n const parts = uriComponent.split('/');\r\n const encoded = [];\r\n for (let i = 0; i < parts.length; i++) {\r\n encoded.push(encodeURIComponent(parts[i]));\r\n }\r\n return baseUrl + encoded.join('/');\r\n}\r\n","/**\r\n * from mapbox-gl-js\r\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\r\n * with hash lookup made possible by keeping a list of keys in parallel to\r\n * an array of dictionary of values\r\n *\r\n * @public\r\n */\r\nclass LRUCache {\r\n /**\r\n * @param {number} max number of permitted values\r\n * @param {Function} onRemove callback called with items when they expire\r\n */\r\n constructor(max, onRemove) {\r\n this.max = max;\r\n this.currentSize = 0;\r\n this.data = new Map();\r\n this.onRemove = onRemove;\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n *\r\n * @returns {LRUCache} this cache\r\n */\r\n reset(renderer) {\r\n if (this.data) {\r\n const keys = this.data.keys();\r\n for (const id of keys) {\r\n const data = this.data.get(id);\r\n if (!renderer || renderer === data.renderer) {\r\n this._remove(id, data);\r\n }\r\n }\r\n }\r\n if (!renderer) {\r\n this.data = new Map();\r\n this.currentSize = 0;\r\n }\r\n return this;\r\n }\r\n\r\n clear(renderer) {\r\n this.reset(renderer);\r\n // delete this.onRemove;\r\n }\r\n\r\n /**\r\n * Add a key, value combination to the cache, trimming its size if this pushes\r\n * it over max length.\r\n *\r\n * @param {string} key lookup key for the item\r\n * @param {*} data any value\r\n *\r\n * @returns {LRUCache} this cache\r\n */\r\n add(key, data) {\r\n if (!data) {\r\n return this;\r\n }\r\n if (data.node && data.node.memorySize) {\r\n this.currentSize += data.node.memorySize;\r\n }\r\n if (this.has(key)) {\r\n const cached = this.data.get(key);\r\n if (cached && cached.node && cached.node.memorySize) {\r\n this.currentSize -= cached.node.memorySize;\r\n }\r\n this.data.delete(key);\r\n this.data.set(key, data);\r\n } else {\r\n this.data.set(key, data);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n shrink() {\r\n if (this.currentSize > this.max) {\r\n let warned = false;\r\n const iterator = this.data.keys();\r\n let item = iterator.next();\r\n while (this.currentSize > this.max && item.value !== undefined) {\r\n if (!warned && this.data.get(item.value).current) {\r\n warned = true;\r\n console.warn(`current maxGPUMemory(${this.max / 1024 / 1024}) for Geo3DTilesLayer is not enough, one or more current tiles will be discarded.`);\r\n }\r\n const removedData = this.getAndRemove(item.value);\r\n if (removedData) {\r\n this.onRemove(removedData);\r\n }\r\n item = iterator.next();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Determine whether the value attached to `key` is present\r\n *\r\n * @param {String} key the key to be looked-up\r\n * @returns {Boolean} whether the cache has this value\r\n */\r\n has(key) {\r\n return this.data.has(key);\r\n }\r\n\r\n /**\r\n * List all keys in the cache\r\n *\r\n * @returns {Array<string>} an array of keys in this cache.\r\n */\r\n keys() {\r\n const keys = new Array(this.data.size);\r\n let i = 0;\r\n const iterator = this.data.keys();\r\n for (const k of iterator) {\r\n keys[i++] = k;\r\n }\r\n return keys;\r\n }\r\n\r\n /**\r\n * Get the value attached to a specific key and remove data from cache.\r\n * If the key is not found, returns `null`\r\n *\r\n * @param {string} key the key to look up\r\n * @returns {*} the data, or null if it isn't found\r\n */\r\n getAndRemove(key) {\r\n if (!this.has(key)) { return null; }\r\n\r\n const data = this.data.get(key);\r\n if (data.node && data.node.memorySize) {\r\n this.currentSize -= data.node.memorySize;\r\n }\r\n this.data.delete(key);\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the value attached to a specific key without removing data\r\n * from the cache. If the key is not found, returns `null`\r\n *\r\n * @param {string} key the key to look up\r\n * @returns {*} the data, or null if it isn't found\r\n */\r\n get(key) {\r\n if (!this.has(key)) { return null; }\r\n\r\n const data = this.data.get(key);\r\n this.data.delete(key);\r\n this.data.set(key, data);\r\n return data;\r\n }\r\n\r\n /**\r\n * Remove a key/value combination from the cache.\r\n *\r\n * @param {string} key the key for the pair to delete\r\n * @returns {LRUCache} this cache\r\n */\r\n remove(key) {\r\n if (!this.has(key)) { return this; }\r\n const data = this.data.get(key);\r\n this._remove(key, data);\r\n return this;\r\n }\r\n\r\n _remove(key, data) {\r\n if (data.node && data.node.memorySize) {\r\n this.currentSize -= data.node.memorySize;\r\n }\r\n this.data.delete(key);\r\n this.onRemove(data);\r\n }\r\n\r\n /**\r\n * Change the max size of the cache.\r\n *\r\n * @param {number} max the max size of the cache\r\n * @returns {LRUCache} this cache\r\n */\r\n setMaxSize(max) {\r\n this.max = max;\r\n\r\n this.shrink();\r\n\r\n return this;\r\n }\r\n\r\n getMemorySize() {\r\n let size = 0;\r\n const values = this.data.values();\r\n for (const p of values) {\r\n const node = p && p.node;\r\n if (node && node.memorySize) {\r\n size += node.memorySize;\r\n }\r\n }\r\n return size;\r\n }\r\n\r\n markAll(renderer, isCurrent) {\r\n const values = this.data.values();\r\n for (const data of values) {\r\n if (!renderer || data.renderer === renderer) {\r\n data.current = isCurrent;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default LRUCache;\r\n","import { vec3 } from 'gl-matrix';\r\n\r\n// const getPlanesRight = [];\r\n// const getPlanesNearCenter = [];\r\n\r\n// function computeCullingVolume(position, direction, up) {\r\n\r\n\r\n// var planes = this._cullingVolume.planes;\r\n\r\n// var t = this.top;\r\n// var b = this.bottom;\r\n// var r = this.right;\r\n// var l = this.left;\r\n// var n = this.near;\r\n// var f = this.far;\r\n\r\n// var right = vec3.cross(getPlanesRight, direction, up);\r\n\r\n// var nearCenter = getPlanesNearCenter;\r\n// vec3.scale(n, nearCenter, direction);\r\n// Cartesian3.add(position, nearCenter, nearCenter);\r\n\r\n// var farCenter = getPlanesFarCenter;\r\n// Cartesian3.multiplyByScalar(direction, f, farCenter);\r\n// Cartesian3.add(position, farCenter, farCenter);\r\n\r\n// var normal = getPlanesNormal;\r\n\r\n// //Left plane computation\r\n// Cartesian3.multiplyByScalar(right, l, normal);\r\n// Cartesian3.add(nearCenter, normal, normal);\r\n// Cartesian3.subtract(normal, position, normal);\r\n// Cartesian3.normalize(normal, normal);\r\n// Cartesian3.cross(normal, up, normal);\r\n// Cartesian3.normalize(normal, normal);\r\n\r\n// var plane = planes[0];\r\n// if (!defined(plane)) {\r\n// plane = planes[0] = new Cartesian4();\r\n// }\r\n// plane.x = normal.x;\r\n// plane.y = normal.y;\r\n// plane.z = normal.z;\r\n// plane.w = -Cartesian3.dot(normal, position);\r\n\r\n// //Right plane computation\r\n// Cartesian3.multiplyByScalar(right, r, normal);\r\n// Cartesian3.add(nearCenter, normal, normal);\r\n// Cartesian3.subtract(normal, position, normal);\r\n// Cartesian3.cross(up, normal, normal);\r\n// Cartesian3.normalize(normal, normal);\r\n\r\n// plane = planes[1];\r\n// if (!defined(plane)) {\r\n// plane = planes[1] = new Cartesian4();\r\n// }\r\n// plane.x = normal.x;\r\n// plane.y = normal.y;\r\n// plane.z = normal.z;\r\n// plane.w = -Cartesian3.dot(normal, position);\r\n\r\n// //Bottom plane computation\r\n// Cartesian3.multiplyByScalar(up, b, normal);\r\n// Cartesian3.add(nearCenter, normal, normal);\r\n// Cartesian3.subtract(normal, position, normal);\r\n// Cartesian3.cross(right, normal, normal);\r\n// Cartesian3.normalize(normal, normal);\r\n\r\n// plane = planes[2];\r\n// if (!defined(plane)) {\r\n// plane = planes[2] = new Cartesian4();\r\n// }\r\n// plane.x = normal.x;\r\n// plane.y = normal.y;\r\n// plane.z = normal.z;\r\n// plane.w = -Cartesian3.dot(normal, position);\r\n\r\n// //Top plane computation\r\n// Cartesian3.multiplyByScalar(up, t, normal);\r\n// Cartesian3.add(nearCenter, normal, normal);\r\n// Cartesian3.subtract(normal, position, normal);\r\n// Cartesian3.cross(normal, right, normal);\r\n// Cartesian3.normalize(normal, normal);\r\n\r\n// plane = planes[3];\r\n// if (!defined(plane)) {\r\n// plane = planes[3] = new Cartesian4();\r\n// }\r\n// plane.x = normal.x;\r\n// plane.y = normal.y;\r\n// plane.z = normal.z;\r\n// plane.w = -Cartesian3.dot(normal, position);\r\n\r\n// //Near plane computation\r\n// plane = planes[4];\r\n// if (!defined(plane)) {\r\n// plane = planes[4] = new Cartesian4();\r\n// }\r\n// plane.x = direction.x;\r\n// plane.y = direction.y;\r\n// plane.z = direction.z;\r\n// plane.w = -Cartesian3.dot(direction, nearCenter);\r\n\r\n// //Far plane computation\r\n// Cartesian3.negate(direction, normal);\r\n\r\n// plane = planes[5];\r\n// if (!defined(plane)) {\r\n// plane = planes[5] = new Cartesian4();\r\n// }\r\n// plane.x = normal.x;\r\n// plane.y = normal.y;\r\n// plane.z = normal.z;\r\n// plane.w = -Cartesian3.dot(normal, farCenter);\r\n\r\n// return this._cullingVolume;\r\n// }\r\n\r\nfunction getMatrix3Column(out, mat, idx) {\r\n out[0] = mat[idx];\r\n out[1] = mat[idx + 3];\r\n out[2] = mat[idx + 6];\r\n return out;\r\n}\r\n\r\nexport function distanceToCamera(center, halfAxes, cameraPosition) {\r\n return Math.sqrt(distanceSquaredTo(center, halfAxes, cameraPosition));\r\n}\r\n\r\nconst scratchOffset = [];\r\nconst scratchCartesianU = [];\r\nconst scratchCartesianV = [];\r\nconst scratchCartesianW = [];\r\nconst scratchPPrime = [];\r\n\r\n//from Cesium's OrientedBoundingBox.distanceSquaredTo\r\nfunction distanceSquaredTo(center, halfAxes, cartesian) {\r\n // See Geometric Tools for Computer Graphics 10.4.2\r\n const offset = vec3.subtract(scratchOffset, cartesian, center);\r\n\r\n // var halfAxes = halfAxes;\r\n const u = getMatrix3Column(scratchCartesianU, halfAxes, 0);\r\n const v = getMatrix3Column(scratchCartesianV, halfAxes, 1);\r\n const w = getMatrix3Column(scratchCartesianW, halfAxes, 2);\r\n\r\n const uHalf = vec3.len(u);\r\n const vHalf = vec3.len(v);\r\n const wHalf = vec3.len(w);\r\n\r\n vec3.normalize(u, u);\r\n vec3.normalize(v, v);\r\n vec3.normalize(w, w);\r\n\r\n const pPrime = scratchPPrime;\r\n pPrime[0] = vec3.dot(offset, u);\r\n pPrime[1] = vec3.dot(offset, v);\r\n pPrime[2] = vec3.dot(offset, w);\r\n\r\n let distanceSquared = 0.0;\r\n let d;\r\n\r\n if (pPrime[0] < -uHalf) {\r\n d = pPrime[0] + uHalf;\r\n distanceSquared += d * d;\r\n } else if (pPrime[0] > uHalf) {\r\n d = pPrime[0] - uHalf;\r\n distanceSquared += d * d;\r\n }\r\n\r\n if (pPrime[1] < -vHalf) {\r\n d = pPrime[1] + vHalf;\r\n distanceSquared += d * d;\r\n } else if (pPrime[1] > vHalf) {\r\n d = pPrime[1] - vHalf;\r\n distanceSquared += d * d;\r\n }\r\n\r\n if (pPrime[2] < -wHalf) {\r\n d = pPrime[2] + wHalf;\r\n distanceSquared += d * d;\r\n } else if (pPrime[2] > wHalf) {\r\n d = pPrime[2] - wHalf;\r\n distanceSquared += d * d;\r\n }\r\n\r\n return distanceSquared;\r\n}\r\n","import { equalsEpsilon } from '../../common/Math';\r\nconst EPSILON14 = 0.00000000000001;\r\nconst TWO_PI = 2.0 * Math.PI;\r\n\r\nexport default class Rectangle {\r\n constructor(west, south, east, north) {\r\n this.west = west;\r\n this.south = south;\r\n this.east = east;\r\n this.north = north;\r\n }\r\n\r\n static contains(rectangle, cartographic) {\r\n\r\n let longitude = cartographic[0];\r\n const latitude = cartographic[1];\r\n\r\n const west = rectangle.west;\r\n let east = rectangle.east;\r\n\r\n if (east < west) {\r\n east += TWO_PI;\r\n if (longitude < 0.0) {\r\n longitude += TWO_PI;\r\n }\r\n }\r\n return (\r\n (longitude > west ||\r\n equalsEpsilon(longitude, west, EPSILON14)) &&\r\n (longitude < east ||\r\n equalsEpsilon(longitude, east, EPSILON14)) &&\r\n latitude >= rectangle.south &&\r\n latitude <= rectangle.north\r\n );\r\n }\r\n\r\n\r\n static southwest(rectangle, result) {\r\n result[0] = rectangle.west;\r\n result[1] = rectangle.south;\r\n result[2] = 0;\r\n return result;\r\n }\r\n\r\n static northeast(rectangle, result) {\r\n result[0] = rectangle.east;\r\n result[1] = rectangle.north;\r\n result[2] = 0;\r\n return result;\r\n }\r\n\r\n static southeast(rectangle, result) {\r\n result[0] = rectangle.east;\r\n result[1] = rectangle.south;\r\n result[2] = 0;\r\n return result;\r\n }\r\n\r\n static northwest(rectangle, result) {\r\n result[0] = rectangle.west;\r\n result[1] = rectangle.north;\r\n result[2] = 0;\r\n return result;\r\n }\r\n}\r\n","import { vec3 } from '@maptalks/gl';\r\nimport { radianToCartesian3, geodeticSurfaceNormal, geodeticSurfaceNormalCartographic } from '../../common/Transform';\r\nimport { EPSILON15 } from '../../common/Math';\r\nimport Rectangle from './Rectangle';\r\n\r\n\r\nconst UNIT_X = [1, 0, 0];\r\nconst UNIT_Z = [0, 0, 1];\r\n\r\nfunction cartographicToCartesian(carto, out) {\r\n return radianToCartesian3(out, carto[0], carto[1], carto[2]);\r\n}\r\n\r\n\r\nclass Plane {\r\n constructor(normal, distance) {\r\n this.normal = vec3.copy([], normal);\r\n this.distance = distance;\r\n }\r\n\r\n static fromPointNormal(point, normal, result) {\r\n const distance = -vec3.dot(normal, point);\r\n\r\n vec3.copy(result.normal, normal);\r\n result.distance = distance;\r\n return result;\r\n }\r\n}\r\n\r\nconst cartographicScratch = [];\r\nconst cartographicScratch2 = [];\r\nconst westernMidpointScratch = [];\r\nconst eastWestNormalScratch = [];\r\nconst cartesian3Scratch = [];\r\nconst cartesian3Scratch2 = [];\r\nconst cartesian3Scratch3 = [];\r\nconst easternMidpointScratch = [];\r\n\r\nconst rayOrigin = [];\r\nconst rayDirection = [];\r\nconst planeScratch = new Plane(UNIT_X, 0.0);\r\n\r\nconst vectorScratch = [];\r\n\r\nexport default class TileBoundingRegion {\r\n\r\n constructor(region) {\r\n this.southwestCornerCartesian = [];\r\n this.northeastCornerCartesian = [];\r\n\r\n this.westNormal = [];\r\n this.eastNormal = [];\r\n this.southNormal = [];\r\n this.northNormal = [];\r\n\r\n //west, south, east, north\r\n this.rectangle = new Rectangle(...region);\r\n this.minimumHeight = region[4];\r\n this.maximumHeight = region[5];\r\n\r\n this.computeBox(this.rectangle);\r\n }\r\n\r\n distanceToCamera(cameraCartesianPosition, cameraCartographicPosition) {\r\n let result = 0.0;\r\n if (!Rectangle.contains(this.rectangle, cameraCartographicPosition)) {\r\n const southwestCornerCartesian = this.southwestCornerCartesian;\r\n const northeastCornerCartesian = this.northeastCornerCartesian;\r\n const westNormal = this.westNormal;\r\n const southNormal = this.southNormal;\r\n const eastNormal = this.eastNormal;\r\n const northNormal = this.northNormal;\r\n\r\n // if (frameState.mode !== SceneMode.SCENE3D) {\r\n // southwestCornerCartesian = frameState.mapProjection.project(\r\n // Rectangle.southwest(this.rectangle),\r\n // southwestCornerScratch\r\n // );\r\n // southwestCornerCartesian.z = southwestCornerCartesian.y;\r\n // southwestCornerCartesian.y = southwestCornerCartesian.x;\r\n // southwestCornerCartesian.x = 0.0;\r\n // northeastCornerCartesian = frameState.mapProjection.project(\r\n // Rectangle.northeast(this.rectangle),\r\n // northeastCornerScratch\r\n // );\r\n // northeastCornerCartesian.z = northeastCornerCartesian.y;\r\n // northeastCornerCartesian.y = northeastCornerCartesian.x;\r\n // northeastCornerCartesian.x = 0.0;\r\n // westNormal = negativeUnitY;\r\n // eastNormal = Cartesian3.UNIT_Y;\r\n // southNormal = negativeUnitZ;\r\n // northNormal = Cartesian3.UNIT_Z;\r\n // }\r\n\r\n const vectorFromSouthwestCorner = vec3.subtract(\r\n vectorScratch,\r\n cameraCartesianPosition,\r\n southwestCornerCartesian\r\n );\r\n const distanceToWestPlane = vec3.dot(\r\n vectorFromSouthwestCorner,\r\n westNormal\r\n );\r\n const distanceToSouthPlane = vec3.dot(\r\n vectorFromSouthwestCorner,\r\n southNormal\r\n );\r\n\r\n const vectorFromNortheastCorner = vec3.subtract(\r\n vectorScratch,\r\n cameraCartesianPosition,\r\n northeastCornerCartesian\r\n );\r\n const distanceToEastPlane = vec3.dot(\r\n vectorFromNortheastCorner,\r\n eastNormal\r\n );\r\n const distanceToNorthPlane = vec3.dot(\r\n vectorFromNortheastCorner,\r\n northNormal\r\n );\r\n\r\n if (distanceToWestPlane > 0.0) {\r\n result += distanceToWestPlane * distanceToWestPlane;\r\n } else if (distanceToEastPlane > 0.0) {\r\n result += distanceToEastPlane * distanceToEastPlane;\r\n }\r\n\r\n if (distanceToSouthPlane > 0.0) {\r\n result += distanceToSouthPlane * distanceToSouthPlane;\r\n } else if (distanceToNorthPlane > 0.0) {\r\n result += distanceToNorthPlane * distanceToNorthPlane;\r\n }\r\n }\r\n // if (frameState.mode === SceneMode.SCENE3D) {\r\n const cameraHeight = cameraCartographicPosition[2];\r\n const minimumHeight = this.minimumHeight;\r\n const maximumHeight = this.maximumHeight;\r\n // } else {\r\n // cameraHeight = cameraCartesianPosition.x;\r\n // minimumHeight = 0.0;\r\n // maximumHeight = 0.0;\r\n // }\r\n\r\n if (cameraHeight > maximumHeight) {\r\n const distanceAboveTop = cameraHeight - maximumHeight;\r\n result += distanceAboveTop * distanceAboveTop;\r\n } else if (cameraHeight < minimumHeight) {\r\n const distanceBelowBottom = minimumHeight - cameraHeight;\r\n result += distanceBelowBottom * distanceBelowBottom;\r\n }\r\n\r\n return Math.sqrt(result);\r\n }\r\n\r\n computeBox(rectangle) {\r\n const tileBB = this;\r\n cartographicToCartesian(\r\n Rectangle.southwest(rectangle, cartographicScratch2),\r\n tileBB.southwestCornerCartesian\r\n );\r\n cartographicToCartesian(\r\n Rectangle.northeast(rectangle, cartographicScratch2),\r\n tileBB.northeastCornerCartesian\r\n );\r\n\r\n // The middle latitude on the western edge.\r\n cartographicScratch[0] = rectangle.west;\r\n cartographicScratch[1] = (rectangle.south + rectangle.north) * 0.5;\r\n cartographicScratch[2] = 0.0;\r\n const westernMidpointCartesian = cartographicToCartesian(\r\n cartographicScratch,\r\n westernMidpointScratch\r\n );\r\n\r\n // Compute the normal of the plane on the western edge of the tile.\r\n const westNormal = vec3.cross(\r\n cartesian3Scratch,\r\n westernMidpointCartesian,\r\n UNIT_Z\r\n );\r\n vec3.normalize(tileBB.westNormal, westNormal);\r\n\r\n // The middle latitude on the eastern edge.\r\n cartographicScratch[0] = rectangle.east;\r\n const easternMidpointCartesian = cartographicToCartesian(\r\n cartographicScratch,\r\n easternMidpointScratch\r\n );\r\n\r\n // Compute the normal of the plane on the eastern edge of the tile.\r\n const eastNormal = vec3.cross(\r\n cartesian3Scratch,\r\n UNIT_Z,\r\n easternMidpointCartesian\r\n );\r\n vec3.normalize(tileBB.eastNormal, eastNormal);\r\n\r\n // Compute the normal of the plane bounding the southern edge of the tile.\r\n const westVector = vec3.subtract(\r\n cartesian3Scratch,\r\n westernMidpointCartesian,\r\n easternMidpointCartesian\r\n );\r\n const eastWestNormal = vec3.normalize(eastWestNormalScratch, westVector);\r\n\r\n const south = rectangle.south;\r\n let southSurfaceNormal;\r\n\r\n if (south > 0.0) {\r\n // Compute a plane that doesn't cut through the tile.\r\n cartographicScratch[0] = (rectangle.west + rectangle.east) * 0.5;\r\n cartographicScratch[1] = south;\r\n const southCenterCartesian = cartographicToCartesian(\r\n cartographicScratch,\r\n rayOrigin\r\n );\r\n vec3.copy(rayDirection, eastWestNormal);\r\n const westPlane = Plane.fromPointNormal(\r\n tileBB.southwestCornerCartesian,\r\n tileBB.westNormal,\r\n planeScratch\r\n );\r\n // Find a point that is on the west and the south planes\r\n rayPlane(\r\n rayOrigin,\r\n rayDirection,\r\n westPlane,\r\n tileBB.southwestCornerCartesian\r\n );\r\n southSurfaceNormal = geodeticSurfaceNormal(\r\n southCenterCartesian,\r\n cartesian3Scratch2\r\n );\r\n } else {\r\n southSurfaceNormal = geodeticSurfaceNormalCartographic(\r\n Rectangle.southeast(rectangle, cartographicScratch2),\r\n cartesian3Scratch2\r\n );\r\n }\r\n const southNormal = vec3.cross(\r\n cartesian3Scratch3,\r\n southSurfaceNormal,\r\n westVector\r\n );\r\n vec3.normalize(tileBB.southNormal, southNormal);\r\n\r\n // Compute the normal of the plane bounding the northern edge of the tile.\r\n const north = rectangle.north;\r\n let northSurfaceNormal;\r\n if (north < 0.0) {\r\n // Compute a plane that doesn't cut through the tile.\r\n cartographicScratch[0] = (rectangle.west + rectangle.east) * 0.5;\r\n cartographicScratch[1] = north;\r\n const northCenterCartesian = cartographicToCartesian(\r\n cartographicScratch,\r\n rayOrigin\r\n );\r\n // Cartesian3.negate(eastWestNormal, rayDirection);\r\n vec3.scale(rayDirection, eastWestNormal, -1);\r\n const eastPlane = Plane.fromPointNormal(\r\n tileBB.northeastCornerCartesian,\r\n tileBB.eastNormal,\r\n planeScratch\r\n );\r\n // Find a point that is on the east and the north planes\r\n rayPlane(\r\n rayOrigin,\r\n rayDirection,\r\n eastPlane,\r\n tileBB.northeastCornerCartesian\r\n );\r\n northSurfaceNormal = geodeticSurfaceNormal(\r\n northCenterCartesian,\r\n cartesian3Scratch2\r\n );\r\n } else {\r\n northSurfaceNormal = geodeticSurfaceNormalCartographic(\r\n Rectangle.northwest(rectangle, cartographicScratch2),\r\n cartesian3Scratch2\r\n );\r\n }\r\n const northNormal = vec3.cross(\r\n cartesian3Scratch3,\r\n westVector,\r\n northSurfaceNormal\r\n );\r\n vec3.normalize(tileBB.northNormal, northNormal);\r\n }\r\n}\r\n\r\nfunction rayPlane(rayOrigin, rayDirection, plane, result) {\r\n const origin = rayOrigin;\r\n const direction = rayDirection;\r\n const normal = plane.normal;\r\n const denominator = vec3.dot(normal, direction);\r\n\r\n if (Math.abs(denominator) < EPSILON15) {\r\n // Ray is parallel to plane. The ray may be in the polygon's plane.\r\n return undefined;\r\n }\r\n\r\n const t = (-plane.distance - vec3.dot(normal, origin)) / denominator;\r\n\r\n if (t < 0) {\r\n return undefined;\r\n }\r\n\r\n result = vec3.scale(result, direction, t);\r\n return vec3.add(result, origin, result);\r\n}\r\n",null,"import transcoders from '@maptalks/gl/dist/transcoders.js';\r\nlet currentTranscoders = null\r\nexport default function () {\r\n if (!currentTranscoders) {\r\n currentTranscoders = {\r\n 'image/crn': transcoders.crn && transcoders.crn(),\r\n 'image/ktx2': transcoders.ktx2 && transcoders.ktx2(),\r\n 'image/cttf': transcoders.ktx2 && transcoders.ktx2(),\r\n 'draco': transcoders.draco && transcoders.draco()\r\n };\r\n }\r\n return currentTranscoders;\r\n}\r\n","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\r\nimport { readFeatureTableJSON, readBatchTableJSON, readBatchTableBin, readBatchId } from '../common/TileHelper.js';\r\n// 不能这样引用: import { transcoders } from '@maptalks/gl',因为会把gl及相关依赖库(如maptalks)都引用进来\r\nimport getTranscoders from './transcoders.js';\r\n\r\nconst { Ajax, GLTFLoader } = getGLTFLoaderBundle();\r\n\r\n// s3m : https://github.com/SuperMap/s3m-spec\r\n// b3dm: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/Batched3DModel/README.md\r\n// b3dm legacy 24: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/a45866de985f5b37aa98fc75340878d7a78e4056/TileFormats/Batched3DModel/README.md\r\n// b3dm legacy 20: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/3c70a9c3d58f612218f1f51b12d2a0d92b3c9e32/TileFormats/Batched3DModel/README.md\r\n\r\nexport default class B3DMLoader {\r\n constructor(requestImage, loaderCtor, supportedFormats) {\r\n this._requestImage = requestImage;\r\n this._loaderCtor = loaderCtor || GLTFLoader;\r\n this._supportedFormats = supportedFormats;\r\n this._decoders = getTranscoders();\r\n }\r\n\r\n static createEmptyB3DM() {\r\n return {\r\n featureTable : null,\r\n batchTable : null,\r\n gltf : {}\r\n };\r\n }\r\n\r\n /**\r\n * 载入b3dm模型,返回一个promise,promise中的参数是 gltf 模型对象\r\n * @param {String} url - url of b3dm\r\n * @param {ArrayBuffer} [arraybuffer=null] - optional b3dm arraybuffer content\r\n * @returns {Promise}\r\n */\r\n load(url, arraybuffer, offset = 0, byteLength = 0, options) {\r\n if (arraybuffer) {\r\n if (!byteLength) {\r\n byteLength = arraybuffer.byteLength;\r\n }\r\n return this._parse(url, arraybuffer, offset, byteLength, options);\r\n }\r\n return Ajax.getArrayBuffer(url, {}).then(response => {\r\n const b3dm = response.data;\r\n if (!byteLength) {\r\n byteLength = b3dm.byteLength;\r\n }\r\n return this._parse(url, b3dm, offset, byteLength);\r\n });\r\n }\r\n\r\n _parse(url, b3dm, offset, b3dmByteLength, options) {\r\n const maxTextureSize = options && options.maxTextureSize;\r\n const components = this._readB3DM(b3dm, offset, b3dmByteLength, url);\r\n if (components.error) {\r\n return Promise.resolve(components);\r\n }\r\n const rootPath = url.substring(0, url.lastIndexOf('/'));\r\n let loader;\r\n try {\r\n loader = new this._loaderCtor(rootPath, components.glb, {\r\n transferable: true,\r\n requestImage: this._requestImage,\r\n decoders: this._decoders,\r\n supportedFormats: this._supportedFormats,\r\n maxTextureSize\r\n });\r\n } catch (e) {\r\n return Promise.resolve({ error: e });\r\n }\r\n\r\n return loader.load({ skipAttributeTransform: false }).then(gltf => {\r\n // 相同url的geometry会缓存在MeshPainter中,不会重复创建\r\n // url里必须加上offset和b3dmByteLength,是因为一个url中可能包含多个不同的gltf模型\r\n gltf.url = `${url}-${offset}-${b3dmByteLength}`;\r\n const transferables = loader.transferables;\r\n for (let i = 0; i < components.transferables.length; i++) {\r\n if (transferables.indexOf(components.transferables[i]) < 0) {\r\n transferables.push(components.transferables[i]);\r\n }\r\n }\r\n return {\r\n magic: 'b3dm',\r\n count: components.count,\r\n transferables, //for worker\r\n featureTable: components.featureTable,\r\n batchTable: components.batchTable,\r\n batchTableBin: components.batchTableBin,\r\n gltf\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * 解析b3dm数据,返回数据块:\r\n * 1. feature table\r\n * 2. batch table\r\n * 3. gltf\r\n * @param {ArrayBuffer} b3dm\r\n */\r\n _readB3DM(b3dm, offset, byteLength, url) {\r\n const view = new DataView(b3dm, offset, byteLength);\r\n const version = view.getUint32(4, true);\r\n if (version !== 1) {\r\n const info = 'Unsupported b3dm version: ' + version + ', url:' + url;\r\n console.warn(info);\r\n return { error: info };\r\n }\r\n const length = view.getUint32(8, true);\r\n if (length !== view.byteLength) {\r\n const info = 'Length in b3dm header is inconsistent with b3dm\\'s byte length, url: ' + url;\r\n console.warn(info);\r\n return { error: info };\r\n }\r\n // let headerLength = 28;\r\n // const versions = [20, 24, 28];\r\n\r\n // for (let i = 0; i < versions.length; i++) {\r\n // const magic = view.getUint32(versions[i], true);\r\n // // 1179937895 is uint32 version of 'gltf'\r\n // if (magic === 1179937895) {\r\n // headerLength = versions[i];\r\n // break;\r\n // }\r\n // }\r\n\r\n let featureTableJsonByteLength = view.getUint32(12, true);\r\n let featureTableBinaryByteLength = view.getUint32(16, true);\r\n let batchTableJsonByteLength = view.getUint32(20, true);\r\n let batchTableBinaryByteLength = view.getUint32(24, true);\r\n\r\n let byteOffset = 28 + offset;\r\n let batchLength;\r\n // from Cesium.js, Batched3DModel3DTileContent.js\r\n if (batchTableJsonByteLength >= 570425344) {\r\n // 'This b3dm header is using the legacy format [batchLength] [batchTableByteLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/master/specification/TileFormats/Batched3DModel.'\r\n byteOffset -= 4 * 2;\r\n batchLength = featureTableJsonByteLength;\r\n batchTableJsonByteLength = featureTableBinaryByteLength;\r\n batchTableBinaryByteLength = 0;\r\n featureTableJsonByteLength = 0;\r\n featureTableBinaryByteLength = 0;\r\n } else if (batchTableBinaryByteLength >= 570425344) {\r\n // This b3dm header is using the legacy format [batchTableJsonByteLength] [batchTableBinaryByteLength] [batchLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/master/specification/TileFormats/Batched3DModel.\r\n byteOffset -= 4;\r\n batchLength = batchTableJsonByteLength;\r\n batchTableJsonByteLength = featureTableJsonByteLength;\r\n batchTableBinaryByteLength = featureTableBinaryByteLength;\r\n featureTableJsonByteLength = 0;\r\n featureTableBinaryByteLength = 0;\r\n }\r\n\r\n const transferables = [b3dm];\r\n let featureTable;\r\n let featureTableBin;\r\n\r\n if (featureTableJsonByteLength > 0) {\r\n featureTable = readFeatureTableJSON(b3dm, byteOffset, featureTableJsonByteLength);\r\n byteOffset += featureTableJsonByteLength;\r\n batchLength = featureTable['BATCH_LENGTH'];\r\n } else {\r\n featureTable = {\r\n 'BATCH_LENGTH': batchLength\r\n };\r\n }\r\n\r\n if (featureTableBinaryByteLength > 0) {\r\n // featureTableBin = readFeatureTableBin(b3dm, byteOffset, featureTableBinaryByteLength);\r\n byteOffset += featureTableBinaryByteLength;\r\n }\r\n\r\n let batchTable, batchTableBin;\r\n if (batchTableJsonByteLength > 0) {\r\n batchTable = readBatchTableJSON(b3dm, byteOffset, batchTableJsonByteLength);\r\n byteOffset += batchTableJsonByteLength;\r\n if (batchTableBinaryByteLength > 0) {\r\n const batchTableBinInfo = readBatchTableBin(b3dm, byteOffset, batchTableBinaryByteLength);\r\n batchTableBin = b3dm.slice(batchTableBinInfo.offset, batchTableBinInfo.offset + batchTableBinInfo.byteLength);\r\n byteOffset += batchTableBinaryByteLength;\r\n transferables.push(batchTableBin);\r\n }\r\n }\r\n\r\n\r\n\r\n const count = featureTable['BATCH_LENGTH'];\r\n const b3dmData = {};\r\n if (featureTable && featureTable['BATCH_ID']) {\r\n b3dmData['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], b3dm, featureTableBin.offset, count);\r\n const buffer = b3dmData['BATCH_ID'].array && b3dmData['BATCH_ID'].array.buffer;\r\n if (buffer && transferables.indexOf(buffer) < 0) {\r\n transferables.push(buffer);\r\n }\r\n }\r\n\r\n const glb = {\r\n buffer: b3dm,\r\n byteOffset: byteOffset,\r\n byteLength: view.byteLength + view.byteOffset - byteOffset\r\n };\r\n return {\r\n count: batchLength,\r\n transferables,\r\n featureTable,\r\n batchTable,\r\n batchTableBin,\r\n b3dm: b3dmData,\r\n glb\r\n };\r\n }\r\n\r\n //TODO\r\n _readBatchTable() {\r\n return null;\r\n }\r\n}\r\n\r\n","import { vec3 } from 'gl-matrix';\r\nimport { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\r\nimport { readFeatureTableBatchTable, readBatchId, convertQuantizedPosition } from '../common/TileHelper.js';\r\nimport { stringFromUTF8Array } from '../common/Util.js';\r\nimport getTranscoders from './transcoders.js';\r\n\r\nconst { Ajax, GLTFLoader } = getGLTFLoaderBundle();\r\n\r\n// https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Instanced3DModel\r\nexport default class I3DMLoader {\r\n constructor(requestImage, loaderCtor, supportedFormats, maxTextureSize) {\r\n this._requestImage = requestImage;\r\n this._loaderCtor = loaderCtor || GLTFLoader;\r\n this._supportedFormats = supportedFormats;\r\n this._decoders = getTranscoders();\r\n this._maxTextureSize = maxTextureSize;\r\n }\r\n\r\n /**\r\n * 载入pnts模型,返回一个promise,promise中的参数是数据\r\n * @param {String} url - url of i3dm\r\n * @param {ArrayBuffer} [arraybuffer=null] - optional i3dm arraybuffer content\r\n * @returns {Promise}\r\n */\r\n load(url, arraybuffer, offset = 0, byteLength = 0, options) {\r\n if (arraybuffer) {\r\n if (!byteLength) {\r\n byteLength = arraybuffer.byteLength;\r\n }\r\n return this._parse(url, arraybuffer, offset, byteLength, options);\r\n }\r\n return Ajax.getArrayBuffer(url, {}).then(response => {\r\n const i3dm = response.data;\r\n if (!byteLength) {\r\n byteLength = i3dm.byteLength;\r\n }\r\n return this._parse(url, i3dm, offset, byteLength);\r\n });\r\n }\r\n\r\n _parse(url, buf, offset, byteLength, options) {\r\n return this._parseGLTF(url, buf, offset, byteLength, options).then(({ gltf, transferables }) => {\r\n const components = this._readI3DM(buf, offset, byteLength, url);\r\n if (components.error) {\r\n return Promise.resolve(components);\r\n }\r\n for (let i = 0; i < transferables.length; i++) {\r\n if (components.transferables.indexOf(transferables[i]) === -1) {\r\n components.transferables.push(transferables[i]);\r\n }\r\n }\r\n delete gltf.transferables;\r\n return Promise.resolve({\r\n magic: 'i3dm',\r\n count: components.count,\r\n transferables: components.transferables, //for worker\r\n featureTable: components.featureTable,\r\n batchTable: components.batchTable,\r\n batchTableBin: components.batchTableBin,\r\n i3dm: components.i3dm,\r\n gltf\r\n });\r\n });\r\n\r\n }\r\n\r\n _parseGLTF(i3dmURL, buf, offset, byteLength, opts) {\r\n const maxTextureSize = opts && opts.maxTextureSize;\r\n const options = {\r\n transferable: true,\r\n requestImage: this._requestImage,\r\n decoders: this._decoders,\r\n supportedFormats: this._supportedFormats,\r\n maxTextureSize\r\n };\r\n const view = new DataView(buf, offset, byteLength);\r\n const featureTableJSONLength = view.getUint32(12, true);\r\n const featureTableBinLength = view.getUint32(16, true);\r\n const batchTableJSONLength = view.getUint32(20, true);\r\n const batchTableBinLength = view.getUint32(24, true);\r\n const gltfFormat = view.getUint32(28, true);\r\n\r\n // i3dm header length\r\n const headerLength = 32;\r\n const gltfBinStart = headerLength + featureTableJSONLength + featureTableBinLength + batchTableJSONLength + batchTableBinLength;\r\n if (gltfFormat === 0) {\r\n //url\r\n const urlBuf = new Uint8Array(buf, gltfBinStart + offset, view.byteLength - gltfBinStart);\r\n let url = stringFromUTF8Array(urlBuf);\r\n if (url.indexOf('://') == -1) {\r\n // relative path\r\n url = i3dmURL.substring(0, i3dmURL.lastIndexOf('/')) + '/' + url;\r\n }\r\n const isGLB = url.indexOf('.glb') > 0;\r\n if (isGLB) {\r\n return Ajax.getArrayBuffer(url, {}).then(bin => {\r\n return this._createGLTFLoader(url, { buffer: bin.data, byteOffset: 0 }, options);\r\n });\r\n } else {\r\n return Ajax.getJSON(url, {}).then(json => {\r\n return this._createGLTFLoader(url, json, options);\r\n });\r\n }\r\n } else {\r\n const glb = {\r\n buffer: buf,\r\n byteOffset: gltfBinStart + offset,\r\n byteLength: view.byteLength - gltfBinStart\r\n };\r\n return this._createGLTFLoader(i3dmURL, glb, options);\r\n }\r\n }\r\n\r\n _createGLTFLoader(url, data, options) {\r\n const rootPath = url.substring(0, url.lastIndexOf('/'));\r\n const loader = new this._loaderCtor(rootPath, data, options);\r\n // turn on skipAttributeTransform in default\r\n return loader.load({ skipAttributeTransform: true }).then(gltf => {\r\n let offset = 0, byteLength = 0;\r\n if (data.buffer) {\r\n offset = data.byteOffset || 0;\r\n byteLength = data.byteLength || 0;\r\n }\r\n gltf.url = `${url}-${offset}-${byteLength}`;\r\n return {\r\n transferables : loader.transferables, //for worker\r\n gltf\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * 解析i3dm数据,返回数据块:\r\n * 1. feature table\r\n * 2. batch table\r\n * 3. gltf\r\n * @param {ArrayBuffer} pnts\r\n */\r\n _readI3DM(i3dmBuf, offset, byteLength, url) {\r\n const view = new DataView(i3dmBuf, offset, byteLength);\r\n const version = view.getUint32(4, true);\r\n if (version !== 1) {\r\n const info = 'Unsupported pnts version: ' + version + ', url:' + url;\r\n console.warn(info);\r\n return { error: info };\r\n }\r\n const length = view.getUint32(8, true);\r\n if (length !== view.byteLength) {\r\n const info = 'Length in pnts header is inconsistent with pnts\\'s byte length, url: ' + url;\r\n console.warn(info);\r\n return { error: info };\r\n }\r\n const transferables = [i3dmBuf];\r\n\r\n const { featureTable, featureTableBin, batchTable, batchTableBin } = readFeatureTableBatchTable(view, 32 + offset, transferables);\r\n\r\n const i3dm = {};\r\n\r\n const instanceLength = featureTable['INSTANCES_LENGTH'];\r\n // position\r\n if (featureTable['POSITION']) {\r\n const { byteOffset } = featureTable['POSITION'];\r\n i3dm['POSITION'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\r\n };\r\n transferables.push(i3dm['POSITION'].array.buffer);\r\n } else if (featureTable['POSITION_QUANTIZED']) {\r\n const quanVolOffset = featureTable['QUANTIZED_VOLUME_OFFSET'];\r\n const quanVolScale = featureTable['QUANTIZED_VOLUME_SCALE'];\r\n\r\n const { byteOffset } = featureTable['POSITION_QUANTIZED'];\r\n i3dm['POSITION'] = {\r\n byteStride: 3 * 4,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: this._convertQuantizedPosition(new Uint16Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3), quanVolOffset, quanVolScale)\r\n };\r\n transferables.push(i3dm['POSITION'].array.buffer);\r\n }\r\n\r\n if (featureTable['BATCH_ID']) {\r\n i3dm['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], i3dmBuf, featureTableBin.offset, instanceLength);\r\n const buffer = i3dm['BATCH_ID'].array && i3dm['BATCH_ID'].array.buffer;\r\n if (buffer && transferables.indexOf(buffer) < 0) {\r\n transferables.push(buffer);\r\n }\r\n }\r\n\r\n // normal\r\n if (featureTable['NORMAL_UP']) {\r\n let { byteOffset } = featureTable['NORMAL_UP'];\r\n i3dm['NORMAL_UP'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\r\n };\r\n transferables.push(i3dm['NORMAL_UP'].array.buffer);\r\n\r\n byteOffset = featureTable['NORMAL_RIGHT'].byteOffset;\r\n i3dm['NORMAL_RIGHT'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\r\n };\r\n transferables.push(i3dm['NORMAL_RIGHT'].array.buffer);\r\n } else if (featureTable['NORMAL_UP_OCT32P']) {\r\n let { byteOffset } = featureTable['NORMAL_UP_OCT32P'];\r\n i3dm['NORMAL_UP'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: this._decodeOCT32p(new Uint16Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 2))\r\n };\r\n transferables.push(i3dm['NORMAL_UP'].array.buffer);\r\n\r\n byteOffset = featureTable['NORMAL_RIGHT_OCT32P'].byteOffset;\r\n i3dm['NORMAL_RIGHT'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: this._decodeOCT32p(new Uint16Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 2))\r\n };\r\n transferables.push(i3dm['NORMAL_RIGHT'].array.buffer);\r\n }\r\n\r\n if (featureTable['SCALE']) {\r\n const { byteOffset } = featureTable['SCALE'];\r\n i3dm['SCALE'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 1,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength).slice()\r\n };\r\n transferables.push(i3dm['SCALE'].array.buffer);\r\n } else if (featureTable['SCALE_NON_UNIFORM']) {\r\n const { byteOffset } = featureTable['SCALE_NON_UNIFORM'];\r\n i3dm['SCALE_NON_UNIFORM'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: instanceLength,\r\n componentType: 5126,\r\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\r\n };\r\n transferables.push(i3dm['SCALE_NON_UNIFORM'].array.buffer);\r\n }\r\n return {\r\n count: instanceLength,\r\n batchTable,\r\n batchTableBin,\r\n featureTable,\r\n i3dm,\r\n transferables: transferables\r\n };\r\n }\r\n\r\n _decodeOCT32p(arr) {\r\n const count = arr.length / 2;\r\n const result = new Float32Array(count * 3);\r\n const v = [];\r\n for (let i = 0; i < count; i++) {\r\n octDecodeInRange(v, arr[i * 2], arr[i * 2 + 1], 65535);\r\n result[i * 3] = v[0];\r\n result[i * 3 + 1] = v[1];\r\n result[i * 3 + 2] = v[2];\r\n }\r\n return result;\r\n }\r\n\r\n _convertQuantizedPosition(arr, offset, scale) {\r\n const position = new Float32Array(arr.length);\r\n return convertQuantizedPosition(position, arr, offset, scale);\r\n }\r\n\r\n //TODO\r\n _readBatchTable() {\r\n return null;\r\n }\r\n}\r\n\r\nfunction octDecodeInRange(out, x, y, rangeMax) {\r\n out[0] = fromSNorm(x, rangeMax);\r\n out[1] = fromSNorm(y, rangeMax);\r\n out[2] = 1.0 - (Math.abs(out[0]) + Math.abs(out[1]));\r\n\r\n if (out[2] < 0.0) {\r\n const oldVX = out[0];\r\n out[0] = (1.0 - Math.abs(out[1])) * signNotZero(oldVX);\r\n out[1] = (1.0 - Math.abs(oldVX)) * signNotZero(out[1]);\r\n }\r\n\r\n return vec3.normalize(out, out);\r\n}\r\n\r\nfunction fromSNorm(value, rangeMaximum) {\r\n rangeMaximum = defaultValue(rangeMaximum, 255);\r\n return (\r\n (clamp(value, 0.0, rangeMaximum) / rangeMaximum) * 2.0 - 1.0\r\n );\r\n}\r\n\r\nfunction signNotZero(value) {\r\n return value < 0.0 ? -1.0 : 1.0;\r\n}\r\n\r\nfunction defaultValue(a, b) {\r\n if (a !== undefined && a !== null) {\r\n return a;\r\n }\r\n return b;\r\n}\r\n\r\nfunction clamp(value, min, max) {\r\n return value < min ? min : value > max ? max : value;\r\n}\r\n","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\r\nimport { readFeatureTableBatchTable, readBatchId, convertQuantizedPosition, getComponentFromCtor } from '../common/TileHelper.js';\r\nimport getTranscoders from './transcoders.js';\r\nimport { getBatchIdArrayType } from '../common/Util.js';\r\n\r\nconst { Ajax } = getGLTFLoaderBundle();\r\n\r\n// s3m : https://github.com/SuperMap/s3m-spec\r\n// b3dm: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/Batched3DModel/README.md\r\n// b3dm legacy 24: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/a45866de985f5b37aa98fc75340878d7a78e4056/TileFormats/Batched3DModel/README.md\r\n// b3dm legacy 20: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/3c70a9c3d58f612218f1f51b12d2a0d92b3c9e32/TileFormats/Batched3DModel/README.md\r\n\r\nexport default class PNTSLoader {\r\n constructor() {\r\n }\r\n\r\n\r\n /**\r\n * 载入pnts模型,返回一个promise,promise中的参数是数据\r\n * @param {String} url - url of b3dm\r\n * @param {ArrayBuffer} [arraybuffer=null] - optional b3dm arraybuffer content\r\n * @returns {Promise}\r\n */\r\n load(url, arraybuffer, offset = 0, byteLength = 0) {\r\n if (arraybuffer) {\r\n if (!byteLength) {\r\n byteLength = arraybuffer.byteLength;\r\n }\r\n return this._parse(url, arraybuffer, offset, byteLength);\r\n }\r\n return Ajax.getArrayBuffer(url, {}).then(response => {\r\n const b3dm = response.data;\r\n if (!byteLength) {\r\n byteLength = b3dm.byteLength;\r\n }\r\n return this._parse(url, b3dm, offset, byteLength);\r\n });\r\n }\r\n\r\n _parse(url, pntsBuf, offset, byteLength) {\r\n return this._readPNTS(pntsBuf, offset, byteLength, url).then(components => {\r\n if (components.error) {\r\n return components;\r\n }\r\n return {\r\n magic: 'pnts',\r\n count: components.count,\r\n transferables: components.transferables, //for worker\r\n featureTable: components.featureTable,\r\n batchTable: components.batchTable,\r\n batchTableBin: components.batchTableBin,\r\n pnts: components.pnts\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * 解析b3dm数据,返回数据块:\r\n * 1. feature table\r\n * 2. batch table\r\n * 3. gltf\r\n * @param {ArrayBuffer} pnts\r\n */\r\n _readPNTS(pntsBuf, offset, byteLength, url) {\r\n const view = new DataView(pntsBuf, offset, byteLength);\r\n const version = view.getUint32(4, true);\r\n if (version !== 1) {\r\n const info = 'Unsupported pnts version: ' + version + ', url:' + url;\r\n console.warn(info);\r\n return { error: info };\r\n }\r\n const length = view.getUint32(8, true);\r\n if (length !== view.byteLength) {\r\n const info = 'Length in pnts header is inconsistent with pnts\\'s byte length, url: ' + url;\r\n console.warn(info);\r\n return { error: info };\r\n }\r\n\r\n const transferables = [pntsBuf];\r\n const { featureTable, featureTableBin, batchTable, batchTableBin } = readFeatureTableBatchTable(view, offset + 28, transferables);\r\n const quanVolOffset = featureTable['QUANTIZED_VOLUME_OFFSET'];\r\n const quanVolScale = featureTable['QUANTIZED_VOLUME_SCALE']\r\n\r\n const pointsLength = featureTable['POINTS_LENGTH'];\r\n\r\n let compression = {};\r\n let dracoBuf;\r\n if (featureTable['extensions'] && featureTable['extensions']['3DTILES_draco_point_compression']) {\r\n compression = featureTable['extensions']['3DTILES_draco_point_compression'];\r\n // dracoBuf = pntsBuf.slice(compression.byteOffset + featureTableBin.offset, compression.byteOffset + featureTableBin.offset + compression.byteLength);\r\n dracoBuf = new DataView(pntsBuf, compression.byteOffset + featureTableBin.offset, compression.byteLength);\r\n const dracoOptions = {\r\n attributes: compression.properties,\r\n useUniqueIDs: false\r\n };\r\n if (!this._draco) {\r\n this._draco = getTranscoders().draco;\r\n }\r\n return this._draco(dracoBuf, dracoOptions).then(data => {\r\n const attribData = data.attributes;\r\n if ((featureTable['POSITION'] || featureTable['POSITION_QUANTIZED']) && (!attribData['POSITION'] && !attribData['POSITION_QUANTIZED'])) {\r\n attribData['POSITION'] = featureTable['POSITION'];\r\n attribData['POSITION_QUANTIZED'] = featureTable['POSITION_QUANTIZED'];\r\n }\r\n if ((featureTable['RGB'] || featureTable['RGBA'] || featureTable['RGB565']) && (!attribData['RGB'] && !attribData['RGBA'] && !attribData['RGB565'])) {\r\n attribData['RGB'] = featureTable['RGB'];\r\n attribData['RGBA'] = featureTable['RGBA'];\r\n attribData['RGB565'] = featureTable['RGB565'];\r\n }\r\n if ((featureTable['NORMAL'] || featureTable['NORMAL_OCT16P']) && (!attribData['NORMAL'] && !attribData['NORMAL_OCT16P'])) {\r\n attribData['NORMAL'] = featureTable['NORMAL'];\r\n attribData['NORMAL_OCT16P'] = featureTable['NORMAL_OCT16P'];\r\n }\r\n\r\n const pnts = this._readAttributes(pntsBuf, data.attributes, featureTableBin.offset, pointsLength, transferables, quanVolOffset, quanVolScale);\r\n if (data.attributes['BATCH_ID']) {\r\n const array = data.attributes['BATCH_ID'].array;\r\n pnts['BATCH_ID'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 1,\r\n count: array.length,\r\n componentType: getComponentFromCtor(array.constructor),\r\n array: array\r\n }\r\n transferables.push(array.buffer);\r\n } else if (featureTable['BATCH_ID'] || Object.keys(batchTable).length) {\r\n if (featureTable['BATCH_ID']) {\r\n pnts['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], pntsBuf, featureTableBin.offset, pointsLength);\r\n } else {\r\n pnts['BATCH_ID'] = createPerPointBatchId(pointsLength);\r\n }\r\n const buffer = pnts['BATCH_ID'].array && pnts['BATCH_ID'].array.buffer;\r\n if (buffer && transferables.indexOf(buffer) < 0) {\r\n transferables.push(buffer);\r\n }\r\n }\r\n return {\r\n count: pointsLength,\r\n batchTable,\r\n batchTableBin,\r\n featureTable,\r\n pnts,\r\n transferables\r\n }\r\n });\r\n }\r\n const pnts = this._readAttributes(pntsBuf, featureTable, featureTableBin.offset, pointsLength, transferables, quanVolOffset, quanVolScale);\r\n if (featureTable['BATCH_ID'] || Object.keys(batchTable).length) {\r\n if (featureTable['BATCH_ID']) {\r\n pnts['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], pntsBuf, featureTableBin.offset, pointsLength);\r\n } else {\r\n pnts['BATCH_ID'] = createPerPointBatchId(pointsLength);\r\n }\r\n const buffer = pnts['BATCH_ID'].array && pnts['BATCH_ID'].array.buffer;\r\n if (buffer && transferables.indexOf(buffer) < 0) {\r\n transferables.push(buffer);\r\n }\r\n }\r\n\r\n // position\r\n\r\n return Promise.resolve({\r\n count: pointsLength,\r\n batchTable,\r\n batchTableBin,\r\n featureTable,\r\n pnts,\r\n transferables\r\n });\r\n }\r\n\r\n _readAttributes(pntsBuf, attribData, attrByteOffset, pointsLength, transferables, quanVolOffset, quanVolScale) {\r\n const pnts = {};\r\n if (attribData['POSITION']) {\r\n let { byteOffset, array } = attribData['POSITION'];\r\n byteOffset = byteOffset || 0;\r\n const offset = (array ? 0 : attrByteOffset);\r\n if (!array) {\r\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 3 * 4);\r\n array = new Float32Array(buf);\r\n }\r\n pnts['POSITION'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: pointsLength,\r\n componentType: 5126,\r\n array: array\r\n };\r\n transferables.push(array.buffer);\r\n } else if (attribData['POSITION_QUANTIZED']) {\r\n let { byteOffset } = attribData['POSITION_QUANTIZED'];\r\n const { array } = attribData['POSITION_QUANTIZED'];\r\n byteOffset = byteOffset || 0;\r\n const offset = (array ? 0 : attrByteOffset);\r\n pnts['POSITION'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: pointsLength,\r\n componentType: 5126,\r\n array: this._convertQuantizedPosition(array || new Uint16Array(pntsBuf, byteOffset + offset, pointsLength * 3), quanVolOffset, quanVolScale)\r\n };\r\n transferables.push(pnts['POSITION'].array.buffer);\r\n }\r\n // color\r\n if (attribData['RGBA']) {\r\n let { byteOffset, array } = attribData['RGBA'];\r\n byteOffset = byteOffset || 0;\r\n const offset = (array ? 0 : attrByteOffset);\r\n if (!array) {\r\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 4);\r\n array = new Uint8Array(buf);\r\n }\r\n pnts['RGBA'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 4,\r\n count: pointsLength,\r\n componentType: 0x1401,\r\n array: array\r\n };\r\n transferables.push(array.buffer);\r\n } else if (attribData['RGB']) {\r\n let { byteOffset, array } = attribData['RGB'];\r\n byteOffset = byteOffset || 0;\r\n const offset = (array ? 0 : attrByteOffset);\r\n if (!array) {\r\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 3);\r\n array = new Uint8Array(buf);\r\n }\r\n pnts['RGB'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: pointsLength,\r\n componentType: 0x1401,\r\n array: array\r\n };\r\n transferables.push(array.buffer);\r\n } else if (attribData['RGB565']) {\r\n let { byteOffset, array } = attribData['RGB565'];\r\n byteOffset = byteOffset || 0;\r\n const offset = (array ? 0 : attrByteOffset);\r\n if (!array) {\r\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 2);\r\n array = new Uint16Array(buf);\r\n }\r\n pnts['RGB565'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 1,\r\n count: pointsLength,\r\n componentType: 0x1403,\r\n array: array\r\n };\r\n transferables.push(array.buffer);\r\n }\r\n // normal\r\n if (attribData['NORMAL']) {\r\n let { byteOffset, array } = attribData['NORMAL'];\r\n byteOffset = byteOffset || 0;\r\n const offset = (array ? 0 : attrByteOffset);\r\n if (!array) {\r\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 3 * 4);\r\n array = new Float32Array(buf);\r\n }\r\n pnts['NORMAL'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 3,\r\n count: pointsLength,\r\n componentType: 5126,\r\n array: array\r\n };\r\n transferables.push(array.buffer);\r\n } else if (attribData['NORMAL_OCT16P']) {\r\n let { byteOffset, array } = attribData['NORMAL_OCT16P'];\r\n byteOffset = byteOffset || 0;\r\n const offset = (array ? 0 : attrByteOffset);\r\n if (!array) {\r\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 2);\r\n array = new Uint8Array(buf);\r\n }\r\n pnts['NORMAL_OCT16P'] = {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 2,\r\n count: pointsLength,\r\n componentType: 0x1401,\r\n array: array\r\n };\r\n transferables.push(array.buffer);\r\n }\r\n return pnts;\r\n }\r\n\r\n _convertQuantizedPosition(arr, offset, scale) {\r\n const position = new Float32Array(arr.length);\r\n return convertQuantizedPosition(position, arr, offset, scale);\r\n }\r\n\r\n //TODO\r\n _readBatchTable() {\r\n return null;\r\n }\r\n}\r\n\r\n// const DEFAULT_TYPES = {\r\n// 'POSITION': 'Float32Array',\r\n// 'POSITION_QUANTIZED': 'Uint16Array',\r\n// 'RGBA': 'Uint8Array',\r\n// 'RGB': 'Uint8Array',\r\n// 'RGB565': 'Uint16Array',\r\n// 'NORMAL': 'Float32Array',\r\n// 'NORMAL_OCT16P': 'Uint8Array'\r\n// };\r\n\r\n// function getAttributeTypes(compressedProperties, featureTable) {\r\n// const types = {};\r\n// for (const p in compressedProperties) {\r\n// const prop = featureTable[p];\r\n// let typeName;\r\n// if (prop.componentType) {\r\n// typeName = getComponentCtor(prop.componentType).name\r\n// } else {\r\n// typeName = DEFAULT_TYPES[p];\r\n// }\r\n// if (typeName) {\r\n// types[compressedProperties[p]] = typeName\r\n// } else {\r\n// console.warn('undefined type of attribute:' + p);\r\n// }\r\n// }\r\n// return types;\r\n// }\r\n\r\nfunction createPerPointBatchId(pointsLength) {\r\n const ctor = getBatchIdArrayType(pointsLength);\r\n const array = new ctor(pointsLength);\r\n for (let i = 0; i < pointsLength; i++) {\r\n array[i] = i;\r\n }\r\n return {\r\n byteStride: 0,\r\n byteOffset: 0,\r\n itemSize: 1,\r\n count: pointsLength,\r\n componentType: getComponentFromCtor(ctor),\r\n array\r\n };\r\n}\r\n","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\r\nimport { readMagic } from '../common/TileHelper';\r\nimport B3DMLoader from '../loaders/B3DMLoader';\r\nimport I3DMLoader from '../loaders/I3DMLoader';\r\nimport PNTSLoader from '../loaders/PNTSLoader';\r\n\r\nconst { Ajax, GLTFLoader } = getGLTFLoaderBundle();\r\n\r\n// https://github.com/CesiumGS/3d-tiles/blob/main/specification/TileFormats/Composite/README.md\r\n\r\nexport default class CMPTLoader {\r\n constructor(requestImage, GLTFloaderCtor, supportedFormats, maxTextureSize) {\r\n this._supportedFormats = supportedFormats;\r\n this._requestImage = requestImage;\r\n this._loaderCtor = GLTFloaderCtor || GLTFLoader;\r\n this._maxTextureSize = maxTextureSize;\r\n }\r\n\r\n\r\n /**\r\n * 载入b3dm模型,返回一个promise,promise中的参数是 gltf 模型对象\r\n * @param {String} url - url of b3dm\r\n * @param {ArrayBuffer} [arraybuffer=null] - optional b3dm arraybuffer content\r\n * @returns {Promise}\r\n */\r\n load(url, arraybuffer, offset = 0, byteLength = 0, options) {\r\n if (arraybuffer) {\r\n return this._parse(url, arraybuffer, offset, byteLength, options);\r\n }\r\n return Ajax.getArrayBuffer(url, {}).then(response => {\r\n const cmpt = response.data;\r\n return this._parse(url, cmpt, offset, byteLength);\r\n });\r\n }\r\n\r\n _parse(url, cmpt, offset, byteLength, options) {\r\n if (!byteLength) {\r\n byteLength = cmpt.byteLength;\r\n }\r\n const tiles = this._readCMPT(cmpt, url, offset, byteLength);\r\n const promises = [];\r\n for (let i = 0; i < tiles.length; i++) {\r\n let loader;\r\n if (tiles[i].magic === 'b3dm') {\r\n loader = new B3DMLoader(this._requestImage, this._loaderCtor, this._supportedFormats);\r\n } else if (tiles[i].magic === 'i3dm') {\r\n loader = new I3DMLoader(this._requestImage, this._loaderCtor, this._supportedFormats, this._maxTextureSize);\r\n } else if (tiles[i].magic === 'pnts') {\r\n loader = new PNTSLoader();\r\n } else if (tiles[i].magic === 'cmpt') {\r\n loader = new CMPTLoader(this._requestImage, this._loaderCtor, this._supportedFormats, this._maxTextureSize);\r\n } else {\r\n // unsupported magic\r\n console.warn('Unsupported magic in CMPT tile:', tiles[i].magic);\r\n continue;\r\n }\r\n promises.push(loader.load(url, cmpt, tiles[i].offset, tiles[i].byteLength, options).then(data => {\r\n return data;\r\n }));\r\n }\r\n return Promise.all(promises).then(tiles => {\r\n return {\r\n magic: 'cmpt',\r\n tiles\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * 解析b3dm数据,返回数据块:\r\n * 1. feature table\r\n * 2. batch table\r\n * 3. gltf\r\n * @param {ArrayBuffer} b3dm\r\n */\r\n _readCMPT(cmpt, url, byteOffset, byteLength) {\r\n const view = new DataView(cmpt, byteOffset, byteLength);\r\n const version = view.getUint32(4, true);\r\n if (version !== 1) {\r\n const info = 'Unsupported cmpt version: ' + version + ', url:' + url;\r\n console.warn(info);\r\n return { error: info };\r\n }\r\n // const length = view.getUint32(8, true);\r\n // if (length !== view.byteLength) {\r\n // const info = 'Length in cmpt header is inconsistent with cmpt\\'s byte length, url: ' + url;\r\n // console.warn(info);\r\n // return { error: info };\r\n // }\r\n if (view.byteLength === 16) {\r\n // an empty cmpt tile\r\n return [];\r\n }\r\n const tiles = [];\r\n const tilesLength = view.getUint32(12, true);\r\n // 16是CMPT的header长度\r\n const headerLength = 16;\r\n let offset = headerLength;\r\n for (let i = 0; i < tilesLength; i++) {\r\n const magic = readMagic(view, offset);\r\n const tileByteLength = view.getUint32(offset + 8, true);\r\n tiles.push({\r\n magic,\r\n buffer: cmpt,\r\n offset: offset + byteOffset,\r\n byteLength: tileByteLength\r\n });\r\n offset += tileByteLength;\r\n }\r\n return tiles;\r\n }\r\n}\r\n","import * as maptalks from 'maptalks';\nimport * as maptalksgl from '@maptalks/gl';\n\nimport chunk from './worker.js';\n\nif (maptalksgl.transcoders) {\n const version = maptalks.Map.VERSION;\n if (version.indexOf(\"1.0.0-beta\") >= 0 || version.indexOf(\"1.0.0-alpha\") >= 0) {\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', transcoderInjected);\n } else {\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', function () {\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\n return transcoderInjected;\n });\n }\n\n} else {\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', chunk);\n}\n\nexport * from '../src/layer/index';\n"],"names":["planes","i","p","intersectsBox","matrix","box","mask","setPlanes","plane","distanceToPoint","COLUMN0ROW0","COLUMN0ROW1","COLUMN0ROW2","COLUMN1ROW0","COLUMN1ROW1","COLUMN1ROW2","COLUMN2ROW0","COLUMN2ROW1","COLUMN2ROW2","intersectsPlane","center","normal","halfAxes","normalX","normalY","normalZ","radEffective","Math","abs","distanceToPlane","m","me","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","setComponents","out","x","y","z","w","inverseNormalLength","sqrt","isArrayish","obj","Array","isArray","length","splice","Function","Object","getOwnPropertyDescriptor","constructor","name","concat","prototype","slice","swizzle","simpleSwizzleModule","exports","args","results","len","arg","call","push","wrap","fn","arguments","colorNames","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","require$$1","hasOwnProperty","reverseNames","create","cs","colorStringModule","to","get","clamp","num","min","max","hexDouble","str","round","toString","toUpperCase","string","val","model","substring","toLowerCase","hsl","hwb","rgb","value","match","hexAlpha","i2","parseInt","parseFloat","alpha","isNaN","hex","rgba","percent","r","g","b","hsla","hwba","a","keyword","cssKeywords","reverseKeywords","key","convert","conversionsModule","channels","labels","hsv","cmyk","xyz","lab","lch","ansi16","ansi256","hcg","apple","Error","defineProperty","h","l","delta","rdif","gdif","bdif","s","v","diff","diffc","c","k","reversed","currentClosestKeyword","currentClosestDistance","Infinity","distance","pow","t1","t2","t3","smin","lmin","hi","floor","f","q","t","sl","vmin","n","wh","bl","ratio","y2","x2","z2","atan2","PI","hr","cos","sin","ansi","color","mult","rem","colorString","split","map","char","join","integer","hue","chroma","mg","pure","conversions","require$$0","deriveBFS","fromModel","graph","models","keys","parent","buildGraph","queue","current","pop","adjacents","adjacent","node","unshift","link","from","wrapConversion","toModel","path","cur","conversion","route","forEach","routes","wrappedFn","result","wrapRounded","raw","wrapRaw","_slice","skippedModels","hashedModelKeys","sort","limiters","Color","this","valpha","newArr","zeroArray","indexOf","hashedKeys","JSON","stringify","limit","freeze","getset","channel","modifier","maxfn","arr","toJSON","places","self","percentString","array","object","unitArray","unitObject","Number","toFixed","roundTo","roundToPlace","saturationl","lightness","saturationv","wblack","rgbNumber","luminosity","lum","chan","contrast","color2","lum1","lum2","level","contrastRatio","isDark","isLight","negate","lighten","darken","saturate","desaturate","whiten","blacken","grayscale","fade","opaquer","rotate","degrees","mix","mixinColor","weight","color1","undefined","w1","w2","newAlpha","isNil","extend","dest","src","isFunction","isObject","isNumber","toRadian","d","toDegree","getAbsoluteURL","url","document","createElement","href","sign","extraByteMap","stringFromUTF8Array","data","count","index","ch","extra","chx","String","fromCharCode","setColumn3","col","flatArr","flat","reduce","acc","getBatchIdArrayType","Uint8Array","Uint16Array","Uint32Array","isBase64","base64URLToArrayBuffer","firstDot","base64","binary_string","window","atob","bytes","charCodeAt","buffer","pushIn","ii","ll","colorCache","normalizeColor","isRelativeURL","prepareFetchOptions","fetchOptions","referrerPolicy","referrer","location","globalThis","global","e","gl_trans__coders","o","maptalks_gltf_loader","inject","_","maptalks_gltf_loader_bundle","registerTranscoder","getTranscoder","canvas","Geo3DTilesWorkerConnection","maptalks","worker","Actor","workerKey","mapId","supportNPOT","super","_supportNPOT","initialize","cb","loadTile","layerId","params","buffers","arraybuffer","command","send","abortTileLoading","broadcast","addLayer","options","actorId","removeLayer","requestImage","image","Image","onload","isActive","img","isPowerOfTwo","width","height","floorPowerOfTwo","getContext","drawImage","idx","lastIndexOf","filename","console","warn","resize","ctx","willReadFrequently","imgData","getImageData","onerror","err","log","LN2","EPSILON","ARRAY_TYPE","Float32Array","multiply","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","glMatrix.ARRAY_TYPE","hypot","fromValues","copy","set","subtract","scale","normalize","dot","cross","ax","ay","az","bx","by","bz","sub","mul","vec","vec3.create","vec3.fromValues","GLTFLoader","getGLTFLoaderBundle","iterateMesh","gltf","scenes","i0","l0","nodes","matrices","iterateNode","TMAT","RMAT","SMAT","EMPTY_T","EMTPY_Q","quat.identity","EMPTY_S","nodeMatrices","rotation","translation","tm","mat4.fromTranslation","rm","xx","yx","yy","zx","zy","zz","wx","wy","wz","mat4.fromQuat","sm","mat4.fromScaling","mat4.multiply","children","mesh","meshIndex","meshes","mat","primitives","primitive","getItemAtBufferData","byteOffset","byteStride","stride","componentType","itemSize","arrayBuffer","ctor","getTypedArrayCtor","BYTES_PER_ELEMENT","uint8Arr","setInstanceData","row","scratchN","scratchK","wgs84RadiiSquared","radianToCartesian3","longitude","latitude","radiiSquared","cosLatitude","normalizeCartesian","vec3.multiply","gamma","vec3.dot","cartesian","scalar","vec3.scale","vec3.add","wgs84OneOverRadii","wgs84OneOverRadiiSquared","cartesianToCartographicP","cartesianToCartographicN","cartesianToCartographicH","cartesian3ToDegree","oneOverRadiiSquared","oneOverRadii","centerToleranceSquared","positionX","positionY","positionZ","oneOverRadiiX","oneOverRadiiY","oneOverRadiiZ","squaredNorm","intersection","scaleToGeodeticSurfaceIntersection","isFinite","oneOverRadiiSquaredX","oneOverRadiiSquaredY","oneOverRadiiSquaredZ","gradient","scaleToGeodeticSurfaceGradient","func","denominator","xMultiplier","yMultiplier","zMultiplier","xMultiplier2","yMultiplier2","zMultiplier2","xMultiplier3","yMultiplier3","zMultiplier3","lambda","magnitude","correction","EPSILON12","scaleToGeodeticSurface","vec3.mul","vec3.sub","asin","vec3.length","geodeticSurfaceNormal","origin","vec3.normalize","geodeticSurfaceNormalCartographic","cartographic","equalsEpsilon","left","right","relativeEpsilon","absoluteEpsilon","absDiff","readMagic","view","offset","magic","code","getUint8","textDecoder","TextDecoder","readFeatureTableJSON","byteLength","parse","decode","readBatchTableJSON","readBatchTableBin","readBatchArray","batchId","buf","type","reglType","getComponentCtor","getItemSize","readBatchId","batchIdData","readBatchData","subarray","TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","typeMap","BYTE","Int8Array","UNSIGNED_BYTE","SHORT","Int16Array","UNSIGNED_SHORT","INT","Int32Array","UNSIGNED_INT","FLOAT","DOUBLE","Float64Array","getComponentFromCtor","convertQuantizedPosition","position","readFeatureTableBatchTable","transferables","featureTableJsonByteLength","getUint32","featureTableBinaryByteLength","batchTableJsonByteLength","batchTableBinaryByteLength","i3dmBuf","featureTableBin","featureTable","batchTable","batchTableBin","readFeatureTableBin","batchTableBinInfo","vectorProductLocalFrame","up","south","north","west","east","down","degeneratePositionLocalFrame","localFrameToFixedFrameCache","scratchCalculateCartesian","scratchFirstCartesian","scratchSecondCartesian","scratchThirdCartesian","ZERO","setTranslation","eastNorthUpToFixedFrame","firstAxis","secondAxis","thirdAxis","resultat","hashAxis","ellipsoid","a0","a1","a2","glMatrix.EPSILON","vec3.copy","mathSign","vec3.cross","localFrameToFixedFrameGenerator","scratchRTCCoord","scratchCenter","scratchCartographic","projectedPosition","scratchFromENU","scratchToENU","scratchRotation","coord","prjResult","RADIAN","OPTIONS","offscreenCanvas","OffscreenCanvas","fillText","getCanvas","ColorIn","colors","error","valueOffset","assign","_initImgData","clearRect","createLinearGradient","stop","addColorStop","fillStyle","fillRect","getColor","colorInCache","isNull","isNotNull","isEmptyString","createFunction","parameters","defaultType","fun","isFeatureConstant","isZoomConstant","isFunctionDefinition","innerFun","zoomAndFeatureDependent","stops","featureDependent","property","zoomDependent","evaluateExponentialFunction","evaluateIntervalFunction","evaluateCategoricalFunction","evaluateIdentityFunction","evaluateColorInterpolateFunction","evaluateCalculateExpressionFunction","featureFunctions","featureFunctionStops","zoom","default","feature","base","input","interpolate","Map","COLORIN_OPTIONS","colorIn","has","targetVariable","expression","newValue","coalesce","updatedExpression","traverseAndAssign","newValueAsNumber","targetVariableAsString","subExpr","evaluateExpression","operator","includes","operands","op","curr","some","inputLower","inputUpper","outputLower","outputUpper","evaluatedLower","apply","evaluatedUpper","output","interpolateNumber","interpolateArray","difference","progress","interpolated","createFunction1","getTextureMagFilter","getTextureMinFilter","getTextureWrap","getMaterialType","getMaterialFormat","getPrimitive","getUniqueREGLBuffer","getArrayType","reshader","REGLHelper","Y_TO_Z","X_TO_Z","loginIBLResOnCanvas","logoutIBLResOnCanvas","getIBLResOnCanvas","getPBRUniforms","pbr","PBRUtils","DEFAULT_POLYGON_OFFSET","factor","units","DEFAULT_POLYGONFILL","DEFAULT_HSV","DEFAULT_MATERIAL_INFO","specularStrength","materialShininess","IDENTITY_SCALE","IDENTITY_MATRIX","mat4","identity","EMPTY_TRANSLATION","EMPTY_COORD_OFFSET","LIGHT_DIR","phongFilter","material","PhongMaterial","StandardFilter","StandardMaterial","TEMP_RTCCENTER","TEMP_CENTER","Coordinate","TEMP_POINT","Point","TEMP_POINT1","TEMP_POINT2","TEMP_OFFSET","TEMP_TRANSLATION","TEMP_MATRIX1","TEMP_MATRIX2","TEMP_TILE_ROT_QUAT","TEMP_SCALING","TEMP_TILE_SCALING_MAT","TEMP_TILE_TRANSFORM","TEMP_TRANSLATION_MAT","TEMP_SERVICE_MAT","TEMP_PROJ_SCALE","TEMP_DIST_SCALE","TEMP_DIST_TO_PROJ_SCALE","TEMP_MATRIX_SCALE","DEFAULT_SEMANTICS","POSITION","NORMAL","TEXCOORD_0","TEXCOORD_1","COLOR_0","TANGENT","_BATCHID","BOX_INDEX","SPHERE_POS","radius","angle","vertices","indices","posX","posY","posZ","generateSphere","BOX_ROTATE","BOX_SCALE","TileMeshPainter","regl","layer","_layer","_canvas","getRenderer","pickingFBO","_regl","_renderer","Renderer","_loading","_modelMeshes","_pntsMeshes","_i3dmMeshes","_cmptMeshes","_cachedGLTF","_modelScene","Scene","_pntsScene","_i3dmScene","_boxScene","_resLoader","ResourceLoader","texture","_bindedListener","_onResourceLoad","_khrTechniqueWebglManager","KHRTechniquesWebglManager","_getExtraCommandProps","getMap","_heightScale","altitudeToPoint","getGLRes","getI3DMMeshes","getPNTSMeshes","getB3DMMeshes","getPaintedMeshes","_paintedMeshes","paint","tiles","boxMeshes","parentContext","renderTarget","filter","sceneFilter","uniforms","_getUniformValues","projViewMatrix","oneMeshArray","parentMeshes","b3dmMeshes","pntsMeshes","i3dmMeshes","_getMesh","service","_getNodeService","_rootIdx","debugNodes","heightOffset","coordOffset","id","polygonOffset","isValid","properties","_updateMeshLocalTransform","_originLocalTransform","localTransform","_node","getBoundingBox","batchIdMap","geometry","rootIdx","_highlighted","HighlightUtil","highlightMesh","_highlightTimestamp","showOnly","_showOnlys","_showOnlyTimeStamp","bloom","hlBloomMesh","depthFunc","isLeaf","leave","branchRootId","selectionDepth","cullFace","bloomProperties","_updateMaskDefines","_updateServiceMatrix","drawCount","khrExludeFilter","getExcludeFilter","ContextUtil","setIncludeUniformValues","_callShader","_phongShader","_standardShader","forEachShader","shader","shaderFilter","uniformSemantics","setMeshes","pntsUniforms","_getPntsUniforms","render","_pntsShader","fbo","_edgeShader","prepareRender","context","_prepareShaders","states","includesChanged","dispose","_createShaders","stencilEnable","branchMeshes","leafMeshes","hasUnresolved","currentBranchRootId","_drawBranchMeshes","_clearStencil","clear","stencil","framebuffer","getCurrentB3DMMeshes","getMeshes","getCurrentI3DMMeshes","_sort","_cameraDistance","deleteTile","tileData","_boxMesh","_disposeMesh","_disposeCMPT","_deleteOne","cached","refMeshes","delete","uuid","size","remove","picking","_updateB3DMLocalMatrix","_updateI3DMLocalTransform","_updatePNTSLocalTransform","createPntsMesh","pnts","compressed_int16_params","fill","Geometry","static","positionAttribute","pickingIdAttribute","generateBuffers","defines","_setCompressedInt16Defines","rtcCenter","rtcCoord","projCenter","Mesh","serviceIndex","setDefines","setFunctionUniform","pointColor","pointSizeValue","pointSizeFn","pointSize","getZoom","pointOpacityValue","pointOpacityFn","pointOpacity","_setCompressedInt16Uniforms","_getB3DMTransform","setLocalTransform","createI3DMMesh","upAxisTransform","_getUpAxisTransform","_upAxis","i3dm","instanceCount","projectedMatrix","_computeProjectedTransform","tileRotQuat","getRotation","quat","scaling","getScaling","tileScalingMat4","fromScaling","tileTransform","_getI3DMTileTransform","projScale","_getProjScale","distScale","_getDistanceScale","distToProjScale","vec3","div","distToProjScaleTransform","NORMAL_UP","NORMAL_RIGHT","SCALE","SCALE_NON_UNIFORM","instanceData","instance_vectorA","instance_vectorB","instance_vectorC","aPickingId","normalUp","normalRight","normalForward","scaleItem","scaleNonUniform","rotationMat3","quaternion","tempUint8","iterateBufferData","vertex","fromMat3","fromRotationTranslationScale","instanceBuffers","dimension","divisor","unreadyCount","ready","gltfWeakResources","gltfMesh","meshId","primId","gltfResource","_processGLTF","isReady","InstancedMesh","Set","add","_getGLTFMeshDefines","_setWEB3DDecodeUniforms","attributes","nodeMatrix","setPositionMatrix","trimGLTFWeakResources","_callback","coordOffsetMatrix","_computeCoordOffsetMatrix","_getCenterTranslation","fromTranslation","createB3DMMesh","maxPrjExtent","maxExtent","extent","Extent","convertTo","_pointToPrj","xmin","ymin","xmax","ymax","extensions","isSharedPosition","asset","sharePosition","_getB3DMTileTransform","unlit","materials","compressUniforms","u","setUniform","hasFunctionUniform","opacity","polygonFill","_createBoxMesh","nodeBox","_getNodeBox","translate","obbox","boxPosition","boxCenter","sphereBox","sphereCenter","Material","lineColor","lineOpacity","_deleteBoxMesh","distanceScale","decodeMatrix","nodeTransform","transformMat4","projectedTransform","projection","res","heightScale","viewCenter","mat4.getTranslation","vec3.len","vec3.set","prjCoord","project","fromENU","toENU","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","mat4.invert","mat3.fromMat4","left0","left1","left2","left4","left5","left6","left8","left9","left10","right0","right1","right2","right4","right5","right6","right8","right9","right10","column0Row0","column0Row1","column0Row2","column1Row0","column1Row1","column1Row2","column2Row0","column2Row1","column2Row2","multiplyByMatrix3","basisTo2D","getProjection","getTranslation","boxCoord","glRes","point0","coordToPointAtRes","target","point1","dx","dy","createCMPTMesh","content","childId","getGeometryDefines","generator","_appendS3MDefines","uvRegion","desc","normalAttribute","color0Attribute","uv0Attribute","textureCoordMatrixAttribute","_vertexCompressionType","hasIBL","compressDefines","renderer","updateMaskDefines","isI3DM","isS3M","matInfo","khrTechniquesWebgl","isWebGPU","khrMesh","_createTechniqueMesh","fillEmptyDataInMissingAttribute","_createGeometry","materialInfo","_createMaterial","alphaTest","ambientLight","environmentExposure","lights","getLightManager","mapAmbient","getAmbientLight","ambientValue","_nodeId","baseColorFactor","gltfGeo","useWebGL2","createMesh","attributeSemantics","color0Name","attrs","positionSize","vertexCount","isPosition","newArray","padGPUBufferAlignment","pickingData","uv1Attribute","tangentAttribute","mode","featureIds","indiceIndex","generateFeatureIndiceIndex","excludeElementsInVAO","_prjToPoint","serviceTransform","_getServiceTransform","zoomScale","distanceToPointAtRes","viewport","modelNormalMatrix","projViewModelMatrix","MeshShader","vert","pntsVert","frag","props","mat3","fromMat4","extraCommandProps","blend","enable","dst","equation","depth","uniformDeclares","fillIncludes","PhongShader","StandardShader","EdgeShader","srcRGB","srcAlpha","dstRGB","dstAlpha","FBORayPicking","PICKING_MODE","ENABLE_PICKING","HAS_PICKING_ID","_pntsPicking","cull","meshProperties","face","cmp","ref","fail","zfail","zpass","lightManager","lightDir","getDirectionalLight","direction","layerOpacity","iblTexes","dfgLUT","maskUniforms","getMaskUniforms","minAltitude","altitude","czm_lightDirectionEC","lightSpecular","viewMatrix","projMatrix","outSize","polygonOpacity","ambientColor","materialIndex","baseColorTexture","pbrMetallicRoughness","texInfo","textures","_getTexture","normalTexture","normalMapFactor","occlusionTexture","occlusionFactor","strength","emissiveTexture","emissiveFactor","vec4","getREGLTexture","metallicFactor","roughnessFactor","metallicRoughnessTexture","s3mMaterial","meshMaterial","convertFrom","doubleSided","once","config","format","flipY","mipmap","sampler","magFilter","minFilter","wrapS","wrapT","Texture2D","loading","_coordToPoint","getGLZoom","axis","pick","tolerance","b3dm","_pickMesh","scene","picked","getRenderedMeshes","returnPoint","pickingId","point","coordinate","getMeshAt","services","debugInfo","highlight","highlights","getFrameTimestamp","setToRedraw","cancelAllHighlight","showOnlys","cancelShowOnly","_getCurrentBatchIDs","ids","batchIds","batchData","getAmbientResource","fillNodepagesToCache","nodeCache","TEMP_VEC3","I3SNode","fnFetchNodepages","_url","_fnFetchNodepages","_version","version","_index","_nodeCache","load","baseUrl","layerScene","lodSelection","_nodeJSON","_loadNode","Promise","resolve","eslpk","nodepage","nodesPerPage","getTileset","_tileset","getChildrenURL","_childrenURL","promises","pendingReqs","childPageIndex","all","then","_loadContent","_createTileset","_fillCache","i3s","gltfUpAxis","geometricError","MAX_VALUE","root","_convertNode","nodeJSON","is4326","wkid","nodeData","obb","mbs","boundingVolume","_tileCoordToLngLat","_WGS84ToCartesian","sphere","halfSize","directionsMatrix","mat3.fromQuat","fromCenterHalfSizeQuaternion","metersPerPixel","span","lodThreshold","lodSelectionMetricType","lodIndex","metricType","maxError","globalTransforms","mat4.identity","localTransforms","childrenDefinition","childIndex","inPlaceTileDefinition","refine","transform","geometryData","uri","getJSON","long","lat","supportKTX2","transcoders","ktx2","IDENTITY_MAT4","supportWASM","WebAssembly","instantiate","module","Module","of","Instance","isI3SMesh","prefixIndex","getI3SNodeInfo","enableDraco","forceDraco","isESLPK","nodeIndex","getI3SNodeIndex","hasCompression","geoUrl","meshInfo","info","store","defaultGeometrySchema","textureUrl","textureData","mimeType","textureEncoding","geoDefinitions","geometryDefinitions","geoDef","definition","geometryBuffers","geometryInfo","resource","materialDefinitions","textureSetDefinitions","materialDef","materialDefinition","resolveTextures","parseMaterial","dracoCompression","textureSetDefinitionId","texDef","formats","getSupportedTexture","ext","textureEnCodingMap","textureEncode","textureFormat","hasExtension","Ajax","COORD_IN","COORD_OUT","REPORTED_ERRORS","EMPTY_ARRAY","GlobalTieCache","onRemove","currentSize","reset","_remove","memorySize","shrink","warned","iterator","item","next","removedData","getAndRemove","setMaxSize","getMemorySize","values","markAll","isCurrent","Browser","mobile","tile","TileCacheRefCount","Geo3DTilesRenderer","MaskRendererMixin","CanvasCompatible","LayerAbstractRenderer","tileCache","tilesLoading","_requests","_modelQueue","_fetchI3DNodepages","getAnalysisMeshes","painter","paintedMeshes","needToRedraw","isInteracting","_timestamp","drawOnInteracting","event","timestamp","draw","mask2DExtent","prepareCanvas","intersects","canvasExtent2D","completeRender","getTiles","_consumeI3SQueue","_consumeModelQueue","selectedTiles","requests","_selectTiles","loadTiles","_drawTiles","_abortUnusedTiles","_markTiles","preLoadingCount","loadingLimit","_getLoadLimit","checked","hit","tileLoading","getCachedTile","_isLoadingTile","getTileOpacity","selected","_selectParentTile","_selectChildTile","_sortTiles","compareRequests","lastAncestor","stack","parentStack","waitingTile","_stackLength","treeNode","maxLevel","_level","child","_createCandidate","nodeId","onDrawTileStart","fire","onDrawTileEnd","renderCount","binary","_loadTileContent","isI3STileset","_i3sNodeCache","tileset","onTilesetLoad","supportedFormats","_supportedFormats","Util","getSupportedFormats","gl","device","wgpu","isSuperMapiServer","uriComponent","parts","encoded","encodeURIComponent","encodeSuperMapURI","getTileUrl","_roots","upAxis","i3sInfo","onTileError","status","workerConn","getId","shift","_onMeshCreated","_enableLayerOpacity","_getMeshSize","onTileLoad","_addTileToCache","capabilities","layers","_parseI3SSceneLayer","errorUrl","message","isNoContentHttpCode","_addErrorToCache","getShadowMeshes","loadTime","now","initContext","reglGL","graphics","prepareWorker","_resumeHighlights","spatialReference","coordType","getSpatialReference","destroy","getStencilValue","force","_preRetireTime","Date","aborted","_createGLContext","names","tileId","batch","bin","_i3sRequests","callbacks","json","i3sVersion","nodePages","endsWith","lastSlash","regulateURL","parseI3SJSON","serviceHighs","cancelHighlight","items","serviceShowOnlys","_getCoordProjection","unproject","_lngLatToIdentityCoord","_identityCoordToLngLat","_centerProjection","SpatialReference","getProjectionInstance","getMatrix3Column","distanceToCamera","cameraPosition","vec3.subtract","scratchOffset","scratchCartesianU","scratchCartesianV","scratchCartesianW","uHalf","vHalf","wHalf","pPrime","scratchPPrime","distanceSquared","distanceSquaredTo","TWO_PI","Rectangle","contains","rectangle","southwest","northeast","southeast","northwest","UNIT_Z","cartographicToCartesian","carto","Plane","fromPointNormal","cartographicScratch","cartographicScratch2","westernMidpointScratch","eastWestNormalScratch","cartesian3Scratch","cartesian3Scratch2","cartesian3Scratch3","easternMidpointScratch","rayOrigin","rayDirection","planeScratch","vectorScratch","TileBoundingRegion","region","southwestCornerCartesian","northeastCornerCartesian","westNormal","eastNormal","southNormal","northNormal","minimumHeight","maximumHeight","computeBox","cameraCartesianPosition","cameraCartographicPosition","vectorFromSouthwestCorner","distanceToWestPlane","distanceToSouthPlane","vectorFromNortheastCorner","distanceToEastPlane","distanceToNorthPlane","cameraHeight","distanceAboveTop","distanceBelowBottom","tileBB","westernMidpointCartesian","easternMidpointCartesian","westVector","eastWestNormal","southSurfaceNormal","southCenterCartesian","westPlane","rayPlane","northSurfaceNormal","northCenterCartesian","eastPlane","extentToBBOX","BBOXUtil","maxGPUMemory","retireInterval","loadingLimitOnInteracting","debug","meshLimitPerFrame","i3sNodepageLimitPerFrame","enableI3SCompressedGeometry","forceI3SCompressedGeometry","onlyCacheNoContentTileWhenError","pickingPoint","geometryEvents","alwaysShowTopTiles","antialias","forceRenderOnZooming","forceRenderOnRotating","forceRenderOnMoving","optionalExtensions","TEMP_VEC3_0","TEMP_VEC3_1","TEMP_VEC3_2","TEMP_VEC3_3","TEMP_VEC3_4","TEMP_VEC3_5","TEMP_VEC3_6","TEMP_SCALE","TEMP_QUAT_0","TEMP_COORD","TEMP_MAT3_0","TEMP_MAT4_0","TEMP_MAT4_1","TEMP_MAT4_2","CAMERA_Point","DEFAULT_ROTATION","DEFAULT_SCALE","TEMP_SERVICE_SCALE","DEFAULT_TRANSLATION","TILENODE_BBOX","BOX_POS","Geo3DTilesLayer","MaskLayerMixin","Layer","fromJSON","layerJSON","getEnuTransform","cart3","enu","fromEuler","isGeo3DTilesLayer","_initRoots","_nodeBoxes","urls","_rootMap","createRootTile","roots","showService","updateService","visible","hideService","_setToRedraw","addService","extentChanged","equals","rootNode","removeService","subdomains","domainKey","domain","replace","getExtent","nodeExtent","boundingVolumeToExtent","_centerTransformed","isIdentity","nw","locate","se","nodeCenter","rx","ry","rz","getRootTiles","pointAtResToDistance","cameraCoord","_getCameraLonLat","_cameraLocation","_cameraCartesian3","_fovDenominator","getFov","projectionView","mapExtentBBOX","getPitch","mapExtent","halfWidth","getWidth","halfHeight","getHeight","clipMasks","getMasks","ClipOutsideMask","maskGeoJSON","toGeoJSON","bbox","currentParent","_getRootMaxExtent","_initNode","_isVisible","TileVisibility","VISIBLE","OUT_OF_FRUSTUM","isTopTile","SCREEN_ERROR_TOO_SMALL","_addCandidateNode","_updateParentDistance","candidate","hasChildren","hasContent","inited","hasValidChild","viewerRequestVolume","cameraLocation","cameraCartesian3","volume","computeSphereDistanceToCamera","computeBoxDistanceToCamera","inViewerRequestVolume","GUID","_empty","_isEmpty","isI3SNode","_offsetBoundingVolume","_offsetChanged","hasOffset","exactEquals","originalVolume","westSouth","_offsetCenter","eastNorth","offsetCenter","axisUp","isRealspace","s3mType","isI3S","isFirstTileset","_notLoaded","ecefTransform","contentUrl","_updateRootCenter","_isTileInMasks","bboxIntersect","bboxInMask","_isTileInFrustum","maximumScreenSpaceError","_getScreenSpaceError","_error","_getRootNode","_createRegionBox","_createBBox","_createSphere","intersectsOrientedBox","negRadius","intersectsSphere","ws","en","minHeight","maxHeight","ws_coord","en_coord","convertRegionToBox","pointWS","pointEN","_bboxCenter","isIdentityMatrix","pos","pointAtResToCoord","_generateOBBox","_calBoxCenter","modelMatrix","column3Row0","column3Row1","column3Row2","column0Row3","column1Row3","column2Row3","column3Row3","fillColumnMajorMatrix4","fromRotationTranslation","_createHalfAxes","toArray","_getBoxScale","obbCenter","xPlaneCenter","getBoxPlaneCenter","yPlaneCenter","zPlaneCenter","box_center","box_center_coord","point_center","rootCenter","originMat4","originMat4Reverse","serviceScale","_equalsOffsets","pointCenter","_updateRootBBoxCenter","_updateRootRegionCenter","_originCoordOffset","_originHeightOffset","rotationScale","scalePoint","fovDenominator","_tileRegion","computeRegionDistanceToCamera","identify","cp","coordToContainerPoint","identifyAtPoint","identifyMasks","identifyMask","dpr","getDevicePixelRatio","getCurrentBatchIDs","_resumeShowOnly","setServiceOpacity","setServiceDebug","getJSONType","dist","v0","v1","v2","v3","vv0","vv1","vv2","vv3","hasParentContent","vec2","mergeOptions","registerRenderer","registerJSONType","currentTranscoders","getTranscoders","crn","draco","B3DMLoader","loaderCtor","_requestImage","_loaderCtor","_decoders","createEmptyB3DM","_parse","getArrayBuffer","response","b3dmByteLength","maxTextureSize","components","_readB3DM","rootPath","loader","glb","transferable","decoders","skipAttributeTransform","DataView","batchLength","BATCH_LENGTH","b3dmData","_readBatchTable","I3DMLoader","_maxTextureSize","_parseGLTF","_readI3DM","i3dmURL","opts","gltfBinStart","_createGLTFLoader","instanceLength","quanVolOffset","quanVolScale","_convertQuantizedPosition","_decodeOCT32p","octDecodeInRange","rangeMax","fromSNorm","oldVX","signNotZero","rangeMaximum","defaultValue","PNTSLoader","pntsBuf","_readPNTS","pointsLength","dracoBuf","compression","dracoOptions","useUniqueIDs","_draco","attribData","_readAttributes","createPerPointBatchId","attrByteOffset","CMPTLoader","GLTFloaderCtor","cmpt","_readCMPT","tilesLength","tileByteLength","maptalksgl","VERSION","transcoderInjected","chunk","registerWorkerAdapter"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,15,16,17,18,19,20,25,26]}
|
|
1
|
+
{"version":3,"file":"maptalks.3dtiles.js","sources":["../../../node_modules/.pnpm/frustum-intersects@0.2.4/node_modules/frustum-intersects/src/index.js","../../../node_modules/.pnpm/simple-swizzle@0.2.2/node_modules/simple-swizzle/index.js","../../../node_modules/.pnpm/is-arrayish@0.3.2/node_modules/is-arrayish/index.js","../../../node_modules/.pnpm/color-string@1.9.1/node_modules/color-string/index.js","../../../node_modules/.pnpm/color-name@1.1.4/node_modules/color-name/index.js","../../../node_modules/.pnpm/color-convert@1.9.3/node_modules/color-convert/conversions.js","../../../node_modules/.pnpm/color-name@1.1.3/node_modules/color-name/index.js","../../../node_modules/.pnpm/color-convert@1.9.3/node_modules/color-convert/route.js","../../../node_modules/.pnpm/color-convert@1.9.3/node_modules/color-convert/index.js","../../../node_modules/.pnpm/color@3.2.1/node_modules/color/index.js","../src/common/Util.js","../src/common/UrlUtil.js","../src/common/Constants.js","../../gl/dist/transcoders.js","../src/layer/Geo3DTilesWorkerConnection.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/common.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/mat4.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/vec3.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/quat.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/vec4.js","../../../node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/esm/mat3.js","../src/common/GLTFHelpers.js","../src/common/Transform.js","../src/common/Math.js","../src/common/TileHelper.js","../../../node_modules/.pnpm/colorin@0.5.0/node_modules/colorin/index.js","../../../node_modules/.pnpm/@maptalks+function-type@1.4.1/node_modules/@maptalks/function-type/index.js","../src/layer/renderer/TileMeshPainter.js","../src/layer/i3s/Util.js","../src/layer/i3s/I3SNode.js","../src/layer/i3s/I3SHelper.js","../src/layer/renderer/Geo3DTilesRenderer.js","../src/layer/renderer/LRUCache.js","../src/common/intersects_oriented_box.js","../src/layer/renderer/Rectangle.js","../src/layer/renderer/TileBoundingRegion.js","../src/layer/Geo3DTilesLayer.ts","../src/loaders/transcoders.js","../src/loaders/B3DMLoader.js","../src/loaders/I3DMLoader.js","../src/loaders/PNTSLoader.js","../src/loaders/CMPTLoader.js","../build/index.js"],"sourcesContent":["/*!\r\n* Contains code from THREE.js\r\n* MIT License\r\n* https://github.com/mrdoob/three.js\r\n*/\r\n\r\nvar planes = [];\r\nfor (var i = 0; i < 6; i++) {\r\n planes[i] = [];\r\n}\r\n\r\nexport function intersectsSphere(matrix, sphere, mask) {\r\n setPlanes(matrix);\r\n var center = sphere[0];\r\n var negRadius = -sphere[1];\r\n for (var i = 0; i < 6; i++) {\r\n if (mask && mask.charAt(i) === '0') {\r\n continue;\r\n }\r\n var distance = distanceToPoint(planes[i], center);\r\n if (distance < negRadius) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nvar p = [];\r\n\r\nexport function intersectsBox(matrix, box, mask) {\r\n setPlanes(matrix);\r\n for (var i = 0; i < 6; i++) {\r\n if (mask && mask.charAt(i) === '0') {\r\n continue;\r\n }\r\n var plane = planes[i];\r\n // corner at max distance\r\n p[0] = plane[0] > 0 ? box[1][0] : box[0][0];\r\n p[1] = plane[1] > 0 ? box[1][1] : box[0][1];\r\n p[2] = plane[2] > 0 ? box[1][2] : box[0][2];\r\n\r\n if (distanceToPoint(plane, p) < 0) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function intersectsOrientedBox(matrix, box, mask) {\r\n setPlanes(matrix);\r\n for (var i = 0; i < 6; i++) {\r\n if (mask && mask.charAt(i) === '0') {\r\n continue;\r\n }\r\n var plane = planes[i];\r\n if (!intersectsPlane(plane, box)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nvar COLUMN0ROW0 = 0 + 3, COLUMN0ROW1 = 1 + 3, COLUMN0ROW2 = 2 + 3, COLUMN1ROW0 = 3 + 3, COLUMN1ROW1 = 4 + 3, COLUMN1ROW2 = 5 + 3, COLUMN2ROW0 = 6 + 3, COLUMN2ROW1 = 7 + 3, COLUMN2ROW2 = 8 + 3;\r\n// const COLUMN0ROW0 = 0, COLUMN0ROW1 = 1, COLUMN0ROW2 = 2, COLUMN1ROW0 = 3, COLUMN1ROW1 = 4, COLUMN1ROW2 = 5, COLUMN2ROW0 = 6, COLUMN2ROW1 = 7, COLUMN2ROW2 = 8;\r\nvar BOX_CENTER = [];\r\nvar HALF_AXES = [];\r\n\r\nfunction intersectsPlane(plane, box) {\r\n var center = box;\r\n var normal = plane;\r\n var halfAxes = box;\r\n var normalX = normal[0], normalY = normal[1], normalZ = normal[2];\r\n // plane is used as if it is its normal; the first three components are assumed to be normalized\r\n var radEffective = Math.abs(normalX * halfAxes[COLUMN0ROW0] + normalY * halfAxes[COLUMN0ROW1] + normalZ * halfAxes[COLUMN0ROW2]) +\r\n Math.abs(normalX * halfAxes[COLUMN1ROW0] + normalY * halfAxes[COLUMN1ROW1] + normalZ * halfAxes[COLUMN1ROW2]) +\r\n Math.abs(normalX * halfAxes[COLUMN2ROW0] + normalY * halfAxes[COLUMN2ROW1] + normalZ * halfAxes[COLUMN2ROW2]);\r\n var distanceToPlane = distanceToPoint(plane, center);\r\n\r\n if (distanceToPlane <= -radEffective) {\r\n // The entire box is on the negative side of the plane normal\r\n // return Intersect.OUTSIDE;\r\n return false;\r\n } else if (distanceToPlane >= radEffective) {\r\n // The entire box is on the positive side of the plane normal\r\n // return Intersect.INSIDE;\r\n return true;\r\n }\r\n return true;\r\n // return Intersect.INTERSECTING;\r\n}\r\n\r\nfunction setPlanes(m) {\r\n var me = m;\r\n var me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3];\r\n var me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7];\r\n var me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11];\r\n var me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15];\r\n\r\n //right\r\n setComponents(planes[0], me3 - me0, me7 - me4, me11 - me8, me15 - me12);\r\n //left\r\n setComponents(planes[1], me3 + me0, me7 + me4, me11 + me8, me15 + me12);\r\n //bottom\r\n setComponents(planes[2], me3 + me1, me7 + me5, me11 + me9, me15 + me13);\r\n //top\r\n setComponents(planes[3], me3 - me1, me7 - me5, me11 - me9, me15 - me13);\r\n //z-far\r\n setComponents(planes[4], me3 - me2, me7 - me6, me11 - me10, me15 - me14);\r\n //z-near\r\n setComponents(planes[5], me3 + me2, me7 + me6, me11 + me10, me15 + me14);\r\n}\r\n\r\nfunction setComponents(out, x, y, z, w) {\r\n // THREE.js Plane.js\r\n var inverseNormalLength = 1 / Math.sqrt(x * x + y * y + z * z);\r\n out[0] = x * inverseNormalLength;\r\n out[1] = y * inverseNormalLength;\r\n out[2] = z * inverseNormalLength;\r\n out[3] = w * inverseNormalLength;\r\n return out;\r\n}\r\n\r\nfunction distanceToPoint(plane, p) {\r\n return plane[0] * p[0] + plane[1] * p[1] + plane[2] * p[2] + plane[3];\r\n}\r\n","'use strict';\n\nvar isArrayish = require('is-arrayish');\n\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\n\nvar swizzle = module.exports = function swizzle(args) {\n\tvar results = [];\n\n\tfor (var i = 0, len = args.length; i < len; i++) {\n\t\tvar arg = args[i];\n\n\t\tif (isArrayish(arg)) {\n\t\t\t// http://jsperf.com/javascript-array-concat-vs-push/98\n\t\t\tresults = concat.call(results, slice.call(arg));\n\t\t} else {\n\t\t\tresults.push(arg);\n\t\t}\n\t}\n\n\treturn results;\n};\n\nswizzle.wrap = function (fn) {\n\treturn function () {\n\t\treturn fn(swizzle(arguments));\n\t};\n};\n","module.exports = function isArrayish(obj) {\n\tif (!obj || typeof obj === 'string') {\n\t\treturn false;\n\t}\n\n\treturn obj instanceof Array || Array.isArray(obj) ||\n\t\t(obj.length >= 0 && (obj.splice instanceof Function ||\n\t\t\t(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));\n};\n","/* MIT license */\nvar colorNames = require('color-name');\nvar swizzle = require('simple-swizzle');\nvar hasOwnProperty = Object.hasOwnProperty;\n\nvar reverseNames = Object.create(null);\n\n// create a list of reverse color names\nfor (var name in colorNames) {\n\tif (hasOwnProperty.call(colorNames, name)) {\n\t\treverseNames[colorNames[name]] = name;\n\t}\n}\n\nvar cs = module.exports = {\n\tto: {},\n\tget: {}\n};\n\ncs.get = function (string) {\n\tvar prefix = string.substring(0, 3).toLowerCase();\n\tvar val;\n\tvar model;\n\tswitch (prefix) {\n\t\tcase 'hsl':\n\t\t\tval = cs.get.hsl(string);\n\t\t\tmodel = 'hsl';\n\t\t\tbreak;\n\t\tcase 'hwb':\n\t\t\tval = cs.get.hwb(string);\n\t\t\tmodel = 'hwb';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = cs.get.rgb(string);\n\t\t\tmodel = 'rgb';\n\t\t\tbreak;\n\t}\n\n\tif (!val) {\n\t\treturn null;\n\t}\n\n\treturn {model: model, value: val};\n};\n\ncs.get.rgb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar abbr = /^#([a-f0-9]{3,4})$/i;\n\tvar hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;\n\tvar rgba = /^rgba?\\(\\s*([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar keyword = /^(\\w+)$/;\n\n\tvar rgb = [0, 0, 0, 1];\n\tvar match;\n\tvar i;\n\tvar hexAlpha;\n\n\tif (match = string.match(hex)) {\n\t\thexAlpha = match[2];\n\t\tmatch = match[1];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\t// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19\n\t\t\tvar i2 = i * 2;\n\t\t\trgb[i] = parseInt(match.slice(i2, i2 + 2), 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(abbr)) {\n\t\tmatch = match[1];\n\t\thexAlpha = match[3];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(rgba)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i + 1], 0);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(per)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(keyword)) {\n\t\tif (match[1] === 'transparent') {\n\t\t\treturn [0, 0, 0, 0];\n\t\t}\n\n\t\tif (!hasOwnProperty.call(colorNames, match[1])) {\n\t\t\treturn null;\n\t\t}\n\n\t\trgb = colorNames[match[1]];\n\t\trgb[3] = 1;\n\n\t\treturn rgb;\n\t} else {\n\t\treturn null;\n\t}\n\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] = clamp(rgb[i], 0, 255);\n\t}\n\trgb[3] = clamp(rgb[3], 0, 1);\n\n\treturn rgb;\n};\n\ncs.get.hsl = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hsl = /^hsla?\\(\\s*([+-]?(?:\\d{0,3}\\.)?\\d+)(?:deg)?\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*(?:[,|\\/]\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hsl);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar s = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar l = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\n\t\treturn [h, s, l, a];\n\t}\n\n\treturn null;\n};\n\ncs.get.hwb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hwb = /^hwb\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hwb);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar w = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar b = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\treturn [h, w, b, a];\n\t}\n\n\treturn null;\n};\n\ncs.to.hex = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn (\n\t\t'#' +\n\t\thexDouble(rgba[0]) +\n\t\thexDouble(rgba[1]) +\n\t\thexDouble(rgba[2]) +\n\t\t(rgba[3] < 1\n\t\t\t? (hexDouble(Math.round(rgba[3] * 255)))\n\t\t\t: '')\n\t);\n};\n\ncs.to.rgb = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'\n\t\t: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';\n};\n\ncs.to.rgb.percent = function () {\n\tvar rgba = swizzle(arguments);\n\n\tvar r = Math.round(rgba[0] / 255 * 100);\n\tvar g = Math.round(rgba[1] / 255 * 100);\n\tvar b = Math.round(rgba[2] / 255 * 100);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'\n\t\t: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';\n};\n\ncs.to.hsl = function () {\n\tvar hsla = swizzle(arguments);\n\treturn hsla.length < 4 || hsla[3] === 1\n\t\t? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'\n\t\t: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';\n};\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\ncs.to.hwb = function () {\n\tvar hwba = swizzle(arguments);\n\n\tvar a = '';\n\tif (hwba.length >= 4 && hwba[3] !== 1) {\n\t\ta = ', ' + hwba[3];\n\t}\n\n\treturn 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';\n};\n\ncs.to.keyword = function (rgb) {\n\treturn reverseNames[rgb.slice(0, 3)];\n};\n\n// helpers\nfunction clamp(num, min, max) {\n\treturn Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n\tvar str = Math.round(num).toString(16).toUpperCase();\n\treturn (str.length < 2) ? '0' + str : str;\n}\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","/* MIT license */\nvar cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","var conversions = require('./conversions');\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","var conversions = require('./conversions');\nvar route = require('./route');\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","'use strict';\n\nvar colorString = require('color-string');\nvar convert = require('color-convert');\n\nvar _slice = [].slice;\n\nvar skippedModels = [\n\t// to be honest, I don't really feel like keyword belongs in color convert, but eh.\n\t'keyword',\n\n\t// gray conflicts with some method names, and has its own method defined.\n\t'gray',\n\n\t// shouldn't really be in color-convert either...\n\t'hex'\n];\n\nvar hashedModelKeys = {};\nObject.keys(convert).forEach(function (model) {\n\thashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model;\n});\n\nvar limiters = {};\n\nfunction Color(obj, model) {\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj, model);\n\t}\n\n\tif (model && model in skippedModels) {\n\t\tmodel = null;\n\t}\n\n\tif (model && !(model in convert)) {\n\t\tthrow new Error('Unknown model: ' + model);\n\t}\n\n\tvar i;\n\tvar channels;\n\n\tif (obj == null) { // eslint-disable-line no-eq-null,eqeqeq\n\t\tthis.model = 'rgb';\n\t\tthis.color = [0, 0, 0];\n\t\tthis.valpha = 1;\n\t} else if (obj instanceof Color) {\n\t\tthis.model = obj.model;\n\t\tthis.color = obj.color.slice();\n\t\tthis.valpha = obj.valpha;\n\t} else if (typeof obj === 'string') {\n\t\tvar result = colorString.get(obj);\n\t\tif (result === null) {\n\t\t\tthrow new Error('Unable to parse color from string: ' + obj);\n\t\t}\n\n\t\tthis.model = result.model;\n\t\tchannels = convert[this.model].channels;\n\t\tthis.color = result.value.slice(0, channels);\n\t\tthis.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;\n\t} else if (obj.length) {\n\t\tthis.model = model || 'rgb';\n\t\tchannels = convert[this.model].channels;\n\t\tvar newArr = _slice.call(obj, 0, channels);\n\t\tthis.color = zeroArray(newArr, channels);\n\t\tthis.valpha = typeof obj[channels] === 'number' ? obj[channels] : 1;\n\t} else if (typeof obj === 'number') {\n\t\t// this is always RGB - can be converted later on.\n\t\tobj &= 0xFFFFFF;\n\t\tthis.model = 'rgb';\n\t\tthis.color = [\n\t\t\t(obj >> 16) & 0xFF,\n\t\t\t(obj >> 8) & 0xFF,\n\t\t\tobj & 0xFF\n\t\t];\n\t\tthis.valpha = 1;\n\t} else {\n\t\tthis.valpha = 1;\n\n\t\tvar keys = Object.keys(obj);\n\t\tif ('alpha' in obj) {\n\t\t\tkeys.splice(keys.indexOf('alpha'), 1);\n\t\t\tthis.valpha = typeof obj.alpha === 'number' ? obj.alpha : 0;\n\t\t}\n\n\t\tvar hashedKeys = keys.sort().join('');\n\t\tif (!(hashedKeys in hashedModelKeys)) {\n\t\t\tthrow new Error('Unable to parse color from object: ' + JSON.stringify(obj));\n\t\t}\n\n\t\tthis.model = hashedModelKeys[hashedKeys];\n\n\t\tvar labels = convert[this.model].labels;\n\t\tvar color = [];\n\t\tfor (i = 0; i < labels.length; i++) {\n\t\t\tcolor.push(obj[labels[i]]);\n\t\t}\n\n\t\tthis.color = zeroArray(color);\n\t}\n\n\t// perform limitations (clamping, etc.)\n\tif (limiters[this.model]) {\n\t\tchannels = convert[this.model].channels;\n\t\tfor (i = 0; i < channels; i++) {\n\t\t\tvar limit = limiters[this.model][i];\n\t\t\tif (limit) {\n\t\t\t\tthis.color[i] = limit(this.color[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.valpha = Math.max(0, Math.min(1, this.valpha));\n\n\tif (Object.freeze) {\n\t\tObject.freeze(this);\n\t}\n}\n\nColor.prototype = {\n\ttoString: function () {\n\t\treturn this.string();\n\t},\n\n\ttoJSON: function () {\n\t\treturn this[this.model]();\n\t},\n\n\tstring: function (places) {\n\t\tvar self = this.model in colorString.to ? this : this.rgb();\n\t\tself = self.round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to[self.model](args);\n\t},\n\n\tpercentString: function (places) {\n\t\tvar self = this.rgb().round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to.rgb.percent(args);\n\t},\n\n\tarray: function () {\n\t\treturn this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);\n\t},\n\n\tobject: function () {\n\t\tvar result = {};\n\t\tvar channels = convert[this.model].channels;\n\t\tvar labels = convert[this.model].labels;\n\n\t\tfor (var i = 0; i < channels; i++) {\n\t\t\tresult[labels[i]] = this.color[i];\n\t\t}\n\n\t\tif (this.valpha !== 1) {\n\t\t\tresult.alpha = this.valpha;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tunitArray: function () {\n\t\tvar rgb = this.rgb().color;\n\t\trgb[0] /= 255;\n\t\trgb[1] /= 255;\n\t\trgb[2] /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.push(this.valpha);\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tunitObject: function () {\n\t\tvar rgb = this.rgb().object();\n\t\trgb.r /= 255;\n\t\trgb.g /= 255;\n\t\trgb.b /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.alpha = this.valpha;\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tround: function (places) {\n\t\tplaces = Math.max(places || 0, 0);\n\t\treturn new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);\n\t},\n\n\talpha: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(this.color.concat(Math.max(0, Math.min(1, val))), this.model);\n\t\t}\n\n\t\treturn this.valpha;\n\t},\n\n\t// rgb\n\tred: getset('rgb', 0, maxfn(255)),\n\tgreen: getset('rgb', 1, maxfn(255)),\n\tblue: getset('rgb', 2, maxfn(255)),\n\n\thue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, function (val) { return ((val % 360) + 360) % 360; }), // eslint-disable-line brace-style\n\n\tsaturationl: getset('hsl', 1, maxfn(100)),\n\tlightness: getset('hsl', 2, maxfn(100)),\n\n\tsaturationv: getset('hsv', 1, maxfn(100)),\n\tvalue: getset('hsv', 2, maxfn(100)),\n\n\tchroma: getset('hcg', 1, maxfn(100)),\n\tgray: getset('hcg', 2, maxfn(100)),\n\n\twhite: getset('hwb', 1, maxfn(100)),\n\twblack: getset('hwb', 2, maxfn(100)),\n\n\tcyan: getset('cmyk', 0, maxfn(100)),\n\tmagenta: getset('cmyk', 1, maxfn(100)),\n\tyellow: getset('cmyk', 2, maxfn(100)),\n\tblack: getset('cmyk', 3, maxfn(100)),\n\n\tx: getset('xyz', 0, maxfn(100)),\n\ty: getset('xyz', 1, maxfn(100)),\n\tz: getset('xyz', 2, maxfn(100)),\n\n\tl: getset('lab', 0, maxfn(100)),\n\ta: getset('lab', 1),\n\tb: getset('lab', 2),\n\n\tkeyword: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn convert[this.model].keyword(this.color);\n\t},\n\n\thex: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn colorString.to.hex(this.rgb().round().color);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.rgb().color;\n\t\treturn ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.rgb().color;\n\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tisDark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.rgb().color;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tisLight: function () {\n\t\treturn !this.isDark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = this.rgb();\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb.color[i] = 255 - rgb.color[i];\n\t\t}\n\t\treturn rgb;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] += hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] -= hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] += hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] -= hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[1] += hwb.color[1] * ratio;\n\t\treturn hwb;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[2] += hwb.color[2] * ratio;\n\t\treturn hwb;\n\t},\n\n\tgrayscale: function () {\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar rgb = this.rgb().color;\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\treturn Color.rgb(val, val, val);\n\t},\n\n\tfade: function (ratio) {\n\t\treturn this.alpha(this.valpha - (this.valpha * ratio));\n\t},\n\n\topaquer: function (ratio) {\n\t\treturn this.alpha(this.valpha + (this.valpha * ratio));\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.hsl();\n\t\tvar hue = hsl.color[0];\n\t\thue = (hue + degrees) % 360;\n\t\thue = hue < 0 ? 360 + hue : hue;\n\t\thsl.color[0] = hue;\n\t\treturn hsl;\n\t},\n\n\tmix: function (mixinColor, weight) {\n\t\t// ported from sass implementation in C\n\t\t// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t\tif (!mixinColor || !mixinColor.rgb) {\n\t\t\tthrow new Error('Argument to \"mix\" was not a Color instance, but rather an instance of ' + typeof mixinColor);\n\t\t}\n\t\tvar color1 = mixinColor.rgb();\n\t\tvar color2 = this.rgb();\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn Color.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue(),\n\t\t\t\tcolor1.alpha() * p + color2.alpha() * (1 - p));\n\t}\n};\n\n// model conversion methods and static constructors\nObject.keys(convert).forEach(function (model) {\n\tif (skippedModels.indexOf(model) !== -1) {\n\t\treturn;\n\t}\n\n\tvar channels = convert[model].channels;\n\n\t// conversion methods\n\tColor.prototype[model] = function () {\n\t\tif (this.model === model) {\n\t\t\treturn new Color(this);\n\t\t}\n\n\t\tif (arguments.length) {\n\t\t\treturn new Color(arguments, model);\n\t\t}\n\n\t\tvar newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha;\n\t\treturn new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model);\n\t};\n\n\t// 'static' construction methods\n\tColor[model] = function (color) {\n\t\tif (typeof color === 'number') {\n\t\t\tcolor = zeroArray(_slice.call(arguments), channels);\n\t\t}\n\t\treturn new Color(color, model);\n\t};\n});\n\nfunction roundTo(num, places) {\n\treturn Number(num.toFixed(places));\n}\n\nfunction roundToPlace(places) {\n\treturn function (num) {\n\t\treturn roundTo(num, places);\n\t};\n}\n\nfunction getset(model, channel, modifier) {\n\tmodel = Array.isArray(model) ? model : [model];\n\n\tmodel.forEach(function (m) {\n\t\t(limiters[m] || (limiters[m] = []))[channel] = modifier;\n\t});\n\n\tmodel = model[0];\n\n\treturn function (val) {\n\t\tvar result;\n\n\t\tif (arguments.length) {\n\t\t\tif (modifier) {\n\t\t\t\tval = modifier(val);\n\t\t\t}\n\n\t\t\tresult = this[model]();\n\t\t\tresult.color[channel] = val;\n\t\t\treturn result;\n\t\t}\n\n\t\tresult = this[model]().color[channel];\n\t\tif (modifier) {\n\t\t\tresult = modifier(result);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nfunction maxfn(max) {\n\treturn function (v) {\n\t\treturn Math.max(0, Math.min(max, v));\n\t};\n}\n\nfunction assertArray(val) {\n\treturn Array.isArray(val) ? val : [val];\n}\n\nfunction zeroArray(arr, length) {\n\tfor (var i = 0; i < length; i++) {\n\t\tif (typeof arr[i] !== 'number') {\n\t\t\tarr[i] = 0;\n\t\t}\n\t}\n\n\treturn arr;\n}\n\nmodule.exports = Color;\n","import Color from 'color';\nexport function isNil(v) {\n return v === undefined || v === null;\n}\n\nexport function extend(dest) { // (Object[, Object, ...]) ->\n for (let i = 1; i < arguments.length; i++) {\n const src = arguments[i];\n for (const k in src) {\n dest[k] = src[k];\n }\n }\n return dest;\n}\n\nexport function isFunction(obj) {\n if (obj === null || obj === undefined) {\n return false;\n }\n return typeof obj === 'function' || (obj.constructor !== null && obj.constructor === Function);\n}\n\n/**\n * Whether the obj is a javascript object.\n * @param {Object} obj - object\n * @return {Boolean}\n * @memberOf Util\n */\nexport function isObject(obj) {\n return typeof obj === 'object' && !!obj;\n}\n\n/**\n * Whether val is a number and not a NaN.\n * @param {Object} val - val\n * @return {Boolean}\n * @memberOf Util\n */\nexport function isNumber(val) {\n return (typeof val === 'number') && !isNaN(val);\n}\n\nexport function toRadian(d) {\n return d * Math.PI / 180;\n}\n\nexport function toDegree(d) {\n return d / Math.PI * 180;\n}\n\nexport function getAbsoluteURL(url) {\n let a = document.createElement('a');\n a.href = url;\n url = a.href;\n a = null;\n return url;\n}\n\nexport function sign(x) {\n if (Math.sign) {\n return Math.sign(x);\n }\n x = +x; // convert to a number\n if (x === 0 || isNaN(x)) {\n return Number(x);\n }\n return x > 0 ? 1 : -1;\n}\n\nconst extraByteMap = [1, 1, 1, 1, 2, 2, 3, 0];\n\nexport function stringFromUTF8Array(data) {\n const count = data.length;\n let str = '';\n\n for (let index = 0; index < count;) {\n let ch = data[index++];\n if (ch & 0x80) {\n let extra = extraByteMap[(ch >> 3) & 0x07];\n if (!(ch & 0x40) || !extra || ((index + extra) > count))\n return null;\n\n ch = ch & (0x3F >> extra);\n for (;extra > 0; extra -= 1) {\n const chx = data[index++];\n if ((chx & 0xC0) !== 0x80)\n return null;\n\n ch = (ch << 6) | (chx & 0x3F);\n }\n }\n\n str += String.fromCharCode(ch);\n }\n return str;\n}\n\n// 给 Matrix3 指定某列设置数据\nexport function setColumn3(out, arr, col) {\n out[3 * col] = arr[0];\n out[3 * col + 1] = arr[1];\n out[3 * col + 2] = arr[2];\n return out;\n}\n\nexport function flatArr(arr) {\n if (arr.flat) {\n return arr.flat(Infinity);\n } else {\n return arr.reduce((acc, val) => acc.concat(val), []);\n }\n}\n\nexport function getBatchIdArrayType(max) {\n if (max < 256) return Uint8Array;\n if (max < 65536) return Uint16Array;\n return Uint32Array;\n}\n\n// const base64Matcher = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\n\nexport function isBase64(url) {\n return url.indexOf('data:') === 0;\n}\n\nexport function base64URLToArrayBuffer(url) {\n const firstDot = url.indexOf('base64,');\n const base64 = url.substring(firstDot + 7);\n const binary_string = window.atob(base64);\n const len = binary_string.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binary_string.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\nexport function pushIn(dest) {\n for (let i = 1; i < arguments.length; i++) {\n const src = arguments[i];\n if (src) {\n for (let ii = 0, ll = src.length; ii < ll; ii++) {\n dest.push(src[ii]);\n }\n }\n }\n return dest.length;\n}\n\nconst colorCache = {};\nexport function normalizeColor(out, color) {\n if (!Array.isArray(color)) {\n const key = color;\n color = colorCache[key] = colorCache[key] || Color(color).array().map(v => { return v / 255; });\n }\n for (let i = 0; i < color.length; i++) {\n out[i] = color[i];\n }\n if (color.length === 3) {\n out[3] = 1;\n }\n return out;\n}\n","export function isRelativeURL(url) {\n return url.indexOf('http://') === -1 && url.indexOf('https://') === -1 && url.indexOf('file://') === -1;\n}\n\nexport function prepareFetchOptions(fetchOptions) {\n fetchOptions = fetchOptions || {};\n fetchOptions.referrerPolicy = fetchOptions.referrerPolicy || 'origin';\n fetchOptions.referrer = window && window.location.href;\n return fetchOptions;\n}\n","export const CANDIDATE_MAX_ERROR = 500;\nexport const DEFAULT_MAXIMUMSCREENSPACEERROR = 16;\n","/*!\n * @maptalks/gl v0.118.0\n * LICENSE : UNLICENSED\n * (c) 2016-2025 maptalks.com\n */\nconst n = function() {\n if (\"undefined\" != typeof globalThis) return globalThis;\n if (\"undefined\" != typeof self) return self;\n if (\"undefined\" != typeof window) return window;\n if (\"undefined\" != typeof global) return global;\n throw new Error(\"unable to locate global object\");\n}, t = n(), e = t.gl_trans__coders = t.gl_trans__coders || {};\n\nfunction r(n) {\n return e[n];\n}\n\nfunction _(n, t) {\n e[n] = t;\n}\n\nfunction o() {\n return n().maptalks_gltf_loader;\n}\n\nfunction l(t) {\n n().maptalks_gltf_loader_bundle = t;\n}\n\ne.inject = function(e) {\n const r = e.toString(), _ = r.indexOf(\"{\") + 1, o = r.substring(0, _), l = t.gl_trans__coders = t.gl_trans__coders || {};\n let s = `${o}\\n const _____getGlobal = ${n.toString()};\\n const g___lobals = _____getGlobal()\\n const tran_____scoders = g___lobals['gl_trans__coders'] = g___lobals['gl_trans__coders'] || {};`;\n for (const n in l) \"inject\" !== n && \"getTranscoder\" !== n && \"registerTranscoder\" !== n && (s += 'tran_____scoders[\"' + n + '\"] =' + l[n].toString() + \"\\n;\");\n return s += \"\\n(\" + n().maptalks_gltf_loader_bundle.toString() + \")({});\\n\", s += \"\\n\" + r.substring(o.length), \n s;\n}, e.registerTranscoder = _, e.getTranscoder = r;\n\nexport { e as default, o as getGLTFLoaderBundle, r as getTranscoder, l as registerGLTFLoaderBundle, _ as registerTranscoder };\n","import * as maptalks from 'maptalks';\n\nconst canvas = typeof document === 'undefined' ? null : document.createElement('canvas');\n\nexport default class Geo3DTilesWorkerConnection extends maptalks.worker.Actor {\n constructor(workerKey, mapId, supportNPOT) {\n super(workerKey);\n this.mapId = mapId;\n this._supportNPOT = supportNPOT;\n }\n\n initialize(cb) {\n cb(null);\n }\n\n loadTile(layerId, params, cb) {\n let buffers = null;\n if (params && params.arraybuffer) {\n buffers = [params.arraybuffer];\n }\n const data = {\n mapId : this.mapId,\n layerId,\n command : 'loadTile',\n params\n };\n this.send(data, buffers, cb);\n }\n\n abortTileLoading(layerId, url, cb) {\n const data = {\n mapId : this.mapId,\n layerId,\n command : 'abortTileLoading',\n params : {\n url\n }\n };\n this.broadcast(data, null, cb);\n }\n\n addLayer(layerId, options, cb) {\n const data = {\n actorId: this.actorId,\n mapId : this.mapId,\n layerId,\n command : 'addLayer',\n params : {\n options\n }\n };\n\n this.broadcast(data, null, cb);\n }\n\n removeLayer(layerId, cb) {\n const data = {\n mapId : this.mapId,\n layerId,\n command : 'removeLayer'\n };\n this.broadcast(data, null, cb);\n }\n\n requestImage({ url }, cb) {\n const image = new Image();\n image.onload = () => {\n if (!this.isActive()) {\n return;\n }\n if (!canvas) {\n cb(new Error('There is no canvas to draw image!'));\n return;\n }\n const img = this._supportNPOT ? image : resize(image);\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n ctx.drawImage(img, 0, 0, img.width, img.height);\n const imgData = ctx.getImageData(0, 0, img.width, img.height);\n //TODO, retina may need special operations\n const result = { width : img.width, height : img.height, data : new Uint8Array(imgData.data) };\n cb(null, result, [result.data.buffer]);\n };\n image.onerror = function (err) {\n cb(err);\n };\n image.src = url;\n }\n}\n\nfunction resize(image) {\n if (isPowerOfTwo(image.width) && isPowerOfTwo(image.height)) {\n return image;\n }\n let width = image.width;\n let height = image.height;\n if (!isPowerOfTwo(width)) {\n width = floorPowerOfTwo(width);\n }\n if (!isPowerOfTwo(height)) {\n height = floorPowerOfTwo(height);\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n canvas.getContext('2d').drawImage(image, 0, 0, width, height);\n const url = image.src;\n const idx = url.lastIndexOf('/') + 1;\n const filename = url.substring(idx);\n console.warn(`Texture(${filename})'s size is not power of two, resize from (${image.width}, ${image.height}) to (${width}, ${height})`);\n return canvas;\n}\n\nfunction isPowerOfTwo(value) {\n return (value & (value - 1)) === 0 && value !== 0;\n}\n\nfunction floorPowerOfTwo(value) {\n return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));\n}\n","/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\nimport { mat4, quat } from 'gl-matrix';\n\nconst { GLTFLoader } = getGLTFLoaderBundle();\n\nexport function iterateMesh(gltf, cb) {\n if (!gltf.scenes || !gltf.scenes.length) {\n return;\n }\n for (let i0 = 0, l0 = gltf.scenes.length; i0 < l0; i0++) {\n const nodes = gltf.scenes[i0].nodes;\n for (let i = 0, l = nodes.length; i < l; i++) {\n const matrices = [];\n const node = nodes[i];\n iterateNode(node, matrices, gltf, cb);\n // if (node.children && node.children.length) {\n // for (let ii = 0, ll = node.children.length; ii < ll; ii++) {\n // iterateNode(node.children[i], matrices, gltf, cb);\n // }\n // }\n }\n }\n}\n\nconst TMAT = [];\nconst RMAT = [];\nconst SMAT = [];\nconst EMPTY_T = [0, 0, 0];\nconst EMTPY_Q = quat.identity([]);\nconst EMPTY_S = [1, 1, 1];\n\nfunction iterateNode(node, nodeMatrices, gltf, cb) {\n const matrices = nodeMatrices.slice(0);\n if (node.matrix) {\n matrices.push(node.matrix);\n } else if (node.rotation || node.translation || node.scale) {\n const tm = mat4.fromTranslation(TMAT, node.translation || EMPTY_T);\n const rm = mat4.fromQuat(RMAT, node.rotation || EMTPY_Q);\n const sm = mat4.fromScaling(SMAT, node.scale || EMPTY_S);\n mat4.multiply(sm, rm, sm);\n const matrix = mat4.multiply([], tm, sm);\n matrices.push(matrix);\n }\n if (node.children && node.children.length) {\n for (let ii = 0, ll = node.children.length; ii < ll; ii++) {\n iterateNode(node.children[ii], matrices, gltf, cb);\n }\n }\n if (node.mesh !== undefined) {\n const meshIndex = node.mesh;\n const mesh = gltf.meshes[meshIndex];\n if (mesh) {\n const mat = matrices.slice(0);\n const primitives = mesh.primitives;\n for (let ii = 0, ll = primitives.length; ii < ll; ii++) {\n const primitive = primitives[ii];\n if (primitive) {\n primitive.matrices = mat;\n cb(primitive, meshIndex, ii, gltf);\n }\n }\n }\n }\n // if (node.meshes && node.meshes.length) {\n // for (let i = 0, l = node.meshes.length; i < l; i++) {\n // const mesh = node.meshes[i];\n // if (mesh) {\n // const mat = matrices.slice(0);\n // const primitives = mesh.primitives;\n // for (let ii = 0, ll = primitives.length; ii < ll; ii++) {\n // const primitive = primitives[ii];\n // if (primitive) {\n // primitive.matrices = mat;\n // cb(primitive, gltf);\n // }\n // }\n // }\n // }\n // }\n\n}\n\n// 遍历 GLTF-Loader 返回的bufferData\nexport function iterateBufferData(arr, cb) {\n let { byteOffset, byteStride: stride, count } = arr;\n const { componentType, itemSize } = arr;\n const arrayBuffer = arr.array.buffer;\n const ctor = componentType ? GLTFLoader.getTypedArrayCtor(componentType) : arr.array.constructor;\n byteOffset = byteOffset === undefined ? arr.array.byteOffset : byteOffset;\n stride = stride || 0;\n count = count || arr.array.length / itemSize;\n if ((!stride || stride === itemSize * ctor.BYTES_PER_ELEMENT) && byteOffset % ctor.BYTES_PER_ELEMENT === 0) {\n const src = new ctor(arrayBuffer, byteOffset, count * itemSize);\n for (let i = 0; i < count * itemSize; i+= itemSize) {\n const tempTypeArray = new ctor(src.buffer, byteOffset + i * ctor.BYTES_PER_ELEMENT, itemSize);\n cb(tempTypeArray, i / itemSize);\n }\n return;\n }\n const tempUint8 = new Uint8Array(itemSize * ctor.BYTES_PER_ELEMENT);\n if (!stride) {\n stride = itemSize * ctor.BYTES_PER_ELEMENT;\n }\n for (let i = 0; i < count; i++) {\n const start = stride * i + byteOffset;\n const uint8Arr = new Uint8Array(arrayBuffer, start, itemSize * ctor.BYTES_PER_ELEMENT);\n tempUint8.set(uint8Arr);\n const item = new ctor(tempUint8.buffer);\n cb(item, i);\n uint8Arr.set(tempUint8);\n }\n}\n\n\n// 从 GLTF-Loader 返回的bufferData获取指定位置的数据\nexport function getItemAtBufferData(out, arr, index) {\n let { byteOffset, byteStride: stride } = arr;\n const { componentType, itemSize } = arr;\n const arrayBuffer = arr.array.buffer;\n const ctor = componentType ? GLTFLoader.getTypedArrayCtor(componentType) : arr.array.constructor;\n byteOffset = byteOffset === undefined ? arr.array.byteOffset : byteOffset;\n stride = stride || 0;\n if (!stride || (stride === itemSize * ctor.BYTES_PER_ELEMENT && byteOffset % ctor.BYTES_PER_ELEMENT === 0)) {\n const src = new ctor(arrayBuffer, byteOffset + index * itemSize * ctor.BYTES_PER_ELEMENT, itemSize);\n out.set(src);\n return out;\n }\n if (!stride) {\n stride = itemSize * ctor.BYTES_PER_ELEMENT;\n }\n const start = stride * index + byteOffset;\n const uint8Arr = new Uint8Array(arrayBuffer, start, itemSize * ctor.BYTES_PER_ELEMENT);\n const tempUint8 = new Uint8Array(out.buffer);\n tempUint8.set(uint8Arr);\n return out;\n\n}\n\nexport function setInstanceData(out, idx, matrix, row) {\n out[idx * 4] = matrix[row];\n out[idx * 4 + 1] = matrix[row + 4];\n out[idx * 4 + 2] = matrix[row + 8];\n out[idx * 4 + 3] = matrix[row + 12];\n}\n\n\nexport function binarizeGLTF(rawGLTF, glb) {\n const encoder = new TextEncoder();\n const rawGLTFData = encoder.encode(JSON.stringify(rawGLTF));\n // const binaryGLTFData = new Uint8Array(rawGLTFData.byteLength + 20);\n\n let chunkPadding = 0;\n if (rawGLTFData.byteLength % 4 !== 0) {\n chunkPadding = 4 - rawGLTFData.byteLength % 4;\n }\n // JSON的长度是 rawGLTFData.byteLength + 20\n const binaryGLTFData = new Uint8Array(rawGLTFData.byteLength + 20 + chunkPadding + glb.byteLength + 8);\n const binaryGLTF = {\n magic: new Uint8Array(binaryGLTFData.buffer, 0, 4),\n version: new Uint32Array(binaryGLTFData.buffer, 4, 1),\n length: new Uint32Array(binaryGLTFData.buffer, 8, 1),\n chunkLength: new Uint32Array(binaryGLTFData.buffer, 12, 1),\n chunkType: new Uint32Array(binaryGLTFData.buffer, 16, 1),\n chunkData: new Uint8Array(\n binaryGLTFData.buffer,\n 20,\n rawGLTFData.byteLength\n ),\n chunk1Length: new Uint32Array(binaryGLTFData.buffer, chunkPadding + 20 + rawGLTFData.byteLength, 1),\n chunk1Type: new Uint32Array(binaryGLTFData.buffer, chunkPadding + 24 + rawGLTFData.byteLength, 1),\n chunk1Data: new Uint8Array(\n binaryGLTFData.buffer,\n chunkPadding + 20 + rawGLTFData.byteLength + 4 + 4,\n glb.byteLength\n )\n };\n\n for (let i = 0; i < chunkPadding; i++) {\n // chunkPadding 用空格补充\n binaryGLTFData[rawGLTFData.byteLength + 20 + i] = 32;\n }\n\n binaryGLTF.magic[0] = \"g\".charCodeAt();\n binaryGLTF.magic[1] = \"l\".charCodeAt();\n binaryGLTF.magic[2] = \"T\".charCodeAt();\n binaryGLTF.magic[3] = \"F\".charCodeAt();\n\n binaryGLTF.version[0] = 2;\n binaryGLTF.length[0] = binaryGLTFData.byteLength;\n binaryGLTF.chunkLength[0] = rawGLTFData.byteLength + chunkPadding;\n binaryGLTF.chunkType[0] = 0x4e4f534a; // JSON\n binaryGLTF.chunkData.set(rawGLTFData);\n\n binaryGLTF.chunk1Length[0] = glb.byteLength;\n binaryGLTF.chunk1Type[0] = 0x004E4942;\n binaryGLTF.chunk1Data.set(glb);\n\n return binaryGLTFData;\n}\n\nexport function binarizeB3DM(featureTableJSON, batchTabelJSON, binaryGLTFData) {\n const encoder = new TextEncoder();\n\n // Feature Table\n const featureTableOffset = 28;\n const featureTableJSONData = encoder.encode(featureTableJSON);\n const featureTableLength = featureTableJSONData.byteLength;\n\n // Batch Table\n const batchTableOffset = featureTableOffset + featureTableLength;\n const batchTableJSONData = encoder.encode(batchTabelJSON);\n\n // Calculate alignment buffer by padding the remainder of the batch table\n const paddingCount = (batchTableOffset + batchTableJSONData.byteLength) % 8;\n const batchTableLength = batchTableJSONData.byteLength + paddingCount;\n const paddingStart = batchTableJSONData.byteLength;\n const paddingStop = batchTableLength;\n\n // Binary GLTF\n const binaryGLTFOffset = batchTableOffset + batchTableLength;\n const binaryGLTFLength = binaryGLTFData.byteLength;\n\n const dataSize = featureTableLength + batchTableLength + binaryGLTFLength;\n const b3dmRawData = new Uint8Array(28 + dataSize);\n\n const b3dmData = {\n magic: new Uint8Array(b3dmRawData.buffer, 0, 4),\n version: new Uint32Array(b3dmRawData.buffer, 4, 1),\n byteLength: new Uint32Array(b3dmRawData.buffer, 8, 1),\n featureTableJSONByteLength: new Uint32Array(b3dmRawData.buffer, 12, 1),\n featureTableBinaryByteLength: new Uint32Array(b3dmRawData.buffer, 16, 1),\n batchTableJSONByteLength: new Uint32Array(b3dmRawData.buffer, 20, 1),\n batchTableBinaryByteLength: new Uint32Array(b3dmRawData.buffer, 24, 1),\n featureTable: new Uint8Array(\n b3dmRawData.buffer,\n featureTableOffset,\n featureTableLength\n ),\n batchTable: new Uint8Array(\n b3dmRawData.buffer,\n batchTableOffset,\n batchTableLength\n ),\n binaryGLTF: new Uint8Array(\n b3dmRawData.buffer,\n binaryGLTFOffset,\n binaryGLTFLength\n ),\n };\n\n b3dmData.magic[0] = \"b\".charCodeAt();\n b3dmData.magic[1] = \"3\".charCodeAt();\n b3dmData.magic[2] = \"d\".charCodeAt();\n b3dmData.magic[3] = \"m\".charCodeAt();\n\n b3dmData.version[0] = 1;\n b3dmData.byteLength[0] = b3dmRawData.byteLength;\n\n b3dmData.featureTable.set(featureTableJSONData);\n b3dmData.featureTableJSONByteLength[0] = featureTableLength;\n b3dmData.featureTableBinaryByteLength[0] = 0;\n\n b3dmData.batchTable.set(batchTableJSONData);\n for(let index = paddingStart; index < paddingStop; ++index) {\n b3dmData.batchTable[index] = 0x20;\n }\n b3dmData.batchTableJSONByteLength[0] = batchTableLength;\n b3dmData.batchTableBinaryByteLength[0] = 0;\n b3dmData.binaryGLTF.set(binaryGLTFData);\n\n return b3dmRawData;\n}\n","//---------------------------\n// Cesium Codes for catersian and quaternion transformation\n//\n// All credit goes to Cesium team and Cesium Contributors\n// LICENSE : Apache License\n//---------------------------\nimport { vec3 } from 'gl-matrix';\nimport { toDegree, sign } from './Util';\n\n\n//reusable variables for radianToCartesian3\nconst scratchN = new Array(3),\n scratchK = new Array(3);\n\nconst wgs84RadiiSquared = [6378137.0 * 6378137.0, 6378137.0 * 6378137.0, 6356752.3142451793 * 6356752.3142451793];\n\n/**\n * from Cesium\n * Convert radians to Cartesian3 coordinate\n * from Cesium Cartesian3.fromRadians\n * @param {Number} longitude in radians\n * @param {Number} latitude in radians\n * @param {Number} height in meters\n * @param {Number} radius earth sphere's radius\n * @returns {Number[]} coordinate in Cartesian3\n */\nexport function radianToCartesian3(out, longitude, latitude, height) {\n const radiiSquared = wgs84RadiiSquared;\n\n const cosLatitude = Math.cos(latitude);\n scratchN[0] = cosLatitude * Math.cos(longitude);\n scratchN[1] = cosLatitude * Math.sin(longitude);\n scratchN[2] = Math.sin(latitude);\n normalizeCartesian(scratchN, scratchN);\n\n vec3.multiply(scratchK, radiiSquared, scratchN);\n const gamma = Math.sqrt(vec3.dot(scratchN, scratchK));\n divideByScalar(scratchK, scratchK, gamma);\n vec3.scale(scratchN, scratchN, height);\n\n return vec3.add(out, scratchK, scratchN);\n}\n\n//reusable variables for cartesian3ToDegree\nconst wgs84OneOverRadii = [1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.3142451793];\nconst wgs84OneOverRadiiSquared = [1.0 / (6378137 * 6378137), 1.0 / (6378137 * 6378137), 1.0 / (6356752.3142451793 * 6356752.3142451793)];\n\nconst cartesianToCartographicP = new Array(3);\nconst cartesianToCartographicN = new Array(3);\nconst cartesianToCartographicH = new Array(3);\n\n/**\n * from Cesium\n * Creates a new Cartographic instance from a Cartesian position. The values in the\n * resulting object will be in radians.\n *\n * @param cartesian The Cartesian position to convert to cartographic representation.\n * @returns {Cartographic} The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.\n */\nexport function cartesian3ToDegree(result, cartesian) {\n const oneOverRadii = wgs84OneOverRadii;\n const oneOverRadiiSquared = wgs84OneOverRadiiSquared;\n const centerToleranceSquared = 0.1;\n\n //`cartesian is required.` is thrown from scaleToGeodeticSurface\n const p = scaleToGeodeticSurface(cartesianToCartographicP, cartesian, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared);\n\n let n = vec3.mul(cartesianToCartographicN, p, oneOverRadiiSquared);\n n = normalizeCartesian(n, n);\n\n const h = vec3.sub(cartesianToCartographicH, cartesian, p);\n\n const longitude = Math.atan2(n[1], n[0]);\n const latitude = Math.asin(n[2]);\n const height = sign(vec3.dot(h, cartesian)) * magnitude(h);\n\n result[0] = toDegree(longitude);\n result[1] = toDegree(latitude);\n result[2] = height;\n return result;\n}\n\n//reusable variables for scaleToGeodeticSurface\nconst scaleToGeodeticSurfaceIntersection = new Array(3);\nconst scaleToGeodeticSurfaceGradient = new Array(3);\nconst EPSILON12 = 1E-12;\n\n/**\n * from Cesium\n * Scales the provided Cartesian position along the geodetic surface normal\n * so that it is on the surface of this ellipsoid. If the position is\n * at the center of the ellipsoid, this function returns undefined.\n *\n * @param {Cartesian3} cartesian The Cartesian position to scale.\n * @param {Cartesian3} oneOverRadii One over radii of the ellipsoid.\n * @param {Cartesian3} oneOverRadiiSquared One over radii squared of the ellipsoid.\n * @param {Number} centerToleranceSquared Tolerance for closeness to the center.\n * @param {Cartesian3} [result] The object onto which to store the result.\n * @returns {Cartesian3} The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center.\n *\n * @exports scaleToGeodeticSurface\n *\n * @private\n */\nfunction scaleToGeodeticSurface(result, cartesian, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared) {\n\n const positionX = cartesian[0];\n const positionY = cartesian[1];\n const positionZ = cartesian[2];\n\n const oneOverRadiiX = oneOverRadii[0];\n const oneOverRadiiY = oneOverRadii[1];\n const oneOverRadiiZ = oneOverRadii[2];\n\n const x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX;\n const y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY;\n const z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ;\n\n // Compute the squared ellipsoid norm.\n const squaredNorm = x2 + y2 + z2;\n const ratio = Math.sqrt(1.0 / squaredNorm);\n\n // As an initial approximation, assume that the radial intersection is the projection point.\n // const intersection = Cartesian3.multiplyByScalar(cartesian, ratio, scaleToGeodeticSurfaceIntersection);\n const intersection = vec3.scale(scaleToGeodeticSurfaceIntersection, cartesian, ratio);\n\n // If the position is near the center, the iteration will not converge.\n if (squaredNorm < centerToleranceSquared) {\n return !isFinite(ratio) ? undefined : intersection;\n }\n\n const oneOverRadiiSquaredX = oneOverRadiiSquared[0];\n const oneOverRadiiSquaredY = oneOverRadiiSquared[1];\n const oneOverRadiiSquaredZ = oneOverRadiiSquared[2];\n\n // Use the gradient at the intersection point in place of the true unit normal.\n // The difference in magnitude will be absorbed in the multiplier.\n const gradient = scaleToGeodeticSurfaceGradient;\n gradient[0] = intersection[0] * oneOverRadiiSquaredX * 2.0;\n gradient[1] = intersection[1] * oneOverRadiiSquaredY * 2.0;\n gradient[2] = intersection[2] * oneOverRadiiSquaredZ * 2.0;\n\n // Compute the initial guess at the normal vector multiplier, lambda.\n let lambda = (1.0 - ratio) * magnitude(cartesian) / (0.5 * magnitude(gradient));\n let correction = 0.0;\n\n let func;\n let denominator;\n let xMultiplier;\n let yMultiplier;\n let zMultiplier;\n let xMultiplier2;\n let yMultiplier2;\n let zMultiplier2;\n let xMultiplier3;\n let yMultiplier3;\n let zMultiplier3;\n\n do {\n lambda -= correction;\n\n xMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredX);\n yMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredY);\n zMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredZ);\n\n xMultiplier2 = xMultiplier * xMultiplier;\n yMultiplier2 = yMultiplier * yMultiplier;\n zMultiplier2 = zMultiplier * zMultiplier;\n\n xMultiplier3 = xMultiplier2 * xMultiplier;\n yMultiplier3 = yMultiplier2 * yMultiplier;\n zMultiplier3 = zMultiplier2 * zMultiplier;\n\n func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;\n\n // \"denominator\" here refers to the use of this expression in the velocity and acceleration\n // computations in the sections to follow.\n denominator = x2 * xMultiplier3 * oneOverRadiiSquaredX + y2 * yMultiplier3 * oneOverRadiiSquaredY + z2 * zMultiplier3 * oneOverRadiiSquaredZ;\n\n const derivative = -2.0 * denominator;\n\n correction = func / derivative;\n } while (Math.abs(func) > EPSILON12);\n\n result[0] = positionX * xMultiplier;\n result[1] = positionY * yMultiplier;\n result[2] = positionZ * zMultiplier;\n return result;\n}\n\nfunction magnitude(v) {\n return vec3.length(v);\n}\n\nfunction divideByScalar(result, cartesian, scalar) {\n result[0] = cartesian[0] / scalar;\n result[1] = cartesian[1] / scalar;\n result[2] = cartesian[2] / scalar;\n return result;\n}\n\nexport function normalizeCartesian(out, a) {\n const x = a[0],\n y = a[1],\n z = a[2];\n let len = x * x + y * y + z * z;\n if (len > 0) {\n len = Math.sqrt(len);\n out[0] = a[0] / len;\n out[1] = a[1] / len;\n out[2] = a[2] / len;\n }\n return out;\n}\n\nexport function geodeticSurfaceNormal(origin, out) {\n vec3.multiply(\n out,\n origin,\n wgs84OneOverRadiiSquared\n );\n return vec3.normalize(out, out);\n}\n\n\nexport function geodeticSurfaceNormalCartographic(\n cartographic,\n result\n) {\n const longitude = cartographic[0];\n const latitude = cartographic[1];\n const cosLatitude = Math.cos(latitude);\n\n const x = cosLatitude * Math.cos(longitude);\n const y = cosLatitude * Math.sin(longitude);\n const z = Math.sin(latitude);\n\n result.x = x;\n result.y = y;\n result.z = z;\n return vec3.normalize(result, result);\n}\n","export const EPSILON14 = 0.00000000000001;\nexport const EPSILON15 = 0.000000000000001;\nexport const EPSILON6 = 0.000001;\n\nexport function equalsEpsilon (\n left,\n right,\n relativeEpsilon,\n absoluteEpsilon\n) { //>>includeEnd('debug');\n\n relativeEpsilon = (relativeEpsilon || 0.0);\n absoluteEpsilon = (absoluteEpsilon || relativeEpsilon);\n const absDiff = Math.abs(left - right);\n return (\n absDiff <= absoluteEpsilon ||\n absDiff <= relativeEpsilon * Math.max(Math.abs(left), Math.abs(right))\n );\n}\n","import { stringFromUTF8Array, sign as mathSign } from './Util.js';\nimport { vec3, mat3, mat4 } from 'gl-matrix';\nimport { cartesian3ToDegree, geodeticSurfaceNormal, radianToCartesian3 } from './Transform';\nimport { EPSILON14, equalsEpsilon } from './Math';\n\nexport function readMagic(view, offset) {\n let magic = '';\n for (let i = 0; i < 4; i++) {\n const code = view.getUint8(offset + i);\n magic += String.fromCharCode(code);\n }\n return magic;\n}\n\nconst textDecoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8') : null;\n\nexport function readFeatureTableJSON(buffer, byteOffset, byteLength) {\n const arr = new Uint8Array(buffer, byteOffset, byteLength);\n if (textDecoder) {\n return JSON.parse(textDecoder.decode(arr));\n } else {\n return JSON.parse(stringFromUTF8Array(arr));\n }\n}\n\nexport function readFeatureTableBin(buffer, byteOffset, byteLength) {\n return {\n offset: byteOffset,\n byteLength: byteLength\n };\n}\n\n\nexport function readBatchTableJSON(buffer, byteOffset, byteLength) {\n const arr = new Uint8Array(buffer, byteOffset, byteLength);\n if (textDecoder) {\n return JSON.parse(textDecoder.decode(arr));\n } else {\n return JSON.parse(stringFromUTF8Array(arr));\n }\n}\n\nexport function readBatchTableBin(buffer, byteOffset, byteLength) {\n return {\n offset: byteOffset,\n byteLength\n };\n}\n\nexport function readBatchArray(batchId, buf, offset, count) {\n const { byteOffset, componentType, type } = batchId;\n const { ctor, type: reglType } = getComponentCtor(componentType || 'UNSIGNED_SHORT');\n const itemSize = getItemSize(type);\n return {\n byteStride: 0,\n byteOffset: byteOffset + offset,\n itemSize,\n count: count * itemSize,\n componentType: reglType,\n array: new ctor(buf, offset + byteOffset, count * itemSize)\n }\n}\n\nexport function readBatchId(batchId, buf, offset, count) {\n const batchIdData = readBatchArray(batchId, buf, offset, count);\n if (batchIdData.array.buffer.byteLength !== buf.byteLength) {\n batchIdData.array = batchIdData.array.slice();\n }\n return batchIdData;\n}\n\nexport function readBatchData(batchId, buf, count, index) {\n const { byteOffset, componentType, type } = batchId;\n const { ctor } = getComponentCtor(componentType || 'UNSIGNED_SHORT');\n const itemSize = getItemSize(type);\n const array = new ctor(buf, byteOffset, count * itemSize);\n if (itemSize === 1) {\n return array[index];\n } else {\n return array.subarray(index * itemSize, index * itemSize + itemSize);\n }\n\n}\n\nconst TYPE_SIZES = {\n 'SCALAR': 1,\n 'VEC2': 2,\n 'VEC3': 3,\n 'VEC4': 4\n};\n\nexport function getItemSize(type) {\n if (!type) {\n return 1;\n }\n return TYPE_SIZES[type];\n}\n\nconst typeMap = {\n \"BYTE\": { ctor: Int8Array, type: 0x1400, name: 'Int8Array' },\n \"UNSIGNED_BYTE\": { ctor: Uint8Array, type: 0x1401, name: 'Uint8Array' },\n \"SHORT\": { ctor: Int16Array, type: 0x1402, name: 'Int16Array' },\n \"UNSIGNED_SHORT\": { ctor: Uint16Array, type: 0x1403, name: 'Uint16Array' },\n \"INT\": { ctor: Int32Array, type: 0x1404, name: 'Int32Array' },\n \"UNSIGNED_INT\": { ctor: Uint32Array, type: 0x1405, name: 'Uint32Array' },\n \"FLOAT\": { ctor: Float32Array, type: 0x1406, name: 'Float32Array' },\n \"DOUBLE\": { ctor: Float64Array, type: 0x1406, name: 'Float64Array' }\n};\n\nexport function getComponentCtor(componentType) {\n return typeMap[componentType];\n}\n\nexport function getComponentFromCtor(ctor) {\n for (const p in typeMap) {\n if (ctor === typeMap[p].ctor) {\n return typeMap[p].type;\n }\n }\n throw new Error('unrecognized ctor:' + ctor);\n}\n\nexport function convertQuantizedPosition(out, arr, offset, scale) {\n const position = out;\n const count = arr.length / 3;\n for (let i = 0; i < count; i++) {\n position[i * 3] = (arr[i * 3] / 65535.0) * scale[0] + offset[0];\n position[i * 3 + 1] = (arr[i * 3 + 1] / 65535.0) * scale[1] + offset[1];\n position[i * 3 + 2] = (arr[i * 3 + 2] / 65535.0) * scale[2] + offset[2];\n }\n return position;\n}\n\n\nexport function readFeatureTableBatchTable(view, byteOffset, transferables) {\n const featureTableJsonByteLength = view.getUint32(12, true);\n const featureTableBinaryByteLength = view.getUint32(16, true);\n const batchTableJsonByteLength = view.getUint32(20, true);\n const batchTableBinaryByteLength = view.getUint32(24, true);\n\n const i3dmBuf = view.buffer;\n let featureTable = {}, featureTableBin;\n let batchTable = {}, batchTableBin = null;\n if (featureTableJsonByteLength > 0) {\n featureTable = readFeatureTableJSON(i3dmBuf, byteOffset, featureTableJsonByteLength);\n byteOffset += featureTableJsonByteLength;\n }\n if (featureTableBinaryByteLength > 0) {\n featureTableBin = readFeatureTableBin(i3dmBuf, byteOffset, featureTableBinaryByteLength);\n byteOffset += featureTableBinaryByteLength;\n }\n if (batchTableJsonByteLength > 0) {\n batchTable = readBatchTableJSON(i3dmBuf, byteOffset, batchTableJsonByteLength);\n byteOffset += batchTableJsonByteLength;\n }\n const batchTableBinInfo = readBatchTableBin(i3dmBuf, byteOffset, batchTableBinaryByteLength);\n batchTableBin = i3dmBuf.slice(batchTableBinInfo.offset, batchTableBinInfo.offset + batchTableBinInfo.byteLength);\n transferables.push(batchTableBin);\n\n return {\n featureTable, featureTableBin, batchTable, batchTableBin\n };\n}\n\n\nconst vectorProductLocalFrame = {\n up: {\n south: \"east\",\n north: \"west\",\n west: \"south\",\n east: \"north\",\n },\n down: {\n south: \"west\",\n north: \"east\",\n west: \"north\",\n east: \"south\",\n },\n south: {\n up: \"west\",\n down: \"east\",\n west: \"down\",\n east: \"up\",\n },\n north: {\n up: \"east\",\n down: \"west\",\n west: \"up\",\n east: \"down\",\n },\n west: {\n up: \"north\",\n down: \"south\",\n north: \"down\",\n south: \"up\",\n },\n east: {\n up: \"south\",\n down: \"north\",\n north: \"up\",\n south: \"down\",\n },\n};\n\nconst degeneratePositionLocalFrame = {\n north: [-1, 0, 0],\n east: [0, 1, 0],\n up: [0, 0, 1],\n south: [1, 0, 0],\n west: [0, -1, 0],\n down: [0, 0, -1],\n};\nconst localFrameToFixedFrameCache = {};\nconst scratchCalculateCartesian = {\n east:[],\n north:[],\n up:[],\n west:[],\n south:[],\n down:[],\n};\nlet scratchFirstCartesian = [];\nlet scratchSecondCartesian = [];\nlet scratchThirdCartesian = [];\n\nconst ZERO = [0, 0, 0];\n\nfunction localFrameToFixedFrameGenerator(firstAxis, secondAxis) {\n const thirdAxis = vectorProductLocalFrame[firstAxis][secondAxis];\n\n /**\n * Computes a 4x4 transformation matrix from a reference frame\n * centered at the provided origin to the provided ellipsoid's fixed reference frame.\n * @callback Transforms.LocalFrameToFixedFrame\n * @param {Cartesian3} origin The center point of the local reference frame.\n * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.\n * @param {Matrix4} [result] The object onto which to store the result.\n * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.\n */\n let resultat;\n const hashAxis = firstAxis + secondAxis;\n if (localFrameToFixedFrameCache[hashAxis]) {\n resultat = localFrameToFixedFrameCache[hashAxis];\n } else {\n resultat = function (origin, ellipsoid, result) {\n if (\n vec3.equals(origin, ZERO)\n ) {\n // If x, y, and z are zero, use the degenerate local frame, which is a special case\n vec3.copy(scratchFirstCartesian, degeneratePositionLocalFrame[firstAxis]);\n vec3.copy(scratchSecondCartesian, degeneratePositionLocalFrame[secondAxis]);\n vec3.copy(scratchThirdCartesian, degeneratePositionLocalFrame[thirdAxis]);\n } else if (\n equalsEpsilon(origin[0], 0.0, EPSILON14) &&\n equalsEpsilon(origin[1], 0.0, EPSILON14)\n ) {\n // If x and y are zero, assume origin is at a pole, which is a special case.\n const sign = mathSign(origin[2]);\n\n vec3.copy(scratchFirstCartesian, degeneratePositionLocalFrame[firstAxis]);\n if (firstAxis !== \"east\" && firstAxis !== \"west\") {\n vec3.scale(scratchFirstCartesian, scratchFirstCartesian, sign);\n }\n\n vec3.copy(scratchSecondCartesian, degeneratePositionLocalFrame[secondAxis]);\n if (secondAxis !== \"east\" && secondAxis !== \"west\") {\n vec3.scale(scratchSecondCartesian, scratchSecondCartesian, sign);\n }\n\n vec3.copy(scratchThirdCartesian, degeneratePositionLocalFrame[thirdAxis]);\n if (thirdAxis !== \"east\" && thirdAxis !== \"west\") {\n vec3.scale(scratchThirdCartesian, scratchThirdCartesian, sign);\n }\n } else {\n geodeticSurfaceNormal(origin, scratchCalculateCartesian.up);\n\n const up = scratchCalculateCartesian.up;\n const east = scratchCalculateCartesian.east;\n east[0] = -origin[1];\n east[1] = origin[0];\n east[2] = 0.0;\n vec3.normalize(scratchCalculateCartesian.east, east);\n vec3.cross(scratchCalculateCartesian.north, up, east);\n\n vec3.scale(\n scratchCalculateCartesian.down,\n scratchCalculateCartesian.up,\n -1\n );\n vec3.scale(\n scratchCalculateCartesian.west,\n scratchCalculateCartesian.east,\n -1\n );\n vec3.scale(\n scratchCalculateCartesian.south,\n scratchCalculateCartesian.north,\n -1\n );\n\n scratchFirstCartesian = scratchCalculateCartesian[firstAxis];\n scratchSecondCartesian = scratchCalculateCartesian[secondAxis];\n scratchThirdCartesian = scratchCalculateCartesian[thirdAxis];\n }\n result[0] = scratchFirstCartesian[0];\n result[1] = scratchFirstCartesian[1];\n result[2] = scratchFirstCartesian[2];\n result[3] = 0.0;\n result[4] = scratchSecondCartesian[0];\n result[5] = scratchSecondCartesian[1];\n result[6] = scratchSecondCartesian[2];\n result[7] = 0.0;\n result[8] = scratchThirdCartesian[0];\n result[9] = scratchThirdCartesian[1];\n result[10] = scratchThirdCartesian[2];\n result[11] = 0.0;\n result[12] = origin[0];\n result[13] = origin[1];\n result[14] = origin[2];\n result[15] = 1.0;\n return result;\n };\n localFrameToFixedFrameCache[hashAxis] = resultat;\n }\n return resultat;\n}\n\nfunction multiplyByMatrix3 (matrix, rotation, result) {\n //>>includeEnd('debug');\n\n const left0 = matrix[0];\n const left1 = matrix[1];\n const left2 = matrix[2];\n const left4 = matrix[4];\n const left5 = matrix[5];\n const left6 = matrix[6];\n const left8 = matrix[8];\n const left9 = matrix[9];\n const left10 = matrix[10];\n\n const right0 = rotation[0];\n const right1 = rotation[1];\n const right2 = rotation[2];\n const right4 = rotation[3];\n const right5 = rotation[4];\n const right6 = rotation[5];\n const right8 = rotation[6];\n const right9 = rotation[7];\n const right10 = rotation[8];\n\n const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2;\n const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2;\n const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2;\n\n const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6;\n const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6;\n const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6;\n\n const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10;\n const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10;\n const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10;\n\n result[0] = column0Row0;\n result[1] = column0Row1;\n result[2] = column0Row2;\n result[3] = 0.0;\n result[4] = column1Row0;\n result[5] = column1Row1;\n result[6] = column1Row2;\n result[7] = 0.0;\n result[8] = column2Row0;\n result[9] = column2Row1;\n result[10] = column2Row2;\n result[11] = 0.0;\n result[12] = matrix[12];\n result[13] = matrix[13];\n result[14] = matrix[14];\n result[15] = matrix[15];\n return result;\n}\n\n// function fromRowMajor(\n// column0Row0,\n// column1Row0,\n// column2Row0,\n// column3Row0,\n// column0Row1,\n// column1Row1,\n// column2Row1,\n// column3Row1,\n// column0Row2,\n// column1Row2,\n// column2Row2,\n// column3Row2,\n// column0Row3,\n// column1Row3,\n// column2Row3,\n// column3Row3) {\n// const out = [];\n// out[0] = column0Row0 || 0.0;\n// out[1] = column0Row1 || 0.0;\n// out[2] = column0Row2 || 0.0;\n// out[3] = column0Row3 || 0.0;\n// out[4] = column1Row0 || 0.0;\n// out[5] = column1Row1 || 0.0;\n// out[6] = column1Row2 || 0.0;\n// out[7] = column1Row3 || 0.0;\n// out[8] = column2Row0 || 0.0;\n// out[9] = column2Row1 || 0.0;\n// out[10] = column2Row2 || 0.0;\n// out[11] = column2Row3 || 0.0;\n// out[12] = column3Row0 || 0.0;\n// out[13] = column3Row1 || 0.0;\n// out[14] = column3Row2 || 0.0;\n// out[15] = column3Row3 || 0.0;\n// return out;\n// }\n\nexport function setTranslation(matrix, translation, result) {\n\n result[0] = matrix[0];\n result[1] = matrix[1];\n result[2] = matrix[2];\n result[3] = matrix[3];\n\n result[4] = matrix[4];\n result[5] = matrix[5];\n result[6] = matrix[6];\n result[7] = matrix[7];\n\n result[8] = matrix[8];\n result[9] = matrix[9];\n result[10] = matrix[10];\n result[11] = matrix[11];\n\n result[12] = translation[0];\n result[13] = translation[1];\n result[14] = translation[2];\n result[15] = matrix[15];\n\n return result;\n}\n\nexport function getTranslation(out, matrix) {\n vec3.set(out, matrix[12], matrix[13], matrix[14]);\n return out;\n}\n\n\nexport const eastNorthUpToFixedFrame = localFrameToFixedFrameGenerator(\n \"east\",\n \"north\"\n);\nconst scratchRTCCoord = [];\nconst scratchCenter = [];\nconst scratchCartographic = [];\nconst projectedPosition = []\nconst scratchFromENU = [];\nconst scratchToENU = [];\nconst scratchRotation = [];\nconst coord = { x: 0, y: 0 };\nconst prjResult = { x: 0, y: 0 };\nconst RADIAN = Math.PI / 180;\n\nexport function basisTo2D(result, rtcCoord, matrix, projection, res, heightScale, heightOffset) {\n rtcCoord = vec3.copy(scratchRTCCoord, rtcCoord);\n const viewCenter = radianToCartesian3(scratchRTCCoord, rtcCoord[0] * RADIAN, rtcCoord[1] * RADIAN, rtcCoord[2]);\n const rtcCenter = mat4.getTranslation(scratchCenter, matrix);\n const ellipsoid = projection.ellipsoid;\n\n let cartographic;\n if (vec3.len(rtcCenter) === 0) {\n cartographic = vec3.set(scratchCartographic, 0, 0, -6378137);\n } else {\n // Get the 2D Center\n cartographic = cartesian3ToDegree(\n scratchCartographic,\n rtcCenter\n );\n }\n coord.x = cartographic[0];\n coord.y = cartographic[1];\n const prjCoord = projection.project(\n coord,\n prjResult\n );\n\n projectedPosition[0] = prjCoord.x / res;\n projectedPosition[1] = prjCoord.y / res;\n projectedPosition[2] = (cartographic[2] + heightOffset) * heightScale;\n\n // cartographic[0] *= Math.PI / 180;\n // cartographic[1] *= Math.PI / 180;\n\n // Assuming the instance are positioned in WGS84, invert the WGS84 transform to get the local transform and then convert to 2D\n const fromENU = eastNorthUpToFixedFrame(\n viewCenter,\n ellipsoid,\n scratchFromENU\n );\n const toENU = mat4.invert(scratchToENU, fromENU);\n const rotation = mat3.fromMat4(scratchRotation, matrix);\n const local = multiplyByMatrix3(toENU, rotation, result);\n // mat4.multiply(result, swizzleMatrix, local); // Swap x, y, z for 2D\n setTranslation(local, projectedPosition, result); // Use the projected center\n return result;\n}\n\n\nconst component_ctors = {\n 5120: Int8Array,\n 5122: Int16Array,\n 5124: Int32Array,\n 5121: Uint8Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n};\n\nexport function getTypedArrayCtor(type) {\n return component_ctors[type];\n}\n\nexport function getComponentType(ctor) {\n for (const p in component_ctors) {\n if (ctor === component_ctors[p]) {\n return +p;\n }\n }\n throw new Error('unrecognized ctor:' + ctor);\n}\n\n// 用数据的width获得数据的类型\nexport function getAttrType(width) {\n if (width === 1) {\n return 'FLOAT';\n }\n return 'VEC' + width;\n}\n","let canvas;\r\nconst OPTIONS = {\r\n width: 100,\r\n height: 10\r\n};\r\n// const ISNODE = typeof global === 'object';\r\n\r\nlet offscreenCanvas = false;\r\ntry {\r\n const canvas = new OffscreenCanvas(1, 1);\r\n const ctx = canvas.getContext('2d');\r\n ctx.fillText('hello', 0, 0);\r\n offscreenCanvas = true;\r\n} catch (err) {\r\n offscreenCanvas = false;\r\n}\r\n\r\nfunction getCanvas() {\r\n if (!canvas) {\r\n const { width, height } = OPTIONS;\r\n if (offscreenCanvas) {\r\n canvas = new OffscreenCanvas(width, height);\r\n } else {\r\n canvas = document.createElement('canvas');\r\n canvas.width = width;\r\n canvas.height = height;\r\n }\r\n }\r\n return canvas;\r\n}\r\n\r\nexport function registerCanvas(canvasInstance) {\r\n if (canvasInstance) {\r\n canvas = canvasInstance;\r\n }\r\n}\r\n\r\nexport class ColorIn {\r\n constructor(colors, options = {}) {\r\n if (!Array.isArray(colors)) {\r\n console.error('colors is not array');\r\n return;\r\n }\r\n if (colors.length < 2) {\r\n console.error('colors.length should >1');\r\n return;\r\n }\r\n this.colors = colors;\r\n let min = Infinity, max = -Infinity;\r\n for (let i = 0, len = colors.length; i < len; i++) {\r\n const value = colors[i][0];\r\n min = Math.min(value, min);\r\n max = Math.max(value, max);\r\n }\r\n this.min = min;\r\n this.max = max;\r\n this.valueOffset = this.max - this.min;\r\n this.options = Object.assign({}, OPTIONS, options);\r\n this._initImgData();\r\n }\r\n\r\n getImageData() {\r\n return this.imgData;\r\n }\r\n\r\n _initImgData() {\r\n const canvas = getCanvas();\r\n const { width, height } = this.options;\r\n canvas.width = width;\r\n canvas.height = height;\r\n const ctx = canvas.getContext('2d');\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\r\n const { colors, valueOffset } = this;\r\n for (let i = 0, len = colors.length; i < len; i++) {\r\n const [stop, color] = colors[i];\r\n const s = (stop - this.min) / valueOffset;\r\n gradient.addColorStop(s, color);\r\n }\r\n ctx.fillStyle = gradient;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n this.imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n getColor(stop) {\r\n stop = Math.max(this.min, stop);\r\n stop = Math.min(stop, this.max);\r\n const s = (stop - this.min) / this.valueOffset;\r\n let x = Math.round(s * this.imgData.width);\r\n x = Math.min(x, this.imgData.width - 1);\r\n const idx = x * 4;\r\n const r = this.imgData.data[idx];\r\n const g = this.imgData.data[idx + 1];\r\n const b = this.imgData.data[idx + 2];\r\n const a = this.imgData.data[idx + 3];\r\n return [r, g, b, a];\r\n }\r\n}\r\n","import { ColorIn } from 'colorin';\r\nvar isMapSupported = typeof Map === 'function';\r\nvar colorInCache;\r\nif (isMapSupported) {\r\n colorInCache = new Map();\r\n}\r\n\r\n\r\nfunction isNull(value) {\r\n return value === null || value === undefined;\r\n}\r\n\r\nfunction isNotNull(value) {\r\n return !isNull(value);\r\n}\r\n\r\nfunction isEmptyString(value) {\r\n return value === '';\r\n}\r\n\r\n/*eslint-disable no-var, prefer-const*/\r\nfunction createFunction(parameters, defaultType) {\r\n var fun;\r\n var isFeatureConstant, isZoomConstant;\r\n if (!isFunctionDefinition(parameters)) {\r\n fun = function () {\r\n return parameters;\r\n };\r\n isFeatureConstant = true;\r\n isZoomConstant = true;\r\n } else {\r\n var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';\r\n var featureDependent = zoomAndFeatureDependent || isNotNull(parameters.property);\r\n var zoomDependent = zoomAndFeatureDependent || !featureDependent;\r\n var type = parameters.type || defaultType || 'exponential';\r\n\r\n var innerFun;\r\n if (type === 'exponential') {\r\n innerFun = evaluateExponentialFunction;\r\n } else if (type === 'interval') {\r\n innerFun = evaluateIntervalFunction;\r\n } else if (type === 'categorical') {\r\n innerFun = evaluateCategoricalFunction;\r\n } else if (type === 'identity') {\r\n innerFun = evaluateIdentityFunction;\r\n } else if (type === 'color-interpolate') {\r\n innerFun = evaluateColorInterpolateFunction;\r\n } else if (type === 'calculate-expression') {\r\n innerFun = evaluateCalculateExpressionFunction;\r\n } else {\r\n throw new Error('Unknown function type \"' + type + '\"');\r\n }\r\n\r\n if (zoomAndFeatureDependent) {\r\n var featureFunctions = {};\r\n var featureFunctionStops = [];\r\n for (let s = 0; s < parameters.stops.length; s++) {\r\n var stop = parameters.stops[s];\r\n if (featureFunctions[stop[0].zoom] === undefined) {\r\n featureFunctions[stop[0].zoom] = {\r\n zoom: stop[0].zoom,\r\n type: parameters.type,\r\n property: parameters.property,\r\n default: parameters.default,\r\n stops: []\r\n };\r\n }\r\n featureFunctions[stop[0].zoom].stops.push([stop[0].value, stop[1]]);\r\n }\r\n\r\n for (let z in featureFunctions) {\r\n featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z])]);\r\n }\r\n fun = function (zoom, feature) {\r\n const value = evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, zoom)(zoom, feature);\r\n return typeof value === 'function' ? value(zoom, feature) : value;\r\n };\r\n isFeatureConstant = false;\r\n isZoomConstant = false;\r\n } else if (zoomDependent) {\r\n fun = function (zoom) {\r\n const value = innerFun(parameters, zoom);\r\n return typeof value === 'function' ? value(zoom) : value;\r\n };\r\n isFeatureConstant = true;\r\n isZoomConstant = false;\r\n } else {\r\n fun = function (zoom, feature) {\r\n const value = innerFun(parameters, feature ? feature[parameters.property] : null);\r\n return typeof value === 'function' ? value(zoom, feature) : value;\r\n };\r\n isFeatureConstant = false;\r\n isZoomConstant = true;\r\n }\r\n }\r\n fun.isZoomConstant = isZoomConstant;\r\n fun.isFeatureConstant = isFeatureConstant;\r\n return fun;\r\n}\r\n\r\nfunction coalesce(a, b, c) {\r\n if (isNotNull(a)) return a;\r\n if (isNotNull(b)) return b;\r\n if (isNotNull(c)) return c;\r\n return null;\r\n}\r\n\r\nfunction evaluateCategoricalFunction(parameters, input) {\r\n for (let i = 0; i < parameters.stops.length; i++) {\r\n if (input === parameters.stops[i][0]) {\r\n return parameters.stops[i][1];\r\n }\r\n }\r\n return parameters.default;\r\n}\r\n\r\nfunction evaluateIntervalFunction(parameters, input) {\r\n for (var i = 0; i < parameters.stops.length; i++) {\r\n if (input < parameters.stops[i][0]) break;\r\n }\r\n return parameters.stops[Math.max(i - 1, 0)][1];\r\n}\r\n\r\nfunction evaluateExponentialFunction(parameters, input) {\r\n var base = isNotNull(parameters.base) && !isEmptyString(parameters.base) ? parameters.base : 1;\r\n\r\n var i = 0;\r\n while (true) {\r\n if (i >= parameters.stops.length) break;\r\n else if (input <= parameters.stops[i][0]) break;\r\n else i++;\r\n }\r\n\r\n if (i === 0) {\r\n return parameters.stops[i][1];\r\n } else if (i === parameters.stops.length) {\r\n return parameters.stops[i - 1][1];\r\n } else {\r\n return interpolate(input, base, parameters.stops[i - 1][0], parameters.stops[i][0], parameters.stops[i - 1][1], parameters.stops[i][1]);\r\n }\r\n}\r\nconst COLORIN_OPTIONS = {\r\n width: 100,\r\n height: 1\r\n};\r\nfunction evaluateColorInterpolateFunction(parameters, input) {\r\n const stops = parameters.stops;\r\n if (stops && stops.length > 1) {\r\n let colorIn;\r\n if (colorInCache) {\r\n const key = JSON.stringify(stops);\r\n if (!colorInCache.has(key)) {\r\n const colorIn = new ColorIn(stops, COLORIN_OPTIONS);\r\n colorInCache.set(key, colorIn);\r\n }\r\n colorIn = colorInCache.get(key);\r\n } else {\r\n colorIn = new ColorIn(stops, COLORIN_OPTIONS);\r\n }\r\n const [r, g, b, a] = colorIn.getColor(input);\r\n return [r / 255, g / 255, b / 255, a / 255];\r\n } else if (stops && stops.length === 1) {\r\n return stops[0][1];\r\n }\r\n return null;\r\n}\r\n\r\nfunction evaluateIdentityFunction(parameters, input) {\r\n return coalesce(input, parameters.default);\r\n}\r\n// 2添加修改计算函数\r\n// 处理空字符串和未定义属性的函数\r\nfunction evaluateCalculateExpressionFunction(parameters, input) {\r\n const targetVariable = String(parameters.property);\r\n const expression = parameters.expression;\r\n const newValue = input;\r\n\r\n // 定义函数来替换表达式中的变量\r\n function traverseAndAssign(expression, targetVariable, newValue) {\r\n const newValueAsNumber = Number(newValue);\r\n const targetVariableAsString = String(targetVariable);\r\n\r\n if (Array.isArray(expression)) {\r\n return expression.map(subExpr => traverseAndAssign(subExpr, targetVariableAsString, newValueAsNumber));\r\n } else if (expression === targetVariableAsString) {\r\n return newValueAsNumber;\r\n } else {\r\n return expression;\r\n }\r\n }\r\n\r\n // 定义函数来计算表达式的结果\r\n function evaluateExpression(expression) {\r\n if (Array.isArray(expression)) {\r\n const operator = expression[0];\r\n\r\n if (!['+', '-', '*', '/'].includes(operator)) {\r\n throw new Error(`Unknown operator: ${operator}`);\r\n }\r\n\r\n const operands = expression.slice(1).map(op => evaluateExpression(op));\r\n switch (operator) {\r\n case '+':\r\n return operands.reduce((acc, curr) => acc + curr, 0);\r\n case '-':\r\n return operands.reduce((acc, curr) => acc - curr);\r\n case '*':\r\n return operands.reduce((acc, curr) => acc * curr, 1);\r\n case '/':\r\n // 如果发现有零作为除数,返回默认值\r\n if (operands.some(op => op === 0)) {\r\n return parameters.default;\r\n }\r\n return operands.reduce((acc, curr) => acc / curr);\r\n default:\r\n throw new Error(`Unsupported operator: ${operator}`);\r\n }\r\n } else if (typeof expression === 'number') {\r\n return expression;\r\n } else {\r\n throw new Error('Invalid expression format');\r\n }\r\n }\r\n\r\n // 使用 coalesce 函数处理结果中的默认值\r\n function coalesce(value) {\r\n return (isNull(value) || isEmptyString(value) || isNaN(value)) ? parameters.default : value;\r\n }\r\n\r\n // 如果 input 存在且大于0,则处理表达式\r\n if (isNotNull(input) && !isEmptyString(input) && !isNaN(input) && !(input < 0)) {\r\n const updatedExpression = traverseAndAssign(expression, targetVariable, newValue);\r\n return coalesce(evaluateExpression(updatedExpression));\r\n } else {\r\n return coalesce(parameters.default);\r\n }\r\n}\r\n\r\nfunction interpolate(input, base, inputLower, inputUpper, outputLower, outputUpper) {\r\n if (typeof outputLower === 'function') {\r\n return function () {\r\n var evaluatedLower = outputLower.apply(undefined, arguments);\r\n var evaluatedUpper = outputUpper.apply(undefined, arguments);\r\n return interpolate(input, base, inputLower, inputUpper, evaluatedLower, evaluatedUpper);\r\n };\r\n } else if (outputLower.length) {\r\n return interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper);\r\n } else {\r\n return interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper);\r\n }\r\n}\r\n\r\nfunction interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper) {\r\n var difference = inputUpper - inputLower;\r\n var progress = input - inputLower;\r\n\r\n var ratio;\r\n if (base === 1) {\r\n ratio = progress / difference;\r\n } else {\r\n ratio = (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\r\n }\r\n\r\n return outputLower * (1 - ratio) + outputUpper * ratio;\r\n}\r\n\r\nfunction interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper) {\r\n var output = [];\r\n for (let i = 0; i < outputLower.length; i++) {\r\n output[i] = interpolateNumber(input, base, inputLower, inputUpper, outputLower[i], outputUpper[i]);\r\n }\r\n return output;\r\n}\r\n\r\n/**\r\n * Check if object is a definition of function type\r\n * @param {Object} obj object\r\n * @return {Boolean}\r\n * @memberOf MapboxUtil\r\n */\r\nexport function isFunctionDefinition(obj) {\r\n return (\r\n obj &&\r\n typeof obj === 'object' &&\r\n (obj.stops || (obj.property && obj.type === 'identity') || (obj.expression && obj.type === 'calculate-expression'))\r\n );\r\n}\r\n\r\n// export function isFunctionDefinition(obj) {\r\n// return obj && typeof obj === 'object' && (obj.stops || (obj.property && obj.type === 'identity'));\r\n// }\r\n\r\n/**\r\n * Check if obj's properties has function definition\r\n * @param {Object} obj object to check\r\n * @return {Boolean}\r\n * @memberOf MapboxUtil\r\n */\r\nexport function hasFunctionDefinition(obj) {\r\n for (const p in obj) {\r\n if (isFunctionDefinition(obj[p])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function interpolated(parameters) {\r\n return createFunction1(parameters, 'exponential');\r\n}\r\n\r\nexport function piecewiseConstant(parameters) {\r\n return createFunction1(parameters, 'interval');\r\n}\r\n\r\n/**\r\n * Load function types defined in object\r\n * @param {Object[]} parameters parameters\r\n * @return {Object} loaded object\r\n * @memberOf MapboxUtil\r\n */\r\n\r\nexport function loadFunctionTypes(obj, argFn) {\r\n if (!obj) {\r\n return null;\r\n }\r\n var hit = false;\r\n if (Array.isArray(obj)) {\r\n var multResult = [],\r\n loaded;\r\n for (let i = 0; i < obj.length; i++) {\r\n loaded = loadFunctionTypes(obj[i], argFn);\r\n if (!loaded) {\r\n multResult.push(obj[i]);\r\n } else {\r\n multResult.push(loaded);\r\n hit = true;\r\n }\r\n }\r\n return hit ? multResult : obj;\r\n }\r\n var result = { '__fn_types_loaded': true },\r\n props = [],\r\n p;\r\n for (p in obj) {\r\n if (obj.hasOwnProperty(p)) {\r\n props.push(p);\r\n }\r\n }\r\n\r\n const buildFn = function (p) {\r\n Object.defineProperty(result, p, {\r\n get: function () {\r\n if (!this['__fn_' + p]) {\r\n this['__fn_' + p] = interpolated(this['_' + p]);\r\n }\r\n return this['__fn_' + p].apply(this, argFn());\r\n },\r\n set: function (v) {\r\n this['_' + p] = v;\r\n },\r\n configurable: true,\r\n enumerable: true\r\n });\r\n };\r\n\r\n for (let i = 0, len = props.length; i < len; i++) {\r\n p = props[i];\r\n if (isFunctionDefinition(obj[p])) {\r\n hit = true;\r\n result['_' + p] = obj[p];\r\n buildFn(p);\r\n } else {\r\n result[p] = obj[p];\r\n }\r\n }\r\n return hit ? result : obj;\r\n}\r\n\r\n/**\r\n * Get external resources in the function type\r\n * @param {Object} t Function type definition\r\n * @return {String[]} resouces\r\n * @memberOf MapboxUtil\r\n */\r\nexport function getFunctionTypeResources(t) {\r\n if (!t || !t.stops) {\r\n return [];\r\n }\r\n const res = [];\r\n for (let i = 0, l = t.stops.length; i < l; i++) {\r\n res.push(t.stops[i][1]);\r\n }\r\n return res;\r\n}\r\n/*eslint-enable no-var, prefer-const*/\r\n\r\nfunction createFunction1(parameters, defaultType) {\r\n if (!isFunctionDefinition(parameters)) {\r\n return function () {\r\n return parameters;\r\n };\r\n }\r\n parameters = JSON.parse(JSON.stringify(parameters));\r\n let isZoomConstant = true;\r\n let isFeatureConstant = true;\r\n const stops = parameters.stops;\r\n if (stops) {\r\n for (let i = 0; i < stops.length; i++) {\r\n if (isFunctionDefinition(stops[i][1])) {\r\n const fn = createFunction1(stops[i][1], defaultType);\r\n isZoomConstant = isZoomConstant && fn.isZoomConstant;\r\n isFeatureConstant = isFeatureConstant && fn.isFeatureConstant;\r\n stops[i] = [stops[i][0], fn];\r\n }\r\n }\r\n }\r\n const fn = createFunction(parameters, defaultType);\r\n fn.isZoomConstant = isZoomConstant && fn.isZoomConstant;\r\n fn.isFeatureConstant = isFeatureConstant && fn.isFeatureConstant;\r\n return fn;\r\n}\r\n","import * as maptalks from 'maptalks';\nimport { reshader, vec3, vec4, mat3, mat4, quat, HighlightUtil, ContextUtil } from '@maptalks/gl';\nimport { iterateMesh, iterateBufferData, getItemAtBufferData, setInstanceData, } from '../../common/GLTFHelpers';\nimport pickingVert from './glsl/picking.vert';\nimport pntsVert from './glsl/pnts.vert';\nimport pntsFrag from './glsl/pnts.frag';\nimport { isFunction, isNil, extend, setColumn3, flatArr, isNumber, normalizeColor, pushIn } from '../../common/Util';\nimport { intersectsBox } from 'frustum-intersects';\nimport { basisTo2D, setTranslation, getTranslation, readBatchData } from '../../common/TileHelper';\nimport { isFunctionDefinition, interpolated } from '@maptalks/function-type';\n// import { getKHR_techniques } from './s3m/S3MTechnique';\n\n\nconst { getTextureMagFilter, getTextureMinFilter,\n getTextureWrap, getMaterialType, getMaterialFormat,\n getPrimitive, getUniqueREGLBuffer, getArrayType } = reshader.REGLHelper;\n\nconst Y_TO_Z = [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1];\nconst X_TO_Z = [0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1];\n\nconst { loginIBLResOnCanvas, logoutIBLResOnCanvas, getIBLResOnCanvas, getPBRUniforms } = reshader.pbr.PBRUtils;\n\nconst DEFAULT_POLYGON_OFFSET = {\n factor : 0,\n units : 0\n};\n\nconst DEFAULT_POLYGONFILL = [1, 1, 1, 1], DEFAULT_HSV = [0, 0, 0];\n\nconst DEFAULT_MATERIAL_INFO = {\n specularStrength: 0,\n materialShininess: 1\n};\n\nconst IDENTITY_SCALE = [1, 1, 1];\nconst IDENTITY_MATRIX = mat4.identity([]);\nconst EMPTY_TRANSLATION = [0, 0, 0];\nconst EMPTY_COORD_OFFSET = [0, 0];\n\nconst LIGHT_DIR = [];\n// const P0 = [], P1 = [];\n\nconst phongFilter = m => {\n return m.material instanceof reshader.PhongMaterial;\n};\n\nconst StandardFilter = m => {\n return m.material instanceof reshader.pbr.StandardMaterial;\n};\n\n// const colorOff = [false, false, false, false];\n// const colorOn = [true, true, true, true];\n\nconst TEMP_RTCCENTER = [];\nconst TEMP_CENTER = new maptalks.Coordinate(0, 0);\nconst TEMP_POINT = new maptalks.Point(0, 0);\nconst TEMP_POINT1 = new maptalks.Point(0, 0);\nconst TEMP_POINT2 = new maptalks.Point(0, 0);\nconst TEMP_OFFSET = [];\nconst TEMP_TRANSLATION = [];\nconst TEMP_MATRIX1 = [];\nconst TEMP_MATRIX2 = [];\nconst TEMP_TILE_ROT_QUAT = [];\nconst TEMP_SCALING = [];\nconst TEMP_TILE_SCALING_MAT = [];\n\nconst TEMP_TILE_TRANSFORM = [];\nconst TEMP_TRANSLATION_MAT = [];\n\nconst TEMP_SERVICE_MAT = [];\n\nconst TEMP_PROJ_SCALE = [];\nconst TEMP_DIST_SCALE = [];\nconst TEMP_DIST_TO_PROJ_SCALE = [];\n\nconst TEMP_MATRIX_SCALE = [];\n\nconst DEFAULT_SEMANTICS = {\n 'POSITION': 'POSITION',\n 'NORMAL': 'NORMAL',\n 'TEXCOORD_0': 'TEXCOORD_0',\n 'TEXCOORD_1': 'TEXCOORD_1',\n 'COLOR_0': 'COLOR_0',\n 'TANGENT': 'TANGENT',\n '_BATCHID': '_BATCHID',\n};\n\nconst BOX_INDEX = [\n 0, 1,\n 1, 2,\n 2, 3,\n 3, 0,\n 0, 4,\n 1, 5,\n 2, 6,\n 3, 7,\n 4, 5,\n 5, 6,\n 6, 7,\n 7, 4,\n\n // center axis\n // 8, 9,\n // 8, 10,\n // 8, 11\n];\nconst SPHERE_POS = generateSphere(100, 1);\nconst BOX_ROTATE = [0, 0, 0, 1], BOX_SCALE = [1, 1, 1];\n\nexport default class TileMeshPainter {\n constructor(regl, layer) {\n this._layer = layer;\n this._canvas = layer.getRenderer().canvas;\n this.pickingFBO = layer.getRenderer().pickingFBO;\n this._regl = regl;\n this._renderer = new reshader.Renderer(regl);\n this._loading = {};\n this._modelMeshes = {};\n this._pntsMeshes = {};\n this._i3dmMeshes = {};\n this._cmptMeshes = {};\n this._cachedGLTF = {};\n this._modelScene = new reshader.Scene();\n this._pntsScene = new reshader.Scene();\n this._i3dmScene = new reshader.Scene();\n this._boxScene = new reshader.Scene();\n this._resLoader = new reshader.ResourceLoader(regl.texture(2));\n this._bindedListener = (...args) => {\n return this._onResourceLoad.call(this, ...args);\n };\n // this._defaultMaterial = new reshader.PhongMaterial({\n // 'baseColorFactor' : [1, 1, 1, 1]\n // });\n this._khrTechniqueWebglManager = new reshader.KHRTechniquesWebglManager(this._regl, this._getExtraCommandProps(), this._resLoader);\n const map = this.getMap();\n this._heightScale = map.altitudeToPoint(100, map.getGLRes()) / 100;\n }\n\n getI3DMMeshes() {\n return this._i3dmMeshes;\n }\n\n getPNTSMeshes() {\n return this._pntsMeshes;\n }\n\n getB3DMMeshes() {\n return this._modelMeshes;\n }\n\n getPaintedMeshes() {\n return this._paintedMeshes;\n }\n\n getMap() {\n return this._layer.getMap();\n }\n\n paint(tiles, boxMeshes, parentContext) {\n // const testMesh = { bloom: 1 };\n // if (!parentContext.sceneFilter(testMesh)) {\n // return;\n // }\n const renderTarget = parentContext && parentContext.renderTarget;\n const filter = parentContext && parentContext.sceneFilter;\n const map = this.getMap();\n if (!tiles.length || !map) {\n return null;\n }\n const uniforms = this._getUniformValues();\n const projViewMatrix = map.projViewMatrix;\n const oneMeshArray = [];\n const parentMeshes = [];\n const b3dmMeshes = [];\n const pntsMeshes = [];\n const i3dmMeshes = [];\n\n for (let i = 0, l = tiles.length; i < l; i++) {\n const node = tiles[i].data.node;\n let mesh = this._getMesh(node);\n if (!mesh) {\n continue;\n }\n const service = this._layer._getNodeService(node._rootIdx);\n const debugNodes = service.debugNodes;\n const heightOffset = service.heightOffset || 0;\n const coordOffset = service.coordOffset || EMPTY_COORD_OFFSET;\n if (this._cmptMeshes[node.id]) {\n mesh = this._cmptMeshes[node.id];\n mesh = flatArr(mesh);\n }\n // if (node._error > maxError) {\n // continue;\n // }\n\n let polygonOffset = service.polygonOffset || DEFAULT_POLYGON_OFFSET;\n if (isFunction(polygonOffset)) {\n polygonOffset = polygonOffset();\n }\n // const ambientColor = service.ambientLight;\n if (!Array.isArray(mesh)) {\n oneMeshArray[0] = mesh;\n mesh = oneMeshArray;\n }\n for (let ii = 0, ll = mesh.length; ii < ll; ii++) {\n if (!mesh[ii] || !mesh[ii].isValid || !mesh[ii].isValid()) {\n continue;\n }\n const magic = mesh[ii].properties.magic;\n if (mesh[ii].properties.heightOffset !== heightOffset || mesh[ii].properties.coordOffset[0] !== coordOffset[0] || mesh[ii].properties.coordOffset[1] !== coordOffset[1]) {\n this._updateMeshLocalTransform(mesh[ii]);\n mesh[ii]._originLocalTransform = mat4.copy([], mesh[ii].localTransform);\n }\n mesh[ii]._node = node;\n if (magic === 'b3dm') {\n if (mesh[ii].getBoundingBox && !intersectsBox(projViewMatrix, mesh[ii].getBoundingBox())) {\n continue;\n }\n const { batchIdData, batchIdMap } = mesh[ii].geometry.properties;\n if (batchIdData && batchIdMap) {\n const rootIdx = mesh[ii].properties.node._rootIdx;\n if (this._highlighted && this._highlighted[rootIdx]) {\n HighlightUtil.highlightMesh(this._regl, mesh[ii], this._highlighted[rootIdx], this._highlightTimestamp, batchIdMap);\n } else if (!this._highlighted || !this._highlighted[rootIdx]) {\n HighlightUtil.highlightMesh(this._regl, mesh[ii], null, this._highlightTimestamp, batchIdMap);\n }\n HighlightUtil.showOnly(this._regl, mesh[ii], this._showOnlys && this._showOnlys[rootIdx], this._showOnlyTimeStamp, batchIdMap);\n }\n if (debugNodes && debugNodes.length && debugNodes.indexOf(mesh[ii]._node.id) < 0) {\n continue;\n }\n if (parentContext && parentContext.bloom && mesh[ii].properties.hlBloomMesh) {\n mesh[ii].properties.hlBloomMesh.properties.depthFunc = 'always';\n b3dmMeshes.push(mesh[ii].properties.hlBloomMesh);\n }\n b3dmMeshes.push(mesh[ii]);\n } else if (magic === 'pnts') {\n pntsMeshes.push(mesh[ii]);\n } else if (magic === 'i3dm') {\n i3dmMeshes.push(mesh[ii]);\n }\n // mesh[ii].setUniform('level', tiles[i].selectionDepth);\n // mesh[ii].setUniform('id', node.id);\n // mesh[ii].setUniform('polygonOffset', polygonOffset);\n mesh[ii].properties.isLeaf = tiles[i].leave;\n mesh[ii].properties.branchRootId = tiles[i].branchRootId;\n // GroupGLLayer中,stencil默认值为0xFF,与GroupGLLayer保持一致\n const selectionDepth = 255 - tiles[i].selectionDepth;\n mesh[ii].properties.selectionDepth = selectionDepth;\n mesh[ii].properties.polygonOffset = polygonOffset;\n const cullFace = service.cullFace === undefined || !!service.cullFace;\n mesh[ii].properties.cullFace = cullFace;\n\n const hlBloomMesh = mesh[ii].properties.hlBloomMesh;\n if (hlBloomMesh) {\n const bloomProperties = hlBloomMesh.properties;\n bloomProperties.branchRootId = tiles[i].branchRootId;\n bloomProperties.selectionDepth = selectionDepth;\n bloomProperties.polygonOffset = polygonOffset;\n bloomProperties.cullFace = cullFace;\n }\n // if (!Object.prototype.hasOwnProperty.call(mesh[ii].uniforms, 'ambientColor')) {\n // Object.defineProperty(mesh[ii].uniforms, 'ambientColor', {\n // enumerable: true,\n // get: function () {\n // if (ambientColor) {\n // return ambientColor;\n // }\n // return uniforms['ambientColor'];\n // }\n // });\n // }\n\n if (!tiles[i].leave) {\n parentMeshes.push(mesh[ii]);\n }\n this._updateMaskDefines(mesh[ii]);\n this._updateServiceMatrix(mesh[ii], node);\n }\n }\n\n // const testMesh = { bloom: 1 };\n // if (parentContext.sceneFilter(testMesh)) {\n // if (parentContext.bloom) {\n // const bloomMeshes = meshes.filter(m => m.bloom);\n // if (bloomMeshes.length) {\n // meshes = bloomMeshes;\n // }\n // }\n\n\n // meshes.sort(meshCompare);\n // console.log(meshes.map(m => m.properties.id));\n let drawCount = 0;\n const khrExludeFilter = this._khrTechniqueWebglManager.getExcludeFilter();\n ContextUtil.setIncludeUniformValues(uniforms, parentContext);\n drawCount += this._callShader(this._phongShader, uniforms, [filter, phongFilter, khrExludeFilter], renderTarget, parentMeshes, b3dmMeshes, i3dmMeshes);\n drawCount += this._callShader(this._standardShader, uniforms, [filter, StandardFilter, khrExludeFilter], renderTarget, parentMeshes, b3dmMeshes, i3dmMeshes);\n\n this._khrTechniqueWebglManager.forEachShader((shader, shaderFilter, uniformSemantics) => {\n const uniforms = this._getUniformValues(uniformSemantics);\n drawCount += this._callShader(shader, uniforms, [filter, shaderFilter], renderTarget, parentMeshes, b3dmMeshes, i3dmMeshes);\n });\n this._pntsScene.setMeshes(pntsMeshes);\n const pntsUniforms = this._getPntsUniforms();\n drawCount += this._renderer.render(this._pntsShader, pntsUniforms, this._pntsScene, renderTarget && renderTarget.fbo);\n\n this._paintedMeshes = {\n pntsMeshes,\n i3dmMeshes,\n b3dmMeshes\n };\n // boxMeshes.forEach(mesh => {\n // this._updateBBoxMatrix(mesh);\n // });\n this._boxScene.setMeshes(boxMeshes);\n this._renderer.render(this._edgeShader, uniforms, this._boxScene, renderTarget && renderTarget.fbo);\n\n return drawCount;\n }\n\n prepareRender(context) {\n this._prepareShaders(context);\n }\n\n _prepareShaders(context) {\n if (context && context.states && context.states.includesChanged) {\n this._standardShader.dispose();\n delete this._standardShader;\n this._phongShader.dispose();\n delete this._phongShader;\n }\n this._createShaders(context);\n }\n\n // _updateBBoxMatrix(mesh) {\n // const serviceTransform = this._layer._getServiceTransform(TEMP_BBOX_MAT, mesh.properties.node);\n // mat4.multiply(mesh.localTransform, serviceTransform, mesh._originLocalTransform);\n // }\n\n _callShader(shader, uniforms, filter, renderTarget, parentMeshes, meshes, i3dmMeshes) {\n shader.filter = filter.filter(fn => !!fn);\n\n // this._modelScene.setMeshes(meshes);\n\n // uniforms['debug'] = true;\n // uniforms['stencilEnable'] = false;\n // uniforms['cullFace'] = 'front';\n // uniforms['colorMask'] = colorOff;\n // this._renderer.render(shader, uniforms, this._modelScene, renderTarget && renderTarget.fbo);\n\n\n // uniforms['stencilEnable'] = true;\n uniforms.stencilEnable = false;\n uniforms.cullFace = 'back';\n // uniforms['cullFace'] = 'back';\n // uniforms['colorMask'] = colorOn;\n const fbo = renderTarget && renderTarget.fbo;\n let drawCount = 0;\n\n const branchMeshes = [];\n const leafMeshes = [];\n let hasUnresolved = false;\n\n let currentBranchRootId = meshes[0] && meshes[0].properties.branchRootId;\n for (let i = 0; i < meshes.length; i++) {\n const { branchRootId } = meshes[i].properties;\n if (branchRootId !== currentBranchRootId) {\n // branch 发生变化\n if (!hasUnresolved) {\n // 如果branch中不存在 unresolved 瓦片,则放到leafMeshes中,和其他的leaf瓦片一起绘制,无需分开绘制,减少drawcall\n pushIn(leafMeshes, branchMeshes);\n } else {\n if (leafMeshes.length) {\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, false, leafMeshes);\n leafMeshes.length = 0;\n }\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, hasUnresolved, branchMeshes);\n }\n currentBranchRootId = branchRootId;\n hasUnresolved = false;\n branchMeshes.length = 0;\n }\n branchMeshes.push(meshes[i]);\n if (meshes[i].properties.selectionDepth < 255) {\n hasUnresolved = true;\n }\n if (i === meshes.length - 1) {\n if (!hasUnresolved) {\n pushIn(leafMeshes, branchMeshes);\n branchMeshes.length = 0;\n }\n if (leafMeshes.length) {\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, false, leafMeshes);\n }\n drawCount += this._drawBranchMeshes(shader, uniforms, fbo, hasUnresolved, branchMeshes);\n }\n }\n // pick功能需要把meshes设置到modelScene中,为了避免pick逻辑出错,这里暂时只允许选择叶子节点\n //FIXME 因为父亲节点不在modelScene中,会出现父亲节点无法被选中的问题\n this._modelScene.setMeshes(meshes.filter(m => m.properties.isLeaf));\n\n this._i3dmScene.setMeshes(i3dmMeshes);\n drawCount += this._renderer.render(shader, uniforms, this._i3dmScene, renderTarget && renderTarget.fbo);\n return drawCount;\n }\n\n _drawBranchMeshes(shader, uniforms, fbo, hasUnresolved, branchMeshes) {\n if (!branchMeshes.length) {\n return 0;\n }\n this._modelScene.setMeshes(branchMeshes);\n // 如果branch中不存在unresolved瓦片\n // 关闭stencil直接绘制\n uniforms.stencilEnable = false;\n if (hasUnresolved) {\n // branch 中存在 unresolved 瓦片。\n // 解释:\n // 如果某个瓦片的selectionDepth不为0 (mesh.properties.selectionDepth为255),则说明它的子瓦片也参与绘制,标记此类瓦片为unsolved\n // * selectionDepth 的逻辑在 Geo3DTilesRenderer._sortTiles 方法中\n // 这种情况一般出现在某个分支的子节点不满足要求(没有下载下来或者error不符合设定),需要将父亲节点与子节点一起绘制\n // 绘制步骤:\n // 1. 清除 stencil 缓冲,避免上一次绘制的stencil影响本次绘制\n // 2. 先绘制所有瓦片的背面,避免后面的子节点,会在视觉上 \"透过\" 前面的unresolved瓦片\n // 3. 打开stencil,先绘制叶子节点,再绘制父亲节点,保证父节点的绘制不会覆盖掉子节点\n this._clearStencil(fbo);\n uniforms.stencilEnable = false;\n uniforms.cullFace = 'front';\n this._renderer.render(shader, uniforms, this._modelScene, fbo);\n uniforms.cullFace = 'back';\n uniforms.stencilEnable = true;\n }\n return this._renderer.render(shader, uniforms, this._modelScene, fbo);\n }\n\n _clearStencil(fbo) {\n this._regl.clear({\n stencil: 0xFF,\n framebuffer: fbo\n });\n }\n\n getCurrentB3DMMeshes() {\n return this._modelScene.getMeshes();\n }\n\n getCurrentI3DMMeshes() {\n return this._i3dmScene.getMeshes();\n }\n\n _sort(a, b) {\n // const cameraPosition = this.getMap().cameraPosition;\n // vec3.transformMat4(P0, a.geometry.boundingBox.getCenter(), a.localTransform);\n // vec3.transformMat4(P1, b.geometry.boundingBox.getCenter(), b.localTransform);\n // return vec3.dist(P1, cameraPosition) - vec3.dist(P0, cameraPosition);\n return b._node._cameraDistance - a._node._cameraDistance;\n }\n\n deleteTile(tileData) {\n const node = tileData.node;\n if (node._boxMesh) {\n node._boxMesh.geometry.dispose();\n node._boxMesh.dispose();\n delete node._boxMesh;\n }\n const id = node.id;\n this._disposeMesh(id);\n }\n\n _disposeMesh(id) {\n const mesh = this._modelMeshes[id] || this._pntsMeshes[id] || this._i3dmMeshes[id] || this._cmptMeshes[id] || this._loading[id];\n if (this._cmptMeshes[id]) {\n this._disposeCMPT(id);\n } else if (mesh) {\n this._deleteOne(mesh);\n delete this._modelMeshes[id];\n delete this._pntsMeshes[id];\n delete this._i3dmMeshes[id];\n delete this._loading[id];\n }\n }\n\n _disposeCMPT(id) {\n let mesh = this._cmptMeshes[id];\n mesh = flatArr(mesh);\n for (let i = 0; i < mesh.length; i++) {\n const { id } = mesh[i].properties;\n this._disposeMesh(id);\n }\n delete this._cmptMeshes[id];\n }\n\n _deleteOne(mesh) {\n if (Array.isArray(mesh)) {\n for (let i = 0, l = mesh.length; i < l; i++) {\n this._deleteOne(mesh[i]);\n }\n } else {\n // clear showOnly and highlights\n HighlightUtil.showOnly(this._regl, mesh);\n HighlightUtil.highlightMesh(this._regl, mesh);\n const url = mesh.geometry.properties.url;\n if (!url) {\n mesh.geometry.dispose();\n if (mesh.material) {\n mesh.material.dispose();\n }\n } else {\n const cached = this._cachedGLTF[url];\n if (cached && cached.refMeshes) {\n cached.refMeshes.delete(mesh.uuid);\n if (!cached.refMeshes.size) {\n cached.geometry.dispose();\n cached.material.dispose();\n delete this._cachedGLTF[url];\n }\n }\n }\n mesh.dispose();\n }\n }\n\n remove() {\n const layer = this._layer;\n logoutIBLResOnCanvas(layer.getRenderer().canvas, layer.getMap());\n for (const id in this._cmptMeshes) {\n this._disposeCMPT(id);\n }\n this._cmptMeshes = {};\n for (const id in this._modelMeshes) {\n this._disposeMesh(id);\n }\n this._modelMeshes = {};\n for (const id in this._pntsMeshes) {\n this._disposeMesh(id);\n }\n this._pntsMeshes = {};\n for (const id in this._i3dmMeshes) {\n this._disposeMesh(id);\n }\n this._i3dmMeshes = {};\n\n for (const id in this._loading) {\n this._disposeMesh(id);\n }\n this._loading = {};\n if (this._phongShader) {\n this._phongShader.dispose();\n delete this._phongShader;\n }\n if (this._standardShader) {\n this._standardShader.dispose();\n delete this._standardShader;\n }\n if (this._pntsShader) {\n this._pntsShader.dispose();\n delete this._pntsShader;\n }\n\n if (this._edgeShader) {\n this._edgeShader.dispose();\n delete this._edgeShader;\n }\n\n this._khrTechniqueWebglManager.dispose();\n\n if (this.picking) {\n this.picking.dispose();\n }\n }\n\n _getMesh(node) {\n return this._modelMeshes[node.id] || this._pntsMeshes[node.id] || this._i3dmMeshes[node.id] || this._cmptMeshes[node.id];\n }\n\n has(node) {\n return this._getMesh(node) || this._loading[node.id];\n }\n\n _updateMeshLocalTransform(mesh) {\n const magic = mesh.properties.magic;\n if (magic === 'b3dm') {\n this._updateB3DMLocalMatrix(mesh);\n } else if (magic === 'i3dm') {\n this._updateI3DMLocalTransform(mesh);\n } else if (magic === 'pnts') {\n this._updatePNTSLocalTransform(mesh);\n }\n }\n\n createPntsMesh(data, id, node, cb) {\n if (this._pntsMeshes[id]) {\n const meshes = this._pntsMeshes[id];\n console.warn(`pnts mesh with id(${id}) was already created.`);\n cb(null, { id : id, mesh : meshes });\n return meshes;\n }\n const { pnts, featureTable, rootIdx, compressed_int16_params } = data;\n const count = featureTable['POINTS_LENGTH'];\n if (!pnts['BATCH_ID']) {\n pnts['BATCH_ID'] = new Uint8Array(count);\n pnts['BATCH_ID'].fill(0);\n }\n\n const geometry = new reshader.Geometry(\n pnts,\n null,\n count,\n {\n static: true,\n primitive: 'points',\n positionAttribute: 'POSITION',\n pickingIdAttribute: 'BATCH_ID'\n }\n );\n geometry.generateBuffers(this._regl);\n const defines = {};\n if (pnts['POSITION']) {\n defines['HAS_POSITION'] = 1;\n } else if (pnts['POSITION_QUANTIZED']) {\n defines['HAS_POSITION_QUANTIZED'] = 1;\n }\n if (pnts['RGB']) {\n defines['HAS_RGB'] = 1;\n } else if (pnts['RGBA']) {\n defines['HAS_RGBA'] = 1;\n } else if (pnts['RGB565']) {\n defines['HAS_RGB565'] = 1;\n }\n if (pnts['NORMAL'] || pnts['NORMAL_OCT16P']) {\n defines['HAS_NORMAL'] = 1;\n if (pnts['NORMAL_OCT16P']) {\n defines['HAS_NORMAL_OCT16P'] = 1;\n }\n }\n this._setCompressedInt16Defines(defines, compressed_int16_params);\n if (data.featureTable['CONSTANT_RGBA']) {\n data.featureTable['CONSTANT_RGBA'] = data.featureTable['CONSTANT_RGBA'].map(c => c / 255);\n }\n\n const { rtcCenter, rtcCoord, projCenter } = data;\n\n const service = this._layer._getNodeService(rootIdx);\n\n const mesh = new reshader.Mesh(geometry);\n mesh.properties.magic = 'pnts';\n mesh.properties.id = id;\n mesh.properties.node = node;\n mesh.properties.count = count;\n mesh.properties.batchTable = data.batchTable;\n mesh.properties.batchTableBin = data.batchTableBin;\n mesh.properties.serviceIndex = rootIdx;\n mesh.properties.rtcCoord = rtcCoord;\n mesh.properties.rtcCenter = rtcCenter;\n mesh.properties.projCenter = projCenter;\n mesh.setDefines(defines);\n mesh.setFunctionUniform('pointColor', function () {\n if (data.featureTable['CONSTANT_RGBA']) {\n return data.featureTable['CONSTANT_RGBA'];\n }\n return service && service.pointColor || [1, 1, 1, 1];\n });\n const map = this.getMap();\n let pointSizeValue = null;\n let pointSizeFn = null;\n\n mesh.setFunctionUniform('pointSize', function () {\n if (!service) {\n return 2;\n }\n if (isFunctionDefinition(service.pointSize)) {\n const key = JSON.stringify(service.pointSize);\n if (key !== pointSizeValue) {\n pointSizeFn = interpolated(service.pointSize);\n pointSizeValue = key;\n }\n const size = pointSizeFn(map.getZoom());\n return size;\n }\n return service.pointSize || 2;\n });\n\n let pointOpacityValue = null;\n let pointOpacityFn = null;\n\n mesh.setFunctionUniform('pointOpacity', function () {\n if (!service) {\n return 1;\n }\n if (isFunctionDefinition(service.pointOpacity)) {\n const key = JSON.stringify(service.pointOpacity);\n if (key !== pointOpacityValue) {\n pointOpacityFn = interpolated(service.pointOpacity);\n pointOpacityValue = key;\n }\n const opacity = pointOpacityFn(map.getZoom());\n return opacity;\n }\n return service.pointOpacity || 1;\n });\n this._setCompressedInt16Uniforms(mesh, compressed_int16_params);\n this._updatePNTSLocalTransform(mesh);\n mesh._originLocalTransform = mat4.copy([], mesh.localTransform);\n this._pntsMeshes[id] = mesh;\n cb(null, { id: id, mesh: [mesh] });\n return [mesh];\n }\n\n\n _updatePNTSLocalTransform(mesh) {\n const localTransform = mesh.localTransform || [];\n const { rtcCoord, node, projCenter } = mesh.properties;\n this._getB3DMTransform(localTransform, rtcCoord, projCenter, node._rootIdx);\n mesh.setLocalTransform(localTransform);\n }\n\n\n createI3DMMesh(data, id, node, cb) {\n if (this._i3dmMeshes[id]) {\n const meshes = this._i3dmMeshes[id];\n console.warn(`i3dm mesh with id(${id}) was already created.`);\n if (!this._loading[id]) {\n cb(null, { id: id, mesh: meshes });\n }\n return meshes;\n }\n const service = this._layer._getNodeService(node._rootIdx);\n const upAxisTransform = this._getUpAxisTransform(node._upAxis);\n const { i3dm, featureTable, gltf, batchTable, batchTableBin, count } = data;\n const instanceCount = featureTable['INSTANCES_LENGTH'];\n\n const { rtcCenter, rtcCoord, projCenter } = data;\n const projectedMatrix = this._computeProjectedTransform(TEMP_MATRIX2, node, rtcCenter, rtcCoord);\n setTranslation(projectedMatrix, EMPTY_TRANSLATION, projectedMatrix);\n\n const tileRotQuat = mat4.getRotation(TEMP_TILE_ROT_QUAT, projectedMatrix);\n quat.normalize(tileRotQuat, tileRotQuat);\n\n // quat.normalize(rotation, rotation);\n const scaling = mat4.getScaling(TEMP_SCALING, projectedMatrix);\n const tileScalingMat4 = mat4.fromScaling(TEMP_TILE_SCALING_MAT, scaling);\n\n const tileTransform = this._getI3DMTileTransform(TEMP_TILE_TRANSFORM, projCenter, node);\n\n const projScale = this._getProjScale(TEMP_PROJ_SCALE);\n const distScale = this._getDistanceScale(TEMP_DIST_SCALE, rtcCoord);\n const distToProjScale = vec3.div(TEMP_DIST_TO_PROJ_SCALE, distScale, projScale);\n const distToProjScaleTransform = mat4.fromScaling(TEMP_MATRIX_SCALE, distToProjScale);\n\n const { POSITION, NORMAL_UP, NORMAL_RIGHT, SCALE, SCALE_NON_UNIFORM } = i3dm;\n const instanceData = {\n 'instance_vectorA': new Float32Array(instanceCount * 4),\n 'instance_vectorB': new Float32Array(instanceCount * 4),\n 'instance_vectorC': new Float32Array(instanceCount * 4),\n 'aPickingId': new Uint16Array(instanceCount)\n };\n for (let i = 0; i < instanceCount; i++) {\n instanceData['aPickingId'][i] = i;\n }\n\n const normalUp = new Float32Array(3);\n const normalRight = new Float32Array(3);\n const normalForward = [];\n const scaleItem = new Float32Array(1);\n const scaleNonUniform = new Float32Array(3);\n const rotationMat3 = [];\n const quaternion = [];\n const scale = [];\n const matrix = [];\n iterateBufferData(POSITION, (vertex, index) => {\n if (NORMAL_UP) {\n getItemAtBufferData(normalRight, NORMAL_RIGHT, index);\n getItemAtBufferData(normalUp, NORMAL_UP, index);\n vec3.cross(normalForward, normalRight, normalUp)\n vec3.normalize(normalForward, normalForward);\n setColumn3(rotationMat3, normalRight, 0);\n setColumn3(rotationMat3, normalUp, 1);\n setColumn3(rotationMat3, normalForward, 2);\n quat.fromMat3(quaternion, rotationMat3);\n quat.normalize(quaternion, quaternion);\n quat.multiply(quaternion, tileRotQuat, quaternion);\n } else {\n quat.identity(quaternion);\n }\n if (SCALE) {\n getItemAtBufferData(scaleItem, SCALE, index);\n vec3.set(scale, scaleItem[0], scaleItem[0], scaleItem[0]);\n } else if (SCALE_NON_UNIFORM) {\n getItemAtBufferData(scaleNonUniform, SCALE_NON_UNIFORM, index);\n vec3.set(scale, ...scaleNonUniform);\n } else {\n vec3.set(scale, 1, 1, 1);\n }\n\n mat4.fromRotationTranslationScale(matrix, quaternion, vertex, scale);\n\n setInstanceData(instanceData['instance_vectorA'], index, matrix, 0);\n setInstanceData(instanceData['instance_vectorB'], index, matrix, 1);\n setInstanceData(instanceData['instance_vectorC'], index, matrix, 2);\n\n });\n\n const instanceBuffers = {};\n // 所有mesh共享一个 instance buffer,以节省内存\n for (const p in instanceData) {\n instanceBuffers[p] = {\n buffer: this._regl.buffer({\n dimension: instanceData[p].length / instanceCount,\n data: instanceData[p],\n name: p\n }),\n divisor: 1\n };\n }\n\n const shader = service.shader || 'pbr';\n let unreadyCount = 0;\n let ready = true;\n const meshes = [];\n const gltfWeakResources = [];\n iterateMesh(gltf, (gltfMesh, meshId, primId, gltf) => {\n const gltfResource = this._processGLTF(gltfMesh, meshId, primId, gltf, node, true, shader, gltfWeakResources);\n const { geometry, material } = gltfResource;\n if (material && !material.isReady()) {\n ready = false;\n unreadyCount++;\n }\n const mesh = new reshader.InstancedMesh(instanceBuffers, instanceCount, geometry, material);\n if (!gltfResource.refMeshes) {\n gltfResource.refMeshes = new Set();\n gltfResource.refMeshes.add(mesh.uuid);\n }\n mesh.properties.magic = 'i3dm';\n mesh.properties.id = id;\n mesh.properties.count = count;\n mesh.properties.batchTable = batchTable;\n mesh.properties.batchTableBin = batchTableBin;\n mesh.properties.serviceIndex = node._rootIdx;\n mesh.properties.rtcCoord = rtcCoord;\n mesh.properties.rtcCenter = rtcCenter;\n mesh.properties.projCenter = projCenter;\n mesh.properties.node = node;\n const defines = this._getGLTFMeshDefines(gltfMesh, geometry, material, node._rootIdx, gltf);\n if (gltfMesh.compressed_int16_params) {\n this._setCompressedInt16Uniforms(mesh, gltfMesh.compressed_int16_params);\n }\n this._setWEB3DDecodeUniforms(mesh, gltfMesh.attributes);\n // GLTF模型默认y为up\n // https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#coordinate-system-and-units\n const nodeMatrix = mat4.identity([]);\n // mat4.multiply(mat, mat, node.matrix);\n if (gltfMesh.matrices && gltfMesh.matrices.length) {\n for (let i = 0; i < gltfMesh.matrices.length; i++) {\n mat4.multiply(nodeMatrix, nodeMatrix, gltfMesh.matrices[i]);\n }\n }\n mat4.multiply(nodeMatrix, upAxisTransform, nodeMatrix);\n mat4.multiply(nodeMatrix, distToProjScaleTransform, nodeMatrix);\n // 如果没有 NORMAL_UP,需要把原来在 instance_vector 中计入的enu以及node上的transform应用在positionMatrix中\n if (!featureTable['EAST_NORTH_UP'] && !NORMAL_UP) {\n mat4.multiply(nodeMatrix, projectedMatrix, nodeMatrix);\n } else {\n mat4.multiply(nodeMatrix, tileScalingMat4, nodeMatrix);\n }\n mesh.setPositionMatrix(nodeMatrix);\n\n this._updateI3DMLocalTransform(mesh, tileTransform);\n mesh.setDefines(defines);\n mesh.properties.polygonOffset = { offset: 0, factor: 0 };\n meshes.push(mesh);\n delete gltfMesh.attributes;\n mesh._originLocalTransform = mat4.copy([], mesh.localTransform);\n });\n\n trimGLTFWeakResources(gltfWeakResources);\n\n if (ready) {\n this._i3dmMeshes[id] = meshes;\n cb(null, { id: id, mesh: meshes });\n } else {\n this._loading[id] = { meshes: meshes, count: unreadyCount };\n meshes._callback = cb;\n }\n return meshes;\n }\n\n _updateI3DMLocalTransform(mesh, tileTransform) {\n const { rtcCoord, node, projCenter } = mesh.properties;\n\n if (!tileTransform) {\n tileTransform = this._getI3DMTileTransform(TEMP_TILE_TRANSFORM, projCenter, node);\n }\n\n const service = this._layer._getNodeService(node._rootIdx);\n const matrix = mesh.localTransform || [];\n if (service.coordOffset) {\n const coordOffsetMatrix = this._computeCoordOffsetMatrix(TEMP_MATRIX2, node._rootIdx, rtcCoord);\n mat4.multiply(matrix, coordOffsetMatrix, tileTransform);\n } else {\n mat4.copy(matrix, tileTransform);\n }\n mesh.setLocalTransform(matrix);\n mesh.properties.heightOffset = service.heightOffset || 0;\n mesh.properties.coordOffset = service.coordOffset && service.coordOffset.slice(0) || EMPTY_COORD_OFFSET;\n }\n\n _getI3DMTileTransform(out, projCenter, node) {\n mat4.fromScaling(out, this._getProjScale(TEMP_PROJ_SCALE));\n const translation = this._getCenterTranslation(TEMP_TRANSLATION, projCenter, node._rootIdx);\n mat4.multiply(out, mat4.fromTranslation(TEMP_TRANSLATION_MAT, translation), out);\n return out;\n }\n\n createB3DMMesh(data, id, node, cb) {\n if (data.gltf) {\n data.gltf.transferables = null;\n }\n if (this._modelMeshes[id] || this._loading[id]) {\n const meshes = this._modelMeshes[id];\n console.warn(`mesh with id(${id}) was already created.`);\n if (!this._loading[id]) {\n cb(null, { id: id, mesh: meshes });\n }\n return meshes;\n }\n let maxPrjExtent;\n if (node.maxExtent) {\n const extent = new maptalks.Extent(node.maxExtent).convertTo(c => this._pointToPrj(c));\n maxPrjExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax];\n }\n\n\n const gltf = data.gltf;\n //for model matrix\n const { projCenter } = gltf.extensions['MAPTALKS_RTC'];\n const { rtcCoord, center: rtcCenter } = gltf.extensions['CESIUM_RTC'];\n\n const isSharedPosition = gltf.asset.sharePosition;\n const upAxisTransform = this._getUpAxisTransform(node._upAxis);\n const tileTransform = this._getB3DMTileTransform(TEMP_TILE_TRANSFORM, isSharedPosition, rtcCoord, rtcCenter, projCenter, node);\n const service = this._layer._getNodeService(node._rootIdx);\n let shader = service.shader || 'pbr';\n if (service.unlit) {\n shader = 'phong';\n } else if (gltf.materials) {\n for (let i = 0; i < gltf.materials.length; i++) {\n if (gltf.materials[i] && gltf.materials[i].extensions && gltf.materials[i].extensions['KHR_materials_unlit']) {\n shader = 'phong';\n break;\n }\n }\n }\n\n const gltfWeakResources = [];\n const meshes = [];\n let unreadyCount = 0;\n let ready = true;\n\n iterateMesh(gltf, (gltfMesh, meshId, primId, gltf) => {\n const gltfResource = this._processGLTF(gltfMesh, meshId, primId, gltf, node, false, shader, gltfWeakResources);\n const { geometry, material } = gltfResource;\n if (material && !material.isReady()) {\n ready = false;\n unreadyCount++;\n }\n const mesh = new reshader.Mesh(geometry, material);\n if (!gltfResource.refMeshes) {\n gltfResource.refMeshes = new Set();\n gltfResource.refMeshes.add(mesh.uuid);\n }\n mesh.properties.magic = 'b3dm';\n mesh.properties.id = id;\n mesh.properties.node = node;\n if (data.batchTable) {\n mesh.properties.batchTable = data.batchTable;\n mesh.properties.batchTableBin = data.batchTableBin;\n }\n mesh.properties.count = data.featureTable && data.featureTable['BATCH_LENGTH'] || 0;\n mesh.properties.serviceIndex = node._rootIdx;\n const defines = this._getGLTFMeshDefines(gltfMesh, geometry, material, node._rootIdx, gltf);\n mesh.setDefines(defines);\n const compressUniforms = gltfMesh.compressUniforms;\n if (compressUniforms) {\n for (const u in compressUniforms) {\n mesh.setUniform(u, compressUniforms[u]);\n }\n }\n if (gltfMesh.compressed_int16_params) {\n this._setCompressedInt16Uniforms(mesh, gltfMesh.compressed_int16_params);\n }\n this._setWEB3DDecodeUniforms(mesh, gltfMesh.attributes);\n if (maxPrjExtent) {\n defines['USE_MAX_EXTENT'] = 1;\n mesh.setUniform('maxPrjExtent', maxPrjExtent);\n // mesh.setUniform('prjCenter', projCenter);\n }\n\n if (!mesh.hasFunctionUniform('polygonOpacity')) {\n mesh.setFunctionUniform('polygonOpacity', function () {\n return isNumber(service.opacity) ? service.opacity : 1;\n });\n }\n if (!mesh.hasFunctionUniform('polygonFill')) {\n mesh.setFunctionUniform('polygonFill', function () {\n return normalizeColor([], service.polygonFill || DEFAULT_POLYGONFILL);\n });\n }\n if (!mesh.material.hasFunctionUniform('hsv')) {\n mesh.material.setFunctionUniform('hsv', function () {\n return service.hsv || DEFAULT_HSV;\n });\n }\n\n\n // gltfMesh.matrices 已经在 layerWorker转换坐标时,加入计算了,所以这里不用再重复计算\n const nodeMatrix = mat4.identity([]);\n // mat4.multiply(mat, mat, node.matrix);\n if (isSharedPosition && gltfMesh.matrices && gltfMesh.matrices.length) {\n for (let i = 0; i < gltfMesh.matrices.length; i++) {\n mat4.multiply(nodeMatrix, nodeMatrix, gltfMesh.matrices[i]);\n }\n }\n\n if (isSharedPosition) {\n mat4.multiply(nodeMatrix, upAxisTransform, nodeMatrix);\n }\n\n // const coordOffsetMatrix = this._computeCoordOffsetMatrix(node._rootIdx, rtcCoord);\n // if (coordOffsetMatrix) {\n // mat4.multiply(nodeMatrix, coordOffsetMatrix, nodeMatrix);\n // }\n mesh.properties.node = node;\n mesh.properties.projCenter = projCenter;\n mesh.properties.nodeMatrix = nodeMatrix;\n mesh.properties.isSharedPosition = isSharedPosition;\n mesh.properties.rtcCoord = rtcCoord;\n mesh.properties.rtcCenter = rtcCenter;\n\n this._updateB3DMLocalMatrix(mesh, tileTransform);\n meshes.push(mesh);\n delete gltfMesh.attributes;\n mesh._originLocalTransform = mat4.copy([], mesh.localTransform);\n });\n\n // trim indices/material images to save memories\n trimGLTFWeakResources(gltfWeakResources);\n\n if (ready) {\n this._modelMeshes[id] = meshes;\n cb(null, { id : id, mesh : meshes });\n } else {\n this._loading[id] = { meshes: meshes, count: unreadyCount };\n meshes._callback = cb;\n }\n return meshes;\n }\n\n _createBoxMesh(node) {\n const nodeBox = this._layer._getNodeBox(node.id);\n if (!nodeBox || node._boxMesh) {\n return;\n }\n let vertices, indices, translate, scale;\n if (nodeBox.obbox) { //region、box\n vertices = nodeBox.boxPosition;\n indices = BOX_INDEX;\n translate = nodeBox.boxCenter;\n scale = BOX_SCALE;\n } else if (nodeBox.sphereBox) { //sphere\n const sphereCenter = nodeBox.sphereBox[0], radius = nodeBox.sphereBox[1];\n vertices = SPHERE_POS.vertices;\n indices = SPHERE_POS.indices;\n translate = sphereCenter;\n scale = [radius, radius, radius];\n }\n const geometry = new reshader.Geometry({\n POSITION: vertices\n },\n indices,\n 0,\n {\n primitive : 'lines',\n positionAttribute: 'POSITION'\n });\n const mesh = new reshader.Mesh(geometry, new reshader.Material({ lineColor: [0.8, 0.8, 0.1, 1.0], lineOpacity: 1 }));\n const localTransform = [];\n mat4.fromRotationTranslationScale(localTransform, BOX_ROTATE, translate, scale);\n mesh.localTransform = localTransform;\n mesh._originLocalTransform = mat4.copy([], localTransform);\n mesh.properties.node = node;\n node._boxMesh = mesh;\n }\n\n _deleteBoxMesh(node) {\n if (node._boxMesh) {\n node._boxMesh.geometry.dispose();\n node._boxMesh.dispose();\n delete node._boxMesh;\n }\n }\n\n _setCompressedInt16Uniforms(mesh, compressed_int16_params) {\n if (compressed_int16_params['POSITION']) {\n mesh.setUniform('compressedPositionRange', compressed_int16_params['POSITION']);\n }\n if (compressed_int16_params['TEXCOORD_0']) {\n mesh.setUniform('compressedTexcoordRange_0', compressed_int16_params['TEXCOORD_0']);\n }\n if (compressed_int16_params['TEXCOORD_1']) {\n mesh.setUniform('compressedTexcoordRange_1', compressed_int16_params['TEXCOORD_0']);\n }\n if (compressed_int16_params['NORMAL']) {\n mesh.setUniform('compressedNormalRange', compressed_int16_params['NORMAL']);\n }\n if (compressed_int16_params['TANGENT']) {\n mesh.setUniform('compressedTangentRange', compressed_int16_params['TANGENT']);\n }\n if (compressed_int16_params['compressed_ratio']) {\n mesh.setUniform('compressed_ratio', compressed_int16_params['compressed_ratio']);\n }\n }\n\n _updateB3DMLocalMatrix(mesh, tileTransform) {\n const { isSharedPosition, rtcCoord, rtcCenter, projCenter, nodeMatrix, node } = mesh.properties;\n if (!tileTransform) {\n tileTransform = this._getB3DMTileTransform(tileTransform || TEMP_TILE_TRANSFORM, isSharedPosition, rtcCoord, rtcCenter, projCenter, node)\n }\n\n const matrix = mesh.localTransform || mat4.identity([]);\n\n mat4.multiply(matrix, tileTransform, nodeMatrix);\n const service = this._layer._getNodeService(node._rootIdx);\n if (service.coordOffset) {\n const coordOffsetMatrix = this._computeCoordOffsetMatrix(TEMP_MATRIX2, node._rootIdx, rtcCoord);\n mat4.multiply(matrix, coordOffsetMatrix, matrix);\n }\n mesh.setLocalTransform(matrix);\n mesh.properties.heightOffset = service.heightOffset || 0;\n mesh.properties.coordOffset = service.coordOffset && service.coordOffset.slice(0) || EMPTY_COORD_OFFSET;\n }\n\n _getB3DMTileTransform(out, isSharedPosition, rtcCoord, rtcCenter, projCenter, node) {\n if (isSharedPosition) {\n // position被共享的模型,只能采用basisTo2D来绘制\n // 电信的模型如tokyo.html中的模型\n const distanceScale = this._getDistanceScale(TEMP_DIST_SCALE, rtcCoord);\n const localTransform = mat4.fromScaling(TEMP_MATRIX1, distanceScale);\n const projectedMatrix = this._computeProjectedTransform(TEMP_MATRIX2, node, rtcCenter, rtcCoord);\n mat4.multiply(out, projectedMatrix, localTransform);\n } else {\n this._getB3DMTransform(out, rtcCoord, projCenter, node._rootIdx);\n }\n return out;\n }\n\n _setWEB3DDecodeUniforms(mesh, attributes) {\n if (attributes && attributes['TEXCOORD_0'] && attributes['TEXCOORD_0'].extensions && attributes['TEXCOORD_0'].extensions['WEB3D_quantized_attributes']) {\n const decodeMatrix = attributes['TEXCOORD_0'].extensions['WEB3D_quantized_attributes'].decodeMatrix;\n mesh.setUniform('decodeMatrix', decodeMatrix);\n }\n }\n\n _computeProjectedTransform(out, node, rtcCenter, rtcCoord) {\n const map = this.getMap();\n const heightOffset = this._layer._getNodeService(node._rootIdx).heightOffset || 0;\n\n const nodeTransform = node.matrix ? mat4.copy(out, node.matrix) : mat4.identity(out);\n if (rtcCenter) {\n const realCenter = vec3.transformMat4(TEMP_RTCCENTER, rtcCenter, nodeTransform);\n setTranslation(nodeTransform, realCenter, nodeTransform);\n }\n // const computedTransform = mat4.multiply([], nodeTransform, Y_TO_Z);\n const computedTransform = nodeTransform;\n const projection = map.getProjection();\n const glRes = map.getGLRes();\n const projectedTransform = basisTo2D(computedTransform, rtcCoord, computedTransform, projection, glRes, this._heightScale, heightOffset);\n const translation = getTranslation(TEMP_TRANSLATION, projectedTransform);\n let offset = this._layer.options['offset'];\n if (isFunction(offset)) {\n const center = this._layer._getNodeBox(node.id).boxCoord;\n offset = offset.call(this._layer, center);\n }\n vec3.set(TEMP_OFFSET, offset[0], offset[1], 0);\n vec3.sub(translation, translation, TEMP_OFFSET);\n\n setTranslation(projectedTransform, translation, projectedTransform);\n return projectedTransform;\n\n }\n\n _computeCoordOffsetMatrix(out, rootIdx, center) {\n const service = this._layer._getNodeService(rootIdx);\n if (!service.coordOffset) {\n return null;\n }\n const map = this.getMap();\n const glRes = map.getGLRes();\n TEMP_CENTER.set(center[0], center[1]);\n const point0 = map.coordToPointAtRes(TEMP_CENTER, glRes, TEMP_POINT1);\n const coordOffset = service.coordOffset;\n const target = TEMP_CENTER.set(center[0] + coordOffset[0], center[1] + coordOffset[1]);\n const point1 = map.coordToPointAtRes(target, glRes, TEMP_POINT2);\n const dx = point1.x - point0.x;\n const dy = point1.y - point0.y;\n const heightScale = this._heightScale;\n\n const translation = vec3.set(TEMP_OFFSET, dx, dy, (coordOffset[2] || 0) * heightScale);\n const matrix = mat4.fromTranslation(out, translation);\n return matrix;\n }\n\n createCMPTMesh(data, id, node, cb) {\n if (this._cmptMeshes[id]) {\n const meshes = this._cmptMeshes[id];\n console.warn(`mesh with id(${id}) was already created.`);\n cb(null, { id: id, mesh: meshes });\n return meshes;\n }\n // if (node.content.uri !== 'NoLod_2.cmpt') {\n // return [];\n // }\n const { content } = data;\n const meshes = [];\n for (let i = 0; i < content.length; i++) {\n const { magic } = content[i];\n const childId = id + '.' + i;\n if (magic === 'b3dm') {\n this.createB3DMMesh(content[i], childId, node, (err, { mesh }) => {\n meshes.push(mesh);\n });\n } else if (magic === 'i3dm') {\n this.createI3DMMesh(content[i], childId, node, (err, { mesh }) => {\n meshes.push(mesh);\n });\n } else if (magic === 'pnts') {\n this.createPntsMesh(content[i], childId, node, (err, { mesh }) => {\n meshes.push(mesh);\n });\n } else if (magic === 'cmpt') {\n this.createCMPTMesh(content[i], childId, node, (err, { mesh }) => {\n meshes.push(mesh);\n });\n }\n }\n this._cmptMeshes[id] = meshes;\n cb(null, { id: id, mesh: meshes });\n return meshes;\n }\n\n _getGLTFMeshDefines(gltfMesh, geometry, material, rootIdx, gltf) {\n const shader = this._layer._getNodeService(rootIdx).shader || 'pbr';\n const runShader = shader === 'phong' ? this._phongShader : this._standardShader;\n const defines = runShader.getGeometryDefines(geometry);\n if (gltf.asset && gltf.asset.generator === 'S3M') {\n this._appendS3MDefines(defines, geometry);\n }\n if (geometry.data.uvRegion) {\n defines['HAS_I3S_UVREGION'] = 1;\n }\n\n if (geometry.data[geometry.desc.normalAttribute]) {\n defines['VertexNormal'] = 1;\n }\n if (geometry.data[geometry.desc.color0Attribute]) {\n defines['VertexColor'] = 1;\n }\n if (geometry.data[geometry.desc.uv0Attribute]) {\n defines['TexCoord'] = 1;\n }\n if (geometry.data[geometry.desc.textureCoordMatrixAttribute]) {\n defines['HAS_TextureCoordMatrix'] = 1;\n }\n if (material.get('uTexture')) {\n defines['COMPUTE_TEXCOORD'] = 1;\n }\n if (material.get('uTexture2')) {\n defines['TexCoord2'] = 1;\n }\n if(this._layer._vertexCompressionType === 'MESHOPT') {\n defines['MeshOPT_Compress'] = 1;\n }\n if (this.hasIBL()) {\n defines['HAS_IBL_LIGHTING'] = 1;\n }\n if (gltfMesh.attributes && gltfMesh.attributes['TEXCOORD_0'] && gltfMesh.attributes['TEXCOORD_0'].extensions === 'WEB3D_quantized_attributes') {\n defines['HAS_WEB3D_quantized_attributes_TEXCOORD'] = 1;\n }\n defines['HAS_MIN_ALTITUDE'] = 1;\n this._setCompressedInt16Defines(defines, gltfMesh.compressed_int16_params);\n const compressDefines = gltfMesh.compressDefines;\n extend(defines, compressDefines);\n return defines;\n }\n\n _setCompressedInt16Defines(defines, compressed_int16_params) {\n if (compressed_int16_params && Object.keys(compressed_int16_params).length > 0) {\n defines['HAS_COMPRESSED_INT16'] = 1;\n if (compressed_int16_params['POSITION']) {\n defines['HAS_COMPRESSED_INT16_POSITION'] = 1;\n }\n if (compressed_int16_params['TEXCOORD_0']) {\n defines['HAS_COMPRESSED_INT16_TEXCOORD_0'] = 1;\n }\n if (compressed_int16_params['TEXCOORD_1']) {\n defines['HAS_COMPRESSED_INT16_TEXCOORD_1'] = 1;\n }\n if (compressed_int16_params['NORMAL']) {\n defines['HAS_COMPRESSED_INT16_NORMAL'] = 1;\n }\n if (compressed_int16_params['TANGENT']) {\n defines['HAS_COMPRESSED_INT16_TANGENT'] = 1;\n }\n if (compressed_int16_params['compressed_ratio']) {\n defines['HAS_COMPRESSED_INT16_RATIO'] = 1;\n }\n }\n }\n\n _updateMaskDefines(mesh) {\n const renderer = this._layer.getRenderer();\n if (renderer) {\n renderer.updateMaskDefines(mesh);\n }\n }\n\n _appendS3MDefines(defines, geometry) {\n if (geometry.data['aNormal']) {\n defines['VertexNormal'] = 1;\n }\n if (geometry.data['instanceId']) {\n defines['Instance'] = 1;\n }\n if (geometry.data['aTexCoord0']) {\n defines['TexCoord'] = 1;\n }\n if (geometry.data['aColor']) {\n defines['VertexColor'] = 1;\n }\n if (geometry.data['aTexCoord1']) {\n defines['TexCoord2'] = 1;\n }\n if (geometry.data['uv2']) {\n defines['InstanceBim'] = 1;\n }\n }\n\n _processGLTF(gltfMesh, meshId, primId, gltf, node, isI3DM, shader, gltfWeakResources) {\n let isS3M = false;\n if (gltf.asset && gltf.asset.generator === 'S3M') {\n isS3M = true;\n // is a s3mType\n gltf.extensions = gltf.extensions || {};\n // gltf.extensions['KHR_techniques_webgl'] = getKHR_techniques(gltf.asset.s3mVersion);\n }\n const url = gltf.url + '-' + meshId + '-' + primId;\n if (this._cachedGLTF[url]) {\n return this._cachedGLTF[url];\n }\n gltfWeakResources.push(gltfMesh);\n let material, geometry;\n //TODO 有些B3DM或I3DM里,多个 gltf.mesh 会共享同一个POSITION,MESH,TEXCOORD。\n // 效率更高的做法是为他们单独创建buffer后赋给Geometry\n // 程序中无需管理buffer的销毁,Geometry中会维护buffer的引用计数来管理buffer的销毁\n const matInfo = gltf.materials && gltf.materials[gltfMesh.material];\n const khrTechniquesWebgl = gltf.extensions && gltf.extensions['KHR_techniques_webgl'];\n const service = this._layer._getNodeService(node._rootIdx);\n if (khrTechniquesWebgl && matInfo.extensions && matInfo.extensions['KHR_techniques_webgl']) {\n const isWebGPU = this.getMap().getRenderer().isWebGPU();\n if (isWebGPU) {\n throw new Error('3dtiles with KHR_techniques_webgl extension is not supported in webgpu');\n }\n // s3m.vert 和 s3m.frag 是用webgl 2写的,所以是s3m时,要开启webgl2\n const khrMesh = this._createTechniqueMesh(gltfMesh, gltf, isI3DM, isS3M);\n material = khrMesh.material;\n geometry = khrMesh.geometry;\n if (service['fillEmptyDataInMissingAttribute']) {\n geometry.desc.fillEmptyDataInMissingAttribute = true;\n }\n } else {\n geometry = this._createGeometry(gltfMesh, isI3DM, DEFAULT_SEMANTICS);\n const materialInfo = service.material;\n material = this._createMaterial(gltfMesh.material, gltf, shader, materialInfo || DEFAULT_MATERIAL_INFO, gltfWeakResources, service);\n }\n if (material) {\n material.setFunctionUniform('alphaTest', function () {\n const alphaTest = service['alphaTest'];\n if (!isNil(alphaTest)) {\n return alphaTest;\n }\n return 0.1;\n });\n\n material.setFunctionUniform('environmentExposure', () => {\n // maptalks/issues#661\n const ambientLight = service.ambientLight;\n let environmentExposure = service.environmentExposure;\n const lights = this.getMap().getLightManager();\n const mapAmbient = lights && lights.getAmbientLight();\n if (ambientLight && (!mapAmbient || mapAmbient.color) && environmentExposure === undefined) {\n const ambientValue = mapAmbient && mapAmbient.color ? mapAmbient.color[0] : 0.2;\n // 老的ambientLight设置的兼容性代码\n environmentExposure = ambientLight[0] / ambientValue;\n }\n return environmentExposure || 1;\n });\n }\n\n if (material && !material.isReady()) {\n material._nodeId = node.id;\n } else if (!material) {\n material = new reshader.PhongMaterial({\n 'baseColorFactor' : [1, 1, 1, 1]\n });\n }\n\n const gltfGeo = {\n geometry, material\n };\n geometry.properties.url = url;\n this._cachedGLTF[url] = gltfGeo;\n return gltfGeo;\n }\n\n _createTechniqueMesh(gltfMesh, gltf, isI3DM, useWebGL2) {\n const { geometry, material } = this._khrTechniqueWebglManager.createMesh(gltfMesh, gltf, isI3DM, useWebGL2)\n return { geometry, material };\n }\n\n _createGeometry(gltfMesh, isI3DM, attributeSemantics) {\n const attributes = gltfMesh.attributes;\n const color0Name = 'COLOR_0';\n // 把Float32类型的color0改为uint8类型数组\n let batchIdData = attributes['_BATCHID'] && attributes['_BATCHID'].array;\n if (batchIdData) {\n if (batchIdData.byteOffset) {\n batchIdData = new batchIdData.constructor(batchIdData);\n }\n }\n if (attributes[color0Name]) {\n const colors = attributes[color0Name].array || attributes[color0Name];\n if (colors instanceof Float32Array) {\n const color = new Uint8Array(colors.length);\n for (let i = 0; i < color.length; i++) {\n color[i] = Math.round(colors[i] * 255);\n }\n if (attributes[color0Name].array) {\n attributes[color0Name].array = color;\n attributes[color0Name].componentType = 5121;\n } else {\n attributes[color0Name] = color;\n }\n\n }\n }\n const isWebGPU = this.getMap().getRenderer().isWebGPU();\n const attrs = {};\n let positionSize = 0;\n let vertexCount = 0;\n for (const p in attributes) {\n // 优先采用 attributeSemantics中定义的属性\n const name = attributeSemantics[p] || p;\n const isPosition = name === attributeSemantics['POSITION'];\n if (isPosition) {\n positionSize = attributes[p].itemSize;\n }\n if (isWebGPU) {\n const array = attributes[p].array;\n const newArray = reshader.Geometry.padGPUBufferAlignment(attributes[p].array, attributes[p].count);\n if (array !== newArray) {\n if (isPosition) {\n positionSize += 1;\n }\n attributes[p].array = newArray;\n attributes[p].byteLength = newArray.byteLength;\n attributes[p].itemSize += 1;\n const type = attributes[p].type;\n attributes[p].type = type.substring(0, type.length - 1) + attributes[p].itemSize;\n //TODO attributes[p].byteStride 可能不为0\n }\n }\n const buffer = getUniqueREGLBuffer(this._regl, attributes[p], { dimension: attributes[p].itemSize, name: p });\n\n attrs[name] = extend({}, attributes[p]);\n attrs[name].buffer = buffer;\n attrs[name].type = getArrayType(attrs[name].array);\n delete attrs[name].array;\n if (name === attributeSemantics['POSITION']) {\n attrs[name].array = attributes[p].array;\n vertexCount = attributes[p].array.length / 3;\n }\n }\n // 补上缺失的_BATHCID属性,解决macos下 vertex buffer not big enough 报错\n const pickingIdAttribute = attributeSemantics['_BATCHID'];\n if (!attrs[pickingIdAttribute] && !isI3DM) {\n const pickingData = new Uint8Array(vertexCount);\n attrs[pickingIdAttribute] = pickingData;\n }\n // createColorArray(attrs);\n const indices = gltfMesh.indices ? (gltfMesh.indices.array ? gltfMesh.indices.array.slice() : gltfMesh.indices) : null;\n const geometry = new reshader.Geometry(\n attrs,\n indices,\n 0,\n {\n // static: true,\n positionSize,\n positionAttribute: attributeSemantics['POSITION'],\n normalAttribute: attributeSemantics['NORMAL'],\n uv0Attribute: attributeSemantics['TEXCOORD_0'],\n uv1Attribute: attributeSemantics['TEXCOORD_1'],\n color0Attribute: attributeSemantics['COLOR_0'],\n tangentAttribute: attributeSemantics['TANGENT'],\n pickingIdAttribute: attributeSemantics['_BATCHID'],\n primitive: gltfMesh.mode === undefined ? 'triangles' : getPrimitive(gltfMesh.mode)\n }\n );\n if (batchIdData && indices) {\n geometry.properties.batchIdData = batchIdData;\n geometry.properties.batchIdMap = generateFeatureIndiceIndex(batchIdData, indices);\n }\n geometry.generateBuffers(this._regl, { excludeElementsInVAO: isI3DM });\n return geometry;\n }\n\n _getB3DMTransform(out, rtcCoord, projCenter, rootIdx) {\n const localTransform = mat4.identity(out);\n\n const scale = this._getProjScale(IDENTITY_SCALE);\n this._getCenterTranslation(TEMP_TRANSLATION, projCenter, rootIdx);\n\n mat4.translate(localTransform, localTransform, TEMP_TRANSLATION);\n mat4.scale(localTransform, localTransform, scale);\n return localTransform;\n }\n\n _getCenterTranslation(out, projCenter, rootIdx) {\n const heightScale = this._heightScale\n TEMP_CENTER.x = projCenter[0];\n TEMP_CENTER.y = projCenter[1];\n const center = this._prjToPoint(TEMP_CENTER);\n let offset = this._layer.options['offset'];\n if (isFunction(offset)) {\n offset = offset.call(this._layer, TEMP_CENTER);\n }\n const heightOffset = this._layer._getNodeService(rootIdx).heightOffset || 0;\n vec3.set(out, center.x - offset[0], center.y - offset[1], heightScale * projCenter[2] + heightScale * heightOffset);\n return out;\n }\n\n _updateServiceMatrix(mesh, node) {\n const serviceTransform = this._layer._getServiceTransform(TEMP_SERVICE_MAT, node);\n mesh.localTransform = mat4.multiply(mesh.localTransform, serviceTransform, mesh._originLocalTransform);\n }\n\n _getDistanceScale(out, rtcCoord) {\n // heightOffset 在 _computeProjectedTransform 中计算了,所以这里不用再重复计算。\n const map = this.getMap();\n TEMP_CENTER.x = rtcCoord[0];\n TEMP_CENTER.y = rtcCoord[1];\n const zoomScale = map.distanceToPointAtRes(100, 100, map.getGLRes(), TEMP_CENTER);\n const heightScale = this._heightScale;\n vec3.set(out, zoomScale.x / 100, zoomScale.y / 100, heightScale);\n return out;\n }\n\n _createShaders(context) {\n if (this._standardShader) {\n return;\n }\n const viewport = {\n x : 0,\n y : 0,\n width : () => {\n return this._canvas ? this._canvas.width : 1;\n },\n height : () => {\n return this._canvas ? this._canvas.height : 1;\n }\n };\n const modelNormalMatrix = [];\n const projViewModelMatrix = [];\n this._pntsShader = new reshader.MeshShader({\n vert: pntsVert,\n frag: pntsFrag,\n uniforms: [\n {\n name: 'projViewModelMatrix',\n type: 'function',\n fn: (_, props) => {\n return mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\n }\n },\n {\n name: 'modelNormalMatrix',\n type: 'function',\n fn: (_, props) => {\n return mat3.fromMat4(modelNormalMatrix, props['modelMatrix']);\n }\n }\n ],\n extraCommandProps: {\n viewport,\n blend: {\n enable: true,\n func: {\n src: 'one',\n dst: 'one minus src alpha'\n },\n equation: 'add'\n },\n depth: {\n enable: true,\n func: '<'\n }\n }\n });\n\n const defines = {};\n const uniformDeclares = [];\n ContextUtil.fillIncludes(defines, uniformDeclares, context);\n const extraCommandProps = this._getExtraCommandProps();\n\n this._phongShader = new reshader.PhongShader({\n uniforms: uniformDeclares,\n defines,\n extraCommandProps\n });\n\n this._standardShader = new reshader.pbr.StandardShader({\n uniforms: uniformDeclares,\n defines,\n extraCommandProps\n // uniforms : [\n // 'ambientLight',\n // 'baseColor',\n // 'debug',\n // 'linearColor',\n // {\n // name : 'projViewModelMatrix',\n // type : 'function',\n // fn : (context, props) => {\n // return mat4.multiply([], props['projViewMatrix'], props['modelMatrix']);\n // }\n // },\n // {\n // name : 'maxExtent',\n // type : 'function',\n // fn : (context, props) => {\n // const maxExtent = props['maxPrjExtent'],\n // prjCenter = props['prjCenter'];\n // if (!maxExtent) {\n // return null;\n // }\n // const extent = [\n // maxExtent[0] - prjCenter[0], maxExtent[1] - prjCenter[1],\n // maxExtent[2] - prjCenter[0], maxExtent[3] - prjCenter[1],\n // ];\n // return extent;\n // }\n // }\n // ],\n\n });\n //用于绘制bbox\n this._edgeShader = new reshader.EdgeShader({ extraCommandProps: {\n viewport: {\n x : 0,\n y : 0,\n width : () => {\n return this._canvas ? this._canvas.width : 1;\n },\n height : () => {\n return this._canvas ? this._canvas.height : 1;\n }\n },\n blend: {\n enable: true,\n func: {\n srcRGB: 'src alpha',\n srcAlpha: 1,\n dstRGB: 'one minus src alpha',\n dstAlpha: 'one minus src alpha'\n },\n equation: 'add'\n }\n } });\n\n const layer = this._layer;\n loginIBLResOnCanvas(layer.getRenderer().canvas, this._regl, layer.getMap());\n\n this.picking = new reshader.FBORayPicking(\n this._renderer,\n {\n vert: pickingVert,\n extraCommandProps,\n uniforms: this._standardShader.uniforms,\n defines: {\n 'PICKING_MODE': 1,\n 'ENABLE_PICKING': 1,\n 'HAS_PICKING_ID': 1\n },\n },\n this.pickingFBO,\n this.getMap()\n );\n this._pntsPicking = new reshader.FBORayPicking(\n this._renderer,\n {\n vert: pntsVert,\n extraCommandProps,\n uniforms: this._pntsShader.uniforms,\n defines: {\n 'PICKING_MODE': 1,\n 'ENABLE_PICKING': 1,\n 'HAS_PICKING_ID': 1\n }\n },\n this.pickingFBO,\n this.getMap()\n );\n // this._modelShader.filter = mesh => {\n // return mesh.material.isReady();\n // };\n }\n\n\n _getExtraCommandProps() {\n const viewport = {\n x : 0,\n y : 0,\n width : () => {\n return this._canvas ? this._canvas.width : 1;\n },\n height : () => {\n return this._canvas ? this._canvas.height : 1;\n }\n };\n return {\n viewport,\n // colorMask: (_, props) => {\n // return props['colorMask'] || colorOn;\n // },\n cull : {\n enable: (_, props) => {\n return props.meshProperties.cullFace;\n },\n face: (_, props) => {\n return props.cullFace || 'back';\n }\n },\n stencil: {\n enable: (_, props) => {\n return props.stencilEnable;\n },\n func: {\n cmp: '<=',\n ref: (_, props) => {\n return props.meshProperties.selectionDepth;\n },\n // mask: 0xff\n },\n op: {\n fail: 'keep',\n zfail: 'keep',\n zpass: 'replace'\n }\n },\n depth: {\n enable: true,\n func: (_, props) => {\n return props.meshProperties.depthFunc || '<=';\n }\n },\n blend: {\n enable: true,\n func: {\n src: 1,\n dst: 'one minus src alpha'\n },\n equation: 'add'\n },\n polygonOffset: {\n enable: true,\n offset: (_, props) => {\n return props.meshProperties.polygonOffset;\n }\n }\n };\n }\n\n _getPntsUniforms(options) {\n const map = this.getMap();\n const lightManager = map.getLightManager();\n const directionalLight = lightManager && lightManager.getDirectionalLight() || {};\n const lightDir = directionalLight.direction || [1, 1, -1];\n const pointOpacity = options && options.pointOpacity || 1;\n let layerOpacity = this._layer.options['opacity'];\n layerOpacity = isNil(layerOpacity) ? 1 : layerOpacity;\n return {\n projViewMatrix : map.projViewMatrix,\n pointOpacity,\n lightDir: vec3.normalize(LIGHT_DIR, lightDir),\n layerOpacity\n };\n }\n\n _getUniformValues() {\n const map = this.getMap();\n const layer = this._layer;\n const canvas = layer.getRenderer().canvas;\n const { iblTexes, dfgLUT } = getIBLResOnCanvas(canvas);\n const uniforms = getPBRUniforms(map, iblTexes, dfgLUT);\n const renderer = this._layer.getRenderer();\n const maskUniforms = renderer.getMaskUniforms();\n uniforms.minAltitude = layer.options.altitude || 0;\n let layerOpacity = layer.options['opacity'];\n layerOpacity = isNil(layerOpacity) ? 1 : layerOpacity;\n uniforms.layerOpacity = layerOpacity;\n extend(uniforms, {\n czm_lightDirectionEC: uniforms['light0_viewDirection'],\n lightSpecular: [1.0, 1.0, 1.0],\n viewMatrix: map.viewMatrix,\n projMatrix: map.projMatrix,\n projViewMatrix : map.projViewMatrix,\n outSize: [canvas.width, canvas.height],\n polygonFill: [1, 1, 1, 1],\n polygonOpacity: 1\n });\n if (!uniforms.ambientColor) {\n uniforms.ambientColor = [0.2, 0.2, 0.2];\n }\n extend(uniforms, maskUniforms);\n return uniforms;\n }\n\n _createMaterial(materialIndex, gltf, shader, materialInfo, gltfWeakResources, service) {\n const material = gltf.materials && gltf.materials[materialIndex];\n if (!material || !material.baseColorTexture && !material.pbrMetallicRoughness) {\n return null;\n }\n const matInfo = extend({}, materialInfo);\n if (material.baseColorTexture) {\n // GLTF 1.0\n const texInfo = gltf.textures[material.baseColorTexture.index];\n let texture;\n if (texInfo && !texInfo.image.color) {\n texture = this._getTexture(texInfo, gltfWeakResources);\n }\n matInfo.baseColorFactor = texInfo && texInfo.image.color || material.baseColorFactor || [1, 1, 1, 1];\n if (texture) {\n matInfo['baseColorTexture'] = texture;\n }\n } else {\n // GLTF 2.0\n\n if (material.normalTexture) {\n const texture = this._getTexture(gltf.textures[material.normalTexture.index], gltfWeakResources);\n if (texture) {\n const normalMapFactor = material.normalTexture.scale || 1;\n matInfo.normalTexture = texture;\n matInfo.normalMapFactor = normalMapFactor;\n }\n }\n if (material.occlusionTexture) {\n const texture = this._getTexture(gltf.textures[material.occlusionTexture.index], gltfWeakResources);\n if (texture) {\n const occlusionFactor = material.occlusionTexture.strength || 1;\n matInfo.occlusionTexture = texture;\n matInfo.occlusionFactor = occlusionFactor;\n }\n }\n if (material.emissiveTexture) {\n const texture = this._getTexture(gltf.textures[material.emissiveTexture.index], gltfWeakResources);\n if (texture) {\n matInfo.emissiveTexture = texture;\n }\n }\n if (material.emissiveFactor) {\n matInfo.emissiveFactor = material.emissiveFactor;\n }\n //TODO alphaMode, cutOff和doubleSided\n\n const pbrMetallicRoughness = material.pbrMetallicRoughness;\n if (pbrMetallicRoughness) {\n if (pbrMetallicRoughness.baseColorFactor) {\n matInfo.baseColorFactor = pbrMetallicRoughness.baseColorFactor;\n }\n if (pbrMetallicRoughness.baseColorTexture && pbrMetallicRoughness.baseColorTexture.index !== undefined) {\n const texInfo = gltf.textures[pbrMetallicRoughness.baseColorTexture.index];\n if (texInfo && texInfo.image && texInfo.image.color) {\n matInfo.baseColorFactor = matInfo.baseColorFactor ? vec4.multiply(matInfo.baseColorFactor, matInfo.baseColorFactor, texInfo.image.color) : texInfo.image.color;\n } else {\n const texture = this._getTexture(texInfo, gltfWeakResources);\n if (texture) {\n matInfo.baseColorTexture = texture;\n // 调用getREGLTexture以回收bitmap\n matInfo.baseColorTexture.getREGLTexture(this._regl);\n }\n }\n }\n if (!isNil(pbrMetallicRoughness.metallicFactor)) {\n matInfo.metallicFactor = pbrMetallicRoughness.metallicFactor;\n }\n if (!isNil(pbrMetallicRoughness.roughnessFactor)) {\n matInfo.roughnessFactor = pbrMetallicRoughness.roughnessFactor;\n }\n if (material.metallicRoughnessTexture) {\n const texture = this._getTexture(gltf.textures[material.metallicRoughnessTexture.index], gltfWeakResources);\n if (texture) {\n matInfo.metallicRoughnessTexture = texture;\n }\n }\n }\n }\n\n\n if (material.s3mMaterial) {\n return new reshader.Material(matInfo);\n }\n // matInfo.alphaTest = 0.1;\n if (service.unlit || material.extensions && material.extensions['KHR_materials_unlit']) {\n // matInfo.ambientColor = [1, 1, 1];\n // matInfo['light0_diffuse'] = [0, 0, 0, 0];\n // matInfo['lightSpecular'] = [0, 0, 0];\n const material = new reshader.PhongMaterial(matInfo);\n material.unlit = service.unlit === undefined || !!service.unlit;\n return material;\n }\n\n let meshMaterial = new reshader.pbr.StandardMaterial(matInfo);\n if (shader === 'phong') {\n meshMaterial = reshader.PhongMaterial.convertFrom(meshMaterial);\n }\n const pbrMetallicRoughness = material.pbrMetallicRoughness;\n const extensions = pbrMetallicRoughness && pbrMetallicRoughness.baseColorTexture && pbrMetallicRoughness.baseColorTexture.extensions;\n if (extensions && extensions['KHR_texture_transform']) {\n meshMaterial.set('khr_offset', extensions['KHR_texture_transform'].offset || [0, 0]);\n meshMaterial.set('khr_rotation', extensions['KHR_texture_transform'].rotation || 0);\n meshMaterial.set('khr_scale', extensions['KHR_texture_transform'].scale || [1, 1]);\n }\n meshMaterial.doubleSided = !!(service.doubleSided || material.doubleSided);\n meshMaterial.once('complete', this._bindedListener);\n return meshMaterial;\n }\n\n _getTexture(texInfo, gltfWeakResources) {\n if (!texInfo) {\n return null;\n }\n // texInfo.image.color 表示图片被精简成了颜色\n const config = {\n type: texInfo.type ? getMaterialType(texInfo.type) : 'uint8',\n format: texInfo.format ? getMaterialFormat(texInfo.format) : 'rgba',\n flipY: !!texInfo.flipY\n };\n //gltf 2.0\n const image = texInfo.image;\n gltfWeakResources.push(image);\n if (image.array) {\n config.data = image.array;\n } else if (image.mipmap) {\n config.mipmap = image.mipmap;\n }\n if (!config.data && !config.mipmap) {\n return null;\n }\n config.width = image.width;\n config.height = image.height;\n // dxt 纹理要求高宽必须大于4,否则regl中检查会报错\n if (config.mipmap && (config.width < 4 || config.height < 4)) {\n return null;\n }\n const sampler = texInfo.sampler || texInfo.texture && texInfo.texture.sampler;\n if (sampler) {\n if (sampler.magFilter) config['mag'] = getTextureMagFilter(sampler.magFilter);\n if (sampler.minFilter) config['min'] = getTextureMinFilter(sampler.minFilter);\n if (sampler.wrapS) config['wrapS'] = getTextureWrap(sampler.wrapS);\n if (sampler.wrapT) config['wrapT'] = getTextureWrap(sampler.wrapT);\n }\n\n return new reshader.Texture2D(config, this._resLoader);\n\n }\n\n _onResourceLoad({ target }) {\n const id = target._nodeId;\n const loading = this._loading[id];\n loading.count--;\n if (!loading.count) {\n const mesh = loading.meshes;\n this._modelMeshes[id] = mesh;\n delete this._loading[id];\n const cb = mesh._callback;\n delete mesh._callback;\n cb(null, { mesh: loading.meshes, id });\n }\n }\n\n // _unproject(pcoord) {\n // const map = this.getMap();\n // const sr = this._spatialReference;\n // if (!maptalks.SpatialReference.equals(sr.toJSON(), map.getSpatialReference().toJSON())) {\n // return map.getProjection().project(sr.getProjection().unproject(pcoord));\n // } else {\n // return pcoord;\n // }\n // }\n\n _getProjScale(out) {\n const map = this.getMap();\n const zoomScale = 1 / map.getGLRes();\n // 高度坐标是米\n const heightScale = this._heightScale;\n out[0] = out[1] = zoomScale;\n out[2] = heightScale;\n return out;\n }\n\n _coordToPoint(c) {\n return this._layer._coordToPoint(c);\n }\n\n _pointToPrj(c) {\n const map = this.getMap();\n if (map.getGLZoom) {\n return map['_pointToPrj'](c, map.getGLZoom());\n } else {\n return map['_pointToPrjAtRes'](c, map.getGLRes());\n }\n }\n\n _prjToPoint(c) {\n const map = this.getMap();\n if (map.getGLZoom) {\n return map['_prjToPoint'](c, map.getGLZoom());\n } else {\n return map['_prjToPointAtRes'](c, map.getGLRes(), TEMP_POINT);\n }\n }\n\n _getUpAxisTransform(axis) {\n if (axis === 'Y') {\n return Y_TO_Z;\n } else if (axis === 'X') {\n return X_TO_Z;\n } else {\n return IDENTITY_MATRIX;\n }\n }\n\n pick(x, y, tolerance = 3) {\n const layer = this._layer;\n if (!layer || !layer.options['picking']) {\n return [];\n }\n if (!this.pickingFBO || !this.picking) {\n return [];\n }\n const result = [];\n const uniforms = this._getUniformValues();\n const b3dm = this._pickMesh(this.picking, uniforms, this._modelScene, x, y, tolerance);\n if (b3dm) {\n result.push(b3dm);\n }\n const i3dm = this._pickMesh(this.picking, uniforms, this._i3dmScene, x, y, tolerance);\n if (i3dm) {\n result.push(i3dm);\n }\n const pntsUniforms = this._getPntsUniforms();\n const pnts = this._pickMesh(this._pntsPicking, pntsUniforms, this._pntsScene, x, y, tolerance);\n if (pnts) {\n result.push(pnts);\n }\n return result;\n\n }\n\n _pickMesh(picking, uniforms, scene, x, y, tolerance) {\n if (!scene.getMeshes().length) {\n return null;\n }\n const layer = this._layer;\n const map = this.getMap();\n\n picking.render(scene.getMeshes().filter(m => !m.bloom), uniforms, true);\n let picked = {};\n if (picking.getRenderedMeshes().length) {\n picked = picking.pick(x, y, tolerance, uniforms, {\n viewMatrix: map.viewMatrix,\n projMatrix: map.projMatrix,\n returnPoint: layer.options['pickingPoint']\n });\n }\n const { meshId, pickingId, point, coordinate } = picked;\n const mesh = (meshId === 0 || meshId) && picking.getMeshAt(meshId);\n if (!mesh || !mesh.geometry) {\n //有可能mesh已经被回收,geometry不再存在\n return null;\n }\n const props = mesh.properties;\n if (point && point.length) {\n point[0] = Math.round(point[0] * 1E5) / 1E5;\n point[1] = Math.round(point[1] * 1E5) / 1E5;\n point[2] = Math.round(point[2] * 1E5) / 1E5;\n }\n const data = {\n batchId: pickingId\n };\n const services = layer.options['services'];\n const service = services && services[mesh.properties.serviceIndex];\n if (service && service['debug']) {\n data.debugInfo = props;\n }\n if (props && props.batchTable) {\n const { batchTable, batchTableBin, count } = props;\n const batchId = pickingId;\n\n for (const p in batchTable) {\n if (batchTable[p].byteOffset !== undefined) {\n data[p] = readBatchData(batchTable[p], batchTableBin, count, batchId);\n } else {\n data[p] = batchTable[p][batchId];\n }\n }\n }\n\n return {\n service: mesh.properties.serviceIndex,\n data,\n point,\n coordinate\n };\n }\n\n highlight(highlights) {\n this._highlighted = highlights;\n const renderer = this._layer.getRenderer();\n this._highlightTimestamp = renderer.getFrameTimestamp();\n renderer.setToRedraw(true);\n }\n\n cancelAllHighlight() {\n this._highlighted = null;\n const renderer = this._layer.getRenderer();\n this._highlightTimestamp = renderer.getFrameTimestamp();\n renderer.setToRedraw(true);\n }\n\n showOnly(showOnlys) {\n this._showOnlys = showOnlys;\n const renderer = this._layer.getRenderer();\n this._showOnlyTimeStamp = renderer.getFrameTimestamp();\n renderer.setToRedraw(true);\n }\n\n cancelShowOnly() {\n this._showOnlys = null;\n const renderer = this._layer.getRenderer();\n this._showOnlyTimeStamp = renderer.getFrameTimestamp();\n renderer.setToRedraw(true);\n }\n\n _getCurrentBatchIDs() {\n if (!this._paintedMeshes) {\n return [];\n }\n const ids = {};\n const batchIds = [];\n for (const p in this._paintedMeshes) {\n const meshes = this._paintedMeshes[p];\n if (meshes) {\n for (let i = 0; i < meshes.length; i++) {\n const mesh = meshes[i];\n const geometry = mesh && mesh.geometry;\n if (!mesh || !geometry) {\n continue;\n }\n const serviceIndex = mesh.properties.serviceIndex;\n if (!ids[serviceIndex]) {\n ids[serviceIndex] = new Set();\n }\n const batchData = geometry.properties.batchIdData;\n if (batchData) {\n for (let ii = 0; ii < batchData.length; ii++) {\n if (!ids[serviceIndex].has(batchData[ii])) {\n batchIds.push({\n id: batchData[ii],\n service: serviceIndex\n });\n ids[serviceIndex].add(batchData[ii]);\n }\n }\n }\n }\n }\n }\n return batchIds;\n }\n\n hasIBL() {\n const lightManager = this.getMap().getLightManager();\n const resource = lightManager && lightManager.getAmbientResource();\n return !!resource;\n }\n}\n\n// function createColorArray(attrs) {\n// const vertexCount = attrs[attributeSemantics['POSITION']].array.length;\n// const color = {\n// array: new Uint8Array(),\n\n// }\n// color.array.fill(255);\n// return color;\n// }\n\n// function meshCompare(a, b) {\n// let levelA = a.properties.level;\n// let levelB = b.properties.level;\n// if (!a.properties.isLeaf) {\n// levelA += 255;\n// }\n// if (!b.properties.isLeaf) {\n// levelB += 255;\n// }\n// if (levelA >= 255 && levelB >= 255) {\n// return levelB - levelA;\n// }\n// return levelA - levelB;\n// }\n\n// function meshCompare(a, b) {\n// return a.properties.node._cameraDistance - b.properties.node._cameraDistance;\n// }\n\nfunction generateFeatureIndiceIndex(featureIds, indices) {\n if (!indices) {\n return null;\n }\n const indiceIndex = new Map();\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i];\n const id = featureIds[idx];\n let index = indiceIndex.get(id);\n if (!index) {\n index = [];\n indiceIndex.set(id, index);\n }\n index.push(idx);\n }\n return indiceIndex;\n}\n\nfunction trimGLTFWeakResources(gltfWeakResources) {\n for (let i = 0; i < gltfWeakResources.length; i++) {\n if (gltfWeakResources[i]) {\n if (gltfWeakResources[i].array) {\n gltfWeakResources[i].array = null;\n }\n if (gltfWeakResources[i].mipmap) {\n gltfWeakResources[i].mipmap = null;\n }\n if (gltfWeakResources[i].indices) {\n gltfWeakResources[i].indices = null;\n }\n }\n }\n}\n\nfunction generateSphere(count, radius) {\n const angle = Math.PI * 2 / count;\n const vertices = [];\n const indices = [];\n for (let i = 0; i <= count; i++) {\n const posX = Math.cos(angle * i) * radius;\n const posY = Math.sin(angle * i) * radius;\n const posZ = 0;\n vertices[i * 3] = posX;\n vertices[i * 3 + 1] = posY;\n vertices[i * 3 + 2] = posZ;\n }\n for (let i = count; i <= count * 2; i++) {\n const posY = Math.cos(angle * i) * radius;\n const posZ = Math.sin(angle * i) * radius;\n const posX = 0;\n vertices[i * 3] = posX;\n vertices[i * 3 + 1] = posY;\n vertices[i * 3 + 2] = posZ;\n }\n for (let i = count * 2; i <= count * 3; i++) {\n const posX = Math.cos(angle * i) * radius;\n const posZ = Math.sin(angle * i) * radius;\n const posY = 0;\n vertices[i * 3] = posX;\n vertices[i * 3 + 1] = posY;\n vertices[i * 3 + 2] = posZ;\n }\n const len = vertices.length / 3 - 1;\n for (let i = 0; i < len; i++) {\n if (i === count - 1 || i === count * 2 -1) {\n continue;\n }\n indices[i * 2] = i;\n indices[i * 2 + 1] = i + 1;\n }\n vertices.push(0, 0, 0);\n vertices.push(radius, 0, 0);\n vertices.push(0, radius, 0);\n vertices.push(0, 0, radius);\n indices.push(len + 1, len + 2);\n indices.push(len + 1, len + 3);\n indices.push(len + 1, len + 4);\n return { vertices, indices };\n}\n","\n\nexport function fillNodepagesToCache(nodeCache, nodes) {\n if (!nodes) {\n return;\n }\n for (let i = 0; i < nodes.length; i++) {\n // 1.6版是id,1.7/1.8版是index\n const id = nodes[i].id || nodes[i].index;\n nodeCache[id] = nodes[i];\n }\n}\n","import { radianToCartesian3 } from '../../common/Transform';\nimport { toRadian } from '../../common/Util';\nimport { vec3, mat3, mat4 } from 'gl-matrix';\nimport { fillNodepagesToCache } from './Util';\n\nconst TEMP_VEC3 = [];\n\nexport default class I3SNode {\n constructor(url, rootIdx, nodeCache, layer, fnFetchNodepages) {\n this._layer = layer;\n this._url = url;\n this._rootIdx = rootIdx;\n this._fnFetchNodepages = fnFetchNodepages;\n this._version = nodeCache.version;\n if (url.indexOf('i3s:tileset:') < 0) {\n if (this._version <= 1.6) {\n this._index = 'root';\n } else {\n this._index = 0;\n }\n nodeCache.version = this._version;\n } else {\n this._index = url.substring('i3s:tileset:'.length);\n if (this._version > 1.6) {\n this._index = parseInt(this._index);\n }\n }\n this._url = url;\n this._nodeCache = nodeCache;\n }\n\n load() {\n const nodeCache = this._nodeCache;\n const baseUrl = nodeCache.layerScene.baseUrl;\n\n if (this._version <= 1.6) {\n if (nodeCache[this._index] && nodeCache[this._index].lodSelection) {\n this._nodeJSON = nodeCache[this._index];\n return this._loadNode();\n }\n return new Promise((resolve) => {\n let url = baseUrl + '/nodes/' + this._index;\n if (nodeCache.layerScene.eslpk) {\n url += '/3dNodeIndexDocument.json';\n }\n this._fnFetchNodepages(this._rootIdx, url, () => {\n this._nodeJSON = nodeCache[this._index];\n resolve(this._loadNode());\n });\n });\n } else if (this._version >= 1.7) {\n if (nodeCache[this._index]) {\n this._nodeJSON = nodeCache[this._index];\n return this._loadNode();\n }\n const nodepage = Math.floor(this._index / nodeCache.nodesPerPage);\n //root node\n\n return new Promise((resolve) => {\n let url = baseUrl + '/nodepages/' + nodepage;\n if (nodeCache.layerScene.eslpk) {\n url += '.json';\n }\n this._fnFetchNodepages(this._rootIdx, url, () => {\n this._nodeJSON = nodeCache[this._index];\n resolve(this._loadNode());\n });\n });\n } else {\n // leaf nodes\n return null;\n }\n }\n\n getTileset() {\n return this._tileset;\n }\n\n getChildrenURL() {\n return this._childrenURL;\n }\n\n _loadNode() {\n const nodeCache = this._nodeCache;\n const baseUrl = nodeCache.layerScene.baseUrl;\n const children = this._nodeJSON.children;\n const promises = [];\n const pendingReqs = {};\n if (children) {\n for (let i = 0; i < children.length; i++) {\n if (this._version <= 1.6) {\n const id = children[i].id;\n if (nodeCache[id]) {\n continue;\n }\n const childPageIndex = id;\n if (!pendingReqs[childPageIndex]) {\n pendingReqs[childPageIndex] = new Promise((resolve) => {\n let url = baseUrl + '/nodes/' + childPageIndex;\n if (nodeCache.layerScene.eslpk) {\n url += '/3dNodeIndexDocument.json';\n }\n this._fnFetchNodepages(this._rootIdx, url, () => {\n resolve();\n });\n });\n promises.push(pendingReqs[childPageIndex]);\n }\n } else {\n const id = children[i];\n if (nodeCache[id]) {\n continue;\n }\n const childPageIndex = Math.floor(id / nodeCache.nodesPerPage);\n if (!pendingReqs[childPageIndex]) {\n pendingReqs[childPageIndex] = new Promise((resolve) => {\n let url = baseUrl + '/nodepages/' + childPageIndex;\n if (nodeCache.layerScene.eslpk) {\n url += '.json';\n }\n this._fnFetchNodepages(this._rootIdx, url, () => {\n resolve();\n });\n });\n promises.push(pendingReqs[childPageIndex]);\n }\n }\n\n }\n }\n if (promises.length) {\n return Promise.all(promises).then(() => {\n return this._loadContent();\n });\n } else {\n return this._loadContent();\n }\n }\n\n _loadContent() {\n return Promise.resolve(this._createTileset());\n }\n\n _fillCache(nodes) {\n fillNodepagesToCache(this._nodeCache, nodes);\n }\n\n _createTileset() {\n const inPlaceTileset = {\n asset: {\n i3s: true,\n version: \"1.0\",\n gltfUpAxis: 'Z'\n },\n geometricError: Number.MAX_VALUE,\n root: this._convertNode(this._nodeJSON, true),\n };\n return inPlaceTileset;\n }\n\n _convertNode(nodeJSON) {\n const renderer = this._layer.getRenderer();\n const projection = this._nodeCache.projection;\n const is4326 = !projection || projection && projection.wkid === 4326;\n const version = this._version;\n const nodeCache = this._nodeCache;\n const nodeData = nodeJSON;\n const obb = nodeData.obb;\n const mbs = nodeData.mbs;\n\n const boundingVolume = {};\n let position;\n\n if (mbs) {\n position = vec3.set([], mbs[0], mbs[1], mbs[2]);\n if (!is4326) {\n position = renderer._tileCoordToLngLat(position, position);\n }\n position = _WGS84ToCartesian([], position[0], position[1], position[2]); // cartesian center of box\n boundingVolume.sphere = [\n ...position, // cartesian center of sphere\n mbs[3] // radius of sphere\n ];\n } else if (obb) {\n position = vec3.set([], obb.center[0], obb.center[1], obb.center[2]); // cartesian center of box;\n if (!is4326) {\n position = renderer._tileCoordToLngLat(position, position);\n }\n position = _WGS84ToCartesian([], position[0], position[1], position[2]); // cartesian center of box;\n const box = fromCenterHalfSizeQuaternion(\n position, // cartesian center of box\n obb.halfSize,\n obb.quaternion\n );\n // boundingVolume.box = box;\n // 计算box的半径\n const x = box[3] + box[6] + box[9];\n const y = box[4] + box[7] + box[10];\n const z = box[5] + box[8] + box[11];\n vec3.set(TEMP_VEC3, x, y, z);\n const radius = vec3.len(TEMP_VEC3);\n boundingVolume.sphere = [\n ...position,\n radius\n ];\n }\n\n // compute the geometric error\n let metersPerPixel = Infinity;\n\n let span = 0;\n if (nodeData.mbs) {\n span = nodeData.mbs[3];\n } else if (nodeData.obb) {\n span = Math.max(\n Math.max(nodeData.obb.halfSize[0], nodeData.obb.halfSize[1]),\n nodeData.obb.halfSize[2]\n );\n }\n\n // get the meters/pixel density required to pop the next LOD\n if (nodeData.lodThreshold !== undefined) {\n if (\n nodeCache.lodSelectionMetricType ===\n \"maxScreenThresholdSQ\"\n ) {\n const maxScreenThreshold =\n Math.sqrt(nodeData.lodThreshold) / (Math.PI * 0.25);\n metersPerPixel = span / maxScreenThreshold;\n } else {\n console.error(\"Unsupported lodSelectionMetricType in Layer\");\n }\n } else if (nodeData.lodSelection !== undefined) {\n for (\n let lodIndex = 0;\n lodIndex < nodeData.lodSelection.length;\n lodIndex++\n ) {\n if (\n nodeData.lodSelection[lodIndex].metricType === \"maxScreenThreshold\"\n ) {\n metersPerPixel = span / nodeData.lodSelection[lodIndex].maxError;\n }\n }\n }\n\n if (metersPerPixel === Infinity || isNaN(metersPerPixel)) {\n metersPerPixel = 100000;\n }\n\n // calculate the length of 16 pixels in order to trigger the screen space error\n const geometricError = metersPerPixel * 16;\n\n const globalTransforms = mat4.identity([]);\n // globalTransforms[12] = position[0];\n // globalTransforms[13] = position[1];\n // globalTransforms[14] = position[2];\n\n const localTransforms = globalTransforms;\n\n const children = nodeData.children;\n let childrenDefinition;\n // get children definition\n if (children) {\n childrenDefinition = [];\n const nodeCache = this._nodeCache;\n for (let i = 0; i < children.length; i++) {\n const childIndex = version <= 1.6 ? children[i].id : children[i];\n if (nodeCache[childIndex]) {\n childrenDefinition.push(\n this._convertNode(nodeCache[childIndex])\n );\n } else {\n childrenDefinition = null;\n break;\n }\n }\n }\n\n\n // Create a tile set\n const inPlaceTileDefinition = {\n refine: \"REPLACE\",\n boundingVolume: boundingVolume,\n transform: localTransforms,\n geometricError: geometricError,\n };\n\n if (version <= 1.6) {\n if (!nodeJSON.lodSelection) {\n // 1.6的node即是个tileset,又是个mesh\n // 因为只在3DNodeDocumentIndex中存了children信息\n // 载入3DNodeDocumentIndex之前,是个tileset,载入后,就成为了mesh\n // 如果没有lodSelection,说明是个tileset\n inPlaceTileDefinition.content = {\n uri: 'i3s:tileset:' + (nodeJSON.id || nodeJSON.index),\n };\n } else if (nodeJSON.geometryData) {\n inPlaceTileDefinition.content = {\n uri: 'i3s:mesh:' + (nodeJSON.id || nodeJSON.index),\n };\n }\n } else {\n if (children && children.length && !childrenDefinition) {\n // a child\n inPlaceTileDefinition.content = {\n uri: 'i3s:tileset:' + (nodeJSON.id || nodeJSON.index),\n };\n } else if (nodeData.mesh) {\n inPlaceTileDefinition.content = {\n uri: 'i3s:mesh:' + (nodeJSON.id || nodeJSON.index),\n };\n }\n }\n\n if (childrenDefinition && childrenDefinition.length) {\n inPlaceTileDefinition.children = childrenDefinition;\n }\n\n return inPlaceTileDefinition;\n }\n\n getJSON() {\n return this._nodeJSON;\n }\n}\n\n\n\nfunction _WGS84ToCartesian(out, long, lat, height) {\n return radianToCartesian3(out, toRadian(long), toRadian(lat), height);\n}\n\nfunction fromCenterHalfSizeQuaternion(center ,halfSize, quaternion) {\n const directionsMatrix = mat3.fromQuat([], quaternion);\n directionsMatrix[0] = directionsMatrix[0] * halfSize[0];\n directionsMatrix[1] = directionsMatrix[1] * halfSize[0];\n directionsMatrix[2] = directionsMatrix[2] * halfSize[0];\n directionsMatrix[3] = directionsMatrix[3] * halfSize[1];\n directionsMatrix[4] = directionsMatrix[4] * halfSize[1];\n directionsMatrix[5] = directionsMatrix[5] * halfSize[1];\n directionsMatrix[6] = directionsMatrix[6] * halfSize[2];\n directionsMatrix[7] = directionsMatrix[7] * halfSize[2];\n directionsMatrix[8] = directionsMatrix[8] * halfSize[2];\n return [\n ...center,\n ...directionsMatrix\n ];\n}\n","import transcoders from '@maptalks/gl/dist/transcoders.js';\nimport I3SNode from './I3SNode';\n// import I3SMesh from './I3SMesh';\nimport { isObject } from '../../common/Util';\nimport { mat4 } from '@maptalks/gl';\n\nconst supportKTX2 = !!transcoders.ktx2;\nconst IDENTITY_MAT4 = mat4.identity([]);\n\nconst supportWASM = (() => {\n try {\n if (typeof WebAssembly === \"object\"\n && typeof WebAssembly.instantiate === \"function\") {\n const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));\n if (module instanceof WebAssembly.Module)\n return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;\n }\n /* eslint-disable no-empty */\n } catch (e) {\n }\n /* eslint-enable no-empty */\n return false;\n})();\n\nexport function parseI3SJSON(layer, json, rootIdx, service, url, nodeCache, fnFetchNodepages) {\n if (!nodeCache.layerScene) {\n // the scene layer\n nodeCache.layerScene = json;\n nodeCache.nodesPerPage = json.nodePages && json.nodePages.nodesPerPage || 64;\n nodeCache.lodSelectionMetricType = json.nodePages && json.nodePages.lodSelectionMetricType;\n let baseUrl = url;\n nodeCache.layerScene.eslpk = baseUrl.indexOf('3dSceneLayer.json') >= 0;\n const isUrlConfigFile = baseUrl.endsWith('.json');\n if (isUrlConfigFile) {\n const lastSlash = url.lastIndexOf('/');\n if (lastSlash < 0) {\n baseUrl = './';\n } else {\n baseUrl = url.substring(0, lastSlash);\n }\n }\n nodeCache.layerScene.baseUrl = regulateURL(baseUrl);\n }\n const node = new I3SNode(url, rootIdx, nodeCache, layer, fnFetchNodepages);\n return node.load();\n}\n\nexport function isI3STileset(url) {\n return url.indexOf('i3s:tileset') >= 0;\n}\n\nexport function isI3SMesh(url) {\n return url.indexOf('i3s:mesh') >= 0;\n}\n\nconst prefixIndex = 'i3s:mesh:'.length\nexport function getI3SNodeIndex(version, url) {\n const id = url.substring(prefixIndex);\n if (version >= 1.7) {\n return parseInt(id);\n } else {\n return id;\n }\n\n}\n\nexport function getI3SNodeInfo(url, nodeCache, regl, enableDraco, forceDraco) {\n const isESLPK = nodeCache.layerScene.eslpk;\n const nodeIndex = getI3SNodeIndex(nodeCache.version, url);\n const node = nodeCache[nodeIndex];\n const baseUrl = nodeCache.layerScene.baseUrl;\n const meshes = [];\n let hasCompression = false;\n const transform = IDENTITY_MAT4;\n let geometry, material;\n if (nodeCache.version <= 1.6) {\n // 1.6\n if (!node.geometryData) {\n return null;\n }\n const len = node.geometryData.length;\n if (!len) {\n return null;\n }\n let geoUrl = baseUrl + `/nodes/${node.id}/` + node.geometryData[len - 1].href;\n if (isESLPK) {\n geoUrl += '.bin';\n }\n const meshInfo = { geometry: { url: geoUrl, info: nodeCache.layerScene.store.defaultGeometrySchema } };\n let textureUrl = node.textureData && node.textureData[0] && node.textureData[0].href;\n if (textureUrl) {\n const mimeType = nodeCache.layerScene.store.textureEncoding[0];\n let format;\n if (mimeType === 'image/jpeg') {\n format = 'jpg';\n } else {\n format = 'png';\n }\n if (isESLPK) {\n textureUrl += '.' + format;\n }\n const matInfo = {\n pbrMetallicRoughness: {\n baseColorTexture: {\n url: baseUrl + `/nodes/${node.id}/` + textureUrl,\n factor: 1,\n format,\n mimeType\n },\n metallicFactor: 0.0,\n }\n }\n meshInfo.material = matInfo;\n }\n meshes.push(meshInfo);\n } else {\n // 1.7+\n geometry = node.mesh.geometry;\n material = node.mesh.material;\n const geoDefinitions = nodeCache.layerScene.geometryDefinitions;\n //read texture encode array\n const textureEncoding = (nodeCache.layerScene.store || {}).textureEncoding;\n const geoDef = geoDefinitions[geometry.definition];\n const { geometryBuffers } = geoDef;\n // geometryBuffers[1] is the draco version\n hasCompression = enableDraco && geometryBuffers.length === 2;\n const geometryInfo = transcoders['draco'] && hasCompression ? geometryBuffers[1] : geometryBuffers[0];\n const index = transcoders['draco'] && hasCompression ? 1 : 0;\n let geoUrl = baseUrl + `/nodes/${geometry.resource}/geometries/` + index;\n if (isESLPK) {\n geoUrl += '.bin';\n }\n const meshInfo = { geometry: { url: geoUrl, info: geometryInfo } };\n if (forceDraco && supportWASM && hasCompression && !transcoders['draco']) {\n throw new Error('Must import @maptalks/transcoder.draco to load i3s draco compressed geometry');\n }\n\n const materialDefinitions = nodeCache.layerScene.materialDefinitions;\n const textureSetDefinitions = nodeCache.layerScene.textureSetDefinitions;\n let materialDef = 0;\n if (material) {\n materialDef = materialDefinitions[material.definition];\n }\n let materialInfo;\n if (materialDefinitions) {\n const resource = material.resource;\n materialInfo = parseMaterial(textureEncoding, materialDef, textureSetDefinitions, baseUrl, resource, regl, nodeCache.layerScene.eslpk);\n } else {\n materialInfo = {\n pbrMetallicRoughness: {\n metallicFactor: 0.0,\n }\n };\n }\n meshInfo.material = materialInfo;\n meshes.push(meshInfo);\n }\n\n\n\n return {\n dracoCompression: hasCompression,\n meshes,\n nodeIndex,\n center: node.obb && node.obb.center || node.mbs && [node.mbs[0], node.mbs[1], node.mbs[2]],\n transform\n };\n}\n\nfunction parseMaterial(textureEncoding, materialDefinition, textureSetDefinitions, baseUrl, nodeIndex, regl, isESLPK) {\n const matInfo = JSON.parse(JSON.stringify(materialDefinition));\n\n resolveTextures(textureEncoding, matInfo, textureSetDefinitions, baseUrl, nodeIndex, regl, isESLPK);\n return matInfo;\n}\n\nfunction resolveTextures(textureEncoding, matInfo, textureSetDefinitions, baseUrl, resource, regl, isESLPK) {\n for (const p in matInfo) {\n // is a texture\n if (matInfo[p] && matInfo[p].textureSetDefinitionId >= 0) {\n const texDef = textureSetDefinitions[matInfo[p].textureSetDefinitionId];\n const mimeType = 'images/' + texDef.formats[0].format;\n const format = getSupportedTexture(texDef.formats, regl, textureEncoding);\n const texture = {\n url: baseUrl + `/nodes/${resource}/textures/${format.name}`,\n factor: matInfo[p].factor === undefined ? 1 : matInfo[p].factor,\n format: format.format,\n mimeType\n };\n if (isESLPK) {\n let ext = '';\n switch (format.format) {\n case 'dds':\n ext = 'bin.dds';\n break;\n case 'jpg':\n case 'png':\n ext = format.format;\n break;\n }\n texture.url += '.' + ext;\n }\n matInfo[p] = texture;\n } else if (isObject(matInfo[p])) {\n resolveTextures(textureEncoding, matInfo[p], textureSetDefinitions, baseUrl, resource, regl, isESLPK);\n }\n }\n}\n\nconst textureEnCodingMap = {\n \"image/jpeg\": 'jpg',\n \"image/jpg\": 'jpg',\n \"image/png\": 'jpg',\n \"image/vnd-ms.dds\": \"dds\",\n \"image/ktx\": 'jpg'\n};\n\nfunction getSupportedTexture(formats, regl, textureEncoding) {\n if (textureEncoding && textureEncoding.length) {\n const textureEncode = textureEncoding[textureEncoding.length - 1];\n const textureFormat = textureEnCodingMap[textureEncode];\n if (!textureFormat) {\n console.error(`i3s not find texture format type from:`, textureEnCodingMap, 'current textureEncoding:', textureEncode);\n } else {\n for (let i = 0, len = formats.length; i < len; i++) {\n const format = formats[i].format;\n if (format === textureFormat) {\n return formats[i];\n }\n }\n }\n\n }\n // for (let i = formats.length - 1; i >= 0; i--) {\n for (let i = 0; i <= formats.length; i++) {\n const format = formats[i].format;\n if (format === 'dds' && regl.hasExtension('WEBGL_compressed_texture_s3tc')) {\n //only support dxt1 and dtx5 compression\n return formats[i];\n } else if (format === 'jpg' || format === 'png') {\n // png or jpg\n return formats[i];\n } else if (format === 'ktx2' && supportKTX2) {\n return formats[i];\n } else if (format === 'ktx-etc2') {\n // not supported yet\n }\n }\n return null;\n}\n\nfunction regulateURL(url) {\n return url.split('?')[0];\n}\n","import * as maptalks from 'maptalks';\nimport { reshader, CanvasCompatible } from '@maptalks/gl';\nimport { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\nimport { MaskRendererMixin } from '@maptalks/gl';\nimport Geo3DTilesWorkerConnection from '../Geo3DTilesWorkerConnection';\nimport LRUCache from './LRUCache';\nimport TileMeshPainter from './TileMeshPainter';\nimport { readBatchArray } from '../../common/TileHelper';\nimport { extend, isBase64, base64URLToArrayBuffer, pushIn } from '../../common/Util.js';\nimport { isRelativeURL, prepareFetchOptions } from '../../common/UrlUtil';\n// import { CANDIDATE_MAX_ERROR } from '../../common/Constants.js';\nimport { parseI3SJSON, isI3STileset, isI3SMesh, getI3SNodeInfo } from '../i3s/I3SHelper';\nimport { fillNodepagesToCache } from '../i3s/Util';\nimport I3SNode from '../i3s/I3SNode';\n\nconst { Ajax } = getGLTFLoaderBundle();\n\nconst COORD_IN = new maptalks.Coordinate(0, 0);\nconst COORD_OUT = new maptalks.Coordinate(0, 0);\n\nconst REPORTED_ERRORS = new Set();\n\nconst EMPTY_ARRAY = [];\n\nconst GlobalTieCache = new LRUCache((maptalks.Browser.mobile ? 32 : 1024) * 1024 * 1024, (tile => {\n const renderer = tile.renderer;\n delete tile.renderer;\n renderer.deleteTile(tile);\n}));\nlet TileCacheRefCount = 0;\n\n\n\nexport default class Geo3DTilesRenderer extends MaskRendererMixin(CanvasCompatible(maptalks.renderer.LayerAbstractRenderer)) {\n\n constructor(layer) {\n super(layer);\n const max = layer.options['maxGPUMemory'] * 1024 * 1024;\n if (max > GlobalTieCache.max) {\n GlobalTieCache.setMaxSize(max);\n }\n this.tileCache = GlobalTieCache;\n TileCacheRefCount++;\n this.tilesLoading = {};\n this._requests = {};\n this._modelQueue = [];\n this._fnFetchNodepages = (...args) => {\n return this._fetchI3DNodepages.call(this, ...args);\n };\n }\n\n getAnalysisMeshes() {\n if (!this.painter) {\n return EMPTY_ARRAY;\n }\n const paintedMeshes = this.painter.getPaintedMeshes();\n if (!paintedMeshes) {\n return EMPTY_ARRAY;\n }\n\n const meshes = [];\n const { b3dmMeshes, pntsMeshes, i3dmMeshes } = paintedMeshes;\n if (b3dmMeshes.length) {\n pushIn(meshes, b3dmMeshes.filter(mesh => !!(mesh && mesh.geometry)));\n }\n if (pntsMeshes.length) {\n pushIn(meshes, pntsMeshes.filter(mesh => !!(mesh && mesh.geometry)));\n }\n if (i3dmMeshes.length) {\n pushIn(meshes, i3dmMeshes.filter(mesh => !!(mesh && mesh.geometry)));\n }\n return meshes;\n }\n\n needToRedraw() {\n // return true;\n const map = this.getMap();\n if (map.isInteracting()) {\n return true;\n }\n if (this._modelQueue.length) {\n return true;\n }\n return super.needToRedraw();\n }\n\n getFrameTimestamp() {\n return this._timestamp;\n }\n\n drawOnInteracting(event, timestamp, parentContext) {\n this.draw(timestamp, parentContext);\n }\n\n draw(timestamp, parentContext) {\n this._timestamp = timestamp;\n const mask2DExtent = this.prepareCanvas();\n if (mask2DExtent) {\n if (!mask2DExtent.intersects(this.canvasExtent2D)) {\n this.completeRender();\n return;\n }\n }\n const { root, tiles } = this.layer.getTiles();\n const count = tiles.length;\n if (!tiles || !count) {\n this.completeRender();\n return;\n }\n this.painter.prepareRender(parentContext);\n this._consumeI3SQueue();\n this._consumeModelQueue(parentContext);\n const { selectedTiles, requests } = this._selectTiles(root, tiles);\n\n if (requests.length) {\n this.loadTiles(requests);\n }\n this._drawTiles(selectedTiles, parentContext);\n this._abortUnusedTiles();\n if (!requests.length) {\n this.completeRender();\n }\n }\n // 遍历candidate瓦片,检查哪些可以获取到mesh,哪些需要去构造网络请求\n _selectTiles(root, tiles) {\n let requests = [];\n this._markTiles();\n let preLoadingCount = 0;\n const loadingLimit = this._getLoadLimit();\n\n const checked = {};\n let hit = false, loading = false;\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n const node = tile.node;\n if (checked[node.id]) {\n continue;\n }\n checked[node.id] = 1;\n let tileLoading = false;\n const cached = this.getCachedTile(node.id);\n if (this._isLoadingTile(node.id)) {\n preLoadingCount++;\n tileLoading = loading = true;\n this.tilesLoading[node.id].current = true;\n } else if (cached) {\n if (this.getTileOpacity(cached) < 1) {\n tileLoading = loading = true;\n }\n // 剔除掉error相差过大的父级瓦片。否则会在有些情况下,覆盖范围很大的父级瓦片会绘制在场景中\n // 是在小丸子公司,由飞渡生成的模型中发现了该问题\n // if (!tile.node._error || rootNode.isS3M || !tile.node.children || tile.node._error <= CANDIDATE_MAX_ERROR) {\n\n // }\n hit = true;\n tile.selected = true;\n tile.data = cached;\n } else if (!this.painter.has(node)) {\n tileLoading = loading = true;\n requests.push(node);\n }\n if (!tileLoading) {\n continue;\n }\n //background tiles\n const parentTile = this._selectParentTile(tile);\n if (!parentTile) {\n const children = this._selectChildTile(tile);\n if (children.length) hit = true;\n } else {\n hit = true;\n }\n }\n\n const selectedTiles = hit ? this._sortTiles(root) : [];\n\n if (requests.length > 1) {\n requests.sort(compareRequests);\n if (loadingLimit) {\n const count = loadingLimit - preLoadingCount;\n if (count > 0) {\n requests = requests.slice(0, count);\n } else {\n requests = [];\n }\n }\n }\n\n return {\n loading,\n requests,\n selectedTiles\n };\n }\n\n //based on Cesium's traverseAndSelect in Cesium3DTilesetTraversal.js\n _sortTiles(root) {\n const selectedTiles = [];\n let lastAncestor;\n let branchRootId;\n const stack = [root],\n parentStack = [];\n while (stack.length > 0 || parentStack.length > 0) {\n if (parentStack.length > 0) {\n const waitingTile = parentStack[parentStack.length - 1];\n if (waitingTile._stackLength === stack.length) {\n parentStack.pop();\n if (waitingTile === lastAncestor) {\n waitingTile.leave = true;\n }\n waitingTile.branchRootId = branchRootId;\n selectedTiles.push(waitingTile);\n if (parentStack.length === 0) {\n branchRootId = null;\n }\n continue;\n }\n }\n const tile = stack.pop();\n const children = tile.children;\n if (tile.selected) {\n if (tile.node.refine === 'add') {\n tile.leave = true;\n tile.selectionDepth = parentStack.length;\n tile.branchRootId = branchRootId;\n selectedTiles.push(tile);\n } else {\n tile.selectionDepth = parentStack.length;\n\n lastAncestor = tile;\n\n if (children.length === 0) {\n tile.leave = true;\n tile.branchRootId = branchRootId;\n selectedTiles.push(tile);\n continue;\n }\n if (parentStack.length === 0) {\n branchRootId = tile.node.id;\n }\n parentStack.push(tile);\n tile._stackLength = stack.length;\n }\n }\n // if (children.length > 1) {\n // children.sort(compareTile);\n // }\n for (let i = 0; i < children.length; i++) {\n stack.push(children[i]);\n }\n }\n\n return selectedTiles;\n }\n\n _selectParentTile(node) {\n if (!node.parent) {\n return null;\n }\n let treeNode = node.parent;\n while (treeNode && treeNode.level >= 0) {\n const id = treeNode.node.id;\n const cached = this.tileCache.has(id);\n if (cached) {\n treeNode.selected = true;\n treeNode.data = this.tileCache.get(id);\n return treeNode;\n }\n treeNode = treeNode.parent;\n }\n return null;\n }\n\n _selectChildTile(tile) {\n const result = [];\n if (!tile.node.children || !tile.node.children.length) {\n return result;\n }\n const maxLevel = tile._level + 1;\n const queue = [tile.node];\n while (queue.length > 0) {\n const node = queue.pop();\n const children = node.children;\n for (let i = 0, l = children.length; i < l; i++) {\n if ((!children[i].content || !children[i].content.url) &&\n children[i].children && children[i].children.length) {\n queue.push(children[i]);\n continue;\n }\n const id = children[i].id;\n const cached = this.tileCache.has(id);\n if (cached) {\n const child = this.layer._createCandidate(children[i], tile);\n child.selected = true;\n child.data = this.tileCache.get(id);\n tile.children.push(child);\n result.push(child);\n } else if (children[i]._level <= maxLevel) {\n queue.push(children[i]);\n }\n }\n\n }\n return result;\n }\n\n _drawTiles(tiles, parentContext) {\n\n this.tileCache.markAll(this, false);\n const boxMeshes = [];\n for (let i = 0, l = tiles.length; i < l; i++) {\n const tileData = tiles[i].data;\n tileData.current = true;\n tileData.renderer = this;\n this.tileCache.add(tiles[i].node.id, tileData);\n const node = tileData.node;\n const service = this.layer._getNodeService(node._rootIdx);\n if (node._boxMesh && service['debug'] && !Array.isArray(service['debug'])) {\n boxMeshes.push(node._boxMesh);\n }\n }\n\n const services = this.layer.options.services;\n for (let i = 0; i < services.length; i++) {\n const service = services[i];\n const debugNodes = Array.isArray(service['debug']) && service['debug'];\n if (debugNodes) {\n for (const nodeId of debugNodes) {\n const nodeBox = this.layer._getNodeBox(nodeId);\n const node = nodeBox && nodeBox.node;\n if (!node || !node._boxMesh) {\n continue;\n }\n boxMeshes.push(node._boxMesh);\n }\n }\n }\n\n const context = { tiles };\n this.onDrawTileStart(context);\n const count = this.painter.paint(tiles, boxMeshes, parentContext);\n this.layer.fire('drawtiles', { count });\n\n this.onDrawTileEnd(context);\n if (count) {\n this.layer.fire('canvasisdirty', { renderCount: count });\n }\n // 改为绘制结束后,再 shrink cache,以免当前帧需要绘制的瓦片被delete掉, maptalks/issues#766\n this.tileCache.shrink();\n }\n\n onDrawTileStart() { }\n onDrawTileEnd() { }\n\n loadTiles(queue) {\n for (let i = 0, l = queue.length; i < l; i++) {\n const node = queue[i];\n // tile image's loading may not be async\n this.tilesLoading[node.id] = {\n current: true,\n node\n };\n this.loadTile(node);\n }\n }\n\n loadTile(node) {\n let url = node.content.url;\n if (isBase64(url)) {\n const binary = base64URLToArrayBuffer(url);\n this._loadTileContent(url, binary, node);\n return null;\n\n }\n\n if (isI3STileset(url)) {\n const rootIdx = node._rootIdx;\n const nodeCache = this._i3sNodeCache[rootIdx];\n const i3sNode = new I3SNode(url, rootIdx, nodeCache, this.layer, this._fnFetchNodepages);\n return i3sNode.load().then(tileset => {\n this.onTilesetLoad(tileset, node, url);\n });\n }\n\n if (node && isRelativeURL(url) && !isI3SMesh(url)) {\n url = node.baseUrl + url;\n }\n this._loadTileContent(url, null, node);\n return null;\n }\n\n _loadTileContent(url, arraybuffer, tile) {\n let supportedFormats = this._supportedFormats;\n if (!supportedFormats) {\n supportedFormats = reshader.Util.getSupportedFormats(this.gl || this.device && this.device.wgpu);\n this._supportedFormats = supportedFormats;\n }\n\n const service = this.layer._getNodeService(tile._rootIdx);\n if (service.isSuperMapiServer) {\n url = encodeSuperMapURI(url, tile.baseUrl);\n }\n const requestUrl = this.layer.getTileUrl(url, this.layer._roots[tile._rootIdx]);\n const params = { url: requestUrl, arraybuffer, rootIdx: tile._rootIdx, upAxis: tile._upAxis, transform: tile.matrix, supportedFormats };\n\n if (isI3SMesh(url)) {\n const nodeCache = this._i3sNodeCache[tile._rootIdx];\n params.projection = nodeCache.projection;\n params.i3sInfo = getI3SNodeInfo(url, nodeCache, this.regl || this.device, this.layer.options['enableI3SCompressedGeometry'], this.layer.options['forceI3SCompressedGeometry']);\n if (!params.i3sInfo) {\n this.onTileError({ status: 404 }, tile, url);\n return;\n }\n }\n\n // if (url.substring(url.length - 4, url.length) === 'b3dm') {\n // url = 'http://localhost/3dtiles/debug/xx/tile0/3/2/6.b3dm';\n // }\n params.service = extend({}, service);\n if (service.offset) {\n delete params.service.offset;\n }\n // fetchOptions定义在service中\n params.referrer = window && window.location.href;\n this.workerConn.loadTile(this.layer.getId(), params, (err, data) => {\n if (err) {\n this.onTileError(err, tile, url);\n return;\n }\n const { magic } = data;\n if (magic === 'b3dm' || magic === 'pnts' || magic === 'i3dm' || magic === 'cmpt' || magic === 'gltf') {\n this._modelQueue.push({ data, tile });\n } else {\n this.onTilesetLoad(data, tile, url);\n }\n\n // if (magic === 'b3dm') {\n // // this.painter.createB3DMMesh(data, tile.id, tile, (err, { mesh }) => {\n // // this._onMeshCreated(data, tile, err, mesh);\n // // });\n // } else if (magic === 'pnts') {\n // this.painter.createPntsMesh(data, tile.id, tile, (err, { mesh }) => {\n // this._onMeshCreated(data, tile, err, mesh);\n // });\n // } else if (magic === 'i3dm') {\n // this.painter.createI3DMMesh(data, tile.id, tile, (err, { mesh }) => {\n // this._onMeshCreated(data, tile, err, mesh);\n // });\n // } else if (magic === 'cmpt') {\n // this.painter.createCMPTMesh(data, tile.id, tile, (err, { mesh }) => {\n // this._onMeshCreated(data, tile, err, mesh);\n // });\n // }else {\n // this.onTilesetLoad(data, tile, url);\n // }\n });\n }\n\n _createBoxMesh(node) {\n if (!this.painter) {\n return;\n }\n this.painter._createBoxMesh(node);\n }\n\n _deleteBoxMesh(node) {\n if (!this.painter) {\n return;\n }\n this.painter._deleteBoxMesh(node);\n }\n\n _consumeModelQueue() {\n const map = this.getMap();\n const limit = this.layer.options['meshLimitPerFrame'];\n let count = 0;\n while (this._modelQueue.length && (count < limit || !map.isInteracting())) {\n const { data, tile } = this._modelQueue.shift();\n const { magic } = data;\n if (magic === 'b3dm' || magic === 'gltf') {\n this.painter.createB3DMMesh(data, tile.id, tile, (err, { mesh }) => {\n this._onMeshCreated(data, tile, err, mesh);\n });\n } else if (magic === 'pnts') {\n this.painter.createPntsMesh(data, tile.id, tile, (err, { mesh }) => {\n this._onMeshCreated(data, tile, err, mesh);\n });\n } else if (magic === 'i3dm') {\n this.painter.createI3DMMesh(data, tile.id, tile, (err, { mesh }) => {\n this._onMeshCreated(data, tile, err, mesh);\n });\n } else if (magic === 'cmpt') {\n this.painter.createCMPTMesh(data, tile.id, tile, (err, { mesh }) => {\n this._onMeshCreated(data, tile, err, mesh);\n });\n }\n count++;\n }\n }\n\n _onMeshCreated(data, tile, err, mesh) {\n this._enableLayerOpacity(mesh);\n if (err) {\n this.onTileError(err, tile);\n } else {\n const size = this._getMeshSize(mesh);\n tile.memorySize = size;\n this.onTileLoad(data, tile);\n }\n }\n\n _enableLayerOpacity(mesh) {\n if (Array.isArray(mesh)) {\n for (let i = 0; i < mesh.length; i++) {\n if (mesh[i]) {\n if (Array.isArray(mesh[i])) {\n this._enableLayerOpacity(mesh[i]);\n } else {\n const defines = mesh[i].defines || {};\n defines['HAS_LAYER_OPACITY'] = 1;\n mesh[i].setDefines(defines);\n }\n }\n }\n } else if (mesh) {\n if (Array.isArray(mesh)) {\n this._enableLayerOpacity(mesh);\n } else {\n const defines = mesh.defines || {};\n defines['HAS_LAYER_OPACITY'] = 1;\n mesh.setDefines(defines);\n }\n }\n }\n\n _getMeshSize(mesh) {\n let size = 0;\n if (Array.isArray(mesh)) {\n for (let i = 0; i < mesh.length; i++) {\n if (mesh[i]) {\n size += this._getMeshSize(mesh[i]);\n }\n }\n } else if (mesh) {\n size += mesh.getMemorySize();\n }\n return size;\n }\n\n onTileLoad(b3dm, node) {\n if (!this.layer) {\n return;\n }\n delete this.tilesLoading[node.id];\n this.layer.onTileLoad(b3dm, node);\n this._addTileToCache(node);\n this.setToRedraw();\n /**\n * tileload event, fired when tile is loaded.\n *\n * @event Geo3DTilesLayer#tileload\n * @type {Object}\n * @property {String} type - tileload\n * @property {Geo3DTilesLayer} target - tile layer\n * @property {Object} node - 3d tile node\n */\n this.layer.fire('tileload', { node });\n }\n\n onTilesetLoad(tileset, parent, url) {\n if (!this.layer) {\n return;\n }\n this.layer._vertexCompressionType = tileset.extensions && tileset.extensions['s3m:VertexCompressionType'];\n if (tileset.capabilities || tileset.layers && tileset.layers[0] && tileset.layers[0].capabilities) {\n //如果是i3s scene layer,还要再次请求root node信息\n this._parseI3SSceneLayer(tileset, parent, url);\n return;\n }\n delete this.tilesLoading[parent.id];\n this.layer.onTilesetLoad(tileset, parent, url);\n }\n\n onTileError(err, node, errorUrl) {\n if (!this.layer) {\n return;\n }\n // debugger\n const url = errorUrl || node.content.url;\n\n const info = err && err.message || err;\n if ((!err || err.status !== 404 && err.status !== 204) && !REPORTED_ERRORS.has(info)) {\n console.warn('failed to load 3d tile: ' + url);\n console.warn(err);\n REPORTED_ERRORS.add(info);\n }\n\n\n // const emptyB3DM = gltf.B3DMLoader.createEmptyB3DM();\n // emptyB3DM.loadTime = 0;\n delete this.tilesLoading[node.id];\n if (!this.layer.options['onlyCacheNoContentTileWhenError'] || err && !maptalks.Util.isNoContentHttpCode(err.status)) {\n this._addErrorToCache(node, err);\n }\n // this.setToRedraw();\n /**\n * tileerror event, fired when tile loading has error.\n *\n * @event Geo3DTilesLayer#tileerror\n * @type {Object}\n * @property {String} type - tileerror\n * @property {Geo3DTilesLayer} target - tile layer\n * @property {Object} node - 3d tile node\n * @property {Error} error - error message\n */\n this.layer.fire('tileerror', { node, error: err });\n }\n\n getCachedTile(id) {\n return this.tileCache.get(id);\n }\n\n getShadowMeshes() {\n if (!this.painter) {\n return [];\n }\n const meshes = [];\n const b3dmMeshes = this.painter.getCurrentB3DMMeshes();\n\n for (const p in b3dmMeshes) {\n if (b3dmMeshes[p] && b3dmMeshes[p].isValid && b3dmMeshes[p].isValid()) {\n meshes.push(b3dmMeshes[p]);\n }\n }\n const i3dmMeshes = this.painter.getCurrentI3DMMeshes();\n for (const p in i3dmMeshes) {\n if (i3dmMeshes[p] && i3dmMeshes[p].isValid && i3dmMeshes[p].isValid()) {\n meshes.push(i3dmMeshes[p]);\n }\n }\n return meshes;\n }\n\n _addErrorToCache(node, err) {\n const tileData = {\n // image : data,\n loadTime: maptalks.Util.now(),\n current: true,\n error: err,\n node\n };\n tileData.renderer = this;\n this.tileCache.add(node.id, tileData);\n }\n\n _addTileToCache(node) {\n const tileData = {\n // image : data,\n loadTime: maptalks.Util.now(),\n current: true,\n node\n };\n tileData.renderer = this;\n this.tileCache.add(node.id, tileData);\n }\n\n abortTileLoading(tile) {\n if (!tile || !this.workerConn) return;\n const url = tile.node.content.url;\n this.workerConn.abortTileLoading(this.layer.getId(), url);\n delete this._requests[url];\n }\n\n _markTiles() {\n if (this.tilesLoading) {\n for (const p in this.tilesLoading) {\n this.tilesLoading[p].current = false;\n }\n }\n }\n\n deleteTile(tile) {\n this.painter.deleteTile(tile);\n }\n\n initContext() {\n super.initContext();\n const layer = this.layer;\n const { regl, reglGL, device } = this.context;\n this.regl = regl;\n this.device = device;\n this.gl = reglGL;\n const graphics = regl || device;\n this.prepareWorker();\n this.canvas.pickingFBO = this.canvas.pickingFBO || graphics.framebuffer(this.canvas.width, this.canvas.height);\n this.pickingFBO = this.canvas.pickingFBO || graphics.framebuffer(this.canvas.width, this.canvas.height);\n this.painter = new TileMeshPainter(graphics, layer);\n\n this.layer._resumeHighlights();\n this.layer.fire('contextcreate', { regl, device });\n }\n\n prepareWorker() {\n const map = this.getMap();\n if (!this.workerConn) {\n this.workerConn = new Geo3DTilesWorkerConnection('@maptalks/3dtiles', map.id, reshader.Util.supportNPOT(this.regl || this.device));\n }\n const workerConn = this.workerConn;\n //setTimeout in case layer's style is set to layer after layer's creating.\n if (!workerConn.isActive()) {\n return;\n }\n let options = this.layer.options || {};\n options = extend({}, options);\n delete options['offset'];\n const spatialReference = map.options.spatialReference;\n options.projection = spatialReference && spatialReference.coordType || spatialReference && spatialReference.projection || map.getSpatialReference().getProjection().code;\n const id = this.layer.getId();\n workerConn.addLayer(id, options, err => {\n if (err) throw err;\n if (!this.layer) return;\n this.ready = true;\n this.layer.fire('workerready');\n });\n }\n\n onRemove() {\n if (this.painter) {\n this.painter.remove();\n }\n if (this.pickingFBO) {\n if (!this.canvas.pickingFBO) {\n this.pickingFBO.destroy();\n }\n delete this.pickingFBO;\n }\n if (this.workerConn) {\n this.workerConn.removeLayer(this.layer.getId(), err => {\n if (err) throw err;\n });\n this.workerConn.remove();\n delete this.workerConn;\n }\n TileCacheRefCount--;\n if (!TileCacheRefCount) {\n GlobalTieCache.reset();\n }\n this.clear();\n delete this.tileCache;\n delete this.gl;\n delete this.regl;\n super.onRemove();\n }\n\n clear() {\n this._abortUnusedTiles(true);\n this.tileCache.reset(this);\n this.tilesLoading = {};\n super.clear();\n }\n\n getTileOpacity(/* tileData */) {\n return 1;\n // if (!this.layer.options['fadeAnimation'] || !tileData.loadTime) {\n // return 1;\n // }\n // return Math.min(1, (maptalks.Util.now() - tileData.loadTime) / (1000 / 60 * 10));\n }\n\n getStencilValue() {\n return 0;\n }\n\n _abortUnusedTiles(force) {\n if (!this._preRetireTime) {\n this._preRetireTime = Date.now();\n }\n const now = Date.now();\n if (!force && now - this._preRetireTime < this.layer.options['retireInterval']) {\n return;\n }\n this._preRetireTime = now;\n const aborted = [];\n for (const i in this.tilesLoading) {\n const node = this.tilesLoading[i];\n if (force || !node.current) {\n aborted.push(i);\n // abort loading tiles\n this.abortTileLoading(node);\n // if (this.painter.has(node)) {\n // this.painter.deleteTile(node);\n // }\n }\n }\n\n for (let i = 0; i < aborted.length; i++) {\n delete this.tilesLoading[aborted[i]];\n }\n }\n\n // limit tile number to load when map is interacting\n _getLoadLimit() {\n if (this.getMap().isInteracting()) {\n return this.layer.options['loadingLimitOnInteracting'];\n }\n return this.layer.options['loadingLimit'];\n }\n\n _createGLContext(canvas, options) {\n const names = ['webgl', 'experimental-webgl'];\n let context = null;\n /* eslint-disable no-empty */\n for (let i = 0; i < names.length; ++i) {\n try {\n context = canvas.getContext(names[i], options);\n } catch (e) { }\n if (context) {\n break;\n }\n }\n return context;\n /* eslint-enable no-empty */\n }\n\n _isLoadingTile(tileId) {\n return !!this.tilesLoading[tileId];\n }\n\n getI3DMMeshes() {\n return this.painter.getI3DMMeshes();\n }\n\n getPNTSMeshes() {\n return this.painter.getPNTSMeshes();\n }\n\n getB3DMMeshes() {\n return this.painter.getB3DMMeshes();\n }\n\n readBatchData(batch, bin, count) {\n return readBatchArray(batch, bin, 0, count);\n }\n\n _consumeI3SQueue() {\n if (!this._i3sRequests) {\n return;\n }\n const limit = this.layer.options['i3sNodepageLimitPerFrame'] || Number.MAX_VALUE;\n let count = 0;\n const promises = [];\n for (const url in this._i3sRequests) {\n const callbacks = this._i3sRequests[url];\n if (callbacks.status === 'pending') {\n continue;\n }\n callbacks.status = 'pending';\n const rootIdx = callbacks.rootIdx;\n const service = this.layer._getNodeService(rootIdx);\n const fetchOptions = prepareFetchOptions(service.fetchOptions);\n promises.push(Ajax.getJSON(url, fetchOptions).then(json => {\n delete this._i3sRequests[url];\n const nodeCache = this._i3sNodeCache[rootIdx];\n if (!nodeCache) {\n this.setToRedraw();\n return;\n }\n if (json.nodes) {\n // 1.7, 1.8\n fillNodepagesToCache(nodeCache, json.nodes);\n } else {\n // 1.6\n nodeCache[json.id] = json;\n fillNodepagesToCache(nodeCache, json.children);\n }\n\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i]();\n }\n this.setToRedraw();\n }));\n count++;\n if (count >= limit) {\n break;\n }\n }\n if (promises.length) {\n Promise.all(promises);\n }\n }\n\n _fetchI3DNodepages(rootIdx, url, cb) {\n if (!this._i3sRequests) {\n this._i3sRequests = {};\n }\n this._i3sRequests[url] = this._i3sRequests[url] || [];\n this._i3sRequests[url].rootIdx = rootIdx;\n this._i3sRequests[url].push(cb);\n this.setToRedraw();\n }\n\n _parseI3SSceneLayer(tileset, parent, url) {\n if (!this._i3sNodeCache) {\n this._i3sNodeCache = [];\n }\n const rootIdx = parent._rootIdx;\n if (!this._i3sNodeCache[rootIdx]) {\n this._i3sNodeCache[rootIdx] = {};\n }\n const nodeCache = this._i3sNodeCache[rootIdx];\n const service = this.layer._getNodeService(rootIdx);\n if (tileset.layers) {\n tileset = tileset.layers[0];\n if (url[url.length - 1] !== '/') {\n url += '/';\n }\n url = url + 'layers/0'\n }\n nodeCache.version = +(service.i3sVersion || tileset.store.version);\n if (tileset.spatialReference && (!tileset.spatialReference.wkid || tileset.spatialReference.wkid !== 4326)) {\n console.warn('i3s has a spatialReference other than 4326.', tileset.spatialReference);\n }\n if (tileset.spatialReference && tileset.spatialReference.wkid === 4490) {\n console.warn('i3s spatialReference is 4490,auto set spatialReference to 4326,This may cause some location issues, please ensure that your service is 4326');\n tileset.spatialReference.wkid = 4326;\n }\n nodeCache.projection = tileset.spatialReference;\n parseI3SJSON(this.layer, tileset, rootIdx, service, url, nodeCache, this._fnFetchNodepages).then(json => {\n this.onTilesetLoad(json, parent, url);\n });\n }\n\n pick(x, y, options) {\n if (!this.painter) {\n return [];\n }\n const pickingFBO = this.pickingFBO;\n const { width, height } = this.canvas;\n if (this.pickingFBO && (pickingFBO.width !== width || pickingFBO.height !== height)) {\n pickingFBO.resize(width, height);\n }\n //TODO webgpu不支持sync read\n return this.painter.pick(x, y, options && options.tolerance);\n }\n\n highlight(highlights) {\n if (!this._highlighted) {\n this._highlighted = [];\n }\n if (Array.isArray(highlights)) {\n for (let i = 0; i < highlights.length; i++) {\n const service = highlights[i].service || 0;\n let serviceHighs = this._highlighted[service];\n if (!serviceHighs) {\n serviceHighs = this._highlighted[service] = new Map();\n }\n serviceHighs.set(highlights[i].id, highlights[i]);\n }\n } else {\n const service = highlights.service || 0;\n let serviceHighs = this._highlighted[service];\n if (!serviceHighs) {\n serviceHighs = this._highlighted[service] = new Map();\n }\n serviceHighs.set(highlights.id, highlights);\n }\n\n this.painter.highlight(this._highlighted);\n }\n\n cancelHighlight(service, ids) {\n if (!this._highlighted) {\n return;\n }\n const serviceHighs = this._highlighted[service];\n if (!serviceHighs) {\n return;\n }\n if (Array.isArray(ids)) {\n for (let i = 0; i < ids.length; i++) {\n serviceHighs.delete(ids[i]);\n }\n } else {\n serviceHighs.delete(ids);\n }\n if (!serviceHighs.size) {\n this._highlighted[service] = null;\n }\n this.painter.highlight(this._highlighted);\n }\n\n cancelAllHighlight() {\n delete this._highlighted;\n this.painter.cancelAllHighlight();\n }\n\n showOnly(items) {\n if (!this._showOnlys) {\n this._showOnlys = [];\n }\n if (Array.isArray(items)) {\n for (let i = 0; i < items.length; i++) {\n const service = items[i].service || 0;\n let serviceShowOnlys = this._showOnlys[service];\n if (!serviceShowOnlys) {\n serviceShowOnlys = this._showOnlys[service] = new Map();\n }\n serviceShowOnlys.set(items[i].id, items[i]);\n }\n } else {\n const service = items.service || 0;\n let serviceShowOnlys = this._showOnlys[service];\n if (!serviceShowOnlys) {\n serviceShowOnlys = this._showOnlys[service] = new Map();\n }\n serviceShowOnlys.set(items.id, items);\n }\n\n this.painter.showOnly(this._showOnlys);\n }\n\n cancelShowOnly() {\n delete this._showOnlys;\n this.painter.cancelShowOnly();\n }\n\n _getCurrentBatchIDs() {\n if (!this.painter) {\n return [];\n }\n return this.painter._getCurrentBatchIDs();\n }\n\n _tileCoordToLngLat(out, position) {\n const map = this.getMap();\n const code = map.getProjection().code.toLowerCase();\n if (code === 'identity') {\n const projection = this._getCoordProjection();\n COORD_IN.set(position[0], position[1]);\n projection.unproject(COORD_IN, COORD_OUT);\n out[0] = COORD_OUT.x;\n out[1] = COORD_OUT.y;\n return out;\n } else {\n COORD_IN.set(position[0], position[1]);\n map.getProjection().unproject(COORD_IN, COORD_OUT);\n out[0] = COORD_OUT.x;\n out[1] = COORD_OUT.y;\n return out;\n }\n }\n\n _lngLatToIdentityCoord(out, position) {\n const projection = this._getCoordProjection();\n COORD_IN.set(position[0], position[1]);\n projection.project(COORD_IN, COORD_OUT);\n out[0] = COORD_OUT.x;\n out[1] = COORD_OUT.y;\n return out;\n }\n\n _identityCoordToLngLat(out, coord) {\n const projection = this._getCoordProjection();\n COORD_IN.set(coord[0], coord[1]);\n projection.unproject(COORD_IN, COORD_OUT);\n out[0] = COORD_OUT.x;\n out[1] = COORD_OUT.y;\n return out;\n }\n\n _getCoordProjection() {\n const map = this.getMap();\n const coordType = map.options.spatialReference.coordType;\n if (!coordType) {\n throw new Error('Missing coordType in map spatialReference.');\n }\n if (!this._centerProjection) {\n this._centerProjection = maptalks.SpatialReference.getProjectionInstance(coordType);\n }\n return this._centerProjection;\n }\n}\n\n// function compareTile(a, b) {\n// return b.node._cameraDistance - a.node._cameraDistance;\n// }\n\nfunction compareRequests(a, b) {\n return a._cameraDistance - b._cameraDistance;\n}\n\n\nfunction encodeSuperMapURI(url, baseUrl) {\n const uriComponent = url.substring(baseUrl.length);\n const parts = uriComponent.split('/');\n const encoded = [];\n for (let i = 0; i < parts.length; i++) {\n encoded.push(encodeURIComponent(parts[i]));\n }\n return baseUrl + encoded.join('/');\n}\n","/**\n * from mapbox-gl-js\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @public\n */\nclass LRUCache {\n /**\n * @param {number} max number of permitted values\n * @param {Function} onRemove callback called with items when they expire\n */\n constructor(max, onRemove) {\n this.max = max;\n this.currentSize = 0;\n this.data = new Map();\n this.onRemove = onRemove;\n }\n\n /**\n * Clear the cache\n *\n * @returns {LRUCache} this cache\n */\n reset(renderer) {\n if (this.data) {\n const keys = this.data.keys();\n for (const id of keys) {\n const data = this.data.get(id);\n if (!renderer || renderer === data.renderer) {\n this._remove(id, data);\n }\n }\n }\n if (!renderer) {\n this.data = new Map();\n this.currentSize = 0;\n }\n return this;\n }\n\n clear(renderer) {\n this.reset(renderer);\n // delete this.onRemove;\n }\n\n /**\n * Add a key, value combination to the cache, trimming its size if this pushes\n * it over max length.\n *\n * @param {string} key lookup key for the item\n * @param {*} data any value\n *\n * @returns {LRUCache} this cache\n */\n add(key, data) {\n if (!data) {\n return this;\n }\n if (data.node && data.node.memorySize) {\n this.currentSize += data.node.memorySize;\n }\n if (this.has(key)) {\n const cached = this.data.get(key);\n if (cached && cached.node && cached.node.memorySize) {\n this.currentSize -= cached.node.memorySize;\n }\n this.data.delete(key);\n this.data.set(key, data);\n } else {\n this.data.set(key, data);\n }\n\n return this;\n }\n\n shrink() {\n if (this.currentSize > this.max) {\n let warned = false;\n const iterator = this.data.keys();\n let item = iterator.next();\n while (this.currentSize > this.max && item.value !== undefined) {\n if (!warned && this.data.get(item.value).current) {\n warned = true;\n console.warn(`current maxGPUMemory(${this.max / 1024 / 1024}) for Geo3DTilesLayer is not enough, one or more current tiles will be discarded.`);\n }\n const removedData = this.getAndRemove(item.value);\n if (removedData) {\n this.onRemove(removedData);\n }\n item = iterator.next();\n }\n }\n }\n\n /**\n * Determine whether the value attached to `key` is present\n *\n * @param {String} key the key to be looked-up\n * @returns {Boolean} whether the cache has this value\n */\n has(key) {\n return this.data.has(key);\n }\n\n /**\n * List all keys in the cache\n *\n * @returns {Array<string>} an array of keys in this cache.\n */\n keys() {\n const keys = new Array(this.data.size);\n let i = 0;\n const iterator = this.data.keys();\n for (const k of iterator) {\n keys[i++] = k;\n }\n return keys;\n }\n\n /**\n * Get the value attached to a specific key and remove data from cache.\n * If the key is not found, returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n */\n getAndRemove(key) {\n if (!this.has(key)) { return null; }\n\n const data = this.data.get(key);\n if (data.node && data.node.memorySize) {\n this.currentSize -= data.node.memorySize;\n }\n this.data.delete(key);\n return data;\n }\n\n /**\n * Get the value attached to a specific key without removing data\n * from the cache. If the key is not found, returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n */\n get(key) {\n if (!this.has(key)) { return null; }\n\n const data = this.data.get(key);\n this.data.delete(key);\n this.data.set(key, data);\n return data;\n }\n\n /**\n * Remove a key/value combination from the cache.\n *\n * @param {string} key the key for the pair to delete\n * @returns {LRUCache} this cache\n */\n remove(key) {\n if (!this.has(key)) { return this; }\n const data = this.data.get(key);\n this._remove(key, data);\n return this;\n }\n\n _remove(key, data) {\n if (data.node && data.node.memorySize) {\n this.currentSize -= data.node.memorySize;\n }\n this.data.delete(key);\n this.onRemove(data);\n }\n\n /**\n * Change the max size of the cache.\n *\n * @param {number} max the max size of the cache\n * @returns {LRUCache} this cache\n */\n setMaxSize(max) {\n this.max = max;\n\n this.shrink();\n\n return this;\n }\n\n getMemorySize() {\n let size = 0;\n const values = this.data.values();\n for (const p of values) {\n const node = p && p.node;\n if (node && node.memorySize) {\n size += node.memorySize;\n }\n }\n return size;\n }\n\n markAll(renderer, isCurrent) {\n const values = this.data.values();\n for (const data of values) {\n if (!renderer || data.renderer === renderer) {\n data.current = isCurrent;\n }\n }\n }\n}\n\nexport default LRUCache;\n","import { vec3 } from 'gl-matrix';\n\n// const getPlanesRight = [];\n// const getPlanesNearCenter = [];\n\n// function computeCullingVolume(position, direction, up) {\n\n\n// var planes = this._cullingVolume.planes;\n\n// var t = this.top;\n// var b = this.bottom;\n// var r = this.right;\n// var l = this.left;\n// var n = this.near;\n// var f = this.far;\n\n// var right = vec3.cross(getPlanesRight, direction, up);\n\n// var nearCenter = getPlanesNearCenter;\n// vec3.scale(n, nearCenter, direction);\n// Cartesian3.add(position, nearCenter, nearCenter);\n\n// var farCenter = getPlanesFarCenter;\n// Cartesian3.multiplyByScalar(direction, f, farCenter);\n// Cartesian3.add(position, farCenter, farCenter);\n\n// var normal = getPlanesNormal;\n\n// //Left plane computation\n// Cartesian3.multiplyByScalar(right, l, normal);\n// Cartesian3.add(nearCenter, normal, normal);\n// Cartesian3.subtract(normal, position, normal);\n// Cartesian3.normalize(normal, normal);\n// Cartesian3.cross(normal, up, normal);\n// Cartesian3.normalize(normal, normal);\n\n// var plane = planes[0];\n// if (!defined(plane)) {\n// plane = planes[0] = new Cartesian4();\n// }\n// plane.x = normal.x;\n// plane.y = normal.y;\n// plane.z = normal.z;\n// plane.w = -Cartesian3.dot(normal, position);\n\n// //Right plane computation\n// Cartesian3.multiplyByScalar(right, r, normal);\n// Cartesian3.add(nearCenter, normal, normal);\n// Cartesian3.subtract(normal, position, normal);\n// Cartesian3.cross(up, normal, normal);\n// Cartesian3.normalize(normal, normal);\n\n// plane = planes[1];\n// if (!defined(plane)) {\n// plane = planes[1] = new Cartesian4();\n// }\n// plane.x = normal.x;\n// plane.y = normal.y;\n// plane.z = normal.z;\n// plane.w = -Cartesian3.dot(normal, position);\n\n// //Bottom plane computation\n// Cartesian3.multiplyByScalar(up, b, normal);\n// Cartesian3.add(nearCenter, normal, normal);\n// Cartesian3.subtract(normal, position, normal);\n// Cartesian3.cross(right, normal, normal);\n// Cartesian3.normalize(normal, normal);\n\n// plane = planes[2];\n// if (!defined(plane)) {\n// plane = planes[2] = new Cartesian4();\n// }\n// plane.x = normal.x;\n// plane.y = normal.y;\n// plane.z = normal.z;\n// plane.w = -Cartesian3.dot(normal, position);\n\n// //Top plane computation\n// Cartesian3.multiplyByScalar(up, t, normal);\n// Cartesian3.add(nearCenter, normal, normal);\n// Cartesian3.subtract(normal, position, normal);\n// Cartesian3.cross(normal, right, normal);\n// Cartesian3.normalize(normal, normal);\n\n// plane = planes[3];\n// if (!defined(plane)) {\n// plane = planes[3] = new Cartesian4();\n// }\n// plane.x = normal.x;\n// plane.y = normal.y;\n// plane.z = normal.z;\n// plane.w = -Cartesian3.dot(normal, position);\n\n// //Near plane computation\n// plane = planes[4];\n// if (!defined(plane)) {\n// plane = planes[4] = new Cartesian4();\n// }\n// plane.x = direction.x;\n// plane.y = direction.y;\n// plane.z = direction.z;\n// plane.w = -Cartesian3.dot(direction, nearCenter);\n\n// //Far plane computation\n// Cartesian3.negate(direction, normal);\n\n// plane = planes[5];\n// if (!defined(plane)) {\n// plane = planes[5] = new Cartesian4();\n// }\n// plane.x = normal.x;\n// plane.y = normal.y;\n// plane.z = normal.z;\n// plane.w = -Cartesian3.dot(normal, farCenter);\n\n// return this._cullingVolume;\n// }\n\nfunction getMatrix3Column(out, mat, idx) {\n out[0] = mat[idx];\n out[1] = mat[idx + 3];\n out[2] = mat[idx + 6];\n return out;\n}\n\nexport function distanceToCamera(center, halfAxes, cameraPosition) {\n return Math.sqrt(distanceSquaredTo(center, halfAxes, cameraPosition));\n}\n\nconst scratchOffset = [];\nconst scratchCartesianU = [];\nconst scratchCartesianV = [];\nconst scratchCartesianW = [];\nconst scratchPPrime = [];\n\n//from Cesium's OrientedBoundingBox.distanceSquaredTo\nfunction distanceSquaredTo(center, halfAxes, cartesian) {\n // See Geometric Tools for Computer Graphics 10.4.2\n const offset = vec3.subtract(scratchOffset, cartesian, center);\n\n // var halfAxes = halfAxes;\n const u = getMatrix3Column(scratchCartesianU, halfAxes, 0);\n const v = getMatrix3Column(scratchCartesianV, halfAxes, 1);\n const w = getMatrix3Column(scratchCartesianW, halfAxes, 2);\n\n const uHalf = vec3.len(u);\n const vHalf = vec3.len(v);\n const wHalf = vec3.len(w);\n\n vec3.normalize(u, u);\n vec3.normalize(v, v);\n vec3.normalize(w, w);\n\n const pPrime = scratchPPrime;\n pPrime[0] = vec3.dot(offset, u);\n pPrime[1] = vec3.dot(offset, v);\n pPrime[2] = vec3.dot(offset, w);\n\n let distanceSquared = 0.0;\n let d;\n\n if (pPrime[0] < -uHalf) {\n d = pPrime[0] + uHalf;\n distanceSquared += d * d;\n } else if (pPrime[0] > uHalf) {\n d = pPrime[0] - uHalf;\n distanceSquared += d * d;\n }\n\n if (pPrime[1] < -vHalf) {\n d = pPrime[1] + vHalf;\n distanceSquared += d * d;\n } else if (pPrime[1] > vHalf) {\n d = pPrime[1] - vHalf;\n distanceSquared += d * d;\n }\n\n if (pPrime[2] < -wHalf) {\n d = pPrime[2] + wHalf;\n distanceSquared += d * d;\n } else if (pPrime[2] > wHalf) {\n d = pPrime[2] - wHalf;\n distanceSquared += d * d;\n }\n\n return distanceSquared;\n}\n","import { equalsEpsilon } from '../../common/Math';\nconst EPSILON14 = 0.00000000000001;\nconst TWO_PI = 2.0 * Math.PI;\n\nexport default class Rectangle {\n constructor(west, south, east, north) {\n this.west = west;\n this.south = south;\n this.east = east;\n this.north = north;\n }\n\n static contains(rectangle, cartographic) {\n\n let longitude = cartographic[0];\n const latitude = cartographic[1];\n\n const west = rectangle.west;\n let east = rectangle.east;\n\n if (east < west) {\n east += TWO_PI;\n if (longitude < 0.0) {\n longitude += TWO_PI;\n }\n }\n return (\n (longitude > west ||\n equalsEpsilon(longitude, west, EPSILON14)) &&\n (longitude < east ||\n equalsEpsilon(longitude, east, EPSILON14)) &&\n latitude >= rectangle.south &&\n latitude <= rectangle.north\n );\n }\n\n\n static southwest(rectangle, result) {\n result[0] = rectangle.west;\n result[1] = rectangle.south;\n result[2] = 0;\n return result;\n }\n\n static northeast(rectangle, result) {\n result[0] = rectangle.east;\n result[1] = rectangle.north;\n result[2] = 0;\n return result;\n }\n\n static southeast(rectangle, result) {\n result[0] = rectangle.east;\n result[1] = rectangle.south;\n result[2] = 0;\n return result;\n }\n\n static northwest(rectangle, result) {\n result[0] = rectangle.west;\n result[1] = rectangle.north;\n result[2] = 0;\n return result;\n }\n}\n","import { vec3 } from '@maptalks/gl';\nimport { radianToCartesian3, geodeticSurfaceNormal, geodeticSurfaceNormalCartographic } from '../../common/Transform';\nimport { EPSILON15 } from '../../common/Math';\nimport Rectangle from './Rectangle';\n\n\nconst UNIT_X = [1, 0, 0];\nconst UNIT_Z = [0, 0, 1];\n\nfunction cartographicToCartesian(carto, out) {\n return radianToCartesian3(out, carto[0], carto[1], carto[2]);\n}\n\n\nclass Plane {\n constructor(normal, distance) {\n this.normal = vec3.copy([], normal);\n this.distance = distance;\n }\n\n static fromPointNormal(point, normal, result) {\n const distance = -vec3.dot(normal, point);\n\n vec3.copy(result.normal, normal);\n result.distance = distance;\n return result;\n }\n}\n\nconst cartographicScratch = [];\nconst cartographicScratch2 = [];\nconst westernMidpointScratch = [];\nconst eastWestNormalScratch = [];\nconst cartesian3Scratch = [];\nconst cartesian3Scratch2 = [];\nconst cartesian3Scratch3 = [];\nconst easternMidpointScratch = [];\n\nconst rayOrigin = [];\nconst rayDirection = [];\nconst planeScratch = new Plane(UNIT_X, 0.0);\n\nconst vectorScratch = [];\n\nexport default class TileBoundingRegion {\n\n constructor(region) {\n this.southwestCornerCartesian = [];\n this.northeastCornerCartesian = [];\n\n this.westNormal = [];\n this.eastNormal = [];\n this.southNormal = [];\n this.northNormal = [];\n\n //west, south, east, north\n this.rectangle = new Rectangle(...region);\n this.minimumHeight = region[4];\n this.maximumHeight = region[5];\n\n this.computeBox(this.rectangle);\n }\n\n distanceToCamera(cameraCartesianPosition, cameraCartographicPosition) {\n let result = 0.0;\n if (!Rectangle.contains(this.rectangle, cameraCartographicPosition)) {\n const southwestCornerCartesian = this.southwestCornerCartesian;\n const northeastCornerCartesian = this.northeastCornerCartesian;\n const westNormal = this.westNormal;\n const southNormal = this.southNormal;\n const eastNormal = this.eastNormal;\n const northNormal = this.northNormal;\n\n // if (frameState.mode !== SceneMode.SCENE3D) {\n // southwestCornerCartesian = frameState.mapProjection.project(\n // Rectangle.southwest(this.rectangle),\n // southwestCornerScratch\n // );\n // southwestCornerCartesian.z = southwestCornerCartesian.y;\n // southwestCornerCartesian.y = southwestCornerCartesian.x;\n // southwestCornerCartesian.x = 0.0;\n // northeastCornerCartesian = frameState.mapProjection.project(\n // Rectangle.northeast(this.rectangle),\n // northeastCornerScratch\n // );\n // northeastCornerCartesian.z = northeastCornerCartesian.y;\n // northeastCornerCartesian.y = northeastCornerCartesian.x;\n // northeastCornerCartesian.x = 0.0;\n // westNormal = negativeUnitY;\n // eastNormal = Cartesian3.UNIT_Y;\n // southNormal = negativeUnitZ;\n // northNormal = Cartesian3.UNIT_Z;\n // }\n\n const vectorFromSouthwestCorner = vec3.subtract(\n vectorScratch,\n cameraCartesianPosition,\n southwestCornerCartesian\n );\n const distanceToWestPlane = vec3.dot(\n vectorFromSouthwestCorner,\n westNormal\n );\n const distanceToSouthPlane = vec3.dot(\n vectorFromSouthwestCorner,\n southNormal\n );\n\n const vectorFromNortheastCorner = vec3.subtract(\n vectorScratch,\n cameraCartesianPosition,\n northeastCornerCartesian\n );\n const distanceToEastPlane = vec3.dot(\n vectorFromNortheastCorner,\n eastNormal\n );\n const distanceToNorthPlane = vec3.dot(\n vectorFromNortheastCorner,\n northNormal\n );\n\n if (distanceToWestPlane > 0.0) {\n result += distanceToWestPlane * distanceToWestPlane;\n } else if (distanceToEastPlane > 0.0) {\n result += distanceToEastPlane * distanceToEastPlane;\n }\n\n if (distanceToSouthPlane > 0.0) {\n result += distanceToSouthPlane * distanceToSouthPlane;\n } else if (distanceToNorthPlane > 0.0) {\n result += distanceToNorthPlane * distanceToNorthPlane;\n }\n }\n // if (frameState.mode === SceneMode.SCENE3D) {\n const cameraHeight = cameraCartographicPosition[2];\n const minimumHeight = this.minimumHeight;\n const maximumHeight = this.maximumHeight;\n // } else {\n // cameraHeight = cameraCartesianPosition.x;\n // minimumHeight = 0.0;\n // maximumHeight = 0.0;\n // }\n\n if (cameraHeight > maximumHeight) {\n const distanceAboveTop = cameraHeight - maximumHeight;\n result += distanceAboveTop * distanceAboveTop;\n } else if (cameraHeight < minimumHeight) {\n const distanceBelowBottom = minimumHeight - cameraHeight;\n result += distanceBelowBottom * distanceBelowBottom;\n }\n\n return Math.sqrt(result);\n }\n\n computeBox(rectangle) {\n const tileBB = this;\n cartographicToCartesian(\n Rectangle.southwest(rectangle, cartographicScratch2),\n tileBB.southwestCornerCartesian\n );\n cartographicToCartesian(\n Rectangle.northeast(rectangle, cartographicScratch2),\n tileBB.northeastCornerCartesian\n );\n\n // The middle latitude on the western edge.\n cartographicScratch[0] = rectangle.west;\n cartographicScratch[1] = (rectangle.south + rectangle.north) * 0.5;\n cartographicScratch[2] = 0.0;\n const westernMidpointCartesian = cartographicToCartesian(\n cartographicScratch,\n westernMidpointScratch\n );\n\n // Compute the normal of the plane on the western edge of the tile.\n const westNormal = vec3.cross(\n cartesian3Scratch,\n westernMidpointCartesian,\n UNIT_Z\n );\n vec3.normalize(tileBB.westNormal, westNormal);\n\n // The middle latitude on the eastern edge.\n cartographicScratch[0] = rectangle.east;\n const easternMidpointCartesian = cartographicToCartesian(\n cartographicScratch,\n easternMidpointScratch\n );\n\n // Compute the normal of the plane on the eastern edge of the tile.\n const eastNormal = vec3.cross(\n cartesian3Scratch,\n UNIT_Z,\n easternMidpointCartesian\n );\n vec3.normalize(tileBB.eastNormal, eastNormal);\n\n // Compute the normal of the plane bounding the southern edge of the tile.\n const westVector = vec3.subtract(\n cartesian3Scratch,\n westernMidpointCartesian,\n easternMidpointCartesian\n );\n const eastWestNormal = vec3.normalize(eastWestNormalScratch, westVector);\n\n const south = rectangle.south;\n let southSurfaceNormal;\n\n if (south > 0.0) {\n // Compute a plane that doesn't cut through the tile.\n cartographicScratch[0] = (rectangle.west + rectangle.east) * 0.5;\n cartographicScratch[1] = south;\n const southCenterCartesian = cartographicToCartesian(\n cartographicScratch,\n rayOrigin\n );\n vec3.copy(rayDirection, eastWestNormal);\n const westPlane = Plane.fromPointNormal(\n tileBB.southwestCornerCartesian,\n tileBB.westNormal,\n planeScratch\n );\n // Find a point that is on the west and the south planes\n rayPlane(\n rayOrigin,\n rayDirection,\n westPlane,\n tileBB.southwestCornerCartesian\n );\n southSurfaceNormal = geodeticSurfaceNormal(\n southCenterCartesian,\n cartesian3Scratch2\n );\n } else {\n southSurfaceNormal = geodeticSurfaceNormalCartographic(\n Rectangle.southeast(rectangle, cartographicScratch2),\n cartesian3Scratch2\n );\n }\n const southNormal = vec3.cross(\n cartesian3Scratch3,\n southSurfaceNormal,\n westVector\n );\n vec3.normalize(tileBB.southNormal, southNormal);\n\n // Compute the normal of the plane bounding the northern edge of the tile.\n const north = rectangle.north;\n let northSurfaceNormal;\n if (north < 0.0) {\n // Compute a plane that doesn't cut through the tile.\n cartographicScratch[0] = (rectangle.west + rectangle.east) * 0.5;\n cartographicScratch[1] = north;\n const northCenterCartesian = cartographicToCartesian(\n cartographicScratch,\n rayOrigin\n );\n // Cartesian3.negate(eastWestNormal, rayDirection);\n vec3.scale(rayDirection, eastWestNormal, -1);\n const eastPlane = Plane.fromPointNormal(\n tileBB.northeastCornerCartesian,\n tileBB.eastNormal,\n planeScratch\n );\n // Find a point that is on the east and the north planes\n rayPlane(\n rayOrigin,\n rayDirection,\n eastPlane,\n tileBB.northeastCornerCartesian\n );\n northSurfaceNormal = geodeticSurfaceNormal(\n northCenterCartesian,\n cartesian3Scratch2\n );\n } else {\n northSurfaceNormal = geodeticSurfaceNormalCartographic(\n Rectangle.northwest(rectangle, cartographicScratch2),\n cartesian3Scratch2\n );\n }\n const northNormal = vec3.cross(\n cartesian3Scratch3,\n westVector,\n northSurfaceNormal\n );\n vec3.normalize(tileBB.northNormal, northNormal);\n }\n}\n\nfunction rayPlane(rayOrigin, rayDirection, plane, result) {\n const origin = rayOrigin;\n const direction = rayDirection;\n const normal = plane.normal;\n const denominator = vec3.dot(normal, direction);\n\n if (Math.abs(denominator) < EPSILON15) {\n // Ray is parallel to plane. The ray may be in the polygon's plane.\n return undefined;\n }\n\n const t = (-plane.distance - vec3.dot(normal, origin)) / denominator;\n\n if (t < 0) {\n return undefined;\n }\n\n result = vec3.scale(result, direction, t);\n return vec3.add(result, origin, result);\n}\n",null,"import transcoders from '@maptalks/gl/dist/transcoders.js';\nlet currentTranscoders = null\nexport default function () {\n if (!currentTranscoders) {\n currentTranscoders = {\n 'image/crn': transcoders.crn && transcoders.crn(),\n 'image/ktx2': transcoders.ktx2 && transcoders.ktx2(),\n 'image/cttf': transcoders.ktx2 && transcoders.ktx2(),\n 'draco': transcoders.draco && transcoders.draco()\n };\n }\n return currentTranscoders;\n}\n","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\nimport { readFeatureTableJSON, readBatchTableJSON, readBatchTableBin, readBatchId } from '../common/TileHelper.js';\n// 不能这样引用: import { transcoders } from '@maptalks/gl',因为会把gl及相关依赖库(如maptalks)都引用进来\nimport getTranscoders from './transcoders.js';\n\nconst { Ajax, GLTFLoader } = getGLTFLoaderBundle();\n\n// s3m : https://github.com/SuperMap/s3m-spec\n// b3dm: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/Batched3DModel/README.md\n// b3dm legacy 24: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/a45866de985f5b37aa98fc75340878d7a78e4056/TileFormats/Batched3DModel/README.md\n// b3dm legacy 20: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/3c70a9c3d58f612218f1f51b12d2a0d92b3c9e32/TileFormats/Batched3DModel/README.md\n\nexport default class B3DMLoader {\n constructor(requestImage, loaderCtor, supportedFormats) {\n this._requestImage = requestImage;\n this._loaderCtor = loaderCtor || GLTFLoader;\n this._supportedFormats = supportedFormats;\n this._decoders = getTranscoders();\n }\n\n static createEmptyB3DM() {\n return {\n featureTable : null,\n batchTable : null,\n gltf : {}\n };\n }\n\n /**\n * 载入b3dm模型,返回一个promise,promise中的参数是 gltf 模型对象\n * @param {String} url - url of b3dm\n * @param {ArrayBuffer} [arraybuffer=null] - optional b3dm arraybuffer content\n * @returns {Promise}\n */\n load(url, arraybuffer, offset = 0, byteLength = 0, options) {\n if (arraybuffer) {\n if (!byteLength) {\n byteLength = arraybuffer.byteLength;\n }\n return this._parse(url, arraybuffer, offset, byteLength, options);\n }\n return Ajax.getArrayBuffer(url, {}).then(response => {\n const b3dm = response.data;\n if (!byteLength) {\n byteLength = b3dm.byteLength;\n }\n return this._parse(url, b3dm, offset, byteLength);\n });\n }\n\n _parse(url, b3dm, offset, b3dmByteLength, options) {\n const maxTextureSize = options && options.maxTextureSize;\n const components = this._readB3DM(b3dm, offset, b3dmByteLength, url);\n if (components.error) {\n return Promise.resolve(components);\n }\n const rootPath = url.substring(0, url.lastIndexOf('/'));\n let loader;\n try {\n loader = new this._loaderCtor(rootPath, components.glb, {\n transferable: true,\n requestImage: this._requestImage,\n decoders: this._decoders,\n supportedFormats: this._supportedFormats,\n maxTextureSize\n });\n } catch (e) {\n return Promise.resolve({ error: e });\n }\n\n return loader.load({ skipAttributeTransform: false }).then(gltf => {\n // 相同url的geometry会缓存在MeshPainter中,不会重复创建\n // url里必须加上offset和b3dmByteLength,是因为一个url中可能包含多个不同的gltf模型\n gltf.url = `${url}-${offset}-${b3dmByteLength}`;\n const transferables = loader.transferables;\n for (let i = 0; i < components.transferables.length; i++) {\n if (transferables.indexOf(components.transferables[i]) < 0) {\n transferables.push(components.transferables[i]);\n }\n }\n return {\n magic: 'b3dm',\n count: components.count,\n transferables, //for worker\n featureTable: components.featureTable,\n batchTable: components.batchTable,\n batchTableBin: components.batchTableBin,\n gltf\n };\n });\n }\n\n /**\n * 解析b3dm数据,返回数据块:\n * 1. feature table\n * 2. batch table\n * 3. gltf\n * @param {ArrayBuffer} b3dm\n */\n _readB3DM(b3dm, offset, byteLength, url) {\n const view = new DataView(b3dm, offset, byteLength);\n const version = view.getUint32(4, true);\n if (version !== 1) {\n const info = 'Unsupported b3dm version: ' + version + ', url:' + url;\n console.warn(info);\n return { error: info };\n }\n const length = view.getUint32(8, true);\n if (length !== view.byteLength) {\n const info = 'Length in b3dm header is inconsistent with b3dm\\'s byte length, url: ' + url;\n console.warn(info);\n return { error: info };\n }\n // let headerLength = 28;\n // const versions = [20, 24, 28];\n\n // for (let i = 0; i < versions.length; i++) {\n // const magic = view.getUint32(versions[i], true);\n // // 1179937895 is uint32 version of 'gltf'\n // if (magic === 1179937895) {\n // headerLength = versions[i];\n // break;\n // }\n // }\n\n let featureTableJsonByteLength = view.getUint32(12, true);\n let featureTableBinaryByteLength = view.getUint32(16, true);\n let batchTableJsonByteLength = view.getUint32(20, true);\n let batchTableBinaryByteLength = view.getUint32(24, true);\n\n let byteOffset = 28 + offset;\n let batchLength;\n // from Cesium.js, Batched3DModel3DTileContent.js\n if (batchTableJsonByteLength >= 570425344) {\n // 'This b3dm header is using the legacy format [batchLength] [batchTableByteLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/master/specification/TileFormats/Batched3DModel.'\n byteOffset -= 4 * 2;\n batchLength = featureTableJsonByteLength;\n batchTableJsonByteLength = featureTableBinaryByteLength;\n batchTableBinaryByteLength = 0;\n featureTableJsonByteLength = 0;\n featureTableBinaryByteLength = 0;\n } else if (batchTableBinaryByteLength >= 570425344) {\n // This b3dm header is using the legacy format [batchTableJsonByteLength] [batchTableBinaryByteLength] [batchLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/master/specification/TileFormats/Batched3DModel.\n byteOffset -= 4;\n batchLength = batchTableJsonByteLength;\n batchTableJsonByteLength = featureTableJsonByteLength;\n batchTableBinaryByteLength = featureTableBinaryByteLength;\n featureTableJsonByteLength = 0;\n featureTableBinaryByteLength = 0;\n }\n\n const transferables = [b3dm];\n let featureTable;\n let featureTableBin;\n\n if (featureTableJsonByteLength > 0) {\n featureTable = readFeatureTableJSON(b3dm, byteOffset, featureTableJsonByteLength);\n byteOffset += featureTableJsonByteLength;\n batchLength = featureTable['BATCH_LENGTH'];\n } else {\n featureTable = {\n 'BATCH_LENGTH': batchLength\n };\n }\n\n if (featureTableBinaryByteLength > 0) {\n // featureTableBin = readFeatureTableBin(b3dm, byteOffset, featureTableBinaryByteLength);\n byteOffset += featureTableBinaryByteLength;\n }\n\n let batchTable, batchTableBin;\n if (batchTableJsonByteLength > 0) {\n batchTable = readBatchTableJSON(b3dm, byteOffset, batchTableJsonByteLength);\n byteOffset += batchTableJsonByteLength;\n if (batchTableBinaryByteLength > 0) {\n const batchTableBinInfo = readBatchTableBin(b3dm, byteOffset, batchTableBinaryByteLength);\n batchTableBin = b3dm.slice(batchTableBinInfo.offset, batchTableBinInfo.offset + batchTableBinInfo.byteLength);\n byteOffset += batchTableBinaryByteLength;\n transferables.push(batchTableBin);\n }\n }\n\n\n\n const count = featureTable['BATCH_LENGTH'];\n const b3dmData = {};\n if (featureTable && featureTable['BATCH_ID']) {\n b3dmData['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], b3dm, featureTableBin.offset, count);\n const buffer = b3dmData['BATCH_ID'].array && b3dmData['BATCH_ID'].array.buffer;\n if (buffer && transferables.indexOf(buffer) < 0) {\n transferables.push(buffer);\n }\n }\n\n const glb = {\n buffer: b3dm,\n byteOffset: byteOffset,\n byteLength: view.byteLength + view.byteOffset - byteOffset\n };\n return {\n count: batchLength,\n transferables,\n featureTable,\n batchTable,\n batchTableBin,\n b3dm: b3dmData,\n glb\n };\n }\n\n //TODO\n _readBatchTable() {\n return null;\n }\n}\n\n","import { vec3 } from 'gl-matrix';\nimport { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\nimport { readFeatureTableBatchTable, readBatchId, convertQuantizedPosition } from '../common/TileHelper.js';\nimport { stringFromUTF8Array } from '../common/Util.js';\nimport getTranscoders from './transcoders.js';\n\nconst { Ajax, GLTFLoader } = getGLTFLoaderBundle();\n\n// https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Instanced3DModel\nexport default class I3DMLoader {\n constructor(requestImage, loaderCtor, supportedFormats, maxTextureSize) {\n this._requestImage = requestImage;\n this._loaderCtor = loaderCtor || GLTFLoader;\n this._supportedFormats = supportedFormats;\n this._decoders = getTranscoders();\n this._maxTextureSize = maxTextureSize;\n }\n\n /**\n * 载入pnts模型,返回一个promise,promise中的参数是数据\n * @param {String} url - url of i3dm\n * @param {ArrayBuffer} [arraybuffer=null] - optional i3dm arraybuffer content\n * @returns {Promise}\n */\n load(url, arraybuffer, offset = 0, byteLength = 0, options) {\n if (arraybuffer) {\n if (!byteLength) {\n byteLength = arraybuffer.byteLength;\n }\n return this._parse(url, arraybuffer, offset, byteLength, options);\n }\n return Ajax.getArrayBuffer(url, {}).then(response => {\n const i3dm = response.data;\n if (!byteLength) {\n byteLength = i3dm.byteLength;\n }\n return this._parse(url, i3dm, offset, byteLength);\n });\n }\n\n _parse(url, buf, offset, byteLength, options) {\n return this._parseGLTF(url, buf, offset, byteLength, options).then(({ gltf, transferables }) => {\n const components = this._readI3DM(buf, offset, byteLength, url);\n if (components.error) {\n return Promise.resolve(components);\n }\n for (let i = 0; i < transferables.length; i++) {\n if (components.transferables.indexOf(transferables[i]) === -1) {\n components.transferables.push(transferables[i]);\n }\n }\n delete gltf.transferables;\n return Promise.resolve({\n magic: 'i3dm',\n count: components.count,\n transferables: components.transferables, //for worker\n featureTable: components.featureTable,\n batchTable: components.batchTable,\n batchTableBin: components.batchTableBin,\n i3dm: components.i3dm,\n gltf\n });\n });\n\n }\n\n _parseGLTF(i3dmURL, buf, offset, byteLength, opts) {\n const maxTextureSize = opts && opts.maxTextureSize;\n const options = {\n transferable: true,\n requestImage: this._requestImage,\n decoders: this._decoders,\n supportedFormats: this._supportedFormats,\n maxTextureSize\n };\n const view = new DataView(buf, offset, byteLength);\n const featureTableJSONLength = view.getUint32(12, true);\n const featureTableBinLength = view.getUint32(16, true);\n const batchTableJSONLength = view.getUint32(20, true);\n const batchTableBinLength = view.getUint32(24, true);\n const gltfFormat = view.getUint32(28, true);\n\n // i3dm header length\n const headerLength = 32;\n const gltfBinStart = headerLength + featureTableJSONLength + featureTableBinLength + batchTableJSONLength + batchTableBinLength;\n if (gltfFormat === 0) {\n //url\n const urlBuf = new Uint8Array(buf, gltfBinStart + offset, view.byteLength - gltfBinStart);\n let url = stringFromUTF8Array(urlBuf);\n if (url.indexOf('://') == -1) {\n // relative path\n url = i3dmURL.substring(0, i3dmURL.lastIndexOf('/')) + '/' + url;\n }\n const isGLB = url.indexOf('.glb') > 0;\n if (isGLB) {\n return Ajax.getArrayBuffer(url, {}).then(bin => {\n return this._createGLTFLoader(url, { buffer: bin.data, byteOffset: 0 }, options);\n });\n } else {\n return Ajax.getJSON(url, {}).then(json => {\n return this._createGLTFLoader(url, json, options);\n });\n }\n } else {\n const glb = {\n buffer: buf,\n byteOffset: gltfBinStart + offset,\n byteLength: view.byteLength - gltfBinStart\n };\n return this._createGLTFLoader(i3dmURL, glb, options);\n }\n }\n\n _createGLTFLoader(url, data, options) {\n const rootPath = url.substring(0, url.lastIndexOf('/'));\n const loader = new this._loaderCtor(rootPath, data, options);\n // turn on skipAttributeTransform in default\n return loader.load({ skipAttributeTransform: true }).then(gltf => {\n let offset = 0, byteLength = 0;\n if (data.buffer) {\n offset = data.byteOffset || 0;\n byteLength = data.byteLength || 0;\n }\n gltf.url = `${url}-${offset}-${byteLength}`;\n return {\n transferables : loader.transferables, //for worker\n gltf\n };\n });\n }\n\n /**\n * 解析i3dm数据,返回数据块:\n * 1. feature table\n * 2. batch table\n * 3. gltf\n * @param {ArrayBuffer} pnts\n */\n _readI3DM(i3dmBuf, offset, byteLength, url) {\n const view = new DataView(i3dmBuf, offset, byteLength);\n const version = view.getUint32(4, true);\n if (version !== 1) {\n const info = 'Unsupported pnts version: ' + version + ', url:' + url;\n console.warn(info);\n return { error: info };\n }\n const length = view.getUint32(8, true);\n if (length !== view.byteLength) {\n const info = 'Length in pnts header is inconsistent with pnts\\'s byte length, url: ' + url;\n console.warn(info);\n return { error: info };\n }\n const transferables = [i3dmBuf];\n\n const { featureTable, featureTableBin, batchTable, batchTableBin } = readFeatureTableBatchTable(view, 32 + offset, transferables);\n\n const i3dm = {};\n\n const instanceLength = featureTable['INSTANCES_LENGTH'];\n // position\n if (featureTable['POSITION']) {\n const { byteOffset } = featureTable['POSITION'];\n i3dm['POSITION'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: instanceLength,\n componentType: 5126,\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\n };\n transferables.push(i3dm['POSITION'].array.buffer);\n } else if (featureTable['POSITION_QUANTIZED']) {\n const quanVolOffset = featureTable['QUANTIZED_VOLUME_OFFSET'];\n const quanVolScale = featureTable['QUANTIZED_VOLUME_SCALE'];\n\n const { byteOffset } = featureTable['POSITION_QUANTIZED'];\n i3dm['POSITION'] = {\n byteStride: 3 * 4,\n byteOffset: 0,\n itemSize: 3,\n count: instanceLength,\n componentType: 5126,\n array: this._convertQuantizedPosition(new Uint16Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3), quanVolOffset, quanVolScale)\n };\n transferables.push(i3dm['POSITION'].array.buffer);\n }\n\n if (featureTable['BATCH_ID']) {\n i3dm['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], i3dmBuf, featureTableBin.offset, instanceLength);\n const buffer = i3dm['BATCH_ID'].array && i3dm['BATCH_ID'].array.buffer;\n if (buffer && transferables.indexOf(buffer) < 0) {\n transferables.push(buffer);\n }\n }\n\n // normal\n if (featureTable['NORMAL_UP']) {\n let { byteOffset } = featureTable['NORMAL_UP'];\n i3dm['NORMAL_UP'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: instanceLength,\n componentType: 5126,\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\n };\n transferables.push(i3dm['NORMAL_UP'].array.buffer);\n\n byteOffset = featureTable['NORMAL_RIGHT'].byteOffset;\n i3dm['NORMAL_RIGHT'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: instanceLength,\n componentType: 5126,\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\n };\n transferables.push(i3dm['NORMAL_RIGHT'].array.buffer);\n } else if (featureTable['NORMAL_UP_OCT32P']) {\n let { byteOffset } = featureTable['NORMAL_UP_OCT32P'];\n i3dm['NORMAL_UP'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: instanceLength,\n componentType: 5126,\n array: this._decodeOCT32p(new Uint16Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 2))\n };\n transferables.push(i3dm['NORMAL_UP'].array.buffer);\n\n byteOffset = featureTable['NORMAL_RIGHT_OCT32P'].byteOffset;\n i3dm['NORMAL_RIGHT'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: instanceLength,\n componentType: 5126,\n array: this._decodeOCT32p(new Uint16Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 2))\n };\n transferables.push(i3dm['NORMAL_RIGHT'].array.buffer);\n }\n\n if (featureTable['SCALE']) {\n const { byteOffset } = featureTable['SCALE'];\n i3dm['SCALE'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 1,\n count: instanceLength,\n componentType: 5126,\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength).slice()\n };\n transferables.push(i3dm['SCALE'].array.buffer);\n } else if (featureTable['SCALE_NON_UNIFORM']) {\n const { byteOffset } = featureTable['SCALE_NON_UNIFORM'];\n i3dm['SCALE_NON_UNIFORM'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: instanceLength,\n componentType: 5126,\n array: new Float32Array(i3dmBuf, byteOffset + featureTableBin.offset, instanceLength * 3).slice()\n };\n transferables.push(i3dm['SCALE_NON_UNIFORM'].array.buffer);\n }\n return {\n count: instanceLength,\n batchTable,\n batchTableBin,\n featureTable,\n i3dm,\n transferables: transferables\n };\n }\n\n _decodeOCT32p(arr) {\n const count = arr.length / 2;\n const result = new Float32Array(count * 3);\n const v = [];\n for (let i = 0; i < count; i++) {\n octDecodeInRange(v, arr[i * 2], arr[i * 2 + 1], 65535);\n result[i * 3] = v[0];\n result[i * 3 + 1] = v[1];\n result[i * 3 + 2] = v[2];\n }\n return result;\n }\n\n _convertQuantizedPosition(arr, offset, scale) {\n const position = new Float32Array(arr.length);\n return convertQuantizedPosition(position, arr, offset, scale);\n }\n\n //TODO\n _readBatchTable() {\n return null;\n }\n}\n\nfunction octDecodeInRange(out, x, y, rangeMax) {\n out[0] = fromSNorm(x, rangeMax);\n out[1] = fromSNorm(y, rangeMax);\n out[2] = 1.0 - (Math.abs(out[0]) + Math.abs(out[1]));\n\n if (out[2] < 0.0) {\n const oldVX = out[0];\n out[0] = (1.0 - Math.abs(out[1])) * signNotZero(oldVX);\n out[1] = (1.0 - Math.abs(oldVX)) * signNotZero(out[1]);\n }\n\n return vec3.normalize(out, out);\n}\n\nfunction fromSNorm(value, rangeMaximum) {\n rangeMaximum = defaultValue(rangeMaximum, 255);\n return (\n (clamp(value, 0.0, rangeMaximum) / rangeMaximum) * 2.0 - 1.0\n );\n}\n\nfunction signNotZero(value) {\n return value < 0.0 ? -1.0 : 1.0;\n}\n\nfunction defaultValue(a, b) {\n if (a !== undefined && a !== null) {\n return a;\n }\n return b;\n}\n\nfunction clamp(value, min, max) {\n return value < min ? min : value > max ? max : value;\n}\n","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\nimport { readFeatureTableBatchTable, readBatchId, convertQuantizedPosition, getComponentFromCtor } from '../common/TileHelper.js';\nimport getTranscoders from './transcoders.js';\nimport { getBatchIdArrayType } from '../common/Util.js';\n\nconst { Ajax } = getGLTFLoaderBundle();\n\n// s3m : https://github.com/SuperMap/s3m-spec\n// b3dm: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/Batched3DModel/README.md\n// b3dm legacy 24: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/a45866de985f5b37aa98fc75340878d7a78e4056/TileFormats/Batched3DModel/README.md\n// b3dm legacy 20: https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/3c70a9c3d58f612218f1f51b12d2a0d92b3c9e32/TileFormats/Batched3DModel/README.md\n\nexport default class PNTSLoader {\n constructor() {\n }\n\n\n /**\n * 载入pnts模型,返回一个promise,promise中的参数是数据\n * @param {String} url - url of b3dm\n * @param {ArrayBuffer} [arraybuffer=null] - optional b3dm arraybuffer content\n * @returns {Promise}\n */\n load(url, arraybuffer, offset = 0, byteLength = 0) {\n if (arraybuffer) {\n if (!byteLength) {\n byteLength = arraybuffer.byteLength;\n }\n return this._parse(url, arraybuffer, offset, byteLength);\n }\n return Ajax.getArrayBuffer(url, {}).then(response => {\n const b3dm = response.data;\n if (!byteLength) {\n byteLength = b3dm.byteLength;\n }\n return this._parse(url, b3dm, offset, byteLength);\n });\n }\n\n _parse(url, pntsBuf, offset, byteLength) {\n return this._readPNTS(pntsBuf, offset, byteLength, url).then(components => {\n if (components.error) {\n return components;\n }\n return {\n magic: 'pnts',\n count: components.count,\n transferables: components.transferables, //for worker\n featureTable: components.featureTable,\n batchTable: components.batchTable,\n batchTableBin: components.batchTableBin,\n pnts: components.pnts\n };\n });\n }\n\n /**\n * 解析b3dm数据,返回数据块:\n * 1. feature table\n * 2. batch table\n * 3. gltf\n * @param {ArrayBuffer} pnts\n */\n _readPNTS(pntsBuf, offset, byteLength, url) {\n const view = new DataView(pntsBuf, offset, byteLength);\n const version = view.getUint32(4, true);\n if (version !== 1) {\n const info = 'Unsupported pnts version: ' + version + ', url:' + url;\n console.warn(info);\n return { error: info };\n }\n const length = view.getUint32(8, true);\n if (length !== view.byteLength) {\n const info = 'Length in pnts header is inconsistent with pnts\\'s byte length, url: ' + url;\n console.warn(info);\n return { error: info };\n }\n\n const transferables = [pntsBuf];\n const { featureTable, featureTableBin, batchTable, batchTableBin } = readFeatureTableBatchTable(view, offset + 28, transferables);\n const quanVolOffset = featureTable['QUANTIZED_VOLUME_OFFSET'];\n const quanVolScale = featureTable['QUANTIZED_VOLUME_SCALE']\n\n const pointsLength = featureTable['POINTS_LENGTH'];\n\n let compression = {};\n let dracoBuf;\n if (featureTable['extensions'] && featureTable['extensions']['3DTILES_draco_point_compression']) {\n compression = featureTable['extensions']['3DTILES_draco_point_compression'];\n // dracoBuf = pntsBuf.slice(compression.byteOffset + featureTableBin.offset, compression.byteOffset + featureTableBin.offset + compression.byteLength);\n dracoBuf = new DataView(pntsBuf, compression.byteOffset + featureTableBin.offset, compression.byteLength);\n const dracoOptions = {\n attributes: compression.properties,\n useUniqueIDs: false\n };\n if (!this._draco) {\n this._draco = getTranscoders().draco;\n }\n return this._draco(dracoBuf, dracoOptions).then(data => {\n const attribData = data.attributes;\n if ((featureTable['POSITION'] || featureTable['POSITION_QUANTIZED']) && (!attribData['POSITION'] && !attribData['POSITION_QUANTIZED'])) {\n attribData['POSITION'] = featureTable['POSITION'];\n attribData['POSITION_QUANTIZED'] = featureTable['POSITION_QUANTIZED'];\n }\n if ((featureTable['RGB'] || featureTable['RGBA'] || featureTable['RGB565']) && (!attribData['RGB'] && !attribData['RGBA'] && !attribData['RGB565'])) {\n attribData['RGB'] = featureTable['RGB'];\n attribData['RGBA'] = featureTable['RGBA'];\n attribData['RGB565'] = featureTable['RGB565'];\n }\n if ((featureTable['NORMAL'] || featureTable['NORMAL_OCT16P']) && (!attribData['NORMAL'] && !attribData['NORMAL_OCT16P'])) {\n attribData['NORMAL'] = featureTable['NORMAL'];\n attribData['NORMAL_OCT16P'] = featureTable['NORMAL_OCT16P'];\n }\n\n const pnts = this._readAttributes(pntsBuf, data.attributes, featureTableBin.offset, pointsLength, transferables, quanVolOffset, quanVolScale);\n if (data.attributes['BATCH_ID']) {\n const array = data.attributes['BATCH_ID'].array;\n pnts['BATCH_ID'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 1,\n count: array.length,\n componentType: getComponentFromCtor(array.constructor),\n array: array\n }\n transferables.push(array.buffer);\n } else if (featureTable['BATCH_ID'] || Object.keys(batchTable).length) {\n if (featureTable['BATCH_ID']) {\n pnts['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], pntsBuf, featureTableBin.offset, pointsLength);\n } else {\n pnts['BATCH_ID'] = createPerPointBatchId(pointsLength);\n }\n const buffer = pnts['BATCH_ID'].array && pnts['BATCH_ID'].array.buffer;\n if (buffer && transferables.indexOf(buffer) < 0) {\n transferables.push(buffer);\n }\n }\n return {\n count: pointsLength,\n batchTable,\n batchTableBin,\n featureTable,\n pnts,\n transferables\n }\n });\n }\n const pnts = this._readAttributes(pntsBuf, featureTable, featureTableBin.offset, pointsLength, transferables, quanVolOffset, quanVolScale);\n if (featureTable['BATCH_ID'] || Object.keys(batchTable).length) {\n if (featureTable['BATCH_ID']) {\n pnts['BATCH_ID'] = readBatchId(featureTable['BATCH_ID'], pntsBuf, featureTableBin.offset, pointsLength);\n } else {\n pnts['BATCH_ID'] = createPerPointBatchId(pointsLength);\n }\n const buffer = pnts['BATCH_ID'].array && pnts['BATCH_ID'].array.buffer;\n if (buffer && transferables.indexOf(buffer) < 0) {\n transferables.push(buffer);\n }\n }\n\n // position\n\n return Promise.resolve({\n count: pointsLength,\n batchTable,\n batchTableBin,\n featureTable,\n pnts,\n transferables\n });\n }\n\n _readAttributes(pntsBuf, attribData, attrByteOffset, pointsLength, transferables, quanVolOffset, quanVolScale) {\n const pnts = {};\n if (attribData['POSITION']) {\n let { byteOffset, array } = attribData['POSITION'];\n byteOffset = byteOffset || 0;\n const offset = (array ? 0 : attrByteOffset);\n if (!array) {\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 3 * 4);\n array = new Float32Array(buf);\n }\n pnts['POSITION'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: pointsLength,\n componentType: 5126,\n array: array\n };\n transferables.push(array.buffer);\n } else if (attribData['POSITION_QUANTIZED']) {\n let { byteOffset } = attribData['POSITION_QUANTIZED'];\n const { array } = attribData['POSITION_QUANTIZED'];\n byteOffset = byteOffset || 0;\n const offset = (array ? 0 : attrByteOffset);\n pnts['POSITION'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: pointsLength,\n componentType: 5126,\n array: this._convertQuantizedPosition(array || new Uint16Array(pntsBuf, byteOffset + offset, pointsLength * 3), quanVolOffset, quanVolScale)\n };\n transferables.push(pnts['POSITION'].array.buffer);\n }\n // color\n if (attribData['RGBA']) {\n let { byteOffset, array } = attribData['RGBA'];\n byteOffset = byteOffset || 0;\n const offset = (array ? 0 : attrByteOffset);\n if (!array) {\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 4);\n array = new Uint8Array(buf);\n }\n pnts['RGBA'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 4,\n count: pointsLength,\n componentType: 0x1401,\n array: array\n };\n transferables.push(array.buffer);\n } else if (attribData['RGB']) {\n let { byteOffset, array } = attribData['RGB'];\n byteOffset = byteOffset || 0;\n const offset = (array ? 0 : attrByteOffset);\n if (!array) {\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 3);\n array = new Uint8Array(buf);\n }\n pnts['RGB'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: pointsLength,\n componentType: 0x1401,\n array: array\n };\n transferables.push(array.buffer);\n } else if (attribData['RGB565']) {\n let { byteOffset, array } = attribData['RGB565'];\n byteOffset = byteOffset || 0;\n const offset = (array ? 0 : attrByteOffset);\n if (!array) {\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 2);\n array = new Uint16Array(buf);\n }\n pnts['RGB565'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 1,\n count: pointsLength,\n componentType: 0x1403,\n array: array\n };\n transferables.push(array.buffer);\n }\n // normal\n if (attribData['NORMAL']) {\n let { byteOffset, array } = attribData['NORMAL'];\n byteOffset = byteOffset || 0;\n const offset = (array ? 0 : attrByteOffset);\n if (!array) {\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 3 * 4);\n array = new Float32Array(buf);\n }\n pnts['NORMAL'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 3,\n count: pointsLength,\n componentType: 5126,\n array: array\n };\n transferables.push(array.buffer);\n } else if (attribData['NORMAL_OCT16P']) {\n let { byteOffset, array } = attribData['NORMAL_OCT16P'];\n byteOffset = byteOffset || 0;\n const offset = (array ? 0 : attrByteOffset);\n if (!array) {\n const buf = pntsBuf.slice(byteOffset + offset, byteOffset + offset + pointsLength * 2);\n array = new Uint8Array(buf);\n }\n pnts['NORMAL_OCT16P'] = {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 2,\n count: pointsLength,\n componentType: 0x1401,\n array: array\n };\n transferables.push(array.buffer);\n }\n return pnts;\n }\n\n _convertQuantizedPosition(arr, offset, scale) {\n const position = new Float32Array(arr.length);\n return convertQuantizedPosition(position, arr, offset, scale);\n }\n\n //TODO\n _readBatchTable() {\n return null;\n }\n}\n\n// const DEFAULT_TYPES = {\n// 'POSITION': 'Float32Array',\n// 'POSITION_QUANTIZED': 'Uint16Array',\n// 'RGBA': 'Uint8Array',\n// 'RGB': 'Uint8Array',\n// 'RGB565': 'Uint16Array',\n// 'NORMAL': 'Float32Array',\n// 'NORMAL_OCT16P': 'Uint8Array'\n// };\n\n// function getAttributeTypes(compressedProperties, featureTable) {\n// const types = {};\n// for (const p in compressedProperties) {\n// const prop = featureTable[p];\n// let typeName;\n// if (prop.componentType) {\n// typeName = getComponentCtor(prop.componentType).name\n// } else {\n// typeName = DEFAULT_TYPES[p];\n// }\n// if (typeName) {\n// types[compressedProperties[p]] = typeName\n// } else {\n// console.warn('undefined type of attribute:' + p);\n// }\n// }\n// return types;\n// }\n\nfunction createPerPointBatchId(pointsLength) {\n const ctor = getBatchIdArrayType(pointsLength);\n const array = new ctor(pointsLength);\n for (let i = 0; i < pointsLength; i++) {\n array[i] = i;\n }\n return {\n byteStride: 0,\n byteOffset: 0,\n itemSize: 1,\n count: pointsLength,\n componentType: getComponentFromCtor(ctor),\n array\n };\n}\n","import { getGLTFLoaderBundle } from '@maptalks/gl/dist/transcoders.js';\nimport { readMagic } from '../common/TileHelper';\nimport B3DMLoader from '../loaders/B3DMLoader';\nimport I3DMLoader from '../loaders/I3DMLoader';\nimport PNTSLoader from '../loaders/PNTSLoader';\n\nconst { Ajax, GLTFLoader } = getGLTFLoaderBundle();\n\n// https://github.com/CesiumGS/3d-tiles/blob/main/specification/TileFormats/Composite/README.md\n\nexport default class CMPTLoader {\n constructor(requestImage, GLTFloaderCtor, supportedFormats, maxTextureSize) {\n this._supportedFormats = supportedFormats;\n this._requestImage = requestImage;\n this._loaderCtor = GLTFloaderCtor || GLTFLoader;\n this._maxTextureSize = maxTextureSize;\n }\n\n\n /**\n * 载入b3dm模型,返回一个promise,promise中的参数是 gltf 模型对象\n * @param {String} url - url of b3dm\n * @param {ArrayBuffer} [arraybuffer=null] - optional b3dm arraybuffer content\n * @returns {Promise}\n */\n load(url, arraybuffer, offset = 0, byteLength = 0, options) {\n if (arraybuffer) {\n return this._parse(url, arraybuffer, offset, byteLength, options);\n }\n return Ajax.getArrayBuffer(url, {}).then(response => {\n const cmpt = response.data;\n return this._parse(url, cmpt, offset, byteLength);\n });\n }\n\n _parse(url, cmpt, offset, byteLength, options) {\n if (!byteLength) {\n byteLength = cmpt.byteLength;\n }\n const tiles = this._readCMPT(cmpt, url, offset, byteLength);\n const promises = [];\n for (let i = 0; i < tiles.length; i++) {\n let loader;\n if (tiles[i].magic === 'b3dm') {\n loader = new B3DMLoader(this._requestImage, this._loaderCtor, this._supportedFormats);\n } else if (tiles[i].magic === 'i3dm') {\n loader = new I3DMLoader(this._requestImage, this._loaderCtor, this._supportedFormats, this._maxTextureSize);\n } else if (tiles[i].magic === 'pnts') {\n loader = new PNTSLoader();\n } else if (tiles[i].magic === 'cmpt') {\n loader = new CMPTLoader(this._requestImage, this._loaderCtor, this._supportedFormats, this._maxTextureSize);\n } else {\n // unsupported magic\n console.warn('Unsupported magic in CMPT tile:', tiles[i].magic);\n continue;\n }\n promises.push(loader.load(url, cmpt, tiles[i].offset, tiles[i].byteLength, options).then(data => {\n return data;\n }));\n }\n return Promise.all(promises).then(tiles => {\n return {\n magic: 'cmpt',\n tiles\n };\n });\n }\n\n /**\n * 解析b3dm数据,返回数据块:\n * 1. feature table\n * 2. batch table\n * 3. gltf\n * @param {ArrayBuffer} b3dm\n */\n _readCMPT(cmpt, url, byteOffset, byteLength) {\n const view = new DataView(cmpt, byteOffset, byteLength);\n const version = view.getUint32(4, true);\n if (version !== 1) {\n const info = 'Unsupported cmpt version: ' + version + ', url:' + url;\n console.warn(info);\n return { error: info };\n }\n // const length = view.getUint32(8, true);\n // if (length !== view.byteLength) {\n // const info = 'Length in cmpt header is inconsistent with cmpt\\'s byte length, url: ' + url;\n // console.warn(info);\n // return { error: info };\n // }\n if (view.byteLength === 16) {\n // an empty cmpt tile\n return [];\n }\n const tiles = [];\n const tilesLength = view.getUint32(12, true);\n // 16是CMPT的header长度\n const headerLength = 16;\n let offset = headerLength;\n for (let i = 0; i < tilesLength; i++) {\n const magic = readMagic(view, offset);\n const tileByteLength = view.getUint32(offset + 8, true);\n tiles.push({\n magic,\n buffer: cmpt,\n offset: offset + byteOffset,\n byteLength: tileByteLength\n });\n offset += tileByteLength;\n }\n return tiles;\n }\n}\n","import * as maptalks from 'maptalks';\nimport * as maptalksgl from '@maptalks/gl';\n\nimport chunk from './worker.js';\n\nif (maptalksgl.transcoders) {\n const version = maptalks.Map.VERSION;\n if (version.indexOf(\"1.0.0-beta\") >= 0 || version.indexOf(\"1.0.0-alpha\") >= 0) {\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', transcoderInjected);\n } else {\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', function () {\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\n return transcoderInjected;\n });\n }\n\n} else {\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', chunk);\n}\n\nexport * from '../src/layer/index';\n"],"names":["planes","i","p","intersectsBox","matrix","box","mask","setPlanes","plane","distanceToPoint","COLUMN0ROW0","COLUMN0ROW1","COLUMN0ROW2","COLUMN1ROW0","COLUMN1ROW1","COLUMN1ROW2","COLUMN2ROW0","COLUMN2ROW1","COLUMN2ROW2","intersectsPlane","center","normal","halfAxes","normalX","normalY","normalZ","radEffective","Math","abs","distanceToPlane","m","me","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","setComponents","out","x","y","z","w","inverseNormalLength","sqrt","isArrayish","obj","Array","isArray","length","splice","Function","Object","getOwnPropertyDescriptor","constructor","name","concat","prototype","slice","swizzle","simpleSwizzleModule","exports","args","results","len","arg","call","push","wrap","fn","arguments","colorNames","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","require$$1","hasOwnProperty","reverseNames","create","cs","colorStringModule","to","get","clamp","num","min","max","hexDouble","str","round","toString","toUpperCase","string","val","model","substring","toLowerCase","hsl","hwb","rgb","value","match","hexAlpha","i2","parseInt","parseFloat","alpha","isNaN","hex","rgba","percent","r","g","b","hsla","hwba","a","keyword","cssKeywords","reverseKeywords","key","convert","conversionsModule","channels","labels","hsv","cmyk","xyz","lab","lch","ansi16","ansi256","hcg","apple","Error","defineProperty","h","l","delta","rdif","gdif","bdif","s","v","diff","diffc","c","k","reversed","currentClosestKeyword","currentClosestDistance","Infinity","distance","pow","t1","t2","t3","smin","lmin","hi","floor","f","q","t","sl","vmin","n","wh","bl","ratio","y2","x2","z2","atan2","PI","hr","cos","sin","ansi","color","mult","rem","colorString","split","map","char","join","integer","hue","chroma","mg","pure","conversions","require$$0","deriveBFS","fromModel","graph","models","keys","parent","buildGraph","queue","current","pop","adjacents","adjacent","node","unshift","link","from","wrapConversion","toModel","path","cur","conversion","route","forEach","routes","wrappedFn","result","wrapRounded","raw","wrapRaw","_slice","skippedModels","hashedModelKeys","sort","limiters","Color","this","valpha","newArr","zeroArray","indexOf","hashedKeys","JSON","stringify","limit","freeze","getset","channel","modifier","maxfn","arr","toJSON","places","self","percentString","array","object","unitArray","unitObject","Number","toFixed","roundTo","roundToPlace","saturationl","lightness","saturationv","wblack","rgbNumber","luminosity","lum","chan","contrast","color2","lum1","lum2","level","contrastRatio","isDark","isLight","negate","lighten","darken","saturate","desaturate","whiten","blacken","grayscale","fade","opaquer","rotate","degrees","mix","mixinColor","weight","color1","undefined","w1","w2","newAlpha","isNil","extend","dest","src","isFunction","isObject","isNumber","toRadian","d","toDegree","getAbsoluteURL","url","document","createElement","href","sign","extraByteMap","stringFromUTF8Array","data","count","index","ch","extra","chx","String","fromCharCode","setColumn3","col","flatArr","flat","reduce","acc","getBatchIdArrayType","Uint8Array","Uint16Array","Uint32Array","isBase64","base64URLToArrayBuffer","firstDot","base64","binary_string","window","atob","bytes","charCodeAt","buffer","pushIn","ii","ll","colorCache","normalizeColor","isRelativeURL","prepareFetchOptions","fetchOptions","referrerPolicy","referrer","location","globalThis","global","e","gl_trans__coders","o","maptalks_gltf_loader","inject","_","maptalks_gltf_loader_bundle","registerTranscoder","getTranscoder","canvas","Geo3DTilesWorkerConnection","maptalks","worker","Actor","workerKey","mapId","supportNPOT","super","_supportNPOT","initialize","cb","loadTile","layerId","params","buffers","arraybuffer","command","send","abortTileLoading","broadcast","addLayer","options","actorId","removeLayer","requestImage","image","Image","onload","isActive","img","isPowerOfTwo","width","height","floorPowerOfTwo","getContext","drawImage","idx","lastIndexOf","filename","console","warn","resize","ctx","willReadFrequently","imgData","getImageData","onerror","err","log","LN2","EPSILON","ARRAY_TYPE","Float32Array","multiply","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","glMatrix.ARRAY_TYPE","hypot","fromValues","copy","set","subtract","scale","normalize","dot","cross","ax","ay","az","bx","by","bz","sub","mul","vec","vec3.create","vec3.fromValues","GLTFLoader","getGLTFLoaderBundle","iterateMesh","gltf","scenes","i0","l0","nodes","matrices","iterateNode","TMAT","RMAT","SMAT","EMPTY_T","EMTPY_Q","quat.identity","EMPTY_S","nodeMatrices","rotation","translation","tm","mat4.fromTranslation","rm","xx","yx","yy","zx","zy","zz","wx","wy","wz","mat4.fromQuat","sm","mat4.fromScaling","mat4.multiply","children","mesh","meshIndex","meshes","mat","primitives","primitive","getItemAtBufferData","byteOffset","byteStride","stride","componentType","itemSize","arrayBuffer","ctor","getTypedArrayCtor","BYTES_PER_ELEMENT","uint8Arr","setInstanceData","row","scratchN","scratchK","wgs84RadiiSquared","radianToCartesian3","longitude","latitude","radiiSquared","cosLatitude","normalizeCartesian","vec3.multiply","gamma","vec3.dot","cartesian","scalar","vec3.scale","vec3.add","wgs84OneOverRadii","wgs84OneOverRadiiSquared","cartesianToCartographicP","cartesianToCartographicN","cartesianToCartographicH","cartesian3ToDegree","oneOverRadiiSquared","oneOverRadii","centerToleranceSquared","positionX","positionY","positionZ","oneOverRadiiX","oneOverRadiiY","oneOverRadiiZ","squaredNorm","intersection","scaleToGeodeticSurfaceIntersection","isFinite","oneOverRadiiSquaredX","oneOverRadiiSquaredY","oneOverRadiiSquaredZ","gradient","scaleToGeodeticSurfaceGradient","func","denominator","xMultiplier","yMultiplier","zMultiplier","xMultiplier2","yMultiplier2","zMultiplier2","xMultiplier3","yMultiplier3","zMultiplier3","lambda","magnitude","correction","EPSILON12","scaleToGeodeticSurface","vec3.mul","vec3.sub","asin","vec3.length","geodeticSurfaceNormal","origin","vec3.normalize","geodeticSurfaceNormalCartographic","cartographic","equalsEpsilon","left","right","relativeEpsilon","absoluteEpsilon","absDiff","readMagic","view","offset","magic","code","getUint8","textDecoder","TextDecoder","readFeatureTableJSON","byteLength","parse","decode","readBatchTableJSON","readBatchTableBin","readBatchArray","batchId","buf","type","reglType","getComponentCtor","getItemSize","readBatchId","batchIdData","readBatchData","subarray","TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","typeMap","BYTE","Int8Array","UNSIGNED_BYTE","SHORT","Int16Array","UNSIGNED_SHORT","INT","Int32Array","UNSIGNED_INT","FLOAT","DOUBLE","Float64Array","getComponentFromCtor","convertQuantizedPosition","position","readFeatureTableBatchTable","transferables","featureTableJsonByteLength","getUint32","featureTableBinaryByteLength","batchTableJsonByteLength","batchTableBinaryByteLength","i3dmBuf","featureTableBin","featureTable","batchTable","batchTableBin","readFeatureTableBin","batchTableBinInfo","vectorProductLocalFrame","up","south","north","west","east","down","degeneratePositionLocalFrame","localFrameToFixedFrameCache","scratchCalculateCartesian","scratchFirstCartesian","scratchSecondCartesian","scratchThirdCartesian","ZERO","setTranslation","eastNorthUpToFixedFrame","firstAxis","secondAxis","thirdAxis","resultat","hashAxis","ellipsoid","a0","a1","a2","glMatrix.EPSILON","vec3.copy","mathSign","vec3.cross","localFrameToFixedFrameGenerator","scratchRTCCoord","scratchCenter","scratchCartographic","projectedPosition","scratchFromENU","scratchToENU","scratchRotation","coord","prjResult","RADIAN","OPTIONS","offscreenCanvas","OffscreenCanvas","fillText","getCanvas","ColorIn","colors","error","valueOffset","assign","_initImgData","clearRect","createLinearGradient","stop","addColorStop","fillStyle","fillRect","getColor","colorInCache","isNull","isNotNull","isEmptyString","createFunction","parameters","defaultType","fun","isFeatureConstant","isZoomConstant","isFunctionDefinition","innerFun","zoomAndFeatureDependent","stops","featureDependent","property","zoomDependent","evaluateExponentialFunction","evaluateIntervalFunction","evaluateCategoricalFunction","evaluateIdentityFunction","evaluateColorInterpolateFunction","evaluateCalculateExpressionFunction","featureFunctions","featureFunctionStops","zoom","default","feature","base","input","interpolate","Map","COLORIN_OPTIONS","colorIn","has","targetVariable","expression","newValue","coalesce","updatedExpression","traverseAndAssign","newValueAsNumber","targetVariableAsString","subExpr","evaluateExpression","operator","includes","operands","op","curr","some","inputLower","inputUpper","outputLower","outputUpper","evaluatedLower","apply","evaluatedUpper","output","interpolateNumber","interpolateArray","difference","progress","interpolated","createFunction1","getTextureMagFilter","getTextureMinFilter","getTextureWrap","getMaterialType","getMaterialFormat","getPrimitive","getUniqueREGLBuffer","getArrayType","reshader","REGLHelper","Y_TO_Z","X_TO_Z","loginIBLResOnCanvas","logoutIBLResOnCanvas","getIBLResOnCanvas","getPBRUniforms","pbr","PBRUtils","DEFAULT_POLYGON_OFFSET","factor","units","DEFAULT_POLYGONFILL","DEFAULT_HSV","DEFAULT_MATERIAL_INFO","specularStrength","materialShininess","IDENTITY_SCALE","IDENTITY_MATRIX","mat4","identity","EMPTY_TRANSLATION","EMPTY_COORD_OFFSET","LIGHT_DIR","phongFilter","material","PhongMaterial","StandardFilter","StandardMaterial","TEMP_RTCCENTER","TEMP_CENTER","Coordinate","TEMP_POINT","Point","TEMP_POINT1","TEMP_POINT2","TEMP_OFFSET","TEMP_TRANSLATION","TEMP_MATRIX1","TEMP_MATRIX2","TEMP_TILE_ROT_QUAT","TEMP_SCALING","TEMP_TILE_SCALING_MAT","TEMP_TILE_TRANSFORM","TEMP_TRANSLATION_MAT","TEMP_SERVICE_MAT","TEMP_PROJ_SCALE","TEMP_DIST_SCALE","TEMP_DIST_TO_PROJ_SCALE","TEMP_MATRIX_SCALE","DEFAULT_SEMANTICS","POSITION","NORMAL","TEXCOORD_0","TEXCOORD_1","COLOR_0","TANGENT","_BATCHID","BOX_INDEX","SPHERE_POS","radius","angle","vertices","indices","posX","posY","posZ","generateSphere","BOX_ROTATE","BOX_SCALE","TileMeshPainter","regl","layer","_layer","_canvas","getRenderer","pickingFBO","_regl","_renderer","Renderer","_loading","_modelMeshes","_pntsMeshes","_i3dmMeshes","_cmptMeshes","_cachedGLTF","_modelScene","Scene","_pntsScene","_i3dmScene","_boxScene","_resLoader","ResourceLoader","texture","_bindedListener","_onResourceLoad","_khrTechniqueWebglManager","KHRTechniquesWebglManager","_getExtraCommandProps","getMap","_heightScale","altitudeToPoint","getGLRes","getI3DMMeshes","getPNTSMeshes","getB3DMMeshes","getPaintedMeshes","_paintedMeshes","paint","tiles","boxMeshes","parentContext","renderTarget","filter","sceneFilter","uniforms","_getUniformValues","projViewMatrix","oneMeshArray","parentMeshes","b3dmMeshes","pntsMeshes","i3dmMeshes","_getMesh","service","_getNodeService","_rootIdx","debugNodes","heightOffset","coordOffset","id","polygonOffset","isValid","properties","_updateMeshLocalTransform","_originLocalTransform","localTransform","_node","getBoundingBox","batchIdMap","geometry","rootIdx","_highlighted","HighlightUtil","highlightMesh","_highlightTimestamp","showOnly","_showOnlys","_showOnlyTimeStamp","bloom","hlBloomMesh","depthFunc","isLeaf","leave","branchRootId","selectionDepth","cullFace","bloomProperties","_updateMaskDefines","_updateServiceMatrix","drawCount","khrExludeFilter","getExcludeFilter","ContextUtil","setIncludeUniformValues","_callShader","_phongShader","_standardShader","forEachShader","shader","shaderFilter","uniformSemantics","setMeshes","pntsUniforms","_getPntsUniforms","render","_pntsShader","fbo","_edgeShader","prepareRender","context","_prepareShaders","states","includesChanged","dispose","_createShaders","stencilEnable","branchMeshes","leafMeshes","hasUnresolved","currentBranchRootId","_drawBranchMeshes","_clearStencil","clear","stencil","framebuffer","getCurrentB3DMMeshes","getMeshes","getCurrentI3DMMeshes","_sort","_cameraDistance","deleteTile","tileData","_boxMesh","_disposeMesh","_disposeCMPT","_deleteOne","cached","refMeshes","delete","uuid","size","remove","picking","_updateB3DMLocalMatrix","_updateI3DMLocalTransform","_updatePNTSLocalTransform","createPntsMesh","pnts","compressed_int16_params","fill","Geometry","static","positionAttribute","pickingIdAttribute","generateBuffers","defines","_setCompressedInt16Defines","rtcCenter","rtcCoord","projCenter","Mesh","serviceIndex","setDefines","setFunctionUniform","pointColor","pointSizeValue","pointSizeFn","pointSize","getZoom","pointOpacityValue","pointOpacityFn","pointOpacity","_setCompressedInt16Uniforms","_getB3DMTransform","setLocalTransform","createI3DMMesh","upAxisTransform","_getUpAxisTransform","_upAxis","i3dm","instanceCount","projectedMatrix","_computeProjectedTransform","tileRotQuat","getRotation","quat","scaling","getScaling","tileScalingMat4","fromScaling","tileTransform","_getI3DMTileTransform","projScale","_getProjScale","distScale","_getDistanceScale","distToProjScale","vec3","div","distToProjScaleTransform","NORMAL_UP","NORMAL_RIGHT","SCALE","SCALE_NON_UNIFORM","instanceData","instance_vectorA","instance_vectorB","instance_vectorC","aPickingId","normalUp","normalRight","normalForward","scaleItem","scaleNonUniform","rotationMat3","quaternion","tempUint8","iterateBufferData","vertex","fromMat3","fromRotationTranslationScale","instanceBuffers","dimension","divisor","unreadyCount","ready","gltfWeakResources","gltfMesh","meshId","primId","gltfResource","_processGLTF","isReady","InstancedMesh","Set","add","_getGLTFMeshDefines","_setWEB3DDecodeUniforms","attributes","nodeMatrix","setPositionMatrix","trimGLTFWeakResources","_callback","coordOffsetMatrix","_computeCoordOffsetMatrix","_getCenterTranslation","fromTranslation","createB3DMMesh","maxPrjExtent","maxExtent","extent","Extent","convertTo","_pointToPrj","xmin","ymin","xmax","ymax","extensions","isSharedPosition","asset","sharePosition","_getB3DMTileTransform","unlit","materials","compressUniforms","u","setUniform","hasFunctionUniform","opacity","polygonFill","_createBoxMesh","nodeBox","_getNodeBox","translate","obbox","boxPosition","boxCenter","sphereBox","sphereCenter","Material","lineColor","lineOpacity","_deleteBoxMesh","distanceScale","decodeMatrix","nodeTransform","transformMat4","projectedTransform","projection","res","heightScale","viewCenter","mat4.getTranslation","vec3.len","vec3.set","prjCoord","project","fromENU","toENU","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","mat4.invert","mat3.fromMat4","left0","left1","left2","left4","left5","left6","left8","left9","left10","right0","right1","right2","right4","right5","right6","right8","right9","right10","column0Row0","column0Row1","column0Row2","column1Row0","column1Row1","column1Row2","column2Row0","column2Row1","column2Row2","multiplyByMatrix3","basisTo2D","getProjection","getTranslation","boxCoord","glRes","point0","coordToPointAtRes","target","point1","dx","dy","createCMPTMesh","content","childId","getGeometryDefines","generator","_appendS3MDefines","uvRegion","desc","normalAttribute","color0Attribute","uv0Attribute","textureCoordMatrixAttribute","_vertexCompressionType","hasIBL","compressDefines","renderer","updateMaskDefines","isI3DM","isS3M","matInfo","khrTechniquesWebgl","isWebGPU","khrMesh","_createTechniqueMesh","fillEmptyDataInMissingAttribute","_createGeometry","materialInfo","_createMaterial","alphaTest","ambientLight","environmentExposure","lights","getLightManager","mapAmbient","getAmbientLight","ambientValue","_nodeId","baseColorFactor","gltfGeo","useWebGL2","createMesh","attributeSemantics","color0Name","attrs","positionSize","vertexCount","isPosition","newArray","padGPUBufferAlignment","pickingData","uv1Attribute","tangentAttribute","mode","featureIds","indiceIndex","generateFeatureIndiceIndex","excludeElementsInVAO","_prjToPoint","serviceTransform","_getServiceTransform","zoomScale","distanceToPointAtRes","viewport","modelNormalMatrix","projViewModelMatrix","MeshShader","vert","pntsVert","frag","props","mat3","fromMat4","extraCommandProps","blend","enable","dst","equation","depth","uniformDeclares","fillIncludes","PhongShader","StandardShader","EdgeShader","srcRGB","srcAlpha","dstRGB","dstAlpha","FBORayPicking","PICKING_MODE","ENABLE_PICKING","HAS_PICKING_ID","_pntsPicking","cull","meshProperties","face","cmp","ref","fail","zfail","zpass","lightManager","lightDir","getDirectionalLight","direction","layerOpacity","iblTexes","dfgLUT","maskUniforms","getMaskUniforms","minAltitude","altitude","czm_lightDirectionEC","lightSpecular","viewMatrix","projMatrix","outSize","polygonOpacity","ambientColor","materialIndex","baseColorTexture","pbrMetallicRoughness","texInfo","textures","_getTexture","normalTexture","normalMapFactor","occlusionTexture","occlusionFactor","strength","emissiveTexture","emissiveFactor","vec4","getREGLTexture","metallicFactor","roughnessFactor","metallicRoughnessTexture","s3mMaterial","meshMaterial","convertFrom","doubleSided","once","config","format","flipY","mipmap","sampler","magFilter","minFilter","wrapS","wrapT","Texture2D","loading","_coordToPoint","getGLZoom","axis","pick","tolerance","b3dm","_pickMesh","scene","picked","getRenderedMeshes","returnPoint","pickingId","point","coordinate","getMeshAt","services","debugInfo","highlight","highlights","getFrameTimestamp","setToRedraw","cancelAllHighlight","showOnlys","cancelShowOnly","_getCurrentBatchIDs","ids","batchIds","batchData","getAmbientResource","fillNodepagesToCache","nodeCache","TEMP_VEC3","I3SNode","fnFetchNodepages","_url","_fnFetchNodepages","_version","version","_index","_nodeCache","load","baseUrl","layerScene","lodSelection","_nodeJSON","_loadNode","Promise","resolve","eslpk","nodepage","nodesPerPage","getTileset","_tileset","getChildrenURL","_childrenURL","promises","pendingReqs","childPageIndex","all","then","_loadContent","_createTileset","_fillCache","i3s","gltfUpAxis","geometricError","MAX_VALUE","root","_convertNode","nodeJSON","is4326","wkid","nodeData","obb","mbs","boundingVolume","_tileCoordToLngLat","_WGS84ToCartesian","sphere","halfSize","directionsMatrix","mat3.fromQuat","fromCenterHalfSizeQuaternion","metersPerPixel","span","lodThreshold","lodSelectionMetricType","lodIndex","metricType","maxError","globalTransforms","mat4.identity","localTransforms","childrenDefinition","childIndex","inPlaceTileDefinition","refine","transform","geometryData","uri","getJSON","long","lat","supportKTX2","transcoders","ktx2","IDENTITY_MAT4","supportWASM","WebAssembly","instantiate","module","Module","of","Instance","isI3SMesh","prefixIndex","getI3SNodeInfo","enableDraco","forceDraco","isESLPK","nodeIndex","getI3SNodeIndex","hasCompression","geoUrl","meshInfo","info","store","defaultGeometrySchema","textureUrl","textureData","mimeType","textureEncoding","geoDefinitions","geometryDefinitions","geoDef","definition","geometryBuffers","geometryInfo","resource","materialDefinitions","textureSetDefinitions","materialDef","materialDefinition","resolveTextures","parseMaterial","dracoCompression","textureSetDefinitionId","texDef","formats","getSupportedTexture","ext","textureEnCodingMap","textureEncode","textureFormat","hasExtension","Ajax","COORD_IN","COORD_OUT","REPORTED_ERRORS","EMPTY_ARRAY","GlobalTieCache","onRemove","currentSize","reset","_remove","memorySize","shrink","warned","iterator","item","next","removedData","getAndRemove","setMaxSize","getMemorySize","values","markAll","isCurrent","Browser","mobile","tile","TileCacheRefCount","Geo3DTilesRenderer","MaskRendererMixin","CanvasCompatible","LayerAbstractRenderer","tileCache","tilesLoading","_requests","_modelQueue","_fetchI3DNodepages","getAnalysisMeshes","painter","paintedMeshes","needToRedraw","isInteracting","_timestamp","drawOnInteracting","event","timestamp","draw","mask2DExtent","prepareCanvas","intersects","canvasExtent2D","completeRender","getTiles","_consumeI3SQueue","_consumeModelQueue","selectedTiles","requests","_selectTiles","loadTiles","_drawTiles","_abortUnusedTiles","_markTiles","preLoadingCount","loadingLimit","_getLoadLimit","checked","hit","tileLoading","getCachedTile","_isLoadingTile","getTileOpacity","selected","_selectParentTile","_selectChildTile","_sortTiles","compareRequests","lastAncestor","stack","parentStack","waitingTile","_stackLength","treeNode","maxLevel","_level","child","_createCandidate","nodeId","onDrawTileStart","fire","onDrawTileEnd","renderCount","binary","_loadTileContent","isI3STileset","_i3sNodeCache","tileset","onTilesetLoad","supportedFormats","_supportedFormats","Util","getSupportedFormats","gl","device","wgpu","isSuperMapiServer","uriComponent","parts","encoded","encodeURIComponent","encodeSuperMapURI","getTileUrl","_roots","upAxis","i3sInfo","onTileError","status","workerConn","getId","shift","_onMeshCreated","_enableLayerOpacity","_getMeshSize","onTileLoad","_addTileToCache","capabilities","layers","_parseI3SSceneLayer","errorUrl","message","isNoContentHttpCode","_addErrorToCache","getShadowMeshes","loadTime","now","initContext","reglGL","graphics","prepareWorker","_resumeHighlights","spatialReference","coordType","getSpatialReference","destroy","getStencilValue","force","_preRetireTime","Date","aborted","_createGLContext","names","tileId","batch","bin","_i3sRequests","callbacks","json","i3sVersion","nodePages","endsWith","lastSlash","regulateURL","parseI3SJSON","serviceHighs","cancelHighlight","items","serviceShowOnlys","_getCoordProjection","unproject","_lngLatToIdentityCoord","_identityCoordToLngLat","_centerProjection","SpatialReference","getProjectionInstance","getMatrix3Column","distanceToCamera","cameraPosition","vec3.subtract","scratchOffset","scratchCartesianU","scratchCartesianV","scratchCartesianW","uHalf","vHalf","wHalf","pPrime","scratchPPrime","distanceSquared","distanceSquaredTo","TWO_PI","Rectangle","contains","rectangle","southwest","northeast","southeast","northwest","UNIT_Z","cartographicToCartesian","carto","Plane","fromPointNormal","cartographicScratch","cartographicScratch2","westernMidpointScratch","eastWestNormalScratch","cartesian3Scratch","cartesian3Scratch2","cartesian3Scratch3","easternMidpointScratch","rayOrigin","rayDirection","planeScratch","vectorScratch","TileBoundingRegion","region","southwestCornerCartesian","northeastCornerCartesian","westNormal","eastNormal","southNormal","northNormal","minimumHeight","maximumHeight","computeBox","cameraCartesianPosition","cameraCartographicPosition","vectorFromSouthwestCorner","distanceToWestPlane","distanceToSouthPlane","vectorFromNortheastCorner","distanceToEastPlane","distanceToNorthPlane","cameraHeight","distanceAboveTop","distanceBelowBottom","tileBB","westernMidpointCartesian","easternMidpointCartesian","westVector","eastWestNormal","southSurfaceNormal","southCenterCartesian","westPlane","rayPlane","northSurfaceNormal","northCenterCartesian","eastPlane","extentToBBOX","BBOXUtil","maxGPUMemory","retireInterval","loadingLimitOnInteracting","debug","meshLimitPerFrame","i3sNodepageLimitPerFrame","enableI3SCompressedGeometry","forceI3SCompressedGeometry","onlyCacheNoContentTileWhenError","pickingPoint","geometryEvents","alwaysShowTopTiles","antialias","forceRenderOnZooming","forceRenderOnRotating","forceRenderOnMoving","optionalExtensions","TEMP_VEC3_0","TEMP_VEC3_1","TEMP_VEC3_2","TEMP_VEC3_3","TEMP_VEC3_4","TEMP_VEC3_5","TEMP_VEC3_6","TEMP_SCALE","TEMP_QUAT_0","TEMP_COORD","TEMP_MAT3_0","TEMP_MAT4_0","TEMP_MAT4_1","TEMP_MAT4_2","CAMERA_Point","DEFAULT_ROTATION","DEFAULT_SCALE","TEMP_SERVICE_SCALE","DEFAULT_TRANSLATION","TILENODE_BBOX","BOX_POS","Geo3DTilesLayer","MaskLayerMixin","Layer","fromJSON","layerJSON","getEnuTransform","cart3","enu","fromEuler","isGeo3DTilesLayer","_initRoots","_nodeBoxes","urls","_rootMap","createRootTile","roots","showService","updateService","visible","hideService","_setToRedraw","addService","extentChanged","equals","rootNode","removeService","subdomains","domainKey","domain","replace","getExtent","nodeExtent","boundingVolumeToExtent","_centerTransformed","isIdentity","nw","locate","se","nodeCenter","rx","ry","rz","getRootTiles","pointAtResToDistance","cameraCoord","_getCameraLonLat","_cameraLocation","_cameraCartesian3","_fovDenominator","getFov","projectionView","mapExtentBBOX","getPitch","mapExtent","halfWidth","getWidth","halfHeight","getHeight","clipMasks","getMasks","ClipOutsideMask","maskGeoJSON","toGeoJSON","bbox","currentParent","_getRootMaxExtent","_initNode","_isVisible","TileVisibility","VISIBLE","OUT_OF_FRUSTUM","isTopTile","SCREEN_ERROR_TOO_SMALL","_addCandidateNode","_updateParentDistance","candidate","hasChildren","hasContent","inited","hasValidChild","viewerRequestVolume","cameraLocation","cameraCartesian3","volume","computeSphereDistanceToCamera","computeBoxDistanceToCamera","inViewerRequestVolume","GUID","_empty","_isEmpty","isI3SNode","_offsetBoundingVolume","_offsetChanged","hasOffset","exactEquals","originalVolume","westSouth","_offsetCenter","eastNorth","offsetCenter","axisUp","isRealspace","s3mType","isI3S","isFirstTileset","_notLoaded","ecefTransform","contentUrl","_updateRootCenter","_isTileInMasks","bboxIntersect","bboxInMask","_isTileInFrustum","maximumScreenSpaceError","_getScreenSpaceError","_error","_getRootNode","_createRegionBox","_createBBox","_createSphere","intersectsOrientedBox","negRadius","intersectsSphere","ws","en","minHeight","maxHeight","ws_coord","en_coord","convertRegionToBox","pointWS","pointEN","_bboxCenter","isIdentityMatrix","pos","pointAtResToCoord","_generateOBBox","_calBoxCenter","modelMatrix","column3Row0","column3Row1","column3Row2","column0Row3","column1Row3","column2Row3","column3Row3","fillColumnMajorMatrix4","fromRotationTranslation","_createHalfAxes","toArray","_getBoxScale","obbCenter","xPlaneCenter","getBoxPlaneCenter","yPlaneCenter","zPlaneCenter","box_center","box_center_coord","point_center","rootCenter","originMat4","originMat4Reverse","serviceScale","_equalsOffsets","pointCenter","_updateRootBBoxCenter","_updateRootRegionCenter","_originCoordOffset","_originHeightOffset","rotationScale","scalePoint","fovDenominator","_tileRegion","computeRegionDistanceToCamera","identify","cp","coordToContainerPoint","identifyAtPoint","identifyMasks","identifyMask","dpr","getDevicePixelRatio","getCurrentBatchIDs","_resumeShowOnly","setServiceOpacity","setServiceDebug","getJSONType","dist","v0","v1","v2","v3","vv0","vv1","vv2","vv3","hasParentContent","vec2","mergeOptions","registerRenderer","registerJSONType","currentTranscoders","getTranscoders","crn","draco","B3DMLoader","loaderCtor","_requestImage","_loaderCtor","_decoders","createEmptyB3DM","_parse","getArrayBuffer","response","b3dmByteLength","maxTextureSize","components","_readB3DM","rootPath","loader","glb","transferable","decoders","skipAttributeTransform","DataView","batchLength","BATCH_LENGTH","b3dmData","_readBatchTable","I3DMLoader","_maxTextureSize","_parseGLTF","_readI3DM","i3dmURL","opts","gltfBinStart","_createGLTFLoader","instanceLength","quanVolOffset","quanVolScale","_convertQuantizedPosition","_decodeOCT32p","octDecodeInRange","rangeMax","fromSNorm","oldVX","signNotZero","rangeMaximum","defaultValue","PNTSLoader","pntsBuf","_readPNTS","pointsLength","dracoBuf","compression","dracoOptions","useUniqueIDs","_draco","attribData","_readAttributes","createPerPointBatchId","attrByteOffset","CMPTLoader","GLTFloaderCtor","cmpt","_readCMPT","tilesLength","tileByteLength","maptalksgl","VERSION","transcoderInjected","chunk","registerWorkerAdapter"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,15,16,17,18,19,20,25,26]}
|