@maptalks/3dtiles 0.101.0 → 0.102.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"maptalks.3dtiles.es.js","sources":["../../../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","../src/layer/Geo3DTilesWorkerConnection.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.0/node_modules/@maptalks/function-type/index.js","../src/layer/renderer/TileMeshPainter.js","../../gl/dist/transcoders.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":["'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","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","import { GLTFLoader } from '@maptalks/gltf-loader';\r\nimport { mat4, quat } from 'gl-matrix';\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/*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 || parameters.property !== undefined;\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 (a !== undefined) return a;\r\n if (b !== undefined) return b;\r\n if (c !== undefined) 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 = parameters.base !== undefined ? 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 value === null || value === undefined || value === '' || isNaN(value) ? parameters.default : value;\r\n }\r\n\r\n // 如果 input 存在且大于0,则处理表达式\r\n if (input !== undefined && input !== null && 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 pntsVert from './glsl/pnts.vert';\nimport pntsFrag from './glsl/pnts.frag';\nimport { isFunction, isNil, extend, setColumn3, flatArr, isNumber, normalizeColor } 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, getTextureWrap, getMaterialType, getMaterialFormat, getPrimitive, getUniqueREGLBuffer } = 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, leafs, 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 meshes = [];\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 mesh[ii].properties.hlBloomMesh.properties.polygonOffset = polygonOffset;\n meshes.push(mesh[ii].properties.hlBloomMesh);\n }\n meshes.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 = !!leafs[node.id];\n // GroupGLLayer中,stencil默认值为0xFF,与GroupGLLayer保持一致\n mesh[ii].properties.selectionDepth = 255 - tiles[i].selectionDepth;\n mesh[ii].properties.polygonOffset = polygonOffset;\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 (!leafs[node.id]) {\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, meshes, i3dmMeshes);\n drawCount += this._callShader(this._standardShader, uniforms, [filter, StandardFilter, khrExludeFilter], renderTarget, parentMeshes, meshes, 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, meshes, 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: meshes\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['colorMask'] = colorOn;\n const fbo = renderTarget && renderTarget.fbo;\n let drawCount = 0;\n\n const sceneMeshes = [];\n for (let i = 0; i < meshes.length; i++) {\n const { isLeaf, selectionDepth } = meshes[i].properties;\n if (isLeaf && selectionDepth === 255) {\n // 独立的叶子节点\n if (uniforms.stencilEnable) {\n // 清除stencil,避免上一次分支绘制的stencil影响本次绘制\n this._clearStencil(fbo);\n // sceneMeshes中是某个分支下的非独立叶子节点 + 父亲节点\n // 这种情况一般出现在某个分支的子节点不满足要求(没有下载下来或者error不符合设定),需要将父亲节点与子节点一起绘制\n // 绘制分支下的非独立节点需要开启stencil,先绘制叶子节点,再绘制父亲节点,保证父节点的绘制不会覆盖掉子节点\n this._modelScene.setMeshes(sceneMeshes);\n drawCount += this._renderer.render(shader, uniforms, this._modelScene, fbo);\n sceneMeshes.length = 0;\n uniforms.stencilEnable = false;\n }\n sceneMeshes.push(meshes[i]);\n } else {\n // 某个分支下的非独立节点\n if (!uniforms.stencilEnable) {\n // sceneMeshes中都是独立节点\n // 关闭stencil直接绘制\n this._modelScene.setMeshes(sceneMeshes);\n drawCount += this._renderer.render(shader, uniforms, this._modelScene, fbo);\n sceneMeshes.length = 0;\n uniforms.stencilEnable = true;\n }\n sceneMeshes.push(meshes[i]);\n }\n if (i === meshes.length - 1) {\n if (uniforms.stencilEnable) {\n this._clearStencil(fbo);\n }\n this._modelScene.setMeshes(sceneMeshes);\n drawCount += this._renderer.render(shader, uniforms, this._modelScene, fbo);\n }\n }\n // pick功能需要把meshes设置到modelScene中,为了避免pick逻辑出错,这里暂时只允许选择叶子节点\n //FIXME 因为父亲节点不在modelScene中,会出现父亲节点无法被选中的问题\n this._modelScene.setMeshes(meshes.filter(m => m.properties.isLeaf));\n\n // this._modelScene.setMeshes(meshes);\n // drawCount += this._renderer.render(shader, uniforms, this._modelScene, renderTarget && renderTarget.fbo);\n\n\n // uniforms['stencilEnable'] = true;\n\n this._i3dmScene.setMeshes(i3dmMeshes);\n drawCount += this._renderer.render(shader, uniforms, this._i3dmScene, renderTarget && renderTarget.fbo);\n return drawCount;\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 }),\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 defines['HAS_LAYER_OPACITY'] = 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 // 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 attrs = {};\n for (const p in attributes) {\n const buffer = getUniqueREGLBuffer(this._regl, attributes[p], { dimension: attributes[p].itemSize });\n // 优先采用 attributeSemantics中定义的属性\n const name = attributeSemantics[p] || p;\n attrs[name] = { buffer };\n if (attributes[p].quantization) {\n attrs[name].quantization = attributes[p].quantization;\n }\n if (name === attributeSemantics['POSITION']) {\n attrs[name].array = attributes[p].array;\n attrs[name].min = attributes[p].min;\n attrs[name].max = attributes[p].max;\n }\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 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 range: [0, 1],\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: this._standardShader.vert,\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: true/*,\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 opFront: {\n fail: 'keep',\n zfail: 'keep',\n zpass: 'replace'\n },\n opBack: {\n fail: 'keep',\n zfail: 'keep',\n zpass: 'replace'\n }\n },\n depth: {\n enable: true,\n range: [0, 1],\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 return {\n projViewMatrix : map.projViewMatrix,\n pointOpacity,\n lightDir: vec3.normalize(LIGHT_DIR, lightDir)\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 const inGroup = renderer.canvas.gl && renderer.canvas.gl.wrap;\n const layerOpacity = inGroup ? (layer.options.opacity || 0) : 1;\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 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 * @maptalks/gl v0.101.0\n * LICENSE : UNLICENSED\n * (c) 2016-2024 maptalks.com\n */\nconst n = function() {\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}, o = n(), e = o.gl_trans__coders = o.gl_trans__coders || {};\n\nfunction _(n) {\n return e[n];\n}\n\nfunction t(n, o) {\n e[n] = o;\n}\n\ne.inject = function(e) {\n const _ = e.toString(), t = _.indexOf(\"{\") + 1, r = _.substring(0, t), l = o.gl_trans__coders = o.gl_trans__coders || {};\n let s = `${r}\\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\" + _.substring(r.length), s;\n}, e.registerTranscoder = t, e.getTranscoder = _;\n\nexport { e as default, _ as getTranscoder, t as registerTranscoder };\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 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(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(materialDefinition, textureSetDefinitions, baseUrl, nodeIndex, regl, isESLPK) {\r\n const matInfo = JSON.parse(JSON.stringify(materialDefinition));\r\n\r\n resolveTextures(matInfo, textureSetDefinitions, baseUrl, nodeIndex, regl, isESLPK);\r\n return matInfo;\r\n}\r\n\r\nfunction resolveTextures(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);\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(matInfo[p], textureSetDefinitions, baseUrl, resource, regl, isESLPK);\r\n }\r\n }\r\n}\r\n\r\nfunction getSupportedTexture(formats, regl) {\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 } from '@maptalks/gl';\r\nimport { Ajax } from '@maptalks/gltf-loader';\r\nimport { createREGL, 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 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(maptalks.renderer.CanvasRenderer) {\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, leaves, requests} = this._selectTiles(root, tiles);\r\n\r\n if (requests.length) {\r\n this.loadTiles(requests);\r\n }\r\n this._drawTiles(selectedTiles, leaves, 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 let selectedTiles = [], leaves = {};\r\n if (hit) {\r\n ({ selectedTiles, leaves } = this._sortTiles(root));\r\n }\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 leaves\r\n };\r\n }\r\n\r\n //based on Cesium's traverseAndSelect in Cesium3DTilesetTraversal.js\r\n _sortTiles(root) {\r\n const selectedTiles = [], leaves = {};\r\n let lastAncestor;\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 leaves[waitingTile.node.id] = 1;\r\n }\r\n selectedTiles.push(waitingTile);\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 leaves[tile.node.id] = 1;\r\n tile.selectionDepth = parentStack.length;\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 leaves[tile.node.id] = 1;\r\n selectedTiles.push(tile);\r\n continue;\r\n }\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, leaves };\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, leaves, 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, leaves };\r\n this.onDrawTileStart(context);\r\n const count = this.painter.paint(tiles, leaves, 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.gl || this.gl);\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.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 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 _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 createContext() {\r\n const layer = this.layer;\r\n const attributes = layer.options.glOptions || {\r\n alpha: true,\r\n depth: true,\r\n stencil : true,\r\n preserveDrawingBuffer : true,\r\n antialias: layer.options.antialias,\r\n };\r\n const inGroup = this.canvas.gl && this.canvas.gl.wrap;\r\n if (inGroup) {\r\n this.gl = this.canvas.gl.wrap();\r\n this.regl = this.canvas.gl.regl;\r\n } else {\r\n this.glOptions = attributes;\r\n this.gl = this._createGLContext(this.canvas, attributes);\r\n }\r\n this.regl = this.regl || createREGL({\r\n gl : this.gl,\r\n attributes,\r\n extensions : [\r\n 'OES_element_index_uint'\r\n ],\r\n optionalExtensions : layer.options['optionalExtensions'] || []\r\n });\r\n this.prepareWorker();\r\n if (inGroup) {\r\n this.canvas.pickingFBO = this.canvas.pickingFBO || this.regl.framebuffer(this.canvas.width, this.canvas.height);\r\n }\r\n this.pickingFBO = this.canvas.pickingFBO || this.regl.framebuffer(this.canvas.width, this.canvas.height);\r\n this.painter = new TileMeshPainter(this.regl, layer);\r\n\r\n this.layer._resumeHighlights();\r\n this.layer.fire('contextcreate', { regl: this.regl });\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));\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 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 clearCanvas() {\r\n if (this.regl) {\r\n this.regl.clear({\r\n color: [0, 0, 0, 0],\r\n depth: 1,\r\n stencil : 0\r\n });\r\n }\r\n\r\n super.clearCanvas();\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 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 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 { Ajax, GLTFLoader } from '@maptalks/gltf-loader';\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\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 const 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\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 { Ajax, GLTFLoader } from '@maptalks/gltf-loader';\r\nimport { readFeatureTableBatchTable, readBatchId, convertQuantizedPosition } from '../common/TileHelper.js';\r\nimport { stringFromUTF8Array } from '../common/Util.js';\r\nimport getTranscoders from './transcoders.js';\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 { Ajax } from '@maptalks/gltf-loader';\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\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 { Ajax, GLTFLoader } from '@maptalks/gltf-loader';\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\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';\r\nimport * as maptalksgl from '@maptalks/gl';\r\n\r\nimport chunk from './worker.js';\r\n\r\nif (maptalksgl.transcoders) {\r\n const version = maptalks.Map.VERSION;\r\n if (version.indexOf(\"1.0.0-beta\") >= 0 || version.indexOf(\"1.0.0-alpha\") >= 0) {\r\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\r\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', transcoderInjected);\r\n } else {\r\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', function () {\r\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\r\n return transcoderInjected;\r\n });\r\n }\r\n\r\n} else {\r\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', chunk);\r\n}\r\n\r\nexport * from '../src/layer/index';\r\n"],"names":["isArrayish","obj","Array","isArray","length","splice","Function","Object","getOwnPropertyDescriptor","constructor","name","concat","prototype","slice","swizzle","simpleSwizzleModule","exports","args","results","i","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","Math","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","x","y","currentClosestDistance","Infinity","distance","pow","z","t1","t2","t3","smin","lmin","hi","floor","f","p","q","t","sl","vmin","n","wh","bl","ratio","m","y2","x2","z2","atan2","PI","sqrt","hr","cos","sin","ansi","color","mult","rem","colorString","split","map","char","join","integer","hue","chroma","mg","pure","w","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","out","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","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","iterateMesh","gltf","scenes","i0","l0","nodes","matrices","iterateNode","TMAT","RMAT","SMAT","EMPTY_T","EMTPY_Q","quat","identity","EMPTY_S","nodeMatrices","matrix","rotation","translation","scale","tm","mat4","fromTranslation","rm","fromQuat","sm","fromScaling","multiply","children","mesh","meshIndex","meshes","mat","primitives","primitive","getItemAtBufferData","byteOffset","byteStride","stride","componentType","itemSize","arrayBuffer","ctor","GLTFLoader","getTypedArrayCtor","BYTES_PER_ELEMENT","set","uint8Arr","setInstanceData","row","scratchN","scratchK","wgs84RadiiSquared","radianToCartesian3","longitude","latitude","radiiSquared","cosLatitude","normalizeCartesian","vec3","gamma","dot","cartesian","scalar","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","abs","EPSILON12","scaleToGeodeticSurface","mul","sub","asin","geodeticSurfaceNormal","origin","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","Float32Array","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","equals","copy","mathSign","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","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","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","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","leafs","boxMeshes","parentContext","renderTarget","filter","sceneFilter","uniforms","_getUniformValues","projViewMatrix","oneMeshArray","parentMeshes","pntsMeshes","i3dmMeshes","_getMesh","service","_getNodeService","_rootIdx","debugNodes","heightOffset","coordOffset","id","polygonOffset","isValid","properties","_updateMeshLocalTransform","_originLocalTransform","localTransform","_node","getBoundingBox","intersectsBox","batchIdMap","geometry","rootIdx","_highlighted","HighlightUtil","highlightMesh","_highlightTimestamp","showOnly","_showOnlys","_showOnlyTimeStamp","bloom","hlBloomMesh","depthFunc","isLeaf","selectionDepth","_updateMaskDefines","_updateServiceMatrix","drawCount","khrExludeFilter","getExcludeFilter","ContextUtil","setIncludeUniformValues","_callShader","_phongShader","_standardShader","forEachShader","shader","shaderFilter","uniformSemantics","setMeshes","pntsUniforms","_getPntsUniforms","render","_pntsShader","fbo","b3dmMeshes","_edgeShader","prepareRender","context","_prepareShaders","states","includesChanged","dispose","_createShaders","stencilEnable","sceneMeshes","_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","scaling","getScaling","tileScalingMat4","tileTransform","_getI3DMTileTransform","projScale","_getProjScale","distScale","_getDistanceScale","distToProjScale","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","_getGLTFMeshDefines","_setWEB3DDecodeUniforms","attributes","nodeMatrix","setPositionMatrix","trimGLTFWeakResources","_callback","coordOffsetMatrix","_computeCoordOffsetMatrix","_getCenterTranslation","createB3DMMesh","maxPrjExtent","maxExtent","extent","Extent","convertTo","_pointToPrj","xmin","ymin","xmax","ymax","extensions","center","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","getTranslation","prjCoord","project","fromENU","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","invert","mat3","fromMat4","basisTo2D","getProjection","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","khrMesh","_createTechniqueMesh","fillEmptyDataInMissingAttribute","_createGeometry","materialInfo","_createMaterial","alphaTest","ambientLight","environmentExposure","lights","getLightManager","mapAmbient","getAmbientLight","ambientValue","_nodeId","baseColorFactor","gltfGeo","useWebGL2","createMesh","attributeSemantics","color0Name","attrs","quantization","uv1Attribute","tangentAttribute","mode","featureIds","indiceIndex","generateFeatureIndiceIndex","excludeElementsInVAO","_prjToPoint","serviceTransform","_getServiceTransform","zoomScale","distanceToPointAtRes","viewport","modelNormalMatrix","projViewModelMatrix","MeshShader","vert","pntsVert","frag","_","props","extraCommandProps","blend","enable","dst","equation","depth","range","uniformDeclares","fillIncludes","PhongShader","StandardShader","EdgeShader","srcRGB","srcAlpha","dstRGB","dstAlpha","FBORayPicking","PICKING_MODE","ENABLE_PICKING","HAS_PICKING_ID","_pntsPicking","cull","cmp","ref","meshProperties","opFront","fail","zfail","zpass","opBack","lightManager","lightDir","getDirectionalLight","direction","iblTexes","dfgLUT","maskUniforms","getMaskUniforms","minAltitude","altitude","layerOpacity","gl","czm_lightDirectionEC","lightSpecular","viewMatrix","projMatrix","outSize","polygonOpacity","materialIndex","baseColorTexture","pbrMetallicRoughness","texInfo","textures","_getTexture","normalTexture","normalMapFactor","occlusionTexture","occlusionFactor","strength","emissiveTexture","emissiveFactor","vec4","getREGLTexture","metallicFactor","roughnessFactor","metallicRoughnessTexture","s3mMaterial","ambientColor","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","global","o","e","gl_trans__coders","fillNodepagesToCache","nodeCache","inject","registerTranscoder","getTranscoder","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","box","halfSize","directionsMatrix","fromCenterHalfSizeQuaternion","metersPerPixel","span","lodThreshold","lodSelectionMetricType","lodIndex","metricType","maxError","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","geoDef","geometryDefinitions","definition","geometryBuffers","geometryInfo","resource","materialDefinitions","textureSetDefinitions","materialDef","materialDefinition","resolveTextures","parseMaterial","dracoCompression","textureSetDefinitionId","texDef","formats","getSupportedTexture","ext","hasExtension","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","CanvasRenderer","tileCache","tilesLoading","_requests","_modelQueue","_fetchI3DNodepages","getAnalysisMeshes","painter","paintedMeshes","needToRedraw","isInteracting","_timestamp","drawOnInteracting","event","timestamp","draw","mask2DExtent","prepareCanvas","intersects","canvasExtent2D","completeRender","getTiles","_consumeI3SQueue","_consumeModelQueue","selectedTiles","leaves","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","leave","treeNode","maxLevel","_level","child","_createCandidate","nodeId","onDrawTileStart","fire","onDrawTileEnd","renderCount","binary","_loadTileContent","isI3STileset","_i3sNodeCache","tileset","onTilesetLoad","supportedFormats","_supportedFormats","Util","getSupportedFormats","isSuperMapiServer","uriComponent","parts","encoded","encodeURIComponent","encodeSuperMapURI","getTileUrl","_roots","upAxis","i3sInfo","onTileError","status","workerConn","getId","shift","_onMeshCreated","_getMeshSize","onTileLoad","_addTileToCache","capabilities","layers","_parseI3SSceneLayer","errorUrl","message","isNoContentHttpCode","_addErrorToCache","getShadowMeshes","loadTime","now","createContext","glOptions","preserveDrawingBuffer","antialias","inGroup","_createGLContext","createREGL","optionalExtensions","prepareWorker","_resumeHighlights","spatialReference","coordType","getSpatialReference","destroy","clearCanvas","getStencilValue","force","_preRetireTime","Date","aborted","names","tileId","batch","bin","_i3sRequests","callbacks","Ajax","json","i3sVersion","nodePages","endsWith","lastSlash","regulateURL","parseI3SJSON","serviceHighs","cancelHighlight","items","serviceShowOnlys","_getCoordProjection","unproject","_lngLatToIdentityCoord","_identityCoordToLngLat","_centerProjection","SpatialReference","getProjectionInstance","getMatrix3Column","distanceToCamera","halfAxes","cameraPosition","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","normal","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","plane","extentToBBOX","BBOXUtil","maxGPUMemory","retireInterval","loadingLimitOnInteracting","debug","meshLimitPerFrame","i3sNodepageLimitPerFrame","enableI3SCompressedGeometry","forceI3SCompressedGeometry","onlyCacheNoContentTileWhenError","pickingPoint","geometryEvents","alwaysShowTopTiles","forceRenderOnZooming","forceRenderOnRotating","forceRenderOnMoving","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","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","mask","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","ecefTransform","_updateRootCenter","_isTileInMasks","bboxIntersect","bboxInMask","_isTileInFrustum","maximumScreenSpaceError","_getScreenSpaceError","_error","_getRootNode","_createRegionBox","_createBBox","_createSphere","intersectsOrientedBox","intersectsSphere","ws","en","minHeight","maxHeight","ws_coord","en_coord","convertRegionToBox","pointWS","pointEN","_bboxCenter","isIdentityMatrix","pos","pointAtResToCoord","_generateOBBox","_calBoxCenter","_createHalfAxes","modelMatrix","column3Row0","column3Row1","column3Row2","column0Row3","column1Row3","column2Row3","column3Row3","fillColumnMajorMatrix4","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,17,18]}
1
+ {"version":3,"file":"maptalks.3dtiles.es.js","sources":["../../../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","../src/layer/Geo3DTilesWorkerConnection.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.0/node_modules/@maptalks/function-type/index.js","../src/layer/renderer/TileMeshPainter.js","../../gl/dist/transcoders.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":["'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","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","import { GLTFLoader } from '@maptalks/gltf-loader';\r\nimport { mat4, quat } from 'gl-matrix';\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/*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 || parameters.property !== undefined;\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 (a !== undefined) return a;\r\n if (b !== undefined) return b;\r\n if (c !== undefined) 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 = parameters.base !== undefined ? 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 value === null || value === undefined || value === '' || isNaN(value) ? parameters.default : value;\r\n }\r\n\r\n // 如果 input 存在且大于0,则处理表达式\r\n if (input !== undefined && input !== null && 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 pntsVert from './glsl/pnts.vert';\r\nimport pntsFrag from './glsl/pnts.frag';\r\nimport { isFunction, isNil, extend, setColumn3, flatArr, isNumber, normalizeColor } 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, getTextureWrap, getMaterialType, getMaterialFormat, getPrimitive, getUniqueREGLBuffer } = 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, leafs, 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 meshes = [];\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 mesh[ii].properties.hlBloomMesh.properties.polygonOffset = polygonOffset;\r\n meshes.push(mesh[ii].properties.hlBloomMesh);\r\n }\r\n meshes.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 = !!leafs[node.id];\r\n // GroupGLLayer中,stencil默认值为0xFF,与GroupGLLayer保持一致\r\n mesh[ii].properties.selectionDepth = 255 - tiles[i].selectionDepth;\r\n mesh[ii].properties.polygonOffset = polygonOffset;\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 (!leafs[node.id]) {\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, meshes, i3dmMeshes);\r\n drawCount += this._callShader(this._standardShader, uniforms, [filter, StandardFilter, khrExludeFilter], renderTarget, parentMeshes, meshes, 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, meshes, 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: meshes\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['colorMask'] = colorOn;\r\n const fbo = renderTarget && renderTarget.fbo;\r\n let drawCount = 0;\r\n\r\n const sceneMeshes = [];\r\n for (let i = 0; i < meshes.length; i++) {\r\n const { isLeaf, selectionDepth } = meshes[i].properties;\r\n if (isLeaf && selectionDepth === 255) {\r\n // 独立的叶子节点\r\n if (uniforms.stencilEnable) {\r\n // 清除stencil,避免上一次分支绘制的stencil影响本次绘制\r\n this._clearStencil(fbo);\r\n // sceneMeshes中是某个分支下的非独立叶子节点 + 父亲节点\r\n // 这种情况一般出现在某个分支的子节点不满足要求(没有下载下来或者error不符合设定),需要将父亲节点与子节点一起绘制\r\n // 绘制分支下的非独立节点需要开启stencil,先绘制叶子节点,再绘制父亲节点,保证父节点的绘制不会覆盖掉子节点\r\n this._modelScene.setMeshes(sceneMeshes);\r\n drawCount += this._renderer.render(shader, uniforms, this._modelScene, fbo);\r\n sceneMeshes.length = 0;\r\n uniforms.stencilEnable = false;\r\n }\r\n sceneMeshes.push(meshes[i]);\r\n } else {\r\n // 某个分支下的非独立节点\r\n if (!uniforms.stencilEnable) {\r\n // sceneMeshes中都是独立节点\r\n // 关闭stencil直接绘制\r\n this._modelScene.setMeshes(sceneMeshes);\r\n drawCount += this._renderer.render(shader, uniforms, this._modelScene, fbo);\r\n sceneMeshes.length = 0;\r\n uniforms.stencilEnable = true;\r\n }\r\n sceneMeshes.push(meshes[i]);\r\n }\r\n if (i === meshes.length - 1) {\r\n if (uniforms.stencilEnable) {\r\n this._clearStencil(fbo);\r\n }\r\n this._modelScene.setMeshes(sceneMeshes);\r\n drawCount += this._renderer.render(shader, uniforms, this._modelScene, fbo);\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._modelScene.setMeshes(meshes);\r\n // drawCount += this._renderer.render(shader, uniforms, this._modelScene, renderTarget && renderTarget.fbo);\r\n\r\n\r\n // uniforms['stencilEnable'] = true;\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 _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 }),\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 defines['HAS_LAYER_OPACITY'] = 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 // 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 attrs = {};\r\n for (const p in attributes) {\r\n const buffer = getUniqueREGLBuffer(this._regl, attributes[p], { dimension: attributes[p].itemSize });\r\n // 优先采用 attributeSemantics中定义的属性\r\n const name = attributeSemantics[p] || p;\r\n attrs[name] = { buffer };\r\n if (attributes[p].quantization) {\r\n attrs[name].quantization = attributes[p].quantization;\r\n }\r\n if (name === attributeSemantics['POSITION']) {\r\n attrs[name].array = attributes[p].array;\r\n attrs[name].min = attributes[p].min;\r\n attrs[name].max = attributes[p].max;\r\n }\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 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 range: [0, 1],\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: this._standardShader.vert,\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: true/*,\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 opFront: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n },\r\n opBack: {\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 range: [0, 1],\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 return {\r\n projViewMatrix : map.projViewMatrix,\r\n pointOpacity,\r\n lightDir: vec3.normalize(LIGHT_DIR, lightDir)\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 const inGroup = renderer.canvas.gl && renderer.canvas.gl.wrap;\r\n const layerOpacity = inGroup ? (layer.options.opacity || 0) : 1;\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 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","/*!\n * @maptalks/gl v0.102.1\n * LICENSE : UNLICENSED\n * (c) 2016-2024 maptalks.com\n */\nconst n = function() {\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}, o = n(), e = o.gl_trans__coders = o.gl_trans__coders || {};\n\nfunction _(n) {\n return e[n];\n}\n\nfunction t(n, o) {\n e[n] = o;\n}\n\ne.inject = function(e) {\n const _ = e.toString(), t = _.indexOf(\"{\") + 1, r = _.substring(0, t), l = o.gl_trans__coders = o.gl_trans__coders || {};\n let s = `${r}\\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\" + _.substring(r.length), s;\n}, e.registerTranscoder = t, e.getTranscoder = _;\n\nexport { e as default, _ as getTranscoder, t as registerTranscoder };\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 } from '@maptalks/gl';\r\nimport { Ajax } from '@maptalks/gltf-loader';\r\nimport { createREGL, 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 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(maptalks.renderer.CanvasRenderer) {\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, leaves, requests } = this._selectTiles(root, tiles);\r\n\r\n if (requests.length) {\r\n this.loadTiles(requests);\r\n }\r\n this._drawTiles(selectedTiles, leaves, 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 let selectedTiles = [], leaves = {};\r\n if (hit) {\r\n ({ selectedTiles, leaves } = this._sortTiles(root));\r\n }\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 leaves\r\n };\r\n }\r\n\r\n //based on Cesium's traverseAndSelect in Cesium3DTilesetTraversal.js\r\n _sortTiles(root) {\r\n const selectedTiles = [], leaves = {};\r\n let lastAncestor;\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 leaves[waitingTile.node.id] = 1;\r\n }\r\n selectedTiles.push(waitingTile);\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 leaves[tile.node.id] = 1;\r\n tile.selectionDepth = parentStack.length;\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 leaves[tile.node.id] = 1;\r\n selectedTiles.push(tile);\r\n continue;\r\n }\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, leaves };\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, leaves, 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, leaves };\r\n this.onDrawTileStart(context);\r\n const count = this.painter.paint(tiles, leaves, 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.gl || this.gl);\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.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 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 _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 createContext() {\r\n const layer = this.layer;\r\n const attributes = layer.options.glOptions || {\r\n alpha: true,\r\n depth: true,\r\n stencil: true,\r\n preserveDrawingBuffer: true,\r\n antialias: layer.options.antialias,\r\n };\r\n const inGroup = this.canvas.gl && this.canvas.gl.wrap;\r\n if (inGroup) {\r\n this.gl = this.canvas.gl.wrap();\r\n this.regl = this.canvas.gl.regl;\r\n } else {\r\n this.glOptions = attributes;\r\n this.gl = this._createGLContext(this.canvas, attributes);\r\n }\r\n this.regl = this.regl || createREGL({\r\n gl: this.gl,\r\n attributes,\r\n extensions: [\r\n 'OES_element_index_uint'\r\n ],\r\n optionalExtensions: layer.options['optionalExtensions'] || []\r\n });\r\n this.prepareWorker();\r\n if (inGroup) {\r\n this.canvas.pickingFBO = this.canvas.pickingFBO || this.regl.framebuffer(this.canvas.width, this.canvas.height);\r\n }\r\n this.pickingFBO = this.canvas.pickingFBO || this.regl.framebuffer(this.canvas.width, this.canvas.height);\r\n this.painter = new TileMeshPainter(this.regl, layer);\r\n\r\n this.layer._resumeHighlights();\r\n this.layer.fire('contextcreate', { regl: this.regl });\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));\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 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 clearCanvas() {\r\n if (this.regl) {\r\n this.regl.clear({\r\n color: [0, 0, 0, 0],\r\n depth: 1,\r\n stencil: 0\r\n });\r\n }\r\n\r\n super.clearCanvas();\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 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 { Ajax, GLTFLoader } from '@maptalks/gltf-loader';\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\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 { Ajax, GLTFLoader } from '@maptalks/gltf-loader';\r\nimport { readFeatureTableBatchTable, readBatchId, convertQuantizedPosition } from '../common/TileHelper.js';\r\nimport { stringFromUTF8Array } from '../common/Util.js';\r\nimport getTranscoders from './transcoders.js';\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 { Ajax } from '@maptalks/gltf-loader';\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\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 { Ajax, GLTFLoader } from '@maptalks/gltf-loader';\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\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';\r\nimport * as maptalksgl from '@maptalks/gl';\r\n\r\nimport chunk from './worker.js';\r\n\r\nif (maptalksgl.transcoders) {\r\n const version = maptalks.Map.VERSION;\r\n if (version.indexOf(\"1.0.0-beta\") >= 0 || version.indexOf(\"1.0.0-alpha\") >= 0) {\r\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\r\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', transcoderInjected);\r\n } else {\r\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', function () {\r\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\r\n return transcoderInjected;\r\n });\r\n }\r\n\r\n} else {\r\n maptalks.registerWorkerAdapter('@maptalks/3dtiles', chunk);\r\n}\r\n\r\nexport * from '../src/layer/index';\r\n"],"names":["isArrayish","obj","Array","isArray","length","splice","Function","Object","getOwnPropertyDescriptor","constructor","name","concat","prototype","slice","swizzle","simpleSwizzleModule","exports","args","results","i","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","Math","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","x","y","currentClosestDistance","Infinity","distance","pow","z","t1","t2","t3","smin","lmin","hi","floor","f","p","q","t","sl","vmin","n","wh","bl","ratio","m","y2","x2","z2","atan2","PI","sqrt","hr","cos","sin","ansi","color","mult","rem","colorString","split","map","char","join","integer","hue","chroma","mg","pure","w","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","out","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","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","iterateMesh","gltf","scenes","i0","l0","nodes","matrices","iterateNode","TMAT","RMAT","SMAT","EMPTY_T","EMTPY_Q","quat","identity","EMPTY_S","nodeMatrices","matrix","rotation","translation","scale","tm","mat4","fromTranslation","rm","fromQuat","sm","fromScaling","multiply","children","mesh","meshIndex","meshes","mat","primitives","primitive","getItemAtBufferData","byteOffset","byteStride","stride","componentType","itemSize","arrayBuffer","ctor","GLTFLoader","getTypedArrayCtor","BYTES_PER_ELEMENT","set","uint8Arr","setInstanceData","row","scratchN","scratchK","wgs84RadiiSquared","radianToCartesian3","longitude","latitude","radiiSquared","cosLatitude","normalizeCartesian","vec3","gamma","dot","cartesian","scalar","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","abs","EPSILON12","scaleToGeodeticSurface","mul","sub","asin","geodeticSurfaceNormal","origin","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","Float32Array","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","equals","copy","mathSign","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","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","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","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","leafs","boxMeshes","parentContext","renderTarget","filter","sceneFilter","uniforms","_getUniformValues","projViewMatrix","oneMeshArray","parentMeshes","pntsMeshes","i3dmMeshes","_getMesh","service","_getNodeService","_rootIdx","debugNodes","heightOffset","coordOffset","id","polygonOffset","isValid","properties","_updateMeshLocalTransform","_originLocalTransform","localTransform","_node","getBoundingBox","intersectsBox","batchIdMap","geometry","rootIdx","_highlighted","HighlightUtil","highlightMesh","_highlightTimestamp","showOnly","_showOnlys","_showOnlyTimeStamp","bloom","hlBloomMesh","depthFunc","isLeaf","selectionDepth","_updateMaskDefines","_updateServiceMatrix","drawCount","khrExludeFilter","getExcludeFilter","ContextUtil","setIncludeUniformValues","_callShader","_phongShader","_standardShader","forEachShader","shader","shaderFilter","uniformSemantics","setMeshes","pntsUniforms","_getPntsUniforms","render","_pntsShader","fbo","b3dmMeshes","_edgeShader","prepareRender","context","_prepareShaders","states","includesChanged","dispose","_createShaders","stencilEnable","sceneMeshes","_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","scaling","getScaling","tileScalingMat4","tileTransform","_getI3DMTileTransform","projScale","_getProjScale","distScale","_getDistanceScale","distToProjScale","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","_getGLTFMeshDefines","_setWEB3DDecodeUniforms","attributes","nodeMatrix","setPositionMatrix","trimGLTFWeakResources","_callback","coordOffsetMatrix","_computeCoordOffsetMatrix","_getCenterTranslation","createB3DMMesh","maxPrjExtent","maxExtent","extent","Extent","convertTo","_pointToPrj","xmin","ymin","xmax","ymax","extensions","center","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","getTranslation","prjCoord","project","fromENU","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","invert","mat3","fromMat4","basisTo2D","getProjection","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","khrMesh","_createTechniqueMesh","fillEmptyDataInMissingAttribute","_createGeometry","materialInfo","_createMaterial","alphaTest","ambientLight","environmentExposure","lights","getLightManager","mapAmbient","getAmbientLight","ambientValue","_nodeId","baseColorFactor","gltfGeo","useWebGL2","createMesh","attributeSemantics","color0Name","attrs","quantization","uv1Attribute","tangentAttribute","mode","featureIds","indiceIndex","generateFeatureIndiceIndex","excludeElementsInVAO","_prjToPoint","serviceTransform","_getServiceTransform","zoomScale","distanceToPointAtRes","viewport","modelNormalMatrix","projViewModelMatrix","MeshShader","vert","pntsVert","frag","_","props","extraCommandProps","blend","enable","dst","equation","depth","range","uniformDeclares","fillIncludes","PhongShader","StandardShader","EdgeShader","srcRGB","srcAlpha","dstRGB","dstAlpha","FBORayPicking","PICKING_MODE","ENABLE_PICKING","HAS_PICKING_ID","_pntsPicking","cull","cmp","ref","meshProperties","opFront","fail","zfail","zpass","opBack","lightManager","lightDir","getDirectionalLight","direction","iblTexes","dfgLUT","maskUniforms","getMaskUniforms","minAltitude","altitude","layerOpacity","gl","czm_lightDirectionEC","lightSpecular","viewMatrix","projMatrix","outSize","polygonOpacity","materialIndex","baseColorTexture","pbrMetallicRoughness","texInfo","textures","_getTexture","normalTexture","normalMapFactor","occlusionTexture","occlusionFactor","strength","emissiveTexture","emissiveFactor","vec4","getREGLTexture","metallicFactor","roughnessFactor","metallicRoughnessTexture","s3mMaterial","ambientColor","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","global","o","e","gl_trans__coders","fillNodepagesToCache","nodeCache","inject","registerTranscoder","getTranscoder","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","box","halfSize","directionsMatrix","fromCenterHalfSizeQuaternion","metersPerPixel","span","lodThreshold","lodSelectionMetricType","lodIndex","metricType","maxError","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","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","CanvasRenderer","tileCache","tilesLoading","_requests","_modelQueue","_fetchI3DNodepages","getAnalysisMeshes","painter","paintedMeshes","needToRedraw","isInteracting","_timestamp","drawOnInteracting","event","timestamp","draw","mask2DExtent","prepareCanvas","intersects","canvasExtent2D","completeRender","getTiles","_consumeI3SQueue","_consumeModelQueue","selectedTiles","leaves","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","leave","treeNode","maxLevel","_level","child","_createCandidate","nodeId","onDrawTileStart","fire","onDrawTileEnd","renderCount","binary","_loadTileContent","isI3STileset","_i3sNodeCache","tileset","onTilesetLoad","supportedFormats","_supportedFormats","Util","getSupportedFormats","isSuperMapiServer","uriComponent","parts","encoded","encodeURIComponent","encodeSuperMapURI","getTileUrl","_roots","upAxis","i3sInfo","onTileError","status","workerConn","getId","shift","_onMeshCreated","_getMeshSize","onTileLoad","_addTileToCache","capabilities","layers","_parseI3SSceneLayer","errorUrl","message","isNoContentHttpCode","_addErrorToCache","getShadowMeshes","loadTime","now","createContext","glOptions","preserveDrawingBuffer","antialias","inGroup","_createGLContext","createREGL","optionalExtensions","prepareWorker","_resumeHighlights","spatialReference","coordType","getSpatialReference","destroy","clearCanvas","getStencilValue","force","_preRetireTime","Date","aborted","names","tileId","batch","bin","_i3sRequests","callbacks","Ajax","json","i3sVersion","nodePages","endsWith","lastSlash","regulateURL","parseI3SJSON","serviceHighs","cancelHighlight","items","serviceShowOnlys","_getCoordProjection","unproject","_lngLatToIdentityCoord","_identityCoordToLngLat","_centerProjection","SpatialReference","getProjectionInstance","getMatrix3Column","distanceToCamera","halfAxes","cameraPosition","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","normal","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","plane","extentToBBOX","BBOXUtil","maxGPUMemory","retireInterval","loadingLimitOnInteracting","debug","meshLimitPerFrame","i3sNodepageLimitPerFrame","enableI3SCompressedGeometry","forceI3SCompressedGeometry","onlyCacheNoContentTileWhenError","pickingPoint","geometryEvents","alwaysShowTopTiles","forceRenderOnZooming","forceRenderOnRotating","forceRenderOnMoving","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","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","mask","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","ecefTransform","_updateRootCenter","_isTileInMasks","bboxIntersect","bboxInMask","_isTileInFrustum","maximumScreenSpaceError","_getScreenSpaceError","_error","_getRootNode","_createRegionBox","_createBBox","_createSphere","intersectsOrientedBox","intersectsSphere","ws","en","minHeight","maxHeight","ws_coord","en_coord","convertRegionToBox","pointWS","pointEN","_bboxCenter","isIdentityMatrix","pos","pointAtResToCoord","_generateOBBox","_calBoxCenter","_createHalfAxes","modelMatrix","column3Row0","column3Row1","column3Row2","column0Row3","column1Row3","column2Row3","column3Row3","fillColumnMajorMatrix4","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,17,18]}