@maptalks/vt 0.95.0 → 0.96.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/maptalks.vt.d.ts +955 -0
- package/dist/maptalks.vt.es.js +8922 -8816
- package/dist/maptalks.vt.es.js.map +1 -0
- package/dist/maptalks.vt.js +12477 -11536
- package/dist/maptalks.vt.js.map +1 -0
- package/package.json +39 -37
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maptalks.vt.es.js","sources":["../src/common/Util.js","../src/layer/layer/Compress.js","../src/worker/util/Ajax.js","../src/layer/renderer/worker/WorkerConnection.js","../src/layer/core/Constant.js","../src/layer/renderer/utils/DebugPainter.js","../src/layer/renderer/stencil/TileStencilRenderer.js","../src/common/Constant.js","../src/layer/renderer/utils/convert_to_painter_features.js","../src/layer/plugins/Util.js","../src/layer/renderer/VectorTileLayerRenderer.js","../src/layer/layer/VectorTileLayer.ts","../src/layer/vector/Vector3DLayer.ts","../src/layer/plugins/PainterPlugin.js","../src/layer/plugins/painters/util/is_obj_empty.js","../src/layer/plugins/painters/util/fn_type_util.js","../../../node_modules/.pnpm/@mapbox+point-geometry@0.1.0/node_modules/@mapbox/point-geometry/index.js","../src/layer/plugins/painters/util/projection.js","../src/layer/plugins/painters/util/line_offset.js","../src/layer/plugins/painters/Painter.js","../src/layer/plugins/painters/BasicPainter.js","../src/layer/plugins/painters/util/atlas_util.js","../src/layer/plugins/painters/FillPainter.js","../src/layer/plugins/painters/LinePainter.js","../src/layer/plugins/painters/LineGradientPainter.js","../src/layer/plugins/painters/CollisionGroup.js","../src/layer/plugins/painters/CollisionPainter.js","../src/layer/plugins/painters/util/box_util.js","../src/layer/plugins/painters/Constant.js","../src/layer/plugins/painters/util/get_icon_box.js","../src/layer/plugins/painters/util/get_label_box.js","../src/layer/plugins/painters/util/create_text_painter.js","../src/layer/plugins/painters/util/get_label_content.js","../src/layer/plugins/painters/util/create_marker_painter.js","../src/layer/plugins/painters/IconPainter.js","../src/layer/plugins/painters/util/get_char_offset.js","../src/layer/plugins/painters/util/get_label_normal.js","../src/layer/plugins/painters/TextPainter.js","../src/layer/plugins/painters/NativePointPainter.js","../src/layer/plugins/painters/NativelinePainter.js","../src/layer/plugins/painters/MeshPainter.js","../src/layer/plugins/painters/PhongPainter.js","../src/layer/plugins/painters/WireframePainter.js","../src/layer/plugins/painters/pbr/StandardPainter.js","../src/layer/plugins/painters/TubePainter.js","../src/layer/plugins/painters/GLTFMixin.js","../src/layer/plugins/painters/GLTFPhongPainter.js","../src/layer/plugins/painters/GLTFStandardPainter.js","../src/layer/plugins/painters/WaterPainter.js","../src/layer/plugins/index.js","../src/layer/plugins/painters/HeatmapPainter.js","../src/layer/layer/MapboxVectorTileLayer.ts","../src/layer/layer/GeojsonVectorTileLayer.ts","../src/layer/vector/util/symbols.js","../src/layer/vector/util/convert_to_feature.js","../src/layer/vector/Vector3DLayerRenderer.js","../src/layer/vector/util/from_json.js","../src/layer/vector/PointLayer.ts","../src/layer/vector/LineStringLayer.ts","../src/layer/vector/PolygonLayer.ts","../src/worker/builder/Common.js","../src/worker/builder/projection.js","../src/worker/builder/UV.js","../src/worker/builder/Extrusion.js","../src/worker/builder/build_3d_extrusion.js","../../../node_modules/.pnpm/tinyqueue@2.0.3/node_modules/tinyqueue/index.js","../../../node_modules/.pnpm/point-in-polygon@1.1.0/node_modules/point-in-polygon/index.js","../../../node_modules/.pnpm/point-in-polygon@1.1.0/node_modules/point-in-polygon/flat.js","../../../node_modules/.pnpm/point-in-polygon@1.1.0/node_modules/point-in-polygon/nested.js","../../../node_modules/.pnpm/robust-predicates@2.0.4/node_modules/robust-predicates/esm/util.js","../../../node_modules/.pnpm/robust-predicates@2.0.4/node_modules/robust-predicates/esm/orient2d.js","../src/worker/builder/concaveman.js","../src/worker/builder/ombb.js","../src/layer/vector/ExtrudePolygonLayer.ts","../src/layer/index.ts","../build/index.js"],"sourcesContent":["import { isFunctionDefinition } from '@maptalks/function-type';\r\n\r\n\r\nlet id = 0;\r\nexport function uid() {\r\n return id++;\r\n}\r\n\r\nconst supportAssign = typeof Object.assign === 'function';\r\n\r\n/**\r\n * Merges the properties of sources into destination object.\r\n * @param {Object} dest - object to extend\r\n * @param {...Object} src - sources\r\n * @return {Object}\r\n * @memberOf Util\r\n */\r\nexport function extend(dest, ...source) { // (Object[, Object, ...]) ->\r\n if (supportAssign) {\r\n Object.assign(dest, ...source);\r\n return dest;\r\n }\r\n for (let i = 0; i < source.length; i++) {\r\n const src = source[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\n\r\n/**\r\n * Check whether the object is a string\r\n * @param {Object} obj\r\n * @return {Boolean}\r\n * @memberOf Util\r\n */\r\nexport function isString(obj) {\r\n if (isNil(obj)) {\r\n return false;\r\n }\r\n return typeof obj === 'string' || (obj.constructor !== null && obj.constructor === String);\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\n/**\r\n * Check whether the object is a function\r\n * @param {Object} obj\r\n * @return {Boolean}\r\n * @memberOf Util\r\n */\r\nexport function isFunction(obj) {\r\n if (isNil(obj)) {\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 !Array.isArray(obj) && typeof obj === 'object' && !!obj;\r\n}\r\n\r\nexport function isNil(obj) {\r\n return obj == null;\r\n}\r\n\r\n//push elements in source to target\r\n//faster than target.concat(source)\r\n//https://jsperf.com/array-concat-vs-push-2/16\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\nexport function asyncAll(array, fn, callback) {\r\n if (!array.length) { callback(null, []); }\r\n let remaining = array.length;\r\n const results = new Array(array.length);\r\n let error = null;\r\n array.forEach((item, i) => {\r\n fn(item, (err, result) => {\r\n if (err) error = err;\r\n results[i] = result;\r\n if (--remaining === 0) callback(error, results);\r\n });\r\n });\r\n}\r\n\r\nexport function toJSON(params) {\r\n const r = {};\r\n for (const p in params) {\r\n if (params[p] === undefined || params[p] === null) {\r\n continue;\r\n }\r\n if (params[p].toJSON) {\r\n r[p] = params[p].toJSON();\r\n } else {\r\n r[p] = params[p];\r\n }\r\n }\r\n return r;\r\n}\r\n\r\n\r\n/**\r\n * Polyfill for Math.sign\r\n * @param {Number} x\r\n * @return {Number}\r\n * @memberOf Util\r\n */\r\n/* istanbul ignore next */\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\nexport function log2(x) {\r\n if (Math.log2) {\r\n return Math.log2(x);\r\n }\r\n const v = Math.log(x) * Math.LOG2E;\r\n const rounded = Math.round(v);\r\n if (Math.abs(rounded - v) < 1E-14) {\r\n return rounded;\r\n } else {\r\n return v;\r\n }\r\n}\r\n\r\nexport function exportIndices(indices) {\r\n // return indices.length <= 256 ? new Uint8Array(indices) : indices.length <= 65536 ? new Uint16Array(indices) : new Uint32Array(indices);\r\n // Uint8Array performs badly in directx according to ANGLE\r\n return indices.length < 65536 ? new Uint16Array(indices) : new Uint32Array(indices);\r\n}\r\n\r\nexport function isFnTypeSymbol(v) {\r\n return isFunctionDefinition(v) && v.property;\r\n}\r\n\r\nexport function hasOwn(obj, prop) {\r\n return Object.prototype.hasOwnProperty.call(obj, prop);\r\n}\r\n\r\n\r\n\r\nexport function getCentiMeterScale(res, map) {\r\n let p;\r\n if (map.altitudeToPoint) {\r\n p = map.altitudeToPoint(100, res);\r\n const heightFactor = map.options['heightFactor'];\r\n if (heightFactor && heightFactor !== 1) {\r\n p /= heightFactor;\r\n }\r\n } else {\r\n p = map.distanceToPointAtRes(100, 0, res).x;\r\n }\r\n // to centimeter\r\n return p / 100 / 100;\r\n}\r\n\r\nexport function equalsArray(self, array) {\r\n if (!self || !array)\r\n return false;\r\n\r\n if (self.length != array.length)\r\n return false;\r\n\r\n for (let i = 0, l = self.length; i < l; i++) {\r\n if (self[i] !== array[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function wrap(n, min, max) {\r\n if (n === max || n === min) {\r\n return n;\r\n }\r\n const d = max - min;\r\n const w = ((n - min) % d + d) % d + min;\r\n return w;\r\n}\r\n","import deepEqual from 'fast-deep-equal';\r\nimport { extend } from '../../common/Util';\r\n\r\n//merge renderPlugin definitions\r\nexport function compress(json) {\r\n if (Array.isArray(json)) {\r\n json = {\r\n style: json,\r\n featureStyle: []\r\n };\r\n }\r\n const compressedStyle = [];\r\n const compressedFeatureStyle = [];\r\n const pluginDefs = [];\r\n visitStyle(json.style, compressedStyle, pluginDefs);\r\n visitStyle(json.featureStyle, compressedFeatureStyle, pluginDefs);\r\n const compressed = {\r\n plugins: pluginDefs,\r\n styles: {\r\n style: compressedStyle,\r\n featureStyle: compressedFeatureStyle\r\n }\r\n };\r\n if (json['$root']) {\r\n compressed['$root'] = json['$root'];\r\n }\r\n // if (json['$iconset']) {\r\n // compressed['$iconset'] = json['$iconset'];\r\n // }\r\n return compressed;\r\n}\r\n\r\nfunction visitStyle(styles, compressedStyle, pluginDefs) {\r\n for (let i = 0; i < styles.length; i++) {\r\n const style = styles[i];\r\n const target = extend({}, style);\r\n const { renderPlugin } = style;\r\n const copy = extend({}, renderPlugin);\r\n if (copy.sceneConfig && !Object.keys(copy.sceneConfig).length) {\r\n delete copy.sceneConfig;\r\n }\r\n let hit = -1;\r\n for (let ii = pluginDefs.length - 1; ii >= 0; ii--) {\r\n //一般相同plugin的style会定义在一起,因此倒序以减少循环次数\r\n if (deepEqual(copy, pluginDefs[ii])) {\r\n hit = ii;\r\n break;\r\n }\r\n }\r\n if (hit < 0) {\r\n hit = pluginDefs.length;\r\n pluginDefs.push(copy);\r\n }\r\n target.renderPlugin = hit;\r\n compressedStyle.push(target);\r\n }\r\n}\r\n\r\nexport function uncompress(json) {\r\n if (!json.plugins) {\r\n return json;\r\n }\r\n const { plugins, styles } = json;\r\n let { style, featureStyle } = styles;\r\n style = style || [];\r\n featureStyle = featureStyle || [];\r\n const targetStyle = new Array(style.length);\r\n for (let i = 0; i < style.length; i++) {\r\n targetStyle[i] = extend({}, style[i]);\r\n targetStyle[i].renderPlugin = plugins[style[i].renderPlugin];\r\n }\r\n const targetFeatureStyle = new Array(featureStyle.length);\r\n for (let i = 0; i < featureStyle.length; i++) {\r\n targetFeatureStyle[i] = extend({}, featureStyle[i]);\r\n targetFeatureStyle[i].renderPlugin = plugins[featureStyle[i].renderPlugin];\r\n }\r\n const target = {\r\n style: targetStyle,\r\n featureStyle: targetFeatureStyle\r\n };\r\n if (json['$root']) {\r\n target['$root'] = json['$root'];\r\n }\r\n // if (json['$iconset']) {\r\n // target['$iconset'] = json['$iconset'];\r\n // }\r\n return target;\r\n}\r\n","import { isFunction, uid } from '../../common/Util';\r\n\r\nconst USE_FETCH = typeof fetch === 'function' && typeof AbortController === 'function';\r\n\r\n/**\r\n * @classdesc\r\n * Ajax Utilities. It is static and should not be initiated.\r\n * @class\r\n * @static\r\n * @category core\r\n */\r\nconst Ajax = {\r\n\r\n /**\r\n * Get JSON data by jsonp\r\n * from https://gist.github.com/gf3/132080/110d1b68d7328d7bfe7e36617f7df85679a08968\r\n * @param {String} url - resource url\r\n * @param {Function} cb - callback function when completed\r\n */\r\n jsonp: function (url, callback) {\r\n // INIT\r\n const name = '_maptalks_jsonp_' + uid();\r\n if (url.match(/\\?/)) url += '&callback=' + name;\r\n else url += '?callback=' + name;\r\n\r\n // Create script\r\n let script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = url;\r\n\r\n // Setup handler\r\n window[name] = function (data) {\r\n callback(null, data);\r\n document.getElementsByTagName('head')[0].removeChild(script);\r\n script = null;\r\n delete window[name];\r\n };\r\n\r\n // Load JSON\r\n document.getElementsByTagName('head')[0].appendChild(script);\r\n return this;\r\n },\r\n\r\n /**\r\n * Fetch remote resource by HTTP \"GET\" method\r\n * @param {String} url - resource url\r\n * @param {Object} [options=null] - request options\r\n * @param {Object} [options.headers=null] - HTTP headers\r\n * @param {String} [options.responseType=null] - responseType\r\n * @param {String} [options.credentials=null] - if with credentials, set it to \"include\"\r\n * @param {Function} cb - callback function when completed\r\n * @return {Ajax} Ajax\r\n * @example\r\n * maptalks.Ajax.get(\r\n * 'url/to/resource',\r\n * (err, data) => {\r\n * if (err) {\r\n * throw new Error(err);\r\n * }\r\n * // do things with data\r\n * }\r\n * );\r\n */\r\n get: function (url, options, cb) {\r\n if (isFunction(options)) {\r\n const t = cb;\r\n cb = options;\r\n options = t;\r\n }\r\n options = options || {};\r\n if (options.method) {\r\n options.method = options.method.toUpperCase();\r\n }\r\n const isPost = options.method === 'POST';\r\n if (!USE_FETCH) {\r\n const client = Ajax._getClient(cb);\r\n client.open(options.method || 'GET', url, true);\r\n if (options) {\r\n for (const k in options.headers) {\r\n client.setRequestHeader(k, options.headers[k]);\r\n }\r\n client.withCredentials = options.credentials === 'include';\r\n if (options['responseType']) {\r\n client.responseType = options['responseType'];\r\n }\r\n }\r\n client.send(isPost ? options.body : null);\r\n return client;\r\n } else {\r\n const controller = new AbortController();\r\n const requestConfig = options;\r\n requestConfig.signal = controller.signal;\r\n requestConfig.referrerPolicy = requestConfig.referrerPolicy || 'origin';\r\n requestConfig.method = requestConfig.method || 'GET';\r\n const request = new Request(url, requestConfig);\r\n if (options['returnJSON']) {\r\n request.headers.set('Accept', 'application/json');\r\n }\r\n fetch(request).then(response => {\r\n const parsed = this._parseResponse(response, options['returnJSON'], options['responseType']);\r\n if (parsed.message) {\r\n parsed.url = url;\r\n cb(parsed);\r\n } else {\r\n parsed.then(data => {\r\n if (options.responseType === 'arraybuffer') {\r\n cb(null, {\r\n data,\r\n cacheControl: response.headers.get('Cache-Control'),\r\n expires: response.headers.get('Expires'),\r\n contentType: response.headers.get('Content-Type')\r\n });\r\n } else {\r\n cb(null, data);\r\n }\r\n }).catch(err => {\r\n if (!err.code || err.code !== DOMException.ABORT_ERR) {\r\n console.error('Fetch error:', url, err);\r\n cb(err);\r\n }\r\n });\r\n }\r\n }).catch(err => {\r\n if (!err.code || err.code !== DOMException.ABORT_ERR) {\r\n console.error('Fetch error:', url, err);\r\n cb(err);\r\n }\r\n });\r\n return controller;\r\n }\r\n },\r\n\r\n _parseResponse(response, isJSON, responseType) {\r\n if (response.status !== 200) {\r\n return {\r\n status: response.status,\r\n statusText: response.statusText,\r\n message: `incorrect http request with status code(${response.status}): ${response.statusText}`,\r\n };\r\n } else if (responseType === 'arraybuffer') {\r\n return response.arrayBuffer();\r\n } else {\r\n return isJSON ? response.json() : response.text();\r\n }\r\n },\r\n\r\n _wrapCallback: function (client, cb) {\r\n return function () {\r\n if (client.readyState === 4) {\r\n if (client.status === 200) {\r\n if (client.responseType === 'arraybuffer') {\r\n const response = client.response;\r\n if (response.byteLength === 0) {\r\n cb({\r\n status: 200,\r\n statusText: client.statusText,\r\n message: 'http status 200 returned without content.'\r\n });\r\n } else {\r\n cb(null, {\r\n data: client.response,\r\n cacheControl: client.getResponseHeader('Cache-Control'),\r\n expires: client.getResponseHeader('Expires'),\r\n contentType: client.getResponseHeader('Content-Type')\r\n });\r\n }\r\n } else {\r\n cb(null, client.responseText);\r\n }\r\n } else {\r\n cb({\r\n status: client.status,\r\n statusText: client.statusText,\r\n message: `incorrect http request with status code(${client.status}): ${client.statusText}`,\r\n });\r\n }\r\n }\r\n };\r\n },\r\n\r\n _getClient: function (cb) {\r\n /*eslint-disable no-empty, no-undef*/\r\n let client;\r\n try {\r\n client = new XMLHttpRequest();\r\n } catch (e) {\r\n try { client = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) {\r\n try { client = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {}\r\n }\r\n }\r\n client.onreadystatechange = Ajax._wrapCallback(client, cb);\r\n return client;\r\n /*eslint-enable no-empty, no-undef*/\r\n },\r\n /**\r\n * Fetch resource as arraybuffer.\r\n * @param {String} url - url\r\n * @param {Object} [options=null] - options, same as Ajax.get\r\n * @param {Function} cb - callback function when completed.\r\n * @example\r\n * maptalks.Ajax.getArrayBuffer(\r\n * 'url/to/resource.bin',\r\n * (err, data) => {\r\n * if (err) {\r\n * throw new Error(err);\r\n * }\r\n * // data is a binary array\r\n * }\r\n * );\r\n */\r\n getArrayBuffer(url, options, cb) {\r\n if (isFunction(options)) {\r\n const t = cb;\r\n cb = options;\r\n options = t;\r\n }\r\n if (!options) {\r\n options = {};\r\n }\r\n options['responseType'] = 'arraybuffer';\r\n return Ajax.get(url, options, cb);\r\n }\r\n};\r\n\r\n/**\r\n * Fetch resource as a JSON Object.\r\n * @param {String} url - json's url\r\n * @param {Object} [options=null] - optional options\r\n * @param {String} [options.jsonp=false] - fetch by jsonp, false by default\r\n * @param {Function} cb - callback function when completed.\r\n * @example\r\n * maptalks.Ajax.getJSON(\r\n * 'url/to/resource.json',\r\n * { jsonp : true },\r\n * (err, json) => {\r\n * if (err) {\r\n * throw new Error(err);\r\n * }\r\n * // json is a JSON Object\r\n * console.log(json.foo);\r\n * }\r\n * );\r\n * @static\r\n */\r\nAjax.getJSON = function (url, options, cb) {\r\n if (isFunction(options)) {\r\n const t = cb;\r\n cb = options;\r\n options = t;\r\n }\r\n const callback = function (err, resp) {\r\n const data = typeof resp === 'string' ? JSON.parse(resp) : resp || null;\r\n cb(err, data);\r\n };\r\n if (options && options['jsonp']) {\r\n return Ajax.jsonp(url, callback);\r\n }\r\n options = options || {};\r\n options['returnJSON'] = true;\r\n return Ajax.get(url, options, callback);\r\n};\r\n\r\nexport default Ajax;\r\n","import * as maptalks from 'maptalks';\r\nimport { extend, uid, toJSON } from '../../../common/Util';\r\nimport { IconRequestor, GlyphRequestor } from '@maptalks/vector-packer';\r\n\r\n// GeoJSONVectorLayer caches data in memory, should use a dedicated worker.\r\nconst dedicatedLayers = ['GeoJSONVectorTileLayer'];\r\n\r\nexport default class WorkerConnection extends maptalks.worker.Actor {\r\n\r\n constructor(workerKey, layer) {\r\n super(workerKey);\r\n const mapId = layer.getMap().id;\r\n this._layer = layer;\r\n this._mapId = mapId;\r\n this._workerLayerId = 'vt_' + uid();\r\n const type = layer.getJSONType();\r\n this._isDedicated = dedicatedLayers.indexOf(type) >= 0;\r\n this._dedicatedVTWorkers = {};\r\n this._iconRequestor = new IconRequestor({\r\n iconErrorUrl: layer.options['iconErrorUrl'],\r\n maxSize: layer.options['maxIconSize'],\r\n urlModifier: (url) => {\r\n const modifier = layer.getURLModifier();\r\n return modifier && modifier(url) || url;\r\n }\r\n });\r\n const useCharBackBuffer = !layer.getRenderer().isEnableWorkAround('win-intel-gpu-crash');\r\n this._glyphRequestor = new GlyphRequestor(fn => {\r\n layer.getMap().getRenderer().callInNextFrame(fn);\r\n }, layer.options['glyphSdfLimitPerFrame'], useCharBackBuffer);\r\n }\r\n\r\n initialize(cb) {\r\n cb(null);\r\n }\r\n\r\n addLayer(cb) {\r\n const layer = this._layer;\r\n const options = layer.getWorkerOptions() || {};\r\n const layerId = this._workerLayerId, type = layer.getJSONType();\r\n const data = {\r\n mapId: this._mapId,\r\n layerId,\r\n command: 'addLayer',\r\n params: {\r\n type: type,\r\n options: options\r\n }\r\n };\r\n if (this._isDedicated) {\r\n if (this._dedicatedVTWorkers[layerId] === undefined) {\r\n this._dedicatedVTWorkers[layerId] = this.getDedicatedWorker();\r\n }\r\n this.send(data, null, cb, this._dedicatedVTWorkers[layerId]);\r\n } else {\r\n this.broadcast(data, null, cb);\r\n }\r\n }\r\n\r\n abortTile(url, cb) {\r\n const layerId = this._workerLayerId;\r\n const data = {\r\n mapId: this._mapId,\r\n layerId,\r\n command: 'abortTile',\r\n params: {\r\n url\r\n }\r\n };\r\n if (this._isDedicated) {\r\n if (this._dedicatedVTWorkers[layerId] === undefined) {\r\n this._dedicatedVTWorkers[layerId] = this.getDedicatedWorker();\r\n }\r\n this.send(data, null, cb, this._dedicatedVTWorkers[layerId]);\r\n } else {\r\n this.broadcast(data, null, cb);\r\n }\r\n }\r\n\r\n removeLayer(cb) {\r\n const layerId = this._workerLayerId;\r\n const data = {\r\n mapId: this._mapId,\r\n layerId,\r\n command: 'removeLayer'\r\n };\r\n if (this._isDedicated) {\r\n if (this._dedicatedVTWorkers[layerId] !== undefined) {\r\n this.send(data, null, cb, this._dedicatedVTWorkers[layerId]);\r\n }\r\n delete this._dedicatedVTWorkers[layerId];\r\n } else {\r\n this.broadcast(data, null, cb);\r\n }\r\n }\r\n\r\n updateStyle(style, cb) {\r\n const layerId = this._workerLayerId;\r\n const data = {\r\n mapId: this._mapId,\r\n layerId,\r\n command: 'updateStyle',\r\n params: style\r\n };\r\n if (this._isDedicated) {\r\n if (this._dedicatedVTWorkers[layerId] !== undefined) {\r\n this.send(data, null, cb, this._dedicatedVTWorkers[layerId]);\r\n }\r\n } else {\r\n this.broadcast(data, null, cb);\r\n }\r\n }\r\n\r\n updateOptions(options, cb) {\r\n const layerId = this._workerLayerId;\r\n const data = {\r\n mapId: this._mapId,\r\n layerId,\r\n command: 'updateOptions',\r\n params: options\r\n };\r\n if (this._isDedicated) {\r\n if (this._dedicatedVTWorkers[layerId] !== undefined) {\r\n this.send(data, null, cb, this._dedicatedVTWorkers[layerId]);\r\n }\r\n } else {\r\n this.broadcast(data, null, cb);\r\n }\r\n }\r\n\r\n //send(layerId, command, data, buffers, callback, workerId)\r\n loadTile(context, cb) {\r\n const params = extend({}, context);\r\n params.tileInfo = toJSON(context.tileInfo);\r\n const layerId = this._workerLayerId;\r\n const data = {\r\n mapId: this._mapId,\r\n layerId,\r\n command: 'loadTile',\r\n params\r\n };\r\n const { x, y } = context.tileInfo;\r\n const length = this.workers.length;\r\n const s = (x + y) % length;\r\n this.send(data, null, cb, this._dedicatedVTWorkers[layerId] === undefined ? this.workers[s].id : this._dedicatedVTWorkers[layerId]);\r\n }\r\n\r\n remove() {\r\n super.remove();\r\n this._dedicatedVTWorkers = {};\r\n }\r\n\r\n fetchIconGlyphs({ icons, glyphs }, cb) {\r\n //error, data, buffers\r\n this._glyphRequestor.getGlyphs(glyphs, (err, glyphData) => {\r\n if (err) {\r\n throw err;\r\n }\r\n const dataBuffers = glyphData.buffers || [];\r\n this._iconRequestor.getIcons(icons, (err, data) => {\r\n if (err) {\r\n throw err;\r\n }\r\n if (data.buffers && data.buffers.length) {\r\n dataBuffers.push(...data.buffers);\r\n }\r\n cb(null, { icons: data.icons, glyphs: glyphData.glyphs }, dataBuffers);\r\n });\r\n });\r\n\r\n //error, data, buffers\r\n\r\n }\r\n\r\n setData(geojson, cb) {\r\n const layerId = this._workerLayerId;\r\n const data = {\r\n mapId: this._mapId,\r\n layerId,\r\n command: 'setData',\r\n params: {\r\n data: geojson\r\n }\r\n };\r\n this.send(data, null, cb, this._dedicatedVTWorkers[layerId]);\r\n }\r\n\r\n _getTileKey(tileInfo) {\r\n return tileInfo.id;\r\n }\r\n}\r\n","export const EMPTY_VECTOR_TILE = {};\r\n\r\nexport const ICON_PAINTER_SCENECONFIG = {\r\n collision: true,\r\n fading: false,\r\n fadingDuration: 16 * 14,\r\n fadeInDelay: 600,\r\n fadeOutDelay: 100,\r\n uniquePlacement: false,\r\n depthFunc: 'always'\r\n};\r\n","const textWidth = 512, textHeight = 64;\r\n\r\nclass DebugPainter {\r\n constructor(regl, map, color) {\r\n this._regl = regl;\r\n this._map = map;\r\n this._color = color || [0, 1, 0];\r\n }\r\n\r\n draw(debugInfo, transform, tileSize, extent, fbo) {\r\n if (!this._command) {\r\n this._init();\r\n }\r\n\r\n if (!this._data) {\r\n this._data = this._regl.buffer(getDebugData(extent));\r\n const scale = extent / tileSize;\r\n this._textData = this._regl.buffer(getTextData(extent, scale));\r\n }\r\n if (extent !== this._extent) {\r\n const scale = extent / tileSize;\r\n this._data(getDebugData(extent));\r\n this._textData(getTextData(extent, scale));\r\n }\r\n this._extent = extent;\r\n let image = this._debugInfoCanvas;\r\n if (!image) {\r\n const dpr = this._map.getDevicePixelRatio() > 1 ? 2 : 1;\r\n image = this._debugInfoCanvas = document.createElement('canvas');\r\n image.width = textWidth * dpr;\r\n image.height = textHeight * dpr;\r\n const ctx = image.getContext('2d');\r\n ctx.font = '36px monospace';\r\n ctx.scale(dpr, dpr);\r\n this._texture = this._regl.texture({\r\n width: image.width,\r\n height: image.height,\r\n data: image\r\n });\r\n }\r\n const ctx = image.getContext('2d');\r\n ctx.clearRect(0, 0, image.width, image.height);\r\n ctx.fillStyle = `rgba(${this._color.map(c => c * 255).join()})`;\r\n ctx.fillText(debugInfo, 20, 36);\r\n this._texture({\r\n width: image.width,\r\n height: image.height,\r\n data: image\r\n });\r\n this._command({\r\n transform,\r\n data: this._data,\r\n texData: this._texCoordData,\r\n debugLine: 1,\r\n primitive: 'lines',\r\n framebuffer: fbo || null,\r\n image: this._texture,\r\n count: 8\r\n });\r\n\r\n this._command({\r\n transform,\r\n data: this._textData,\r\n texData: this._texCoordData,\r\n debugLine: 0,\r\n primitive: 'triangle strip',\r\n framebuffer: fbo || null,\r\n image: this._texture,\r\n count: 4\r\n });\r\n }\r\n\r\n delete() {\r\n if (this._texture) {\r\n this._texture.destroy();\r\n delete this._texture;\r\n }\r\n if (this._texCoordData) {\r\n this._texCoordData.destroy();\r\n delete this._texCoordData;\r\n }\r\n if (this._data) {\r\n this._data.destroy();\r\n this._textData.destroy();\r\n delete this._data;\r\n delete this._textData;\r\n }\r\n if (this._command) {\r\n this._command.destroy();\r\n delete this._command;\r\n }\r\n }\r\n\r\n _init() {\r\n this._texCoordData = this._regl.buffer(new Uint8Array([\r\n 0.0, 0.0,\r\n 0.0, 1.0,\r\n 1.0, 0.0,\r\n 1.0, 1.0,\r\n //添加额外的一组数据,防止drawArrays out of index错误\r\n 0.0, 0.0,\r\n 0.0, 1.0,\r\n 1.0, 0.0,\r\n 1.0, 1.0\r\n ]));\r\n this._command = this._regl({\r\n vert: `\r\n attribute vec2 aPosition;\r\n attribute vec2 aTexCoord;\r\n uniform mat4 transform;\r\n\r\n varying vec2 vTexCoord;\r\n void main()\r\n {\r\n gl_Position = transform * vec4(aPosition, 0.0, 1.0);\r\n vTexCoord = aTexCoord;\r\n }\r\n `,\r\n frag: `\r\n precision mediump float;\r\n uniform sampler2D uImage;\r\n uniform vec3 uColor;\r\n uniform float uOpacity;\r\n uniform float uDebugLine;\r\n\r\n varying vec2 vTexCoord;\r\n\r\n void main()\r\n {\r\n if (uDebugLine == 1.) {\r\n gl_FragColor = vec4(uColor, 1.0) * uOpacity;\r\n } else {\r\n gl_FragColor = texture2D(uImage, vTexCoord) * uOpacity;\r\n }\r\n gl_FragColor *= gl_FragColor.a;\r\n }\r\n `,\r\n attributes: {\r\n aPosition: this._regl.prop('data'),\r\n aTexCoord: this._regl.prop('texData')\r\n },\r\n uniforms: {\r\n transform: this._regl.prop('transform'),\r\n uColor: this._color,\r\n uOpacity: 1,\r\n uDebugLine: this._regl.prop('debugLine'),\r\n uImage: this._regl.prop('image'),\r\n },\r\n count: this._regl.prop('count'),\r\n primitive: this._regl.prop('primitive'),\r\n depth: {\r\n enable: false,\r\n mask: false\r\n },\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 stencil: {\r\n enable: false\r\n },\r\n viewport: {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return this._map.getRenderer().canvas.width;\r\n },\r\n height: () => {\r\n return this._map.getRenderer().canvas.height;\r\n }\r\n },\r\n framebuffer: this._regl.prop('framebuffer')\r\n });\r\n }\r\n}\r\n\r\nexport default DebugPainter;\r\n\r\nfunction getDebugData(extent) {\r\n return new Uint16Array([\r\n 0, 0,\r\n 0, extent,\r\n 0, extent,\r\n extent, extent,\r\n extent, extent,\r\n extent, 0,\r\n extent, 0,\r\n 0, 0\r\n ]);\r\n}\r\n\r\nfunction getTextData(extent, scale) {\r\n return new Uint16Array([\r\n 0, extent - textHeight * scale,\r\n 0, extent,\r\n textWidth * scale, extent - textHeight * scale,\r\n textWidth * scale, extent\r\n ]);\r\n}\r\n","import { reshader, mat4, vec3 } from '@maptalks/gl';\r\n\r\nconst vertices = new Uint8Array([\r\n 0, 0,\r\n 0, 1,\r\n 1, 0,\r\n 1, 0,\r\n 0, 1,\r\n 1, 1\r\n]);\r\n\r\nconst vert = `\r\n#define SHADER_NAME TILE_STENCIL_VERT\r\nattribute vec2 aPosition;\r\nuniform mat4 projViewModelMatrix;\r\n\r\nvoid main()\r\n{\r\n gl_Position = projViewModelMatrix * vec4(aPosition, 0.0, 1.0);\r\n}\r\n`;\r\n\r\nconst frag = `\r\n#define SHADER_NAME TILE_STENCIL_FRAG\r\nvoid main()\r\n{\r\n gl_FragColor = vec4(1.0, 0.0, 0.0, 0.1);\r\n}\r\n`;\r\n\r\nconst V = [];\r\n\r\n//TODO 可以把ref值相同的tile合并在一起,一次性绘制\r\n\r\nexport default class TileStencilRenderer {\r\n constructor(regl, canvas, map) {\r\n this._regl = regl;\r\n const geometry = this._geometry = new reshader.Geometry({\r\n aPosition: vertices\r\n }, null, vertices.length / 2, { positionSize: 2 });\r\n geometry.generateBuffers(regl);\r\n this._scene = new reshader.Scene();\r\n this._meshes = [];\r\n this._counter = 0;\r\n this._canvas = canvas;\r\n this._map = map;\r\n this._init(regl);\r\n }\r\n\r\n start() {\r\n this._counter = 0;\r\n this._scene.clear();\r\n }\r\n\r\n /**\r\n * 添加一个瓦片\r\n * @param {Number} ref - stencil ref value\r\n * @param {Number} extent - vector tile extent: 4096 or 8192\r\n * @param {Number[]} transform - tile transform matrix\r\n */\r\n add(ref, EXTENT, transform) {\r\n const mesh = this._getMesh(transform);\r\n mesh.setUniform('ref', ref);\r\n vec3.set(V, EXTENT, EXTENT, 1);\r\n const matrix = mesh.localTransform;\r\n mat4.fromScaling(matrix, V);\r\n mat4.mul(matrix, transform, matrix);\r\n mesh.setLocalTransform(matrix);\r\n this._scene.addMesh(mesh);\r\n }\r\n\r\n render(fbo) {\r\n this._renderer.render(\r\n this._shader,\r\n {\r\n projViewMatrix: this._map.projViewMatrix\r\n },\r\n this._scene,\r\n fbo\r\n );\r\n }\r\n\r\n _getMesh() {\r\n const index = this._counter++;\r\n if (!this._meshes[index]) {\r\n this._meshes[index] = new reshader.Mesh(this._geometry);\r\n }\r\n return this._meshes[index];\r\n }\r\n\r\n _init(regl) {\r\n const canvas = this._canvas;\r\n const viewport = {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return canvas.width;\r\n },\r\n height: () => {\r\n return canvas.height;\r\n }\r\n };\r\n const extraCommandProps = {\r\n viewport,\r\n stencil: {\r\n enable: true,\r\n mask: 0xFF,\r\n func: {\r\n cmp: 'always',\r\n ref: (context, props) => {\r\n return props.ref;\r\n },\r\n mask: 0xFF\r\n },\r\n op: {\r\n fail: 'replace',\r\n zfail: 'replace',\r\n zpass: 'replace'\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n func: 'always',\r\n mask: false\r\n },\r\n colorMask: [false, false, false, false],\r\n };\r\n this._shader = new reshader.MeshShader({\r\n vert,\r\n frag,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n },\r\n ],\r\n extraCommandProps\r\n });\r\n this._renderer = new reshader.Renderer(regl);\r\n }\r\n\r\n remove() {\r\n this._geometry.dispose();\r\n for (let i = 0; i < this._meshes.length; i++) {\r\n this._meshes[i].dispose();\r\n }\r\n this._meshes.length = 0;\r\n this._shader.dispose();\r\n }\r\n}\r\n","export const KEY_IDX = '__fea_idx';\r\n\r\nexport const INVALID_PROJECTED_ANCHOR = -999999;\r\n\r\n// an impossible altitude to mark invalid altitude values\r\nexport const INVALID_ALTITUDE = new Float32Array([-1E12])[0];\r\n\r\nexport const PROP_OMBB = 'maptalks_ombb';\r\n","import * as maptalks from 'maptalks';\r\nimport { KEY_IDX } from '../../../common/Constant';\r\nimport { extend } from '../../../common/Util';\r\n\r\nconst KEY_IDX_NAME = (KEY_IDX + '').trim();\r\n\r\n// feaIndexes是VectorTileLayer中设置过filter时,符合条件的feature的编号,可以为null\r\nexport default function convertToPainterFeatures(features, feaIndexes, layerId, symbol, layer, copy) {\r\n const pluginFeas = {};\r\n if (hasFeature(features)) {\r\n const data = feaIndexes || features;\r\n //[feature index, style index]\r\n for (let ii = 0, ll = data.length; ii < ll; ii++) {\r\n let feature = feaIndexes ? features[feaIndexes[ii]] : features[ii];\r\n if (layer.options['features'] === 'id' && layer.getFeature) {\r\n feature = layer.getFeature(feature);\r\n feature.layer = layerId;\r\n }\r\n if (layer instanceof maptalks.TileLayer) {\r\n feature = proxyFea(feature, copy);\r\n }\r\n const keyIdxValue = feaIndexes ? feaIndexes[ii] : feature[KEY_IDX_NAME];\r\n pluginFeas[keyIdxValue] = {\r\n feature,\r\n symbol\r\n };\r\n }\r\n }\r\n return pluginFeas;\r\n}\r\n\r\nfunction hasFeature(features) {\r\n if (!features) {\r\n return false;\r\n }\r\n\r\n for (const p in features) {\r\n if (features[p] !== undefined && features[p] !== null) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport const oldPropsKey = '__original_properties';\r\nexport const externalPropsKey = '__external_properties';\r\n\r\nconst proxyGetter = {\r\n get: function(obj, prop) {\r\n return prop in obj ? obj[prop] : (obj[oldPropsKey][prop] || obj[externalPropsKey] && obj[externalPropsKey][prop]);\r\n },\r\n has: function(obj, prop) {\r\n return (prop in obj) || (prop in obj[oldPropsKey]) || obj[externalPropsKey] && (prop in obj[externalPropsKey]);\r\n }\r\n};\r\n\r\nconst EMPTY_PROPS = {};\r\n\r\nfunction proxyFea(feature, copy) {\r\n const originalProperties = feature.properties;\r\n if (originalProperties && originalProperties[oldPropsKey]) {\r\n // 已经proxy过了\r\n return feature;\r\n }\r\n if (copy) {\r\n feature = extend({}, feature);\r\n }\r\n feature.customProps = feature.customProps || {};\r\n const properties = feature.customProps;\r\n properties['$layer'] = feature.layer;\r\n properties['$type'] = feature.type;\r\n properties[oldPropsKey] = originalProperties || EMPTY_PROPS;\r\n feature.properties = new Proxy(properties, proxyGetter);\r\n return feature;\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { isFunctionDefinition } from '@maptalks/function-type';\r\nimport { Color } from '@maptalks/vector-packer';\r\n\r\n/**\r\n * Merges the properties of sources into destination object.\r\n * @param {Object} dest - object to extend\r\n * @param {...Object} src - sources\r\n * @return {Object}\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\n\r\nexport function clamp(n, min, max) {\r\n return Math.min(max, Math.max(min, n));\r\n}\r\n\r\nexport function wrap(n, min, max) {\r\n if (n === max || n === min) {\r\n return n;\r\n }\r\n const d = max - min;\r\n const w = ((n - min) % d + d) % d + min;\r\n return w;\r\n}\r\n\r\nexport function isNil(obj) {\r\n return obj === null || obj === undefined;\r\n}\r\n\r\nexport function evaluate(prop, properties, zoom) {\r\n if (maptalks.Util.isFunction(prop)) {\r\n if (zoom !== undefined) {\r\n return prop(zoom, properties);\r\n } else {\r\n return prop(null, properties);\r\n }\r\n } else {\r\n return prop;\r\n }\r\n}\r\n\r\nexport const TYPE_BYTES = {\r\n 'int8': 1,\r\n 'int16': 2,\r\n 'int32': 4,\r\n 'uint8': 1,\r\n 'uint16': 2,\r\n 'uint32': 4,\r\n 'float': 4,\r\n 'float32': 4\r\n};\r\n\r\nexport function copyJSON(json) {\r\n return JSON.parse(JSON.stringify(json));\r\n}\r\n\r\nexport function setUniformFromSymbol(uniforms, name, symbol, key, defaultValue, fn) {\r\n // if (symbol['_' + key]) {\r\n // // a function type\r\n // Object.defineProperty(uniforms, name, {\r\n // enumerable: true,\r\n // get: function () {\r\n // return fn ? fn(symbol[key]) : symbol[key];\r\n // }\r\n // });\r\n // } else {\r\n // uniforms[name] = fn ? fn(symbol[key]) : symbol[key];\r\n // }\r\n if (name in uniforms) {\r\n return;\r\n }\r\n Object.defineProperty(uniforms, name, {\r\n enumerable: true,\r\n get: function () {\r\n const v = (isNil(symbol[key]) || isFunctionDefinition(symbol[key])) ? defaultValue : symbol[key];\r\n return fn ? fn(v) : v;\r\n }\r\n });\r\n}\r\n\r\nconst ARR0 = [];\r\n// 结果存储在一个全局临时数组中,\r\nexport function toUint8ColorInGlobalVar(color) {\r\n for (let i = 0; i < color.length; i++) {\r\n ARR0[i] = color[i];\r\n ARR0[i] *= 255;\r\n }\r\n if (color.length === 3) {\r\n ARR0[3] = 255;\r\n }\r\n return ARR0;\r\n}\r\n\r\nexport function createColorSetter(cache, size = 4) {\r\n return _colorSetter.bind(this, cache, size);\r\n}\r\n\r\nfunction _colorSetter(cache, size, c) {\r\n if (Array.isArray(c)) {\r\n if (c.length === 3 && size === 4) {\r\n c.push(1);\r\n }\r\n return c;\r\n }\r\n if (cache && cache[c]) {\r\n return cache[c];\r\n }\r\n if (c.r !== undefined && c.g !== undefined && c.b !== undefined && c.a !== undefined) {\r\n const color = [c.r, c.g, c.b, c.a];\r\n return color;\r\n }\r\n const color = Color(c).unitArray();\r\n if (color.length === 3 && size === 4) {\r\n color.push(1);\r\n }\r\n if (cache) cache[c] = color;\r\n return color;\r\n}\r\n\r\nexport function fillArray(arr, value, start, end) {\r\n if (arr.fill) {\r\n arr.fill(value, start, end);\r\n } else {\r\n for (let i = start; i < end; i++) {\r\n arr[i] = value;\r\n }\r\n }\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 isIconText(symbolDef) {\r\n return symbolDef && (symbolDef.markerFile || symbolDef.markerType) && symbolDef.textName !== undefined;\r\n}\r\n\r\nexport function hasOwn(obj, prop) {\r\n return Object.prototype.hasOwnProperty.call(obj, prop);\r\n}\r\n\r\nexport function getUniqueIds(ids, isReverse) {\r\n if (isReverse) {\r\n let current = ids[ids.length - 1];\r\n const result = [current];\r\n // 倒序是因为后面的图形,碰撞时优先级更高, maptalks/issues#626\r\n for (let i = ids.length - 2; i >= 0; i--) {\r\n if (ids[i] !== current) {\r\n result.push(ids[i]);\r\n current = ids[i];\r\n }\r\n }\r\n return result;\r\n } else {\r\n let current = ids[ids[0]];\r\n const result = [current];\r\n // 倒序是因为后面的图形,碰撞时优先级更高, maptalks/issues#626\r\n for (let i = 1; i < ids.length; i++) {\r\n if (ids[i] !== current) {\r\n result.push(ids[i]);\r\n current = ids[i];\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nexport function isArray(arr) {\r\n return Array.isArray(arr) ||\r\n arr.constructor === Float32Array ||\r\n arr.constructor === Float64Array ||\r\n arr.constructor === Uint8Array ||\r\n arr.constructor === Int8Array ||\r\n arr.constructor === Uint16Array ||\r\n arr.constructor === Int16Array ||\r\n arr.constructor === Uint32Array ||\r\n arr.constructor === Int32Array ||\r\n arr.constructor === Uint8ClampedArray;\r\n}\r\n\r\nconst COORD1 = new maptalks.Coordinate(0, 0);\r\nexport function meterToPoint(map, meter, patternOrigin, res, isYAxis) {\r\n const point = map.distanceToPointAtRes(meter, meter, res, patternOrigin, COORD1);\r\n return isYAxis ? point.y : point.x;\r\n}\r\n\r\nexport function pointAtResToMeter(map, pointDistance, patternOrigin, res, isYAxis) {\r\n const distance = map.pointAtResToDistance(isYAxis ? 0 : pointDistance, isYAxis ? pointDistance : 0, res, patternOrigin);\r\n return distance;\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { mat4, vec3, createREGL, GroundPainter } from '@maptalks/gl';\r\nimport WorkerConnection from './worker/WorkerConnection';\r\nimport { EMPTY_VECTOR_TILE } from '../core/Constant';\r\nimport DebugPainter from './utils/DebugPainter';\r\nimport TileStencilRenderer from './stencil/TileStencilRenderer';\r\nimport { extend, pushIn, getCentiMeterScale, isNil } from '../../common/Util';\r\nimport { default as convertToPainterFeatures, oldPropsKey } from './utils/convert_to_painter_features';\r\nimport { isFunctionDefinition } from '@maptalks/function-type';\r\nimport { FilterUtil } from '@maptalks/vector-packer';\r\nimport { meterToPoint } from '../plugins/Util';\r\n\r\n// const DEFAULT_PLUGIN_ORDERS = ['native-point', 'native-line', 'fill'];\r\nconst EMPTY_ARRAY = [];\r\nconst CLEAR_COLOR = [0, 0, 0, 0];\r\nconst TILE_POINT = new maptalks.Point(0, 0);\r\n\r\nconst TERRAIN_CLEAR = {\r\n color: CLEAR_COLOR,\r\n depth: 1,\r\n stencil: 0\r\n};\r\n\r\nconst terrainSkinFilter = plugin => {\r\n return plugin.isTerrainSkin();\r\n}\r\n\r\nconst terrainVectorFilter = plugin => {\r\n return plugin.isTerrainVector();\r\n}\r\n\r\nclass VectorTileLayerRenderer extends maptalks.renderer.TileLayerCanvasRenderer {\r\n\r\n supportRenderMode() {\r\n return true;\r\n }\r\n\r\n constructor(layer) {\r\n super(layer);\r\n this.ready = false;\r\n this._styleCounter = 1;\r\n this._requestingMVT = {};\r\n this._plugins = {};\r\n this._featurePlugins = {};\r\n }\r\n\r\n getTileLevelValue(tileInfo, currentTileZoom) {\r\n if (!this.isBackTile(tileInfo.id)) {\r\n return 0;\r\n } else {\r\n const z = tileInfo.z;\r\n const maxChildDepth = 5;\r\n // 如果瓦片zoom比currentTileZoom大,则设为0-5之间的值,瓦片zoom越大,值越小\r\n // 如果瓦片zoom比currentTileZoom小,则设为5以上的值,越接近,值越小\r\n return (z - currentTileZoom >= 0) ? (currentTileZoom + maxChildDepth - z) : (maxChildDepth + (currentTileZoom - z));\r\n }\r\n }\r\n\r\n getWorkerConnection() {\r\n return this._workerConn;\r\n }\r\n\r\n getStyleCounter() {\r\n return this._styleCounter;\r\n }\r\n\r\n setStyle() {\r\n if (this._groundPainter) {\r\n this._groundPainter.update();\r\n }\r\n if (this._workerConn) {\r\n this._styleCounter++;\r\n this._preservePrevTiles();\r\n const style = this.layer._getComputedStyle();\r\n style.styleCounter = this._styleCounter;\r\n this._workersyncing = true;\r\n this._workerConn.updateStyle(style, err => {\r\n this._workersyncing = false;\r\n if (err) throw new Error(err);\r\n this._needRetire = true;\r\n // this.clear();\r\n // this._clearPlugin();\r\n this._initPlugins();\r\n this.setToRedraw();\r\n\r\n this.layer.fire('refreshstyle');\r\n });\r\n } else {\r\n this._initPlugins();\r\n }\r\n }\r\n\r\n // 为了解决阴影更新的闪烁问题,保留之前的绘制,当前数据载入后再删除\r\n _preservePrevTiles() {\r\n if (this._prevTilesInView) {\r\n for (const p in this._prevTilesInView) {\r\n const tile = this._prevTilesInView[p];\r\n if (tile) {\r\n this.deleteTile(tile);\r\n }\r\n }\r\n }\r\n this._prevTilesInView = this.tilesInView;\r\n const tileCache = this.tileCache;\r\n for (const p in this._prevTilesInView) {\r\n const tile = this._prevTilesInView[p];\r\n if (tile && tile.info) {\r\n tileCache.getAndRemove(tile.info.id);\r\n }\r\n }\r\n tileCache.reset();\r\n this.tilesInView = {};\r\n this.tilesLoading = {};\r\n // 如果这里不清空 requestingMVT,updateStyle后的loadTile方法中,requestingMVT中会留有上次请求的缓存,导致不会调用worker的loadTile方法请求瓦片\r\n this._requestingMVT = {};\r\n this['_parentTiles'] = [];\r\n this['_childTiles'] = [];\r\n // 让 currentTilesFirst 起作用\r\n this['_tileZoom'] = undefined;\r\n }\r\n\r\n updateOptions(conf) {\r\n if (this._workerConn) {\r\n this._workerConn.updateOptions(this.layer.getWorkerOptions(), err => {\r\n if (err) throw new Error(err);\r\n //需要重新生成瓦片的设置\r\n if (conf && (conf['features'] || conf['pickingGeometry'] || conf['altitudeProperty'])) {\r\n this.clear();\r\n this._clearPlugin();\r\n this._initPlugins();\r\n }\r\n this.setToRedraw();\r\n });\r\n }\r\n }\r\n\r\n updateSceneConfig(type, idx, sceneConfig) {\r\n const plugins = type === 0 ? this._getStylePlugins() : this._getFeaturePlugins();\r\n if (!plugins || !plugins[idx]) {\r\n return;\r\n }\r\n this._needRetire = true;\r\n const allStyles = this.layer._getComputedStyle();\r\n const styles = this.layer._getTargetStyle(type, allStyles);\r\n plugins[idx].config = styles[idx].renderPlugin;\r\n plugins[idx].updateSceneConfig({\r\n sceneConfig: sceneConfig\r\n });\r\n this.setToRedraw();\r\n }\r\n\r\n updateDataConfig(type, idx, dataConfig, old) {\r\n const plugins = type === 0 ? this._getStylePlugins() : this._getFeaturePlugins();\r\n if (!plugins || !plugins[idx]) {\r\n return;\r\n }\r\n this._needRetire = true;\r\n if (plugins[idx].updateDataConfig(dataConfig, old)) {\r\n this.setStyle();\r\n } else {\r\n this.setToRedraw();\r\n }\r\n }\r\n\r\n updateSymbol(type, idx, symbol) {\r\n const plugins = type === 0 ? this._getStylePlugins() : this._getFeaturePlugins();\r\n if (!plugins || !plugins[idx]) {\r\n return false;\r\n }\r\n const allStyles = this.layer._getComputedStyle();\r\n const styles = this.layer._getTargetStyle(type, allStyles);\r\n // const symbol = styles[idx].symbol;\r\n const plugin = plugins[idx];\r\n plugin.style = styles[idx];\r\n const needRefresh = plugin.updateSymbol(symbol, styles[idx].symbol);\r\n if (!needRefresh && needRefreshStyle(symbol)) {\r\n this.setStyle();\r\n }\r\n this.setToRedraw();\r\n return needRefresh;\r\n }\r\n\r\n //always redraw when map is interacting\r\n needToRedraw() {\r\n const redraw = super.needToRedraw();\r\n if (!redraw) {\r\n const plugins = this._getFramePlugins();\r\n for (let i = 0; i < plugins.length; i++) {\r\n if (plugins[i] && plugins[i].needToRedraw()) {\r\n return true;\r\n }\r\n\r\n }\r\n }\r\n return redraw;\r\n }\r\n\r\n needRetireFrames() {\r\n if (this._needRetire) {\r\n return true;\r\n }\r\n const plugins = this._getFramePlugins();\r\n for (let i = 0; i < plugins.length; i++) {\r\n if (plugins[i] && plugins[i].needToRetireFrames()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n isAnimating() {\r\n // maptalks/issues#712\r\n // 当highlight更新时,在当前帧(通过frametimestamp来识别)一直返回animating为true,让所有瓦片渲染时都能正确的渲染更新\r\n const mapRenderer = this.getMap().getRenderer();\r\n // 老版本核心库的mapRenderer上没有定义getFrameTimestamp\r\n const timestamp = mapRenderer.getFrameTimestamp && mapRenderer.getFrameTimestamp() || mapRenderer['_frameTimestamp'];\r\n if (this._highlightUpdated) {\r\n this._highlightFrametime = timestamp;\r\n delete this._highlightUpdated;\r\n }\r\n if (this._highlightFrametime === timestamp) {\r\n return true;\r\n }\r\n const plugins = this._getFramePlugins();\r\n for (let i = 0; i < plugins.length; i++) {\r\n if (plugins[i] && plugins[i].isAnimating()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n needToRefreshTerrainTileOnZooming() {\r\n const plugins = this._getFramePlugins();\r\n for (let i = 0; i < plugins.length; i++) {\r\n if (plugins[i] && plugins[i].needToRefreshTerrainTileOnZooming()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n _isInGroupGLLayer() {\r\n const inGroup = this.canvas && this.canvas.gl && this.canvas.gl.wrap;\r\n return !!inGroup;\r\n }\r\n\r\n createContext() {\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 const { gl, regl, attributes } = this._createREGLContext(this.canvas);\r\n this.gl = gl;\r\n this.regl = regl;\r\n this.glOptions = attributes;\r\n }\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._debugPainter = new DebugPainter(this.regl, this.getMap());\r\n this._prepareWorker();\r\n this._groundPainter = new GroundPainter(this.regl, this.layer);\r\n\r\n if (!this.consumeTile) {\r\n const version = this.getMap().VERSION;\r\n throw new Error(`Incompatible version of maptalks: ${version}, upgrade maptalks >= v1.0.0-rc.14`);\r\n }\r\n }\r\n\r\n _createREGLContext(canvas) {\r\n const layer = this.layer;\r\n\r\n const attributes = layer.options.glOptions || {\r\n alpha: true,\r\n depth: true,\r\n antialias: this.layer.options['antialias']\r\n // premultipliedAlpha : false\r\n };\r\n attributes.preserveDrawingBuffer = true;\r\n attributes.stencil = true;\r\n // this.glOptions = attributes;\r\n const gl = this._createGLContext(canvas, attributes);\r\n // this.gl.getParameter(this.gl.MAX_VERTEX_UNIFORM_VECTORS));\r\n const regl = createREGL({\r\n gl,\r\n attributes,\r\n extensions: [\r\n 'ANGLE_instanced_arrays',\r\n 'OES_element_index_uint',\r\n 'OES_standard_derivatives'\r\n ],\r\n optionalExtensions: layer.options['glExtensions'] ||\r\n [\r\n 'OES_vertex_array_object',\r\n 'OES_texture_half_float', 'OES_texture_half_float_linear',\r\n 'OES_texture_float', 'OES_texture_float_linear',\r\n 'WEBGL_draw_buffers', 'EXT_shader_texture_lod',\r\n 'EXT_frag_depth'\r\n ]\r\n });\r\n return { gl, attributes, regl };\r\n }\r\n\r\n _prepareWorker() {\r\n if (!this._workerConn) {\r\n this._workerConn = new WorkerConnection('@maptalks/vt', this.layer);\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 workerConn.addLayer((err, params) => {\r\n if (!this.layer) return;\r\n this.ready = true;\r\n this.layer.onWorkerReady(err, params);\r\n this.layer.fire('workerready');\r\n this.setToRedraw();\r\n });\r\n }\r\n\r\n clearCanvas() {\r\n super.clearCanvas();\r\n if (!this.regl) {\r\n return;\r\n }\r\n //这里必须通过regl来clear,如果直接调用webgl context的clear,则brdf的texture会被设为0\r\n if (this.glOptions.depth) {\r\n this.regl.clear({\r\n color: CLEAR_COLOR,\r\n depth: 1,\r\n stencil: 0\r\n });\r\n } else {\r\n this.regl.clear({\r\n color: CLEAR_COLOR,\r\n stencil: 0\r\n });\r\n }\r\n }\r\n\r\n isDrawable() {\r\n return true;\r\n }\r\n\r\n checkResources() {\r\n const result = EMPTY_ARRAY;\r\n return result;\r\n }\r\n\r\n _drawTiles(tiles, parentTiles, childTiles, placeholders, context) {\r\n super['_drawTiles'](tiles, parentTiles, childTiles, placeholders, context);\r\n if (this._prevTilesInView) {\r\n if (!Object.keys(this._prevTilesInView).length) {\r\n this._deletePrevPlugins();\r\n delete this._prevTilesInView;\r\n } else {\r\n for (const p in this._prevTilesInView) {\r\n const tile = this._prevTilesInView[p];\r\n if (tile && tile.info && tile.info.id && !this.tileCache.has(tile.info.id)) {\r\n this['_drawTile'](tile.info, tile.image, context);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _deletePrevPlugins() {\r\n const styleCounter = this._styleCounter;\r\n const retired = [];\r\n const retiredFeaPlulgin = [];\r\n for (const p in this._plugins) {\r\n if (+p !== styleCounter) {\r\n retired.push(p);\r\n const oldPlugins = this._getStylePlugins(p);\r\n oldPlugins.forEach(plugin => {\r\n plugin.remove();\r\n });\r\n }\r\n }\r\n for (const p in this._featurePlugins) {\r\n if (+p !== styleCounter) {\r\n retiredFeaPlulgin.push(p);\r\n const oldFeaturePlugins = this._getFeaturePlugins(p);\r\n oldFeaturePlugins.forEach(plugin => {\r\n plugin.remove();\r\n });\r\n }\r\n }\r\n for (let i = 0; i < retired.length; i++) {\r\n delete this._plugins[retired[i]];\r\n }\r\n for (let i = 0; i < retiredFeaPlulgin.length; i++) {\r\n delete this._featurePlugins[retiredFeaPlulgin[i]];\r\n }\r\n }\r\n\r\n draw(timestamp, parentContext) {\r\n if (this._currentTimestamp !== timestamp) {\r\n this._needRetire = false;\r\n this._setPluginIndex();\r\n }\r\n const layer = this.layer;\r\n this.prepareCanvas();\r\n if (!this.ready || !layer.ready) {\r\n // this.completeRender();\r\n return;\r\n }\r\n let plugins = this._plugins[this._styleCounter];\r\n if (!plugins) {\r\n this._initPlugins();\r\n this._setPluginIndex();\r\n plugins = this._getStylePlugins();\r\n }\r\n const featurePlugins = this._getFeaturePlugins();\r\n if (!layer.isDefaultRender() && (!plugins.length && !featurePlugins.length)) {\r\n this.completeRender();\r\n return;\r\n }\r\n if (layer.options['collision']) {\r\n layer.clearCollisionIndex();\r\n // layer.clearBackgroundCollisionIndex();\r\n }\r\n this._frameTime = timestamp;\r\n this._zScale = this._getCentiMeterScale(this.getMap().getGLRes()); // scale to convert centi-meter to gl point\r\n this._parentContext = parentContext || {};\r\n this._startFrame(timestamp);\r\n super.draw(timestamp);\r\n if (this._currentTimestamp !== timestamp) {\r\n this._prepareRender(timestamp);\r\n }\r\n\r\n this._endFrame(timestamp);\r\n // this.completeRender();\r\n this._currentTimestamp = timestamp;\r\n }\r\n\r\n _setPluginIndex() {\r\n const plugins = this._getFramePlugins();\r\n //按照plugin顺序更新collision索引\r\n plugins.forEach((plugin, idx) => {\r\n if (!plugin) {\r\n return;\r\n }\r\n plugin.renderIndex = idx;\r\n });\r\n }\r\n\r\n _prepareRender() {\r\n const plugins = this._getFramePlugins();\r\n this._pluginOffsets = this._pluginOffsets || [];\r\n let polygonOffsetIndex = 0;\r\n const len = plugins.length;\r\n for (let i = len - 1; i >= 0; i--) {\r\n const plugin = plugins[i];\r\n if (!plugin.isVisible() || !plugin.hasMesh()) {\r\n continue;\r\n }\r\n this._pluginOffsets[i] = polygonOffsetIndex;\r\n if (plugin.needPolygonOffset()) {\r\n polygonOffsetIndex++;\r\n }\r\n }\r\n if (this._groundPainter.isEnable()) {\r\n polygonOffsetIndex++;\r\n }\r\n this._polygonOffsetIndex = polygonOffsetIndex;\r\n }\r\n\r\n getFrameTimestamp() {\r\n return this._frameTime;\r\n }\r\n\r\n drawOnInteracting(event, timestamp, parentContext) {\r\n this.draw(timestamp, parentContext);\r\n }\r\n\r\n drawOutline(fbo) {\r\n if (!this._outline && !this._outlineAll) {\r\n return;\r\n }\r\n if (this._outlineAll) {\r\n this.paintOutlineAll(fbo);\r\n return;\r\n }\r\n this._outline.forEach(outline => {\r\n this[outline[0]](fbo, ...outline[1]);\r\n });\r\n }\r\n\r\n getAnalysisMeshes() {\r\n return this.getShadowMeshes();\r\n }\r\n\r\n getShadowMeshes() {\r\n const meshes = [];\r\n const plugins = this._getAllPlugins();\r\n plugins.forEach((plugin) => {\r\n if (!plugin) {\r\n return;\r\n }\r\n const visible = this._isVisible(plugin);\r\n if (!visible) {\r\n return;\r\n }\r\n const shadowMeshes = plugin.getShadowMeshes();\r\n if (Array.isArray(shadowMeshes)) {\r\n for (let i = 0; i < shadowMeshes.length; i++) {\r\n meshes.push(shadowMeshes[i]);\r\n }\r\n }\r\n });\r\n return meshes;\r\n }\r\n\r\n isForeground(mesh) {\r\n return !!(this._vtCurrentTiles && this._vtCurrentTiles[mesh.properties.tile.id]);\r\n }\r\n\r\n _getTileZoomDiff(mesh) {\r\n const layer = this.layer;\r\n let zoom = layer['_getTileZoom'](this.getMap().getZoom());\r\n const minZoom = layer.getMinZoom(),\r\n maxZoom = layer.getMaxZoom();\r\n zoom = maptalks.Util.clamp(zoom, minZoom, maxZoom);\r\n const gap = zoom - mesh.properties.tile.z;\r\n return gap;\r\n }\r\n\r\n isTileNearCamera(mesh) {\r\n const gap = this._getTileZoomDiff(mesh);\r\n return gap <= 1;\r\n }\r\n\r\n isBackTile(id) {\r\n return !!(this._vtBgTiles && this._vtBgTiles[id]);\r\n }\r\n\r\n loadTileQueue(tileQueue) {\r\n // worker与主线程同步期间,不再请求瓦片,避免出现瓦片与样式不同步的问题\r\n if (this._workersyncing) {\r\n return;\r\n }\r\n super.loadTileQueue(tileQueue);\r\n }\r\n\r\n loadTile(tileInfo) {\r\n const { url } = tileInfo;\r\n const cached = this._requestingMVT[url];\r\n if (!cached) {\r\n const map = this.getMap();\r\n const tilePoint = TILE_POINT.set(tileInfo.extent2d.xmin, tileInfo.extent2d.ymax);\r\n const tileCoord = map.pointAtResToCoord(new maptalks.Point(tilePoint), tileInfo.res);\r\n const centimeterToPoint = [meterToPoint(map, 1, tileCoord, tileInfo.res) / 100, meterToPoint(map, 1, tileCoord, tileInfo.res, 1) / 100];\r\n const verticalCentimeterToPoint = this.getCentimeterToPoint(tileInfo.z);\r\n // const centimeterToPoint = this.getCentimeterToPoint(tileInfo.z);\r\n // console.log(centimeterToPoint, centimeterToPoint1);\r\n const glScale = this.getTileGLScale(tileInfo.z);\r\n this._requestingMVT[url] = {\r\n keys: {},\r\n // 一个url可能对应了好几个tile,例如 repeatWorld 时\r\n tiles: [tileInfo]\r\n };\r\n this._requestingMVT[url].keys[tileInfo.id] = 1;\r\n const fetchOptions = this.layer.options['fetchOptions'];\r\n const referrer = window && window.location.href;\r\n this._workerConn.loadTile({ tileInfo: { res: tileInfo.res, x: tileInfo.x, y: tileInfo.y, z: tileInfo.z, url: tileInfo.url, id: tileInfo.id, extent2d: tileInfo.extent2d },\r\n glScale, zScale: this._zScale, centimeterToPoint, verticalCentimeterToPoint, fetchOptions, styleCounter: this._styleCounter, referrer }, this._onReceiveMVTData.bind(this, url));\r\n } else if (!cached.keys[tileInfo.id]) {\r\n cached.tiles.push(tileInfo);\r\n cached.keys[tileInfo.id] = 1;\r\n }\r\n return {};\r\n }\r\n\r\n getTileGLScale(z) {\r\n const map = this.getMap();\r\n const sr = this.layer.getSpatialReference();\r\n return sr.getResolution(z) / map.getGLRes();\r\n }\r\n\r\n getCentimeterToPoint(z) {\r\n const map = this.getMap();\r\n const sr = this.layer.getSpatialReference();\r\n const res = sr.getResolution(z);\r\n return getCentiMeterScale(res, map);\r\n }\r\n\r\n getRenderedFeatures() {\r\n const renderedFeatures = [];\r\n const keys = this.tileCache.keys();\r\n for (let i = 0; i < keys.length; i++) {\r\n const cache = this.tileCache.get(keys[i]);\r\n if (!cache || !cache.info || !cache.image) {\r\n continue;\r\n }\r\n const { info, image } = cache;\r\n const features = findFeatures(image);\r\n renderedFeatures.push({\r\n tile: { id: info.id, x: info.x, y: info.y, z: info.z, url: info.url },\r\n current: !!this.tilesInView[info.id],\r\n features\r\n });\r\n }\r\n return renderedFeatures;\r\n }\r\n\r\n _onReceiveMVTData(url, err, data) {\r\n this.setToRedraw();\r\n if (!this._requestingMVT[url]) {\r\n return;\r\n }\r\n if (data && data.canceled) {\r\n return;\r\n }\r\n const layer = this.layer;\r\n const useDefault = layer.isDefaultRender();\r\n const { tiles } = this._requestingMVT[url];\r\n delete this._requestingMVT[url];\r\n if (err) {\r\n if (err.status && (err.status === 404 || err.status === 204)) {\r\n //只处理404\r\n for (let i = 0; i < tiles.length; i++) {\r\n const tileInfo = tiles[i];\r\n this.onTileError(EMPTY_VECTOR_TILE, tileInfo);\r\n }\r\n\r\n }\r\n return;\r\n }\r\n if (!data) {\r\n for (let i = 0; i < tiles.length; i++) {\r\n const tileInfo = tiles[i];\r\n this.consumeTile({ _empty: true }, tileInfo);\r\n }\r\n return;\r\n }\r\n\r\n if (data.styleCounter !== this._styleCounter) {\r\n //返回的是上一个style的tileData\r\n return;\r\n }\r\n let needCompile = false;\r\n //restore features for plugin data\r\n const features = data.features;\r\n const layers = [];\r\n for (let i = 0; i < data.data.length; i++) {\r\n const pluginData = data.data[i]; // { data, featureIndex }\r\n if (!pluginData || !pluginData.data || !pluginData.styledFeatures.length) {\r\n continue;\r\n }\r\n const { isUpdated, layer } = this._parseTileData(0, i, pluginData, features, layers);\r\n layers.push(layer);\r\n if (isUpdated) {\r\n needCompile = isUpdated;\r\n }\r\n }\r\n //iterate plugins\r\n for (let i = 0; i < data.featureData.length; i++) {\r\n const pluginData = data.featureData[i]; // { data, featureIndex }\r\n if (!pluginData || !pluginData.data || !pluginData.styledFeatures.length) {\r\n continue;\r\n }\r\n this._parseTileData(1, i, pluginData, features);\r\n }\r\n\r\n if (needCompile) {\r\n layer._compileStyle();\r\n }\r\n\r\n const tileZoom = tiles[0].z;\r\n const schema = this.layer.getDataSchema(tileZoom);\r\n this._updateSchema(schema, data.schema);\r\n\r\n // data.features会在_parseTileData方法中被转化为 { [key_idx]: fea, .... } 的形式\r\n delete data.features;\r\n if (useDefault && data.data.length !== layers.length) {\r\n //因为默认绘制时,renderPlugin是以tileData中的图层顺序初始化的\r\n //当某个图层data为空时,需要将它从tileData中剔除,否则layer的renderPlugin就无法对应到数据\r\n const oldData = data.data;\r\n data.data = [];\r\n for (let i = 0; i < oldData.length; i++) {\r\n if (!oldData[i] || !oldData[i].features) {\r\n continue;\r\n }\r\n data.data.push(oldData[i]);\r\n }\r\n }\r\n data.layers = layers;\r\n for (let i = 0; i < tiles.length; i++) {\r\n const tileInfo = tiles[i];\r\n if (i === 0) {\r\n if (layer.options['debugTileData']) {\r\n const { x, y, z } = tileInfo;\r\n console.log('tile', {\r\n 'layerId': layer.getId(),\r\n x,\r\n y,\r\n z,\r\n layers: groupFeatures(Object.values(features))\r\n });\r\n }\r\n }\r\n const tileData = i === 0 ? data : copyTileData(data);\r\n for (let j = 0; j < tileData.data.length; j++) {\r\n if (!tileData.data[j]) {\r\n continue;\r\n }\r\n const features = tileData.data[j].features;\r\n for (const p in features) {\r\n const feature = features[p];\r\n feature.tile = tileInfo;\r\n }\r\n }\r\n tileInfo.extent = tileData && tileData.extent;\r\n tileData.features = Object.values(features);\r\n tileData.styleCounter = data.styleCounter;\r\n this.onTileLoad(tileData, tileInfo)\r\n }\r\n this.layer.fire('datareceived', { url });\r\n }\r\n\r\n _parseTileData(styleType, i, pluginData, features) {\r\n const { style, isUpdated } = this._updatePluginIfNecessary(styleType, i, pluginData.data);\r\n\r\n const layer = this.layer;\r\n const useDefault = layer.isDefaultRender();\r\n\r\n const symbol = style.symbol;\r\n const feaIndexes = pluginData.styledFeatures;\r\n //pFeatures是一个和features相同容量的数组,只存放有样式的feature数据,其他为undefined\r\n //这样featureIndexes中的序号能从pFeatures取得正确的数据\r\n // GeoJSONVectorTileLayer上的features需要复制,以保留原有的数据\r\n const pluginFeas = convertToPainterFeatures(features, feaIndexes, i, symbol, layer, !!(layer.getData && layer.getData()));\r\n // const pluginFeas = {};\r\n // if (hasFeature(features)) {\r\n // //[feature index, style index]\r\n // for (let ii = 0, ll = feaIndexes.length; ii < ll; ii++) {\r\n // let feature = features[feaIndexes[ii]];\r\n // if (layer.options['features'] === 'id' && layer.getFeature) {\r\n // feature = layer.getFeature(feature);\r\n // feature.layer = i;\r\n // }\r\n // pluginFeas[feaIndexes[ii]] = {\r\n // feature,\r\n // symbol\r\n // };\r\n // }\r\n // }\r\n delete pluginData.styledFeatures;\r\n pluginData.features = pluginFeas;\r\n let data = pluginData.data;\r\n if (Array.isArray(data)) {\r\n // 多symbol返回的数据\r\n data = data[0];\r\n }\r\n return {\r\n isUpdated,\r\n layer: useDefault ? { layer: data.layer, type: data.type } : null\r\n };\r\n }\r\n\r\n _updateSchema(target, source) {\r\n // const useDefault = this.layer.isDefaultRender();\r\n for (const layer in source) {\r\n if (!target[layer]) {\r\n target[layer] = {\r\n types: source[layer].types,\r\n properties: {}\r\n };\r\n // if (useDefault && this._layerPlugins) {\r\n // target[layer].symbol = this._layerPlugins[layer].symbol;\r\n // }\r\n }\r\n const srcProps = source[layer].properties;\r\n const targetProps = target[layer].properties;\r\n for (const type in srcProps) {\r\n if (!targetProps[type] ||\r\n //之前的瓦片里,target[layer][type]的值是null或undefined时,类型被判断为object\r\n targetProps[type] && srcProps[type] !== 'object' && targetProps[type] === 'object') {\r\n targetProps[type] = srcProps[type];\r\n }\r\n }\r\n }\r\n }\r\n\r\n _updatePluginIfNecessary(styleType, i, data) {\r\n if (Array.isArray(data)) {\r\n // 是个多symbol数据\r\n data = data[0];\r\n }\r\n const layer = this.layer;\r\n let isUpdated = false;\r\n let style;\r\n const useDefault = layer.isDefaultRender();\r\n if (useDefault && styleType === 0) {\r\n let layerPlugins = this._layerPlugins;\r\n if (!layerPlugins) {\r\n layerPlugins = this._layerPlugins = {};\r\n }\r\n //没有定义任何图层,采用图层默认的plugin渲染\r\n const layerId = data.layer;\r\n const type = data.type;\r\n if (!layerPlugins[layerId]) {\r\n layerPlugins[layerId] = [];\r\n }\r\n const pluginTypeName = ('plugin_' + type).trim();\r\n if (!layerPlugins[layerId][pluginTypeName]) {\r\n style = this._getDefaultRenderPlugin(type);\r\n style.filter = data.filter;\r\n layerPlugins[layerId].push(style);\r\n layerPlugins[layerId][pluginTypeName] = style;\r\n isUpdated = true;\r\n // layerStyles.push(style);\r\n } else {\r\n style = layerPlugins[layerId][pluginTypeName];\r\n }\r\n } else {\r\n const allStyles = layer._getComputedStyle();\r\n const styles = layer._getTargetStyle(styleType, allStyles);\r\n const plugins = this._getStylePlugins();\r\n style = styles[i];\r\n if (!style.renderPlugin) {\r\n isUpdated = true;\r\n const { plugin, symbol, renderPlugin } = this._getDefaultRenderPlugin(data.type);\r\n plugins[i] = plugin;\r\n style.symbol = symbol;\r\n style.renderPlugin = renderPlugin;\r\n }\r\n }\r\n return { style, isUpdated };\r\n }\r\n\r\n _getFramePlugins(tileData) {\r\n const styleCounter = tileData && tileData.style;\r\n let plugins = this._getStylePlugins(styleCounter) || [];\r\n if (this.layer.isDefaultRender() && this._layerPlugins) {\r\n plugins = [];\r\n if (tileData) {\r\n if (tileData.layers) {\r\n tileData.layers.forEach(info => {\r\n if (!info) {\r\n return;\r\n }\r\n const pluginTypeName = ('plugin_' + info.type).trim();\r\n plugins.push(this._layerPlugins[info.layer][pluginTypeName].plugin);\r\n });\r\n }\r\n } else {\r\n Object.keys(this._layerPlugins).forEach(layer => {\r\n for (let i = 0; i < this._layerPlugins[layer].length; i++) {\r\n plugins.push(this._layerPlugins[layer][i].plugin);\r\n }\r\n });\r\n }\r\n }\r\n const featurePlugins = this._getFeaturePlugins(styleCounter);\r\n if (featurePlugins && featurePlugins.length) {\r\n plugins = plugins.slice();\r\n pushIn(plugins, featurePlugins);\r\n }\r\n\r\n return plugins;\r\n }\r\n\r\n _getAllPlugins() {\r\n if (this.layer.isDefaultRender() && this._layerPlugins) {\r\n const plugins = [];\r\n Object.keys(this._layerPlugins).forEach(layer => {\r\n for (let i = 0; i < this._layerPlugins[layer].length; i++) {\r\n plugins.push(this._layerPlugins[layer][i].plugin);\r\n }\r\n });\r\n return plugins;\r\n }\r\n const plugins = [];\r\n for (const p in this._plugins) {\r\n plugins.push(...this._plugins[p])\r\n }\r\n for (const p in this._featurePlugins) {\r\n plugins.push(...this._featurePlugins[p]);\r\n }\r\n return plugins;\r\n }\r\n\r\n _getStylePlugins(styleCounter) {\r\n if (isNil(styleCounter)) {\r\n styleCounter = this._styleCounter;\r\n }\r\n return this._plugins[styleCounter] || EMPTY_ARRAY;\r\n }\r\n\r\n _getFeaturePlugins(styleCounter) {\r\n if (isNil(styleCounter)) {\r\n styleCounter = this._styleCounter;\r\n }\r\n return this._featurePlugins[styleCounter] || EMPTY_ARRAY;\r\n }\r\n\r\n _startFrame(timestamp, filter) {\r\n const isRenderingTerrain = !!this._terrainLayer;\r\n const useDefault = this.layer.isDefaultRender() && this._layerPlugins;\r\n const parentContext = this._parentContext;\r\n const plugins = this._getAllPlugins();\r\n plugins.forEach((plugin, idx) => {\r\n if (!plugin || filter && !filter(plugin)) {\r\n return;\r\n }\r\n const visible = this._isVisible(idx);\r\n if (!visible) {\r\n return;\r\n }\r\n const regl = this.regl;\r\n const gl = this.gl;\r\n const symbol = useDefault ? plugin.defaultSymbol : plugin.style && plugin.style.symbol;\r\n const context = {\r\n regl,\r\n layer: this.layer,\r\n symbol,\r\n gl,\r\n isRenderingTerrain,\r\n sceneConfig: plugin.config ? plugin.config.sceneConfig : null,\r\n dataConfig: plugin.config ? plugin.config.dataConfig : null,\r\n pluginIndex: idx,\r\n timestamp\r\n };\r\n if (parentContext) {\r\n extend(context, parentContext);\r\n }\r\n plugin.startFrame(context);\r\n });\r\n }\r\n\r\n _endFrame(timestamp) {\r\n const parentContext = this._parentContext;\r\n const mode = parentContext.renderMode;\r\n const targetFBO = parentContext && parentContext.renderTarget && parentContext.renderTarget.fbo;\r\n const cameraPosition = this.getMap().cameraPosition;\r\n const plugins = this._getAllPlugins();\r\n // terrain skin的相关数据已经在renderTerrainSkin中绘制,这里就不再绘制\r\n const isRenderingTerrain = !!this._terrainLayer;\r\n const isFinalRender = !parentContext.timestamp || parentContext.isFinalRender;\r\n\r\n // maptalks/issues#202, finalRender后不再更新collision,以免后处理(如bloom)阶段继续更新collision造成bug\r\n if (this.layer.options.collision && !parentContext.isPostProcess) {\r\n //按照plugin顺序更新collision索引\r\n plugins.forEach((plugin) => {\r\n if (!this._isVisible(plugin) || !plugin.hasMesh()) {\r\n return;\r\n }\r\n if (mode && mode !== 'default' && !plugin.supportRenderMode(mode)) {\r\n return;\r\n }\r\n if (isRenderingTerrain && !terrainVectorFilter(plugin)) {\r\n return;\r\n }\r\n const context = this._getPluginContext(plugin, 0, cameraPosition, timestamp);\r\n plugin.prepareRender(context);\r\n plugin.updateCollision(context);\r\n });\r\n } else {\r\n plugins.forEach((plugin) => {\r\n if (!this._isVisible(plugin) || !plugin.hasMesh()) {\r\n return;\r\n }\r\n if (mode && mode !== 'default' && !plugin.supportRenderMode(mode)) {\r\n return;\r\n }\r\n if (isRenderingTerrain && !terrainVectorFilter(plugin)) {\r\n return;\r\n }\r\n const context = this._getPluginContext(plugin, 0, cameraPosition, timestamp);\r\n plugin.prepareRender(context);\r\n });\r\n }\r\n\r\n const isFirstRender = this._currentTimestamp !== parentContext.timestamp;\r\n\r\n let dirty = false;\r\n //只在需要的时候才增加polygonOffset\r\n if (isFirstRender && !isRenderingTerrain) {\r\n const groundOffset = this.layer.getPolygonOffset() + this.layer.getPolygonOffsetCount();\r\n const groundContext = this._getPluginContext(null, groundOffset, cameraPosition, timestamp);\r\n groundContext.offsetFactor = groundOffset;\r\n groundContext.offsetUnits = groundOffset\r\n this._groundPainter.paint(groundContext);\r\n }\r\n plugins.forEach((plugin, idx) => {\r\n const hasMesh = this._isVisitable(plugin);\r\n if (!hasMesh) {\r\n return;\r\n }\r\n if (mode && mode !== 'default' && !plugin.supportRenderMode(mode)) {\r\n return;\r\n }\r\n if (isRenderingTerrain && !terrainVectorFilter(plugin)) {\r\n return;\r\n }\r\n this.regl.clear({\r\n stencil: 0xFF,\r\n framebuffer: targetFBO\r\n });\r\n const polygonOffsetIndex = this._pluginOffsets[idx] || 0;\r\n const context = this._getPluginContext(plugin, polygonOffsetIndex, cameraPosition, timestamp);\r\n if (plugin.painter && plugin.painter.isEnableTileStencil(context)) {\r\n this._drawTileStencil(targetFBO, plugin.painter);\r\n }\r\n const status = plugin.endFrame(context);\r\n if (status && status.redraw) {\r\n //let plugin to determine when to redraw\r\n this.setToRedraw();\r\n }\r\n dirty = true;\r\n });\r\n if (dirty) {\r\n this.layer.fire('canvasisdirty');\r\n }\r\n if (isFinalRender) {\r\n this._drawDebug();\r\n }\r\n }\r\n\r\n getPolygonOffsetCount() {\r\n return this._polygonOffsetIndex || 0;\r\n }\r\n\r\n _drawDebug() {\r\n const layer = this.layer;\r\n if (layer.options['debug']) {\r\n const parentContext = this._parentContext;\r\n const mat = [];\r\n const projViewMatrix = this.getMap().projViewMatrix;\r\n for (const p in this.tilesInView) {\r\n const info = this.tilesInView[p].info;\r\n const tileImage = this.tilesInView[p].image;\r\n if (tileImage._empty) {\r\n continue;\r\n }\r\n const transform = info.transform;\r\n const extent = tileImage.extent;\r\n const renderTarget = parentContext && parentContext.renderTarget;\r\n if (transform && extent) {\r\n const debugInfo = this.getDebugInfo(info.id);\r\n const matrix = mat4.multiply(mat, projViewMatrix, transform);\r\n const tileSize = this.layer.getTileSize().width;\r\n this._debugPainter.draw(\r\n debugInfo, matrix,\r\n tileSize, extent,\r\n renderTarget && renderTarget.fbo\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n _isVisitable(plugin) {\r\n if (!plugin) {\r\n return true;\r\n }\r\n const parentContext = this._parentContext;\r\n const visible = this._isVisible(plugin);\r\n const includesChanged = parentContext && parentContext.states && parentContext.states.includesChanged;\r\n const hasMesh = this._hasMesh(plugin.painter.scene.getMeshes());\r\n const empty = !visible || !includesChanged && !hasMesh;\r\n if (empty) {\r\n return 0;\r\n } else {\r\n return hasMesh ? 2 : 1;\r\n }\r\n }\r\n\r\n _getPluginContext(plugin, polygonOffsetIndex, cameraPosition, timestamp) {\r\n const isRenderingTerrain = !!this._terrainLayer;\r\n const isRenderingTerrainSkin = isRenderingTerrain && plugin && terrainSkinFilter(plugin);\r\n const regl = this.regl;\r\n const gl = this.gl;\r\n const context = {\r\n regl,\r\n layer: this.layer,\r\n gl,\r\n isRenderingTerrain,\r\n isRenderingTerrainSkin,\r\n sceneConfig: plugin && plugin.config.sceneConfig,\r\n pluginIndex: plugin && plugin.renderIndex,\r\n polygonOffsetIndex,\r\n cameraPosition,\r\n timestamp\r\n };\r\n const parentContext = this._parentContext;\r\n if (parentContext) {\r\n extend(context, parentContext);\r\n }\r\n return context;\r\n }\r\n\r\n _hasMesh(meshes) {\r\n if (!meshes) {\r\n return false;\r\n }\r\n const filter = this._parentContext && this._parentContext.sceneFilter;\r\n if (!filter) {\r\n return meshes.length > 0;\r\n }\r\n // 还要检查是否存在 hlBloomMesh\r\n return meshes.filter(mesh => filter(mesh) || mesh.properties.hlBloomMesh && filter(mesh.properties.hlBloomMesh)).length > 0;\r\n }\r\n\r\n _drawTileStencil(fbo, painter) {\r\n const uniqueRef = painter.isUniqueStencilRefPerTile();\r\n const tileZoom = this.getCurrentTileZoom();\r\n let stencilRenderer = this._stencilRenderer;\r\n if (!stencilRenderer) {\r\n stencilRenderer = this._stencilRenderer = new TileStencilRenderer(this.regl, this.canvas, this.getMap());\r\n }\r\n stencilRenderer.start();\r\n const { tiles } = this._stencilTiles;\r\n let { parentTiles, childTiles } = this._stencilTiles;\r\n let ref = 1;\r\n childTiles = childTiles.sort(sortByLevel);\r\n for (let i = 0; i < childTiles.length; i++) {\r\n const stencilRef = uniqueRef ? ref : this.getTileLevelValue(childTiles[i].info, tileZoom);\r\n this._addTileStencil(childTiles[i].info, stencilRef);\r\n ref++;\r\n }\r\n parentTiles = parentTiles.sort(sortByLevel);\r\n for (let i = 0; i < parentTiles.length; i++) {\r\n const stencilRef = uniqueRef ? ref : this.getTileLevelValue(parentTiles[i].info, tileZoom);\r\n this._addTileStencil(parentTiles[i].info, stencilRef);\r\n ref++;\r\n }\r\n //默认情况下瓦片是按照level从小到大排列的,所以倒序排列,让level较小的tile最后画(优先级最高)\r\n const currentTiles = tiles.sort(sortByLevel);\r\n for (let i = currentTiles.length - 1; i >= 0; i--) {\r\n const stencilRef = uniqueRef ? ref : this.getTileLevelValue(currentTiles[i].info, tileZoom);\r\n this._addTileStencil(currentTiles[i].info, stencilRef);\r\n ref++;\r\n }\r\n\r\n stencilRenderer.render(fbo);\r\n }\r\n\r\n _addTileStencil(tileInfo, ref) {\r\n const tilePoint = TILE_POINT.set(tileInfo.extent2d.xmin, tileInfo.extent2d.ymax);\r\n const tileTransform = tileInfo.transform = tileInfo.transform || this.calculateTileMatrix(tilePoint, tileInfo.z, tileInfo.extent);\r\n tileInfo.stencilRef = ref;\r\n this._stencilRenderer.add(ref, tileInfo.extent, tileTransform);\r\n }\r\n\r\n onDrawTileStart(context) {\r\n super.onDrawTileStart(context);\r\n const { tiles, childTiles, parentTiles } = context;\r\n this._vtCurrentTiles = {};\r\n this._vtBgTiles = {};\r\n for (let i = 0; i < tiles.length; i++) {\r\n this._vtCurrentTiles[tiles[i].info.id] = 1;\r\n }\r\n for (let i = 0; i < childTiles.length; i++) {\r\n this._vtBgTiles[childTiles[i].info.id] = 1;\r\n }\r\n for (let i = 0; i < parentTiles.length; i++) {\r\n this._vtBgTiles[parentTiles[i].info.id] = 1;\r\n }\r\n this._stencilTiles = context;\r\n }\r\n\r\n isEnableTileStencil() {\r\n if (this.layer.options.altitude) {\r\n return false;\r\n }\r\n const plugins = this._getFramePlugins();\r\n for (let i = 0; i < plugins.length; i++) {\r\n if (!plugins[i] || !plugins[i].painter) {\r\n continue;\r\n }\r\n if (!plugins[i].painter.isOnly2D()) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n setTerrainHelper(terrainLayer) {\r\n this._terrainLayer = terrainLayer;\r\n }\r\n\r\n getTerrainHelper() {\r\n return this._terrainLayer;\r\n }\r\n\r\n // 有地形时的tile draw 方法\r\n drawTileOnTerrain(...args) {\r\n // drawTile 有可能在GroupGLLayer被替换,但prototype上的定义是不会被替换的\r\n // VectorTileLayerRenderer.prototype.drawTile.call(this, tileInfo, tileData, terrainSkinFilter);\r\n VectorTileLayerRenderer.prototype.drawTile.call(this, ...args);\r\n }\r\n\r\n createTerrainTexture(regl) {\r\n const tileSize = this.layer.getTileSize().width;\r\n const width = tileSize * 2;\r\n const height = tileSize * 2;\r\n const color = regl.texture({\r\n min: 'linear',\r\n mag: 'linear',\r\n type: 'uint8',\r\n width,\r\n height\r\n });\r\n if (!this._terrainDepthStencil) {\r\n this._terrainDepthStencil = regl.renderbuffer({\r\n width,\r\n height,\r\n format: 'depth24 stencil8'\r\n });\r\n }\r\n const fboInfo = {\r\n width,\r\n height,\r\n colors: [color],\r\n // stencil: true,\r\n // colorCount,\r\n colorFormat: 'rgba',\r\n ignoreStatusCheck: true\r\n };\r\n fboInfo.depthStencil = this._terrainDepthStencil;\r\n const texture = regl.framebuffer(fboInfo)\r\n texture.colorTex = color;\r\n // 单独创建的 color 必须要手动destroy回收,光destroy framebuffer,color是不会销毁的\r\n return texture;\r\n }\r\n\r\n deleteTerrainTexture(texture) {\r\n texture.destroy();\r\n if (texture.colorTex) {\r\n texture.colorTex.destroy();\r\n delete texture.colorTex;\r\n }\r\n }\r\n\r\n renderTerrainSkin(terrainRegl, terrainLayer, skinImages) {\r\n const timestamp = this._currentTimestamp;\r\n const parentContext = this._parentContext;\r\n const tileSize = this.layer.getTileSize().width;\r\n this._startFrame(timestamp);\r\n for (let i = 0; i < skinImages.length; i++) {\r\n const texture = skinImages[i].texture;\r\n this._parentContext = {\r\n renderTarget: {\r\n fbo: texture\r\n }\r\n };\r\n TERRAIN_CLEAR.framebuffer = texture;\r\n terrainRegl.clear(TERRAIN_CLEAR);\r\n this._parentContext.viewport = getTileViewport(tileSize);\r\n // 如果矢量瓦片的目标绘制尺寸过大,拉伸后会过于失真,还不如不去绘制\r\n this._drawTerrainTile(skinImages[i].tile, texture);\r\n }\r\n this._endTerrainFrame(skinImages);\r\n this._parentContext = parentContext;\r\n }\r\n\r\n _drawTerrainTile(tile) {\r\n const { info, image } = tile;\r\n this.drawTile(info, image, terrainSkinFilter);\r\n }\r\n\r\n _endTerrainFrame(skinImages) {\r\n const plugins = this._getAllPlugins();\r\n const cameraPosition = this.getMap().cameraPosition;\r\n const timestamp = this._currentTimestamp || 0;\r\n\r\n if (this.layer.options.collision) {\r\n //按照plugin顺序更新collision索引\r\n plugins.forEach((plugin) => {\r\n if (!this._isVisible(plugin) || !plugin.hasMesh()) {\r\n return;\r\n }\r\n if (!terrainSkinFilter(plugin) || !this.layer.options.awareOfTerrain) {\r\n return;\r\n }\r\n const context = this._getPluginContext(plugin, 0, cameraPosition, timestamp);\r\n context.isRenderingTerrainSkin = true;\r\n plugin.prepareRender(context);\r\n plugin.updateCollision(context);\r\n });\r\n } else {\r\n plugins.forEach((plugin) => {\r\n if (!this._isVisible(plugin) || !plugin.hasMesh()) {\r\n return;\r\n }\r\n if (!terrainSkinFilter(plugin) || !this.layer.options.awareOfTerrain) {\r\n return;\r\n }\r\n const context = this._getPluginContext(plugin, 0, cameraPosition, timestamp);\r\n context.isRenderingTerrainSkin = true;\r\n plugin.prepareRender(context);\r\n });\r\n }\r\n\r\n plugins.forEach((plugin, idx) => {\r\n const hasMesh = this._isVisitable(plugin);\r\n if (!hasMesh || !terrainSkinFilter(plugin)) {\r\n return;\r\n }\r\n for (let i = 0; i < skinImages.length; i++) {\r\n const texture = skinImages[i].texture;\r\n this.regl.clear({\r\n stencil: 0xFF,\r\n framebuffer: texture\r\n });\r\n }\r\n\r\n const polygonOffsetIndex = this._pluginOffsets[idx] || 0;\r\n const context = this._getPluginContext(plugin, polygonOffsetIndex, [0, 0, 0], this._currentTimestamp);\r\n context.isRenderingTerrainSkin = true;\r\n plugin.endFrame(context);\r\n });\r\n }\r\n\r\n drawTile(tileInfo, tileData, filter) {\r\n if (!tileData.cache) return;\r\n const isRenderingTerrain = !!this._terrainLayer;\r\n const tileCache = tileData.cache;\r\n const tilePoint = TILE_POINT.set(tileInfo.extent2d.xmin, tileInfo.extent2d.ymax);\r\n const tileTransform = tileInfo.transform = tileInfo.transform || this.calculateTileMatrix(tilePoint, tileInfo.z, tileInfo.extent);\r\n const tileTranslationMatrix = tileInfo.tileTranslationMatrix = tileInfo.tileTranslationMatrix || this.calculateTileTranslationMatrix(tilePoint, tileInfo.z);\r\n const terrainTileTransform = tileInfo.terrainTransform = tileInfo.terrainTransform || this.calculateTerrainTileMatrix(tilePoint, tileInfo.z, tileInfo.extent);\r\n\r\n const parentContext = this._parentContext;\r\n const pluginData = [];\r\n pushIn(pluginData, tileData.data);\r\n pushIn(pluginData, tileData.featureData);\r\n\r\n const plugins = this._getFramePlugins(tileData);\r\n\r\n plugins.forEach((plugin, idx) => {\r\n if (!plugin || filter && !filter(plugin)) {\r\n return;\r\n }\r\n if (!pluginData[idx]) {\r\n return;\r\n }\r\n if (!tileCache[idx]) {\r\n return;\r\n }\r\n const isRenderingTerrainSkin = isRenderingTerrain && terrainSkinFilter(plugin);\r\n const regl = this.regl;\r\n const gl = this.gl;\r\n const context = {\r\n regl,\r\n layer: this.layer,\r\n gl,\r\n sceneConfig: plugin.config.sceneConfig,\r\n pluginIndex: idx,\r\n tileCache: tileCache[idx],\r\n tileData: pluginData[idx],\r\n tileTransform: isRenderingTerrainSkin ? terrainTileTransform : tileTransform,\r\n tileVectorTransform: tileTransform,\r\n tileTranslationMatrix,\r\n tileExtent: tileData.extent,\r\n timestamp: this._frameTime,\r\n tileInfo,\r\n tileZoom: this['_tileZoom'],\r\n bloom: this._parentContext && this._parentContext.bloom,\r\n isRenderingTerrain,\r\n isRenderingTerrainSkin\r\n };\r\n if (isRenderingTerrainSkin && parentContext && parentContext.renderTarget) {\r\n // 渲染 terrain skin 时,每个瓦片需要绘制到各自的renderTarget里(terrain texture)\r\n context.renderTarget = parentContext.renderTarget;\r\n }\r\n const status = plugin.paintTile(context);\r\n if (!this._needRetire && (status.retire || status.redraw) && plugin.supportRenderMode('taa')) {\r\n this._needRetire = true;\r\n }\r\n if (status.redraw) {\r\n //let plugin to determine when to redraw\r\n this.setToRedraw();\r\n }\r\n });\r\n if (tileData && tileData.style === this._styleCounter) {\r\n this._retirePrevTile(tileInfo);\r\n }\r\n this.setCanvasUpdated();\r\n }\r\n\r\n _createOneTile(tileInfo, tileData) {\r\n if (!tileData.loadTime || tileData._empty) return;\r\n // const parentContext = this._parentContext;\r\n let tileCache = tileData.cache;\r\n if (!tileCache) {\r\n tileCache = tileData.cache = {};\r\n }\r\n const isRenderingTerrain = !!this._terrainLayer;\r\n const tilePoint = TILE_POINT.set(tileInfo.extent2d.xmin, tileInfo.extent2d.ymax);\r\n const tileTransform = tileInfo.transform = tileInfo.transform || this.calculateTileMatrix(tilePoint, tileInfo.z, tileData.extent);\r\n const tileTranslationMatrix = tileInfo.tileTranslationMatrix = tileInfo.tileTranslationMatrix || this.calculateTileTranslationMatrix(tilePoint, tileInfo.z);\r\n const terrainTileTransform = tileInfo.terrainTransform = tileInfo.terrainTransform || this.calculateTerrainTileMatrix(tilePoint, tileInfo.z, tileInfo.extent);\r\n const pluginData = [];\r\n pushIn(pluginData, tileData.data);\r\n pushIn(pluginData, tileData.featureData);\r\n\r\n const plugins = this._getFramePlugins(tileData);\r\n\r\n plugins.forEach((plugin, idx) => {\r\n if (!plugin) {\r\n return;\r\n }\r\n if (!pluginData[idx]) {\r\n return;\r\n }\r\n const isRenderingTerrainSkin = isRenderingTerrain && terrainSkinFilter(plugin);\r\n const regl = this.regl;\r\n const gl = this.gl;\r\n if (!tileCache[idx]) {\r\n tileCache[idx] = {};\r\n }\r\n const context = {\r\n regl,\r\n layer: this.layer,\r\n gl,\r\n sceneConfig: plugin.config.sceneConfig,\r\n pluginIndex: idx,\r\n tileCache: tileCache[idx],\r\n tileData: pluginData[idx],\r\n tileTransform: isRenderingTerrainSkin ? terrainTileTransform : tileTransform,\r\n tileVectorTransform: tileTransform,\r\n isRenderingTerrain,\r\n isRenderingTerrainSkin,\r\n tileTranslationMatrix,\r\n tileExtent: tileData.extent,\r\n timestamp: this._frameTime,\r\n tileInfo,\r\n tileZoom: this['_tileZoom']\r\n };\r\n const status = plugin.createTile(context);\r\n if (tileCache[idx].geometry) {\r\n //插件数据以及经转化为geometry,可以删除原始数据以节省内存\r\n tileData.data[idx] = 1;\r\n }\r\n if (!this._needRetire && status.retire && plugin.supportRenderMode('taa')) {\r\n this._needRetire = true;\r\n }\r\n });\r\n }\r\n\r\n checkTileInQueue(tileData) {\r\n return tileData.styleCounter === this._styleCounter;\r\n }\r\n\r\n pick(x, y, options) {\r\n const hits = [];\r\n if (!this.layer.isVisible()) {\r\n return hits;\r\n }\r\n const plugins = this._getFramePlugins();\r\n plugins.forEach((plugin) => {\r\n if (!plugin) {\r\n return;\r\n }\r\n const visible = this._isVisible(plugin);\r\n if (!visible) {\r\n return;\r\n }\r\n const picked = plugin.pick(x, y, options.tolerance);\r\n if (picked) {\r\n picked.type = plugin.getType();\r\n hits.push(picked);\r\n }\r\n });\r\n return hits;\r\n }\r\n\r\n deleteTile(tile) {\r\n if (!tile) {\r\n return;\r\n }\r\n if (tile.image && !tile.image._empty) {\r\n const styleCounter = tile.image && tile.image.style;\r\n const plugins = this._getStylePlugins(styleCounter);\r\n if (plugins) {\r\n plugins.forEach((plugin, idx) => {\r\n if (!plugin) {\r\n return;\r\n }\r\n plugin.deleteTile({\r\n pluginIndex: idx,\r\n regl: this.regl,\r\n layer: this.layer,\r\n gl: this.gl,\r\n tileCache: tile.image.cache ? tile.image.cache[idx] : {},\r\n tileInfo: tile.info,\r\n tileData: tile.image\r\n });\r\n });\r\n }\r\n tile.image.cache = {};\r\n }\r\n if (tile.info) {\r\n delete tile.info.completeTerrainQuery;\r\n delete tile.info.terrainQueryStatus;\r\n }\r\n //ask plugin to clear caches\r\n super.deleteTile(tile);\r\n }\r\n\r\n abortTileLoading(tileImage, tileInfo) {\r\n if (tileInfo && tileInfo.url) {\r\n if (this._workerConn) {\r\n this._workerConn.abortTile(tileInfo.url);\r\n }\r\n delete this._requestingMVT[tileInfo.url];\r\n }\r\n super.abortTileLoading(tileImage, tileInfo);\r\n }\r\n\r\n resizeCanvas(canvasSize) {\r\n super.resizeCanvas(canvasSize);\r\n const canvas = this.canvas;\r\n if (!canvas) {\r\n return;\r\n }\r\n if (this.pickingFBO && (this.pickingFBO.width !== canvas.width || this.pickingFBO.height !== canvas.height)) {\r\n this.pickingFBO.resize(canvas.width, canvas.height);\r\n this._getFramePlugins().forEach(plugin => {\r\n if (!plugin) {\r\n return;\r\n }\r\n plugin.resize(canvas.width, canvas.height);\r\n });\r\n }\r\n }\r\n\r\n onRemove() {\r\n if (this._stencilRenderer) {\r\n this._stencilRenderer.remove();\r\n }\r\n // const map = this.getMap();\r\n if (this._workerConn) {\r\n this._workerConn.removeLayer(err => {\r\n if (err) throw err;\r\n });\r\n this._workerConn.remove();\r\n delete this._workerConn;\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._debugPainter) {\r\n this._debugPainter.delete();\r\n delete this._debugPainter;\r\n }\r\n if (this._terrainDepthStencil) {\r\n this._terrainDepthStencil.destroy();\r\n delete this._terrainDepthStencil;\r\n }\r\n if (this._groundPainter) {\r\n this._groundPainter.dispose();\r\n delete this._groundPainter;\r\n }\r\n if (super.onRemove) super.onRemove();\r\n this._clearPlugin();\r\n }\r\n\r\n _clearPlugin() {\r\n this._getAllPlugins().forEach(plugin => {\r\n plugin.remove();\r\n });\r\n this.plugins = {};\r\n }\r\n\r\n hitDetect(point) {\r\n if (!this.gl || !this.layer.options['hitDetect']) {\r\n return false;\r\n }\r\n const gl = this.gl;\r\n const pixels = new Uint8Array(1 * 1 * 4);\r\n const h = this.canvas.height;\r\n gl.readPixels(point.x, h - point.y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\r\n return (pixels[3] > 0);\r\n }\r\n\r\n _initPlugins() {\r\n const { style, featureStyle } = this.layer._getComputedStyle();\r\n const plugins = style.map((style, idx) => {\r\n const config = style.renderPlugin;\r\n if (!config) {\r\n return null;\r\n }\r\n if (!config.type) {\r\n throw new Error('invalid plugin type for style at ' + idx);\r\n }\r\n const plugin = this._createRenderPlugin(config);\r\n plugin.styleCounter = this._styleCounter;\r\n plugin.style = style;\r\n return plugin;\r\n });\r\n const featurePlugins = [];\r\n featureStyle.forEach((featureStyle, idx) => {\r\n const config = featureStyle.renderPlugin;\r\n if (!config) {\r\n return null;\r\n }\r\n if (!config.type) {\r\n throw new Error('invalid plugin type for features at ' + idx);\r\n }\r\n const plugin = this._createRenderPlugin(config);\r\n plugin.style = featureStyle;\r\n plugin.styleCounter = this._styleCounter;\r\n featurePlugins.push(plugin);\r\n return plugin;\r\n });\r\n const styleCounter = this._styleCounter;\r\n this._plugins[styleCounter] = plugins;\r\n this._featurePlugins[styleCounter] = featurePlugins;\r\n this.layer.fire('pluginsinited');\r\n\r\n if (this._highlighted && this._highlighted.size || this.layer._highlighted) {\r\n if (this.layer._highlighted) {\r\n this.layer._resumeHighlights();\r\n }\r\n const map = this.getMap();\r\n const renderer = map.getRenderer();\r\n renderer.callInNextFrame(() => {\r\n const plugins = this._getFramePlugins();\r\n plugins.forEach(plugin => {\r\n plugin.highlight(this._highlighted);\r\n });\r\n });\r\n }\r\n\r\n return plugins;\r\n }\r\n\r\n _createRenderPlugin(config) {\r\n const pluginClazz = this.layer.constructor.getPlugins();\r\n const P = pluginClazz[config.type];\r\n if (!P) {\r\n throw new Error(`Plugin for (${config.type}) is not loaded.`);\r\n }\r\n const p = new P();\r\n p.config = config;\r\n if (!p.config.sceneConfig) {\r\n p.config.sceneConfig = {};\r\n }\r\n return p;\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 _getCentiMeterScale(res) {\r\n const map = this.getMap();\r\n return getCentiMeterScale(res, map);\r\n }\r\n\r\n debugFBO(id, fbo) {\r\n const canvas = document.getElementById(id);\r\n const width = fbo.width, height = fbo.height;\r\n canvas.width = width;\r\n canvas.height = height;\r\n const ctx = canvas.getContext('2d');\r\n const pixels = this.regl.read({\r\n framebuffer: fbo\r\n });\r\n\r\n const halfHeight = height / 2 | 0; // the | 0 keeps the result an int\r\n const bytesPerRow = width * 4;\r\n\r\n for (let i = 0; i < pixels.length; i++) {\r\n pixels[i] *= 255;\r\n }\r\n\r\n // make a temp buffer to hold one row\r\n const temp = new Uint8Array(width * 4);\r\n for (let y = 0; y < halfHeight; ++y) {\r\n const topOffset = y * bytesPerRow;\r\n const bottomOffset = (height - y - 1) * bytesPerRow;\r\n\r\n // make copy of a row on the top half\r\n temp.set(pixels.subarray(topOffset, topOffset + bytesPerRow));\r\n\r\n // copy a row from the bottom half to the top\r\n pixels.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);\r\n\r\n // copy the copy of the top half row to the bottom half\r\n pixels.set(temp, bottomOffset);\r\n }\r\n\r\n // This part is not part of the answer. It's only here\r\n // to show the code above worked\r\n // copy the pixels in a 2d canvas to show it worked\r\n const imgdata = new ImageData(width, height);\r\n imgdata.data.set(pixels);\r\n ctx.putImageData(imgdata, 0, 0);\r\n }\r\n\r\n //TODO 可以把图层合并为只用这三个默认插件绘制\r\n _getDefaultRenderPlugin(type) {\r\n let renderPlugin;\r\n switch (type) {\r\n case 'native-line':\r\n renderPlugin = {\r\n type: 'native-line',\r\n dataConfig: { type: 'native-line', only2D: true }\r\n };\r\n break;\r\n case 'native-point':\r\n renderPlugin = {\r\n type: 'native-point',\r\n dataConfig: { type: 'native-point', only2D: true }\r\n };\r\n break;\r\n case 'fill':\r\n renderPlugin = {\r\n type: 'fill',\r\n dataConfig: { type: 'fill', only2D: true },\r\n sceneConfig: { antialias: true }\r\n };\r\n break;\r\n default:\r\n renderPlugin = null;\r\n }\r\n const symbol = getDefaultSymbol(type);\r\n const plugin = this._createRenderPlugin(renderPlugin);\r\n plugin.defaultSymbol = symbol;\r\n return {\r\n plugin, symbol, renderPlugin\r\n };\r\n }\r\n\r\n _isVisible() {\r\n // return plugin.isVisible();\r\n return true;\r\n }\r\n\r\n isEnableWorkAround(key) {\r\n if (key === 'win-intel-gpu-crash') {\r\n return this.layer.options['workarounds']['win-intel-gpu-crash'] && isWinIntelGPU(this.gl);\r\n }\r\n return false;\r\n }\r\n\r\n getZScale() {\r\n return this._zScale;\r\n }\r\n\r\n outline(idx, featureIds) {\r\n if (!featureIds) {\r\n return;\r\n }\r\n if (!Array.isArray(featureIds)) {\r\n featureIds = [featureIds];\r\n }\r\n if (!this._outline) {\r\n this._outline = [];\r\n }\r\n this._outline.push(['paintOutline', [idx, featureIds]]);\r\n this.setToRedraw();\r\n }\r\n\r\n outlineFeatures(featureIds) {\r\n if (!featureIds) {\r\n return;\r\n }\r\n if (!Array.isArray(featureIds)) {\r\n featureIds = [featureIds];\r\n }\r\n if (!this._outline) {\r\n this._outline = [];\r\n }\r\n this._outline.push(['paintOutline', [null, featureIds]]);\r\n this.setToRedraw();\r\n }\r\n\r\n outlineBatch(idx) {\r\n if (!this._outline) {\r\n this._outline = [];\r\n }\r\n this._outline.push(['paintBatchOutline', [idx]]);\r\n this.setToRedraw();\r\n }\r\n\r\n outlineAll() {\r\n this._outlineAll = true;\r\n this.setToRedraw();\r\n }\r\n\r\n paintOutlineAll(fbo) {\r\n const plugins = this._getFramePlugins();\r\n for (let i = 0; i < plugins.length; i++) {\r\n plugins[i].outlineAll(fbo);\r\n }\r\n }\r\n\r\n paintOutline(fbo, idx, featureIds) {\r\n if (!isNil(idx)) {\r\n const pluginIdx = idx;\r\n const plugins = this._getFramePlugins();\r\n if (!plugins[pluginIdx] || plugins[pluginIdx].painter && !plugins[pluginIdx].painter.isVisible()) {\r\n return;\r\n }\r\n plugins[pluginIdx].outline(fbo, featureIds);\r\n return;\r\n }\r\n const feaPlugins = this._getFramePlugins();\r\n for (let i = 0; i < featureIds.length; i++) {\r\n const feaId = featureIds[i];\r\n for (let j = 0; j < feaPlugins.length; j++) {\r\n if (feaPlugins[j].style && feaPlugins[j].style.id === feaId) {\r\n feaPlugins[j].outline(fbo, [feaId]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n paintBatchOutline(fbo, idx) {\r\n const plugins = this._getFramePlugins();\r\n if (!plugins[idx] || plugins[idx].painter && !plugins[idx].painter.isVisible()) {\r\n return;\r\n }\r\n plugins[idx].outlineAll(fbo);\r\n }\r\n\r\n cancelOutline() {\r\n delete this._outline;\r\n delete this._outlineAll;\r\n this.setToRedraw();\r\n }\r\n\r\n setZIndex() {\r\n this.setToRedraw();\r\n // 不retire的话,taa的图层不会更新,fuzhenn/maptalks-studio#1112\r\n this._needRetire = true;\r\n return super.setZIndex.apply(this, arguments);\r\n }\r\n\r\n consumeTile(tileImage, tileInfo) {\r\n this._retirePrevTile(tileInfo);\r\n super.consumeTile(tileImage, tileInfo);\r\n if (this.layer.options.features === 'transient' && tileImage.data) {\r\n for (let j = 0; j < tileImage.data.length; j++) {\r\n if (!tileImage.data[j]) {\r\n continue;\r\n }\r\n const features = tileImage.data[j].features;\r\n if (!features) {\r\n continue;\r\n }\r\n for (const p in features) {\r\n const feature = features[p] && features[p].feature;\r\n if (!feature) {\r\n continue;\r\n }\r\n if (feature.fnTypeProps) {\r\n feature.customProps[oldPropsKey] = feature.fnTypeProps;\r\n } else {\r\n features[p] = null;\r\n }\r\n }\r\n }\r\n this.layer.fire('_transientfeature', { tileImage });\r\n }\r\n if (tileImage && tileImage.features) {\r\n tileImage.features = [];\r\n }\r\n this._createOneTile(tileInfo, tileImage);\r\n }\r\n\r\n onTileError(tileImage, tileInfo) {\r\n this._retirePrevTile(tileInfo);\r\n super.onTileError(tileImage, tileInfo);\r\n }\r\n\r\n _retirePrevTile(tileInfo) {\r\n const { id } = tileInfo;\r\n if (this._prevTilesInView && this._prevTilesInView[id]) {\r\n const oldTile = this._prevTilesInView[id];\r\n this.deleteTile(oldTile);\r\n delete this._prevTilesInView[id];\r\n }\r\n }\r\n\r\n highlight(highlights) {\r\n if (!this._highlighted) {\r\n this._highlighted = new Map();\r\n }\r\n if (Array.isArray(highlights)) {\r\n for (let i = 0; i < highlights.length; i++) {\r\n if (isNil(highlights[i].name) && !isNil(highlights[i].id)) {\r\n highlights[i] = extend({}, highlights[i]);\r\n highlights[i].name = highlights[i].id;\r\n }\r\n this._highlighted.set(highlights[i].name, highlights[i]);\r\n }\r\n } else {\r\n if (isNil(highlights.name) && !isNil(highlights.id)) {\r\n highlights = extend({}, highlights);\r\n highlights.name = highlights.id;\r\n }\r\n this._highlighted.set(highlights.name, highlights);\r\n }\r\n\r\n const plugins = this._getFramePlugins();\r\n plugins.forEach(plugin => {\r\n plugin.highlight(this._highlighted);\r\n });\r\n this._highlightUpdated = true;\r\n }\r\n\r\n cancelHighlight(names) {\r\n if (!this._highlighted) {\r\n return;\r\n }\r\n if (Array.isArray(names)) {\r\n for (let i = 0; i < names.length; i++) {\r\n this._highlighted.delete(names[i]);\r\n }\r\n } else {\r\n this._highlighted.delete(names);\r\n }\r\n const plugins = this._getFramePlugins();\r\n plugins.forEach(plugin => {\r\n plugin.highlight(this._highlighted);\r\n });\r\n this._highlightUpdated = true;\r\n }\r\n\r\n cancelAllHighlight() {\r\n if (!this._highlighted) {\r\n return;\r\n }\r\n delete this._highlighted;\r\n const plugins = this._getFramePlugins();\r\n plugins.forEach(plugin => {\r\n plugin.cancelAllHighlight();\r\n });\r\n this._highlightUpdated = true;\r\n }\r\n\r\n _getLayerOpacity() {\r\n const layerOpacity = this.layer.options['opacity'];\r\n // 不在GroupGLLayer中时,MapCanvasRenderer会读取opacity并按照透明度绘制,所以layerOpacity设成1\r\n return this._isInGroupGLLayer() ? (isNil(layerOpacity) ? 1 : layerOpacity) : 1;\r\n }\r\n}\r\n\r\nVectorTileLayerRenderer.include({\r\n calculateTileMatrix: function () {\r\n const v0 = new Array(3);\r\n const v1 = new Array(3);\r\n const v2 = new Array(3);\r\n return function (point, z, EXTENT) {\r\n const glScale = this.getTileGLScale(z);\r\n const tilePos = point;\r\n const tileSize = this.layer.getTileSize().width;\r\n const posMatrix = mat4.identity([]);\r\n //TODO 计算zScale时,zoom可能和tileInfo.z不同\r\n mat4.scale(posMatrix, posMatrix, vec3.set(v0, glScale, glScale, this._zScale));\r\n mat4.translate(posMatrix, posMatrix, vec3.set(v1, tilePos.x, tilePos.y, 0));\r\n mat4.scale(posMatrix, posMatrix, vec3.set(v2, tileSize / EXTENT, -tileSize / EXTENT, 1));\r\n\r\n return posMatrix;\r\n };\r\n }(),\r\n\r\n calculateTerrainTileMatrix: function () {\r\n const v0 = new Array(3);\r\n return function (point, z, EXTENT) {\r\n const posMatrix = mat4.identity([]);\r\n const halfExtent = EXTENT / 2;\r\n mat4.scale(posMatrix, posMatrix, vec3.set(v0, 1 / halfExtent, -1 / halfExtent, 0));\r\n mat4.translate(posMatrix, posMatrix, vec3.set(v0, -halfExtent, -halfExtent, 0));\r\n return posMatrix;\r\n };\r\n }(),\r\n\r\n calculateTileTranslationMatrix: function () {\r\n // GLTF_Mixin中用到的\r\n const v0 = new Array(3);\r\n return function (point, z) {\r\n const glScale = this.getTileGLScale(z);\r\n const tilePos = point;\r\n const posMatrix = mat4.identity([]);\r\n mat4.translate(posMatrix, posMatrix, vec3.set(v0, tilePos.x * glScale, tilePos.y * glScale, 0));\r\n return posMatrix;\r\n };\r\n }()\r\n});\r\n\r\nexport default VectorTileLayerRenderer;\r\n\r\n\r\nfunction getDefaultSymbol(type) {\r\n switch (type) {\r\n case 'native-point':\r\n return {\r\n markerFill: '#f00',\r\n markerSize: 6,\r\n markerOpacity: 0.5\r\n };\r\n case 'native-line':\r\n return {\r\n lineColor: '#bbb',\r\n lineOpacity: 0.5\r\n };\r\n case 'fill':\r\n return {\r\n polygonFill: '#76a6f0',\r\n polygonOpacity: 0.8\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nexport function evaluate(prop, properties, zoom) {\r\n if (maptalks.Util.isFunction(prop)) {\r\n if (zoom !== undefined) {\r\n return prop(zoom, properties);\r\n } else {\r\n return prop(null, properties);\r\n }\r\n } else {\r\n return prop;\r\n }\r\n}\r\n\r\nfunction isWinIntelGPU(gl) {\r\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\r\n if (debugInfo && typeof navigator !== 'undefined') {\r\n //e.g. ANGLE (Intel(R) HD Graphics 620\r\n const gpu = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\r\n const win = navigator.platform === 'Win32' || navigator.platform === 'Win64';\r\n if (gpu && gpu.toLowerCase().indexOf('intel') >= 0 && win) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction copyTileData(data) {\r\n let arrays;\r\n if (Array.isArray(data.data)) {\r\n arrays = [];\r\n pushIn(arrays, data.data);\r\n } else {\r\n arrays = {};\r\n extend(arrays, data.data);\r\n }\r\n const tileData = extend({}, data);\r\n tileData.data = arrays;\r\n return tileData;\r\n}\r\n\r\n//z小的排在后面\r\nfunction sortByLevel(m0, m1) {\r\n return m1.info.z - m0.info.z;\r\n}\r\n\r\nfunction groupFeatures(features) {\r\n const group = {};\r\n for (let i = 0; i < features.length; i++) {\r\n const layer = features[i].layer || 'default';\r\n if (!group[layer]) {\r\n group[layer] = [];\r\n }\r\n group[layer].push(features[i]);\r\n }\r\n return group;\r\n}\r\n\r\n\r\nfunction needRefreshStyle(symbol) {\r\n if (Array.isArray(symbol)) {\r\n const symbols = symbol;\r\n for (let i = 0; i < symbols.length; i++) {\r\n if (needRefreshStyle(symbols[i])) {\r\n return true;\r\n }\r\n }\r\n }\r\n for (const p in symbol) {\r\n if (isFunctionDefinition(symbol[p]) || FilterUtil.isExpression(symbol[p])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n// function getTileViewport(tile, terrainTileInfo) {\r\n// const { extent2d: extent, res, offset: terrainOffset } = terrainTileInfo;\r\n// const scale = tile.info.res / res;\r\n// const { info } = tile;\r\n// const offset = info.offset;\r\n// const width = info.extent2d.getWidth() * scale;\r\n// const height = info.extent2d.getHeight() * scale;\r\n// const xmin = info.extent2d.xmin * scale;\r\n// const ymax = info.extent2d.ymax * scale;\r\n// const left = xmin - extent.xmin;\r\n// const top = extent.ymax - ymax;\r\n// const dx = terrainOffset[0] - offset[0];\r\n// const dy = offset[1] - terrainOffset[1];\r\n// return {\r\n// x: (left + dx) * 2,\r\n// y: (extent.getHeight() - (top + dy + height)) * 2,\r\n// width: width * 2,\r\n// height: height * 2\r\n// };\r\n// }\r\n\r\nfunction getTileViewport(tileSize) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n width: tileSize * 2,\r\n height: tileSize * 2\r\n };\r\n}\r\n\r\nfunction findFeatures(image) {\r\n if (!image.cache) {\r\n return [];\r\n }\r\n for (const p in image.cache) {\r\n const data = image.cache[p];\r\n if (!data.geometry) {\r\n continue;\r\n }\r\n for (let i = 0; i < data.geometry.length; i++) {\r\n const geometry = data.geometry[i] && data.geometry[i].geometry;\r\n if (geometry && geometry.properties && geometry.properties.features) {\r\n const empty = geometry.properties.features.empty;\r\n delete geometry.properties.features.empty;\r\n const features = Object.values(geometry.properties.features);\r\n if (empty !== undefined) {\r\n geometry.properties.features.empty = empty;\r\n }\r\n return features;\r\n }\r\n }\r\n\r\n }\r\n return [];\r\n}\r\n",null,null,"import easing from 'animation-easings';\nimport { createFilter } from '@maptalks/feature-filter';\nimport VectorTilePlugin from '@maptalks/vt-plugin';\nimport { Color } from '@maptalks/vector-packer';\n\nconst DEFAULT_ANIMATION_DURATION = 800;\n\nconst NO_REDRAW = {\n redraw: false,\n retire: false\n};\n\nconst EMPTY_ARRAY = [];\n\nlet meshUID = 1;\n/**\n * Create a VT Plugin with a given painter\n */\nfunction createPainterPlugin(type, Painter) {\n const PainterPlugin = VectorTilePlugin.extend(type, {\n\n init: function () {\n this._meshCache = {};\n },\n\n isVisible() {\n return this.painter && this.painter.isVisible();\n },\n\n supportRenderMode: function (mode) {\n return this.painter.supportRenderMode(mode);\n },\n\n hasMesh() {\n return this.painter && this.painter.hasMesh();\n },\n\n startFrame: function (context) {\n const layer = context.layer,\n regl = context.regl,\n sceneConfig = context.sceneConfig,\n dataConfig = context.dataConfig,\n symbol = context.symbol;\n let painter = this.painter;\n if (!painter) {\n const pluginIndex = context.pluginIndex;\n painter = this.painter = new Painter(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig);\n }\n if (!this._meshCache) {\n this._meshCache = {};\n }\n const excludes = sceneConfig.excludes;\n if (!this._excludes) {\n if (excludes) {\n this._excludes = excludes;\n }\n } else if (excludes !== this._excludes) {\n this._excludesFunc = excludes ? createFilter(excludes) : null;\n this._excludes = excludes;\n }\n //先清除所有的tile mesh, 在后续的paintTile中重新加入,每次只绘制必要的tile\n painter.startFrame(context);\n this._frameCache = {};\n },\n\n updateCollision: function (context) {\n const painter = this.painter;\n if (painter && painter.isVisible()) {\n return painter.updateCollision(context);\n }\n return null;\n },\n\n prepareRender: function (context) {\n const painter = this.painter;\n if (painter && painter.isVisible()) {\n return painter.prepareRender(context);\n }\n return null;\n },\n\n endFrame: function (context) {\n const painter = this.painter;\n if (painter && painter.isVisible()) {\n return painter.render(context);\n }\n return null;\n },\n\n getShadowMeshes() {\n const painter = this.painter;\n if (!painter || !painter.getShadowMeshes) {\n return EMPTY_ARRAY;\n }\n return painter.getShadowMeshes() || EMPTY_ARRAY;\n },\n\n createTile: function (context) {\n const {\n tileCache,\n tileData,\n } = context;\n let retire = false;\n const painter = this.painter;\n if (!painter) {\n return { retire };\n }\n const key = this._getMeshKey(context);\n let geometries = tileCache.geometry;\n if (!geometries) {\n const features = tileData.features;\n const glData = tileData.data;\n if (!glData || !glData.length) {\n return { retire };\n }\n const data = glData;\n // 目前只有native-line和wireframe会用到\n if (this.painter.colorSymbol && !isObjectEmpty(features)) {\n for (let i = 0; i < glData.length; i++) {\n const colors = this._generateColorArray(features, glData[i].data.aPickingId, glData[i].indices, glData[i].data.aPosition, glData[i].positionSize);\n glData[i].data.aColor = colors;\n }\n }\n geometries = tileCache.geometry = painter.createGeometries(data, features);\n for (let i = 0; i < geometries.length; i++) {\n if (geometries[i] && geometries[i].geometry) {\n retire = true;\n geometries[i].geometry.properties.features = features;\n this._fillCommonProps(geometries[i].geometry, context);\n }\n }\n }\n\n let meshes = this._getMesh(key);\n if (!meshes) {\n const { meshes: newMeshes, retire: isRetire } = this._createMeshes(geometries, context);\n if (!retire) {\n retire = isRetire;\n }\n meshes = newMeshes;\n }\n return { retire };\n },\n\n _createMeshes(geometries, context) {\n const {\n tileInfo,\n tileExtent,\n tileTransform,\n tileTranslationMatrix,\n tileVectorTransform,\n tileZoom,\n sceneConfig\n } = context;\n let retire = false;\n const painter = this.painter;\n const tilePoint = [tileInfo.extent2d.xmin, tileInfo.extent2d.ymax];\n const meshes = painter.createMeshes(geometries, tileTransform, { tileExtent, tilePoint, tileZoom, tileTranslationMatrix, tileVectorTransform }, context);\n if (meshes.length) {\n for (let i = 0; i < meshes.length; i++) {\n if (meshes[i]) {\n retire = true;\n this._fillMeshProps(meshes[i], tileTransform, context.timestamp, meshUID++, painter.isEnableTileStencil());\n }\n }\n if (sceneConfig.animation) {\n meshes._animationTime = context.timestamp;\n }\n const key = this._getMeshKey(context);\n this._meshCache[key] = meshes;\n }\n return { meshes, retire };\n },\n\n paintTile: function (context) {\n const {\n tileCache,\n tileInfo,\n tileZoom,\n sceneConfig\n } = context;\n const painter = this.painter;\n if (!painter) {\n return NO_REDRAW;\n }\n\n let geometries = tileCache.geometry;\n if (!geometries) {\n return NO_REDRAW;\n }\n let retire = false;\n const key = this._getMeshKey(context);\n let meshes = this._getMesh(key);\n if (!meshes) {\n const { meshes: newMeshes, retire: isRetire } = this._createMeshes(geometries, context);\n if (!retire) {\n retire = isRetire;\n }\n meshes = newMeshes;\n }\n if (!meshes.length) {\n return NO_REDRAW;\n }\n\n //更新stencil level值,不同zoom会发生变化\n const level = painter.getTileLevelValue(tileInfo, tileZoom);//getUniformLevel(tileInfo.z, tileZoom);\n meshes.forEach(m => {\n // 保留一些有用的信息\n m.properties.tile = tileInfo;\n m.properties.level = level;\n });\n\n let redraw = false;\n if (!this._frameCache[key]) {\n let progress = null;\n let animation = sceneConfig.animation;\n if (animation) {\n const duration = context.sceneConfig.animationDuration || DEFAULT_ANIMATION_DURATION;\n const t = (context.timestamp - meshes._animationTime) / duration;\n const createTime = meshes[0].properties.createTime;\n if (meshes._animationTime - createTime < duration && t < 1) {\n if (animation === true || animation === 1) {\n animation = 'linear';\n }\n progress = animation === 'linear' ? t : easing(animation, t);\n redraw = true;\n }\n }\n\n painter.addMesh(meshes, progress, context);\n this._frameCache[key] = 1;\n }\n\n return {\n redraw,\n retire\n };\n },\n\n _fillMeshProps: function (mesh, tileTransform, timestamp, key, enableTileStencil) {\n mesh.properties.tileTransform = tileTransform;\n mesh.properties.createTime = timestamp;\n mesh.properties.meshKey = key;\n mesh.needUpdateShadow = true;\n if (enableTileStencil) {\n const defines = mesh.defines || {};\n defines['ENABLE_TILE_STENCIL'] = 1;\n mesh.setDefines(defines);\n }\n if (!('stencilRef' in mesh.uniforms)) {\n Object.defineProperty(mesh.uniforms, 'stencilRef', {\n enumerable: true,\n get: function () {\n // return mesh.properties.tile ? mesh.properties.tile.stencilRef : 255;\n if (mesh.properties.tile && mesh.properties.tile.stencilRef !== undefined) {\n return mesh.properties.tile.stencilRef;\n }\n // return maxZoom - mesh.properties.tile.z;\n return mesh.properties.level;\n }\n });\n }\n },\n\n _fillCommonProps: function (geometry, context) {\n const { layer, tileInfo } = context;\n const map = layer.getMap(),\n sr = layer.getSpatialReference ? layer.getSpatialReference() : map.getSpatialReference(),\n tileResolution = sr.getResolution(tileInfo.z),\n tileRatio = context.tileExtent / layer.getTileSize().width;\n geometry.properties.tileResolution = tileResolution;\n geometry.properties.tileRatio = tileRatio;\n geometry.properties.z = tileInfo.z;\n geometry.properties.tileExtent = context.tileExtent;\n },\n\n updateSceneConfig: function (context) {\n const painter = this.painter;\n if (painter) {\n painter.updateSceneConfig(context.sceneConfig);\n }\n },\n\n // 返回true,则重刷图层,重新构造瓦片mesh\n // 返回false,则只是请求重绘\n updateDataConfig: function (dataConfig, old) {\n const painter = this.painter;\n if (painter) {\n return painter.updateDataConfig(dataConfig, old);\n }\n return true;\n },\n\n updateSymbol: function (symbol, all) {\n const painter = this.painter;\n if (!painter) {\n return false;\n }\n if (painter.shouldDeleteMeshOnUpdateSymbol(symbol)) {\n if (this._meshCache) {\n for (const key in this._meshCache) {\n painter.deleteMesh(this._meshCache[key], true);\n }\n }\n delete this._meshCache;\n delete this._frameCache;\n }\n return painter.updateSymbol(symbol, all);\n },\n\n pick: function (x, y, tolerance) {\n if (this.painter && this.painter.pick) {\n return this.painter.pick(x, y, tolerance);\n }\n return null;\n },\n\n deleteTile: function (context) {\n if (!this._meshCache) {\n return;\n }\n const key = this._getMeshKey(context);\n const mesh = this._meshCache[key];\n if (mesh && this.painter) {\n this.painter.deleteMesh(mesh);\n }\n delete this._meshCache[key];\n if (this._frameCache) {\n delete this._frameCache[key];\n }\n },\n\n remove: function () {\n const painter = this.painter;\n if (painter && this._meshCache) {\n for (const key in this._meshCache) {\n painter.deleteMesh(this._meshCache[key]);\n }\n painter.delete();\n delete this.painter;\n }\n delete this._meshCache;\n delete this._frameCache;\n },\n\n resize: function (width, height) {\n const painter = this.painter;\n if (painter) {\n painter.resize(width, height);\n }\n },\n\n needToRedraw: function () {\n if (!this.painter) {\n return false;\n }\n return this.painter.needToRedraw();\n },\n\n needToRetireFrames: function () {\n if (!this.painter) {\n return false;\n }\n return this.painter.needToRetireFrames();\n },\n\n isAnimating() {\n if (!this.painter) {\n return false;\n }\n return this.painter.isAnimating();\n },\n\n needToRefreshTerrainTileOnZooming: function () {\n if (!this.painter) {\n return false;\n }\n return this.painter.needToRefreshTerrainTileOnZooming();\n },\n\n isTerrainSkin: function () {\n if (!this.painter) {\n return false;\n }\n return this.painter.isTerrainSkin();\n },\n\n isTerrainVector: function () {\n if (!this.painter) {\n return false;\n }\n return this.painter.isTerrainVector();\n },\n\n\n _generateColorArray: function (features, featureIndexes, indices, vertices, positionSize = 3) {\n if (!vertices || !features || !featureIndexes.length) {\n return null;\n }\n // const myColors = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'];\n const colors = new Uint8Array(vertices.length / positionSize * 4);\n let symbol, rgb;\n const colorSymbol = this.painter.colorSymbol;\n const visitedColors = {};\n let pos;\n for (let i = 0, l = featureIndexes.length; i < l; i++) {\n const idx = featureIndexes[i];\n symbol = features[idx].symbol;\n rgb = visitedColors[idx];\n if (!rgb) {\n // const color = Color(myColors[features[idx].feature.id % myColors.length]);\n // rgb = visitedColors[idx] = color.array();\n // if (symbol[this.painter.colorSymbol]) {\n // const color = Color(symbol[this.painter.colorSymbol]);\n // rgb = visitedColors[idx] = color.array();\n // } else {\n // rgb = visitedColors[idx] = [255, 255, 255];\n // }\n\n if (colorSymbol) {\n let color;\n if (typeof colorSymbol === 'function') {\n color = colorSymbol(features[idx].feature && features[idx].feature.properties);\n } else {\n color = colorSymbol;\n }\n color = Color(color);\n rgb = visitedColors[idx] = color.array();\n } else {\n rgb = visitedColors[idx] = [255, 255, 255];\n }\n }\n pos = i * 4;\n colors[pos] = rgb[0];\n colors[pos + 1] = rgb[1];\n colors[pos + 2] = rgb[2];\n colors[pos + 3] = 255 * (symbol[this.painter.opacitySymbol] || 1);\n }\n return colors;\n },\n\n _getMeshKey: function (context) {\n const tileInfo = context.tileInfo;\n // const pluginIndex = context.pluginIndex;\n const meshKey = tileInfo.meshKey;\n if (!meshKey) {\n tileInfo.meshKey = meshUID++;\n }\n return tileInfo.meshKey;\n },\n\n _getMesh: function (key) {\n return this._meshCache[key];\n },\n\n _filterElements(geometry, glData) {\n if (Array.isArray(geometry)) {\n geometry.forEach((g, idx) => {\n const { features } = g.properties;\n this._filterGeoElements(g, glData[idx], features);\n });\n } else {\n const { features } = geometry.properties;\n this._filterGeoElements(geometry, Array.isArray(glData) ? glData[0] : glData, features);\n }\n },\n\n _filterGeoElements(geometry, glData, features) {\n const featureIndexes = glData.featureIndexes || glData.data.featureIndexes;\n if (!featureIndexes) return;\n if (this._excludesFunc) {\n const indices = glData.indices;\n let pre = null,\n excluded = false;\n const elements = [];\n for (let i = 0; i < indices.length; i++) {\n const feature = features[featureIndexes[indices[i]]];\n if (pre === null || pre !== indices[i]) {\n excluded = this._excludesFunc(feature.feature);\n pre = indices[i];\n }\n if (!excluded) {\n elements.push(indices[i]);\n }\n }\n geometry.setElements(new glData.indices.constructor(elements));\n } else {\n geometry.setElements(glData.indices);\n }\n },\n\n outline(fbo, featureIds) {\n const painter = this.painter;\n if (painter) {\n painter.outline(fbo, featureIds);\n }\n },\n\n outlineAll(fbo) {\n const painter = this.painter;\n if (painter) {\n painter.outlineAll(fbo);\n }\n },\n\n needPolygonOffset() {\n const painter = this.painter;\n return painter && painter.needPolygonOffset();\n },\n\n highlight(highlights) {\n const painter = this.painter;\n const name = this.style.name;\n const pluginIndex = this.renderIndex;\n if (highlights) {\n const excludes = [];\n highlights.forEach((value, key) => {\n if (value.plugin !== undefined && value.plugin !== null) {\n if (Array.isArray(value.plugin)) {\n if (value.plugin.length && value.plugin.indexOf(name) < 0 && value.plugin.indexOf(pluginIndex) < 0) {\n excludes.push(key)\n }\n } else if (value.plugin !== name && value.plugin !== pluginIndex) {\n excludes.push(key)\n }\n }\n });\n if (excludes.length) {\n const filtered = new Map(highlights);\n for (let i = 0; i < excludes.length; i++) {\n filtered.delete(excludes[i]);\n }\n highlights = filtered;\n }\n }\n return painter && painter.highlight(highlights);\n },\n\n cancelAllHighlight() {\n const painter = this.painter;\n return painter && painter.cancelAllHighlight();\n }\n });\n\n return PainterPlugin;\n}\n\nexport default createPainterPlugin;\n\nexport function extend(dest) {\n for (let i = 1; i < arguments.length; i++) {\n const src = arguments[i];\n for (const k in src) {\n dest[k] = src[k];\n }\n }\n return dest;\n}\n\nfunction isObjectEmpty(obj) {\n if (!obj) {\n return true;\n }\n for (const p in obj) return false;\n return true;\n}\n","export function isObjectEmpty(features) {\r\n if (!features) {\r\n return true;\r\n }\r\n if (features.empty !== undefined) {\r\n return features.empty;\r\n }\r\n features.empty = isEmpty(features);\r\n return features.empty;\r\n}\r\n\r\nfunction isEmpty(obj) {\r\n for (const p in obj) return false;\r\n return true;\r\n}\r\n","import { isNil, fillArray, isArray } from '../../Util';\r\nimport { externalPropsKey } from '../../../renderer/utils/convert_to_painter_features';\r\nimport { isFunctionDefinition, interpolated } from '@maptalks/function-type';\r\nimport { StyleUtil } from '@maptalks/vector-packer';\r\nimport { isObjectEmpty } from './is_obj_empty';\r\nimport deepEqual from 'fast-deep-equal';\r\n\r\nexport const PREFIX = '_fn_type_';\r\n\r\n\r\nconst SAVED_FN_TYPE = '__current_fn_types';\r\n/**\r\n * 如果 symbolDef 有 function-type 类型,则准备需要的数据\r\n * @param {*} geometry\r\n * @param {*} features\r\n * @param {*} symbolDef\r\n * @param {*} configs\r\n */\r\nexport function prepareFnTypeData(geometry, symbolDef, configs) {\r\n const features = geometry.properties.features;\r\n if (isObjectEmpty(features)) {\r\n return;\r\n }\r\n for (let i = 0; i < configs.length; i++) {\r\n const { symbolName } = configs[i];\r\n const savedTypes = geometry[SAVED_FN_TYPE] = geometry[SAVED_FN_TYPE] || {};\r\n savedTypes[symbolName] = symbolDef[symbolName];\r\n prepareAttr(geometry, symbolDef, configs[i]);\r\n }\r\n}\r\n\r\nfunction prepareAttr(geometry, symbolDef, config) {\r\n // 因为symbol有可能被更新为fn-type,aPickingId 是必须保存的\r\n const aPickingId = preparePickingId(geometry);\r\n const { attrName, symbolName, related } = config;\r\n let arr = geometry.data[attrName];\r\n if (!arr) {\r\n if (!isFnTypeSymbol(symbolDef[symbolName])) {\r\n return null;\r\n } else {\r\n //symbol是fn-type,但arr不存在,则创建\r\n arr = geometry.data[attrName] = new config.type(config.width * aPickingId.length);\r\n updateAttrValue(arr, geometry, symbolDef, config);\r\n return arr;\r\n }\r\n } else if (!isFnTypeSymbol(symbolDef[symbolName]) && !hasRelatedFnTypeSymbol(related, symbolDef)) {\r\n //symbol不是fn-type,但存在attr,则删除arr和aIndex\r\n // if (arr && arr.buffer && arr.buffer.destroy) {\r\n // arr.buffer.destroy();\r\n // }\r\n // delete geometry.data[attrName];\r\n geometry.deleteData(attrName);\r\n removeFnTypePropArrs(geometry, attrName);\r\n return null;\r\n }\r\n if (isFnTypeSymbol(symbolDef[symbolName])) {\r\n createZoomFnTypeIndexData(geometry, symbolDef, config);\r\n }\r\n return arr;\r\n}\r\n\r\nfunction preparePickingId(geometry) {\r\n const geoProps = geometry.properties;\r\n let aPickingId = geoProps.aPickingId;\r\n if (!aPickingId) {\r\n aPickingId = geoProps.aPickingId = new geometry.data.aPickingId.constructor(geometry.data.aPickingId);\r\n }\r\n return aPickingId;\r\n}\r\n\r\nfunction updateAttrValue(arr, geometry, symbolDef, config) {\r\n const { attrName } = config;\r\n const aIndexPropName = (PREFIX + attrName + 'Index').trim();\r\n //symbol是fn-type,但arr不存在,则创建\r\n createZoomFnTypeIndexData(geometry, symbolDef, config);\r\n const aIndex = geometry.properties[aIndexPropName];\r\n updateFnTypeAttrib(geometry, aIndex, config);\r\n return arr;\r\n}\r\n\r\n/**\r\n * 检查config中属性,fntype的stops中是否存在与zoom有关的fn-type 或者 identity fn-type\r\n * 如果有,则创建受影响的feature索引,方便地图zoom时更新属性\r\n *\r\n * */\r\nfunction createZoomFnTypeIndexData(geometry, symbolDef, config) {\r\n const { attrName, symbolName } = config;\r\n const geoProps = geometry.properties;\r\n const aIndexPropName = (PREFIX + attrName + 'Index').trim();\r\n const attrPropName = (PREFIX + attrName).trim();\r\n if (geoProps[aIndexPropName] && geoProps[attrPropName]) {\r\n // 如果index已经存在说明已经在别的属性里创建过了,例如lineDx和lineDy共享了aLineDxDy时\r\n return;\r\n }\r\n const stopValues = getFnTypePropertyStopValues(symbolDef[symbolName].stops);\r\n const isIdentityFn = symbolDef[symbolName].type === 'identity';\r\n // symbol是identity类型,且属性支持 fn type 值\r\n // TODO 这里应该遍历features,检查是否有 fn type 的值\r\n const hasZoomIdentity = isIdentityFn && StyleUtil.checkIfIdentityZoomDependent(symbolName, symbolDef[symbolName].property, geoProps.features);\r\n if (!hasZoomIdentity && !stopValues.length) {\r\n //说明stops中没有function-type类型\r\n removeFnTypePropArrs(geometry, attrName);\r\n return;\r\n }\r\n\r\n const { features, aPickingId } = geoProps;\r\n const aIndex = createFnTypeFeatureIndex(features, aPickingId, symbolDef[symbolName].property, stopValues, hasZoomIdentity);\r\n if (!aIndex.length) {\r\n //说明瓦片中没有 function-type 中涉及的 feature\r\n removeFnTypePropArrs(geometry, attrName);\r\n return;\r\n }\r\n const arr = geometry.data[attrName];\r\n\r\n geoProps[aIndexPropName] = aIndex;\r\n geoProps[attrPropName] = arr.BYTES_PER_ELEMENT ? new arr.constructor(arr) : new config.type(arr.length);\r\n\r\n}\r\n\r\nfunction removeFnTypePropArrs(geometry, attrName) {\r\n const geoProps = geometry.properties;\r\n const aIndexPropName = (PREFIX + attrName + 'Index').trim();\r\n const attrPropName = (PREFIX + attrName).trim();\r\n delete geoProps[aIndexPropName];\r\n delete geoProps[attrPropName];\r\n}\r\n\r\n/**\r\n * 如果symbol中有function-type,则根据需要更新属性\r\n * @param {Object} config\r\n * @param {Array} meshes\r\n */\r\nexport function updateGeometryFnTypeAttrib(regl, symbolDef, config, meshes, z) {\r\n for (let i = 0; i < meshes.length; i++) {\r\n updateOneGeometryFnTypeAttrib(regl, symbolDef, config, meshes[i], z);\r\n }\r\n}\r\n\r\nexport function updateOneGeometryFnTypeAttrib(regl, symbolDef, configs, mesh, z) {\r\n if (!mesh) {\r\n return;\r\n }\r\n const geometry = mesh.geometry;\r\n if (!geometry) {\r\n return;\r\n }\r\n const features = geometry.properties.features;\r\n if (isObjectEmpty(features)) {\r\n return;\r\n }\r\n const layer = mesh.geometry.properties.layer;\r\n for (let i = 0; i < configs.length; i++) {\r\n const config = configs[i];\r\n const attrName = config.attrName;\r\n if (!symbolChanged(geometry, symbolDef, config) && (!layer._isFeatureStateDirty || !layer._isFeatureStateDirty(mesh.geometry._featureTimestamp))) {\r\n const { aPickingId } = geometry.properties;\r\n if (!aPickingId || geometry._fnDataZoom === z) {\r\n continue;\r\n }\r\n const aIndexPropName = (PREFIX + attrName + 'Index').trim();\r\n const aIndex = geometry.properties[aIndexPropName];\r\n if (!aIndex) {\r\n continue;\r\n }\r\n //fn-type的二级stops与zoom有关,更新数据\r\n updateFnTypeAttrib(geometry, aIndex, config);\r\n continue;\r\n }\r\n // debugger\r\n //symbol有变化,需要删除原有的arr重新生成\r\n // if (geometry.data[attrName]) {\r\n // const arr = geometry.data[attrName];\r\n // if (arr && arr.buffer && arr.buffer.destroy) {\r\n // arr.buffer.destroy();\r\n // }\r\n // delete geometry.data[attrName];\r\n // }\r\n // debugger\r\n const arr = prepareAttr(geometry, symbolDef, config);\r\n const define = config.define;\r\n if (!arr) {\r\n //原有的arr和define要删除\r\n if (define) {\r\n const defines = mesh.defines;\r\n if (defines[define]) {\r\n delete defines[define];\r\n mesh.setDefines(defines);\r\n }\r\n }\r\n } else {\r\n const aIndexPropName = (PREFIX + attrName + 'Index').trim();\r\n const aIndex = geometry.properties[aIndexPropName];\r\n //增加了新的fn-type arr,相应的需要增加define\r\n updateFnTypeAttrib(geometry, aIndex, config);\r\n if (layer._getFeatureStateStamp) {\r\n geometry._featureTimestamp = layer._getFeatureStateStamp();\r\n }\r\n if (define) {\r\n const defines = mesh.defines;\r\n defines[define] = 1;\r\n mesh.setDefines(defines);\r\n }\r\n geometry.generateBuffers(regl);\r\n }\r\n }\r\n geometry._fnDataZoom = z;\r\n}\r\n\r\nfunction symbolChanged(geometry, symbolDef, config) {\r\n const value = symbolDef[config.symbolName];\r\n const savedTypes = geometry[SAVED_FN_TYPE];\r\n if (!deepEqual(value, savedTypes[config.symbolName])) {\r\n savedTypes[config.symbolName] = value;\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction isFnTypeFeature(feature, property, stopValues) {\r\n for (let i = 0; i < stopValues.length; i++) {\r\n if (property[0] === '$' && feature[property.substring(1)] === stopValues[i] ||\r\n feature.properties[property] === stopValues[i]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 遍历所有feature,判定哪些feature受function-type影响,并返回他们在aPickingId中的起始位置\r\n * @param {Array} features\r\n * @param {Array} aPickingId\r\n * @param {String} property\r\n * @param {Array} stopValues\r\n */\r\nfunction createFnTypeFeatureIndex(features, aPickingId, property, stopValues, hasFnTypeInProperty) {\r\n const aIndex = [];\r\n let start = 0;\r\n let current = aPickingId[0];\r\n for (let ii = 1, l = aPickingId.length; ii < l; ii++) {\r\n if (features[current] && (aPickingId[ii] !== current || ii === l - 1)) {\r\n if (hasFnTypeInProperty || isFnTypeFeature(features[current].feature, property, stopValues)) {\r\n aIndex.push(start, ii === l - 1 ? l : ii);\r\n }\r\n current = aPickingId[ii];\r\n start = ii;\r\n }\r\n }\r\n return aIndex;\r\n}\r\n\r\nconst EMPTY_ARR = [];\r\n/**\r\n * 检查第二层stops中是否存在与zoom有关的fn-type (zoom变化后需要更新)\r\n * @param {Array} stops\r\n */\r\nfunction getFnTypePropertyStopValues(stops) {\r\n if (!stops) {\r\n return EMPTY_ARR;\r\n }\r\n const stopValues = [];\r\n for (let i = 0; i < stops.length; i++) {\r\n if (isFunctionDefinition(stops[i][1]) && !interpolated(stops[i][1]).isZoomConstant) {\r\n stopValues.push(stops[i][0]);\r\n }\r\n }\r\n return stopValues;\r\n}\r\n\r\n/**\r\n * 遍历并更新geometry的function-type属性数据\r\n * @param {String} attrName\r\n * @param {reshader.Geometry} geometry\r\n * @param {Array} aIndex\r\n * @param {Function} evaluate\r\n */\r\nfunction updateFnTypeAttrib(geometry, aIndex, config) {\r\n const { attrName, evaluate } = config;\r\n const { aPickingId, features } = geometry.properties;\r\n let arr;\r\n if (aIndex) {\r\n //二级stops存在与zoom有关的fn-type\r\n const attrProp = (PREFIX + attrName).trim();\r\n arr = geometry.properties[attrProp];\r\n const len = arr.length / aPickingId.length;\r\n const l = aIndex.length;\r\n for (let i = 0; i < l; i += 2) {\r\n const start = aIndex[i];\r\n const end = aIndex[i + 1];\r\n let feature = features[aPickingId[start]];\r\n if (!feature || !feature.feature) {\r\n continue;\r\n }\r\n evaluateAndUpdate(arr, feature, evaluate, start, end, len, geometry);\r\n }\r\n } else {\r\n //存在fn-type,但symbol更新过,要重新计算arr里的值\r\n arr = geometry.data[attrName];\r\n if (isArray(arr)) {\r\n arr.dirty = true;\r\n } else {\r\n const keyName = (PREFIX + attrName).trim();\r\n arr = geometry.properties[keyName];\r\n if (!arr) {\r\n arr = geometry.properties[keyName] = new config.type(config.width * aPickingId.length);\r\n arr.dirty = true;\r\n }\r\n }\r\n\r\n const len = arr.length / aPickingId.length;\r\n const l = aPickingId.length;\r\n let start = 0;\r\n for (let i = 0; i < l; i++) {\r\n if (aPickingId[i] === aPickingId[start] && i < l - 1) {\r\n continue;\r\n }\r\n let feature = features[aPickingId[start]];\r\n if (feature && feature.feature) {\r\n evaluateAndUpdate(arr, feature, evaluate, start, i === l - 1 ? l : i, len, geometry);\r\n start = i;\r\n }\r\n }\r\n }\r\n if (arr.dirty) {\r\n geometry.updateData(attrName, arr);\r\n arr.dirty = false;\r\n }\r\n}\r\n\r\nconst SOURCE = {};\r\nfunction evaluateAndUpdate(arr, feature, evaluate, start, end, len, geometry) {\r\n feature = feature.feature;\r\n const properties = feature.properties || {};\r\n if (properties['$layer'] === undefined) {\r\n if (!feature.properties) {\r\n feature.properties = properties;\r\n }\r\n properties['$layer'] = feature.layer;\r\n properties['$type'] = feature.type;\r\n }\r\n const layer = geometry.properties.layer;\r\n if (layer.getFeatureState) {\r\n SOURCE.layer = feature.layer;\r\n SOURCE.id = feature.id;\r\n if (feature[externalPropsKey]) {\r\n feature[externalPropsKey] = null;\r\n }\r\n if (!isNil(feature.id)) {\r\n const states = layer.getFeatureState(SOURCE);\r\n feature.properties[externalPropsKey] = states;\r\n }\r\n }\r\n\r\n const value = evaluate(properties, geometry, arr, start * len);\r\n if (Array.isArray(value)) {\r\n let dirty = false;\r\n for (let ii = 0; ii < len; ii++) {\r\n if (arr[start * len + ii] !== value[ii]) {\r\n dirty = true;\r\n break;\r\n }\r\n }\r\n if (dirty) {\r\n for (let iii = start * len; iii < end * len; iii += len) {\r\n arr.set(value, iii);\r\n }\r\n arr.dirty = true;\r\n }\r\n } else if (arr[start] !== value) {\r\n fillArray(arr, value, start, end);\r\n arr.dirty = true;\r\n }\r\n}\r\n\r\nexport function isFnTypeSymbol(symbolProp) {\r\n return StyleUtil.isFnTypeSymbol(symbolProp);\r\n}\r\n\r\n\r\nfunction hasRelatedFnTypeSymbol(related, symbolDef) {\r\n if (!Array.isArray(related)) {\r\n return false;\r\n }\r\n for (let i = 0; i < related.length; i++) {\r\n if (isFnTypeSymbol(symbolDef[related[i]])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n","'use strict';\n\nmodule.exports = Point;\n\n/**\n * A standalone point geometry with useful accessor, comparison, and\n * modification methods.\n *\n * @class Point\n * @param {Number} x the x-coordinate. this could be longitude or screen\n * pixels, or any other sort of unit.\n * @param {Number} y the y-coordinate. this could be latitude or screen\n * pixels, or any other sort of unit.\n * @example\n * var point = new Point(-77, 38);\n */\nfunction Point(x, y) {\n this.x = x;\n this.y = y;\n}\n\nPoint.prototype = {\n\n /**\n * Clone this point, returning a new point that can be modified\n * without affecting the old one.\n * @return {Point} the clone\n */\n clone: function() { return new Point(this.x, this.y); },\n\n /**\n * Add this point's x & y coordinates to another point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n add: function(p) { return this.clone()._add(p); },\n\n /**\n * Subtract this point's x & y coordinates to from point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n sub: function(p) { return this.clone()._sub(p); },\n\n /**\n * Multiply this point's x & y coordinates by point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n multByPoint: function(p) { return this.clone()._multByPoint(p); },\n\n /**\n * Divide this point's x & y coordinates by point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n divByPoint: function(p) { return this.clone()._divByPoint(p); },\n\n /**\n * Multiply this point's x & y coordinates by a factor,\n * yielding a new point.\n * @param {Point} k factor\n * @return {Point} output point\n */\n mult: function(k) { return this.clone()._mult(k); },\n\n /**\n * Divide this point's x & y coordinates by a factor,\n * yielding a new point.\n * @param {Point} k factor\n * @return {Point} output point\n */\n div: function(k) { return this.clone()._div(k); },\n\n /**\n * Rotate this point around the 0, 0 origin by an angle a,\n * given in radians\n * @param {Number} a angle to rotate around, in radians\n * @return {Point} output point\n */\n rotate: function(a) { return this.clone()._rotate(a); },\n\n /**\n * Rotate this point around p point by an angle a,\n * given in radians\n * @param {Number} a angle to rotate around, in radians\n * @param {Point} p Point to rotate around\n * @return {Point} output point\n */\n rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); },\n\n /**\n * Multiply this point by a 4x1 transformation matrix\n * @param {Array<Number>} m transformation matrix\n * @return {Point} output point\n */\n matMult: function(m) { return this.clone()._matMult(m); },\n\n /**\n * Calculate this point but as a unit vector from 0, 0, meaning\n * that the distance from the resulting point to the 0, 0\n * coordinate will be equal to 1 and the angle from the resulting\n * point to the 0, 0 coordinate will be the same as before.\n * @return {Point} unit vector point\n */\n unit: function() { return this.clone()._unit(); },\n\n /**\n * Compute a perpendicular point, where the new y coordinate\n * is the old x coordinate and the new x coordinate is the old y\n * coordinate multiplied by -1\n * @return {Point} perpendicular point\n */\n perp: function() { return this.clone()._perp(); },\n\n /**\n * Return a version of this point with the x & y coordinates\n * rounded to integers.\n * @return {Point} rounded point\n */\n round: function() { return this.clone()._round(); },\n\n /**\n * Return the magitude of this point: this is the Euclidean\n * distance from the 0, 0 coordinate to this point's x and y\n * coordinates.\n * @return {Number} magnitude\n */\n mag: function() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n\n /**\n * Judge whether this point is equal to another point, returning\n * true or false.\n * @param {Point} other the other point\n * @return {boolean} whether the points are equal\n */\n equals: function(other) {\n return this.x === other.x &&\n this.y === other.y;\n },\n\n /**\n * Calculate the distance from this point to another point\n * @param {Point} p the other point\n * @return {Number} distance\n */\n dist: function(p) {\n return Math.sqrt(this.distSqr(p));\n },\n\n /**\n * Calculate the distance from this point to another point,\n * without the square root step. Useful if you're comparing\n * relative distances.\n * @param {Point} p the other point\n * @return {Number} distance\n */\n distSqr: function(p) {\n var dx = p.x - this.x,\n dy = p.y - this.y;\n return dx * dx + dy * dy;\n },\n\n /**\n * Get the angle from the 0, 0 coordinate to this point, in radians\n * coordinates.\n * @return {Number} angle\n */\n angle: function() {\n return Math.atan2(this.y, this.x);\n },\n\n /**\n * Get the angle from this point to another point, in radians\n * @param {Point} b the other point\n * @return {Number} angle\n */\n angleTo: function(b) {\n return Math.atan2(this.y - b.y, this.x - b.x);\n },\n\n /**\n * Get the angle between this point and another point, in radians\n * @param {Point} b the other point\n * @return {Number} angle\n */\n angleWith: function(b) {\n return this.angleWithSep(b.x, b.y);\n },\n\n /*\n * Find the angle of the two vectors, solving the formula for\n * the cross product a x b = |a||b|sin(θ) for θ.\n * @param {Number} x the x-coordinate\n * @param {Number} y the y-coordinate\n * @return {Number} the angle in radians\n */\n angleWithSep: function(x, y) {\n return Math.atan2(\n this.x * y - this.y * x,\n this.x * x + this.y * y);\n },\n\n _matMult: function(m) {\n var x = m[0] * this.x + m[1] * this.y,\n y = m[2] * this.x + m[3] * this.y;\n this.x = x;\n this.y = y;\n return this;\n },\n\n _add: function(p) {\n this.x += p.x;\n this.y += p.y;\n return this;\n },\n\n _sub: function(p) {\n this.x -= p.x;\n this.y -= p.y;\n return this;\n },\n\n _mult: function(k) {\n this.x *= k;\n this.y *= k;\n return this;\n },\n\n _div: function(k) {\n this.x /= k;\n this.y /= k;\n return this;\n },\n\n _multByPoint: function(p) {\n this.x *= p.x;\n this.y *= p.y;\n return this;\n },\n\n _divByPoint: function(p) {\n this.x /= p.x;\n this.y /= p.y;\n return this;\n },\n\n _unit: function() {\n this._div(this.mag());\n return this;\n },\n\n _perp: function() {\n var y = this.y;\n this.y = this.x;\n this.x = -y;\n return this;\n },\n\n _rotate: function(angle) {\n var cos = Math.cos(angle),\n sin = Math.sin(angle),\n x = cos * this.x - sin * this.y,\n y = sin * this.x + cos * this.y;\n this.x = x;\n this.y = y;\n return this;\n },\n\n _rotateAround: function(angle, p) {\n var cos = Math.cos(angle),\n sin = Math.sin(angle),\n x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),\n y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n this.x = x;\n this.y = y;\n return this;\n },\n\n _round: function() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n};\n\n/**\n * Construct a point from an array if necessary, otherwise if the input\n * is already a Point, or an unknown type, return it unchanged\n * @param {Array<Number>|Point|*} a any kind of input value\n * @return {Point} constructed point, or passed-through value.\n * @example\n * // this\n * var point = Point.convert([0, 1]);\n * // is equivalent to\n * var point = new Point(0, 1);\n */\nPoint.convert = function (a) {\n if (a instanceof Point) {\n return a;\n }\n if (Array.isArray(a)) {\n return new Point(a[0], a[1]);\n }\n return a;\n};\n","import { vec4 } from '@maptalks/gl';\r\n\r\nconst v4 = [];\r\n\r\n/**\r\n * Project a tile coordinate to screen coordinate\r\n * @param {Number[]} out - array to receive result\r\n * @param {Number[]} point - tile coordinate\r\n * @param {Number[]} matrix - projection matrix\r\n * @param {Number} width - canvas width\r\n * @param {Number} height - canvas height\r\n */\r\nexport function projectPoint(out, point, matrix, width, height) {\r\n vec4.set(v4, point[0], point[1], point[2], 1);\r\n vec4.transformMat4(v4, v4, matrix);\r\n out[2] = v4[3]; //depth\r\n vec4.scale(v4, v4, 1 / v4[3]);\r\n out[0] = (v4[0] + 1) * width / 2;\r\n out[1] = (-v4[1] + 1) * height / 2;\r\n return out;\r\n}\r\n\r\n/**\r\n * Project a line from tile coordinate to screen coordinate\r\n * @param {Number[]} out - array to receive result\r\n * @param {Number[]} line - line's tile coordinate\r\n * @param {Number[]} matrix - projection matrix\r\n * @param {Number} width - canvas width\r\n * @param {Number} height - canvas height\r\n */\r\nexport function projectLine(out, line, matrix, width, height) {\r\n for (let i = 0; i < line.length; i += 3) {\r\n vec4.set(v4, line[i], line[i + 1], line[i + 2], 1);\r\n projectPoint(v4, v4, matrix, width, height);\r\n out[i] = v4[0];\r\n out[i + 1] = v4[1];\r\n //TODO line[i + 2]的单位?\r\n out[i + 2] = line[i + 2];\r\n }\r\n return out;\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport Point from '@mapbox/point-geometry';\r\nimport { projectPoint } from './projection';\r\nimport { vec3 } from '@maptalks/gl';\r\nimport { INVALID_ALTITUDE } from '../../../../common/Constant';\r\n\r\nconst CURRENT2 = [];\r\nconst PREV2 = [];\r\nconst P2 = [];\r\n\r\n/**\r\n * based on placeGlyphAlongLine in projection.js of mapbox-gl-js\r\n * @param {Number[]} out -\r\n * @param {Number[]} anchor - quad's anchor\r\n * @param {}\r\n * @param {Number} dx - offset x\r\n * @param {Number} dy - offset y\r\n */\r\nexport function getLineOffset(out, mesh, line, projectedAnchor, anchor, glyphOffset, dx, dy, segment, lineStartIndex, lineLength, fontScale, flip, scale, elevatedAnchor, vtLayer, mvpMatrix, isPitchWithMap) {\r\n if (!elevatedAnchor) {\r\n elevatedAnchor = projectedAnchor;\r\n }\r\n const linePoints = mesh.geometry.properties.line;\r\n\r\n const glyphOffsetX = glyphOffset[0] * fontScale;\r\n const offsetX = flip ?\r\n glyphOffsetX - dx :\r\n glyphOffsetX + dx;\r\n\r\n let dir = offsetX > 0 ? 1 : -1;\r\n\r\n let angle = 0;\r\n if (flip) {\r\n // The label needs to be flipped to keep text upright.\r\n // Iterate in the reverse direction.\r\n dir *= -1;\r\n angle = Math.PI;\r\n }\r\n if (dir < 0) angle += Math.PI;\r\n\r\n\r\n const lineEndIndex = lineStartIndex + lineLength;\r\n\r\n const absOffsetX = Math.abs(offsetX);\r\n\r\n let currentIndex = dir > 0 ?\r\n segment :\r\n segment + 1;\r\n\r\n let current = Point.convert(projectedAnchor);\r\n let prev = Point.convert(projectedAnchor);\r\n\r\n let currentPoint = Point.convert(anchor);\r\n let prevPoint = Point.convert(anchor);\r\n\r\n let distanceToPrev = 0;\r\n let currentSegmentDistance = 0;\r\n while (distanceToPrev + currentSegmentDistance <= absOffsetX) {\r\n currentIndex += dir;\r\n\r\n // offset does not fit on the projected line\r\n if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) {\r\n return null;\r\n }\r\n\r\n // prev = current;\r\n prev.x = current.x;\r\n prev.y = current.y;\r\n\r\n prevPoint.x = currentPoint.x;\r\n prevPoint.y = currentPoint.y;\r\n\r\n current.x = line[currentIndex * 3];\r\n current.y = line[currentIndex * 3 + 1];\r\n\r\n currentPoint.x = linePoints[currentIndex * 3];\r\n currentPoint.y = linePoints[currentIndex * 3 + 1];\r\n\r\n distanceToPrev += currentSegmentDistance;\r\n currentSegmentDistance = prev.dist(current) / scale;\r\n }\r\n // The point is on the current segment. Interpolate to find it.\r\n const segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance;\r\n\r\n const renderer = vtLayer && vtLayer.getRenderer();\r\n const terrainHelper = renderer && renderer.getTerrainHelper();\r\n const terrainTileInfos = mesh.properties.tile.terrainTileInfos;\r\n // const terrainTileInfo = mesh.properties.tile.terrainTileInfo;\r\n if (!isPitchWithMap && terrainHelper) {\r\n const { extent } = mesh.properties.tile;\r\n const tileScale = vtLayer.getTileSize().width / extent;\r\n const map = vtLayer.getMap();\r\n const prevToCurrent = currentPoint.sub(prevPoint);\r\n let p = prevToCurrent.mult(segmentInterpolationT)._add(prevPoint);\r\n\r\n current = elevate(CURRENT2, map, mesh, currentPoint, tileScale, vtLayer, mvpMatrix, terrainTileInfos);\r\n prev = elevate(PREV2, map, mesh, prevPoint, tileScale, vtLayer, mvpMatrix, terrainTileInfos);\r\n p = elevate(P2, map, mesh, p, tileScale, vtLayer, mvpMatrix, terrainTileInfos);\r\n\r\n const segmentAngle = angle + Math.atan2(current[1] - prev[1], current[0] - prev[0]);\r\n\r\n out[0] = (p[0] - elevatedAnchor[0]) / scale;\r\n out[1] = (p[1] - elevatedAnchor[1]) / scale;\r\n out[2] = segmentAngle;\r\n return out;\r\n }\r\n\r\n const prevToCurrent = current.sub(prev);\r\n const p = prevToCurrent.mult(segmentInterpolationT)._add(prev);\r\n\r\n // offset the point from the line to text-offset and icon-offset\r\n p._add(prevToCurrent._unit()._perp()._mult(dy * dir));\r\n\r\n const segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x);\r\n\r\n out[0] = (p.x - projectedAnchor[0]) / scale;\r\n out[1] = (p.y - projectedAnchor[1]) / scale;\r\n out[2] = segmentAngle;\r\n\r\n return out;\r\n}\r\n\r\nconst INVALID_OFFSET = [-99999, -99999];\r\nconst TILEPOINT = new maptalks.Point(0, 0);\r\nconst TEMP_V3 = [];\r\n\r\nfunction elevate(out, map, mesh, anchor, tileScale, vtLayer, mvpMatrix, terrainTileInfos) {\r\n const { res, extent, extent2d } = mesh.properties.tile;\r\n const { xmin, ymax } = extent2d;\r\n const x = xmin + anchor.x * tileScale;\r\n const y = ymax - anchor.y * tileScale;\r\n let terrainTileInfo = null;\r\n if (terrainTileInfos) {\r\n for (let i = 0; i < terrainTileInfos.length; i++) {\r\n if (inTerrainTile(terrainTileInfos[i], x, y, res)) {\r\n terrainTileInfo = terrainTileInfos[i];\r\n break;\r\n\r\n }\r\n }\r\n }\r\n if (!terrainTileInfo) {\r\n return INVALID_OFFSET;\r\n }\r\n const tilePoint = TILEPOINT.set(xmin, ymax);\r\n const altitudeResult = vtLayer.queryTilePointTerrain(anchor, terrainTileInfo, tilePoint, extent, res);\r\n const altitude = altitudeResult[0] === null ? INVALID_ALTITUDE : altitudeResult[0];\r\n if (altitude) {\r\n let elevatedAnchor = vec3.set(TEMP_V3, anchor.x, anchor.y, 0);\r\n elevatedAnchor[2] += altitude * 100;\r\n elevatedAnchor = projectPoint(out, elevatedAnchor, mvpMatrix, map.width, map.height);\r\n return elevatedAnchor;\r\n } else {\r\n out[0] = anchor.x;\r\n out[1] = anchor.y;\r\n return out;\r\n }\r\n}\r\n\r\n\r\nexport function inTerrainTile(tileInfo, x, y, res) {\r\n const point0 = TILEPOINT.set(x, y);\r\n const point1 = point0['_multi'](res / tileInfo.res);\r\n return tileInfo.extent2d.contains(point1);\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { reshader, vec3, mat4, HighlightUtil } from '@maptalks/gl';\r\nimport { SYMBOLS_NEED_REBUILD_IN_VT, StyleUtil, FuncTypeUtil } from '@maptalks/vector-packer';\r\nimport { isFunctionDefinition, interpolated, piecewiseConstant } from '@maptalks/function-type';\r\nimport { extend, copyJSON, isNil, hasOwn } from '../Util';\r\nimport outlineFrag from './glsl/outline.frag';\r\nimport { updateOneGeometryFnTypeAttrib } from './util/fn_type_util';\r\nimport { inTerrainTile } from './util/line_offset';\r\nimport deepEuqal from 'fast-deep-equal';\r\nimport { oldPropsKey, externalPropsKey } from '../../renderer/utils/convert_to_painter_features';\r\nimport { INVALID_ALTITUDE } from '../../../common/Constant';\r\n\r\nconst { loginIBLResOnCanvas, logoutIBLResOnCanvas, getIBLResOnCanvas } = reshader.pbr.PBRUtils;\r\n\r\nconst TEX_CACHE_KEY = '__gl_textures';\r\n\r\n// const MAT = [];\r\nconst V3 = [];\r\nconst TILEPOINT = new maptalks.Point(0, 0);\r\nconst ANCHOR_POINT = new maptalks.Point(0, 0);\r\n\r\nconst ALTITUDE32 = new Float32Array(1);\r\n\r\nconst EMPTY_ARRAY = [];\r\nconst level0Filter = mesh => {\r\n return mesh.properties.level === 0;\r\n};\r\n\r\nconst levelNFilter = mesh => {\r\n return mesh.properties.level > 0;\r\n};\r\n\r\nclass Painter {\r\n static getBloomSymbol() {\r\n return ['bloom'];\r\n }\r\n\r\n constructor(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig) {\r\n this._is2D = true;\r\n this.regl = regl;\r\n this.layer = layer;\r\n this.canvas = regl['_gl'].canvas;\r\n this.sceneConfig = sceneConfig || {};\r\n this.dataConfig = dataConfig || {};\r\n //插件的序号,也是style的序号\r\n this.pluginIndex = pluginIndex;\r\n this.scene = new reshader.Scene();\r\n this.pickingFBO = layer.getRenderer().pickingFBO;\r\n this.level0Filter = level0Filter;\r\n this.levelNFilter = levelNFilter;\r\n this.loginTextureCache();\r\n this.symbolDef = Array.isArray(symbol) ? symbol.map(s => copyJSON(s)) : [copyJSON(symbol)];\r\n this._compileSymbols();\r\n this.pickingViewport = {\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 this.sortByCommandKey = sortByCommandKey.bind(this);\r\n this.colorCache = {};\r\n // 因为一开始visible为false的数据不会被创建,需要记录下来,updateSymbol时决定是否需要重新创建数据\r\n this._invisibleWhenCreated = this.symbolDef.map(s => !!(s && s.visible === false));\r\n }\r\n\r\n hasMesh() {\r\n const meshes = this.scene && this.scene.getMeshes();\r\n return this.isVisible() && meshes && !!meshes.length;\r\n }\r\n\r\n getMap() {\r\n return this.layer ? this.layer.getMap() : null;\r\n }\r\n\r\n getTileLevelValue(tileInfo, currentTileZoom) {\r\n const renderer = this.layer.getRenderer();\r\n return renderer.getTileLevelValue && renderer.getTileLevelValue(tileInfo, currentTileZoom) || 0;\r\n }\r\n\r\n getAnalysisMeshes() {\r\n if (this.getShadowMeshes) {\r\n return this.getShadowMeshes();\r\n }\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n isVisible() {\r\n //TODO visibleFn没有支持多symbol\r\n // if (this._visibleFn && !this._visibleFn.isFeatureConstant) {\r\n // return true;\r\n // }\r\n const { minZoom, maxZoom } = this.sceneConfig;\r\n const map = this.getMap();\r\n const zoom = map.getZoom();\r\n if (!isNil(minZoom) && zoom < minZoom) {\r\n return false;\r\n }\r\n if (!isNil(maxZoom) && zoom > maxZoom) {\r\n return false;\r\n }\r\n const visibleFns = this._visibleFn;\r\n if (visibleFns.length) {\r\n for (let i = 0; i < visibleFns.length; i++) {\r\n if (visibleFns[i] && !visibleFns[i].isFeatureConstant) {\r\n return true;\r\n }\r\n }\r\n }\r\n const symbols = this.getSymbols();\r\n for (let i = 0; i < symbols.length; i++) {\r\n const visible = symbols[i].visible;\r\n if (visible !== false && visible !== 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n isMeshVisible(mesh) {\r\n const symbolIndex = mesh && mesh.properties && mesh.properties.symbolIndex;\r\n if (!symbolIndex) {\r\n return false;\r\n }\r\n const visibleFns = this._visibleFn;\r\n const i = symbolIndex.index;\r\n let visible;\r\n if (visibleFns[i]) {\r\n if (!visibleFns[i].isFeatureConstant) {\r\n return true;\r\n } else {\r\n visible = visibleFns[i](this.getMap().getZoom());\r\n }\r\n } else {\r\n visible = this.getSymbol(symbolIndex).visible;\r\n }\r\n return visible !== false && visible !== 0;\r\n }\r\n\r\n isAnimating() {\r\n return false;\r\n }\r\n\r\n needToRedraw() {\r\n return this.isAnimating() || this._redraw;\r\n }\r\n\r\n needToRetireFrames() {\r\n return this._needRetire;\r\n }\r\n\r\n needToRefreshTerrainTileOnZooming() {\r\n return true;\r\n }\r\n\r\n isTerrainSkin() {\r\n return this.layer.options.awareOfTerrain;\r\n }\r\n\r\n isTerrainVector() {\r\n return false;\r\n }\r\n\r\n isShadowIncludeChanged(context) {\r\n const isRenderingTerrainSkin = context && context.isRenderingTerrain && this.isTerrainSkin();\r\n return context && context.states && context.states.includesChanged['shadow'] || isRenderingTerrainSkin && this._includeKeys;\r\n }\r\n\r\n fillIncludes(defines, uniformDeclares, context) {\r\n delete this._includeKeys;\r\n if (context && context.isRenderingTerrain && this.isTerrainSkin()) {\r\n return;\r\n }\r\n const includes = context && context.includes;\r\n if (includes) {\r\n let keys = '';\r\n for (const p in includes) {\r\n if (includes[p]) {\r\n keys += p;\r\n if (context[p].uniformDeclares) {\r\n uniformDeclares.push(...context[p].uniformDeclares);\r\n }\r\n if (context[p].defines) {\r\n extend(defines, context[p].defines);\r\n }\r\n }\r\n }\r\n this._includeKeys = keys;\r\n }\r\n }\r\n\r\n setIncludeUniformValues(uniforms, context) {\r\n if (context && context.isRenderingTerrain && this.isTerrainSkin()) {\r\n return;\r\n }\r\n const includes = context && context.includes;\r\n if (includes) {\r\n for (const p in includes) {\r\n if (includes[p]) {\r\n if (context[p].renderUniforms) {\r\n extend(uniforms, context[p].renderUniforms);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n createGeometries(glData, features) {\r\n if (!glData.length) {\r\n return EMPTY_ARRAY;\r\n }\r\n const geometries = [];\r\n for (let i = 0; i < glData.length; i++) {\r\n if (!glData[i]) {\r\n continue;\r\n }\r\n if (glData[i].ref !== undefined) {\r\n if (!geometries[glData[i].ref]) {\r\n geometries.push(null);\r\n } else {\r\n geometries.push({\r\n geometry: geometries[glData[i].ref].geometry,\r\n symbolIndex: glData[i].symbolIndex,\r\n ref: glData[i].ref\r\n });\r\n }\r\n } else {\r\n if (glData[i] && !glData[i].is2D) {\r\n this._is2D = false;\r\n }\r\n const geo = this.createGeometry(glData[i], features, i);\r\n if (geo && geo.geometry) {\r\n const props = geo.geometry.properties;\r\n const { pickingIdMap, idPickingMap, hasFeaIds } = this._getIdMap(glData[i]);\r\n if (hasFeaIds) {\r\n props.feaIdPickingMap = pickingIdMap;\r\n props.feaPickingIdMap = idPickingMap;\r\n }\r\n\r\n props.symbolIndex = geo.symbolIndex;\r\n props.features = features;\r\n props.is2D = glData[i].is2D;\r\n props.layer = this.layer;\r\n props.positionBounding = glData[i].positionBounding;\r\n // props.elements = props.elements || geo.geometry.elements;\r\n\r\n this.postCreateGeometry(geo, geometries);\r\n }\r\n // null 也需要push,保证ref指向的顺序是正确的\r\n geometries.push(geo);\r\n }\r\n }\r\n return geometries;\r\n }\r\n\r\n isOnly2D() {\r\n return this._is2D;\r\n }\r\n\r\n postCreateGeometry() {}\r\n\r\n _getIdMap(glData) {\r\n if (!glData) {\r\n return {};\r\n }\r\n if (Array.isArray(glData)) {\r\n glData = glData[0];\r\n if (!glData) {\r\n return {};\r\n }\r\n }\r\n const feaIds = glData.featureIds;\r\n const idPickingMap = {};\r\n const pickingIdMap = {};\r\n const hasFeaIds = feaIds && feaIds.length;\r\n if (hasFeaIds) {\r\n for (let i = 0; i < feaIds.length; i++) {\r\n const pickingId = glData.data.aPickingId[i];\r\n if (idPickingMap[pickingId] !== undefined) {\r\n continue;\r\n }\r\n idPickingMap[pickingId] = feaIds[i];\r\n if (!pickingIdMap[feaIds[i]]) {\r\n pickingIdMap[feaIds[i]] = [];\r\n }\r\n pickingIdMap[feaIds[i]].push(glData.data.aPickingId[i]);\r\n }\r\n }\r\n return { hasFeaIds, idPickingMap, pickingIdMap };\r\n }\r\n\r\n createGeometry(/* glData, features */) {\r\n throw new Error('not implemented');\r\n }\r\n\r\n createMeshes(geometries, transform, params, context) {\r\n const awareOfTerrain = this.layer.options.awareOfTerrain;\r\n const meshes = [];\r\n for (let i = 0; i < geometries.length; i++) {\r\n if (!geometries[i]) {\r\n continue;\r\n }\r\n if (awareOfTerrain && context && context.isRenderingTerrain && this.isTerrainVector()) {\r\n const geometry = geometries[i];\r\n const geo = geometry && geometry.geometry;\r\n this._updateTerrainAltitude(geo, geo.data, geo.properties, geo.positionSize || geo.desc.positionSize, context);\r\n }\r\n let mesh = this.createMesh(geometries[i], transform, params, context || {});\r\n if (Array.isArray(mesh)) {\r\n mesh = mesh.filter(m => !!m);\r\n meshes.push(...mesh);\r\n } else if (mesh) {\r\n meshes.push(mesh);\r\n }\r\n\r\n }\r\n return meshes;\r\n }\r\n\r\n createMesh(/* geometries, transform */) {\r\n throw new Error('not implemented');\r\n }\r\n\r\n getAltitudeOffsetMatrix() {\r\n const altitudeOffset = (this.dataConfig.altitudeOffset || 0) * 100;\r\n const matrix = mat4.identity([]);\r\n vec3.set(V3, 0, 0, altitudeOffset);\r\n mat4.translate(matrix, matrix, V3);\r\n return matrix;\r\n }\r\n\r\n isBloom(mesh) {\r\n return !!this.getSymbol(mesh.properties.symbolIndex)['bloom'];\r\n }\r\n\r\n // 不允许地形上的upscale放大\r\n forbiddenTerrainUpscale() {\r\n return true;\r\n }\r\n\r\n addMesh(meshes, progress, context) {\r\n // console.log(meshes.map(m => m.properties.tile.id).join());\r\n // if (meshes[0].properties.tile.id === 'data_vt__85960__140839__19') {\r\n // console.log(meshes[0].properties.tile.z, meshes[0].properties.level);\r\n // this.scene.addMesh(meshes[0]);\r\n // }\r\n\r\n const isRenderingTerrainSkin = context.isRenderingTerrain && this.isTerrainSkin();\r\n if (isRenderingTerrainSkin && this.forbiddenTerrainUpscale()) {\r\n const res = this.getMap().getResolution();\r\n const tileRes = context.tileInfo.res;\r\n const scale = tileRes / res;\r\n if (scale > 3) {\r\n // 过于放大\r\n return;\r\n }\r\n }\r\n const isRenderingTerrainVector = context.isRenderingTerrain && this.isTerrainVector();\r\n const fbo = this.getRenderFBO(context);\r\n meshes = meshes.filter(m => this.isMeshVisible(m));\r\n if (isRenderingTerrainVector) {\r\n // 只绘制加载了地形数据的mesh\r\n meshes = meshes.filter(m => m.geometry && m.geometry.data.aTerrainAltitude);\r\n }\r\n const castShadow = this.sceneConfig.castShadow === undefined || !!this.sceneConfig.castShadow;\r\n const isEnableBloom = !!(context && context.bloom);\r\n meshes.forEach(mesh => {\r\n const bloom = this.isBloom(mesh) && isEnableBloom;\r\n mesh.bloom = bloom;\r\n mesh.castShadow = castShadow;\r\n let updated = false;\r\n const defines = mesh.defines || {};\r\n if (!!defines['HAS_BLOOM'] !== bloom) {\r\n updated = true;\r\n if (bloom) {\r\n defines['HAS_BLOOM'] = 1;\r\n } else {\r\n delete defines['HAS_BLOOM'];\r\n }\r\n }\r\n if (isRenderingTerrainVector) {\r\n if (mesh.geometry.data.aTerrainAltitude) {\r\n const geo = mesh.geometry;\r\n this._updateTerrainAltitude(geo, geo.data, geo.properties, geo.desc.positionSize, context);\r\n }\r\n if (mesh.geometry.data.aTerrainAltitude && !defines['HAS_TERRAIN_ALTITUDE']) {\r\n defines['HAS_TERRAIN_ALTITUDE'] = 1;\r\n updated = true;\r\n }\r\n } else if (defines['HAS_TERRAIN_ALTITUDE']) {\r\n delete defines['HAS_TERRAIN_ALTITUDE'];\r\n updated = true;\r\n }\r\n\r\n if (updated) {\r\n mesh.setDefines(defines);\r\n }\r\n if (!fbo) {\r\n if (mesh.uniforms['targetFramebuffer']) {\r\n mesh.uniforms['targetFramebuffer'] = null;\r\n }\r\n } else {\r\n mesh.setUniform('targetFramebuffer', fbo);\r\n }\r\n this._highlightMesh(mesh);\r\n });\r\n\r\n this.scene.addMesh(meshes);\r\n return;\r\n }\r\n\r\n updateCollision(/*context*/) {\r\n\r\n }\r\n\r\n render(context) {\r\n this.pluginIndex = context.pluginIndex;\r\n this.polygonOffsetIndex = context.polygonOffsetIndex;\r\n this.paint(context);\r\n return {\r\n redraw: this._redraw,\r\n drawCount: this._drawCount\r\n };\r\n }\r\n\r\n prepareRender(context) {\r\n if (this._currentTimestamp === context.timestamp) {\r\n return;\r\n }\r\n if (!this.createFnTypeConfig) {\r\n return;\r\n }\r\n const meshes = this.scene.getMeshes();\r\n if (!meshes || !meshes.length) {\r\n return;\r\n }\r\n const sceneFilter = context && context.sceneFilter;\r\n const z = this.getMap().getZoom();\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!meshes[i] || !meshes[i].geometry) {\r\n continue;\r\n }\r\n if (sceneFilter && !sceneFilter(meshes[i])) {\r\n continue;\r\n }\r\n const { symbolIndex } = meshes[i].properties;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n if (!symbolDef) {\r\n continue;\r\n }\r\n this._currentTimestamp = context.timestamp;\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n updateOneGeometryFnTypeAttrib(this.regl, symbolDef, fnTypeConfig, meshes[i], z);\r\n }\r\n }\r\n\r\n paint(context) {\r\n const layer = this.layer;\r\n const map = layer.getMap();\r\n if (!map) {\r\n return {\r\n redraw: false\r\n };\r\n }\r\n this._renderContext = context;\r\n\r\n const uniforms = this.getUniformValues(map, context);\r\n\r\n this.callShader(uniforms, context);\r\n\r\n return {\r\n redraw: this._redraw\r\n };\r\n }\r\n\r\n setToRedraw(needRetireFrames) {\r\n if (needRetireFrames) {\r\n this._needRetire = needRetireFrames;\r\n }\r\n this._redraw = true;\r\n }\r\n\r\n callShader(uniforms, context) {\r\n this.callCurrentTileShader(uniforms, context);\r\n this.callBackgroundTileShader(uniforms, context);\r\n }\r\n\r\n callCurrentTileShader(uniforms, context) {\r\n if (this.shader) {\r\n //1. render current tile level's meshes\r\n this.shader.filter = context && context.sceneFilter ? [this.level0Filter, context.sceneFilter] : this.level0Filter;\r\n }\r\n this.callRenderer(this.shader, uniforms, context);\r\n }\r\n\r\n callBackgroundTileShader(uniforms, context) {\r\n if (this.shader) {\r\n //2. render background tile level's meshes\r\n //stenciled pixels already rendered in step 1\r\n this.shader.filter = context && context.sceneFilter ? [this.levelNFilter, context.sceneFilter] : this.levelNFilter;\r\n }\r\n this.scene.getMeshes().sort(sortByLevel);\r\n this.callRenderer(this.shader, uniforms, context);\r\n }\r\n\r\n callRenderer(shader, uniforms, context) {\r\n const meshes = this.scene.getMeshes();\r\n const renderMeshes = [];\r\n meshes.forEach(mesh => {\r\n if (mesh.properties.hlBloomMesh && context && context.bloom) {\r\n renderMeshes.push(mesh.properties.hlBloomMesh);\r\n }\r\n renderMeshes.push(mesh);\r\n });\r\n\r\n this._setLayerUniforms(uniforms);\r\n\r\n this.scene.setMeshes(renderMeshes);\r\n this._drawCount += this.renderer.render(shader, uniforms, this.scene, this.getRenderFBO(context));\r\n this.scene.setMeshes(meshes);\r\n }\r\n\r\n _setLayerUniforms(uniforms) {\r\n const altitude = this.layer.options['altitude'] || 0;\r\n const renderer = this.layer.getRenderer();\r\n uniforms.layerOpacity = renderer._getLayerOpacity();\r\n uniforms.minAltitude = altitude;\r\n }\r\n\r\n getRenderFBO(context) {\r\n return context && context.renderTarget && context.renderTarget.fbo;\r\n }\r\n\r\n needPolygonOffset() {\r\n return false;\r\n }\r\n\r\n getPolygonOffset() {\r\n const layer = this.layer;\r\n return {\r\n factor: () => {\r\n // if (props.meshConfig.ssr) {\r\n // return layer.getTotalPolygonOffset();\r\n // }\r\n const factor = layer.getPolygonOffset() + (this.polygonOffsetIndex || 0);\r\n return factor;\r\n },\r\n units: () => {\r\n // if (props.meshConfig.ssr) {\r\n // return layer.getTotalPolygonOffset();\r\n // }\r\n const units = layer.getPolygonOffset() + (this.polygonOffsetIndex || 0);\r\n return units;\r\n }\r\n };\r\n }\r\n\r\n getBlendFunc() {\r\n return {\r\n src: () => {\r\n // src 设成 one 是因为 maptalks-designer#968\r\n // 另外设成one,options.opacity < 1时,直接绘制的透明度才和直接添加到map上一致\r\n return this.sceneConfig.blendSrc || 'one';\r\n },\r\n dst: () => {\r\n return this.sceneConfig.blendDst || 'one minus src alpha';\r\n }\r\n };\r\n }\r\n\r\n pick(x, y, tolerance = 3) {\r\n if (!this.layer.options['picking'] || this.sceneConfig.picking === false) {\r\n return null;\r\n }\r\n if (!this.pickingFBO || !this.picking) {\r\n return null;\r\n }\r\n const map = this.getMap();\r\n const uniforms = this.getUniformValues(map);\r\n this._setLayerUniforms(uniforms);\r\n for (let i = 0; i < this.picking.length; i++) {\r\n const picking = this.picking[i];\r\n picking.render(this.scene.getMeshes(), 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: this.layer.options['pickingPoint'] && this.sceneConfig.pickingPoint !== false,\r\n logDepthBufFC: 2.0 / (Math.log(map.cameraFar + 1.0) / Math.LN2)\r\n });\r\n }\r\n const { meshId, pickingId, point } = picked;\r\n const mesh = (meshId === 0 || meshId) && picking.getMeshAt(meshId);\r\n if (!mesh || !mesh.geometry) {\r\n //有可能mesh已经被回收,geometry不再存在\r\n continue;\r\n }\r\n let props = mesh.geometry.properties;\r\n if (!props.features) {\r\n //GLTFPhongPainter中,因为geometry是gltf数据,由全部的tile共享,features是存储在mesh上的\r\n props = mesh.properties;\r\n }\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 result = {\r\n data: this._convertProxyFeature(props && props.features && props.features[pickingId]),\r\n point,\r\n coordinate: picked.coordinate,\r\n plugin: this.pluginIndex,\r\n };\r\n // const idMap = mesh.geometry.properties.feaPickingIdMap;\r\n // if (idMap) {\r\n // result.featureId = idMap[pickingId];\r\n // }\r\n return result;\r\n }\r\n return null;\r\n }\r\n\r\n _convertProxyFeature(data) {\r\n const feature = data && data.feature;\r\n if (!feature || !feature.customProps) {\r\n return data;\r\n }\r\n const result = extend({}, data);\r\n result.feature = extend({}, data.feature);\r\n delete result.feature.customProps;\r\n result.feature.properties = extend({}, feature.properties, feature.properties[oldPropsKey], feature.properties[externalPropsKey]);\r\n delete result.feature.properties[externalPropsKey];\r\n delete result.feature.properties[oldPropsKey];\r\n delete result.feature.properties['$layer'];\r\n delete result.feature.properties['$type'];\r\n return result;\r\n }\r\n\r\n updateSceneConfig(/* config */) {\r\n }\r\n\r\n updateDataConfig(dataConfig) {\r\n extend(this.dataConfig, dataConfig);\r\n return true;\r\n }\r\n\r\n deleteMesh(meshes, keepGeometry) {\r\n if (!meshes) {\r\n return;\r\n }\r\n this.scene.removeMesh(meshes);\r\n if (Array.isArray(meshes)) {\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!meshes[i].isValid()) {\r\n continue;\r\n }\r\n const geometry = meshes[i].geometry;\r\n if (!keepGeometry && geometry) {\r\n geometry.dispose();\r\n }\r\n if (meshes[i].material) {\r\n meshes[i].material.dispose();\r\n }\r\n meshes[i].dispose();\r\n HighlightUtil.deleteHighlightBloomMesh(meshes[i]);\r\n }\r\n } else {\r\n if (!meshes.isValid()) {\r\n return;\r\n }\r\n if (!keepGeometry && meshes.geometry) {\r\n meshes.geometry.dispose();\r\n }\r\n if (meshes.material) {\r\n meshes.material.dispose();\r\n }\r\n meshes.dispose();\r\n HighlightUtil.deleteHighlightBloomMesh(meshes);\r\n }\r\n }\r\n\r\n startFrame(context) {\r\n if (!this._inited) {\r\n this.init(context);\r\n this._inited = true;\r\n }\r\n if (this._currentTimestamp !== context.timestamp) {\r\n this._redraw = false;\r\n this._needRetire = false;\r\n this._drawCount = 0;\r\n }\r\n this.scene.clear();\r\n }\r\n\r\n resize(/*width, height*/) {}\r\n\r\n delete(/* context */) {\r\n this.scene.clear();\r\n if (this.shader) {\r\n this.shader.dispose();\r\n }\r\n if (this.picking) {\r\n for (let i = 0; i < this.picking.length; i++) {\r\n this.picking[i].dispose();\r\n }\r\n delete this.picking;\r\n }\r\n if (this._outlineShaders) {\r\n for (let i = 0; i < this._outlineShaders.length; i++) {\r\n this._outlineShaders[i].dispose();\r\n }\r\n delete this._outlineShaders;\r\n }\r\n delete this._terrainAltitudeCache;\r\n this.logoutTextureCache();\r\n }\r\n\r\n updateSymbol(symbolDef, all) {\r\n // maptalks-studio#2442, needRetire要提前计算,否则symbol更新后,可能出现错误\r\n // const needRetire = this.supportRenderMode('taa');\r\n const needRetire = false;\r\n if (!Array.isArray(symbolDef)) {\r\n symbolDef = [symbolDef];\r\n all = [all];\r\n }\r\n let needRefresh = false;\r\n for (let i = 0; i < symbolDef.length; i++) {\r\n if (symbolDef[i]) {\r\n const refresh = this._updateChildSymbol(i, symbolDef[i], all[i]);\r\n if (refresh) {\r\n needRefresh = refresh;\r\n }\r\n }\r\n }\r\n\r\n\r\n delete this._fnTypeConfigs;\r\n this.setToRedraw(needRetire);\r\n return needRefresh;\r\n }\r\n\r\n _isNeedRefreshStyle(oldSymbolDef, newSymbolDef) {\r\n for (const p in newSymbolDef) {\r\n if (hasOwn(newSymbolDef, p)) {\r\n // 当新的symbol中是fn-type类型属性,且没有缓存features而且property不一致时,就刷新\r\n if (StyleUtil.isFnTypeSymbol(newSymbolDef[p]) && !this.layer.options['features'] && (!oldSymbolDef[p] || oldSymbolDef[p].property !== newSymbolDef[p].property)) {\r\n return true;\r\n }\r\n if (SYMBOLS_NEED_REBUILD_IN_VT[p] && !deepEuqal(newSymbolDef[p], oldSymbolDef[p])) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n _updateChildSymbol(i, symbolDef, all) {\r\n if (!this._symbol) {\r\n return false;\r\n }\r\n const refresh = this._isNeedRefreshStyle(this.symbolDef[i] || {}, all);\r\n if (this._invisibleWhenCreated[i] && all.visible !== false) {\r\n this._invisibleWhenCreated[i] = false;\r\n return true;\r\n }\r\n this.symbolDef[i] = copyJSON(all);\r\n const symbol = this._symbol[i];\r\n for (const p in symbol) {\r\n delete symbol[p];\r\n }\r\n const map = this.getMap();\r\n const params = [];\r\n // extend(this._symbol, this.symbolDef);\r\n const loadedSymbol = FuncTypeUtil.loadSymbolFnTypes(this.symbolDef[i], () => {\r\n params[0] = map.getZoom();\r\n return params;\r\n });\r\n for (const p in loadedSymbol) {\r\n const d = Object.getOwnPropertyDescriptor(loadedSymbol, p);\r\n if (d.get) {\r\n Object.defineProperty(symbol, p, {\r\n get: d.get,\r\n set: d.set,\r\n configurable: true,\r\n enumerable: true\r\n });\r\n } else {\r\n symbol[p] = loadedSymbol[p];\r\n }\r\n }\r\n if (isFunctionDefinition(all.visible)) {\r\n this._visibleFn[i] = interpolated(all.visible);\r\n }\r\n // if (isFunctionDefinition(this.symbolDef.visible)) {\r\n // this._visibleFn = interpolated(this.symbolDef.visible);\r\n // } else {\r\n // delete this._visibleFn;\r\n // }\r\n return refresh;\r\n }\r\n\r\n getSymbolDef(symbolIndex) {\r\n return this.symbolDef[symbolIndex.index];\r\n }\r\n\r\n getSymbols() {\r\n return this._symbol;\r\n }\r\n\r\n getSymbol(symbolIndex) {\r\n const index = symbolIndex.index;\r\n return this._symbol[index];\r\n }\r\n\r\n _compileSymbols() {\r\n const map = this.getMap();\r\n const params = [];\r\n const fn = () => {\r\n params[0] = map.getZoom();\r\n return params;\r\n };\r\n this._symbol = [];\r\n this._visibleFn = [];\r\n for (let i = 0; i < this.symbolDef.length; i++) {\r\n this._symbol[i] = FuncTypeUtil.loadSymbolFnTypes(extend({}, this.symbolDef[i]), fn);\r\n if (this.symbolDef[i] && isFunctionDefinition(this.symbolDef[i].visible)) {\r\n this._visibleFn[i] = interpolated(this.symbolDef[i].visible);\r\n }\r\n }\r\n }\r\n\r\n getFnTypeConfig(symbolIndex) {\r\n if (!this._fnTypeConfigs) {\r\n this._fnTypeConfigs = [];\r\n }\r\n const index = symbolIndex.index;\r\n if (!this._fnTypeConfigs[index]) {\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const map = this.getMap();\r\n this._fnTypeConfigs[index] = this.createFnTypeConfig(map, symbolDef);\r\n }\r\n return this._fnTypeConfigs[index];\r\n }\r\n\r\n _deleteFnTypeConfigs() {\r\n delete this._fnTypeConfigs;\r\n }\r\n\r\n loginTextureCache() {\r\n const keyName = (TEX_CACHE_KEY + '').trim();\r\n const map = this.getMap();\r\n if (!map[keyName]) {\r\n map[keyName] = {\r\n count: 0\r\n };\r\n }\r\n map[keyName].count++;\r\n }\r\n\r\n logoutTextureCache() {\r\n const keyName = (TEX_CACHE_KEY + '').trim();\r\n const map = this.getMap();\r\n const myTextures = this._myTextures;\r\n if (myTextures) {\r\n for (const url in myTextures) {\r\n if (hasOwn(myTextures, url)) {\r\n if (map[keyName][url]) {\r\n map[keyName][url].count--;\r\n if (map[keyName][url].count <= 0) {\r\n delete map[keyName][url];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n map[keyName].count--;\r\n if (map[keyName].count <= 0) {\r\n map[keyName] = {};\r\n }\r\n }\r\n\r\n getCachedTexture(url) {\r\n const keyName = (TEX_CACHE_KEY + '').trim();\r\n const cached = this.getMap()[keyName][url];\r\n return cached ? cached.data : null;\r\n }\r\n\r\n addCachedTexture(url, data) {\r\n const keyName = (TEX_CACHE_KEY + '').trim();\r\n const map = this.getMap();\r\n let cached = map[keyName][url];\r\n if (!cached) {\r\n cached = map[keyName][url] = {\r\n data,\r\n count: 0\r\n };\r\n } else {\r\n cached.data = data;\r\n }\r\n if (!this._myTextures) {\r\n this._myTextures = {};\r\n }\r\n if (!cached.data.then && !this._myTextures[url]) {\r\n //不是promise时才计数,painter内部不管引用多少次,计数器只+1\r\n cached.count++;\r\n this._myTextures[url] = 1;\r\n }\r\n }\r\n\r\n disposeCachedTexture(texture) {\r\n let url;\r\n if (typeof texture === 'string') {\r\n url = texture;\r\n } else {\r\n url = texture.url;\r\n }\r\n if (!this._myTextures || !this._myTextures[url]) {\r\n return;\r\n }\r\n const keyName = (TEX_CACHE_KEY + '').trim();\r\n //删除texture时,同时回收cache上的纹理,尽量保证不出现内存泄漏\r\n //最常见场景: 更新material时,回收原有的texture\r\n delete this._myTextures[url];\r\n const map = this.getMap();\r\n if (map[keyName][url]) {\r\n map[keyName][url].count--;\r\n if (map[keyName][url].count <= 0) {\r\n delete map[keyName][url];\r\n }\r\n }\r\n }\r\n\r\n shouldDeleteMeshOnUpdateSymbol() {\r\n return false;\r\n }\r\n\r\n isEnableTileStencil() {\r\n return true;\r\n }\r\n\r\n isUniqueStencilRefPerTile() {\r\n return this.isOnly2D();\r\n }\r\n\r\n supportRenderMode(mode) {\r\n return mode === 'taa' || mode === 'fxaa';\r\n }\r\n\r\n // _stencil(quadStencil) {\r\n // const meshes = this.scene.getMeshes();\r\n // if (!meshes.length) {\r\n // return;\r\n // }\r\n // const stencils = meshes.map(mesh => {\r\n // return {\r\n // transform: mesh.localTransform,\r\n // level: mesh.properties.level,\r\n // mesh\r\n // };\r\n // }).sort(this._compareStencil);\r\n // const projViewMatrix = this.getMap().projViewMatrix;\r\n // this._stencilHelper.start(quadStencil);\r\n // const painted = {};\r\n // for (let i = 0; i < stencils.length; i++) {\r\n // const mesh = stencils[i].mesh;\r\n // let id = painted[mesh.properties.tile.id];\r\n // if (id === undefined) {\r\n // mat4.multiply(MAT, projViewMatrix, stencils[i].transform);\r\n // id = this._stencilHelper.write(quadStencil, MAT);\r\n // painted[mesh.properties.tile.id] = id;\r\n // }\r\n // // stencil ref value\r\n // mesh.setUniform('ref', id);\r\n // }\r\n // this._stencilHelper.end(quadStencil);\r\n // //TODO 因为stencilHelper会改变 gl.ARRAY_BUFFER 和 vertexAttribPointer 的值,需要重刷regl状态\r\n // //记录 array_buffer 和 vertexAttribPointer 后, 能省略掉 _refresh\r\n // this.regl._refresh();\r\n // }\r\n\r\n // _compareStencil(a, b) {\r\n // return b.level - a.level;\r\n // }\r\n\r\n outline(fbo, featureIds) {\r\n const painted = {};\r\n for (let i = 0; i < featureIds.length; i++) {\r\n if (isNil(featureIds[i]) || painted[featureIds[i]]) {\r\n continue;\r\n }\r\n this._outlineOne(fbo, featureIds[i]);\r\n painted[featureIds[i]] = 1;\r\n }\r\n }\r\n\r\n _outlineOne(fbo, featureId) {\r\n if (!this.picking) {\r\n return;\r\n }\r\n if (!this._outlineScene) {\r\n this._outlineScene = new reshader.Scene();\r\n }\r\n if (!this._outlineShaders) {\r\n this._initOutlineShaders();\r\n // this._outlineShader.filter = this.level0Filter;\r\n if (!this._outlineShaders) {\r\n console.warn(`Plugin at ${this.pluginIndex} doesn't support outline.`);\r\n return;\r\n }\r\n }\r\n const uniforms = this.getUniformValues(this.getMap(), this._renderContext);\r\n this._setLayerUniforms(uniforms);\r\n\r\n const meshes = this._findMeshesHasFeaId(featureId);\r\n if (!meshes.length) {\r\n return;\r\n }\r\n for (let i = 0; i < meshes.length; i++) {\r\n const pickingMap = meshes[i].geometry.properties.feaIdPickingMap;\r\n if (pickingMap) {\r\n const pickingIds = pickingMap[featureId];\r\n if (pickingIds) {\r\n const painted = {};\r\n this._outlineScene.setMeshes(meshes[i]);\r\n for (let ii = 0; ii < pickingIds.length; ii++) {\r\n const pickingId = pickingIds[ii];\r\n if (painted[pickingId]) {\r\n continue;\r\n }\r\n painted[pickingId] = 1;\r\n uniforms.highlightPickingId = pickingId;\r\n for (let j = 0; j < this._outlineShaders.length; j++) {\r\n this.renderer.render(this._outlineShaders[j], uniforms, this._outlineScene, fbo);\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n _findMeshesHasFeaId(feaId) {\r\n const meshes = [];\r\n const allMeshes = this.scene.getMeshes();\r\n for (let i = 0; i < allMeshes.length; i++) {\r\n const mesh = allMeshes[i];\r\n const idMap = mesh.geometry.properties.feaIdPickingMap;\r\n if (idMap && idMap[feaId] !== undefined) {\r\n meshes.push(mesh);\r\n }\r\n }\r\n return meshes;\r\n }\r\n\r\n outlineAll(fbo) {\r\n if (!this.picking) {\r\n return;\r\n }\r\n if (!this._outlineShaders) {\r\n this._initOutlineShaders();\r\n if (!this._outlineShaders) {\r\n console.warn(`Plugin at ${this.pluginIndex} doesn't support outline.`);\r\n return;\r\n }\r\n }\r\n const uniforms = this.getUniformValues(this.getMap(), this._renderContext);\r\n this._setLayerUniforms(uniforms);\r\n uniforms.highlightPickingId = -1;\r\n for (let j = 0; j < this._outlineShaders.length; j++) {\r\n this.renderer.render(this._outlineShaders[j], uniforms, this.scene, fbo);\r\n }\r\n }\r\n\r\n _initOutlineShaders() {\r\n\r\n if (!this.picking) {\r\n return;\r\n }\r\n const canvas = this.layer.getRenderer().canvas;\r\n this._outlineShaders = [];\r\n for (let i = 0; i < this.picking.length; i++) {\r\n const pickingVert = this.picking[i].getPickingVert();\r\n const defines = {\r\n 'ENABLE_PICKING': 1,\r\n 'HAS_PICKING_ID': 1\r\n };\r\n const uniforms = this.picking[i].getUniformDeclares().slice(0);\r\n if (uniforms['uPickingId'] !== undefined) {\r\n defines['HAS_PICKING_ID'] = 2;\r\n }\r\n this._outlineShaders[i] = new reshader.MeshShader({\r\n vert: pickingVert,\r\n frag: outlineFrag,\r\n uniforms,\r\n defines,\r\n extraCommandProps: {\r\n viewport: {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return canvas.width;\r\n },\r\n height: () => {\r\n return canvas.height;\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n mask: false,\r\n func: 'always'\r\n },\r\n blend: {\r\n enable: true,\r\n func: {\r\n src: 'src alpha',\r\n dst: 'one minus src alpha'\r\n },\r\n equation: 'add'\r\n }\r\n }\r\n });\r\n this._outlineShaders[i].filter = this.picking[i].filter;\r\n }\r\n\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 updateIBLDefines(shader) {\r\n const shaderDefines = shader.shaderDefines;\r\n let updated = false;\r\n if (this.hasIBL()) {\r\n if (!shaderDefines[['HAS_IBL_LIGHTING']]) {\r\n shaderDefines['HAS_IBL_LIGHTING'] = 1;\r\n updated = true;\r\n }\r\n } else if (shaderDefines[['HAS_IBL_LIGHTING']]) {\r\n delete shaderDefines['HAS_IBL_LIGHTING'];\r\n updated = true;\r\n }\r\n if (updated) {\r\n shader.shaderDefines = shaderDefines;\r\n }\r\n }\r\n\r\n getIBLRes() {\r\n const canvas = this.layer.getRenderer().canvas;\r\n return getIBLResOnCanvas(canvas);\r\n }\r\n\r\n createIBLTextures() {\r\n const canvas = this.layer.getRenderer().canvas;\r\n loginIBLResOnCanvas(canvas, this.regl, this.getMap());\r\n this.setToRedraw(true);\r\n this.layer.fire('iblupdated');\r\n }\r\n\r\n disposeIBLTextures() {\r\n const canvas = this.layer.getRenderer().canvas;\r\n logoutIBLResOnCanvas(canvas, this.getMap());\r\n }\r\n\r\n // 在createFnTypeConfig方法中,有时fnTypeConfig中计算的值仍然是fn-type,(例如Vector3DLayer的数据symbol属性是fn type时)\r\n // 缓存生成的函数对象,并计算出真正的值并返回\r\n evaluateInFnTypeConfig(v, geometry, map, properties, isPiecewiseConstant) {\r\n let fnCaches = this._fnCaches;\r\n if (!fnCaches) {\r\n fnCaches = this._fnCaches = {};\r\n }\r\n const key = hashCode(JSON.stringify(v));\r\n let fn = fnCaches[key];\r\n if (!fn) {\r\n fn = fnCaches[key] = isPiecewiseConstant ? piecewiseConstant(v) : interpolated(v);\r\n }\r\n return fn(map.getZoom(), properties);\r\n }\r\n\r\n highlight(highlights) {\r\n this._highlighted = highlights;\r\n this._highlightTimestamp = this.layer.getRenderer().getFrameTimestamp();\r\n this.setToRedraw(true);\r\n }\r\n\r\n cancelAllHighlight() {\r\n this._highlighted = null;\r\n this._highlightTimestamp = this.layer.getRenderer().getFrameTimestamp();\r\n this.setToRedraw(true);\r\n }\r\n\r\n _prepareFeatureIds(geometry, glData) {\r\n const { featureIds, pickingIdIndiceMap } = glData;\r\n geometry.properties.aFeaIds = featureIds;\r\n geometry.properties.pickingIdIndiceMap = pickingIdIndiceMap;\r\n }\r\n\r\n _highlightMesh(mesh) {\r\n // ignore halo text meshes, maptalks/issues#562\r\n if (mesh && mesh.properties.isHalo) {\r\n return;\r\n }\r\n const { pickingIdIndiceMap } = mesh.geometry.properties;\r\n const highlights = this._highlighted ? convertHighlights(mesh, this.layer, this._highlighted) : null;\r\n HighlightUtil.highlightMesh(this.regl, mesh, highlights, this._highlightTimestamp, pickingIdIndiceMap);\r\n }\r\n\r\n _updateTerrainAltitude(geometry, geoData, geoProperties, positionSize, context) {\r\n let aAnchor = geoProperties.aAnchor;\r\n if (!aAnchor) {\r\n const { aPosition } = geoData;\r\n aAnchor = geoProperties.aAnchor = aPosition.slice(0);\r\n }\r\n let aTerrainAltitude = geoProperties.aTerrainAltitude;\r\n if (!aTerrainAltitude) {\r\n aTerrainAltitude = geoProperties.aTerrainAltitude = new Float32Array(aAnchor.length / positionSize);\r\n aTerrainAltitude.fill(INVALID_ALTITUDE);\r\n }\r\n this._fillTerrainAltitude(aTerrainAltitude, aAnchor, context.tileInfo, 0, aTerrainAltitude.length - 1);\r\n\r\n if (!geoData.aTerrainAltitude) {\r\n geoData.aTerrainAltitude = aTerrainAltitude;\r\n } else if (aTerrainAltitude.dirty) {\r\n this._updateATerrainAltitude(geometry, aTerrainAltitude);\r\n }\r\n aTerrainAltitude.dirty = false;\r\n }\r\n\r\n _updateATerrainAltitude(geometry, aTerrainAltitude) {\r\n if (!geometry) {\r\n return;\r\n }\r\n // GLTFMixin 的 geometry 就没有updateData\r\n if (geometry.updateData) {\r\n geometry.updateData('aTerrainAltitude', aTerrainAltitude);\r\n }\r\n\r\n }\r\n\r\n _fillTerrainAltitude(aTerrainAltitude, aPosition, tile, start, end) {\r\n const { res, extent, extent2d, id } = tile;\r\n const pluginIndex = this.pluginIndex;\r\n const cacheId = id + '-' + pluginIndex;\r\n if (!tile.completeTerrainQuery) {\r\n tile.completeTerrainQuery = [];\r\n }\r\n if (tile.completeTerrainQuery[pluginIndex]) {\r\n return;\r\n }\r\n if (!tile.completeTerrainQuery[pluginIndex] && this._terrainAltitudeCache && this._terrainAltitudeCache.has(cacheId)) {\r\n const cachedAltitude = this._terrainAltitudeCache.getAndRemove(cacheId);\r\n this._terrainAltitudeCache.add(cacheId, cachedAltitude);\r\n aTerrainAltitude.set(cachedAltitude.altitudeData);\r\n tile.terrainTileInfos = cachedAltitude.terrainTileInfos;\r\n aTerrainAltitude.dirty = true;\r\n tile.completeTerrainQuery[pluginIndex] = true;\r\n return;\r\n }\r\n const layer = this.layer;\r\n const map = layer.getMap();\r\n const renderer = layer.getRenderer();\r\n\r\n const terrainHelper = renderer && renderer.getTerrainHelper();\r\n\r\n let terrainTileInfos = tile.terrainTileInfos;\r\n if (!terrainTileInfos) {\r\n terrainTileInfos = tile.terrainTileInfos = this.layer.queryTerrainTiles(tile);\r\n }\r\n if (!tile.terrainQueryStatus) {\r\n tile.terrainQueryStatus = [];\r\n }\r\n let terrainChanged = false;\r\n let queryStatus = [];\r\n // 查询地形瓦片是否有新的加载,如果没有则无需查询\r\n for (let i = 0; i < tile.terrainTileInfos.length; i++) {\r\n queryStatus[i] = (+terrainHelper.isTerrainTileLoaded(tile.terrainTileInfos[i].id));\r\n if (queryStatus[i] && tile.terrainQueryStatus[pluginIndex] && !tile.terrainQueryStatus[pluginIndex][i]) {\r\n terrainChanged = true;\r\n break;\r\n }\r\n }\r\n if (!terrainChanged && tile.terrainQueryStatus[pluginIndex]) {\r\n return;\r\n }\r\n\r\n const layerClazz = layer.constructor;\r\n if (map.isInteracting()) {\r\n // 地图交互时,如果留给altitudeQuery的时间片用完,则不再继续\r\n const timestamp = renderer.getFrameTimestamp();\r\n\r\n if (layerClazz.altitudeQueryFrameTimestamp !== timestamp) {\r\n layerClazz.altitudeQueryFrameTimestamp = timestamp;\r\n layerClazz.altitudeQueryFrameTime = 0;\r\n }\r\n const timeLimit = layer.options['altitudeQueryTimeLimitPerFrame'];\r\n if (layerClazz.altitudeQueryFrameTime > timeLimit) {\r\n return;\r\n }\r\n }\r\n\r\n const startTime = performance.now();\r\n\r\n tile.terrainQueryStatus[pluginIndex] = queryStatus;\r\n\r\n const { xmin, ymax } = extent2d;\r\n const tilePoint = TILEPOINT.set(xmin, ymax);\r\n const tileScale = this.layer.getTileSize().width / tile.extent;\r\n const positionSize = aPosition.length / aTerrainAltitude.length;\r\n let queryResult = aTerrainAltitude.queryResult;\r\n if (!queryResult) {\r\n queryResult = aTerrainAltitude.queryResult = new Map();\r\n }\r\n let complete = true;\r\n for (let i = start; i <= end; i++) {\r\n let x = aPosition[i * positionSize];\r\n if (x < 0) {\r\n x = 0;\r\n } else if (x > extent) {\r\n x = extent;\r\n }\r\n let y = aPosition[i * positionSize + 1];\r\n if (y < 0) {\r\n y = 0;\r\n } else if (y > extent) {\r\n y = extent;\r\n }\r\n const index = x + y * extent;\r\n let altitude = queryResult.get(index);\r\n if (altitude || altitude === 0) {\r\n if (aTerrainAltitude[i] !== altitude) {\r\n aTerrainAltitude[i] = altitude;\r\n aTerrainAltitude.dirty = true;\r\n }\r\n continue;\r\n }\r\n let terrainTile;\r\n for (let j = 0; j < terrainTileInfos.length; j++) {\r\n if (inTerrainTile(terrainTileInfos[j], xmin + tileScale * x, ymax - tileScale * y, res)) {\r\n terrainTile = terrainTileInfos[j];\r\n break;\r\n }\r\n }\r\n let result;\r\n if (terrainTile && (terrainHelper.getRenderer().isTileCached(terrainTile.id) || aTerrainAltitude[i] === INVALID_ALTITUDE)) {\r\n ANCHOR_POINT.set(x, y);\r\n result = this.layer.queryTilePointTerrain(ANCHOR_POINT, terrainTile, tilePoint, extent, res);\r\n }\r\n altitude = aTerrainAltitude[i];\r\n if (result) {\r\n altitude = result[0] === null ? INVALID_ALTITUDE : result[0];\r\n ALTITUDE32[0] = altitude;\r\n altitude = ALTITUDE32[0];\r\n }\r\n if (aTerrainAltitude[i] !== altitude) {\r\n aTerrainAltitude[i] = altitude;\r\n aTerrainAltitude.dirty = true;\r\n }\r\n if (result && result[1]) {\r\n queryResult.set(index, altitude);\r\n } else {\r\n complete = false;\r\n }\r\n }\r\n layerClazz.altitudeQueryFrameTime = (layerClazz.altitudeQueryFrameTime || 0) + (performance.now() - startTime);\r\n tile.completeTerrainQuery[pluginIndex] = complete;\r\n if (complete) {\r\n if (!this._terrainAltitudeCache) {\r\n this._terrainAltitudeCache = new maptalks.LRUCache(this.layer.options['maxCacheSize'] * 4);\r\n }\r\n this._terrainAltitudeCache.add(cacheId, { altitudeData: aTerrainAltitude, terrainTileInfos });\r\n }\r\n }\r\n}\r\n\r\nexport default Painter;\r\n\r\nfunction sortByCommandKey(a, b) {\r\n const k1 = a && a.getCommandKey(this.regl) || '';\r\n const k2 = b && b.getCommandKey(this.regl) || '';\r\n return k1.localeCompare(k2);\r\n}\r\n\r\n\r\nfunction sortByLevel(m0, m1) {\r\n return m0.properties.level - m1.properties.level;\r\n}\r\n\r\nfunction hashCode(s) {\r\n let hash = 0;\r\n const strlen = s && s.length || 0;\r\n if (!strlen) {\r\n return hash;\r\n }\r\n let c;\r\n for (let i = 0; i < strlen; i++) {\r\n c = s.codePointAt(i);\r\n hash = ((hash << 5) - hash) + c;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return hash;\r\n}\r\n\r\n// 用户输入的highlights的转换函数\r\n// * 如果highlight输入的是id,转化成pickingId\r\n// * 如果highlight输入的是filter函数,则转换成过滤后数据的pickingId\r\n// 转换后gl中的highlightMesh方法只需要考虑id相关逻辑\r\nfunction convertHighlights(mesh, layer, inputHighlights) {\r\n const { aPickingId, feaIdPickingMap, features } = mesh.geometry.properties;\r\n const highlights = new Map();\r\n const names = inputHighlights.keys();\r\n for (const name of names) {\r\n const highlight = inputHighlights.get(name);\r\n if (!highlight) {\r\n continue;\r\n }\r\n if (!isNil(highlight.id)) {\r\n const pickingIds = feaIdPickingMap[highlight.id];\r\n if (!pickingIds || !pickingIds.length) {\r\n continue;\r\n }\r\n for (let i = 0; i < pickingIds.length; i++) {\r\n highlights.set(pickingIds[i], highlight);\r\n }\r\n } else if (highlight.filter && aPickingId) {\r\n let current = null;\r\n for (let i = 0; i < aPickingId.length; i++) {\r\n if (aPickingId[i] !== current) {\r\n current = aPickingId[i];\r\n }\r\n const feature = features[current];\r\n if (highlight.filter(feature && feature.feature, layer)) {\r\n highlights.set(current, highlight);\r\n }\r\n }\r\n }\r\n }\r\n return highlights;\r\n}\r\n","import Painter from './Painter';\r\nimport { reshader } from '@maptalks/gl';\r\nimport { extend } from '../Util';\r\nimport { isObjectEmpty } from './util/is_obj_empty';\r\n\r\nexport default class BasicPainter extends Painter {\r\n\r\n createGeometry(glData, features) {\r\n if (!glData.data) {\r\n return {\r\n geometry: null,\r\n symbolIndex: glData.symbolIndex\r\n };\r\n }\r\n if (glData.iconAtlas && glData.iconAtlas.image) {\r\n glData.iconAtlas.image.dataType = glData.type;\r\n glData.iconAtlas.image.type = 'icon';\r\n }\r\n if (glData.glyphAtlas && glData.glyphAtlas.image) {\r\n glData.glyphAtlas.image.type = 'glyph';\r\n }\r\n const data = extend({}, glData.data);\r\n const desc = { primitive: this.getPrimitive(), positionSize: glData.positionSize };\r\n if (data.aAltitude) {\r\n desc.altitudeAttribute = 'aAltitude';\r\n }\r\n const geometry = new reshader.Geometry(data, glData.indices, 0, desc);\r\n geometry.properties = {\r\n features,\r\n // Vector3DLayer中需要保存elements来实现show hide\r\n // elements: glData.indices\r\n };\r\n if (glData.iconAtlas) {\r\n geometry.properties.iconAtlas = glData.iconAtlas.image;\r\n geometry.properties.iconPositions = glData.iconAtlas.positions;\r\n }\r\n if (glData.glyphAtlas) {\r\n geometry.properties.glyphAtlas = glData.glyphAtlas.image;\r\n }\r\n if (!isObjectEmpty(features)) {\r\n // aPickingId 中存放的是 KEY_IDX 的值,Vector3DLayer中如果一个feature有多个symbol,feature.id相同但pickingId不同\r\n // aFeaIds 存放的是 feature.id\r\n geometry.properties.aFeaIds = glData.featureIds;\r\n this._prepareFeatureIds(geometry, glData);\r\n }\r\n if (glData.markerPlacement) {\r\n geometry.properties.markerPlacement = glData.markerPlacement;\r\n }\r\n if (glData.textPlacement) {\r\n geometry.properties.textPlacement = glData.textPlacement;\r\n }\r\n extend(geometry.properties, glData.properties);\r\n return {\r\n geometry,\r\n symbolIndex: glData.symbolIndex\r\n };\r\n }\r\n\r\n getRayCastData(mesh, indiceIndex) {\r\n const { features, aFeaIds } = mesh.geometry.properties;\r\n if (!features || !aFeaIds) {\r\n return null;\r\n }\r\n const id = aFeaIds[indiceIndex];\r\n return features[id];\r\n }\r\n\r\n getPrimitive() {\r\n return 'triangles';\r\n }\r\n\r\n getRenderFBO(context) {\r\n //优先采用不aa的fbo\r\n return context && context.renderTarget && context.renderTarget.fbo;\r\n }\r\n\r\n supportRenderMode(mode) {\r\n return mode === 'noAa';\r\n }\r\n\r\n drawDebugAtlas(iconAtlas) {\r\n if (document.getElementById('MAPTALKS_ICON_DEBUG')) {\r\n const debug = document.getElementById('MAPTALKS_ICON_DEBUG');\r\n debug.width = iconAtlas.width;\r\n debug.height = iconAtlas.height;\r\n debug.style.width = iconAtlas.width + 'px';\r\n debug.style.height = iconAtlas.height + 'px';\r\n let data;\r\n if (iconAtlas.format === 'alpha') {\r\n data = new Uint8ClampedArray(iconAtlas.data.length * 4);\r\n for (let i = 0; i < iconAtlas.data.length; i++) {\r\n data[i * 4 + 3] = iconAtlas.data[i];\r\n }\r\n } else {\r\n data = new Uint8ClampedArray(iconAtlas.data);\r\n }\r\n const ctx = debug.getContext('2d');\r\n ctx.imageSmoothingEnabled = false;\r\n ctx.putImageData(\r\n new ImageData(data, iconAtlas.width, iconAtlas.height),\r\n 0,\r\n 0\r\n );\r\n }\r\n }\r\n}\r\n","import { reshader } from '@maptalks/gl';\r\n\r\nexport function createAtlasTexture(regl, atlas, flipY, mipmap) {\r\n if (mipmap) {\r\n const data = reshader.Util.resizeToPowerOfTwo(atlas.data, atlas.width, atlas.height);\r\n atlas.data = data;\r\n }\r\n const image = atlas;\r\n const config = {\r\n width: image.width,\r\n height: image.height,\r\n data: image.data,\r\n format: image.format,\r\n mag: 'linear', //very important\r\n min: mipmap ? 'linear mipmap linear' : 'linear', //very important\r\n flipY,\r\n // 设成true解决矢量marker边缘的“漏光”问题\r\n premultiplyAlpha: true\r\n };\r\n if (atlas.type === 'icon') {\r\n const wrapMode = (atlas.dataType !== 'point') ? 'repeat' : 'clamp';\r\n config['wrapS'] = wrapMode;\r\n config['wrapT'] = wrapMode;\r\n }\r\n return regl.texture(config);\r\n}\r\n\r\nconst EMPTY_SIZE = [0, 0];\r\nconst DEFAULT_SIZE = [];\r\nexport function getDefaultMarkerSize(geometry) {\r\n if (!geometry.properties.iconPositions) {\r\n return EMPTY_SIZE;\r\n }\r\n let key;\r\n let count = 0;\r\n // 只有当iconPositions中只有一个markerFile时,才能读出默认尺寸\r\n for (const p in geometry.properties.iconPositions) {\r\n key = p;\r\n count++;\r\n if (count > 1) {\r\n return EMPTY_SIZE;\r\n }\r\n }\r\n if (!key) {\r\n return EMPTY_SIZE;\r\n }\r\n const iconPosition = geometry.properties.iconPositions[key];\r\n const defaultMarkerWidth = iconPosition.displaySize[0];\r\n const defaultMarkerHeight = iconPosition.displaySize[1];\r\n DEFAULT_SIZE[0] = defaultMarkerWidth;\r\n DEFAULT_SIZE[1] = defaultMarkerHeight\r\n return DEFAULT_SIZE;\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport BasicPainter from './BasicPainter';\r\nimport { vec2, reshader, mat4 } from '@maptalks/gl';\r\nimport vert from './glsl/fill.vert';\r\nimport frag from './glsl/fill.frag';\r\nimport pickingVert from './glsl/fill.picking.vert';\r\nimport { isNumber, isNil, setUniformFromSymbol, createColorSetter, toUint8ColorInGlobalVar, meterToPoint } from '../Util';\r\nimport { prepareFnTypeData } from './util/fn_type_util';\r\nimport { createAtlasTexture } from './util/atlas_util';\r\nimport { isFunctionDefinition, piecewiseConstant, interpolated } from '@maptalks/function-type';\r\nimport { Color } from '@maptalks/vector-packer';\r\nimport { isObjectEmpty } from './util/is_obj_empty';\r\nimport { INVALID_TEX_COORD } from '@maptalks/vector-packer';\r\n\r\nconst IDENTITY_ARR = mat4.identity([]);\r\n\r\nconst DEFAULT_UNIFORMS = {\r\n 'polygonFill': [1, 1, 1, 1],\r\n 'polygonOpacity': 1,\r\n 'uvScale': [1, 1],\r\n 'uvOffset': [0, 0],\r\n 'patternWidth': [0, 0],\r\n 'patternOffset': [0, 0]\r\n};\r\n\r\nconst EMPTY_ARRAY = [];\r\n\r\nconst COORD0 = new maptalks.Coordinate(0, 0);\r\nconst COORD1 = new maptalks.Coordinate(0, 0);\r\nconst COORD2 = new maptalks.Coordinate(0, 0);\r\n\r\nconst ARR_0 = [];\r\n\r\nclass FillPainter extends BasicPainter {\r\n static getBloomSymbol() {\r\n return ['polygonBloom'];\r\n }\r\n\r\n prepareSymbol(symbol) {\r\n const polygonFill = symbol.polygonFill;\r\n if (Array.isArray(polygonFill)) {\r\n if (polygonFill.length === 3) {\r\n polygonFill.push(1);\r\n }\r\n symbol.polygonFill = polygonFill.map(c => c * 255);\r\n }\r\n }\r\n\r\n supportRenderMode(mode) {\r\n if (this.sceneConfig.antialias || this.sceneConfig.antialias === undefined) {\r\n //turn on antialias if set\r\n return mode === 'fxaa' || mode === 'fxaaBeforeTaa';\r\n } else {\r\n return super.supportRenderMode(mode);\r\n }\r\n }\r\n\r\n isBloom(mesh) {\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n const bloomSymbol = FillPainter.getBloomSymbol()[0];\r\n return !!symbol[bloomSymbol];\r\n }\r\n\r\n forbiddenTerrainUpscale() {\r\n return true;\r\n }\r\n\r\n needPolygonOffset() {\r\n return true;\r\n }\r\n\r\n // getShadowMeshes() {\r\n // if (!this.isVisible()) {\r\n // return EMPTY_ARRAY;\r\n // }\r\n // const meshes = this.scene.getMeshes().filter(m => m.properties.level === 0 && !m.geometry.properties.is2D);\r\n // this.shadowCount = meshes.length;\r\n // return meshes;\r\n // }\r\n\r\n getAnalysisMeshes() {\r\n if (!this.isVisible()) {\r\n return EMPTY_ARRAY;\r\n }\r\n const meshes = this.scene.getMeshes().filter(m => m.properties.level === 0);\r\n return meshes;\r\n }\r\n\r\n createMesh(geo, transform, params) {\r\n const map = this.getMap();\r\n const { tilePoint } = params;\r\n const { geometry, symbolIndex, ref } = geo;\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n const tileSize = this.layer.getTileSize().width;\r\n const tileRatio = geometry.properties.tileExtent / tileSize;\r\n const tileRes = geometry.properties.tileResolution;\r\n const tileCoord = map.pointAtResToCoord(COORD0.set(tilePoint[0], tilePoint[1]), tileRes);\r\n const uniforms = {\r\n tileExtent: geometry.properties.tileExtent,\r\n tileRatio\r\n };\r\n\r\n const symbol = this.getSymbol(symbolIndex);\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n\r\n if (isFunctionDefinition(symbolDef['polygonPatternFileOrigin'])) {\r\n this._preparePatternOrigin(symbolDef, geo, isVectorTile ? [0, 0] : tilePoint, tileRes);\r\n }\r\n if (isFunctionDefinition(symbolDef['polygonPatternFileWidth']) || isFunctionDefinition(symbolDef['polygonPatternFileWidth'])) {\r\n this._preparePatternWidth(symbolDef, geo, isVectorTile ? tileRatio : 1, tileCoord, tileRes);\r\n }\r\n if (symbolDef['uvOffsetInMeter'] && isFunctionDefinition(symbolDef['uvOffset'])) {\r\n this._preparePatternOffset(symbolDef, geo, tileCoord, tileRes);\r\n }\r\n\r\n\r\n setUniformFromSymbol(uniforms, 'polygonFill', symbol, 'polygonFill', DEFAULT_UNIFORMS['polygonFill'], createColorSetter(this.colorCache));\r\n setUniformFromSymbol(uniforms, 'polygonOpacity', symbol, 'polygonOpacity', DEFAULT_UNIFORMS['polygonOpacity']);\r\n setUniformFromSymbol(uniforms, 'uvScale', symbol, 'uvScale', DEFAULT_UNIFORMS['uvScale']);\r\n // setUniformFromSymbol(uniforms, 'uvOffset', symbol, 'uvOffset', DEFAULT_UNIFORMS['uvOffset']);\r\n\r\n if (ref === undefined) {\r\n\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n geometry.generateBuffers(this.regl);\r\n }\r\n\r\n const iconAtlas = geometry.properties.iconAtlas;\r\n // 直接用maxIconSize对uvOrigin取余,保证icon大小不大于maxIconSize时,余数是一致的,且能提高数据精度,避免精度不够造成的绘制问题\r\n const maxIconSize = 2048;\r\n if (iconAtlas && geometry.data.aTexInfo) {\r\n const tilePointUniform = [];\r\n Object.defineProperty(uniforms, 'uvOrigin', {\r\n enumerable: true,\r\n get: () => {\r\n const tileScale = uniforms.tileScale;\r\n if (geometry.data.aPatternOrigin) {\r\n tilePointUniform[0] = (tilePoint[0] * tileScale) % maxIconSize;\r\n tilePointUniform[1] = (tilePoint[1] * tileScale) % maxIconSize;\r\n return tilePointUniform;\r\n }\r\n const patternOrigin = symbol.polygonPatternFileOrigin;\r\n if (!patternOrigin) {\r\n tilePointUniform[0] = (tilePoint[0] * tileScale) % maxIconSize;\r\n tilePointUniform[1] = (tilePoint[1] * tileScale) % maxIconSize;\r\n return tilePointUniform;\r\n }\r\n COORD0.set(patternOrigin[0], patternOrigin[1]);\r\n map.coordToPointAtRes(COORD0, tileRes, COORD1);\r\n return vec2.set(tilePointUniform, tilePoint[0] - COORD1.x, tilePoint[1] - COORD1.y);\r\n }\r\n });\r\n\r\n const patternWidthUniform = [];\r\n Object.defineProperty(uniforms, 'patternWidth', {\r\n enumerable: true,\r\n get: () => {\r\n if (geometry.data.aPatternWidth) {\r\n return DEFAULT_UNIFORMS['patternWidth'];\r\n }\r\n const texWidth = symbolDef.polygonPatternFileWidth;\r\n const texHeight = symbolDef.polygonPatternFileHeight;\r\n if (!texWidth && !texHeight) {\r\n return DEFAULT_UNIFORMS['patternWidth'];\r\n }\r\n const [ width, height ] = this._computePatternWidth(ARR_0, texWidth, texHeight, isVectorTile ? tileRatio : 1, tileCoord, tileRes);\r\n return vec2.set(patternWidthUniform, width, height);\r\n }\r\n });\r\n\r\n\r\n Object.defineProperty(uniforms, 'uvOffset', {\r\n enumerable: true,\r\n get: () => {\r\n if (geometry.data.aPatternOffset) {\r\n return DEFAULT_UNIFORMS['uvOffset'];\r\n }\r\n if (symbolDef.uvOffsetInMeter) {\r\n return DEFAULT_UNIFORMS['uvOffset'];\r\n }\r\n return symbol.uvOffset || DEFAULT_UNIFORMS['uvOffset'];\r\n }\r\n });\r\n\r\n const offsetUniform = [];\r\n Object.defineProperty(uniforms, 'patternOffset', {\r\n enumerable: true,\r\n get: () => {\r\n if (geometry.data.aPatternOffset) {\r\n return DEFAULT_UNIFORMS['uvOffset'];\r\n }\r\n if (!symbolDef.uvOffsetInMeter) {\r\n return DEFAULT_UNIFORMS['uvOffset'];\r\n }\r\n const offset = symbolDef.uvOffset;\r\n if (!offset) {\r\n return DEFAULT_UNIFORMS['uvOffset'];\r\n }\r\n const offsetX = meterToPoint(map, offset[0], tileCoord, tileRes);\r\n const offsetY = meterToPoint(map, offset[1], tileCoord, tileRes);\r\n return vec2.set(offsetUniform, offsetX, offsetY);\r\n }\r\n });\r\n\r\n Object.defineProperty(uniforms, 'tileScale', {\r\n enumerable: true,\r\n get: function () {\r\n const texWidth = symbolDef.polygonPatternFileWidth;\r\n const texHeight = symbolDef.polygonPatternFileHeight;\r\n if (texWidth || texHeight) {\r\n return 1;\r\n }\r\n return geometry.properties.tileResolution / map.getResolution();\r\n }\r\n });\r\n uniforms.polygonPatternFile = createAtlasTexture(this.regl, iconAtlas, false, false);\r\n uniforms.atlasSize = [iconAtlas.width, iconAtlas.height];\r\n this.drawDebugAtlas(iconAtlas);\r\n }\r\n\r\n const material = new reshader.Material(uniforms, DEFAULT_UNIFORMS);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n // disableVAO: true,\r\n castShadow: false,\r\n picking: true\r\n });\r\n const defines = {};\r\n if (iconAtlas && geometry.data.aTexInfo) {\r\n defines['HAS_PATTERN'] = 1;\r\n }\r\n if (iconAtlas && geometry.data.aTexCoord) {\r\n defines['HAS_TEX_COORD'] = 1;\r\n defines['INVALID_TEX_COORD'] = INVALID_TEX_COORD + '.0';\r\n }\r\n if (geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n if (geometry.data.aColor) {\r\n defines['HAS_COLOR'] = 1;\r\n }\r\n if (geometry.data.aOpacity) {\r\n defines['HAS_OPACITY'] = 1;\r\n }\r\n if (geometry.data.aUVScale) {\r\n defines['HAS_UV_SCALE'] = 1;\r\n }\r\n if (geometry.data.aUVOffset) {\r\n defines['HAS_UV_OFFSET'] = 1;\r\n }\r\n if (geometry.data.aPatternOrigin) {\r\n defines['HAS_PATTERN_ORIGIN'] = 1;\r\n }\r\n if (geometry.data.aPatternWidth) {\r\n defines['HAS_PATTERN_WIDTH'] = 1;\r\n }\r\n if (geometry.data.aPatternOffset) {\r\n defines['HAS_PATTERN_OFFSET'] = 1;\r\n }\r\n\r\n if (isVectorTile) {\r\n defines['IS_VT'] = 1;\r\n }\r\n\r\n mesh.setDefines(defines);\r\n mesh.setLocalTransform(transform);\r\n mesh.properties.symbolIndex = symbolIndex;\r\n return mesh;\r\n }\r\n\r\n _preparePatternWidth(symbolDef, geo, tileRatio, tileCoord, tileRes) {\r\n geo = geo && geo.geometry;\r\n if (!geo) {\r\n return;\r\n }\r\n const features = geo.properties.features;\r\n if (isObjectEmpty(features)) {\r\n return;\r\n }\r\n const widthSymbol = symbolDef['polygonPatternFileWidth'];\r\n const heightSymbol = symbolDef['polygonPatternFileHeight'];\r\n const originFn = interpolated(symbolDef['polygonPatternFileOrigin']);\r\n let widthFn, heightFn;\r\n if (isFunctionDefinition(widthSymbol)) {\r\n widthFn = interpolated(widthSymbol);\r\n }\r\n if (isFunctionDefinition(heightSymbol)) {\r\n heightFn = interpolated(heightSymbol);\r\n }\r\n\r\n const { aPickingId, aPatternOrigin } = geo.data;\r\n const count = aPickingId.length;\r\n const aPatternWidth = new Float32Array(count * 2);\r\n\r\n let current, currentScaleX, currentScaleY;\r\n for (let i = 0, l = aPickingId.length; i < l; i++) {\r\n let width, height;\r\n if (aPickingId[i] === current) {\r\n aPatternWidth[i * 2] = currentScaleX;\r\n aPatternWidth[i * 2 + 1] = currentScaleY;\r\n continue;\r\n }\r\n const feature = features[aPickingId[i]];\r\n width = widthFn ? widthFn(null, feature.feature.properties) : widthSymbol;\r\n height = heightFn ? heightFn(null, feature.feature.properties) : heightSymbol;\r\n current = aPickingId[i];\r\n if (width || height) {\r\n let origin = tileCoord;\r\n if (aPatternOrigin) {\r\n const patternOrigin = originFn(null, feature.feature.properties);\r\n if (patternOrigin) {\r\n origin = COORD2.set(patternOrigin[0], patternOrigin[1]);\r\n }\r\n }\r\n const [ scaleX, scaleY ] = this._computePatternWidth(ARR_0, width, height, tileRatio, origin, tileRes);\r\n currentScaleX = aPatternWidth[i * 2] = scaleX;\r\n currentScaleY = aPatternWidth[i * 2 + 1] = scaleY;\r\n } else {\r\n currentScaleX = aPatternWidth[i * 2] = 0;\r\n currentScaleY = aPatternWidth[i * 2 + 1] = 0;\r\n }\r\n }\r\n geo.data.aPatternWidth = aPatternWidth;\r\n }\r\n\r\n _preparePatternOffset(symbolDef, geo, tileCoord, tileRes) {\r\n geo = geo && geo.geometry;\r\n if (!geo) {\r\n return;\r\n }\r\n const features = geo.properties.features;\r\n if (isObjectEmpty(features)) {\r\n return;\r\n }\r\n const map = this.getMap();\r\n let isMeterFn = isFunctionDefinition(symbolDef['uvOffsetInMeter']) && piecewiseConstant(symbolDef['uvOffsetInMeter']);\r\n const uvOffsetFn = interpolated(symbolDef['uvOffset']);\r\n const originFn = interpolated(symbolDef['polygonPatternFileOrigin']);\r\n\r\n const { aPickingId, aPatternOrigin } = geo.data;\r\n const count = aPickingId.length;\r\n const aPatternOffset = new Float32Array(count * 2);\r\n\r\n let current, currentOffsetX, currentOffsetY;\r\n for (let i = 0, l = aPickingId.length; i < l; i++) {\r\n if (aPickingId[i] === current) {\r\n aPatternOffset[i * 2] = currentOffsetX;\r\n aPatternOffset[i * 2 + 1] = currentOffsetY;\r\n continue;\r\n }\r\n const feature = features[aPickingId[i]];\r\n const offset = uvOffsetFn(null, feature.feature.properties);\r\n let isUvOffsetInMeter = true;\r\n if (isMeterFn) {\r\n isUvOffsetInMeter = isMeterFn(null, feature.feature.properties);\r\n }\r\n current = aPickingId[i];\r\n if (offset && isUvOffsetInMeter) {\r\n let origin = tileCoord;\r\n if (aPatternOrigin) {\r\n const patternOrigin = originFn(null, feature.feature.properties);\r\n if (patternOrigin) {\r\n origin = COORD2.set(patternOrigin[0], patternOrigin[1]);\r\n }\r\n }\r\n const offsetX = meterToPoint(map, offset[0], origin, tileRes);\r\n const offsetY = meterToPoint(map, offset[0], origin, tileRes);\r\n currentOffsetX = aPatternOffset[i * 2] = offsetX;\r\n currentOffsetY = aPatternOffset[i * 2 + 1] = offsetY;\r\n } else {\r\n currentOffsetX = aPatternOffset[i * 2] = 0;\r\n currentOffsetY = aPatternOffset[i * 2 + 1] = 0;\r\n }\r\n }\r\n geo.data.aPatternOffset = aPatternOffset;\r\n }\r\n\r\n _preparePatternOrigin(symbolDef, geo, tilePoint, tileRes) {\r\n geo = geo && geo.geometry;\r\n if (!geo) {\r\n return;\r\n }\r\n const features = geo.properties.features;\r\n if (isObjectEmpty(features)) {\r\n return;\r\n }\r\n const map = this.getMap();\r\n const originFn = interpolated(symbolDef['polygonPatternFileOrigin']);\r\n const aPickingId = geo.data.aPickingId;\r\n const count = aPickingId.length;\r\n const aPatternOrigin = new Float32Array(count * 2);\r\n let current, currentOriginX, currentOriginY;\r\n for (let i = 0, l = aPickingId.length; i < l; i++) {\r\n if (aPickingId[i] === current) {\r\n aPatternOrigin[i * 2] = currentOriginX;\r\n aPatternOrigin[i * 2 + 1] = currentOriginY;\r\n continue;\r\n }\r\n current = aPickingId[i];\r\n const feature = features[current];\r\n const patternOrigin = originFn(null, feature.feature.properties);\r\n\r\n if (patternOrigin) {\r\n COORD0.set(patternOrigin[0], patternOrigin[1]);\r\n map.coordToPointAtRes(COORD0, tileRes, COORD1);\r\n currentOriginX = aPatternOrigin[i * 2] = COORD1.x;\r\n currentOriginY = aPatternOrigin[i * 2 + 1] = COORD1.y;\r\n } else {\r\n currentOriginX = aPatternOrigin[i * 2] = tilePoint[0];\r\n currentOriginY = aPatternOrigin[i * 2 + 1] = tilePoint[1];\r\n }\r\n }\r\n geo.data.aPatternOrigin = aPatternOrigin;\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n const polygonFillFn = piecewiseConstant(symbolDef['polygonFill']);\r\n const polygonOpacityFn = interpolated(symbolDef['polygonOpacity']);\r\n const uvScaleFn = interpolated(symbolDef['uvScale']);\r\n const uvOffsetFn = interpolated(symbolDef['uvOffset']);\r\n const u8 = new Uint8Array(1);\r\n const u16 = new Uint16Array(2);\r\n const offsetU8 = new Uint8Array(2);\r\n return [\r\n {\r\n //geometry.data 中的属性数据\r\n attrName: 'aColor',\r\n //symbol中的function-type属性\r\n symbolName: 'polygonFill',\r\n type: Uint8Array,\r\n width: 4,\r\n define: 'HAS_COLOR',\r\n //\r\n evaluate: (properties, geometry) => {\r\n let color = polygonFillFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(color)) {\r\n color = this.evaluateInFnTypeConfig(color, geometry, map, properties, true);\r\n }\r\n if (!Array.isArray(color)) {\r\n color = this.colorCache[color] = this.colorCache[color] || Color(color).unitArray();\r\n }\r\n color = toUint8ColorInGlobalVar(color);\r\n return color;\r\n }\r\n },\r\n {\r\n attrName: 'aOpacity',\r\n symbolName: 'polygonOpacity',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_OPACITY',\r\n evaluate: (properties, geometry) => {\r\n let opacity = polygonOpacityFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(opacity)) {\r\n opacity = this.evaluateInFnTypeConfig(opacity, geometry, map, properties);\r\n }\r\n u8[0] = opacity * 255;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aUVScale',\r\n symbolName: 'uvScale',\r\n // 0.01 - 20\r\n type: Uint16Array,\r\n width: 2,\r\n define: 'HAS_UV_SCALE',\r\n evaluate: properties => {\r\n const scale = uvScaleFn(map.getZoom(), properties);\r\n u16[0] = scale[0] * 255;\r\n u16[1] = scale[1] * 255;\r\n return u16;\r\n }\r\n },\r\n {\r\n attrName: 'aUVOffset',\r\n symbolName: 'uvOffset',\r\n type: Uint8Array,\r\n width: 2,\r\n define: 'HAS_UV_OFFSET',\r\n evaluate: properties => {\r\n const offset = uvOffsetFn(map.getZoom(), properties);\r\n offsetU8[0] = offset[0] * 255;\r\n offsetU8[1] = offset[1] * 255;\r\n return offsetU8;\r\n }\r\n }\r\n ];\r\n }\r\n\r\n paint(context) {\r\n if (this.isShadowIncludeChanged(context)) {\r\n this.shader.dispose();\r\n this._createShader(context);\r\n }\r\n super.paint(context);\r\n }\r\n\r\n isEnableTileStencil(context) {\r\n const isVT = this.layer.getJSONType() === 'VectorTileLayer';\r\n const isTileLayer = this.layer instanceof maptalks.TileLayer;\r\n const isRenderingTerrainSkin = !!(context && context.isRenderingTerrain && this.isTerrainSkin());\r\n const isEnableStencil = !isRenderingTerrainSkin;\r\n // 只在VectorTileLayer上打开stencil maptalks/issues#566\r\n // 原有stencil打开后,前面的polygon绘制后,后面的polygon不再绘制,用以解决底图上,半透明polygon重叠时的z-fighting,但比较反直觉\r\n // GeoJSONVectorTileLayer不用于底图绘制,所以应该关闭该特性\r\n return isEnableStencil && (isVT || isTileLayer && this.isOnly2D());\r\n }\r\n\r\n init(context) {\r\n const regl = this.regl;\r\n const canvas = this.canvas;\r\n const viewport = {\r\n x: (_, props) => {\r\n return props.viewport ? props.viewport.x : 0;\r\n },\r\n y: (_, props) => {\r\n return props.viewport ? props.viewport.y : 0;\r\n },\r\n width: (_, props) => {\r\n return props.viewport ? props.viewport.width : (canvas ? canvas.width : 1);\r\n },\r\n height: (_, props) => {\r\n return props.viewport ? props.viewport.height : (canvas ? canvas.height : 1);\r\n },\r\n };\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n const depthRange = this.sceneConfig.depthRange;\r\n const extraCommandProps = {\r\n viewport,\r\n stencil: {\r\n enable: () => {\r\n return this.isEnableTileStencil(context);\r\n },\r\n func: {\r\n cmp: () => {\r\n return this.isOnly2D() ? '=' : '<=';\r\n },\r\n ref: (context, props) => {\r\n return props.stencilRef;\r\n }\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: () => {\r\n const isVT = this.layer.getJSONType() === 'VectorTileLayer';\r\n const stencil = this.isOnly2D();\r\n return (isVT && stencil) ? 'zero' : 'replace';\r\n }\r\n\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n range: depthRange || [0, 1],\r\n // 如果mask设为true,fill会出现与轮廓线的深度冲突,出现奇怪的绘制\r\n // 如果mask设为false,会出现 antialias 打开时,会被Ground的ssr覆盖的问题 (绘制时ssr需要对比深度值)\r\n // 以上问题已经解决 #284\r\n mask: (_, props) => {\r\n if (!isNil(this.sceneConfig.depthMask)) {\r\n return !!this.sceneConfig.depthMask;\r\n }\r\n if (props.hasSSRGround) {\r\n // fuzhenn/maptalks-ide#3071\r\n // 解决没写depthMask,导致被ssr地面遮住的问题\r\n // 但这里会导致透明的polygon无法叠加绘制的问题\r\n return true;\r\n }\r\n if (props.meshConfig.transparent) {\r\n return false;\r\n }\r\n const opacity = props['polygonOpacity'];\r\n return !(isNumber(opacity) && opacity < 1);\r\n },\r\n func: this.sceneConfig.depthFunc || '<='\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n };\r\n this._createShader(context, extraCommandProps);\r\n\r\n if (this.pickingFBO) {\r\n const projViewModelMatrix = [];\r\n this.picking = [new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: pickingVert,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ],\r\n extraCommandProps\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n )];\r\n }\r\n }\r\n\r\n _createShader(context, extraCommandProps) {\r\n const projViewModelMatrix = [];\r\n const uniforms = [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n },\r\n ];\r\n const defines = {};\r\n this.fillIncludes(defines, uniforms, context);\r\n\r\n\r\n this.shader = new reshader.MeshShader({\r\n vert, frag,\r\n uniforms,\r\n defines,\r\n extraCommandProps\r\n });\r\n }\r\n\r\n getUniformValues(map, context) {\r\n const isRenderingTerrainSkin = context && context.isRenderingTerrainSkin;\r\n const projViewMatrix = isRenderingTerrainSkin ? IDENTITY_ARR : map.projViewMatrix;\r\n const glScale = context && context.isRenderingTerrainSkin ? 1 : 1 / map.getGLScale();\r\n // const blendSrc = this.sceneConfig.blendSrc;\r\n const uniforms = {\r\n projViewMatrix,\r\n glScale,\r\n viewport: isRenderingTerrainSkin && context && context.viewport,\r\n hasSSRGround: context && context.hasSSRGround\r\n // blendSrcIsOne: +(!!(blendSrc === 'one' || blendSrc === 1))\r\n };\r\n this.setIncludeUniformValues(uniforms, context);\r\n return uniforms;\r\n }\r\n\r\n _computePatternWidth(out, texWidth, texHeight, tileRatio, tileCoord, tileRes) {\r\n let scaleX, scaleY;\r\n const map = this.getMap();\r\n if (texWidth) {\r\n const pointWidth = meterToPoint(map, texWidth, tileCoord, tileRes);\r\n scaleX = pointWidth;\r\n }\r\n if (texHeight) {\r\n const pointHeight = meterToPoint(map, texHeight, tileCoord, tileRes, 1);\r\n scaleY = pointHeight;\r\n }\r\n scaleX = scaleX || scaleY;\r\n scaleY = scaleY || scaleX;\r\n out[0] = scaleX;\r\n out[1] = scaleY;\r\n return out;\r\n }\r\n}\r\n\r\nexport default FillPainter;\r\n\r\n\r\n","import * as maptalks from 'maptalks';\r\nimport { Color } from '@maptalks/vector-packer';\r\nimport BasicPainter from './BasicPainter';\r\nimport { reshader } from '@maptalks/gl';\r\nimport { vec2, mat4 } from '@maptalks/gl';\r\nimport vert from './glsl/line.vert';\r\nimport frag from './glsl/line.frag';\r\nimport pickingVert from './glsl/line.vert';\r\nimport { setUniformFromSymbol, createColorSetter, toUint8ColorInGlobalVar, isNil } from '../Util';\r\nimport { prepareFnTypeData, isFnTypeSymbol } from './util/fn_type_util';\r\nimport { createAtlasTexture } from './util/atlas_util';\r\nimport { isFunctionDefinition, piecewiseConstant, interpolated } from '@maptalks/function-type';\r\n\r\nconst IDENTITY_ARR = mat4.identity([]);\r\nconst TEMP_CANVAS_SIZE = [];\r\n\r\nclass LinePainter extends BasicPainter {\r\n\r\n static getBloomSymbol() {\r\n return ['lineBloom'];\r\n }\r\n\r\n isUniqueStencilRefPerTile() {\r\n //如果用unique ref,会导致邻居瓦片内的 linecap或linejoin 没有绘制,导致线在瓦片间出现空隙\r\n return false;\r\n }\r\n\r\n prepareSymbol(symbol) {\r\n const lineColor = symbol.lineColor;\r\n if (Array.isArray(lineColor)) {\r\n if (lineColor.length === 3) {\r\n lineColor.push(1);\r\n }\r\n symbol.lineColor = lineColor.map(c => c * 255);\r\n }\r\n\r\n const lineStrokeColor = symbol.lineStrokeColor;\r\n if (Array.isArray(lineStrokeColor)) {\r\n if (lineStrokeColor.length === 3) {\r\n lineStrokeColor.push(1);\r\n }\r\n symbol.lineStrokeColor = lineStrokeColor.map(c => c * 255);\r\n }\r\n\r\n const lineDashColor = symbol.lineDashColor;\r\n if (Array.isArray(lineDashColor)) {\r\n if (lineDashColor.length === 3) {\r\n lineDashColor.push(1);\r\n }\r\n symbol.lineDashColor = lineDashColor.map(c => c * 255);\r\n }\r\n }\r\n\r\n isAnimating() {\r\n if (this._hasPatternAnim) {\r\n return true;\r\n }\r\n const symbols = this.getSymbols();\r\n const animation = this.sceneConfig.trailAnimation;\r\n const needToRedraw = animation && animation.enable;\r\n if (needToRedraw) {\r\n return true;\r\n }\r\n for (let i = 0; i < symbols.length; i++) {\r\n if (symbols[i]['linePatternFile'] && symbols[i]['linePatternAnimSpeed']) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n needToRedraw() {\r\n if (super.needToRedraw()) {\r\n return true;\r\n }\r\n if (this.isAnimating()) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n isBloom(mesh) {\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n const lineSymbol = LinePainter.getBloomSymbol()[0];\r\n return !!symbol[lineSymbol];\r\n }\r\n\r\n needPolygonOffset() {\r\n return true;\r\n }\r\n\r\n createMesh(geo, transform) {\r\n if (!geo.geometry) {\r\n return null;\r\n }\r\n const { geometry, symbolIndex, ref } = geo;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n if (ref === undefined) {\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n }\r\n\r\n const symbol = this.getSymbol(symbolIndex);\r\n const uniforms = {\r\n tileResolution: geometry.properties.tileResolution,\r\n tileRatio: geometry.properties.tileRatio,\r\n tileExtent: geometry.properties.tileExtent\r\n };\r\n this.setLineUniforms(symbol, uniforms);\r\n\r\n // 为了支持和linePattern合成,把默认lineColor设为白色\r\n setUniformFromSymbol(uniforms, 'lineColor', symbol, 'lineColor', '#fff', createColorSetter(this.colorCache));\r\n setUniformFromSymbol(uniforms, 'linePatterGapColor', symbol, 'linePatterGapColor', [0, 0, 0, 0], createColorSetter(this.colorCache));\r\n setUniformFromSymbol(uniforms, 'lineStrokeColor', symbol, 'lineStrokeColor', [0, 0, 0, 0], createColorSetter(this.colorCache));\r\n setUniformFromSymbol(uniforms, 'lineDasharray', symbol, 'lineDasharray', [0, 0, 0, 0], dasharray => {\r\n let lineDasharray;\r\n if (dasharray && dasharray.length) {\r\n const old = dasharray;\r\n if (dasharray.length === 1) {\r\n lineDasharray = [old[0], old[0], old[0], old[0]];\r\n } else if (dasharray.length === 2) {\r\n lineDasharray = [old[0], old[1], old[0], old[1]];\r\n } else if (dasharray.length === 3) {\r\n lineDasharray = [old[0], old[1], old[2], old[2]];\r\n } else if (dasharray.length === 4) {\r\n lineDasharray = dasharray;\r\n } else if (dasharray.length > 4) {\r\n lineDasharray = dasharray.slice(0, 4);\r\n }\r\n }\r\n return lineDasharray || [0, 0, 0, 0];\r\n }, [0, 0, 0, 0]);\r\n setUniformFromSymbol(uniforms, 'lineDashColor', symbol, 'lineDashColor', [0, 0, 0, 0], createColorSetter(this.colorCache));\r\n\r\n const iconAtlas = geometry.properties.iconAtlas;\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n if (iconAtlas) {\r\n uniforms.linePatternFile = createAtlasTexture(this.regl, iconAtlas, false, false);\r\n uniforms.atlasSize = iconAtlas ? [iconAtlas.width, iconAtlas.height] : [0, 0];\r\n uniforms.flipY = isVectorTile ? -1 : 1;\r\n this.drawDebugAtlas(iconAtlas);\r\n }\r\n //TODO lineDx, lineDy\r\n // const indices = geometries[i].elements;\r\n // const projViewMatrix = mat4.multiply([], mapUniforms.projMatrix, mapUniforms.viewMatrix);\r\n // const projViewModelMatrix = mat4.multiply(new Float32Array(16), projViewMatrix, transform);\r\n // console.log('projViewModelMatrix', projViewModelMatrix);\r\n // const pos = geometries[i].data.aPosition;\r\n // for (let ii = 0; ii < indices.length; ii++) {\r\n // const idx = indices[ii] * 3;\r\n // // if (ii === 2) {\r\n // // pos[idx + 2] = 8192;\r\n // // }\r\n // const vector = [pos[idx], pos[idx + 1], pos[idx + 2], 1];\r\n // const glPos = vec4.transformMat4([], vector, projViewModelMatrix);\r\n // const tilePos = vec4.transformMat4([], vector, transform);\r\n // const ndc = [glPos[0] / glPos[3], glPos[1] / glPos[3], glPos[2] / glPos[3]];\r\n // console.log(vector, tilePos, glPos, ndc);\r\n // }\r\n\r\n if (ref === undefined) {\r\n geometry.generateBuffers(this.regl);\r\n }\r\n\r\n const material = new reshader.Material(uniforms);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n castShadow: false,\r\n picking: true\r\n });\r\n mesh.setLocalTransform(transform);\r\n mesh.positionMatrix = this.getAltitudeOffsetMatrix();\r\n\r\n const defines = {};\r\n if (iconAtlas) {\r\n defines['HAS_PATTERN'] = 1;\r\n }\r\n mesh.properties.symbolIndex = symbolIndex;\r\n this._prepareDashDefines(mesh, defines);\r\n if (geometry.data.aColor) {\r\n defines['HAS_COLOR'] = 1;\r\n }\r\n if (geometry.data.aStrokeColor) {\r\n defines['HAS_STROKE_COLOR'] = 1;\r\n }\r\n this.setMeshDefines(defines, geometry, symbolDef);\r\n if (geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n mesh.setDefines(defines);\r\n return mesh;\r\n }\r\n\r\n addMesh(...args) {\r\n delete this._hasPatternAnim;\r\n const mesh = args[0];\r\n if (Array.isArray(mesh)) {\r\n mesh.forEach(m => {\r\n this._prepareMesh(m);\r\n });\r\n } else {\r\n this._prepareMesh(mesh);\r\n }\r\n super.addMesh(...args);\r\n }\r\n\r\n _prepareMesh(mesh) {\r\n if (!mesh.geometry.aLineWidth && mesh.material.get('lineWidth') <= 0 || !mesh.geometry.aOpacity && mesh.material.get('lineOpacity') <= 0) {\r\n return;\r\n }\r\n const defines = mesh.defines;\r\n this._prepareDashDefines(mesh, defines);\r\n mesh.setDefines(defines);\r\n if (mesh.geometry.properties.hasPatternAnim) {\r\n this._hasPatternAnim = 1;\r\n }\r\n }\r\n\r\n _prepareDashDefines(mesh, defines) {\r\n const geometry = mesh.geometry;\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n if (geometry.data['aDasharray'] || Array.isArray(symbol.lineDasharray) &&\r\n symbol.lineDasharray.reduce((accumulator, currentValue)=> {\r\n return accumulator + currentValue;\r\n }, 0) > 0) {\r\n defines['HAS_DASHARRAY'] = 1;\r\n if (geometry.data['aDasharray']) {\r\n defines['HAS_DASHARRAY_ATTR'] = 1;\r\n }\r\n if (geometry.data['aDashColor']) {\r\n defines['HAS_DASHARRAY_COLOR'] = 1;\r\n }\r\n } else if (defines['HAS_DASHARRAY']) {\r\n delete defines['HAS_DASHARRAY'];\r\n }\r\n }\r\n\r\n setLineUniforms(symbol, uniforms) {\r\n setUniformFromSymbol(uniforms, 'lineWidth', symbol, 'lineWidth', 2);\r\n setUniformFromSymbol(uniforms, 'lineOpacity', symbol, 'lineOpacity', 1);\r\n setUniformFromSymbol(uniforms, 'lineStrokeWidth', symbol, 'lineStrokeWidth', 0);\r\n setUniformFromSymbol(uniforms, 'lineBlur', symbol, 'lineBlur', 0.7);\r\n setUniformFromSymbol(uniforms, 'lineOffset', symbol, 'lineOffset', 0);\r\n setUniformFromSymbol(uniforms, 'lineDx', symbol, 'lineDx', 0);\r\n setUniformFromSymbol(uniforms, 'lineDy', symbol, 'lineDy', 0);\r\n setUniformFromSymbol(uniforms, 'linePatternAnimSpeed', symbol, 'linePatternAnimSpeed', 0);\r\n setUniformFromSymbol(uniforms, 'linePatternGap', symbol, 'linePatternGap', 0);\r\n // setUniformFromSymbol(uniforms, 'lineOffset', symbol, 'lineOffset', 0);\r\n }\r\n\r\n setMeshDefines(defines, geometry, symbolDef) {\r\n if (geometry.data.aOpacity) {\r\n defines['HAS_OPACITY'] = 1;\r\n }\r\n if (geometry.data.aLineWidth) {\r\n defines['HAS_LINE_WIDTH'] = 1;\r\n }\r\n if (geometry.data.aLineStrokeWidth) {\r\n defines['HAS_STROKE_WIDTH'] = 1;\r\n }\r\n if (isFnTypeSymbol(symbolDef['lineDx'])) {\r\n defines['HAS_LINE_DX'] = 1;\r\n }\r\n if (isFnTypeSymbol(symbolDef['lineDy'])) {\r\n defines['HAS_LINE_DY'] = 1;\r\n }\r\n // if (symbol['lineOffset']) {\r\n // defines['USE_LINE_OFFSET'] = 1;\r\n // }\r\n if (isFnTypeSymbol(symbolDef['linePatternAnimSpeed'])) {\r\n defines['HAS_PATTERN_ANIM'] = 1;\r\n }\r\n if (isFnTypeSymbol(symbolDef['linePatternGap'])) {\r\n defines['HAS_PATTERN_GAP'] = 1;\r\n }\r\n }\r\n\r\n paint(context) {\r\n if (this.isShadowIncludeChanged(context)) {\r\n this.shader.dispose();\r\n this.createShader(context);\r\n }\r\n super.paint(context);\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n const aColorFn = piecewiseConstant(symbolDef['lineColor']);\r\n const aLinePatternAnimSpeedFn = piecewiseConstant(symbolDef['aLinePatternAnimSpeed']);\r\n const aLinePatternGapFn = piecewiseConstant(symbolDef['aLinePatternGap']);\r\n const shapeConfigs = this.createShapeFnTypeConfigs(map, symbolDef);\r\n const i8 = new Int8Array(2);\r\n return [\r\n {\r\n //geometry.data 中的属性数据\r\n attrName: 'aColor',\r\n //symbol中的function-type属性\r\n symbolName: 'lineColor',\r\n type: Uint8Array,\r\n width: 4,\r\n define: 'HAS_COLOR',\r\n evaluate: (properties, geometry) => {\r\n let color = aColorFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(color)) {\r\n color = this.evaluateInFnTypeConfig(color, geometry, map, properties, true);\r\n }\r\n if (!Array.isArray(color)) {\r\n color = this.colorCache[color] = this.colorCache[color] || Color(color).unitArray();\r\n }\r\n color = toUint8ColorInGlobalVar(color);\r\n return color;\r\n }\r\n },\r\n {\r\n attrName: 'aLinePattern',\r\n symbolName: 'linePatternAnimSpeed',\r\n type: Int8Array,\r\n width: 2,\r\n related: ['linePatternGap'],\r\n define: 'HAS_LINE_PATTERN',\r\n evaluate: (properties, geometry, arr, index) => {\r\n let speed = aLinePatternAnimSpeedFn(map.getZoom(), properties);\r\n if (isNil(speed)) {\r\n speed = 0;\r\n }\r\n if (speed !== 0) {\r\n geometry.properties.hasPatternAnim = 1;\r\n }\r\n i8[0] = speed / 127;\r\n i8[1] = arr[index + 1];\r\n return i8;\r\n }\r\n },\r\n {\r\n attrName: 'aLinePattern',\r\n symbolName: 'linePatternGap',\r\n type: Int8Array,\r\n width: 2,\r\n related: ['linePatternAnimSpeed'],\r\n define: 'HAS_LINE_PATTERN',\r\n evaluate: (properties, geometry, arr, index) => {\r\n let gap = aLinePatternGapFn(map.getZoom(), properties);\r\n if (isNil(gap)) {\r\n gap = 0;\r\n }\r\n // 0 - 12.7\r\n i8[1] = gap * 10;\r\n i8[0] = arr[index];\r\n return i8;\r\n }\r\n }\r\n ].concat(shapeConfigs);\r\n }\r\n\r\n createShapeFnTypeConfigs(map, symbolDef) {\r\n const aLineWidthFn = interpolated(symbolDef['lineWidth']);\r\n const aLineOpacityFn = interpolated(symbolDef['lineOpacity']);\r\n const aLineStrokeWidthFn = interpolated(symbolDef['lineStrokeWidth']);\r\n const aLineDxFn = interpolated(symbolDef['lineDx']);\r\n const aLineDyFn = interpolated(symbolDef['lineDy']);\r\n const u16 = new Uint16Array(1);\r\n const i8 = new Int8Array(1);\r\n return [\r\n {\r\n attrName: 'aLineWidth',\r\n symbolName: 'lineWidth',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_LINE_WIDTH',\r\n evaluate: (properties, geometry) => {\r\n let lineWidth = aLineWidthFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(lineWidth)) {\r\n lineWidth = this.evaluateInFnTypeConfig(lineWidth, geometry, map, properties);\r\n }\r\n //乘以2是为了解决 #190\r\n u16[0] = Math.round(lineWidth * 2.0);\r\n return u16[0];\r\n }\r\n },\r\n {\r\n attrName: 'aLineStrokeWidth',\r\n symbolName: 'lineStrokeWidth',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_STROKE_WIDTH',\r\n evaluate: properties => {\r\n const lineStrokeWidth = aLineStrokeWidthFn(map.getZoom(), properties);\r\n //乘以2是为了解决 #190\r\n u16[0] = Math.round(lineStrokeWidth * 2.0);\r\n return u16[0];\r\n }\r\n },\r\n {\r\n attrName: 'aLineDxDy',\r\n symbolName: 'lineDx',\r\n type: Int8Array,\r\n width: 2,\r\n define: 'HAS_LINE_DX',\r\n evaluate: properties => {\r\n const lineDx = aLineDxFn(map.getZoom(), properties);\r\n i8[0] = lineDx;\r\n return i8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aLineDxDy',\r\n symbolName: 'lineDy',\r\n type: Int8Array,\r\n width: 2,\r\n define: 'HAS_LINE_DY',\r\n evaluate: properties => {\r\n const lineDy = aLineDyFn(map.getZoom(), properties);\r\n i8[0] = lineDy;\r\n return i8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aOpacity',\r\n symbolName: 'lineOpacity',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_OPACITY',\r\n evaluate: (properties, geometry) => {\r\n let opacity = aLineOpacityFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(opacity)) {\r\n opacity = this.evaluateInFnTypeConfig(opacity, geometry, map, properties);\r\n }\r\n u16[0] = opacity * 255;\r\n return u16[0];\r\n }\r\n },\r\n ];\r\n }\r\n\r\n updateSceneConfig(config) {\r\n if (config.trailAnimation) {\r\n this.createShader(this._context);\r\n }\r\n }\r\n\r\n init(context) {\r\n const regl = this.regl;\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n\r\n this.createShader(context);\r\n\r\n if (this.pickingFBO) {\r\n this.picking = [new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + pickingVert,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ],\r\n extraCommandProps: this.getExtraCommandProps()\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n )];\r\n }\r\n }\r\n\r\n createShader(context) {\r\n this._context = context;\r\n const uniforms = [];\r\n const defines = {\r\n };\r\n this.fillIncludes(defines, uniforms, context);\r\n if (this.sceneConfig.trailAnimation && this.sceneConfig.trailAnimation.enable) {\r\n defines['HAS_TRAIL'] = 1;\r\n }\r\n const projViewModelMatrix = [];\r\n uniforms.push(\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n );\r\n\r\n\r\n\r\n this.shader = new reshader.MeshShader({\r\n vert, frag,\r\n uniforms,\r\n defines,\r\n extraCommandProps: this.getExtraCommandProps(context)\r\n });\r\n }\r\n\r\n // LinePainter 需要在2d下打开stencil,否则会因为子级瓦片无法遮住父级瓦片的绘制,出现一些奇怪的现象\r\n // https://github.com/maptalks/issues/issues/677\r\n isEnableTileStencil(context) {\r\n const isRenderingTerrainSkin = !!(context && context.isRenderingTerrain && this.isTerrainSkin());\r\n const isEnableStencil = !isRenderingTerrainSkin;\r\n return isEnableStencil;\r\n }\r\n\r\n getExtraCommandProps(context) {\r\n const canvas = this.canvas;\r\n const viewport = {\r\n x: (_, props) => {\r\n return props.viewport ? props.viewport.x : 0;\r\n },\r\n y: (_, props) => {\r\n return props.viewport ? props.viewport.y : 0;\r\n },\r\n width: (_, props) => {\r\n return props.viewport ? props.viewport.width : (canvas ? canvas.width : 1);\r\n },\r\n height: (_, props) => {\r\n return props.viewport ? props.viewport.height : (canvas ? canvas.height : 1);\r\n },\r\n };\r\n const depthRange = this.sceneConfig.depthRange;\r\n return {\r\n viewport,\r\n stencil: {\r\n enable: () => {\r\n return this.isEnableTileStencil(context);\r\n },\r\n mask: 0xff,\r\n func: {\r\n cmp: () => {\r\n return '<=';\r\n },\r\n ref: (context, props) => {\r\n return props.stencilRef;\r\n }\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n range: depthRange || [0, 1],\r\n mask: this.sceneConfig.depthMask || false,\r\n func: this.sceneConfig.depthFunc || '<='\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n };\r\n }\r\n\r\n\r\n getUniformValues(map, context) {\r\n const isRenderingTerrainSkin = context && context.isRenderingTerrainSkin;\r\n const tileSize = this.layer.getTileSize().width;\r\n\r\n const projViewMatrix = isRenderingTerrainSkin ? IDENTITY_ARR : map.projViewMatrix;\r\n const viewMatrix = map.viewMatrix,\r\n cameraToCenterDistance = map.cameraToCenterDistance,\r\n resolution = map.getResolution();\r\n const canvasSize = vec2.set(TEMP_CANVAS_SIZE, map.width, map.height);\r\n if (isRenderingTerrainSkin) {\r\n vec2.set(canvasSize, tileSize, tileSize);\r\n }\r\n const blendSrc = this.getBlendFunc().src();\r\n // const glScale = map.getGLScale();\r\n // const c = vec3.transformMat4([], map.cameraLookAt, projViewMatrix);\r\n // const unit = [resolution * 100 * glScale, 0, 0];\r\n // const v = vec3.transformMat4([], vec3.add([], map.cameraLookAt, unit), projViewMatrix);\r\n // console.log(vec2.normalize([], [v[0] - c[0], v[1] - c[1]]));\r\n const animation = this.sceneConfig.trailAnimation || {};\r\n const uniforms = {\r\n layerScale: this.layer.options['styleScale'] || 1,\r\n projViewMatrix, viewMatrix, cameraToCenterDistance, resolution, canvasSize,\r\n trailSpeed: animation.speed || 1,\r\n trailLength: animation.trailLength || 500,\r\n trailCircle: animation.trailCircle || 1000,\r\n currentTime: this.layer.getRenderer().getFrameTimestamp() || 0,\r\n blendSrcIsOne: +(!!(blendSrc === 1 || blendSrc === 'one')),\r\n cameraPosition: map.cameraPosition,\r\n viewport: isRenderingTerrainSkin && context && context.viewport,\r\n isRenderingTerrain: +(!!isRenderingTerrainSkin)\r\n // projMatrix: map.projMatrix,\r\n // halton: context.jitter || [0, 0],\r\n // outSize: [this.canvas.width, this.canvas.height],\r\n };\r\n\r\n this.setIncludeUniformValues(uniforms, context);\r\n return uniforms;\r\n }\r\n}\r\n\r\nexport default LinePainter;\r\n","import LinePainter from './LinePainter';\r\nimport { reshader } from '@maptalks/gl';\r\nimport { mat4 } from '@maptalks/gl';\r\nimport vert from './glsl/line.vert';\r\nimport frag from './glsl/line.gradient.frag';\r\nimport { prepareFnTypeData } from './util/fn_type_util';\r\n\r\nconst MAX_LINE_COUNT = 128;\r\n\r\nclass LineGradientPainter extends LinePainter {\r\n\r\n postCreateGeometry(lineGeometry) {\r\n const { symbolIndex, geometry } = lineGeometry;\r\n const { features } = geometry.properties;\r\n const symbol = this.getSymbol(symbolIndex);\r\n const gradProp = symbol['lineGradientProperty'];\r\n const featureIndexes = geometry.data.aPickingId;\r\n const aGradIndex = new Uint8Array(featureIndexes.length);\r\n const grads = [];\r\n let current = featureIndexes[0];\r\n const properties = features[current].feature.properties;\r\n grads.push(properties && properties[gradProp] || 0);\r\n for (let i = 1; i < featureIndexes.length; i++) {\r\n if (featureIndexes[i] !== current) {\r\n current = featureIndexes[i];\r\n grads.push(properties && properties[gradProp] || 0);\r\n }\r\n aGradIndex[i] = grads.length - 1;\r\n }\r\n geometry.data.aGradIndex = aGradIndex;\r\n geometry.properties.gradients = grads;\r\n }\r\n\r\n createMesh(geo, transform) {\r\n const { geometry, symbolIndex, ref } = geo;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n if (ref === undefined) {\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n }\r\n\r\n const uniforms = {\r\n tileResolution: geometry.properties.tileResolution,\r\n tileRatio: geometry.properties.tileRatio,\r\n tileExtent: geometry.properties.tileExtent\r\n };\r\n\r\n const symbol = this.getSymbol(symbolIndex);\r\n this.setLineUniforms(symbol, uniforms);\r\n\r\n const gradients = geometry.properties.gradients;\r\n let height = gradients.length * 2;\r\n if (!isPowerOfTwo(height)) {\r\n height = ceilPowerOfTwo(height);\r\n }\r\n const texture = this.regl.texture({\r\n width: 256,\r\n height,\r\n data: createGradient(gradients),\r\n format: 'rgba',\r\n mag: 'linear', //very important\r\n min: 'linear', //very important\r\n flipY: false,\r\n });\r\n\r\n uniforms['lineGradientTexture'] = texture;\r\n uniforms['lineGradientTextureHeight'] = texture.height;\r\n if (ref === undefined) {\r\n geometry.generateBuffers(this.regl);\r\n }\r\n\r\n const material = new reshader.Material(uniforms);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n castShadow: false,\r\n picking: true\r\n });\r\n mesh.setLocalTransform(transform);\r\n\r\n const defines = {\r\n 'HAS_GRADIENT': 1\r\n };\r\n if (geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n this.setMeshDefines(defines, geometry, symbolDef);\r\n mesh.setDefines(defines);\r\n mesh.properties.symbolIndex = symbolIndex;\r\n return mesh;\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n return this.createShapeFnTypeConfigs(map, symbolDef);\r\n }\r\n\r\n createShader(context) {\r\n this._context = context;\r\n const uniforms = [];\r\n const defines = {};\r\n this.fillIncludes(defines, uniforms, context);\r\n if (this.sceneConfig.trailAnimation && this.sceneConfig.trailAnimation.enable) {\r\n defines['HAS_TRAIL'] = 1;\r\n }\r\n const projViewModelMatrix = [];\r\n uniforms.push(\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n );\r\n\r\n this.shader = new reshader.MeshShader({\r\n vert, frag,\r\n uniforms,\r\n defines,\r\n extraCommandProps: this.getExtraCommandProps()\r\n });\r\n }\r\n}\r\n\r\nexport default LineGradientPainter;\r\n\r\nfunction createGradient(grads) {\r\n if (grads.length > MAX_LINE_COUNT) {\r\n console.warn(`Line count in a tile exceeds maximum limit (${MAX_LINE_COUNT}) for line-gradient render plugin.`);\r\n grads = grads.slice(0, MAX_LINE_COUNT);\r\n }\r\n // create a 256x1 gradient that we'll use to turn a grayscale heatmap into a colored one\r\n const canvas = document.createElement('canvas'),\r\n ctx = canvas.getContext('2d');\r\n\r\n canvas.width = 256;\r\n canvas.height = 2 * grads.length;\r\n if (!isPowerOfTwo(canvas.height)) {\r\n canvas.height = ceilPowerOfTwo(2 * grads.length);\r\n }\r\n\r\n for (let g = 0; g < grads.length; g++) {\r\n const grad = grads[g];\r\n const gradient = ctx.createLinearGradient(0, 0, 256, 0);\r\n for (let i = 0; i < grad.length; i += 2) {\r\n gradient.addColorStop(+grad[i], grad[i + 1]);\r\n }\r\n ctx.fillStyle = gradient;\r\n const dy = g % 256;\r\n ctx.fillRect(0, dy * 2, 256, dy * 2 + 2);\r\n }\r\n\r\n return ctx.canvas;\r\n}\r\n\r\nfunction isPowerOfTwo(value) {\r\n return (value & (value - 1)) === 0 && value !== 0;\r\n}\r\n\r\nfunction ceilPowerOfTwo(value) {\r\n return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));\r\n}\r\n","export default class CollisionGroup {\r\n constructor(meshes) {\r\n this._meshes = meshes || [];\r\n this.properties = {};\r\n }\r\n\r\n set meshes(m) {\r\n this._meshes = m;\r\n }\r\n\r\n get meshes() {\r\n return this._meshes;\r\n }\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { reshader, vec4 } from '@maptalks/gl';\r\nimport collisionVert from './glsl/collision.vert';\r\nimport collisionFrag from './glsl/collision.frag';\r\nimport BasicPainter from './BasicPainter';\r\nimport { clamp, isNil, getUniqueIds } from '../Util';\r\nimport CollisionGroup from './CollisionGroup';\r\n// import { getLabelContent } from './util/get_label_content';\r\n\r\n\r\n// 设置说明:\r\n// layer.options.collision 用来决定是否生成collision计算所需要的数据结构\r\n// sceneConfig.collision 决定是否开启和关闭collision\r\n\r\nconst DEFAULT_SCENE_CONFIG = {\r\n collision: false,\r\n fading: false,\r\n fadingDuration: 16 * 14,\r\n fadeInDelay: 600,\r\n fadeOutDelay: 100\r\n};\r\nconst MESH_ANCHOR_KEY = '__meshAnchorKey';\r\nconst UINT8 = new Uint8Array(1);\r\nconst COLLISION_OFFSET_THRESHOLD = 3;\r\nconst MESH_ANCHORS = [];\r\nconst NO_COLLISION = { collides: 0, boxes: [] };\r\n\r\nconst MESHES = [];\r\nconst BOX = [];\r\n\r\nexport default class CollisionPainter extends BasicPainter {\r\n\r\n createGeometry(...args) {\r\n const created = super.createGeometry(...args);\r\n if (!created || !created.geometry) {\r\n return created;\r\n }\r\n const { geometry } = created;\r\n // collideIds 用于碰撞检测,同一个数据的多symbol会生成多个mesh,不同的mesh中元素的collideId相同时,则认为共享一个检测结果\r\n // collideIds 优先用 aFeaIds,没有 aFeaIds 时,则用 aPickingId\r\n // 但 markerPlacement 为 line 时,iconPainter会重新生成 collideIds 和 uniqueCollideIds\r\n const glData = args[0];\r\n geometry.properties.collideIds = (glData.featureIds && glData.featureIds.length && glData.isIdUnique) ? glData.featureIds : glData.data.aPickingId;\r\n // uniqueCollideIds 是 collideIds 去重后的值,碰撞检测时对其遍历,按每个值来计算检测结果\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n geometry.properties.uniqueCollideIds = getUniqueIds(geometry.properties.collideIds, !isVectorTile);\r\n\r\n return created;\r\n }\r\n\r\n supportRenderMode(mode) {\r\n const renderToPointRenderTarget = this.sceneConfig.renderToPointRenderTarget;\r\n if (renderToPointRenderTarget || renderToPointRenderTarget === undefined) {\r\n return mode === 'point';\r\n } else {\r\n return mode === 'fxaa' || mode === 'fxaaAfterTaa';\r\n }\r\n }\r\n\r\n addMesh(meshes, progress, context) {\r\n if (meshes && !this.isEnableCollision()) {\r\n let meshesToCheck = meshes;\r\n if (!Array.isArray(meshesToCheck)) {\r\n MESHES[0] = meshes;\r\n meshesToCheck = MESHES;\r\n }\r\n for (let i = 0; i < meshesToCheck.length; i++) {\r\n const defines = meshesToCheck[i].defines;\r\n delete defines['ENABLE_COLLISION'];\r\n meshesToCheck[i].setDefines(defines);\r\n const { elements, visElemts } = meshesToCheck[i].geometry.properties;\r\n if (visElemts && visElemts.count !== undefined && visElemts.count !== elements.length) {\r\n meshesToCheck[i].geometry.setElements(elements);\r\n visElemts.count = elements.length;\r\n }\r\n }\r\n }\r\n return super.addMesh(meshes, progress, context);\r\n }\r\n\r\n startMeshCollision(mesh) {\r\n const { meshKey } = mesh.properties;\r\n const { renderer } = this._cachedInstances;\r\n const isForeground = renderer.isForeground(mesh instanceof CollisionGroup ? mesh.meshes[0] : mesh);\r\n mesh.properties.isForeground = isForeground;\r\n if (mesh instanceof CollisionGroup && mesh.meshes.length) {\r\n for (let i = 0; i < mesh.meshes.length; i++) {\r\n mesh.meshes[i].properties.isForeground = isForeground;\r\n }\r\n }\r\n\r\n this._startTime = performance.now();\r\n this._canProceed = this._canProceedCollision();\r\n this._meshCollisionStale = this._isCachedCollisionStale(meshKey);\r\n }\r\n\r\n endMeshCollision(meshKey) {\r\n const meshContext = this._collisionContext.tags[meshKey];\r\n if (this._canProceed && meshContext && this._meshCollisionStale) {\r\n const map = this.getMap();\r\n if (!this._anchorCoord0) {\r\n this._anchorCoord0 = new maptalks.Coordinate(0, 0);\r\n this._anchorCoord1 = new maptalks.Coordinate(0, 0);\r\n }\r\n meshContext.anchor0 = map.containerPointToCoord(this._containerAnchor0, this._anchorCoord0);\r\n meshContext.anchor1 = map.containerPointToCoord(this._containerAnchor1, this._anchorCoord1);\r\n meshContext.anchor0.z = map.getZoom();\r\n meshContext.anchor0.width = map.width;\r\n meshContext.anchor0.height = map.height;\r\n meshContext.anchor0.pitch = map.getPitch();\r\n }\r\n this.getMap().collisionFrameTime += performance.now() - this._startTime;\r\n }\r\n\r\n _isCachedCollisionStale(meshKey) {\r\n const map = this.getMap();\r\n const z = map.getZoom();\r\n const pitch = map.getPitch();\r\n const [anchor0, anchor1] = this._getMeshAnchor(meshKey);\r\n //如果没有anchor,或者anchor距离它应该在的点的像素距离超过阈值时,则说明collision已经过期\r\n if (!anchor0 || !anchor1 || anchor0.z !== z ||\r\n anchor0.width !== map.width || anchor0.height !== map.height || anchor0.pitch !== pitch ||\r\n anchor0.distanceTo(this._containerAnchor0) > COLLISION_OFFSET_THRESHOLD ||\r\n anchor1.distanceTo(this._containerAnchor1) > COLLISION_OFFSET_THRESHOLD) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n _startCollision() {\r\n const map = this.getMap();\r\n this._coordCache = {};\r\n this._containerAnchor0 = new maptalks.Point(map.width / 3, map.height / 2);\r\n this._containerAnchor1 = new maptalks.Point(map.width * 2 / 3, map.height / 2);\r\n delete this._canProceed;\r\n if (!this._collisionContext) {\r\n this._collisionContext = {\r\n tags: {}\r\n };\r\n }\r\n this._cachedInstances = {\r\n layer: this.layer,\r\n renderer: this.layer.getRenderer(),\r\n frameTimestamp: this.layer.getRenderer().getFrameTimestamp(),\r\n map: this.getMap(),\r\n zoom: map.getZoom(),\r\n collisionTags: this._collisionContext.tags,\r\n isEnableUniquePlacement: this.isEnableUniquePlacement()\r\n };\r\n }\r\n\r\n _endCollision() {\r\n }\r\n\r\n _getCachedCollision(meshKey, boxIndex) {\r\n const context = this._collisionContext;\r\n return context.tags[meshKey] && context.tags[meshKey][boxIndex];\r\n }\r\n\r\n _setCollisionCache(meshKey, boxIndex, value) {\r\n const context = this._collisionContext;\r\n context.tags[meshKey] = context.tags[meshKey] || [];\r\n context.tags[meshKey][boxIndex] = value;\r\n }\r\n\r\n _canProceedCollision() {\r\n const map = this.getMap();\r\n if (!map.isInteracting()) {\r\n return true;\r\n }\r\n const limit = this.layer.options['collisionFrameLimit'];\r\n return map.collisionFrameTime <= limit;\r\n }\r\n\r\n _getMeshAnchor(meshKey) {\r\n const keyName = (MESH_ANCHOR_KEY + '').trim();\r\n const meshContext = this._collisionContext.tags[meshKey];\r\n if (meshContext && meshContext.anchor0) {\r\n const { anchor0, anchor1 } = meshContext;\r\n const key0 = anchor0[keyName] = anchor0[keyName] || anchor0.x + ',' + anchor0.y;\r\n const key1 = anchor1[keyName] = anchor1[keyName] || anchor1.x + ',' + anchor1.y;\r\n let cp0 = this._coordCache[key0];\r\n let cp1 = this._coordCache[key1];\r\n if (!cp0 || !cp1) {\r\n const map = this.getMap();\r\n cp0 = this._coordCache[key0] = map.coordToContainerPoint(anchor0);\r\n cp1 = this._coordCache[key1] = map.coordToContainerPoint(anchor1);\r\n }\r\n cp0.z = anchor0.z;\r\n MESH_ANCHORS[0] = cp0;\r\n MESH_ANCHORS[1] = cp1;\r\n cp0.width = anchor0.width;\r\n cp0.height = anchor0.height;\r\n return MESH_ANCHORS;\r\n } else {\r\n MESH_ANCHORS[0] = MESH_ANCHORS[1] = null;\r\n }\r\n return MESH_ANCHORS;\r\n }\r\n\r\n updateBoxCollisionFading(boxVisible, mesh, meshBoxes, mvpMatrix, boxIndex) {\r\n const { layer, renderer, zoom, collisionTags, isEnableUniquePlacement } = this._cachedInstances;\r\n const { meshKey, isForeground } = mesh.properties;\r\n if (isEnableUniquePlacement && this._isReplacedPlacement(meshKey, boxIndex)) {\r\n return false;\r\n }\r\n const l = meshBoxes.length;\r\n // if (this.shouldIgnoreBackground() && !isForeground) {\r\n // return INVISIBLE_BOX;\r\n // }\r\n //地图缩小时限制绘制的box数量,以及fading时,父级瓦片中的box数量,避免大量的box绘制,提升缩放的性能\r\n // if (this.shouldLimitBox(isForeground) && boxIndex > layer.options['boxLimitOnZoomout']) {\r\n // return INVISIBLE_BOX;\r\n // }\r\n\r\n //为了解决缩小地图时,大量文字会突然挤在一起\r\n //尽量重用缓存的collision,能提升碰撞检测的性能,但在必要的时候需要刷新缓存的collision\r\n //这里逻辑如下:\r\n //## zooming时\r\n //* zooming时已经collided,则不刷新,仍都按照collided处理\r\n //* zooming时是uncollided,则重新计算collision\r\n //## 非zooming时\r\n //* canProceed且collision stale时刷新collision\r\n let collision = collisionTags[meshKey] && collisionTags[meshKey][boxIndex];\r\n const cachedCollision = collision;\r\n const zoomColliding = this._zooming && collision;\r\n const isCollidedOnZooming = zoomColliding && collision.collides !== 0;\r\n\r\n if (!isCollidedOnZooming && boxVisible) {\r\n const uncollidedOnZooming = zoomColliding && collision.collides === 0;\r\n if (this._canProceed || uncollidedOnZooming) {\r\n if (this._meshCollisionStale || collision && collision.z !== zoom) {\r\n collision = null;\r\n }\r\n if (!collision) {\r\n collision = cachedCollision || { collides: 0, boxes: [] };\r\n collision.boxes.length = 0;\r\n collision.z = zoom;\r\n let collides = 0;\r\n for (let i = 0; i < l; i++) {\r\n const { mesh, allElements, boxCount, start, end } = meshBoxes[i];\r\n const childCollision = this._isBoxVisible(mesh, allElements, boxCount, start, end, mvpMatrix, boxIndex);\r\n if (childCollision.isAllowOverlap) {\r\n collision.isAllowOverlap = 1;\r\n }\r\n if (collides === 0) {\r\n collides = childCollision.collides;\r\n }\r\n if (childCollision.boxes) {\r\n collision.boxes.push(...childCollision.boxes);\r\n }\r\n }\r\n collision.collides = collides;\r\n this._setCollisionCache(meshKey, boxIndex, collision);\r\n } else if (collision.boxes && collision.boxes.length) {\r\n //因为可能有新的boxes加入场景,所以要重新检查缓存中的box是否有collides\r\n //但zooming时不检查,有collides的仍继续隐藏\r\n const { boxes, isAllowOverlap } = collision;\r\n let collides = 0;\r\n if (!isAllowOverlap) {\r\n let offscreenCount = 0;\r\n for (let i = 0; i < boxes.length; i++) {\r\n if (!collides) {\r\n const boxCollides = this.isCollides(boxes[i]);\r\n if (boxCollides === -1) {\r\n offscreenCount++;\r\n } else if (boxCollides === 1) {\r\n collides = 1;\r\n break;\r\n }\r\n }\r\n }\r\n if (offscreenCount === boxes.length) {\r\n collides = -1;\r\n }\r\n }\r\n collision.collides = collides;\r\n }\r\n }\r\n }\r\n let visible = boxVisible && collision && collision.collides === 0;\r\n\r\n\r\n let fadingOpacity = 1;\r\n let isFading = false;\r\n if (this.sceneConfig.fading) {\r\n const stamps = this._getBoxTimestamps(mesh);\r\n // const current = stamps[boxIndex];\r\n // if (getLabelContent(mesh, allElements[start]) === '汉阳大道') {\r\n // // console.log('湖北', isForeground, collision && collision.collides, stamps[boxIndex]);\r\n // console.log('汉阳大道', tile.z, collision && collision.collides, stamps[boxIndex]);\r\n // }\r\n\r\n // if (debugging && visible && this._zoomingOut) {\r\n // debugger\r\n // }\r\n //zoomingOut过程中,直接根据collides结果显示或隐藏,不fading,避免fading造成的聚团现象\r\n //不能用this._zooming判断,因为zooming没有延迟\r\n if (!this._zoomingOut) {\r\n if (isForeground) {\r\n delete mesh._fadeOutStartTime;\r\n }\r\n // const stamps = this._getBoxTimestamps(meshKey);\r\n fadingOpacity = this._getBoxFading(isForeground, visible, stamps, boxIndex);\r\n //如果是当前tile,执行fading逻辑\r\n if (isForeground) {\r\n if (fadingOpacity > 0) {\r\n visible = true;\r\n }\r\n isFading = this.isBoxFading(mesh, boxIndex);\r\n if (isFading) {\r\n this.setToRedraw();\r\n }\r\n } else if (!visible) {\r\n //为解决zoom in 过程中,大量box挤在一起,造成的用户体验不佳的问题\r\n //当瓦片不是当前tile,则跳过fading,立即隐藏有collision的box\r\n this._markFadingCollided(stamps, boxIndex);\r\n fadingOpacity = 0;\r\n }\r\n if (visible) {\r\n const fadeOutStart = mesh._fadeOutStartTime;\r\n if (fadeOutStart && fadingOpacity === 1 && stamps[boxIndex] > 0) {\r\n let { fadeOutDelay, fadingDuration } = this.sceneConfig;\r\n if (isNil(fadingDuration)) { fadingDuration = DEFAULT_SCENE_CONFIG.fadingDuration; }\r\n if (isNil(fadeOutDelay)) { fadeOutDelay = DEFAULT_SCENE_CONFIG.fadeOutDelay; }\r\n const timestamp = renderer.getFrameTimestamp();\r\n const zoomEndFading = clamp(1 - (timestamp - fadeOutStart - fadeOutDelay) / fadingDuration, 0, 1);\r\n fadingOpacity *= zoomEndFading;\r\n if (zoomEndFading > 0) {\r\n this.setToRedraw();\r\n }\r\n // if (getLabelContent(mesh, allElements[start]) === '湖北') {\r\n // console.log('湖北', visible, mesh.uniforms.level, fadingOpacity, zoomEndFading);\r\n // }\r\n }\r\n }\r\n\r\n } else {\r\n stamps[boxIndex] = visible ? 1 : -1;\r\n }\r\n }\r\n\r\n if (collision && layer.options['debugCollision']) {\r\n this.addCollisionDebugBox(collision.boxes, collision.collides ? 0 : 1);\r\n }\r\n\r\n if (visible || isFading) {\r\n const { mesh, start } = meshBoxes[0];\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n if (!this._isIgnorePlacement(symbol, mesh, start) && collision && collision.boxes) {\r\n // if (getLabelContent(mesh, allElements[start]) === 'Indonesia') {\r\n // console.log(renderer.getFrameTimestamp(), meshKey, JSON.stringify(collision.boxes));\r\n // }\r\n this._fillCollisionIndex(collision.boxes, mesh);\r\n }\r\n }\r\n if (visible) {\r\n const opacity = UINT8[0] = fadingOpacity * 255;\r\n for (let i = 0; i < l; i++) {\r\n const { mesh, allElements, start, end, boxIndex } = meshBoxes[i];\r\n this.setCollisionOpacity(mesh, allElements, opacity, start, end, boxIndex);\r\n }\r\n }\r\n // if (getLabelContent(mesh, allElements[start]) === '会稽山') {\r\n // // console.log(renderer.getFrameTimestamp(), meshKey, visible, 'level:' + mesh.uniforms.level, 'fading:' + isFading, 'opacity:' + fadingOpacity, 'timestart:' + current, 'timeend:' + stamps[boxIndex]);\r\n // console.log(visible, 'level:' + mesh.uniforms.level, boxIndex, fadingOpacity, meshKey);\r\n // }\r\n\r\n return visible && fadingOpacity > 0;\r\n }\r\n\r\n isMeshIterable() {\r\n return true;\r\n }\r\n\r\n setCollisionOpacity(mesh, allElements, value, start, end) {\r\n const vertexIndexStart = allElements[start];\r\n const vertexIndexEnd = allElements[end - 1];\r\n this._updateOpacityData(mesh, value, vertexIndexStart, vertexIndexEnd);\r\n }\r\n\r\n _updateOpacityData(mesh, value, start, end) {\r\n const { aOpacity } = mesh.geometry.properties;\r\n if (!aOpacity) {\r\n return;\r\n }\r\n const vertexIndexStart = start;\r\n if (aOpacity[vertexIndexStart] !== value) {\r\n const vertexIndexEnd = end;\r\n for (let i = vertexIndexStart; i <= vertexIndexEnd; i++) {\r\n aOpacity[i] = value;\r\n }\r\n aOpacity.dirty = true;\r\n }\r\n }\r\n\r\n isBoxFading(mesh, boxIndex) {\r\n const { frameTimestamp } = this._cachedInstances;\r\n let fadingDuration = this.sceneConfig.fadingDuration;\r\n if (isNil(fadingDuration)) {\r\n fadingDuration = DEFAULT_SCENE_CONFIG.fadingDuration;\r\n }\r\n const boxTimestamp = Math.abs(this._getBoxTimestamps(mesh)[boxIndex]);\r\n return frameTimestamp - boxTimestamp < fadingDuration;\r\n }\r\n\r\n\r\n _isBoxVisible(mesh, elements, boxCount, start, end, mvpMatrix, boxIndex) {\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n const isIgnorePlacement = this._isIgnorePlacement(symbol, mesh, elements[start]);\r\n const isAllowOverlap = this._isAllowOverlap(symbol, mesh, elements[start]);\r\n if (!this.isEnableCollision() || isIgnorePlacement && isAllowOverlap) {\r\n return NO_COLLISION;\r\n }\r\n const collision = this.isBoxCollides(mesh, elements, boxCount, start, end, mvpMatrix, boxIndex);\r\n if (isAllowOverlap) {\r\n collision.collides = 0;\r\n collision.isAllowOverlap = 1;\r\n }\r\n return collision;\r\n }\r\n\r\n _isIgnorePlacement(symbol, mesh, index) {\r\n if (!this.isEnableCollision()) {\r\n return true;\r\n }\r\n const aOverlap = mesh.geometry.properties['aOverlap'];\r\n if (!aOverlap) {\r\n return +symbol[this.propIgnorePlacement] === 1;\r\n }\r\n const v = aOverlap[index];\r\n const placement = v % 8;\r\n // aOverlap中,最后四位的含义: [allowOverlap是否动态][allowOverlap的值][ignorePlacement是否动态][ignorePlacement的值]\r\n if (v < 2) {\r\n // 不是动态的 placement,直接读取symbol上的定义\r\n return +symbol[this.propIgnorePlacement] === 1;\r\n } else {\r\n return placement % 2;\r\n }\r\n }\r\n\r\n _isAllowOverlap(symbol, mesh, index) {\r\n if (!this.isEnableCollision()) {\r\n return true;\r\n }\r\n const aOverlap = mesh.geometry.properties['aOverlap'];\r\n if (!aOverlap) {\r\n return +symbol[this.propAllowOverlap] === 1;\r\n }\r\n const v = aOverlap[index];\r\n const overlap = v >> 2;\r\n if (v < 2) {\r\n // 不是动态的 allowOverlap,直接读取symbol上的定义\r\n return +symbol[this.propAllowOverlap] === 1;\r\n } else {\r\n return overlap % 2;\r\n }\r\n }\r\n\r\n _fillCollisionIndex(boxes) {\r\n if (Array.isArray(boxes[0])) {\r\n for (let i = 0; i < boxes.length; i++) {\r\n this.insertCollisionBox(boxes[i]);\r\n }\r\n } else {\r\n this.insertCollisionBox(boxes);\r\n }\r\n }\r\n\r\n _getBoxFading(isForeground, visible, stamps, index) {\r\n //level大于0,不fading\r\n let { fadingDuration, fadeInDelay, fadeOutDelay } = this.sceneConfig;\r\n if (isNil(fadingDuration)) { fadingDuration = DEFAULT_SCENE_CONFIG.fadingDuration; }\r\n if (isNil(fadeInDelay)) { fadeInDelay = DEFAULT_SCENE_CONFIG.fadeInDelay; }\r\n if (isNil(fadeOutDelay)) { fadeOutDelay = DEFAULT_SCENE_CONFIG.fadeOutDelay; }\r\n const { frameTimestamp: timestamp } = this._cachedInstances;\r\n let boxTimestamp = stamps[index];\r\n let fadingOpacity = visible ? 1 : 0;\r\n if (!boxTimestamp) {\r\n // const zooming = this.getMap().isZooming();\r\n // if (visible && level === 0 && this._zoomFading === undefined) {\r\n if (visible && isForeground/* && !zooming*/) {\r\n //第一次显示\r\n stamps[index] = timestamp + fadeInDelay;\r\n }\r\n return 0;\r\n }\r\n\r\n const delaying = timestamp < Math.abs(boxTimestamp);\r\n\r\n if (delaying) {\r\n //如果在delay期间,又改回原有的状态,则重置时间戳以退出fading\r\n if (!visible && boxTimestamp > 0 || visible && boxTimestamp < 0) {\r\n const newStamp = timestamp - fadingDuration;\r\n stamps[index] = boxTimestamp = visible ? newStamp : -newStamp;\r\n }\r\n }\r\n\r\n const fading = timestamp - Math.abs(boxTimestamp) < fadingDuration;\r\n\r\n if (fading) {\r\n //fading过程中,不管visible是否改变,继续计算原有的fadingOpacity,消除flicker现象\r\n if (boxTimestamp > 0) {\r\n //显示fading\r\n fadingOpacity = (timestamp - boxTimestamp) / fadingDuration;\r\n } else {\r\n //消失fading\r\n fadingOpacity = 1 - (timestamp + boxTimestamp) / fadingDuration;\r\n }\r\n } else if (visible) {\r\n //显示fading开始\r\n if (boxTimestamp < 0) {\r\n //显示fading起点,记录时间戳\r\n stamps[index] = boxTimestamp = timestamp + fadeInDelay;\r\n }\r\n fadingOpacity = (timestamp - boxTimestamp) / fadingDuration;\r\n } else {\r\n //消失fading开始\r\n if (boxTimestamp > 0) {\r\n //消失fading起点,记录时间戳\r\n stamps[index] = boxTimestamp = -(timestamp + fadeOutDelay);\r\n }\r\n fadingOpacity = 1 - (timestamp + boxTimestamp) / fadingDuration;\r\n }\r\n\r\n if (fadingOpacity < 0 || fadingOpacity > 1) {\r\n fadingOpacity = clamp(fadingOpacity, 0, 1);\r\n }\r\n // if (level > 0 && this._zoomFading >= 0) {\r\n // fadingOpacity *= this._zoomFading;\r\n // }\r\n return fadingOpacity;\r\n }\r\n\r\n _getBoxTimestamps(mesh) {\r\n if (!this._boxTimestamps) {\r\n this._boxTimestamps = {};\r\n }\r\n const { meshKey } = mesh.properties;\r\n if (!this._boxTimestamps[meshKey]) {\r\n const { frameTimestamp } = this._cachedInstances;\r\n this._boxTimestamps[meshKey] = {\r\n 'timestamp': frameTimestamp\r\n };\r\n }\r\n return this._boxTimestamps[meshKey];\r\n }\r\n\r\n _refreshTimeStamps(timestamp) {\r\n if (!this._prevTimestamp) {\r\n this._prevTimestamp = timestamp;\r\n return;\r\n }\r\n const meshes = this.scene.getMeshes();\r\n if (!meshes || !meshes.length) {\r\n return;\r\n }\r\n for (let i = 0; i < meshes.length; i++) {\r\n const stamps = this._getBoxTimestamps(meshes[i]);\r\n if (stamps['timestamp'] < this._prevTimestamp) {\r\n delete meshes[i]['_fading_timestamps'];\r\n } else {\r\n stamps['timestamp'] = timestamp;\r\n }\r\n }\r\n this._prevTimestamp = timestamp;\r\n }\r\n\r\n _markFadingCollided(stamps, index) {\r\n if (!stamps) {\r\n return;\r\n }\r\n const { frameTimestamp } = this._cachedInstances;\r\n let { fadingDuration } = this.sceneConfig;\r\n if (isNil(fadingDuration)) { fadingDuration = DEFAULT_SCENE_CONFIG.fadingDuration; }\r\n stamps[index] = -(frameTimestamp - fadingDuration - 1);\r\n }\r\n\r\n\r\n deleteMesh(meshes, keepGeometry) {\r\n if (!meshes) {\r\n return;\r\n }\r\n if (Array.isArray(meshes)) {\r\n for (let i = 0; i < meshes.length; i++) {\r\n const key = meshes[i].properties.meshKey;\r\n if (this._collisionContext) delete this._collisionContext.tags[key];\r\n if (this._boxTimestamps) delete this._boxTimestamps[key];\r\n }\r\n } else {\r\n const key = meshes.properties.meshKey;\r\n if (this._collisionContext) delete this._collisionContext.tags[key];\r\n if (this._boxTimestamps) delete this._boxTimestamps[key];\r\n }\r\n super.deleteMesh(meshes, keepGeometry);\r\n }\r\n\r\n delete(context) {\r\n if (this._collisionMesh) {\r\n this._collisionMesh.geometry.dispose();\r\n this._collisionShader.dispose();\r\n this._collisionMesh.dispose();\r\n delete this._collisionMesh;\r\n delete this._collisionShader;\r\n delete this._collisionRenderer;\r\n }\r\n delete this._collisionContext;\r\n super.delete(context);\r\n }\r\n\r\n /**\r\n * 判断tile是否存在碰撞\r\n * @param {Number[]} box - box\r\n * @param {Number} meshTileZoom - mesh's tile zoom\r\n * @returns {Number} 1: 存在; 0: 不存在; -1: 在屏幕之外\r\n */\r\n isCollides(box/*, tileInfo*/) {\r\n const layer = this.layer,\r\n map = layer.getMap();\r\n const dpr = map.getDevicePixelRatio();\r\n vec4.scale(BOX, box, 1 / dpr);\r\n if (map.isOffscreen(BOX)) {\r\n return -1;\r\n }\r\n // const isBackground = layer.getRenderer().isCurrentTile(tileInfo.id);\r\n // const collisionIndex = isBackground ? layer.getBackgroundCollisionIndex() : layer.getCollisionIndex();\r\n const collisionIndex = layer.getCollisionIndex();\r\n const bufferSize = this.sceneConfig.collisionBufferSize || layer.options['collisionBufferSize'] || 0;\r\n if (bufferSize) {\r\n box = bufferBox(BOX, box, bufferSize);\r\n }\r\n return +collisionIndex.collides(box);\r\n }\r\n\r\n insertCollisionBox(box/*, tileInfo*/) {\r\n const layer = this.layer;\r\n // const isBackground = layer.getRenderer().isCurrentTile(tileInfo.id);\r\n // const collisionIndex = isBackground ? layer.getBackgroundCollisionIndex() : layer.getCollisionIndex();\r\n const collisionIndex = layer.getCollisionIndex();\r\n const bufferSize = this.sceneConfig.collisionBufferSize || layer.options['collisionBufferSize'] || 0;\r\n let out = box;\r\n if (bufferSize) {\r\n out = box._buffered = box._buffered || [];\r\n box = bufferBox(out, box, bufferSize);\r\n }\r\n collisionIndex.insertBox(out);\r\n }\r\n\r\n /**\r\n *\r\n * @param {Number[] || Number[][]} boxes - boxes to add\r\n * @param {Number} visible - 1 or 0\r\n */\r\n addCollisionDebugBox(boxes, visible) {\r\n if (!boxes || !boxes.length) {\r\n return;\r\n }\r\n if (Array.isArray(boxes[0])) {\r\n for (let i = 0; i < boxes.length; i++) {\r\n const box = boxes[i];\r\n this._addCollisionBox(box, visible);\r\n }\r\n } else {\r\n this._addCollisionBox(boxes, visible);\r\n }\r\n }\r\n\r\n _addCollisionBox(box, visible) {\r\n if (!box) {\r\n return;\r\n }\r\n const allBoxes = this._collisionBoxes = this._collisionBoxes || {\r\n aPosition: [],\r\n aVisible: [],\r\n indices: []\r\n };\r\n const bufferSize = this.sceneConfig.collisionBufferSize || this.layer.options['collisionBufferSize'] || 0;\r\n if (bufferSize) {\r\n box = bufferBox(BOX, box, bufferSize);\r\n }\r\n const map = this.getMap();\r\n const dpr = map.getDevicePixelRatio();\r\n vec4.scale(BOX, box, 1 / dpr);\r\n if (map.isOffscreen(BOX)) {\r\n return;\r\n }\r\n const count = allBoxes.aPosition.length / 2;\r\n allBoxes.aPosition.push(\r\n box[0], box[1], box[2], box[1],\r\n box[2], box[3], box[0], box[3]\r\n );\r\n allBoxes.aVisible.push(visible, visible, visible, visible);\r\n allBoxes.indices.push(\r\n count, count + 1,\r\n count + 1, count + 2,\r\n count + 2,\r\n count + 3,\r\n count + 3, count\r\n );\r\n }\r\n\r\n updateCollision(context) {\r\n super.updateCollision(context);\r\n this._startCollision();\r\n this._prepareZoomEndMeshes();\r\n if (this._zoomEndMeshes && this._zoomEndMeshes.length) {\r\n this._updateZoomMeshesLevel();\r\n if (this._zoomEndMeshes) {\r\n this.setToRedraw();\r\n this.scene.addMesh(this._zoomEndMeshes);\r\n }\r\n }\r\n //text/icon在同一个位置如果内容相同,只显示一个\r\n const map = this.getMap();\r\n if (map.isZooming() || this._zoomEndMeshes && this._zoomEndMeshes.length) {\r\n this._updateUniquePlacements();\r\n this._mergeUniquePlacements(this.scene.getMeshes());\r\n }\r\n }\r\n\r\n paint(context) {\r\n const status = super.paint(context);\r\n this._renderCollisionBox(context);\r\n if (this._canProceed === false) {\r\n this.setToRedraw();\r\n }\r\n return status;\r\n }\r\n\r\n // 2022-09-21 为了能绘制background瓦片,提升地图体验,注释掉了该方法\r\n // 验证url: http://localhost/bugs/designer-942/debug.html\r\n // 注释掉之后似乎不会出现背景瓦片导致的闪烁现象\r\n // callShader(uniforms, context) {\r\n // this.callCurrentTileShader(uniforms, context);\r\n\r\n // // if (this.shouldIgnoreBackground()) {\r\n // // //移动或旋转地图时,不绘制背景瓦片,消除背景瓦片引起的闪烁现象\r\n // // //但有zoomFading时\r\n // // return;\r\n // // }\r\n // this.callBackgroundTileShader(uniforms, context);\r\n // }\r\n\r\n shouldIgnoreBackground() {\r\n // return false;\r\n const map = this.getMap();\r\n return !map.isZooming() && !this._zoomEndMeshes;\r\n }\r\n\r\n // shouldLimitBox(isForeground, ignoreZoomOut) {\r\n // const map = this.getMap();\r\n // return !map.options['seamlessZoom'] &&\r\n // this.layer.options['boxLimitOnZoomout'] &&\r\n // (ignoreZoomOut || this._zoomingOut) &&\r\n // (map.isZooming() || this._zoomEndTimestamp !== undefined && !isForeground);\r\n // }\r\n\r\n _prepareZoomEndMeshes() {\r\n const map = this.getMap();\r\n const zooming = map.isZooming();\r\n if (!zooming && this._zooming) {\r\n //记录zoom结束的时间戳\r\n const renderer = this.layer.getRenderer();\r\n // linePlacement的mesh不放到zoomEndMeshes中\r\n this._zoomEndMeshes = this.scene.getMeshes().filter(m => !renderer.isForeground(m) && !m.properties.isLinePlacement);\r\n } else if (zooming && !this._zooming) {\r\n this._preRes = map.getResolution();\r\n }\r\n if (zooming) {\r\n if (this._clearTimeout) {\r\n clearTimeout(this._clearTimeout);\r\n delete this._zoomingOut;\r\n delete this._clearTimeout;\r\n }\r\n this._zoomingOut = this._preRes && map.getResolution() > this._preRes;\r\n } else if (this._zooming && !this._clearTimeout) {\r\n let { fadeOutDelay, fadingDuration } = this.sceneConfig;\r\n if (isNil(fadeOutDelay)) { fadeOutDelay = DEFAULT_SCENE_CONFIG.fadeOutDelay; }\r\n if (isNil(fadingDuration)) { fadingDuration = DEFAULT_SCENE_CONFIG.fadingDuration; }\r\n this._clearTimeout = setTimeout(() => {\r\n delete this._zoomingOut;\r\n delete this._clearTimeout;\r\n }, fadeOutDelay + fadingDuration + 1);\r\n }\r\n this._zooming = zooming;\r\n }\r\n\r\n _renderCollisionBox(context) {\r\n if (!this._collisionBoxes || !this.layer.options['debugCollision']) {\r\n return;\r\n }\r\n if (!this._collisionRenderer) {\r\n this._initCollisionShader();\r\n }\r\n const { aPosition, aVisible, indices } = this._collisionBoxes;\r\n if (!this._collisionMesh) {\r\n const geometry = new reshader.Geometry(\r\n {\r\n aPosition: [],\r\n aVisible: []\r\n },\r\n [],\r\n 0,\r\n {\r\n positionSize: 2,\r\n primitive: 'lines'\r\n }\r\n );\r\n this._collisionMesh = new reshader.Mesh(geometry);\r\n this._collisionScene = new reshader.Scene();\r\n this._collisionScene.addMesh(this._collisionMesh);\r\n }\r\n const geometry = this._collisionMesh.geometry;\r\n geometry.updateData('aPosition', new Float32Array(aPosition));\r\n geometry.updateData('aVisible', new Uint8Array(aVisible));\r\n geometry.setElements(indices);\r\n\r\n this._collisionRenderer.render(\r\n this._collisionShader,\r\n {\r\n size: [this.canvas.width, this.canvas.height]\r\n },\r\n this._collisionScene,\r\n this.getRenderFBO(context)\r\n );\r\n delete this._collisionBoxes;\r\n }\r\n\r\n _initCollisionShader() {\r\n const regl = this.regl;\r\n\r\n this._collisionRenderer = new reshader.Renderer(regl);\r\n\r\n const canvas = this.canvas;\r\n const viewport = {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return canvas ? canvas.width : 1;\r\n },\r\n height: () => {\r\n return canvas ? canvas.height : 1;\r\n }\r\n };\r\n this._collisionShader = new reshader.MeshShader({\r\n vert: collisionVert, frag: collisionFrag,\r\n uniforms: [\r\n 'size'\r\n ],\r\n extraCommandProps: {\r\n viewport,\r\n depth: {\r\n enable: false,\r\n },\r\n blend: {\r\n enable: true,\r\n func: {\r\n src: 'src alpha',\r\n dst: 'one minus src alpha'\r\n },\r\n equation: 'add'\r\n }\r\n }\r\n });\r\n\r\n }\r\n\r\n _updateZoomMeshesLevel() {\r\n let { fadeOutDelay, fadingDuration } = this.sceneConfig;\r\n if (isNil(fadeOutDelay)) { fadeOutDelay = DEFAULT_SCENE_CONFIG.fadeOutDelay; }\r\n if (isNil(fadingDuration)) { fadingDuration = DEFAULT_SCENE_CONFIG.fadingDuration; }\r\n const renderer = this.layer.getRenderer();\r\n const tileZoom = renderer.getCurrentTileZoom();\r\n const timestamp = renderer.getFrameTimestamp();\r\n const meshes = [];\r\n for (let i = 0; i < this._zoomEndMeshes.length; i++) {\r\n const mesh = this._zoomEndMeshes[i];\r\n const tileInfo = mesh.properties.tile;\r\n if (!mesh._fadeOutStartTime && renderer.isBackTile(tileInfo.id)) {\r\n mesh._fadeOutStartTime = timestamp;\r\n }\r\n //需要更新zoom meshes 的level,让他们改为在background阶段绘制\r\n const level = (tileInfo.z - tileZoom) > 0 ? 2 * (tileInfo.z - tileZoom) - 1 : 2 * (tileZoom - tileInfo.z);\r\n mesh.properties.level = level;\r\n if (renderer.isForeground(mesh) ||\r\n mesh._fadeOutStartTime && (timestamp - mesh._fadeOutStartTime > fadeOutDelay + fadingDuration)) {\r\n delete mesh._fadeOutStartTime;\r\n // console.log(timestamp, 'removed');\r\n continue;\r\n }\r\n meshes.push(mesh);\r\n }\r\n delete this._zoomEndMeshes;\r\n if (meshes.length) {\r\n this._zoomEndMeshes = meshes;\r\n }/* else {\r\n console.log(context.timestamp, 'zoomEndMeshes are removed');\r\n }*/\r\n }\r\n\r\n isEnableCollision() {\r\n return this.layer.options['collision'] && !!this.sceneConfig['collision'];\r\n }\r\n\r\n isEnableUniquePlacement() {\r\n return this.isEnableCollision() && this.sceneConfig['uniquePlacement'];\r\n }\r\n\r\n isMeshUniquePlaced(mesh) {\r\n return this.isMeshIterable(mesh);\r\n }\r\n\r\n _updateUniquePlacements() {\r\n if (!this.isEnableUniquePlacement()) {\r\n return;\r\n }\r\n const meshes = this.scene.getMeshes();\r\n const fn = (mesh, meshBoxes, matrix, boxIndex) => {\r\n // 目前支持 unique placement 的都是单symbol的情况。\r\n const { start, end } = meshBoxes[0];\r\n //初始化label,\r\n const geoProps = mesh.geometry.properties;\r\n const elements = geoProps.elements;\r\n let placements = geoProps.uniquePlacements;\r\n if (!placements) {\r\n placements = geoProps.uniquePlacements = [];\r\n }\r\n if (placements[boxIndex] === undefined) {\r\n const key = this.getUniqueEntryKey(mesh, elements[start], boxIndex);\r\n // console.log(key, mesh.uniforms.level);\r\n if (!key) {\r\n placements[boxIndex] = null;\r\n } else {\r\n placements[boxIndex] = {\r\n key,\r\n index: boxIndex,\r\n start: elements[start],\r\n end: elements[end - 1]\r\n };\r\n }\r\n }\r\n };\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n if (!this.isMeshUniquePlaced(mesh)) {\r\n continue;\r\n }\r\n this.forEachBox(mesh, fn);\r\n }\r\n }\r\n\r\n _mergeUniquePlacements(meshes) {\r\n if (!this.isEnableUniquePlacement()) {\r\n return;\r\n }\r\n const zoom = this.getMap().getZoom();\r\n let changed = !this._mergedMeshes || this._mergedMehesZoom !== zoom;\r\n if (!changed) {\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!this._mergedMeshes[meshes[i].properties.meshKey]) {\r\n changed = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!changed) {\r\n return;\r\n }\r\n this._mergedMehesZoom = zoom;\r\n this._replacedPlacements = {};\r\n this._mergedMeshes = {};\r\n meshes = meshes.sort(sortByLevel);\r\n const scale = this.getMap().getGLScale();\r\n const allPlacements = {};\r\n // let hubeiKey;\r\n // const keys = [];\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n if (!mesh.geometry) {\r\n //disposed\r\n continue;\r\n }\r\n const { meshKey } = mesh.properties;\r\n this._mergedMeshes[meshKey] = 1;\r\n const { uniquePlacements } = mesh.geometry.properties;\r\n if (!uniquePlacements) {\r\n continue;\r\n }\r\n for (let j = 0; j < uniquePlacements.length; j++) {\r\n if (!uniquePlacements[j]) {\r\n continue;\r\n }\r\n const { key, index/*, start*/ } = uniquePlacements[j];\r\n const stamps = this._getBoxTimestamps(mesh);\r\n\r\n const uKey = getUniqueKey(key, scale);\r\n\r\n // if (getLabelContent(mesh, start) === '慎') {\r\n // console.log('placement_key', mesh.properties.meshKey, uKey, key);\r\n // }\r\n\r\n // console.log(uKey, mesh.uniforms.level);\r\n // let debugging = false\r\n // if (getLabelContent(mesh, start) === '慎') {\r\n // // keys.push(uKey);\r\n // // if (!hubeiKey) {\r\n // // hubeiKey = uKey;\r\n // // } else if (hubeiKey !== uKey) {\r\n // // console.log('Indonesia miss', hubeiKey, uKey);\r\n // // }\r\n // debugging = true;\r\n // }\r\n const placements = allPlacements[uKey];\r\n if (!placements) {\r\n //用纯数组比对象性能更好\r\n allPlacements[uKey] = [\r\n mesh,\r\n stamps,\r\n index\r\n ];\r\n } else {\r\n const len = placements.length;\r\n const parentMesh = placements[len - 3];\r\n const parentKey = parentMesh.properties.meshKey;\r\n const parentStamps = placements[len - 2];\r\n const parentIndex = placements[len - 1];\r\n this._replacedPlacements[parentKey] = this._replacedPlacements[parentKey] || {};\r\n this._replacedPlacements[parentKey][parentIndex] = 1;\r\n // if (debugging) {\r\n // console.log('placement', `${parentStamps[parentIndex]}`, `${stamps[index]}`);\r\n // }\r\n this._updatePlacementStamps(stamps, index, parentStamps, parentIndex);\r\n placements.push(mesh, stamps, index);\r\n }\r\n }\r\n }\r\n\r\n for (const key in allPlacements) {\r\n const placements = allPlacements[key];\r\n if (placements.length <= 2 * 3) {\r\n continue;\r\n }\r\n const len = placements.length;\r\n const lastStamps = placements[len - 2];\r\n const lastIndex = placements[len - 1];\r\n const lastTimestamp = lastStamps[lastIndex];\r\n // if (lastTimestamp === undefined) {\r\n // continue;\r\n // }\r\n const firstStamps = placements[1];\r\n const firstIndex = placements[2];\r\n if (firstStamps[firstIndex] !== lastTimestamp) {\r\n for (let i = 0; i < len - 2 * 3; i += 3) {\r\n const stamps = placements[i + 1];\r\n const index = placements[i + 2];\r\n stamps[index] = lastTimestamp;\r\n }\r\n }\r\n }\r\n // console.log('end-----------');\r\n // if (keys.length >= 3) {\r\n // console.log(`湖北的keys:[${keys.join()}]`);\r\n // }\r\n }\r\n\r\n _updatePlacementStamps(stamps, index, parentStamps, parentIndex) {\r\n if (parentStamps[parentIndex] !== undefined) {\r\n if (stamps[index] === undefined) {\r\n stamps[index] = parentStamps[parentIndex];\r\n } else {\r\n let max = stamps[index];\r\n if (Math.abs(parentStamps[parentIndex]) > Math.abs(max)) {\r\n stamps[index] = parentStamps[parentIndex];\r\n } else {\r\n parentStamps[parentIndex] = stamps[index];\r\n }\r\n }\r\n } else if (stamps[index] !== undefined) {\r\n parentStamps[parentIndex] = stamps[index];\r\n }\r\n }\r\n\r\n _isReplacedPlacement(meshKey, index) {\r\n return this._replacedPlacements && this._replacedPlacements[meshKey] && this._replacedPlacements[meshKey][index];\r\n }\r\n\r\n _getCollideBoxes(mesh, start) {\r\n const { symbolIndex } = mesh.properties;\r\n const type = symbolIndex.type || 0;\r\n let allBoxes = mesh.properties['_collidesBoxes'];\r\n if (!allBoxes) {\r\n allBoxes = mesh.properties['_collidesBoxes'] = [];\r\n }\r\n let iconBoxes = allBoxes[symbolIndex.index];\r\n if (!iconBoxes) {\r\n iconBoxes = mesh.properties['_collidesBoxes'] = [];\r\n }\r\n if (!iconBoxes[type]) {\r\n iconBoxes[type] = [];\r\n }\r\n iconBoxes = iconBoxes[type];\r\n const index = start / 6;\r\n if (!iconBoxes[index]) {\r\n const boxes = [];\r\n iconBoxes[index] = {\r\n boxes,\r\n collision: { boxes }\r\n };\r\n }\r\n return iconBoxes[index];\r\n }\r\n\r\n _getMeshBoxes(count) {\r\n let meshBoxes = this._MeshBoxes;\r\n if (!meshBoxes) {\r\n meshBoxes = this._MeshBoxes = [];\r\n }\r\n if (!meshBoxes[count]) {\r\n meshBoxes[count] = [];\r\n for (let i = 0; i < count; i++) {\r\n meshBoxes[count][i] = {};\r\n }\r\n }\r\n return meshBoxes[count];\r\n }\r\n\r\n _isHalo0(mesh) {\r\n if (!mesh || !mesh.geometry) {\r\n return true;\r\n }\r\n if (!mesh.geometry.properties.glyphAtlas || !mesh.material.get('isHalo') || mesh.geometry.data.aTextHaloRadius && mesh.geometry.properties.hasHalo) {\r\n return false;\r\n }\r\n if (mesh.geometry.data.aTextHaloRadius && !mesh.geometry.properties.hasHalo) {\r\n return true;\r\n }\r\n const symbol = this.getSymbol(mesh.geometry.properties.symbolIndex);\r\n return !symbol.textHaloRadius;\r\n }\r\n}\r\n\r\nconst UNIQUE_TOLERANCE = 10;\r\nfunction getUniqueKey(key, scale) {\r\n return Math.round(key[0] / scale / UNIQUE_TOLERANCE) * Math.round(key[1] / scale / UNIQUE_TOLERANCE) *\r\n (key[2] ? Math.round(key[2] / UNIQUE_TOLERANCE) : 1) + '-' + key[3];\r\n}\r\n\r\nfunction sortByLevel(m0, m1) {\r\n const r = m1.properties['level'] - m0.properties['level'];\r\n if (r === 0) {\r\n return m0.properties.meshKey - m1.properties.meshKey;\r\n } else {\r\n return r;\r\n }\r\n}\r\n\r\nfunction bufferBox(out, box, buffer) {\r\n //minx, miny, maxx, maxy\r\n out[0] = box[0] - buffer;\r\n out[1] = box[1] - buffer;\r\n out[2] = box[2] + buffer;\r\n out[3] = box[3] + buffer;\r\n return out;\r\n\r\n}\r\n","import { vec2, vec3, vec4, mat2 } from '@maptalks/gl';\r\nimport { projectPoint } from './projection';\r\n\r\nconst V3_0 = [], V3_1 = [], V3_2 = [], V3_3 = [];\r\nconst MIN = [], MAX = [];\r\n\r\nexport function getPitchPosition(out, anchor, tl, tr, bl, br, matrix, dxdy, uniforms, map, cameraDistance, perspectiveRatio, is3DPitchText, altitudeScale) {\r\n /**\r\n * 对应的glsl代码:\r\n * gl_Position = projViewModelMatrix * vec4(aPosition + vec3(offset, 0.0) * tileRatio / zoomScale * cameraScale * perspectiveRatio, 1.0);\r\n */\r\n\r\n const { tileRatio, tileResolution } = uniforms;\r\n const zoomScale = tileResolution / map.getResolution();\r\n const cameraToCenterDistance = map.cameraToCenterDistance;\r\n const cameraScale = cameraDistance / cameraToCenterDistance;\r\n const scale = tileRatio / zoomScale * cameraScale * perspectiveRatio;\r\n\r\n vec2.scale(tl, tl, scale);\r\n vec2.scale(tr, tr, scale);\r\n vec2.scale(bl, bl, scale);\r\n vec2.scale(br, br, scale);\r\n\r\n vec3.set(V3_0, tl[0], tl[1], is3DPitchText ? tl[2] / altitudeScale : 0);\r\n vec3.set(V3_1, tr[0], tr[1], is3DPitchText ? tr[2] / altitudeScale : 0);\r\n vec3.set(V3_2, bl[0], bl[1], is3DPitchText ? bl[2] / altitudeScale : 0);\r\n vec3.set(V3_3, br[0], br[1], is3DPitchText ? br[2] / altitudeScale : 0);\r\n\r\n vec3.add(V3_0, V3_0, anchor);\r\n vec3.add(V3_1, V3_1, anchor);\r\n vec3.add(V3_2, V3_2, anchor);\r\n vec3.add(V3_3, V3_3, anchor);\r\n\r\n projectPoint(tl, V3_0, matrix, map.width, map.height);\r\n projectPoint(tr, V3_1, matrix, map.width, map.height);\r\n projectPoint(bl, V3_2, matrix, map.width, map.height);\r\n projectPoint(br, V3_3, matrix, map.width, map.height);\r\n\r\n //min\r\n vec2.set(MIN, Math.min(tl[0], tr[0], bl[0], br[0]), Math.min(tl[1], tr[1], bl[1], br[1]));\r\n //max\r\n vec2.set(MAX, Math.max(tl[0], tr[0], bl[0], br[0]), Math.max(tl[1], tr[1], bl[1], br[1]));\r\n vec4.set(out,\r\n MIN[0] + dxdy[0], MIN[1] + dxdy[1],\r\n MAX[0] + dxdy[0], MAX[1] + dxdy[1]\r\n );\r\n}\r\n\r\nexport function getPosition(out, projAnchor, tl, tr, bl, br, dxdy, perspectiveRatio) {\r\n if (perspectiveRatio !== 1) {\r\n /**\r\n * vec2 offset = shape * 2.0 / canvasSize;\r\n * //乘以distance,用来抵消透视齐次坐标\r\n gl_Position.xy += offset * perspectiveRatio * distance;\r\n */\r\n vec2.scale(tl, tl, perspectiveRatio);\r\n vec2.scale(tr, tr, perspectiveRatio);\r\n vec2.scale(bl, bl, perspectiveRatio);\r\n vec2.scale(br, br, perspectiveRatio);\r\n }\r\n\r\n //min\r\n vec2.set(MIN, Math.min(tl[0], tr[0], bl[0], br[0]), Math.min(tl[1], tr[1], bl[1], br[1]));\r\n //max\r\n vec2.set(MAX, Math.max(tl[0], tr[0], bl[0], br[0]), Math.max(tl[1], tr[1], bl[1], br[1]));\r\n vec4.set(out,\r\n projAnchor[0] + MIN[0] + dxdy[0], projAnchor[1] + MIN[1] - dxdy[1],\r\n projAnchor[0] + MAX[0] + dxdy[0], projAnchor[1] + MAX[1] - dxdy[1]\r\n );\r\n}\r\n\r\nexport function getShapeMatrix(out, rotation, mapRotation, rotateWithMap, pitchWithMap) {\r\n // const mapRotation = map.getBearing() * Math.PI / 180;\r\n rotation -= mapRotation * rotateWithMap;\r\n if (pitchWithMap === 1) {\r\n rotation += mapRotation;\r\n }\r\n\r\n const angleSin = Math.sin(rotation),\r\n angleCos = Math.cos(rotation);\r\n // the order: c0r0, c0r1, c1r0, c1r1\r\n // const shapeMatrix = mat2.set(MAT2,\r\n // angleCos, angleSin, -angleSin, angleCos);\r\n const shapeMatrix = mat2.set(out, angleCos, -angleSin, angleSin, angleCos);\r\n return shapeMatrix;\r\n}\r\n","export const DEFAULT_MARKER_WIDTH = 15;\r\nexport const DEFAULT_MARKER_HEIGHT = 15;\r\n// shaping.js shapeIcon方法中用来计算shape值的基准icon大小\r\nexport const ICON_SIZE = 2048;\r\nexport const GLYPH_SIZE = 24;\r\n\r\nexport const DEFAULT_ICON_ALPHA_TEST = 0.01;\r\n\r\n","import { vec2, vec3 } from '@maptalks/gl';\r\nimport { projectPoint } from './projection';\r\nimport { getPitchPosition, getPosition, getShapeMatrix } from './box_util';\r\nimport { getDefaultMarkerSize } from './atlas_util';\r\nimport { isNil, clamp } from '../../Util';\r\nimport { DEFAULT_MARKER_WIDTH, DEFAULT_MARKER_HEIGHT, ICON_SIZE } from '../Constant';\r\n\r\n//temparary variables\r\nconst ANCHOR = [], PROJ_ANCHOR = [];\r\nconst MAT2 = [];\r\nconst V2_0 = [], V2_1 = [], V2_2 = [], V2_3 = [];\r\nconst DXDY = [];\r\n\r\nconst AXIS_FACTOR = [1, -1];\r\nconst SIZE_SCALE = [1, 1];\r\n\r\nexport function getIconBox(out, mesh, i, matrix, map) {\r\n\r\n const uniforms = mesh.material.uniforms;\r\n const cameraToCenterDistance = map.cameraToCenterDistance;\r\n const geoProps = mesh.geometry.properties;\r\n const symbol = this.getSymbol(geoProps.symbolIndex);\r\n\r\n const positionSize = mesh.geometry.desc.positionSize;\r\n const aAnchor = geoProps.aAnchor;\r\n const anchor = vec3.set(ANCHOR, aAnchor[i * positionSize], aAnchor[i * positionSize + 1], positionSize === 2 ? 0 : aAnchor[i * positionSize + 2]);\r\n const { aTerrainAltitude } = geoProps;\r\n if (aTerrainAltitude) {\r\n const altitude = aTerrainAltitude[i * 2] * 100;\r\n if (altitude) {\r\n anchor[2] += altitude;\r\n }\r\n }\r\n let projAnchor = projectPoint(PROJ_ANCHOR, anchor, matrix, map.width, map.height);\r\n\r\n const cameraDistance = projAnchor[2];\r\n\r\n let perspectiveRatio = 1;\r\n if (uniforms['markerPerspectiveRatio']) {\r\n const distanceRatio = (1.0 - cameraToCenterDistance / cameraDistance) * uniforms['markerPerspectiveRatio'];\r\n //通过distance动态调整大小\r\n perspectiveRatio = clamp(\r\n 0.5 + 0.5 * (1.0 - distanceRatio),\r\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\r\n 4.0);\r\n }\r\n\r\n // const { aShape, aRotation, aDxDy } = geoProps;\r\n // const dxdy = vec2.set(DXDY, aDxDy[i * 2], aDxDy[i * 2 + 1]);\r\n\r\n const { aShape, aMarkerDx, aMarkerDy, aMarkerWidth, aMarkerHeight, aPitchAlign, aRotationAlign, aRotation } = geoProps;\r\n const markerDx = aMarkerDx ? aMarkerDx[i] : symbol['markerDx'];\r\n const markerDy = aMarkerDy ? aMarkerDy[i] : symbol['markerDy'];\r\n const pitchWithMap = aPitchAlign ? aPitchAlign[i] : uniforms['pitchWithMap'];\r\n const rotateWithMap = aRotationAlign ? aRotationAlign[i] : uniforms['rotateWithMap'];\r\n const dxdy = vec2.set(DXDY, markerDx || 0, -(markerDy || 0));\r\n\r\n let tl = vec2.set(V2_0, aShape[i * 2] / 10, aShape[i * 2 + 1] / 10),\r\n tr = vec2.set(V2_1, aShape[i * 2 + 2] / 10, aShape[i * 2 + 3] / 10),\r\n bl = vec2.set(V2_2, aShape[i * 2 + 4] / 10, aShape[i * 2 + 5] / 10),\r\n br = vec2.set(V2_3, aShape[i * 2 + 6] / 10, aShape[i * 2 + 7] / 10);\r\n if (uniforms['flipY'] === 0.0 && pitchWithMap === 1.0) {\r\n vec2.multiply(tl, tl, AXIS_FACTOR);\r\n vec2.multiply(tr, tr, AXIS_FACTOR);\r\n vec2.multiply(bl, bl, AXIS_FACTOR);\r\n vec2.multiply(br, br, AXIS_FACTOR);\r\n }\r\n\r\n const [ defaultMarkerWidth, defaultMarkerHeight ] = getDefaultMarkerSize(mesh.geometry);\r\n let markerWidth = (aMarkerWidth ? aMarkerWidth[i] : symbol['markerWidth']);\r\n if (isNil(markerWidth)) {\r\n markerWidth = defaultMarkerWidth || DEFAULT_MARKER_WIDTH;\r\n }\r\n let markerHeight = (aMarkerHeight ? aMarkerHeight[i] : symbol['markerHeight']);\r\n if (isNil(markerHeight)) {\r\n markerHeight = defaultMarkerHeight || DEFAULT_MARKER_HEIGHT;\r\n }\r\n const sizeScale = vec2.set(SIZE_SCALE, markerWidth / ICON_SIZE, markerHeight / ICON_SIZE);\r\n vec2.mul(tl, tl, sizeScale);\r\n vec2.mul(tr, tr, sizeScale);\r\n vec2.mul(bl, bl, sizeScale);\r\n vec2.mul(br, br, sizeScale);\r\n\r\n const rotation = -(aRotation ? aRotation[i] / 9362 : -(symbol['markerRotation'] || 0) * Math.PI / 180);\r\n\r\n //1. 获得shape的tl, tr, bl, 和br\r\n //2. 计算旋转矩阵: shapeMatrix\r\n //3. 计算最终的shape\r\n // 3.1 如果没有pitchWithMap,值是 shapeMatrix * shape\r\n // 3.2 如果pitchWithMap, 值是aAnchor和shape相加后,projectPoint后的计算结果\r\n //4. 将最终计算结果与dxdy相加\r\n const mapRotation = map.getBearing() * Math.PI / 180;\r\n if (mapRotation * rotateWithMap || rotation) {\r\n const shapeMatrix = getShapeMatrix(MAT2, rotation, mapRotation, rotateWithMap, pitchWithMap);\r\n\r\n tl = vec2.transformMat2(tl, tl, shapeMatrix);\r\n tr = vec2.transformMat2(tr, tr, shapeMatrix);\r\n bl = vec2.transformMat2(bl, bl, shapeMatrix);\r\n br = vec2.transformMat2(br, br, shapeMatrix);\r\n }\r\n\r\n if (pitchWithMap === 1) {\r\n getPitchPosition(out, anchor, tl, tr, bl, br, matrix, dxdy, uniforms, map, cameraDistance, perspectiveRatio);\r\n } else {\r\n vec2.multiply(tl, tl, AXIS_FACTOR);\r\n vec2.multiply(tr, tr, AXIS_FACTOR);\r\n vec2.multiply(bl, bl, AXIS_FACTOR);\r\n vec2.multiply(br, br, AXIS_FACTOR);\r\n getPosition(out, projAnchor, tl, tr, bl, br, dxdy, perspectiveRatio);\r\n }\r\n\r\n const dpr = this.getMap().getDevicePixelRatio();\r\n if (dpr !== 1) {\r\n out[0] *= dpr;\r\n out[1] *= dpr;\r\n out[2] *= dpr;\r\n out[3] *= dpr;\r\n }\r\n return out;\r\n}\r\n\r\n","import { vec2, vec3 } from '@maptalks/gl';\r\nimport { clamp, isIconText } from '../../Util';\r\nimport { getPitchPosition, getPosition, getShapeMatrix } from './box_util';\r\nimport { GLYPH_SIZE } from '../Constant';\r\nimport { PackUtil } from '@maptalks/vector-packer';\r\nimport { getCentiMeterScale } from '../../../../common/Util';\r\n\r\nconst TEXT_BOX_MARGIN = 1;\r\n\r\n//temparary variables\r\nconst MAT2 = [];\r\nconst V2_0 = [], V2_1 = [], V2_2 = [], V2_3 = [];\r\n\r\nconst DXDY = [];\r\n\r\nconst AXIS_FACTOR = [1, -1];\r\n\r\nexport function getLabelBox(out, anchor, projAnchor, mesh, textSize, textHaloRadius, i, matrix, map) {\r\n const uniforms = mesh.material.uniforms;\r\n const cameraToCenterDistance = map.cameraToCenterDistance;\r\n const geoProps = mesh.geometry.properties;\r\n const symbol = this.getSymbol(geoProps.symbolIndex);\r\n const isAlongLine = symbol['textPlacement'] === 'line' && !isIconText(symbol);\r\n\r\n const glyphSize = GLYPH_SIZE;\r\n\r\n const cameraDistance = projAnchor[2];\r\n\r\n let perspectiveRatio = 1;\r\n if (uniforms['textPerspectiveRatio']) {\r\n const distanceRatio = (1.0 - cameraToCenterDistance / cameraDistance) * uniforms['textPerspectiveRatio'];\r\n //通过distance动态调整大小\r\n perspectiveRatio = clamp(\r\n 0.5 + 0.5 * (1.0 - distanceRatio),\r\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\r\n 4.0);\r\n }\r\n\r\n const { aTextDx, aTextDy, aPitchAlign, aRotationAlign, aRotation } = mesh.geometry.properties;\r\n const textDx = aTextDx ? aTextDx[i] : symbol['textDx'];\r\n const textDy = aTextDy ? aTextDy[i] : symbol['textDy'];\r\n const pitchWithMap = aPitchAlign ? aPitchAlign[i] : uniforms['pitchWithMap'];\r\n const rotateWidthMap = aRotationAlign ? aRotationAlign[i] : uniforms['rotateWithMap'];\r\n const dxdy = vec2.set(DXDY, textDx || 0, -(textDy || 0));\r\n\r\n if (!isAlongLine) {\r\n const { aShape } = geoProps;\r\n let tl = vec2.set(V2_0, aShape[i * 2] / 10, -aShape[i * 2 + 1] / 10),\r\n tr = vec2.set(V2_1, aShape[i * 2 + 2] / 10, -aShape[i * 2 + 3] / 10),\r\n bl = vec2.set(V2_2, aShape[i * 2 + 4] / 10, -aShape[i * 2 + 5] / 10),\r\n br = vec2.set(V2_3, aShape[i * 2 + 6] / 10, -aShape[i * 2 + 7] / 10);\r\n\r\n if (uniforms['flipY'] === 0.0 && pitchWithMap === 1.0) {\r\n vec2.multiply(tl, tl, AXIS_FACTOR);\r\n vec2.multiply(tr, tr, AXIS_FACTOR);\r\n vec2.multiply(bl, bl, AXIS_FACTOR);\r\n vec2.multiply(br, br, AXIS_FACTOR);\r\n }\r\n\r\n const textRotation = aRotation ? aRotation[i] / 9362 : (symbol['textRotation'] || 0) * Math.PI / 180;\r\n const mapRotation = !isAlongLine ? map.getBearing() * Math.PI / 180 : 0;\r\n if (textRotation || mapRotation) {\r\n const shapeMatrix = getShapeMatrix(MAT2, textRotation, mapRotation, rotateWidthMap, pitchWithMap);\r\n tl = vec2.transformMat2(tl, tl, shapeMatrix);\r\n tr = vec2.transformMat2(tr, tr, shapeMatrix);\r\n bl = vec2.transformMat2(bl, bl, shapeMatrix);\r\n br = vec2.transformMat2(br, br, shapeMatrix);\r\n }\r\n\r\n const textScale = textSize / glyphSize;\r\n vec2.scale(tl, tl, textScale);\r\n vec2.scale(tr, tr, textScale);\r\n vec2.scale(bl, bl, textScale);\r\n vec2.scale(br, br, textScale);\r\n\r\n //1. 获得shape的tl, tr, bl, 和br\r\n //2. 计算旋转矩阵: shapeMatrix\r\n //3. 计算最终的shape\r\n // 3.1 如果没有pitchWithMap,值是 shapeMatrix * shape\r\n // 3.2 如果pitchWidthMap, 值是aAnchor和shape相加后,projectPoint后的计算结果\r\n //4. 将最终计算结果与dxdy相加\r\n\r\n\r\n if (pitchWithMap === 1) {\r\n getPitchPosition(out, anchor, tl, tr, bl, br, matrix, dxdy, uniforms, map, cameraDistance, perspectiveRatio);\r\n } else {\r\n getPosition(out, projAnchor, tl, tr, bl, br, dxdy, perspectiveRatio);\r\n }\r\n\r\n } else {\r\n //2. offset中已经包含了shape的值\r\n //3. 获得offset\r\n //4. 计算最终的offset\r\n // 4.1 如果没有pitchWithMap\r\n // 4.2 如果pitchWidthMap,和pos相加后,projectPoint后的计算结果\r\n //5. 将最终计算结果与dxdy相加\r\n\r\n const { aOffset, aShape } = geoProps;\r\n const is3DPitchText = aOffset.length !== aShape.length;\r\n let tl, tr, bl, br;\r\n //除以10是因为赋值时, aOffset有精度修正\r\n if (is3DPitchText) {\r\n tl = vec3.set(V2_0, aOffset[i * 3] / 10, aOffset[i * 3 + 1] / 10, aOffset[i * 3 + 2] / 10),\r\n tr = vec3.set(V2_1, aOffset[i * 3 + 3] / 10, aOffset[i * 3 + 4] / 10, aOffset[i * 3 + 5] / 10),\r\n bl = vec3.set(V2_2, aOffset[i * 3 + 6] / 10, aOffset[i * 3 + 7] / 10, aOffset[i * 3 + 8] / 10),\r\n br = vec3.set(V2_3, aOffset[i * 3 + 9] / 10, aOffset[i * 3 + 10] / 10, aOffset[i * 3 + 11] / 10);\r\n } else {\r\n tl = vec2.set(V2_0, aOffset[i * 2] / 10, aOffset[i * 2 + 1] / 10),\r\n tr = vec2.set(V2_1, aOffset[i * 2 + 2] / 10, aOffset[i * 2 + 3] / 10),\r\n bl = vec2.set(V2_2, aOffset[i * 2 + 4] / 10, aOffset[i * 2 + 5] / 10),\r\n br = vec2.set(V2_3, aOffset[i * 2 + 6] / 10, aOffset[i * 2 + 7] / 10);\r\n }\r\n if (pitchWithMap === 1) {\r\n const altitudeScale = getCentiMeterScale(map.getResolution(), map);\r\n getPitchPosition(out, anchor, tl, tr, bl, br, matrix, dxdy, uniforms, map, cameraDistance, perspectiveRatio, is3DPitchText, altitudeScale);\r\n } else {\r\n vec2.multiply(tl, tl, AXIS_FACTOR);\r\n vec2.multiply(tr, tr, AXIS_FACTOR);\r\n vec2.multiply(bl, bl, AXIS_FACTOR);\r\n vec2.multiply(br, br, AXIS_FACTOR);\r\n getPosition(out, projAnchor, tl, tr, bl, br, dxdy, perspectiveRatio);\r\n }\r\n }\r\n textHaloRadius = textHaloRadius || 0;\r\n out[0] -= textHaloRadius + TEXT_BOX_MARGIN;\r\n out[1] -= textHaloRadius + TEXT_BOX_MARGIN;\r\n out[2] += textHaloRadius + TEXT_BOX_MARGIN;\r\n out[3] += textHaloRadius + TEXT_BOX_MARGIN;\r\n\r\n const dpr = this.getMap().getDevicePixelRatio();\r\n if (dpr !== 1) {\r\n out[0] *= dpr;\r\n out[1] *= dpr;\r\n out[2] *= dpr;\r\n out[3] *= dpr;\r\n }\r\n return out;\r\n}\r\n\r\nexport function getAnchor(out, mesh, i) {\r\n const positionSize = mesh.geometry.desc.positionSize;\r\n const { aAnchor, aAltitude, aTerrainAltitude } = mesh.geometry.properties;\r\n const idx = i * positionSize;\r\n if (aAltitude) {\r\n vec3.set(out, aAnchor[idx], aAnchor[idx + 1], aAltitude[i]);\r\n } else {\r\n if (positionSize === 3) {\r\n PackUtil.unpackPosition(out, aAnchor[idx], aAnchor[idx + 1], aAnchor[idx + 2]);\r\n } else {\r\n vec3.set(out, aAnchor[idx], aAnchor[idx + 1], 0);\r\n }\r\n }\r\n\r\n if (aTerrainAltitude) {\r\n const altitude = aTerrainAltitude[i * 2] * 100;\r\n if (altitude) {\r\n out[2] += altitude;\r\n }\r\n }\r\n return out;\r\n}\r\n","import { mat4, vec4, reshader } from '@maptalks/gl';\r\nimport { setUniformFromSymbol, createColorSetter, wrap, toUint8ColorInGlobalVar, isIconText } from '../../Util';\r\nimport { DEFAULT_ICON_ALPHA_TEST } from '../Constant';\r\nimport { prepareFnTypeData, PREFIX } from './fn_type_util';\r\nimport { isFunctionDefinition, interpolated, piecewiseConstant } from '@maptalks/function-type';\r\nimport { Color } from '@maptalks/vector-packer';\r\nimport { getAnchor, getLabelBox } from './get_label_box';\r\nimport { projectPoint } from './projection';\r\nimport { getLabelContent } from './get_label_content';\r\nimport { createAtlasTexture } from './atlas_util';\r\nimport { INVALID_PROJECTED_ANCHOR } from '../../../../common/Constant';\r\n\r\nconst GAMMA_SCALE = 1;\r\nconst BOX_ELEMENT_COUNT = 6;\r\n\r\nconst DEFAULT_UNIFORMS = {\r\n 'textFill': [0, 0, 0, 1],\r\n 'textOpacity': 1,\r\n 'textPitchAlignment': 0,\r\n 'textRotationAlignment': 0,\r\n 'textHaloRadius': 0,\r\n 'textHaloFill': [1, 1, 1, 1],\r\n 'textHaloBlur': 0,\r\n 'textHaloOpacity': 1,\r\n 'textPerspectiveRatio': 0,\r\n 'textSize': 14,\r\n 'textDx': 0,\r\n 'textDy': 0,\r\n 'textRotation': 0\r\n};\r\n\r\nexport { DEFAULT_UNIFORMS, GAMMA_SCALE };\r\n\r\n// enableCollision 决定是否生成collision数据结构\r\n// visibleCollision决定当前mesh是否显示,例如 layer.options.collision = false 但sceneConfig.collision = false 时,则生成collision数据结构但mesh设为可见\r\nexport function createTextMesh(regl, geometry, transform, symbolDef, symbol, fnTypeConfig, enableCollision, visibleInCollision, enableUniquePlacement) {\r\n const meshes = [];\r\n\r\n if (geometry.isDisposed() || geometry.data.aPosition.length === 0) {\r\n return meshes;\r\n }\r\n const glyphAtlas = geometry.properties.glyphAtlas;\r\n if (!glyphAtlas) {\r\n return meshes;\r\n }\r\n\r\n if (symbolDef['textSize'] === 0 || symbolDef['textOpacity'] === 0) {\r\n return meshes;\r\n }\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n\r\n\r\n //避免重复创建属性数据\r\n if (!geometry.properties.aCount) {\r\n prepareGeometry.call(this, geometry, enableCollision || enableUniquePlacement, visibleInCollision);\r\n const { aTextSize, aTextDx, aTextDy, aPitchAlign, aRotationAlign, aRotation, aOverlap, aAltitude } = geometry.data;\r\n if (aTextSize) {\r\n //for collision\r\n const keyName = (PREFIX + 'aTextSize').trim();\r\n geometry.properties.aTextSize = geometry.properties[keyName] || new aTextSize.constructor(aTextSize);\r\n }\r\n if (aTextDx) {\r\n //for collision\r\n const keyName = (PREFIX + 'aTextDx').trim();\r\n geometry.properties.aTextDx = geometry.properties[keyName] || new aTextDx.constructor(aTextDx);\r\n }\r\n if (aTextDy) {\r\n //for collision\r\n const keyName = (PREFIX + 'aTextDy').trim();\r\n geometry.properties.aTextDy = geometry.properties[keyName] || new aTextDy.constructor(aTextDy);\r\n }\r\n if (aPitchAlign) {\r\n //for collision\r\n const keyName = (PREFIX + 'aPitchAlign').trim();\r\n geometry.properties.aPitchAlign = geometry.properties[keyName] || new aPitchAlign.constructor(aPitchAlign);\r\n }\r\n if (aRotationAlign) {\r\n //for collision\r\n const keyName = (PREFIX + 'aRotationAlign').trim();\r\n geometry.properties.aRotationAlign = geometry.properties[keyName] || new aRotationAlign.constructor(aRotationAlign);\r\n }\r\n if (aRotation) {\r\n //for collision\r\n const keyName = (PREFIX + 'aRotation').trim();\r\n geometry.properties.aRotation = geometry.properties[keyName] || new aRotation.constructor(aRotation);\r\n }\r\n if (aOverlap) {\r\n //for collision\r\n const keyName = (PREFIX + 'aOverlap').trim();\r\n geometry.properties.aOverlap = geometry.properties[keyName] || new aOverlap.constructor(aOverlap);\r\n }\r\n if (aAltitude) {\r\n const keyName = (PREFIX + 'aAltitude').trim();\r\n geometry.properties.aAltitude = geometry.properties[keyName] || new aAltitude.constructor(aAltitude);\r\n }\r\n }\r\n\r\n const glyphTexture = createAtlasTexture(regl, glyphAtlas, false);\r\n const uniforms = {\r\n flipY: 0,\r\n tileResolution: geometry.properties.tileResolution,\r\n tileRatio: geometry.properties.tileRatio,\r\n texture: glyphTexture,\r\n texSize: [glyphAtlas.width, glyphAtlas.height]\r\n };\r\n setMeshUniforms(geometry, uniforms, symbol);\r\n\r\n let transparent = false;\r\n if (symbol['textOpacity'] < 1) {\r\n transparent = true;\r\n }\r\n\r\n geometry.properties.memorySize = geometry.getMemorySize();\r\n geometry.generateBuffers(regl, { excludeElementsInVAO: true });\r\n const material = new reshader.Material(uniforms, DEFAULT_UNIFORMS);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n // 必须关闭VAO,否则对vao中elements的更新会导致halo绘制出错\r\n disableVAO: true,\r\n transparent,\r\n castShadow: false,\r\n picking: true\r\n });\r\n mesh.setLocalTransform(transform);\r\n mesh.setUniform('alphaTest', DEFAULT_ICON_ALPHA_TEST);\r\n //设置ignoreCollision,此mesh略掉collision检测\r\n //halo mesh会进行collision检测,并统一更新elements\r\n if (uniforms['isHalo']) {\r\n mesh.properties.isHalo = true;\r\n }\r\n if (enableCollision) {\r\n mesh.setDefines({\r\n 'ENABLE_COLLISION': 1\r\n });\r\n }\r\n meshes.push(mesh);\r\n\r\n if (uniforms['isHalo']) {\r\n const uniforms1 = {\r\n flipY: 0,\r\n tileResolution: geometry.properties.tileResolution,\r\n tileRatio: geometry.properties.tileRatio,\r\n texture: glyphTexture,\r\n texSize: [glyphAtlas.width, glyphAtlas.height],\r\n isHalo: 0\r\n };\r\n setMeshUniforms(geometry, uniforms1, symbol);\r\n const material = new reshader.Material(uniforms1, DEFAULT_UNIFORMS);\r\n const textMesh = new reshader.Mesh(geometry, material, {\r\n // 必须关闭VAO,否则对vao中elements的更新会导致halo绘制出错\r\n disableVAO: true,\r\n transparent,\r\n castShadow: false,\r\n picking: true\r\n });\r\n textMesh.setUniform('alphaTest', DEFAULT_ICON_ALPHA_TEST);\r\n textMesh.properties.haloMesh = mesh;\r\n // isLabelCollides 中,计算碰撞盒时需要\r\n Object.defineProperty(textMesh.properties, 'textSize', {\r\n enumerable: true,\r\n get: function () {\r\n return uniforms1['textSize'];\r\n }\r\n });\r\n if (enableCollision) {\r\n textMesh.setDefines({\r\n 'ENABLE_COLLISION': 1\r\n });\r\n }\r\n textMesh.setLocalTransform(transform);\r\n meshes.push(textMesh);\r\n }\r\n\r\n meshes.forEach(mesh => {\r\n const defines = mesh.defines || {};\r\n if (geometry.data.aTextFill) {\r\n defines['HAS_TEXT_FILL'] = 1;\r\n }\r\n if (geometry.data.aTextSize) {\r\n defines['HAS_TEXT_SIZE'] = 1;\r\n }\r\n if (geometry.data.aColorOpacity) {\r\n defines['HAS_OPACITY'] = 1;\r\n }\r\n if (geometry.data.aTextHaloFill && mesh.material.uniforms.isHalo) {\r\n defines['HAS_TEXT_HALO_FILL'] = 1;\r\n }\r\n if (geometry.data.aTextHaloRadius && mesh.material.uniforms.isHalo) {\r\n defines['HAS_TEXT_HALO_RADIUS'] = 1;\r\n }\r\n if (geometry.data.aTextHaloOpacity && mesh.material.uniforms.isHalo) {\r\n defines['HAS_TEXT_HALO_OPACITY'] = 1;\r\n }\r\n if (geometry.data.aTextDx) {\r\n defines['HAS_TEXT_DX'] = 1;\r\n }\r\n if (geometry.data.aTextDy) {\r\n defines['HAS_TEXT_DY'] = 1;\r\n }\r\n if (geometry.data.aPitchAlign) {\r\n defines['HAS_PITCH_ALIGN'] = 1;\r\n }\r\n if (geometry.data.aRotationAlign) {\r\n defines['HAS_ROTATION_ALIGN'] = 1;\r\n }\r\n if (geometry.data.aRotation) {\r\n defines['HAS_ROTATION'] = 1;\r\n }\r\n if (geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n if (geometry.properties.aOffset && geometry.properties.aShape && geometry.properties.aOffset.length !== geometry.properties.aShape.length) {\r\n defines['HAS_OFFSET_Z'] = 1;\r\n }\r\n mesh.setDefines(defines);\r\n mesh.properties.symbolIndex = geometry.properties.symbolIndex;\r\n });\r\n\r\n return meshes;\r\n}\r\n\r\nfunction prepareGeometry(geometry, enableCollision, visibleInCollision) {\r\n const symbol = this.getSymbol(geometry.properties.symbolIndex);\r\n const isLinePlacement = geometry.properties.textPlacement === 'line' && !isIconText(symbol);\r\n const { aPosition, aShape } = geometry.data;\r\n const vertexCount = aPosition.length / geometry.desc.positionSize;\r\n geometry.properties.aPickingId = geometry.data.aPickingId;\r\n geometry.properties.aCount = geometry.data.aCount;\r\n delete geometry.data.aCount;\r\n\r\n if ((enableCollision || isLinePlacement)) {\r\n geometry.properties.aAnchor = aPosition;\r\n geometry.properties.aShape = aShape;\r\n }\r\n if (!geometry.properties.visElemts) {\r\n geometry.properties.elements = geometry.elements;\r\n geometry.properties.visElemts = new geometry.elements.constructor(geometry.elements.length);\r\n }\r\n\r\n if (isLinePlacement) {\r\n const { aVertical, aSegment, aGlyphOffset, aPitchRotation } = geometry.data;\r\n const is3DPitchText = !!aPitchRotation;\r\n geometry.properties.aGlyphOffset = aGlyphOffset;\r\n geometry.properties.aPitchRotation = aPitchRotation;\r\n geometry.properties.aSegment = aSegment;\r\n geometry.properties.aVertical = aVertical;\r\n\r\n delete geometry.data.aSegment;\r\n delete geometry.data.aVertical;\r\n delete geometry.data.aGlyphOffset;\r\n delete geometry.data.aPitchRotation;\r\n\r\n const offsetLength = aShape.length / 2 * (is3DPitchText ? 3 : 2);\r\n geometry.data.aOffset = {\r\n usage: 'dynamic',\r\n data: new Int16Array(offsetLength)\r\n };\r\n geometry.properties.aOffset = new Int16Array(offsetLength);\r\n }\r\n\r\n if (enableCollision) {\r\n geometry.data.aOpacity = {\r\n usage: 'dynamic',\r\n data: new Uint8Array(vertexCount)\r\n };\r\n geometry.properties.aOpacity = new Uint8Array(vertexCount);\r\n if (visibleInCollision) {\r\n geometry.properties.aOpacity.fill(255, 0);\r\n geometry.data.aOpacity.data.fill(255, 0);\r\n }\r\n\r\n const { aTextHaloRadius } = geometry.data;\r\n if (aTextHaloRadius && !geometry.properties.aTextHaloRadius) {\r\n const keyName = (PREFIX + 'aTextHaloRadius').trim();\r\n geometry.properties.aTextHaloRadius = geometry.properties[keyName] || new aTextHaloRadius.constructor(aTextHaloRadius);\r\n }\r\n }\r\n}\r\n\r\nfunction setMeshUniforms(geometry, uniforms, symbol) {\r\n // if (uniforms['isHalo'] === undefined) {\r\n // setUniformFromSymbol(uniforms, 'isHalo', symbol, 'textHaloRadius', 0, () => {\r\n // return +(!geometry.data['aTextHaloRadius'] || geometry.data['aTextHaloRadius'] && geometry.properties.hasHalo);\r\n // });\r\n // }\r\n // 为了解决 fuzhenn/maptalks-designer#467,需要永远创建一个halo mesh\r\n if (uniforms['isHalo'] === undefined) {\r\n uniforms['isHalo'] = 1;\r\n }\r\n setUniformFromSymbol(uniforms, 'textOpacity', symbol, 'textOpacity', DEFAULT_UNIFORMS['textOpacity']);\r\n setUniformFromSymbol(uniforms, 'textFill', symbol, 'textFill', DEFAULT_UNIFORMS['textFill'], createColorSetter());\r\n setUniformFromSymbol(uniforms, 'textHaloFill', symbol, 'textHaloFill', DEFAULT_UNIFORMS['textHaloFill'], createColorSetter());\r\n setUniformFromSymbol(uniforms, 'textHaloBlur', symbol, 'textHaloBlur', DEFAULT_UNIFORMS['textHaloBlur']);\r\n setUniformFromSymbol(uniforms, 'textHaloRadius', symbol, 'textHaloRadius', DEFAULT_UNIFORMS['textHaloRadius']);\r\n setUniformFromSymbol(uniforms, 'textHaloOpacity', symbol, 'textHaloOpacity', DEFAULT_UNIFORMS['textHaloOpacity']);\r\n setUniformFromSymbol(uniforms, 'textPerspectiveRatio', symbol, 'textPerspectiveRatio', DEFAULT_UNIFORMS['textPerspectiveRatio'], v => {\r\n return geometry.properties.textPlacement === 'line' ? 1 : v;\r\n });\r\n setUniformFromSymbol(uniforms, 'rotateWithMap', symbol, 'textRotationAlignment', DEFAULT_UNIFORMS['textRotationAlignment'], v => +(v === 'map'));\r\n setUniformFromSymbol(uniforms, 'pitchWithMap', symbol, 'textPitchAlignment', DEFAULT_UNIFORMS['textPitchAlignment'], v => +(v === 'map'));\r\n setUniformFromSymbol(uniforms, 'textSize', symbol, 'textSize', DEFAULT_UNIFORMS['textSize']);\r\n setUniformFromSymbol(uniforms, 'textDx', symbol, 'textDx', DEFAULT_UNIFORMS['textDx']);\r\n setUniformFromSymbol(uniforms, 'textDy', symbol, 'textDy', DEFAULT_UNIFORMS['textDy']);\r\n setUniformFromSymbol(uniforms, 'textRotation', symbol, 'textRotation', DEFAULT_UNIFORMS['textRotation'], v => v * Math.PI / 180);\r\n}\r\n\r\nexport function createTextShader(canvas, sceneConfig) {\r\n const viewport = {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return canvas ? canvas.width : 1;\r\n },\r\n height: () => {\r\n return canvas ? canvas.height : 1;\r\n }\r\n };\r\n\r\n const projViewModelMatrix = [];\r\n const uniforms = [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n return mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n }\r\n },\r\n {\r\n name: 'zoomScale',\r\n type: 'function',\r\n fn: function (context, props) {\r\n return props['tileResolution'] / props['resolution'];\r\n }\r\n }\r\n ];\r\n\r\n const extraCommandProps = {\r\n viewport,\r\n stencil: { //fix #94, intel显卡的崩溃和blending关系比较大,开启stencil来避免blending\r\n enable: true,\r\n mask: 0xFF,\r\n func: {\r\n //halo的stencil ref更大,允许文字填充在halo上绘制\r\n cmp: '<=', //renderer.isEnableWorkAround('win-intel-gpu-crash') ? '<' : '<=',\r\n ref: (context, props) => {\r\n return props.stencilRef;\r\n },\r\n mask: 0xFF\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n },\r\n // opBack: {\r\n // fail: 'keep',\r\n // zfail: 'keep',\r\n // zpass: 'replace'\r\n // }\r\n },\r\n blend: {\r\n enable: true,\r\n func: {\r\n // src: 'src alpha',\r\n // dst: 'one minus src alpha'\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: sceneConfig.depthRange || [0, 1],\r\n func: sceneConfig.depthFunc || 'always',\r\n mask: false\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n };\r\n return {\r\n uniforms,\r\n extraCommandProps\r\n };\r\n}\r\n\r\nexport function getTextFnTypeConfig(map, symbolDef) {\r\n const textFillFn = interpolated(symbolDef['textFill']);\r\n const textSizeFn = interpolated(symbolDef['textSize']);\r\n const textHaloFillFn = interpolated(symbolDef['textHaloFill']);\r\n const textHaloRadiusFn = interpolated(symbolDef['textHaloRadius']);\r\n const textHaloOpacityFn = interpolated(symbolDef['textHaloOpacity']);\r\n const textDxFn = interpolated(symbolDef['textDx']);\r\n const textDyFn = interpolated(symbolDef['textDy']);\r\n const textOpacityFn = interpolated(symbolDef['textOpacity']);\r\n const textPitchAlignmentFn = piecewiseConstant(symbolDef['textPitchAlignment']);\r\n const textRotationAlignmentFn = piecewiseConstant(symbolDef['textRotationAlignment']);\r\n const textRotationFn = interpolated(symbolDef['textRotation']);\r\n const textAllowOverlapFn = piecewiseConstant(symbolDef['textAllowOverlapFn']);\r\n const textIgnorePlacementFn = piecewiseConstant(symbolDef['textIgnorePlacement']);\r\n const colorCache = {};\r\n const u8 = new Int16Array(1);\r\n const u16 = new Uint16Array(1);\r\n return [\r\n {\r\n //geometry.data 中的属性数据\r\n attrName: 'aTextFill',\r\n //symbol中的function-type属性\r\n symbolName: 'textFill',\r\n define: 'HAS_TEXT_FILL',\r\n type: Uint8Array,\r\n width: 4,\r\n //\r\n evaluate: (properties, geometry) => {\r\n let color = textFillFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(color)) {\r\n color = this.evaluateInFnTypeConfig(color, geometry, map, properties, true);\r\n }\r\n if (!Array.isArray(color)) {\r\n color = colorCache[color] = colorCache[color] || Color(color).unitArray();\r\n }\r\n color = toUint8ColorInGlobalVar(color);\r\n return color;\r\n }\r\n },\r\n {\r\n attrName: 'aTextSize',\r\n symbolName: 'textSize',\r\n define: 'HAS_TEXT_SIZE',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: (properties, geometry) => {\r\n let size = textSizeFn(map.getZoom(), properties) || DEFAULT_UNIFORMS['textSize'];\r\n if (isFunctionDefinition(size)) {\r\n size = this.evaluateInFnTypeConfig(size, geometry, map, properties);\r\n }\r\n u8[0] = size;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n //geometry.data 中的属性数据\r\n attrName: 'aTextHaloFill',\r\n //symbol中的function-type属性\r\n symbolName: 'textHaloFill',\r\n define: 'HAS_TEXT_HALO_FILL',\r\n type: Uint8Array,\r\n width: 4,\r\n //\r\n evaluate: properties => {\r\n let color = textHaloFillFn(map.getZoom(), properties);\r\n if (!Array.isArray(color)) {\r\n color = colorCache[color] = colorCache[color] || Color(color).unitArray();\r\n }\r\n color = toUint8ColorInGlobalVar(color);\r\n return color;\r\n }\r\n },\r\n {\r\n attrName: 'aTextHaloRadius',\r\n symbolName: 'textHaloRadius',\r\n define: 'HAS_TEXT_HALO_RADIUS',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: properties => {\r\n const radius = textHaloRadiusFn(map.getZoom(), properties);\r\n u8[0] = radius;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aTextHaloOpacity',\r\n symbolName: 'textHaloOpacity',\r\n define: 'HAS_TEXT_HALO_OPACITY',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: properties => {\r\n const radius = textHaloOpacityFn(map.getZoom(), properties);\r\n u8[0] = radius;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aTextDx',\r\n symbolName: 'textDx',\r\n define: 'HAS_TEXT_DX',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: (properties, geometry) => {\r\n let x = textDxFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(x)) {\r\n x = this.evaluateInFnTypeConfig(x, geometry, map, properties);\r\n }\r\n u8[0] = x;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aTextDy',\r\n symbolName: 'textDy',\r\n define: 'HAS_TEXT_DY',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: (properties, geometry) => {\r\n let y = textDyFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(y)) {\r\n y = this.evaluateInFnTypeConfig(y, geometry, map, properties);\r\n }\r\n u8[0] = y;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aColorOpacity',\r\n symbolName: 'textOpacity',\r\n define: 'HAS_OPACITY',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: (properties, geometry) => {\r\n let opacity = textOpacityFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(opacity)) {\r\n opacity = this.evaluateInFnTypeConfig(opacity, geometry, map, properties);\r\n }\r\n u8[0] = opacity * 255;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aPitchAlign',\r\n symbolName: 'textPitchAlignment',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_PITCH_ALIGN',\r\n evaluate: properties => {\r\n const y = +(textPitchAlignmentFn(map.getZoom(), properties) === 'map');\r\n return y;\r\n }\r\n },\r\n {\r\n attrName: 'aRotationAlign',\r\n symbolName: 'textRotationAlignment',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_ROTATION_ALIGN',\r\n evaluate: properties => {\r\n const y = +(textRotationAlignmentFn(map.getZoom(), properties) === 'map');\r\n return y;\r\n }\r\n },\r\n {\r\n attrName: 'aRotation',\r\n symbolName: 'textRotation',\r\n type: Uint16Array,\r\n width: 1,\r\n define: 'HAS_ROTATION',\r\n evaluate: properties => {\r\n const y = wrap(textRotationFn(map.getZoom(), properties), 0, 360) * Math.PI / 180;\r\n u16[0] = y * 9362;\r\n return u16[0];\r\n }\r\n },\r\n {\r\n attrName: 'aOverlap',\r\n symbolName: 'textAllowOverlap',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: properties => {\r\n let overlap = textAllowOverlapFn(map.getZoom(), properties) || 0;\r\n let placement = (textIgnorePlacementFn ? textIgnorePlacementFn(map.getZoom(), properties) : symbolDef['textIgnorePlacement']) || 0;\r\n overlap = 1 << 3 + overlap * (1 << 2);\r\n placement = (textIgnorePlacementFn ? 1 << 1 : 0) + placement;\r\n return overlap + placement;\r\n }\r\n },\r\n // 因为 textAllowOverlap 和 textIgnorePlacement 共用一个 aOverlap\r\n // 如果 textAllowOverlap 和 textIgnorePlacement 同时定义,会重复计算一次。\r\n // 这里稍微牺牲一些性能,保持程序逻辑的简洁\r\n {\r\n attrName: 'aOverlap',\r\n symbolName: 'textIgnorePlacement',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: properties => {\r\n let overlap = (textAllowOverlapFn ? textAllowOverlapFn(map.getZoom(), properties) : symbolDef['textAllowOverlap']) || 0;\r\n let placement = textIgnorePlacementFn(map.getZoom(), properties) || 0;\r\n overlap = (textAllowOverlapFn ? 1 << 3 : 0) + overlap * (1 << 2);\r\n placement = 1 << 1 + placement;\r\n return overlap + placement;\r\n }\r\n }\r\n ];\r\n}\r\n\r\nconst BOX0 = [], BOX1 = [];\r\nconst ANCHOR = [], PROJ_ANCHOR = [];\r\n\r\nexport function isLabelCollides(hasCollides, mesh, elements, boxCount, start, end, matrix/*, boxIndex*/) {\r\n hasCollides = hasCollides === 1 ? 1 : 0;\r\n const map = this.getMap();\r\n const geoProps = mesh.geometry.properties;\r\n const symbol = this.getSymbol(geoProps.symbolIndex);\r\n const isLinePlacement = geoProps.textPlacement === 'line' && !isIconText(symbol);\r\n const { aTextSize, aTextHaloRadius, aShape } = geoProps;\r\n let textSize = (aTextSize ? aTextSize[elements[start]] : mesh.properties.textSize);\r\n if (textSize === null || textSize === undefined) {\r\n textSize = DEFAULT_UNIFORMS['textSize'];\r\n }\r\n const haloRadius = aTextHaloRadius ? aTextHaloRadius[elements[start]] : mesh.properties.textHaloRadius;\r\n\r\n const anchor = getAnchor(ANCHOR, mesh, elements[start]);\r\n const { aProjectedAnchor } = mesh.geometry.properties;\r\n let projAnchor = PROJ_ANCHOR;\r\n const anchorIndex = elements[start] * 3;\r\n if (aProjectedAnchor && aProjectedAnchor[anchorIndex] !== INVALID_PROJECTED_ANCHOR) {\r\n PROJ_ANCHOR[0] = aProjectedAnchor[anchorIndex];\r\n PROJ_ANCHOR[1] = aProjectedAnchor[anchorIndex + 1];\r\n PROJ_ANCHOR[2] = aProjectedAnchor[anchorIndex + 2];\r\n } else {\r\n projAnchor = projectPoint(PROJ_ANCHOR, anchor, matrix, map.width, map.height);\r\n }\r\n\r\n\r\n const charCount = boxCount;\r\n // const boxes = [];\r\n const { boxes, collision } = this._getCollideBoxes(mesh, start);\r\n let boxIndex = 0;\r\n //1, 获取每个label的collision boxes\r\n //2, 将每个box在collision index中测试\r\n // 2.1 如果不冲突,则显示label\r\n // 2.2 如果冲突,则隐藏label\r\n if (!isLinePlacement && mesh.material.uniforms['rotateWithMap'] !== 1 && !symbol['textRotation']) {\r\n // 既没有沿线绘制,也没有随地图旋转时,文字本身也没有旋转时,只需为每行文字生成一个box即可\r\n // 遍历文字的aShape.y,发生变化时,说明新行开始,用第一个字的tl和最后一个字的br生成box\r\n let firstChrIdx = elements[start];\r\n let currentShapeY = aShape[firstChrIdx * 2 + 1];\r\n for (let i = start; i < end; i += 6) {\r\n const chrIdx = elements[i];\r\n const shapeY = aShape[chrIdx * 2 + 1];\r\n if (currentShapeY !== shapeY || i === end - 6) {\r\n const lastChrIdx = elements[(i === end - 6 ? i : i - 6)];\r\n const tlBox = getLabelBox.call(this, BOX0, anchor, projAnchor, mesh, textSize, haloRadius, firstChrIdx, matrix, map),\r\n brBox = getLabelBox.call(this, BOX1, anchor, projAnchor, mesh, textSize, haloRadius, lastChrIdx, matrix, map);\r\n const box = boxes[boxIndex] = boxes[boxIndex] || [];\r\n boxIndex++;\r\n box[0] = Math.min(tlBox[0], brBox[0]);\r\n box[1] = Math.min(tlBox[1], brBox[1]);\r\n box[2] = Math.max(tlBox[2], brBox[2]);\r\n box[3] = Math.max(tlBox[3], brBox[3]);\r\n firstChrIdx = elements[i];\r\n currentShapeY = shapeY;\r\n if (!hasCollides && this.isCollides(box)) {\r\n hasCollides = 1;\r\n }\r\n }\r\n }\r\n } else {\r\n let offscreenCount = 0;\r\n //insert every character's box into collision index\r\n for (let j = start; j < start + charCount * BOX_ELEMENT_COUNT; j += BOX_ELEMENT_COUNT) {\r\n //use int16array to save some memory\r\n const boxArr = boxes[boxIndex] = boxes[boxIndex] || [];\r\n boxIndex++;\r\n const box = getLabelBox.call(this, boxArr, anchor, projAnchor, mesh, textSize, haloRadius, elements[j], matrix, map);\r\n if (!hasCollides) {\r\n const collides = this.isCollides(box);\r\n if (collides === 1) {\r\n hasCollides = 1;\r\n } else if (collides === -1) {\r\n //offscreen\r\n offscreenCount++;\r\n }\r\n }\r\n }\r\n if (offscreenCount === charCount) {\r\n //所有的文字都offscreen时,可认为存在碰撞\r\n hasCollides = -1;\r\n }\r\n }\r\n collision.collides = hasCollides;\r\n return collision;\r\n}\r\n\r\nexport function getLabelEntryKey(mesh, idx) {\r\n const label = getLabelContent(mesh, idx);\r\n if (!label) {\r\n return null;\r\n }\r\n return getEntryKey(mesh, idx, label);\r\n}\r\n\r\n\r\nconst ENTRY_ANCHOR = [];\r\nconst ENTRY_WORLD_POS = [];\r\nfunction getEntryKey(mesh, idx, label) {\r\n if (!label) {\r\n return null;\r\n }\r\n const matrix = mesh.localTransform;\r\n const anchor = getAnchor(ENTRY_ANCHOR, mesh, idx);\r\n vec4.set(ENTRY_WORLD_POS, anchor[0], anchor[1], anchor[2], 1);\r\n const point = vec4.transformMat4(ENTRY_WORLD_POS, ENTRY_WORLD_POS, matrix);\r\n //误差容许有5个像素\r\n // const point = vec4.scale(ENTRY_WORLD_POS, ENTRY_WORLD_POS);\r\n // const posKey = Math.floor(point[0]) * Math.floor(point[1]) + (point[2] ? ('-' + Math.floor(point[2])) : '');\r\n let codeSum = 0;\r\n for (const codePoint of label) {\r\n codeSum += codePoint.codePointAt(0);\r\n }\r\n // if (getLabelContent(mesh, idx) === '湖北') {\r\n // console.log('湖北', Math.floor(point[0]), Math.floor(point[1]), Math.floor(point[2]), codeSum);\r\n // }\r\n return [Math.floor(point[0]), Math.floor(point[1]), Math.floor(point[2]), codeSum];\r\n}\r\n","export function getLabelContent(mesh, idx) {\r\n const { aPickingId, features } = mesh.geometry.properties;\r\n const pickingId = aPickingId[idx];\r\n const feature = features && features[pickingId] && features[pickingId].feature;\r\n return feature && feature.label;\r\n}\r\n","import { reshader } from '@maptalks/gl';\r\nimport { interpolated, piecewiseConstant, isFunctionDefinition } from '@maptalks/function-type';\r\nimport { setUniformFromSymbol, wrap, fillArray } from '../../Util';\r\nimport { DEFAULT_MARKER_WIDTH, DEFAULT_MARKER_HEIGHT, GLYPH_SIZE, DEFAULT_ICON_ALPHA_TEST } from '../Constant';\r\nimport { createAtlasTexture, getDefaultMarkerSize } from './atlas_util';\r\nimport { prepareFnTypeData, PREFIX } from './fn_type_util';\r\n// import { getIconBox } from './get_icon_box';\r\n\r\nexport const BOX_ELEMENT_COUNT = 6;\r\nexport const BOX_VERTEX_COUNT = 4; //每个box有四个顶点数据\r\nconst U8 = new Uint16Array(1);\r\nconst I8 = new Int8Array(1);\r\n\r\nexport function createMarkerMesh(regl, geometry, transform, symbolDef, symbol, fnTypeConfig, enableCollision, visibleInCollision) {\r\n if (geometry.isDisposed() || geometry.data.aPosition.length === 0) {\r\n return null;\r\n }\r\n const iconAtlas = geometry.properties.iconAtlas;\r\n if (!iconAtlas && !geometry.properties.isEmpty) {\r\n return null;\r\n }\r\n // const symbol = this.getSymbol();\r\n // geometry.properties.symbol = symbol;\r\n const uniforms = {\r\n flipY: 0,\r\n tileResolution: geometry.properties.tileResolution,\r\n tileRatio: geometry.properties.tileRatio\r\n };\r\n\r\n //!geometry.properties.aShape 以避免重复创建collision数据\r\n if (!geometry.properties.aShape) {\r\n const { aPosition, aShape } = geometry.data;\r\n const vertexCount = geometry.data.aPosition.length / geometry.desc.positionSize;\r\n //initialize opacity array\r\n //aOpacity用于fading透明度的调整\r\n const aOpacity = new Uint8Array(vertexCount);\r\n if (visibleInCollision) {\r\n aOpacity.fill(255, 0);\r\n }\r\n geometry.data.aOpacity = {\r\n usage: 'dynamic',\r\n data: aOpacity\r\n };\r\n geometry.properties.aOpacity = new Uint8Array(vertexCount);\r\n if (visibleInCollision) {\r\n geometry.properties.aOpacity.fill(255, 0);\r\n }\r\n\r\n geometry.properties.aAnchor = aPosition;\r\n geometry.properties.aShape = aShape;\r\n }\r\n if (!geometry.properties.visElemts) {\r\n //保存elements,隐藏icon时,从elements中删除icon的索引数据\r\n geometry.properties.elements = geometry.elements;\r\n geometry.properties.visElemts = new geometry.elements.constructor(geometry.elements.length);\r\n }\r\n\r\n\r\n const [ defaultMarkerWidth, defaultMarkerHeight ] = getDefaultMarkerSize(geometry);\r\n setUniformFromSymbol(uniforms, 'markerOpacity', symbol, 'markerOpacity', 1);\r\n setUniformFromSymbol(uniforms, 'markerPerspectiveRatio', symbol, 'markerPerspectiveRatio', symbol.markerTextFit ? 0 : 1);\r\n setUniformFromSymbol(uniforms, 'markerWidth', symbol, 'markerWidth', defaultMarkerWidth || DEFAULT_MARKER_WIDTH);\r\n setUniformFromSymbol(uniforms, 'markerHeight', symbol, 'markerHeight', defaultMarkerHeight || DEFAULT_MARKER_HEIGHT);\r\n setUniformFromSymbol(uniforms, 'markerDx', symbol, 'markerDx', 0);\r\n setUniformFromSymbol(uniforms, 'markerDy', symbol, 'markerDy', 0);\r\n setUniformFromSymbol(uniforms, 'markerRotation', symbol, 'markerRotation', 0, v => v * Math.PI / 180);\r\n setUniformFromSymbol(uniforms, 'pitchWithMap', symbol, 'markerPitchAlignment', 0, v => v === 'map' ? 1 : 0);\r\n setUniformFromSymbol(uniforms, 'rotateWithMap', symbol, 'markerRotationAlignment', 0, v => v === 'map' ? 1 : 0);\r\n\r\n uniforms['iconTex'] = iconAtlas ? createAtlasTexture(regl, iconAtlas, false) : null;\r\n uniforms['texSize'] = iconAtlas ? [iconAtlas.width, iconAtlas.height] : [0, 0];\r\n geometry.generateBuffers(regl, { excludeElementsInVAO: true });\r\n const material = new reshader.Material(uniforms);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n // 必须关闭VAO,否则对vao中elements的更新会导致halo绘制出错\r\n disableVAO: true,\r\n transparent: true,\r\n castShadow: false,\r\n picking: true\r\n });\r\n const defines = {};\r\n if (enableCollision) {\r\n defines['ENABLE_COLLISION'] = 1;\r\n }\r\n if (geometry.data.aMarkerWidth) {\r\n defines['HAS_MARKER_WIDTH'] = 1;\r\n }\r\n if (geometry.data.aMarkerHeight) {\r\n defines['HAS_MARKER_HEIGHT'] = 1;\r\n }\r\n if (geometry.data.aColorOpacity) {\r\n defines['HAS_OPACITY'] = 1;\r\n }\r\n if (geometry.data.aMarkerDx) {\r\n defines['HAS_MARKER_DX'] = 1;\r\n }\r\n if (geometry.data.aMarkerDy) {\r\n defines['HAS_MARKER_DY'] = 1;\r\n }\r\n if (geometry.data.aPitchAlign) {\r\n defines['HAS_PITCH_ALIGN'] = 1;\r\n }\r\n if (geometry.data.aRotationAlign) {\r\n defines['HAS_ROTATION_ALIGN'] = 1;\r\n }\r\n if (geometry.data.aRotation) {\r\n defines['HAS_ROTATION'] = 1;\r\n }\r\n if (geometry.data.aPadOffsetX) {\r\n defines['HAS_PAD_OFFSET'] = 1;\r\n }\r\n if (geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n mesh.setDefines(defines);\r\n mesh.setUniform('alphaTest', DEFAULT_ICON_ALPHA_TEST);\r\n mesh.setLocalTransform(transform);\r\n mesh.properties.symbolIndex = geometry.properties.symbolIndex;\r\n return mesh;\r\n}\r\n\r\nexport function prepareMarkerGeometry(iconGeometry, symbolDef, iconFnTypeConfig) {\r\n prepareFnTypeData(iconGeometry, symbolDef, iconFnTypeConfig);\r\n prepareIconGeometry(iconGeometry);\r\n}\r\n\r\nfunction prepareIconGeometry(iconGeometry) {\r\n const { aMarkerWidth, aMarkerHeight, aMarkerDx, aMarkerDy, aPitchAlign, aRotationAlign, aRotation, aOverlap } = iconGeometry.data;\r\n if (aMarkerWidth) {\r\n //for collision\r\n const keyName = (PREFIX + 'aMarkerWidth').trim();\r\n iconGeometry.properties.aMarkerWidth = iconGeometry.properties[keyName] || new aMarkerWidth.constructor(aMarkerWidth);\r\n }\r\n if (aMarkerHeight) {\r\n //for collision\r\n const keyName = (PREFIX + 'aMarkerHeight').trim();\r\n iconGeometry.properties.aMarkerHeight = iconGeometry.properties[keyName] || new aMarkerHeight.constructor(aMarkerHeight);\r\n }\r\n if (aMarkerDx) {\r\n //for collision\r\n const keyName = (PREFIX + 'aMarkerDx').trim();\r\n iconGeometry.properties.aMarkerDx = iconGeometry.properties[keyName] || new aMarkerDx.constructor(aMarkerDx);\r\n }\r\n if (aMarkerDy) {\r\n //for collision\r\n const keyName = (PREFIX + 'aMarkerDy').trim();\r\n iconGeometry.properties.aMarkerDy = iconGeometry.properties[keyName] || new aMarkerDy.constructor(aMarkerDy);\r\n }\r\n if (aPitchAlign) {\r\n //for collision\r\n const keyName = (PREFIX + 'aPitchAlign').trim();\r\n iconGeometry.properties.aPitchAlign = iconGeometry.properties[keyName] || new aPitchAlign.constructor(aPitchAlign);\r\n }\r\n if (aRotationAlign) {\r\n //for collision\r\n const keyName = (PREFIX + 'aRotationAlign').trim();\r\n iconGeometry.properties.aRotationAlign = iconGeometry.properties[keyName] || new aRotationAlign.constructor(aRotationAlign);\r\n }\r\n if (aRotation) {\r\n //for collision\r\n const keyName = (PREFIX + 'aRotation').trim();\r\n iconGeometry.properties.aRotation = iconGeometry.properties[keyName] || new aRotation.constructor(aRotation);\r\n }\r\n if (aOverlap) {\r\n //for placement\r\n const keyName = (PREFIX + 'aOverlap').trim();\r\n iconGeometry.properties.aOverlap = iconGeometry.properties[keyName] || new aOverlap.constructor(aOverlap);\r\n }\r\n}\r\n\r\nexport function getMarkerFnTypeConfig(map, symbolDef) {\r\n const markerWidthFn = interpolated(symbolDef['markerWidth']);\r\n const markerHeightFn = interpolated(symbolDef['markerHeight']);\r\n const markerDxFn = interpolated(symbolDef['markerDx']);\r\n const markerDyFn = interpolated(symbolDef['markerDy']);\r\n const markerOpacityFn = interpolated(symbolDef['markerOpacity']);\r\n const markerTextFitFn = interpolated(symbolDef['markerTextFit']);\r\n const markerPitchAlignmentFn = piecewiseConstant(symbolDef['markerPitchAlignment']);\r\n const markerRotationAlignmentFn = piecewiseConstant(symbolDef['markerRotationAlignment']);\r\n const markerRotationFn = interpolated(symbolDef['markerRotation']);\r\n const markerAllowOverlapFn = piecewiseConstant(symbolDef['markerAllowOverlapFn']);\r\n const markerIgnorePlacementFn = piecewiseConstant(symbolDef['markerIgnorePlacement']);\r\n const u8 = new Int16Array(1);\r\n const u16 = new Uint16Array(1);\r\n return [\r\n {\r\n attrName: 'aMarkerWidth',\r\n symbolName: 'markerWidth',\r\n type: Uint16Array,\r\n width: 1,\r\n define: 'HAS_MARKER_WIDTH',\r\n evaluate: (properties, geometry, arr, index) => {\r\n const value = arr[index];\r\n const markerTextFit = symbolDef['markerTextFit'];\r\n //如果是markerTextFit,aMarkerWidth已经更新过了,直接返回原值\r\n const textFit = markerTextFitFn ? markerTextFitFn(map.getZoom(), properties) : markerTextFit;\r\n if (textFit === 'both' || textFit === 'width') {\r\n return value;\r\n }\r\n let x = markerWidthFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(x)) {\r\n x = this.evaluateInFnTypeConfig(x, geometry, map, properties);\r\n }\r\n u8[0] = x;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aMarkerHeight',\r\n symbolName: 'markerHeight',\r\n type: Uint16Array,\r\n width: 1,\r\n define: 'HAS_MARKER_HEIGHT',\r\n evaluate: (properties, geometry, arr, index) => {\r\n const value = arr[index];\r\n const markerTextFit = symbolDef['markerTextFit'];\r\n const textFit = markerTextFitFn ? markerTextFitFn(map.getZoom(), properties) : markerTextFit;\r\n if (textFit === 'both' || textFit === 'height') {\r\n return value;\r\n }\r\n let x = markerHeightFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(x)) {\r\n x = this.evaluateInFnTypeConfig(x, geometry, map, properties);\r\n }\r\n u8[0] = x;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aMarkerDx',\r\n symbolName: 'markerDx',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_MARKER_DX',\r\n evaluate: (properties, geometry) => {\r\n let x = markerDxFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(x)) {\r\n x = this.evaluateInFnTypeConfig(x, geometry, map, properties);\r\n }\r\n\r\n // const x = markerDxFn(map.getZoom(), properties);\r\n u8[0] = x;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aMarkerDy',\r\n symbolName: 'markerDy',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_MARKER_DY',\r\n evaluate: (properties, geometry) => {\r\n let x = markerDyFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(x)) {\r\n x = this.evaluateInFnTypeConfig(x, geometry, map, properties);\r\n }\r\n\r\n u8[0] = x;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aColorOpacity',\r\n symbolName: 'markerOpacity',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_OPACITY',\r\n evaluate: (properties, geometry) => {\r\n let opacity = markerOpacityFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(opacity)) {\r\n opacity = this.evaluateInFnTypeConfig(opacity, geometry, map, properties);\r\n }\r\n u8[0] = opacity * 255;\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aPitchAlign',\r\n symbolName: 'markerPitchAlignment',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_PITCH_ALIGN',\r\n evaluate: properties => {\r\n const y = +(markerPitchAlignmentFn(map.getZoom(), properties) === 'map');\r\n return y;\r\n }\r\n },\r\n {\r\n attrName: 'aRotationAlign',\r\n symbolName: 'markerRotationAlignment',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_ROTATION_ALIGN',\r\n evaluate: properties => {\r\n const y = +(markerRotationAlignmentFn(map.getZoom(), properties) === 'map');\r\n return y;\r\n }\r\n },\r\n {\r\n attrName: 'aRotation',\r\n symbolName: 'markerRotation',\r\n type: Uint16Array,\r\n width: 1,\r\n define: 'HAS_ROTATION',\r\n evaluate: properties => {\r\n const y = wrap(markerRotationFn(map.getZoom(), properties), 0, 360) * Math.PI / 180;\r\n u16[0] = y * 9362;\r\n return u16[0];\r\n }\r\n },\r\n {\r\n attrName: 'aOverlap',\r\n symbolName: 'markerAllowOverlap',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: properties => {\r\n let overlap = markerAllowOverlapFn(map.getZoom(), properties) || 0;\r\n let placement = (markerIgnorePlacementFn ? markerIgnorePlacementFn(map.getZoom(), properties) : symbolDef['markerIgnorePlacement']) || 0;\r\n overlap = 1 << 3 + overlap * (1 << 2);\r\n placement = (markerIgnorePlacementFn ? 1 << 1 : 0) + placement;\r\n return overlap + placement;\r\n }\r\n },\r\n // 因为 markerAllowOverlap 和 markerIgnorePlacement 共用一个 aOverlap\r\n // 如果 markerAllowOverlap 和 markerIgnorePlacement 同时定义,会重复计算一次。\r\n // 这里稍微牺牲一些性能,保持程序逻辑的简洁\r\n {\r\n attrName: 'aOverlap',\r\n symbolName: 'markerIgnorePlacement',\r\n type: Uint8Array,\r\n width: 1,\r\n evaluate: properties => {\r\n let overlap = (markerAllowOverlapFn ? markerAllowOverlapFn(map.getZoom(), properties) : symbolDef['markerAllowOverlap']) || 0;\r\n let placement = markerIgnorePlacementFn(map.getZoom(), properties) || 0;\r\n overlap = (markerAllowOverlapFn ? 1 << 3 : 0) + overlap * (1 << 2);\r\n placement = (1 << 1) + placement;\r\n return overlap + placement;\r\n }\r\n }\r\n ];\r\n}\r\n\r\nexport function prepareLabelIndex(map, iconGeometry, textGeometry, markerTextFit) {\r\n if (!textGeometry || !markerTextFit || markerTextFit === 'none') {\r\n return;\r\n }\r\n\r\n const labelIndex = buildLabelIndex(iconGeometry, textGeometry, markerTextFit);\r\n if (!iconGeometry.getElements().length) {\r\n return;\r\n }\r\n if (!labelIndex.length) {\r\n return;\r\n }\r\n iconGeometry.properties.labelIndex = labelIndex;\r\n const hasTextFit = labelIndex.length && markerTextFit && markerTextFit !== 'none';\r\n if (hasTextFit && textGeometry) {\r\n const labelShape = buildLabelShape(iconGeometry, textGeometry);\r\n if (labelShape.length) {\r\n iconGeometry.properties.labelShape = labelShape;\r\n fillTextFitData.call(this, map, iconGeometry, textGeometry);\r\n }\r\n }\r\n}\r\n\r\n// labelIndex中存的是icon对应的label在textGeometry.element中的start和end\r\nfunction buildLabelIndex(iconGeometry, textGeometry, markerTextFit) {\r\n let markerTextFitFn = iconGeometry.properties.textFitFn;\r\n if (isFunctionDefinition(markerTextFit)) {\r\n markerTextFitFn = iconGeometry.properties.textFitFn = piecewiseConstant(markerTextFit);\r\n }\r\n const isTextFit = markerTextFit !== 'none';\r\n const labelIndex = [];\r\n const iconElements = iconGeometry.getElements();\r\n const iconIds = iconGeometry.data.aPickingId;\r\n\r\n let textElements, textIds, textCounts;\r\n if (textGeometry) {\r\n textElements = textGeometry.getElements();\r\n textIds = textGeometry.data.aPickingId;\r\n textCounts = textGeometry.data.aCount;\r\n }\r\n\r\n const features = iconGeometry.properties.features;\r\n\r\n let currentLabel;\r\n if (textGeometry) {\r\n let textId = textElements[0];\r\n currentLabel = {\r\n pickingId: textIds[textId],\r\n start: 0,\r\n end: textCounts[textId] * BOX_ELEMENT_COUNT\r\n };\r\n }\r\n\r\n let labelVisitEnd = false;\r\n let hasLabel = false;\r\n let count = 0;\r\n const unused = new Set();\r\n //遍历所有的icon,当icon和aPickingId和text的相同时,则认为是同一个icon + text,并记录它的序号\r\n for (let i = 0; i < iconElements.length; i += BOX_ELEMENT_COUNT) {\r\n const idx = iconElements[i];\r\n const pickingId = iconIds[idx];\r\n if (!labelVisitEnd && currentLabel) {\r\n //label的pickingId比icon的小,说明当前文字没有icon,则往前找到下一个label pickingId比当前icon大的label\r\n while (currentLabel.pickingId < pickingId && currentLabel.end < textElements.length) {\r\n const start = currentLabel.end;\r\n const textId = textElements[start];\r\n currentLabel.start = start;\r\n currentLabel.end = start + textCounts[textId] * BOX_ELEMENT_COUNT;\r\n currentLabel.pickingId = textIds[textId];\r\n }\r\n }\r\n if (!labelVisitEnd && currentLabel && currentLabel.pickingId < pickingId) {\r\n //后面的icon都没有label\r\n labelVisitEnd = true;\r\n if (!isTextFit) {\r\n //如果不是textfit, 直接填充labelIndex并退出\r\n if (!hasLabel) {\r\n return [];\r\n }\r\n for (let ii = i; ii < iconElements.length; ii += BOX_ELEMENT_COUNT) {\r\n labelIndex[count++] = [-1, -1];\r\n }\r\n return labelIndex;\r\n }\r\n }\r\n const feature = features[pickingId] && features[pickingId].feature;\r\n const properties = feature && feature.properties || {};\r\n // properties['$layer'] = feature && feature.layer;\r\n // properties['$type'] = feature && feature.type;\r\n const textFit = markerTextFitFn ? markerTextFitFn(null, properties) : markerTextFit;\r\n // delete properties['$layer'];\r\n // delete properties['$type'];\r\n if (currentLabel && pickingId === currentLabel.pickingId) {\r\n labelIndex[count++] = [currentLabel.start, currentLabel.end];\r\n const start = currentLabel.end;\r\n const textId = textElements[start];\r\n currentLabel.start = start;\r\n currentLabel.end = start + textCounts[textId] * BOX_ELEMENT_COUNT;\r\n currentLabel.pickingId = textIds[textId];\r\n hasLabel = true;\r\n } else if (textFit && textFit !== 'none') {\r\n //如果icon设置了markerTextFit,但没有label,则从elements中去掉这个icon\r\n for (let ii = i; ii < i + BOX_ELEMENT_COUNT; ii++) {\r\n unused.add(ii);\r\n }\r\n } else {\r\n labelIndex[count++] = [-1, -1];\r\n }\r\n }\r\n if (unused.size) {\r\n if (unused.size === iconElements.length) {\r\n iconGeometry.setElements([]);\r\n } else {\r\n const elements = [];\r\n for (let i = 0; i < iconElements.length; i++) {\r\n if (!unused.has(i)) {\r\n elements.push(iconElements[i]);\r\n }\r\n }\r\n iconGeometry.setElements(new iconElements.constructor(elements));\r\n }\r\n }\r\n if (!hasLabel) {\r\n return [];\r\n }\r\n return labelIndex;\r\n}\r\n\r\nfunction buildLabelShape(iconGeometry, textGeometry) {\r\n const labelShape = [];\r\n const labelIndex = iconGeometry.properties.labelIndex;\r\n const { aShape } = textGeometry.data;\r\n let hasValue = false;\r\n for (let i = 0; i < labelIndex.length; i++) {\r\n const [start, end] = labelIndex[i];\r\n if (start === -1) {\r\n labelShape.push(0, 0, 0, 0);\r\n } else {\r\n hasValue = true;\r\n let minx = Infinity, miny = Infinity, maxx = -Infinity, maxy = -Infinity;\r\n const elements = textGeometry.elements;\r\n for (let ii = start; ii < end; ii++) {\r\n const idx = elements[ii];\r\n const x = aShape[idx * 2];\r\n const y = aShape[idx * 2 + 1];\r\n if (x < minx) {\r\n minx = x;\r\n }\r\n if (x > maxx) {\r\n maxx = x;\r\n }\r\n if (y < miny) {\r\n miny = y;\r\n }\r\n if (y > maxy) {\r\n maxy = y;\r\n }\r\n }\r\n labelShape.push(minx, miny, maxx, maxy);\r\n }\r\n }\r\n if (!hasValue) {\r\n return [];\r\n }\r\n return labelShape;\r\n}\r\n\r\nfunction fillTextFitData(map, iconGeometry) {\r\n const symbolDef = this.getSymbolDef(iconGeometry.properties.symbolIndex);\r\n //1. markerTextFit 是否是 fn-type,如果是,则遍历features创建 fitIcons, fitWidthIcons, fitHeightIcons\r\n //2. 检查data中是否存在aMarkerWidth或aMarkerHeight,如果没有则添加\r\n //3. 如果textSize是zoomConstant,说明 markerWidth和markerHeight是静态的,提前计算,未来无需再更新\r\n const markerTextFit = symbolDef['markerTextFit'];\r\n const props = iconGeometry.properties;\r\n let hasWidth = markerTextFit === 'both' || markerTextFit === 'width';\r\n let hasHeight = markerTextFit === 'both' || markerTextFit === 'height';\r\n\r\n if (isFunctionDefinition(symbolDef['markerTextFit'])) {\r\n let markerTextFitFn = iconGeometry.properties.textFitFn;\r\n if (!markerTextFitFn) {\r\n markerTextFitFn = iconGeometry.properties.textFitFn = interpolated(symbolDef['markerTextFit']);\r\n }\r\n const { features } = iconGeometry.properties;\r\n const elements = iconGeometry.properties.elements || iconGeometry.elements;\r\n const { aPickingId } = iconGeometry.data;\r\n const fitWidthIcons = [];\r\n const fitHeightIcons = [];\r\n let onlyBoth = true;\r\n for (let i = 0; i < elements.length; i += BOX_ELEMENT_COUNT) {\r\n const idx = elements[i];\r\n const pickingId = aPickingId[idx];\r\n const feature = features[pickingId];\r\n const fea = feature && feature.feature || {};\r\n const properties = fea.properties || {};\r\n // properties['$layer'] = fea.layer;\r\n // properties['$type'] = fea.type;\r\n let v = markerTextFitFn(null, properties);\r\n if (isFunctionDefinition(v)) {\r\n const fn = properties.textFitFn = properties.textFitFn || interpolated(v);\r\n v = fn(null, properties);\r\n }\r\n // delete properties['$layer'];\r\n // delete properties['$type'];\r\n if (v === 'both') {\r\n fitWidthIcons.push(i / BOX_ELEMENT_COUNT);\r\n fitHeightIcons.push(i / BOX_ELEMENT_COUNT);\r\n } else if (v === 'width') {\r\n onlyBoth = false;\r\n fitWidthIcons.push(i / BOX_ELEMENT_COUNT);\r\n } else if (v === 'height') {\r\n onlyBoth = false;\r\n fitHeightIcons.push(i / BOX_ELEMENT_COUNT);\r\n }\r\n }\r\n if (onlyBoth) {\r\n props.fitIcons = fitWidthIcons;\r\n hasWidth = true;\r\n hasHeight = true;\r\n } else {\r\n if (fitWidthIcons.length) {\r\n props.fitWidthIcons = fitWidthIcons;\r\n hasWidth = true;\r\n }\r\n if (fitHeightIcons.length) {\r\n props.fitHeightIcons = fitHeightIcons;\r\n hasHeight = true;\r\n }\r\n }\r\n }\r\n\r\n if (!props['aPickingId']) {\r\n props['aPickingId'] = new iconGeometry.data.aPickingId.constructor(iconGeometry.data.aPickingId);\r\n }\r\n const { aMarkerWidth, aMarkerHeight, aPickingId } = props;\r\n const count = aPickingId.length;\r\n //把aMarkerWidth和aMarkerHeight从Uint8Array改为Uint16Array,因为text-fit后的宽度或高度很可能超过255\r\n if (hasWidth) {\r\n if (!aMarkerWidth) {\r\n // 因为 aMarkerWidth 可能不会被更新(例如markerTextFit为height时),预先用 markerWidth 填充 aMarkerWidth\r\n const markerWidth = this.getSymbol(iconGeometry.properties.symbolIndex).markerWidth || 0;\r\n props.aMarkerWidth = new Uint16Array(count);\r\n props.aMarkerWidth.fill(markerWidth);\r\n if (markerWidth) {\r\n props.aMarkerWidth.dirty = true;\r\n }\r\n iconGeometry.data.aMarkerWidth = new Uint16Array(count);\r\n } else {\r\n const arr = iconGeometry.data.aMarkerWidth;\r\n //在 fn-type 中已经创建\r\n iconGeometry.data.aMarkerWidth = new Uint16Array(arr);\r\n props.aMarkerWidth = new Uint16Array(arr);\r\n const keyName = (PREFIX + 'aMarkerWidth').trim();\r\n if (props[keyName]) {\r\n props[keyName] = props.aMarkerWidth;\r\n }\r\n }\r\n\r\n }\r\n if (hasHeight) {\r\n if (!aMarkerHeight) {\r\n const markerHeight = this.getSymbol(iconGeometry.properties.symbolIndex).markerHeight || 0;\r\n props.aMarkerHeight = new Uint16Array(count);\r\n props.aMarkerHeight.fill(markerHeight);\r\n if (markerHeight) {\r\n props.aMarkerHeight.dirty = true;\r\n }\r\n iconGeometry.data.aMarkerHeight = new Uint16Array(count);\r\n } else {\r\n const arr = iconGeometry.data.aMarkerHeight;\r\n //在 fn-type 中已经创建\r\n iconGeometry.data.aMarkerHeight = new Uint16Array(arr);\r\n props.aMarkerHeight = new Uint16Array(arr);\r\n const keyName = (PREFIX + 'aMarkerHeight').trim();\r\n if (props[keyName]) {\r\n props[keyName] = props.aMarkerHeight;\r\n }\r\n }\r\n }\r\n\r\n const textSymbolDef = this.getSymbolDef(iconGeometry.properties.textGeo.properties.symbolIndex);\r\n const textFitFn = interpolated(textSymbolDef['textSize']);\r\n\r\n updateMarkerFitSize.call(this, map, iconGeometry);\r\n if (!isFunctionDefinition(textSymbolDef['textSize']) || textFitFn.isZoomConstant && textFitFn.isFeatureConstant) {\r\n props.isFitConstant = true;\r\n return;\r\n }\r\n}\r\n\r\nconst DEFAULT_PADDING = [0, 0, 0, 0];\r\nexport function updateMarkerFitSize(map, iconGeometry) {\r\n const textGeometry = iconGeometry.properties.textGeo;\r\n if (!textGeometry) {\r\n return;\r\n }\r\n const textProps = textGeometry.properties;\r\n const props = iconGeometry.properties;\r\n if (props.isFitConstant || !props.labelShape || !props.labelShape.length) {\r\n return;\r\n }\r\n // const { symbolDef: markerSymbol } = props;\r\n // const { symbolDef } = textProps;\r\n const markerSymbol = this.getSymbolDef(iconGeometry.properties.symbolIndex);\r\n const symbolDef = this.getSymbolDef(textGeometry.properties.symbolIndex);\r\n\r\n const textSizeDef = symbolDef['textSize'];\r\n let textSizeFn;\r\n if (isFunctionDefinition(textSizeDef)) {\r\n if (!textProps._textSizeFn) {\r\n textSizeFn = textProps._textSizeFn = interpolated(textSizeDef);\r\n } else {\r\n textSizeFn = textProps._textSizeFn;\r\n }\r\n }\r\n const padding = markerSymbol['markerTextFitPadding'] || DEFAULT_PADDING;\r\n let paddingFn;\r\n if (isFunctionDefinition(padding)) {\r\n if (!props._paddingFn) {\r\n paddingFn = props._paddingFn = piecewiseConstant(padding);\r\n } else {\r\n paddingFn = props._paddingFn;\r\n }\r\n }\r\n const zoom = map.getZoom();\r\n //textSize是fn-type,实时更新aMarkerHeight或者aMarkerWidth\r\n const { fitIcons, fitWidthIcons, fitHeightIcons } = props;\r\n const { aMarkerWidth, aMarkerHeight, labelShape } = props;\r\n\r\n const elements = props.elements || iconGeometry.elements;\r\n const { features, aPickingId } = props;\r\n const fn = (idx, iconIndex, hasWidth, hasHeight) => {\r\n const minx = labelShape[iconIndex * 4];\r\n const miny = labelShape[iconIndex * 4 + 1];\r\n const maxx = labelShape[iconIndex * 4 + 2];\r\n const maxy = labelShape[iconIndex * 4 + 3];\r\n if (!minx && !miny && !maxx && !maxy) {\r\n return;\r\n }\r\n const pickingId = aPickingId[idx];\r\n const feature = features[pickingId] && features[pickingId].feature;\r\n const properties = feature && feature.properties || {};\r\n // properties['$layer'] = feature && feature.layer;\r\n // properties['$type'] = feature && feature.type;\r\n let textSize = (textSizeFn ? textSizeFn(zoom, properties) : textSizeDef);\r\n if (isFunctionDefinition(textSize)) {\r\n const fn = properties.textSizeFn = properties.textSizeFn || interpolated(textSize);\r\n textSize = fn(zoom, properties);\r\n }\r\n textSize /= GLYPH_SIZE;\r\n let fitPadding = paddingFn && paddingFn(zoom, properties) || padding;\r\n if (isFunctionDefinition(fitPadding)) {\r\n const fn = properties.fitPaddingFn = properties.fitPaddingFn || piecewiseConstant(fitPadding);\r\n fitPadding = fn(zoom, properties);\r\n }\r\n fitPadding = fitPadding || DEFAULT_PADDING;\r\n let aPadOffsetX, aPadOffsetY;\r\n if (fitPadding[0] !== fitPadding[2] || fitPadding[1] !== fitPadding[3]) {\r\n aPadOffsetX = props.aPadOffsetX;\r\n aPadOffsetY = props.aPadOffsetY;\r\n if (!aPadOffsetX) {\r\n aPadOffsetX = props.aPadOffsetX = new Int8Array(aMarkerWidth.length);\r\n aPadOffsetY = props.aPadOffsetY = new Int8Array(aMarkerWidth.length);\r\n }\r\n }\r\n // delete properties['$layer'];\r\n // delete properties['$type'];\r\n if (aMarkerWidth && hasWidth) {\r\n //除以10是因为为了增加精度,shader中的aShape乘以了10\r\n const width = Math.abs((maxx - minx) / 10 * textSize) + ((fitPadding[1] + fitPadding[3]) || 0);\r\n U8[0] = width;\r\n if (aMarkerWidth[idx] !== U8[0]) {\r\n fillArray(aMarkerWidth, U8[0], idx, idx + BOX_VERTEX_COUNT);\r\n aMarkerWidth.dirty = true;\r\n }\r\n if (aPadOffsetX) {\r\n const offset = (fitPadding[1] + fitPadding[3]) / 2 - fitPadding[3];\r\n I8[0] = offset;\r\n if (aPadOffsetX[idx] !== I8[0]) {\r\n fillArray(aPadOffsetX, offset, idx, idx + BOX_VERTEX_COUNT);\r\n aPadOffsetX.dirty = true;\r\n }\r\n }\r\n }\r\n if (aMarkerHeight && hasHeight) {\r\n const height = Math.abs((maxy - miny) / 10 * textSize) + ((fitPadding[0] + fitPadding[2]) || 0);\r\n U8[0] = height;\r\n if (aMarkerHeight[idx] !== U8[0]) {\r\n fillArray(aMarkerHeight, U8[0], idx, idx + BOX_VERTEX_COUNT);\r\n aMarkerHeight.dirty = true;\r\n }\r\n if (aPadOffsetY) {\r\n const offset = fitPadding[0] - (fitPadding[0] + fitPadding[2]) / 2;\r\n I8[0] = offset;\r\n if (aPadOffsetY[idx] !== I8[0]) {\r\n fillArray(aPadOffsetY, offset, idx, idx + BOX_VERTEX_COUNT);\r\n aPadOffsetY.dirty = true;\r\n }\r\n }\r\n }\r\n };\r\n\r\n if (!fitIcons && !fitWidthIcons && !fitHeightIcons) {\r\n // markerTextFit 不是 fn-type,遍历所有的icon\r\n for (let i = 0; i < elements.length; i += BOX_ELEMENT_COUNT) {\r\n const iconIndex = i / BOX_ELEMENT_COUNT;\r\n const idx = elements[i];\r\n fn(idx, iconIndex, true, true);\r\n }\r\n } else if (fitIcons) {\r\n // markerTextFit 是 fn-type,且是both\r\n for (let i = 0; i < fitIcons.length; i++) {\r\n const iconIndex = fitIcons[i];\r\n const idx = elements[iconIndex * BOX_ELEMENT_COUNT];\r\n fn(idx, iconIndex, true, true);\r\n }\r\n } else if (fitWidthIcons || fitHeightIcons) {\r\n // markerTextFit 是 fn-type, 且值可能为both,也可能为width, height\r\n if (fitWidthIcons) {\r\n for (let i = 0; i < fitWidthIcons.length; i++) {\r\n const iconIndex = fitWidthIcons[i];\r\n const idx = elements[iconIndex * BOX_ELEMENT_COUNT];\r\n fn(idx, iconIndex, true, false);\r\n }\r\n }\r\n if (fitHeightIcons) {\r\n for (let i = 0; i < fitHeightIcons.length; i++) {\r\n const iconIndex = fitHeightIcons[i];\r\n const idx = elements[iconIndex * BOX_ELEMENT_COUNT];\r\n fn(idx, iconIndex, false, true);\r\n }\r\n }\r\n }\r\n const { aPadOffsetX, aPadOffsetY } = props;\r\n if (aPadOffsetX) {\r\n iconGeometry.data.aPadOffsetX = aPadOffsetX;\r\n iconGeometry.data.aPadOffsetY = aPadOffsetY;\r\n }\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { isFunctionDefinition } from '@maptalks/function-type';\r\nimport CollisionPainter from './CollisionPainter';\r\nimport { reshader } from '@maptalks/gl';\r\nimport { vec2, mat4 } from '@maptalks/gl';\r\nimport vert from './glsl/marker.vert';\r\nimport frag from './glsl/marker.frag';\r\nimport pickingVert from './glsl/marker.vert';\r\nimport { getIconBox } from './util/get_icon_box';\r\nimport { isNil, isIconText, getUniqueIds } from '../Util';\r\nimport { createTextMesh, createTextShader, GAMMA_SCALE, isLabelCollides, getLabelEntryKey, getTextFnTypeConfig } from './util/create_text_painter';\r\nimport CollisionGroup from './CollisionGroup';\r\n\r\nimport textVert from './glsl/text.vert';\r\nimport textFrag from './glsl/text.frag';\r\nimport textPickingVert from './glsl/text.vert';\r\nimport { updateOneGeometryFnTypeAttrib } from './util/fn_type_util';\r\nimport { GLYPH_SIZE, ICON_SIZE } from './Constant';\r\nimport { createMarkerMesh, getMarkerFnTypeConfig, prepareMarkerGeometry, prepareLabelIndex, updateMarkerFitSize, BOX_VERTEX_COUNT, BOX_ELEMENT_COUNT } from './util/create_marker_painter';\r\nimport { FilterUtil } from '@maptalks/vector-packer';\r\nimport { INVALID_ALTITUDE } from '../../../common/Constant';\r\n\r\nconst ICON_FILTER = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n return !this._isHalo0(mesh) && renderer.isForeground(mesh) && !!mesh.geometry.properties.iconAtlas && !mesh.geometry.properties.isEmpty;\r\n};\r\n\r\nconst ICON_FILTER_N = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n return !this._isHalo0(mesh) && !renderer.isForeground(mesh) && !!mesh.geometry.properties.iconAtlas && !mesh.geometry.properties.isEmpty;\r\n};\r\n\r\nconst TEXT_FILTER = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n return !this._isHalo0(mesh) && renderer.isForeground(mesh) && !!mesh.geometry.properties.glyphAtlas;\r\n};\r\n\r\nconst TEXT_FILTER_N = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n return !this._isHalo0(mesh) && !renderer.isForeground(mesh) && !!mesh.geometry.properties.glyphAtlas;\r\n};\r\n\r\n//temparary variables\r\nconst PROJ_MATRIX = [];\r\n\r\nconst EMPTY_COLLISION = {\r\n collides: -1\r\n};\r\n\r\nconst ICON_SIZE_ARR = [ICON_SIZE, ICON_SIZE];\r\n\r\nconst IDENTITY_ARR = mat4.identity([]);\r\nconst TEMP_CANVAS_SIZE = [];\r\n\r\nclass IconPainter extends CollisionPainter {\r\n static getBloomSymbol() {\r\n return ['markerBloom', 'textBloom'];\r\n }\r\n\r\n constructor(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig) {\r\n super(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig);\r\n this.propAllowOverlap = 'markerAllowOverlap';\r\n this.propIgnorePlacement = 'markerIgnorePlacement';\r\n // this._textFnTypeConfig = getTextFnTypeConfig(this.getMap(), this.symbolDef);\r\n // this._iconFnTypeConfig = this._getIconFnTypeConfig();\r\n this._fnTypeConfigs = {};\r\n this.isLabelCollides = isLabelCollides.bind(this);\r\n\r\n this._iconFilter0 = ICON_FILTER.bind(this);\r\n this._iconFilter1 = ICON_FILTER_N.bind(this);\r\n this._textFilter0 = TEXT_FILTER.bind(this);\r\n this._textFilter1 = TEXT_FILTER_N.bind(this);\r\n this._meshesToCheck = [];\r\n }\r\n\r\n needToRefreshTerrainTileOnZooming() {\r\n for (let i = 0; i < this.symbolDef.length; i++) {\r\n const symbolDef = this.symbolDef[i];\r\n const pitchAlignment = symbolDef['markerPitchAlignment'];\r\n if (pitchAlignment === 'map' || isFunctionDefinition(pitchAlignment) || FilterUtil.isExpression(pitchAlignment)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n isTerrainVector() {\r\n return this.layer.options.awareOfTerrain && !this.needToRefreshTerrainTileOnZooming();\r\n }\r\n\r\n isTerrainSkin() {\r\n return super.isTerrainSkin() && this.needToRefreshTerrainTileOnZooming();\r\n }\r\n\r\n setTextShaderDefines(defines) {\r\n this._textDefines = defines;\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n const icon = getMarkerFnTypeConfig.call(this, map, symbolDef);\r\n const text = getTextFnTypeConfig.call(this, map, symbolDef);\r\n return {\r\n icon,\r\n text\r\n };\r\n }\r\n\r\n startFrame(...args) {\r\n this._meshesToCheck.length = 0;\r\n return super.startFrame(...args);\r\n }\r\n\r\n createGeometry(glData, features) {\r\n if (glData && glData.empty) {\r\n //空icon,删除不需要的attribute数据\r\n glData.data = {\r\n aPosition: new Uint8Array(glData.data.aPosition),\r\n aPickingId: glData.data.aPickingId\r\n };\r\n }\r\n return super.createGeometry(glData, features);\r\n }\r\n\r\n postCreateGeometry(geo, geometries) {\r\n const { geometry, symbolIndex } = geo;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n if (this._isMarkerGeo(geometry)) {\r\n if (!geometry.properties.iconAtlas) {\r\n geometry.properties.isEmpty = true;\r\n } else {\r\n this.drawDebugAtlas(geometry.properties.iconAtlas);\r\n }\r\n prepareMarkerGeometry(geometry, symbolDef, fnTypeConfig.icon);\r\n } else if (this._isTextGeo(geometry)) {\r\n if (isIconText(symbolDef)) {\r\n const len = geometries.length;\r\n const lastOne = geometries[len - 1];\r\n if (lastOne) {\r\n const { geometry: iconGeometry, symbolIndex: iconSymbolIndex } = lastOne;\r\n if (iconGeometry && iconSymbolIndex.index === symbolIndex.index) {\r\n const map = this.getMap();\r\n const markerTextFit = symbolDef['markerTextFit'];\r\n iconGeometry.properties.textGeo = geometry;\r\n prepareLabelIndex.call(this, map, iconGeometry, geometry, markerTextFit);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n prepareCollideIndex(geo) {\r\n // if (!this.layer.options['collision']) {\r\n // return;\r\n // }\r\n // collideIds 中存放的是 feature.id 的值\r\n // aPickingIds 中存放的 KEY_IDX 的值\r\n // Vector3DLayer 中,feature有多个symbol时,会有多个数据的 feature.id 相同,但KEY_IDX不同的情况存在\r\n // 但 feature.id 可能不存在(比如mapbox的vt在线服务),aPickingId一定存在,所以遍历用的id数组优先选用 collideIds,没有的话就选用aPickingId\r\n const { collideIds, elements, aCount } = geo.properties;\r\n if (!collideIds) {\r\n return;\r\n }\r\n const ids = collideIds;\r\n const collideBoxIndex = {};\r\n if (!elements) {\r\n // an empty icon\r\n geo.properties.collideBoxIndex = collideBoxIndex;\r\n return;\r\n }\r\n\r\n let index = 0;\r\n let idx = elements[0];\r\n let start = 0, current = ids[idx];\r\n let charCount = 1;\r\n if (aCount) {\r\n charCount = aCount[elements[start]];\r\n }\r\n for (let ii = 0; ii <= elements.length; ii += BOX_ELEMENT_COUNT) {\r\n idx = elements[ii];\r\n //pickingId发生变化,新的feature出现\r\n if (ids[idx] !== current || ii === elements.length) {\r\n collideBoxIndex[current] = [\r\n start,\r\n ii,\r\n (ii - start) / (charCount * BOX_ELEMENT_COUNT),\r\n index++\r\n ];\r\n current = ids[idx];\r\n start = ii;\r\n if (aCount) {\r\n charCount = aCount[elements[start]];\r\n }\r\n }\r\n }\r\n geo.properties.collideBoxIndex = collideBoxIndex;\r\n }\r\n\r\n createMesh(geo, transform, params, context) {\r\n const enableCollision = this.isEnableCollision();\r\n const layer = this.layer;\r\n const { geometry, symbolIndex } = geo;\r\n geometry.properties.symbolIndex = symbolIndex;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const symbol = this.getSymbol(symbolIndex);\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n const meshes = [];\r\n if (this._isMarkerGeo(geometry)) {\r\n const mesh = createMarkerMesh(this.regl, geometry, transform, symbolDef, symbol, fnTypeConfig.icon, layer.options['collision'], !enableCollision, this.isEnableUniquePlacement());\r\n if (mesh) {\r\n mesh.positionMatrix = this.getAltitudeOffsetMatrix();\r\n delete mesh.geometry.properties.glyphAtlas;\r\n meshes.push(mesh);\r\n }\r\n } else if (this._isTextGeo(geometry)) {\r\n const mesh = createTextMesh.call(this, this.regl, geometry, transform, symbolDef, symbol, fnTypeConfig.text, layer.options['collision'], !enableCollision, this.isEnableUniquePlacement());\r\n if (mesh.length) {\r\n mesh.forEach(m => {\r\n m.positionMatrix = this.getAltitudeOffsetMatrix();\r\n delete m.geometry.properties.iconAtlas;\r\n });\r\n meshes.push(...mesh);\r\n }\r\n }\r\n if (geometry.properties.markerPlacement === 'line') {\r\n this._rebuildCollideIds(geometry, context);\r\n }\r\n if (geometry.properties.markerPlacement === 'line') {\r\n meshes.forEach(m => m.properties.isLinePlacement = true);\r\n }\r\n this.prepareCollideIndex(geometry);\r\n return meshes;\r\n }\r\n\r\n _rebuildCollideIds(geometry, context) {\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n // icon是沿线分布时,因为所有沿线生成的icon的aPickingId都是一样的,每个icon无法独立判断碰撞检测\r\n // 因此需要为每个icon和相应的text生成独立的collideId\r\n const { collideIds } = geometry.properties;\r\n const newCollideIds = new Uint16Array(collideIds.length);\r\n if (this._isMarkerGeo(geometry)) {\r\n let id = 0;\r\n for (let i = 0; i < collideIds.length; i += BOX_VERTEX_COUNT) {\r\n newCollideIds.fill(id++, i, i + BOX_VERTEX_COUNT);\r\n }\r\n geometry.properties.collideIds = newCollideIds;\r\n geometry.properties.uniqueCollideIds = getUniqueIds(newCollideIds, !isVectorTile);\r\n context.markerCollideMap = {\r\n old: collideIds,\r\n new: newCollideIds\r\n };\r\n } else if (this._isTextGeo(geometry)) {\r\n const { collideIds, aCount } = geometry.properties;\r\n if (!aCount) {\r\n // text geometry 的 textSize 为0 或者 textOpacity为0\r\n return;\r\n }\r\n if (context.markerCollideMap) {\r\n // counter是,pickingId不变时,icon的序号\r\n const { markerCollideMap } = context;\r\n let maxId = markerCollideMap.new[markerCollideMap.new.length - 1];\r\n let counter = 0;\r\n let current = collideIds[0];\r\n let currentOldIndex = context.markerCollideMap.old.indexOf(current);\r\n let currentCount = aCount[0];\r\n for (let i = 0; i < collideIds.length;) {\r\n // 1. 获取当前的pickingId\r\n const cid = collideIds[i];\r\n if (current !== cid) {\r\n current = cid;\r\n // 2. 获取pickingId在icon.oldCollideIds的起始序号\r\n currentOldIndex = context.markerCollideMap.old.indexOf(current);\r\n counter = 0;\r\n }\r\n // 3. 获取text对应的icon的collide值 = 2得到的起始序号 + icon序号 * BOX_VERTEX_COUNT\r\n // currentOldIndex 为 -1时,说明文字没有对应的icon数据,它的id则从 maxId 开始计数。\r\n const id = currentOldIndex === -1 ? ++maxId : context.markerCollideMap.new[currentOldIndex + counter * BOX_VERTEX_COUNT];\r\n const next = i + currentCount * BOX_VERTEX_COUNT;\r\n collideIds.fill(id, i, next);\r\n i += currentCount * BOX_VERTEX_COUNT;\r\n counter++;\r\n if (next < collideIds.length) {\r\n currentCount = aCount[next];\r\n }\r\n }\r\n geometry.properties.uniqueCollideIds = getUniqueIds(collideIds, !isVectorTile);\r\n } else {\r\n // 只定义了 text 属性\r\n let id = 0;\r\n let currentCount = aCount[0];\r\n for (let i = 0; i < collideIds.length;) {\r\n const next = i + currentCount * BOX_VERTEX_COUNT;\r\n collideIds.fill(id++, i, next);\r\n i += currentCount * BOX_VERTEX_COUNT;\r\n if (next < collideIds.length) {\r\n currentCount = aCount[next];\r\n }\r\n }\r\n geometry.properties.uniqueCollideIds = getUniqueIds(collideIds, !isVectorTile);\r\n }\r\n\r\n }\r\n }\r\n\r\n addMesh(meshes) {\r\n const isEnableCollision = this.isEnableCollision();\r\n if (isEnableCollision && meshes.length > 0) {\r\n const group = new CollisionGroup(meshes);\r\n group.properties.uniqueCollideIds = meshes[0].geometry.properties.uniqueCollideIds;\r\n group.properties.meshKey = meshes[0].properties.meshKey;\r\n group.properties.level = meshes[0].properties.level;\r\n this._meshesToCheck.push(group);\r\n }\r\n\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!this.isMeshIterable(meshes[i])) {\r\n continue;\r\n }\r\n const geometry = meshes[i].geometry;\r\n const { symbolIndex } = geometry.properties;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n if (isIconText(symbolDef)) {\r\n updateMarkerFitSize.call(this, this.getMap(), geometry);\r\n }\r\n }\r\n const z = this.getMap().getZoom();\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!this.isMeshIterable(meshes[i])) {\r\n continue;\r\n }\r\n const geometry = meshes[i].geometry;\r\n const { symbolIndex } = geometry.properties;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n\r\n updateOneGeometryFnTypeAttrib(this.regl, symbolDef, symbolIndex.type === 0 ? fnTypeConfig.icon : fnTypeConfig.text, meshes[i], z);\r\n const { aMarkerWidth, aMarkerHeight, aPadOffsetX, aPadOffsetY } = geometry.properties;\r\n if (aMarkerWidth && aMarkerWidth.dirty) {\r\n geometry.updateData('aMarkerWidth', aMarkerWidth);\r\n aMarkerWidth.dirty = false;\r\n }\r\n if (aMarkerHeight && aMarkerHeight.dirty) {\r\n geometry.updateData('aMarkerHeight', aMarkerHeight);\r\n aMarkerHeight.dirty = false;\r\n }\r\n if (aPadOffsetX && aPadOffsetX.dirty) {\r\n geometry.updateData('aPadOffsetX', aPadOffsetX);\r\n aPadOffsetX.dirty = false;\r\n }\r\n if (aPadOffsetY && aPadOffsetY.dirty) {\r\n geometry.updateData('aPadOffsetY', aPadOffsetY);\r\n aPadOffsetY.dirty = false;\r\n }\r\n }\r\n super.addMesh(...arguments);\r\n }\r\n\r\n updateCollision(context) {\r\n if (!this.isEnableCollision()) {\r\n return;\r\n }\r\n super.updateCollision(context);\r\n const meshes = this.scene.getMeshes();\r\n if (!meshes || !meshes.length) {\r\n this._endCollision();\r\n return;\r\n }\r\n\r\n this._updateIconCollision(context.timestamp);\r\n this._meshesToCheck = [];\r\n this._endCollision();\r\n }\r\n\r\n callCurrentTileShader(uniforms, context) {\r\n this.shader.filter = context.sceneFilter ? [this._iconFilter0, context.sceneFilter] : this._iconFilter0;\r\n this.callRenderer(this.shader, uniforms, context);\r\n\r\n this._textShader.filter = context.sceneFilter ? [this._textFilter0, context.sceneFilter] : this._textFilter0;\r\n this.callRenderer(this._textShader, uniforms, context);\r\n }\r\n\r\n callBackgroundTileShader(uniforms, context) {\r\n this.shader.filter = context.sceneFilter ? [this._iconFilter1, context.sceneFilter] : this._iconFilter1;\r\n this.callRenderer(this.shader, uniforms, context);\r\n\r\n this._textShader.filter = context.sceneFilter ? [this._textFilter1, context.sceneFilter] : this._textFilter1;\r\n this.callRenderer(this._textShader, uniforms, context);\r\n }\r\n\r\n isMeshIterable(mesh) {\r\n //halo和正文共享的同一个geometry,无需更新\r\n return mesh && mesh.geometry && !mesh.geometry.properties.isEmpty &&\r\n mesh.material && !mesh.material.get('isHalo') && this.isMeshVisible(mesh) &&\r\n !(this.shouldIgnoreBackground() && !this.layer.getRenderer().isForeground(mesh));\r\n }\r\n\r\n\r\n /**\r\n * 遍历每个icon,判断其是否有碰撞, 如果有,则删除其elements\r\n * @param {Number} timestamp\r\n */\r\n _updateIconCollision(/* timestamp */) {\r\n if (!this.isEnableCollision()) {\r\n return;\r\n }\r\n let meshes = this._meshesToCheck;\r\n if (!meshes || !meshes.length) {\r\n return;\r\n }\r\n\r\n this._updateIconAndText(meshes);\r\n }\r\n // mesh, meshBoxes, matrix, contextIndex.boxIndex++\r\n _updateBox(mesh, meshBoxes, mvpMatrix, globalBoxIndex) {\r\n return this.updateBoxCollisionFading(true, mesh, meshBoxes, mvpMatrix, globalBoxIndex);\r\n }\r\n\r\n isEnableUniquePlacement() {\r\n return this.isEnableCollision() && this.sceneConfig['uniquePlacement'] === true;\r\n }\r\n\r\n _updateIconAndText(meshes) {\r\n const layer = this.layer;\r\n const renderer = layer.getRenderer();\r\n meshes = meshes.sort(sortByLevel);\r\n for (let m = 0; m < meshes.length; m++) {\r\n const mesh = meshes[m];\r\n if (!mesh || !mesh.meshes.length) {\r\n continue;\r\n }\r\n let isIterable = false;\r\n if (mesh.meshes.length === 1) {\r\n isIterable = this.isMeshIterable(mesh.meshes[0]);\r\n } else {\r\n for (let i = 0; i < mesh.meshes.length; i++) {\r\n if (this.isMeshIterable(mesh.meshes[i])) {\r\n isIterable = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!isIterable) {\r\n continue;\r\n }\r\n const isForeground = renderer.isForeground(mesh.meshes[0]);\r\n if (this.shouldIgnoreBackground() && !isForeground) {\r\n continue;\r\n }\r\n const meshKey = mesh.properties.meshKey;\r\n this.startMeshCollision(mesh);\r\n this._startCheckMesh(mesh);\r\n this.forEachBox(mesh, this._updateBox);\r\n this._endCheckMesh(mesh);\r\n this.endMeshCollision(meshKey);\r\n\r\n for (let i = 0; i < mesh.meshes.length; i++) {\r\n this._updateOpacity(mesh.meshes[i]);\r\n }\r\n }\r\n }\r\n\r\n _updateOpacity(mesh) {\r\n const aOpacity = mesh && mesh.geometry && mesh.geometry.properties.aOpacity;\r\n if (aOpacity && aOpacity.dirty) {\r\n mesh.geometry.updateData('aOpacity', aOpacity);\r\n aOpacity.dirty = false;\r\n }\r\n }\r\n\r\n forEachBox(meshGroup, fn) {\r\n const uniqueCollideIds = meshGroup.properties.uniqueCollideIds;\r\n if (!uniqueCollideIds) {\r\n return;\r\n }\r\n const context = { boxIndex: 0 };\r\n const count = uniqueCollideIds.length;\r\n for (let i = 0; i < count; i++) {\r\n this._iterateMeshBox(meshGroup, uniqueCollideIds[i], fn, context);\r\n }\r\n }\r\n\r\n _iterateMeshBox(mesh, collideId, fn, contextIndex) {\r\n const map = this.getMap();\r\n // TODO meshes[0]可能是不合法的数据\r\n const { collideBoxIndex } = mesh.meshes[0].geometry.properties;\r\n const boxInfo = collideBoxIndex && collideBoxIndex[collideId];\r\n if (!boxInfo) {\r\n return false;\r\n }\r\n const matrix = mat4.multiply(PROJ_MATRIX, map.projViewMatrix, mesh.meshes[0].localTransform);\r\n // IconPainter中,一个数据,只会有一个box,所以不需要循环\r\n let meshBoxes;\r\n let updated = false;\r\n const meshes = mesh.meshes;\r\n let count = 0;\r\n for (let j = 0; j < meshes.length; j++) {\r\n if (!this.isMeshIterable(meshes[j])) {\r\n continue;\r\n }\r\n const { collideBoxIndex } = meshes[j].geometry.properties;\r\n const boxInfo = collideBoxIndex[collideId];\r\n if (!boxInfo) {\r\n continue;\r\n }\r\n count++;\r\n }\r\n if (!count) {\r\n return false;\r\n }\r\n meshBoxes = this._getMeshBoxes(count);\r\n let index = 0;\r\n for (let j = 0; j < meshes.length; j++) {\r\n const mesh = meshes[j];\r\n if (!this.isMeshIterable(mesh)) {\r\n continue;\r\n }\r\n updated = true;\r\n const geoProps = meshes[j].geometry.properties;\r\n const { elements, aCount, collideBoxIndex } = geoProps;\r\n const boxInfo = collideBoxIndex[collideId];\r\n if (!boxInfo) {\r\n continue;\r\n }\r\n const [start, end, boxCount] = boxInfo;\r\n let charCount = 1;\r\n if (aCount) {\r\n charCount = aCount[elements[start]];\r\n }\r\n const startIndex = start + 0 * charCount * BOX_ELEMENT_COUNT;\r\n meshBoxes[index].mesh = meshes[j];\r\n meshBoxes[index].start = startIndex;\r\n meshBoxes[index].end = end;//startIndex + charCount * BOX_ELEMENT_COUNT;\r\n meshBoxes[index].boxCount = geoProps.glyphAtlas ? charCount : boxCount;\r\n meshBoxes[index].allElements = elements;\r\n index++;\r\n }\r\n\r\n if (!updated) {\r\n return false;\r\n }\r\n const visible = fn.call(this, mesh, meshBoxes, matrix, contextIndex.boxIndex++);\r\n\r\n if (visible) {\r\n this._markerVisible(mesh, collideId);\r\n }\r\n return true;\r\n }\r\n\r\n _startCheckMesh(mesh) {\r\n const meshes = mesh.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 (!geometry) {\r\n continue;\r\n }\r\n geometry.properties.visElemts.count = 0;\r\n }\r\n }\r\n\r\n _markerVisible(mesh, pickingId) {\r\n const meshes = mesh.meshes;\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n if (mesh.properties.isHalo) {\r\n continue;\r\n }\r\n const geometry = mesh && mesh.geometry;\r\n if (!geometry || geometry.properties.isEmpty) {\r\n continue;\r\n }\r\n const { collideBoxIndex, elements, visElemts } = geometry.properties;\r\n const boxInfo = collideBoxIndex[pickingId];\r\n if (!boxInfo) {\r\n continue;\r\n }\r\n const [start, end] = boxInfo;\r\n let count = visElemts.count;\r\n for (let i = start; i < end; i++) {\r\n visElemts[count++] = elements[i];\r\n }\r\n visElemts.count = count;\r\n }\r\n }\r\n\r\n _endCheckMesh(mesh) {\r\n const meshes = mesh.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 (!geometry) {\r\n continue;\r\n }\r\n const { visElemts } = geometry.properties;\r\n geometry.setElements(visElemts, visElemts.count);\r\n }\r\n }\r\n\r\n isBoxCollides(mesh, elements, boxCount, start, end, matrix) {\r\n if (this._isTextGeo(mesh.geometry)) {\r\n return isLabelCollides.call(this, 0, mesh, elements, boxCount, start, end, matrix);\r\n }\r\n if (mesh.geometry.properties.isEmpty) {\r\n return EMPTY_COLLISION;\r\n }\r\n\r\n const { aTerrainAltitude } = mesh.geometry.properties;\r\n if (aTerrainAltitude) {\r\n const altitude = aTerrainAltitude[elements[start] * 2];\r\n if (altitude === INVALID_ALTITUDE) {\r\n return EMPTY_COLLISION;\r\n }\r\n }\r\n\r\n const map = this.getMap();\r\n const { boxes: iconBoxes, collision } = this._getCollideBoxes(mesh, start);\r\n let collides = 0;\r\n\r\n let offscreenCount = 0;\r\n let boxIndex = 0;\r\n //insert every character's box into collision index\r\n for (let j = start; j < end; j += BOX_ELEMENT_COUNT) {\r\n const boxArr = iconBoxes[boxIndex] = iconBoxes[boxIndex] || [];\r\n boxIndex++;\r\n //use int16array to save some memory\r\n const box = getIconBox.call(this, boxArr, mesh, elements[j], matrix, map);\r\n // iconBoxes.push(box);\r\n if (!collides) {\r\n const boxCollides = this.isCollides(box);\r\n if (boxCollides === 1) {\r\n collides = 1;\r\n } else if (boxCollides === -1) {\r\n //offscreen\r\n offscreenCount++;\r\n }\r\n }\r\n }\r\n if (offscreenCount === boxCount) {\r\n //所有box都offscreen时,可认为存在碰撞\r\n collides = -1;\r\n }\r\n collision.collides = collides;\r\n return collision;\r\n }\r\n\r\n deleteMesh(meshes, keepGeometry) {\r\n if (!meshes) {\r\n return;\r\n }\r\n if (meshes instanceof CollisionGroup) {\r\n meshes = meshes.meshes;\r\n }\r\n if (keepGeometry) {\r\n //keepGeometry时,文字纹理应该保留\r\n if (Array.isArray(meshes)) {\r\n meshes.forEach(m => {\r\n if (m && m.material) {\r\n delete m.material.uniforms.iconTex;\r\n }\r\n });\r\n } else if (meshes.material) {\r\n delete meshes.material.uniforms.iconTex;\r\n }\r\n }\r\n super.deleteMesh(meshes, keepGeometry);\r\n }\r\n\r\n isBloom(mesh) {\r\n const isMarker = mesh && mesh.material && !isNil(mesh.material.get('markerOpacity'));\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n return !!(isMarker ? symbol['markerBloom'] : symbol['textBloom']);\r\n }\r\n\r\n isUniqueStencilRefPerTile() {\r\n return false;\r\n }\r\n\r\n init() {\r\n const regl = this.regl;\r\n const canvas = this.canvas;\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n\r\n // 地形瓦片中可能设置viewport\r\n const viewport = {\r\n x: (_, props) => {\r\n return props.viewport ? props.viewport.x : 0;\r\n },\r\n y: (_, props) => {\r\n return props.viewport ? props.viewport.y : 0;\r\n },\r\n width: (_, props) => {\r\n return props.viewport ? props.viewport.width : (canvas ? canvas.width : 1);\r\n },\r\n height: (_, props) => {\r\n return props.viewport ? props.viewport.height : (canvas ? canvas.height : 1);\r\n },\r\n };\r\n\r\n const iconExtraCommandProps = {\r\n viewport,\r\n stencil: {\r\n enable: true,\r\n func: {\r\n cmp: '<=',\r\n ref: (context, props) => {\r\n return props.stencilRef;\r\n }\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add',\r\n // color: [0, 0, 0, 0]\r\n },\r\n depth: {\r\n enable: true,\r\n range: () => {\r\n return this.sceneConfig.depthRange || [0, 1];\r\n },\r\n func: () => {\r\n return this.sceneConfig.depthFunc || 'always';\r\n },\r\n mask: isNil(this.sceneConfig.depthMask) ? true : this.sceneConfig.depthMask\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n };\r\n this.shader = new reshader.MeshShader({\r\n vert, frag,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n return mat4.multiply([], props['projViewMatrix'], props['modelMatrix']);\r\n }\r\n },\r\n {\r\n name: 'zoomScale',\r\n type: 'function',\r\n fn: function (context, props) {\r\n return props['tileResolution'] / props['resolution'];\r\n }\r\n }\r\n ],\r\n extraCommandProps: iconExtraCommandProps\r\n });\r\n this.shader.version = 300;\r\n\r\n const { uniforms, extraCommandProps } = createTextShader.call(this, canvas, this.sceneConfig);\r\n //icon的text在intel gpu下不会引起崩溃,可以关闭模板\r\n // extraCommandProps.stencil.enable = false;\r\n const defines = this._textDefines || {};\r\n this._textShader = new reshader.MeshShader({\r\n vert: textVert, frag: textFrag,\r\n uniforms,\r\n extraCommandProps,\r\n defines\r\n });\r\n\r\n if (this.pickingFBO) {\r\n const markerPicking = new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + pickingVert,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n return mat4.multiply([], props['projViewMatrix'], props['modelMatrix']);\r\n }\r\n },\r\n {\r\n name: 'zoomScale',\r\n type: 'function',\r\n fn: function (context, props) {\r\n return props['tileResolution'] / props['resolution'];\r\n }\r\n }\r\n ],\r\n extraCommandProps: iconExtraCommandProps\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n );\r\n markerPicking.filter = mesh => {\r\n return !!mesh.geometry.properties.iconAtlas;\r\n };\r\n\r\n const textPicking = new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + textPickingVert,\r\n uniforms,\r\n extraCommandProps\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n );\r\n textPicking.filter = mesh => {\r\n return !!mesh.geometry.properties.glyphAtlas;\r\n };\r\n\r\n this.picking = [markerPicking, textPicking];\r\n }\r\n }\r\n\r\n getUniformValues(map, context) {\r\n const isRenderingTerrainSkin = context && context.isRenderingTerrainSkin;\r\n const tileSize = this.layer.getTileSize().width;\r\n const projViewMatrix = isRenderingTerrainSkin ? IDENTITY_ARR : map.projViewMatrix;\r\n\r\n const cameraToCenterDistance = map.cameraToCenterDistance;\r\n const canvasSize = vec2.set(TEMP_CANVAS_SIZE, map.width, map.height);\r\n if (isRenderingTerrainSkin) {\r\n vec2.set(canvasSize, tileSize, tileSize);\r\n }\r\n const blendFunc = this.getBlendFunc();\r\n const blendSrc = maptalks.Util.isFunction(blendFunc.src) ? blendFunc.src() : blendFunc.src;\r\n return {\r\n layerScale: this.layer.options['styleScale'] || 1,\r\n mapPitch: map.getPitch() * Math.PI / 180,\r\n mapRotation: map.getBearing() * Math.PI / 180,\r\n projViewMatrix,\r\n cameraToCenterDistance,\r\n canvasSize,\r\n iconSize: ICON_SIZE_ARR,\r\n resolution: map.getResolution(),\r\n\r\n //text uniforms\r\n glyphSize: GLYPH_SIZE,\r\n // gammaScale : 0.64,\r\n gammaScale: GAMMA_SCALE,\r\n\r\n blendSrcIsOne: +(!!(blendSrc === 'one' || blendSrc === 1)),\r\n viewport: isRenderingTerrainSkin && context && context.viewport,\r\n isRenderingTerrain: +!!isRenderingTerrainSkin\r\n };\r\n }\r\n\r\n getUniqueEntryKey(mesh, idx) {\r\n if (!this._isTextGeo(mesh.geometry)) {\r\n return null;\r\n }\r\n const { elements } = mesh.geometry.properties;\r\n return getLabelEntryKey(mesh, elements[idx]);\r\n }\r\n\r\n _isMarkerGeo(geo) {\r\n const { symbolIndex } = geo.properties;\r\n return symbolIndex.type === 0;\r\n }\r\n\r\n _isTextGeo(geo) {\r\n const { symbolIndex } = geo.properties;\r\n return symbolIndex.type === 1;\r\n }\r\n}\r\n\r\n// function sorting(a) {\r\n// //empty只会当symbol只有text没有icon时出现\r\n// if (a && (a.iconAtlas || a.empty)) {\r\n// return -1;\r\n// }\r\n// return 1;\r\n// }\r\n\r\nfunction sortByLevel(m0, m1) {\r\n return m0.properties.level - m1.properties.level || m0.properties.meshKey - m1.properties.meshKey;\r\n}\r\n\r\nexport default IconPainter;\r\n","import { vec2, vec3 } from '@maptalks/gl';\r\nimport { getLineOffset } from './line_offset';\r\n\r\n\r\nconst GLYPH_OFFSET = [], SEGMENT = [], DXDY = [];\r\n\r\nexport function getCharOffset(out, mesh, textSize, line, i, projectedAnchor, anchor, scale, flip, elevatedAnchor, vtLayer, mvpMatrix, isPitchWithMap) {\r\n // 遍历每个文字,对每个文字获取: anchor, glyphOffset, dx, dy\r\n // 计算anchor的屏幕位置\r\n // 根据地图pitch和cameraDistanceFromCenter计算glyph的perspective ratio\r\n // 从 aSegment 获取anchor的segment, startIndex 和 lineLength\r\n // 调用 line_offset.js 计算文字的 offset 和 angle\r\n // 与aDxDy和aRotation相加后,写回到 aOffset 和 aRotation 中\r\n\r\n\r\n const { aGlyphOffset, aSegment, aTextDx, aTextDy, symbolIndex } = mesh.geometry.properties;\r\n const symbol = this.getSymbol(symbolIndex);\r\n const textDx = aTextDx ? aTextDx[i] : symbol['textDx'];\r\n const textDy = aTextDy ? aTextDy[i] : symbol['textDy'];\r\n const dxdy = vec2.set(DXDY, textDx || 0, textDy || 0);\r\n\r\n const glyphOffset = vec2.set(GLYPH_OFFSET, aGlyphOffset[i * 2], aGlyphOffset[i * 2 + 1]),\r\n segment = vec3.set(SEGMENT, aSegment[i * 3], aSegment[i * 3 + 1], aSegment[i * 3 + 2]);\r\n\r\n const offset = getLineOffset(out, mesh, line, projectedAnchor, anchor, glyphOffset, dxdy[0], dxdy[1], segment[0], segment[1], segment[2], textSize / 24, flip, scale, elevatedAnchor, vtLayer, mvpMatrix, isPitchWithMap);\r\n return offset;\r\n}\r\n","import { vec2, vec3 } from '@maptalks/gl';\r\nimport { getCharOffset } from './get_char_offset';\r\n\r\nconst FIRST_POINT = [], LAST_POINT = [];\r\n\r\nexport function getLabelNormal(firstCharOffset, lastCharOffset, mesh, textSize, line, firstChrIdx, lastChrIdx, projectedAnchor, anchor, scale, aspectRatio, planeMatrix) {\r\n const { aVertical } = mesh.geometry.properties;\r\n const isVertical = aVertical[firstChrIdx];\r\n\r\n //一个feature中包含多个文字的anchor\r\n //1. 遍历anchor\r\n //2. 读取anchor第一个文字和最后一个文字的位置\r\n //3. 计算flip和vertical的值并设置\r\n\r\n let offset = getCharOffset.call(this, FIRST_POINT, mesh, textSize, line, firstChrIdx, projectedAnchor, anchor, scale, false);\r\n if (!offset) {\r\n return null;\r\n }\r\n vec3.copy(firstCharOffset, offset);\r\n offset = getCharOffset.call(this, LAST_POINT, mesh, textSize, line, lastChrIdx, projectedAnchor, anchor, scale, false);\r\n if (!offset) {\r\n return null;\r\n }\r\n vec3.copy(lastCharOffset, offset);\r\n if (planeMatrix) {\r\n vec2.transformMat2(FIRST_POINT, FIRST_POINT, planeMatrix);\r\n vec2.transformMat2(LAST_POINT, LAST_POINT, planeMatrix);\r\n }\r\n let vertical, flip;\r\n if (!isVertical) {\r\n vertical = 0;\r\n flip = FIRST_POINT[0] > LAST_POINT[0] ? 1 : 0;\r\n } else {\r\n const rise = Math.abs(LAST_POINT[1] - FIRST_POINT[1]);\r\n const run = Math.abs(LAST_POINT[0] - FIRST_POINT[0]) * aspectRatio;\r\n flip = FIRST_POINT[0] > LAST_POINT[0] ? 1 : 0;\r\n if (rise > run) {\r\n vertical = 1;\r\n flip = FIRST_POINT[1] < LAST_POINT[1] ? 0 : 1;\r\n } else {\r\n vertical = 0;\r\n }\r\n }\r\n // flip = 1;\r\n // vertical = FIRST_POINT[0] > LAST_POINT[0] ? 1 : 0;\r\n // vertical = 1;\r\n\r\n return 2 * flip + vertical;\r\n}\r\n","import { vec2, vec3, vec4, mat2, mat4, reshader, quat } from '@maptalks/gl';\r\nimport { interpolated, isFunctionDefinition } from '@maptalks/function-type';\r\nimport CollisionPainter from './CollisionPainter';\r\nimport { extend, isNil } from '../Util';\r\nimport { getCharOffset } from './util/get_char_offset';\r\nimport { projectLine } from './util/projection';\r\nimport { getLabelNormal } from './util/get_label_normal';\r\nimport vert from './glsl/text.vert';\r\nimport vertAlongLine from './glsl/text.line.vert';\r\nimport frag from './glsl/text.frag';\r\nimport pickingVert from './glsl/text.vert';\r\nimport linePickingVert from './glsl/text.line.vert';\r\nimport { projectPoint } from './util/projection';\r\nimport { getShapeMatrix } from './util/box_util';\r\nimport { createTextMesh, DEFAULT_UNIFORMS, createTextShader, GAMMA_SCALE, getTextFnTypeConfig, isLabelCollides, getLabelEntryKey } from './util/create_text_painter';\r\nimport { GLYPH_SIZE } from './Constant';\r\nimport { TextUtil, PackUtil, FilterUtil } from '@maptalks/vector-packer';\r\nimport { getCentiMeterScale } from '../../../common/Util';\r\nimport { INVALID_PROJECTED_ANCHOR, INVALID_ALTITUDE } from '../../../common/Constant';\r\n\r\nconst shaderFilter0 = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n return !this._isHalo0(mesh) && renderer.isTileNearCamera(mesh) && mesh.geometry.properties.textPlacement !== 'line';\r\n};\r\n\r\nconst shaderFilterN = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n return !this._isHalo0(mesh) && !renderer.isForeground(mesh) && mesh.geometry.properties.textPlacement !== 'line';\r\n};\r\n\r\nconst shaderLineFilter0 = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n return !this._isHalo0(mesh) && renderer.isTileNearCamera(mesh) && mesh.geometry.properties.textPlacement === 'line';\r\n};\r\n\r\nconst shaderLineFilterN = function (mesh) {\r\n const renderer = this.layer.getRenderer();\r\n const z = mesh.properties.tile.z;\r\n const currentZoom = renderer.getCurrentTileZoom();\r\n return !this._isHalo0(mesh) && !renderer.isForeground(mesh) && mesh.geometry.properties.textPlacement === 'line' && z < currentZoom;\r\n};\r\n\r\n//label box 或 icon box 对应的element数量\r\nconst BOX_ELEMENT_COUNT = 6;\r\n\r\n// 线有坡度且文字的pitchAlignment为map时,Z轴上的偏移量,以避免文字和线的深度冲突\r\nconst Z_AXIS_OFFSET = [0, 0, 3];\r\n\r\n// temparary variables used later\r\nconst PROJ_MATRIX = [], CHAR_OFFSET = [];\r\n\r\nconst PLANE_MATRIX = [];\r\n\r\nconst ANCHOR = [], PROJ_ANCHOR = [];\r\n\r\nconst MAT2 = [];\r\n\r\nconst SHAPE = [], OFFSET = [], AXIS_FACTOR = [1, -1];\r\n\r\nconst INT16 = new Int16Array(3);\r\n\r\nconst TEMP_QUAT = [];\r\nconst TEMP_MAT4 = [];\r\nconst TEMP_MAT4_1 = [];\r\nconst TEMP_AXIS = [];\r\nconst TEMP_CANVAS_SIZE = [];\r\n\r\nconst FIRST_CHAROFFSET = [], LAST_CHAROFFSET = [];\r\n\r\nconst params = {};\r\nconst feature = {};\r\nconst featureState = {};\r\nconst availableImages = [];\r\n\r\nconst ELEVATED_ANCHOR = [];\r\n\r\nconst IDENTITY_ARR = mat4.identity([]);\r\n\r\nconst BOX = [];\r\n\r\nexport default class TextPainter extends CollisionPainter {\r\n static getBloomSymbol() {\r\n return ['textBloom'];\r\n }\r\n\r\n constructor(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig) {\r\n super(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig);\r\n this.propAllowOverlap = 'textAllowOverlap';\r\n this.propIgnorePlacement = 'textIgnorePlacement';\r\n // this.layer.getRenderer().canvas.addEventListener('webglcontextlost', e => {\r\n // console.log(JSON.stringify(layer.getMap().getView()));\r\n // const arr = new Int16Array(this._buffer);\r\n // const arr2 = [];\r\n // for (let i = 0; i < arr.length; i += 2) {\r\n // arr2.push('[' + arr[i] + ',' + arr[i + 1] + ']');\r\n // }\r\n // console.log(arr2.join());\r\n // // // const rotations = new Int16Array(arr.length / 4);\r\n // // // for (let i = 0; i < rotations.length; i++) {\r\n // // // rotations[i] = arr[i * 4 + 2] / 91;\r\n // // // }\r\n // // console.log(this._rotations.join());\r\n // e.preventDefault();\r\n\r\n // }, false);\r\n this.colorCache = {};\r\n this._filter0 = shaderFilter0.bind(this);\r\n this._filter1 = shaderFilterN.bind(this);\r\n this._lineFilter0 = shaderLineFilter0.bind(this);\r\n this._lineFilter1 = shaderLineFilterN.bind(this);\r\n this.isLabelCollides = isLabelCollides.bind(this);\r\n this._genTextNames();\r\n }\r\n\r\n prepareRender(...args) {\r\n super.prepareRender(...args);\r\n // maptalks/issues#336\r\n const meshes = this.scene.getMeshes();\r\n if (!meshes || !meshes.length) {\r\n return;\r\n }\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (meshes[i].properties.isHalo) {\r\n continue;\r\n }\r\n const { haloMesh } = meshes[i].properties;\r\n if (haloMesh.dirtyDefines) {\r\n meshes[i].setDefines(haloMesh.defines);\r\n }\r\n }\r\n }\r\n\r\n updateSymbol(...args) {\r\n this._tagTerrainVector = undefined;\r\n this._tagTerrainSkin = undefined;\r\n const refresh = super.updateSymbol(...args);\r\n this._genTextNames();\r\n return refresh;\r\n }\r\n\r\n isTerrainVector() {\r\n if (!super.isTerrainSkin()) {\r\n return false;\r\n }\r\n if (this._tagTerrainVector !== undefined) {\r\n return this._tagTerrainVector;\r\n }\r\n for (let i = 0; i < this.symbolDef.length; i++) {\r\n const symbolDef = this.symbolDef[i];\r\n const pitchAlignment = symbolDef['textPitchAlignment'];\r\n if (pitchAlignment !== 'map') {\r\n this._tagTerrainVector = true;\r\n return true;\r\n }\r\n }\r\n this._tagTerrainVector = false;\r\n return false;\r\n }\r\n\r\n isTerrainSkin() {\r\n if (!super.isTerrainSkin()) {\r\n return false;\r\n }\r\n if (this._tagTerrainSkin !== undefined) {\r\n return this._tagTerrainSkin;\r\n }\r\n for (let i = 0; i < this.symbolDef.length; i++) {\r\n const symbolDef = this.symbolDef[i];\r\n const pitchAlignment = symbolDef['textPitchAlignment'];\r\n if (pitchAlignment === 'map' || isFunctionDefinition(pitchAlignment) || FilterUtil.isExpression(pitchAlignment)) {\r\n this._tagTerrainSkin = true;\r\n return true;\r\n }\r\n }\r\n this._tagTerrainSkin = false;\r\n return false;\r\n }\r\n\r\n _genTextNames() {\r\n this._textNameFn = [];\r\n for (let i = 0; i < this.symbolDef.length; i++) {\r\n const symbolDef = this.symbolDef[i];\r\n if (FilterUtil.isExpression(symbolDef['textName'])) {\r\n const expression = FilterUtil.createExpression(symbolDef['textName'], 'string');\r\n this._textNameFn[i] = (zoom, properties) => {\r\n params.zoom = zoom;\r\n feature.properties = properties;\r\n let v;\r\n try {\r\n v = expression.evaluateWithoutErrorHandling(params, feature, featureState, null, availableImages);\r\n } catch (err) {\r\n v = null;\r\n }\r\n\r\n return v;\r\n };\r\n } else if (isFunctionDefinition(symbolDef['textName'])) {\r\n this._textNameFn[i] = interpolated(symbolDef['textName']);\r\n }\r\n }\r\n }\r\n\r\n shouldDeleteMeshOnUpdateSymbol(symbol) {\r\n if (!Array.isArray(symbol)) {\r\n return (symbol.textHaloRadius === 0 || this.symbolDef[0].textHaloRadius === 0) && symbol.textHaloRadius !== this.symbolDef[0].textHaloRadius;\r\n } else {\r\n for (let i = 0; i < symbol.length; i++) {\r\n if (!symbol[i]) {\r\n continue;\r\n }\r\n if ((symbol[i].textHaloRadius === 0 || this.symbolDef[i].textHaloRadius === 0) && symbol[i].textHaloRadius !== this.symbolDef[i].textHaloRadius) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n return getTextFnTypeConfig(map, symbolDef);\r\n }\r\n\r\n isBloom(mesh) {\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n const bloomSymbol = TextPainter.getBloomSymbol()[0];\r\n return !!symbol[bloomSymbol];\r\n }\r\n\r\n createGeometry(glData, features, index) {\r\n const pack = glData;\r\n if (!pack.glyphAtlas) {\r\n return null;\r\n }\r\n const geo = super.createGeometry(pack, features);\r\n if (!geo || !geo.geometry) {\r\n return null;\r\n }\r\n const { geometry } = geo;\r\n if (geometry.properties.glyphAtlas) {\r\n this.drawDebugAtlas(geometry.properties.glyphAtlas);\r\n }\r\n if (geometry && pack.lineVertex) {\r\n geometry.properties.line = pack.lineVertex;\r\n //原先createGeometry返回的geometry有多个,line.id用来区分是第几个geometry\r\n //现在geometry只会有一个,所以统一为0\r\n geometry.properties.line.id = index;\r\n }\r\n return geo;\r\n }\r\n\r\n createMesh(geo, transform, { tileVectorTransform }) {\r\n const enableCollision = this.isEnableCollision();\r\n const enableUniquePlacement = this.isEnableUniquePlacement();\r\n const { geometry, symbolIndex } = geo;\r\n geometry.properties.symbolIndex = symbolIndex;\r\n const symbol = this.getSymbol(symbolIndex);\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n const mesh = createTextMesh.call(this, this.regl, geometry, transform, symbolDef, symbol, fnTypeConfig, this.layer.options['collision'], !enableCollision, enableUniquePlacement);\r\n if (mesh.length) {\r\n const isLinePlacement = geometry.properties.textPlacement === 'line';\r\n //tags for picking\r\n if (isLinePlacement) {\r\n this._hasLineText = true;\r\n } else {\r\n this._hasNormalText = true;\r\n }\r\n }\r\n mesh.forEach(m => {\r\n m.positionMatrix = this.getAltitudeOffsetMatrix();\r\n m.properties.tileVectorTransform = tileVectorTransform;\r\n });\r\n return mesh;\r\n }\r\n\r\n updateCollision(context) {\r\n super.updateCollision(context);\r\n const meshes = this.scene.getMeshes();\r\n if (!meshes || !meshes.length) {\r\n this._endCollision();\r\n return;\r\n }\r\n\r\n this._projectedLinesCache = {};\r\n this._updateLabels(context.timestamp);\r\n this._endCollision();\r\n }\r\n\r\n callCurrentTileShader(uniforms, context) {\r\n // let size = 0;\r\n // const meshes = this.scene.getMeshes();\r\n // for (let i = 0; i < meshes.length; i++) {\r\n // if (meshes[i].geometry.properties.memory) {\r\n // size += meshes[i].geometry.properties.memory;\r\n // }\r\n // }\r\n // console.log('Buffer内存总大小', size);\r\n\r\n //1. render current tile level's meshes\r\n this.shader.filter = context.sceneFilter ? [this._filter0, context.sceneFilter] : this._filter0;\r\n this.callRenderer(this.shader, uniforms, context);\r\n\r\n this._shaderAlongLine.filter = context.sceneFilter ? [this._lineFilter0, context.sceneFilter] : this._lineFilter0;\r\n this.callRenderer(this._shaderAlongLine, uniforms, context);\r\n }\r\n\r\n callBackgroundTileShader(uniforms, context) {\r\n this.shader.filter = context.sceneFilter ? [this._filter1, context.sceneFilter] : this._filter1;\r\n this.callRenderer(this.shader, uniforms, context);\r\n\r\n this._shaderAlongLine.filter = context.sceneFilter ? [this._lineFilter1, context.sceneFilter] : this._lineFilter1;\r\n this.callRenderer(this._shaderAlongLine, uniforms, context);\r\n }\r\n\r\n callRenderer(shader, uniforms, context) {\r\n if (context && context.isRenderingTerrain && isFunctionDefinition(this.symbolDef.textPitchAlignment)) {\r\n if (context.isRenderingTerrainSkin) {\r\n // 过滤掉 pitchAlignment 为 viewport 的数据\r\n uniforms.textPitchFilter = 1;\r\n } else {\r\n // 过滤掉 pitchAlignment 为 map 的数据\r\n uniforms.textPitchFilter = 2;\r\n }\r\n }\r\n\r\n super.callRenderer(shader, uniforms, context);\r\n }\r\n\r\n /**\r\n * update flip and vertical data for each text\r\n */\r\n _updateLabels(/* timestamp */) {\r\n let meshes = this.scene.getMeshes();\r\n if (!meshes || !meshes.length) {\r\n return;\r\n }\r\n\r\n const map = this.getMap();\r\n const bearing = -map.getBearing() * Math.PI / 180;\r\n const planeMatrix = mat2.fromRotation(PLANE_MATRIX, bearing);\r\n //boxVisible, mesh, meshBoxes, mvpMatrix, boxIndex\r\n const fn = (visElemts, meshBoxes, mvpMatrix, labelIndex) => {\r\n // debugger\r\n const { start, end, mesh, allElements: elements } = meshBoxes[0];\r\n const visible = this.updateBoxCollisionFading(true, mesh, meshBoxes, mvpMatrix, labelIndex);\r\n if (visible) {\r\n let count = visElemts.count;\r\n for (let i = start; i < end; i++) {\r\n // visElemts.push(elements[i]);\r\n visElemts[count++] = elements[i];\r\n }\r\n visElemts.count = count;\r\n }\r\n };\r\n const enableCollision = this.isEnableCollision();\r\n const renderer = this.layer.getRenderer();\r\n\r\n // console.log('meshes数量', meshes.length, '字符数量', meshes.reduce((v, mesh) => {\r\n // return v + mesh.geometry.count / BOX_ELEMENT_COUNT;\r\n // }, 0));\r\n // console.log(meshes.map(m => m.properties.meshKey));\r\n meshes = meshes.sort(sortByLevel);\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n if (!this.isMeshIterable(mesh)) {\r\n continue;\r\n }\r\n const isNearCamera = renderer.isTileNearCamera(mesh);\r\n if (!isNearCamera) {\r\n const { visElemts } = mesh.geometry.properties;\r\n if (visElemts) {\r\n visElemts.count = 0;\r\n }\r\n mesh.geometry.setElements(visElemts, 0);\r\n continue;\r\n }\r\n const geometry = mesh.geometry;\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n // mesh.properties.textSize = !isNil(symbol['textSize']) ? symbol['textSize'] : DEFAULT_UNIFORMS['textSize'];\r\n mesh.properties.textHaloRadius = !isNil(symbol['textHaloRadius']) ? symbol['textHaloRadius'] : DEFAULT_UNIFORMS['textHaloRadius'];\r\n\r\n // const idx = geometry.properties.aPickingId[0];\r\n // console.log(`图层:${geometry.properties.features[idx].feature.layer},数据数量:${geometry.count / BOX_ELEMENT_COUNT}`);\r\n const meshKey = mesh.properties.meshKey;\r\n if (geometry.properties.textPlacement === 'line') {\r\n //line placement\r\n if (!geometry.properties.line) {\r\n continue;\r\n }\r\n if (enableCollision) {\r\n this.startMeshCollision(mesh);\r\n }\r\n this._updateLineLabel(mesh, planeMatrix);\r\n const { aOffset, aOpacity } = geometry.properties;\r\n if (aOffset.dirty) {\r\n geometry.updateData('aOffset', aOffset);\r\n aOffset.dirty = false;\r\n }\r\n if (aOpacity && aOpacity.dirty) {\r\n geometry.updateData('aOpacity', aOpacity);\r\n aOpacity.dirty = false;\r\n }\r\n if (enableCollision) {\r\n this.endMeshCollision(meshKey);\r\n }\r\n } else if (enableCollision) {\r\n this.startMeshCollision(mesh);\r\n const { elements, aOpacity, visElemts } = geometry.properties;\r\n visElemts.count = 0;\r\n this.forEachBox(mesh, (mesh, meshBoxes, mvpMatrix, labelIndex, label) => {\r\n fn(visElemts, meshBoxes, mvpMatrix, labelIndex, label);\r\n });\r\n\r\n if (aOpacity && aOpacity.dirty) {\r\n geometry.updateData('aOpacity', aOpacity);\r\n }\r\n const allVisilbe = visElemts.count === elements.length && geometry.count === elements.length;\r\n const allHided = !visElemts.count && !geometry.count;\r\n if (!allVisilbe && !allHided) {\r\n geometry.setElements(visElemts, visElemts.count);\r\n }\r\n this.endMeshCollision(meshKey);\r\n }\r\n }\r\n }\r\n\r\n isMeshIterable(mesh) {\r\n //halo和正文共享的同一个geometry,无需更新\r\n return mesh.isValid() && mesh.material && !mesh.material.get('isHalo') && !(this.shouldIgnoreBackground() && !this.layer.getRenderer().isForeground(mesh));\r\n }\r\n\r\n isMeshUniquePlaced(mesh) {\r\n if (!this.isMeshIterable(mesh)) {\r\n return false;\r\n }\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n return symbol['textPlacement'] !== 'line';\r\n }\r\n\r\n getUniqueEntryKey(mesh, idx) {\r\n return getLabelEntryKey(mesh, idx);\r\n }\r\n\r\n _updateLineLabel(mesh, planeMatrix) {\r\n const map = this.getMap(),\r\n geometry = mesh.geometry,\r\n geometryProps = geometry.properties;\r\n //pitch不跟随map时,需要根据屏幕位置实时计算各文字的位置和旋转角度并更新aOffset和aRotation\r\n //pitch跟随map时,根据line在tile内的坐标计算offset和rotation,只需要计算更新一次\r\n //aNormal在两种情况都要实时计算更新\r\n let line = geometryProps.line;\r\n if (!line) {\r\n return;\r\n }\r\n const pitch = map.getPitch();\r\n const bearing = map.getBearing();\r\n const { lineTextPitch: linePitch, lineTextBearing: lineBearing } = mesh.properties;\r\n\r\n // this._counter++;\r\n\r\n const uniforms = mesh.material.uniforms;\r\n const isPitchWithMap = uniforms['pitchWithMap'] === 1;\r\n\r\n const allElements = geometryProps.elements;\r\n\r\n //pitchWithMap 而且 offset, rotation都更新过了,才能直接用allElements\r\n\r\n if (!isPitchWithMap) {\r\n const matrix = mat4.multiply(PROJ_MATRIX, map.projViewMatrix, mesh.localTransform);\r\n //project line to screen coordinates\r\n //line.id都为0,但不同的tile, matrix是不同的,故可以用matrix作为hash id\r\n const id = line.id + '-' + matrix.join();\r\n let out;\r\n if (this._projectedLinesCache[id]) {\r\n line = this._projectedLinesCache[id];\r\n } else {\r\n out = geometryProps.projectedLine = geometryProps.projectedLine || new Array(line.length);\r\n line = this._projectLine(out, line, matrix, map.width, map.height);\r\n this._projectedLinesCache[id] = out;\r\n }\r\n }\r\n const enableCollision = this.isEnableCollision();\r\n const visElemts = geometry.properties.visElemts = geometry.properties.visElemts || new allElements.constructor(allElements.length);\r\n const visCache = geometry.properties.visCache = geometry.properties.visCache || [];\r\n if (enableCollision) {\r\n visElemts.count = 0;\r\n }\r\n const needUpdate = linePitch === undefined || !map.isInteracting() || (Math.abs(pitch - linePitch) > 2 || Math.abs(bearing - lineBearing) > 2);\r\n if (needUpdate) {\r\n // label box 刷新后,强制将 this._meshCollisionStale 设为true, 避免在updateBoxCollisionFading方法中仍旧使用缓存的collision对象。\r\n this._meshCollisionStale = true;\r\n }\r\n this.forEachBox(mesh, (mesh, meshBoxes, mvpMatrix, labelIndex) => {\r\n const { start, end } = meshBoxes[0];\r\n let visible = visCache[labelIndex];\r\n if (visible === undefined || needUpdate) {\r\n visible = this._updateLabelAttributes(mesh, allElements, start, end, line, mvpMatrix, isPitchWithMap ? planeMatrix : null, labelIndex);\r\n }\r\n visCache[labelIndex] = visible;\r\n // const meshKey = mesh.properties.meshKey;\r\n // let collision = this.getCachedCollision(meshKey, labelIndex);\r\n // let visible = true;\r\n // if (!collision || this.isCachedCollisionStale(meshKey)) {\r\n // visible = this._updateLabelAttributes(mesh, allElements, start, end, line, mvpMatrix, isPitchWithMap ? planeMatrix : null, labelIndex);\r\n // }\r\n if (!enableCollision) {\r\n //offset 计算 miss,则立即隐藏文字,不进入fading\r\n return;\r\n }\r\n visible = this.updateBoxCollisionFading(visible, mesh, meshBoxes, mvpMatrix, labelIndex);\r\n if (visible) {\r\n let count = visElemts.count;\r\n for (let i = start; i < end; i++) {\r\n visElemts[count++] = allElements[i];\r\n }\r\n visElemts.count = count;\r\n }\r\n });\r\n if (needUpdate) {\r\n mesh.properties.lineTextPitch = pitch;\r\n mesh.properties.lineTextBearing = bearing;\r\n }\r\n const aAltitudeArr = mesh.geometry.properties.aAltitude;\r\n if (aAltitudeArr && aAltitudeArr.dirty) {\r\n geometry.updateData('aAltitude', aAltitudeArr);\r\n aAltitudeArr.dirty = false;\r\n }\r\n if (enableCollision && (visElemts.count !== allElements.length || geometry.count !== visElemts.count)) {\r\n geometry.setElements(visElemts, visElemts.count);\r\n // console.log('绘制', visibleElements.length / 6, '共', allElements.length / 6);\r\n }\r\n }\r\n\r\n _projectLine(out, line, matrix, width, height) {\r\n const prjLine = projectLine(out, line, matrix, width, height);\r\n return prjLine;\r\n }\r\n\r\n forEachBox(mesh, fn) {\r\n const map = this.getMap();\r\n const matrix = mat4.multiply(PROJ_MATRIX, map.projViewMatrix, mesh.properties.tileVectorTransform);\r\n const { collideIds, aCount, features, elements } = mesh.geometry.properties;\r\n const ids = collideIds;\r\n if (!ids) {\r\n return;\r\n }\r\n const enableUniquePlacement = this.isEnableUniquePlacement();\r\n\r\n const meshBox = this._getMeshBoxes(1);\r\n meshBox[0].allElements = elements;\r\n meshBox[0].mesh = mesh;\r\n\r\n let index = 0;\r\n\r\n let idx = elements[0];\r\n let start = 0, current = ids[idx];\r\n //每个文字有6个element\r\n for (let i = 0; i <= elements.length; i += BOX_ELEMENT_COUNT) {\r\n idx = elements[i];\r\n //pickingId发生变化,新的feature出现\r\n if (ids[idx] !== current || i === elements.length) {\r\n const feature = features[current] && features[current].feature;\r\n if (enableUniquePlacement && this.isMeshUniquePlaced(mesh) && feature && !feature.label) {\r\n const properties = feature.properties || {};\r\n // properties['$layer'] = feature.layer;\r\n // properties['$type'] = feature.type;\r\n const { symbolIndex } = mesh.properties;\r\n const textName = symbolIndex && this._textNameFn[symbolIndex.index] ? this._textNameFn[symbolIndex.index](mesh.properties.z, properties) : this.getSymbol(mesh.properties.symbolIndex)['textName'];\r\n const label = TextUtil.resolveText(textName, properties);\r\n // delete properties['$layer'];\r\n // delete properties['$type'];\r\n feature.label = label;\r\n }\r\n const end = i/* === elements.length - 6 ? elements.length : i */;\r\n const charCount = aCount[elements[start]];\r\n\r\n for (let ii = start; ii < end; ii += charCount * BOX_ELEMENT_COUNT) {\r\n meshBox[0].start = ii;\r\n meshBox[0].end = ii + charCount * BOX_ELEMENT_COUNT;\r\n meshBox[0].boxCount = charCount;\r\n fn.call(this, mesh, meshBox, matrix, index++);\r\n }\r\n current = ids[idx];\r\n start = i;\r\n }\r\n }\r\n }\r\n\r\n // start and end is the start and end index of a label\r\n _updateLabelAttributes(mesh, meshElements, start, end, line, mvpMatrix, planeMatrix/*, labelIndex*/) {\r\n const renderer = this.layer.getRenderer();\r\n\r\n const uniforms = mesh.material.uniforms;\r\n const isPitchWithMap = uniforms['pitchWithMap'] === 1;\r\n const terrainHelper = !isPitchWithMap && renderer.getTerrainHelper && renderer.getTerrainHelper();\r\n\r\n const enableCollision = this.isEnableCollision();\r\n const map = this.getMap();\r\n const geometry = mesh.geometry;\r\n const positionSize = geometry.desc.positionSize;\r\n\r\n const { aShape, aOffset, aAnchor, aAltitude, aPitchRotation } = geometry.properties;\r\n let { aProjectedAnchor } = geometry.properties;\r\n if (!aProjectedAnchor) {\r\n aProjectedAnchor = geometry.properties.aProjectedAnchor = new Array(aAnchor.length / positionSize * 3);\r\n }\r\n const aTextSize = geometry.properties['aTextSize'];\r\n\r\n // const layer = this.layer;\r\n // const renderer = layer.getRenderer();\r\n // const isForeground = renderer.isForeground(mesh);\r\n //地图缩小时限制绘制的box数量,以及fading时,父级瓦片中的box数量,避免大量的box绘制,提升缩放的性能\r\n // if (this.shouldLimitBox(isForeground, true) && labelIndex > this.layer.options['boxLimitOnZoomout']) {\r\n // if (!enableCollision) {\r\n // resetOffset(aOffset, meshElements, start, end);\r\n // }\r\n // return false;\r\n // }\r\n\r\n const isProjected = !planeMatrix;\r\n const index = meshElements[start];\r\n const idx = index * positionSize;\r\n // let labelAnchor = vec3.set(ANCHOR, aAnchor[idx], aAnchor[idx + 1], positionSize === 2 ? 0 : aAnchor[idx + 2]);\r\n let labelAnchor;\r\n if (geometry.data.aAltitude) {\r\n labelAnchor = vec3.set(ANCHOR, aAnchor[idx], aAnchor[idx + 1], aAltitude[index]);\r\n } else {\r\n labelAnchor = PackUtil.unpackPosition(ANCHOR, aAnchor[idx], aAnchor[idx + 1], aAnchor[idx + 2]);\r\n }\r\n\r\n const projLabelAnchor = projectPoint(PROJ_ANCHOR, labelAnchor, mvpMatrix, map.width, map.height);\r\n\r\n const aTerrainAltitude = geometry.properties.aTerrainAltitude;\r\n let elevatedAnchor;\r\n if (aTerrainAltitude) {\r\n const altitude = aTerrainAltitude[index];\r\n if (altitude === INVALID_ALTITUDE) {\r\n aProjectedAnchor[index * 3] = INVALID_PROJECTED_ANCHOR;\r\n aProjectedAnchor[index * 3 + 1] = INVALID_PROJECTED_ANCHOR;\r\n aProjectedAnchor[index * 3 + 2] = INVALID_PROJECTED_ANCHOR;\r\n return false;\r\n }\r\n if (altitude) {\r\n elevatedAnchor = vec3.set(ELEVATED_ANCHOR, ...labelAnchor);\r\n elevatedAnchor[2] = altitude * 100;\r\n elevatedAnchor = projectPoint(elevatedAnchor, elevatedAnchor, mvpMatrix, map.width, map.height);\r\n } else {\r\n elevatedAnchor = projLabelAnchor;\r\n }\r\n\r\n } else {\r\n elevatedAnchor = projLabelAnchor;\r\n }\r\n const dpr = map.getDevicePixelRatio();\r\n vec4.scale(BOX, elevatedAnchor, 1 / dpr);\r\n if (map.isOffscreen(BOX)) {\r\n if (!enableCollision) {\r\n resetOffset(aOffset, meshElements, start, end);\r\n }\r\n aProjectedAnchor[index * 3] = INVALID_PROJECTED_ANCHOR;\r\n aProjectedAnchor[index * 3 + 1] = INVALID_PROJECTED_ANCHOR;\r\n aProjectedAnchor[index * 3 + 2] = INVALID_PROJECTED_ANCHOR;\r\n\r\n //如果anchor在屏幕外,则直接不可见,省略掉后续逻辑\r\n return false;\r\n }\r\n if (isProjected) {\r\n labelAnchor = projLabelAnchor;\r\n }\r\n aProjectedAnchor[index * 3] = elevatedAnchor[0];\r\n aProjectedAnchor[index * 3 + 1] = elevatedAnchor[1];\r\n aProjectedAnchor[index * 3 + 2] = elevatedAnchor[2];\r\n\r\n const scale = isProjected ? 1 : geometry.properties.tileExtent / this.layer.getTileSize().width;\r\n\r\n let visible = true;\r\n\r\n const glyphSize = 24;\r\n\r\n //updateNormal\r\n //normal decides whether to flip and vertical\r\n const firstChrIdx = meshElements[start];\r\n const lastChrIdx = meshElements[end - 1];\r\n const textSize = aTextSize ? aTextSize[firstChrIdx] : mesh.properties.textSize;\r\n const normal = this._updateNormal(mesh, textSize, line, firstChrIdx, lastChrIdx, labelAnchor, ANCHOR, scale, planeMatrix);\r\n if (normal === null) {\r\n resetOffset(aOffset, meshElements, start, end);\r\n //normal返回null说明计算过程中有文字visible是false,直接退出\r\n return false;\r\n }\r\n const onlyOne = lastChrIdx - firstChrIdx <= 3;\r\n\r\n const flip = Math.floor(normal / 2);\r\n const vertical = normal % 2;\r\n\r\n //以下在js中实现了 text.line.vert 中的原有的shape和offset算法:\r\n /**\r\n void main() {\r\n vec4 pos = projViewModelMatrix * vec4(aPosition, 1.0);\r\n float distance = pos.w;\r\n\r\n float cameraScale = distance / cameraToCenterDistance;\r\n\r\n float distanceRatio = (1.0 - cameraToCenterDistance / distance) * textPerspectiveRatio;\r\n //通过distance动态调整大小\r\n float perspectiveRatio = clamp(\r\n 0.5 + 0.5 * (1.0 - distanceRatio),\r\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\r\n 4.0);\r\n\r\n //精度修正:js中用int16存放旋转角,会丢失小数点,乘以64能在int16范围内尽量保留小数点后尽量多的位数\r\n float rotation = aRotation / 64.0 * RAD + textRotation;\r\n float flip = float(int(aNormal) / 2);\r\n float vertical = mod(aNormal, 2.0);\r\n rotation += mix(0.0, -PI / 2.0, vertical); //-90 degree\r\n\r\n float angleSin = sin(rotation);\r\n float angleCos = cos(rotation);\r\n mat2 shapeMatrix = mat2(angleCos, -angleSin, angleSin, angleCos);\r\n\r\n vec2 shape = shapeMatrix * aShape;\r\n\r\n vec2 offset = aOffset / 10.0; //精度修正:js中用int16存的offset,会丢失小数点,乘以十后就能保留小数点后1位\r\n vec2 texCoord = aTexCoord;\r\n\r\n shape = shape / glyphSize * textSize;\r\n\r\n if (pitchWithMap == 1.0) {\r\n offset = shape * vec2(1.0, -1.0) + offset;\r\n //乘以cameraScale可以抵消相机近大远小的透视效果\r\n gl_Position = projViewModelMatrix * vec4(aPosition + vec3(offset, 0.0) * tileRatio / zoomScale * cameraScale * perspectiveRatio, 1.0);\r\n vGammaScale = cameraScale + mapPitch / 4.0;\r\n } else {\r\n offset = (shape + offset * vec2(1.0, -1.0)) * 2.0 / canvasSize;\r\n pos.xy += offset * perspectiveRatio * pos.w;\r\n gl_Position = pos;\r\n //当textPerspective:\r\n //值为1.0时: vGammaScale用cameraScale动态计算\r\n //值为0.0时: vGammaScale固定为1.2\r\n vGammaScale = mix(1.0, cameraScale, textPerspectiveRatio);\r\n }\r\n\r\n gl_Position.xy += vec2(textDx, textDy) * 2.0 / canvasSize * distance;\r\n */\r\n // const res = map.getResolution();\r\n // const glScale = map.getGLScale();\r\n // const glScale = map.getGLScale();\r\n // centimeter to gl res\r\n\r\n //array to store current text's elements\r\n for (let j = start; j < end; j += BOX_ELEMENT_COUNT) {\r\n //every character has 4 vertice, and 6 indexes\r\n const vertexStart = meshElements[j];\r\n let offset;\r\n if (!flip && j === start && !onlyOne && !terrainHelper) {\r\n // 因为在updateNormal中已经计算过first_offset,这里就不再计算了\r\n offset = FIRST_CHAROFFSET;\r\n } else if (!flip && j === end - BOX_ELEMENT_COUNT && !onlyOne && !terrainHelper) {\r\n // 因为在updateNormal中已经计算过last_offset,这里就不再计算了\r\n offset = LAST_CHAROFFSET;\r\n } else {\r\n offset = getCharOffset.call(this, CHAR_OFFSET, mesh, textSize, line, vertexStart, labelAnchor, ANCHOR, scale, flip, elevatedAnchor, this.layer, mvpMatrix, isPitchWithMap);\r\n }\r\n if (!offset) {\r\n //remove whole text if any char is missed\r\n visible = false;\r\n if (!enableCollision) {\r\n resetOffset(aOffset, meshElements, start, end);\r\n }\r\n break;\r\n }\r\n\r\n let rotation = offset[2];\r\n if (vertical) {\r\n rotation -= Math.PI / 2;\r\n }\r\n\r\n const shapeMatrix = getShapeMatrix(MAT2, rotation, 0, uniforms['rotateWithMap'], uniforms['pitchWithMap']);\r\n\r\n const is3DPitchText = aOffset.length > aShape.length;\r\n let rotMatrix;\r\n if (is3DPitchText) {\r\n //这里假设一组文字的rotation是一致的,因为每个文字都单独计算高度和旋转度难度太高\r\n vec3.set(TEMP_AXIS, aPitchRotation[3 * vertexStart], aPitchRotation[3 * vertexStart + 1], 0);\r\n const axis = vec3.normalize(TEMP_AXIS, TEMP_AXIS);\r\n const angleR = -aPitchRotation[3 * vertexStart + 2];\r\n if (angleR) {\r\n // angleR为0时,则不用旋转\r\n const quaterion = quat.setAxisAngle(TEMP_QUAT, axis, angleR);\r\n mat4.fromTranslation(TEMP_MAT4, Z_AXIS_OFFSET);\r\n mat4.fromQuat(TEMP_MAT4_1, quaterion);\r\n rotMatrix = mat4.multiply(TEMP_MAT4_1, TEMP_MAT4_1, TEMP_MAT4);\r\n }\r\n }\r\n\r\n\r\n for (let ii = 0; ii < 4; ii++) {\r\n const idx = 2 * (vertexStart + ii);\r\n vec2.set(SHAPE, aShape[idx] / 10, aShape[idx + 1] / 10);\r\n vec2.scale(SHAPE, SHAPE, textSize / glyphSize);\r\n vec2.transformMat2(SHAPE, SHAPE, shapeMatrix);\r\n\r\n if (isPitchWithMap) {\r\n vec2.multiply(SHAPE, SHAPE, AXIS_FACTOR);\r\n vec2.add(OFFSET, SHAPE, offset);\r\n if (is3DPitchText) {\r\n OFFSET[2] = 0;\r\n if (rotMatrix) {\r\n vec3.transformMat4(OFFSET, OFFSET, rotMatrix);\r\n }\r\n }\r\n } else {\r\n vec2.multiply(OFFSET, offset, AXIS_FACTOR);\r\n // vec2.set(OFFSET, 0, OFFSET[1], 0);\r\n vec2.add(OFFSET, SHAPE, OFFSET);\r\n }\r\n\r\n //乘以十是为了提升shader中offset的精度\r\n INT16[0] = OFFSET[0] * 10;\r\n INT16[1] = OFFSET[1] * 10;\r\n if (is3DPitchText) {\r\n INT16[2] = OFFSET[2] * 10;\r\n }\r\n\r\n //*10 是为了保留小数点做的精度修正\r\n const offsetIdx = (is3DPitchText ? 3 : 2) * (vertexStart + ii);\r\n if (aOffset[offsetIdx] !== INT16[0] ||\r\n aOffset[offsetIdx + 1] !== INT16[1] ||\r\n is3DPitchText && aOffset[offsetIdx + 2] !== INT16[2]) {\r\n aOffset.dirty = true;\r\n aOffset[offsetIdx] = INT16[0];\r\n aOffset[offsetIdx + 1] = INT16[1];\r\n if (is3DPitchText) {\r\n aOffset[offsetIdx + 2] = INT16[2];\r\n }\r\n }\r\n\r\n\r\n }\r\n }\r\n return visible;\r\n }\r\n\r\n _updateNormal(mesh, textSize, line, firstChrIdx, lastChrIdx, projectedAnchor, anchor, scale, planeMatrix) {\r\n const onlyOne = lastChrIdx - firstChrIdx <= 3;\r\n const map = this.getMap();\r\n const normal = onlyOne ? 0 : getLabelNormal.call(this, FIRST_CHAROFFSET, LAST_CHAROFFSET, mesh, textSize, line, firstChrIdx, lastChrIdx, projectedAnchor, anchor, scale, map.width / map.height, planeMatrix);\r\n\r\n return normal;\r\n }\r\n\r\n isBoxCollides(mesh, elements, boxCount, start, end, matrix/*, boxIndex*/) {\r\n return this.isLabelCollides(0, mesh, elements, boxCount, start, end, matrix);\r\n }\r\n\r\n deleteMesh(meshes, keepGeometry) {\r\n if (!meshes) {\r\n return;\r\n }\r\n if (keepGeometry) {\r\n //keepGeometry时,文字纹理应该保留\r\n if (Array.isArray(meshes)) {\r\n meshes.forEach(m => {\r\n if (m && m.material) {\r\n delete m.material.uniforms.texture;\r\n }\r\n });\r\n } else if (meshes.material) {\r\n delete meshes.material.uniforms.texture;\r\n }\r\n }\r\n super.deleteMesh(meshes, keepGeometry);\r\n }\r\n\r\n delete() {\r\n super.delete();\r\n this._shaderAlongLine.dispose();\r\n delete this._projectedLinesCache;\r\n if (this._linePicking) {\r\n this._linePicking.dispose();\r\n }\r\n }\r\n\r\n isUniqueStencilRefPerTile() {\r\n return false;\r\n }\r\n\r\n isEnableTileStencil() {\r\n const isIntel = this.layer.getRenderer().isEnableWorkAround('win-intel-gpu-crash');\r\n return !isIntel;\r\n }\r\n\r\n init() {\r\n // const map = this.getMap();\r\n const regl = this.regl;\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n\r\n const { uniforms, extraCommandProps } = createTextShader.call(this, this.canvas, this.sceneConfig);\r\n\r\n const canvas = this.canvas;\r\n // 地形瓦片中可能设置viewport\r\n const viewport = {\r\n x: (_, props) => {\r\n return props.viewport ? props.viewport.x : 0;\r\n },\r\n y: (_, props) => {\r\n return props.viewport ? props.viewport.y : 0;\r\n },\r\n width: (_, props) => {\r\n return props.viewport ? props.viewport.width : (canvas ? canvas.width : 1);\r\n },\r\n height: (_, props) => {\r\n return props.viewport ? props.viewport.height : (canvas ? canvas.height : 1);\r\n },\r\n };\r\n\r\n extraCommandProps.viewport = viewport;\r\n\r\n this.shader = new reshader.MeshShader({\r\n // vert: vertAlongLine, frag,\r\n vert, frag,\r\n uniforms,\r\n extraCommandProps\r\n });\r\n let commandProps = extraCommandProps;\r\n if (this.layer.getRenderer().isEnableWorkAround('win-intel-gpu-crash')) {\r\n //为解决intel gpu crash,stencil可能会被启用\r\n //但只有line-text渲染才需要,普通文字渲染不用打开stencil\r\n commandProps = extend({}, extraCommandProps);\r\n commandProps.stencil = extend({}, extraCommandProps.stencil);\r\n commandProps.stencil.enable = true;\r\n commandProps.stencil.func.cmp = '<';\r\n commandProps.stencil.func.ref = (context, props) => {\r\n //level * 2 以避免相邻level的halo和非halo产生相同的ref\r\n return props.level * 2 + (props.isHalo || 0) + 1;\r\n };\r\n }\r\n this._shaderAlongLine = new reshader.MeshShader({\r\n vert: vertAlongLine, frag,\r\n uniforms,\r\n extraCommandProps: commandProps\r\n });\r\n\r\n if (this.pickingFBO) {\r\n const textPicking = new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + pickingVert,\r\n uniforms,\r\n extraCommandProps: {\r\n viewport: this.pickingViewport\r\n }\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n );\r\n textPicking.filter = mesh => {\r\n const symbolIndex = mesh.properties.symbolIndex;\r\n const symbol = this.getSymbol(symbolIndex);\r\n return symbol['textPlacement'] !== 'line';\r\n };\r\n\r\n const linePicking = new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + linePickingVert,\r\n uniforms,\r\n extraCommandProps: {\r\n viewport: this.pickingViewport\r\n }\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n );\r\n linePicking.filter = mesh => {\r\n return mesh.geometry.properties.textPlacement === 'line';\r\n };\r\n this.picking = [textPicking, linePicking];\r\n }\r\n }\r\n\r\n getUniformValues(map, context) {\r\n const isRenderingTerrainSkin = context && context.isRenderingTerrainSkin;\r\n const tileSize = this.layer.getTileSize().width;\r\n const projViewMatrix = isRenderingTerrainSkin ? IDENTITY_ARR : map.projViewMatrix;\r\n const cameraToCenterDistance = map.cameraToCenterDistance;\r\n // const canvasSize = [map.width, map.height];\r\n const canvasSize = vec2.set(TEMP_CANVAS_SIZE, map.width, map.height);\r\n if (isRenderingTerrainSkin) {\r\n vec2.set(canvasSize, tileSize, tileSize);\r\n }\r\n //手动构造map的x与z轴的三维旋转矩阵\r\n //http://planning.cs.uiuc.edu/node102.html\r\n // const pitch = map.getPitch(),\r\n // bearing = -map.getBearing();\r\n // const q = quat.fromEuler([], pitch, 0, bearing);\r\n // const planeMatrix = mat4.fromRotationTranslation([], q, [0, 0, 0]);\r\n\r\n // const pitch = map.getPitch() * Math.PI / 180,\r\n // bearing = -map.getBearing() * Math.PI / 180;\r\n // const angleCos = Math.cos(bearing),\r\n // angleSin = Math.sin(bearing),\r\n // pitchCos = Math.cos(pitch),\r\n // pitchSin = Math.sin(pitch);\r\n // const planeMatrix = [\r\n // angleCos, -1.0 * angleSin * pitchCos, angleSin * pitchSin,\r\n // angleSin, angleCos * pitchCos, -1.0 * angleCos * pitchSin,\r\n // 0.0, pitchSin, pitchCos\r\n // ];\r\n const zScale = getCentiMeterScale(map.getResolution(), map);\r\n return {\r\n layerScale: this.layer.options['styleScale'] || 1,\r\n mapPitch: map.getPitch() * Math.PI / 180,\r\n mapRotation: map.getBearing() * Math.PI / 180,\r\n projViewMatrix,\r\n viewMatrix: map.viewMatrix,\r\n cameraToCenterDistance, canvasSize,\r\n glyphSize: GLYPH_SIZE,\r\n // gammaScale : 0.64,\r\n gammaScale: GAMMA_SCALE * (this.layer.options['textGamma'] || 1),\r\n resolution: map.getResolution(),\r\n altitudeScale: zScale,\r\n viewport: isRenderingTerrainSkin && context && context.viewport,\r\n // 过滤 pitchAlignment 为特定值的text,0时不过滤; 1时,过滤掉viewport; 2时,过滤掉map\r\n textPitchFilter: 0,\r\n isRenderingTerrain: +!!isRenderingTerrainSkin\r\n // planeMatrix\r\n };\r\n }\r\n}\r\n\r\n// function bytesAlign(attributes) {\r\n// let max = 0;\r\n// let stride = 0;\r\n// for (const p in attributes) {\r\n// const type = attributes[p].type;\r\n// if (TYPE_BYTES[type] > max) {\r\n// max = TYPE_BYTES[type];\r\n// }\r\n// stride += TYPE_BYTES[type] * attributes[p].size || 1;\r\n// }\r\n// if (stride % max > 0) {\r\n// stride += (max - stride % max);\r\n// }\r\n// return stride;\r\n// }\r\n\r\nfunction resetOffset(aOffset, meshElements, start, end) {\r\n for (let j = start; j < end; j += BOX_ELEMENT_COUNT) {\r\n //every character has 4 vertice, and 6 indexes\r\n const vertexStart = meshElements[j];\r\n for (let ii = 0; ii < 4; ii++) {\r\n const idx = 3 * (vertexStart + ii);\r\n if (aOffset[idx] ||\r\n aOffset[idx + 1] ||\r\n aOffset[idx + 2]) {\r\n aOffset.dirty = true;\r\n aOffset[idx] = 0;\r\n aOffset[idx + 1] = 0;\r\n aOffset[idx + 2] = 0;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction sortByLevel(m0, m1) {\r\n const r = m0.properties['level'] - m1.properties['level'];\r\n if (r === 0) {\r\n return m0.properties.meshKey - m1.properties.meshKey;\r\n } else {\r\n return r;\r\n }\r\n}\r\n","import { Color } from '@maptalks/vector-packer';\r\nimport { reshader, mat4 } from '@maptalks/gl';\r\nimport BasicPainter from './BasicPainter';\r\nimport vert from './glsl/native-point.vert';\r\nimport frag from './glsl/native-point.frag';\r\nimport pickingVert from './glsl/native-point.vert';\r\nimport { setUniformFromSymbol, createColorSetter, toUint8ColorInGlobalVar } from '../Util';\r\nimport { isFunctionDefinition, piecewiseConstant } from '@maptalks/function-type';\r\nimport { prepareFnTypeData } from './util/fn_type_util';\r\n\r\nconst DEFAULT_UNIFORMS = {\r\n markerFill: [0, 0, 0],\r\n markerOpacity: 1,\r\n markerSize: 10\r\n};\r\n\r\nclass NativePointPainter extends BasicPainter {\r\n\r\n getPrimitive() {\r\n return 'points';\r\n }\r\n\r\n isTerrainSkin() {\r\n return false;\r\n }\r\n\r\n isTerrainVector() {\r\n return this.layer.options.awareOfTerrain;\r\n }\r\n\r\n isUniqueStencilRefPerTile() {\r\n return false;\r\n }\r\n\r\n createMesh(geo, transform) {\r\n const { geometry, symbolIndex, ref } = geo;\r\n const symbol = this.getSymbol(symbolIndex);\r\n if (ref === undefined) {\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n geometry.generateBuffers(this.regl);\r\n }\r\n\r\n const uniforms = {};\r\n setUniformFromSymbol(uniforms, 'markerOpacity', symbol, 'markerOpacity', 1);\r\n setUniformFromSymbol(uniforms, 'markerSize', symbol, 'markerSize', 10);\r\n setUniformFromSymbol(uniforms, 'markerFill', symbol, 'markerFill', '#000', createColorSetter(this.colorCache, 3));\r\n const material = new reshader.Material(uniforms, DEFAULT_UNIFORMS);\r\n material.createDefines = () => {\r\n if (symbol.markerType !== 'square') {\r\n return {\r\n 'USE_CIRCLE': 1\r\n };\r\n }\r\n return null;\r\n };\r\n\r\n material.appendDefines = (defines/*, geometry*/) => {\r\n if (symbol.markerType !== 'square') {\r\n defines['USE_CIRCLE'] = 1;\r\n }\r\n return defines;\r\n };\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n castShadow: false,\r\n picking: true\r\n });\r\n const defines = {};\r\n if (mesh.geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n if (geometry.data.aColor) {\r\n defines['HAS_COLOR'] = 1;\r\n }\r\n mesh.setDefines(defines);\r\n mesh.positionMatrix = this.getAltitudeOffsetMatrix();\r\n mesh.setLocalTransform(transform);\r\n mesh.properties.symbolIndex = symbolIndex;\r\n return mesh;\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n const aColorFn = piecewiseConstant(symbolDef['markerFill']);\r\n return [\r\n {\r\n //geometry.data 中的属性数据\r\n attrName: 'aColor',\r\n //symbol中的function-type属性\r\n symbolName: 'markerFill',\r\n type: Uint8Array,\r\n width: 4,\r\n define: 'HAS_COLOR',\r\n evaluate: (properties, geometry) => {\r\n let color = aColorFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(color)) {\r\n color = this.evaluateInFnTypeConfig(color, geometry, map, properties, true);\r\n }\r\n if (!Array.isArray(color)) {\r\n color = this.colorCache[color] = this.colorCache[color] || Color(color).unitArray();\r\n }\r\n color = toUint8ColorInGlobalVar(color);\r\n return color;\r\n }\r\n }\r\n ];\r\n }\r\n\r\n init() {\r\n const regl = this.regl;\r\n\r\n this.renderer = new reshader.Renderer(regl);\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 projViewModelMatrix = [];\r\n // const stencil = this.isOnly2D();\r\n const config = {\r\n vert,\r\n frag,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ],\r\n defines: null,\r\n extraCommandProps: {\r\n viewport,\r\n // stencil: {\r\n // enable: false,\r\n // func: {\r\n // cmp: () => {\r\n // return stencil ? '=' : '<=';\r\n // },\r\n // ref: (context, props) => {\r\n // return stencil ? props.stencilRef : props.level;\r\n // },\r\n // mask: 0xFF\r\n // },\r\n // op: {\r\n // fail: 'keep',\r\n // zfail: 'keep',\r\n // zpass: () => {\r\n // return stencil ? 'zero' : 'replace';\r\n // }\r\n // }\r\n // },\r\n depth: {\r\n enable: true,\r\n mask: false,\r\n range: this.sceneConfig.depthRange || [0, 1],\r\n func: this.sceneConfig.depthFunc || 'always'\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n }\r\n }\r\n };\r\n\r\n this.shader = new reshader.MeshShader(config);\r\n this.shader.version = 300;\r\n\r\n if (this.pickingFBO) {\r\n const projViewModelMatrix = [];\r\n this.picking = [new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + pickingVert,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ],\r\n extraCommandProps: {\r\n viewport: this.pickingViewport\r\n }\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n )];\r\n }\r\n }\r\n\r\n getUniformValues(map) {\r\n const projViewMatrix = map.projViewMatrix;\r\n return {\r\n projViewMatrix\r\n };\r\n }\r\n}\r\n\r\nexport default NativePointPainter;\r\n","import { reshader, mat4 } from '@maptalks/gl';\r\nimport { setUniformFromSymbol, createColorSetter } from '../Util';\r\nimport BasicPainter from './BasicPainter';\r\nimport vert from './glsl/native-line.vert';\r\nimport frag from './glsl/native-line.frag';\r\nimport pickingVert from './glsl/native-line.vert';\r\nimport { piecewiseConstant, isFunctionDefinition } from '@maptalks/function-type';\r\n\r\nconst IDENTITY_ARR = mat4.identity([]);\r\n\r\nclass NativeLinePainter extends BasicPainter {\r\n constructor(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig) {\r\n super(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig);\r\n this.primitive = 'lines';\r\n if (isFunctionDefinition(this.symbolDef['lineColor'])) {\r\n const map = layer.getMap();\r\n const fn = piecewiseConstant(this.symbolDef['lineColor']);\r\n this.colorSymbol = properties => fn(map.getZoom(), properties);\r\n }\r\n }\r\n\r\n needPolygonOffset() {\r\n return true;\r\n }\r\n\r\n createMesh(geo, transform) {\r\n const { geometry, symbolIndex, ref } = geo;\r\n const symbol = this.getSymbol(symbolIndex);\r\n const uniforms = this.getMeshUniforms(geometry, symbol);\r\n if (ref === undefined) {\r\n geometry.generateBuffers(this.regl);\r\n }\r\n const material = new reshader.Material(uniforms);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n castShadow: false,\r\n picking: true\r\n });\r\n mesh.setLocalTransform(transform);\r\n mesh.properties.symbolIndex = symbolIndex;\r\n\r\n const defines = {};\r\n if (mesh.geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n mesh.setDefines(defines);\r\n return mesh;\r\n }\r\n\r\n getMeshUniforms(geometry, symbol) {\r\n const uniforms = {};\r\n setUniformFromSymbol(uniforms, 'lineColor', symbol, 'lineColor', '#000', createColorSetter(this.colorCache));\r\n setUniformFromSymbol(uniforms, 'lineOpacity', symbol, 'lineOpacity', 1);\r\n return uniforms;\r\n }\r\n\r\n isEnableTileStencil(context) {\r\n const isRenderingTerrainSkin = !!(context && context.isRenderingTerrain && this.isTerrainSkin());\r\n const isEnableStencil = !isRenderingTerrainSkin;\r\n return isEnableStencil;\r\n }\r\n\r\n init(context) {\r\n const regl = this.regl;\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n const canvas = this.canvas;\r\n\r\n const viewport = {\r\n x: (_, props) => {\r\n return props.viewport ? props.viewport.x : 0;\r\n },\r\n y: (_, props) => {\r\n return props.viewport ? props.viewport.y : 0;\r\n },\r\n width: (_, props) => {\r\n return props.viewport ? props.viewport.width : (canvas ? canvas.width : 1);\r\n },\r\n height: (_, props) => {\r\n return props.viewport ? props.viewport.height : (canvas ? canvas.height : 1);\r\n },\r\n };\r\n\r\n const uniforms = [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ];\r\n const depthRange = this.sceneConfig.depthRange;\r\n const config = {\r\n vert,\r\n frag,\r\n uniforms,\r\n defines: null,\r\n extraCommandProps: {\r\n viewport,\r\n stencil: {\r\n enable: () => {\r\n return this.isEnableTileStencil(context);\r\n },\r\n mask: 0xFF,\r\n func: {\r\n cmp: () => {\r\n return this.isOnly2D() ? '=' : '<=';\r\n },\r\n ref: (context, props) => {\r\n return props.stencilRef;\r\n },\r\n mask: 0xFF\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n range: depthRange || [0, 1],\r\n func: this.sceneConfig.depthFunc || '<='\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n }\r\n };\r\n\r\n this.shader = new reshader.MeshShader(config);\r\n\r\n if (this.pickingFBO) {\r\n this.picking = [new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + pickingVert,\r\n uniforms,\r\n extraCommandProps: {\r\n viewport: this.pickingViewport\r\n }\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n )];\r\n }\r\n }\r\n\r\n getUniformValues(map, context) {\r\n const isRenderingTerrainSkin = context && context.isRenderingTerrainSkin;\r\n const projViewMatrix = isRenderingTerrainSkin ? IDENTITY_ARR : map.projViewMatrix;\r\n return {\r\n projViewMatrix,\r\n viewport: isRenderingTerrainSkin && context && context.viewport,\r\n };\r\n }\r\n\r\n getPrimitive() {\r\n return 'lines';\r\n }\r\n}\r\n\r\nexport default NativeLinePainter;\r\n","import * as maptalks from 'maptalks';\r\nimport { reshader } from '@maptalks/gl';\r\nimport { vec2, mat4 } from '@maptalks/gl';\r\nimport Painter from './Painter';\r\nimport { piecewiseConstant, isFunctionDefinition } from '@maptalks/function-type';\r\nimport { setUniformFromSymbol, createColorSetter, isNumber, toUint8ColorInGlobalVar, pointAtResToMeter } from '../Util';\r\nimport { prepareFnTypeData } from './util/fn_type_util';\r\nimport { interpolated } from '@maptalks/function-type';\r\nimport { Color } from '@maptalks/vector-packer';\r\nimport { DEFAULT_TEX_WIDTH } from '@maptalks/vector-packer';\r\n\r\nconst SCALE = [1, 1, 1];\r\nconst DEFAULT_POLYGON_FILL = [1, 1, 1, 1];\r\nconst EMPTY_UV_OFFSET = [0, 0];\r\nconst DEFAULT_UV_SCALE = [1, 1];\r\n\r\nconst EMPTY_ARRAY = [];\r\n\r\nconst COORD0 = new maptalks.Coordinate(0, 0);\r\nconst COORD1 = new maptalks.Coordinate(0, 0);\r\n\r\nconst ARR2_0 = [];\r\nconst ARR2_1 = [];\r\n\r\n//一个三维mesh绘制的通用painter,负责mesh的create, add 和 delete, 负责fn-type的更新\r\nclass MeshPainter extends Painter {\r\n\r\n supportRenderMode(mode) {\r\n if (this.isAnimating()) {\r\n return mode === 'fxaa' || mode === 'fxaaAfterTaa';\r\n } else {\r\n return mode === 'taa' || mode === 'fxaa';\r\n }\r\n }\r\n\r\n isTerrainSkin() {\r\n return false;\r\n }\r\n\r\n isTerrainVector() {\r\n return this.layer.options.awareOfTerrain;\r\n }\r\n\r\n isAnimating() {\r\n return false;\r\n }\r\n\r\n createMesh(geo, transform, { tilePoint }) {\r\n if (!this.material) {\r\n //还没有初始化\r\n this.setToRedraw();\r\n return null;\r\n }\r\n const { geometry, symbolIndex } = geo;\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n const mesh = new reshader.Mesh(geometry, this.material);\r\n if (this.sceneConfig.animation) {\r\n SCALE[2] = 0.01;\r\n const mat = [];\r\n mat4.fromScaling(mat, SCALE);\r\n mat4.multiply(mat, transform, mat);\r\n transform = mat;\r\n }\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n const shader = this.getShader();\r\n const defines = shader.getGeometryDefines ? shader.getGeometryDefines(geometry) : {};\r\n const symbol = this.getSymbol(symbolIndex);\r\n const colorSetter = createColorSetter(this.colorCache);\r\n if (geometry.data.aExtrude) {\r\n defines['IS_LINE_EXTRUSION'] = 1;\r\n const { tileResolution, tileRatio } = geometry.properties;\r\n const map = this.getMap();\r\n Object.defineProperty(mesh.uniforms, 'linePixelScale', {\r\n enumerable: true,\r\n get: function () {\r\n return tileRatio * map.getResolution() / tileResolution;\r\n }\r\n });\r\n setUniformFromSymbol(mesh.uniforms, 'lineWidth', symbol, 'lineWidth', 4);\r\n setUniformFromSymbol(mesh.uniforms, 'lineOpacity', symbol, 'lineOpacity', 1);\r\n setUniformFromSymbol(mesh.uniforms, 'lineColor', symbol, 'lineColor', '#fff', colorSetter);\r\n Object.defineProperty(mesh.uniforms, 'lineHeight', {\r\n enumerable: true,\r\n get: () => {\r\n const alt = this.dataConfig['defaultAltitude'] * (this.dataConfig['altitudeScale'] || 1);\r\n return isNumber(alt) ? alt : 0;\r\n }\r\n });\r\n } else {\r\n setUniformFromSymbol(mesh.uniforms, 'polygonFill', symbol, 'polygonFill', DEFAULT_POLYGON_FILL, colorSetter);\r\n setUniformFromSymbol(mesh.uniforms, 'polygonOpacity', symbol, 'polygonOpacity', 1);\r\n const vertexColorTypes = [];\r\n Object.defineProperty(mesh.uniforms, 'vertexColorsOfType', {\r\n enumerable: true,\r\n get: () => {\r\n const bottomColor = colorSetter(symbol['bottomPolygonFill'] || DEFAULT_POLYGON_FILL);\r\n const topColor = colorSetter(symbol['topPolygonFill'] || DEFAULT_POLYGON_FILL);\r\n vertexColorTypes[0] = bottomColor[0];\r\n vertexColorTypes[1] = bottomColor[1];\r\n vertexColorTypes[2] = bottomColor[2];\r\n vertexColorTypes[3] = bottomColor[3];\r\n vertexColorTypes[4] = topColor[0];\r\n vertexColorTypes[5] = topColor[1];\r\n vertexColorTypes[6] = topColor[2];\r\n vertexColorTypes[7] = topColor[3];\r\n const vertexColors = mesh.geometry.properties.vertexColors;\r\n if (vertexColors) {\r\n let index = 8;\r\n vertexColorTypes.length = 8 + vertexColors.length;\r\n for (let i = 0; i < vertexColors.length; i++) {\r\n vertexColorTypes[index++] = vertexColors[i][0];\r\n vertexColorTypes[index++] = vertexColors[i][1];\r\n vertexColorTypes[index++] = vertexColors[i][2];\r\n vertexColorTypes[index++] = vertexColors[i][3];\r\n }\r\n }\r\n return vertexColorTypes;\r\n }\r\n });\r\n }\r\n if (geometry.data.aColor) {\r\n defines['HAS_COLOR'] = 1;\r\n }\r\n if (geometry.data.aOpacity) {\r\n defines['HAS_OPACITY'] = 1;\r\n }\r\n if (geometry.data.aLineWidth) {\r\n defines['HAS_LINE_WIDTH'] = 1;\r\n }\r\n if (geometry.data.aLineHeight) {\r\n defines['HAS_LINE_HEIGHT'] = 1;\r\n }\r\n if (geometry.data.aTerrainAltitude) {\r\n defines['HAS_TERRAIN_ALTITUDE'] = 1;\r\n }\r\n if (geometry.data.aVertexColorType) {\r\n const vertexColors = mesh.geometry.properties.vertexColors;\r\n let vertexTypesCount = 2;\r\n if (vertexColors) {\r\n vertexTypesCount += vertexColors.length;\r\n }\r\n defines['VERTEX_TYPES_COUNT'] = vertexTypesCount;\r\n }\r\n if (geometry.data.aOpacity) {\r\n const aOpacity = geometry.data.aOpacity;\r\n for (let i = 0; i < aOpacity.length; i++) {\r\n if (aOpacity[i] < 255) {\r\n geometry.properties.hasAlpha = true;\r\n break;\r\n }\r\n }\r\n }\r\n defines['HAS_MIN_ALTITUDE'] = 1;\r\n defines['HAS_LAYER_OPACITY'] = 1;\r\n geometry.generateBuffers(this.regl);\r\n mesh.setDefines(defines);\r\n mesh.setPositionMatrix(this.getAltitudeOffsetMatrix());\r\n mesh.setLocalTransform(transform);\r\n\r\n //没有高度或level >= 3的瓦片mesh不产生阴影\r\n if (geometry.properties.maxAltitude <= 0 || mesh.properties.level >= 3) {\r\n mesh.castShadow = false;\r\n }\r\n mesh.setUniform('maxAltitude', mesh.geometry.properties.maxAltitude);\r\n Object.defineProperty(mesh.uniforms, 'minAltitude', {\r\n enumerable: true,\r\n get: () => {\r\n return this.layer.options['altitude'] || 0;\r\n }\r\n })\r\n\r\n const { tileResolution } = geometry.properties;\r\n const map = this.getMap();\r\n const renderer = this.layer.getRenderer();\r\n const tileCoord = map.pointAtResToCoord(new maptalks.Point(tilePoint), tileResolution);\r\n const pointToMeter = pointAtResToMeter(map, 1, tileCoord, tileResolution);\r\n const uvOriginUniform = [];\r\n Object.defineProperty(mesh.uniforms, 'uvOrigin', {\r\n enumerable: true,\r\n get: () => {\r\n const offset = this._computeUVOffset(uvOriginUniform, symbolIndex, tilePoint, tileResolution, pointToMeter, isVectorTile);\r\n return offset;\r\n }\r\n });\r\n // const uvOffsetUniform = [];\r\n // Object.defineProperty(mesh.uniforms, 'uvOffset', {\r\n // enumerable: true,\r\n // get: () => {\r\n // const offset = this._computeUVOffset(uvOffsetUniform, symbolIndex, tilePoint, tileResolution, pointToMeter, isVectorTile);\r\n // return vec2.set(uvOriginUniform, 0, 0);\r\n // }\r\n // });\r\n mesh.setUniform('uvOffset', [0, 0]);\r\n Object.defineProperty(mesh.uniforms, 'hasAlpha', {\r\n enumerable: true,\r\n get: () => {\r\n const symbol = this.getSymbol(symbolIndex);\r\n return geometry.properties.hasAlpha || symbol['polygonOpacity'] < 1 ||\r\n symbol['lineOpacity'] < 1 ||\r\n mesh.material && (mesh.material.uniforms.baseColorTexture ||\r\n mesh.material.uniforms.emissiveTexture);\r\n }\r\n });\r\n\r\n const maxZoom = this.layer.getMap().getMaxNativeZoom();\r\n Object.defineProperty(mesh.uniforms, 'stencilRef', {\r\n enumerable: true,\r\n get: () => {\r\n if (renderer.isForeground(mesh)) {\r\n return 0;\r\n }\r\n return maxZoom - mesh.properties.tile.z;\r\n }\r\n });\r\n mesh.properties.symbolIndex = symbolIndex;\r\n return mesh;\r\n }\r\n\r\n _computeUVOffset(out, symbolIndex, tilePoint, tileResolution, pointToMeter, isVectorTile) {\r\n if (this.dataConfig.topUVMode === 1) {\r\n // 如果顶面纹理是ombb,不需要偏移\r\n out[0] = 0;\r\n out[1] = 0;\r\n return out;\r\n }\r\n const map = this.getMap();\r\n const symbol = this.getSymbol(symbolIndex);\r\n const material = symbol.material;\r\n let origin = tilePoint;\r\n if (!this.dataConfig.side && material && material.textureOrigin) {\r\n COORD0.set(material.textureOrigin[0], material.textureOrigin[1]);\r\n map.coordToPointAtRes(COORD0, tileResolution, COORD1);\r\n origin = vec2.set(ARR2_0, tilePoint[0] - COORD1.x, tilePoint[1] - COORD1.y);\r\n }\r\n const isMeter = !!material && material.uvOffsetInMeter;\r\n let uvOffset = material && material.uvOffset || EMPTY_UV_OFFSET;\r\n const uvOffsetAnim = this.getUVOffsetAnim();\r\n if (uvOffsetAnim) {\r\n uvOffset = this.getUVOffset(uvOffsetAnim);\r\n }\r\n const uvScale = material && material.uvScale || DEFAULT_UV_SCALE;\r\n\r\n // 每个瓦片左上角的坐标值\r\n // 侧面的纹理不会根据瓦片左上角坐标偏移\r\n // 只有顶面的坐标是需要根据瓦片左上角坐标来整体偏移的\r\n let xmin = this.dataConfig.side ? 0 : origin[0];\r\n let ymax = this.dataConfig.side ? 0 : origin[1];\r\n // 纹理的高宽\r\n const textureWidth = (material && material.textureWidth || DEFAULT_TEX_WIDTH);\r\n const textureHeight = textureWidth * uvScale[1] / uvScale[0];\r\n if (isMeter) {\r\n xmin += uvOffset[0] / pointToMeter;\r\n ymax += uvOffset[1] / pointToMeter;\r\n }\r\n const offsetX = isMeter ? 0 : uvOffset[0];\r\n const offsetY = isMeter ? 0 : uvOffset[1];\r\n const result = vec2.set(out, xmin * pointToMeter * uvScale[0] / textureWidth + offsetX, ymax * pointToMeter * uvScale[1] / textureHeight + offsetY);\r\n if (!isVectorTile) {\r\n result[1] *= -1;\r\n }\r\n return result;\r\n }\r\n\r\n callShader(uniforms, context) {\r\n const cullFace = this.sceneConfig.cullFace;\r\n this.sceneConfig.cullFace = 'front';\r\n this.callBackgroundTileShader(uniforms, context);\r\n if (cullFace === undefined) {\r\n delete this.sceneConfig.cullFace;\r\n } else {\r\n this.sceneConfig.cullFace = cullFace;\r\n }\r\n super.callShader(uniforms, context);\r\n }\r\n\r\n getShadowMeshes() {\r\n if (!this.isVisible()) {\r\n return EMPTY_ARRAY;\r\n }\r\n this.shadowCount = this.scene.getMeshes().length;\r\n const meshes = this.scene.getMeshes().filter(m => m.properties.level === 0);\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n if (mesh.material !== this.material) {\r\n mesh.setMaterial(this.material);\r\n }\r\n }\r\n return meshes;\r\n }\r\n\r\n getUVOffsetAnim() {\r\n const symbol = this.getSymbols()[0];\r\n return symbol.material && symbol.material.uvOffsetAnim;\r\n }\r\n\r\n getUVOffset(uvOffsetAnim) {\r\n const symbol = this.getSymbols()[0];\r\n const uvOffset = symbol.material && symbol.material.uvOffset || EMPTY_UV_OFFSET;\r\n const inMeter = !!symbol.material && symbol.material.uvOffsetInMeter;\r\n const timeStamp = performance.now() / 1000;\r\n const offset = vec2.set(ARR2_1, uvOffset[0], uvOffset[1]);\r\n offset[0] = timeStamp * uvOffsetAnim[0];\r\n offset[1] = timeStamp * uvOffsetAnim[0];\r\n if (!inMeter) {\r\n offset[0] %= 1;\r\n offset[1] %= 1;\r\n }\r\n return offset;\r\n }\r\n\r\n needPolygonOffset() {\r\n return this._needPolygonOffset;\r\n // return true;\r\n }\r\n\r\n startFrame(...args) {\r\n delete this._needPolygonOffset;\r\n return super.startFrame(...args);\r\n }\r\n\r\n addMesh(mesh, progress) {\r\n mesh.forEach(m => {\r\n this._prepareMesh(m, progress);\r\n });\r\n super.addMesh(...arguments);\r\n }\r\n\r\n _prepareMesh(mesh, progress) {\r\n if (progress !== null) {\r\n const mat = mesh.localTransform;\r\n if (progress === 0) {\r\n progress = 0.01;\r\n }\r\n SCALE[2] = progress;\r\n mat4.fromScaling(mat, SCALE);\r\n mat4.multiply(mat, mesh.properties.tileTransform, mat);\r\n mesh.setLocalTransform(mat);\r\n } else {\r\n mesh.setLocalTransform(mesh.properties.tileTransform);\r\n }\r\n if (mesh.material !== this.material) {\r\n mesh.setMaterial(this.material);\r\n }\r\n if (mesh.geometry.properties.maxAltitude <= 0) {\r\n this._needPolygonOffset = true;\r\n }\r\n //在这里更新ssr,以免symbol中ssr发生变化时,uniform值却没有发生变化, fuzhenn/maptalks-studio#462\r\n if (this.getSymbol(mesh.properties.symbolIndex).ssr) {\r\n mesh.ssr = 1;\r\n } else {\r\n mesh.ssr = 0;\r\n }\r\n }\r\n\r\n deleteMaterial() {\r\n if (!this.material) {\r\n return;\r\n }\r\n this.material.dispose();\r\n delete this.material;\r\n }\r\n\r\n deleteMesh(meshes, keepGeometry) {\r\n if (!meshes) {\r\n return;\r\n }\r\n this.scene.removeMesh(meshes);\r\n if (Array.isArray(meshes)) {\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!keepGeometry) {\r\n meshes[i].geometry.dispose();\r\n delete meshes[i].geometry.properties.layer;\r\n }\r\n meshes[i].dispose();\r\n }\r\n } else {\r\n if (!keepGeometry) {\r\n meshes.geometry.dispose();\r\n delete meshes.geometry.properties.layer;\r\n }\r\n meshes.dispose();\r\n }\r\n }\r\n\r\n updateDataConfig(dataConfig, old) {\r\n if (this.dataConfig.type === 'line-extrusion' && !dataConfig['altitudeProperty'] && !old['altitudeProperty']) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n const fillFn = piecewiseConstant(symbolDef['polygonFill'] || symbolDef['lineColor']);\r\n const opacityFn = interpolated(symbolDef['polygonOpacity'] || symbolDef['lineOpacity']);\r\n const aLineWidthFn = interpolated(symbolDef['lineWidth']);\r\n const u8 = new Uint8Array(1);\r\n const u16 = new Uint16Array(1);\r\n const fillName = symbolDef['polygonFill'] ? 'polygonFill' : symbolDef['lineColor'] ? 'lineColor' : 'polygonFill';\r\n const opacityName = symbolDef['polygonOpacity'] ? 'polygonOpacity' : symbolDef['lineOpacity'] ? 'lineOpacity' : 'polygonOpacity';\r\n return [\r\n {\r\n //geometry.data 中的属性数据\r\n attrName: 'aColor',\r\n type: Uint8Array,\r\n width: 4,\r\n //symbol中的function-type属性\r\n symbolName: fillName,\r\n define: 'HAS_COLOR',\r\n //\r\n evaluate: (properties, geometry) => {\r\n let color = fillFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(color)) {\r\n color = this.evaluateInFnTypeConfig(color, geometry, map, properties, true);\r\n }\r\n if (!Array.isArray(color)) {\r\n color = this.colorCache[color] = this.colorCache[color] || Color(color).unitArray();\r\n }\r\n color = toUint8ColorInGlobalVar(color);\r\n return color;\r\n }\r\n },\r\n {\r\n attrName: 'aOpacity',\r\n type: Uint8Array,\r\n width: 1,\r\n symbolName: opacityName,\r\n evaluate: (properties, geometry) => {\r\n let polygonOpacity = opacityFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(polygonOpacity)) {\r\n polygonOpacity = this.evaluateInFnTypeConfig(polygonOpacity, geometry, map, properties, false);\r\n }\r\n u8[0] = polygonOpacity * 255;\r\n if (u8[0] < 255) {\r\n geometry.properties.hasAlpha = true;\r\n }\r\n return u8[0];\r\n }\r\n },\r\n {\r\n attrName: 'aLineWidth',\r\n type: Uint8Array,\r\n width: 1,\r\n symbolName: 'lineWidth',\r\n define: 'HAS_LINE_WIDTH',\r\n evaluate: properties => {\r\n const lineWidth = aLineWidthFn(map.getZoom(), properties);\r\n //乘以2是为了解决 #190\r\n u16[0] = Math.round(lineWidth * 2.0);\r\n return u16[0];\r\n }\r\n }\r\n ];\r\n }\r\n\r\n updateSymbol(symbol, all) {\r\n let refreshMaterial = false;\r\n if (symbol && symbol.material) {\r\n // 检查材质的更新是否需要更新整个style\r\n refreshMaterial = needRefreshMaterial(this.symbolDef[0].material || {}, symbol.material);\r\n }\r\n const refresh = super.updateSymbol(symbol, all);\r\n if (symbol && symbol.material) {\r\n this._updateMaterial(symbol.material);\r\n }\r\n return refreshMaterial || refresh;\r\n }\r\n\r\n _isNeedRefreshStyle(oldSymbolDef, newSymbolDef) {\r\n return hasTexture(oldSymbolDef) !== hasTexture(newSymbolDef);\r\n }\r\n\r\n}\r\n\r\nexport default MeshPainter;\r\n\r\n\r\nfunction hasTexture(symbolDef) {\r\n if (!symbolDef || !symbolDef.material) {\r\n return false;\r\n }\r\n for (const p in symbolDef.material) {\r\n if (p.indexOf('Texture') > 0 && symbolDef.material[p]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n\r\nconst MATERIAL_PROP_NEED_REBUILD_IN_VT = {\r\n 'normalTexture': 1,\r\n 'bumpTexture': 1\r\n};\r\n\r\nfunction needRefreshMaterial(oldSymbolDef, newSymbolDef) {\r\n for (const p in newSymbolDef) {\r\n // 指定的纹理从无到有,或从有到无时,需要刷新style\r\n if (MATERIAL_PROP_NEED_REBUILD_IN_VT[p] && (newSymbolDef[p] !== oldSymbolDef[p] && (!oldSymbolDef[p] || !newSymbolDef[p]))) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { reshader } from '@maptalks/gl';\r\nimport { mat4 } from '@maptalks/gl';\r\nimport { extend, hasOwn } from '../Util';\r\nimport MeshPainter from './MeshPainter';\r\n\r\nclass PhongPainter extends MeshPainter {\r\n\r\n createGeometry(glData) {\r\n const data = glData.data;\r\n const symbol = this.getSymbols()[0];\r\n const extrusionOpacity = symbol.material && symbol.material.extrusionOpacity;\r\n if (extrusionOpacity) {\r\n const aExtrusionOpacity = new Uint8Array(data.aPosition.length / 3);\r\n for (let i = 0; i < data.aPosition.length; i += 3) {\r\n if (data.aPosition[i + 2] > 0) {\r\n //top\r\n aExtrusionOpacity[i / 3] = 0;\r\n } else {\r\n aExtrusionOpacity[i / 3] = 1;\r\n }\r\n }\r\n data.aExtrusionOpacity = aExtrusionOpacity;\r\n }\r\n const geometry = new reshader.Geometry(data, glData.indices);\r\n extend(geometry.properties, glData.properties);\r\n this._prepareFeatureIds(geometry, glData);\r\n return {\r\n geometry,\r\n symbolIndex: { index: 0 }\r\n };\r\n }\r\n\r\n updateSceneConfig(config) {\r\n let needRefresh;\r\n if (this.sceneConfig.cullFace !== config.cullFace) {\r\n needRefresh = true;\r\n }\r\n extend(this.sceneConfig, config);\r\n if (needRefresh) {\r\n const config = this.getShaderConfig();\r\n this.shader.dispose();\r\n this.shader = new reshader.PhongShader(config);\r\n }\r\n this.setToRedraw();\r\n }\r\n\r\n getShader() {\r\n return this.shader;\r\n }\r\n\r\n delete(context) {\r\n this.getMap().off('updatelights', this._updateLights, this);\r\n super.delete(context);\r\n this.material.dispose();\r\n }\r\n\r\n init() {\r\n this.getMap().on('updatelights', this._updateLights, this);\r\n const regl = this.regl;\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n\r\n const config = this.getShaderConfig();\r\n\r\n this.shader = new reshader.PhongShader(config);\r\n\r\n this._updateMaterial();\r\n\r\n\r\n const pickingConfig = {\r\n vert: this.getPickingVert(),\r\n uniforms: [\r\n 'projViewMatrix',\r\n 'modelMatrix',\r\n 'positionMatrix',\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n return mat4.multiply([], props['projViewMatrix'], props['modelMatrix']);\r\n }\r\n }\r\n ],\r\n extraCommandProps: {\r\n viewport: this.pickingViewport\r\n }\r\n };\r\n this.picking = [new reshader.FBORayPicking(this.renderer, pickingConfig, this.layer.getRenderer().pickingFBO, this.getMap())];\r\n\r\n }\r\n\r\n _updateLights() {\r\n this.setToRedraw();\r\n }\r\n\r\n getShaderConfig() {\r\n const canvas = this.canvas;\r\n const viewport = {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return canvas ? canvas.width : 1;\r\n },\r\n height: () => {\r\n return canvas ? canvas.height : 1;\r\n }\r\n };\r\n return {\r\n extraCommandProps: {\r\n //enable cullFace\r\n cull: {\r\n enable: () => {\r\n return this.sceneConfig.cullFace === undefined || !!this.sceneConfig.cullFace;\r\n },\r\n face: () => {\r\n let cull = this.sceneConfig.cullFace;\r\n if (cull === true) {\r\n cull = 'back';\r\n }\r\n return cull || 'back';\r\n }\r\n },\r\n stencil: {\r\n enable: true,\r\n func: {\r\n cmp: '<=',\r\n ref: (context, props) => {\r\n return props.level;\r\n }\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n range: this.sceneConfig.depthRange || [0, 1],\r\n func: this.sceneConfig.depthFunc || '<='\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n },\r\n viewport,\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n }\r\n };\r\n }\r\n\r\n _updateMaterial() {\r\n if (this.material) {\r\n this.material.dispose();\r\n }\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n const materialConfig = this.getSymbols()[0].material;\r\n const material = {};\r\n for (const p in materialConfig) {\r\n if (hasOwn(materialConfig, p)) {\r\n material[p] = materialConfig[p];\r\n if (p === 'uvRotation') {\r\n material[p] = material[p] * Math.PI / 180;\r\n if (!isVectorTile) {\r\n material[p] *= -1;\r\n }\r\n }\r\n }\r\n }\r\n this.material = new reshader.PhongMaterial(material);\r\n }\r\n\r\n\r\n getUniformValues(map, context) {\r\n const viewMatrix = map.viewMatrix,\r\n projMatrix = map.projMatrix,\r\n cameraPosition = map.cameraPosition;\r\n const lightUniforms = this._getLightUniformValues();\r\n const uniforms = extend({\r\n viewMatrix, projMatrix, cameraPosition,\r\n projViewMatrix: map.projViewMatrix\r\n }, lightUniforms);\r\n if (context && context.jitter) {\r\n uniforms['halton'] = context.jitter;\r\n } else {\r\n uniforms['halton'] = [0, 0];\r\n }\r\n const canvas = this.layer.getRenderer().canvas;\r\n uniforms['outSize'] = [canvas.width, canvas.height];\r\n return uniforms;\r\n }\r\n\r\n getPickingVert() {\r\n // return `\r\n // attribute vec3 aPosition;\r\n // uniform mat4 projViewModelMatrix;\r\n // #include <fbo_picking_vert>\r\n // void main() {\r\n // vec4 pos = vec4(aPosition, 1.0);\r\n // gl_Position = projViewModelMatrix * pos;\r\n // fbo_picking_setData(gl_Position.w, true);\r\n // }\r\n // `;\r\n return `\r\n attribute vec3 aPosition;\r\n uniform mat4 projViewModelMatrix;\r\n uniform mat4 modelMatrix;\r\n uniform mat4 positionMatrix;\r\n //引入fbo picking的vert相关函数\r\n #include <fbo_picking_vert>\r\n #include <get_output>\r\n void main()\r\n {\r\n mat4 localPositionMatrix = getPositionMatrix();\r\n vec4 localPosition = getPosition(aPosition);\r\n\r\n gl_Position = projViewModelMatrix * localPositionMatrix * localPosition;\r\n //传入gl_Position的depth值\r\n fbo_picking_setData(gl_Position.w, true);\r\n }\r\n `;\r\n }\r\n\r\n _getLightUniformValues() {\r\n const lightManager = this.getMap().getLightManager();\r\n const ambientLight = lightManager && lightManager.getAmbientLight() || {};\r\n const directionalLight = lightManager && lightManager.getDirectionalLight() || {};\r\n\r\n const uniforms = {\r\n 'ambientColor': ambientLight.color || [0.2, 0.2, 0.2],\r\n 'light0_diffuse': [...(directionalLight.color || [0.1, 0.1, 0.1]), 1],\r\n 'lightSpecular': directionalLight.specular || [0.8, 0.8, 0.8],\r\n 'light0_viewDirection': directionalLight.direction || [1, 1, -1]\r\n };\r\n\r\n return uniforms;\r\n }\r\n\r\n}\r\n\r\nexport default PhongPainter;\r\n","import { reshader } from '@maptalks/gl';\r\nimport { mat4 } from '@maptalks/gl';\r\nimport Painter from './Painter';\r\n// import { toUint8ColorInGlobalVar } from '../Util';\r\n\r\nconst vert = `\r\n attribute vec3 aPosition;\r\n attribute vec4 aColor;\r\n\r\n uniform mat4 projViewModelMatrix;\r\n uniform vec2 outSize;\r\n\r\n varying vec4 vColor;\r\n\r\n void main()\r\n {\r\n gl_Position = projViewModelMatrix * vec4(aPosition, 1.0);\r\n vColor = aColor / 255.0;\r\n }\r\n`;\r\n\r\nconst frag = `\r\n #ifdef GL_ES\r\n precision lowp float;\r\n #endif\r\n\r\n uniform float opacity;\r\n\r\n varying vec4 vColor;\r\n\r\n void main()\r\n {\r\n gl_FragColor = vColor * opacity;\r\n }\r\n`;\r\n\r\nconst SCALE = [1, 1, 1];\r\n\r\nclass WireframePainter extends Painter {\r\n\r\n createGeometry(glData) {\r\n const { data, indices } = glData;\r\n const geometry = new reshader.Geometry(data, indices, 0, { 'primitive': 'lines' });\r\n geometry.generateBuffers(this.regl);\r\n return {\r\n geometry,\r\n symbolIndex: { index: 0 }\r\n };\r\n }\r\n\r\n createMesh(geo, transform) {\r\n const { geometry } = geo;\r\n const mesh = new reshader.Mesh(geometry);\r\n mesh.castShadow = false;\r\n if (this.sceneConfig.animation) {\r\n SCALE[2] = 0.01;\r\n const mat = [];\r\n mat4.fromScaling(mat, SCALE);\r\n mat4.multiply(mat, transform, mat);\r\n transform = mat;\r\n }\r\n mesh.setLocalTransform(transform);\r\n mesh.properties.symbolIndex = { index: 0 };\r\n // mat4.fromScaling(mesh.positionMatrix, [1.1, 1.1, 1.1]);\r\n return mesh;\r\n }\r\n\r\n addMesh(mesh, progress) {\r\n if (!mesh.length) {\r\n return this;\r\n }\r\n let mat;\r\n if (progress !== null) {\r\n if (progress === 0) {\r\n progress = 0.01;\r\n }\r\n mat = mesh[0].localTransform;\r\n SCALE[2] = progress;\r\n mat4.fromScaling(mat, SCALE);\r\n mat4.multiply(mat, mesh[0].properties.tileTransform, mat);\r\n } else {\r\n mat = mesh[0].properties.tileTransform;\r\n }\r\n for (let i = 0; i < mesh.length; i++) {\r\n mesh[i].setLocalTransform(mat);\r\n }\r\n this.scene.addMesh(mesh);\r\n return this;\r\n }\r\n\r\n init() {\r\n const regl = this.regl;\r\n\r\n this.scene = new reshader.Scene();\r\n\r\n this.renderer = new reshader.Renderer(regl);\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\r\n const config = {\r\n vert,\r\n frag,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ],\r\n extraCommandProps: {\r\n stencil: {\r\n enable: true,\r\n func: {\r\n cmp: '<=',\r\n ref: (context, props) => {\r\n return props.level;\r\n },\r\n // mask: 0xff\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n },\r\n viewport\r\n }\r\n };\r\n\r\n this.shader = new reshader.MeshShader(config);\r\n }\r\n\r\n getUniformValues(map) {\r\n const opacity = this.sceneConfig.opacity || 0.3;\r\n const canvas = this.layer.getRenderer().canvas;\r\n return {\r\n projViewMatrix: map.projViewMatrix,\r\n outSize: [canvas.width, canvas.height],\r\n opacity\r\n };\r\n }\r\n}\r\n\r\nexport default WireframePainter;\r\n","import * as maptalks from 'maptalks';\r\nimport { reshader, mat4 } from '@maptalks/gl';\r\nimport { extend, hasOwn, isNil } from '../../Util';\r\nimport MeshPainter from '../MeshPainter';\r\n\r\nconst { getPBRUniforms } = reshader.pbr.PBRUtils;\r\n\r\nclass StandardPainter extends MeshPainter {\r\n constructor(...args) {\r\n super(...args);\r\n this._loader = new reshader.ResourceLoader(null, this.layer.getURLModifier());\r\n this.scene.sortFunction = this.sortByCommandKey;\r\n }\r\n\r\n supportRenderMode(mode) {\r\n // maptalks-studio#1120, 因为ssr有两种绘制模式,开启taa时会出现闪烁,\r\n if (this.getSymbols()[0].ssr) {\r\n return mode === 'fxaa' || mode === 'fxaaAfterTaa';\r\n } else {\r\n return super.supportRenderMode(mode);\r\n }\r\n }\r\n\r\n isAnimating() {\r\n const uvOffsetAnim = this._getUVOffsetAnim();\r\n if (uvOffsetAnim && (uvOffsetAnim[0] || uvOffsetAnim[1])) {\r\n return true;\r\n }\r\n }\r\n\r\n needToRedraw() {\r\n const uvOffsetAnim = this._getUVOffsetAnim();\r\n if (uvOffsetAnim && (uvOffsetAnim[0] || uvOffsetAnim[1])) {\r\n return true;\r\n }\r\n return super.needToRedraw();\r\n }\r\n\r\n _getUVOffsetAnim() {\r\n const symbol = this.getSymbols()[0];\r\n return symbol.material && symbol.material.uvOffsetAnim;\r\n }\r\n\r\n createGeometry(glData) {\r\n if (!glData.data || !glData.data.aPosition || !glData.data.aPosition.length) {\r\n return null;\r\n }\r\n const desc = {\r\n uv0Attribute: 'aTexCoord0'\r\n };\r\n if (glData.aAltitude) {\r\n desc.altitudeAttribute = 'aAltitude';\r\n }\r\n const geometry = new reshader.Geometry(glData.data, glData.indices, 0, desc);\r\n extend(geometry.properties, glData.properties);\r\n if (glData.vertexColors) {\r\n geometry.properties.vertexColors = glData.vertexColors;\r\n }\r\n if (this.material.uniforms.normalTexture && !geometry.data[geometry.desc.tangentAttribute] && geometry.data[geometry.desc.uv0Attribute]) {\r\n if (!geometry.data[geometry.desc.normalAttribute]) {\r\n geometry.createNormal();\r\n }\r\n geometry.createTangent();\r\n }\r\n\r\n this._prepareFeatureIds(geometry, glData);\r\n return {\r\n geometry,\r\n symbolIndex: { index: 0 }\r\n };\r\n }\r\n\r\n paint(context) {\r\n const hasShadow = !!context.shadow;\r\n if (context.states && context.states.includesChanged) {\r\n this.shader.dispose();\r\n delete this.shader;\r\n this._updateDepthShader.dispose();\r\n delete this._updateDepthShader;\r\n this._createShader(context);\r\n }\r\n let isSsr = !!context.ssr && this.getSymbols()[0].ssr;\r\n const shader = this.shader;\r\n const shaderDefines = shader.shaderDefines;\r\n if (isSsr) {\r\n const defines = extend({}, shaderDefines, context.ssr.defines);\r\n shader.shaderDefines = defines;\r\n }\r\n if (context.onlyUpdateDepthInTaa) {\r\n this.shader = this._updateDepthShader;\r\n // #2793\r\n // 上一帧如果开启了ssr,当前帧关闭ssr时,因为上一帧的ssr绘制到了ssr fbo里,这里必须要重新绘制\r\n if (!isSsr && this._previousSSR) {\r\n this.shader = shader;\r\n this.setToRedraw(true);\r\n }\r\n }\r\n this.updateIBLDefines(shader);\r\n super.paint(context);\r\n if (this.shadowCount !== undefined && hasShadow) {\r\n const count = this.scene.getMeshes().length;\r\n if (this.shadowCount !== count) {\r\n this.setToRedraw();\r\n }\r\n }\r\n this.shader = shader;\r\n if (isSsr) {\r\n shader.shaderDefines = shaderDefines;\r\n }\r\n delete this.shadowCount;\r\n\r\n // const uvOffsetAnim = this._getUVOffsetAnim();\r\n // if (uvOffsetAnim && (uvOffsetAnim[0] || uvOffsetAnim[1])) {\r\n // this.material.set('uvOffset', [0, 0]);\r\n // } else {\r\n // const offset = this.getUVOffset(uvOffsetAnim);\r\n // this.material.set('uvOffset', offset);\r\n // }\r\n this._previousSSR = isSsr;\r\n }\r\n\r\n updateSceneConfig(config) {\r\n extend(this.sceneConfig, config);\r\n this.setToRedraw();\r\n }\r\n\r\n\r\n delete() {\r\n super.delete();\r\n this.disposeIBLTextures();\r\n this.material.dispose();\r\n if (this._updateDepthShader) {\r\n this._updateDepthShader.dispose();\r\n delete this._updateDepthShader;\r\n }\r\n }\r\n\r\n\r\n\r\n init(context) {\r\n this.getMap().on('updatelights', this._onUpdatelights, this);\r\n this.createIBLTextures();\r\n //保存context,updateSceneConfig时读取\r\n this._context = this._context || context;\r\n const regl = this.regl;\r\n this.renderer = new reshader.Renderer(regl);\r\n\r\n this._bindedOnTextureLoad = this._onTextureLoad.bind(this);\r\n this._bindDisposeCachedTexture = this.disposeCachedTexture.bind(this);\r\n this._bindOnMaterialComplete = this._onMaterialComplete.bind(this);\r\n\r\n this._updateMaterial();\r\n\r\n this._createShader(context);\r\n\r\n const pickingConfig = {\r\n vert: `\r\n #include <gl2_vert>\r\n attribute vec3 aPosition;\r\n uniform mat4 projViewModelMatrix;\r\n uniform mat4 positionMatrix;\r\n //引入fbo picking的vert相关函数\r\n #include <line_extrusion_vert>\r\n #include <get_output>\r\n #include <fbo_picking_vert>\r\n void main() {\r\n mat4 localPositionMatrix = getPositionMatrix();\r\n #ifdef IS_LINE_EXTRUSION\r\n vec3 linePosition = getLineExtrudePosition(aPosition);\r\n vec4 localVertex = getPosition(linePosition);\r\n #else\r\n vec4 localVertex = getPosition(aPosition);\r\n #endif\r\n\r\n gl_Position = projViewModelMatrix * localPositionMatrix * localVertex;\r\n fbo_picking_setData(gl_Position.w, true);\r\n }\r\n `,\r\n uniforms: [\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 extraCommandProps: {\r\n viewport: this.pickingViewport,\r\n depth: {\r\n enable: true,\r\n range: this.sceneConfig.depthRange || [0, 1],\r\n func: this.sceneConfig.depthFunc || '<=',\r\n mask: isNil(this.sceneConfig.depthMask) ? true : this.sceneConfig.depthMask\r\n }\r\n }\r\n };\r\n this.picking = [new reshader.FBORayPicking(this.renderer, pickingConfig, this.layer.getRenderer().pickingFBO, this.getMap())];\r\n\r\n }\r\n\r\n _createShader(context) {\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 defines = {};\r\n const uniformDeclares = [];\r\n uniformDeclares.push(...reshader.SsrPass.getUniformDeclares());\r\n this.fillIncludes(defines, uniformDeclares, context);\r\n const extraCommandProps = {\r\n cull: {\r\n enable: () => {\r\n return this.sceneConfig.cullFace === undefined || !!this.sceneConfig.cullFace;\r\n },\r\n face: () => {\r\n return this.sceneConfig.cullFace || 'back';\r\n }\r\n },\r\n stencil: {\r\n enable: (_, props) => {\r\n return props['hasAlpha'] === undefined || !!props['hasAlpha'];\r\n },\r\n func: {\r\n cmp: '<=',\r\n ref: (_, props) => {\r\n return props.stencilRef;\r\n },\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n viewport,\r\n depth: {\r\n enable: true,\r\n range: this.sceneConfig.depthRange || [0, 1],\r\n func: this.sceneConfig.depthFunc || '<='\r\n },\r\n blend: {\r\n enable: (_, props) => {\r\n return props['hasAlpha'] === undefined || !!props['hasAlpha'];\r\n },\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n };\r\n const config = {\r\n uniforms: uniformDeclares,\r\n defines: this._getDefines(defines),\r\n extraCommandProps\r\n };\r\n\r\n this.shader = new reshader.pbr.StandardShader(config);\r\n config.frag = `\r\n precision mediump float;\r\n #include <gl2_frag>\r\n void main() {\r\n glFragColor = vec4(0.0);\r\n #if __VERSION__ == 100\r\n gl_FragColor = glFragColor;\r\n #endif\r\n }\r\n `;\r\n this._updateDepthShader = new reshader.pbr.StandardShader(config);\r\n }\r\n\r\n _onTextureLoad({ resources }) {\r\n for (let i = 0; i < resources.length; i++) {\r\n this.addCachedTexture(resources[i].url, resources[i].data);\r\n }\r\n this.setToRedraw(true);\r\n }\r\n\r\n _onMaterialComplete() {\r\n this.setToRedraw(true);\r\n }\r\n\r\n _updateMaterial(config) {\r\n if (config) {\r\n const symbolMaterial = this.getSymbols()[0].material;\r\n if (symbolMaterial) {\r\n extend(symbolMaterial, config);\r\n }\r\n }\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n const dataConfig = this.dataConfig;\r\n const materialConfig = config || this.getSymbols()[0].material;\r\n const material = {};\r\n let hasTexture = false;\r\n for (const p in materialConfig) {\r\n if (hasOwn(materialConfig, p)) {\r\n if (p.indexOf('Texture') > 0) {\r\n //纹理图片\r\n let texConf = materialConfig[p];\r\n if (!texConf) {\r\n material[p] = undefined;\r\n continue;\r\n }\r\n const url = typeof texConf === 'string' ? texConf : texConf.url;\r\n const cachedTex = this.getCachedTexture(url);\r\n\r\n if (cachedTex) {\r\n //已有缓存\r\n if (cachedTex.then) {\r\n //是一个promise\r\n if (url === texConf) {\r\n texConf = {\r\n promise: cachedTex,\r\n wrap: 'repeat'\r\n };\r\n } else {\r\n texConf.promise = cachedTex;\r\n }\r\n } else if (url === texConf) {\r\n //已有图片数据\r\n texConf = {\r\n data: cachedTex,\r\n wrap: 'repeat'\r\n };\r\n } else {\r\n //已有图片数据\r\n texConf.data = cachedTex;\r\n }\r\n } else if (url === texConf) {\r\n //无缓存\r\n texConf = {\r\n url,\r\n wrap: 'repeat'\r\n };\r\n }\r\n texConf.flipY = !dataConfig.upsideUpTexture;\r\n texConf.min = 'linear mipmap linear';\r\n texConf.mag = 'linear';\r\n material[p] = new reshader.Texture2D(texConf, this._loader);\r\n material[p].once('complete', this._bindedOnTextureLoad);\r\n material[p].once('disposed', this._bindDisposeCachedTexture);\r\n if (material[p].promise) {\r\n //把promise加入缓存,方便图片被多个纹理对象同时引用时,避免重复请求\r\n this.addCachedTexture(url, material[p].promise);\r\n }\r\n hasTexture = true;\r\n } else {\r\n material[p] = materialConfig[p];\r\n if (p === 'uvRotation') {\r\n material[p] = Math.PI * material[p] / 180;\r\n if (!isVectorTile) {\r\n material[p] *= -1;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (material.alphaTest === undefined && this.getMaterialClazz) {\r\n material.alphaTest = 0.05;\r\n }\r\n if (!this.material) {\r\n this.material = new reshader.pbr.StandardMaterial(material);\r\n this.material.once('complete', this._bindOnMaterialComplete);\r\n } else {\r\n for (let p in material) {\r\n this.material.set(p, material[p]);\r\n }\r\n this.setToRedraw(true);\r\n }\r\n\r\n if (!hasTexture) {\r\n this._onMaterialComplete();\r\n }\r\n }\r\n\r\n getShader() {\r\n return this.shader;\r\n }\r\n\r\n getUniformValues(map, context) {\r\n const { iblTexes, dfgLUT } = this.getIBLRes();\r\n const uniforms = getPBRUniforms(map, iblTexes, dfgLUT, context && context.ssr, context && context.jitter);\r\n this.setIncludeUniformValues(uniforms, context);\r\n return uniforms;\r\n }\r\n\r\n _getDefines(defines) {\r\n if (this.hasIBL()) {\r\n defines['HAS_IBL_LIGHTING'] = 1;\r\n } else {\r\n delete defines['HAS_IBL_LIGHTING'];\r\n }\r\n // defines['OUTPUT_NORMAL'] = 1;\r\n return defines;\r\n }\r\n\r\n _onUpdatelights() {\r\n if (!this.shader) {\r\n return;\r\n }\r\n const defines = this.shader.shaderDefines;\r\n this._getDefines(defines);\r\n this.shader.shaderDefines = defines;\r\n\r\n }\r\n}\r\n\r\nexport default StandardPainter;\r\n\r\n// function firstUpperCase(str) {\r\n// return str.charAt(0).toUpperCase() + str.substring(1);\r\n// }\r\n","import * as maptalks from 'maptalks';\r\nimport { Color } from '@maptalks/vector-packer';\r\nimport { StyleUtil } from '@maptalks/vector-packer';\r\nimport { reshader, mat4, mat3 } from '@maptalks/gl';\r\nimport BasicPainter from './BasicPainter';\r\nimport { setUniformFromSymbol, createColorSetter, toUint8ColorInGlobalVar, isNil } from '../Util';\r\nimport { prepareFnTypeData, isFnTypeSymbol } from './util/fn_type_util';\r\nimport { createAtlasTexture } from './util/atlas_util';\r\nimport tubeVert from './glsl/tube.vert';\r\nimport { isFunctionDefinition, piecewiseConstant, interpolated } from '@maptalks/function-type';\r\n\r\nconst { getPBRUniforms } = reshader.pbr.PBRUtils;\r\n\r\nclass TubePainter extends BasicPainter {\r\n\r\n needToRedraw() {\r\n return super.needToRedraw() || this.isAnimating();\r\n }\r\n\r\n isTerrainSkin() {\r\n return false;\r\n }\r\n\r\n isTerrainVector() {\r\n return true;\r\n }\r\n\r\n isUniqueStencilRefPerTile() {\r\n return false;\r\n }\r\n\r\n supportRenderMode(mode) {\r\n if (this.isAnimating()) {\r\n return mode === 'fxaa' || mode === 'fxaaAfterTaa';\r\n } else {\r\n return mode === 'taa' || mode === 'fxaa';\r\n }\r\n }\r\n\r\n isAnimating() {\r\n if (this._hasPatternAnim) {\r\n return true;\r\n }\r\n const symbols = this.getSymbols();\r\n for (let i = 0; i < symbols.length; i++) {\r\n if (symbols[i]['linePatternFile'] && symbols[i]['linePatternAnimSpeed']) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n isBloom(mesh) {\r\n const symbol = this.getSymbol(mesh.properties.symbolIndex);\r\n return !!symbol['lineBloom'];\r\n }\r\n\r\n createMesh(geo, transform) {\r\n if (!geo.geometry) {\r\n return null;\r\n }\r\n const map = this.getMap();\r\n const { geometry, symbolIndex, ref } = geo;\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n if (ref === undefined) {\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n }\r\n\r\n const symbol = this.getSymbol(symbolIndex);\r\n const { tileResolution, tileRatio } = geometry.properties;\r\n const uniforms = {\r\n tileResolution,\r\n tileRatio,\r\n };\r\n\r\n // 为了支持和linePattern合成,把默认lineColor设为白色\r\n setUniformFromSymbol(uniforms, 'lineColor', symbol, 'lineColor', '#fff', createColorSetter(this.colorCache));\r\n setUniformFromSymbol(uniforms, 'linePatternGapColor', symbol, 'linePatternGapColor', [1, 1, 1, 1], createColorSetter(this.colorCache));\r\n setUniformFromSymbol(uniforms, 'lineWidth', symbol, 'lineWidth', 2, v => {\r\n const scale = StyleUtil.getTubeSizeScale(this.dataConfig.metric);\r\n return scale * v;\r\n });\r\n setUniformFromSymbol(uniforms, 'lineOpacity', symbol, 'lineOpacity', 1);\r\n setUniformFromSymbol(uniforms, 'linePatternAnimSpeed', symbol, 'linePatternAnimSpeed', 0);\r\n setUniformFromSymbol(uniforms, 'linePatternGap', symbol, 'linePatternGap', 0);\r\n setUniformFromSymbol(uniforms, 'metallicFactor', symbol, 'metallicFactor', 0);\r\n setUniformFromSymbol(uniforms, 'roughnessFactor', symbol, 'roughnessFactor', 0.4);\r\n setUniformFromSymbol(uniforms, 'emissiveFactor', symbol, 'emissiveFactor', [0, 0, 0]);\r\n setUniformFromSymbol(uniforms, 'uvScale', symbol, 'uvScale', [1, 1]);\r\n\r\n const iconAtlas = geometry.properties.iconAtlas;\r\n const isVectorTile = this.layer instanceof maptalks.TileLayer;\r\n if (iconAtlas) {\r\n uniforms.linePatternFile = createAtlasTexture(this.regl, iconAtlas, false);\r\n uniforms.atlasSize = iconAtlas ? [iconAtlas.width, iconAtlas.height] : [0, 0];\r\n uniforms.flipY = isVectorTile ? -1 : 1;\r\n this.drawDebugAtlas(iconAtlas);\r\n }\r\n\r\n if (ref === undefined) {\r\n geometry.generateBuffers(this.regl);\r\n }\r\n uniforms.alphaTest = -1;\r\n const material = new reshader.pbr.StandardMaterial(uniforms);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n castShadow: false,\r\n picking: true\r\n });\r\n // 10000 是100米转厘米\r\n const centiMeterToLocal = map.distanceToPointAtRes(100, 100, geometry.properties.tileResolution)['_multi'](tileRatio / 10000).toArray();\r\n mesh.setUniform('centiMeterToLocal', centiMeterToLocal);\r\n const baseResolution = map.getResolution(map.getMaxNativeZoom());\r\n mesh.setUniform('animSpeedScale', tileResolution / baseResolution);\r\n mesh.setLocalTransform(transform);\r\n\r\n const defines = {\r\n 'IS_LINE_EXTRUSION': 1,\r\n 'HAS_LAYER_OPACITY': 1\r\n };\r\n if (this.dataConfig.type === 'square-tube') {\r\n defines['IS_SQUARE_TUBE'] = 1;\r\n }\r\n if (iconAtlas) {\r\n defines['HAS_PATTERN'] = 1;\r\n }\r\n mesh.properties.symbolIndex = symbolIndex;\r\n if (geometry.data.aColor) {\r\n defines['HAS_COLOR'] = 1;\r\n }\r\n this.setMeshDefines(defines, geometry, symbolDef);\r\n if (geometry.data.aAltitude) {\r\n defines['HAS_ALTITUDE'] = 1;\r\n }\r\n mesh.setDefines(defines);\r\n return mesh;\r\n }\r\n\r\n setMeshDefines(defines, geometry, symbolDef) {\r\n if (geometry.data.aOpacity) {\r\n defines['HAS_OPACITY'] = 1;\r\n }\r\n if (geometry.data.aLineWidth) {\r\n defines['HAS_LINE_WIDTH'] = 1;\r\n }\r\n if (isFnTypeSymbol(symbolDef['linePatternAnimSpeed'])) {\r\n defines['HAS_PATTERN_ANIM'] = 1;\r\n }\r\n if (isFnTypeSymbol(symbolDef['linePatternGap'])) {\r\n defines['HAS_PATTERN_GAP'] = 1;\r\n }\r\n }\r\n\r\n paint(context) {\r\n if (context.states && context.states.includesChanged['shadow']) {\r\n this.shader.dispose();\r\n this.createShader(context);\r\n }\r\n // const hasShadow = !!context.shadow;\r\n super.paint(context);\r\n // if (this.shadowCount !== undefined && hasShadow) {\r\n // const count = this.scene.getMeshes().length;\r\n // if (this.shadowCount !== count) {\r\n // this.setToRedraw();\r\n // }\r\n // }\r\n // delete this.shadowCount;\r\n }\r\n\r\n // getShadowMeshes() {\r\n // if (!this.isVisible()) {\r\n // return EMPTY_ARRAY;\r\n // }\r\n // const meshes = this.scene.getMeshes().filter(m => m.properties.level === 0);\r\n // this.shadowCount = meshes.length;\r\n // return meshes;\r\n // }\r\n\r\n init(context) {\r\n this.getMap().on('updatelights', this._onUpdatelights, this);\r\n this.createIBLTextures();\r\n const regl = this.regl;\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n\r\n this.createShader(context);\r\n\r\n if (this.pickingFBO) {\r\n const modelNormalMatrix = [];\r\n this.picking = [new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: '#define PICKING_MODE 1\\n' + tubeVert,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\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: this.getExtraCommandProps()\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n )];\r\n }\r\n }\r\n\r\n createShader(context) {\r\n this._context = context;\r\n const uniforms = [];\r\n const defines = {};\r\n this.fillIncludes(defines, uniforms, context);\r\n uniforms.push(\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n );\r\n\r\n this.shader = new reshader.pbr.StandardShader({\r\n vert: tubeVert,\r\n uniforms,\r\n defines: this._getDefines(defines),\r\n extraCommandProps: this.getExtraCommandProps()\r\n });\r\n }\r\n\r\n getExtraCommandProps() {\r\n const canvas = this.canvas;\r\n const viewport = {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return canvas ? canvas.width : 1;\r\n },\r\n height: () => {\r\n return canvas ? canvas.height : 1;\r\n }\r\n };\r\n const depthRange = this.sceneConfig.depthRange;\r\n return {\r\n viewport,\r\n stencil: {\r\n enable: true,\r\n func: {\r\n cmp: () => {\r\n return '<=';\r\n },\r\n ref: (context, props) => {\r\n return props.level;\r\n }\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n cull: {\r\n enable: () => {\r\n return !!this.sceneConfig.cullFace;\r\n },\r\n face: this.sceneConfig.cullFace || 'back'\r\n },\r\n depth: {\r\n enable: true,\r\n range: depthRange || [0, 1],\r\n mask: this.sceneConfig.depthMask || true,\r\n func: this.sceneConfig.depthFunc || '<='\r\n },\r\n blend: {\r\n enable: true,\r\n func: this.getBlendFunc(),\r\n equation: 'add'\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n };\r\n }\r\n\r\n getUniformValues(map, context) {\r\n const { iblTexes, dfgLUT } = this.getIBLRes();\r\n const uniforms = getPBRUniforms(map, iblTexes, dfgLUT, null, context && context.jitter);\r\n const projViewMatrix = map.projViewMatrix,\r\n viewMatrix = map.viewMatrix;\r\n uniforms.projViewMatrix = projViewMatrix;\r\n uniforms.viewMatrix = viewMatrix;\r\n uniforms.resolution = map.getResolution();\r\n uniforms.currentTime = this.layer.getRenderer().getFrameTimestamp() || 0;\r\n\r\n this.setIncludeUniformValues(uniforms, context);\r\n return uniforms;\r\n }\r\n\r\n createFnTypeConfig(map, symbolDef) {\r\n const aColorFn = piecewiseConstant(symbolDef['lineColor']);\r\n const aLinePatternAnimSpeedFn = piecewiseConstant(symbolDef['aLinePatternAnimSpeed']);\r\n const aLinePatternGapFn = piecewiseConstant(symbolDef['aLinePatternGap']);\r\n const shapeConfigs = this.createShapeFnTypeConfigs(map, symbolDef);\r\n const i8 = new Int8Array(2);\r\n return [\r\n {\r\n //geometry.data 中的属性数据\r\n attrName: 'aColor',\r\n //symbol中的function-type属性\r\n symbolName: 'lineColor',\r\n type: Uint8Array,\r\n width: 4,\r\n define: 'HAS_COLOR',\r\n evaluate: (properties, geometry) => {\r\n let color = aColorFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(color)) {\r\n color = this.evaluateInFnTypeConfig(color, geometry, map, properties, true);\r\n }\r\n if (!Array.isArray(color)) {\r\n color = this.colorCache[color] = this.colorCache[color] || Color(color).unitArray();\r\n }\r\n color = toUint8ColorInGlobalVar(color);\r\n return color;\r\n }\r\n },\r\n {\r\n attrName: 'aLinePattern',\r\n symbolName: 'linePatternAnimSpeed',\r\n type: Int8Array,\r\n width: 2,\r\n related: ['linePatternGap'],\r\n define: 'HAS_LINE_PATTERN',\r\n evaluate: (properties, geometry, arr, index) => {\r\n let speed = aLinePatternAnimSpeedFn(map.getZoom(), properties);\r\n if (isNil(speed)) {\r\n speed = 0;\r\n }\r\n if (speed !== 0) {\r\n geometry.properties.hasPatternAnim = 1;\r\n }\r\n i8[0] = speed / 127;\r\n i8[1] = arr[index + 1];\r\n return i8;\r\n }\r\n },\r\n {\r\n attrName: 'aLinePattern',\r\n symbolName: 'linePatternGap',\r\n type: Int8Array,\r\n width: 2,\r\n related: ['linePatternAnimSpeed'],\r\n define: 'HAS_LINE_PATTERN',\r\n evaluate: (properties, geometry, arr, index) => {\r\n let gap = aLinePatternGapFn(map.getZoom(), properties);\r\n if (isNil(gap)) {\r\n gap = 0;\r\n }\r\n // 0 - 12.7\r\n i8[1] = gap * 10;\r\n i8[0] = arr[index];\r\n return i8;\r\n }\r\n }\r\n ].concat(shapeConfigs);\r\n }\r\n\r\n createShapeFnTypeConfigs(map, symbolDef) {\r\n const aLineWidthFn = interpolated(symbolDef['lineWidth']);\r\n const aLineOpacityFn = interpolated(symbolDef['lineOpacity']);\r\n const u16 = new Uint16Array(1);\r\n return [\r\n {\r\n attrName: 'aLineWidth',\r\n symbolName: 'lineWidth',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_LINE_WIDTH',\r\n evaluate: (properties, geometry) => {\r\n let lineWidth = aLineWidthFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(lineWidth)) {\r\n lineWidth = this.evaluateInFnTypeConfig(lineWidth, geometry, map, properties);\r\n }\r\n //乘以2是为了解决 #190\r\n u16[0] = Math.round(lineWidth * 2.0);\r\n return u16[0];\r\n }\r\n },\r\n {\r\n attrName: 'aOpacity',\r\n symbolName: 'lineOpacity',\r\n type: Uint8Array,\r\n width: 1,\r\n define: 'HAS_OPACITY',\r\n evaluate: (properties, geometry) => {\r\n let opacity = aLineOpacityFn(map.getZoom(), properties);\r\n if (isFunctionDefinition(opacity)) {\r\n opacity = this.evaluateInFnTypeConfig(opacity, geometry, map, properties);\r\n }\r\n u16[0] = opacity * 255;\r\n return u16[0];\r\n }\r\n },\r\n ];\r\n }\r\n\r\n _getDefines(defines) {\r\n if (this.hasIBL()) {\r\n defines['HAS_IBL_LIGHTING'] = 1;\r\n } else {\r\n delete defines['HAS_IBL_LIGHTING'];\r\n }\r\n // defines['OUTPUT_NORMAL'] = 1;\r\n return defines;\r\n }\r\n\r\n _onUpdatelights() {\r\n if (!this.shader) {\r\n return;\r\n }\r\n const defines = this.shader.shaderDefines;\r\n this._getDefines(defines);\r\n this.shader.shaderDefines = defines;\r\n\r\n }\r\n\r\n\r\n delete() {\r\n super.delete();\r\n this.disposeIBLTextures();\r\n if (this.shader) {\r\n this.shader.dispose();\r\n delete this.shader;\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default TubePainter;\r\n\r\n","import { vec3, mat4, quat, reshader } from '@maptalks/gl';\r\nimport { PackUtil } from '@maptalks/vector-packer';\r\nimport { setUniformFromSymbol, createColorSetter, isNumber, extend } from '../Util';\r\nimport { getCentiMeterScale, isNil } from '../../../common/Util';\r\nimport { isFunctionDefinition, interpolated } from '@maptalks/function-type';\r\n\r\nconst V3 = [];\r\nconst TEMP_V3_0 = [];\r\nconst TEMP_V3_1 = [];\r\nconst TEMP_V3_2 = [];\r\nconst Q4 = [];\r\nconst DEFAULT_TRANSLATION = [0, 0, 0];\r\nconst DEFAULT_ROTATION = [0, 0, 0];\r\nconst DEFAULT_SCALE = [1, 1, 1];\r\n\r\nconst EMPTY_ARRAY = [];\r\nconst DEFAULT_MARKER_FILL = [1, 1, 1, 1];\r\nconst TEMP_MATRIX = [];\r\n\r\nconst Y_TO_Z = [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1];\r\n\r\nconst pickingVert = `\r\n attribute vec3 aPosition;\r\n uniform mat4 projViewModelMatrix;\r\n uniform mat4 modelMatrix;\r\n uniform mat4 positionMatrix;\r\n //引入fbo picking的vert相关函数\r\n #include <fbo_picking_vert>\r\n #include <get_output>\r\n void main()\r\n {\r\n mat4 localPositionMatrix = getPositionMatrix();\r\n vec4 localPosition = getPosition(aPosition);\r\n\r\n gl_Position = projViewModelMatrix * localPositionMatrix * localPosition;\r\n //传入gl_Position的depth值\r\n fbo_picking_setData(gl_Position.w, true);\r\n }`;\r\n// TODO 缺少 updateSymbol 的支持\r\nconst GLTFMixin = Base =>\r\n\r\n class extends Base {\r\n constructor(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig) {\r\n super(regl, layer, symbol, sceneConfig, pluginIndex, dataConfig);\r\n this._ready = false;\r\n this.scene.sortFunction = this.sortByCommandKey;\r\n const fetchOptions = sceneConfig.fetchOptions || {};\r\n fetchOptions.referrer = window && window.location.href;\r\n this._gltfManager = new reshader.GLTFManager(regl, {\r\n fetchOptions,\r\n urlModifier: (url) => {\r\n const modifier = layer.getURLModifier();\r\n return modifier && modifier(url) || url;\r\n }\r\n });\r\n this._initTRSFuncType();\r\n this._initGLTF();\r\n }\r\n\r\n isUniqueStencilRefPerTile() {\r\n return false;\r\n }\r\n\r\n isAnimating() {\r\n const symbols = this.getSymbols();\r\n for (let i = 0; i < symbols.length; i++) {\r\n const symbol = symbols[i];\r\n if (!symbol || !this._gltfPack[i]) {\r\n continue;\r\n }\r\n if (this._isSkinAnimating(i)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n createGeometry(glData, features) {\r\n // 无论多少个symbol,gltf插件的数据只会来源于glData中的第一条数据\r\n const { data, positionSize } = glData;\r\n const geometry = {\r\n geometry: {\r\n properties: extend({}, glData.properties),\r\n data,\r\n positionSize,\r\n features\r\n },\r\n symbolIndex: glData.symbolIndex\r\n };\r\n return geometry;\r\n }\r\n\r\n getFnTypeConfig() {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n createMesh(geo, transform, { tileTranslationMatrix, tileExtent }, { timestamp }) {\r\n if (!this._ready) {\r\n return null;\r\n }\r\n const map = this.getMap();\r\n const { geometry } = geo;\r\n const { positionSize, features } = geometry;\r\n const { aPosition, aPickingId, aXYRotation, aZRotation, aAltitude } = geometry.data;\r\n const count = aPosition.length / positionSize;\r\n if (count === 0) {\r\n return null;\r\n }\r\n const instanceData = {\r\n 'instance_vectorA': new Float32Array(count * 4),\r\n 'instance_vectorB': new Float32Array(count * 4),\r\n 'instance_vectorC': new Float32Array(count * 4),\r\n // 'instance_color': [],\r\n 'aPickingId': []\r\n };\r\n const instanceCenter = this._updateInstanceData(instanceData, tileTranslationMatrix, tileExtent, geometry.properties.z, aPosition, aAltitude, aXYRotation, aZRotation, positionSize, aPickingId, features);\r\n if (geometry.data.aTerrainAltitude) {\r\n instanceData.aTerrainAltitude = geometry.data.aTerrainAltitude;\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 / count,\r\n data: instanceData[p]\r\n }),\r\n divisor: 1\r\n };\r\n }\r\n\r\n const hasFnType = this._hasFuncType();\r\n\r\n // 这里不考虑每个模型所处经纬度对meterScale的影响\r\n const meterScale = this._getMeterScale();\r\n const meterToPointMat = mat4.identity([]);\r\n mat4.scale(meterToPointMat, meterToPointMat, [meterScale, meterScale, meterScale]);\r\n\r\n const meshes = [];\r\n const symbols = this.getSymbols();\r\n for (let i = 0; i < symbols.length; i++) {\r\n const symbol = symbols[i];\r\n const meshInfos = this._gltfMeshInfos[i];\r\n if (!meshInfos) {\r\n continue;\r\n }\r\n const gltfPack = this._gltfPack[i][0];\r\n const { fixSizeOnZoom } = symbol;\r\n let trsMatrix = mat4.identity([]);\r\n // let translationInMeters;\r\n if (!hasFnType) {\r\n trsMatrix = this._getSymbolTRSMatrix(trsMatrix);\r\n }\r\n\r\n let zOffset = 0;\r\n //获取多个mesh中,最大的zOffset,保证所有mesh的zOffset是统一的\r\n meshInfos.forEach(info => {\r\n const { geometry, nodeMatrix } = info;\r\n mat4.multiply(TEMP_MATRIX, Y_TO_Z, nodeMatrix);\r\n mat4.multiply(TEMP_MATRIX, trsMatrix, TEMP_MATRIX);\r\n const positionMatrix = mat4.multiply(TEMP_MATRIX, meterToPointMat, TEMP_MATRIX);\r\n\r\n\r\n const gltfBBox = geometry.boundingBox;\r\n const meshBox = gltfBBox.copy();\r\n meshBox.transform(positionMatrix);\r\n\r\n const offset = this._calAnchorTranslation(meshBox, symbol);\r\n if (Math.abs(offset) > Math.abs(zOffset)) {\r\n zOffset = offset;\r\n }\r\n });\r\n const anchorTranslation = [0, 0, zOffset];\r\n // if (!hasFnType) {\r\n // vec3.add(anchorTranslation, translationInMeters, anchorTranslation);\r\n // }\r\n //\r\n const childMeshes = meshInfos.map((info, meshIndex) => {\r\n const { geometry: gltfGeo, materialInfo, morphWeights, extraInfo, nodeIndex } = info;\r\n if (symbol.alphaTest) {\r\n materialInfo.alphaTest = symbol.alphaTest;\r\n }\r\n const MatClazz = this.getMaterialClazz(materialInfo);\r\n const material = new MatClazz(materialInfo);\r\n const defines = {};\r\n // material.set('uOutputLinear', 1);\r\n const mesh = new reshader.InstancedMesh(instanceBuffers, count, gltfGeo, material, {\r\n transparent: false,\r\n // castShadow: false,\r\n picking: true\r\n });\r\n if (gltfPack.hasSkinAnimation()) {\r\n const skinObj = this._updateAnimation(mesh, i, 0)[nodeIndex];\r\n mesh.setUniform('jointTexture', skinObj.jointTexture);\r\n mesh.setUniform('jointTextureSize', skinObj.jointTextureSize);\r\n mesh.setUniform('numJoints', skinObj.numJoints);\r\n mesh.setUniform('skinAnimation', +this._isSkinAnimating(i));\r\n mesh.properties.startTime = timestamp;\r\n defines['HAS_SKIN'] = 1;\r\n }\r\n if (morphWeights) {\r\n mesh.setUniform('morphWeights', morphWeights);\r\n defines['HAS_MORPH'] = 1;\r\n //TODO 什么时候设置 HAS_MORPHNORMALS\r\n }\r\n // StandardPainter 需要hasAlpha决定是否开启stencil和blend\r\n mesh.setUniform('hasAlpha', extraInfo.alphaMode && extraInfo.alphaMode.toUpperCase() === 'BLEND');\r\n setUniformFromSymbol(mesh.uniforms, 'polygonFill', symbol, 'markerFill', DEFAULT_MARKER_FILL, createColorSetter(this.colorCache));\r\n setUniformFromSymbol(mesh.uniforms, 'polygonOpacity', symbol, 'markerOpacity', 1);\r\n // mesh.setPositionMatrix(mat4.multiply([], trsMatrix, nodeMatrix));\r\n const positionMatrix = [];\r\n mesh.setPositionMatrix(() => {\r\n const nodeMatrix = this._getMeshNodeMatrix(i, meshIndex, nodeIndex);\r\n mat4.multiply(positionMatrix, Y_TO_Z, nodeMatrix);\r\n // this._getSymbolTRSMatrix(trsMatrix);\r\n mat4.multiply(positionMatrix, trsMatrix, positionMatrix);\r\n mat4.multiply(positionMatrix, meterToPointMat, positionMatrix);\r\n const matrix = mat4.identity(TEMP_MATRIX)\r\n if (zOffset !== 0) {\r\n mat4.fromTranslation(matrix, anchorTranslation);\r\n mat4.multiply(positionMatrix, matrix, positionMatrix);\r\n }\r\n if (isNumber(fixSizeOnZoom)) {\r\n const scale = map.getGLScale() / map.getGLScale(fixSizeOnZoom);\r\n vec3.set(V3, scale, scale, scale);\r\n mat4.fromScaling(matrix, V3);\r\n return mat4.multiply(matrix, matrix, positionMatrix);\r\n } else {\r\n return positionMatrix;\r\n }\r\n });\r\n // const localTransform = mat4.translate([], tileTranslationMatrix, instanceCenter);\r\n const zScale = this.layer.getRenderer().getZScale();\r\n const localTransform = [];\r\n const center = [];\r\n mesh.setLocalTransform(() => {\r\n const altitude = this.layer.options['altitude'] || 0;\r\n vec3.copy(center, instanceCenter);\r\n center[2] += altitude * 100 * zScale;\r\n mat4.translate(localTransform, tileTranslationMatrix, center);\r\n return localTransform;\r\n });\r\n\r\n gltfGeo.generateBuffers(this.regl, { excludeElementsInVAO: true });\r\n //上面已经生成了buffer,无需再生成\r\n // mesh.generateInstancedBuffers(this.regl);\r\n if (instanceData['instance_color']) {\r\n defines['HAS_INSTANCE_COLOR'] = 1;\r\n }\r\n if (instanceData['aTerrainAltitude']) {\r\n defines['HAS_INSTANCE_TERRAIN_ALTITUDE'] = 1;\r\n mesh.setUniform('terrainAltitudeScale', this.layer.getRenderer().getZScale() * 100);\r\n }\r\n defines['HAS_LAYER_OPACITY'] = 1;\r\n extend(mesh.properties, geometry.properties);\r\n mesh.setDefines(defines);\r\n mesh.properties.symbolIndex = {\r\n index: i\r\n };\r\n return mesh;\r\n });\r\n meshes.push(...childMeshes);\r\n }\r\n\r\n meshes.insContext = {\r\n instanceData,\r\n tileTranslationMatrix,\r\n tileExtent,\r\n aPosition,\r\n positionSize\r\n };\r\n\r\n return meshes;\r\n }\r\n\r\n _getMeshNodeMatrix(symbolIndex, meshIndex, nodeIndex) {\r\n const i = symbolIndex;\r\n const meshInfos = this._gltfMeshInfos[i];\r\n const meshInfo = meshInfos[meshIndex];\r\n if (!this._isSkinAnimating(symbolIndex)) {\r\n return meshInfo.nodeMatrix;\r\n }\r\n return this._nodeMatrixMap && this._nodeMatrixMap[nodeIndex] || meshInfo.nodeMatrix;\r\n }\r\n\r\n _updateAnimation(mesh, symbolIndex, timestamp) {\r\n if (!this._gltfPack) {\r\n return;\r\n }\r\n const gltfPack = this._gltfPack[symbolIndex][0];\r\n if (!this._skinMap) {\r\n this._skinMap = {};\r\n }\r\n this._nodeMatrixMap = {};\r\n if (!this._skinMap[mesh.uuid]) {\r\n this._skinMap[mesh.uuid] = {};\r\n }\r\n const symbols = this.getSymbols();\r\n const symbol = symbols[symbolIndex];\r\n const gltfJSON = this._gltfJSON[symbolIndex];\r\n const { loop, speed, animationName } = symbol;\r\n const currentAnimation = animationName || gltfJSON.animations[0].name;\r\n gltfPack.updateAnimation(timestamp, loop || false, speed || 1, currentAnimation, mesh.properties.startTime || 0, this._nodeMatrixMap, this._skinMap[mesh.uuid]);\r\n return this._skinMap[mesh.uuid];\r\n }\r\n\r\n // _calFitScale(gltfBBox) {\r\n // const maxLength = Math.max(gltfBBox.max[0] - gltfBBox.min[0], gltfBBox.max[1] - gltfBBox.min[1], gltfBBox.max[2] - gltfBBox.min[2]);\r\n // const fitExtent = getFitExtent(this.getMap(), this.layer.options['gltfFitSize']);\r\n // if (fitExtent > maxLength) {\r\n // return 1;\r\n // }\r\n // const ratio = fitExtent / maxLength;\r\n // return ratio;\r\n // }\r\n\r\n _calAnchorTranslation(gltfBBox, symbol) {\r\n const anchorZ = symbol.anchorZ || 'center';\r\n let zOffset = 0;\r\n const height = gltfBBox.max[2] - gltfBBox.min[2];\r\n if (anchorZ === 'bottom') {\r\n zOffset = height / 2;\r\n } else if (anchorZ === 'top') {\r\n zOffset = -height / 2;\r\n }\r\n return zOffset;\r\n }\r\n\r\n addMesh(meshes, progress, context) {\r\n if (!meshes) {\r\n return null;\r\n }\r\n const level = meshes[0].properties.level;\r\n if (level > 2) {\r\n return null;\r\n }\r\n // 这里可能是regl的bug: 如果启用下面的代码,aTerrainAltitude不会看作instance属性数据(divisor = 1),导致无法绘制,原因未知\r\n //\r\n // const isRenderingTerrainVector = context.isRenderingTerrain;\r\n // if (isRenderingTerrainVector) {\r\n // meshes = meshes.filter(m => m.properties.tile.terrainTileInfos);\r\n // }\r\n const timestamp = context.timestamp;\r\n for (let i = 0; i < meshes.length; i++) {\r\n if (!meshes[i] || !meshes[i].geometry) {\r\n continue;\r\n }\r\n if (meshes[i].instancedData.aTerrainAltitude) {\r\n this._updateTerrainAltitude(meshes[i], meshes[i].instancedData, meshes[i].properties, 3, context);\r\n }\r\n const symbolIndex = meshes[i].properties.symbolIndex.index;\r\n const isAnimated = this._isSkinAnimating(symbolIndex);\r\n if (isAnimated) {\r\n this._updateAnimation(meshes[i], symbolIndex, timestamp);\r\n }\r\n meshes[i].setUniform('skinAnimation', +isAnimated);\r\n }\r\n this.scene.addMesh(meshes);\r\n return this;\r\n }\r\n\r\n _updateATerrainAltitude(mesh, aTerrainAltitude) {\r\n if (!mesh) {\r\n return;\r\n }\r\n if (mesh.updateInstancedData) {\r\n mesh.updateInstancedData('aTerrainAltitude', aTerrainAltitude);\r\n }\r\n }\r\n\r\n prepareRender(context) {\r\n const symbols = this.getSymbols();\r\n let isAnimated = false;\r\n for (let i = 0; i < symbols.length; i++) {\r\n const symbol = symbols[i];\r\n if (!symbol || !this._gltfPack[i]) {\r\n continue;\r\n }\r\n const hasAnim = this._isSkinAnimating(i);\r\n if (hasAnim && this._gltfPack[i]) {\r\n if (!isAnimated) {\r\n isAnimated = true;\r\n break;\r\n }\r\n // let speed = symbol.speed;\r\n // const loop = !!symbol.loop;\r\n // if (isNil(speed)) {\r\n // speed = 1;\r\n // }\r\n // this._gltfPack[i].updateAnimation(context.timestamp, loop, speed);\r\n }\r\n }\r\n\r\n if (isAnimated) {\r\n //TODO retire shadow frame,可能会造成性能问题\r\n this.setToRedraw(true);\r\n }\r\n super.prepareRender(context);\r\n }\r\n\r\n getShadowMeshes() {\r\n if (!this.isVisible()) {\r\n return EMPTY_ARRAY;\r\n }\r\n this.shadowCount = this.scene.getMeshes().length;\r\n const meshes = this.scene.getMeshes().filter(m => m.properties.level === 0);\r\n return meshes;\r\n }\r\n\r\n _isSkinAnimating(index) {\r\n const symbols = this.getSymbols();\r\n const symbol = symbols[index];\r\n return !!(symbol && symbol.animation && this._gltfPack[index] && this._gltfPack[index][0] && this._gltfPack[index][0].hasSkinAnimation());\r\n }\r\n\r\n _updateInstanceData(instanceData, tileTranslationMatrix, tileExtent, tileZoom, aPosition, aAltitude, aXYRotation, aZRotation, positionSize, aPickingId, features) {\r\n function setInstanceData(name, idx, matrix, col) {\r\n instanceData[name][idx * 4] = matrix[col];\r\n instanceData[name][idx * 4 + 1] = matrix[col + 4];\r\n instanceData[name][idx * 4 + 2] = matrix[col + 8];\r\n instanceData[name][idx * 4 + 3] = matrix[col + 12];\r\n }\r\n\r\n const count = aPosition.length / positionSize;\r\n const tileSize = this.layer.getTileSize().width;\r\n const tileScale = tileSize / tileExtent * this.layer.getRenderer().getTileGLScale(tileZoom);\r\n const zScale = this.layer.getRenderer().getZScale();\r\n const altitudeOffset = (this.dataConfig.altitudeOffset || 0) * 100;\r\n let minx = Infinity, miny = Infinity, minz = Infinity;\r\n let maxx = -Infinity, maxy = -Infinity, maxz = -Infinity;\r\n const position = [];\r\n const vertex = [];\r\n for (let i = 0; i < count; i++) {\r\n if (aAltitude) {\r\n vec3.set(vertex, aPosition[i * positionSize], aPosition[i * positionSize + 1], aAltitude[i]);\r\n } else {\r\n PackUtil.unpackPosition(vertex, aPosition[i * positionSize], aPosition[i * positionSize + 1], aPosition[i * positionSize + 2]);\r\n }\r\n\r\n const pos = vec3.set(\r\n position,\r\n vertex[0] * tileScale,\r\n //vt中的y轴方向与opengl(maptalks世界坐标系)相反\r\n -vertex[1] * tileScale,\r\n (vertex[2] + altitudeOffset) * zScale\r\n );\r\n if (pos[0] < minx) {\r\n minx = pos[0];\r\n }\r\n if (pos[0] > maxx) {\r\n maxx = pos[0];\r\n }\r\n if (pos[1] < miny) {\r\n miny = pos[1];\r\n }\r\n if (pos[1] > maxy) {\r\n maxy = pos[1];\r\n }\r\n if (pos[2] < minz) {\r\n minz = pos[2];\r\n }\r\n if (pos[2] > maxz) {\r\n maxz = pos[2];\r\n }\r\n }\r\n const cx = (minx + maxx) / 2;\r\n const cy = (miny + maxy) / 2;\r\n const cz = (minz + maxz) / 2;\r\n const mat = [];\r\n\r\n // 如果没有 fn type,trs会作为positionMatrix设置到mesh上\r\n const hasFnType = this._hasFuncType();\r\n const zAxis = [0, 0, 1];\r\n\r\n for (let i = 0; i < count; i++) {\r\n if (aAltitude) {\r\n vec3.set(vertex, aPosition[i * positionSize], aPosition[i * positionSize + 1], aAltitude[i]);\r\n } else {\r\n PackUtil.unpackPosition(vertex, aPosition[i * positionSize], aPosition[i * positionSize + 1], aPosition[i * positionSize + 2]);\r\n }\r\n const x = vertex[0];\r\n const y = vertex[1];\r\n const pos = vec3.set(\r\n position,\r\n x * tileScale - cx,\r\n //vt中的y轴方向与opengl(maptalks世界坐标系)相反\r\n -y * tileScale - cy,\r\n (vertex[2] + altitudeOffset) * zScale - cz\r\n );\r\n\r\n const xyRotation = aXYRotation && aXYRotation[i] || 0;\r\n const zRotation = aZRotation && aZRotation[i] || 0;\r\n if (!xyRotation && !zRotation) {\r\n mat4.fromTranslation(mat, pos);\r\n } else {\r\n // const quaterion = quat.fromEuler([], xRotation * 180 / Math.PI, yRotation * 180 / Math.PI, zRotation * 180 / Math.PI);\r\n mat4.fromRotation(mat, zRotation, zAxis);\r\n\r\n const v = vec3.set(V3, x, y, 0);\r\n const axis = vec3.normalize(v, vec3.cross(v, v, zAxis));\r\n mat4.rotate(mat, mat, xyRotation, axis);\r\n\r\n // mat4.fromRotation(mat, 0, axis);\r\n const tMat = mat4.fromTranslation(TEMP_MATRIX, pos);\r\n mat4.multiply(mat, tMat, mat);\r\n }\r\n\r\n if (hasFnType) {\r\n const trs = this._getSymbolTRSMatrix(TEMP_MATRIX, features, aPickingId, i);\r\n mat4.multiply(mat, mat, trs);\r\n }\r\n\r\n setInstanceData('instance_vectorA', i, mat, 0);\r\n setInstanceData('instance_vectorB', i, mat, 1);\r\n setInstanceData('instance_vectorC', i, mat, 2);\r\n instanceData['aPickingId'][i] = i;\r\n }\r\n vec3.set(position, cx, cy, cz);\r\n return position;\r\n }\r\n\r\n _getMeterScale() {\r\n if (!this._meterScale) {\r\n const map = this.getMap();\r\n this._meterScale = getCentiMeterScale(map.getGLRes(), map) * 100;\r\n }\r\n return this._meterScale;\r\n }\r\n\r\n // features, aPickingId, i 允许为空\r\n _getSymbolTRSMatrix(out, features, aPickingId, i) {\r\n const map = this.getMap();\r\n const symbolDef = this.symbolDef[0];\r\n\r\n const meterScale = this._getMeterScale();\r\n let tx = symbolDef['translationX'] || 0;\r\n let ty = symbolDef['translationY'] || 0;\r\n let tz = symbolDef['translationZ'] || 0;\r\n\r\n let rx = symbolDef['rotationX'] || 0;\r\n let ry = symbolDef['rotationY'] || 0;\r\n let rz = symbolDef['rotationZ'] || 0;\r\n\r\n let sx = symbolDef['scaleX'] || 1;\r\n let sy = symbolDef['scaleY'] || 1;\r\n let sz = symbolDef['scaleZ'] || 1;\r\n\r\n const idx = aPickingId && aPickingId[i];\r\n const feature = features && features[idx];\r\n\r\n const zoom = map.getZoom();\r\n const properties = feature && feature.feature && feature.feature.properties;\r\n\r\n const heightScale = this._getModelHeightScale(zoom, properties);\r\n\r\n if (this._txFn) {\r\n tx = this._txFn(zoom, properties);\r\n }\r\n if (this._tyFn) {\r\n ty = this._tyFn(zoom, properties);\r\n }\r\n if (this._tzFn) {\r\n tz = this._tzFn(zoom, properties);\r\n }\r\n const translation = vec3.set(TEMP_V3_0, tx * meterScale, ty * meterScale, tz * meterScale);\r\n\r\n if (this._rxFn) {\r\n rx = this._rxFn(zoom, properties);\r\n }\r\n if (this._ryFn) {\r\n ry = this._ryFn(zoom, properties);\r\n }\r\n if (this._rzFn) {\r\n rz = this._rzFn(zoom, properties);\r\n }\r\n const rotation = vec3.set(TEMP_V3_1, rx, ry, rz);\r\n\r\n if (this._sxFn) {\r\n sx = this._sxFn(zoom, properties);\r\n }\r\n if (this._syFn) {\r\n sy = this._syFn(zoom, properties);\r\n }\r\n if (this._szFn) {\r\n sz = this._szFn(zoom, properties);\r\n }\r\n const scale = vec3.set(TEMP_V3_2, sx * heightScale, sy * heightScale, sz * heightScale);\r\n\r\n return this._getGLTFMatrix(out, translation, rotation, scale);\r\n }\r\n\r\n _getModelHeightScale(zoom, properties) {\r\n const symbolDef = this.symbolDef[0];\r\n let modelHeight = this._modelHeightFn ? this._modelHeightFn(zoom, properties) : symbolDef['modelHeight'];\r\n if (isNil(modelHeight)) {\r\n return 1;\r\n }\r\n\r\n const bbox = this._gltfBBox[0];\r\n return modelHeight / (Math.abs(bbox.max[1] - bbox.min[1]));//YZ轴做了翻转,所以需要用y方向来算高度比例\r\n }\r\n\r\n getShaderConfig() {\r\n const config = super.getShaderConfig();\r\n config.positionAttribute = 'POSITION';\r\n config.normalAttribute = 'NORMAL';\r\n return config;\r\n }\r\n\r\n init(context) {\r\n super.init(context);\r\n this._initGLTF();\r\n }\r\n\r\n _initTRSFuncType() {\r\n const symbolDef = this.symbolDef[0];\r\n if (isFunctionDefinition(symbolDef['modelHeight'])) {\r\n this._modelHeightFn = interpolated(symbolDef['modelHeight']);\r\n }\r\n if (isFunctionDefinition(symbolDef['translationX'])) {\r\n this._txFn = interpolated(symbolDef['translationX']);\r\n }\r\n if (isFunctionDefinition(symbolDef['translationY'])) {\r\n this._tyFn = interpolated(symbolDef['translationY'])\r\n }\r\n if (isFunctionDefinition(symbolDef['translationZ'])) {\r\n this._tzFn = interpolated(symbolDef['translationZ'])\r\n }\r\n\r\n if (isFunctionDefinition(symbolDef['rotationX'])) {\r\n this._rxFn = interpolated(symbolDef['rotationX']);\r\n }\r\n if (isFunctionDefinition(symbolDef['rotationY'])) {\r\n this._ryFn = interpolated(symbolDef['rotationY'])\r\n }\r\n if (isFunctionDefinition(symbolDef['rotationZ'])) {\r\n this._rzFn = interpolated(symbolDef['rotationZ'])\r\n }\r\n\r\n if (isFunctionDefinition(symbolDef['scaleX'])) {\r\n this._sxFn = interpolated(symbolDef['scaleX']);\r\n }\r\n if (isFunctionDefinition(symbolDef['scaleY'])) {\r\n this._syFn = interpolated(symbolDef['scaleY'])\r\n }\r\n if (isFunctionDefinition(symbolDef['scaleZ'])) {\r\n this._szFn = interpolated(symbolDef['scaleZ'])\r\n }\r\n }\r\n\r\n _hasFuncType() {\r\n return !!(this._modelHeightFn && !this._modelHeightFn.isFeatureConstant || this._txFn && !this._txFn.isFeatureConstant || this._tyFn && !this._tyFn.isFeatureConstant || this._tzFn && !this._tzFn.isFeatureConstant ||\r\n this._rxFn && !this._rxFn.isFeatureConstant || this._ryFn && !this._ryFn.isFeatureConstant || this._rzFn && !this._rzFn.isFeatureConstant ||\r\n this._sxFn && !this._sxFn.isFeatureConstant || this._syFn && !this._syFn.isFeatureConstant || this._szFn && !this._szFn.isFeatureConstant);\r\n }\r\n\r\n //TODO 缺乏GLTF模型的更新逻辑\r\n //TODO 缺乏多个symbols的支持\r\n _initGLTF() {\r\n if (this._gltfPack) {\r\n return;\r\n }\r\n this._gltfPack = [];\r\n this._gltfJSON = [];\r\n this._gltfBBox = [];\r\n this._gltfMeshInfos = [];\r\n const symbols = this.getSymbols();\r\n this._loaded = 0;\r\n for (let i = 0; i < symbols.length; i++) {\r\n const url = symbols[i].url || 'pyramid';\r\n this._gltfManager.loginGLTF(url);\r\n const gltfRes = this._gltfManager.getGLTF(url);\r\n if (gltfRes.then) {\r\n gltfRes.then(gltfData => {\r\n if (!gltfData.gltfPack) {\r\n this._loaded++;\r\n if (this._loaded >= symbols.length) {\r\n this._ready = true;\r\n this.setToRedraw(true);\r\n }\r\n return;\r\n }\r\n const { gltfPack: pack, json, bbox } = gltfData;\r\n this._gltfPack[i] = [pack];\r\n this._gltfMeshInfos[i] = pack.getMeshesInfo();\r\n this._gltfJSON[i] = json;\r\n this._gltfBBox[i] = bbox;\r\n this._loaded++;\r\n if (this._loaded >= symbols.length) {\r\n this._ready = true;\r\n }\r\n this.setToRedraw(true);\r\n });\r\n } else {\r\n const { gltfPack: pack, json, bbox } = gltfRes;\r\n if (pack) {\r\n this._gltfPack[i] = [pack];\r\n this._gltfMeshInfos[i] = pack.getMeshesInfo();\r\n this._gltfJSON[i] = json;\r\n this._gltfBBox[i] = bbox;\r\n this._loaded++;\r\n }\r\n }\r\n }\r\n if (this._loaded >= symbols.length) {\r\n this._ready = true;\r\n }\r\n }\r\n\r\n getPickingVert() {\r\n return pickingVert;\r\n }\r\n\r\n deleteMesh(meshes) {\r\n if (!meshes) {\r\n return;\r\n }\r\n this.scene.removeMesh(meshes);\r\n //geometry应该一直保留,在painter.delete中才删除\r\n for (let i = 0; i < meshes.length; i++) {\r\n const skinmap = this._skinMap && this._skinMap[meshes[i].uuid];\r\n if (skinmap) {\r\n for (const p in skinmap) {\r\n if (skinmap[p].jointTexture) {\r\n skinmap[p].jointTexture.destroy();\r\n }\r\n }\r\n\r\n delete this._skinMap[meshes[i].uuid];\r\n }\r\n meshes[i].disposeInstancedData();\r\n meshes[i].dispose();\r\n }\r\n }\r\n\r\n delete(/* context */) {\r\n super.delete();\r\n const symbols = this.getSymbols();\r\n for (let i = 0; i < symbols.length; i++) {\r\n const url = symbols[i].url || 'pyramid';\r\n this._gltfManager.logoutGLTF(url);\r\n }\r\n if (this._skinMap) {\r\n for (const uuid in this._skinMap) {\r\n const skinmap = this._skinMap[uuid];\r\n for (const p in skinmap) {\r\n if (skinmap[p].jointTexture) {\r\n skinmap[p].jointTexture.destroy();\r\n }\r\n }\r\n }\r\n delete this._skinMap;\r\n }\r\n delete this._nodeMatrixMap;\r\n\r\n }\r\n\r\n _getGLTFMatrix(out, t, r, s) {\r\n const translation = vec3.set(V3, ...(t || DEFAULT_TRANSLATION));\r\n const rotation = r || DEFAULT_ROTATION;\r\n const scale = s || DEFAULT_SCALE;\r\n const eluerQuat = quat.fromEuler(Q4, rotation[0], rotation[1], rotation[2]);\r\n return mat4.fromRotationTranslationScale(out, eluerQuat, translation, scale);\r\n }\r\n };\r\n\r\nexport default GLTFMixin;\r\n\r\n// function getFitExtent(map, fitSize) {\r\n// return fitSize * map.getGLScale();\r\n// }\r\n","import PhongPainter from './PhongPainter';\r\nimport { reshader } from '@maptalks/gl';\r\nimport GLTFMixin from './GLTFMixin';\r\n\r\nclass GLTFPhongPainter extends GLTFMixin(PhongPainter) {\r\n\r\n getMaterialClazz(materialInfo) {\r\n return materialInfo.diffuseFactor ? reshader.PhongSpecularGlossinessMaterial : reshader.PhongMaterial;\r\n }\r\n}\r\n\r\nexport default GLTFPhongPainter;\r\n","import { reshader } from '@maptalks/gl';\r\nimport StandardPainter from './pbr/StandardPainter';\r\nimport GLTFMixin from './GLTFMixin';\r\n\r\nclass GLTFStandardPainter extends GLTFMixin(StandardPainter) {\r\n\r\n getMaterialClazz(materialInfo) {\r\n return (materialInfo['specularGlossinessTexture'] || materialInfo['diffuseTexture']) ? reshader.pbr.StandardSpecularGlossinessMaterial : reshader.pbr.StandardMaterial;\r\n }\r\n}\r\n\r\nexport default GLTFStandardPainter;\r\n","import BasicPainter from './BasicPainter';\r\nimport { reshader, mat3, mat4, vec4, GroundPainter } from '@maptalks/gl';\r\nimport waterVert from './glsl/water.vert';\r\nimport waterFrag from './glsl/water.frag';\r\nimport pickingVert from './glsl/fill.picking.vert';\r\nimport { extend } from '../Util';\r\n\r\nconst { getPBRUniforms } = reshader.pbr.PBRUtils;\r\n\r\nconst DEFAULT_DIR_LIGHT = {\r\n color: [2.0303, 2.0280, 2.0280],\r\n // direction: [-0.9617, -0.2717, 0.0347]\r\n direction: [0.0, -0.2717, -1]\r\n};\r\n\r\nconst TIME_NOISE_TEXTURE_REPEAT = 0.3737;\r\nconst SYMBOL_INDEX = { index: 0 };\r\nconst EMPTY_HSV = [0, 0, 0];\r\nconst WATER_UV_SIZE = [2, 2];\r\n\r\nconst frag = `\r\n #define SHADER_NAME WATER_STENCIL\r\n precision mediump float;\r\n void main() {\r\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\r\n }\r\n`;\r\n\r\nclass WaterPainter extends BasicPainter {\r\n supportRenderMode(mode) {\r\n return mode === 'fxaa' || mode === 'fxaaBeforeTaa';\r\n }\r\n\r\n needPolygonOffset() {\r\n return true;\r\n }\r\n\r\n isTerrainSkin() {\r\n return false;\r\n }\r\n\r\n isTerrainVector() {\r\n return true;\r\n }\r\n\r\n needToRedraw() {\r\n if (super.needToRedraw()) {\r\n return true;\r\n }\r\n const symbol = this.getSymbol(SYMBOL_INDEX);\r\n return symbol.animation;\r\n }\r\n\r\n createMesh(geo, transform) {\r\n const { geometry } = geo;\r\n geometry.generateBuffers(this.regl);\r\n // const material = new reshader.Material(uniforms, DEFAULT_UNIFORMS);\r\n const mesh = new reshader.Mesh(geometry, null, {\r\n castShadow: false,\r\n picking: true\r\n });\r\n mesh.properties.symbolIndex = SYMBOL_INDEX;\r\n mesh.setLocalTransform(transform);\r\n return mesh;\r\n }\r\n\r\n callShader(uniforms, context) {\r\n super.callShader(uniforms, context);\r\n this.transformWater();\r\n const waterUniforms = this._getWaterUniform(this.getMap(), context);\r\n this._drawCount += this.renderer.render(this._waterShader, waterUniforms, this._waterScene, this.getRenderFBO(context));\r\n }\r\n\r\n addMesh(mesh, progress) {\r\n this._prepareMesh(mesh, progress);\r\n super.addMesh(...arguments);\r\n }\r\n\r\n _prepareMesh(mesh) {\r\n //在这里更新ssr,以免symbol中ssr发生变化时,uniform值却没有发生变化, fuzhenn/maptalks-studio#462\r\n const hasSSR = this.getSymbol(SYMBOL_INDEX).ssr;\r\n for (let i = 0; i < mesh.length; i++) {\r\n if (hasSSR) {\r\n mesh[i].ssr = 1;\r\n } else {\r\n mesh[i].ssr = 0;\r\n }\r\n }\r\n }\r\n\r\n paint(context) {\r\n if (context.states && context.states.includesChanged) {\r\n this.shader.dispose();\r\n this._waterShader.dispose();\r\n this._createShader(context);\r\n }\r\n const isSsr = !!context.ssr && this.getSymbol(SYMBOL_INDEX).ssr;\r\n const shader = this._waterShader;\r\n const shaderDefines = shader.shaderDefines;\r\n if (isSsr) {\r\n const defines = extend({}, shaderDefines, context.ssr.defines);\r\n shader.shaderDefines = defines;\r\n }\r\n this.updateIBLDefines(shader);\r\n if (isSsr) {\r\n this._water.ssr = 1;\r\n } else {\r\n this._water.ssr = 0;\r\n }\r\n super.paint(context);\r\n if (isSsr) {\r\n shader.shaderDefines = shaderDefines;\r\n }\r\n }\r\n\r\n isEnableTileStencil() {\r\n // water的绘制比较特殊,是通过先绘制water部分的stencil,再统一绘制water效果实现的,所以不能开启tile stencil\r\n return false;\r\n }\r\n\r\n init(context) {\r\n this.createIBLTextures();\r\n const regl = this.regl;\r\n\r\n\r\n this.renderer = new reshader.Renderer(regl);\r\n\r\n this.createGround();\r\n this._createShader(context);\r\n\r\n if (this.pickingFBO) {\r\n this.picking = [new reshader.FBORayPicking(\r\n this.renderer,\r\n {\r\n vert: pickingVert,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ],\r\n extraCommandProps: {\r\n viewport: this.pickingViewport\r\n }\r\n },\r\n this.pickingFBO,\r\n this.getMap()\r\n )];\r\n }\r\n this._loadTextures();\r\n }\r\n\r\n _loadTextures() {\r\n const regl = this.regl;\r\n if (!this._emptyTex) {\r\n this._emptyTex = regl.texture(2);\r\n }\r\n const urlModifier = this.layer.getURLModifier();\r\n\r\n const symbol = this.getSymbol({ index: 0 });\r\n const normalUrl = symbol['texWaveNormal'];\r\n const cachedNormalData = this.getCachedTexture(normalUrl);\r\n const self = this;\r\n\r\n if (cachedNormalData) {\r\n if (!this._normalTex) {\r\n if (!cachedNormalData.isLoading) {\r\n this._normalTex = this._createTex(regl, cachedNormalData);\r\n } else {\r\n setTimeout(() => {\r\n if (!this.shader) {\r\n return;\r\n }\r\n this._loadTextures();\r\n }, 20);\r\n }\r\n }\r\n } else {\r\n const img = new Image();\r\n img.isLoading = true;\r\n img.onload = function () {\r\n delete this.isLoading;\r\n self._normalTex = self._createTex(regl, this);\r\n self.setToRedraw();\r\n };\r\n img.onerror = () => {\r\n console.error('invalid water wave normal texture:' + normalUrl);\r\n };\r\n this.addCachedTexture(normalUrl, img);\r\n img.src = urlModifier && urlModifier(normalUrl) || normalUrl;\r\n }\r\n\r\n const pertUrl = symbol['texWavePerturbation'];\r\n const cachedPertData = this.getCachedTexture(pertUrl);\r\n\r\n if (cachedPertData) {\r\n if (!this._pertTex) {\r\n if (!cachedPertData.isLoading) {\r\n this._pertTex = this._createTex(regl, cachedPertData);\r\n } else {\r\n setTimeout(() => {\r\n this._loadTextures();\r\n if (!this.shader) {\r\n return;\r\n }\r\n }, 20);\r\n }\r\n }\r\n\r\n } else {\r\n const img = new Image();\r\n img.isLoading = true;\r\n img.onload = function () {\r\n delete this.isLoading;\r\n self._pertTex = self._createTex(regl, this);\r\n self.setToRedraw();\r\n };\r\n img.onerror = () => {\r\n console.error('invalid water wave perturbation texture:' + pertUrl);\r\n };\r\n this.addCachedTexture(pertUrl, img);\r\n img.src = urlModifier && urlModifier(pertUrl) || pertUrl;\r\n }\r\n }\r\n\r\n _createTex(regl, data) {\r\n if (!this._emptyTex) {\r\n return null;\r\n }\r\n return regl.texture({\r\n width: data.width,\r\n height: data.height,\r\n mag: 'linear',\r\n min: 'linear mipmap linear',\r\n wrapS: 'repeat',\r\n wrapT: 'repeat',\r\n flipY: true,\r\n data: data\r\n });\r\n }\r\n\r\n _createShader(context) {\r\n const canvas = this.canvas;\r\n const environmentTransform = [];\r\n const uniforms = [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n },\r\n {\r\n name: 'modelViewNormalMatrix',\r\n type: 'function',\r\n fn: (context, props) => {\r\n const modelView = mat4.multiply([], props['viewMatrix'], props['modelMatrix']);\r\n const inverted = mat4.invert(modelView, modelView);\r\n const transposed = mat4.transpose(inverted, inverted);\r\n return mat3.fromMat4([], transposed);\r\n // const modelView = mat4.multiply([], props['viewMatrix'], props['modelMatrix']);\r\n // return mat3.fromMat4([], modelView);\r\n }\r\n },\r\n {\r\n name: 'modelViewMatrix',\r\n type: 'function',\r\n fn: (context, props) => {\r\n return mat4.multiply([], props['viewMatrix'], props['modelMatrix']);\r\n }\r\n },\r\n {\r\n name: 'environmentTransform',\r\n type: 'function',\r\n fn: (_, props) => {\r\n const orientation = props['environmentOrientation'] || 0;\r\n return mat3.fromRotation(environmentTransform, Math.PI * orientation / 180);\r\n }\r\n }\r\n ];\r\n const defines = {\r\n 'TIME_NOISE_TEXTURE_REPEAT': TIME_NOISE_TEXTURE_REPEAT\r\n };\r\n this.fillIncludes(defines, uniforms, context);\r\n const viewport = {\r\n x: 0,\r\n y: 0,\r\n width: () => {\r\n return canvas ? canvas.width : 1;\r\n },\r\n height: () => {\r\n return canvas ? canvas.height : 1;\r\n }\r\n };\r\n const depthRange = this.sceneConfig.depthRange;\r\n this.shader = new reshader.MeshShader({\r\n vert: `\r\n attribute vec3 aPosition;\r\n\r\n uniform mat4 projViewModelMatrix;\r\n\r\n void main() {\r\n gl_Position = projViewModelMatrix * vec4(aPosition, 1.);\r\n }\r\n `,\r\n frag,\r\n uniforms: [\r\n {\r\n name: 'projViewModelMatrix',\r\n type: 'function',\r\n fn: function (context, props) {\r\n const projViewModelMatrix = [];\r\n mat4.multiply(projViewModelMatrix, props['projViewMatrix'], props['modelMatrix']);\r\n return projViewModelMatrix;\r\n }\r\n }\r\n ],\r\n extraCommandProps: {\r\n viewport,\r\n colorMask: [false, false, false, false],\r\n stencil: {\r\n enable: true,\r\n mask: 0xFF,\r\n func: {\r\n cmp: '<=',\r\n ref: 0xFE,\r\n mask: 0xFF\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n depth: {\r\n enable: true,\r\n range: depthRange || [0, 1],\r\n func: this.sceneConfig.depthFunc || '<='\r\n },\r\n polygonOffset: {\r\n enable: true,\r\n offset: this.getPolygonOffset()\r\n }\r\n }\r\n });\r\n const extraCommandProps = {\r\n viewport,\r\n stencil: {\r\n enable: true,\r\n mask: 0xFF,\r\n func: {\r\n cmp: '==',\r\n ref: 0xFE,\r\n mask: 0xFF\r\n },\r\n op: {\r\n fail: 'keep',\r\n zfail: 'keep',\r\n zpass: 'replace'\r\n }\r\n },\r\n depth: {\r\n enable: false\r\n }\r\n };\r\n uniforms.push(...reshader.SsrPass.getUniformDeclares());\r\n this._waterShader = new reshader.MeshShader({\r\n vert: waterVert,\r\n frag: waterFrag,\r\n defines,\r\n uniforms,\r\n extraCommandProps\r\n });\r\n }\r\n\r\n getUniformValues(map) {\r\n const uniforms = {\r\n projViewMatrix: map.projViewMatrix,\r\n };\r\n return uniforms;\r\n }\r\n\r\n _getWaterUniform(map, context) {\r\n const { iblTexes, dfgLUT } = this.getIBLRes();\r\n const uniforms = getPBRUniforms(map, iblTexes, dfgLUT, context && context.ssr, context && context.jitter);\r\n const lightManager = map.getLightManager();\r\n let directionalLight = lightManager && lightManager.getDirectionalLight() || {};\r\n const ambientLight = lightManager && lightManager.getAmbientLight() || {};\r\n const symbol = this.getSymbol(SYMBOL_INDEX);\r\n const waterDir = this._waterDir = this._waterDir || [];\r\n const waveParams = this._waveParams = this._waveParams || [];\r\n vec4.set(waveParams, 0.0900, symbol.uvScale || 3, 0.0300, -0.5);\r\n const waterUniforms = {\r\n ambientColor: ambientLight.color || [0.2, 0.2, 0.2],\r\n viewMatrix: map.viewMatrix,\r\n\r\n lightDirection: directionalLight.direction || DEFAULT_DIR_LIGHT.direction,\r\n lightColor: directionalLight.color || DEFAULT_DIR_LIGHT.color,\r\n camPos: map.cameraPosition,\r\n timeElapsed: symbol.animation ? (this.layer.getRenderer().getFrameTimestamp() || 0) / (1 / (symbol.waterSpeed || 1) * 10000) : 0,\r\n normalTexture: this._normalTex || this._emptyTex,\r\n heightTexture: this._pertTex || this._emptyTex,\r\n //[波动强度, 法线贴图的repeat次数, 水流的强度, 水流动的偏移量]\r\n waveParams,\r\n waterDir: getWaterDirVector(waterDir, symbol.waterDirection || 0),\r\n waterBaseColor: symbol.waterBaseColor || [0.1451, 0.2588, 0.4863, 1],\r\n\r\n contrast: symbol.contrast || 1,\r\n hsv: symbol.hsv || EMPTY_HSV\r\n };\r\n extend(uniforms, waterUniforms);\r\n const renderer = this.layer.getRenderer();\r\n uniforms.layerOpacity = renderer._getLayerOpacity();\r\n this.setIncludeUniformValues(uniforms, context);\r\n if (context && context.ssr && context.ssr.renderUniforms) {\r\n extend(uniforms, context.ssr.renderUniforms);\r\n }\r\n return uniforms;\r\n }\r\n\r\n delete() {\r\n super.delete();\r\n if (this._emptyTex) {\r\n this._emptyTex.destroy();\r\n delete this._emptyTex;\r\n }\r\n if (this._normalTex) {\r\n this._normalTex.destroy();\r\n }\r\n if (this._pertTex) {\r\n this._pertTex.destroy();\r\n }\r\n if (this.shader) {\r\n this.shader.dispose();\r\n delete this.shader;\r\n }\r\n if (this._waterShader) {\r\n this._waterShader.dispose();\r\n }\r\n if (this._water) {\r\n this._water.geometry.dispose();\r\n if (this._water.material) {\r\n this._water.material.dispose();\r\n }\r\n this._water.dispose();\r\n delete this._water;\r\n }\r\n this.disposeIBLTextures();\r\n }\r\n\r\n createGround() {\r\n const planeGeo = new reshader.Plane();\r\n planeGeo.data.aTexCoord = new Uint8Array(\r\n [0, 1, 1, 1, 0, 0, 1, 0]\r\n );\r\n planeGeo.generateBuffers(this.renderer.regl);\r\n\r\n this._water = new reshader.Mesh(planeGeo, null, { castShadow: false });\r\n this._waterScene = new reshader.Scene([this._water]);\r\n }\r\n\r\n transformWater() {\r\n const map = this.getMap();\r\n const localTransform = GroundPainter.getGroundTransform(this._water.localTransform, map);\r\n this._water.setLocalTransform(localTransform);\r\n\r\n const extent = map['_get2DExtentAtRes'](map.getGLRes());\r\n const width = extent.getWidth();\r\n const height = extent.getHeight();\r\n const center = map.cameraLookAt;\r\n const xmin = center[0] - width;\r\n const ymax = center[1] + height;\r\n\r\n // uvSize 是固定的值\r\n const uvSize = WATER_UV_SIZE;\r\n const left = xmin / uvSize[0];\r\n const top = ymax / uvSize[1];\r\n\r\n const uvStartX = left % 1;\r\n const uvStartY = top % 1;\r\n const noiseStartX = (left * TIME_NOISE_TEXTURE_REPEAT) % 1;\r\n const noiseStartY = (top * TIME_NOISE_TEXTURE_REPEAT) % 1;\r\n\r\n const w = width / uvSize[0] * 2;\r\n const h = height / uvSize[1] * 2;\r\n\r\n this._water.setUniform('uvOffset', [uvStartX, uvStartY]);\r\n this._water.setUniform('noiseUvOffset', [noiseStartX, noiseStartY]);\r\n this._water.setUniform('uvScale', [w, -h]);\r\n }\r\n}\r\n\r\nexport default WaterPainter;\r\n\r\nfunction toRadian(v) {\r\n return Math.PI * v / 180;\r\n}\r\n\r\nfunction getWaterDirVector(out, dir) {\r\n dir = toRadian(dir);\r\n out[0] = Math.sin(dir);\r\n out[1] = Math.cos(dir);\r\n return out;\r\n}\r\n","import VectorTileLayer from '../layer/VectorTileLayer';\r\nimport Vector3DLayer from '../vector/Vector3DLayer';\r\nimport createPainterPlugin from './PainterPlugin';\r\nimport FillPainter from './painters/FillPainter';\r\nimport LinePainter from './painters/LinePainter';\r\nimport LineGradientPainter from './painters/LineGradientPainter';\r\n// import LineGlowPainter from './painters/LineGlowPainter';\r\nimport IconPainter from './painters/IconPainter';\r\nimport TextPainter from './painters/TextPainter';\r\nimport NativePointPainter from './painters/NativePointPainter';\r\nimport NativeLinePainter from './painters/NativelinePainter';\r\n// import TrailLinePainter from './painters/TrailLinePainter';\r\n// import PBRPainter from './painters/pbr/PBRPainter';\r\nimport PhongPainter from './painters/PhongPainter';\r\nimport WireframePainter from './painters/WireframePainter';\r\n\r\nimport StandardPainter from './painters/pbr/StandardPainter';\r\n// import ClothPainter from './painters/pbr/ClothPainter';\r\n// import SubsurfacePainter from './painters/pbr/SubsurfacePainter';\r\n\r\nimport TubePainter from './painters/TubePainter';\r\n\r\nimport GLTFPhongPainter from './painters/GLTFPhongPainter';\r\nimport GLTFStandardPainter from './painters/GLTFStandardPainter';\r\nimport HeatmapPainter from './painters/HeatmapPainter';\r\nimport WaterPainter from './painters/WaterPainter';\r\n\r\nconst FillPlugin = createPainterPlugin('fill', FillPainter);\r\nFillPlugin.registerAt(VectorTileLayer);\r\n\r\nconst LinePlugin = createPainterPlugin('line', LinePainter);\r\nLinePlugin.registerAt(VectorTileLayer);\r\n\r\nconst LineGradientPlugin = createPainterPlugin('line-gradient', LineGradientPainter);\r\nLineGradientPlugin.registerAt(VectorTileLayer);\r\n\r\nconst IconPlugin = createPainterPlugin('icon', IconPainter);\r\nIconPlugin.registerAt(VectorTileLayer);\r\n\r\nconst TextPlugin = createPainterPlugin('text', TextPainter);\r\nTextPlugin.registerAt(VectorTileLayer);\r\n\r\n/*const LineGlowPlugin = createPainterPlugin('line-glow', LineGlowPainter);\r\nLineGlowPlugin.registerAt(VectorTileLayer);*/\r\nconst NativeLinePlugin = createPainterPlugin('native-line', NativeLinePainter);\r\nNativeLinePlugin.registerAt(VectorTileLayer);\r\n\r\nconst NativePointPlugin = createPainterPlugin('native-point', NativePointPainter);\r\nNativePointPlugin.registerAt(VectorTileLayer);\r\n\r\n// const TrailLinePlugin = createPainterPlugin('native-trail-line', TrailLinePainter);\r\n// TrailLinePlugin.registerAt(VectorTileLayer);\r\n\r\n// const PBRPlugin = createPainterPlugin('pbr', PBRPainter);\r\n// PBRPlugin.registerAt(VectorTileLayer);\r\n\r\nconst PhongPlugin = createPainterPlugin('phong', PhongPainter);\r\nPhongPlugin.registerAt(VectorTileLayer);\r\n\r\nconst WireframePlugin = createPainterPlugin('wireframe', WireframePainter);\r\nWireframePlugin.registerAt(VectorTileLayer);\r\n\r\nconst LitPlugin = createPainterPlugin('lit', StandardPainter);\r\nLitPlugin.registerAt(VectorTileLayer);\r\n\r\nconst TubePlugin = createPainterPlugin('tube', TubePainter);\r\nTubePlugin.registerAt(VectorTileLayer);\r\n\r\n/*const ClothPlugin = createPainterPlugin('cloth', ClothPainter);\r\nClothPlugin.registerAt(VectorTileLayer);*/\r\n\r\n/*const SubsurfacePlugin = createPainterPlugin('subsurface', SubsurfacePainter);\r\nSubsurfacePlugin.registerAt(VectorTileLayer);*/\r\n\r\nconst GLTFPhongPlugin = createPainterPlugin('gltf-phong', GLTFPhongPainter);\r\nGLTFPhongPlugin.registerAt(VectorTileLayer);\r\n\r\nconst GLTFStandardPlugin = createPainterPlugin('gltf-lit', GLTFStandardPainter);\r\nGLTFStandardPlugin.registerAt(VectorTileLayer);\r\n\r\nconst HeatmapPlugin = createPainterPlugin('heatmap', HeatmapPainter);\r\nHeatmapPlugin.registerAt(VectorTileLayer);\r\n\r\nconst WaterPlugin = createPainterPlugin('water', WaterPainter);\r\nWaterPlugin.registerAt(VectorTileLayer);\r\n\r\nVector3DLayer.registerPainter('lit', StandardPainter);\r\nVector3DLayer.registerPainter('icon', IconPainter);\r\nVector3DLayer.registerPainter('fill', FillPainter);\r\nVector3DLayer.registerPainter('line', LinePainter);\r\nVector3DLayer.registerPainter('line-gradient', LineGradientPainter);\r\nVector3DLayer.registerPainter('water', WaterPainter);\r\nVector3DLayer.registerPainter('tube', TubePainter);\r\n\r\nexport {\r\n LinePlugin,\r\n LineGradientPlugin,\r\n FillPlugin,\r\n IconPlugin,\r\n TextPlugin,\r\n // LineGlowPlugin,\r\n NativeLinePlugin,\r\n // TrailLinePlugin,\r\n // PBRPlugin,\r\n PhongPlugin,\r\n WireframePlugin,\r\n\r\n LinePainter,\r\n FillPainter,\r\n IconPainter,\r\n TextPainter,\r\n // LineGlowPainter,\r\n NativeLinePainter,\r\n NativePointPainter,\r\n // TrailLinePainter,\r\n // PBRPainter,\r\n PhongPainter,\r\n WireframePainter,\r\n\r\n //pbr plugins\r\n LitPlugin,\r\n TubePlugin,\r\n // ClothPlugin,\r\n // SubsurfacePlugin,\r\n\r\n //gltf plugins\r\n GLTFPhongPlugin,\r\n GLTFStandardPlugin,\r\n\r\n HeatmapPlugin,\r\n WaterPlugin\r\n};\r\n","import { reshader, HeatmapProcess } from '@maptalks/gl';\r\nimport BasicPainter from './BasicPainter';\r\nimport { interpolated } from '@maptalks/function-type';\r\nimport { prepareFnTypeData } from './util/fn_type_util';\r\nimport { setUniformFromSymbol } from '../Util';\r\n\r\nexport default class HeatmapPainter extends BasicPainter {\r\n createFnTypeConfig(map, symbolDef) {\r\n const heatWeightFn = interpolated(symbolDef['heatmapWeight']);\r\n const i16 = new Int16Array(1);\r\n return [\r\n {\r\n attrName: 'aWeight',\r\n symbolName: 'heatmapWeight',\r\n type: Int16Array,\r\n width: 1,\r\n define: 'HAS_HEAT_WEIGHT',\r\n evaluate: properties => {\r\n const x = heatWeightFn(map.getZoom(), properties);\r\n i16[0] = x * 255;\r\n return i16[0];\r\n }\r\n }\r\n ];\r\n }\r\n\r\n createMesh(geo, transform) {\r\n const { geometry, symbolIndex, ref } = geo;\r\n if (ref === undefined) {\r\n const symbolDef = this.getSymbolDef(symbolIndex);\r\n const fnTypeConfig = this.getFnTypeConfig(symbolIndex);\r\n prepareFnTypeData(geometry, symbolDef, fnTypeConfig);\r\n }\r\n\r\n // heatmap 只支持一个symbol\r\n const symbol = this.getSymbol(symbolIndex);\r\n const uniforms = {\r\n tileRatio: geometry.properties.tileRatio,\r\n dataResolution: geometry.properties.tileResolution\r\n };\r\n setUniformFromSymbol(uniforms, 'heatmapIntensity', symbol, 'heatmapIntensity', 1);\r\n setUniformFromSymbol(uniforms, 'heatmapRadius', symbol, 'heatmapRadius', 6);\r\n setUniformFromSymbol(uniforms, 'heatmapWeight', symbol, 'heatmapWeight', 1);\r\n setUniformFromSymbol(uniforms, 'heatmapOpacity', symbol, 'heatmapOpacity', 1);\r\n geometry.generateBuffers(this.regl);\r\n const material = new reshader.Material(uniforms);\r\n const mesh = new reshader.Mesh(geometry, material, {\r\n transparent: true,\r\n castShadow: false,\r\n picking: true\r\n });\r\n const defines = {};\r\n if (geometry.data.aWeight) {\r\n defines['HAS_HEAT_WEIGHT'] = 1;\r\n }\r\n mesh.setDefines(defines);\r\n mesh.setLocalTransform(transform);\r\n mesh.properties.symbolIndex = symbolIndex;\r\n return mesh;\r\n }\r\n\r\n callRenderer(shader, uniforms, context) {\r\n const fbo = this.getRenderFBO(context);\r\n this._drawCount += this._process.render(this.scene, uniforms, fbo);\r\n }\r\n\r\n getUniformValues(map) {\r\n const symbol = this.getSymbol({ index: 0 });\r\n const { projViewMatrix } = map;\r\n return {\r\n glScale: 1 / map.getGLScale(),\r\n resolution: map.getResolution(),\r\n projViewMatrix,\r\n heatmapOpacity: symbol.heatmapOpacity\r\n };\r\n }\r\n\r\n getHeatmapMeshes() {\r\n return this.scene.getMeshes();\r\n }\r\n\r\n delete() {\r\n super.delete(...arguments);\r\n this._process.dispose();\r\n delete this._process;\r\n }\r\n\r\n init() {\r\n const regl = this.regl;\r\n this.renderer = new reshader.Renderer(regl);\r\n const polygonOfffset = this.getPolygonOffset();\r\n const symbol = this.getSymbols()[0];\r\n this._process = new HeatmapProcess(this.regl, this.sceneConfig, this.layer, symbol.heatmapColor, null, polygonOfffset);\r\n }\r\n}\r\n",null,null,"export const MARKER_SYMBOL = {\r\n markerFile: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerFile'\r\n },\r\n markerWidth: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerWidth'\r\n },\r\n markerHeight: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerHeight'\r\n },\r\n markerPathWidth: {\r\n type: 'identity',\r\n default: 20,\r\n property: '_symbol_markerPathWidth'\r\n },\r\n markerPathHeight: {\r\n type: 'identity',\r\n default: 20,\r\n property: '_symbol_markerPathHeight'\r\n },\r\n markerDx: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerDx'\r\n },\r\n markerDy: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerDy'\r\n },\r\n //marker type properties\r\n markerType: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerType'\r\n },\r\n markerPath: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerPath'\r\n },\r\n markerFill: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerFill'\r\n },\r\n markerFillPatternFile: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerFillPatternFile'\r\n },\r\n markerFillOpacity: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerFillOpacity'\r\n },\r\n markerLineColor: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerLineColor'\r\n },\r\n markerLineWidth: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerLineWidth'\r\n },\r\n markerLineOpacity: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerLineOpacity'\r\n },\r\n markerLineDasharray: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerLineDasharray'\r\n },\r\n markerLinePatternFile: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerLinePatternFile'\r\n },\r\n markerVerticalAlignment: {\r\n type: 'identity',\r\n default: 'top',\r\n property: '_symbol_markerVerticalAlignment'\r\n },\r\n markerHorizontalAlignment: {\r\n type: 'identity',\r\n default: 'middle',\r\n property: '_symbol_markerHorizontalAlignment'\r\n },\r\n markerOpacity: {\r\n type: 'identity',\r\n default: 1,\r\n property: '_symbol_markerOpacity'\r\n },\r\n markerPitchAlignment: {\r\n type: 'identity',\r\n default: 'viewport',\r\n property: '_symbol_markerPitchAlignment'\r\n },\r\n markerRotationAlignment: {\r\n type: 'identity',\r\n default: 'viewport',\r\n property: '_symbol_markerRotationAlignment'\r\n },\r\n markerRotation: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_markerRotation'\r\n },\r\n markerAllowOverlap: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_markerAllowOverlap'\r\n },\r\n markerIgnorePlacement: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_markerIgnorePlacement'\r\n },\r\n markerTextFit: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerTextFit'\r\n },\r\n markerSpacing: {\r\n type: 'identity',\r\n default: 250,\r\n property: '_symbol_markerSpacing'\r\n },\r\n markerTextFitPadding: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_markerTextFitPadding'\r\n },\r\n markerPlacement: {\r\n type: 'identity',\r\n default: 'point',\r\n property: '_symbol_markerPlacement'\r\n },\r\n};\r\n\r\nexport const TEXT_SYMBOL = {\r\n //text properties\r\n textName: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textName'\r\n },\r\n textFaceName: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textFaceName'\r\n },\r\n // textWeight: {\r\n // type: 'identity',\r\n // default: null,\r\n // property: '_symbol_textWeight'\r\n // },\r\n // textStyle: {\r\n // type: 'identity',\r\n // default: null,\r\n // property: '_symbol_textStyle'\r\n // },\r\n textWrapWidth: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textWrapWidth'\r\n },\r\n textHorizontalAlignment: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textHorizontalAlignment'\r\n },\r\n textVerticalAlignment: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textVerticalAlignment'\r\n },\r\n textFill: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textFill'\r\n },\r\n textSize: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textSize'\r\n },\r\n textHaloRadius: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textHaloRadius'\r\n },\r\n textHaloFill: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_textHaloFill'\r\n },\r\n textHaloOpacity: {\r\n type: 'identity',\r\n default: 1,\r\n property: '_symbol_textHaloOpacity'\r\n },\r\n textDx: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_textDx'\r\n },\r\n textDy: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_textDy'\r\n },\r\n textOpacity: {\r\n type: 'identity',\r\n default: 1,\r\n property: '_symbol_textOpacity'\r\n },\r\n textPitchAlignment: {\r\n type: 'identity',\r\n default: 'viewport',\r\n property: '_symbol_textPitchAlignment'\r\n },\r\n textRotationAlignment: {\r\n type: 'identity',\r\n default: 'viewport',\r\n property: '_symbol_textRotationAlignment'\r\n },\r\n textRotation: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_textRotation'\r\n },\r\n textAllowOverlap: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_textAllowOverlap'\r\n },\r\n textIgnorePlacement: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_textIgnorePlacement'\r\n },\r\n textSpacing: {\r\n type: 'identity',\r\n default: 250,\r\n property: '_symbol_textSpacing'\r\n },\r\n textPlacement: {\r\n type: 'identity',\r\n default: 'point',\r\n property: '_symbol_textPlacement'\r\n },\r\n};\r\n\r\nexport const LINE_SYMBOL = {\r\n lineWidth: {\r\n type: 'identity',\r\n default: 2,\r\n property: '_symbol_lineWidth'\r\n },\r\n lineStrokeWidth: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_lineStrokeWidth'\r\n },\r\n lineColor: {\r\n type: 'identity',\r\n default: [1, 1, 1, 1],\r\n property: '_symbol_lineColor'\r\n },\r\n lineStrokeColor: {\r\n type: 'identity',\r\n default: [0, 0, 0, 0],\r\n property: '_symbol_lineStrokeColor'\r\n },\r\n lineDx: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_lineDx'\r\n },\r\n lineDy: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_lineDy'\r\n },\r\n linePatternFile: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_linePatternFile'\r\n },\r\n linePatternAnimSpeed: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_linePatternAnimSpeed'\r\n },\r\n linePatternGap: {\r\n type: 'identity',\r\n default: 0,\r\n property: '_symbol_linePatternGap'\r\n },\r\n lineOpacity: {\r\n type: 'identity',\r\n default: 1,\r\n property: '_symbol_lineOpacity'\r\n },\r\n lineJoin: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_lineJoin'\r\n },\r\n lineCap: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_lineCap'\r\n },\r\n lineDasharray: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_lineDasharray'\r\n },\r\n lineDashColor: {\r\n type: 'identity',\r\n default: null,\r\n property: '_symbol_lineDashColor'\r\n }\r\n};\r\n\r\nexport const SYMBOL_PREFIX = '_symbol_';\r\n\r\nexport const LINE_GRADIENT_PROP_KEY = '_line_gradient_property';\r\n","import { extend, hasOwn } from '../../../common/Util';\r\nimport * as maptalks from 'maptalks';\r\nimport { KEY_IDX } from '../../../common/Constant';\r\nimport { LINE_GRADIENT_PROP_KEY } from './symbols';\r\nimport { PackUtil } from '@maptalks/vector-packer';\r\n\r\nconst POINT = new maptalks.Point(0, 0);\r\nexport const ID_PROP = '_vector3dlayer_id';\r\nconst GRADIENT_PROP_KEY = (LINE_GRADIENT_PROP_KEY + '').trim();\r\n\r\n//需要解决精度问题\r\n// currentFeature 是geometry已经存在的feature,则沿用老的kid\r\nexport function convertToFeature(geo, kidGen, currentFeature) {\r\n const keyName = (KEY_IDX + '').trim();\r\n const map = geo.getMap();\r\n const glRes = map.getGLRes();\r\n let coordinates = geo.getCoordinates();\r\n const geometry = [];\r\n const coords = [];\r\n let type = 1;\r\n if (geo instanceof maptalks.Marker || geo instanceof maptalks.MultiPoint) {\r\n if (geo instanceof maptalks.Marker) {\r\n coordinates = [coordinates];\r\n }\r\n for (let i = 0; i < coordinates.length; i++) {\r\n map.coordToPointAtRes(coordinates[i], glRes, POINT);\r\n geometry.push([POINT.x, POINT.y, (coordinates[i].z || 0)]);\r\n coords.push([coordinates[i].x, coordinates[i].y]);\r\n }\r\n } else if (geo instanceof maptalks.LineString || geo instanceof maptalks.MultiLineString) {\r\n type = 2;\r\n if (geo instanceof maptalks.LineString) {\r\n coordinates = [coordinates];\r\n }\r\n for (let i = 0; i < coordinates.length; i++) {\r\n geometry[i] = [];\r\n coords[i] = [];\r\n for (let ii = 0; ii < coordinates[i].length; ii++) {\r\n map.coordToPointAtRes(coordinates[i][ii], glRes, POINT);\r\n geometry[i].push([POINT.x, POINT.y, (coordinates[i][ii].z || 0)]);\r\n coords[i].push([coordinates[i][ii].x, coordinates[i][ii].y]);\r\n }\r\n }\r\n } else if (geo instanceof maptalks.Polygon || geo instanceof maptalks.MultiPolygon) {\r\n type = 3;\r\n if (geo instanceof maptalks.Circle || geo instanceof maptalks.Rectangle || geo instanceof maptalks.Ellipse || geo instanceof maptalks.Sector) {\r\n coordinates = [[geo.getShell()]];\r\n } else if (geo instanceof maptalks.Polygon) {\r\n coordinates = [coordinates];\r\n }\r\n let ringIndex = 0;\r\n for (let i = 0; i < coordinates.length; i++) {\r\n let shellIsClockwise = false;\r\n for (let ii = 0; ii < coordinates[i].length; ii++) {\r\n geometry[ringIndex] = [];\r\n coords[ringIndex] = [];\r\n if (shellIsClockwise) {\r\n for (let iii = coordinates[i][ii].length - 1; iii >= 0; iii--) {\r\n map.coordToPointAtRes(coordinates[i][ii][iii], glRes, POINT);\r\n geometry[ringIndex].push([POINT.x, POINT.y, (coordinates[i][ii][iii].z || 0)]);\r\n coords[ringIndex].push([coordinates[i][ii][iii].x, coordinates[i][ii][iii].y]);\r\n }\r\n } else {\r\n for (let iii = 0; iii < coordinates[i][ii].length; iii++) {\r\n map.coordToPointAtRes(coordinates[i][ii][iii], glRes, POINT);\r\n geometry[ringIndex].push([POINT.x, POINT.y, (coordinates[i][ii][iii].z || 0)]);\r\n coords[ringIndex].push([coordinates[i][ii][iii].x, coordinates[i][ii][iii].y]);\r\n }\r\n }\r\n if (ii === 0) {\r\n shellIsClockwise = PackUtil.calculateSignedArea(geometry[ringIndex]) < 0;\r\n if (shellIsClockwise) {\r\n geometry[ringIndex] = geometry[ringIndex].reverse();\r\n coords[ringIndex] = coords[ringIndex].reverse();\r\n }\r\n }\r\n ringIndex++;\r\n }\r\n }\r\n }\r\n const properties = geo.getProperties() ? Object.assign({}, geo.getProperties()) : {};\r\n const symbol = geo['_getInternalSymbol']() || getDefaultSymbol(geo);\r\n const kid = currentFeature ? (Array.isArray(currentFeature) ? currentFeature[0]['id'] : currentFeature['id']) : kidGen.id++;\r\n if (Array.isArray(symbol) && symbol.length) {\r\n // symbol为数组时,则重复添加相同的Feature\r\n const features = [];\r\n const len = symbol.length;\r\n for (let i = 0; i < len; i++) {\r\n const props = i === len - 1 ? properties : extend({}, properties);\r\n const lineGradientProperty = fillGradientProperties(symbol[i], props);\r\n for (const p in symbol[i]) {\r\n if (hasOwn(symbol[i], p)) {\r\n const keyName = ('_symbol_' + p).trim();\r\n props[keyName] = symbol[i][p];\r\n }\r\n }\r\n if (lineGradientProperty) {\r\n symbol[i]['lineGradientProperty'] = lineGradientProperty;\r\n }\r\n const pickingId = (currentFeature && currentFeature[i]) ? currentFeature[i][keyName] : kidGen.pickingId++;\r\n const fea = {\r\n type,\r\n id: kid,\r\n properties: props,\r\n visible: geo.isVisible(),\r\n geometry,\r\n coordinates: coords,\r\n extent: Infinity\r\n };\r\n fea[keyName] = pickingId;\r\n features.push(fea);\r\n }\r\n return features;\r\n } else if (symbol) {\r\n const lineGradientProperty = fillGradientProperties(symbol, properties);\r\n for (const p in symbol) {\r\n if (hasOwn(symbol, p)) {\r\n const keyName = ('_symbol_' + p).trim();\r\n properties[keyName] = symbol[p];\r\n }\r\n }\r\n if (lineGradientProperty) {\r\n symbol['lineGradientProperty'] = lineGradientProperty;\r\n }\r\n }\r\n\r\n const pickingId = currentFeature ? currentFeature.id : kidGen.pickingId++;\r\n const feature = {\r\n type,\r\n id: kid,\r\n properties,\r\n visible: geo.isVisible(),\r\n geometry,\r\n coordinates: coords,\r\n extent: Infinity\r\n };\r\n feature[keyName] = pickingId;\r\n return feature;\r\n}\r\n\r\nfunction fillGradientProperties(symbol, props) {\r\n const lineGradientProperty = symbol['lineGradientProperty'];\r\n if (lineGradientProperty) {\r\n props[GRADIENT_PROP_KEY] = props[lineGradientProperty];\r\n props['mapbox_clip_start'] = 0;\r\n props['mapbox_clip_end'] = 1;\r\n delete props[lineGradientProperty];\r\n }\r\n return lineGradientProperty;\r\n}\r\n\r\nfunction getDefaultSymbol(geo) {\r\n if (geo instanceof maptalks.Marker || geo instanceof maptalks.MultiPoint) {\r\n return {\r\n markerType: 'ellipse',\r\n markerWidth: 8,\r\n markerHeight: 0,\r\n markerFill: '#000'\r\n };\r\n } else if (geo instanceof maptalks.LineString || geo instanceof maptalks.MultiLineString) {\r\n return {\r\n lineColor: '#000',\r\n lineWidth: 1\r\n };\r\n } else if (geo instanceof maptalks.Polygon || geo instanceof maptalks.MultiPolygon) {\r\n return {\r\n polygonFill: '#fff',\r\n lineColor: '#000',\r\n lineWidth: 1\r\n };\r\n }\r\n}\r\n","import * as maptalks from 'maptalks';\r\nimport { createREGL, reshader, mat4, vec3 } from '@maptalks/gl';\r\nimport { SYMBOLS_NEED_REBUILD_IN_VECTOR } from '@maptalks/vector-packer';\r\nimport { convertToFeature, ID_PROP } from './util/convert_to_feature';\r\nimport { IconRequestor, GlyphRequestor, PointPack, LinePack, StyledPoint, VectorPack, StyledVector } from '@maptalks/vector-packer';\r\nimport { extend, hasOwn, getCentiMeterScale, isNil } from '../../common/Util';\r\nimport { MARKER_SYMBOL, TEXT_SYMBOL, LINE_SYMBOL, SYMBOL_PREFIX, LINE_GRADIENT_PROP_KEY } from './util/symbols';\r\nimport { KEY_IDX } from '../../common/Constant';\r\nimport Vector3DLayer from './Vector3DLayer';\r\nimport { isFunctionDefinition, loadFunctionTypes } from '@maptalks/function-type';\r\nimport convertToPainterFeatures from '../renderer/utils/convert_to_painter_features';\r\nimport { ICON_PAINTER_SCENECONFIG } from '../core/Constant';\r\n\r\n// const SYMBOL_SIMPLE_PROPS = {\r\n// textFill: 1,\r\n// textSize: 1,\r\n// textOpacity: 1,\r\n// // textHaloRadius: 1,\r\n// textHaloFill: 1,\r\n// textHaloOpacity: 1,\r\n// textPitchAlignment: 1,\r\n// textRotationAlignment: 1,\r\n// textDx: 1, //TODO\r\n// textDy: 1, //TODO\r\n\r\n// // markerWidth: 1,\r\n// // markerHeight: 1,\r\n// markerOpacity: 1,\r\n// markerPitchAlignment: 1,\r\n// markerRotationAlignment: 1,\r\n// markerDx: 1, //TODO\r\n// markerDy: 1, //TODO\r\n\r\n// lineColor: 1,\r\n// lineWidth: 1,\r\n// lineOpacity: 1,\r\n// lineDx: 1, //TODO\r\n// lineDy: 1, //TODO\r\n// lineGapWidth: 1, //TODO\r\n// lineDasharray: null,\r\n\r\n// polygonFill: 1,\r\n// polygonOpacity: 1\r\n// };\r\n\r\nlet meshUID = 1;\r\nconst prefix = (SYMBOL_PREFIX + '').trim();\r\nconst KEY_IDX_NAME = (KEY_IDX + '').trim();\r\nlet EMPTY_POSITION = new Float32Array(1);\r\nconst EMPTY_ARRAY = [];\r\n\r\nclass Vector3DLayerRenderer extends maptalks.renderer.CanvasRenderer {\r\n constructor(...args) {\r\n super(...args);\r\n this.features = {};\r\n this._geometries = {};\r\n this._counter = 0;\r\n this._allFeatures = {};\r\n this._featureMapping = {};\r\n this._markerFeatures = {};\r\n this._textFeatures = {};\r\n this._lineFeatures = {};\r\n this._dirtyAll = true;\r\n this._kidGen = { id: 0, pickingId: 0 };\r\n this._dirtyTargetsInCurrentFrame = {};\r\n }\r\n\r\n\r\n setURLModifier(urlModifier) {\r\n this._urlModifier = urlModifier;\r\n }\r\n\r\n getURLModifier() {\r\n return this._urlModifier;\r\n }\r\n\r\n hasNoAARendering() {\r\n return true;\r\n }\r\n\r\n //always redraw when map is interacting\r\n needToRedraw() {\r\n const redraw = super.needToRedraw();\r\n if (!redraw) {\r\n return this.painter && this.painter.needToRedraw() ||\r\n this._markerPainter && this._markerPainter.needToRedraw() ||\r\n this._linePainter && this._linePainter.needToRedraw();\r\n }\r\n return redraw;\r\n }\r\n\r\n getAnalysisMeshes() {\r\n return this.painter && this.painter.getAnalysisMeshes() || EMPTY_ARRAY;\r\n }\r\n\r\n getRayCastData() {\r\n return null;\r\n }\r\n\r\n draw(timestamp, parentContext) {\r\n this._frameTime = timestamp;\r\n const layer = this.layer;\r\n this.prepareCanvas();\r\n this._zScale = this._getCentiMeterScale(this.getMap().getGLRes()); // scale to convert meter to gl point\r\n this._parentContext = parentContext || {};\r\n const renderMode = this._parentContext.renderMode;\r\n const context = this._preparePaintContext();\r\n this._startFrame(context, renderMode);\r\n if (this._dirtyAll) {\r\n this.buildMesh();\r\n this._buildMarkerMesh();\r\n this._buildLineMesh();\r\n this._dirtyTargetsInCurrentFrame = {};\r\n this._dirtyGeo = false;\r\n this._dirtyAll = false;\r\n this._dirtyLine = false;\r\n } else if (this._dirtyGeo) {\r\n const atlas = this.atlas;\r\n const markerAtlas = this._markerAtlas;\r\n const lineAtlas = this._lineAtlas;\r\n delete this.atlas;\r\n delete this._markerAtlas;\r\n delete this._lineAtlas;\r\n this.buildMesh(atlas);\r\n this._buildMarkerMesh(markerAtlas);\r\n this._buildLineMesh(lineAtlas);\r\n this._dirtyGeo = false;\r\n this._dirtyLine = false;\r\n } else if (this._dirtyLine) {\r\n const lineAtlas = this._lineAtlas;\r\n delete this._lineAtlas;\r\n this._buildLineMesh(lineAtlas);\r\n this._dirtyLine = false;\r\n }\r\n if (!this.meshes && !this._markerMeshes && !this._lineMeshes) {\r\n this.completeRender();\r\n return;\r\n }\r\n\r\n if (this._showHideUpdated) {\r\n this._updateMeshVisible();\r\n this._showHideUpdated = false;\r\n }\r\n\r\n this._updateDirtyTargets();\r\n\r\n const isDefaultRender = !renderMode || renderMode === 'default';\r\n let polygonOffset = 0;\r\n if (this.layer.options['meshRenderOrder'] === 0) {\r\n this._renderMeshes(context, polygonOffset, renderMode);\r\n }\r\n\r\n let lineCount = 0;\r\n if (this._lineMeshes && (isDefaultRender || this._linePainter.supportRenderMode(renderMode))) {\r\n this._linePainter.startFrame(context);\r\n this._linePainter.addMesh(this._lineMeshes, null, { bloom: this._parentContext.bloom });\r\n this._linePainter.prepareRender(context);\r\n const currentPolygonOffset = context.polygonOffsetIndex || 0;\r\n polygonOffset = this.meshes && this.meshes.length ? polygonOffset - 1 : polygonOffset;\r\n context.polygonOffsetIndex = (context.polygonOffsetIndex || 0) + polygonOffset;\r\n lineCount = this._linePainter.render(context).drawCount;\r\n context.polygonOffsetIndex = currentPolygonOffset;\r\n }\r\n\r\n if (this.layer.options['meshRenderOrder'] === 1) {\r\n this._renderMeshes(context, lineCount ? polygonOffset - 1 : polygonOffset, renderMode);\r\n }\r\n\r\n if (this._markerMeshes && (isDefaultRender || this._markerPainter.supportRenderMode(renderMode))) {\r\n const isFinalRender = !this._parentContext.timestamp || this._parentContext.isFinalRender;\r\n const needUpdateCollision = !this._collisionTimestamp || this._collisionTimestamp !== timestamp;\r\n if (layer.options['collision'] && needUpdateCollision) {\r\n layer.clearCollisionIndex();\r\n }\r\n const sceneConfig = this.layer.options.sceneConfig;\r\n this._markerPainter.sceneConfig.collision = sceneConfig ? isNil(sceneConfig.collision) ? true : sceneConfig.collision : true;\r\n this._markerPainter.startFrame(context);\r\n this._markerPainter.addMesh(this._markerMeshes, null, { bloom: this._parentContext.bloom });\r\n this._markerPainter.prepareRender(context);\r\n if (layer.options.collision && needUpdateCollision) {\r\n this._markerPainter.updateCollision(context);\r\n if (isFinalRender) {\r\n this._collisionTimestamp = timestamp;\r\n }\r\n }\r\n\r\n this._markerPainter.render(context);\r\n }\r\n\r\n if (isDefaultRender || parentContext && parentContext.isFinalRender) {\r\n this.completeRender();\r\n this.layer.fire('canvasisdirty');\r\n }\r\n }\r\n\r\n _startFrame(context, renderMode) {\r\n const isDefaultRender = !renderMode || renderMode === 'default';\r\n if (this.painter && (isDefaultRender || this.painter.supportRenderMode(renderMode))) {\r\n // 因为 StandardPainter 需要在createMesh前初始化,才能正常创建mesh,所以需要先调用startFrame\r\n this.painter.startFrame(context);\r\n }\r\n }\r\n\r\n _renderMeshes(context, polygonOffset, renderMode) {\r\n const isDefaultRender = !renderMode || renderMode === 'default';\r\n if (this.painter && this.meshes && (isDefaultRender || this.painter.supportRenderMode(renderMode))) {\r\n this.painter.addMesh(this.meshes, null, { bloom: context && context.bloom });\r\n this.painter.prepareRender(context);\r\n context.polygonOffsetIndex = (context.polygonOffsetIndex || 0) + polygonOffset;\r\n const status = this.painter.render(context);\r\n return status;\r\n }\r\n return {\r\n redraw: false,\r\n drawCount: 0\r\n };\r\n }\r\n\r\n supportRenderMode() {\r\n return true;\r\n }\r\n\r\n isForeground() {\r\n return true;\r\n }\r\n\r\n _preparePaintContext() {\r\n const context = {\r\n regl: this.regl,\r\n layer: this.layer,\r\n symbol: this._layerSymbol,\r\n gl: this.gl,\r\n sceneConfig: this.layer.options.sceneConfig,\r\n pluginIndex: 0,\r\n cameraPosition: this.getMap().cameraPosition,\r\n timestamp: this.getFrameTimestamp()\r\n };\r\n if (this._parentContext) {\r\n extend(context, this._parentContext);\r\n }\r\n return context;\r\n }\r\n\r\n drawOnInteracting(event, timestamp, parentContext) {\r\n this.draw(timestamp, parentContext);\r\n }\r\n\r\n getFrameTimestamp() {\r\n return this._frameTime;\r\n }\r\n\r\n // updateSymbol() {\r\n // this.painter.updateSymbol(this.painterSymbol, this.painterSymbol);\r\n // }\r\n\r\n // maptalks/issues#75\r\n // 两个featureMap是为额外的限定条件,只有包含在这两个featureMap中的feature才会加入。\r\n // 例如LineStringLayer中,某个line是数组类型symbol,但其中一个只定义了marker样式,没有定义lineWidth\r\n _getFeaturesToRender(featureMap1, featureMap2) {\r\n featureMap1 = featureMap1 || featureMap2;\r\n if (featureMap1 === featureMap2) {\r\n featureMap2 = null;\r\n }\r\n const features = [];\r\n const center = [0, 0, 0, 0];\r\n //为了解决UglifyJS对 feature[KEY_IDX] 不正确的mangle\r\n // const KEY_IDX_NAME = (KEY_IDX + '').trim();\r\n // let count = 0;\r\n this.layer['_sortGeometries']();\r\n const geometries = this.layer.getGeometries();\r\n for (let i = 0; i < geometries.length; i++) {\r\n const geo = geometries[i];\r\n const uid = geo[ID_PROP];\r\n if (!this.features[uid]) {\r\n continue;\r\n }\r\n const feature = this.features[uid];\r\n if (Array.isArray(feature)) {\r\n // count = count++;\r\n for (let i = 0; i < feature.length; i++) {\r\n const fea = feature[i];\r\n const kid = fea[KEY_IDX_NAME];\r\n if (featureMap1 && !featureMap1[kid]) {\r\n if (!featureMap2 || featureMap2 && !featureMap2[kid]) {\r\n continue;\r\n }\r\n }\r\n if (!fea.visible) {\r\n this._showHideUpdated = true;\r\n }\r\n this._addCoordsToCenter(fea.geometry, center, fea.coordinates);\r\n // fea[KEY_IDX_NAME] = count++;\r\n features.push(fea);\r\n }\r\n } else {\r\n if (!feature.visible) {\r\n this._showHideUpdated = true;\r\n }\r\n const kid = feature[KEY_IDX_NAME];\r\n if (featureMap1 && !featureMap1[kid]) {\r\n if (!featureMap2 || featureMap2 && !featureMap2[kid]) {\r\n continue;\r\n }\r\n }\r\n this._addCoordsToCenter(feature.geometry, center, feature.coordinates);\r\n // feature[KEY_IDX_NAME] = count++;\r\n features.push(feature);\r\n }\r\n }\r\n\r\n if (!features.length) {\r\n if (this.meshes && this.painter) {\r\n this.painter.deleteMesh(this.meshes);\r\n delete this.meshes;\r\n }\r\n if (this._markerMeshes) {\r\n this._markerPainter.deleteMesh(this._markerMeshes);\r\n delete this._markerMeshes;\r\n }\r\n if (this._lineMeshes) {\r\n this._linePainter.deleteMesh(this._lineMeshes);\r\n delete this._lineMeshes;\r\n }\r\n }\r\n if (center[3]) {\r\n center[0] /= center[3];\r\n center[1] /= center[3];\r\n }\r\n if (isNaN(center[0]) || isNaN(center[1])) {\r\n throw new Error(`invalid geometry coordinates for ${this.layer.getJSONType()}`);\r\n }\r\n return {\r\n features,\r\n center\r\n };\r\n }\r\n\r\n buildMesh(/*atlas*/) {\r\n // if (!this.painter) {\r\n // return;\r\n // }\r\n // //TODO 更新symbol的优化\r\n // //1. 如果只影响texture,则只重新生成texture\r\n // //2. 如果不影响Geometry,则直接调用painter.updateSymbol\r\n // //3. Geometry和Texture全都受影响时,则全部重新生成\r\n // const { features, center } = this._getFeaturesToRender();\r\n // if (!features.length) {\r\n // return;\r\n // }\r\n\r\n // this.createMesh(this.painter, this.PackClass, features, atlas, center).then(m => {\r\n // if (this.meshes) {\r\n // this.painter.deleteMesh(this.meshes);\r\n // }\r\n // const { mesh, atlas } = m;\r\n // this.meshes = mesh;\r\n // this.atlas = atlas;\r\n // this.setToRedraw();\r\n // });\r\n }\r\n\r\n createVectorPacks(painter, PackClass, symbol, features, atlas, center) {\r\n if (!painter || !features || !features.length) {\r\n return Promise.resolve(null);\r\n }\r\n const options = {\r\n zoom: this.getMap().getZoom(),\r\n EXTENT: Infinity,\r\n requestor: this.requestor,\r\n atlas,\r\n center,\r\n positionType: Float32Array\r\n };\r\n\r\n const pack = new PackClass(features, symbol, options);\r\n return pack.load();\r\n }\r\n\r\n createMesh(painter, PackClass, symbol, features, atlas, center) {\r\n return this.createVectorPacks(painter, PackClass, symbol, features, atlas, center).then(packData => {\r\n return this._createMesh(packData, painter, PackClass, symbol, features, atlas, center);\r\n });\r\n }\r\n\r\n _createMesh(packData, painter, PackClass, symbol, features, atlas, center) {\r\n const v0 = [], v1 = [];\r\n if (!packData) {\r\n return null;\r\n }\r\n const geometries = painter.createGeometries([packData.data], convertToPainterFeatures(features, null, 0, symbol, this.layer));\r\n for (let i = 0; i < geometries.length; i++) {\r\n if (!geometries[i]) {\r\n continue;\r\n }\r\n this._fillCommonProps(geometries[i].geometry);\r\n }\r\n\r\n const tileTransform = mat4.identity([]);\r\n mat4.translate(tileTransform, tileTransform, vec3.set(v1, center[0], center[1], 0));\r\n mat4.scale(tileTransform, tileTransform, vec3.set(v0, 1, 1, this._zScale));\r\n // mat4.scale(posMatrix, posMatrix, vec3.set(v0, glScale, glScale, this._zScale));\r\n // const transform = mat4.translate([], mat4.identity([]), center);\r\n\r\n // mat4.translate(posMatrix, posMatrix, vec3.set(v0, tilePos.x * glScale, tilePos.y * glScale, 0));\r\n const meshes = painter.createMeshes(geometries, tileTransform, { tilePoint: [center[0], center[1]] });\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n mesh.properties.level = 0;\r\n mesh.properties.tileTransform = tileTransform;\r\n const defines = mesh.defines;\r\n //不开启ENABLE_TILE_STENCIL的话,frag中会用tileExtent剪切图形,会造成图形绘制不出\r\n defines['ENABLE_TILE_STENCIL'] = 1;\r\n mesh.setDefines(defines);\r\n mesh.properties.meshKey = this.layer.getId();\r\n }\r\n\r\n return {\r\n meshes,\r\n atlas: {\r\n iconAtlas: packData.data.iconAtlas\r\n }\r\n };\r\n }\r\n\r\n _addCoordsToCenter(geometry, center, coordinates) {\r\n for (let i = 0; i < geometry.length; i++) {\r\n if (!Array.isArray(geometry[i][0])) {\r\n if (!isNaN(+geometry[i][0]) && !isNaN(+geometry[i][1])) {\r\n this._addCoord(center, geometry[i][0], geometry[i][1], geometry[i][2], 1, coordinates[i]);\r\n }\r\n } else {\r\n for (let ii = 0; ii < geometry[i].length; ii++) {\r\n if (!Array.isArray(geometry[i][ii][0])) {\r\n if (!isNaN(+geometry[i][ii][0]) && !isNaN(+geometry[i][ii][1])) {\r\n this._addCoord(center, geometry[i][ii][0], geometry[i][ii][1], geometry[i][ii][2], 1, coordinates[i][ii]);\r\n }\r\n } else {\r\n for (let iii = 0; iii < geometry[i][ii].length; iii++) {\r\n if (!isNaN(+geometry[i][ii][iii][0]) && !isNaN(+geometry[i][ii][iii][1])) {\r\n this._addCoord(center, geometry[i][ii][iii][0], geometry[i][ii][iii][1], geometry[i][ii][iii][2], 1, coordinates[i][ii][iii]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n _addCoord(center, x, y, z, count, coordinates) {\r\n const needWarning = this.getMap().getProjection().isSphere();\r\n let invalid = false;\r\n if (coordinates[0] > 180 || coordinates[0] < -180) {\r\n invalid = true;\r\n if (needWarning) {\r\n console.warn(`Layer(${this.layer.getId()}) has invalid longitude value: ${coordinates[0]}`);\r\n }\r\n }\r\n if (coordinates[1] > 90 || coordinates[1] < -90) {\r\n invalid = true;\r\n if (needWarning) {\r\n console.warn(`Layer(${this.layer.getId()}) has invalid latitude value: ${coordinates[1]}`);\r\n }\r\n }\r\n if (invalid) {\r\n return;\r\n }\r\n center[0] += x;\r\n center[1] += y;\r\n center[2] += (z || 0);\r\n center[3] += count;\r\n }\r\n\r\n\r\n _fillCommonProps(geometry) {\r\n const map = this.getMap();\r\n const props = geometry.properties;\r\n Object.defineProperty(props, 'tileResolution', {\r\n enumerable: true,\r\n get: function () {\r\n return map.getGLRes();\r\n }\r\n });\r\n props.tileRatio = 1;\r\n props.z = 1;\r\n props.tileExtent = 1;\r\n props.elements = geometry.elements;\r\n props.aPickingId = geometry.data.aPickingId;\r\n }\r\n\r\n _isEnableWorkAround(key) {\r\n if (key === 'win-intel-gpu-crash') {\r\n return this.layer.options['workarounds']['win-intel-gpu-crash'] && isWinIntelGPU(this.gl);\r\n }\r\n return false;\r\n }\r\n\r\n prepareRequestors() {\r\n if (this._iconRequestor) {\r\n return;\r\n }\r\n const layer = this.layer;\r\n this._iconRequestor = new IconRequestor({\r\n iconErrorUrl: layer.options['iconErrorUrl'],\r\n urlModifier: (url) => {\r\n const modifier = layer.getURLModifier();\r\n return modifier && modifier(url) || url;\r\n }\r\n });\r\n const useCharBackBuffer = !this._isEnableWorkAround('win-intel-gpu-crash');\r\n this._glyphRequestor = new GlyphRequestor(fn => {\r\n layer.getMap().getRenderer().callInNextFrame(fn);\r\n }, layer.options['glyphSdfLimitPerFrame'], useCharBackBuffer);\r\n this.requestor = this._fetchPattern.bind(this);\r\n this._markerRequestor = this._fetchIconGlyphs.bind(this);\r\n }\r\n\r\n _fetchPattern(icons, glyphs, cb) {\r\n const dataBuffers = [];\r\n this._iconRequestor.getIcons(icons, (err, data) => {\r\n if (err) {\r\n throw err;\r\n }\r\n if (data.buffers) {\r\n dataBuffers.push(...data.buffers);\r\n }\r\n cb(null, { icons: data.icons }, dataBuffers);\r\n });\r\n }\r\n\r\n _fetchIconGlyphs(icons, glyphs, cb) {\r\n //error, data, buffers\r\n this._glyphRequestor.getGlyphs(glyphs, (err, glyphData) => {\r\n if (err) {\r\n throw err;\r\n }\r\n const dataBuffers = glyphData.buffers || [];\r\n this._iconRequestor.getIcons(icons, (err, data) => {\r\n if (err) {\r\n throw err;\r\n }\r\n if (data.buffers && data.buffers.length) {\r\n dataBuffers.push(...data.buffers);\r\n }\r\n cb(null, { icons: data.icons, glyphs: glyphData.glyphs }, dataBuffers);\r\n });\r\n });\r\n //error, data, buffers\r\n\r\n }\r\n\r\n _buildMarkerMesh(atlas) {\r\n const markerUIDs = Object.keys(this._markerFeatures);\r\n const textUIDs = Object.keys(this._textFeatures);\r\n if (!markerUIDs.length && !textUIDs.length) {\r\n if (this._markerMeshes) {\r\n this._markerPainter.deleteMesh(this._markerMeshes);\r\n delete this._markerMeshes;\r\n }\r\n return;\r\n }\r\n\r\n const { features, center } = this._getFeaturesToRender(this._markerFeatures, this._textFeatures);\r\n\r\n const markerFeatures = [];\r\n const textFeatures = [];\r\n for (let i = 0; i < features.length; i++) {\r\n const kid = features[i][KEY_IDX_NAME];\r\n if (this._markerFeatures[kid]) {\r\n markerFeatures.push(features[i]);\r\n }\r\n if (this._textFeatures[kid]) {\r\n textFeatures.push(features[i]);\r\n }\r\n }\r\n if (!markerFeatures.length && !textFeatures.length) {\r\n if (this._markerMeshes) {\r\n this._markerPainter.deleteMesh(this._markerMeshes);\r\n delete this._markerMeshes;\r\n }\r\n return;\r\n }\r\n const showHideUpdated = this._showHideUpdated;\r\n this._markerCenter = center;\r\n const pointPacks = this._createPointPacks(markerFeatures, textFeatures, atlas, center);\r\n this._markerAtlas = {};\r\n const v0 = [], v1 = [];\r\n this._isCreatingMarkerMesh = true;\r\n Promise.all(pointPacks).then(packData => {\r\n if (this._markerMeshes) {\r\n this._markerPainter.deleteMesh(this._markerMeshes);\r\n delete this._markerMeshes;\r\n }\r\n if (!packData || !packData.length) {\r\n this.setToRedraw();\r\n return;\r\n }\r\n const geometries = this._markerPainter.createGeometries(packData.map(d => {\r\n if (d && d.data) {\r\n // 让数据采用 featureIds 作为 collidedId\r\n d.data.isIdUnique = true;\r\n }\r\n return d && d.data;\r\n }), this._allFeatures);\r\n\r\n for (let i = 0; i < geometries.length; i++) {\r\n this._fillCommonProps(geometries[i].geometry, packData[i] && packData[i].data);\r\n }\r\n const iconAtlas = packData[0] && packData[0].data.iconAtlas;\r\n const glyphAtlas = packData[0] && packData[0].data.glyphAtlas || packData[1] && packData[1].data.glyphAtlas;\r\n\r\n if (iconAtlas) {\r\n this._markerAtlas.iconAtlas = iconAtlas;\r\n }\r\n if (glyphAtlas) {\r\n this._markerAtlas.glyphAtlas = glyphAtlas;\r\n }\r\n\r\n const posMatrix = mat4.identity([]);\r\n //TODO 计算zScale时,zoom可能和tileInfo.z不同\r\n mat4.translate(posMatrix, posMatrix, vec3.set(v1, center[0], center[1], 0));\r\n mat4.scale(posMatrix, posMatrix, vec3.set(v0, 1, 1, this._zScale));\r\n // mat4.scale(posMatrix, posMatrix, vec3.set(v0, glScale, glScale, this._zScale))\r\n const meshes = this._markerPainter.createMeshes(geometries, posMatrix);\r\n for (let i = 0; i < meshes.length; i++) {\r\n meshes[i].geometry.properties.originElements = meshes[i].geometry.properties.elements.slice();\r\n meshes[i].properties.level = 0;\r\n meshes[i].material.set('flipY', 1);\r\n meshes[i].properties.meshKey = meshUID++;\r\n }\r\n this._markerMeshes = meshes;\r\n if (showHideUpdated) {\r\n this._showHideUpdated = true;\r\n }\r\n this._isCreatingMarkerMesh = false;\r\n this.setToRedraw();\r\n this.layer.fire('buildmarkermesh');\r\n });\r\n }\r\n\r\n _updateMeshVisible() {\r\n if (this._markerMeshes) {\r\n this._updateVisElements(this._markerMeshes[0], this._markerFeatures);\r\n this._updateVisElements(this._markerMeshes[1], this._textFeatures);\r\n if (this._markerMeshes[0]) {\r\n this._markerPainter.prepareCollideIndex(this._markerMeshes[0].geometry);\r\n }\r\n if (this._markerMeshes[1]) {\r\n this._markerPainter.prepareCollideIndex(this._markerMeshes[1].geometry);\r\n }\r\n\r\n }\r\n if (this._lineMeshes) {\r\n for (let i = 0; i < this._lineMeshes.length; i++) {\r\n this._updateVisElements(this._lineMeshes[i], this._lineFeatures);\r\n }\r\n }\r\n if (this.meshes) {\r\n for (let i = 0; i < this.meshes.length; i++) {\r\n this._updateVisElements(this.meshes[i], this._allFeatures);\r\n }\r\n }\r\n }\r\n\r\n _updateVisElements(mesh, features) {\r\n if (!mesh) {\r\n return;\r\n }\r\n const { aPickingId, originElements } = mesh.geometry.properties;\r\n const newElements = [];\r\n for (let j = 0; j < originElements.length; j++) {\r\n const kid = aPickingId[originElements[j]];\r\n if (features[kid] && features[kid].feature.visible) {\r\n newElements.push(originElements[j]);\r\n }\r\n }\r\n //这里需要替换elements,是因为iconPainter和textPainter中可能会计算collision,需要读取elements\r\n const arr = mesh.geometry.properties.elements = new originElements.constructor(newElements);\r\n mesh.geometry.setElements(arr);\r\n }\r\n\r\n _createPointPacks(markerFeatures, textFeatures, atlas, center) {\r\n const markerOptions = {\r\n zoom: this.getMap().getZoom(),\r\n EXTENT: Infinity,\r\n requestor: this._markerRequestor,\r\n atlas,\r\n center,\r\n positionType: Float32Array,\r\n defaultAltitude: 0,\r\n forceAltitudeAttribute: true,\r\n markerWidthType: Uint16Array,\r\n markerHeightType: Uint16Array\r\n };\r\n const textOptions = extend({}, markerOptions);\r\n markerOptions.allowEmptyPack = 1;\r\n\r\n const symbols = PointPack.splitPointSymbol(this._markerSymbol);\r\n return symbols.map((symbol, idx) => {\r\n return new PointPack(idx === 0 ? markerFeatures : textFeatures, symbol, idx === 0 ? markerOptions : textOptions).load();\r\n });\r\n }\r\n\r\n updateMesh() { }\r\n\r\n _updateMarkerMesh(marker) {\r\n const symbols = marker['_getInternalSymbol']();\r\n const options = { zoom: this.getMap().getZoom(), isVector3D: true };\r\n const uid = this._convertGeo(marker);\r\n if (!this._markerMeshes) {\r\n return false;\r\n }\r\n let feature = this.features[uid];\r\n if (!Array.isArray(feature)) {\r\n feature = [feature];\r\n }\r\n const params = [];\r\n const markerFeatures = [];\r\n const textFeatures = [];\r\n const zoom = this.getMap().getZoom();\r\n let loadedSymbols;\r\n if (Array.isArray(symbols)) {\r\n loadedSymbols = symbols.map(symbol => {\r\n if (!symbol) { return symbol; }\r\n return loadFunctionTypes(symbol, () => {\r\n params[0] = zoom;\r\n return params;\r\n });\r\n });\r\n } else {\r\n loadedSymbols = loadFunctionTypes(symbols, () => {\r\n params[0] = zoom;\r\n return params;\r\n });\r\n }\r\n\r\n let symbolFnTypes;\r\n if (Array.isArray(symbols)) {\r\n symbolFnTypes = symbols.map(symbol => {\r\n if (!symbol) { return symbol; }\r\n return VectorPack.genFnTypes(symbol);\r\n });\r\n } else {\r\n symbolFnTypes = VectorPack.genFnTypes(symbols);\r\n }\r\n // 检查是否atlas需要重新创建,如果需要,则重新创建整个mesh\r\n for (let i = 0; i < feature.length; i++) {\r\n const fea = feature[i];\r\n if (!fea) {\r\n continue;\r\n }\r\n const symbolDef = Array.isArray(symbols) ? symbols[i] : symbols;\r\n const symbol = Array.isArray(loadedSymbols) ? loadedSymbols[i] : loadedSymbols;\r\n const fnTypes = Array.isArray(symbolFnTypes) ? symbolFnTypes[i] : symbolFnTypes;\r\n const styledPoint = new StyledPoint(feature, symbolDef, symbol, fnTypes, options);\r\n const iconGlyph = styledPoint.getIconAndGlyph();\r\n if (!this._markerAtlas || !PointPack.isAtlasLoaded(iconGlyph, this._markerAtlas)) {\r\n this._markRebuild();\r\n this.setToRedraw();\r\n return false;\r\n }\r\n }\r\n\r\n\r\n for (let i = 0; i < feature.length; i++) {\r\n const kid = feature[i][KEY_IDX_NAME];\r\n if (this._markerFeatures[kid]) {\r\n markerFeatures.push(feature[i]);\r\n }\r\n if (this._textFeatures[kid]) {\r\n textFeatures.push(feature[i]);\r\n }\r\n }\r\n\r\n const feaId = feature[0].id;\r\n const pointPacks = this._createPointPacks(markerFeatures, textFeatures, this._markerAtlas, this._markerCenter);\r\n const markerMeshes = this._markerMeshes;\r\n Promise.all(pointPacks).then(packData => {\r\n for (let i = 0; i < packData.length; i++) {\r\n if (!packData[i]) {\r\n continue;\r\n }\r\n if (packData[i].data) {\r\n packData[i].data.isIdUnique = true;\r\n }\r\n const mesh = markerMeshes[i];\r\n const aFeaIds = mesh.geometry.properties.aFeaIds;\r\n const startIndex = aFeaIds.indexOf(feaId);\r\n if (startIndex < 0) {\r\n continue;\r\n }\r\n const count = packData[i].data.featureIds.length;\r\n const dynamicAttrs = packData[i].data.dynamicAttributes;\r\n for (const p in packData[i].data.data) {\r\n if (p === 'aPickingId') {\r\n continue;\r\n }\r\n if (dynamicAttrs[p]) {\r\n continue;\r\n }\r\n const data = packData[i].data.data[p];\r\n if (data) {\r\n mesh.geometry.updateSubData(p, data, startIndex * data.length / count);\r\n }\r\n }\r\n }\r\n this.setToRedraw();\r\n\r\n });\r\n return true;\r\n }\r\n\r\n _updateLineMesh(target) {\r\n return this._updateMesh(target, this._lineMeshes, this._lineAtlas, this._lineCenter, this._linePainter, LinePack, LINE_SYMBOL, this._groupLineFeas);\r\n }\r\n\r\n _updateMesh(target, meshes, atlas, center, painter, PackClass, globalSymbol, groupFeaturesFn) {\r\n if (!meshes) {\r\n return false;\r\n }\r\n if (!atlas) {\r\n this._markRebuild();\r\n this.setToRedraw();\r\n return false;\r\n }\r\n const symbols = target['_getInternalSymbol']();\r\n const options = { zoom: this.getMap().getZoom() };\r\n const uid = target[ID_PROP];\r\n let feature = this.features[uid];\r\n if (!Array.isArray(feature)) {\r\n feature = [feature];\r\n }\r\n const features = [];\r\n // 检查是否atlas需要重新创建,如果需要,则重新创建整个mesh\r\n for (let i = 0; i < feature.length; i++) {\r\n const fea = feature[i];\r\n if (!fea) {\r\n continue;\r\n }\r\n const symbol = Array.isArray(symbols) ? symbols[i] : symbols;\r\n const fnTypes = VectorPack.genFnTypes(symbol);\r\n const styledVector = new StyledVector(feature, symbol, fnTypes, options);\r\n const res = PackClass === LinePack ? styledVector.getLineResource() : styledVector.getPolygonResource();\r\n if (!VectorPack.isAtlasLoaded(res, atlas[i])) {\r\n this._markRebuild();\r\n this.setToRedraw();\r\n return false;\r\n }\r\n features.push(fea);\r\n }\r\n\r\n const feaId = feature[0].id\r\n const featureGroups = groupFeaturesFn.call(this, features);\r\n // 判断 feature 所属的featureGroup是否发生变化,如果发生变化,则需要重新生成mesh, fuzhenn/maptalks-studio#2413\r\n for (let i = 0; i < featureGroups.length; i++) {\r\n if (featureGroups[i].length) {\r\n const mesh = meshes.filter(m => m.feaGroupIndex === i);\r\n if (!mesh.length) {\r\n this._markRebuild();\r\n this.setToRedraw();\r\n return false;\r\n } else {\r\n const aFeaIds = mesh[0].geometry.properties.aFeaIds;\r\n const startIndex = aFeaIds.indexOf(feaId);\r\n if (startIndex < 0) {\r\n this._markRebuild();\r\n this.setToRedraw();\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const symbol = extend({}, globalSymbol);\r\n const packs = featureGroups.map(feas =>\r\n this.createVectorPacks(painter, PackClass, symbol, feas, atlas[0], center)\r\n );\r\n\r\n\r\n Promise.all(packs).then(packData => {\r\n for (let i = 0; i < packData.length; i++) {\r\n let mesh;\r\n if (Array.isArray(meshes)) {\r\n for (let j = 0; j < meshes.length; j++) {\r\n if (meshes[j].feaGroupIndex === i) {\r\n mesh = meshes[j];\r\n break;\r\n }\r\n }\r\n } else {\r\n mesh = meshes;\r\n }\r\n if (!mesh) {\r\n continue;\r\n }\r\n this._updateMeshData(mesh, feaId, packData[i]);\r\n }\r\n });\r\n return true;\r\n }\r\n\r\n _updateMeshData(mesh, feaId, packData) {\r\n const aFeaIds = mesh.geometry.properties.aFeaIds;\r\n const startIndex = aFeaIds.indexOf(feaId);\r\n if (startIndex < 0) {\r\n return;\r\n }\r\n if (!packData) {\r\n let walker = startIndex + 1;\r\n while (aFeaIds[walker] === feaId) {\r\n walker++;\r\n }\r\n const length = walker - startIndex;\r\n const positionSize = mesh.geometry.desc.positionSize;\r\n if (EMPTY_POSITION.length !== length * 3) {\r\n EMPTY_POSITION = new Float32Array(length * positionSize);\r\n EMPTY_POSITION.fill(-Infinity, 0);\r\n }\r\n mesh.geometry.updateSubData(mesh.geometry.desc.positionAttribute, EMPTY_POSITION, startIndex * positionSize);\r\n } else {\r\n const dynamicAttrs = packData.data.dynamicAttributes;\r\n const count = packData.data.featureIds.length;\r\n const datas = packData.data.data;\r\n for (const p in datas) {\r\n if (dynamicAttrs[p]) {\r\n // 如果该属性是dynamic(值里包含了function-type),在之前的检查中会rebuild,所以这里不可能出现dynamic attribute\r\n continue;\r\n }\r\n if (hasOwn(datas, p) && datas[p]) {\r\n const data = datas[p];\r\n mesh.geometry.updateSubData(p, data, startIndex * data.length / count);\r\n }\r\n }\r\n }\r\n this.layer.fire('updatemesh');\r\n this.setToRedraw();\r\n }\r\n\r\n _buildLineMesh(atlas) {\r\n const lineUIDs = Object.keys(this._lineFeatures);\r\n if (!lineUIDs.length) {\r\n if (this._lineMeshes) {\r\n this._linePainter.deleteMesh(this._lineMeshes);\r\n delete this._lineMeshes;\r\n }\r\n return;\r\n }\r\n const { features, center } = this._getFeaturesToRender(this._lineFeatures);\r\n if (!features.length) {\r\n return;\r\n }\r\n const showHideUpdated = this._showHideUpdated;\r\n this._lineCenter = center;\r\n\r\n const featureGroups = this._groupLineFeas(features);\r\n\r\n const symbol = extend({}, LINE_SYMBOL);\r\n const promises = featureGroups.map((feas, i) =>\r\n this.createMesh(this._linePainter, LinePack, symbol, feas, atlas && atlas[i], center)\r\n );\r\n\r\n this._isCreatingLineMesh = true;\r\n Promise.all(promises).then(mm => {\r\n if (this._lineMeshes) {\r\n this._linePainter.deleteMesh(this._lineMeshes);\r\n }\r\n const meshes = [];\r\n const atlas = [];\r\n for (let i = 0; i < mm.length; i++) {\r\n const childMeshes = mm[i] && mm[i].meshes;\r\n if (childMeshes) {\r\n for (let j = 0; j < childMeshes.length; j++) {\r\n const mesh = childMeshes[j];\r\n mesh.feaGroupIndex = i;\r\n meshes.push(mesh);\r\n mesh.geometry.properties.originElements = mesh.geometry.properties.elements.slice();\r\n }\r\n atlas[i] = mm[i].atlas;\r\n }\r\n }\r\n this._lineMeshes = meshes;\r\n this._lineAtlas = atlas;\r\n if (showHideUpdated) {\r\n this._showHideUpdated = showHideUpdated;\r\n }\r\n this._isCreatingLineMesh = false;\r\n this.setToRedraw();\r\n this.layer.fire('buildlinemesh');\r\n });\r\n }\r\n\r\n _groupLineFeas(features) {\r\n //因为有虚线和没有虚线的line绘制逻辑不同,需要分开创建mesh\r\n const dashKeyName = (prefix + 'lineDasharray').trim();\r\n const patternKeyName = (prefix + 'linePatternFile').trim();\r\n const feas = [];\r\n const patternFeas = [];\r\n const dashFeas = [];\r\n for (let i = 0; i < features.length; i++) {\r\n const f = features[i];\r\n const dash = f.properties && f.properties[dashKeyName];\r\n if (dash && dashLength(dash)) {\r\n dashFeas.push(f);\r\n } else if (f.properties && f.properties[patternKeyName]) {\r\n patternFeas.push(f);\r\n } else {\r\n feas.push(f);\r\n }\r\n }\r\n return [feas, patternFeas, dashFeas];\r\n }\r\n\r\n _markRebuildGeometry() {\r\n this._dirtyGeo = true;\r\n this.setToRedraw();\r\n }\r\n\r\n _markRebuild() {\r\n this._dirtyAll = true;\r\n this.setToRedraw();\r\n }\r\n\r\n\r\n _convertGeometries(geometries) {\r\n const layerId = this.layer.getId();\r\n for (let i = 0; i < geometries.length; i++) {\r\n const geo = geometries[i];\r\n let hit = false;\r\n for (let ii = 0; ii < this.GeometryTypes.length; ii++) {\r\n if (geo instanceof this.GeometryTypes[ii]) {\r\n hit = true;\r\n break;\r\n }\r\n }\r\n if (!hit) {\r\n throw new Error(`${geo.getJSONType()} can't be added to ${this.layer.getJSONType()}(id:${layerId}).`);\r\n }\r\n\r\n this._convertGeo(geo);\r\n }\r\n }\r\n\r\n _convertGeo(geo) {\r\n if (geo[ID_PROP] === undefined) {\r\n geo[ID_PROP] = this._counter++;\r\n }\r\n const uid = geo[ID_PROP];\r\n if (this.features[uid]) {\r\n this._removeFeatures(uid);\r\n }\r\n this.features[uid] = convertToFeature(geo, this._kidGen, this.features[uid]);\r\n const feas = this.features[uid];\r\n this._refreshFeatures(feas, uid);\r\n this._geometries[uid] = geo;\r\n return uid;\r\n }\r\n\r\n _refreshFeatures(feas, uid) {\r\n if (!feas) {\r\n return;\r\n }\r\n const feaId = Array.isArray(feas) ? feas[0].id : feas.id;\r\n this._featureMapping[feaId] = feas;\r\n if (Array.isArray(feas)) {\r\n // 但geometry多symbol时,markerFeatures中只会保存最后一个feature的属性\r\n for (let j = 0; j < feas.length; j++) {\r\n // kid 是painter内部用来\r\n const kid = feas[j][KEY_IDX_NAME];\r\n feas[j][ID_PROP] = uid;\r\n this._allFeatures[kid] = { feature: feas[j] };\r\n this._allFeatures[kid][ID_PROP] = uid;\r\n // 采用 { feature } 结构,是为了和VT图层中 { feature, symbol } 统一\r\n if (!this.needCheckPointLineSymbols()) {\r\n continue;\r\n }\r\n const feaObj = { feature: feas[j] };\r\n // maptalks/issues#532\r\n // marker没有marker样式时也应该绘制,否则text会因为缺少对应的marker,在创建collision时出现错误\r\n if (hasMarkerSymbol(feas[j]) || hasTextSymbol(feas[j])) {\r\n this._markerFeatures[kid] = feaObj;\r\n // this._markerFeatures[kid].push(feaObj);\r\n }\r\n if (hasTextSymbol(feas[j])) {\r\n this._textFeatures[kid] = feaObj;\r\n // this._textFeatures[kid].push(feaObj);\r\n }\r\n if (hasLineSymbol(feas[j])) {\r\n this._lineFeatures[kid] = feaObj;\r\n // this._lineFeatures[uid].push(feaObj);\r\n }\r\n }\r\n } else {\r\n feas[ID_PROP] = uid;\r\n const feaObj = { feature: feas };\r\n const kid = feas[KEY_IDX_NAME];\r\n this._allFeatures[kid] = feaObj;\r\n if (!this.needCheckPointLineSymbols()) {\r\n return;\r\n }\r\n if (hasMarkerSymbol(feas) || hasTextSymbol(feas)) {\r\n this._markerFeatures[kid] = feaObj;\r\n }\r\n if (hasTextSymbol(feas)) {\r\n this._textFeatures[kid] = feaObj;\r\n }\r\n if (hasLineSymbol(feas)) {\r\n this._lineFeatures[kid] = feaObj;\r\n }\r\n }\r\n }\r\n\r\n needCheckPointLineSymbols() {\r\n return true;\r\n }\r\n\r\n _removeFeatures(uid) {\r\n const features = this.features[uid];\r\n if (!features) {\r\n return;\r\n }\r\n if (Array.isArray(features)) {\r\n for (let i = 0; i < features.length; i++) {\r\n const id = features[i][KEY_IDX_NAME];\r\n const feaId = features[i].id;\r\n delete this._featureMapping[feaId];\r\n delete this._allFeatures[id];\r\n delete this._markerFeatures[id];\r\n delete this._textFeatures[id];\r\n delete this._lineFeatures[id];\r\n }\r\n } else {\r\n const id = features[KEY_IDX_NAME];\r\n const feaId = features.id;\r\n delete this._featureMapping[feaId];\r\n delete this._allFeatures[id];\r\n delete this._markerFeatures[id];\r\n delete this._textFeatures[id];\r\n delete this._lineFeatures[id];\r\n }\r\n }\r\n\r\n pick(x, y, options) {\r\n const hits = [];\r\n if (!this.layer.isVisible()) {\r\n return hits;\r\n }\r\n const painters = [this.painter, this._markerPainter, this._linePainter];\r\n painters.forEach(painter => {\r\n if (!painter) {\r\n return;\r\n }\r\n const picked = painter.pick(x, y, options.tolerance);\r\n if (picked && picked.data && picked.data.feature) {\r\n const feature = picked.data.feature;\r\n const geometry = this._geometries[feature[ID_PROP]];\r\n if (options && options.includeInternals) {\r\n // from Map.GeometryEvents\r\n hits.push(geometry);\r\n } else {\r\n picked.geometry = geometry;\r\n delete picked.plugin;\r\n delete picked.data;\r\n delete picked.point;\r\n hits.push(picked);\r\n }\r\n }\r\n });\r\n return hits;\r\n }\r\n\r\n _getFeaKeyId(geo) {\r\n const uid = geo[ID_PROP];\r\n const features = this.features[uid];\r\n return Array.isArray(features) ? features[0][KEY_IDX_NAME] : features[KEY_IDX_NAME];\r\n }\r\n\r\n _updateDirtyTargets() {\r\n let updated = false;\r\n for (const p in this._dirtyTargetsInCurrentFrame) {\r\n const target = this._dirtyTargetsInCurrentFrame[p];\r\n const kid = this._getFeaKeyId(target);\r\n if (!this._isCreatingMarkerMesh && (this._markerFeatures[kid] || this._textFeatures[kid])) {\r\n const partial = this._updateMarkerMesh(target);\r\n updated = updated || partial;\r\n }\r\n if (!this._isCreatingLineMesh && this._lineFeatures[kid]) {\r\n const partial = this._updateLineMesh(target);\r\n updated = updated || partial;\r\n }\r\n if (!this._isCreatingMesh) {\r\n const partial = this.updateMesh(target);\r\n updated = updated || partial;\r\n }\r\n }\r\n this._dirtyTargetsInCurrentFrame = {};\r\n if (updated) {\r\n redraw(this);\r\n this.layer.fire('partialupdate');\r\n }\r\n }\r\n\r\n _convertAndRebuild(geo) {\r\n this._convertGeo(geo);\r\n this._markRebuild();\r\n redraw(this);\r\n }\r\n\r\n onGeometryAdd(geometries) {\r\n this.setToRedraw();\r\n if (!this.canvas) {\r\n // 说明createContext还没有调用,createContext中同样也会调用该方法,避免重复调用。\r\n return;\r\n }\r\n if (!geometries || !geometries.length) {\r\n return;\r\n }\r\n this._convertGeometries(geometries);\r\n this._markRebuild();\r\n redraw(this);\r\n }\r\n\r\n onGeometryRemove(geometries) {\r\n if (!geometries || !geometries.length) {\r\n return;\r\n }\r\n for (let i = 0; i < geometries.length; i++) {\r\n const geo = geometries[i];\r\n const uid = geo[ID_PROP];\r\n if (uid !== undefined) {\r\n delete this._geometries[uid];\r\n this._removeFeatures(uid);\r\n delete this.features[uid];\r\n }\r\n }\r\n this._markRebuild();\r\n redraw(this);\r\n }\r\n\r\n onGeometrySymbolChange(e) {\r\n // const { properties } = e;\r\n //TODO 判断properties中哪些只需要调用painter.updateSymbol\r\n // 如果有,则更新 this.painterSymbol 上的相应属性,以触发painter中的属性更新\r\n const geo = e.target['_getParent']() || e.target;\r\n const id = geo[ID_PROP];\r\n if (id === undefined) {\r\n return;\r\n }\r\n let props = e.properties;\r\n if (Array.isArray(props)) {\r\n const allChangedProps = {};\r\n for (let i = 0; i < props.length; i++) {\r\n if (props[i]) {\r\n extend(allChangedProps, props[i]);\r\n }\r\n }\r\n props = allChangedProps;\r\n } else if (props && props[0] !== undefined) {\r\n // a bug in maptalks, 数组类型的symbol会被转成对象形式返回\r\n const allChangedProps = {};\r\n for (const p in props) {\r\n if (props[p]) {\r\n extend(allChangedProps, props[p]);\r\n }\r\n }\r\n props = allChangedProps;\r\n }\r\n for (const p in props) {\r\n if (hasOwn(props, p)) {\r\n if (SYMBOLS_NEED_REBUILD_IN_VECTOR[p]) {\r\n this._convertAndRebuild(geo);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const symbol = geo['_getInternalSymbol']();\r\n const feas = this.features[id];\r\n this._convertGeo(geo);\r\n if (feas) {\r\n if (!compareSymbolCount(symbol, feas)) {\r\n this._convertAndRebuild(geo);\r\n return;\r\n }\r\n if (Array.isArray(symbol)) {\r\n for (let i = 0; i < symbol.length; i++) {\r\n const s = symbol[i];\r\n if (!compareSymbolProp(s, feas[i])) {\r\n this._convertAndRebuild(geo);\r\n return;\r\n }\r\n }\r\n } else if (!compareSymbolProp(symbol, feas)) {\r\n this._convertAndRebuild(geo);\r\n return;\r\n }\r\n } else {\r\n this._convertAndRebuild(geo);\r\n return;\r\n }\r\n this.onGeometryPositionChange(e);\r\n }\r\n\r\n onGeometryShapeChange(e) {\r\n const target = e.target['_getParent']() || e.target;\r\n const uid = target[ID_PROP];\r\n if (uid === undefined) {\r\n return;\r\n }\r\n // const geojson = convertToFeature(target, { id: 0 });\r\n // const coordJSON = geojson.geometry;\r\n // const features = this.features[uid];\r\n // const currentFea = Array.isArray(features) ? features[0] : features;\r\n // if (compareCoordSize(coordJSON, currentFea.geometry)) {\r\n // // 当数据的端点数量不变时,可以进行局部更新\r\n // // 但不适用lineMesh,因lineMesh因为会因为lineJoin角度变化,生成的实际端点数量会变化,无法局部更新\r\n // if (this._lineMeshes) {\r\n // this._dirtyLine = true;\r\n // }\r\n // this.onGeometryPositionChange(e);\r\n // return;\r\n // }\r\n this._convertGeometries([target]);\r\n this._markRebuildGeometry();\r\n redraw(this);\r\n }\r\n\r\n onGeometryPositionChange(e) {\r\n const target = e.target['_getParent']() || e.target;\r\n const uid = target[ID_PROP];\r\n if (uid === undefined) {\r\n return;\r\n }\r\n this._convertGeometries([target]);\r\n // 为应对同一个数据的频繁修改,发生变化的数据留到下一帧再统一修改\r\n this._dirtyTargetsInCurrentFrame[uid] = target;\r\n redraw(this);\r\n }\r\n\r\n onGeometryZIndexChange(e) {\r\n const target = e.target['_getParent']() || e.target;\r\n const uid = target[ID_PROP];\r\n if (uid === undefined) {\r\n return;\r\n }\r\n this._markRebuild();\r\n }\r\n\r\n onGeometryShow(e) {\r\n const target = e.target['_getParent']() || e.target;\r\n const uid = target[ID_PROP];\r\n if (uid === undefined) {\r\n return;\r\n }\r\n this._onShowHide(e);\r\n }\r\n\r\n onGeometryHide(e) {\r\n const target = e.target['_getParent']() || e.target;\r\n const uid = target[ID_PROP];\r\n if (uid === undefined) {\r\n return;\r\n }\r\n this._onShowHide(e);\r\n }\r\n\r\n _onShowHide(e) {\r\n const geo = e.target['_getParent']() || e.target;\r\n const uid = geo[ID_PROP];\r\n const features = this.features[uid];\r\n if (features) {\r\n const visible = geo.isVisible();\r\n if (Array.isArray(features)) {\r\n if (visible === features[0].visible) {\r\n return;\r\n }\r\n for (let i = 0; i < features.length; i++) {\r\n features[i].visible = visible;\r\n }\r\n } else {\r\n if (visible === features.visible) {\r\n return;\r\n }\r\n features.visible = visible;\r\n }\r\n this._markShowHide();\r\n redraw(this);\r\n }\r\n }\r\n\r\n _markShowHide() {\r\n this._showHideUpdated = true;\r\n }\r\n\r\n onGeometryPropertiesChange(e) {\r\n //TODO 可能会更新textName\r\n // this._markRebuildGeometry();\r\n const geo = e.target['_getParent']() || e.target;\r\n const uid = geo[ID_PROP];\r\n if (uid === undefined) {\r\n return;\r\n }\r\n this.features[uid] = convertToFeature(geo, this._kidGen);\r\n this._refreshFeatures(this.features[uid], uid);\r\n this._markRebuild();\r\n redraw(this);\r\n }\r\n\r\n createContext() {\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._createREGLContext();\r\n }\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.prepareRequestors();\r\n this.pickingFBO = this.canvas.pickingFBO || this.regl.framebuffer(this.canvas.width, this.canvas.height);\r\n this.painter = this.createPainter();\r\n const IconPainter = Vector3DLayer.get3DPainterClass('icon');\r\n let bloomSymbols = IconPainter.getBloomSymbol();\r\n const markerSymbol = extend({}, MARKER_SYMBOL, TEXT_SYMBOL);\r\n markerSymbol.markerPerspectiveRatio = this.layer.options['markerPerspectiveRatio'] || 0;\r\n this._defineSymbolBloom(markerSymbol, bloomSymbols);\r\n this._markerSymbol = markerSymbol;\r\n const sceneConfig = extend({}, ICON_PAINTER_SCENECONFIG, this.layer.options.sceneConfig || {});\r\n this._markerPainter = new IconPainter(this.regl, this.layer, markerSymbol, sceneConfig, 0);\r\n this._markerPainter.setTextShaderDefines({\r\n 'REVERSE_MAP_ROTATION_ON_PITCH': 1\r\n });\r\n\r\n const LinePainter = Vector3DLayer.get3DPainterClass('line');\r\n const lineSymbol = extend({}, LINE_SYMBOL);\r\n bloomSymbols = LinePainter.getBloomSymbol();\r\n this._defineSymbolBloom(lineSymbol, bloomSymbols);\r\n this._lineSymbol = lineSymbol;\r\n const lineSceneConfig = extend({}, this.layer.options.sceneConfig || {});\r\n if (lineSceneConfig.depthMask === undefined) {\r\n lineSceneConfig.depthMask = true;\r\n }\r\n this._linePainter = new LinePainter(this.regl, this.layer, lineSymbol, lineSceneConfig, 0);\r\n\r\n if (this.layer.getGeometries()) {\r\n this.onGeometryAdd(this.layer.getGeometries());\r\n }\r\n }\r\n\r\n _isInGroupGLLayer() {\r\n const inGroup = this.canvas && this.canvas.gl && this.canvas.gl.wrap;\r\n return !!inGroup;\r\n }\r\n\r\n _defineSymbolBloom(symbol, keys) {\r\n for (let i = 0; i < keys.length; i++) {\r\n symbol[keys[i]] = this.layer.options['enableBloom'];\r\n }\r\n }\r\n\r\n updateBloom(enableBloom) {\r\n if (this._markerPainter) {\r\n this._updatePainterBloom(this._markerPainter, this._markerSymbol, enableBloom);\r\n }\r\n if (this._linePainter) {\r\n this._updatePainterBloom(this._linePainter, this._lineSymbol, enableBloom);\r\n }\r\n if (this.painter) {\r\n this._updatePainterBloom(this.painter, this.painterSymbol, enableBloom);\r\n }\r\n }\r\n\r\n _updatePainterBloom(painter, targetSymbol, enableBloom) {\r\n const bloomSymbols = painter.constructor.getBloomSymbol();\r\n const symbol = bloomSymbols.reduce((v, currentValue) => {\r\n v[currentValue] = enableBloom;\r\n targetSymbol[currentValue] = enableBloom;\r\n return v;\r\n }, {});\r\n painter.updateSymbol(symbol, targetSymbol);\r\n }\r\n\r\n createPainter() {\r\n\r\n }\r\n\r\n _createREGLContext() {\r\n const layer = this.layer;\r\n\r\n const attributes = layer.options.glOptions || {\r\n alpha: true,\r\n depth: true,\r\n stencil: true,\r\n antialias: false\r\n // premultipliedAlpha : false\r\n };\r\n attributes.preserveDrawingBuffer = true;\r\n attributes.stencil = true;\r\n this.glOptions = attributes;\r\n this.gl = this.gl || this._createGLContext(this.canvas, attributes);\r\n this.regl = createREGL({\r\n gl: this.gl,\r\n attributes,\r\n extensions: reshader.Constants['WEBGL_EXTENSIONS'],\r\n optionalExtensions: reshader.Constants['WEBGL_OPTIONAL_EXTENSIONS']\r\n });\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 clearCanvas() {\r\n super.clearCanvas();\r\n if (!this.regl) {\r\n return;\r\n }\r\n //这里必须通过regl来clear,如果直接调用webgl context的clear,则brdf的texture会被设为0\r\n this.regl.clear({\r\n color: [0, 0, 0, 0],\r\n depth: 1,\r\n stencil: 0xFF\r\n });\r\n }\r\n\r\n resizeCanvas(canvasSize) {\r\n super.resizeCanvas(canvasSize);\r\n const canvas = this.canvas;\r\n if (!canvas) {\r\n return;\r\n }\r\n if (this.pickingFBO && (this.pickingFBO.width !== canvas.width || this.pickingFBO.height !== canvas.height)) {\r\n this.pickingFBO.resize(canvas.width, canvas.height);\r\n }\r\n if (this.painter) {\r\n this.painter.resize(canvas.width, canvas.height);\r\n }\r\n }\r\n\r\n onRemove() {\r\n super.onRemove();\r\n if (this.painter) {\r\n this.painter.delete();\r\n delete this.painter;\r\n }\r\n if (this._markerPainter) {\r\n this._markerPainter.delete();\r\n delete this._markerPainter;\r\n }\r\n if (this._linePainter) {\r\n this._linePainter.delete();\r\n delete this._linePainter;\r\n }\r\n }\r\n\r\n drawOutline(fbo) {\r\n if (this._outlineAll) {\r\n if (this.painter) {\r\n this.painter.outlineAll(fbo);\r\n }\r\n this._markerPainter.outlineAll(fbo);\r\n this._linePainter.outlineAll(fbo);\r\n }\r\n if (this._outlineFeatures) {\r\n for (let i = 0; i < this._outlineFeatures.length; i++) {\r\n if (this.painter) {\r\n this.painter.outline(fbo, this._outlineFeatures[i]);\r\n }\r\n this._markerPainter.outline(fbo, this._outlineFeatures[i]);\r\n this._linePainter.outline(fbo, this._outlineFeatures[i]);\r\n\r\n }\r\n }\r\n }\r\n\r\n outlineAll() {\r\n this._outlineAll = true;\r\n this.setToRedraw();\r\n }\r\n\r\n outline(geoIds) {\r\n if (!this._outlineFeatures) {\r\n this._outlineFeatures = [];\r\n }\r\n\r\n const featureIds = [];\r\n for (let i = 0; i < geoIds.length; i++) {\r\n const geo = this.layer.getGeometryById(geoIds[i]);\r\n if (geo) {\r\n const features = this.features[geo[ID_PROP]];\r\n if (Array.isArray(features)) {\r\n for (let j = 0; j < features.length; j++) {\r\n featureIds.push(features[j].id);\r\n }\r\n } else {\r\n featureIds.push(features.id);\r\n }\r\n }\r\n }\r\n this._outlineFeatures.push(featureIds);\r\n this.setToRedraw();\r\n }\r\n\r\n cancelOutline() {\r\n delete this._outlineAll;\r\n delete this._outlineFeatures;\r\n this.setToRedraw();\r\n }\r\n\r\n isEnableWorkAround(key) {\r\n if (key === 'win-intel-gpu-crash') {\r\n return this.layer.options['workarounds']['win-intel-gpu-crash'] && isWinIntelGPU(this.gl);\r\n }\r\n return false;\r\n }\r\n\r\n // _getCentiMeterScale(z) {\r\n // const map = this.getMap();\r\n // const p = map.distanceToPoint(1000, 0, z).x;\r\n // return p / 1000 / 10;\r\n // }\r\n _getCentiMeterScale(res) {\r\n const map = this.getMap();\r\n return getCentiMeterScale(res, map);\r\n }\r\n\r\n _onSpatialReferenceChange() {\r\n const geometries = this.layer.getGeometries();\r\n if (geometries) {\r\n this._convertGeometries(geometries);\r\n }\r\n this._markRebuild();\r\n }\r\n\r\n _getLayerOpacity() {\r\n const layerOpacity = this.layer.options['opacity'];\r\n // 不在GroupGLLayer中时,MapCanvasRenderer会读取opacity并按照透明度绘制,所以layerOpacity设成1\r\n return this._isInGroupGLLayer() ? (isNil(layerOpacity) ? 1 : layerOpacity) : 1;\r\n }\r\n}\r\n\r\nfunction redraw(renderer) {\r\n renderer.setToRedraw();\r\n}\r\n\r\nfunction isWinIntelGPU(gl) {\r\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\r\n if (debugInfo && typeof navigator !== 'undefined') {\r\n //e.g. ANGLE (Intel(R) HD Graphics 620\r\n const gpu = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\r\n const win = navigator.platform === 'Win32' || navigator.platform === 'Win64';\r\n if (gpu && gpu.toLowerCase().indexOf('intel') >= 0 && win) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport default Vector3DLayerRenderer;\r\n\r\nfunction hasMarkerSymbol({ properties }) {\r\n const markerFileName = (prefix + 'markerFile').trim();\r\n const markerTypeName = (prefix + 'markerType').trim();\r\n return properties[markerFileName] || properties[markerTypeName];\r\n}\r\n\r\nfunction hasTextSymbol({ properties }) {\r\n const keyName = (prefix + 'textName').trim();\r\n return properties[keyName];\r\n}\r\n\r\nconst lineWidthName = (prefix + 'lineWidth').trim();\r\nconst lineGradientPropertyName = (LINE_GRADIENT_PROP_KEY + '').trim();\r\n\r\nfunction hasLineSymbol(fea) {\r\n return fea.type === 2 && !fea.properties[lineGradientPropertyName] || (fea.type === 3 && (fea.properties[lineWidthName] !== undefined));\r\n}\r\n\r\nfunction dashLength(dash) {\r\n if (!Array.isArray(dash)) {\r\n return 0;\r\n }\r\n let len = 0;\r\n for (let i = 0; i < dash.length; i++) {\r\n len += dash[i];\r\n }\r\n return len;\r\n}\r\n\r\n// function compareCoordSize(coords0, coords1) {\r\n// if (coords0.length !== coords1.length) {\r\n// return false;\r\n// }\r\n// if (Array.isArray(coords0[0]) && Array.isArray(coords1[0])) {\r\n// for (let i = 0; i < coords0.length; i++) {\r\n// if (!compareCoordSize(coords0[0], coords1[0])) {\r\n// return false;\r\n// }\r\n// }\r\n// } else if (Array.isArray(coords0[0]) || Array.isArray(coords1[0])) {\r\n// return false;\r\n// }\r\n// return true;\r\n// }\r\n\r\nfunction compareSymbolCount(symbol, feas) {\r\n if (Array.isArray(symbol)) {\r\n if (!Array.isArray(feas)) {\r\n return false;\r\n } else {\r\n return symbol.length === feas.length;\r\n }\r\n } else {\r\n return !Array.isArray(feas);\r\n }\r\n}\r\n\r\nfunction compareSymbolProp(symbol, feature) {\r\n const props = Object.keys(symbol).sort().join();\r\n const feaProps = Object.keys(feature.properties || {}).filter(p => p.indexOf(prefix) === 0).map(p => p.substring(prefix.length)).sort().join();\r\n if (props !== feaProps) {\r\n return false;\r\n }\r\n for (const p in symbol) {\r\n if (hasOwn(symbol, p)) {\r\n const keyName = (prefix + p).trim();\r\n // 如果有fn-type的属性被更新,则重新rebuild all\r\n if (isFunctionDefinition(symbol[p]) !== isFunctionDefinition(feature.properties[keyName])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n","import * as maptalks from 'maptalks';\r\n\r\nexport function fromJSON(json, type, clazz) {\r\n if (!json || json['type'] !== type) {\r\n return null;\r\n }\r\n const layer = new clazz(json['id'], json['options']);\r\n const jsons = json['geometries'];\r\n const geometries = [];\r\n for (let i = 0; i < jsons.length; i++) {\r\n const geo = maptalks.Geometry.fromJSON(jsons[i]);\r\n if (geo) {\r\n geometries.push(geo);\r\n }\r\n }\r\n layer.addGeometry(geometries);\r\n return layer;\r\n}\r\n",null,null,null,"import { isNumber } from '../../common/Util';\r\n\r\n/**\r\n * Iterate features, and caculate vertex count in typedarray position\r\n * @param {Object[]} features - features to iterate\r\n * @param {Boolean} isLine - whether it's a line\r\n * @returns {Number}\r\n */\r\nexport function countVertexes(features, isLine) {\r\n let num = 0;\r\n for (let i = 0, l = features.length; i < l; i++) {\r\n const feature = features[i];\r\n if (isNumber(feature.geometry[0][0])) {\r\n //a multi geometry\r\n const count = feature.geometry.length * 3;\r\n num += isLine ? count * 2 - 6 : count;\r\n } else {\r\n for (let ii = 0, ll = feature.geometry.length; ii < ll; ii++) {\r\n let count = feature.geometry[ii].length * 3;\r\n if (feature.type === 3) { //polygon\r\n count -= 3; //remove the last vertex\r\n }\r\n num += isLine ? count * 2 - 6 : count;\r\n }\r\n }\r\n }\r\n return num;\r\n}\r\n\r\n/**\r\n *\r\n * @param {TypedArray} vertices - vertices array to fill\r\n * @param {Number} offset - start offset\r\n * @param {Number[][]|Object[]} segment - segment, can be [[x, y], [x, y]...] or [{x, y}, {x, y}]\r\n * @param {Number} scale - scale\r\n * @param {Number|Number[]} altitude - altitude or altitude[]\r\n * @param {Boolean} isLine\r\n */\r\nexport function fillPosArray(vertices, offset, segment, scale, altitude, isLine, positionType) {\r\n const isCoordArr = segment && Array.isArray(segment[0]);\r\n for (let i = 0, l = segment.length; i < l; i++) {\r\n vertices[offset] = (isCoordArr ? segment[i][0] : segment[i].x) * scale;\r\n vertices[offset + 1] = (isCoordArr ? segment[i][1] : segment[i].y) * scale;\r\n if (positionType !== Float32Array) {\r\n vertices[offset] = Math.round(vertices[offset]);\r\n vertices[offset + 1] = Math.round(vertices[offset + 1]);\r\n }\r\n\r\n let alt = altitude || 0;\r\n if (Array.isArray(altitude)) {\r\n alt = altitude[i];\r\n }\r\n alt = alt ? Math.round(scale * alt) : 0;\r\n vertices[offset + 2] = alt; // for altitude\r\n\r\n offset += 3;\r\n\r\n if (isLine && i !== 0 && i !== l - 1) {\r\n // start of the next line segment\r\n vertices[offset] = vertices[offset - 3];\r\n vertices[offset + 1] = vertices[offset - 2];\r\n vertices[offset + 2] = vertices[offset - 1];\r\n offset += 3;\r\n }\r\n }\r\n if (vertices.trySetLength) {\r\n vertices.trySetLength(offset);\r\n }\r\n return offset;\r\n}\r\n\r\nexport function isClippedEdge(vertices, i0, i1, EXTENT) {\r\n const x0 = vertices[i0 * 3], y0 = vertices[i0 * 3 + 1],\r\n x1 = vertices[i1 * 3], y1 = vertices[i1 * 3 + 1];\r\n return (x0 === x1 && (x0 < 0 || x0 > EXTENT)) ||\r\n (y0 === y1 && (y0 < 0 || y0 > EXTENT));\r\n}\r\n","import { wrap } from '../../common/Util';\r\n\r\nconst rad = Math.PI / 180;\r\nconst metersPerDegree = 6378137 * Math.PI / 180;\r\nconst maxLatitude = 85.0511287798;\r\n\r\nexport function project(out, lnglat, projection) {\r\n if (projection === 'EPSG:3857') {\r\n return project3857(out, lnglat);\r\n } else if (projection === 'EPSG:4326' || projection === 'EPSG:4490' || projection === 'identity') {\r\n return project4326(out, lnglat);\r\n } else if (projection === 'baidu') {\r\n return project4326(out, lnglat);\r\n } else {\r\n throw new Error('unsupported projection:' + projection);\r\n }\r\n}\r\n\r\nexport function unproject(out, coord, projection) {\r\n if (projection === 'EPSG:3857') {\r\n return unproject3857(out, coord);\r\n }\r\n}\r\n\r\nfunction project4326(out, lnglat) {\r\n out[0] = lnglat[0];\r\n out[1] = lnglat[1];\r\n return out;\r\n}\r\n\r\nfunction project3857(out, lnglat) {\r\n const max = maxLatitude;\r\n const lng = lnglat[0],\r\n lat = Math.max(Math.min(max, lnglat[1]), -max);\r\n let c;\r\n if (lat === 0) {\r\n c = 0;\r\n } else {\r\n c = Math.log(Math.tan((90 + lat) * rad / 2)) / rad;\r\n }\r\n out[0] = lng * metersPerDegree;\r\n out[1] = c * metersPerDegree;\r\n return out;\r\n}\r\n\r\nconst delta = 1E-7;\r\nfunction unproject3857(out, pLnglat) {\r\n let x = pLnglat[0] / metersPerDegree;\r\n const y = pLnglat[1];\r\n let c;\r\n if (y === 0) {\r\n c = 0;\r\n } else {\r\n c = y / metersPerDegree;\r\n c = (2 * Math.atan(Math.exp(c * rad)) - Math.PI / 2) / rad;\r\n }\r\n if (Math.abs(Math.abs(x) - 180) < delta) {\r\n x = Math.sign(x) * 180;\r\n }\r\n if (Math.abs(Math.abs(c) - maxLatitude) < delta) {\r\n c = Math.sign(c) * maxLatitude;\r\n }\r\n const rx = wrap(x, -180, 180);\r\n const ry = wrap(c, -maxLatitude, maxLatitude);\r\n out[0] = rx;\r\n out[1] = ry;\r\n return out;\r\n}\r\n","import { vec2 } from '@maptalks/vector-packer';\r\nimport { project } from './projection.js';\r\n\r\n// 按照原来的uv计算时的缩放比例,计算的 meter 到 gl point 坐标的比例\r\n// export const METER_TO_GL_POINT = 46.5;\r\n\r\n\r\nexport function buildFaceUV(mode, start, offset, uvs, vertices, uvOrigin, centimeterToPoint, tileRatio, texWidth, texHeight, ombb, res, glScale, projectionCode, center) {\r\n if (mode === 0) {\r\n buildFlatUV(start, offset, uvs, vertices, uvOrigin, centimeterToPoint, tileRatio, texWidth, texHeight, center);\r\n } else if (mode === 1) {\r\n buildOmbbUV(ombb, start, offset, uvs, vertices, uvOrigin, tileRatio, res, glScale, projectionCode, !!center);\r\n }\r\n}\r\n\r\n//inspired by https://stackoverflow.com/questions/20774648/three-js-generate-uv-coordinate\r\nfunction buildOmbbUV(obox, start, offset, uvs, vertices, uvOrigin, tileRatio, res, glScale, projectionCode, isExtrudePolygonLayer) {\r\n if (!obox) {\r\n return;\r\n }\r\n const idx = obox[4];\r\n let v0, v1, v2, v3;\r\n if (idx === 0) {\r\n v0 = obox[0];\r\n v1 = obox[1];\r\n v2 = obox[2];\r\n v3 = obox[3];\r\n } else {\r\n v0 = obox[1];\r\n v1 = obox[2];\r\n v2 = obox[3];\r\n v3 = obox[0];\r\n }\r\n // 长边\r\n const w = vec2.distance(v0, v1);\r\n const h = vec2.distance(v1, v2);\r\n\r\n const pt = [];\r\n const perpX = [];\r\n const perpY = [];\r\n\r\n //为了提升精度,计算uvOrigin的小数部分\r\n for (let i = start; i < offset; i += 3) {\r\n const idx = i / 3 * 2;\r\n const x = (uvOrigin.x / glScale + vertices[i] / tileRatio) * res;\r\n const y = uvOrigin.y / glScale * res + (isExtrudePolygonLayer ? vertices[i + 1] : -vertices[i + 1]) / tileRatio * res;\r\n vec2.set(pt, x, y);\r\n if (projectionCode === 'EPSG:4326' || projectionCode === 'EPSG:4490') {\r\n project(pt, pt, 'EPSG:3857');\r\n }\r\n getFootOfPerpendicular(perpX, pt, v0, v1);\r\n getFootOfPerpendicular(perpY, pt, v3, v0);\r\n uvs[idx] = vec2.distance(v0, perpX) / w;\r\n uvs[idx + 1] = vec2.distance(v0, perpY) / h;\r\n }\r\n}\r\n\r\nfunction getFootOfPerpendicular(\r\n out,\r\n pt, // 直线外一点\r\n begin, // 直线开始点\r\n end) // 直线结束点\r\n{\r\n\r\n const dx = begin[0] - end[0];\r\n const dy = begin[1] - end[1];\r\n\r\n let u = (pt[0] - begin[0]) * (begin[0] - end[0]) +\r\n (pt[1] - begin[1]) * (begin[1] - end[1]);\r\n u = u / ((dx * dx)+(dy * dy));\r\n\r\n out[0] = begin[0] + u * dx;\r\n out[1] = begin[1] + u * dy;\r\n\r\n return out;\r\n}\r\n\r\nfunction buildFlatUV(start, offset, uvs, vertices, uvOrigin, centimeterToPoint, tileRatio, texWidth, texHeight, center) {\r\n const xPointToMeter = 1 / (centimeterToPoint[0] * 100);\r\n const yPointToMeter = 1 / (centimeterToPoint[1] * 100);\r\n //为了提升精度,计算uvOrigin的小数部分\r\n // console.log([(uvOrigin.x / texWidth), (uvOrigin.y / texHeight)]);\r\n // const uvStart = [(uvOrigin.x / texWidth) % 1, (uvOrigin.y / texHeight) % 1];\r\n const centerX = (center && center[0] || 0);\r\n const centerY = (center && center[1] || 0);\r\n const uvStart = [0, 0];\r\n for (let i = start; i < offset; i += 3) {\r\n const idx = i / 3 * 2;\r\n const x = vertices[i] - centerX;\r\n const y = vertices[i + 1] - centerY;\r\n uvs[idx] = uvStart[0] + (x / tileRatio * xPointToMeter) / texWidth;\r\n uvs[idx + 1] = uvStart[1] - (y / tileRatio * yPointToMeter) / texHeight;\r\n }\r\n}\r\n\r\nexport function buildSideUV(sideUVMode, sideVerticalUVMode, textureYOrigin, uvs, vertices, indices, indiceStart, texWidth, texHeight, tileRatio, verticalCentimeterToPoint, needReverseTriangle) {\r\n let maxz = 0, minz = 0, h;\r\n let lensofar = 0;\r\n let seg = 0;\r\n\r\n const segStart = 5;\r\n const segEnd = needReverseTriangle ? [1, 3, 4] : [2, 3, 4];\r\n //因为是逆时针,需要倒序遍历\r\n const count = indices.getLength();\r\n for (let i = count - 1; i >= indiceStart; i--) {\r\n const idx = indices[i];\r\n const ix = idx * 3, iy = idx * 3 + 1, iz = idx * 3 + 2;\r\n const x = vertices[ix], y = vertices[iy], z = vertices[iz];\r\n if (!maxz && !minz) {\r\n maxz = Math.max(vertices[iz], vertices[indices[i - 3] * 3 + 2]);\r\n minz = Math.min(vertices[iz], vertices[indices[i - 3] * 3 + 2]);\r\n h = maxz - minz;\r\n }\r\n let len = lensofar;\r\n const m = i % 6;\r\n //每6个点构成一个矩形,其顺序如下:\r\n // 1 -- 2(3)\r\n // | |\r\n // 0(5)- 4\r\n // 如果是needReverseTriangle\r\n // 2 -- 1(4)\r\n // | |\r\n // 0(5)- 3\r\n if (sideUVMode === 0) {\r\n //连续\r\n if (m === segStart) {\r\n seg = getSegLength(vertices, indices, i, x, y);\r\n }\r\n if (m === segEnd[0] || m === segEnd[1] || m === segEnd[2]) {\r\n len = lensofar;\r\n } else {\r\n len = lensofar + seg;\r\n }\r\n } else if (sideUVMode === 1) {\r\n if (m === segEnd[0] || m === segEnd[1] || m === segEnd[2]) {\r\n len = 0;\r\n } else if (m === segStart) {\r\n seg = getSegLength(vertices, indices, i, x, y);\r\n len = seg;\r\n } else {\r\n len = seg;\r\n }\r\n }\r\n\r\n // len * glScale = gl point, tileRatio = extent / tileSize\r\n const pointToMeter = 1 / (verticalCentimeterToPoint * 100);\r\n const u = len / tileRatio * pointToMeter / texWidth; //0 ? 1.0 - len * glScale / texWidth :\r\n // const u = len * tileRatio * glScale / texWidth;\r\n let v;\r\n\r\n if (sideVerticalUVMode === 1) {\r\n // 垂直平铺\r\n // https://github.com/maptalks/issues/issues/294\r\n v = z === maxz ? 1 : 0;\r\n } else {\r\n if (textureYOrigin === 'bottom') {\r\n // 除以 100 是从厘米转换为米\r\n v = (z === maxz ? h / 100 / texHeight : 0);\r\n } else {\r\n v = (z === maxz ? 0 : -h / 100 / texHeight);\r\n }\r\n }\r\n\r\n uvs[idx * 2] = u;\r\n uvs[idx * 2 + 1] = v;\r\n\r\n if (m === 0) {\r\n lensofar += seg;\r\n }\r\n // prex = x;\r\n // prey = y;\r\n }\r\n}\r\n\r\nfunction getSegLength(vertices, indices, i, x, y) {\r\n const ix = indices[i - 1] * 3, iy = indices[i - 1] * 3 + 1;\r\n const nextx = vertices[ix], nexty = vertices[iy];\r\n return distanceTo(x, y, nextx, nexty);\r\n}\r\n\r\n/**\r\n * caculate 2 points' distance\r\n * @param {Number} x0 - x0\r\n * @param {Number} y0 - y0\r\n * @param {Number} x1 - x1\r\n * @param {Number} y1 - y1\r\n */\r\nfunction distanceTo(x0, y0, x1, y1) {\r\n return Math.sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));\r\n}\r\n","import { fillPosArray, isClippedEdge } from './Common';\r\nimport { buildFaceUV, buildSideUV } from './UV';\r\nimport { isNumber } from '../../common/Util';\r\nimport { PackUtil, ArrayPool, earcut } from '@maptalks/vector-packer';\r\nimport { KEY_IDX, PROP_OMBB } from '../../common/Constant';\r\n\r\nexport function buildExtrudeFaces(\r\n features, EXTENT,\r\n {\r\n altitudeScale, altitudeProperty, defaultAltitude, heightProperty, minHeightProperty, defaultHeight\r\n },\r\n {\r\n center,\r\n side,\r\n top,\r\n topThickness,\r\n uvOrigin,\r\n uv,\r\n uvSize,\r\n topUVMode,\r\n sideUVMode,\r\n sideVerticalUVMode,\r\n textureYOrigin,\r\n // vScale用于将meter转为gl point值\r\n // tileRatio = extent / tileSize\r\n tileRatio,\r\n // 厘米到tile point\r\n centimeterToPoint,\r\n verticalCentimeterToPoint,\r\n positionType,\r\n res,\r\n glScale,\r\n projectionCode\r\n },\r\n debugIndex, arrayPool\r\n) {\r\n // debugger\r\n let scale = EXTENT / features[0].extent;\r\n if (EXTENT === Infinity) {\r\n scale = 1;\r\n }\r\n // Vector3DLayer下,需要反向的triangle\r\n const needReverseTriangle = EXTENT === Infinity;\r\n\r\n // const size = countVertexes(features) * 2;\r\n //featIndexes : index of indices for each feature\r\n // const arrCtor = getIndexArrayType(features.length);\r\n\r\n // !! 这里是危险区域,需要格外注意:\r\n // 2024年06月,为了提升arrayPool中数组的性能,arrayPool.get方法范围的数组不再使用Proxy对array进行包装,导致array.length不再返回array中的数据条数,而是数组本身的大小。\r\n // 所以使用该类数组时,需要使用 array.getLength() 才能返回正确的数据条数,而用 array.length 会返回错误的值\r\n\r\n const featIndexes = arrayPool.get();\r\n const pickingIds = arrayPool.get();\r\n const featIds = arrayPool.get();\r\n // arrayPool.getProxy() 返回的数组会用Proxy包装,其 .length 和 .getLength() 返回的值是一致的,但读取性能比 arrayPool.get() 返回的数组慢很多,多用于传递给第三方库作为参数(例如这里的earcut)\r\n const geoVertices = arrayPool.getProxy();\r\n const vertices = arrayPool.get();\r\n const indices = arrayPool.get();\r\n const verticeTypes = arrayPool.get();\r\n const generateUV = !!uv,\r\n generateTop = !!top,\r\n generateSide = !!side;\r\n const uvs = generateUV ? arrayPool.get() : null;\r\n // const clipEdges = [];\r\n function fillData(start, offset, holes, height, ombb, needReverseTriangle) {\r\n let typeStartOffset = offset;\r\n //just ignore bottom faces never appear in sight\r\n if (generateTop) {\r\n const triangles = earcut(geoVertices, holes, 3); //vertices, holes, dimension(2|3)\r\n if (triangles.length === 0) {\r\n return offset;\r\n }\r\n //TODO caculate earcut deviation\r\n // pushIn(vertices, geoVertices);\r\n let count = geoVertices.getLength();\r\n let index = vertices.currentIndex;\r\n for (let i = 0; i < count; i++) {\r\n vertices[index++] = geoVertices[i];\r\n }\r\n vertices.currentIndex = index;\r\n\r\n offset += geoVertices.getLength();\r\n //switch triangle's i + 1 and i + 2 to make it ccw winding\r\n if (needReverseTriangle) {\r\n for (let i = 2, l = triangles.length; i < l; i += 3) {\r\n triangles[i] += start / 3;\r\n triangles[i - 1] += start / 3;\r\n triangles[i - 2] += start / 3;\r\n }\r\n } else {\r\n let tmp;\r\n for (let i = 2, l = triangles.length; i < l; i += 3) {\r\n tmp = triangles[i - 1];\r\n triangles[i - 1] = triangles[i] + start / 3;\r\n triangles[i] = tmp + start / 3;\r\n triangles[i - 2] += start / 3;\r\n }\r\n }\r\n\r\n //top face indices\r\n // pushIn(indices, triangles);\r\n count = triangles.length;\r\n index = indices.currentIndex;\r\n for (let i = 0; i < count; i++) {\r\n indices[index++] = triangles[i];\r\n }\r\n indices.currentIndex = index;\r\n if (generateUV) {\r\n // debugger\r\n buildFaceUV(topUVMode || 0, start, offset, uvs, vertices, uvOrigin, centimeterToPoint, tileRatio, uvSize[0], uvSize[1], ombb, res, glScale, projectionCode, center);\r\n }\r\n\r\n if (topThickness > 0 && !generateSide) {\r\n offset = buildSide(vertices, geoVertices, holes, indices, offset, uvs, 0, topThickness, EXTENT, generateUV, sideUVMode || 0, sideVerticalUVMode || 0, textureYOrigin, uvSize, tileRatio, verticalCentimeterToPoint, needReverseTriangle);\r\n }\r\n verticeTypes.setLength(offset / 3);\r\n verticeTypes.fill(1, typeStartOffset / 3, offset / 3);\r\n }\r\n // debugger\r\n if (generateSide) {\r\n if (generateTop) {\r\n topThickness = 0;\r\n }\r\n typeStartOffset = offset;\r\n offset = buildSide(vertices, geoVertices, holes, indices, offset, uvs, topThickness, height, EXTENT, generateUV, sideUVMode || 0, sideVerticalUVMode || 0, textureYOrigin, uvSize, tileRatio, verticalCentimeterToPoint, needReverseTriangle);\r\n verticeTypes.setLength(offset / 3);\r\n const count = geoVertices.getLength() / 3;\r\n verticeTypes.fill(1, typeStartOffset / 3, typeStartOffset / 3 + count);\r\n verticeTypes.fill(0, typeStartOffset / 3 + count, typeStartOffset / 3 + 2 * count);\r\n verticeTypes.fill(1, typeStartOffset / 3 + 2 * count, typeStartOffset / 3 + 3 * count);\r\n verticeTypes.fill(0, typeStartOffset / 3 + 3 * count, offset / 3);\r\n }\r\n return offset;\r\n }\r\n\r\n let maxAltitude = 0;\r\n let offset = 0;\r\n const BOUNDS = [-1, -1, EXTENT + 1, EXTENT + 1];\r\n\r\n let r = 0, n = features.length;\r\n if (isNumber(debugIndex)) {\r\n r = debugIndex;\r\n n = debugIndex + 1;\r\n }\r\n let maxFeaId = 0;\r\n let hasNegative = false;\r\n const holes = arrayPool.getProxy();\r\n for (; r < n; r++) {\r\n const feature = features[r];\r\n const feaId = feature.id;\r\n if (isNumber(feaId)) {\r\n if (Math.abs(feaId) > maxFeaId) {\r\n maxFeaId = Math.abs(feaId);\r\n }\r\n if (feaId < 0) {\r\n hasNegative = true;\r\n }\r\n }\r\n\r\n const geometry = feature.geometry;\r\n const ombb = feature.properties[PROP_OMBB];\r\n const isMultiOmbb = Array.isArray(ombb && ombb[0] && ombb[0][0]);\r\n let ringOmbb = isMultiOmbb ? ombb[0] : ombb;\r\n\r\n const { altitude, height } = PackUtil.getFeaAltitudeAndHeight(feature, altitudeScale, altitudeProperty, defaultAltitude, heightProperty, defaultHeight, minHeightProperty);\r\n maxAltitude = Math.max(Math.abs(altitude), maxAltitude);\r\n\r\n const verticeCount = vertices.getLength();\r\n\r\n let exteriorIndex = 0;\r\n let start = offset;\r\n holes.setLength(0);\r\n geoVertices.setLength(0);\r\n const shellIsClockwise = PackUtil.calculateSignedArea(geometry[0]) < 0;\r\n for (let i = 0, l = geometry.length; i < l; i++) {\r\n let ring = geometry[i];\r\n if (shellIsClockwise) {\r\n ring = ring.reverse();\r\n }\r\n ring = cleanVertices(ring);\r\n const isHole = PackUtil.calculateSignedArea(ring) < 0;\r\n //fill bottom vertexes\r\n if (!isHole && i > 0) {\r\n exteriorIndex++;\r\n ringOmbb = ombb && ombb[exteriorIndex];\r\n //an exterior ring (multi polygon)\r\n offset = fillData(start, offset, holes, height * scale, ringOmbb, needReverseTriangle, exteriorIndex); //need to multiply with scale as altitude is\r\n geoVertices.setLength(0);\r\n holes.setLength(0);\r\n start = offset;\r\n }\r\n if (EXTENT !== Infinity) {\r\n ring = PackUtil.clipPolygon(ring, BOUNDS);\r\n }\r\n if (!ring.length) {\r\n if (i === l - 1) {\r\n offset = fillData(start, offset, holes, height * scale, ringOmbb, needReverseTriangle); //need to multiply with scale as altitude is\r\n }\r\n continue;\r\n }\r\n const ringLen = ring.length;\r\n if (Array.isArray(ring[0])) {\r\n if (ring[0][0] !== ring[ringLen - 1][0] || ring[0][1] !== ring[ringLen - 1][1]) {\r\n //首尾不一样时,在末尾添加让首尾封闭\r\n ring.push([ring[0][0], ring[0][1]]);\r\n }\r\n } else if (ring[0].x !== ring[ringLen - 1].x || ring[0].y !== ring[ringLen - 1].y) {\r\n //首尾不一样时,在末尾添加让首尾封闭\r\n ring.push(ring[0]);\r\n }\r\n if (isHole) {\r\n let index = holes.currentIndex;\r\n holes[index++] = geoVertices.getLength() / 3;\r\n holes.currentIndex = index;\r\n }\r\n //a seg or a ring in line or polygon\r\n fillPosArray(geoVertices, geoVertices.getLength(), ring, scale, altitude, false, positionType);\r\n\r\n if (i === l - 1) {\r\n offset = fillData(start, offset, holes, height * scale, ringOmbb, needReverseTriangle); //need to multiply with scale as altitude is\r\n }\r\n }\r\n\r\n const count = vertices.getLength() - verticeCount;\r\n const keyName = (KEY_IDX + '').trim();\r\n for (let i = 0; i < count / 3; i++) {\r\n let index = pickingIds.currentIndex;\r\n pickingIds[index++] = feature[keyName] === undefined ? r : feature[keyName];\r\n pickingIds.currentIndex = index;\r\n\r\n index = featIndexes.currentIndex;\r\n featIndexes[index++] = r;\r\n featIndexes.currentIndex = index;\r\n\r\n // pickingIds.push(feature[keyName] === undefined ? r : feature[keyName]);\r\n // featIndexes.push(r);\r\n if (isNumber(feaId)) {\r\n index = featIds.currentIndex;\r\n featIds[index++] = feaId;\r\n featIds.currentIndex = index;\r\n // featIds.push(feaId);\r\n }\r\n }\r\n }\r\n const pickingCtor = PackUtil.getUnsignedArrayType(pickingIds.getLength() ? pickingIds[pickingIds.getLength() - 1] : 0);\r\n\r\n const data = {\r\n maxAltitude,\r\n vertices: vertices, // vertexes\r\n verticeTypes,\r\n indices, // indices for drawElements\r\n pickingIds: ArrayPool.createTypedArray(pickingIds, pickingCtor), // vertex index of each feature\r\n featureIndexes: featIndexes\r\n };\r\n if (featIds.getLength()) {\r\n const feaCtor = hasNegative ? PackUtil.getPosArrayType(maxFeaId) : PackUtil.getUnsignedArrayType(maxFeaId);\r\n data.featureIds = ArrayPool.createTypedArray(featIds, feaCtor);\r\n } else {\r\n data.featureIds = [];\r\n }\r\n if (uvs) {\r\n //因为vertices中最后一位不在indices中引用,uvs为保持位数与vertices一致,需补充2位\r\n uvs.setLength(vertices.getLength() / 3 * 2);\r\n //改成int16\r\n data.uvs = uvs;\r\n }\r\n return data;\r\n}\r\n\r\nfunction buildSide(vertices, topVertices, holes, indices, offset, uvs, topThickness, height, EXTENT, generateUV, sideUVMode, sideVerticalUVMode, textureYOrigin, uvSize, tileRatio, verticalCentimeterToPoint, needReverseTriangle) {\r\n const count = topVertices.getLength();\r\n const startIdx = offset / 3;\r\n //拷贝两次top和bottom,是为了让侧面的三角形使用不同的端点,避免uv和normal值因为共端点产生错误\r\n //top vertexes\r\n for (let i = 2, l = count; i < l; i += 3) {\r\n vertices[offset + i - 2] = topVertices[i - 2];\r\n vertices[offset + i - 1] = topVertices[i - 1];\r\n vertices[offset + i - 0] = topVertices[i] - topThickness;\r\n }\r\n offset += count;\r\n //bottom vertexes\r\n for (let i = 2, l = count; i < l; i += 3) {\r\n vertices[offset + i - 2] = topVertices[i - 2];\r\n vertices[offset + i - 1] = topVertices[i - 1];\r\n vertices[offset + i - 0] = topVertices[i] - height;\r\n }\r\n offset += count;\r\n //top vertexes\r\n // for (let i = 2, l = count; i < l; i += 3) {\r\n // vertices[offset + i - 2] = topVertices[i - 2];\r\n // vertices[offset + i - 1] = topVertices[i - 1];\r\n // vertices[offset + i - 0] = topVertices[i] - topThickness;\r\n // }\r\n vertices.trySetLength(offset + count);\r\n vertices.copyWithin(offset, offset - 2 * count, offset - count);\r\n offset += count;\r\n //bottom vertexes\r\n vertices.trySetLength(offset + count);\r\n vertices.copyWithin(offset, offset - 2 * count, offset - count);\r\n // for (let i = 2, l = count; i < l; i += 3) {\r\n // vertices[offset + i - 2] = topVertices[i - 2];\r\n // vertices[offset + i - 1] = topVertices[i - 1];\r\n // vertices[offset + i - 0] = topVertices[i] - height;\r\n // }\r\n offset += count;\r\n // vertices.trySetLength(offset);\r\n holes = holes || [];\r\n holes.push(count / 3);\r\n const holeCount = holes.getLength();\r\n for (let r = 0; r < holeCount; r++) {\r\n // #287, 遍历geometry中的每个ring,构造侧面三角形和uv坐标\r\n const ringStart = startIdx + (holes[r - 1] || 0);\r\n const ringEnd = startIdx + holes[r];\r\n\r\n buildRingSide(ringStart, ringEnd, vertices, count / 3, EXTENT, indices,\r\n generateUV, sideUVMode, sideVerticalUVMode, textureYOrigin, uvs, uvSize, tileRatio, verticalCentimeterToPoint, needReverseTriangle);\r\n }\r\n return offset;\r\n}\r\n\r\nfunction buildRingSide(ringStart, ringEnd, vertices, vertexCount, EXTENT, indices,\r\n generateUV, sideUVMode, sideVerticalUVMode, textureYOrigin, uvs, uvSize, tileRatio, verticalCentimeterToPoint, needReverseTriangle) {\r\n const indiceStart = indices.getLength();\r\n let current, next;\r\n for (let i = ringStart, l = ringEnd; i < l - 1; i++) {\r\n current = i;\r\n next = i + 1;\r\n if (EXTENT !== Infinity && isClippedEdge(vertices, current, next, EXTENT)) {\r\n continue;\r\n }\r\n if ((i - ringStart) % 2 === 1) {\r\n //加上 2 * vertexCount,使用与 i % 2 === 0 时,不同的另一组端点,以避免共端点\r\n current += 2 * vertexCount;\r\n next += 2 * vertexCount;\r\n }\r\n\r\n if (!needReverseTriangle) {\r\n let index = indices.currentIndex;\r\n //bottom[i], top[i], top[i + 1]\r\n indices[index++] = current + vertexCount;\r\n indices[index++] = current;\r\n indices[index++] = next;\r\n //top[i + 1], bottom[i + 1], bottom[i]\r\n indices[index++] = next;\r\n indices[index++] = next + vertexCount;\r\n indices[index++] = current + vertexCount;\r\n\r\n indices.currentIndex = index;\r\n //bottom[i], top[i], top[i + 1]\r\n // indices.push(current + vertexCount, current, next);\r\n //top[i + 1], bottom[i + 1], bottom[i]\r\n // indices.push(next, next + vertexCount, current + vertexCount);\r\n } else {\r\n let index = indices.currentIndex;\r\n //bottom[i], top[i], top[i + 1]\r\n indices[index++] = current + vertexCount;\r\n indices[index++] = next;\r\n indices[index++] = current;\r\n //top[i + 1], bottom[i + 1], bottom[i]\r\n indices[index++] = next + vertexCount;\r\n indices[index++] = next;\r\n indices[index++] = current + vertexCount;\r\n\r\n indices.currentIndex = index;\r\n // indices.push(current + vertexCount, next, current);\r\n // indices.push(next + vertexCount, next, current + vertexCount);\r\n }\r\n\r\n }\r\n if (generateUV) {\r\n buildSideUV(sideUVMode, sideVerticalUVMode, textureYOrigin, uvs, vertices, indices, indiceStart, uvSize[0], uvSize[1], tileRatio, verticalCentimeterToPoint, needReverseTriangle); //convert uvSize[1] to meter\r\n }\r\n}\r\n\r\nfunction cleanVertices(ring) {\r\n const result = [ring[0]];\r\n let currentVertice = ring[0];\r\n for (let i = 1; i < ring.length; i++) {\r\n if (Array.isArray(ring[i])) {\r\n if (ring[i][0] !== currentVertice[0] || ring[i][1] !== currentVertice[1] || ring[i][2] !== currentVertice[2]) {\r\n result.push(ring[i]);\r\n }\r\n } else {\r\n if (ring[i].x !== currentVertice.x || ring[i].y !== currentVertice.y || ring[i].z !== currentVertice.z) {\r\n result.push(ring[i]);\r\n }\r\n }\r\n currentVertice = ring[i];\r\n }\r\n return result;\r\n}\r\n","import { isFnTypeSymbol } from '../../common/Util';\r\nimport { buildExtrudeFaces } from './Extrusion';\r\n// import { buildUniqueVertex, buildShadowVolume } from './Build';\r\nimport { buildNormals, buildTangents, packTangentFrame } from '@maptalks/tbn-packer';\r\nimport { interpolated, piecewiseConstant, isFunctionDefinition } from '@maptalks/function-type';\r\nimport { StyleUtil, PackUtil, ArrayPool, vec3, vec4 } from '@maptalks/vector-packer';\r\n\r\nconst arrayPool = ArrayPool.getInstance();\r\n\r\nexport default function (features, dataConfig, extent, uvOrigin, textureSize, res, glScale,\r\n tileRatio, centimeterToPoint, verticalCentimeterToPoint, symbol, zoom, projectionCode, debugIndex, positionType, center) {\r\n if (dataConfig.top === undefined) {\r\n dataConfig.top = true;\r\n }\r\n if (dataConfig.side === undefined) {\r\n dataConfig.side = true;\r\n }\r\n arrayPool.reset();\r\n const {\r\n altitudeScale,\r\n altitudeProperty,\r\n defaultAltitude,\r\n heightProperty,\r\n minHeightProperty,\r\n defaultHeight,\r\n tangent,\r\n uv,\r\n topUVMode,\r\n sideUVMode, sideVerticalUVMode,\r\n top, side,\r\n textureYOrigin,\r\n topThickness,\r\n } = dataConfig;\r\n //256是2的8次方,在glZoom + 8级别时,texture为1:1比例\r\n // const textureSize = PACK_TEX_SIZE;\r\n const isExtrudePolygonLayer = !!center;\r\n const faces = buildExtrudeFaces(\r\n features, extent,\r\n {\r\n altitudeScale, altitudeProperty,\r\n defaultAltitude: defaultAltitude || 0,\r\n heightProperty,\r\n minHeightProperty,\r\n defaultHeight: defaultHeight || 0\r\n },\r\n {\r\n center,\r\n top, side,\r\n topThickness: topThickness * 10 || 0,\r\n uv: uv || tangent, //tangent也需要计算uv\r\n uvSize: [textureSize, textureSize],\r\n uvOrigin,\r\n topUVMode,\r\n sideUVMode,\r\n sideVerticalUVMode,\r\n textureYOrigin,\r\n // tileRatio = extent / tileSize\r\n tileRatio,\r\n // 厘米到point的比例系数\r\n centimeterToPoint,\r\n verticalCentimeterToPoint,\r\n positionType,\r\n // tile的resolution\r\n res,\r\n glScale,\r\n projectionCode\r\n }, debugIndex, arrayPool);\r\n const buffers = [];\r\n const vertexCount = faces.vertices.getLength() / 3;\r\n const ctor = PackUtil.getIndexArrayType(vertexCount);\r\n const indices = ArrayPool.createTypedArray(faces.indices, ctor);\r\n delete faces.indices;\r\n buffers.push(indices.buffer, faces.pickingIds.buffer);\r\n\r\n const posArrayType = positionType || PackUtil.getPosArrayType(Math.max(512, faces.maxAltitude));\r\n faces.vertices = ArrayPool.createTypedArray(faces.vertices, posArrayType);\r\n\r\n const normalArr = tangent ? arrayPool.getProxy() : new Float32Array(vertexCount * 3);\r\n if (normalArr.setLength) {\r\n normalArr.setLength(vertexCount * 3);\r\n }\r\n const normals = buildNormals(faces.vertices, indices, normalArr);\r\n let simpleNormal = true;\r\n const delta = 1E-6;\r\n //因为aPosition中的数据是在矢量瓦片坐标体系里的,y轴和webgl坐标体系相反,所以默认计算出来的normal是反的\r\n const normalLen = normals.getLength ? normals.getLength() : normals.length;\r\n for (let i = 0; i < normalLen; i++) {\r\n if (!isExtrudePolygonLayer) {\r\n normals[i] = -normals[i];\r\n }\r\n const m = normals[i] % 1;\r\n if (1 - Math.abs(m) > delta) {\r\n simpleNormal = false;\r\n } else if (m !== 0) {\r\n normals[i] = Math.round(normals[i]);\r\n }\r\n }\r\n faces.normals = normals;\r\n if (tangent) {\r\n let tangents = arrayPool.get();\r\n tangents.setLength(vertexCount * 4);\r\n tangents = buildTangents(faces.vertices, faces.normals, faces.uvs, indices, tangents);\r\n tangents = createQuaternion(faces.normals, tangents);\r\n faces.tangents = tangents;\r\n buffers.push(tangents.buffer);\r\n //normal被封装在了tangents中\r\n delete faces.normals;\r\n }\r\n if (faces.normals) {\r\n //如果只有顶面,normal数据只有0, 1, -1时,则为simple normal,可以改用Int8Array\r\n if (simpleNormal) {\r\n faces.normals = ArrayPool.createTypedArray(faces.normals, Int8Array);\r\n }\r\n\r\n buffers.push(faces.normals.buffer);\r\n }\r\n if (faces.uvs) {\r\n const uvs = faces.uvs;\r\n faces.uvs = ArrayPool.createTypedArray(uvs, Float32Array);\r\n buffers.push(faces.uvs.buffer);\r\n }\r\n if (center) {\r\n const vertices = faces.vertices;\r\n const l = vertices.length;\r\n for (let i = 0; i < l; i += 3) {\r\n vertices[i] -= center[0];\r\n vertices[i + 1] -= center[1];\r\n }\r\n }\r\n\r\n\r\n const fnTypes = buildFnTypes(features, symbol, zoom, faces.featureIndexes);\r\n const vertexColors = buildVertexColorTypes(faces.verticeTypes, faces.featureIndexes, features, symbol, zoom);\r\n const data = {\r\n data: {\r\n data: {\r\n aVertexColorType: vertexColors.length <= 252 ? ArrayPool.createTypedArray(faces.verticeTypes, Uint8Array) : ArrayPool.createTypedArray(faces.verticeTypes, Uint16Array),\r\n aPosition: faces.vertices,\r\n aNormal: faces.normals,\r\n aTexCoord0: faces.uvs,\r\n aTangent: faces.tangents,\r\n aPickingId: faces.pickingIds,\r\n },\r\n indices,\r\n properties: {\r\n maxAltitude: faces.maxAltitude\r\n },\r\n dynamicAttributes: fnTypes.dynamicAttributes,\r\n vertexColors\r\n },\r\n buffers\r\n };\r\n // featureIds 在Extrusion中已经转换为了普通数组,不需要用 getLength() 返回数据条数\r\n if (faces.featureIds.length) {\r\n data.data.featureIds = faces.featureIds;\r\n buffers.push(data.data.featureIds.buffer);\r\n } else {\r\n data.data.featureIds = [];\r\n }\r\n if (fnTypes.aColor) {\r\n data.data.data.aColor = fnTypes.aColor;\r\n data.buffers.push(fnTypes.aColor.buffer);\r\n }\r\n if (fnTypes.aOpacity) {\r\n data.data.data.aOpacity = fnTypes.aOpacity;\r\n data.buffers.push(fnTypes.aOpacity.buffer);\r\n }\r\n data.buffers.push(data.data.data.aPosition.buffer);\r\n data.data.pickingIdIndiceMap = PackUtil.generatePickingIndiceIndex(data.data.data.aPickingId, data.data.indices);\r\n return data;\r\n}\r\n\r\nfunction createQuaternion(normals, tangents) {\r\n const count = tangents.getLength();\r\n const aTangent = new Float32Array(count);\r\n const t = [], n = [], q = [];\r\n\r\n for (let i = 0; i < count; i += 4) {\r\n const ni = i / 4 * 3;\r\n vec3.set(n, normals[ni] || 0, normals[ni + 1] || 0, normals[ni + 2] || 0);\r\n vec4.set(t, tangents[i] || 0, tangents[i + 1] || 0, tangents[i + 2] || 0, tangents[i + 3] || 0);\r\n packTangentFrame(q, n, t);\r\n vec4.copy(aTangent.subarray(i, i + 4), q);\r\n }\r\n return aTangent;\r\n}\r\n\r\nconst ARR0 = [];\r\nfunction buildFnTypes(features, symbol, zoom, feaIndexes) {\r\n const dynamicAttributes = {};\r\n const fnTypes = {};\r\n const count = feaIndexes.getLength();\r\n if (isFnTypeSymbol(symbol['polygonFill'])) {\r\n let colorFn = piecewiseConstant(symbol.polygonFill);\r\n const aColor = new Uint8Array(count * 4);\r\n aColor.fill(255);\r\n for (let i = 0; i < count; i++) {\r\n const feature = features[feaIndexes[i]];\r\n const properties = feature.properties || {};\r\n properties['$layer'] = feature.layer;\r\n properties['$type'] = feature.type;\r\n let color = colorFn(zoom, properties);\r\n if (isFunctionDefinition(color)) {\r\n dynamicAttributes['aColor'] = 1;\r\n colorFn = piecewiseConstant(color);\r\n color = colorFn(zoom, properties);\r\n }\r\n delete properties['$layer'];\r\n delete properties['$type'];\r\n StyleUtil.normalizeColor(ARR0, color);\r\n aColor[i * 4] = ARR0[0];\r\n aColor[i * 4 + 1] = ARR0[1];\r\n aColor[i * 4 + 2] = ARR0[2];\r\n aColor[i * 4 + 3] = ARR0[3];\r\n }\r\n fnTypes.aColor = aColor;\r\n }\r\n if (isFnTypeSymbol(symbol['polygonOpacity'])) {\r\n let opacityFn = interpolated(symbol.polygonOpacity);\r\n const aOpacity = new Uint8Array(count);\r\n aOpacity.fill(255);\r\n for (let i = 0; i < count; i++) {\r\n const feature = features[feaIndexes[i]];\r\n const properties = feature.properties || {};\r\n properties['$layer'] = feature.layer;\r\n properties['$type'] = feature.type;\r\n let opacity = opacityFn(zoom, properties);\r\n if (isFunctionDefinition(opacity)) {\r\n dynamicAttributes['aOpacity'] = 1;\r\n opacityFn = piecewiseConstant(opacity);\r\n opacity = opacityFn(zoom, properties);\r\n }\r\n delete properties['$layer'];\r\n delete properties['$type'];\r\n aOpacity[i] = opacity * 255;\r\n }\r\n fnTypes.aOpacity = aOpacity;\r\n }\r\n fnTypes.dynamicAttributes = dynamicAttributes;\r\n return fnTypes;\r\n}\r\n\r\nfunction buildVertexColorTypes(verticeTypes, feaIndexes, features, symbol, zoom) {\r\n const vertexColors = [[], []];\r\n const isTopFn = isFnTypeSymbol(symbol['topPolygonFill']);\r\n const isBottomFn = isFnTypeSymbol(symbol['bottomPolygonFill']);\r\n const colorNormalize = [255, 255, 255, 255];\r\n const count = feaIndexes.getLength();\r\n if (isTopFn || isBottomFn) {\r\n let topFillFn = isTopFn && piecewiseConstant(symbol.topPolygonFill);\r\n let bottomFillFn = isBottomFn && piecewiseConstant(symbol.bottomPolygonFill);\r\n let currentTopFeatureId = null;\r\n let currentBottomFeatureId = null;\r\n let currentTopValue = null;\r\n let currentBottomValue = null;\r\n for (let i = 0; i < count; i++) {\r\n if (verticeTypes[i] === 1 && !isTopFn || verticeTypes[i] === 0 && !isBottomFn) {\r\n continue;\r\n }\r\n const isTop = verticeTypes[i] === 1;\r\n if (isTop && feaIndexes[i] === currentTopFeatureId) {\r\n verticeTypes[i] = currentTopValue;\r\n continue;\r\n }\r\n if (!isTop && feaIndexes[i] === currentBottomFeatureId) {\r\n verticeTypes[i] = currentBottomValue;\r\n continue;\r\n }\r\n const feature = features[feaIndexes[i]];\r\n const properties = feature.properties || {};\r\n properties['$layer'] = feature.layer;\r\n properties['$type'] = feature.type;\r\n let fillFn = isTop ? topFillFn : bottomFillFn\r\n let color = fillFn(zoom, properties);\r\n if (isFunctionDefinition(color)) {\r\n fillFn = piecewiseConstant(color);\r\n color = fillFn(zoom, properties);\r\n }\r\n delete properties['$layer'];\r\n delete properties['$type'];\r\n StyleUtil.normalizeColor(ARR0, color);\r\n vec4.divide(ARR0, ARR0, colorNormalize)\r\n let index = findColor(vertexColors, ARR0);\r\n if (index < 0) {\r\n index = vertexColors.length;\r\n vertexColors.push(vec4.copy([], ARR0));\r\n }\r\n verticeTypes[i] = index;\r\n if (isTop) {\r\n currentTopFeatureId = feaIndexes[i];\r\n currentTopValue = index;\r\n } else {\r\n currentBottomFeatureId = feaIndexes[i];\r\n currentBottomValue = index;\r\n }\r\n\r\n }\r\n }\r\n return vertexColors.slice(2);\r\n}\r\n\r\nfunction findColor(colors, color) {\r\n for (let i = 0; i < colors.length; i++) {\r\n if (vec4.exactEquals(color, colors[i])) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n","\nexport default class TinyQueue {\n constructor(data = [], compare = defaultCompare) {\n this.data = data;\n this.length = this.data.length;\n this.compare = compare;\n\n if (this.length > 0) {\n for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n }\n }\n\n push(item) {\n this.data.push(item);\n this.length++;\n this._up(this.length - 1);\n }\n\n pop() {\n if (this.length === 0) return undefined;\n\n const top = this.data[0];\n const bottom = this.data.pop();\n this.length--;\n\n if (this.length > 0) {\n this.data[0] = bottom;\n this._down(0);\n }\n\n return top;\n }\n\n peek() {\n return this.data[0];\n }\n\n _up(pos) {\n const {data, compare} = this;\n const item = data[pos];\n\n while (pos > 0) {\n const parent = (pos - 1) >> 1;\n const current = data[parent];\n if (compare(item, current) >= 0) break;\n data[pos] = current;\n pos = parent;\n }\n\n data[pos] = item;\n }\n\n _down(pos) {\n const {data, compare} = this;\n const halfLength = this.length >> 1;\n const item = data[pos];\n\n while (pos < halfLength) {\n let left = (pos << 1) + 1;\n let best = data[left];\n const right = left + 1;\n\n if (right < this.length && compare(data[right], best) < 0) {\n left = right;\n best = data[right];\n }\n if (compare(best, item) >= 0) break;\n\n data[pos] = best;\n pos = left;\n }\n\n data[pos] = item;\n }\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","var pointInPolygonFlat = require('./flat.js')\nvar pointInPolygonNested = require('./nested.js')\n\nmodule.exports = function pointInPolygon (point, vs, start, end) {\n if (vs.length > 0 && Array.isArray(vs[0])) {\n return pointInPolygonNested(point, vs, start, end);\n } else {\n return pointInPolygonFlat(point, vs, start, end);\n }\n}\nmodule.exports.nested = pointInPolygonNested\nmodule.exports.flat = pointInPolygonFlat\n","module.exports = function pointInPolygonFlat (point, vs, start, end) {\n var x = point[0], y = point[1];\n var inside = false;\n if (start === undefined) start = 0;\n if (end === undefined) end = vs.length;\n var len = (end-start)/2;\n for (var i = 0, j = len - 1; i < len; j = i++) {\n var xi = vs[start+i*2+0], yi = vs[start+i*2+1];\n var xj = vs[start+j*2+0], yj = vs[start+j*2+1];\n var intersect = ((yi > y) !== (yj > y))\n && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n if (intersect) inside = !inside;\n }\n return inside;\n};\n","// ray-casting algorithm based on\n// https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\n\nmodule.exports = function pointInPolygonNested (point, vs, start, end) {\n var x = point[0], y = point[1];\n var inside = false;\n if (start === undefined) start = 0;\n if (end === undefined) end = vs.length;\n var len = end - start;\n for (var i = 0, j = len - 1; i < len; j = i++) {\n var xi = vs[i+start][0], yi = vs[i+start][1];\n var xj = vs[j+start][0], yj = vs[j+start][1];\n var intersect = ((yi > y) !== (yj > y))\n && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n if (intersect) inside = !inside;\n }\n return inside;\n};\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from oritinal code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n if (detleft === 0 || detright === 0 || (detleft > 0) !== (detright > 0)) return det;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","// esm version of concaveman\r\n// https://github.com/archilogic-com/concaveman/\r\n\r\n'use strict';\r\n\r\nimport RBush from 'rbush';\r\nimport Queue from 'tinyqueue';\r\nimport { nested as pointInPolygon } from 'point-in-polygon';\r\nimport { orient2d as orient } from 'robust-predicates';\r\n\r\nexport default concaveman\r\n\r\nfunction concaveman(points, concavity, lengthThreshold) {\r\n // a relative measure of concavity; higher value means simpler hull\r\n concavity = Math.max(0, concavity === undefined ? 2 : concavity);\r\n\r\n // when a segment goes below this length threshold, it won't be drilled down further\r\n lengthThreshold = lengthThreshold || 0;\r\n\r\n // start with a convex hull of the points\r\n var hull = fastConvexHull(points);\r\n\r\n // index the points with an R-tree\r\n var tree = new RBush(16);\r\n tree.toBBox = function (a) {\r\n return {\r\n minX: a[0],\r\n minY: a[1],\r\n maxX: a[0],\r\n maxY: a[1]\r\n };\r\n };\r\n tree.compareMinX = function (a, b) { return a[0] - b[0]; };\r\n tree.compareMinY = function (a, b) { return a[1] - b[1]; };\r\n\r\n tree.load(points);\r\n\r\n // turn the convex hull into a linked list and populate the initial edge queue with the nodes\r\n var queue = [];\r\n for (var i = 0, last; i < hull.length; i++) {\r\n var p = hull[i];\r\n tree.remove(p);\r\n last = insertNode(p, last);\r\n queue.push(last);\r\n }\r\n\r\n // index the segments with an R-tree (for intersection checks)\r\n var segTree = new RBush(16);\r\n for (i = 0; i < queue.length; i++) segTree.insert(updateBBox(queue[i]));\r\n\r\n var sqConcavity = concavity * concavity;\r\n var sqLenThreshold = lengthThreshold * lengthThreshold;\r\n\r\n // process edges one by one\r\n while (queue.length) {\r\n var node = queue.shift();\r\n var a = node.p;\r\n var b = node.next.p;\r\n\r\n // skip the edge if it's already short enough\r\n var sqLen = getSqDist(a, b);\r\n if (sqLen < sqLenThreshold) continue;\r\n\r\n var maxSqLen = sqLen / sqConcavity;\r\n\r\n // find the best connection point for the current edge to flex inward to\r\n p = findCandidate(tree, node.prev.p, a, b, node.next.next.p, maxSqLen, segTree);\r\n\r\n // if we found a connection and it satisfies our concavity measure\r\n if (p && Math.min(getSqDist(p, a), getSqDist(p, b)) <= maxSqLen) {\r\n // connect the edge endpoints through this point and add 2 new edges to the queue\r\n queue.push(node);\r\n queue.push(insertNode(p, node));\r\n\r\n // update point and segment indexes\r\n tree.remove(p);\r\n segTree.remove(node);\r\n segTree.insert(updateBBox(node));\r\n segTree.insert(updateBBox(node.next));\r\n }\r\n }\r\n\r\n // convert the resulting hull linked list to an array of points\r\n node = last;\r\n var concave = [];\r\n do {\r\n concave.push(node.p);\r\n node = node.next;\r\n } while (node !== last);\r\n\r\n concave.push(node.p);\r\n\r\n return concave;\r\n}\r\n\r\nfunction findCandidate(tree, a, b, c, d, maxDist, segTree) {\r\n var queue = new Queue([], compareDist);\r\n var node = tree.data;\r\n\r\n // search through the point R-tree with a depth-first search using a priority queue\r\n // in the order of distance to the edge (b, c)\r\n while (node) {\r\n for (var i = 0; i < node.children.length; i++) {\r\n var child = node.children[i];\r\n\r\n var dist = node.leaf ? sqSegDist(child, b, c) : sqSegBoxDist(b, c, child);\r\n if (dist > maxDist) continue; // skip the node if it's farther than we ever need\r\n\r\n queue.push({\r\n node: child,\r\n dist: dist\r\n });\r\n }\r\n\r\n while (queue.length && !queue.peek().node.children) {\r\n var item = queue.pop();\r\n var p = item.node;\r\n\r\n // skip all points that are as close to adjacent edges (a,b) and (c,d),\r\n // and points that would introduce self-intersections when connected\r\n var d0 = sqSegDist(p, a, b);\r\n var d1 = sqSegDist(p, c, d);\r\n if (item.dist < d0 && item.dist < d1 &&\r\n noIntersections(b, p, segTree) &&\r\n noIntersections(c, p, segTree)) return p;\r\n }\r\n\r\n node = queue.pop();\r\n if (node) node = node.node;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction compareDist(a, b) {\r\n return a.dist - b.dist;\r\n}\r\n\r\n// square distance from a segment bounding box to the given one\r\nfunction sqSegBoxDist(a, b, bbox) {\r\n if (inside(a, bbox) || inside(b, bbox)) return 0;\r\n var d1 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.minX, bbox.minY, bbox.maxX, bbox.minY);\r\n if (d1 === 0) return 0;\r\n var d2 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.minX, bbox.minY, bbox.minX, bbox.maxY);\r\n if (d2 === 0) return 0;\r\n var d3 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.maxX, bbox.minY, bbox.maxX, bbox.maxY);\r\n if (d3 === 0) return 0;\r\n var d4 = sqSegSegDist(a[0], a[1], b[0], b[1], bbox.minX, bbox.maxY, bbox.maxX, bbox.maxY);\r\n if (d4 === 0) return 0;\r\n return Math.min(d1, d2, d3, d4);\r\n}\r\n\r\nfunction inside(a, bbox) {\r\n return a[0] >= bbox.minX &&\r\n a[0] <= bbox.maxX &&\r\n a[1] >= bbox.minY &&\r\n a[1] <= bbox.maxY;\r\n}\r\n\r\n// check if the edge (a,b) doesn't intersect any other edges\r\nfunction noIntersections(a, b, segTree) {\r\n var minX = Math.min(a[0], b[0]);\r\n var minY = Math.min(a[1], b[1]);\r\n var maxX = Math.max(a[0], b[0]);\r\n var maxY = Math.max(a[1], b[1]);\r\n\r\n var edges = segTree.search({ minX: minX, minY: minY, maxX: maxX, maxY: maxY });\r\n for (var i = 0; i < edges.length; i++) {\r\n if (intersects(edges[i].p, edges[i].next.p, a, b)) return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction cross(p1, p2, p3) {\r\n return orient(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\r\n}\r\n\r\n// check if the edges (p1,q1) and (p2,q2) intersect\r\nfunction intersects(p1, q1, p2, q2) {\r\n return p1 !== q2 && q1 !== p2 &&\r\n cross(p1, q1, p2) > 0 !== cross(p1, q1, q2) > 0 &&\r\n cross(p2, q2, p1) > 0 !== cross(p2, q2, q1) > 0;\r\n}\r\n\r\n// update the bounding box of a node's edge\r\nfunction updateBBox(node) {\r\n var p1 = node.p;\r\n var p2 = node.next.p;\r\n node.minX = Math.min(p1[0], p2[0]);\r\n node.minY = Math.min(p1[1], p2[1]);\r\n node.maxX = Math.max(p1[0], p2[0]);\r\n node.maxY = Math.max(p1[1], p2[1]);\r\n return node;\r\n}\r\n\r\n// speed up convex hull by filtering out points inside quadrilateral formed by 4 extreme points\r\nfunction fastConvexHull(points) {\r\n var left = points[0];\r\n var top = points[0];\r\n var right = points[0];\r\n var bottom = points[0];\r\n\r\n // find the leftmost, rightmost, topmost and bottommost points\r\n for (var i = 0; i < points.length; i++) {\r\n var p = points[i];\r\n if (p[0] < left[0]) left = p;\r\n if (p[0] > right[0]) right = p;\r\n if (p[1] < top[1]) top = p;\r\n if (p[1] > bottom[1]) bottom = p;\r\n }\r\n\r\n // filter out points that are inside the resulting quadrilateral\r\n var cull = [left, top, right, bottom];\r\n var filtered = cull.slice();\r\n for (i = 0; i < points.length; i++) {\r\n if (!pointInPolygon(points[i], cull)) filtered.push(points[i]);\r\n }\r\n\r\n // get convex hull around the filtered points\r\n return convexHull(filtered);\r\n}\r\n\r\n// create a new node in a doubly linked list\r\nfunction insertNode(p, prev) {\r\n var node = {\r\n p: p,\r\n prev: null,\r\n next: null,\r\n minX: 0,\r\n minY: 0,\r\n maxX: 0,\r\n maxY: 0\r\n };\r\n\r\n if (!prev) {\r\n node.prev = node;\r\n node.next = node;\r\n\r\n } else {\r\n node.next = prev.next;\r\n node.prev = prev;\r\n prev.next.prev = node;\r\n prev.next = node;\r\n }\r\n return node;\r\n}\r\n\r\n// square distance between 2 points\r\nfunction getSqDist(p1, p2) {\r\n\r\n var dx = p1[0] - p2[0],\r\n dy = p1[1] - p2[1];\r\n\r\n return dx * dx + dy * dy;\r\n}\r\n\r\n// square distance from a point to a segment\r\nfunction sqSegDist(p, p1, p2) {\r\n\r\n var x = p1[0],\r\n y = p1[1],\r\n dx = p2[0] - x,\r\n dy = p2[1] - y;\r\n\r\n if (dx !== 0 || dy !== 0) {\r\n\r\n var t = ((p[0] - x) * dx + (p[1] - y) * dy) / (dx * dx + dy * dy);\r\n\r\n if (t > 1) {\r\n x = p2[0];\r\n y = p2[1];\r\n\r\n } else if (t > 0) {\r\n x += dx * t;\r\n y += dy * t;\r\n }\r\n }\r\n\r\n dx = p[0] - x;\r\n dy = p[1] - y;\r\n\r\n return dx * dx + dy * dy;\r\n}\r\n\r\n// segment to segment distance, ported from http://geomalgorithms.com/a07-_distance.html by Dan Sunday\r\nfunction sqSegSegDist(x0, y0, x1, y1, x2, y2, x3, y3) {\r\n var ux = x1 - x0;\r\n var uy = y1 - y0;\r\n var vx = x3 - x2;\r\n var vy = y3 - y2;\r\n var wx = x0 - x2;\r\n var wy = y0 - y2;\r\n var a = ux * ux + uy * uy;\r\n var b = ux * vx + uy * vy;\r\n var c = vx * vx + vy * vy;\r\n var d = ux * wx + uy * wy;\r\n var e = vx * wx + vy * wy;\r\n var D = a * c - b * b;\r\n\r\n var sc, sN, tc, tN;\r\n var sD = D;\r\n var tD = D;\r\n\r\n if (D === 0) {\r\n sN = 0;\r\n sD = 1;\r\n tN = e;\r\n tD = c;\r\n } else {\r\n sN = b * e - c * d;\r\n tN = a * e - b * d;\r\n if (sN < 0) {\r\n sN = 0;\r\n tN = e;\r\n tD = c;\r\n } else if (sN > sD) {\r\n sN = sD;\r\n tN = e + b;\r\n tD = c;\r\n }\r\n }\r\n\r\n if (tN < 0.0) {\r\n tN = 0.0;\r\n if (-d < 0.0) sN = 0.0;\r\n else if (-d > a) sN = sD;\r\n else {\r\n sN = -d;\r\n sD = a;\r\n }\r\n } else if (tN > tD) {\r\n tN = tD;\r\n if ((-d + b) < 0.0) sN = 0;\r\n else if (-d + b > a) sN = sD;\r\n else {\r\n sN = -d + b;\r\n sD = a;\r\n }\r\n }\r\n\r\n sc = sN === 0 ? 0 : sN / sD;\r\n tc = tN === 0 ? 0 : tN / tD;\r\n\r\n var cx = (1 - sc) * x0 + sc * x1;\r\n var cy = (1 - sc) * y0 + sc * y1;\r\n var cx2 = (1 - tc) * x2 + tc * x3;\r\n var cy2 = (1 - tc) * y2 + tc * y3;\r\n var dx = cx2 - cx;\r\n var dy = cy2 - cy;\r\n\r\n return dx * dx + dy * dy;\r\n}\r\n\r\nfunction compareByX(a, b) {\r\n return a[0] === b[0] ? a[1] - b[1] : a[0] - b[0];\r\n}\r\n\r\nfunction convexHull(points) {\r\n points.sort(compareByX);\r\n\r\n var lower = [];\r\n for (var i = 0; i < points.length; i++) {\r\n while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], points[i]) <= 0) {\r\n lower.pop();\r\n }\r\n lower.push(points[i]);\r\n }\r\n\r\n var upper = [];\r\n for (var ii = points.length - 1; ii >= 0; ii--) {\r\n while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], points[ii]) <= 0) {\r\n upper.pop();\r\n }\r\n upper.push(points[ii]);\r\n }\r\n\r\n upper.pop();\r\n lower.pop();\r\n return lower.concat(upper);\r\n}\r\n","import concaveman from './concaveman.js';\r\nimport { isNumber } from '../../common/Util.js';\r\nimport { project } from '../builder/projection.js';\r\nimport { PackUtil } from '@maptalks/vector-packer';\r\n\r\n// Computing oriented minimum bounding boxes\r\n// credits of https://github.com/geidav/ombb-rotating-calipers\r\n\r\n//------------Vector.js------------------\r\nclass Vector {\r\n constructor(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n\r\n clone() {\r\n return new Vector(this.x, this.y);\r\n }\r\n\r\n normalize() {\r\n const len = this.length();\r\n this.x /= len;\r\n this.y /= len;\r\n }\r\n\r\n negate() {\r\n this.x = -this.x;\r\n this.y = -this.y;\r\n }\r\n\r\n length() {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n }\r\n\r\n diff(vec) {\r\n return new Vector(this.x - vec.x, this.y - vec.y);\r\n }\r\n\r\n distance(vec) {\r\n const x = this.x - vec.x;\r\n const y = this.y - vec.y;\r\n return Math.sqrt(x * x + y * y);\r\n }\r\n\r\n dot(vec) {\r\n return this.x * vec.x + this.y * vec.y;\r\n }\r\n\r\n equals(vec) {\r\n return this.x === vec.x && this.y === vec.y;\r\n }\r\n\r\n orthogonal() {\r\n return new Vector(this.y, -this.x);\r\n }\r\n\r\n}\r\n\r\n//-------------convexhull.js---------------------\r\n// const ON = 0;\r\n// const LEFT = 1;\r\n// const RIGHT = 2;\r\n// const ALMOST_ZERO = 0.00001;\r\n\r\n// function GetSideOfLine(lineStart, lineEnd, point) {\r\n// const d = (lineEnd.x - lineStart.x) * (point.y - lineStart.y) - (lineEnd.y - lineStart.y) * (point.x - lineStart.x);\r\n// return (d > ALMOST_ZERO ? LEFT : (d < -ALMOST_ZERO ? RIGHT : ON));\r\n// }\r\n\r\n// returns convex hull in CCW order\r\n// (required by Rotating Calipers implementation)\r\n// function CalcConvexHull(points) {\r\n// // bad input?\r\n// if (points.length < 3)\r\n// return points;\r\n\r\n// // find first hull point\r\n// let hullPt = points[0];\r\n// const convexHull = [];\r\n\r\n// for (let i = 1; i < points.length; i++) {\r\n// // perform lexicographical compare\r\n// if (points[i].x < hullPt.x)\r\n// hullPt = points[i];\r\n// else if (Math.abs(points[i].x - hullPt.x) < ALMOST_ZERO) // equal\r\n// if (points[i].y < hullPt.y)\r\n// hullPt = points[i];\r\n// }\r\n\r\n// let endPt = points[0];\r\n// // find remaining hull points\r\n// do {\r\n// convexHull.unshift(hullPt.clone());\r\n\r\n// for (let j = 1; j < points.length; j++) {\r\n// const side = GetSideOfLine(hullPt, endPt, points[j]);\r\n\r\n// // in case point lies on line take the one further away.\r\n// // this fixes the collinearity problem.\r\n// if (endPt.equals(hullPt) || (side === LEFT || (side === ON && hullPt.distance(points[j]) > hullPt.distance(endPt))))\r\n// endPt = points[j];\r\n// }\r\n\r\n// hullPt = endPt;\r\n// }\r\n// while (!endPt.equals(convexHull[convexHull.length - 1]));\r\n\r\n// return convexHull;\r\n// }\r\n\r\n//-------------ombb.js---------------------\r\n\r\nfunction IntersectLines(start0, dir0, start1, dir1) {\r\n const dd = dir0.x * dir1.y - dir0.y * dir1.x;\r\n // dd=0 => lines are parallel. we don't care as our lines are never parallel.\r\n const dx = start1.x - start0.x;\r\n const dy = start1.y - start0.y;\r\n const t = (dx * dir1.y - dy * dir1.x) / dd;\r\n return new Vector(start0.x + t * dir0.x, start0.y + t * dir0.y);\r\n}\r\n\r\n// computes the minimum area enclosing rectangle\r\n// (aka oriented minimum bounding box)\r\nfunction CalcOmbb(convexHull) {\r\n // initialize attributes\r\n let BestObb;\r\n let BestObbArea = Number.MAX_VALUE;\r\n\r\n const UpdateOmbb = function(leftStart, leftDir, rightStart, rightDir, topStart, topDir, bottomStart, bottomDir)\r\n {\r\n var obbUpperLeft = IntersectLines(leftStart, leftDir, topStart, topDir);\r\n var obbUpperRight = IntersectLines(rightStart, rightDir, topStart, topDir);\r\n var obbBottomLeft = IntersectLines(bottomStart, bottomDir, leftStart, leftDir);\r\n var obbBottomRight = IntersectLines(bottomStart, bottomDir, rightStart, rightDir);\r\n var distLeftRight = obbUpperLeft.distance(obbUpperRight);\r\n var distTopBottom = obbUpperLeft.distance(obbBottomLeft);\r\n var obbArea = distLeftRight*distTopBottom;\r\n\r\n if (obbArea !== 0 && obbArea < BestObbArea)\r\n {\r\n BestObb = [obbUpperLeft, obbBottomLeft, obbBottomRight, obbUpperRight];\r\n BestObbArea = obbArea;\r\n }\r\n }\r\n\r\n\r\n // compute directions of convex hull edges\r\n var edgeDirs = [];\r\n\r\n for (let i=0; i<convexHull.length; i++)\r\n {\r\n edgeDirs.push(convexHull[(i+1)%convexHull.length].diff(convexHull[i]));\r\n edgeDirs[i].normalize();\r\n }\r\n\r\n // compute extreme points\r\n var minPt = new Vector(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\r\n var maxPt = new Vector(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY);\r\n var leftIdx, rightIdx, topIdx, bottomIdx;\r\n\r\n for (let i = 0; i<convexHull.length; i++)\r\n {\r\n var pt = convexHull[i];\r\n\r\n if (pt.x < minPt.x)\r\n {\r\n minPt.x = pt.x;\r\n leftIdx = i;\r\n }\r\n\r\n if (pt.x > maxPt.x)\r\n {\r\n maxPt.x = pt.x;\r\n rightIdx = i;\r\n }\r\n\r\n if (pt.y < minPt.y)\r\n {\r\n minPt.y = pt.y;\r\n bottomIdx = i;\r\n }\r\n\r\n if (pt.y > maxPt.y)\r\n {\r\n maxPt.y = pt.y;\r\n topIdx = i;\r\n }\r\n }\r\n\r\n // initial caliper lines + directions\r\n //\r\n // top\r\n // <-------\r\n // | A\r\n // | | right\r\n // left | |\r\n // V |\r\n // ------->\r\n // bottom\r\n var leftDir = new Vector(0.0, -1);\r\n var rightDir = new Vector(0, 1);\r\n var topDir = new Vector(-1, 0);\r\n var bottomDir = new Vector(1, 0);\r\n\r\n // execute rotating caliper algorithm\r\n for (let i = 0; i<convexHull.length; i++)\r\n {\r\n // of course the acos() can be optimized.\r\n // but it's a JS prototype anyways, so who cares.\r\n var phis = // 0=left, 1=right, 2=top, 3=bottom\r\n [\r\n Math.acos(leftDir.dot(edgeDirs[leftIdx])),\r\n Math.acos(rightDir.dot(edgeDirs[rightIdx])),\r\n Math.acos(topDir.dot(edgeDirs[topIdx])),\r\n Math.acos(bottomDir.dot(edgeDirs[bottomIdx])),\r\n ];\r\n\r\n var lineWithSmallestAngle = phis.indexOf(Math.min.apply(Math, phis));\r\n switch (lineWithSmallestAngle)\r\n {\r\n case 0: // left\r\n leftDir = edgeDirs[leftIdx].clone();\r\n rightDir = leftDir.clone();\r\n rightDir.negate();\r\n topDir = leftDir.orthogonal();\r\n bottomDir = topDir.clone();\r\n bottomDir.negate();\r\n leftIdx = (leftIdx+1)%convexHull.length;\r\n break;\r\n case 1: // right\r\n rightDir = edgeDirs[rightIdx].clone();\r\n leftDir = rightDir.clone();\r\n leftDir.negate();\r\n topDir = leftDir.orthogonal();\r\n bottomDir = topDir.clone();\r\n bottomDir.negate();\r\n rightIdx = (rightIdx+1)%convexHull.length;\r\n break;\r\n case 2: // top\r\n topDir = edgeDirs[topIdx].clone();\r\n bottomDir = topDir.clone();\r\n bottomDir.negate();\r\n leftDir = bottomDir.orthogonal();\r\n rightDir = leftDir.clone();\r\n rightDir.negate();\r\n topIdx = (topIdx+1)%convexHull.length;\r\n break;\r\n case 3: // bottom\r\n bottomDir = edgeDirs[bottomIdx].clone();\r\n topDir = bottomDir.clone();\r\n topDir.negate();\r\n leftDir = bottomDir.orthogonal();\r\n rightDir = leftDir.clone();\r\n rightDir.negate();\r\n bottomIdx = (bottomIdx+1)%convexHull.length;\r\n break;\r\n }\r\n\r\n UpdateOmbb(convexHull[leftIdx], leftDir, convexHull[rightIdx], rightDir, convexHull[topIdx], topDir, convexHull[bottomIdx], bottomDir);\r\n }\r\n\r\n return BestObb;\r\n}\r\n\r\nconst projectionCode = 'EPSG:3857';\r\nconst HULL = [];\r\nconst VERTICES = [];\r\n\r\nexport default function (vertices) {\r\n\r\n if (isNumber(vertices[0] && vertices[0].x)) {\r\n // 对 { x, y } 格式的坐标支持\r\n const vertexes = [];\r\n let t = 0;\r\n for (let i = 0; i < vertices.length; i++) {\r\n if (!VERTICES[t]) {\r\n VERTICES[t] = [vertices[i].x, vertices[i].y];\r\n } else {\r\n VERTICES[t][0] = vertices[i].x;\r\n VERTICES[t][1] = vertices[i].y;\r\n }\r\n vertexes.push(VERTICES[t]);\r\n t++;\r\n }\r\n vertices = vertexes;\r\n }\r\n try {\r\n const hull = concaveman(vertices, Infinity);\r\n let min = [Infinity, Infinity], max = [-Infinity, -Infinity];\r\n for (let i = 0; i < hull.length; i++) {\r\n if (hull[i][0] < min[0]) {\r\n min[0] = hull[i][0];\r\n }\r\n if (hull[i][0] > max[0]) {\r\n max[0] = hull[i][0];\r\n }\r\n\r\n if (hull[i][1] < min[1]) {\r\n min[1] = hull[i][1];\r\n }\r\n if (hull[i][1] > max[1]) {\r\n max[1] = hull[i][1];\r\n }\r\n }\r\n\r\n const projectedCoord = [];\r\n\r\n let convexHull = [];\r\n let t = 0;\r\n for (let i = 0; i < hull.length; i++) {\r\n if (i === hull.length - 1 && hull[i][0] === hull[0][0] && hull[i][1] === hull[0][1]) {\r\n continue\r\n }\r\n // 用原经纬度坐标无法计算出正确的ombb,但投影坐标可以,原因未知\r\n project(projectedCoord, hull[i], projectionCode);\r\n if (!HULL[t]) {\r\n HULL[t] = new Vector(projectedCoord[0], projectedCoord[1]);\r\n } else {\r\n HULL[t].x = projectedCoord[0];\r\n HULL[t].y = projectedCoord[1];\r\n }\r\n convexHull.push(HULL[t]);\r\n t++;\r\n }\r\n\r\n if (PackUtil.calculateSignedArea(convexHull) < 0) {\r\n convexHull = convexHull.reverse();\r\n }\r\n const ombb = CalcOmbb(convexHull); // draws OOBB candidates\r\n if (!ombb || ombb.length !== 4) {\r\n return null;\r\n }\r\n const edge0 = ombb[0].distance(ombb[1]);\r\n const edge1 = ombb[1].distance(ombb[2]);\r\n const box = ombb.map(v => [v.x, v.y]);\r\n //宽边开始的序号,0或者1\r\n box.push(+(edge1 > edge0));\r\n return box;\r\n } catch (e) {\r\n return null;\r\n }\r\n\r\n\r\n}\r\n\r\nconst projectedCoord = [];\r\nexport function projectOMBB(ombb, projectionCode) {\r\n const isMultiOmbb = Array.isArray(ombb && ombb[0] && ombb[0][0]);\r\n for (let i = 0; i < ombb.length; i++) {\r\n if (isMultiOmbb) {\r\n ombb[i] = projectOMBB(ombb[i]);\r\n } else {\r\n project(projectedCoord, ombb[i], projectionCode);\r\n ombb[i][0] = projectedCoord[0];\r\n ombb[i][1] = projectedCoord[1];\r\n }\r\n }\r\n return ombb;\r\n}\r\n",null,null,"import * as maptalks from 'maptalks';\r\nimport * as maptalksgl from '@maptalks/gl';\r\n\r\n//refereing maptalksgl to include it in rollup bundle\r\nconst mat4 = maptalksgl.mat4;\r\nmat4.create();\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/vt', transcoderInjected);\r\n } else {\r\n maptalks.registerWorkerAdapter('@maptalks/vt', function () {\r\n const transcoderInjected = maptalksgl.transcoders.inject(chunk);\r\n return transcoderInjected;\r\n });\r\n }\r\n} else {\r\n maptalks.registerWorkerAdapter('@maptalks/vt', chunk);\r\n}\r\nexport * from '../src/layer/';\r\n"],"names":["id","uid","supportAssign","Object","assign","extend","dest","source","i","length","src","k","isString","obj","isNil","constructor","String","isNumber","val","isNaN","isFunction","Function","isObject","Array","isArray","pushIn","arguments","ii","ll","push","isFnTypeSymbol","v","isFunctionDefinition","property","hasOwn","prop","prototype","hasOwnProperty","call","getCentiMeterScale","res","map","p","altitudeToPoint","heightFactor","options","distanceToPointAtRes","x","visitStyle","styles","compressedStyle","pluginDefs","style","target","renderPlugin","copy","sceneConfig","keys","hit","deepEqual","USE_FETCH","fetch","AbortController","Ajax","jsonp","url","callback","name","match","script","document","createElement","type","window","data","getElementsByTagName","removeChild","appendChild","this","get","cb","t","method","toUpperCase","isPost","controller","requestConfig","signal","referrerPolicy","request","Request","headers","set","then","response","parsed","_parseResponse","message","responseType","cacheControl","expires","contentType","catch","err","code","DOMException","ABORT_ERR","console","error","client","_getClient","open","setRequestHeader","withCredentials","credentials","send","body","isJSON","status","statusText","arrayBuffer","json","text","_wrapCallback","readyState","byteLength","getResponseHeader","responseText","XMLHttpRequest","e","ActiveXObject","onreadystatechange","getArrayBuffer","resp","JSON","parse","dedicatedLayers","WorkerConnection","maptalks","worker","Actor","workerKey","layer","super","mapId","getMap","_layer","_mapId","_workerLayerId","getJSONType","_isDedicated","indexOf","_dedicatedVTWorkers","_iconRequestor","IconRequestor","iconErrorUrl","maxSize","urlModifier","modifier","getURLModifier","useCharBackBuffer","getRenderer","isEnableWorkAround","_glyphRequestor","GlyphRequestor","fn","callInNextFrame","initialize","addLayer","getWorkerOptions","layerId","command","params","undefined","getDedicatedWorker","broadcast","abortTile","removeLayer","updateStyle","updateOptions","loadTile","context","tileInfo","r","toJSON","y","s","workers","remove","fetchIconGlyphs","icons","glyphs","getGlyphs","glyphData","dataBuffers","buffers","getIcons","setData","geojson","_getTileKey","EMPTY_VECTOR_TILE","ICON_PAINTER_SCENECONFIG","collision","fading","fadingDuration","fadeInDelay","fadeOutDelay","uniquePlacement","depthFunc","DebugPainter","regl","color","_regl","_map","_color","draw","debugInfo","transform","tileSize","extent","fbo","_command","_init","_data","buffer","getDebugData","scale","_textData","getTextData","_extent","image","_debugInfoCanvas","dpr","getDevicePixelRatio","width","height","ctx","getContext","font","_texture","texture","clearRect","fillStyle","c","join","fillText","texData","_texCoordData","debugLine","primitive","framebuffer","count","destroy","Uint8Array","vert","frag","attributes","aPosition","aTexCoord","uniforms","uColor","uOpacity","uDebugLine","uImage","depth","enable","mask","blend","func","dst","equation","stencil","viewport","canvas","Uint16Array","vertices","V","TileStencilRenderer","_geometry","reshader","Geometry","positionSize","generateBuffers","_scene","Scene","_meshes","_counter","_canvas","start","clear","add","ref","EXTENT","mesh","_getMesh","setUniform","vec3","matrix","localTransform","mat4","fromScaling","mul","setLocalTransform","addMesh","render","_renderer","_shader","projViewMatrix","index","Mesh","extraCommandProps","cmp","props","op","fail","zfail","zpass","colorMask","MeshShader","projViewModelMatrix","multiply","Renderer","dispose","KEY_IDX","INVALID_PROJECTED_ANCHOR","INVALID_ALTITUDE","Float32Array","PROP_OMBB","KEY_IDX_NAME","trim","convertToPainterFeatures","features","feaIndexes","symbol","pluginFeas","hasFeature","feature","getFeature","TileLayer","proxyFea","oldPropsKey","externalPropsKey","proxyGetter","has","EMPTY_PROPS","originalProperties","properties","customProps","Proxy","clamp","n","min","max","Math","wrap","d","copyJSON","stringify","setUniformFromSymbol","key","defaultValue","defineProperty","enumerable","ARR0","toUint8ColorInGlobalVar","createColorSetter","cache","size","_colorSetter","bind","g","b","a","Color","unitArray","fillArray","arr","value","end","fill","isIconText","symbolDef","markerFile","markerType","textName","getUniqueIds","ids","isReverse","current","result","COORD1","Coordinate","meterToPoint","meter","patternOrigin","isYAxis","point","EMPTY_ARRAY","CLEAR_COLOR","TILE_POINT","Point","TERRAIN_CLEAR","terrainSkinFilter","plugin","isTerrainSkin","terrainVectorFilter","isTerrainVector","VectorTileLayerRenderer","renderer","TileLayerCanvasRenderer","supportRenderMode","ready","_styleCounter","_requestingMVT","_plugins","_featurePlugins","getTileLevelValue","currentTileZoom","isBackTile","z","maxChildDepth","getWorkerConnection","_workerConn","getStyleCounter","setStyle","_groundPainter","update","_preservePrevTiles","_getComputedStyle","styleCounter","_workersyncing","Error","_needRetire","_initPlugins","setToRedraw","fire","_prevTilesInView","tile","deleteTile","tilesInView","tileCache","info","getAndRemove","reset","tilesLoading","conf","_clearPlugin","updateSceneConfig","idx","plugins","_getStylePlugins","_getFeaturePlugins","allStyles","_getTargetStyle","config","updateDataConfig","dataConfig","old","updateSymbol","needRefresh","needRefreshStyle","needToRedraw","redraw","_getFramePlugins","needRetireFrames","needToRetireFrames","isAnimating","mapRenderer","timestamp","getFrameTimestamp","_highlightUpdated","_highlightFrametime","needToRefreshTerrainTileOnZooming","_isInGroupGLLayer","gl","createContext","inGroup","_createREGLContext","glOptions","pickingFBO","_debugPainter","_prepareWorker","GroundPainter","consumeTile","version","VERSION","alpha","antialias","preserveDrawingBuffer","_createGLContext","createREGL","extensions","optionalExtensions","onWorkerReady","clearCanvas","isDrawable","checkResources","_drawTiles","tiles","parentTiles","childTiles","placeholders","_deletePrevPlugins","retired","retiredFeaPlulgin","forEach","parentContext","_currentTimestamp","_setPluginIndex","prepareCanvas","featurePlugins","isDefaultRender","clearCollisionIndex","_frameTime","_zScale","_getCentiMeterScale","getGLRes","_parentContext","_startFrame","_prepareRender","_endFrame","completeRender","renderIndex","_pluginOffsets","polygonOffsetIndex","isVisible","hasMesh","needPolygonOffset","isEnable","_polygonOffsetIndex","drawOnInteracting","event","drawOutline","_outline","_outlineAll","paintOutlineAll","outline","getAnalysisMeshes","getShadowMeshes","meshes","_getAllPlugins","_isVisible","shadowMeshes","isForeground","_vtCurrentTiles","_getTileZoomDiff","zoom","getZoom","minZoom","getMinZoom","maxZoom","getMaxZoom","Util","isTileNearCamera","_vtBgTiles","loadTileQueue","tileQueue","cached","tilePoint","extent2d","xmin","ymax","tileCoord","pointAtResToCoord","centimeterToPoint","verticalCentimeterToPoint","getCentimeterToPoint","glScale","getTileGLScale","fetchOptions","referrer","location","href","zScale","_onReceiveMVTData","getSpatialReference","getResolution","getRenderedFeatures","renderedFeatures","findFeatures","canceled","useDefault","onTileError","_empty","needCompile","layers","pluginData","styledFeatures","isUpdated","_parseTileData","featureData","_compileStyle","tileZoom","schema","getDataSchema","_updateSchema","oldData","log","getId","groupFeatures","values","tileData","copyTileData","j","onTileLoad","styleType","_updatePluginIfNecessary","getData","types","srcProps","targetProps","layerPlugins","_layerPlugins","pluginTypeName","_getDefaultRenderPlugin","filter","slice","isRenderingTerrain","_terrainLayer","defaultSymbol","pluginIndex","startFrame","mode","renderMode","targetFBO","renderTarget","cameraPosition","isFinalRender","isPostProcess","_getPluginContext","prepareRender","updateCollision","isFirstRender","dirty","groundOffset","getPolygonOffset","getPolygonOffsetCount","groundContext","offsetFactor","offsetUnits","paint","_isVisitable","painter","isEnableTileStencil","_drawTileStencil","endFrame","_drawDebug","mat","tileImage","getDebugInfo","getTileSize","visible","includesChanged","states","_hasMesh","scene","getMeshes","isRenderingTerrainSkin","sceneFilter","hlBloomMesh","uniqueRef","isUniqueStencilRefPerTile","getCurrentTileZoom","stencilRenderer","_stencilRenderer","_stencilTiles","sort","sortByLevel","stencilRef","_addTileStencil","currentTiles","tileTransform","calculateTileMatrix","onDrawTileStart","altitude","isOnly2D","setTerrainHelper","terrainLayer","getTerrainHelper","drawTileOnTerrain","args","drawTile","createTerrainTexture","mag","_terrainDepthStencil","renderbuffer","format","fboInfo","colors","colorFormat","ignoreStatusCheck","depthStencil","colorTex","deleteTerrainTexture","renderTerrainSkin","terrainRegl","skinImages","getTileViewport","_drawTerrainTile","_endTerrainFrame","awareOfTerrain","tileTranslationMatrix","calculateTileTranslationMatrix","terrainTileTransform","terrainTransform","calculateTerrainTileMatrix","tileVectorTransform","tileExtent","bloom","paintTile","retire","_retirePrevTile","setCanvasUpdated","_createOneTile","loadTime","createTile","geometry","checkTileInQueue","pick","hits","picked","tolerance","getType","completeTerrainQuery","terrainQueryStatus","abortTileLoading","resizeCanvas","canvasSize","resize","onRemove","delete","hitDetect","pixels","h","readPixels","RGBA","UNSIGNED_BYTE","featureStyle","_createRenderPlugin","_highlighted","_resumeHighlights","highlight","P","getPlugins","names","debugFBO","getElementById","read","halfHeight","bytesPerRow","temp","topOffset","bottomOffset","subarray","copyWithin","imgdata","ImageData","putImageData","only2D","markerFill","markerSize","markerOpacity","lineColor","lineOpacity","polygonFill","polygonOpacity","getDefaultSymbol","getExtension","navigator","gpu","getParameter","UNMASKED_RENDERER_WEBGL","win","platform","toLowerCase","isWinIntelGPU","getZScale","featureIds","outlineFeatures","outlineBatch","outlineAll","paintOutline","pluginIdx","feaPlugins","feaId","paintBatchOutline","cancelOutline","setZIndex","apply","fnTypeProps","oldTile","highlights","Map","cancelHighlight","cancelAllHighlight","_getLayerOpacity","layerOpacity","arrays","m0","m1","group","symbols","FilterUtil","isExpression","empty","include","v0","v1","v2","tilePos","posMatrix","identity","translate","halfExtent","TMP_POINT","TMP_COORD","EMPTY_ALTITUDE","ALTITUDE","VectorTileLayer","loadFrom","fromJSON","_schema","setURLModifier","_urlModifier","onAdd","_prepareOptions","projection","mapCode","setFeatureState","state","_featureStates","stateMap","_markFeatureState","removeFeatureState","getFeatureState","_featureStamp","_getFeatureStateStamp","_isFeatureStateDirty","getProjection","is4326","is3857","spatialReference","tileSystem","tms","PI","onConfig","debug","debugTile","altitudeProperty","debugTileData","pickingGeometry","projectionCode","workerGlyph","featureIdProperty","endIndex","lastIndexOf","root","substring","getJSON","styleJSON","$root","_setStyle","_tilePointToPoint","out","tileScale","queryTilePointTerrain","terrainTileInfo","terrainHelper","pointAtRes","queryTileTerrainByPointAtRes","queryTerrainTiles","getTerrainTiles","_replacer","targetStyle","targetFeatureStyle","uncompress","_originFeatureStyle","_featureStyle","unitStyle","_renderIdx","parseFeatureStyle","_vtStyle","background","_background","unitColor","opacity","getOrDefault","patternFile","depthRange","validateStyle","_parseStylePath","getStyle","computedStyle","getComputedStyle","_polygonOffset","setPolygonOffset","offset","total","_totalPolygonOffset","getTotalPolygonOffset","_convertFeatures","tileConfig","tempNW","len","tempX","tempY","tempRes","getTilePointNW","geo","_convertGeometry","item","getRenderedFeaturesAsync","Promise","resolve","reject","MicroTask","allFeatures","pageSize","countPerTime","ceil","page","run","startIndex","fs","runTaskAsync","_validateHighlight","convertStylePath","_getStyleIndex","_updateSceneConfig","updateFeatureSceneConfig","styleIdx","computedSceneConfig","renderIdx","checkFeaStyleExist","checkStyleExist","_updateDataConfig","updateFeatureDataConfig","computedDataConfig","rendererIdx","_updateSymbol","updateFeatureSymbol","feaStyleIdx","self","replacer","parseSymbolPath","isPropFunction","refresh","featureStyleIndex","_isDefaultRender","warn","condition","getGroundConfig","_backgroundConfig","polygonPatternFile","identify","coordinate","cp","coordToContainerPoint","identifyAtPoint","results","_convertPickedFeature","picks","sr","nw","coordinates","geoType","_convertGeometryCoords","polygon","PackUtil","calculateSignedArea","singleCoordinate","coords","toArray","layerJSON","registerPlugin","Plugin","compressStyleJSON","compressedFeatureStyle","compressed","compress","floor","registerJSONType","mergeOptions","urlTemplate","forceRenderOnZooming","forceRenderOnMoving","forceRenderOnRotating","cascadeTiles","collisionBuffserSize","picking","pickingPoint","glyphSdfLimitPerFrame","tileLimitPerFrame","loadingLimitOnInteracting","loadingLimit","collisionFrameLimit","defaultRendering","textGamma","maxIconSize","workarounds","pyramidMode","styleScale","enableAltitude","fadeAnimation","altitudeQueryTimeLimitPerFrame","currentTilesFirst","registerRenderer","preset4326","fullExtent","top","left","bottom","right","resolutions","pow","SpatialReference","registerPreset","VECTOR_TILE_SIZE","Size","Vector3DLayer","OverlayLayer","registerPainter","clazz","painters","get3DPainterClass","getEvents","events","_onSpatialReferenceChange","updateBloom","isEmpty","geoIds","profile","geometries","getGeometries","collisionBufferSize","geometryEvents","meshRenderOrder","enableBloom","NO_REDRAW","meshUID","createPainterPlugin","Painter","PainterPlugin","VectorTilePlugin","init","_meshCache","excludes","_excludes","_excludesFunc","createFilter","_frameCache","_getMeshKey","glData","colorSymbol","isObjectEmpty","_generateColorArray","aPickingId","indices","aColor","createGeometries","_fillCommonProps","newMeshes","isRetire","_createMeshes","createMeshes","_fillMeshProps","animation","_animationTime","level","m","progress","duration","animationDuration","createTime","easing","enableTileStencil","meshKey","needUpdateShadow","defines","setDefines","tileResolution","tileRatio","all","shouldDeleteMeshOnUpdateSymbol","deleteMesh","featureIndexes","rgb","visitedColors","pos","l","array","opacitySymbol","_filterElements","_filterGeoElements","pre","excluded","elements","setElements","filtered","PREFIX","SAVED_FN_TYPE","prepareFnTypeData","configs","symbolName","prepareAttr","geoProps","preparePickingId","attrName","related","hasRelatedFnTypeSymbol","createZoomFnTypeIndexData","deleteData","removeFnTypePropArrs","aIndexPropName","aIndex","updateFnTypeAttrib","updateAttrValue","attrPropName","stopValues","stops","EMPTY_ARR","interpolated","isZoomConstant","getFnTypePropertyStopValues","hasZoomIdentity","StyleUtil","checkIfIdentityZoomDependent","hasFnTypeInProperty","isFnTypeFeature","createFnTypeFeatureIndex","BYTES_PER_ELEMENT","updateOneGeometryFnTypeAttrib","symbolChanged","_featureTimestamp","_fnDataZoom","define","savedTypes","evaluate","attrProp","evaluateAndUpdate","Float64Array","Int8Array","Int16Array","Uint32Array","Int32Array","Uint8ClampedArray","keyName","updateData","SOURCE","iii","symbolProp","pointGeometry","clone","_add","sub","_sub","multByPoint","_multByPoint","divByPoint","_divByPoint","mult","_mult","div","_div","rotate","_rotate","rotateAround","_rotateAround","matMult","_matMult","unit","_unit","perp","_perp","round","_round","sqrt","equals","other","dist","distSqr","dx","dy","angle","atan2","angleTo","angleWith","angleWithSep","cos","sin","convert","v4","projectPoint","vec4","transformMat4","CURRENT2","PREV2","P2","INVALID_OFFSET","TILEPOINT","TEMP_V3","elevate","anchor","vtLayer","mvpMatrix","terrainTileInfos","inTerrainTile","altitudeResult","elevatedAnchor","point1","contains","loginIBLResOnCanvas","logoutIBLResOnCanvas","getIBLResOnCanvas","pbr","PBRUtils","TEX_CACHE_KEY","V3","ANCHOR_POINT","ALTITUDE32","level0Filter","levelNFilter","getBloomSymbol","_is2D","loginTextureCache","_compileSymbols","pickingViewport","sortByCommandKey","colorCache","_invisibleWhenCreated","visibleFns","_visibleFn","isFeatureConstant","getSymbols","isMeshVisible","symbolIndex","getSymbol","_redraw","isShadowIncludeChanged","_includeKeys","fillIncludes","uniformDeclares","includes","setIncludeUniformValues","renderUniforms","is2D","createGeometry","pickingIdMap","idPickingMap","hasFeaIds","_getIdMap","feaIdPickingMap","feaPickingIdMap","positionBounding","postCreateGeometry","feaIds","pickingId","_updateTerrainAltitude","desc","createMesh","getAltitudeOffsetMatrix","altitudeOffset","isBloom","forbiddenTerrainUpscale","isRenderingTerrainVector","getRenderFBO","aTerrainAltitude","castShadow","isEnableBloom","updated","_highlightMesh","drawCount","_drawCount","createFnTypeConfig","getSymbolDef","fnTypeConfig","getFnTypeConfig","_renderContext","getUniformValues","callShader","callCurrentTileShader","callBackgroundTileShader","shader","callRenderer","renderMeshes","_setLayerUniforms","setMeshes","minAltitude","factor","units","getBlendFunc","blendSrc","blendDst","getRenderedMeshes","viewMatrix","projMatrix","returnPoint","logDepthBufFC","cameraFar","LN2","meshId","getMeshAt","_convertProxyFeature","keepGeometry","removeMesh","isValid","material","HighlightUtil","deleteHighlightBloomMesh","_inited","_outlineShaders","_terrainAltitudeCache","logoutTextureCache","_updateChildSymbol","_fnTypeConfigs","_isNeedRefreshStyle","oldSymbolDef","newSymbolDef","SYMBOLS_NEED_REBUILD_IN_VT","deepEuqal","_symbol","loadedSymbol","FuncTypeUtil","loadSymbolFnTypes","getOwnPropertyDescriptor","configurable","_deleteFnTypeConfigs","myTextures","_myTextures","getCachedTexture","addCachedTexture","disposeCachedTexture","painted","_outlineOne","featureId","_outlineScene","_initOutlineShaders","_findMeshesHasFeaId","pickingMap","pickingIds","highlightPickingId","allMeshes","idMap","pickingVert","getPickingVert","ENABLE_PICKING","HAS_PICKING_ID","getUniformDeclares","hasIBL","lightManager","getLightManager","getAmbientResource","updateIBLDefines","shaderDefines","getIBLRes","createIBLTextures","disposeIBLTextures","evaluateInFnTypeConfig","isPiecewiseConstant","fnCaches","_fnCaches","hash","strlen","codePointAt","hashCode","piecewiseConstant","_highlightTimestamp","_prepareFeatureIds","pickingIdIndiceMap","aFeaIds","isHalo","inputHighlights","convertHighlights","highlightMesh","geoData","geoProperties","aAnchor","_fillTerrainAltitude","_updateATerrainAltitude","cacheId","cachedAltitude","altitudeData","terrainChanged","queryStatus","isTerrainTileLoaded","layerClazz","isInteracting","altitudeQueryFrameTimestamp","altitudeQueryFrameTime","timeLimit","startTime","performance","now","queryResult","complete","terrainTile","isTileCached","LRUCache","k1","getCommandKey","k2","localeCompare","BasicPainter","iconAtlas","dataType","glyphAtlas","getPrimitive","aAltitude","altitudeAttribute","iconPositions","positions","markerPlacement","textPlacement","getRayCastData","indiceIndex","drawDebugAtlas","imageSmoothingEnabled","createAtlasTexture","atlas","flipY","mipmap","resizeToPowerOfTwo","premultiplyAlpha","wrapMode","EMPTY_SIZE","DEFAULT_SIZE","getDefaultMarkerSize","iconPosition","defaultMarkerWidth","displaySize","defaultMarkerHeight","IDENTITY_ARR","DEFAULT_UNIFORMS","uvScale","uvOffset","patternWidth","patternOffset","COORD0","COORD2","ARR_0","FillPainter","prepareSymbol","isVectorTile","tileRes","_preparePatternOrigin","_preparePatternWidth","_preparePatternOffset","aTexInfo","tilePointUniform","aPatternOrigin","polygonPatternFileOrigin","coordToPointAtRes","vec2","patternWidthUniform","aPatternWidth","texWidth","polygonPatternFileWidth","texHeight","polygonPatternFileHeight","_computePatternWidth","aPatternOffset","uvOffsetInMeter","offsetUniform","offsetX","offsetY","atlasSize","Material","INVALID_TEX_COORD","aOpacity","aUVScale","aUVOffset","widthSymbol","heightSymbol","originFn","widthFn","heightFn","currentScaleX","currentScaleY","origin","scaleX","scaleY","isMeterFn","uvOffsetFn","currentOffsetX","currentOffsetY","isUvOffsetInMeter","currentOriginX","currentOriginY","polygonFillFn","polygonOpacityFn","uvScaleFn","u8","u16","offsetU8","_createShader","isVT","isTileLayer","_","range","depthMask","hasSSRGround","meshConfig","transparent","polygonOffset","FBORayPicking","getGLScale","TEMP_CANVAS_SIZE","LinePainter","lineStrokeColor","lineDashColor","_hasPatternAnim","trailAnimation","setLineUniforms","dasharray","lineDasharray","linePatternFile","positionMatrix","_prepareDashDefines","aStrokeColor","setMeshDefines","_prepareMesh","aLineWidth","hasPatternAnim","reduce","accumulator","currentValue","aLineStrokeWidth","createShader","aColorFn","aLinePatternAnimSpeedFn","aLinePatternGapFn","shapeConfigs","createShapeFnTypeConfigs","i8","speed","gap","concat","aLineWidthFn","aLineOpacityFn","aLineStrokeWidthFn","aLineDxFn","aLineDyFn","lineWidth","lineStrokeWidth","lineDx","lineDy","_context","getExtraCommandProps","cameraToCenterDistance","resolution","layerScale","trailSpeed","trailLength","trailCircle","currentTime","blendSrcIsOne","LineGradientPainter","lineGeometry","gradProp","aGradIndex","grads","gradients","isPowerOfTwo","ceilPowerOfTwo","createGradient","HAS_GRADIENT","grad","gradient","createLinearGradient","addColorStop","fillRect","CollisionGroup","DEFAULT_SCENE_CONFIG","UINT8","MESH_ANCHORS","NO_COLLISION","collides","boxes","MESHES","BOX","CollisionPainter","created","collideIds","isIdUnique","uniqueCollideIds","renderToPointRenderTarget","isEnableCollision","meshesToCheck","visElemts","startMeshCollision","_cachedInstances","_startTime","_canProceed","_canProceedCollision","_meshCollisionStale","_isCachedCollisionStale","endMeshCollision","meshContext","_collisionContext","tags","_anchorCoord0","_anchorCoord1","anchor0","containerPointToCoord","_containerAnchor0","anchor1","_containerAnchor1","pitch","getPitch","collisionFrameTime","_getMeshAnchor","distanceTo","_startCollision","_coordCache","frameTimestamp","collisionTags","isEnableUniquePlacement","_endCollision","_getCachedCollision","boxIndex","_setCollisionCache","limit","key0","key1","cp0","cp1","updateBoxCollisionFading","boxVisible","meshBoxes","_isReplacedPlacement","cachedCollision","zoomColliding","_zooming","uncollidedOnZooming","isAllowOverlap","offscreenCount","boxCollides","isCollides","allElements","boxCount","childCollision","_isBoxVisible","fadingOpacity","isFading","stamps","_getBoxTimestamps","_zoomingOut","_fadeOutStartTime","_getBoxFading","isBoxFading","_markFadingCollided","fadeOutStart","zoomEndFading","addCollisionDebugBox","_isIgnorePlacement","_fillCollisionIndex","setCollisionOpacity","isMeshIterable","vertexIndexStart","vertexIndexEnd","_updateOpacityData","abs","isIgnorePlacement","_isAllowOverlap","isBoxCollides","aOverlap","propIgnorePlacement","placement","propAllowOverlap","overlap","insertCollisionBox","boxTimestamp","newStamp","_boxTimestamps","_refreshTimeStamps","_prevTimestamp","_collisionMesh","_collisionShader","_collisionRenderer","box","isOffscreen","collisionIndex","getCollisionIndex","bufferSize","bufferBox","_buffered","insertBox","_addCollisionBox","allBoxes","_collisionBoxes","aVisible","_prepareZoomEndMeshes","_zoomEndMeshes","_updateZoomMeshesLevel","isZooming","_updateUniquePlacements","_mergeUniquePlacements","_renderCollisionBox","shouldIgnoreBackground","zooming","isLinePlacement","_preRes","_clearTimeout","clearTimeout","setTimeout","_initCollisionShader","_collisionScene","isMeshUniquePlaced","placements","uniquePlacements","getUniqueEntryKey","forEachBox","changed","_mergedMeshes","_mergedMehesZoom","_replacedPlacements","allPlacements","uKey","getUniqueKey","parentKey","parentStamps","parentIndex","_updatePlacementStamps","lastTimestamp","_getCollideBoxes","iconBoxes","_getMeshBoxes","_MeshBoxes","_isHalo0","aTextHaloRadius","hasHalo","textHaloRadius","UNIQUE_TOLERANCE","V3_0","V3_1","V3_2","V3_3","MIN","MAX","getPitchPosition","tl","tr","bl","br","dxdy","cameraDistance","perspectiveRatio","is3DPitchText","altitudeScale","getPosition","projAnchor","getShapeMatrix","rotation","mapRotation","rotateWithMap","pitchWithMap","angleSin","angleCos","mat2","ICON_SIZE","GLYPH_SIZE","DEFAULT_ICON_ALPHA_TEST","ANCHOR","PROJ_ANCHOR","MAT2","V2_0","V2_1","V2_2","V2_3","DXDY","AXIS_FACTOR","SIZE_SCALE","getIconBox","aShape","aMarkerDx","aMarkerDy","aMarkerWidth","aMarkerHeight","aPitchAlign","aRotationAlign","aRotation","markerDx","markerDy","markerWidth","markerHeight","sizeScale","getBearing","shapeMatrix","transformMat2","TEXT_BOX_MARGIN","getLabelBox","textSize","isAlongLine","glyphSize","aTextDx","aTextDy","textDx","textDy","rotateWidthMap","aOffset","textRotation","textScale","getAnchor","unpackPosition","textFill","textOpacity","textPitchAlignment","textRotationAlignment","textHaloFill","textHaloBlur","textHaloOpacity","textPerspectiveRatio","createTextMesh","enableCollision","visibleInCollision","enableUniquePlacement","isDisposed","aCount","prepareGeometry","aTextSize","glyphTexture","texSize","setMeshUniforms","memorySize","getMemorySize","excludeElementsInVAO","disableVAO","ENABLE_COLLISION","uniforms1","textMesh","haloMesh","aTextFill","aColorOpacity","aTextHaloFill","aTextHaloOpacity","vertexCount","aVertical","aSegment","aGlyphOffset","aPitchRotation","offsetLength","usage","createTextShader","getTextFnTypeConfig","textFillFn","textSizeFn","textHaloFillFn","textHaloRadiusFn","textHaloOpacityFn","textDxFn","textDyFn","textOpacityFn","textPitchAlignmentFn","textRotationAlignmentFn","textRotationFn","textAllowOverlapFn","textIgnorePlacementFn","radius","BOX0","BOX1","isLabelCollides","hasCollides","haloRadius","aProjectedAnchor","anchorIndex","charCount","boxArr","firstChrIdx","currentShapeY","shapeY","lastChrIdx","tlBox","brBox","getLabelEntryKey","label","getLabelContent","ENTRY_ANCHOR","ENTRY_WORLD_POS","codeSum","codePoint","getEntryKey","BOX_ELEMENT_COUNT","BOX_VERTEX_COUNT","U8","I8","prepareMarkerGeometry","iconGeometry","iconFnTypeConfig","prepareIconGeometry","getMarkerFnTypeConfig","markerWidthFn","markerHeightFn","markerDxFn","markerDyFn","markerOpacityFn","markerTextFitFn","markerPitchAlignmentFn","markerRotationAlignmentFn","markerRotationFn","markerAllowOverlapFn","markerIgnorePlacementFn","markerTextFit","textFit","prepareLabelIndex","textGeometry","labelIndex","textFitFn","isTextFit","iconElements","getElements","iconIds","textElements","textIds","textCounts","currentLabel","textId","labelVisitEnd","hasLabel","unused","Set","buildLabelIndex","labelShape","hasValue","minx","Infinity","miny","maxx","maxy","buildLabelShape","fillTextFitData","hasWidth","hasHeight","fitWidthIcons","fitHeightIcons","onlyBoth","fitIcons","textSymbolDef","textGeo","updateMarkerFitSize","isFitConstant","DEFAULT_PADDING","textProps","markerSymbol","textSizeDef","_textSizeFn","padding","paddingFn","_paddingFn","iconIndex","aPadOffsetX","aPadOffsetY","fitPadding","fitPaddingFn","ICON_FILTER","ICON_FILTER_N","TEXT_FILTER","TEXT_FILTER_N","PROJ_MATRIX","EMPTY_COLLISION","ICON_SIZE_ARR","IconPainter","_iconFilter0","_iconFilter1","_textFilter0","_textFilter1","_meshesToCheck","pitchAlignment","setTextShaderDefines","_textDefines","icon","_isMarkerGeo","_isTextGeo","lastOne","iconSymbolIndex","prepareCollideIndex","collideBoxIndex","createMarkerMesh","_rebuildCollideIds","newCollideIds","markerCollideMap","new","maxId","counter","currentOldIndex","currentCount","cid","next","_updateIconCollision","_textShader","_updateIconAndText","_updateBox","globalBoxIndex","isIterable","_startCheckMesh","_endCheckMesh","_updateOpacity","meshGroup","_iterateMeshBox","collideId","contextIndex","boxInfo","_markerVisible","iconTex","isMarker","iconExtraCommandProps","textVert","textFrag","markerPicking","textPicking","textPickingVert","blendFunc","mapPitch","iconSize","gammaScale","GLYPH_OFFSET","SEGMENT","getCharOffset","line","projectedAnchor","flip","isPitchWithMap","glyphOffset","segment","lineStartIndex","lineLength","fontScale","linePoints","glyphOffsetX","dir","lineEndIndex","absOffsetX","currentIndex","prev","currentPoint","prevPoint","distanceToPrev","currentSegmentDistance","segmentInterpolationT","segmentAngle","prevToCurrent","getLineOffset","FIRST_POINT","LAST_POINT","getLabelNormal","firstCharOffset","lastCharOffset","aspectRatio","planeMatrix","isVertical","vertical","rise","shaderFilter0","shaderFilterN","shaderLineFilter0","shaderLineFilterN","currentZoom","Z_AXIS_OFFSET","CHAR_OFFSET","PLANE_MATRIX","SHAPE","OFFSET","INT16","TEMP_QUAT","TEMP_MAT4","TEMP_MAT4_1","TEMP_AXIS","FIRST_CHAROFFSET","LAST_CHAROFFSET","featureState","availableImages","ELEVATED_ANCHOR","TextPainter","_filter0","_filter1","_lineFilter0","_lineFilter1","_genTextNames","dirtyDefines","_tagTerrainVector","_tagTerrainSkin","_textNameFn","expression","createExpression","evaluateWithoutErrorHandling","pack","lineVertex","_hasLineText","_hasNormalText","_projectedLinesCache","_updateLabels","_shaderAlongLine","textPitchFilter","bearing","fromRotation","_updateLineLabel","allVisilbe","allHided","geometryProps","lineTextPitch","linePitch","lineTextBearing","lineBearing","projectedLine","_projectLine","visCache","needUpdate","_updateLabelAttributes","aAltitudeArr","prjLine","projectLine","meshBox","TextUtil","resolveText","meshElements","isProjected","labelAnchor","projLabelAnchor","resetOffset","normal","_updateNormal","onlyOne","vertexStart","rotMatrix","axis","normalize","angleR","quaterion","quat","setAxisAngle","fromTranslation","fromQuat","offsetIdx","_linePicking","commandProps","vertAlongLine","linePicking","linePickingVert","NativePointPainter","createDefines","USE_CIRCLE","appendDefines","NativeLinePainter","getMeshUniforms","SCALE","DEFAULT_POLYGON_FILL","EMPTY_UV_OFFSET","DEFAULT_UV_SCALE","ARR2_0","ARR2_1","MeshPainter","getShader","getGeometryDefines","colorSetter","aExtrude","alt","vertexColorTypes","bottomColor","topColor","vertexColors","aLineHeight","aVertexColorType","vertexTypesCount","hasAlpha","setPositionMatrix","maxAltitude","pointToMeter","pointDistance","pointAtResToDistance","pointAtResToMeter","uvOriginUniform","_computeUVOffset","baseColorTexture","emissiveTexture","getMaxNativeZoom","topUVMode","side","textureOrigin","isMeter","uvOffsetAnim","getUVOffsetAnim","getUVOffset","textureWidth","DEFAULT_TEX_WIDTH","textureHeight","cullFace","shadowCount","setMaterial","inMeter","timeStamp","_needPolygonOffset","ssr","deleteMaterial","fillFn","opacityFn","fillName","opacityName","refreshMaterial","MATERIAL_PROP_NEED_REBUILD_IN_VT","needRefreshMaterial","_updateMaterial","hasTexture","normalTexture","bumpTexture","PhongPainter","extrusionOpacity","aExtrusionOpacity","getShaderConfig","PhongShader","off","_updateLights","on","pickingConfig","cull","face","materialConfig","PhongMaterial","lightUniforms","_getLightUniformValues","jitter","ambientLight","getAmbientLight","directionalLight","getDirectionalLight","ambientColor","light0_diffuse","lightSpecular","specular","light0_viewDirection","direction","WireframePainter","outSize","getPBRUniforms","StandardPainter","_loader","ResourceLoader","sortFunction","_getUVOffsetAnim","uv0Attribute","tangentAttribute","normalAttribute","createNormal","createTangent","hasShadow","shadow","_updateDepthShader","isSsr","onlyUpdateDepthInTaa","_previousSSR","_onUpdatelights","_bindedOnTextureLoad","_onTextureLoad","_bindDisposeCachedTexture","_bindOnMaterialComplete","_onMaterialComplete","SsrPass","_getDefines","StandardShader","resources","symbolMaterial","texConf","cachedTex","promise","upsideUpTexture","Texture2D","once","alphaTest","getMaterialClazz","StandardMaterial","iblTexes","dfgLUT","TubePainter","getTubeSizeScale","metric","centiMeterToLocal","baseResolution","IS_LINE_EXTRUSION","HAS_LAYER_OPACITY","modelNormalMatrix","tubeVert","mat3","fromMat4","TEMP_V3_0","TEMP_V3_1","TEMP_V3_2","Q4","DEFAULT_TRANSLATION","DEFAULT_ROTATION","DEFAULT_SCALE","DEFAULT_MARKER_FILL","TEMP_MATRIX","Y_TO_Z","GLTFMixin","Base","_ready","_gltfManager","GLTFManager","_initTRSFuncType","_initGLTF","_gltfPack","_isSkinAnimating","aXYRotation","aZRotation","instanceData","instance_vectorA","instance_vectorB","instance_vectorC","instanceCenter","_updateInstanceData","instanceBuffers","dimension","divisor","hasFnType","_hasFuncType","meterScale","_getMeterScale","meterToPointMat","meshInfos","_gltfMeshInfos","gltfPack","fixSizeOnZoom","trsMatrix","_getSymbolTRSMatrix","zOffset","nodeMatrix","boundingBox","_calAnchorTranslation","anchorTranslation","childMeshes","meshIndex","gltfGeo","materialInfo","morphWeights","extraInfo","nodeIndex","InstancedMesh","hasSkinAnimation","skinObj","_updateAnimation","jointTexture","jointTextureSize","numJoints","alphaMode","_getMeshNodeMatrix","center","insContext","meshInfo","_nodeMatrixMap","_skinMap","uuid","gltfJSON","_gltfJSON","loop","animationName","currentAnimation","animations","updateAnimation","gltfBBox","anchorZ","instancedData","isAnimated","updateInstancedData","setInstanceData","col","minz","maxz","position","vertex","cx","cy","cz","zAxis","xyRotation","zRotation","cross","tMat","trs","_meterScale","tx","ty","tz","rx","ry","rz","sx","sy","sz","heightScale","_getModelHeightScale","_txFn","_tyFn","_tzFn","translation","_rxFn","_ryFn","_rzFn","_sxFn","_syFn","_szFn","_getGLTFMatrix","modelHeight","_modelHeightFn","bbox","_gltfBBox","positionAttribute","_loaded","loginGLTF","gltfRes","getGLTF","gltfData","getMeshesInfo","skinmap","disposeInstancedData","logoutGLTF","eluerQuat","fromEuler","fromRotationTranslationScale","GLTFPhongPainter","diffuseFactor","PhongSpecularGlossinessMaterial","GLTFStandardPainter","StandardSpecularGlossinessMaterial","DEFAULT_DIR_LIGHT","TIME_NOISE_TEXTURE_REPEAT","SYMBOL_INDEX","EMPTY_HSV","WATER_UV_SIZE","WaterPainter","transformWater","waterUniforms","_getWaterUniform","_waterShader","_waterScene","hasSSR","_water","createGround","_loadTextures","_emptyTex","normalUrl","cachedNormalData","_normalTex","isLoading","_createTex","img","Image","onload","onerror","pertUrl","cachedPertData","_pertTex","wrapS","wrapT","environmentTransform","modelView","inverted","invert","transposed","transpose","orientation","waterDir","_waterDir","waveParams","_waveParams","lightDirection","lightColor","camPos","timeElapsed","waterSpeed","heightTexture","getWaterDirVector","waterDirection","waterBaseColor","contrast","hsv","planeGeo","Plane","getGroundTransform","getWidth","getHeight","cameraLookAt","uvStartX","uvStartY","noiseStartX","noiseStartY","w","FillPlugin","registerAt","LinePlugin","LineGradientPlugin","IconPlugin","TextPlugin","NativeLinePlugin","PhongPlugin","WireframePlugin","LitPlugin","TubePlugin","GLTFPhongPlugin","GLTFStandardPlugin","HeatmapPlugin","heatWeightFn","i16","dataResolution","aWeight","_process","heatmapOpacity","getHeatmapMeshes","polygonOfffset","HeatmapProcess","heatmapColor","WaterPlugin","MapboxVectorTileLayer","getTileUrl","MAX_RES","getMapBoxZoom","GeoJSONVectorTileLayer","maxNativeZoom","get4326SpatialReference","workerData","convertUrl","tileBuffer","hasAltitude","simplifyTolerance","generateOMBB","convertFn","_updateWorker","_setData","_generateIdMap","workerConn","getExtent","_dataExtent","_setExtent","_idMaps","Extent","_fetchData","feaIdProp","f","idProp","toAbsoluteURL","tileStackDepth","MARKER_SYMBOL","default","markerPathWidth","markerPathHeight","markerPath","markerFillPatternFile","markerFillOpacity","markerLineColor","markerLineWidth","markerLineOpacity","markerLineDasharray","markerLinePatternFile","markerVerticalAlignment","markerHorizontalAlignment","markerPitchAlignment","markerRotationAlignment","markerRotation","markerAllowOverlap","markerIgnorePlacement","markerSpacing","markerTextFitPadding","TEXT_SYMBOL","textFaceName","textWrapWidth","textHorizontalAlignment","textVerticalAlignment","textAllowOverlap","textIgnorePlacement","textSpacing","LINE_SYMBOL","linePatternAnimSpeed","linePatternGap","lineJoin","lineCap","LINE_GRADIENT_PROP_KEY","POINT","ID_PROP","GRADIENT_PROP_KEY","convertToFeature","kidGen","currentFeature","glRes","getCoordinates","Marker","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","Circle","Rectangle","Ellipse","Sector","getShell","ringIndex","shellIsClockwise","reverse","getProperties","kid","lineGradientProperty","fillGradientProperties","fea","prefix","EMPTY_POSITION","Vector3DLayerRenderer","CanvasRenderer","_geometries","_allFeatures","_featureMapping","_markerFeatures","_textFeatures","_lineFeatures","_dirtyAll","_kidGen","_dirtyTargetsInCurrentFrame","hasNoAARendering","_markerPainter","_linePainter","_preparePaintContext","buildMesh","_buildMarkerMesh","_buildLineMesh","_dirtyGeo","_dirtyLine","markerAtlas","_markerAtlas","lineAtlas","_lineAtlas","_markerMeshes","_lineMeshes","_showHideUpdated","_updateMeshVisible","_updateDirtyTargets","_renderMeshes","lineCount","currentPolygonOffset","needUpdateCollision","_collisionTimestamp","_layerSymbol","_getFeaturesToRender","featureMap1","featureMap2","_addCoordsToCenter","createVectorPacks","PackClass","requestor","positionType","load","packData","_createMesh","_addCoord","needWarning","isSphere","invalid","_isEnableWorkAround","prepareRequestors","_fetchPattern","_markerRequestor","_fetchIconGlyphs","markerUIDs","textUIDs","markerFeatures","textFeatures","showHideUpdated","_markerCenter","pointPacks","_createPointPacks","_isCreatingMarkerMesh","originElements","_updateVisElements","newElements","markerOptions","defaultAltitude","forceAltitudeAttribute","markerWidthType","markerHeightType","textOptions","allowEmptyPack","PointPack","splitPointSymbol","_markerSymbol","updateMesh","_updateMarkerMesh","marker","isVector3D","_convertGeo","loadedSymbols","symbolFnTypes","loadFunctionTypes","VectorPack","genFnTypes","fnTypes","iconGlyph","StyledPoint","getIconAndGlyph","isAtlasLoaded","_markRebuild","markerMeshes","dynamicAttrs","dynamicAttributes","updateSubData","_updateLineMesh","_updateMesh","_lineCenter","LinePack","_groupLineFeas","globalSymbol","groupFeaturesFn","styledVector","StyledVector","getLineResource","getPolygonResource","featureGroups","feaGroupIndex","packs","feas","_updateMeshData","datas","walker","promises","_isCreatingLineMesh","mm","dashKeyName","patternKeyName","patternFeas","dashFeas","dash","dashLength","_markRebuildGeometry","_convertGeometries","GeometryTypes","_removeFeatures","_refreshFeatures","needCheckPointLineSymbols","feaObj","hasMarkerSymbol","hasTextSymbol","hasLineSymbol","includeInternals","_getFeaKeyId","partial","_isCreatingMesh","_convertAndRebuild","onGeometryAdd","onGeometryRemove","onGeometrySymbolChange","allChangedProps","SYMBOLS_NEED_REBUILD_IN_VECTOR","compareSymbolCount","compareSymbolProp","onGeometryPositionChange","onGeometryShapeChange","onGeometryZIndexChange","onGeometryShow","_onShowHide","onGeometryHide","_markShowHide","onGeometryPropertiesChange","createPainter","bloomSymbols","markerPerspectiveRatio","_defineSymbolBloom","REVERSE_MAP_ROTATION_ON_PITCH","lineSymbol","_lineSymbol","lineSceneConfig","_updatePainterBloom","painterSymbol","targetSymbol","Constants","_outlineFeatures","getGeometryById","markerFileName","markerTypeName","lineWidthName","lineGradientPropertyName","jsons","addGeometry","PointLayer","LineStringLayer","_meshCenter","PolygonLayer","SYMBOL","polygonPatternUV","PolygonLayerRenderer","_groupPolygonFeatures","PolygonPack","flattended","flatten","alphaFeas","fillPosArray","isLine","isCoordArr","trySetLength","isClippedEdge","i0","i1","x0","y0","x1","y1","rad","metersPerDegree","maxLatitude","project","lnglat","lng","lat","tan","project3857","buildFaceUV","uvs","uvOrigin","ombb","xPointToMeter","yPointToMeter","centerX","centerY","uvStart","buildFlatUV","obox","isExtrudePolygonLayer","v3","distance","pt","perpX","perpY","getFootOfPerpendicular","buildOmbbUV","begin","u","getSegLength","ix","iy","nextx","nexty","buildSide","topVertices","holes","topThickness","generateUV","sideUVMode","sideVerticalUVMode","textureYOrigin","uvSize","needReverseTriangle","getLength","startIdx","holeCount","buildRingSide","ringStart","ringEnd","indiceStart","lensofar","seg","segEnd","iz","buildSideUV","cleanVertices","ring","currentVertice","arrayPool","ArrayPool","getInstance","build3DExtrusion","textureSize","debugIndex","heightProperty","minHeightProperty","defaultHeight","tangent","uv","faces","featIndexes","featIds","geoVertices","getProxy","verticeTypes","generateTop","generateSide","fillData","typeStartOffset","triangles","earcut","tmp","setLength","BOUNDS","maxFeaId","hasNegative","ringOmbb","getFeaAltitudeAndHeight","verticeCount","exteriorIndex","isHole","clipPolygon","ringLen","pickingCtor","getUnsignedArrayType","createTypedArray","feaCtor","getPosArrayType","buildExtrudeFaces","ctor","getIndexArrayType","posArrayType","normalArr","normals","buildNormals","simpleNormal","normalLen","tangents","buildTangents","aTangent","q","ni","packTangentFrame","createQuaternion","colorFn","normalizeColor","buildFnTypes","isTopFn","isBottomFn","colorNormalize","topFillFn","topPolygonFill","bottomFillFn","bottomPolygonFill","currentTopFeatureId","currentBottomFeatureId","currentTopValue","currentBottomValue","isTop","divide","findColor","buildVertexColorTypes","aNormal","aTexCoord0","generatePickingIndiceIndex","exactEquals","TinyQueue","compare","defaultCompare","_down","_up","pop","peek","parent","halfLength","best","pointInPolygonFlat","vs","inside","xi","yi","xj","yj","pointInPolygonNested","pointInPolygonModule","exports","nested","flat","epsilon","splitter","resulterrbound","sum","elen","flen","Q","Qnew","hh","bvirt","enow","fnow","eindex","findex","hindex","vec","ccwerrboundA","ccwerrboundB","ccwerrboundC","B","C1","C2","D","orient2d","ax","ay","bx","by","detleft","detright","det","detsum","acxtail","acytail","bcxtail","bcytail","ahi","alo","bhi","blo","_i","_j","_0","s1","s0","t1","t0","u3","acx","bcx","acy","bcy","estimate","errbound","C1len","C2len","Dlen","orient2dadapt","concaveman","points","concavity","lengthThreshold","hull","pointInPolygon","compareByX","lower","upper","convexHull","fastConvexHull","tree","RBush","toBBox","minX","minY","maxX","maxY","compareMinX","compareMinY","last","queue","insertNode","segTree","insert","updateBBox","sqConcavity","sqLenThreshold","node","shift","sqLen","getSqDist","maxSqLen","findCandidate","concave","maxDist","Queue","compareDist","children","child","leaf","sqSegDist","sqSegBoxDist","d0","d1","noIntersections","sqSegSegDist","d2","d3","d4","p1","q1","p2","q2","edges","search","p3","orient","x2","y2","x3","y3","sc","sN","tc","tN","ux","uy","vx","vy","wx","wy","sD","tD","Vector","negate","diff","dot","orthogonal","IntersectLines","start0","dir0","start1","dir1","dd","HULL","VERTICES","computeOMBB","vertexes","projectedCoord","BestObb","BestObbArea","Number","MAX_VALUE","UpdateOmbb","leftStart","leftDir","rightStart","rightDir","topStart","topDir","bottomStart","bottomDir","obbUpperLeft","obbUpperRight","obbBottomLeft","obbBottomRight","obbArea","edgeDirs","leftIdx","rightIdx","topIdx","bottomIdx","minPt","POSITIVE_INFINITY","maxPt","NEGATIVE_INFINITY","phis","acos","CalcOmbb","edge0","edge1","ExtrudePolygonLayer","updateMaterial","matInfo","updateSideMaterial","isNew","sideMaterial","_deleteSideMaterial","DEFAULT_DATACONFIG","topFilter","sidePainter","sidePainterSymbol","topDataConfig","status0","status1","sideFilter","_extrudeCenter","_createPackData","sideData","topMesh","sideMesh","setProperties","shell","ShaderLib","register","maptalksgl","create","transcoders","transcoderInjected","inject","chunk","registerWorkerAdapter"],"mappings":"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","x_google_ignoreList":[16,65,66,67,68,69,70]}
|