UNPKG

itowns

Version:

A JS/WebGL framework for 3D geospatial data visualization

322 lines (261 loc) 13.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RasterElevationTile = exports.RasterColorTile = exports["default"] = exports.EMPTY_TEXTURE_ZOOM = void 0; var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var THREE = _interopRequireWildcard(require("three")); var _LayeredMaterial = require("./LayeredMaterial"); var _XbilParser = require("../Parser/XbilParser"); var _Crs = _interopRequireDefault(require("../Core/Geographic/Crs")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var EMPTY_TEXTURE_ZOOM = -1; exports.EMPTY_TEXTURE_ZOOM = EMPTY_TEXTURE_ZOOM; var pitch = new THREE.Vector4(); /** * A `RasterTile` is part of raster [`Layer`]{@link Layer} data. * This part is a spatial subdivision of the extent of a layer. * In the `RasterTile`, The data are converted on three.js textures. * This `RasterTile` textures are assigned to a `LayeredMaterial`. * This material is applied on terrain (TileMesh). * The color textures are mapped to color the terrain. * The elevation textures are used to displace vertex terrain. * * @class RasterTile */ var RasterTile = /*#__PURE__*/function (_THREE$EventDispatche) { (0, _inherits2["default"])(RasterTile, _THREE$EventDispatche); var _super = _createSuper(RasterTile); function RasterTile(material, layer) { var _this; (0, _classCallCheck2["default"])(this, RasterTile); _this = _super.call(this); _this.layer = layer; _this.crs = layer.parent.tileMatrixSets.indexOf(_Crs["default"].formatToTms(layer.crs)); if (_this.crs == -1) { console.error('Unknown crs:', layer.crs); } _this.textures = []; _this.offsetScales = []; _this.level = EMPTY_TEXTURE_ZOOM; _this.material = material; _this._handlerCBEvent = function () { _this.material.layersNeedUpdate = true; }; layer.addEventListener('visible-property-changed', _this._handlerCBEvent); return _this; } (0, _createClass2["default"])(RasterTile, [{ key: "id", get: function get() { return this.layer.id; } }, { key: "opacity", get: function get() { return this.layer.opacity; } }, { key: "visible", get: function get() { return this.layer.visible; } }, { key: "initFromParent", value: function initFromParent(parent, extents) { if (parent && parent.level > this.level) { var index = 0; var _iterator = _createForOfIteratorHelper(extents), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var c = _step.value; var _iterator2 = _createForOfIteratorHelper(parent.textures), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var texture = _step2.value; if (c.isInside(texture.extent)) { this.setTexture(index++, texture, c.offsetToParent(texture.extent)); break; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } } }, { key: "dispose", value: function dispose(removeEvent) { if (removeEvent) { this.layer.removeEventListener('visible-property-changed', this._handlerCBEvent); // dispose all events this._listeners = {}; } // TODO: WARNING verify if textures to dispose aren't attached with ancestor var _iterator3 = _createForOfIteratorHelper(this.textures), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var texture = _step3.value; if (texture.isTexture) { texture.dispose(); } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } this.level = EMPTY_TEXTURE_ZOOM; this.textures = []; this.offsetScales = []; this.material.layersNeedUpdate = true; } }, { key: "setTexture", value: function setTexture(index, texture, offsetScale) { this.level = texture && index == 0 ? texture.extent.zoom : this.level; this.textures[index] = texture || null; this.offsetScales[index] = offsetScale; this.material.layersNeedUpdate = true; } }, { key: "setTextures", value: function setTextures(textures, pitchs) { this.dispose(false); for (var i = 0, il = textures.length; i < il; ++i) { this.setTexture(i, textures[i], pitchs[i]); } } }]); return RasterTile; }(THREE.EventDispatcher); var _default = RasterTile; exports["default"] = _default; var RasterColorTile = /*#__PURE__*/function (_RasterTile) { (0, _inherits2["default"])(RasterColorTile, _RasterTile); var _super2 = _createSuper(RasterColorTile); function RasterColorTile() { (0, _classCallCheck2["default"])(this, RasterColorTile); return _super2.apply(this, arguments); } (0, _createClass2["default"])(RasterColorTile, [{ key: "effect_type", get: function get() { return this.layer.effect_type; } }, { key: "effect_parameter", get: function get() { return this.layer.effect_parameter; } }]); return RasterColorTile; }(RasterTile); exports.RasterColorTile = RasterColorTile; var RasterElevationTile = /*#__PURE__*/function (_RasterTile2) { (0, _inherits2["default"])(RasterElevationTile, _RasterTile2); var _super3 = _createSuper(RasterElevationTile); function RasterElevationTile(material, layer) { var _this2; (0, _classCallCheck2["default"])(this, RasterElevationTile); _this2 = _super3.call(this, material, layer); var defaultEle = { bias: 0, scale: 1, mode: _LayeredMaterial.ELEVATION_MODES.DATA, zmin: 0, zmax: Infinity }; var scaleFactor = 1.0; // Define elevation properties if (layer.useRgbaTextureElevation) { defaultEle.mode = _LayeredMaterial.ELEVATION_MODES.RGBA; defaultEle.zmax = 5000; throw new Error('Restore this feature'); } else if (layer.useColorTextureElevation) { scaleFactor = layer.colorTextureElevationMaxZ - layer.colorTextureElevationMinZ; defaultEle.mode = _LayeredMaterial.ELEVATION_MODES.COLOR; defaultEle.bias = layer.colorTextureElevationMinZ; _this2.min = _this2.layer.colorTextureElevationMinZ; _this2.max = _this2.layer.colorTextureElevationMaxZ; } else { _this2.min = 0; _this2.max = 0; } _this2.bias = layer.bias || defaultEle.bias; _this2.scale = (layer.scale || defaultEle.scale) * scaleFactor; _this2.mode = layer.mode || defaultEle.mode; _this2.zmin = layer.zmin || defaultEle.zmin; _this2.zmax = layer.zmax || defaultEle.zmax; return _this2; } (0, _createClass2["default"])(RasterElevationTile, [{ key: "initFromParent", value: function initFromParent(parent, extents) { (0, _get2["default"])((0, _getPrototypeOf2["default"])(RasterElevationTile.prototype), "initFromParent", this).call(this, parent, extents); this.updateMinMaxElevation(); } }, { key: "setTextures", value: function setTextures(textures, offsetScales) { this.replaceNoDataValueFromTexture(textures[0]); (0, _get2["default"])((0, _getPrototypeOf2["default"])(RasterElevationTile.prototype), "setTextures", this).call(this, textures, offsetScales); this.updateMinMaxElevation(); } }, { key: "updateMinMaxElevation", value: function updateMinMaxElevation() { if (this.textures[0] && !this.layer.useColorTextureElevation) { var _computeMinMaxElevati = (0, _XbilParser.computeMinMaxElevation)(this.textures[0], this.offsetScales[0], this.layer.noDataValue), min = _computeMinMaxElevati.min, max = _computeMinMaxElevati.max; if (this.min != min || this.max != max) { this.min = min; this.max = max; this.dispatchEvent({ type: 'updatedElevation', node: this }); } } } }, { key: "replaceNoDataValueFromTexture", value: function replaceNoDataValueFromTexture(texture) { var nodatavalue = this.layer.noDataValue; if (nodatavalue == undefined) { return; } // replace no datat value with parent texture value. var parentTexture = this.textures[0]; var parentDataElevation = parentTexture && parentTexture.image && parentTexture.image.data; var dataElevation = texture.image && texture.image.data; if (dataElevation && parentDataElevation && !(0, _XbilParser.checkNodeElevationTextureValidity)(dataElevation, nodatavalue)) { texture.extent.offsetToParent(parentTexture.extent, pitch); (0, _XbilParser.insertSignificantValuesFromParent)(dataElevation, parentDataElevation, nodatavalue, pitch); } } }]); return RasterElevationTile; }(RasterTile); exports.RasterElevationTile = RasterElevationTile;