diff --git a/_deploy/public/mapray-js/v0.8.6/mapray.js b/_deploy/public/mapray-js/v0.8.6/mapray.js new file mode 100644 index 00000000..570bb008 --- /dev/null +++ b/_deploy/public/mapray-js/v0.8.6/mapray.js @@ -0,0 +1,55336 @@ +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : +typeof define === 'function' && define.amd ? define(factory) : +(global = global || self, global.mapray = factory()); +}(this, (function () { 'use strict'; + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +var check = function (it) { + return it && it.Math == Math && it; +}; // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + + +var global_1 = // eslint-disable-next-line no-undef +check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || check(typeof self == 'object' && self) || check(typeof commonjsGlobal == 'object' && commonjsGlobal) || // eslint-disable-next-line no-new-func +Function('return this')(); + +var fails = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + +var descriptors = !fails(function () { + return Object.defineProperty({}, 1, { + get: function () { + return 7; + } + })[1] != 7; +}); + +var isObject = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + +var document$1 = global_1.document; // typeof document.createElement is 'object' in old IE + +var EXISTS = isObject(document$1) && isObject(document$1.createElement); + +var documentCreateElement = function (it) { + return EXISTS ? document$1.createElement(it) : {}; +}; + +var ie8DomDefine = !descriptors && !fails(function () { + return Object.defineProperty(documentCreateElement('div'), 'a', { + get: function () { + return 7; + } + }).a != 7; +}); + +var anObject = function (it) { + if (!isObject(it)) { + throw TypeError(String(it) + ' is not an object'); + } + + return it; +}; + +// https://tc39.github.io/ecma262/#sec-toprimitive +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string + +var toPrimitive = function (input, PREFERRED_STRING) { + if (!isObject(input)) return input; + var fn, val; + if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; + if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val; + if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + +var nativeDefineProperty = Object.defineProperty; // `Object.defineProperty` method +// https://tc39.github.io/ecma262/#sec-object.defineproperty + +var f = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (ie8DomDefine) try { + return nativeDefineProperty(O, P, Attributes); + } catch (error) { + /* empty */ + } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; +var objectDefineProperty = { + f: f +}; + +var createPropertyDescriptor = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +var createNonEnumerableProperty = descriptors ? function (object, key, value) { + return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +var hasOwnProperty = {}.hasOwnProperty; + +var has = function (it, key) { + return hasOwnProperty.call(it, key); +}; + +var setGlobal = function (key, value) { + try { + createNonEnumerableProperty(global_1, key, value); + } catch (error) { + global_1[key] = value; + } + + return value; +}; + +var SHARED = '__core-js_shared__'; +var store = global_1[SHARED] || setGlobal(SHARED, {}); +var sharedStore = store; + +var functionToString = Function.toString; // this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper + +if (typeof sharedStore.inspectSource != 'function') { + sharedStore.inspectSource = function (it) { + return functionToString.call(it); + }; +} + +var inspectSource = sharedStore.inspectSource; + +var WeakMap = global_1.WeakMap; +var nativeWeakMap = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap)); + +var isPure = false; + +var shared = createCommonjsModule(function (module) { + (module.exports = function (key, value) { + return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {}); + })('versions', []).push({ + version: '3.6.4', + mode: 'global', + copyright: '© 2020 Denis Pushkarev (zloirock.ru)' + }); +}); + +var id = 0; +var postfix = Math.random(); + +var uid = function (key) { + return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36); +}; + +var keys = shared('keys'); + +var sharedKey = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +var hiddenKeys = {}; + +var WeakMap$1 = global_1.WeakMap; +var set, get, has$1; + +var enforce = function (it) { + return has$1(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } + + return state; + }; +}; + +if (nativeWeakMap) { + var store$1 = new WeakMap$1(); + var wmget = store$1.get; + var wmhas = store$1.has; + var wmset = store$1.set; + + set = function (it, metadata) { + wmset.call(store$1, it, metadata); + return metadata; + }; + + get = function (it) { + return wmget.call(store$1, it) || {}; + }; + + has$1 = function (it) { + return wmhas.call(store$1, it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + + set = function (it, metadata) { + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + + get = function (it) { + return has(it, STATE) ? it[STATE] : {}; + }; + + has$1 = function (it) { + return has(it, STATE); + }; +} + +var internalState = { + set: set, + get: get, + has: has$1, + enforce: enforce, + getterFor: getterFor +}; + +var redefine = createCommonjsModule(function (module) { + var getInternalState = internalState.get; + var enforceInternalState = internalState.enforce; + var TEMPLATE = String(String).split('String'); + (module.exports = function (O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + + if (typeof value == 'function') { + if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key); + enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : ''); + } + + if (O === global_1) { + if (simple) O[key] = value;else setGlobal(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + + if (simple) O[key] = value;else createNonEnumerableProperty(O, key, value); // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative + })(Function.prototype, 'toString', function toString() { + return typeof this == 'function' && getInternalState(this).source || inspectSource(this); + }); +}); + +var DatePrototype = Date.prototype; +var INVALID_DATE = 'Invalid Date'; +var TO_STRING = 'toString'; +var nativeDateToString = DatePrototype[TO_STRING]; +var getTime = DatePrototype.getTime; // `Date.prototype.toString` method +// https://tc39.github.io/ecma262/#sec-date.prototype.tostring + +if (new Date(NaN) + '' != INVALID_DATE) { + redefine(DatePrototype, TO_STRING, function toString() { + var value = getTime.call(this); // eslint-disable-next-line no-self-compare + + return value === value ? nativeDateToString.call(this) : INVALID_DATE; + }); +} + +var nativePropertyIsEnumerable = {}.propertyIsEnumerable; +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // Nashorn ~ JDK8 bug + +var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ + 1: 2 +}, 1); // `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable + +var f$1 = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : nativePropertyIsEnumerable; +var objectPropertyIsEnumerable = { + f: f$1 +}; + +var toString = {}.toString; + +var classofRaw = function (it) { + return toString.call(it).slice(8, -1); +}; + +var split = ''.split; // fallback for non-array-like ES3 and non-enumerable old V8 strings + +var indexedObject = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins + return !Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classofRaw(it) == 'String' ? split.call(it, '') : Object(it); +} : Object; + +// `RequireObjectCoercible` abstract operation +// https://tc39.github.io/ecma262/#sec-requireobjectcoercible +var requireObjectCoercible = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + +var toIndexedObject = function (it) { + return indexedObject(requireObjectCoercible(it)); +}; + +var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // `Object.getOwnPropertyDescriptor` method +// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor + +var f$2 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPrimitive(P, true); + if (ie8DomDefine) try { + return nativeGetOwnPropertyDescriptor(O, P); + } catch (error) { + /* empty */ + } + if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]); +}; +var objectGetOwnPropertyDescriptor = { + f: f$2 +}; + +var path = global_1; + +var aFunction = function (variable) { + return typeof variable == 'function' ? variable : undefined; +}; + +var getBuiltIn = function (namespace, method) { + return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace]) : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method]; +}; + +var ceil = Math.ceil; +var floor = Math.floor; // `ToInteger` abstract operation +// https://tc39.github.io/ecma262/#sec-tointeger + +var toInteger = function (argument) { + return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); +}; + +var min = Math.min; // `ToLength` abstract operation +// https://tc39.github.io/ecma262/#sec-tolength + +var toLength = function (argument) { + return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + +var max = Math.max; +var min$1 = Math.min; // Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). + +var toAbsoluteIndex = function (index, length) { + var integer = toInteger(index); + return integer < 0 ? max(integer + length, 0) : min$1(integer, length); +}; + +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; // eslint-disable-next-line no-self-compare + + if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not + } else for (; length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } + return !IS_INCLUDES && -1; + }; +}; + +var arrayIncludes = { + // `Array.prototype.includes` method + // https://tc39.github.io/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.github.io/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + +var indexOf = arrayIncludes.indexOf; + +var objectKeysInternal = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + + for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); // Don't enum bug & hidden keys + + + while (names.length > i) if (has(O, key = names[i++])) { + ~indexOf(result, key) || result.push(key); + } + + return result; +}; + +// IE8- don't enum bug keys +var enumBugKeys = ['constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf']; + +var hiddenKeys$1 = enumBugKeys.concat('length', 'prototype'); // `Object.getOwnPropertyNames` method +// https://tc39.github.io/ecma262/#sec-object.getownpropertynames + +var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return objectKeysInternal(O, hiddenKeys$1); +}; + +var objectGetOwnPropertyNames = { + f: f$3 +}; + +var f$4 = Object.getOwnPropertySymbols; +var objectGetOwnPropertySymbols = { + f: f$4 +}; + +var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = objectGetOwnPropertyNames.f(anObject(it)); + var getOwnPropertySymbols = objectGetOwnPropertySymbols.f; + return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; +}; + +var copyConstructorProperties = function (target, source) { + var keys = ownKeys(source); + var defineProperty = objectDefineProperty.f; + var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f; + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } +}; + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true : value == NATIVE ? false : typeof detection == 'function' ? fails(detection) : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; +var isForced_1 = isForced; + +var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f; +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target +*/ + +var _export = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + + if (GLOBAL) { + target = global_1; + } else if (STATIC) { + target = global_1[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global_1[TARGET] || {}).prototype; + } + + if (target) for (key in source) { + sourceProperty = source[key]; + + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor$1(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + + FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); // contained in target + + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty === typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } // add a flag to not completely full polyfills + + + if (options.sham || targetProperty && targetProperty.sham) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } // extend global + + + redefine(target, key, sourceProperty, options); + } +}; + +var log = Math.log; +var LN2 = Math.LN2; // `Math.log2` method +// https://tc39.github.io/ecma262/#sec-math.log2 + +_export({ + target: 'Math', + stat: true +}, { + log2: function log2(x) { + return log(x) / LN2; + } +}); + +var defineProperty = objectDefineProperty.f; +var FunctionPrototype = Function.prototype; +var FunctionPrototypeToString = FunctionPrototype.toString; +var nameRE = /^\s*function ([^ (]*)/; +var NAME = 'name'; // Function instances `.name` property +// https://tc39.github.io/ecma262/#sec-function-instances-name + +if (descriptors && !(NAME in FunctionPrototype)) { + defineProperty(FunctionPrototype, NAME, { + configurable: true, + get: function () { + try { + return FunctionPrototypeToString.call(this).match(nameRE)[1]; + } catch (error) { + return ''; + } + } + }); +} + +function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + + _next(undefined); + }); + }; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +function isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); + return true; + } catch (e) { + return false; + } +} + +function _construct(Parent, args, Class) { + if (isNativeReflectConstruct()) { + _construct = Reflect.construct; + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); +} + +function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; +} + +function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + + _cache.set(Class, Wrapper); + } + + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + + return _wrapNativeSuper(Class); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } + + return _assertThisInitialized(self); +} + +function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + + return object; +} + +function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + + if (desc.get) { + return desc.get.call(receiver); + } + + return desc.value; + }; + } + + return _get(target, property, receiver || target); +} + +function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); +} + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } +} + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); +} + +function _iterableToArrayLimit(arr, i) { + if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { + return; + } + + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); +} + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); +} + +/** + * @summary アニメーション共通のエラー + * + * @memberof mapray.animation + * @extends Error + * + * @see {@link mapray.animation.Binder} + */ +var AnimationError = +/*#__PURE__*/ +function (_Error) { + _inherits(AnimationError, _Error); + + /** + * @param {string} message エラーの説明 + */ + function AnimationError(message) { + var _this; + + _classCallCheck(this, AnimationError); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(AnimationError).call(this, message)); + _this.name = "mapray.animation.AnimationError"; + return _this; + } + + return AnimationError; +}(_wrapNativeSuper(Error)); + +var aPossiblePrototype = function (it) { + if (!isObject(it) && it !== null) { + throw TypeError("Can't set " + String(it) + ' as a prototype'); + } + + return it; +}; + +// https://tc39.github.io/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. + +/* eslint-disable no-proto */ + +var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + + try { + setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; + setter.call(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { + /* empty */ + } + + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter.call(O, proto);else O.__proto__ = proto; + return O; + }; +}() : undefined); + +var inheritIfRequired = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( // it can work only with native `setPrototypeOf` + objectSetPrototypeOf && // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + typeof (NewTarget = dummy.constructor) == 'function' && NewTarget !== Wrapper && isObject(NewTargetPrototype = NewTarget.prototype) && NewTargetPrototype !== Wrapper.prototype) objectSetPrototypeOf($this, NewTargetPrototype); + return $this; +}; + +// https://tc39.github.io/ecma262/#sec-object.keys + +var objectKeys = Object.keys || function keys(O) { + return objectKeysInternal(O, enumBugKeys); +}; + +// https://tc39.github.io/ecma262/#sec-object.defineproperties + +var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + + while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]); + + return O; +}; + +var html = getBuiltIn('document', 'documentElement'); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { + /* empty */ +}; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; // Create object with fake `null` prototype: use ActiveX Object with cleared prototype + + +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + + return temp; +}; // Create object with fake `null` prototype: use iframe Object with cleared prototype + + +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); // https://github.com/zloirock/core-js/issues/475 + + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; // Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug + + +var activeXDocument; + +var NullProtoObject = function () { + try { + /* global ActiveXObject */ + activeXDocument = document.domain && new ActiveXObject('htmlfile'); + } catch (error) { + /* ignore */ + } + + NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame(); + var length = enumBugKeys.length; + + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; // `Object.create` method +// https://tc39.github.io/ecma262/#sec-object.create + +var objectCreate = Object.create || function create(O, Properties) { + var result; + + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill + + result[IE_PROTO] = O; + } else result = NullProtoObject(); + + return Properties === undefined ? result : objectDefineProperties(result, Properties); +}; + +// a string of all valid unicode whitespaces +// eslint-disable-next-line max-len +var whitespaces = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + +var whitespace = '[' + whitespaces + ']'; +var ltrim = RegExp('^' + whitespace + whitespace + '*'); +var rtrim = RegExp(whitespace + whitespace + '*$'); // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation + +var createMethod$1 = function (TYPE) { + return function ($this) { + var string = String(requireObjectCoercible($this)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; + }; +}; + +var stringTrim = { + // `String.prototype.{ trimLeft, trimStart }` methods + // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart + start: createMethod$1(1), + // `String.prototype.{ trimRight, trimEnd }` methods + // https://tc39.github.io/ecma262/#sec-string.prototype.trimend + end: createMethod$1(2), + // `String.prototype.trim` method + // https://tc39.github.io/ecma262/#sec-string.prototype.trim + trim: createMethod$1(3) +}; + +var getOwnPropertyNames = objectGetOwnPropertyNames.f; +var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f; +var defineProperty$1 = objectDefineProperty.f; +var trim = stringTrim.trim; +var NUMBER = 'Number'; +var NativeNumber = global_1[NUMBER]; +var NumberPrototype = NativeNumber.prototype; // Opera ~12 has broken Object#toString + +var BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER; // `ToNumber` abstract operation +// https://tc39.github.io/ecma262/#sec-tonumber + +var toNumber = function (argument) { + var it = toPrimitive(argument, false); + var first, third, radix, maxCode, digits, length, index, code; + + if (typeof it == 'string' && it.length > 2) { + it = trim(it); + first = it.charCodeAt(0); + + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: + case 98: + radix = 2; + maxCode = 49; + break; + // fast equal of /^0b[01]+$/i + + case 79: + case 111: + radix = 8; + maxCode = 55; + break; + // fast equal of /^0o[0-7]+$/i + + default: + return +it; + } + + digits = it.slice(2); + length = digits.length; + + for (index = 0; index < length; index++) { + code = digits.charCodeAt(index); // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + + if (code < 48 || code > maxCode) return NaN; + } + + return parseInt(digits, radix); + } + } + + return +it; +}; // `Number` constructor +// https://tc39.github.io/ecma262/#sec-number-constructor + + +if (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) { + var NumberWrapper = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var dummy = this; + return dummy instanceof NumberWrapper // check on 1..constructor(foo) case + && (BROKEN_CLASSOF ? fails(function () { + NumberPrototype.valueOf.call(dummy); + }) : classofRaw(dummy) != NUMBER) ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it); + }; + + for (var keys$1 = descriptors ? getOwnPropertyNames(NativeNumber) : ( // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES2015 (in case, if modules with ES2015 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j = 0, key; keys$1.length > j; j++) { + if (has(NativeNumber, key = keys$1[j]) && !has(NumberWrapper, key)) { + defineProperty$1(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key)); + } + } + + NumberWrapper.prototype = NumberPrototype; + NumberPrototype.constructor = NumberWrapper; + redefine(global_1, NUMBER, NumberWrapper); +} + +/** + * @summary アニメーション時刻 + * + * @classdesc + *

アニメーションの時刻を表現するクラスである。

+ *

このクラスのインスタンスはイミュータブルである。

+ * + * @memberof mapray.animation + * @hideconstructor + */ +var Time = +/*#__PURE__*/ +function () { + /** + * 非公開の構築子 + * + * @param {number} ntime 数値時刻 + */ + function Time(ntime) { + _classCallCheck(this, Time); + + this._ntime = ntime; + } + /** + * @summary 表現可能な最初の時刻 + * + * @type {mapray.animation.Time} + * @readonly + */ + + + _createClass(Time, [{ + key: "toNumber", + + /** + * @summary 時刻を数値に変換 + * + * @desc + *

this の時刻に対応する数値を取得する。

+ * + * @return {number} 時刻に対応する数値 + */ + value: function toNumber() { + return this._ntime; + } + /** @summary 時刻の比較 (==) + * + * @desc + *

this の時刻と rhs の時刻が同じとき true, それ以外のとき false を返す。

+ * + * @param {mapray.animation.Time} rhs 時刻 + * + * @return {boolean} 比較結果 + */ + + }, { + key: "equals", + value: function equals(rhs) { + return this._ntime == rhs._ntime; + } + /** @summary 時刻の比較 (<) + * + * @desc + *

this の時刻が rhs の時刻より前のとき true, それ以外のとき false を返す。

+ * + * @param {mapray.animation.Time} rhs 時刻 + * + * @return {boolean} 比較結果 + */ + + }, { + key: "lessThan", + value: function lessThan(rhs) { + return this._ntime < rhs._ntime; + } + /** @summary 時刻の比較 (<=) + * + * @desc + *

this の時刻が rhs の時刻より前または同じとき true, それ以外のとき false を返す。

+ * + * @param {mapray.animation.Time} rhs 時刻 + * + * @return {boolean} 比較結果 + */ + + }, { + key: "lessEqual", + value: function lessEqual(rhs) { + return this._ntime <= rhs._ntime; + } + }], [{ + key: "fromNumber", + + /** + * @summary 数値を時刻に変換 + * + * @desc + *

時刻に対応する数値から Time インスタンスを生成する。

+ *

条件: Time.MIN_NTIME <= ntime <= Time.MAX_NTIME

+ * + * @param {number} ntime 時刻に対応する数値 + * + * @return {mapray.animation.Time} Time インスタンス + */ + value: function fromNumber(ntime) { + return new Time(ntime); + } + }, { + key: "MIN_TIME", + get: function get() { + return TIME_MIN_TIME; + } + /** + * @summary 表現可能な最後の時刻 + * + * @type {mapray.animation.Time} + * @readonly + */ + + }, { + key: "MAX_TIME", + get: function get() { + return TIME_MAX_TIME; + } + /** + * @summary 時刻に対応する数値の最小値 + * + * @type {number} + * @readonly + */ + + }, { + key: "MIN_NTIME", + get: function get() { + return TIME_MIN_NTIME; + } + /** + * @summary 時刻に対応する数値の最大値 + * + * @type {number} + * @readonly + */ + + }, { + key: "MAX_NTIME", + get: function get() { + return TIME_MAX_NTIME; + } + }]); + + return Time; +}(); + +var TIME_MIN_NTIME = -Number.MAX_VALUE; +var TIME_MAX_NTIME = +Number.MAX_VALUE; +var TIME_MIN_TIME = Time.fromNumber(TIME_MIN_NTIME); +var TIME_MAX_TIME = Time.fromNumber(TIME_MAX_NTIME); + +/** + * @summary アニメーション時刻の区間 + * + * @classdesc + *

アニメーション時刻の区間を表現するクラスである。

+ *

このクラスのインスタンスはイミュータブルである。

+ * + * @memberof mapray.animation + */ + +var Interval = +/*#__PURE__*/ +function () { + /** + * @desc + *

下限 lower と上限 upper の時刻区間を生成する。

+ *

端点である lower と upper が区間に含まれるかどうかは l_open と u_open により指定する。

+ * + *
+   *  interval       | l_open  u_open
+   * ----------------+----------------
+   *  [lower, upper] | false   false
+   *  [lower, upper) | false   true
+   *  (lower, upper] | true    false
+   *  (lower, upper) | true    true
+   * 
+ * + * @param {mapray.animation.Time} lower 区間の下限時刻 + * @param {mapray.animation.Time} upper 区間の上限時刻 + * @param {boolean} [l_open=false] lower が区間にが含まれるとき false, 含まれないとき true + * @param {boolean} [u_open=false] upper が区間にが含まれるとき false, 含まれないとき true + */ + function Interval(lower, upper, l_open, u_open) { + _classCallCheck(this, Interval); + + this._lower = lower; + this._upper = upper; + this._l_open = l_open === undefined ? false : l_open; + this._u_open = u_open === undefined ? false : u_open; + } + /** + * @summary 全時刻区間 + * + * @type {mapray.animation.Interval} + * @readonly + */ + + + _createClass(Interval, [{ + key: "isEmpty", + + /** + * @summary 空時刻区間か? + * + * @desc + *

this が空の時刻区間かどうかを返す。

+ *

空時刻区間の場合、区間内に 1 つも時刻が存在しない。

+ * + * @return {boolean} 空時刻区間のとき true, それ以外のとき false + */ + value: function isEmpty() { + var lower = this._lower; + var upper = this._upper; + return upper.lessThan(lower) || upper.equals(lower) && (this._l_open || this._u_open); + } + /** + * @summary 単一時刻区間か? + * + * @desc + *

this が単一時刻の時刻区間かどうかを返す。

+ *

単一時刻区間の場合、区間内にただ 1 つの時刻が存在する。

+ *

単一時刻区間であるなら lower == upper であり、逆は必ずしも成り立たない。

+ * + * @return {boolean} 単一時刻区間のとき true, それ以外のとき false + */ + + }, { + key: "isSingle", + value: function isSingle() { + return this._lower.equals(this._upper) && !(this._l_open || this._u_open); + } + /** + * @summary 通常時刻区間か? + * + * @desc + *

this が通常の時刻区間かどうかを返す。

+ *

通常時刻区間の場合、区間内に無限個の時刻が存在する。

+ *

通常時刻区間であるなら lower < upper であり、逆も成り立つ。

+ * + * @return {boolean} 通常時刻区間のとき true, それ以外のとき false + */ + + }, { + key: "isProper", + value: function isProper() { + return this._lower.lessThan(this._upper); + } + /** + * @summary 先行しているか? + * + * @desc + *

this のすべての時刻が rhs のすべての時刻より先行しているときに true, それ以外のときは false を返す。

+ *

this または rhs のどちらか、または両方が空時刻区間のときは true を返す。

+ * + * @param {mapray.animation.Interval} rhs 時刻区間 + * + * @return {boolean} this が rhs に先行しているとき true, それ以外のとき false + */ + + }, { + key: "precedes", + value: function precedes(rhs) { + if (this.isEmpty() || rhs.isEmpty()) { + // this または rhs のどちらか、または両方が空時刻区間のときの仕様 + return true; + } else { + var ut1 = this._upper; + var uo1 = this._u_open; + var lt2 = rhs._lower; + var lo2 = rhs._l_open; + return ut1.lessThan(lt2) || ut1.equals(lt2) && (uo1 || lo2); + } + } + /** + * @summary 包含しているか? + * + * @desc + *

rhs のすべての時刻が this に含まれるとき true, それ以外のときは false を返す。

+ *

rhs が空時刻区間のときは true を返す。

+ *

これは rhs ⊆ this と等価である。

+ * + * @param {mapray.animation.Interval} rhs 時刻区間 + * + * @return {boolean} this が rhs を包含しているとき true, それ以外のとき false + */ + + }, { + key: "includes", + value: function includes(rhs) { + if (rhs.isEmpty()) { + // rhs が空時刻区間のときの仕様 + return true; + } else { + var lt1 = this._lower; + var lt2 = rhs._lower; + var lo1 = this._l_open; + var lo2 = rhs._l_open; + var inc_l = lt1.lessThan(lt2) || lt1.equals(lt2) && (!lo1 || lo2); + var ut1 = this._upper; + var ut2 = rhs._upper; + var uo1 = this._u_open; + var uo2 = rhs._u_open; + var inc_u = ut2.lessThan(ut1) || ut2.equals(ut1) && (uo2 || !uo1); + return inc_l && inc_u; + } + } + /** + * @summary 時刻を包含しているか? + * + * @desc + *

rhs の時刻が this に含まれるとき true, それ以外のときは false を返す。

+ *

このメソッドは this.includes( new Interval( rhs, rhs ) ) と同等である。

+ * + * @param {mapray.animation.Time} rhs 時刻 + * + * @return {boolean} this が rhs を包含しているとき true, それ以外のとき false + */ + + }, { + key: "includesTime", + value: function includesTime(rhs) { + var lower = this._lower; + var inc_l = lower.lessThan(rhs) || lower.equals(rhs) && !this._l_open; + var upper = this._upper; + var inc_u = rhs.lessThan(upper) || rhs.equals(upper) && !this._u_open; + return inc_l && inc_u; + } + /** + * @summary 共通時刻区間は存在するか? + * + * @desc + *

!this.getIntersection( rhs ).isEmpty() と同じである。

+ * + * @param {mapray.animation.Interval} rhs 時刻区間 + * + * @return {boolean} 共通時刻区間 + * + * @see {@link mapray.animation.Interval#getIntersection} + */ + + }, { + key: "hasIntersection", + value: function hasIntersection(rhs) { + // todo: オブジェクトを生成しないように最適化 + return !this.getIntersection(rhs).isEmpty(); + } + /** + * @summary 先行時刻区間を取得 + * + * @desc + *

this のすべての時刻に対して、先の時刻となるすべての時刻を含む先行時刻区間を返す。

+ *

this が空時刻区間のときは全時刻区間を返し、this + * に表現可能な最初の時刻が含まれるときは空時刻区間を返す。

+ *

this.getPrecedings().precedes( this ) は常に true を返す。

+ * + * @return {mapray.animation.Interval} 先行時刻区間 + */ + + }, { + key: "getPrecedings", + value: function getPrecedings() { + if (this.isEmpty()) { + // 空時刻区間のときは全時刻区間を返す仕様 + return INTERVAL_UNIVERSAL; + } else { + return new Interval(Time.MIN_TIME, this._lower, false, !this._l_open); + } + } + /** + * @summary 後続時刻区間を取得 + * + * @desc + *

this のすべての時刻に対して、後の時刻となるすべての時刻を含む後続時刻区間を返す。

+ *

this が空時刻区間のときは全時刻区間を返し、this + * に表現可能な最後の時刻が含まれるときは空時刻区間を返す。

+ *

this.precedes( this.getFollowings() ) は常に true を返す。

+ * + * @return {mapray.animation.Interval} 後続時刻区間 + */ + + }, { + key: "getFollowings", + value: function getFollowings() { + if (this.isEmpty()) { + // 空時刻区間のときは全時刻区間を返す仕様 + return INTERVAL_UNIVERSAL; + } else { + return new Interval(this._upper, Time.MAX_TIME, !this._u_open, false); + } + } + /** + * @summary 共通時刻区間を取得 + * + * @desc + *

this と rhs の共通時刻区間 (this ∩ rhs) を返す。

+ *

this と rhs に共通の時刻が存在しなければ空時刻区間を返す。

+ * + * @param {mapray.animation.Interval} rhs 時刻区間 + * + * @return {mapray.animation.Interval} 共通時刻区間 + * + * @see {@link mapray.animation.Interval#hasIntersection} + */ + + }, { + key: "getIntersection", + value: function getIntersection(rhs) { + // B = Lb ∩ Ub とするとき + // A ∩ B = A ∩ Lb ∩ Ub + // A ∩ Lb + var cross = this._getIntersectionByLower(rhs._lower, rhs._l_open); // (A ∩ Lb) ∩ Ub + + + return cross._getIntersectionByUpper(rhs._upper, rhs._u_open); + } + /** + * @summary 合併時刻区間を取得 + * + * @desc + *

this と rhs を合併した時刻集合 (this ∪ rhs) を時刻区間の配列として返す。

+ *

0 から 2 個の時刻区間を含む配列を返す。配列の要素に空時刻区間は含まれない。

+ *

2 要素の配列 v が返されたとき、v[0] と v[1] の間に時刻が存在し、さらに + * v[0].precedes( v[1] ) は true となる。

+ * + * @param {mapray.animation.Interval} rhs 時刻区間 + * + * @return {mapray.animation.Interval[]} 合併時刻区間 + */ + + }, { + key: "getUnion", + value: function getUnion(rhs) { + if (this.isEmpty()) { + return rhs.isEmpty() ? [] : [rhs]; + } else if (rhs.isEmpty()) { + // Assert: !this.isEmpty() && rhs.isEmpty() + return [this]; + } // Assert: !this.isEmpty() && !rhs.isEmpty() + + + var lt1 = this._lower; + var ut1 = this._upper; + var lo1 = this._l_open; + var uo1 = this._u_open; + var lt2 = rhs._lower; + var ut2 = rhs._upper; + var lo2 = rhs._l_open; + var uo2 = rhs._u_open; + + if (ut1.lessThan(lt2) || ut1.equals(lt2) && uo1 && lo2) { + // Assert: this と rhs は離れている、かつ this が先行 + return [this, rhs]; + } else if (ut2.lessThan(lt1) || lt1.equals(ut2) && lo1 && uo2) { + // Assert: this と rhs は離れている、かつ rhs が先行 + return [rhs, this]; + } // Assert: this と rhs は交差または隣接している (単一の時刻区間に合併できる) + + + var _ref = lt1.lessThan(lt2) || lt1.equals(lt2) && lo2 ? [lt1, lo1] : [lt2, lo2], + _ref2 = _slicedToArray(_ref, 2), + lower = _ref2[0], + l_open = _ref2[1]; + + var _ref3 = ut2.lessThan(ut1) || ut2.equals(ut1) && uo2 ? [ut1, uo1] : [ut2, uo2], + _ref4 = _slicedToArray(_ref3, 2), + upper = _ref4[0], + u_open = _ref4[1]; + + return [new Interval(lower, upper, l_open, u_open)]; + } + /** + * @summary 時刻区間の差を取得 + * + * @desc + *

this から rhs を差し引いた時刻集合 (this - rhs) を時刻区間の配列として返す。

+ *

0 から 2 個の時刻区間を含む配列を返す。配列の要素に空時刻区間は含まれない。

+ *

2 要素の配列 v が返されたとき、v[0] と v[1] の間に時刻が存在し、さらに + * v[0].precedes( v[1] ) は true となる。

+ * + * @param {mapray.animation.Interval} rhs 時刻区間 + * + * @return {mapray.animation.Interval[]} 時刻区間の差 + */ + + }, { + key: "getDifference", + value: function getDifference(rhs) { + // B = Lb ∩ Ub とするとき + // A - B = A ∩ ~B + // = (A ∩ ~Lb) ∪ (A ∩ ~Ub) + // A ∩ ~Lb + var i1 = this._getIntersectionByUpper(rhs._lower, !rhs._l_open); // A ∩ ~Ub + + + var i2 = this._getIntersectionByLower(rhs._upper, !rhs._u_open); // (A ∩ ~Lb) ∪ (A ∩ ~Ub) + + + return i1.getUnion(i2); + } + /** + * @summary 補時刻区間を取得 + * + * @desc + *

全時刻区間 から this を差し引いた時刻集合を時刻区間の配列として返す。

+ *

0 から 2 個の時刻区間を含む配列を返す。配列の要素に空時刻区間は含まれない。

+ *

2 要素の配列 v が返されたとき、v[0] と v[1] の間に時刻が存在し、さらに + * v[0].precedes( v[1] ) は true となる。

+ * + * @return {mapray.animation.Interval[]} 補時刻区間 + */ + + }, { + key: "getComplement", + value: function getComplement() { + return INTERVAL_UNIVERSAL.getDifference(this); + } + /** + * @summary 下限時刻区間との共通時刻区間を取得 + * + * @desc + *

this ∩ Lower(bound, open) → Interval

+ * + * @param {mapray.animation.Time} bound + * @param {boolean} open + * + * @return {mapray.animation.Interval} 共通時刻区間 + * + * @private + */ + + }, { + key: "_getIntersectionByLower", + value: function _getIntersectionByLower(bound, open) { + if (bound.lessThan(this._lower) || bound.equals(this._lower) && this._l_open) { + return this; + } else { + return new Interval(bound, this._upper, open, this._u_open); + } + } + /** + * @summary 上限時刻区間との共通時刻区間を取得 + * + * @desc + *

this ∩ Upper(bound, open) → Interval

+ * + * @param {mapray.animation.Time} bound + * @param {boolean} open + * + * @return {mapray.animation.Interval} 共通時刻区間 + * + * @private + */ + + }, { + key: "_getIntersectionByUpper", + value: function _getIntersectionByUpper(bound, open) { + if (this._upper.lessThan(bound) || this._upper.equals(bound) && this._u_open) { + return this; + } else { + return new Interval(this._lower, bound, this._l_open, open); + } + } + }, { + key: "lower", + + /** + * @summary 下限時刻 + * + * @type {mapray.animation.Time} + * @readonly + */ + get: function get() { + return this._lower; + } + /** + * @summary 上限時刻 + * + * @type {mapray.animation.Time} + * @readonly + */ + + }, { + key: "upper", + get: function get() { + return this._upper; + } + /** + * @summary 下限時刻は除外されるか? + * + * @type {boolean} + * @readonly + */ + + }, { + key: "l_open", + get: function get() { + return this._l_open; + } + /** + * @summary 上限時刻は除外されるか? + * + * @type {boolean} + * @readonly + */ + + }, { + key: "u_open", + get: function get() { + return this._u_open; + } + }], [{ + key: "UNIVERSAL", + get: function get() { + return INTERVAL_UNIVERSAL; + } + }]); + + return Interval; +}(); + +var INTERVAL_UNIVERSAL = new Interval(Time.MIN_TIME, Time.MAX_TIME); + +var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () { + // Chrome 38 Symbol has incorrect toString conversion + // eslint-disable-next-line no-undef + return !String(Symbol()); +}); + +var useSymbolAsUid = nativeSymbol // eslint-disable-next-line no-undef +&& !Symbol.sham // eslint-disable-next-line no-undef +&& typeof Symbol.iterator == 'symbol'; + +// https://tc39.github.io/ecma262/#sec-isarray + +var isArray = Array.isArray || function isArray(arg) { + return classofRaw(arg) == 'Array'; +}; + +// https://tc39.github.io/ecma262/#sec-toobject + +var toObject = function (argument) { + return Object(requireObjectCoercible(argument)); +}; + +var nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f; +var toString$1 = {}.toString; +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return nativeGetOwnPropertyNames(it); + } catch (error) { + return windowNames.slice(); + } +}; // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + + +var f$5 = function getOwnPropertyNames(it) { + return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : nativeGetOwnPropertyNames(toIndexedObject(it)); +}; + +var objectGetOwnPropertyNamesExternal = { + f: f$5 +}; + +var WellKnownSymbolsStore = shared('wks'); +var Symbol$1 = global_1.Symbol; +var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid; + +var wellKnownSymbol = function (name) { + if (!has(WellKnownSymbolsStore, name)) { + if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name); + } + + return WellKnownSymbolsStore[name]; +}; + +var f$6 = wellKnownSymbol; +var wellKnownSymbolWrapped = { + f: f$6 +}; + +var defineProperty$2 = objectDefineProperty.f; + +var defineWellKnownSymbol = function (NAME) { + var Symbol = path.Symbol || (path.Symbol = {}); + if (!has(Symbol, NAME)) defineProperty$2(Symbol, NAME, { + value: wellKnownSymbolWrapped.f(NAME) + }); +}; + +var defineProperty$3 = objectDefineProperty.f; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +var setToStringTag = function (it, TAG, STATIC) { + if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { + defineProperty$3(it, TO_STRING_TAG, { + configurable: true, + value: TAG + }); + } +}; + +var aFunction$1 = function (it) { + if (typeof it != 'function') { + throw TypeError(String(it) + ' is not a function'); + } + + return it; +}; + +var functionBindContext = function (fn, that, length) { + aFunction$1(fn); + if (that === undefined) return fn; + + switch (length) { + case 0: + return function () { + return fn.call(that); + }; + + case 1: + return function (a) { + return fn.call(that, a); + }; + + case 2: + return function (a, b) { + return fn.call(that, a, b); + }; + + case 3: + return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + + return function () + /* ...args */ + { + return fn.apply(that, arguments); + }; +}; + +var SPECIES = wellKnownSymbol('species'); // `ArraySpeciesCreate` abstract operation +// https://tc39.github.io/ecma262/#sec-arrayspeciescreate + +var arraySpeciesCreate = function (originalArray, length) { + var C; + + if (isArray(originalArray)) { + C = originalArray.constructor; // cross-realm fallback + + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } + + return new (C === undefined ? Array : C)(length === 0 ? 0 : length); +}; + +var push = [].push; // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation + +var createMethod$2 = function (TYPE) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + return function ($this, callbackfn, that, specificCreate) { + var O = toObject($this); + var self = indexedObject(O); + var boundFunction = functionBindContext(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var create = specificCreate || arraySpeciesCreate; + var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var value, result; + + for (; length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: + return true; + // some + + case 5: + return value; + // find + + case 6: + return index; + // findIndex + + case 2: + push.call(target, value); + // filter + } else if (IS_EVERY) return false; // every + } + } + + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + +var arrayIteration = { + // `Array.prototype.forEach` method + // https://tc39.github.io/ecma262/#sec-array.prototype.foreach + forEach: createMethod$2(0), + // `Array.prototype.map` method + // https://tc39.github.io/ecma262/#sec-array.prototype.map + map: createMethod$2(1), + // `Array.prototype.filter` method + // https://tc39.github.io/ecma262/#sec-array.prototype.filter + filter: createMethod$2(2), + // `Array.prototype.some` method + // https://tc39.github.io/ecma262/#sec-array.prototype.some + some: createMethod$2(3), + // `Array.prototype.every` method + // https://tc39.github.io/ecma262/#sec-array.prototype.every + every: createMethod$2(4), + // `Array.prototype.find` method + // https://tc39.github.io/ecma262/#sec-array.prototype.find + find: createMethod$2(5), + // `Array.prototype.findIndex` method + // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex + findIndex: createMethod$2(6) +}; + +var $forEach = arrayIteration.forEach; +var HIDDEN = sharedKey('hidden'); +var SYMBOL = 'Symbol'; +var PROTOTYPE$1 = 'prototype'; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); +var setInternalState = internalState.set; +var getInternalState = internalState.getterFor(SYMBOL); +var ObjectPrototype = Object[PROTOTYPE$1]; +var $Symbol = global_1.Symbol; +var $stringify = getBuiltIn('JSON', 'stringify'); +var nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f; +var nativeDefineProperty$1 = objectDefineProperty.f; +var nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f; +var nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f; +var AllSymbols = shared('symbols'); +var ObjectPrototypeSymbols = shared('op-symbols'); +var StringToSymbolRegistry = shared('string-to-symbol-registry'); +var SymbolToStringRegistry = shared('symbol-to-string-registry'); +var WellKnownSymbolsStore$1 = shared('wks'); +var QObject = global_1.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 + +var USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 + +var setSymbolDescriptor = descriptors && fails(function () { + return objectCreate(nativeDefineProperty$1({}, 'a', { + get: function () { + return nativeDefineProperty$1(this, 'a', { + value: 7 + }).a; + } + })).a != 7; +}) ? function (O, P, Attributes) { + var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P); + if (ObjectPrototypeDescriptor) delete ObjectPrototype[P]; + nativeDefineProperty$1(O, P, Attributes); + + if (ObjectPrototypeDescriptor && O !== ObjectPrototype) { + nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor); + } +} : nativeDefineProperty$1; + +var wrap = function (tag, description) { + var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]); + setInternalState(symbol, { + type: SYMBOL, + tag: tag, + description: description + }); + if (!descriptors) symbol.description = description; + return symbol; +}; + +var isSymbol = useSymbolAsUid ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return Object(it) instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(O, P, Attributes) { + if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes); + anObject(O); + var key = toPrimitive(P, true); + anObject(Attributes); + + if (has(AllSymbols, key)) { + if (!Attributes.enumerable) { + if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {})); + O[HIDDEN][key] = true; + } else { + if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; + Attributes = objectCreate(Attributes, { + enumerable: createPropertyDescriptor(0, false) + }); + } + + return setSymbolDescriptor(O, key, Attributes); + } + + return nativeDefineProperty$1(O, key, Attributes); +}; + +var $defineProperties = function defineProperties(O, Properties) { + anObject(O); + var properties = toIndexedObject(Properties); + var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties)); + $forEach(keys, function (key) { + if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]); + }); + return O; +}; + +var $create = function create(O, Properties) { + return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties); +}; + +var $propertyIsEnumerable = function propertyIsEnumerable(V) { + var P = toPrimitive(V, true); + var enumerable = nativePropertyIsEnumerable$1.call(this, P); + if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false; + return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true; +}; + +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { + var it = toIndexedObject(O); + var key = toPrimitive(P, true); + if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return; + var descriptor = nativeGetOwnPropertyDescriptor$1(it, key); + + if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) { + descriptor.enumerable = true; + } + + return descriptor; +}; + +var $getOwnPropertyNames = function getOwnPropertyNames(O) { + var names = nativeGetOwnPropertyNames$1(toIndexedObject(O)); + var result = []; + $forEach(names, function (key) { + if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key); + }); + return result; +}; + +var $getOwnPropertySymbols = function getOwnPropertySymbols(O) { + var IS_OBJECT_PROTOTYPE = O === ObjectPrototype; + var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O)); + var result = []; + $forEach(names, function (key) { + if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) { + result.push(AllSymbols[key]); + } + }); + return result; +}; // `Symbol` constructor +// https://tc39.github.io/ecma262/#sec-symbol-constructor + + +if (!nativeSymbol) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor'); + var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]); + var tag = uid(description); + + var setter = function (value) { + if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value); + if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value)); + }; + + if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { + configurable: true, + set: setter + }); + return wrap(tag, description); + }; + + redefine($Symbol[PROTOTYPE$1], 'toString', function toString() { + return getInternalState(this).tag; + }); + redefine($Symbol, 'withoutSetter', function (description) { + return wrap(uid(description), description); + }); + objectPropertyIsEnumerable.f = $propertyIsEnumerable; + objectDefineProperty.f = $defineProperty; + objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor; + objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames; + objectGetOwnPropertySymbols.f = $getOwnPropertySymbols; + + wellKnownSymbolWrapped.f = function (name) { + return wrap(wellKnownSymbol(name), name); + }; + + if (descriptors) { + // https://github.com/tc39/proposal-Symbol-description + nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', { + configurable: true, + get: function description() { + return getInternalState(this).description; + } + }); + + { + redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { + unsafe: true + }); + } + } +} + +_export({ + global: true, + wrap: true, + forced: !nativeSymbol, + sham: !nativeSymbol +}, { + Symbol: $Symbol +}); +$forEach(objectKeys(WellKnownSymbolsStore$1), function (name) { + defineWellKnownSymbol(name); +}); +_export({ + target: SYMBOL, + stat: true, + forced: !nativeSymbol +}, { + // `Symbol.for` method + // https://tc39.github.io/ecma262/#sec-symbol.for + 'for': function (key) { + var string = String(key); + if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; + var symbol = $Symbol(string); + StringToSymbolRegistry[string] = symbol; + SymbolToStringRegistry[symbol] = string; + return symbol; + }, + // `Symbol.keyFor` method + // https://tc39.github.io/ecma262/#sec-symbol.keyfor + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol'); + if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; + }, + useSetter: function () { + USE_SETTER = true; + }, + useSimple: function () { + USE_SETTER = false; + } +}); +_export({ + target: 'Object', + stat: true, + forced: !nativeSymbol, + sham: !descriptors +}, { + // `Object.create` method + // https://tc39.github.io/ecma262/#sec-object.create + create: $create, + // `Object.defineProperty` method + // https://tc39.github.io/ecma262/#sec-object.defineproperty + defineProperty: $defineProperty, + // `Object.defineProperties` method + // https://tc39.github.io/ecma262/#sec-object.defineproperties + defineProperties: $defineProperties, + // `Object.getOwnPropertyDescriptor` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors + getOwnPropertyDescriptor: $getOwnPropertyDescriptor +}); +_export({ + target: 'Object', + stat: true, + forced: !nativeSymbol +}, { + // `Object.getOwnPropertyNames` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertynames + getOwnPropertyNames: $getOwnPropertyNames, + // `Object.getOwnPropertySymbols` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols + getOwnPropertySymbols: $getOwnPropertySymbols +}); // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 + +_export({ + target: 'Object', + stat: true, + forced: fails(function () { + objectGetOwnPropertySymbols.f(1); + }) +}, { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return objectGetOwnPropertySymbols.f(toObject(it)); + } +}); // `JSON.stringify` method behavior with symbols +// https://tc39.github.io/ecma262/#sec-json.stringify + +if ($stringify) { + var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () { + var symbol = $Symbol(); // MS Edge converts symbol values to JSON as {} + + return $stringify([symbol]) != '[null]' // WebKit converts symbol values to JSON as null + || $stringify({ + a: symbol + }) != '{}' // V8 throws on boxed symbols + || $stringify(Object(symbol)) != '{}'; + }); + _export({ + target: 'JSON', + stat: true, + forced: FORCED_JSON_STRINGIFY + }, { + // eslint-disable-next-line no-unused-vars + stringify: function stringify(it, replacer, space) { + var args = [it]; + var index = 1; + var $replacer; + + while (arguments.length > index) args.push(arguments[index++]); + + $replacer = replacer; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + + if (!isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return $stringify.apply(null, args); + } + }); +} // `Symbol.prototype[@@toPrimitive]` method +// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive + + +if (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) { + createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf); +} // `Symbol.prototype[@@toStringTag]` property +// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag + + +setToStringTag($Symbol, SYMBOL); +hiddenKeys[HIDDEN] = true; + +var defineProperty$4 = objectDefineProperty.f; +var NativeSymbol = global_1.Symbol; + +if (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) || // Safari 12 bug +NativeSymbol().description !== undefined)) { + var EmptyStringDescriptionStore = {}; // wrap Symbol constructor for correct work with undefined description + + var SymbolWrapper = function Symbol() { + var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]); + var result = this instanceof SymbolWrapper ? new NativeSymbol(description) // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)' + : description === undefined ? NativeSymbol() : NativeSymbol(description); + if (description === '') EmptyStringDescriptionStore[result] = true; + return result; + }; + + copyConstructorProperties(SymbolWrapper, NativeSymbol); + var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype; + symbolPrototype.constructor = SymbolWrapper; + var symbolToString = symbolPrototype.toString; + var native = String(NativeSymbol('test')) == 'Symbol(test)'; + var regexp = /^Symbol\((.*)\)[^)]+$/; + defineProperty$4(symbolPrototype, 'description', { + configurable: true, + get: function description() { + var symbol = isObject(this) ? this.valueOf() : this; + var string = symbolToString.call(symbol); + if (has(EmptyStringDescriptionStore, symbol)) return ''; + var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1'); + return desc === '' ? undefined : desc; + } + }); + _export({ + global: true, + forced: true + }, { + Symbol: SymbolWrapper + }); +} + +// https://tc39.github.io/ecma262/#sec-symbol.iterator + +defineWellKnownSymbol('iterator'); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; // Array.prototype[@@unscopables] +// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables + +if (ArrayPrototype[UNSCOPABLES] == undefined) { + objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: objectCreate(null) + }); +} // add a key to Array.prototype[@@unscopables] + + +var addToUnscopables = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + +var defineProperty$5 = Object.defineProperty; +var cache = {}; + +var thrower = function (it) { + throw it; +}; + +var arrayMethodUsesToLength = function (METHOD_NAME, options) { + if (has(cache, METHOD_NAME)) return cache[METHOD_NAME]; + if (!options) options = {}; + var method = [][METHOD_NAME]; + var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false; + var argument0 = has(options, 0) ? options[0] : thrower; + var argument1 = has(options, 1) ? options[1] : undefined; + return cache[METHOD_NAME] = !!method && !fails(function () { + if (ACCESSORS && !descriptors) return true; + var O = { + length: -1 + }; + if (ACCESSORS) defineProperty$5(O, 1, { + enumerable: true, + get: thrower + });else O[1] = 1; + method.call(O, argument0, argument1); + }); +}; + +var $includes = arrayIncludes.includes; +var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { + ACCESSORS: true, + 1: 0 +}); // `Array.prototype.includes` method +// https://tc39.github.io/ecma262/#sec-array.prototype.includes + +_export({ + target: 'Array', + proto: true, + forced: !USES_TO_LENGTH +}, { + includes: function includes(el + /* , fromIndex = 0 */ + ) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables + +addToUnscopables('includes'); + +var iterators = {}; + +var correctPrototypeGetter = !fails(function () { + function F() { + /* empty */ + } + + F.prototype.constructor = null; + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + +var IE_PROTO$1 = sharedKey('IE_PROTO'); +var ObjectPrototype$1 = Object.prototype; // `Object.getPrototypeOf` method +// https://tc39.github.io/ecma262/#sec-object.getprototypeof + +var objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) { + O = toObject(O); + if (has(O, IE_PROTO$1)) return O[IE_PROTO$1]; + + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } + + return O instanceof Object ? ObjectPrototype$1 : null; +}; + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +var returnThis = function () { + return this; +}; // `%IteratorPrototype%` object +// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object + + +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +if ([].keys) { + arrayIterator = [].keys(); // Safari 8 has buggy iterators w/o `next` + + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;else { + PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +if (IteratorPrototype == undefined) IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() + +if ( !has(IteratorPrototype, ITERATOR)) { + createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis); +} + +var iteratorsCore = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + +var IteratorPrototype$1 = iteratorsCore.IteratorPrototype; + +var returnThis$1 = function () { + return this; +}; + +var createIteratorConstructor = function (IteratorConstructor, NAME, next) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { + next: createPropertyDescriptor(1, next) + }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false); + iterators[TO_STRING_TAG] = returnThis$1; + return IteratorConstructor; +}; + +var IteratorPrototype$2 = iteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR$1 = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis$2 = function () { + return this; +}; + +var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND]; + + switch (KIND) { + case KEYS: + return function keys() { + return new IteratorConstructor(this, KIND); + }; + + case VALUES: + return function values() { + return new IteratorConstructor(this, KIND); + }; + + case ENTRIES: + return function entries() { + return new IteratorConstructor(this, KIND); + }; + } + + return function () { + return new IteratorConstructor(this); + }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR$1] || IterablePrototype['@@iterator'] || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; // fix native + + if (anyNativeIterator) { + CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable())); + + if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) { + if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) { + if (objectSetPrototypeOf) { + objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2); + } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') { + createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$1, returnThis$2); + } + } // Set @@toStringTag to native iterators + + + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true); + } + } // fix Array#{values, @@iterator}.name in V8 / FF + + + if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + INCORRECT_VALUES_NAME = true; + + defaultIterator = function values() { + return nativeIterator.call(this); + }; + } // define iterator + + + if ( IterablePrototype[ITERATOR$1] !== defaultIterator) { + createNonEnumerableProperty(IterablePrototype, ITERATOR$1, defaultIterator); + } + + iterators[NAME] = defaultIterator; // export additional methods + + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } else _export({ + target: NAME, + proto: true, + forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME + }, methods); + } + + return methods; +}; + +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState$1 = internalState.set; +var getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR); // `Array.prototype.entries` method +// https://tc39.github.io/ecma262/#sec-array.prototype.entries +// `Array.prototype.keys` method +// https://tc39.github.io/ecma262/#sec-array.prototype.keys +// `Array.prototype.values` method +// https://tc39.github.io/ecma262/#sec-array.prototype.values +// `Array.prototype[@@iterator]` method +// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator +// `CreateArrayIterator` internal method +// https://tc39.github.io/ecma262/#sec-createarrayiterator + +var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState$1(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), + // target + index: 0, + // next index + kind: kind // kind + + }); // `%ArrayIteratorPrototype%.next` method + // https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next +}, function () { + var state = getInternalState$1(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + + if (!target || index >= target.length) { + state.target = undefined; + return { + value: undefined, + done: true + }; + } + + if (kind == 'keys') return { + value: index, + done: false + }; + if (kind == 'values') return { + value: target[index], + done: false + }; + return { + value: [index, target[index]], + done: false + }; +}, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% +// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject +// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject + +iterators.Arguments = iterators.Array; // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables + +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + +var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag'); +var test = {}; +test[TO_STRING_TAG$1] = 'z'; +var toStringTagSupport = String(test) === '[object z]'; + +var TO_STRING_TAG$2 = wellKnownSymbol('toStringTag'); // ES3 wrong here + +var CORRECT_ARGUMENTS = classofRaw(function () { + return arguments; +}()) == 'Arguments'; // fallback for IE11 Script Access Denied error + +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { + /* empty */ + } +}; // getting tag from ES6+ `Object.prototype.toString` + + +var classof = toStringTagSupport ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case + : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$2)) == 'string' ? tag // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; +}; + +// https://tc39.github.io/ecma262/#sec-object.prototype.tostring + + +var objectToString = toStringTagSupport ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + +// https://tc39.github.io/ecma262/#sec-object.prototype.tostring + +if (!toStringTagSupport) { + redefine(Object.prototype, 'toString', objectToString, { + unsafe: true + }); +} + +var MATCH = wellKnownSymbol('match'); // `IsRegExp` abstract operation +// https://tc39.github.io/ecma262/#sec-isregexp + +var isRegexp = function (it) { + var isRegExp; + return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp'); +}; + +var notARegexp = function (it) { + if (isRegexp(it)) { + throw TypeError("The method doesn't accept regular expressions"); + } + + return it; +}; + +var MATCH$1 = wellKnownSymbol('match'); + +var correctIsRegexpLogic = function (METHOD_NAME) { + var regexp = /./; + + try { + '/./'[METHOD_NAME](regexp); + } catch (e) { + try { + regexp[MATCH$1] = false; + return '/./'[METHOD_NAME](regexp); + } catch (f) { + /* empty */ + } + } + + return false; +}; + +// https://tc39.github.io/ecma262/#sec-string.prototype.includes + + +_export({ + target: 'String', + proto: true, + forced: !correctIsRegexpLogic('includes') +}, { + includes: function includes(searchString + /* , position = 0 */ + ) { + return !!~String(requireObjectCoercible(this)).indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined); + } +}); + +var createMethod$3 = function (CONVERT_TO_STRING) { + return function ($this, pos) { + var S = String(requireObjectCoercible($this)); + var position = toInteger(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = S.charCodeAt(position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF ? CONVERT_TO_STRING ? S.charAt(position) : first : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; + }; +}; + +var stringMultibyte = { + // `String.prototype.codePointAt` method + // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat + codeAt: createMethod$3(false), + // `String.prototype.at` method + // https://github.com/mathiasbynens/String.prototype.at + charAt: createMethod$3(true) +}; + +var charAt = stringMultibyte.charAt; +var STRING_ITERATOR = 'String Iterator'; +var setInternalState$2 = internalState.set; +var getInternalState$2 = internalState.getterFor(STRING_ITERATOR); // `String.prototype[@@iterator]` method +// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator + +defineIterator(String, 'String', function (iterated) { + setInternalState$2(this, { + type: STRING_ITERATOR, + string: String(iterated), + index: 0 + }); // `%StringIteratorPrototype%.next` method + // https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next +}, function next() { + var state = getInternalState$2(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return { + value: undefined, + done: true + }; + point = charAt(string, index); + state.index += point.length; + return { + value: point, + done: false + }; +}); + +// iterable DOM collections +// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods +var domIterables = { + CSSRuleList: 0, + CSSStyleDeclaration: 0, + CSSValueList: 0, + ClientRectList: 0, + DOMRectList: 0, + DOMStringList: 0, + DOMTokenList: 1, + DataTransferItemList: 0, + FileList: 0, + HTMLAllCollection: 0, + HTMLCollection: 0, + HTMLFormElement: 0, + HTMLSelectElement: 0, + MediaList: 0, + MimeTypeArray: 0, + NamedNodeMap: 0, + NodeList: 1, + PaintRequestList: 0, + Plugin: 0, + PluginArray: 0, + SVGLengthList: 0, + SVGNumberList: 0, + SVGPathSegList: 0, + SVGPointList: 0, + SVGStringList: 0, + SVGTransformList: 0, + SourceBufferList: 0, + StyleSheetList: 0, + TextTrackCueList: 0, + TextTrackList: 0, + TouchList: 0 +}; + +var ITERATOR$2 = wellKnownSymbol('iterator'); +var TO_STRING_TAG$3 = wellKnownSymbol('toStringTag'); +var ArrayValues = es_array_iterator.values; + +for (var COLLECTION_NAME in domIterables) { + var Collection = global_1[COLLECTION_NAME]; + var CollectionPrototype = Collection && Collection.prototype; + + if (CollectionPrototype) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[ITERATOR$2] !== ArrayValues) try { + createNonEnumerableProperty(CollectionPrototype, ITERATOR$2, ArrayValues); + } catch (error) { + CollectionPrototype[ITERATOR$2] = ArrayValues; + } + + if (!CollectionPrototype[TO_STRING_TAG$3]) { + createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG$3, COLLECTION_NAME); + } + + if (domIterables[COLLECTION_NAME]) for (var METHOD_NAME in es_array_iterator) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try { + createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, es_array_iterator[METHOD_NAME]); + } catch (error) { + CollectionPrototype[METHOD_NAME] = es_array_iterator[METHOD_NAME]; + } + } + } +} + +// 辞書は二分探索木により実現している +// 二分探索木の挿入・削除操作は2色木で実装している +// 2色木のアルゴリズムは近代科学社の「アルゴリズムイントロダクション第3版」(以降 IA3) を参考にした + +/** + * @summary 2色木の番兵 (T.nil) + * + * @desc + *

根の親、葉の子、または空辞書の root を表現する。

+ * + * @see IA3/13.1 2色木の性質 + * + * @private + */ +var T_nil; +/** + * @summary 順序あり辞書 + * + * @classdesc + *

キーの値により順序付けされる辞書である。

+ *

等価 (equivalent) キーを持つ複数のアイテムは存在できない。

+ *

this はキーと値の参照を保有している。保有しているキーのインスタンスを変更すると動作は保証されない。

+ * + * @memberof mapray + * @private + */ + +var OrderedMap = +/*#__PURE__*/ +function () { + /** + * @param {mapray.OrderedMap.Compare} compare キー比較関数 + */ + function OrderedMap(compare) { + _classCallCheck(this, OrderedMap); + + this._compare = compare; + this._root = T_nil; + this._size = 0; + } + /** + * @summary 要素数 + * + * @type {number} + * @readonly + */ + + + _createClass(OrderedMap, [{ + key: "clone", + + /** + * @summary インスタンスを複製 + * + * @desc + *

キー比較関数、キー、値はシャローコピーされる。

+ * + *

計算量: 要素数 n に対して O(n)

+ * + * @return {mapray.OrderedMap} this の複製 + */ + value: function clone() { + var cloned = new OrderedMap(this._compare); + + if (this._root !== T_nil) { + cloned._root = this._root._clone(T_nil); + } + + cloned._size = this._size; + return cloned; + } + /** + * @summary 要素は存在しないか? + * + *

計算量: 要素数 n に対して O(1)

+ * + * @return {boolean} 要素が存在しないとき true, そうでないとき false + */ + + }, { + key: "isEmpty", + value: function isEmpty() { + return this._root === T_nil; + } + /** + * @summary 先頭要素を検索 + * + * @desc + *

順序が最初の要素を検索する。

+ * + *

計算量: 要素数 n に対して O(log n)

+ * + * @return {!mapray.OrderedMap.Item} 検索されたアイテム (this が空なら null) + */ + + }, { + key: "findFirst", + value: function findFirst() { + if (this._root !== T_nil) { + return this._root._findMinimum(); + } else { + return null; + } + } + /** + * @summary 末尾要素を検索 + * + * @desc + *

順序が最後の要素を検索する。

+ * + *

計算量: 要素数 n に対して O(log n)

+ * + * @return {!mapray.OrderedMap.Item} 検索されたアイテム (this が空なら null) + */ + + }, { + key: "findLast", + value: function findLast() { + if (this._root !== T_nil) { + return this._root._findMaximum(); + } else { + return null; + } + } + /** + * @summary 下限要素を検索 + * + * @desc + *

bound と同じまたは後になるキーが存在すれば、その中で最初の要素を返す。

+ *

そのような要素が存在しない場合は null を返す。

+ * + *

計算量: 要素数 n に対して O(log n)

+ * + * @param {mapray.OrderedMap.Key} bound 境界キー + * + * @return {?mapray.OrderedMap.Item} 検索された要素、存在しなければ null + */ + + }, { + key: "findLower", + value: function findLower(bound) { + return this._root._findLowerBound(bound, this._compare); + } + /** + * @summary 上限要素を検索 + * + * @desc + *

bound より後になるキーが存在すれば、その中で最初の要素を返す。

+ *

そのような要素が存在しない場合は null を返す。

+ * + *

計算量: 要素数 n に対して O(log n)

+ * + * @param {mapray.OrderedMap.Key} bound 境界キー + * + * @return {?mapray.OrderedMap.Item} 検索された要素、存在しなければ null + */ + + }, { + key: "findUpper", + value: function findUpper(bound) { + return this._root._findUpperBound(bound, this._compare); + } + /** + * @summary 要素を検索 + * + * @desc + *

key と同じキーの要素が存在すれば返す。

+ *

そのような要素が存在しない場合は null を返す。

+ * + *

計算量: 要素数 n に対して O(log n)

+ * + * @param {mapray.OrderedMap.Key} key キー + * + * @return {?mapray.OrderedMap.Item} 検索された要素、存在しなければ null + */ + + }, { + key: "findEqual", + value: function findEqual(key) { + return this._root._findEqual(key, this._compare); + } + /** + * @summary すべての要素を削除 + * + * @desc + *

計算量: 要素数 n に対して O(1)

+ */ + + }, { + key: "clear", + value: function clear() { + this._root = T_nil; + this._size = 0; + } + /** + * @summary 要素を挿入 + * + * @desc + *

キーを key として value を挿入し、そのアイテムを返す。

+ * + *

計算量: 要素数 n に対して O(log n)

+ * + * @param {mapray.OrderedMap.Key} key キー + * @param {mapray.OrderedMap.Value} value 値 + * + * @return {mapray.OrderedMap.Item} 挿入された要素 + */ + + }, { + key: "insert", + value: function insert(key, value) { + // 参照: IA3/13.3 挿入 + var trail = this._root; + var parent = T_nil; + var comp = this._compare; + + while (trail !== T_nil) { + parent = trail; + + if (comp(key, trail.key)) { + // 左へ下る + trail = trail._child_L; + } else if (comp(trail.key, key)) { + // 右へ下る + trail = trail._child_R; + } else { + // キーが一致したアイテムの値を更新して返す + trail._value = value; + return trail; + } + } // 新しいアイテムを追加 + + + var item = new Item(parent, key, value); + item._is_red = true; // 黒 → 赤 + + if (parent === T_nil) { + this._root = item; + } else if (comp(key, parent.key)) { + parent._child_L = item; + } else { + parent._child_R = item; + } // 要素数を増加 + + + ++this._size; // 2色木条件の回復 + + this._insert_fixup(item); + + return item; + } + /** + * @summary 挿入後に2色木条件を満たすように木を修正 + * + * @desc + *

計算量: 要素数 n に対して最悪 O(log n)

+ * + * @param {mapray.OrderedMap.Item} item 挿入されたアイテム + * + * @see IA3/13.3 挿入 + * + * @private + */ + + }, { + key: "_insert_fixup", + value: function _insert_fixup(item) { + var trail = item; + + while (trail._parent._is_red + /* 赤 */ + ) { + // ここでは、常に不変式 a, b, c を満たす + if (trail._parent === trail._parent._parent._child_L) { + // trail の親が祖父の左側 + var uncle = trail._parent._parent._child_R; + + if (uncle._is_red + /* 赤 */ + ) { + // 場合 1 + trail._parent._is_red = false; // 黒 + + uncle._is_red = false; // 黒 + + trail._parent._parent._is_red = true; // 赤 + + trail = trail._parent._parent; + } else { + if (trail === trail._parent._child_R) { + // 場合 2 + trail = trail._parent; + + this._rotate_L(trail); + } // 場合 2,3 + + + trail._parent._is_red = false; // 黒 + + trail._parent._parent._is_red = true; // 赤 + + this._rotate_R(trail._parent._parent); + } + } else { + // trail の親が祖父の右側 + var _uncle = trail._parent._parent._child_L; + + if (_uncle._is_red + /* 赤 */ + ) { + // 場合 1 + trail._parent._is_red = false; // 黒 + + _uncle._is_red = false; // 黒 + + trail._parent._parent._is_red = true; // 赤 + + trail = trail._parent._parent; + } else { + if (trail === trail._parent._child_L) { + // 場合 2 + trail = trail._parent; + + this._rotate_R(trail); + } // 場合 2,3 + + + trail._parent._is_red = false; // 黒 + + trail._parent._parent._is_red = true; // 赤 + + this._rotate_L(trail._parent._parent); + } + } + } + + this._root._is_red = false; // 黒 + // ここで2色木条件を完全に満たす + } + /** + * @summary 要素を削除 + * + * @desc + *

last を省略したときは first を削除して、first の後続を返す。このとき first に null + * を指定することはできない。

+ * + *

last を指定したときは first から last の前までの要素を削除して last を返す。last は + * first と同じか後の要素でなければならない。

+ * + *

null は this の末尾要素の次の要素を表す。

+ * + *

計算量: 1 要素の削除の場合、要素数 n に対して O(log n)

+ * + * todo: 複数要素の削除の計算量を分析 + * + * @param {?mapray.OrderedMap.Item} first 削除する先頭の要素 + * @param {?mapray.OrderedMap.Item} [last] 削除する最後の要素の次 + * + * @return {?mapray.OrderedMap.Item} 削除された要素の次の要素 + * + * @private + */ + + }, { + key: "remove", + value: function remove(first, last) { + if (last === undefined) { + return this._remove(first); + } else { + for (var item = first; item != last;) { + item = this._remove(item); + } + + return last; + } + } + /** + * @summary アイテムを削除 + * + * @desc + *

計算量: 全体ツリーのアイテム数 n に対して最悪 O(log n)

+ * + * @param {mapray.OrderedMap.Item} item 削除対象 + * + * @return {?mapray.OrderedMap.Item} item の後続、存在しなければ null + * + * @see IA3/13.4 削除 + * + * @private + */ + + }, { + key: "_remove", + value: function _remove(item) { + // item の後続 (無ければ null) + var succ = item.findSuccessor(); + var orgY_is_red; + var x_item; + + if (item._child_L === T_nil) { + // (a) 左側なし + orgY_is_red = item._is_red; + x_item = item._child_R; + + this._replace(item._child_R, item); + } else if (item._child_R === T_nil) { + // (b) 右側なし (左側あり) + orgY_is_red = item._is_red; + x_item = item._child_L; + + this._replace(item._child_L, item); + } else { + // 左右あり + orgY_is_red = succ._is_red; + x_item = succ._child_R; + + if (succ._parent === item) { + // (c) item の後続が item の右の子 + // x_item が T_nil であっても親を設定 + x_item._parent = succ; + } else { + // (d) item の後続が item の右の子の左側 + this._replace(succ._child_R, succ); + + succ._child_R = item._child_R; + succ._child_R._parent = succ; + } // (c), (d) + + + this._replace(succ, item); + + succ._child_L = item._child_L; + succ._child_L._parent = succ; + succ._is_red = item._is_red; + } // 要素数を減少 + + + --this._size; + + if (!orgY_is_red + /* 黒 */ + ) { + // 2色木条件の回復 + this._remove_fixup(x_item); + } + + return succ; + } + /** + * @summary 削除後に2色木条件を満たすように木を修正 + * + * @param {mapray.OrderedMap.Item} x_item + * + * @see IA3/13.4 削除 + * + * @private + */ + + }, { + key: "_remove_fixup", + value: function _remove_fixup(x_item) { + var trail = x_item; + + while (trail !== this._root && !trail._is_red + /* 黒 */ + ) { + if (trail === trail._parent._child_L) { + // trail は親の左側 + var sibling = trail._parent._child_R; + + if (sibling._is_red + /* 赤 */ + ) { + // 場合 1 + sibling._is_red = false; // 黒 + + trail._parent._is_red = true; // 赤 + + this._rotate_L(trail._parent); + + sibling = trail._parent._child_R; + } + + if (!sibling._child_L._is_red + /* 黒 */ + && !sibling._child_R._is_red + /* 黒 */ + ) { + // 場合 2 + sibling._is_red = true; // 赤 + + trail = trail._parent; + } else { + if (!sibling._child_R._is_red + /* 黒 */ + ) { + // 場合 3 + sibling._child_L._is_red = false; // 黒 + + sibling._is_red = true; // 赤 + + this._rotate_R(sibling); + + sibling = trail._parent._child_R; + } // 場合 3,4 + + + sibling._is_red = trail._parent._is_red; + trail._parent._is_red = false; // 黒 + + sibling._child_R._is_red = false; // 黒 + + this._rotate_L(trail._parent); + + trail = this._root; + } + } else { + // trail は親の右側 + var _sibling = trail._parent._child_L; + + if (_sibling._is_red + /* 赤 */ + ) { + // 場合 1 + _sibling._is_red = false; // 黒 + + trail._parent._is_red = true; // 赤 + + this._rotate_R(trail._parent); + + _sibling = trail._parent._child_L; + } + + if (!_sibling._child_R._is_red + /* 黒 */ + && !_sibling._child_L._is_red + /* 黒 */ + ) { + // 場合 2 + _sibling._is_red = true; // 赤 + + trail = trail._parent; + } else { + if (!_sibling._child_L._is_red + /* 黒 */ + ) { + // 場合 3 + _sibling._child_R._is_red = false; // 黒 + + _sibling._is_red = true; // 赤 + + this._rotate_L(_sibling); + + _sibling = trail._parent._child_L; + } // 場合 3,4 + + + _sibling._is_red = trail._parent._is_red; + trail._parent._is_red = false; // 黒 + + _sibling._child_L._is_red = false; // 黒 + + this._rotate_R(trail._parent); + + trail = this._root; + } + } + } + + trail._is_red = false; // 黒 + } + /** + * @summary アイテムの置き換え + * + * @desc + *

dst の場所を src アイテムで置き換える。src が T_nil のときは dst の場所は葉になる。

+ *

dst の親の左または右の子供 (または this._root) と src._parent は変更されるが、dst + * 自身の内容は変更されない。

+ * + * @param {mapray.OrderedMap.Item} src + * @param {mapray.OrderedMap.Item} dst + * + * @private + */ + + }, { + key: "_replace", + value: function _replace(src, dst) { + var dp = dst._parent; + + if (dp !== T_nil) { + if (dp._child_L === dst) { + // dst は dp の左側 + dp._child_L = src; + } else { + // dst は dp の右側 + dp._child_R = src; + } + } else { + // dst は最上位 + this._root = src; + } // src の親を変更 + + + src._parent = dp; + } + /** + * @summary アイテムを左回転 + * + * 計算量: O(1) + * + * @see IA3/13.2 回転 + * + * @param {mapray.OrderedMap.Item} pivot 回転中心のアイテム + * + * @private + */ + + }, { + key: "_rotate_L", + value: function _rotate_L(pivot) { + // next は回転後に pivot の位置になる + var next = pivot._child_R; // pivot の右側を next の左側に設定 + + pivot._child_R = next._child_L; + + if (next._child_L !== T_nil) { + next._child_L._parent = pivot; + } // next の親を pivot の元の親に設定 + + + next._parent = pivot._parent; + + if (pivot._parent === T_nil) { + this._root = next; + } else if (pivot === pivot._parent._child_L) { + pivot._parent._child_L = next; + } else { + pivot._parent._child_R = next; + } // next の左側を pivot に設定 + + + next._child_L = pivot; + pivot._parent = next; + } + /** + * @summary アイテムを右回転 + * + * 計算量: O(1) + * + * @see IA3/13.2 回転 + * + * @param {mapray.OrderedMap.Item} pivot 回転中心のアイテム + * + * @private + */ + + }, { + key: "_rotate_R", + value: function _rotate_R(pivot) { + // next は回転後に pivot の位置になる + var next = pivot._child_L; // pivot の左側を next の右側に設定 + + pivot._child_L = next._child_R; + + if (next._child_R !== T_nil) { + next._child_R._parent = pivot; + } // next の親を pivot の元の親に設定 + + + next._parent = pivot._parent; + + if (pivot._parent === T_nil) { + this._root = next; + } else if (pivot === pivot._parent._child_R) { + pivot._parent._child_R = next; + } else { + pivot._parent._child_L = next; + } // next の右側を pivot に設定 + + + next._child_R = pivot; + pivot._parent = next; + } + }, { + key: "size", + get: function get() { + return this._size; + } + }]); + + return OrderedMap; +}(); +/** + * @summary OrderedMap のアイテム + * + * @classdesc + *

すべての this._child_L のアイテム L に対して Compare( L._key, this._key ) が成り立つ。

+ *

すべての this._child_R のアイテム R に対して Compare( this._key, R._key ) が成り立つ。

+ * + * @memberof mapray.OrderedMap + * @private + */ + + +var Item = +/*#__PURE__*/ +function () { + /** + * @desc + *

色は黒に設定される。

+ * + * @param {mapray.OrderedMap.Item} parent 親アイテム + * @param {mapray.OrderedMap.Key} key アイテムのキー + * @param {mapray.OrderedMap.Value} value アイテムの値 + */ + function Item(parent, key, value) { + _classCallCheck(this, Item); + + this._parent = parent; + this._child_L = T_nil; // 左側ツリー + + this._child_R = T_nil; // 右側ツリー + + this._is_red = false; // 色: 黒=false, 赤=true + + this._key = key; + this._value = value; + } + /** + * @summary キー + * + * @type {mapray.OrderedMap.Key} + * @readonly + */ + + + _createClass(Item, [{ + key: "_clone", + + /** + * @summary インスタンスを複製 + * + * @desc + *

キー、値はシャローコピーされる。

+ * + * @param {mapray.OrderedMap.Item} parant 親アイテム (this が根のときは T_nil) + * + * @return {mapray.OrderedMap.Item} this の複製 + * + * @private + */ + value: function _clone(parent) { + // 子孫と色以外を複製 + var cloned = new Item(parent, this._key, this._value); // 左側子孫を複製 + + if (this._child_L !== T_nil) { + cloned._child_L = this._child_L._clone(cloned); + } // 右側子孫を複製 + + + if (this._child_R !== T_nil) { + cloned._child_R = this._child_R._clone(cloned); + } // 色を複製 + + + cloned._is_red = this._is_red; + return cloned; + } + /** + * @summary 先頭アイテムの検索 + * + * @desc + *

this ツリーの中で最も先の順序のアイテムを検索する。

+ * + *

計算量: this ツリーのアイテム数 n に対して O(log n)

+ * + * @return {mapray.OrderedMap.Item} 検索されたアイテム + * + * @private + */ + + }, { + key: "_findMinimum", + value: function _findMinimum() { + var item = this; // 追跡ポインタ + + while (item._child_L !== T_nil) { + item = item._child_L; + } + + return item; + } + /** + * @summary 後尾アイテムの検索 + * + * @desc + *

this ツリーの中で最も後の順序のアイテムを検索する。

+ * + *

計算量: this ツリーのアイテム数 n に対して O(log n)

+ * + * @return {mapray.OrderedMap.Item} 検索されたアイテム + * + * @private + */ + + }, { + key: "_findMaximum", + value: function _findMaximum() { + var item = this; // 追跡ポインタ + + while (item._child_R !== T_nil) { + item = item._child_R; + } + + return item; + } + /** + * @summary 前のアイテムの検索 + * + * @desc + *

root ツリーから this の前の順序のアイテムを検索する。this が先頭なら null を返す。

+ * + *

計算量: 辞書の要素数 n に対して最悪 O(log n)

+ *

todo: 平均計算量を分析する

+ * + * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null + */ + + }, { + key: "findPredecessor", + value: function findPredecessor() { + // 左側子孫がいれば、左側子孫の後尾 + if (this._child_L !== T_nil) { + return this._child_L._findMaximum(); + } // 左側子孫がいなければ、this を右側子孫として持つ最も近い祖先 + // それがなければ this は全体ツリーの先頭なので検索失敗 + + + var item = this; + var parent = item._parent; + + while (parent !== T_nil && item === parent._child_L) { + item = parent; + parent = item._parent; + } + + return parent !== T_nil ? parent : null; + } + /** + * @summary 次のアイテムの検索 + * + * @desc + *

root ツリーから this の次の順序のアイテムを検索する。this が後尾なら null を返す。

+ * + *

計算量: 辞書の要素数 n に対して最悪 O(log n)

+ *

todo: 平均計算量を分析する

+ * + * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null + */ + + }, { + key: "findSuccessor", + value: function findSuccessor() { + // 右側子孫がいれば、右側子孫の先頭 + if (this._child_R !== T_nil) { + return this._child_R._findMinimum(); + } // 右側子孫がいなければ、this を左側子孫として持つ最も近い祖先 + // それがなければ this は全体ツリーの後尾なので検索失敗 + + + var item = this; + var parent = item._parent; + + while (parent !== T_nil && item === parent._child_R) { + item = parent; + parent = item._parent; + } + + return parent !== T_nil ? parent : null; + } + /** + * @summary 下限アイテムを検索 + * + * @desc + *

this ツリーの中で !comp(item.key, bkey) となる最初のアイテムを検索する。

+ *

つまり bkey と同じまたは後になるキーが this ツリーに存在すれば、その中で最初のアイテムを返す。

+ *

そのようなアイテムが存在しない場合は null を返す。

+ *

this が T_nil の場合は null を返す。

+ * + *

計算量: this ツリーのアイテム数 n に対して最悪 O(log n)

+ * + * @param {mapray.OrderedMap.Key} bkey 境界キー + * @param {mapray.OrderedMap.Compare} comp キー比較関数 + * + * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null + * + * @private + */ + + }, { + key: "_findLowerBound", + value: function _findLowerBound(bkey, comp) { + var item = this; + + while (item !== T_nil) { + if (comp(bkey, item._key)) { + // bkey < item.key + if (item._child_L !== T_nil) { + var found = item._child_L._findLowerBound(bkey, comp); + + if (found !== null) return found; + } + + return item; + } else if (comp(item._key, bkey)) { + // bkey > item.key + item = item._child_R; + } else { + // bkey == item.key (等価) + return item; + } + } + + return null; + } + /** + * @summary 上限アイテムを検索 + * + * @desc + *

this ツリーの中で comp(bkey, item.key) となる最初のアイテムを検索する。

+ *

つまり bkey より後になるキーが this ツリーに存在すれば、その中で最初のアイテムを返す。

+ *

そのようなアイテムが存在しない場合は null を返す。

+ *

this が T_nil の場合は null を返す。

+ * + *

計算量: this ツリーのアイテム数 n に対して最悪 O(log n)

+ * + * @param {mapray.OrderedMap.Key} bkey 境界キー + * @param {mapray.OrderedMap.Compare} comp キー比較関数 + * + * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null + * + * @private + */ + + }, { + key: "_findUpperBound", + value: function _findUpperBound(bkey, comp) { + var item = this; + + while (item !== T_nil) { + if (comp(bkey, item._key)) { + // bkey < item.key + if (item._child_L !== T_nil) { + var found = item._child_L._findUpperBound(bkey, comp); + + if (found !== null) return found; + } + + return item; + } else { + // bkey >= item.key + item = item._child_R; + } + } + + return null; + } + /** + * @summary 等価キーのアイテムを検索 + * + * @desc + *

this ツリーの中で !comp(key, item.key) かつ !comp(item.key, key) となるアイテムを検索する。

+ *

そのようなアイテムが存在しない場合は null を返す。

+ *

this == T_nil の場合は null を返す。

+ * + *

計算量: this ツリーのアイテム数 n に対して最悪 O(log n)

+ * + * @param {mapray.OrderedMap.Key} key キー + * @param {mapray.OrderedMap.Compare} comp キー比較関数 + * + * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null + * + * @private + */ + + }, { + key: "_findEqual", + value: function _findEqual(key, comp) { + var item = this; + + while (item !== T_nil) { + if (comp(key, item._key)) { + // key < item.key + item = item._child_L; + } else if (comp(item._key, key)) { + // bkey > item.key + item = item._child_R; + } else { + // bkey == item.key (等価) + return item; + } + } + + return null; + } + /** + * @summary 下限アイテムを検索 (検討中) + * + * @desc + *

root ツリーの中で !comp(item.key, bkey) となる最初のアイテムを検索する。

+ *

つまり bkey と同じまたは後になるキーが root ツリーに存在すれば、その中で最初のアイテムを返す。

+ *

そのようなアイテムが存在しない場合は null を返す。

+ * + *

計算量: root ツリーのアイテム数 n に対して最悪 O(log^2 n)

+ * + * @param {mapray.OrderedMap.Key} bkey 境界キー + * @param {mapray.OrderedMap.Compare} comp キー比較関数 + * + * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null + * + * @private + */ + + }, { + key: "_findLowerBoundR", + value: function _findLowerBoundR(bkey, comp) { + var item = this; + + if (item._parent !== T_nil) { + // item == root + return item._findLowerBound(bkey, comp); + } + + var imin = item._findMinimum(); + + var imax = item._findMaximum(); + + do { + if (!comp(bkey, imin._key) && !comp(imax._key, bkey)) { + // imin <= bkey <= imax なので + // item._findLowerBound() で必ず見つかる + break; + } + + if (item._parent._child_L === item) { + // item は parent の左側なので、登ると imax のみが変化 + imax = item._findMaximum(); + } else { + // item は parent の右側なので、登ると imin のみが変化 + imin = item._findMinimum(); + } // item は登る + + + item = item._parent; + } while (item._parent !== T_nil); // item == root + + + return item._findLowerBound(bkey, comp); + } + }, { + key: "key", + get: function get() { + return this._key; + } + /** + * @summary 値 + * + * @type {mapray.OrderedMap.Value} + * @readonly + */ + + }, { + key: "value", + get: function get() { + return this._value; + } + }]); + + return Item; +}(); // 番兵を生成 + + +T_nil = new Item(); + +/** + * @summary アニメーション関数値の不変性情報 + * + * @classdesc + *

Curve のサブクラスの実装者が、アニメーション関数値が一定となる時刻区間を表明するために利用するクラスである。

+ * + * @see {@link mapray.animation.Curve#getInvariance} + * + * @memberof mapray.animation + */ + +var Invariance = +/*#__PURE__*/ +function () { + function Invariance() { + _classCallCheck(this, Invariance); + + this._imap = createEmptyMap(); + } + /** + * @summary 複製を取得 + * + * @desc + *

this と同じ内容のインスタンスを生成する。

+ * + *

計算量: 時刻区間数 n に対して O(n)

+ * + * @return {mapray.animation.Invariance} this の複製 + */ + + + _createClass(Invariance, [{ + key: "clone", + value: function clone() { + var cloned = new Invariance(); // Time と Interval はイミュータブルなのでシャローコピーで十分 + + cloned._imap = this._imap.clone(); + return cloned; + } + /** + * @summary 同一値の時刻区間を上書き + * + * @desc + *

this が持っているすべての同一値時刻区間に interval の時刻区間部分を上書きする。

+ * + *

イメージ的には interval 部分に毎回新しい色を重ねていく。最終的にできた各色の区間を同一値の時刻区間と見なす。

+ * + * @param {mapray.animation.Interval} interval 同一値を持つ時刻区間 + * + * @return {mapray.animation.Invariance} this + */ + + }, { + key: "write", + value: function write(interval) { + // todo: 計算量を分析 (remove() に依存) + this.remove(interval); + + this._insert(interval); + + return this; + } + /** + * @summary 時刻区間の消去 + * + * @desc + *

this が持っているすべての同一値時刻区間から interval の時刻区間部分を消去する。

+ * + *

イメージ的には {@link mapray.animation.Invariance#write write()} で重ねた色の + * interval 部分を透明にする。

+ * + * @param {mapray.animation.Interval} interval 時刻区間 + * + * @return {mapray.animation.Invariance} this + */ + + }, { + key: "remove", + value: function remove(interval) { + // todo: 計算量を分析 (OrderMap#remove() に依存) + if (interval.isEmpty()) { + // 空時刻区間の消去は変化なし + return this; + } // interval.lower 半区間に内包される最初の要素 (無ければ null) + + + var fit = interval.l_open ? this._imap.findUpper(interval.lower) : this._imap.findLower(interval.lower); // fit に先行する要素 (無ければ null) + + var pfit = fit !== null ? fit.findPredecessor() : this._imap.findLast(); + + this._chopItem(pfit, interval); + + if (fit !== null && interval.includes(fit.value)) { + // fit は interval に内包される最初の要素 + // interval の後続で最初の要素 (無ければ null) + var it2 = interval.u_open ? this._imap.findLower(interval.upper) : this._imap.findUpper(interval.upper); // it2 の先行 (非 null) + + var it1 = it2 !== null ? it2.findPredecessor() : this._imap.findLast(); // fit の後続で interval に内包されない最初の要素 (無ければ null) + + var lit = interval.includes(it1.value) ? it2 : it1; // interval に内包される要素をすべて削除 + + this._imap.remove(fit, lit); // lit は interval と交差している可能性がある + + + this._chopItem(lit, interval); + } else { + // interval はどの時刻区間も内包しない + // fit は interval と交差している可能性がある + this._chopItem(fit, interval); + } + + return this; + } + /** + * @summary 選択範囲に絞った不変性情報を取得 + * + * @desc + *

interval で指定した選択範囲と交差する一定値時刻区間を選択して、新しい不変性情報のインスタンスを返す。

+ * + * @param {mapray.animation.Interval} narrow 選択範囲 + * + * @return {mapray.animation.Invariance} 範囲を狭めた不変性情報 + */ + + }, { + key: "getNarrowed", + value: function getNarrowed(narrow) { + var invr = new Invariance(); + + if (narrow.isEmpty()) { + // 交差しないので空を返す + return invr; + } // narrow と交差する範囲を決定 + + + var lo1 = this._imap.findUpper(narrow.lower); + + var lo0 = lo1 !== null ? lo1.findPredecessor() : this._imap.findLast(); + var lower = lo0 !== null && lo0.value.hasIntersection(narrow) ? lo0 : lo1; + var upper = narrow.u_open ? this._imap.findLower(narrow.upper) : this._imap.findUpper(narrow.upper); // invr へ [lower, upper) を追加 + + for (var it = lower; it !== upper; it = it.findSuccessor()) { + invr._imap.insert(it.key, it.value); + } + + return invr; + } + /** + * @summary 複数の Invariance を統合 + * + * @desc + *

invariances のすべての同一値時刻区間の共通区間を持った Invariance インスタンスを生成する。

+ * + * @param {mapray.animation.Invariance[]} invariances 統合元のリスト + * + * @return {mapray.animation.Invariance} 統合結果 + */ + + }, { + key: "_$getArray", + + /** + * @summary 時刻区間の配列を取得 + * + * @desc + *

Proper の時刻区間が時刻順で格納された配列を返す。

+ * + * @return {mapray.animation.Interval[]} 時刻区間の配列 + * + * @package + */ + value: function _$getArray() { + var array = []; + + for (var it = this._imap.findFirst(); it !== null; it = it.findSuccessor()) { + array.push(it.value); + } + + return array; + } + /** + * @summary 不変性情報を修正 + * + * @desc + *

Curve#getInvariance() で得た一部の不変性情報 subinvr を元に this を更新する。

+ *

更新後の this は Curve インスタンス全体の不変性情報と一致することが期待される。

+ * + * @param {mapray.animation.Invariance} subinvr 更新部分 + * + * @package + */ + + }, { + key: "_$modify", + value: function _$modify(subinvr) { + // subinvr の最初と最後 + var ita = subinvr._imap.findFirst(); + + if (ita === null) { + // subinvr は空なので変化なし + return; + } + + var itb = subinvr._imap.findLast(); // subinvr の全範囲をくりぬく + + + var ai = ita.value; + var bi = itb.value; + this.remove(new Interval(ai.lower, bi.upper, ai.l_open, bi.u_open)); // subinvr のすべての時刻区間を挿入 + // 計算量: this の要素数 n, subinvr の要素数 m に対して O(m log n) + + for (var it = ita; it !== null; it = it.findSuccessor()) { + this._insert(it.value); + } + } + /** + * @summary 時刻区間を整列により拡張 + * + * @desc + *

interval の端が this のある区間内にないなら、前または次の区間の境界まで拡大する。

+ * + *

事前条件: !interval.isEmpty()

+ * + * @param {mapray.animation.Interval} interval 拡大対象の時刻区間 + * + * @return {mapray.animation.Interval} 拡大された時刻区間 + * + * @package + */ + + }, { + key: "_$expandIntervalByAlignment", + value: function _$expandIntervalByAlignment(interval) { + var map = this._imap; // 左側 + + var lower; // Interval + + { + var it1 = map.findLower(interval.lower); + + if (it1 !== null && it1.value.lower.equals(interval.lower) && (interval.l_open || !it1.value.l_open)) { + // intervalの下限時刻 と it1 の下限時刻が一致し、 + // interval の左端時刻が it1 区間に含まれる + lower = interval; + } else { + var it0 = it1 !== null ? it1.findPredecessor() : map.findLast(); + + if (it0 !== null) { + if (it0.value.hasIntersection(interval)) { + // interval の左端と it0 が交差する + lower = interval; + } else { + // interval の左端と it0 が交差しない + lower = it0.value.getFollowings(); + } + } else { + // interval の左端と交差する区間はなく、その左側にも区間がない + lower = Interval.UNIVERSAL; + } + } + } // 右側 + + var upper; // Interval + + { + var _it = map.findLower(interval.upper); + + if (_it !== null && interval.upper.equals(_it.value.lower) && (!interval.u_open || !_it.value.l_open)) { + // interval 上限時刻と it1 の下限時刻が一致し、 + // interval の右端時刻が it1 区間に含まれる + upper = interval; + } else { + var _it2 = _it !== null ? _it.findPredecessor() : map.findLast(); + + if (_it2 !== null && _it2.value.hasIntersection(interval) && (interval.upper.lessThan(_it2.value.upper) || interval.upper.equals(_it2.value.upper) && (interval.u_open || !_it2.value.u_open))) { + // interval の右端と it0 が交差する + upper = interval; + } else { + // interval の右端と it0 が交差しない + upper = _it !== null ? _it.value.getPrecedings() : Interval.UNIVERSAL; + } + } + } + return new Interval(lower.lower, upper.upper, lower.l_open, upper.u_open); + } + /** + * @summary item から interval 部分を削り取る + * + * @desc + *

item の時刻区間から interval 部分を消去する。

+ *

ただし item が null のときは何もしない。

+ *

最後に item は無効になる。

+ * + * @param {?mapray.OrderedMap.Item} item + * @param {mapray.animation.Interval} interval + * + * @private + */ + + }, { + key: "_chopItem", + value: function _chopItem(item, interval) { + if (item === null) { + // 何もしない + return; + } + + var diffs = item.value.getDifference(interval); // 削った時刻区間を入れ替え + + this._imap.remove(item); + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = diffs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var di = _step.value; + + if (di.isProper()) { + this._imap.insert(di.lower, di); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * @summary 時刻区間を挿入 + * + * @desc + *

条件: this._imap に interval と交差する区間が存在しない

+ * + *

計算量: 時刻区間数 n に対して最悪 O(log n)

+ * + * @param {mapray.animation.Interval} interval 時刻区間 + * + * @private + */ + + }, { + key: "_insert", + value: function _insert(interval) { + if (!interval.isProper()) { + // Empty と Single の時刻区間は保持しない + return; + } + + this._imap.insert(interval.lower, interval); + } + /** + * @summary Invariance を統合 + * + * 計算量: + * this の時刻区間数 k + * source の時刻区間数 n + * this の各時刻区間範囲内の source の時刻区間数 m (平均値) + * merged_imap の時刻区間数 p + * + * findSuccessor() を O(1) と考えたとき + * O(k * (m * log p + log n)) + * + * @param {mapray.animation.Invariance} source + * + * @private + */ + + }, { + key: "_merge_from_invariance", + value: function _merge_from_invariance(source) { + var merged_imap = createEmptyMap(); + + for (var target = this._imap.findFirst(); target !== null; target = target.findSuccessor()) { + mergeIntervalInvariance(target.value, source, merged_imap); + } + + this._imap = merged_imap; + } + }], [{ + key: "merge", + value: function merge(invariances) { + var result = new Invariance(); + result.write(Interval.UNIVERSAL); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = invariances[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var source = _step2.value; + + result._merge_from_invariance(source); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return result; + } + }]); + + return Invariance; +}(); +/** + * @summary _merge_from_invariance() の一部 + * + * 計算量: + * source の時刻区間数 n + * tgtIv 範囲内の source 時刻区間数 m + * merged_imap の時刻区間数 p + * + * findSuccessor() を O(1) と考えたとき + * O(m * log p + log n) + * + * @param {mapray.animation.Interval} tgtIv 時刻区間 + * @param {mapray.animation.Invariance} source + * @param {mapray.OrderedMap} merged_imap + * + * @private + */ + + +function mergeIntervalInvariance(tgtIv, source, merged_imap) { + var src_imap = source._imap; // tgtIv の範囲の source 内の時刻区間を決定 + // 計算量: source の時刻区間数 n に対して O(log n) + + var lower = src_imap.findLower(tgtIv.lower); + var fit = lower !== null ? lower.findPredecessor() : null; + + if (fit === null) { + fit = src_imap.findFirst(); + } + + var lit = src_imap.findUpper(tgtIv.upper); // fit から lit までの時刻区間と tgtIv との交差を merged_imap へ追加 + // 計算量: merged_imap の時刻区間数 p, tgtIv 範囲内の source 時刻区間数 m + // に対して最悪 O(m * log n * log p) + + for (var it = fit; it !== lit; it = it.findSuccessor()) { + var srcIv = it.value; + var cross = tgtIv.getIntersection(srcIv); + + if (cross.isProper()) { + merged_imap.insert(cross.lower, cross); + } + } +} +/** + * @summary 空の時刻区間マップを生成 + * + * @desc + * Proper 時刻区間が交差せず、時刻順に並んでいる + * この条件では時刻区間の下限時刻をキーとして整列できる + * + * @return {mapray.OrderedMap} + * + * @private + */ + + +function createEmptyMap() { + return new OrderedMap(function (a, b) { + return a.lessThan(b); + }); +} + +var freezing = !fails(function () { + return Object.isExtensible(Object.preventExtensions({})); +}); + +var internalMetadata = createCommonjsModule(function (module) { + var defineProperty = objectDefineProperty.f; + var METADATA = uid('meta'); + var id = 0; + + var isExtensible = Object.isExtensible || function () { + return true; + }; + + var setMetadata = function (it) { + defineProperty(it, METADATA, { + value: { + objectID: 'O' + ++id, + // object ID + weakData: {} // weak collections IDs + + } + }); + }; + + var fastKey = function (it, create) { + // return a primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; // not necessary to add metadata + + if (!create) return 'E'; // add missing metadata + + setMetadata(it); // return object ID + } + + return it[METADATA].objectID; + }; + + var getWeakData = function (it, create) { + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; // not necessary to add metadata + + if (!create) return false; // add missing metadata + + setMetadata(it); // return the store of weak collections IDs + } + + return it[METADATA].weakData; + }; // add metadata on freeze-family methods calling + + + var onFreeze = function (it) { + if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it); + return it; + }; + + var meta = module.exports = { + REQUIRED: false, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze + }; + hiddenKeys[METADATA] = true; +}); +var internalMetadata_1 = internalMetadata.REQUIRED; +var internalMetadata_2 = internalMetadata.fastKey; +var internalMetadata_3 = internalMetadata.getWeakData; +var internalMetadata_4 = internalMetadata.onFreeze; + +var ITERATOR$3 = wellKnownSymbol('iterator'); +var ArrayPrototype$1 = Array.prototype; // check on default Array iterator + +var isArrayIteratorMethod = function (it) { + return it !== undefined && (iterators.Array === it || ArrayPrototype$1[ITERATOR$3] === it); +}; + +var ITERATOR$4 = wellKnownSymbol('iterator'); + +var getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR$4] || it['@@iterator'] || iterators[classof(it)]; +}; + +var callWithSafeIterationClosing = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion) + } catch (error) { + var returnMethod = iterator['return']; + if (returnMethod !== undefined) anObject(returnMethod.call(iterator)); + throw error; + } +}; + +var iterate_1 = createCommonjsModule(function (module) { + var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; + }; + + var iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) { + var boundFunction = functionBindContext(fn, that, AS_ENTRIES ? 2 : 1); + var iterator, iterFn, index, length, result, next, step; + + if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); // optimisation for array iterators + + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = toLength(iterable.length); length > index; index++) { + result = AS_ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]); + if (result && result instanceof Result) return result; + } + + return new Result(false); + } + + iterator = iterFn.call(iterable); + } + + next = iterator.next; + + while (!(step = next.call(iterator)).done) { + result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES); + if (typeof result == 'object' && result && result instanceof Result) return result; + } + + return new Result(false); + }; + + iterate.stop = function (result) { + return new Result(true, result); + }; +}); + +var anInstance = function (it, Constructor, name) { + if (!(it instanceof Constructor)) { + throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); + } + + return it; +}; + +var ITERATOR$5 = wellKnownSymbol('iterator'); +var SAFE_CLOSING = false; + +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { + done: !!called++ + }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + + iteratorWithReturn[ITERATOR$5] = function () { + return this; + }; // eslint-disable-next-line no-throw-literal + + + Array.from(iteratorWithReturn, function () { + throw 2; + }); +} catch (error) { + /* empty */ +} + +var checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + + try { + var object = {}; + + object[ITERATOR$5] = function () { + return { + next: function () { + return { + done: ITERATION_SUPPORT = true + }; + } + }; + }; + + exec(object); + } catch (error) { + /* empty */ + } + + return ITERATION_SUPPORT; +}; + +var collection = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global_1[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + + var fixMethod = function (KEY) { + var nativeMethod = NativePrototype[KEY]; + redefine(NativePrototype, KEY, KEY == 'add' ? function add(value) { + nativeMethod.call(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + } : function set(key, value) { + nativeMethod.call(this, key === 0 ? 0 : key, value); + return this; + }); + }; // eslint-disable-next-line max-len + + + if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + })))) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + internalMetadata.REQUIRED = true; + } else if (isForced_1(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); // early implementations not supports chaining + + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + + var THROWS_ON_PRIMITIVES = fails(function () { + instance.has(1); + }); // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new + + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { + new NativeConstructor(iterable); + }); // for early implementations -0 and +0 not the same + + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + + while (index--) $instance[ADDER](index, index); + + return !$instance.has(-0); + }); + + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance(dummy, Constructor, CONSTRUCTOR_NAME); + var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); + if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method + + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; + } + + exported[CONSTRUCTOR_NAME] = Constructor; + _export({ + global: true, + forced: Constructor != NativeConstructor + }, exported); + setToStringTag(Constructor, CONSTRUCTOR_NAME); + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + return Constructor; +}; + +var redefineAll = function (target, src, options) { + for (var key in src) redefine(target, key, src[key], options); + + return target; +}; + +var SPECIES$1 = wellKnownSymbol('species'); + +var setSpecies = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = objectDefineProperty.f; + + if (descriptors && Constructor && !Constructor[SPECIES$1]) { + defineProperty(Constructor, SPECIES$1, { + configurable: true, + get: function () { + return this; + } + }); + } +}; + +var defineProperty$6 = objectDefineProperty.f; +var fastKey = internalMetadata.fastKey; +var setInternalState$3 = internalState.set; +var internalStateGetterFor = internalState.getterFor; +var collectionStrong = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, CONSTRUCTOR_NAME); + setInternalState$3(that, { + type: CONSTRUCTOR_NAME, + index: objectCreate(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!descriptors) that.size = 0; + if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP); + }); + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; // change existing entry + + if (entry) { + entry.value = value; // create new entry + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) state.first = entry; + if (previous) previous.next = entry; + if (descriptors) state.size++;else that.size++; // add to index + + if (index !== 'F') state.index[index] = entry; + } + + return that; + }; + + var getEntry = function (that, key) { + var state = getInternalState(that); // fast case + + var index = fastKey(key); + var entry; + if (index !== 'F') return state.index[index]; // frozen object case + + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) return entry; + } + }; + + redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + + while (entry) { + entry.removed = true; + if (entry.previous) entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + + state.first = state.last = undefined; + if (descriptors) state.size = 0;else that.size = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) prev.next = next; + if (next) next.previous = prev; + if (state.first == entry) state.first = next; + if (state.last == entry) state.last = prev; + if (descriptors) state.size--;else that.size--; + } + + return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn + /* , that = undefined */ + ) { + var state = getInternalState(this); + var boundFunction = functionBindContext(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); // revert to the last existing entry + + while (entry && entry.removed) entry = entry.previous; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(this, key); + } + }); + redefineAll(C.prototype, IS_MAP ? { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (descriptors) defineProperty$6(C.prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return C; + }, + setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + + defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState$3(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; // revert to the last existing entry + + while (entry && entry.removed) entry = entry.previous; // get next entry + + + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + // or finish the iteration + state.target = undefined; + return { + value: undefined, + done: true + }; + } // return step by kind + + + if (kind == 'keys') return { + value: entry.key, + done: false + }; + if (kind == 'values') return { + value: entry.value, + done: false + }; + return { + value: [entry.key, entry.value], + done: false + }; + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2 + + setSpecies(CONSTRUCTOR_NAME); + } +}; + +// https://tc39.github.io/ecma262/#sec-map-objects + + +var es_map = collection('Map', function (init) { + return function Map() { + return init(this, arguments.length ? arguments[0] : undefined); + }; +}, collectionStrong); + +/** + * @summary アニメーション値の型 + * + * @classdesc + *

アニメーションする値の型を表現するための抽象クラスである。

+ *

Binder インスタンスと結合するパラメータ値の型と、Curve インスタンスが返却する値の型を表現する。

+ * + *

Type の具象クラスのインスタンスは {@link mapray.animation.Type.register}() + * により登録し、{@link mapray.animation.Type.find}() により取得することができる。

+ * + *

特定の Type の具象クラスのインスタンスは 1 つしか存在しない。そのため Type インスタンスが表す型の同一性は + * === 演算子で判断することができる。

+ * + * @abstract + * @memberof mapray.animation + */ + +var Type = +/*#__PURE__*/ +function () { + /** + * @param {string} name 型の登録名 + * @protected + */ + function Type(name) { + _classCallCheck(this, Type); + + this._name = name; + } + /** + * @summary 型名 + * + * @type {string} + * @readonly + */ + + + _createClass(Type, [{ + key: "isConvertible", + + /** + * @summary 変換可能か? + * + * @desc + *

from 型の値を this 型の値への変換が可能かどうかを返す。

+ *

this と from が同一なら、必ず true を返す。

+ *

このメソッドが true を返した場合は convertValue() により from 型の値を + * this 型の値に変換することが可能である。

+ * + * @param {mapray.animation.Type} from 変換元の型 + * + * @return {boolean} 変換可能かなら true, そうでないなら false + * + * @see {@link mapray.animation.Type#convertValue} + * + * @abstract + */ + value: function isConvertible(from) { + this._override_error("isConvertible"); + } + /** + * @summary 値を変換 + * + * @desc + *

value を this 型へ変換したオブジェクトを返す。

+ *

変換結果が value と同じ値の場合、value 自身を返すことも可能である。

+ * + *

事前条件1: value は from 型のオブジェクトである
+ * 事前条件2: this.isConvertible( from ) == true

+ * + * @param {mapray.animation.Type} from 変換元の型 + * @param {object} value 変換元の値 (from 型) + * + * @return {object} 変換された値 (this 型) + * + * @see {@link mapray.animation.Type#isConvertible} + * + * @abstract + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + this._override_error("convertValue"); + } + /** + * @summary 既定値を取得 + * + * @desc + *

this 型の既定値を返す。

+ * + * @return {object} 既定値 (this 型) + * + * @abstract + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + this._override_error("getDefaultValue"); + } + /** + * @summary 値の複製を取得 + * + * @desc + *

value の新しい複製を返す。

+ *

ただし value がイミュータブルの場合、value 自身を返すことも可能である。

+ * + *

事前条件: value は this 型のオブジェクトである

+ * + * @param {object} value 複製元の値 (this 型) + * + * @return {object} 複製された値 (this 型) + * + * @abstract + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + this._override_error("getCloneValue"); + } + /** + * @summary 型を登録 + * + * @desc + *

名前を name として type 型を登録する。

+ *

登録された type は name により検索することができる。

+ * + * @param {string} name 型の名前 + * @param {mapray.animation.Type} type Type インスタンス + * + * @return {mapray.animation.Type} type + * + * @throws {@link mapray.animation.Type.AlreadyRegisteredError} name がすでに登録されているとき + * + * @see {@link mapray.animation.Type.find} + */ + + }, { + key: "_override_error", + + /** + * @summary メソッドがオーバーライドされていない + * + * arguments.callee と Error#stack は互換性が低いので、関数名の取得に使わなかった + * + * @param {string} func_name + * + * @private + */ + value: function _override_error(func_name) { + throw new Error("Type#" + func_name + "() method has not been overridden in " + this.constructor.name); + } + }, { + key: "name", + get: function get() { + return this._name; + } + }], [{ + key: "register", + value: function register(name, type) { + if (type_register_map.has(name)) { + // name はすでに登録済み + throw new AlreadyRegisteredError("specified name (" + name + ") has already been registered"); + } + + type_register_map.set(name, type); + return type; + } + /** + * @summary 型を検索 + * + * @desc + *

名前が name として登録された Type インスタンスを返す。

+ * + *

name の型が登録されている場合、name に対して常に同じインスタンスを返す。 + * + * @param {string} name 型の名前 + * + * @return {mapray.animation.Type} + * + * @throws {@link mapray.animation.Type.NotRegisteredError} name に対応する型が登録されていないとき + * + * @see {@link mapray.animation.Type.register} + */ + + }, { + key: "find", + value: function find(name) { + var type = type_register_map.get(name); + + if (type === undefined) { + // name は登録されていない + throw new NotRegisteredError("type with the specified name (" + name + ") is not registered"); + } + + return type; + } + }]); + + return Type; +}(); +/** + * @summary 型の多重登録エラー + * + * @memberof mapray.animation.Type + * @extends mapray.animation.AnimationError + * + * @see {@link mapray.animation.Type.register} + */ + + +var AlreadyRegisteredError = +/*#__PURE__*/ +function (_AnimationError) { + _inherits(AlreadyRegisteredError, _AnimationError); + + /** + * @param {string} message エラーの説明 + */ + function AlreadyRegisteredError(message) { + var _this; + + _classCallCheck(this, AlreadyRegisteredError); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(AlreadyRegisteredError).call(this, message)); + _this.name = "mapray.animation.Type.AlreadyRegisteredError"; + return _this; + } + + return AlreadyRegisteredError; +}(AnimationError); + +Type.AlreadyRegisteredError = AlreadyRegisteredError; +/** + * @summary 型の未登録エラー + * + * @memberof mapray.animation.Type + * @extends mapray.animation.AnimationError + * + * @see {@link mapray.animation.Type.find} + */ + +var NotRegisteredError = +/*#__PURE__*/ +function (_AnimationError2) { + _inherits(NotRegisteredError, _AnimationError2); + + /** + * @param {string} message エラーの説明 + */ + function NotRegisteredError(message) { + var _this2; + + _classCallCheck(this, NotRegisteredError); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(NotRegisteredError).call(this, message)); + _this2.name = "mapray.animation.Type.NotRegisteredError"; + return _this2; + } + + return NotRegisteredError; +}(AnimationError); + +Type.NotRegisteredError = NotRegisteredError; +/** + * @summary 型の登録情報 + * + * @type {Map.} + * @readonly + * + * @private + */ + +var type_register_map = new Map(); + +var $find = arrayIteration.find; +var FIND = 'find'; +var SKIPS_HOLES = true; +var USES_TO_LENGTH$1 = arrayMethodUsesToLength(FIND); // Shouldn't skip holes + +if (FIND in []) Array(1)[FIND](function () { + SKIPS_HOLES = false; +}); // `Array.prototype.find` method +// https://tc39.github.io/ecma262/#sec-array.prototype.find + +_export({ + target: 'Array', + proto: true, + forced: SKIPS_HOLES || !USES_TO_LENGTH$1 +}, { + find: function find(callbackfn + /* , that = undefined */ + ) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables + +addToUnscopables(FIND); + +// https://tc39.github.io/ecma262/#sec-set-objects + + +var es_set = collection('Set', function (init) { + return function Set() { + return init(this, arguments.length ? arguments[0] : undefined); + }; +}, collectionStrong); + +var arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined'; + +// https://tc39.github.io/ecma262/#sec-toindex + +var toIndex = function (it) { + if (it === undefined) return 0; + var number = toInteger(it); + var length = toLength(number); + if (number !== length) throw RangeError('Wrong length or index'); + return length; +}; + +// IEEE754 conversions based on https://github.com/feross/ieee754 +// eslint-disable-next-line no-shadow-restricted-names +var Infinity$1 = 1 / 0; +var abs = Math.abs; +var pow = Math.pow; +var floor$1 = Math.floor; +var log$1 = Math.log; +var LN2$1 = Math.LN2; + +var pack = function (number, mantissaLength, bytes) { + var buffer = new Array(bytes); + var exponentLength = bytes * 8 - mantissaLength - 1; + var eMax = (1 << exponentLength) - 1; + var eBias = eMax >> 1; + var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0; + var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0; + var index = 0; + var exponent, mantissa, c; + number = abs(number); // eslint-disable-next-line no-self-compare + + if (number != number || number === Infinity$1) { + // eslint-disable-next-line no-self-compare + mantissa = number != number ? 1 : 0; + exponent = eMax; + } else { + exponent = floor$1(log$1(number) / LN2$1); + + if (number * (c = pow(2, -exponent)) < 1) { + exponent--; + c *= 2; + } + + if (exponent + eBias >= 1) { + number += rt / c; + } else { + number += rt * pow(2, 1 - eBias); + } + + if (number * c >= 2) { + exponent++; + c /= 2; + } + + if (exponent + eBias >= eMax) { + mantissa = 0; + exponent = eMax; + } else if (exponent + eBias >= 1) { + mantissa = (number * c - 1) * pow(2, mantissaLength); + exponent = exponent + eBias; + } else { + mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength); + exponent = 0; + } + } + + for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8); + + exponent = exponent << mantissaLength | mantissa; + exponentLength += mantissaLength; + + for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8); + + buffer[--index] |= sign * 128; + return buffer; +}; + +var unpack = function (buffer, mantissaLength) { + var bytes = buffer.length; + var exponentLength = bytes * 8 - mantissaLength - 1; + var eMax = (1 << exponentLength) - 1; + var eBias = eMax >> 1; + var nBits = exponentLength - 7; + var index = bytes - 1; + var sign = buffer[index--]; + var exponent = sign & 127; + var mantissa; + sign >>= 7; + + for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8); + + mantissa = exponent & (1 << -nBits) - 1; + exponent >>= -nBits; + nBits += mantissaLength; + + for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8); + + if (exponent === 0) { + exponent = 1 - eBias; + } else if (exponent === eMax) { + return mantissa ? NaN : sign ? -Infinity$1 : Infinity$1; + } else { + mantissa = mantissa + pow(2, mantissaLength); + exponent = exponent - eBias; + } + + return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength); +}; + +var ieee754 = { + pack: pack, + unpack: unpack +}; + +// https://tc39.github.io/ecma262/#sec-array.prototype.fill + + +var arrayFill = function fill(value +/* , start = 0, end = @length */ +) { + var O = toObject(this); + var length = toLength(O.length); + var argumentsLength = arguments.length; + var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length); + var end = argumentsLength > 2 ? arguments[2] : undefined; + var endPos = end === undefined ? length : toAbsoluteIndex(end, length); + + while (endPos > index) O[index++] = value; + + return O; +}; + +var getOwnPropertyNames$1 = objectGetOwnPropertyNames.f; +var defineProperty$7 = objectDefineProperty.f; +var getInternalState$3 = internalState.get; +var setInternalState$4 = internalState.set; +var ARRAY_BUFFER = 'ArrayBuffer'; +var DATA_VIEW = 'DataView'; +var PROTOTYPE$2 = 'prototype'; +var WRONG_LENGTH = 'Wrong length'; +var WRONG_INDEX = 'Wrong index'; +var NativeArrayBuffer = global_1[ARRAY_BUFFER]; +var $ArrayBuffer = NativeArrayBuffer; +var $DataView = global_1[DATA_VIEW]; +var $DataViewPrototype = $DataView && $DataView[PROTOTYPE$2]; +var ObjectPrototype$2 = Object.prototype; +var RangeError$1 = global_1.RangeError; +var packIEEE754 = ieee754.pack; +var unpackIEEE754 = ieee754.unpack; + +var packInt8 = function (number) { + return [number & 0xFF]; +}; + +var packInt16 = function (number) { + return [number & 0xFF, number >> 8 & 0xFF]; +}; + +var packInt32 = function (number) { + return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF]; +}; + +var unpackInt32 = function (buffer) { + return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0]; +}; + +var packFloat32 = function (number) { + return packIEEE754(number, 23, 4); +}; + +var packFloat64 = function (number) { + return packIEEE754(number, 52, 8); +}; + +var addGetter = function (Constructor, key) { + defineProperty$7(Constructor[PROTOTYPE$2], key, { + get: function () { + return getInternalState$3(this)[key]; + } + }); +}; + +var get$1 = function (view, count, index, isLittleEndian) { + var intIndex = toIndex(index); + var store = getInternalState$3(view); + if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX); + var bytes = getInternalState$3(store.buffer).bytes; + var start = intIndex + store.byteOffset; + var pack = bytes.slice(start, start + count); + return isLittleEndian ? pack : pack.reverse(); +}; + +var set$1 = function (view, count, index, conversion, value, isLittleEndian) { + var intIndex = toIndex(index); + var store = getInternalState$3(view); + if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX); + var bytes = getInternalState$3(store.buffer).bytes; + var start = intIndex + store.byteOffset; + var pack = conversion(+value); + + for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1]; +}; + +if (!arrayBufferNative) { + $ArrayBuffer = function ArrayBuffer(length) { + anInstance(this, $ArrayBuffer, ARRAY_BUFFER); + var byteLength = toIndex(length); + setInternalState$4(this, { + bytes: arrayFill.call(new Array(byteLength), 0), + byteLength: byteLength + }); + if (!descriptors) this.byteLength = byteLength; + }; + + $DataView = function DataView(buffer, byteOffset, byteLength) { + anInstance(this, $DataView, DATA_VIEW); + anInstance(buffer, $ArrayBuffer, DATA_VIEW); + var bufferLength = getInternalState$3(buffer).byteLength; + var offset = toInteger(byteOffset); + if (offset < 0 || offset > bufferLength) throw RangeError$1('Wrong offset'); + byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength); + if (offset + byteLength > bufferLength) throw RangeError$1(WRONG_LENGTH); + setInternalState$4(this, { + buffer: buffer, + byteLength: byteLength, + byteOffset: offset + }); + + if (!descriptors) { + this.buffer = buffer; + this.byteLength = byteLength; + this.byteOffset = offset; + } + }; + + if (descriptors) { + addGetter($ArrayBuffer, 'byteLength'); + addGetter($DataView, 'buffer'); + addGetter($DataView, 'byteLength'); + addGetter($DataView, 'byteOffset'); + } + + redefineAll($DataView[PROTOTYPE$2], { + getInt8: function getInt8(byteOffset) { + return get$1(this, 1, byteOffset)[0] << 24 >> 24; + }, + getUint8: function getUint8(byteOffset) { + return get$1(this, 1, byteOffset)[0]; + }, + getInt16: function getInt16(byteOffset + /* , littleEndian */ + ) { + var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined); + return (bytes[1] << 8 | bytes[0]) << 16 >> 16; + }, + getUint16: function getUint16(byteOffset + /* , littleEndian */ + ) { + var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined); + return bytes[1] << 8 | bytes[0]; + }, + getInt32: function getInt32(byteOffset + /* , littleEndian */ + ) { + return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)); + }, + getUint32: function getUint32(byteOffset + /* , littleEndian */ + ) { + return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0; + }, + getFloat32: function getFloat32(byteOffset + /* , littleEndian */ + ) { + return unpackIEEE754(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23); + }, + getFloat64: function getFloat64(byteOffset + /* , littleEndian */ + ) { + return unpackIEEE754(get$1(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52); + }, + setInt8: function setInt8(byteOffset, value) { + set$1(this, 1, byteOffset, packInt8, value); + }, + setUint8: function setUint8(byteOffset, value) { + set$1(this, 1, byteOffset, packInt8, value); + }, + setInt16: function setInt16(byteOffset, value + /* , littleEndian */ + ) { + set$1(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setUint16: function setUint16(byteOffset, value + /* , littleEndian */ + ) { + set$1(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setInt32: function setInt32(byteOffset, value + /* , littleEndian */ + ) { + set$1(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setUint32: function setUint32(byteOffset, value + /* , littleEndian */ + ) { + set$1(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setFloat32: function setFloat32(byteOffset, value + /* , littleEndian */ + ) { + set$1(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setFloat64: function setFloat64(byteOffset, value + /* , littleEndian */ + ) { + set$1(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined); + } + }); +} else { + if (!fails(function () { + NativeArrayBuffer(1); + }) || !fails(function () { + new NativeArrayBuffer(-1); // eslint-disable-line no-new + }) || fails(function () { + new NativeArrayBuffer(); // eslint-disable-line no-new + + new NativeArrayBuffer(1.5); // eslint-disable-line no-new + + new NativeArrayBuffer(NaN); // eslint-disable-line no-new + + return NativeArrayBuffer.name != ARRAY_BUFFER; + })) { + $ArrayBuffer = function ArrayBuffer(length) { + anInstance(this, $ArrayBuffer); + return new NativeArrayBuffer(toIndex(length)); + }; + + var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE$2] = NativeArrayBuffer[PROTOTYPE$2]; + + for (var keys$2 = getOwnPropertyNames$1(NativeArrayBuffer), j$1 = 0, key$1; keys$2.length > j$1;) { + if (!((key$1 = keys$2[j$1++]) in $ArrayBuffer)) { + createNonEnumerableProperty($ArrayBuffer, key$1, NativeArrayBuffer[key$1]); + } + } + + ArrayBufferPrototype.constructor = $ArrayBuffer; + } // WebKit bug - the same parent prototype for typed arrays and data view + + + if (objectSetPrototypeOf && objectGetPrototypeOf($DataViewPrototype) !== ObjectPrototype$2) { + objectSetPrototypeOf($DataViewPrototype, ObjectPrototype$2); + } // iOS Safari 7.x bug + + + var testView = new $DataView(new $ArrayBuffer(2)); + var nativeSetInt8 = $DataViewPrototype.setInt8; + testView.setInt8(0, 2147483648); + testView.setInt8(1, 2147483649); + if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, { + setInt8: function setInt8(byteOffset, value) { + nativeSetInt8.call(this, byteOffset, value << 24 >> 24); + }, + setUint8: function setUint8(byteOffset, value) { + nativeSetInt8.call(this, byteOffset, value << 24 >> 24); + } + }, { + unsafe: true + }); +} + +setToStringTag($ArrayBuffer, ARRAY_BUFFER); +setToStringTag($DataView, DATA_VIEW); +var arrayBuffer = { + ArrayBuffer: $ArrayBuffer, + DataView: $DataView +}; + +var SPECIES$2 = wellKnownSymbol('species'); // `SpeciesConstructor` abstract operation +// https://tc39.github.io/ecma262/#sec-speciesconstructor + +var speciesConstructor = function (O, defaultConstructor) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES$2]) == undefined ? defaultConstructor : aFunction$1(S); +}; + +var ArrayBuffer$1 = arrayBuffer.ArrayBuffer; +var DataView$1 = arrayBuffer.DataView; +var nativeArrayBufferSlice = ArrayBuffer$1.prototype.slice; +var INCORRECT_SLICE = fails(function () { + return !new ArrayBuffer$1(2).slice(1, undefined).byteLength; +}); // `ArrayBuffer.prototype.slice` method +// https://tc39.github.io/ecma262/#sec-arraybuffer.prototype.slice + +_export({ + target: 'ArrayBuffer', + proto: true, + unsafe: true, + forced: INCORRECT_SLICE +}, { + slice: function slice(start, end) { + if (nativeArrayBufferSlice !== undefined && end === undefined) { + return nativeArrayBufferSlice.call(anObject(this), start); // FF fix + } + + var length = anObject(this).byteLength; + var first = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); + var result = new (speciesConstructor(this, ArrayBuffer$1))(toLength(fin - first)); + var viewSource = new DataView$1(this); + var viewTarget = new DataView$1(result); + var index = 0; + + while (first < fin) { + viewTarget.setUint8(index++, viewSource.getUint8(first++)); + } + + return result; + } +}); + +var defineProperty$8 = objectDefineProperty.f; +var Int8Array$1 = global_1.Int8Array; +var Int8ArrayPrototype = Int8Array$1 && Int8Array$1.prototype; +var Uint8ClampedArray = global_1.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array$1 && objectGetPrototypeOf(Int8Array$1); +var TypedArrayPrototype = Int8ArrayPrototype && objectGetPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype$3 = Object.prototype; +var isPrototypeOf = ObjectPrototype$3.isPrototypeOf; +var TO_STRING_TAG$4 = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); // Fixing native typed arrays in Opera Presto crashes the browser, see #595 + +var NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferNative && !!objectSetPrototypeOf && classof(global_1.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQIRED = false; +var NAME$1; +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; + +var isView = function isView(it) { + var klass = classof(it); + return klass === 'DataView' || has(TypedArrayConstructorsList, klass); +}; + +var isTypedArray = function (it) { + return isObject(it) && has(TypedArrayConstructorsList, classof(it)); +}; + +var aTypedArray = function (it) { + if (isTypedArray(it)) return it; + throw TypeError('Target is not a typed array'); +}; + +var aTypedArrayConstructor = function (C) { + if (objectSetPrototypeOf) { + if (isPrototypeOf.call(TypedArray, C)) return C; + } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME$1)) { + var TypedArrayConstructor = global_1[ARRAY]; + + if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) { + return C; + } + } + + throw TypeError('Target is not a typed array constructor'); +}; + +var exportTypedArrayMethod = function (KEY, property, forced) { + if (!descriptors) return; + if (forced) for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = global_1[ARRAY]; + + if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) { + delete TypedArrayConstructor.prototype[KEY]; + } + } + + if (!TypedArrayPrototype[KEY] || forced) { + redefine(TypedArrayPrototype, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property); + } +}; + +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!descriptors) return; + + if (objectSetPrototypeOf) { + if (forced) for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global_1[ARRAY]; + + if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) { + delete TypedArrayConstructor[KEY]; + } + } + + if (!TypedArray[KEY] || forced) { + // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable + try { + return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array$1[KEY] || property); + } catch (error) { + /* empty */ + } + } else return; + } + + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global_1[ARRAY]; + + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + redefine(TypedArrayConstructor, KEY, property); + } + } +}; + +for (NAME$1 in TypedArrayConstructorsList) { + if (!global_1[NAME$1]) NATIVE_ARRAY_BUFFER_VIEWS = false; +} // WebKit bug - typed arrays constructors prototype is Object.prototype + + +if (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) { + // eslint-disable-next-line no-shadow + TypedArray = function TypedArray() { + throw TypeError('Incorrect invocation'); + }; + + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) { + if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1], TypedArray); + } +} + +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype$3) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) { + if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1].prototype, TypedArrayPrototype); + } +} // WebKit bug - one more object in Uint8ClampedArray prototype chain + + +if (NATIVE_ARRAY_BUFFER_VIEWS && objectGetPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + objectSetPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} + +if (descriptors && !has(TypedArrayPrototype, TO_STRING_TAG$4)) { + TYPED_ARRAY_TAG_REQIRED = true; + defineProperty$8(TypedArrayPrototype, TO_STRING_TAG$4, { + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + + for (NAME$1 in TypedArrayConstructorsList) if (global_1[NAME$1]) { + createNonEnumerableProperty(global_1[NAME$1], TYPED_ARRAY_TAG, NAME$1); + } +} + +var arrayBufferViewCore = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + +/* eslint-disable no-new */ + +var NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS; +var ArrayBuffer$2 = global_1.ArrayBuffer; +var Int8Array$2 = global_1.Int8Array; +var typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$1 || !fails(function () { + Int8Array$2(1); +}) || !fails(function () { + new Int8Array$2(-1); +}) || !checkCorrectnessOfIteration(function (iterable) { + new Int8Array$2(); + new Int8Array$2(null); + new Int8Array$2(1.5); + new Int8Array$2(iterable); +}, true) || fails(function () { + // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill + return new Int8Array$2(new ArrayBuffer$2(2), 1, undefined).length !== 1; +}); + +var toPositiveInteger = function (it) { + var result = toInteger(it); + if (result < 0) throw RangeError("The argument can't be less than 0"); + return result; +}; + +var toOffset = function (it, BYTES) { + var offset = toPositiveInteger(it); + if (offset % BYTES) throw RangeError('Wrong offset'); + return offset; +}; + +var aTypedArrayConstructor$1 = arrayBufferViewCore.aTypedArrayConstructor; + +var typedArrayFrom = function from(source +/* , mapfn, thisArg */ +) { + var O = toObject(source); + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var iteratorMethod = getIteratorMethod(O); + var i, length, result, step, iterator, next; + + if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) { + iterator = iteratorMethod.call(O); + next = iterator.next; + O = []; + + while (!(step = next.call(iterator)).done) { + O.push(step.value); + } + } + + if (mapping && argumentsLength > 2) { + mapfn = functionBindContext(mapfn, arguments[2], 2); + } + + length = toLength(O.length); + result = new (aTypedArrayConstructor$1(this))(length); + + for (i = 0; length > i; i++) { + result[i] = mapping ? mapfn(O[i], i) : O[i]; + } + + return result; +}; + +var typedArrayConstructor = createCommonjsModule(function (module) { + + var getOwnPropertyNames = objectGetOwnPropertyNames.f; + var forEach = arrayIteration.forEach; + var getInternalState = internalState.get; + var setInternalState = internalState.set; + var nativeDefineProperty = objectDefineProperty.f; + var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f; + var round = Math.round; + var RangeError = global_1.RangeError; + var ArrayBuffer = arrayBuffer.ArrayBuffer; + var DataView = arrayBuffer.DataView; + var NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS; + var TYPED_ARRAY_TAG = arrayBufferViewCore.TYPED_ARRAY_TAG; + var TypedArray = arrayBufferViewCore.TypedArray; + var TypedArrayPrototype = arrayBufferViewCore.TypedArrayPrototype; + var aTypedArrayConstructor = arrayBufferViewCore.aTypedArrayConstructor; + var isTypedArray = arrayBufferViewCore.isTypedArray; + var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT'; + var WRONG_LENGTH = 'Wrong length'; + + var fromList = function (C, list) { + var index = 0; + var length = list.length; + var result = new (aTypedArrayConstructor(C))(length); + + while (length > index) result[index] = list[index++]; + + return result; + }; + + var addGetter = function (it, key) { + nativeDefineProperty(it, key, { + get: function () { + return getInternalState(this)[key]; + } + }); + }; + + var isArrayBuffer = function (it) { + var klass; + return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer'; + }; + + var isTypedArrayIndex = function (target, key) { + return isTypedArray(target) && typeof key != 'symbol' && key in target && String(+key) == String(key); + }; + + var wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) { + return isTypedArrayIndex(target, key = toPrimitive(key, true)) ? createPropertyDescriptor(2, target[key]) : nativeGetOwnPropertyDescriptor(target, key); + }; + + var wrappedDefineProperty = function defineProperty(target, key, descriptor) { + if (isTypedArrayIndex(target, key = toPrimitive(key, true)) && isObject(descriptor) && has(descriptor, 'value') && !has(descriptor, 'get') && !has(descriptor, 'set') // TODO: add validation descriptor w/o calling accessors + && !descriptor.configurable && (!has(descriptor, 'writable') || descriptor.writable) && (!has(descriptor, 'enumerable') || descriptor.enumerable)) { + target[key] = descriptor.value; + return target; + } + + return nativeDefineProperty(target, key, descriptor); + }; + + if (descriptors) { + if (!NATIVE_ARRAY_BUFFER_VIEWS) { + objectGetOwnPropertyDescriptor.f = wrappedGetOwnPropertyDescriptor; + objectDefineProperty.f = wrappedDefineProperty; + addGetter(TypedArrayPrototype, 'buffer'); + addGetter(TypedArrayPrototype, 'byteOffset'); + addGetter(TypedArrayPrototype, 'byteLength'); + addGetter(TypedArrayPrototype, 'length'); + } + + _export({ + target: 'Object', + stat: true, + forced: !NATIVE_ARRAY_BUFFER_VIEWS + }, { + getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor, + defineProperty: wrappedDefineProperty + }); + + module.exports = function (TYPE, wrapper, CLAMPED) { + var BYTES = TYPE.match(/\d+$/)[0] / 8; + var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array'; + var GETTER = 'get' + TYPE; + var SETTER = 'set' + TYPE; + var NativeTypedArrayConstructor = global_1[CONSTRUCTOR_NAME]; + var TypedArrayConstructor = NativeTypedArrayConstructor; + var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype; + var exported = {}; + + var getter = function (that, index) { + var data = getInternalState(that); + return data.view[GETTER](index * BYTES + data.byteOffset, true); + }; + + var setter = function (that, index, value) { + var data = getInternalState(that); + if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF; + data.view[SETTER](index * BYTES + data.byteOffset, value, true); + }; + + var addElement = function (that, index) { + nativeDefineProperty(that, index, { + get: function () { + return getter(this, index); + }, + set: function (value) { + return setter(this, index, value); + }, + enumerable: true + }); + }; + + if (!NATIVE_ARRAY_BUFFER_VIEWS) { + TypedArrayConstructor = wrapper(function (that, data, offset, $length) { + anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME); + var index = 0; + var byteOffset = 0; + var buffer, byteLength, length; + + if (!isObject(data)) { + length = toIndex(data); + byteLength = length * BYTES; + buffer = new ArrayBuffer(byteLength); + } else if (isArrayBuffer(data)) { + buffer = data; + byteOffset = toOffset(offset, BYTES); + var $len = data.byteLength; + + if ($length === undefined) { + if ($len % BYTES) throw RangeError(WRONG_LENGTH); + byteLength = $len - byteOffset; + if (byteLength < 0) throw RangeError(WRONG_LENGTH); + } else { + byteLength = toLength($length) * BYTES; + if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH); + } + + length = byteLength / BYTES; + } else if (isTypedArray(data)) { + return fromList(TypedArrayConstructor, data); + } else { + return typedArrayFrom.call(TypedArrayConstructor, data); + } + + setInternalState(that, { + buffer: buffer, + byteOffset: byteOffset, + byteLength: byteLength, + length: length, + view: new DataView(buffer) + }); + + while (index < length) addElement(that, index++); + }); + if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray); + TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = objectCreate(TypedArrayPrototype); + } else if (typedArrayConstructorsRequireWrappers) { + TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) { + anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME); + return inheritIfRequired(function () { + if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data)); + if (isArrayBuffer(data)) return $length !== undefined ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length) : typedArrayOffset !== undefined ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES)) : new NativeTypedArrayConstructor(data); + if (isTypedArray(data)) return fromList(TypedArrayConstructor, data); + return typedArrayFrom.call(TypedArrayConstructor, data); + }(), dummy, TypedArrayConstructor); + }); + if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray); + forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) { + if (!(key in TypedArrayConstructor)) { + createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]); + } + }); + TypedArrayConstructor.prototype = TypedArrayConstructorPrototype; + } + + if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) { + createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor); + } + + if (TYPED_ARRAY_TAG) { + createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME); + } + + exported[CONSTRUCTOR_NAME] = TypedArrayConstructor; + _export({ + global: true, + forced: TypedArrayConstructor != NativeTypedArrayConstructor, + sham: !NATIVE_ARRAY_BUFFER_VIEWS + }, exported); + + if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) { + createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES); + } + + if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) { + createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES); + } + + setSpecies(CONSTRUCTOR_NAME); + }; + } else module.exports = function () { + /* empty */ + }; +}); + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Float32', function (init) { + return function Float32Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Float64', function (init) { + return function Float64Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +var min$2 = Math.min; // `Array.prototype.copyWithin` method implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin + +var arrayCopyWithin = [].copyWithin || function copyWithin(target +/* = 0 */ +, start +/* = 0, end = @length */ +) { + var O = toObject(this); + var len = toLength(O.length); + var to = toAbsoluteIndex(target, len); + var from = toAbsoluteIndex(start, len); + var end = arguments.length > 2 ? arguments[2] : undefined; + var count = min$2((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); + var inc = 1; + + if (from < to && to < from + count) { + inc = -1; + from += count - 1; + to += count - 1; + } + + while (count-- > 0) { + if (from in O) O[to] = O[from];else delete O[to]; + to += inc; + from += inc; + } + + return O; +}; + +var aTypedArray$1 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$1 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.copyWithin` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.copywithin + +exportTypedArrayMethod$1('copyWithin', function copyWithin(target, start +/* , end */ +) { + return arrayCopyWithin.call(aTypedArray$1(this), target, start, arguments.length > 2 ? arguments[2] : undefined); +}); + +var $every = arrayIteration.every; +var aTypedArray$2 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$2 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.every` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every + +exportTypedArrayMethod$2('every', function every(callbackfn +/* , thisArg */ +) { + return $every(aTypedArray$2(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); +}); + +var aTypedArray$3 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$3 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.fill` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.fill +// eslint-disable-next-line no-unused-vars + +exportTypedArrayMethod$3('fill', function fill(value +/* , start, end */ +) { + return arrayFill.apply(aTypedArray$3(this), arguments); +}); + +var $filter = arrayIteration.filter; +var aTypedArray$4 = arrayBufferViewCore.aTypedArray; +var aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor; +var exportTypedArrayMethod$4 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.filter` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter + +exportTypedArrayMethod$4('filter', function filter(callbackfn +/* , thisArg */ +) { + var list = $filter(aTypedArray$4(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + var C = speciesConstructor(this, this.constructor); + var index = 0; + var length = list.length; + var result = new (aTypedArrayConstructor$2(C))(length); + + while (length > index) result[index] = list[index++]; + + return result; +}); + +var $find$1 = arrayIteration.find; +var aTypedArray$5 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$5 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.find` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find + +exportTypedArrayMethod$5('find', function find(predicate +/* , thisArg */ +) { + return $find$1(aTypedArray$5(this), predicate, arguments.length > 1 ? arguments[1] : undefined); +}); + +var $findIndex = arrayIteration.findIndex; +var aTypedArray$6 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$6 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.findIndex` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex + +exportTypedArrayMethod$6('findIndex', function findIndex(predicate +/* , thisArg */ +) { + return $findIndex(aTypedArray$6(this), predicate, arguments.length > 1 ? arguments[1] : undefined); +}); + +var $forEach$1 = arrayIteration.forEach; +var aTypedArray$7 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$7 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.forEach` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.foreach + +exportTypedArrayMethod$7('forEach', function forEach(callbackfn +/* , thisArg */ +) { + $forEach$1(aTypedArray$7(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); +}); + +var $includes$1 = arrayIncludes.includes; +var aTypedArray$8 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$8 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.includes` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.includes + +exportTypedArrayMethod$8('includes', function includes(searchElement +/* , fromIndex */ +) { + return $includes$1(aTypedArray$8(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); +}); + +var $indexOf = arrayIncludes.indexOf; +var aTypedArray$9 = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$9 = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.indexOf` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.indexof + +exportTypedArrayMethod$9('indexOf', function indexOf(searchElement +/* , fromIndex */ +) { + return $indexOf(aTypedArray$9(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); +}); + +var ITERATOR$6 = wellKnownSymbol('iterator'); +var Uint8Array$1 = global_1.Uint8Array; +var arrayValues = es_array_iterator.values; +var arrayKeys = es_array_iterator.keys; +var arrayEntries = es_array_iterator.entries; +var aTypedArray$a = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$a = arrayBufferViewCore.exportTypedArrayMethod; +var nativeTypedArrayIterator = Uint8Array$1 && Uint8Array$1.prototype[ITERATOR$6]; +var CORRECT_ITER_NAME = !!nativeTypedArrayIterator && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined); + +var typedArrayValues = function values() { + return arrayValues.call(aTypedArray$a(this)); +}; // `%TypedArray%.prototype.entries` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.entries + + +exportTypedArrayMethod$a('entries', function entries() { + return arrayEntries.call(aTypedArray$a(this)); +}); // `%TypedArray%.prototype.keys` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.keys + +exportTypedArrayMethod$a('keys', function keys() { + return arrayKeys.call(aTypedArray$a(this)); +}); // `%TypedArray%.prototype.values` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.values + +exportTypedArrayMethod$a('values', typedArrayValues, !CORRECT_ITER_NAME); // `%TypedArray%.prototype[@@iterator]` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype-@@iterator + +exportTypedArrayMethod$a(ITERATOR$6, typedArrayValues, !CORRECT_ITER_NAME); + +var aTypedArray$b = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$b = arrayBufferViewCore.exportTypedArrayMethod; +var $join = [].join; // `%TypedArray%.prototype.join` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.join +// eslint-disable-next-line no-unused-vars + +exportTypedArrayMethod$b('join', function join(separator) { + return $join.apply(aTypedArray$b(this), arguments); +}); + +var arrayMethodIsStrict = function (METHOD_NAME, argument) { + var method = [][METHOD_NAME]; + return !!method && fails(function () { + // eslint-disable-next-line no-useless-call,no-throw-literal + method.call(null, argument || function () { + throw 1; + }, 1); + }); +}; + +var min$3 = Math.min; +var nativeLastIndexOf = [].lastIndexOf; +var NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0; +var STRICT_METHOD = arrayMethodIsStrict('lastIndexOf'); // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method + +var USES_TO_LENGTH$2 = arrayMethodUsesToLength('indexOf', { + ACCESSORS: true, + 1: 0 +}); +var FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH$2; // `Array.prototype.lastIndexOf` method implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof + +var arrayLastIndexOf = FORCED ? function lastIndexOf(searchElement +/* , fromIndex = @[*-1] */ +) { + // convert -0 to +0 + if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0; + var O = toIndexedObject(this); + var length = toLength(O.length); + var index = length - 1; + if (arguments.length > 1) index = min$3(index, toInteger(arguments[1])); + if (index < 0) index = length + index; + + for (; index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0; + + return -1; +} : nativeLastIndexOf; + +var aTypedArray$c = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$c = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.lastIndexOf` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.lastindexof +// eslint-disable-next-line no-unused-vars + +exportTypedArrayMethod$c('lastIndexOf', function lastIndexOf(searchElement +/* , fromIndex */ +) { + return arrayLastIndexOf.apply(aTypedArray$c(this), arguments); +}); + +var $map = arrayIteration.map; +var aTypedArray$d = arrayBufferViewCore.aTypedArray; +var aTypedArrayConstructor$3 = arrayBufferViewCore.aTypedArrayConstructor; +var exportTypedArrayMethod$d = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.map` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.map + +exportTypedArrayMethod$d('map', function map(mapfn +/* , thisArg */ +) { + return $map(aTypedArray$d(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) { + return new (aTypedArrayConstructor$3(speciesConstructor(O, O.constructor)))(length); + }); +}); + +var createMethod$4 = function (IS_RIGHT) { + return function (that, callbackfn, argumentsLength, memo) { + aFunction$1(callbackfn); + var O = toObject(that); + var self = indexedObject(O); + var length = toLength(O.length); + var index = IS_RIGHT ? length - 1 : 0; + var i = IS_RIGHT ? -1 : 1; + if (argumentsLength < 2) while (true) { + if (index in self) { + memo = self[index]; + index += i; + break; + } + + index += i; + + if (IS_RIGHT ? index < 0 : length <= index) { + throw TypeError('Reduce of empty array with no initial value'); + } + } + + for (; IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { + memo = callbackfn(memo, self[index], index, O); + } + + return memo; + }; +}; + +var arrayReduce = { + // `Array.prototype.reduce` method + // https://tc39.github.io/ecma262/#sec-array.prototype.reduce + left: createMethod$4(false), + // `Array.prototype.reduceRight` method + // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright + right: createMethod$4(true) +}; + +var $reduce = arrayReduce.left; +var aTypedArray$e = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$e = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.reduce` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce + +exportTypedArrayMethod$e('reduce', function reduce(callbackfn +/* , initialValue */ +) { + return $reduce(aTypedArray$e(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); +}); + +var $reduceRight = arrayReduce.right; +var aTypedArray$f = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$f = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.reduceRicht` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright + +exportTypedArrayMethod$f('reduceRight', function reduceRight(callbackfn +/* , initialValue */ +) { + return $reduceRight(aTypedArray$f(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); +}); + +var aTypedArray$g = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$g = arrayBufferViewCore.exportTypedArrayMethod; +var floor$2 = Math.floor; // `%TypedArray%.prototype.reverse` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reverse + +exportTypedArrayMethod$g('reverse', function reverse() { + var that = this; + var length = aTypedArray$g(that).length; + var middle = floor$2(length / 2); + var index = 0; + var value; + + while (index < middle) { + value = that[index]; + that[index++] = that[--length]; + that[length] = value; + } + + return that; +}); + +var aTypedArray$h = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$h = arrayBufferViewCore.exportTypedArrayMethod; +var FORCED$1 = fails(function () { + // eslint-disable-next-line no-undef + new Int8Array(1).set({}); +}); // `%TypedArray%.prototype.set` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.set + +exportTypedArrayMethod$h('set', function set(arrayLike +/* , offset */ +) { + aTypedArray$h(this); + var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1); + var length = this.length; + var src = toObject(arrayLike); + var len = toLength(src.length); + var index = 0; + if (len + offset > length) throw RangeError('Wrong length'); + + while (index < len) this[offset + index] = src[index++]; +}, FORCED$1); + +var aTypedArray$i = arrayBufferViewCore.aTypedArray; +var aTypedArrayConstructor$4 = arrayBufferViewCore.aTypedArrayConstructor; +var exportTypedArrayMethod$i = arrayBufferViewCore.exportTypedArrayMethod; +var $slice = [].slice; +var FORCED$2 = fails(function () { + // eslint-disable-next-line no-undef + new Int8Array(1).slice(); +}); // `%TypedArray%.prototype.slice` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice + +exportTypedArrayMethod$i('slice', function slice(start, end) { + var list = $slice.call(aTypedArray$i(this), start, end); + var C = speciesConstructor(this, this.constructor); + var index = 0; + var length = list.length; + var result = new (aTypedArrayConstructor$4(C))(length); + + while (length > index) result[index] = list[index++]; + + return result; +}, FORCED$2); + +var $some = arrayIteration.some; +var aTypedArray$j = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$j = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.some` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.some + +exportTypedArrayMethod$j('some', function some(callbackfn +/* , thisArg */ +) { + return $some(aTypedArray$j(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); +}); + +var aTypedArray$k = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$k = arrayBufferViewCore.exportTypedArrayMethod; +var $sort = [].sort; // `%TypedArray%.prototype.sort` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort + +exportTypedArrayMethod$k('sort', function sort(comparefn) { + return $sort.call(aTypedArray$k(this), comparefn); +}); + +var aTypedArray$l = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$l = arrayBufferViewCore.exportTypedArrayMethod; // `%TypedArray%.prototype.subarray` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray + +exportTypedArrayMethod$l('subarray', function subarray(begin, end) { + var O = aTypedArray$l(this); + var length = O.length; + var beginIndex = toAbsoluteIndex(begin, length); + return new (speciesConstructor(O, O.constructor))(O.buffer, O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)); +}); + +var Int8Array$3 = global_1.Int8Array; +var aTypedArray$m = arrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod$m = arrayBufferViewCore.exportTypedArrayMethod; +var $toLocaleString = [].toLocaleString; +var $slice$1 = [].slice; // iOS Safari 6.x fails here + +var TO_LOCALE_STRING_BUG = !!Int8Array$3 && fails(function () { + $toLocaleString.call(new Int8Array$3(1)); +}); +var FORCED$3 = fails(function () { + return [1, 2].toLocaleString() != new Int8Array$3([1, 2]).toLocaleString(); +}) || !fails(function () { + Int8Array$3.prototype.toLocaleString.call([1, 2]); +}); // `%TypedArray%.prototype.toLocaleString` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring + +exportTypedArrayMethod$m('toLocaleString', function toLocaleString() { + return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice$1.call(aTypedArray$m(this)) : aTypedArray$m(this), arguments); +}, FORCED$3); + +var exportTypedArrayMethod$n = arrayBufferViewCore.exportTypedArrayMethod; +var Uint8Array$2 = global_1.Uint8Array; +var Uint8ArrayPrototype = Uint8Array$2 && Uint8Array$2.prototype || {}; +var arrayToString = [].toString; +var arrayJoin = [].join; + +if (fails(function () { + arrayToString.call({}); +})) { + arrayToString = function toString() { + return arrayJoin.call(this); + }; +} + +var IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString; // `%TypedArray%.prototype.toString` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring + +exportTypedArrayMethod$n('toString', arrayToString, IS_NOT_ARRAY_METHOD); + +/** + * @summary 数学ユーティリティー + * + * @classdesc + *

数学関連の関数または定数を定義するユーティリティークラスである。

+ *

このクラスは static メンバーしか持たない。

+ * + * @hideconstructor + * @memberof mapray + * @see mapray.Matrix + */ +var GeoMath = +/*#__PURE__*/ +function () { + function GeoMath() { + _classCallCheck(this, GeoMath); + } + + _createClass(GeoMath, null, [{ + key: "createMatrix", + + /** + * @summary 行列オブジェクトを作成 + * @desc + *

mat を複製する。ただし mat を省略したときは、すべての要素が 0 の行列を生成する。

+ * + * @param {mapray.Matrix} [mat] 入力行列 + * @return {mapray.Matrix} 新しい行列 + */ + value: function createMatrix(mat) { + return new Float64Array(mat || 16); + } + /** + * @summary 行列 (単精度) オブジェクトを作成 + * @param {mapray.Matrix} [mat] 入力行列 + * @return {mapray.Matrix} 新しい行列 + * @package + */ + + }, { + key: "createMatrixf", + value: function createMatrixf(mat) { + return new Float32Array(mat || 16); + } + /** + * @summary 4 次ベクトルの生成 + * @desc + *

vec を複製して 4 次ベクトルを生成する。ただし vec を省略したときは、すべての要素が 0 のベクトルを生成する。

+ * @param {mapray.Vector4} [vec] 入力ベクトル + * @return {mapray.Vector4} 新しいベクトル + */ + + }, { + key: "createVector4", + value: function createVector4(vec) { + return new Float64Array(vec || 4); + } + /** + * @summary 4 次ベクトル (単精度) の生成 + * @param {mapray.Vector4} [vec] 入力ベクトル + * @return {mapray.Vector4} 新しいベクトル + * @package + */ + + }, { + key: "createVector4f", + value: function createVector4f(vec) { + return new Float32Array(vec || 4); + } + /** + * @summary 3 次ベクトルの生成 + *

vec を複製して 3 次ベクトルを生成する。ただし vec を省略したときは、すべての要素が 0 のベクトルを生成する。

+ * @param {mapray.Vector3} [vec] 入力ベクトル + * @return {mapray.Vector3} 新しいベクトル + */ + + }, { + key: "createVector3", + value: function createVector3(vec) { + return new Float64Array(vec || 3); + } + /** + * @summary 3 次ベクトル (単精度) の生成 + * @param {mapray.Vector3} [vec] 入力ベクトル + * @return {mapray.Vector3} 新しいベクトル + * @package + */ + + }, { + key: "createVector3f", + value: function createVector3f(vec) { + return new Float32Array(vec || 3); + } + /** + * @summary 2 次ベクトルの生成 + *

vec を複製して 2 次ベクトルを生成する。ただし vec を省略したときは、すべての要素が 0 のベクトルを生成する。

+ * @param {mapray.Vector2} [vec] 入力ベクトル + * @return {mapray.Vector2} 新しいベクトル + */ + + }, { + key: "createVector2", + value: function createVector2(vec) { + return new Float64Array(vec || 2); + } + /** + * @summary 2 次ベクトル (単精度) の生成 + * @param {mapray.Vector2} [vec] 入力ベクトル + * @return {mapray.Vector2} 新しいベクトル + * @package + */ + + }, { + key: "createVector2f", + value: function createVector2f(vec) { + return new Float32Array(vec || 2); + } + /** + * @summary 行列を代入 + * @desc + *

src を dst に代入する。

+ * @param {mapray.Matrix} src 代入元 + * @param {mapray.Matrix} dst 代入先 + * @return {mapray.Matrix} dst + */ + + }, { + key: "copyMatrix", + value: function copyMatrix(src, dst) { + for (var i = 0; i < 16; ++i) { + dst[i] = src[i]; + } + + return dst; + } + /** + * @summary 4 次ベクトルを代入 + * @desc + *

src を dst に代入する。

+ * @param {mapray.Vector4} src 代入元 + * @param {mapray.Vector4} dst 代入先 + * @return {mapray.Vector4} dst + */ + + }, { + key: "copyVector4", + value: function copyVector4(src, dst) { + for (var i = 0; i < 4; ++i) { + dst[i] = src[i]; + } + + return dst; + } + /** + * @summary 3 次ベクトルを代入 + * @desc + *

src を dst に代入する。

+ * @param {mapray.Vector3} src 代入元 + * @param {mapray.Vector3} dst 代入先 + * @return {mapray.Vector3} dst + */ + + }, { + key: "copyVector3", + value: function copyVector3(src, dst) { + for (var i = 0; i < 3; ++i) { + dst[i] = src[i]; + } + + return dst; + } + /** + * @summary 2 次ベクトルを代入 + * @desc + *

src を dst に代入する。

+ * @param {mapray.Vector2} src 代入元 + * @param {mapray.Vector2} dst 代入先 + * @return {mapray.Vector2} dst + */ + + }, { + key: "copyVector2", + value: function copyVector2(src, dst) { + dst[0] = src[0]; + dst[1] = src[1]; + return dst; + } + /** + * @summary 恒等行列を設定 + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "setIdentity", + value: function setIdentity(dst) { + dst[0] = 1; + dst[1] = 0; + dst[2] = 0; + dst[3] = 0; + dst[4] = 0; + dst[5] = 1; + dst[6] = 0; + dst[7] = 0; + dst[8] = 0; + dst[9] = 0; + dst[10] = 1; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + return dst; + } + /** + * @summary 3 次ベクトルの内積を計算 + * @param {mapray.Vector3} a 左のベクトル + * @param {mapray.Vector3} b 右のベクトル + * @return {number} a と b の内積 + */ + + }, { + key: "dot3", + value: function dot3(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + /** + * @summary 3次ベクトルの外積を計算 + * @param {mapray.Vector3} a 左のベクトル + * @param {mapray.Vector3} b 右のベクトル + * @param {mapray.Vector3} dst a と b の外積を代入するベクトル + * @return {mapray.Vector3} dst + */ + + }, { + key: "cross3", + value: function cross3(a, b, dst) { + var x = a[1] * b[2] - a[2] * b[1]; + var y = a[2] * b[0] - a[0] * b[2]; + var z = a[0] * b[1] - a[1] * b[0]; + dst[0] = x; + dst[1] = y; + dst[2] = z; + return dst; + } + /** + * @summary 3次ベクトルの正規化を計算 + * @param {mapray.Vector3} vec ベクトル + * @param {mapray.Vector3} dst 正規化された値を代入するベクトル + * @return {mapray.Vector3} dst + */ + + }, { + key: "normalize3", + value: function normalize3(vec, dst) { + var x = vec[0]; + var y = vec[1]; + var z = vec[2]; + var ilen = 1 / Math.sqrt(x * x + y * y + z * z); // 長さの逆数 + + dst[0] = vec[0] * ilen; + dst[1] = vec[1] * ilen; + dst[2] = vec[2] * ilen; + return dst; + } + }, { + key: "scale3", + value: function scale3(a, vec, dst) { + dst[0] = a * vec[0]; + dst[1] = a * vec[1]; + dst[2] = a * vec[2]; + return dst; + } + /** + * @summary 行列の積を計算 (アフィン変換 x アフィン変換) + * @param {mapray.Matrix} a 左の行列 + * @param {mapray.Matrix} b 右の行列 + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "mul_AA", + value: function mul_AA(a, b, dst) { + var a00 = a[0], + a01 = a[4], + a02 = a[8], + a03 = a[12], + a10 = a[1], + a11 = a[5], + a12 = a[9], + a13 = a[13], + a20 = a[2], + a21 = a[6], + a22 = a[10], + a23 = a[14]; + var b00 = b[0], + b01 = b[4], + b02 = b[8], + b03 = b[12], + b10 = b[1], + b11 = b[5], + b12 = b[9], + b13 = b[13], + b20 = b[2], + b21 = b[6], + b22 = b[10], + b23 = b[14]; + dst[0] = a00 * b00 + a01 * b10 + a02 * b20; + dst[1] = a10 * b00 + a11 * b10 + a12 * b20; + dst[2] = a20 * b00 + a21 * b10 + a22 * b20; + dst[3] = 0; + dst[4] = a00 * b01 + a01 * b11 + a02 * b21; + dst[5] = a10 * b01 + a11 * b11 + a12 * b21; + dst[6] = a20 * b01 + a21 * b11 + a22 * b21; + dst[7] = 0; + dst[8] = a00 * b02 + a01 * b12 + a02 * b22; + dst[9] = a10 * b02 + a11 * b12 + a12 * b22; + dst[10] = a20 * b02 + a21 * b12 + a22 * b22; + dst[11] = 0; + dst[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03; + dst[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13; + dst[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23; + dst[15] = 1; + return dst; + } + /** + * @summary 行列の積を計算 (一般変換 x アフィン変換) + * @param {mapray.Matrix} a 左の行列 + * @param {mapray.Matrix} b 右の行列 + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "mul_GA", + value: function mul_GA(a, b, dst) { + var a00 = a[0], + a01 = a[4], + a02 = a[8], + a03 = a[12], + a10 = a[1], + a11 = a[5], + a12 = a[9], + a13 = a[13], + a20 = a[2], + a21 = a[6], + a22 = a[10], + a23 = a[14], + a30 = a[3], + a31 = a[7], + a32 = a[11], + a33 = a[15]; + var b00 = b[0], + b01 = b[4], + b02 = b[8], + b03 = b[12], + b10 = b[1], + b11 = b[5], + b12 = b[9], + b13 = b[13], + b20 = b[2], + b21 = b[6], + b22 = b[10], + b23 = b[14]; + dst[0] = a00 * b00 + a01 * b10 + a02 * b20; + dst[1] = a10 * b00 + a11 * b10 + a12 * b20; + dst[2] = a20 * b00 + a21 * b10 + a22 * b20; + dst[3] = a30 * b00 + a31 * b10 + a32 * b20; + dst[4] = a00 * b01 + a01 * b11 + a02 * b21; + dst[5] = a10 * b01 + a11 * b11 + a12 * b21; + dst[6] = a20 * b01 + a21 * b11 + a22 * b21; + dst[7] = a30 * b01 + a31 * b11 + a32 * b21; + dst[8] = a00 * b02 + a01 * b12 + a02 * b22; + dst[9] = a10 * b02 + a11 * b12 + a12 * b22; + dst[10] = a20 * b02 + a21 * b12 + a22 * b22; + dst[11] = a30 * b02 + a31 * b12 + a32 * b22; + dst[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03; + dst[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13; + dst[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23; + dst[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33; + return dst; + } + /** + * @summary 行列の積を計算 (投影変換 x アフィン変換) + * @param {mapray.Matrix} a 左の行列 + * @param {mapray.Matrix} b 右の行列 + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "mul_PzA", + value: function mul_PzA(a, b, dst) { + var a00 = a[0], + a02 = a[8], + a03 = a[12]; + var a11 = a[5], + a12 = a[9], + a13 = a[13]; + var a22 = a[10], + a23 = a[14]; + var a32 = a[11], + a33 = a[15]; + var b00 = b[0], + b01 = b[4], + b02 = b[8], + b03 = b[12], + b10 = b[1], + b11 = b[5], + b12 = b[9], + b13 = b[13], + b20 = b[2], + b21 = b[6], + b22 = b[10], + b23 = b[14]; + dst[0] = a00 * b00 + a02 * b20; + dst[1] = a11 * b10 + a12 * b20; + dst[2] = a22 * b20; + dst[3] = a32 * b20; + dst[4] = a00 * b01 + a02 * b21; + dst[5] = a11 * b11 + a12 * b21; + dst[6] = a22 * b21; + dst[7] = a32 * b21; + dst[8] = a00 * b02 + a02 * b22; + dst[9] = a11 * b12 + a12 * b22; + dst[10] = a22 * b22; + dst[11] = a32 * b22; + dst[12] = a00 * b03 + a02 * b23 + a03; + dst[13] = a11 * b13 + a12 * b23 + a13; + dst[14] = a22 * b23 + a23; + dst[15] = a32 * b23 + a33; + return dst; + } + /** + * @summary 逆行列を計算 (アフィン変換) + * @param {mapray.Matrix} mat 行列 + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "inverse_A", + value: function inverse_A(mat, dst) { + var a00 = mat[0], + a01 = mat[4], + a02 = mat[8], + a03 = mat[12], + a10 = mat[1], + a11 = mat[5], + a12 = mat[9], + a13 = mat[13], + a20 = mat[2], + a21 = mat[6], + a22 = mat[10], + a23 = mat[14]; // cofactors + + var b00 = a11 * a22 - a21 * a12; + var b01 = a20 * a12 - a10 * a22; + var b02 = a10 * a21 - a20 * a11; + var b10 = a21 * a02 - a01 * a22; + var b11 = a00 * a22 - a20 * a02; + var b12 = a20 * a01 - a00 * a21; + var b20 = a01 * a12 - a11 * a02; + var b21 = a10 * a02 - a00 * a12; + var b22 = a00 * a11 - a10 * a01; + var b30 = -(a03 * b00 + a13 * b10 + a23 * b20); + var b31 = -(a03 * b01 + a13 * b11 + a23 * b21); + var b32 = -(a03 * b02 + a13 * b12 + a23 * b22); // 1/det(mat) + + var idet = 1 / (a00 * b00 + a01 * b01 + a02 * b02); // matの余因子行列 / det(mat) + + dst[0] = b00 * idet; + dst[1] = b01 * idet; + dst[2] = b02 * idet; + dst[3] = 0; + dst[4] = b10 * idet; + dst[5] = b11 * idet; + dst[6] = b12 * idet; + dst[7] = 0; + dst[8] = b20 * idet; + dst[9] = b21 * idet; + dst[10] = b22 * idet; + dst[11] = 0; + dst[12] = b30 * idet; + dst[13] = b31 * idet; + dst[14] = b32 * idet; + dst[15] = 1; + return dst; + } + /** + * @summary 平面ベクトルを変換 (アフィン変換) + * @desc + *

mat には平面ベクトルを変換する行列を指定する。 + * 位置ベクトルを変換する行列が M なら、平面ベクトルを変換する行列は M-1 を指定する。

+ * + *

dst には plane * mat が代入される。

+ * + * @param mat {mapray.Matrix} 変換行列 + * @param plane {mapray.Vector4} 平面ベクトル + * @param dst {mapray.Vector4} 結果を代入するベクトル + * @return {mapray.Vector4} dst + */ + + }, { + key: "transformPlane_A", + value: function transformPlane_A(mat, plane, dst) { + var m = mat; + var x = plane[0]; + var y = plane[1]; + var z = plane[2]; + var w = plane[3]; + dst[0] = x * m[0] + y * m[1] + z * m[2]; + dst[1] = x * m[4] + y * m[5] + z * m[6]; + dst[2] = x * m[8] + y * m[9] + z * m[10]; + dst[3] = x * m[12] + y * m[13] + z * m[14] + w; + return dst; + } + /** + * @summary 座標変換行列を計算 (Inou 球面座標系 → 地心直交座標系) + * @desc + *

原点が position の直交座標系 (LOCS) から地心直交座標系 (GOCS) に変換する行列を計算する。

+ *

position.height + GeoMath.EARTH_RADIUS > 0 かつ position.latitude == 0 のとき、LOCS の Z 軸は上方向、Y 軸は北方向、X 軸は東方向となる。

+ * + * @param {object} position 位置 (Inou 球面座標系) + * @param {number} position.latitude 緯度 (Degrees) + * @param {number} position.longitude 経度 (Degrees) + * @param {number} position.height 高度 (Meters) + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + * + * @deprecated {@link mapray.GeoPoint#getMlocsToGocsMatrix} の使用を推奨 + */ + + }, { + key: "iscs_to_gocs_matrix", + value: function iscs_to_gocs_matrix(position, dst) { + var λ = position.longitude * GeoMath.DEGREE; + var φ = position.latitude * GeoMath.DEGREE; + var sinλ = Math.sin(λ); + var cosλ = Math.cos(λ); + var sinφ = Math.sin(φ); + var cosφ = Math.cos(φ); + var r = GeoMath.EARTH_RADIUS + position.height; // ∂u/∂λ + + dst[0] = -sinλ; + dst[1] = cosλ; + dst[2] = 0; + dst[3] = 0; // ∂u/∂φ + + dst[4] = -cosλ * sinφ; + dst[5] = -sinλ * sinφ; + dst[6] = cosφ; + dst[7] = 0; // u = {x, y, z} / r + + dst[8] = cosφ * cosλ; + dst[9] = cosφ * sinλ; + dst[10] = sinφ; + dst[11] = 0; // {x, y, z} + + dst[12] = r * cosφ * cosλ; + dst[13] = r * cosφ * sinλ; + dst[14] = r * sinφ; + dst[15] = 1; + return dst; + } + /** + * @summary 地心直交座標を Inou 球面座標に変換 + * + * @param {mapray.Vector3} src 入力 GOCS 座標 (Meters) + * @param {object} dst 出力 ISCS 座標 + * @param {number} dst.latitude 緯度 (Degrees) + * @param {number} dst.longitude 経度 (Degrees) + * @param {number} dst.height 高度 (Meters) + * @return {object} dst + * + * @deprecated {@link mapray.GeoPoint#setFromGocs} の使用を推奨 + */ + + }, { + key: "gocs_to_iscs", + value: function gocs_to_iscs(src, dst) { + var x = src[0]; + var y = src[1]; + var z = src[2]; + var x2 = x * x; + var y2 = y * y; + var z2 = z * z; // 緯度 φ = ArcTan[z / √(x^2 + y^2)] + // 経度 λ = ArcTan[x, y] + + if (x != 0 || y != 0) { + dst.latitude = Math.atan(z / Math.sqrt(x2 + y2)) / GeoMath.DEGREE; + dst.longitude = Math.atan2(y, x) / GeoMath.DEGREE; + } else { + // x == 0 && y == 0 + if (z > 0) dst.latitude = 90;else if (z < 0) dst.latitude = -90;else dst.latitude = 0; + dst.longitude = 0; + } // 高度 h = √(x^2 + y^2 + z^2) - R + + + dst.height = Math.sqrt(x2 + y2 + z2) - GeoMath.EARTH_RADIUS; + return dst; + } + /** + * @summary 座標変換行列を計算 (視点座標系 → クリップ同次座標系) + * @param {number} left + * @param {number} right + * @param {number} bottom + * @param {number} top + * @param {number} nearVal + * @param {number} farVal + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + * + * @see https://www.opengl.org/sdk/docs/man2/xhtml/glFrustum.xml + */ + + }, { + key: "frustum_matrix", + value: function frustum_matrix(left, right, bottom, top, nearVal, farVal, dst) { + dst[0] = 2 * nearVal / (right - left); + dst[1] = 0; + dst[2] = 0; + dst[3] = 0; + dst[4] = 0; + dst[5] = 2 * nearVal / (top - bottom); + dst[6] = 0; + dst[7] = 0; + dst[8] = (right + left) / (right - left); + dst[9] = (top + bottom) / (top - bottom); + dst[10] = (farVal + nearVal) / (nearVal - farVal); + dst[11] = -1; + dst[12] = 0; + dst[13] = 0; + dst[14] = 2 * farVal * nearVal / (nearVal - farVal); + dst[15] = 0; + return dst; + } + /** + * @summary 座標変換行列を計算 (右手座標系 → 視点座標系) + * + * @param {mapray.Vector3} eye 視点の位置 + * @param {mapray.Vector3} center 注視点の位置 + * @param {mapray.Vector3} up 上方向ベクトル + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "lookat_matrix", + value: function lookat_matrix(eye, center, up, dst) { + var xaxis = GeoMath._xaxis; + var yaxis = GeoMath._yaxis; + var zaxis = GeoMath._zaxis; + zaxis[0] = eye[0] - center[0]; + zaxis[1] = eye[1] - center[1]; + zaxis[2] = eye[2] - center[2]; + GeoMath.normalize3(zaxis, zaxis); + GeoMath.cross3(up, zaxis, xaxis); + GeoMath.normalize3(xaxis, xaxis); + GeoMath.cross3(zaxis, xaxis, yaxis); // 単位ベクトルになっている + + dst[0] = xaxis[0]; + dst[1] = xaxis[1]; + dst[2] = xaxis[2]; + dst[3] = 0; + dst[4] = yaxis[0]; + dst[5] = yaxis[1]; + dst[6] = yaxis[2]; + dst[7] = 0; + dst[8] = zaxis[0]; + dst[9] = zaxis[1]; + dst[10] = zaxis[2]; + dst[11] = 0; + dst[12] = eye[0]; + dst[13] = eye[1]; + dst[14] = eye[2]; + dst[15] = 1; + return dst; + } + /** + * @summary 任意軸回りの回転行列 + * @desc + *

axis を Z 軸方向とすると、X 軸から Y 軸の方向に angle 度回転させる変換行列を返す。

+ * @param {mapray.Vector3} axis 回転軸 (単位ベクトル) + * @param {number} angle 回転角 (Degrees) + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "rotation_matrix", + value: function rotation_matrix(axis, angle, dst) { + var θ = angle * GeoMath.DEGREE; + var sinθ = Math.sin(θ); + var cosθ = Math.cos(θ); + var ax = axis[0]; + var ay = axis[1]; + var az = axis[2]; + dst[0] = ax * ax * (1 - cosθ) + cosθ; + dst[1] = ax * ay * (1 - cosθ) + az * sinθ; + dst[2] = ax * az * (1 - cosθ) - ay * sinθ; + dst[3] = 0; + dst[4] = ax * ay * (1 - cosθ) - az * sinθ; + dst[5] = ay * ay * (1 - cosθ) + cosθ; + dst[6] = ay * az * (1 - cosθ) + ax * sinθ; + dst[7] = 0; + dst[8] = ax * az * (1 - cosθ) + ay * sinθ; + dst[9] = ay * az * (1 - cosθ) - ax * sinθ; + dst[10] = az * az * (1 - cosθ) + cosθ; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + return dst; + } + /** + * @summary KML 互換のモデル変換行列 + * + * @desc + *

変換は scale -> roll -> tilt -> heading の順に行われる。

+ * + * @param {number} heading Z 軸を中心に Y 軸から X 軸の方向の回転角 (Degrees) + * @param {number} tilt X 軸を中心に Z 軸から Y 軸の方向の回転角 (Degrees) + * @param {number} roll Y 軸を中心に X 軸から Z 軸の方向の回転角 (Degrees) + * @param {mapray.Vector3} scale スケール + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + * + * @package + * @see https://developers.google.com/kml/documentation/kmlreference#model + * + * @deprecated {@link mapray.Orientation#getTransformMatrix} の使用を推奨 + */ + + }, { + key: "kml_model_matrix", + value: function kml_model_matrix(heading, tilt, roll, scale, dst) { + var h = heading * GeoMath.DEGREE; + var t = tilt * GeoMath.DEGREE; + var r = roll * GeoMath.DEGREE; + var sinH = Math.sin(h); + var cosH = Math.cos(h); + var sinT = Math.sin(t); + var cosT = Math.cos(t); + var sinR = Math.sin(r); + var cosR = Math.cos(r); + var sx = scale[0]; + var sy = scale[1]; + var sz = scale[2]; + dst[0] = sx * (sinH * sinR * sinT + cosH * cosR); + dst[1] = sx * (cosH * sinR * sinT - sinH * cosR); + dst[2] = sx * sinR * cosT; + dst[3] = 0; + dst[4] = sy * sinH * cosT; + dst[5] = sy * cosH * cosT; + dst[6] = -sy * sinT; + dst[7] = 0; + dst[8] = sz * (sinH * cosR * sinT - cosH * sinR); + dst[9] = sz * (cosH * cosR * sinT + sinH * sinR); + dst[10] = sz * cosR * cosT; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + return dst; + } + /** + * @summary グーデルマン関数 + * @param {number} x 数値 + * @return {number} gd( x ) + */ + + }, { + key: "gudermannian", + value: function gudermannian(x) { + return 2 * Math.atan(Math.exp(x)) - Math.PI / 2; + } + /** + * @summary 逆グーデルマン関数 + * @param {number} x 数値 + * @return {number} gd-1( x ) + */ + + }, { + key: "invGudermannian", + value: function invGudermannian(x) { + return Math.log(Math.tan(x / 2 + Math.PI / 4)); + } + /** + * @summary 値を指定区間内に制限 + * @param {number} x 値 + * @param {number} min 最小値 + * @param {number} max 最大値 + * @return {number} min <= x <= max のとき x, x < min のとき min, x > max のとき max + */ + + }, { + key: "clamp", + value: function clamp(x, min, max) { + return Math.min(Math.max(x, min), max); + } + }]); + + return GeoMath; +}(); +/** + * @summary 地球の半径 + * @desc + *

Inou 球面座標系で定義された、地球の半径 (Meters) である。

+ * @type {number} + * @constant + */ + + +GeoMath.EARTH_RADIUS = 6378137; +/** + * @summary 1度に対応するラジアンの数値 + * @desc + *

この数値は π / 180 である。

+ *

度数を DEGREE で掛け合せることによってラジアンに変換することができる。

+ * @type {number} + * @constant + */ + +GeoMath.DEGREE = 0.017453292519943295769; +/** + * @summary log2(π) + * @type {number} + * @constant + */ + +GeoMath.LOG2PI = 1.6514961294723187980; +/** + * @summary 4行4列の行列を表現 + * @desc + *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 16 要素の配列に置き換えることができる。 + * この配列の数値の並びは列優先である。

+ * + * @class mapray.Matrix + * @see mapray.GeoMath + */ + +/** + * @summary 2次ベクトルを表現 + * @desc + *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 2 要素の配列に置き換えることができる。

+ * + * @class mapray.Vector2 + * @see mapray.GeoMath + */ + +/** + * @summary 3次ベクトルを表現 + * @desc + *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 3 要素の配列に置き換えることができる。

+ * + * @class mapray.Vector3 + * @see mapray.GeoMath + */ + +/** + * @summary 4次ベクトルを表現 + * @desc + *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 4 要素の配列に置き換えることができる。

+ * + * @class mapray.Vector4 + * @see mapray.GeoMath + */ +// GeoMath の内部テンポラリ変数を生成 + +{ + GeoMath._xaxis = GeoMath.createVector3(); + GeoMath._yaxis = GeoMath.createVector3(); + GeoMath._zaxis = GeoMath.createVector3(); +} +/** + * @summary 球面座標 + * + * @classdesc + *

経度、緯度、高度により位置を表現する。

+ * + * @memberof mapray + */ + +var GeoPoint = +/*#__PURE__*/ +function () { + /** + * @desc + *

経度、緯度、高度を与えてインスタンスを生成する。

+ * + * @param {number} [longitude=0] 経度 (Degrees) + * @param {number} [latitude=0] 緯度 (Degrees) + * @param {number} [altitude=0] 高度 (Meters) + */ + function GeoPoint(longitude, latitude, altitude) { + _classCallCheck(this, GeoPoint); + + /** + * @summary 経度 (Degrees) + * @member mapray.GeoPoint#longitude + * @type {number} + */ + this.longitude = longitude !== undefined ? longitude : 0; + /** + * @summary 緯度 (Degrees) + * @member mapray.GeoPoint#latitude + * @type {number} + */ + + this.latitude = latitude !== undefined ? latitude : 0; + /** + * @summary 高度 (Meters) + * @member mapray.GeoPoint#altitude + * @type {number} + */ + + this.altitude = altitude !== undefined ? altitude : 0; + } + /** + * @summary インスタンスを複製 + * + * @desc + *

this の複製を生成して返す。

+ * + * @return {mapray.GeoPoint} this の複製 + */ + + + _createClass(GeoPoint, [{ + key: "clone", + value: function clone() { + return new GeoPoint(this.longitude, this.latitude, this.altitude); + } + /** + * @summary インスタンスを代入 + * + * @desc + *

src を this に代入する。

+ * + * @param {mapray.GeoPoint} src 代入元 + * @return {mapray.GeoPoint} this + */ + + }, { + key: "assign", + value: function assign(src) { + this.longitude = src.longitude; + this.latitude = src.latitude; + this.altitude = src.altitude; + return this; + } + /** + * @summary 配列からの設定 + * + * @desc + *

longitude, latitude, altitude の順序で格納されている配列 position によりプロパティを設定する。

+ *

position の長さは 2 または 3 で、長さが 2 なら altitude は 0 に設定される。

+ * + * @param {number[]} position [longitude, latitude, altitude] または [longitude, latitude] + * @return {mapray.GeoPoint} this + */ + + }, { + key: "setFromArray", + value: function setFromArray(position) { + this.longitude = position[0]; + this.latitude = position[1]; + this.altitude = position.length > 2 ? position[2] : 0; + return this; + } + /** + * @summary 地心直交座標からの設定 + * + * @desc + *

地心直交座標 position を球面座標に変換して this に設定する。

+ * + * @param {mapray.Vector3} position 入力 GOCS 座標 (Meters) + * @return {mapray.GeoPoint} this + */ + + }, { + key: "setFromGocs", + value: function setFromGocs(position) { + var x = position[0]; + var y = position[1]; + var z = position[2]; + var x2 = x * x; + var y2 = y * y; + var z2 = z * z; // 緯度 φ = ArcTan[z / √(x^2 + y^2)] + // 経度 λ = ArcTan[x, y] + + if (x != 0 || y != 0) { + this.latitude = Math.atan(z / Math.sqrt(x2 + y2)) / GeoMath.DEGREE; + this.longitude = Math.atan2(y, x) / GeoMath.DEGREE; + } else { + // x == 0 && y == 0 + if (z > 0) this.latitude = 90;else if (z < 0) this.latitude = -90;else this.latitude = 0; + this.longitude = 0; + } // 高度 h = √(x^2 + y^2 + z^2) - R + + + this.altitude = Math.sqrt(x2 + y2 + z2) - GeoMath.EARTH_RADIUS; + return this; + } + /** + * @summary 地心直交座標として取得 + * + * @param {mapray.Vector3} dst 結果を格納するオブジェクト + * @return {mapray.Vector3} dst + */ + + }, { + key: "getAsGocs", + value: function getAsGocs(dst) { + var λ = this.longitude * GeoMath.DEGREE; + var φ = this.latitude * GeoMath.DEGREE; + var r = GeoMath.EARTH_RADIUS + this.altitude; + var cosφ = Math.cos(φ); + dst[0] = r * cosφ * Math.cos(λ); + dst[1] = r * cosφ * Math.sin(λ); + dst[2] = r * Math.sin(φ); + return dst; + } + /** + * @summary 座標変換行列を計算 (MLOCS → GOCS) + * @desc + *

原点が this の Mapray ローカル直交座標系 (MLOCS) から地心直交座標系 (GOCS) に変換する行列を計算する。

+ * + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "getMlocsToGocsMatrix", + value: function getMlocsToGocsMatrix(dst) { + var λ = this.longitude * GeoMath.DEGREE; + var φ = this.latitude * GeoMath.DEGREE; + var sinλ = Math.sin(λ); + var cosλ = Math.cos(λ); + var sinφ = Math.sin(φ); + var cosφ = Math.cos(φ); + var r = GeoMath.EARTH_RADIUS + this.altitude; // ∂u/∂λ + + dst[0] = -sinλ; + dst[1] = cosλ; + dst[2] = 0; + dst[3] = 0; // ∂u/∂φ + + dst[4] = -cosλ * sinφ; + dst[5] = -sinλ * sinφ; + dst[6] = cosφ; + dst[7] = 0; // u = {x, y, z} / r + + dst[8] = cosφ * cosλ; + dst[9] = cosφ * sinλ; + dst[10] = sinφ; + dst[11] = 0; // {x, y, z} + + dst[12] = r * cosφ * cosλ; + dst[13] = r * cosφ * sinλ; + dst[14] = r * sinφ; + dst[15] = 1; + return dst; + } + /** + * @summary 鉛直上方向のベクトルを計算 + * + * @param {mapray.Vector3} dst 結果を代入するオブジェクト + * @return {mapray.Vector3} dst + */ + + }, { + key: "getUpwardVector", + value: function getUpwardVector(dst) { + var λ = this.longitude * GeoMath.DEGREE; + var φ = this.latitude * GeoMath.DEGREE; + var cosφ = Math.cos(φ); + dst[0] = cosφ * Math.cos(λ); + dst[1] = cosφ * Math.sin(λ); + dst[2] = Math.sin(φ); + return dst; + } + /** + * @summary 地表面(高度0)での2地点間の距離を算出 + * @desc + *

GeoMath.DEGREE を半径とする真球として計算する。

+ * + * @param {mapray.GeoPoint} to + * @return {number} arc 距離(m) + */ + + }, { + key: "getGeographicalDistance", + value: function getGeographicalDistance(to) { + var from_vec = this.getAsGocs(GeoMath.createVector3()); + var to_vec = to.getAsGocs(GeoMath.createVector3()); + var cross = GeoMath.cross3(from_vec, to_vec, GeoMath.createVector3()); + return GeoMath.EARTH_RADIUS * Math.atan2(Math.sqrt(cross[0] * cross[0] + cross[1] * cross[1] + cross[2] * cross[2]), GeoMath.dot3(from_vec, to_vec)); + } + /** + * @summary 球面座標を地心直交座標に変換 + * + * @param {number[]} points [lon_0, lat_0, alt_0, ...] + * @param {number} num_points 点の数 + * @param {number[]} dst [x0, y0, z0, ...] (結果を格納する配列) + * @return {number[]} dst + * + * @see {@link mapray.GeoPoint.getAsGocs} + */ + + }], [{ + key: "toGocsArray", + value: function toGocsArray(points, num_points, dst) { + var degree = GeoMath.DEGREE; + var radius = GeoMath.EARTH_RADIUS; + + for (var i = 0; i < num_points; ++i) { + var b = 3 * i; + var λ = points[b] * degree; + var φ = points[b + 1] * degree; + var r = radius + points[b + 2]; + var cosφ = Math.cos(φ); + dst[b] = r * cosφ * Math.cos(λ); + dst[b + 1] = r * cosφ * Math.sin(λ); + dst[b + 2] = r * Math.sin(φ); + } + + return dst; + } + }]); + + return GeoPoint; +}(); +/** + * @summary 方向表現 + * + * @classdesc + *

heading (機首方位)、tilt (前後の傾き)、roll (左右の傾き) により方向を表現する。

+ * + * @memberof mapray + * @see https://developers.google.com/kml/documentation/kmlreference#model + */ + + +var Orientation = +/*#__PURE__*/ +function () { + /** + * @desc + *

heading, tilt, roll に角度を与えてインスタンスを生成する。

+ * + * @param {number} [heading=0] 機首方位 (Degrees) + * @param {number} [tilt=0] 前後の傾き (Degrees) + * @param {number} [roll=0] 左右の傾き (Degrees) + */ + function Orientation(heading, tilt, roll) { + _classCallCheck(this, Orientation); + + /** + * @summary 機首方位 (Degrees) + * @member mapray.Orientation#heading + * @type {number} + */ + this.heading = heading !== undefined ? heading : 0; + /** + * @summary 前後の傾き (Degrees) + * @member mapray.Orientation#tilt + * @type {number} + */ + + this.tilt = tilt !== undefined ? tilt : 0; + /** + * @summary 左右の傾き (Degrees) + * @member mapray.Orientation#roll + * @type {number} + */ + + this.roll = roll !== undefined ? roll : 0; + } + /** + * @summary インスタンスを複製 + * + * @desc + *

this の複製を生成して返す。

+ * + * @return {mapray.Orientation} this の複製 + */ + + + _createClass(Orientation, [{ + key: "clone", + value: function clone() { + return new Orientation(this.heading, this.tilt, this.roll); + } + /** + * @summary インスタンスを代入 + * + * @desc + *

src を this に代入する。

+ * + * @param {mapray.Orientation} src 代入元 + * @return {mapray.Orientation} this + */ + + }, { + key: "assign", + value: function assign(src) { + this.heading = src.heading; + this.tilt = src.tilt; + this.roll = src.roll; + return this; + } + /** + * @summary 変換行列を取得 + * + * @desc + *

変換は scale -> roll -> tilt -> heading の順に行われる。

+ * + * @param {mapray.Vector3} scale スケール + * @param {mapray.Matrix} dst 結果を代入する行列 + * @return {mapray.Matrix} dst + */ + + }, { + key: "getTransformMatrix", + value: function getTransformMatrix(scale, dst) { + var h = this.heading * GeoMath.DEGREE; + var t = this.tilt * GeoMath.DEGREE; + var r = this.roll * GeoMath.DEGREE; + var sinH = Math.sin(h); + var cosH = Math.cos(h); + var sinT = Math.sin(t); + var cosT = Math.cos(t); + var sinR = Math.sin(r); + var cosR = Math.cos(r); + var sx = scale[0]; + var sy = scale[1]; + var sz = scale[2]; + dst[0] = sx * (sinH * sinR * sinT + cosH * cosR); + dst[1] = sx * (cosH * sinR * sinT - sinH * cosR); + dst[2] = sx * sinR * cosT; + dst[3] = 0; + dst[4] = sy * sinH * cosT; + dst[5] = sy * cosH * cosT; + dst[6] = -sy * sinT; + dst[7] = 0; + dst[8] = sz * (sinH * cosR * sinT - cosH * sinR); + dst[9] = sz * (cosH * cosR * sinT + sinH * sinR); + dst[10] = sz * cosR * cosT; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + return dst; + } + }]); + + return Orientation; +}(); + +/* + * 解説: このファイルで GeoPoint クラスと Orientation クラスを定義している理由 + * + * GeoPoint と Orientation のインタフェースは GeoMath に依存しないが、GeoMath + * のインタフェースは GeoPoint や Orientation に依存する可能性がある。 + * + * 一方、GeoPoint と Orientation の内部実装では一部の GeoMath インタフェースを + * 使用できたほうが都合がよい。 + * + * GeoPoint と Orientation を個別のファイルで定義したいが、この場合実装のために + * GeoMath をインポートすることになる。 + * + * そうすると、GeoMath.js に GeoPoint や Orientation が (循環依存のため) + * インポートできなくなってしまう。 + * + * そこで GeoMath.js 内で GeoPoint と Orientation を定義する。これで GeoPoint + * と Orientation の実装で GeoMath を使用でき、GeoMath のインタフェースと実装で + * GeoPoint や Orientation を使用できる。 + * + * GeoPoint はまず GeoMath.js から GeoPoint.js にエクスポートし、さらに + * GeoPoint.js から GeoPoint を他のファイルにエクスポートする。 + * Orientation も同様のことを行う。 + * + * このようにすることで、他のファイルからは実装の事情は見えなくなる。 + */ + +/** + * @summary 真理値型 + * + * @classdesc + *

登録名: "boolean"

+ *

実装型: boolean

+ *

次の型へ変換可能: {@link mapray.animation.NumberType}

+ * + * @memberof mapray.animation + * @extends mapray.animation.Type + * @hideconstructor + */ + +var BooleanType = +/*#__PURE__*/ +function (_Type) { + _inherits(BooleanType, _Type); + + /** + */ + function BooleanType() { + var _this; + + _classCallCheck(this, BooleanType); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(BooleanType).call(this, "boolean")); + _this._number_type = null; + _this._convertibles = new Set([_assertThisInitialized(_this)]); + return _this; + } + /** + * @private + */ + + + _createClass(BooleanType, [{ + key: "_postinit", + value: function _postinit() { + this._number_type = Type.find("number"); + + this._convertibles.add(this._number_type); + } + /** + * @override + */ + + }, { + key: "isConvertible", + value: function isConvertible(from) { + return this._convertibles.has(from); + } + /** + * @override + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + if (from === this) { + // 同一型 + return value; + } else { + // assert: from === this._number_type + return value >= 0.5; + } + } + /** + * @override + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + return false; + } + /** + * @override + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + return value; + } + }]); + + return BooleanType; +}(Type); +/** + * @summary 数値型 + * + * @classdesc + *

登録名: "number"

+ *

実装型: number

+ *

次の型へ変換可能: {@link mapray.animation.BooleanType}

+ * + * @memberof mapray.animation + * @extends mapray.animation.Type + * @hideconstructor + */ + + +var NumberType = +/*#__PURE__*/ +function (_Type2) { + _inherits(NumberType, _Type2); + + /** + */ + function NumberType() { + var _this2; + + _classCallCheck(this, NumberType); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(NumberType).call(this, "number")); + _this2._boolean_type = null; + _this2._convertibles = new Set([_assertThisInitialized(_this2)]); + return _this2; + } + /** + * @private + */ + + + _createClass(NumberType, [{ + key: "_postinit", + value: function _postinit() { + this._boolean_type = Type.find("boolean"); + + this._convertibles.add(this._boolean_type); + } + /** + * @override + */ + + }, { + key: "isConvertible", + value: function isConvertible(from) { + return this._convertibles.has(from); + } + /** + * @override + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + if (from === this) { + // 同一型 + return value; + } else { + // assert: from === this._boolean_type + return value ? 1 : 0; + } + } + /** + * @override + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + return 0; + } + /** + * @override + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + return value; + } + }]); + + return NumberType; +}(Type); +/** + * @summary 文字列型 + * + * @classdesc + *

登録名: "string"

+ *

実装型: string

+ * + * @memberof mapray.animation + * @extends mapray.animation.Type + * @hideconstructor + */ + + +var StringType = +/*#__PURE__*/ +function (_Type3) { + _inherits(StringType, _Type3); + + /** + */ + function StringType() { + _classCallCheck(this, StringType); + + return _possibleConstructorReturn(this, _getPrototypeOf(StringType).call(this, "string")); + } + /** + * @private + */ + + + _createClass(StringType, [{ + key: "_postinit", + value: function _postinit() {} + /** + * @override + */ + + }, { + key: "isConvertible", + value: function isConvertible(from) { + return from === this; + } + /** + * @override + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + return value; + } + /** + * @override + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + return ""; + } + /** + * @override + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + return value; + } + }]); + + return StringType; +}(Type); +/** + * @summary 2 次ベクトル型 + * + * @classdesc + *

登録名: "vector2"

+ *

実装型: {@link mapray.Vector2}

+ * + * @memberof mapray.animation + * @extends mapray.animation.Type + * @hideconstructor + */ + + +var Vector2Type = +/*#__PURE__*/ +function (_Type4) { + _inherits(Vector2Type, _Type4); + + /** + */ + function Vector2Type() { + _classCallCheck(this, Vector2Type); + + return _possibleConstructorReturn(this, _getPrototypeOf(Vector2Type).call(this, "vector2")); + } + /** + * @private + */ + + + _createClass(Vector2Type, [{ + key: "_postinit", + value: function _postinit() {} + /** + * @override + */ + + }, { + key: "isConvertible", + value: function isConvertible(from) { + return from === this; + } + /** + * @override + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + return value; + } + /** + * @override + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + return GeoMath.createVector2(); + } + /** + * @override + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + return GeoMath.createVector2(value); + } + }]); + + return Vector2Type; +}(Type); +/** + * @summary 3 次ベクトル型 + * + * @classdesc + *

登録名: "vector3"

+ *

実装型: {@link mapray.Vector3}

+ * + * @memberof mapray.animation + * @extends mapray.animation.Type + * @hideconstructor + */ + + +var Vector3Type = +/*#__PURE__*/ +function (_Type5) { + _inherits(Vector3Type, _Type5); + + /** + */ + function Vector3Type() { + _classCallCheck(this, Vector3Type); + + return _possibleConstructorReturn(this, _getPrototypeOf(Vector3Type).call(this, "vector3")); + } + /** + * @private + */ + + + _createClass(Vector3Type, [{ + key: "_postinit", + value: function _postinit() {} + /** + * @override + */ + + }, { + key: "isConvertible", + value: function isConvertible(from) { + return from === this; + } + /** + * @override + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + return value; + } + /** + * @override + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + return GeoMath.createVector3(); + } + /** + * @override + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + return GeoMath.createVector3(value); + } + }]); + + return Vector3Type; +}(Type); +/** + * @summary 4 次ベクトル型 + * + * @classdesc + *

登録名: "vector4"

+ *

実装型: {@link mapray.Vector4}

+ * + * @memberof mapray.animation + * @extends mapray.animation.Type + * @hideconstructor + */ + + +var Vector4Type = +/*#__PURE__*/ +function (_Type6) { + _inherits(Vector4Type, _Type6); + + /** + */ + function Vector4Type() { + _classCallCheck(this, Vector4Type); + + return _possibleConstructorReturn(this, _getPrototypeOf(Vector4Type).call(this, "vector4")); + } + /** + * @private + */ + + + _createClass(Vector4Type, [{ + key: "_postinit", + value: function _postinit() {} + /** + * @override + */ + + }, { + key: "isConvertible", + value: function isConvertible(from) { + return from === this; + } + /** + * @override + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + return value; + } + /** + * @override + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + return GeoMath.createVector4(); + } + /** + * @override + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + return GeoMath.createVector4(value); + } + }]); + + return Vector4Type; +}(Type); +/** + * @summary 行列型 + * + * @classdesc + *

登録名: "matrix"

+ *

実装型: {@link mapray.Matrix}

+ * + * @memberof mapray.animation + * @extends mapray.animation.Type + * @hideconstructor + */ + + +var MatrixType = +/*#__PURE__*/ +function (_Type7) { + _inherits(MatrixType, _Type7); + + /** + */ + function MatrixType() { + _classCallCheck(this, MatrixType); + + return _possibleConstructorReturn(this, _getPrototypeOf(MatrixType).call(this, "matrix")); + } + /** + * @private + */ + + + _createClass(MatrixType, [{ + key: "_postinit", + value: function _postinit() {} + /** + * @override + */ + + }, { + key: "isConvertible", + value: function isConvertible(from) { + return from === this; + } + /** + * @override + */ + + }, { + key: "convertValue", + value: function convertValue(from, value) { + return value; + } + /** + * @override + */ + + }, { + key: "getDefaultValue", + value: function getDefaultValue() { + return GeoMath.setIdentity(GeoMath.createMatrix()); + } + /** + * @override + */ + + }, { + key: "getCloneValue", + value: function getCloneValue(value) { + return GeoMath.createMatrix(value); + } + }]); + + return MatrixType; +}(Type); +/** + * @summary 事前定義型を登録 + * + * @private + */ + + +function registerPredefinedTypes() { + var type_classes = [BooleanType, NumberType, StringType, Vector3Type, Vector2Type, Vector4Type, MatrixType]; + var type_instances = []; // 型を登録 + + for (var _i = 0, _type_classes = type_classes; _i < _type_classes.length; _i++) { + var type_class = _type_classes[_i]; + var type = new type_class(); + Type.register(type.name, type); + type_instances.push(type); + } // 登録後の処理 + + + for (var _i2 = 0, _type_instances = type_instances; _i2 < _type_instances.length; _i2++) { + var _type = _type_instances[_i2]; + + _type._postinit(); + } +} + +registerPredefinedTypes(); + +/** + * @summary アニメーション関数 + * + * @classdesc + *

指定時刻のアニメーション関数値を取得するための抽象クラスである。

+ * + * @abstract + * @memberof mapray.animation + */ +var Curve = +/*#__PURE__*/ +function () { + /** + * @protected + */ + function Curve() { + _classCallCheck(this, Curve); + + this._value_change_listeners = new Set(); + } + /** + * @summary 型はサポートされるか? + * + * @desc + *

type 型がアニメーション関数の返却値の型として使用できるかどうかを返す。

+ *

this の生存中、このメソッドの type に対する結果は一定である。

+ *

このメソッドが true を返した場合、getValue() により + * アニメーション関数値を type 型で取得することが可能である。

+ * + * @param {mapray.animation.Type} type 確認する型 + * + * @return {boolean} type がサポートされるとき true, それ以外は false + * + * @see {@link mapray.animation.Curve#getValue} + * + * @abstract + */ + + + _createClass(Curve, [{ + key: "isTypeSupported", + value: function isTypeSupported(type) { + this._override_error("isTypeSupported"); + } + /** + * @summary 指定時刻の値を取得 + * + * @desc + *

時刻 time のアニメーション関数値を type 型として取得する。

+ * + *

事前条件: this.isTypeSupported( type ) == true

+ * + * @param {mapray.animation.Time} time 時刻パラメータ + * @param {mapray.animation.Type} type 返却値の型 + * + * @return {object} 時刻 time に対する type 型の値 + * + * @see {@link mapray.animation.Curve#isTypeSupported} + * + * @abstract + */ + + }, { + key: "getValue", + value: function getValue(time, type) { + this._override_error("getValue"); + } + /** + * @summary 不変性情報を取得 + * + * @desc + *

interval で指定される範囲の不変性情報を返す。

+ * + *

不変性情報は interval に内包されるまたは交差する時刻区間を持っている。

+ *

一部が interval と交差する時刻区間はクリップしない。

+ * + *

事前条件: interval.isEmpty() == false

+ * + * @param {mapray.animation.Interval} interval 対象とする時刻区間 + * + * @return {mapray.animation.Invariance} 不変性情報 + * + * @abstract + */ + + }, { + key: "getInvariance", + value: function getInvariance(interval) { + this._override_error("getInvariance"); + } + /** + * @summary 関数値が変化したことを通知 + * + * @desc + *

時刻区間 interval の範囲の関数値が変化したことをフレームワークに通知する。

+ *

このメソッドは関数値が変化したときにサブクラスの実装者が呼び出す。

+ * + * @param {mapray.animation.Interval} interval 関数値が変化した時刻区間 + * + * @see {@link mapray.animation.Curve#addValueChangeListener} + * @see {@link mapray.animation.Curve#removeValueChangeListener} + * + * @protected + */ + + }, { + key: "notifyValueChange", + value: function notifyValueChange(interval) { + if (interval.isEmpty()) { + // 空時刻区間なので実際には変化なし + // ValueChangeListener の事前条件も満たさない + return; + } // 関数値変化リスナーの呼び出し + + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._value_change_listeners[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var vcl = _step.value; + vcl(interval); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * @summary 関数値変化リスナーの登録 + * + * @param {mapray.animation.Curve.ValueChangeListener} vcl 関数値変化リスナー + * + * @see {@link mapray.animation.Curve#notifyValueChange} + * @see {@link mapray.animation.Curve#removeValueChangeListener} + */ + + }, { + key: "addValueChangeListener", + value: function addValueChangeListener(vcl) { + this._value_change_listeners.add(vcl); + } + /** + * @summary 関数値変化リスナーの登録解除 + * + * @param {mapray.animation.Curve.ValueChangeListener} vcl 関数値変化リスナー + * + * @see {@link mapray.animation.Curve#notifyValueChange} + * @see {@link mapray.animation.Curve#addValueChangeListener} + */ + + }, { + key: "removeValueChangeListener", + value: function removeValueChangeListener(vcl) { + this._value_change_listeners["delete"](vcl); + } + /** + * @summary メソッドがオーバーライドされていない + * + * arguments.callee と Error#stack は互換性が低いので、関数名の取得に使わなかった + * + * @param {string} func_name + * + * @private + */ + + }, { + key: "_override_error", + value: function _override_error(func_name) { + throw new Error("Curve#" + func_name + "() method has not been overridden in " + this.constructor.name); + } + }]); + + return Curve; +}(); + +var createProperty = function (object, key, value) { + var propertyKey = toPrimitive(key); + if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));else object[propertyKey] = value; +}; + +// https://tc39.github.io/ecma262/#sec-array.from + + +var arrayFrom = function from(arrayLike +/* , mapfn = undefined, thisArg = undefined */ +) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var iteratorMethod = getIteratorMethod(O); + var index = 0; + var length, result, step, iterator, next, value; + if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2); // if the target is not iterable or it's an array with the default iterator - use a simple case + + if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) { + iterator = iteratorMethod.call(O); + next = iterator.next; + result = new C(); + + for (; !(step = next.call(iterator)).done; index++) { + value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; + createProperty(result, index, value); + } + } else { + length = toLength(O.length); + result = new C(length); + + for (; length > index; index++) { + value = mapping ? mapfn(O[index], index) : O[index]; + createProperty(result, index, value); + } + } + + result.length = index; + return result; +}; + +var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { + Array.from(iterable); +}); // `Array.from` method +// https://tc39.github.io/ecma262/#sec-array.from + +_export({ + target: 'Array', + stat: true, + forced: INCORRECT_ITERATION +}, { + from: arrayFrom +}); + +/** + * @summary アニメーションパラメータの更新管理 + * + * @classdesc + *

アニメーション関数と結合しているアニメーションパラメータを更新するための機能を提供する。

+ * + * @memberof mapray.animation + */ + +var Updater = +/*#__PURE__*/ +function () { + /** + */ + function Updater() { + _classCallCheck(this, Updater); + + // 前回更新した時刻 (一度も更新していないときは null) + this._prev_time = null; // Curve -> Tracked 辞書 + + this._track_binders = new Map(); // パラメータがまだ更新されていない、またはアニメーション関数値と + // 矛盾する可能性のある Binder インスタンス + + this._dirty_binders = new Set(); // 関数値が変化した Curve を管理 + + this._vary_curves = new VaryCurves(); + } + /** + * @summary アニメーションパラメータを更新 + * + * @desc + *

時刻 time でのアニメーション関数値をアニメーションパラメータに設定する。

+ * + * @param {mapray.animation.Time} time 時刻 + */ + + + _createClass(Updater, [{ + key: "update", + value: function update(time) { + this._update_dirty_binders(time); + + if (this._prev_time !== null) { + var vary_curves = this._vary_curves.getVaryCurves(this._prev_time, time); + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = vary_curves[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var curve = _step.value; + + var tracked = this._track_binders.get(curve); + + tracked.updateBinders(time); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + + this._flush_dirty_binders(); // 前回の時刻を更新 + + + this._prev_time = time; + } + /** + * @summary Binder インスタンスの登録 + * + * @desc + *

事前条件: binder は this で管理されていない

+ * + * @param {mapray.animation.Binder} binder + * + * @package + */ + + }, { + key: "_$register", + value: function _$register(binder) { + // 最初は dirty_binders に登録 + this._dirty_binders.add(binder); + } + /** + * @summary Binder インスタンスの抹消 + * + * @desc + *

事前条件: binder は this で管理されている

+ * + * @param {mapray.animation.Binder} binder + * + * @package + */ + + }, { + key: "_$unregister", + value: function _$unregister(binder) { + if (this._dirty_binders["delete"](binder)) ; else { + // binder は track_binders 側に存在する + var tracked = this._track_binders.get(binder._$curve); + + tracked.unregister(binder); + } + } + /** + * @summary _dirty_binders のすべてのパラメータを更新 + * + * @param {mapray.animation.Time} time + * + * @private + */ + + }, { + key: "_update_dirty_binders", + value: function _update_dirty_binders(time) { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this._dirty_binders[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var binder = _step2.value; + + binder._$update(time); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + /** + * @summary _dirty_binders から _track_binders へ Binder を移動 + * + * @private + */ + + }, { + key: "_flush_dirty_binders", + value: function _flush_dirty_binders() { + for (var _i = 0, _Array$from = Array.from(this._dirty_binders); _i < _Array$from.length; _i++) { + var binder = _Array$from[_i]; + + // dirty_binders から binder を削除 + this._dirty_binders["delete"](binder); // track_binders へ binder を追加 + + + var curve = binder._$curve; + + var tracked = this._track_binders.get(curve); + + if (tracked === undefined) { + // curve を使っている Binder インスタンスが初めて登録される + tracked = new Tracked(this, curve, binder); + + this._track_binders.set(curve, tracked); + } else { + // 2つ目以降の Binder インスタンス + tracked.register(binder); + } + } + } + }]); + + return Updater; +}(); +/** + * @summary 追跡されたバインダ + * + * @memberof mapray.animation.Updater + * @private + */ + + +var Tracked = +/*#__PURE__*/ +function () { + /** + * @desc + *

updater._track_binders に追加されるときに呼び出される。

+ *

updater._vary_curves も更新する。

+ * + * @param {mapray.animation.Updater} updater this を管理する Updater インスタンス + * @param {mapray.animation.Curve} curve 対象とする Curve インスタンス + * @param {mapray.animation.Binder} init_binder 最初の Binder インスタンス + */ + function Tracked(updater, curve, init_binder) { + var _this = this; + + _classCallCheck(this, Tracked); + + this._updater = updater; + this._curve = curve; // curve と結合している Binder インスタンスの集合 + + this._binders = new Set([init_binder]); // curve の現在の不変性 + + this._invariance = curve.getInvariance(Interval.UNIVERSAL); // アニメーション関数値の変更管理 + + this._listener = function (interval) { + _this._onValueChange(interval); + }; + + curve.addValueChangeListener(this._listener); // vary_curves に curve を追加 + + updater._vary_curves.addCurve(curve, this._invariance); + } + /** + * @summary Curve を持つ Binder を登録 + * + * @param {mapray.animation.Binder} binder + */ + + + _createClass(Tracked, [{ + key: "register", + value: function register(binder) { + // Assert: !this._binders.has( binder ) + this._binders.add(binder); + } + /** + * @summary Curve を持つ Binder を抹消 + * + * @desc + *

this が updater._track_binders から削除されることがある。

+ *

curve が updater._vary_curves から削除されることがある。

+ * + * @param {mapray.animation.Binder} binder + */ + + }, { + key: "unregister", + value: function unregister(binder) { + // Assert: this._binders.has( binder ) + this._binders["delete"](binder); + + if (this._binders.size > 0) { + // まだ this._curve と関連した Binder インスタンスが this に存在する + return; + } // this._curve と関連した唯一の Binder インスタンスが this から削除された + // vary_curves から curve を削除 + + + this._updater._vary_curves.removeCurve(this._curve, this._invariance); // 変更を追跡する必要はなくなったのでリスナーを削除 + + + this._curve.removeValueChangeListener(this._listener); // this を this._updater から削除 + + + this._updater._track_binders["delete"](this._curve); + } + /** + * @summary アニメーションパラメータを更新 + * + * @desc + *

時刻 time でのアニメーション関数値をアニメーションパラメータに設定する。

+ * + * @param {mapray.animation.Time} time 時刻 + */ + + }, { + key: "updateBinders", + value: function updateBinders(time) { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this._binders[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var binder = _step3.value; + + binder._$update(time); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + /** + * @summary アニメーション間数値が変更された + * + * @param {mapray.animation.Interval} chg_ival 変更された時刻区間 + * + * @private + */ + + }, { + key: "_onValueChange", + value: function _onValueChange(chg_ival) { + // assert: !chg_ival.isEmpty() + // assert: this._updater._prev_time != null + if (chg_ival.includesTime(this._updater._prev_time)) { + // 現在設定されているパラメータ値と矛盾が生じる + // this._binders を dirty_binders に移動 + this._move_to_dirty_binders(); + } else { + // 不変性情報を部分的に更新 + var subinvr = this._curve.getInvariance(chg_ival); + + this._updater._vary_curves.modifyCurve(this._curve, chg_ival, subinvr, this._invariance); + + this._invariance._$modify(subinvr); + } + } + /** + * @summary this を dirty_binders に移動 + * + * @desc + *

this は updater._track_binders, updater._vary_curves から削除される。

+ * + * @private + */ + + }, { + key: "_move_to_dirty_binders", + value: function _move_to_dirty_binders() { + for (var _i2 = 0, _Array$from2 = Array.from(this._binders); _i2 < _Array$from2.length; _i2++) { + var binder = _Array$from2[_i2]; + // this から binder を削除 + this.unregister(binder); // dirty_binders に binder を追加 + + this._updater._dirty_binders.add(binder); + } + } + }]); + + return Tracked; +}(); +/** + * @summary 時刻間での関数値が変化した Curve を得る + * + * @memberof mapray.animation.Updater + * @private + */ + + +var VaryCurves = +/*#__PURE__*/ +function () { + /** + */ + function VaryCurves() { + _classCallCheck(this, VaryCurves); + + // 連続変化の時刻区間 (すべて Proper) + // OrderedMap + // 外から内部に入る、内部で動くとき変化する + // 下限が '[' のとき、左から下限に入る、下限から左へ出るとき変化する + // 上限が ']' のとき、右から上限に入る、上限から右へ出るとき変化する + this._continuous = createTimeMap(); // 単発変化の時刻 [] + // OrderedMap> + // 点を通過、点に入る、点から出るとき変化する + + this._oneshot = createTimeMap(); // 単発変化の時刻 [) + // OrderedMap> + // 点を通過、左から点に入る、点から左へ出るとき変化する + + this._oneshot_L = createTimeMap(); // 単発変化の時刻 (] + // OrderedMap> + // 点を通過、右から点に入る、点から右へ出るとき変化する + + this._oneshot_R = createTimeMap(); + } + /** + * @summary Curve を追加 + * + * @desc + *

データベースに不変性が invariance である curve を追加する。

+ * + *

事前条件: curve は filter 内に存在しない

+ * + * @param {mapray.animation.Curve} curve 追加する Curve インスタンス + * @param {mapray.animation.Invariance} invariance curve の不変性情報 + * @param {mapray.animation.Interval} [filter] 追加する時刻区間 (前回の不変性情報で整列済み) + */ + + + _createClass(VaryCurves, [{ + key: "addCurve", + value: function addCurve(curve, invariance) { + var filter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Interval.UNIVERSAL; + + var invr_ivals = invariance.getNarrowed(filter)._$getArray(); + + if (invr_ivals.length == 0) { + // 全時刻区間が変化 + this._addToGeneric(curve, filter); + } else { + // 不変区間が存在する場合 + var lastIndex = invr_ivals.length - 1; // 最初 + + { + var invr_ival = invr_ivals[0]; + var vary_ival = filter.getIntersection(invr_ival.getPrecedings()); + + if (!vary_ival.isEmpty()) { + this._addToGeneric(curve, vary_ival); + } else if (isSameInterval_L(filter, invr_ival) && !this._hasContiguous_L(invr_ival, curve)) { + // invr_ival と filter の左が一致して、curve を持った invr_ival の左隣接が存在しない + if (invr_ival.l_open) { + this._addToOneshotGroup(curve, invr_ival, "_oneshot_R"); + } else if (!invr_ival.getPrecedings().isEmpty()) { + this._addToOneshotGroup(curve, invr_ival, "_oneshot_L"); + } + } + } // 中間 + + for (var i = 0; i < lastIndex; ++i) { + var lower = invr_ivals[i].getFollowings(); + var upper = invr_ivals[i + 1].getPrecedings(); + + var _vary_ival = lower.getIntersection(upper); + + if (_vary_ival.isEmpty()) { + // lower と upper に間がない + this._addToOneshotGroup(curve, lower, lower.l_open ? "_oneshot_R" : "_oneshot_L"); + } else { + // lower と upper に間がある + this._addToGeneric(curve, _vary_ival); + } + } // 最後 + + + { + var _invr_ival = invr_ivals[lastIndex]; + + var _vary_ival2 = filter.getIntersection(_invr_ival.getFollowings()); + + if (!_vary_ival2.isEmpty()) { + this._addToGeneric(curve, _vary_ival2); + } else if (isSameInterval_R(filter, _invr_ival) && !this._hasContiguous_R(_invr_ival, curve)) { + if (_invr_ival.u_open) { + this._addToOneshotGroup(curve, _invr_ival, "_oneshot_L"); + } else if (!_invr_ival.getFollowings().isEmpty()) { + this._addToOneshotGroup(curve, _invr_ival, "_oneshot_R"); + } + } + } + } + } + /** + * @summary interval の左の隣接する区間は存在するか? + * + * @desc + *

continuous の中に interval の左に隣接する区間があり、かつ + * curve を持っているものは存在するかどうかを返す。

+ * + * @param {mapray.animation.Interval} interval (!= Φ) + * @param {mapray.animation.Curve} curve + * + * @return {boolean} + * + * @private + */ + + }, { + key: "_hasContiguous_L", + value: function _hasContiguous_L(interval, curve) { + var map = this._continuous; // interval の左のアイテム + + var it1 = map.findLower(interval.lower); + var it0 = it1 !== null ? it1.findPredecessor() : map.findLast(); + + if (it0 !== null) { + var pred = it0.value; // ContCurves + + var pred_ival = pred.interval; + + if (pred_ival.upper.equals(interval.lower) && (interval.l_open && !pred_ival.u_open || !interval.l_open && pred_ival.u_open)) { + // 隣接している + if (pred.curves.has(curve)) { + // 隣接して curve を持っている + return true; + } + } + } + + return false; + } + /** + * @summary interval の右の隣接する区間は存在するか? + * + * @desc + *

continuous の中に interval の右に隣接する区間があり、かつ + * curve を持っているものは存在するかどうかを返す。

+ * + * @param {mapray.animation.Interval} interval (!= Φ) + * @param {mapray.animation.Curve} curve + * + * @return {boolean} + * + * @private + */ + + }, { + key: "_hasContiguous_R", + value: function _hasContiguous_R(interval, curve) { + var map = this._continuous; // interval の右のアイテム + + var it = map.findLower(interval.upper); + + if (it === null) { + // interval の右に区間が存在しない + return false; + } + + var succ = it.value; // ContCurves + + var succ_ival = succ.interval; + + if (!succ_ival.lower.equals(interval.upper)) { + // 境界が不一致 + return false; + } + + if (succ_ival.l_open && interval.u_open || !succ_ival.l_open && !interval.u_open) { + // 重複または離れている + return false; + } + + return succ.curves.has(curve); + } + /** + * @summary Curve を削除 + * + * @desc + *

filter 範囲の curve を削除する。filter は整列済みを想定しているので区間の分割は行わない。

+ * + *

事前条件: curve は invariance と矛盾しない状態で this に存在する

+ *

事前条件: !filter.isEmpty()

+ * + *

todo: 削除後に隣接区間が同じ集合になったときの統合処理

+ * + * @param {mapray.animation.Curve} curve 削除する Curve インスタンス + * @param {mapray.animation.Invariance} invariance curve の不変性情報 + * @param {mapray.animation.Interval} [filter] 削除する時刻区間 (invariance で整列済み) + */ + + }, { + key: "removeCurve", + value: function removeCurve(curve, invariance) { + var filter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Interval.UNIVERSAL; + + var invr_ivals = invariance.getNarrowed(filter)._$getArray(); + + if (invr_ivals.length == 0) { + // filter の全時刻区間が変化 + this._removeForGeneric(curve, filter); + } else { + // 不変区間が存在する場合 + var lastIndex = invr_ivals.length - 1; // 最初 + + { + var invr_ival = invr_ivals[0]; + var vary_ival = filter.getIntersection(invr_ival.getPrecedings()); + + if (!vary_ival.isEmpty()) { + this._removeForGeneric(curve, vary_ival); + } else { + if (isSameInterval_L(filter, invr_ival)) { + // oneshot_L/R の可能性に対応 + this._removeForOneshotGroup(curve, filter); + } + } + } // 中間 + + for (var i = 0; i < lastIndex; ++i) { + var lower = invr_ivals[i].getFollowings(); + var upper = invr_ivals[i + 1].getPrecedings(); + + var _vary_ival3 = lower.getIntersection(upper); + + if (_vary_ival3.isEmpty()) { + // ai と bi に間がない + this._removeForOneshotGroup(curve, lower); + } else { + // ai と bi に間がある + this._removeForGeneric(curve, _vary_ival3); + } + } // 最後 + + + { + var _invr_ival2 = invr_ivals[lastIndex]; + + var _vary_ival4 = filter.getIntersection(_invr_ival2.getFollowings()); + + if (!_vary_ival4.isEmpty()) { + this._removeForGeneric(curve, _vary_ival4); + } else { + if (isSameInterval_R(filter, _invr_ival2)) { + // oneshot_L/R の可能性に対応 + var _upper = filter.upper; + + this._removeForOneshotGroup(curve, new Interval(_upper, _upper)); + } + } + } + } + } + /** + * @summary Curve を変更 + * + * @param {mapray.animation.Curve} curve + * @param {mapray.animation.Interval} chg_ival 更新時刻区間 (!= Φ) + * @param {mapray.animation.Invariance} sub_invr 更新部分の Invariance + * @param {mapray.animation.Invariance} old_invr 以前の Invariance + */ + + }, { + key: "modifyCurve", + value: function modifyCurve(curve, chg_ival, sub_invr, old_invr) { + // old_invr を基にして chg_ival を整列拡張 + var aligned = old_invr._$expandIntervalByAlignment(chg_ival); // this のデータベースから aligned 区間の curve を削除 + + + this.removeCurve(curve, old_invr, aligned); // aligned 区間で sub_invr を追加 + + this.addCurve(curve, sub_invr, aligned); + } + /** + * @summary 関数値が変化した Curve インスタンス集合を取得 + * + * @desc + *

時刻が prev_time から time に連続変化したときに、関数値が変化する可能性のある + * Curve インスタンスを得るための列挙可能オブジェクトを返す。

+ * + * @param {mapray.animation.Time} prev_time 始点時刻 + * @param {mapray.animation.Time} time 終点時刻 + * + * @return {iterable.} + */ + + }, { + key: "getVaryCurves", + value: function getVaryCurves(prev_time, time) { + if (prev_time.lessThan(time)) { + // 順再生 + return this._collectCurves(prev_time, time); + } else if (time.lessThan(prev_time)) { + // 逆再生 + return this._collectCurves(time, prev_time); + } else { + // 時刻変わらず + return []; + } + } + /** + * @summary curve を continuous または oneshot へ追加 + * + * @desc + *

curve を continuous または oneshot に登録する。 + * ただし interval.isEmpty() のときは何もしない。

+ * + * @param {mapray.animation.Curve} curve 追加する Curve インスタンス + * @param {mapray.animation.Interval} interval 変化する時刻区間 + * + * @private + */ + + }, { + key: "_addToGeneric", + value: function _addToGeneric(curve, interval) { + if (interval.isProper()) { + this._addToContinuous(curve, interval); + } else if (interval.isSingle()) { + this._addToOneshotGroup(curve, interval, "_oneshot"); + } + } + /** + * @summary curve を oneshot 族へ追加 + * + * @param {mapray.animation.Curve} curve 追加する Curve インスタンス + * @param {mapray.animation.Interval} interval lower が時刻として使われる + * @param {string} pname oneshot 族のプロパティ名 + * + * @private + */ + + }, { + key: "_addToOneshotGroup", + value: function _addToOneshotGroup(curve, interval, pname) { + var map = this[pname]; // OrderedMap> + + var time = interval.lower; + var item = map.findEqual(time); + + if (item === null) { + // 新規の時刻 + // 空の Set インスタンスを追加 + item = map.insert(time, new Set()); + } + + item.value.add(curve); + } + /** + * @summary curve を continuous へ追加 + * + * @desc + *

事前条件: interval.isProper()

+ * + * @param {mapray.animation.Curve} curve 追加する Curve インスタンス + * @param {mapray.animation.Interval} interval 変化する時刻区間 + * + * @private + */ + + }, { + key: "_addToContinuous", + value: function _addToContinuous(curve, interval) { + // assert: interval.isProper() + // A は追加する連続区間 + // T は登録済みの連続区間 (A と交差する区間の中で一番左側の区間) + // 交差タイプ + // + // (1) 登録済みの区間に A と交差する区間はない + // A: ==== + // + // (2) T は A の左から飛び出し、右からは飛び出していない + // A: ==== + // T: ==== + // + // (3) T は A の右から飛び出し、左からは飛び出していない + // A: ==== + // T: ==== + // + // (4) T は A の左右どちらからも飛び出している + // A: === + // T: ===== + // + // (5) T は A の左右どちらからも飛び出していない + // A: ===== + // T: === + // 記号の意味 + // + // $X は X.getPrecedings() + // X$ は X.getFollowings() + var A_ival = interval; // A + + var A_curve = curve; + + for (;;) { + // assert: A != Φ + var target = this._removeFirstCrossInContinuous(A_ival); + + if (target !== null) { + var T_ival = target.cc.interval; // T: A と交差する区間で一番左側の区間 + + var T_curves = target.cc.curves; // T の Curve インタンス集合 + + var A_x_T = target.cross; // A∩T + + var $A_x_T = A_ival.getPrecedings().getIntersection(T_ival); // $A∩T + + if ($A_x_T.isEmpty()) { + // 交差タイプ (3) または (5) + var A_x_$T = A_ival.getIntersection(T_ival.getPrecedings()); // A∩$T + + if (!A_x_$T.isEmpty()) { + // (d) A∩$T != Φ なら、A∩$T として、A_curve を新規登録 + this._addForContinuous(A_x_$T, A_curve); + } + } else { + // 交差タイプ (2) または (4) + // (b) $A∩T として、T_curves を新規登録 + this._addForContinuous($A_x_T, new Set(T_curves)); + } + + var A$_x_T = A_ival.getFollowings().getIntersection(T_ival); // A$∩T + + if (A$_x_T.isEmpty()) { + // 交差タイプ (2) または (5) + // (a) A∩T として、T_curves に A_curve を加えた集合を新規登録 + this._addForContinuous(A_x_T, T_curves.add(A_curve)); // (z) A∩T$ != Φ なら、A を A∩T$ として再処理 + + + var A_x_T$ = A_ival.getIntersection(T_ival.getFollowings()); // A∩T$ + + if (!A_x_T$.isEmpty()) { + A_ival = A_x_T$; + continue; + } + } else { + // 交差タイプ (3) または (4) + // (c) A$∩T として、T_curves を新規登録 + this._addForContinuous(A$_x_T, new Set(T_curves)); // (a) A∩T として、T_curves に A_curve を加えた集合を新規登録 + + + this._addForContinuous(A_x_T, T_curves.add(A_curve)); + } + } else { + // 交差タイプ (1) + // A として、A_curve を新規登録 + this._addForContinuous(A_ival, A_curve); + } + + break; + } + } + /** + * @summary 最初に interval と交差する要素を削除 + * + * @desc + *

+ *

this._continuous 内の時刻区間の中から、最初に interval と交差する要素を削除しする。 + * その交差区間と要素が持っていた ContCurves インスタンスを返す。

+ *

ただし、交差する区間が存在しなければ null を返す。

+ * + * @param {mapray.animation.Interval} interval 時刻区間 + * + * @return {!object} { cc: ContCurves, cross: Interval } + * + * @private + */ + + }, { + key: "_removeFirstCrossInContinuous", + value: function _removeFirstCrossInContinuous(interval) { + var map = this._continuous; // 各区間は Proper 前提 + + var t1 = map.findUpper(interval.lower); + var t0 = t1 !== null ? t1.findPredecessor() : map.findLast(); + + if (t0 !== null) { + var cross = interval.getIntersection(t0.value.interval); + + if (!cross.isEmpty()) { + var cc = t0.value; + map.remove(t0); + return { + cc: cc, + cross: cross + }; + } + } + + if (t1 !== null) { + var _cross = interval.getIntersection(t1.value.interval); + + if (!_cross.isEmpty()) { + var _cc = t1.value; + map.remove(t1); + return { + cc: _cc, + cross: _cross + }; + } + } // 交差は存在しない + + + return null; + } + /** + * @summary curves を continuous または oneshot へ追加 + * + * @desc + *

interval.isSingle() のときは curves を this._oneshot の Curve 集合に追加する。

+ *

interval.isProper() のときは ContCurves インスタンスを新規に this._continuous へ追加する。

+ * + *

事前条件: !interval.isEmpty()

+ * + * @param {mapray.animation.Interval} interval 時刻区間、または時刻 (lower を時刻とする) + * @param {mapray.animation.Curve|Set} curves 追加する Curve インスタンス、またはその集合 + * + * @private + */ + + }, { + key: "_addForContinuous", + value: function _addForContinuous(interval, curves) { + var time = interval.lower; // 時刻へ変換 + + if (interval.isSingle()) { + // oneshot: curves を Curve 集合へ追加 + var it = this._oneshot.findEqual(time); + + if (it === null) { + // 新規の時刻 + // 空の Set インスタンスを追加 + it = this._oneshot.insert(time, new Set()); + } + + var dst_set = it.value; + + if (curves instanceof Set) { + // 複数 Curve + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = curves[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var curve = _step4.value; + dst_set.add(curve); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + } else { + // 単一 Curve + dst_set.add(curves); + } + } else { + // continuous: curves を新規追加 + this._continuous.insert(time, new ContCurves(interval, curves)); + } + } + /** + * @summary curve を continuous または oneshot から削除 + * + * @desc + *

curve を continuous または oneshot から削除するe。 + * ただし interval.isEmpty() のときは何もしない。

+ * + * @param {mapray.animation.Curve} curve 削除する Curve インスタンス + * @param {mapray.animation.Interval} interval 変化する時刻区間 + * + * @private + */ + + }, { + key: "_removeForGeneric", + value: function _removeForGeneric(curve, interval) { + if (interval.isProper()) { + this._removeForContinuous(curve, interval); + } else if (interval.isSingle()) { + this._removeForOneshotGroup(curve, interval); + } + } + /** + * @summary curve を oneshot 族から削除 + * + * @desc + *

ある oneshot 族の時刻 interval.lower に curve + * が存在すれば削除し、存在しなければ何もしない。

+ * + * @param {mapray.animation.Curve} curve 削除する Curve インスタンス + * @param {mapray.animation.Interval} interval lower が時刻として使われる + * + * @private + */ + + }, { + key: "_removeForOneshotGroup", + value: function _removeForOneshotGroup(curve, interval) { + var time = interval.lower; + + for (var _i3 = 0, _arr = ["_oneshot", "_oneshot_L", "_oneshot_R"]; _i3 < _arr.length; _i3++) { + var pname = _arr[_i3]; + var map = this[pname]; // OrderedMap> + + var item = map.findEqual(time); + + if (item !== null) { + var curves = item.value; // curve を削除し、空になったら curves も削除 + + if (curves.has(curve)) { + curves["delete"](curve); + + if (curves.size == 0) { + map.remove(item); + } + } // curve は複数に所属することはないので、1つ削除したら終了 + + + break; + } + } + } + /** + * @summary curves を continuous または oneshot から削除 + * + * @desc + *

interval 区間にある continuous と oneshot の curve を削除する。

+ *

事前条件: interval.isProper()

+ * + * @param {mapray.animation.Curve} curve 削除する Curve インスタンス + * @param {mapray.animation.Interval} interval 時刻区間 + * + * @private + */ + + }, { + key: "_removeForContinuous", + value: function _removeForContinuous(curve, interval) { + // this._continuous + { + var map = this._continuous; // 各区間は Proper 前提 + + var it1 = map.findUpper(interval.lower); + var it0 = it1 !== null ? it1.findPredecessor() : map.findLast(); + var end = map.findUpper(interval.upper); + + for (var it = it0 || it1; it !== end;) { + var curves = it.value.curves; + curves["delete"](curve); + it = curves.size == 0 ? map.remove(it) : it.findSuccessor(); + } + } // this._oneshot + + { + var _map = this._oneshot; + + var _it = _map.findLower(interval.lower); + + var _end = _map.findUpper(interval.upper); + + for (var _it2 = _it; _it2 !== _end;) { + var _curves = _it2.value; + + _curves["delete"](curve); + + _it2 = _curves.size == 0 ? _map.remove(_it2) : _it2.findSuccessor(); + } + } + } + /** + * @summary Curve インスタンスを収集 + * + * @desc + * 事前条件: t1.lessThan( t2 ) + * + * @param {mapray.animation.Time} t1 + * @param {mapray.animation.Time} t2 + * + * @return {iterable.} + * + * @private + */ + + }, { + key: "_collectCurves", + value: function _collectCurves(t1, t2) { + var curves = new Set(); // Set + + this._collectContinuousCurves(t1, t2, curves); + + this._collectOneshotCurves(t1, t2, "_oneshot", true, true, curves); + + this._collectOneshotCurves(t1, t2, "_oneshot_L", false, true, curves); + + this._collectOneshotCurves(t1, t2, "_oneshot_R", true, false, curves); + + return curves; + } + /** + * @summary continuous から Curve インスタンスを収集 + * + * @desc + * 事前条件: t1.lessThan( t2 ) + * + * @param {mapray.animation.Time} t1 + * @param {mapray.animation.Time} t2 + * @param {Set.} curves + * + * @private + */ + + }, { + key: "_collectContinuousCurves", + value: function _collectContinuousCurves(t1, t2, curves) { + // 時刻区間 [t1, ∞) と交差する最初の時刻区間 + var it_A = this._continuous.findLower(t1); + + if (it_A !== null) { + // it_A != null でも、時刻区間 Pred と交差している可能性もある + var it_Pred = it_A.findPredecessor(); + + if (it_Pred !== null) { + if (it_Pred.value.interval.includesTime(t1)) { + // Pred と [t1, ∞) が交差するので it_Pred に置き換える + it_A = it_Pred; + } + } + } else { + // it_A == null でも、時刻区間 Last と交差している可能性がある + var it_Last = this._continuous.findLast(); + + if (it_Last !== null) { + if (it_Last.value.interval.includesTime(t1)) { + // Last と [t1, ∞) が交差するので it_Last に置き換える + it_A = it_Last; + } + } + } // 時刻区間 (∞, t2] と交差する最後の時刻区間の直後 + + + var it_Z = this._continuous.findLower(t2); + + if (it_Z !== null) { + var Z_ival = it_Z.value.interval; + + if (Z_ival.lower.equals(t2) && !Z_ival.l_open) { + // it_Z の最小時刻がギリギリ (∞, t2] に入るので it_Z の直後を選ぶ + it_Z = it_Z.findSuccessor(); + } + } // assert: it_A != null || it_Z == null + // Curve インスタンスを収集 + + + for (var it = it_A; it !== it_Z; it = it.findSuccessor()) { + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = it.value.curves[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var curve = _step5.value; + curves.add(curve); + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + } + /** + * @summary oneshot から Curve インスタンスを収集 + * + * @desc + * 事前条件: t1.lessThan( t2 ) + * + * @param {mapray.animation.Time} t1 + * @param {mapray.animation.Time} t2 + * @param {string} pname + * @param {boolean} closed1 + * @param {boolean} closed2 + * @param {Set.} curves + * + * @private + */ + + }, { + key: "_collectOneshotCurves", + value: function _collectOneshotCurves(t1, t2, pname, closed1, closed2, curves) { + var map = this[pname]; // OrderedMap> + // 時刻区間 [t1, ∞) に含まれる最初の時刻 + + var it_A = closed1 ? map.findLower(t1) : map.findUpper(t1); // 時刻区間 (∞, t2] に含まれる最後の時刻区間の直後 + + var it_Z = closed1 ? map.findUpper(t2) : map.findLower(t2); // assert: it_A != null || it_Z == null + // Curve インスタンスを収集 + + for (var it = it_A; it !== it_Z; it = it.findSuccessor()) { + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = it.value[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var curve = _step6.value; + curves.add(curve); + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + } + } + }]); + + return VaryCurves; +}(); +/** + * summary VaryCurves#continuous の値 + * + * @memberof mapray.animation.Updater.VaryCurves + * @private + */ + + +var ContCurves = +/** + * @param {mapray.animation.Interval} interval 継続的に変化する時刻区間 + * @param {mapray.animation.Curve|Set} curves 初期の Curve インスタンス、またはその集合 + */ +function ContCurves(interval, curves) { + _classCallCheck(this, ContCurves); + + // assert: interval.isProper() + this.interval = interval; + this.curves = new Set(curves instanceof Set ? curves : [curves]); +}; +/** + * @summary Time を昇順に順序付ける辞書を生成 + * + * @private + */ + + +function createTimeMap() { + return new OrderedMap(function (a, b) { + return a.lessThan(b); + }); +} +/** + * @summary a と b の左側は同じか? + * + * @param {mapray.animation.Interval} a + * @param {mapray.animation.Interval} b + * + * @private + */ + + +function isSameInterval_L(a, b) { + return a.lower.equals(b.lower) && (a.l_open && b.l_open || !a.l_open && !b.l_open); +} +/** + * @summary a と b の右側は同じか? + * + * @param {mapray.animation.Interval} a + * @param {mapray.animation.Interval} b + * + * @private + */ + + +function isSameInterval_R(a, b) { + return a.upper.equals(b.upper) && (a.u_open && b.u_open || !a.u_open && !b.u_open); +} + +/** + * @summary 型不一致エラー + * + * @memberof mapray.animation + * @extends mapray.animation.AnimationError + * + * @see {@link mapray.animation.Binder} + */ + +var TypeMismatchError = +/*#__PURE__*/ +function (_AnimationError) { + _inherits(TypeMismatchError, _AnimationError); + + /** + * @param {string} message エラーの説明 + */ + function TypeMismatchError(message) { + var _this; + + _classCallCheck(this, TypeMismatchError); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(TypeMismatchError).call(this, message)); + _this.name = "mapray.animation.TypeMismatchError"; + return _this; + } + + return TypeMismatchError; +}(AnimationError); + +/** + * @summary アニメーションパラメータの結合 + * + * @classdesc + *

パラメータ、Curve インスタンス、Updater インスンタンスを結合する。

+ * + * @see {@link mapray.animation.Curve} + * @see {@link mapray.animation.Updater} + * + * @memberof mapray.animation + */ + +var Binder = +/*#__PURE__*/ +function () { + /** + * @desc + *

パラメータと curve と updater を結合する。

+ *

パラメータ値は setter を通して設定される。

+ *

setter には type 型の値が渡される。

+ * + * @param {mapray.animation.Updater} updater アニメーションパラメータの更新管理 + * @param {mapray.animation.Curve} curve アニメーション関数 + * @param {mapray.animation.Type} type パラメータ値の型 + * @param {mapray.animation.Binder.Setter} setter パラメータ設定関数 + * + * @throws {@link mapray.animation.TypeMismatchError} curve が type 型をサポートしていないとき + */ + function Binder(updater, curve, type, setter) { + _classCallCheck(this, Binder); + + if (!curve.isTypeSupported(type)) { + throw new TypeMismatchError("type mismatch error"); + } + + this._updater = updater; + this._curve = curve; + this._type = type; + this._setter = setter; // updater に this を登録 + + updater._$register(this); + } + /** + * @summary アニメーションパラメータの更新管理 + * + * @type {mapray.animation.Updater} + * @readonly + */ + + + _createClass(Binder, [{ + key: "unbind", + + /** + * @summary 結合を解除 + */ + value: function unbind() { + // updater から this を抹消 + this._updater._$unregister(this); + } + /** + * @summary アニメーション関数 + * + * @type {mapray.animation.Curve} + * @readonly + * + * @package + */ + + }, { + key: "_$update", + + /** + * @summary アニメーションパラメータを更新 + * + * @desc + *

時刻 time でのアニメーション関数値をアニメーションパラメータに設定する。

+ * + * @param {mapray.animation.Time} time 時刻 + * + * @package + */ + value: function _$update(time) { + var value = this._curve.getValue(time, this._type); + + var setter = this._setter; + setter(value); + } + }, { + key: "updater", + get: function get() { + return this._updater; + } + /** + * @summary アニメーション関数 + * + * @type {mapray.animation.Curve} + * @readonly + */ + + }, { + key: "curve", + get: function get() { + return this._curve; + } + /** + * @summary パラメータ値の型 + * + * @type {mapray.animation.Type} + * @readonly + * + * @see {@link mapray.animation.Binder.Setter} + */ + + }, { + key: "type", + get: function get() { + return this._type; + } + /** + * @summary パラメータ設定関数 + * + * @type {mapray.animation.Binder.Setter} + * @readonly + */ + + }, { + key: "setter", + get: function get() { + return this._setter; + } + }, { + key: "_$curve", + get: function get() { + return this._curve; + } + }]); + + return Binder; +}(); + +var engineUserAgent = getBuiltIn('navigator', 'userAgent') || ''; + +var process = global_1.process; +var versions = process && process.versions; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + version = match[0] + match[1]; +} else if (engineUserAgent) { + match = engineUserAgent.match(/Edge\/(\d+)/); + + if (!match || match[1] >= 74) { + match = engineUserAgent.match(/Chrome\/(\d+)/); + if (match) version = match[1]; + } +} + +var engineV8Version = version && +version; + +var SPECIES$3 = wellKnownSymbol('species'); + +var arrayMethodHasSpeciesSupport = function (METHOD_NAME) { + // We can't use this feature detection in V8 since it causes + // deoptimization and serious performance degradation + // https://github.com/zloirock/core-js/issues/677 + return engineV8Version >= 51 || !fails(function () { + var array = []; + var constructor = array.constructor = {}; + + constructor[SPECIES$3] = function () { + return { + foo: 1 + }; + }; + + return array[METHOD_NAME](Boolean).foo !== 1; + }); +}; + +var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; +var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; // We can't use this feature detection in V8 since it causes +// deoptimization and serious performance degradation +// https://github.com/zloirock/core-js/issues/679 + +var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () { + var array = []; + array[IS_CONCAT_SPREADABLE] = false; + return array.concat()[0] !== array; +}); +var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat'); + +var isConcatSpreadable = function (O) { + if (!isObject(O)) return false; + var spreadable = O[IS_CONCAT_SPREADABLE]; + return spreadable !== undefined ? !!spreadable : isArray(O); +}; + +var FORCED$4 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; // `Array.prototype.concat` method +// https://tc39.github.io/ecma262/#sec-array.prototype.concat +// with adding support of @@isConcatSpreadable and @@species + +_export({ + target: 'Array', + proto: true, + forced: FORCED$4 +}, { + concat: function concat(arg) { + // eslint-disable-line no-unused-vars + var O = toObject(this); + var A = arraySpeciesCreate(O, 0); + var n = 0; + var i, k, length, len, E; + + for (i = -1, length = arguments.length; i < length; i++) { + E = i === -1 ? O : arguments[i]; + + if (isConcatSpreadable(E)) { + len = toLength(E.length); + if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); + + for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]); + } else { + if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); + createProperty(A, n++, E); + } + } + + A.length = n; + return A; + } +}); + +/** + * @summary アニメーション設定の標準インタフェース + * + * @classdesc + *

オブジェクトのアニメーション可能パラメータにアニメーションを設定 (バインド) + + するための標準的なインタフェースを提供する。

+ * + *

具体的には内部で各パラメータに適した {@link mapray.animation.Binder Binder} + * インスタンスの生成し、ユーザーが簡単にアニメーションを設定できるようにする。

+ * + *

一般的に、アニメーション可能パラメータを持つオブジェクトの animation + * プロパティから、このインタフェースを得ることができる。

+ * + *

注意: アニメーションを設定しているパラメータは + * {@link mapray.animation.Updater Updater} のメソッドを通してのみ更新することができる。 + * それ以外の手段でパラメータを更新した場合はパラメータ値に矛盾が生じる可能性がある。

+ * + * @see {@link mapray.animation.Binder} + * @see {@link mapray.animation.Updater} + * + * @memberof mapray.animation + * @abstract + */ +var BindingBlock = +/*#__PURE__*/ +function () { + /** + * @protected + */ + function BindingBlock() { + _classCallCheck(this, BindingBlock); + } + /** + * @summary アニメーション可能パラメータの情報を取得 + * + * @desc + *

アニメーションに対応したパラメータの情報を配列として取得する。

+ *

返される配列は 0 個またはそれ以上の要素を含み、要素間のパラメータ ID は重複しない。

+ *

this の生存期間中、(順序以外) 常に同じ内容を返す。

+ * + * @return {mapray.animation.BindingBlock.Parameter[]} + * + * @abstract + */ + + + _createClass(BindingBlock, [{ + key: "enumSupportedParameters", + value: function enumSupportedParameters() { + this._override_error("enumSupportedParameters"); + } + /** + * @summary パラメータは結合中か? + * + * @desc + *

id が示すパラメータが結合されているとき true, 結合されていないとき false を返す。

+ *

ただし id が示すパラメータがアニメーションに対応していないときは false を返す。

+ * + * @param {string} id パラメータ ID + * + * @return {boolean} + * + * @abstract + */ + + }, { + key: "isBound", + value: function isBound(id) { + this._override_error("isBound"); + } + /** + * @summary パラメータに結合されている Updater インスタンスを取得 + * + * @desc + *

id が示すパラメータが結合されている Updater インスタンスを返す。

+ *

ただし this.isBound( id ) == false のときは null を返す。

+ * + * @param {string} id パラメータ ID + * + * @return {?mapray.animation.Updater} + * + * @abstract + */ + + }, { + key: "getBoundUpdater", + value: function getBoundUpdater(id) { + this._override_error("getBoundUpdater"); + } + /** + * @summary パラメータに結合されている Curve インスタンスを取得 + * + * @desc + *

id が示すパラメータが結合されている Curve インスタンスを返す。

+ *

ただし this.isBound( id ) == false のときは null を返す。

+ * + * @param {string} id パラメータ ID + * + * @return {?mapray.animation.Curve} + * + * @abstract + */ + + }, { + key: "getBoundCurve", + value: function getBoundCurve(id) { + this._override_error("getBoundCurve"); + } + /** + * @summary パラメータにアニメーションを結合 + * + * @desc + *

id が示すパラメータと updater と curve を結びつける。ただし、すでに id + * が示すパラメータに結合があれば、先にその結合を解除してから行う。

+ * + *

パラメータが結合されている間、updater によりそのパラメータを更新することができる。

+ * + * @param {string} id パラメータ ID + * @param {mapray.animation.Updater} updater アニメーションパラメータ更新管理 + * @param {mapray.animation.Curve} curve アニメーション関数 + * + * @throws {@link mapray.animation.AnimationError} + * id が示すパラメータはアニメーションに対応していない + * + * @throws {@link mapray.animation.TypeMismatchError} + * id が示すパラメータの型と curve の型に互換性がないとき + * + * @see {@link mapray.animation.Binder} + * + * @abstract + */ + + }, { + key: "bind", + value: function bind(id, updater, curve) { + this._override_error("bind"); + } + /** + * @summary パラメータの結合を解除 + * + * @desc + *

id が示すパラメータの結合を解除する。

+ *

ただし this.isBound( id ) == false のときは何もしない。

+ * + * @param {string} id パラメータ ID + * + * @abstract + */ + + }, { + key: "unbind", + value: function unbind(id) { + this._override_error("unbind"); + } + /** + * @summary すべてのパラメータの結合を解除 + * + * @desc + *

現在結合されているすべてのパラメータの結合を解除する。

+ * + * @abstract + */ + + }, { + key: "unbindAll", + value: function unbindAll() { + this._override_error("unbindAll"); + } + /** + * @summary すべてのパラメータの結合を解除 (子孫含む) + * + * @desc + *

現在結合されているすべてのパラメータの結合を解除する。

+ *

もしパラメータを持つオブジェクトの子オブジェクトも BindingBlock + * インタフェースを持っていれば、子孫も含めて結合を解除する。

+ * + * @abstract + */ + + }, { + key: "unbindAllRecursively", + value: function unbindAllRecursively() { + this._override_error("unbindAllRecursively"); + } + /** + * @summary メソッドがオーバーライドされていない + * + * arguments.callee と Error#stack は互換性が低いので、関数名の取得に使わなかった + * + * @param {string} func_name + * + * @private + */ + + }, { + key: "_override_error", + value: function _override_error(func_name) { + throw new Error("BindingBlock#" + func_name + "() method has not been overridden in " + this.constructor.name); + } + }]); + + return BindingBlock; +}(); +/** + * @summary アニメーション可能パラメータの情報 + * + * @see {@link mapray.animation.BindingBlock#enumSupportedParameters} + * @memberof mapray.animation.BindingBlock + */ + + +var Parameter = +/*#__PURE__*/ +function () { + /** + * @param {string} id パラメータ ID + * @param {mapray.animation.Type[]} types サポートする型のリスト + */ + function Parameter(id, types) { + _classCallCheck(this, Parameter); + + this._id = id; + this._types = types.concat(); // 複製 + } + /** + * @summary パラメータ ID + * + * @type {string} + * + * @readonly + */ + + + _createClass(Parameter, [{ + key: "id", + get: function get() { + return this._id; + } + /** + * @summary サポートする型のリスト + * + * @desc + *

パラメータに結合可能なアニメーション関数の型の配列である。

+ *

配列は 1 またはそれ以上の型を含む。

+ * + * @type {mapray.animation.Type[]} + * + * @see {@link mapray.animation.Curve#isTypeSupported} + * + * @readonly + */ + + }, { + key: "types", + get: function get() { + return this._types; + } + }]); + + return Parameter; +}(); + +BindingBlock.Parameter = Parameter; + +/** + * @summary アニメーションパラメータ設定のヘルパークラス + * + * @memberof mapray.animation + * @extends mapray.animation.BindingBlock + */ + +var EasyBindingBlock = +/*#__PURE__*/ +function (_BindingBlock) { + _inherits(EasyBindingBlock, _BindingBlock); + + /** + */ + function EasyBindingBlock() { + var _this; + + _classCallCheck(this, EasyBindingBlock); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(EasyBindingBlock).call(this)); // アニメーション可能なパラメータ + + _this._entries = new Map(); // Map + // 結合中のパラメータ + + _this._bounds = new Map(); // Map + // すべての子孫の結合を解除するための関数のリスト + + _this._descendant_unbinders = []; // DescendantUnbinder[] + // 不変条件: this._bounds.has( id ) ⇒ this._entries.has( id ) + // this._bounds.has( id ) ⇔ (this._bounds.get( id ) !== undefined) ⇔ this.isBound() + + return _this; + } + /** + * @summary アニメーション可能パラメータを追加 + * + * @desc + *

識別子を id としてアニメーション可能なパラメータを登録する。

+ * + *

types にはこのパラメータに結合可能なアニメーション関数の 1 つまたはそれ以上の型を配列で与える。

+ * + *

types に 2 つ以上の型が存在するときは type_solver に型を決定する関数を指定しなければならない。 + * 1 つしか型が存在しないとき type_solver は無視されるので null を与えてもよい。

+ * + *

setter は実際のパラメータに値を設定する関数である。

+ * + *

id に対応するパラメータがすでに結合されている場合はその結合が解除される。

+ * + * @param {string} id パラメータ ID + * @param {mapray.animation.Type[]} types サポートする型のリスト + * @param {?mapray.animation.EasyBindingBlock.TypeSolver} type_solver 型決定関数 + * @param {mapray.animation.Binder.Setter} setter パラメータ設定関数 + * + * @see {@link mapray.animation.BindingBlock.Parameter} + */ + + + _createClass(EasyBindingBlock, [{ + key: "addEntry", + value: function addEntry(id, types, type_solver, setter) { + // 上書きで追加 + this._entries.set(id, new Entry(types, type_solver, setter)); // すでに結合されている場合は解除する + + + var binder = this._bounds.get(id); + + if (binder !== undefined) { + binder.unbind(); + + this._bounds["delete"](id); + } + } + /** + * @summary 子孫の結合を解除するための関数を追加 + * + * @param {mapray.animation.EasyBindingBlock.DescendantUnbinder} unbinder 子孫の結合を解除するための関数 + * + * @see {@link mapray.animation.BindingBlock#unbindAllRecursively} + */ + + }, { + key: "addDescendantUnbinder", + value: function addDescendantUnbinder(unbinder) { + this._descendant_unbinders.push(unbinder); + } + /** + * @override + */ + + }, { + key: "enumSupportedParameters", + value: function enumSupportedParameters() { + var parameters = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _step$value = _slicedToArray(_step.value, 2), + id = _step$value[0], + enrty = _step$value[1]; + + parameters.push(new BindingBlock.Parameter(id, enrty.types)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return parameters; + } + /** + * @override + */ + + }, { + key: "isBound", + value: function isBound(id) { + // 不変条件により !this._entries.has( id ) ⇒ !this._bounds.has( id ) が + // 成り立つので、id がアニメーションに対応していないときは仕様通り false を返す + return this._bounds.has(id); + } + /** + * @override + */ + + }, { + key: "getBoundUpdater", + value: function getBoundUpdater(id) { + var binder = this._bounds.get(id); + + return binder !== undefined ? binder.updater : null; + } + /** + * @override + */ + + }, { + key: "getBoundCurve", + value: function getBoundCurve(id) { + var binder = this._bounds.get(id); + + return binder !== undefined ? binder.curve : null; + } + /** + * @override + */ + + }, { + key: "bind", + value: function bind(id, updater, curve) { + var entry = this._entries.get(id); + + if (entry === undefined) { + // id のパラメータはアニメーションに非対応 + throw new AnimationError("unsupported parameter"); + } // すでに結合されている場合は先に解除 + + + this.unbind(id); // 型を決定 + + var types = entry.types; + var type = types.length == 1 ? types[0] : entry.type_solver(curve); + + if (type == null || !curve.isTypeSupported(type)) { + // curve は id のパラメータが要求する型に対応できない + throw new TypeMismatchError("type mismatch error"); + } // パラメータを結合 + + + this._bounds.set(id, new Binder(updater, curve, type, entry.setter)); // assert: this.isBound( id ) + // assert: this.getBoundUpdater( id ) === updater + // assert: this.getBoundCurve( id ) === curve + + } + /** + * @override + */ + + }, { + key: "unbind", + value: function unbind(id) { + var binder = this._bounds.get(id); + + if (binder !== undefined) { + binder.unbind(); + + this._bounds["delete"](id); + } // assert: !this.isBound( id ) + + } + /** + * @override + */ + + }, { + key: "unbindAll", + value: function unbindAll() { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this._bounds[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var _step2$value = _slicedToArray(_step2.value, 2), + + /*id*/ + binder = _step2$value[1]; + + binder.unbind(); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + this._bounds.clear(); // assert: 任意の id に対して !this.isBound( id ) + + } + /** + * @override + */ + + }, { + key: "unbindAllRecursively", + value: function unbindAllRecursively() { + // 子孫 + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this._descendant_unbinders[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var unbinder = _step3.value; + unbinder(); + } // 自身 + + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + this.unbindAll(); + } + }]); + + return EasyBindingBlock; +}(BindingBlock); +/** + * @summary パラメータ情報 + * + * @memberof mapray.animation.EasyBindingBlock + * @private + */ + + +var Entry = +/** + * @param {mapray.animation.Type[]} types サポートする型のリスト + * @param {?mapray.animation.EasyBindingBlock.TypeSolver} type_solver 型決定関数 + * @param {mapray.animation.Binder.Setter} setter パラメータ設定関数 + */ +function Entry(types, type_solver, setter) { + _classCallCheck(this, Entry); + + if (types.length < 1 || types.length >= 2 && !type_solver) { + // 型は 1 つ以上で、2 つ以上のときは TypeSolver が必要 + // これは事前条件であるが、気付き用に投げる + throw new AnimationError("bad parameter entry"); + } + + this.types = types.concat(); // 複製 + + this.type_solver = type_solver; + this.setter = setter; +}; + +/** + * @summary 定数関数 + * + * @classdesc + *

すべての時刻で同じ値を返す任意型の関数である。

+ *

関数値の型は構築子のパラメータにより指定する。

+ * + * @memberof mapray.animation + * @extends mapray.animation.Curve + */ + +var ConstantCurve = +/*#__PURE__*/ +function (_Curve) { + _inherits(ConstantCurve, _Curve); + + /** + * @desc + *

type 型の value を定数値とする定数関数を生成する。

+ *

type は任意の型を指定することができる。

+ *

value を省略したときは type 型の既定値を返す定数関数となる。

+ * + * @param {mapray.animation.Type} type 関数値の型 + * @param {object} [value] 初期定数値 (type 型) + */ + function ConstantCurve(type, value) { + var _this; + + _classCallCheck(this, ConstantCurve); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(ConstantCurve).call(this)); + _this._constant_type = type; + _this._constant_value = type.getDefaultValue(); // 初期値が指定されているときは設定 + + if (value !== undefined) { + _this.setConstantValue(value); + } + + return _this; + } + /** + * @summary 定数値を設定 + * + * @param {object} value 定数値 (関数値の型) + */ + + + _createClass(ConstantCurve, [{ + key: "setConstantValue", + value: function setConstantValue(value) { + if (value == this._constant_value) { + // 同じ値で変化なし + // == 演算子で比較できない型は常に違う値と判断されることもある + return; + } // 定数値を変更 + + + this._constant_value = this._constant_type.getCloneValue(value); // 全時刻の値が変化 + + this.notifyValueChange(Interval.UNIVERSAL); + } + /** + * @override + */ + + }, { + key: "isTypeSupported", + value: function isTypeSupported(type) { + var from_type = this._constant_type; + return type.isConvertible(from_type); + } + /** + * @override + */ + + }, { + key: "getValue", + value: function getValue(time, type) { + var from_type = this._constant_type; + var from_value = from_type.getCloneValue(this._constant_value); + return type.convertValue(from_type, from_value); + } + /** + * @override + */ + + }, { + key: "getInvariance", + value: function getInvariance(interval) { + // 全時間で一定 + // (UNIVERSAL と非空区間は必ず交差するので interval の参照は不要) + var invariance = new Invariance(); + return invariance.write(Interval.UNIVERSAL); + } + }]); + + return ConstantCurve; +}(Curve); + +/** + * @summary アニメーション実装者用のユーティリティ + * + * @hideconstructor + * @memberof mapray.animation + * + * @private + */ + +var AnimUtil = +/*#__PURE__*/ +function () { + function AnimUtil() { + _classCallCheck(this, AnimUtil); + } + + _createClass(AnimUtil, null, [{ + key: "getDimension", + + /** + * @summary type の次元を取得 + * + * @desc + *

type が number のとき 1, vector2, vector3, vector4 + * のときはベクトルの次数を返す。それ以外の型のときは 0 を返す。

+ * + * @param {mapray.animation.Type} type + * + * @return {number} type の次元、type が非対応のときは 0 + */ + value: function getDimension(type) { + if (Type.find("number") === type) { + // スカラーは 1 + return 1; + } else if (Type.find("vector2") === type) { + return 2; + } else if (Type.find("vector3") === type) { + return 3; + } else if (Type.find("vector4") === type) { + return 4; + } else { + // 非対応の型 + return 0; + } + } + /** + * @summary キーフレームのインデックスを検索 + * + * @desc + *

key_times の [lower, upper) の範囲に time より後の時刻が存在すれば、その中で最小のインデックスを返す。 + * そのような時刻が存在しなければ upper を返す。

+ * + *

返された値を i, key_times を k とすると time の位置は次のように解釈できる。

+ *
+     *   i == lower のとき: time < k[i]
+     *   i == upper のとき: k[i-1] <= time
+     *   それ以外のとき: k[i-1] <= time < k[i]
+     * 
+ * + *

事前条件: upper - lower >= 1

+ * + *

計算量: upper - lower を n とするとき、O(log n)

+ * + * @param {mapray.animation.Time} time 検索キー + * @param {mapray.animation.Time[]} key_times 検索対象配列 + * @param {number} lower 下限インデックス + * @param {number} upper 上限インデックス + * + * @return {number} 検索されたインデックス + */ + + }, { + key: "findKeyFrameIndex", + value: function findKeyFrameIndex(time, key_times, lower, upper) { + var l_idx = lower; + var u_idx = upper; + + for (;;) { + if (u_idx - l_idx >= 2) { + var m_idx = Math.floor((l_idx + u_idx) / 2); // 中間インデックス + + var m_time = key_times[m_idx]; + + if (m_time.lessThan(time)) { + // m_time < time なので [m_idx, u_idx) に存在するかもしれない + l_idx = m_idx; + } else if (time.lessThan(m_time)) { + // m_time > time なので [l_idx, m_idx) を確認 + u_idx = m_idx; + } else { + // m_time == time なので m_idx の次が結果になる + return m_idx + 1; + } + } else { + // u_idx - l_idx == 1 + var l_time = key_times[l_idx]; + return time.lessThan(l_time) ? l_idx : u_idx; + } + } + + return 0; // 警告回避 + } + /** + * @summary 最初にサポートする型を検索 + * + * @desc + *

types の中で curve がサポートする最初の型を返す。

+ *

types に curve がサポートする型が存在しなければ null を返す。

+ * + * @param {mapray.animation.Curve} curve + * @param {iterable.} types + * + * @return {?mapray.animation.Type} + */ + + }, { + key: "findFirstTypeSupported", + value: function findFirstTypeSupported(curve, types) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = types[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var type = _step.value; + + if (curve.isTypeSupported(type)) { + return type; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return null; + } + }]); + + return AnimUtil; +}(); + +/** + * @summary キーフレームによる線形関数 + * + * @classdesc + *

キーフレーム間を数値またはベクトルを線形に補間する関数である。

+ *

関数値の型は構築子のパラメータにより number, vector2, vector3 または vector4 を指定する。

+ * + * @memberof mapray.animation + * @extends mapray.animation.Curve + */ + +var KFLinearCurve = +/*#__PURE__*/ +function (_Curve) { + _inherits(KFLinearCurve, _Curve); + + /** + *

type 型の関数を keyframes により生成する。

+ *

type は number, vector2, vector3 または vector4 を指定することができる。

+ *

keyframes を省略したときは type 型の既定値を返す定数関数と同等になる。keyframes の形式に関しては + * {@link mapray.animation.KFLinearCurve#setKeyFrames setKeyFrames()} を参照のこと。

+ * + * @param {mapray.animation.Type} type 関数値の型 + * @param {object[]} [keyframes] 初期キーフレーム + */ + function KFLinearCurve(type, keyframes) { + var _this; + + _classCallCheck(this, KFLinearCurve); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(KFLinearCurve).call(this)); + var dimension = AnimUtil.getDimension(type); + + if (dimension == 0) { + throw AnimationError("unsupported type"); + } + + _this._value_type = type; // number | vector2 | vector3 | vector4 + + _this._dimension = dimension; // 1〜4 + + _this._num_keyframes = undefined; // >= 2 + + _this._key_times = undefined; // Time[] + + _this._key_values = undefined; // Float64Array + + if (keyframes !== undefined) { + // 初期のキーフレームを設定 + _this.setKeyFrames(keyframes); + } else { + // 既定のキーフレームを設定 + var t0 = Time.fromNumber(0); + var t1 = Time.fromNumber(1); + var dv = type.getDefaultValue(); + + _this.setKeyFrames([t0, dv, t1, dv]); + } + + return _this; + } + /** + * @summary キーフレーム設定 + * + * @desc + *

keyframes により、すべてのキーフレームを指定する。

+ * + *

+ * 条件1: keyframes.length >= 4 (キーフレーム数 >= 2)
+ * 条件2: すべての i, j において、i < j ⇔ 時刻i < 時刻j
+ * 条件3: すべての i において、値i は構築子の type 引数で指定した型のインスタンス + *

+ * + * @param {object[]} keyframes [時刻0, 値0, 時刻1, 値1, ...] + */ + + + _createClass(KFLinearCurve, [{ + key: "setKeyFrames", + value: function setKeyFrames(keyframes) { + var dimension = this._dimension; + this._num_keyframes = keyframes.length / 2; + this._key_times = new Array(this._num_keyframes); + this._key_values = new Float64Array(this._num_keyframes * dimension); // キーフレームを設定 + + for (var ti = 0, vi = 0; ti < this._num_keyframes; ++ti, vi += dimension) { + var time = keyframes[2 * ti]; + var value = keyframes[2 * ti + 1]; // 時刻を配列に設定 + + this._key_times[ti] = time; // 値を配列に設定 + + if (dimension == 1) { + // スカラー + this._key_values[vi] = value; + } else { + // ベクトル + for (var j = 0; j < dimension; ++j) { + this._key_values[vi + j] = value[j]; + } + } + } // 全時刻の値が変化 + + + this.notifyValueChange(Interval.UNIVERSAL); + } + /** + * @override + */ + + }, { + key: "isTypeSupported", + value: function isTypeSupported(type) { + var from_type = this._value_type; + return type.isConvertible(from_type); + } + /** + * @override + */ + + }, { + key: "getValue", + value: function getValue(time, type) { + var from_type = this._value_type; + + var from_value = this._getInterpolatedValue(time); + + return type.convertValue(from_type, from_value); + } + /** + * @override + */ + + }, { + key: "getInvariance", + value: function getInvariance(interval) { + var first_time = this._key_times[0]; + var last_time = this._key_times[this._num_keyframes - 1]; + var ival_inner = new Interval(first_time, last_time, true, true); // 全体の不変性情報 (2区間程度なので毎回生成) + + var invr_full = new Invariance(); + invr_full.write(ival_inner.getPrecedings()); // 最初のキーの時刻とその前の区間 + + invr_full.write(ival_inner.getFollowings()); // 最後のキーの時刻とその後の区間 + // interval 範囲に絞って返す + + return invr_full.getNarrowed(interval); + } + /** + * @summary time での補間値を取得 + * + * @param {mapray.animation.Time} time + * + * @return {object} 補間値 (this._value_type に適応した型) + * + * @private + */ + + }, { + key: "_getInterpolatedValue", + value: function _getInterpolatedValue(time) { + // this._key_times に time より後の時刻が存在すれば、その中で最小のインデックス + // そのような時刻が存在しなければ this._num_keyframes + var index = AnimUtil.findKeyFrameIndex(time, this._key_times, 0, this._num_keyframes); + + if (index == 0) { + // time が最初のキー時刻と同じか、その前のときは最初のキー値で一定 + return this._createKeyFrameValue(0); + } else if (index == this._num_keyframes) { + // time が最後のキー時刻と同じか、その後のときは最後のキー値で一定 + return this._createKeyFrameValue(index - 1); + } else { + // その他のときは前後のキー値で線形補間 + return this._createValueBy2Keys(index - 1, index, time); + } + } + /** + * @summary キーフレーム値を生成 + * + * @param {number} index キーフレームのインデックス + * + * @return {object} キーフレーム値 (this._value_type に適応した型) + * + * @private + */ + + }, { + key: "_createKeyFrameValue", + value: function _createKeyFrameValue(index) { + var dimension = this._dimension; + var key_values = this._key_values; + + if (dimension == 1) { + // スカラー + return key_values[index]; + } else { + // ベクトル + var vi = dimension * index; + var vec = new Float64Array(dimension); + + for (var i = 0; i < dimension; ++i) { + vec[i] = key_values[vi + i]; + } + + return vec; + } + } + /** + * @summary キーフレーム間の補間値を生成 + * + * @param {number} i0 先キーフレームのインデックス + * @param {number} i1 後キーフレームのインデックス + * @param {mapray.animation.Time} time + * + * @return {object} 補間値 (this._value_type に適応した型) + * + * @private + */ + + }, { + key: "_createValueBy2Keys", + value: function _createValueBy2Keys(i0, i1, time) { + var x0 = this._key_times[i0].toNumber(); + + var x1 = this._key_times[i1].toNumber(); + + var r1 = (time.toNumber() - x0) / (x1 - x0); + var r0 = 1 - r1; + var dimension = this._dimension; + var key_values = this._key_values; + + if (dimension == 1) { + // スカラー + return r0 * key_values[i0] + r1 * key_values[i1]; + } else { + // ベクトル + var vi0 = dimension * i0; + var vi1 = dimension * i1; + var vec = new Float64Array(dimension); + + for (var i = 0; i < dimension; ++i) { + vec[i] = r0 * key_values[vi0 + i] + r1 * key_values[vi1 + i]; + } + + return vec; + } + } + }]); + + return KFLinearCurve; +}(Curve); + +/** + * @summary キーフレームによる階段関数 + * + * @classdesc + *

あるキーフレームから次のキーフレームの直前まで一定の値を返す階段関数である。

+ *

構築子により任意の関数値の型を指定することができる。

+ * + * @memberof mapray.animation + * @extends mapray.animation.Curve + */ + +var KFStepCurve = +/*#__PURE__*/ +function (_Curve) { + _inherits(KFStepCurve, _Curve); + + /** + * @desc + *

type 型の階段関数を keyframes により生成する。

+ *

type は任意の型を指定することができる。

+ *

keyframes を省略したときは type 型の既定値を返す定数関数と同等になる。keyframes の形式に関しては + * {@link mapray.animation.KFStepCurve#setKeyFrames setKeyFrames()} を参照のこと。

+ * + * @param {mapray.animation.Type} type 関数値の型 + * @param {object[]} [keyframes] 初期キーフレーム + */ + function KFStepCurve(type, keyframes) { + var _this; + + _classCallCheck(this, KFStepCurve); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(KFStepCurve).call(this)); + _this._value_type = type; // any type + + _this._num_keyframes = undefined; // >= 1 + + _this._key_times = undefined; // Time[] + + _this._key_values = undefined; // object[] + + if (keyframes !== undefined) { + // 初期のキーフレームを設定 + _this.setKeyFrames(keyframes); + } else { + // 既定のキーフレームを設定 + var t0 = Time.fromNumber(0); + var dv = type.getDefaultValue(); + + _this.setKeyFrames([t0, dv]); + } + + return _this; + } + /** + * @summary キーフレーム設定 + * + * @desc + *

keyframes により、すべてのキーフレームを指定する。

+ * + *

+ * 条件1: keyframes.length >= 2 (キーフレーム数 >= 1)
+ * 条件2: すべての i, j において、i < j ⇔ 時刻i < 時刻j
+ * 条件3: すべての i において、値i は構築子の type 引数で指定した型のインスタンス + *

+ * + * @param {object[]} keyframes [時刻0, 値0, 時刻1, 値1, ...] + */ + + + _createClass(KFStepCurve, [{ + key: "setKeyFrames", + value: function setKeyFrames(keyframes) { + this._num_keyframes = keyframes.length / 2; + this._key_times = new Array(this._num_keyframes); + this._key_values = new Array(this._num_keyframes); // キーフレームを設定 + + for (var i = 0; i < this._num_keyframes; ++i) { + var time = keyframes[2 * i]; + var value = keyframes[2 * i + 1]; + this._key_times[i] = time; + this._key_values[i] = this._value_type.getCloneValue(value); + } // 全時刻の値が変化 + + + this.notifyValueChange(Interval.UNIVERSAL); + } + /** + * @override + */ + + }, { + key: "isTypeSupported", + value: function isTypeSupported(type) { + var from_type = this._value_type; + return type.isConvertible(from_type); + } + /** + * @override + */ + + }, { + key: "getValue", + value: function getValue(time, type) { + var from_type = this._value_type; + + var from_value = this._getInterpolatedValue(time); + + return type.convertValue(from_type, from_value); + } + /** + * @override + */ + + }, { + key: "getInvariance", + value: function getInvariance(interval) { + if (this._num_keyframes == 1) { + // キーフレームが 1 個のときは ConstantCurve と同じく、全時間で一定値 + // (UNIVERSAL と非空区間は必ず交差するので interval の参照は不要) + return new Invariance().write(Interval.UNIVERSAL); + } else { + // assert: this._num_keyframes >= 2 + var invr = new Invariance(); // 最初から2番目のキー時刻より前は一定値 + + var first = this._key_times[1]; + invr.write(new Interval(first, first).getPrecedings()); // 最後のキー時刻とその後は一定値 + + var lastL = this._key_times[this._num_keyframes - 2]; + var lastU = this._key_times[this._num_keyframes - 1]; + invr.write(new Interval(lastL, lastU, false, true).getFollowings()); // interval 範囲に絞って返す + + return invr.getNarrowed(interval); + } + } + /** + * @summary time での補間値を取得 + * + * @param {mapray.animation.Time} time + * + * @return {object} 補間値 (this._value_type に適応した型) + * + * @private + */ + + }, { + key: "_getInterpolatedValue", + value: function _getInterpolatedValue(time) { + // this._key_times に time より後の時刻が存在すれば、その中で最小のインデックス + // そのような時刻が存在しなければ this._num_keyframes + var found = AnimUtil.findKeyFrameIndex(time, this._key_times, 0, this._num_keyframes); // キー値のインデックス + + var index = found > 0 ? found - 1 : 0; // 補間値を生成 + + return this._value_type.getCloneValue(this._key_values[index]); + } + }]); + + return KFStepCurve; +}(Curve); + +var $map$1 = arrayIteration.map; +var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map'); // FF49- issue + +var USES_TO_LENGTH$3 = arrayMethodUsesToLength('map'); // `Array.prototype.map` method +// https://tc39.github.io/ecma262/#sec-array.prototype.map +// with adding support of @@species + +_export({ + target: 'Array', + proto: true, + forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$3 +}, { + map: function map(callbackfn + /* , thisArg */ + ) { + return $map$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +/** + * @summary 複合ベクトル関数 + * + * @classdesc + *

複数の数値関数から構成されるベクトル関数である。

+ *

関数値の型は構築子のパラメータにより vector2, vector3 または vector4 を指定する。

+ *

子関数は number または number へ変換可能な型でなければならない。

+ * + * @memberof mapray.animation + * @extends mapray.animation.Curve + */ + +var ComboVectorCurve = +/*#__PURE__*/ +function (_Curve) { + _inherits(ComboVectorCurve, _Curve); + + /** + * @desc + *

type 型のベクトル関数を生成する。ベクトルの各要素の値は子関数の値になる。

+ * + *

children を省略したときは、ベクトルの全要素が 0 となる定数関数と同等になる。children の形式に関しては + * {@link mapray.animation.ComboVectorCurve#setChildren setChildren()} を参照のこと。

+ * + * @param {mapray.animation.Type} type 関数値の型 (ベクトル型) + * @param {mapray.animation.Curve[]} [children] 初期の全子関数 + * + * @throws {@link mapray.animation.TypeMismatchError} type または children に非対応の型が存在するとき + */ + function ComboVectorCurve(type, children) { + var _this; + + _classCallCheck(this, ComboVectorCurve); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(ComboVectorCurve).call(this)); + var dimension = AnimUtil.getDimension(type); + + if (dimension < 2 && dimension > 4) { + // type はベクトル型ではない + throw new TypeMismatchError("unexpected type"); + } + + _this._vector_type = type; + _this._dimension = dimension; // 2〜4 + + _this._children = new Array(dimension); // 子関数の配列 + + _this._listeners = new Array(dimension); // 子関数に対応した ValueChangeListener + + _this._setupInitialChildren(); // 初期値が指定されているときは設定 + + + if (children !== undefined) { + _this.setChildren(children); + } + + return _this; + } + /** + * @summary 子関数を設定 (個別) + * + * @desc + *

index の要素のみの子関数を設定する。その他の要素は変更されない。

+ * + * @param {number} index 要素インデックス + * @param {mapray.animation.Curve} curve 子関数 + * + * @throws {@link mapray.animation.TypeMismatchError} curve が非対応の型のとき + */ + + + _createClass(ComboVectorCurve, [{ + key: "setChild", + value: function setChild(index, curve) { + this._setChildCommon(index, curve); // curve が未知なので全時刻の値が変化したことにする + + + this.notifyValueChange(Interval.UNIVERSAL); + } + /** + * @summary 子関数を設定 (一括) + * + * @desc + *

curves にすべての子関数を指定する。curves の要素数はベクトルの次数と同数である。

+ * + * @param {mapray.animation.Curve[]} curves 全子関数 + * + * @throws {@link mapray.animation.TypeMismatchError} curves に非対応の型が存在するとき + */ + + }, { + key: "setChildren", + value: function setChildren(curves) { + for (var i = 0; i < this._dimension; ++i) { + this._setChildCommon(i, curves[i]); + } // curves が未知なので全時刻の値が変化したことにする + + + this.notifyValueChange(Interval.UNIVERSAL); + } + /** + * @override + */ + + }, { + key: "isTypeSupported", + value: function isTypeSupported(type) { + var from_type = this._vector_type; + return type.isConvertible(from_type); + } + /** + * @override + */ + + }, { + key: "getValue", + value: function getValue(time, type) { + var from_type = this._vector_type; + + var from_value = this._getCompoundValue(time); + + return type.convertValue(from_type, from_value); + } + /** + * @override + */ + + }, { + key: "getInvariance", + value: function getInvariance(interval) { + // すべての子関数の不変性情報の交差 + var invariances = this._children.map(function (child) { + return child.getInvariance(interval); + }); + + return Invariance.merge(invariances); + } + /** + * 初期の子関数とリスナーを設定 + * + * @private + */ + + }, { + key: "_setupInitialChildren", + value: function _setupInitialChildren() { + var _this2 = this; + + var init_child = new ConstantCurve(vec_compo_type); + + for (var i = 0; i < this._dimension; ++i) { + var listener = function listener(interval) { + _this2.notifyValueChange(interval); + }; + + init_child.addValueChangeListener(listener); + this._children[i] = init_child; + this._listeners[i] = listener; + } + } + /** + * @summary 子要素を設定 (共通ルーチン) + * + * @param {number} index + * @param {mapray.animation.Curve} curve + * + * @throws {@link mapray.animation.TypeMismatchError} + * + * @private + */ + + }, { + key: "_setChildCommon", + value: function _setChildCommon(index, curve) { + var _this3 = this; + + if (!curve.isTypeSupported(vec_compo_type)) { + // curve の型をベクトルの要素の型に変換できない + throw new TypeMismatchError("type mismatch error"); + } // 以前の子のリスナーを解除 + + + var old_child = this._children[index]; + var old_listener = this._listeners[index]; + old_child.removeValueChangeListener(old_listener); // 新しい子のリスナーを設定 + + var listener = function listener(interval) { + _this3.notifyValueChange(interval); + }; + + curve.addValueChangeListener(listener); // 新しい子を設定 + + this._children[index] = curve; + this._listeners[index] = listener; + } + /** + * @summary time での複合値を取得 + * + * @param {mapray.animation.Time} time + * + * @return {number[]} 複合値 (this._vector_type に適応した型) + * + * @private + */ + + }, { + key: "_getCompoundValue", + value: function _getCompoundValue(time) { + var dimension = this._dimension; + var vec = new Float64Array(dimension); + + for (var i = 0; i < dimension; ++i) { + vec[i] = this._children[i].getValue(time, vec_compo_type); + } + + return vec; + } + }]); + + return ComboVectorCurve; +}(Curve); +/** + * ベクトルの要素型 + * @private + */ + + +var vec_compo_type = Type.find("number"); + +/** + * アニメーション関連の機能全体が含まれる名前空間 + * + * @namespace animation + * @memberof mapray + */ + +var animation = { + AnimationError: AnimationError, + Time: Time, + Interval: Interval, + Invariance: Invariance, + Type: Type, + Curve: Curve, + Updater: Updater, + Binder: Binder, + TypeMismatchError: TypeMismatchError, + BindingBlock: BindingBlock, + EasyBindingBlock: EasyBindingBlock, + ConstantCurve: ConstantCurve, + KFLinearCurve: KFLinearCurve, + KFStepCurve: KFStepCurve, + ComboVectorCurve: ComboVectorCurve +}; + +var $forEach$2 = arrayIteration.forEach; +var STRICT_METHOD$1 = arrayMethodIsStrict('forEach'); +var USES_TO_LENGTH$4 = arrayMethodUsesToLength('forEach'); // `Array.prototype.forEach` method implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.foreach + +var arrayForEach = !STRICT_METHOD$1 || !USES_TO_LENGTH$4 ? function forEach(callbackfn +/* , thisArg */ +) { + return $forEach$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); +} : [].forEach; + +// https://tc39.github.io/ecma262/#sec-array.prototype.foreach + + +_export({ + target: 'Array', + proto: true, + forced: [].forEach != arrayForEach +}, { + forEach: arrayForEach +}); + +var nativePromiseConstructor = global_1.Promise; + +var engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent); + +var location = global_1.location; +var set$2 = global_1.setImmediate; +var clear = global_1.clearImmediate; +var process$1 = global_1.process; +var MessageChannel = global_1.MessageChannel; +var Dispatch = global_1.Dispatch; +var counter = 0; +var queue = {}; +var ONREADYSTATECHANGE = 'onreadystatechange'; +var defer, channel, port; + +var run = function (id) { + // eslint-disable-next-line no-prototype-builtins + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; + +var runner = function (id) { + return function () { + run(id); + }; +}; + +var listener = function (event) { + run(event.data); +}; + +var post = function (id) { + // old engines have not location.origin + global_1.postMessage(id + '', location.protocol + '//' + location.host); +}; // Node.js 0.9+ & IE10+ has setImmediate, otherwise: + + +if (!set$2 || !clear) { + set$2 = function setImmediate(fn) { + var args = []; + var i = 1; + + while (arguments.length > i) args.push(arguments[i++]); + + queue[++counter] = function () { + // eslint-disable-next-line no-new-func + (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args); + }; + + defer(counter); + return counter; + }; + + clear = function clearImmediate(id) { + delete queue[id]; + }; // Node.js 0.8- + + + if (classofRaw(process$1) == 'process') { + defer = function (id) { + process$1.nextTick(runner(id)); + }; // Sphere (JS game engine) Dispatch API + + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(runner(id)); + }; // Browsers with MessageChannel, includes WebWorkers + // except iOS - https://github.com/zloirock/core-js/issues/624 + + } else if (MessageChannel && !engineIsIos) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = functionBindContext(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if (global_1.addEventListener && typeof postMessage == 'function' && !global_1.importScripts && !fails(post)) { + defer = post; + global_1.addEventListener('message', listener, false); // IE8- + } else if (ONREADYSTATECHANGE in documentCreateElement('script')) { + defer = function (id) { + html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () { + html.removeChild(this); + run(id); + }; + }; // Rest old browsers + + } else { + defer = function (id) { + setTimeout(runner(id), 0); + }; + } +} + +var task = { + set: set$2, + clear: clear +}; + +var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f; +var macrotask = task.set; +var MutationObserver = global_1.MutationObserver || global_1.WebKitMutationObserver; +var process$2 = global_1.process; +var Promise$1 = global_1.Promise; +var IS_NODE = classofRaw(process$2) == 'process'; // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` + +var queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global_1, 'queueMicrotask'); +var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; +var flush, head, last, notify, toggle, node, promise, then; // modern engines have queueMicrotask method + +if (!queueMicrotask) { + flush = function () { + var parent, fn; + if (IS_NODE && (parent = process$2.domain)) parent.exit(); + + while (head) { + fn = head.fn; + head = head.next; + + try { + fn(); + } catch (error) { + if (head) notify();else last = undefined; + throw error; + } + } + + last = undefined; + if (parent) parent.enter(); + }; // Node.js + + + if (IS_NODE) { + notify = function () { + process$2.nextTick(flush); + }; // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 + + } else if (MutationObserver && !engineIsIos) { + toggle = true; + node = document.createTextNode(''); + new MutationObserver(flush).observe(node, { + characterData: true + }); + + notify = function () { + node.data = toggle = !toggle; + }; // environments with maybe non-completely correct, but existent Promise + + } else if (Promise$1 && Promise$1.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + promise = Promise$1.resolve(undefined); + then = promise.then; + + notify = function () { + then.call(promise, flush); + }; // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(global_1, flush); + }; + } +} + +var microtask = queueMicrotask || function (fn) { + var task = { + fn: fn, + next: undefined + }; + if (last) last.next = task; + + if (!head) { + head = task; + notify(); + } + + last = task; +}; + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction$1(resolve); + this.reject = aFunction$1(reject); +}; // 25.4.1.5 NewPromiseCapability(C) + + +var f$7 = function (C) { + return new PromiseCapability(C); +}; + +var newPromiseCapability = { + f: f$7 +}; + +var promiseResolve = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + +var hostReportErrors = function (a, b) { + var console = global_1.console; + + if (console && console.error) { + arguments.length === 1 ? console.error(a) : console.error(a, b); + } +}; + +var perform = function (exec) { + try { + return { + error: false, + value: exec() + }; + } catch (error) { + return { + error: true, + value: error + }; + } +}; + +var task$1 = task.set; +var SPECIES$4 = wellKnownSymbol('species'); +var PROMISE = 'Promise'; +var getInternalState$4 = internalState.get; +var setInternalState$5 = internalState.set; +var getInternalPromiseState = internalState.getterFor(PROMISE); +var PromiseConstructor = nativePromiseConstructor; +var TypeError$1 = global_1.TypeError; +var document$2 = global_1.document; +var process$3 = global_1.process; +var $fetch = getBuiltIn('fetch'); +var newPromiseCapability$1 = newPromiseCapability.f; +var newGenericPromiseCapability = newPromiseCapability$1; +var IS_NODE$1 = classofRaw(process$3) == 'process'; +var DISPATCH_EVENT = !!(document$2 && document$2.createEvent && global_1.dispatchEvent); +var UNHANDLED_REJECTION = 'unhandledrejection'; +var REJECTION_HANDLED = 'rejectionhandled'; +var PENDING = 0; +var FULFILLED = 1; +var REJECTED = 2; +var HANDLED = 1; +var UNHANDLED = 2; +var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; +var FORCED$5 = isForced_1(PROMISE, function () { + var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor); + + if (!GLOBAL_CORE_JS_PROMISE) { + // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // We can't detect it synchronously, so just check versions + if (engineV8Version === 66) return true; // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test + + if (!IS_NODE$1 && typeof PromiseRejectionEvent != 'function') return true; + } // We need Promise#finally in the pure version for preventing prototype pollution + // deoptimization and performance degradation + // https://github.com/zloirock/core-js/issues/679 + + if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false; // Detect correctness of subclassing with @@species support + + var promise = PromiseConstructor.resolve(1); + + var FakePromise = function (exec) { + exec(function () { + /* empty */ + }, function () { + /* empty */ + }); + }; + + var constructor = promise.constructor = {}; + constructor[SPECIES$4] = FakePromise; + return !(promise.then(function () { + /* empty */ + }) instanceof FakePromise); +}); +var INCORRECT_ITERATION$1 = FORCED$5 || !checkCorrectnessOfIteration(function (iterable) { + PromiseConstructor.all(iterable)['catch'](function () { + /* empty */ + }); +}); // helpers + +var isThenable = function (it) { + var then; + return isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; + +var notify$1 = function (promise, state, isReject) { + if (state.notified) return; + state.notified = true; + var chain = state.reactions; + microtask(function () { + var value = state.value; + var ok = state.state == FULFILLED; + var index = 0; // variable length - can't use forEach + + while (chain.length > index) { + var reaction = chain[index++]; + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + + try { + if (handler) { + if (!ok) { + if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state); + state.rejection = HANDLED; + } + + if (handler === true) result = value;else { + if (domain) domain.enter(); + result = handler(value); // can throw + + if (domain) { + domain.exit(); + exited = true; + } + } + + if (result === reaction.promise) { + reject(TypeError$1('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (error) { + if (domain && !exited) domain.exit(); + reject(error); + } + } + + state.reactions = []; + state.notified = false; + if (isReject && !state.rejection) onUnhandled(promise, state); + }); +}; + +var dispatchEvent = function (name, promise, reason) { + var event, handler; + + if (DISPATCH_EVENT) { + event = document$2.createEvent('Event'); + event.promise = promise; + event.reason = reason; + event.initEvent(name, false, true); + global_1.dispatchEvent(event); + } else event = { + promise: promise, + reason: reason + }; + + if (handler = global_1['on' + name]) handler(event);else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); +}; + +var onUnhandled = function (promise, state) { + task$1.call(global_1, function () { + var value = state.value; + var IS_UNHANDLED = isUnhandled(state); + var result; + + if (IS_UNHANDLED) { + result = perform(function () { + if (IS_NODE$1) { + process$3.emit('unhandledRejection', value, promise); + } else dispatchEvent(UNHANDLED_REJECTION, promise, value); + }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + + state.rejection = IS_NODE$1 || isUnhandled(state) ? UNHANDLED : HANDLED; + if (result.error) throw result.value; + } + }); +}; + +var isUnhandled = function (state) { + return state.rejection !== HANDLED && !state.parent; +}; + +var onHandleUnhandled = function (promise, state) { + task$1.call(global_1, function () { + if (IS_NODE$1) { + process$3.emit('rejectionHandled', promise); + } else dispatchEvent(REJECTION_HANDLED, promise, state.value); + }); +}; + +var bind = function (fn, promise, state, unwrap) { + return function (value) { + fn(promise, state, value, unwrap); + }; +}; + +var internalReject = function (promise, state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + state.value = value; + state.state = REJECTED; + notify$1(promise, state, true); +}; + +var internalResolve = function (promise, state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + + try { + if (promise === value) throw TypeError$1("Promise can't be resolved itself"); + var then = isThenable(value); + + if (then) { + microtask(function () { + var wrapper = { + done: false + }; + + try { + then.call(value, bind(internalResolve, promise, wrapper, state), bind(internalReject, promise, wrapper, state)); + } catch (error) { + internalReject(promise, wrapper, error, state); + } + }); + } else { + state.value = value; + state.state = FULFILLED; + notify$1(promise, state, false); + } + } catch (error) { + internalReject(promise, { + done: false + }, error, state); + } +}; // constructor polyfill + + +if (FORCED$5) { + // 25.4.3.1 Promise(executor) + PromiseConstructor = function Promise(executor) { + anInstance(this, PromiseConstructor, PROMISE); + aFunction$1(executor); + Internal.call(this); + var state = getInternalState$4(this); + + try { + executor(bind(internalResolve, this, state), bind(internalReject, this, state)); + } catch (error) { + internalReject(this, state, error); + } + }; // eslint-disable-next-line no-unused-vars + + + Internal = function Promise(executor) { + setInternalState$5(this, { + type: PROMISE, + done: false, + notified: false, + parent: false, + reactions: [], + rejection: false, + state: PENDING, + value: undefined + }); + }; + + Internal.prototype = redefineAll(PromiseConstructor.prototype, { + // `Promise.prototype.then` method + // https://tc39.github.io/ecma262/#sec-promise.prototype.then + then: function then(onFulfilled, onRejected) { + var state = getInternalPromiseState(this); + var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = IS_NODE$1 ? process$3.domain : undefined; + state.parent = true; + state.reactions.push(reaction); + if (state.state != PENDING) notify$1(this, state, false); + return reaction.promise; + }, + // `Promise.prototype.catch` method + // https://tc39.github.io/ecma262/#sec-promise.prototype.catch + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + + OwnPromiseCapability = function () { + var promise = new Internal(); + var state = getInternalState$4(promise); + this.promise = promise; + this.resolve = bind(internalResolve, promise, state); + this.reject = bind(internalReject, promise, state); + }; + + newPromiseCapability.f = newPromiseCapability$1 = function (C) { + return C === PromiseConstructor || C === PromiseWrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); + }; + + if ( typeof nativePromiseConstructor == 'function') { + nativeThen = nativePromiseConstructor.prototype.then; // wrap native Promise#then for native async functions + + redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) { + var that = this; + return new PromiseConstructor(function (resolve, reject) { + nativeThen.call(that, resolve, reject); + }).then(onFulfilled, onRejected); // https://github.com/zloirock/core-js/issues/640 + }, { + unsafe: true + }); // wrap fetch result + + if (typeof $fetch == 'function') _export({ + global: true, + enumerable: true, + forced: true + }, { + // eslint-disable-next-line no-unused-vars + fetch: function fetch(input + /* , init */ + ) { + return promiseResolve(PromiseConstructor, $fetch.apply(global_1, arguments)); + } + }); + } +} + +_export({ + global: true, + wrap: true, + forced: FORCED$5 +}, { + Promise: PromiseConstructor +}); +setToStringTag(PromiseConstructor, PROMISE, false); +setSpecies(PROMISE); +PromiseWrapper = getBuiltIn(PROMISE); // statics + +_export({ + target: PROMISE, + stat: true, + forced: FORCED$5 +}, { + // `Promise.reject` method + // https://tc39.github.io/ecma262/#sec-promise.reject + reject: function reject(r) { + var capability = newPromiseCapability$1(this); + capability.reject.call(undefined, r); + return capability.promise; + } +}); +_export({ + target: PROMISE, + stat: true, + forced: FORCED$5 +}, { + // `Promise.resolve` method + // https://tc39.github.io/ecma262/#sec-promise.resolve + resolve: function resolve(x) { + return promiseResolve( this, x); + } +}); +_export({ + target: PROMISE, + stat: true, + forced: INCORRECT_ITERATION$1 +}, { + // `Promise.all` method + // https://tc39.github.io/ecma262/#sec-promise.all + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability$1(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aFunction$1(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate_1(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + $promiseResolve.call(C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + }, + // `Promise.race` method + // https://tc39.github.io/ecma262/#sec-promise.race + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability$1(C); + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aFunction$1(C.resolve); + iterate_1(iterable, function (promise) { + $promiseResolve.call(C, promise).then(capability.resolve, reject); + }); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + +for (var COLLECTION_NAME$1 in domIterables) { + var Collection$1 = global_1[COLLECTION_NAME$1]; + var CollectionPrototype$1 = Collection$1 && Collection$1.prototype; // some Chrome versions have non-configurable methods on DOMTokenList + + if (CollectionPrototype$1 && CollectionPrototype$1.forEach !== arrayForEach) try { + createNonEnumerableProperty(CollectionPrototype$1, 'forEach', arrayForEach); + } catch (error) { + CollectionPrototype$1.forEach = arrayForEach; + } +} + +var runtime_1 = createCommonjsModule(function (module) { + /** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + var runtime = function (exports) { + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined$1; // More compressible than void 0. + + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + function define(obj, key, value) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + return obj[key]; + } + + try { + // IE 8 has a broken Object.defineProperty that only works on DOM objects. + define({}, ""); + } catch (err) { + define = function (obj, key, value) { + return obj[key] = value; + }; + } + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + + generator._invoke = makeInvokeMethod(innerFn, self, context); + return generator; + } + + exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + + function tryCatch(fn, obj, arg) { + try { + return { + type: "normal", + arg: fn.call(obj, arg) + }; + } catch (err) { + return { + type: "throw", + arg: err + }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + + var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + + function Generator() {} + + function GeneratorFunction() {} + + function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + + + var IteratorPrototype = {}; + + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + + if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function (method) { + define(prototype, method, function (arg) { + return this._invoke(method, arg); + }); + }); + } + + exports.isGeneratorFunction = function (genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" : false; + }; + + exports.mark = function (genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + define(genFun, toStringTagSymbol, "GeneratorFunction"); + } + + genFun.prototype = Object.create(Gp); + return genFun; + }; // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + + + exports.awrap = function (arg) { + return { + __await: arg + }; + }; + + function AsyncIterator(generator, PromiseImpl) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + + if (value && typeof value === "object" && hasOwn.call(value, "__await")) { + return PromiseImpl.resolve(value.__await).then(function (value) { + invoke("next", value, resolve, reject); + }, function (err) { + invoke("throw", err, resolve, reject); + }); + } + + return PromiseImpl.resolve(value).then(function (unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. + result.value = unwrapped; + resolve(result); + }, function (error) { + // If a rejected Promise was yielded, throw the rejection back + // into the async generator function so it can be handled there. + return invoke("throw", error, resolve, reject); + }); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new PromiseImpl(function (resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); + } // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + + + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + + exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + + exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { + if (PromiseImpl === void 0) PromiseImpl = Promise; + var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); + return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function (result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + + + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + var record = tryCatch(innerFn, self, context); + + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done ? GenStateCompleted : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + } else if (record.type === "throw") { + state = GenStateCompleted; // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + + + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + + if (method === undefined$1) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + // Note: ["return"] must be used for ES3 parsing compatibility. + if (delegate.iterator["return"]) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined$1; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError("The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (!info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). + + context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined$1; + } + } else { + // Re-yield the result returned by the delegate method. + return info; + } // The delegate iterator is finished, so forget it and continue with + // the outer generator. + + + context.delegate = null; + return ContinueSentinel; + } // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + + + defineIteratorMethods(Gp); + define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + + Gp[iteratorSymbol] = function () { + return this; + }; + + Gp.toString = function () { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { + tryLoc: locs[0] + }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ + tryLoc: "root" + }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + exports.keys = function (object) { + var keys = []; + + for (var key in object) { + keys.push(key); + } + + keys.reverse(); // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + + return function next() { + while (keys.length) { + var key = keys.pop(); + + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + + + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, + next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined$1; + next.done = true; + return next; + }; + + return next.next = next; + } + } // Return an iterator with no values. + + + return { + next: doneResult + }; + } + + exports.values = values; + + function doneResult() { + return { + value: undefined$1, + done: true + }; + } + + Context.prototype = { + constructor: Context, + reset: function (skipTempReset) { + this.prev = 0; + this.next = 0; // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + + this.sent = this._sent = undefined$1; + this.done = false; + this.delegate = null; + this.method = "next"; + this.arg = undefined$1; + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { + this[name] = undefined$1; + } + } + } + }, + stop: function () { + this.done = true; + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + dispatchException: function (exception) { + if (this.done) { + throw exception; + } + + var context = this; + + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined$1; + } + + return !!caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + abrupt: function (type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + + if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + complete: function (record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + finish: function (finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + "catch": function (tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + + return thrown; + } + } // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + + + throw new Error("illegal catch attempt"); + }, + delegateYield: function (iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined$1; + } + + return ContinueSentinel; + } + }; // Regardless of whether this script is executing as a CommonJS module + // or not, return the runtime object so that we can declare the variable + // regeneratorRuntime in the outer scope, which allows this module to be + // injected easily by `bin/regenerator --include-runtime script.js`. + + return exports; + }( // If this script is executing as a CommonJS module, use module.exports + // as the regeneratorRuntime namespace. Otherwise create a new empty + // object. Either way, the resulting object will be used to initialize + // the regeneratorRuntime variable at the top of this file. + module.exports ); + + try { + regeneratorRuntime = runtime; + } catch (accidentalStrictMode) { + // This module should not be running in strict mode, so the above + // assignment should always work unless something is misconfigured. Just + // in case runtime.js accidentally runs in strict mode, we can escape + // strict mode using a global Function call. This could conceivably fail + // if a Content Security Policy forbids using Function, but in that case + // the proper solution is to fix the accidental strict mode problem. If + // you've misconfigured your bundler to force strict mode and applied a + // CSP to forbid Function, and you're not willing to fix either of those + // problems, please detail your unique predicament in a GitHub issue. + Function("r", "regeneratorRuntime = r")(runtime); + } +}); + +/** + * @summary 始点と方向 + * @classdesc + *

始点と方向で表現される半直線である。

+ * @memberof mapray + * @see mapray.Viewer#getRayIntersection + * @see mapray.Camera#getCanvasRay + */ + +var Ray = +/** + * @desc + *

pos の参照を {@link mapray.Ray#position}, dir の参照を {@link mapray.Ray#direction} に代入する。

+ *

ただし引数を省略したとき、対応するメンバーには新たに生成されたベクトルが代入される。

+ * @param {mapray.Vector3} [pos] レイの始点 + * @param {mapray.Vector3} [dir] レイの方向 + */ +function Ray(pos, dir) { + _classCallCheck(this, Ray); + + /** + * @summary レイの始点 + * @member mapray.Ray#position + * @type {mapray.Vector3} + * @default [0, 0, 0] + */ + this.position = pos || GeoMath.createVector3(); + /** + * @summary レイの方向 + * @desc + *

非零ベクトルでなければならない。

+ * @member mapray.Ray#direction + * @type {mapray.Vector3} + * @default [0, 0, -1] + */ + + this.direction = dir || GeoMath.createVector3([0, 0, -1]); +}; + +/** + * @summary 視点を表現するカメラ + * + * @classdesc + *

視点を表現するカメラである。

+ *

インスタンスは {@link mapray.Viewer#camera} から得ることができる。

+ * + * @hideconstructor + * @memberof mapray + * @see mapray.Viewer + */ + +var Camera = +/*#__PURE__*/ +function () { + /** + * @summary Cameraオブジェクトを生成 + * canvas_sizeには、width, heightプロパティを持つオブジェクトを指定する。 + * createRenderInfo()が呼ばれる度にwidth, height値が参照される。 + * canvas要素が指定される他、オフスクリーンレンダリング時にはwidth, height値を持ったオブジェクトが指定されます。 + * + * @param {object} canvas_size レンダリング先サイズ + * @param {number} canvas_size.width 幅 + * @param {number} canvas_size.height 高さ + * @package + */ + function Camera(canvas_size) { + _classCallCheck(this, Camera); + + /** + * @summary レンダリング先のサイズ + * @type {object} + */ + this._canvas_size = canvas_size; + /** + * @summary カメラの画角 (Degrees) + * @member mapray.Camera#fov + * @type {number} + * @default 46 + */ + + this.fov = 46; + /** + * @summary 近接平面距離 (Meters) + * @member mapray.Camera#near + * @type {number} + * @default 1 + */ + + this.near = 1; + /** + * @summary 遠方平面距離 (Meters) + * @member mapray.Camera#far + * @type {number} + * @default 1000 + */ + + this.far = 1000; + /** + * @summary 視点空間から GOCS への変換行列 + * @member mapray.Camera#view_to_gocs + * @type {mapray.Matrix} + * @default 恒等行列 + */ + + this.view_to_gocs = GeoMath.createMatrix(); + GeoMath.setIdentity(this.view_to_gocs); + } + /** + * @summary カメラの姿勢や視体積に関するパラメータをコピーします。 + * キャンバスサイズはコピーされません。 + * @private + */ + + + _createClass(Camera, [{ + key: "copyViewParameters", + value: function copyViewParameters(camera) { + this.fov = camera.fov; + this.near = camera.near; + this.far = camera.far; + GeoMath.copyMatrix(camera.view_to_gocs, this.view_to_gocs); + } + /** + * @summary 変換行列 canvas_to_view を取得 + * @desc + *

キャンバス座標系から視点座標系へ座標を変換するための変換行列を取得する。

+ *

結果は omat に設定するが、omat を省略した場合は新規に生成した行列オブジェクトを使用する。

+ *

キャンバスの幅または高さが 0 のときは結果は不定値となる。

+ * @param {mapray.Matrix} [omat] 結果を設定する行列オブジェクト + * @return {mapray.Matrix} omat または新規に生成した行列 + */ + + }, { + key: "getCanvasToView", + value: function getCanvasToView(omat) { + var dst = omat || GeoMath.createMatrix(); // キャンバス画素数 -> sx, sy + + var sx = this._canvas_size.width; + var sy = this._canvas_size.height; // 近接遠方平面距離 -> n, f + + var n = this.near; + var f = this.far; // n 勾配 (対角線画角を想定) -> gx, gy + + var hfov = this.fov * GeoMath.DEGREE / 2; + var aspect = sy / sx; + var gx = n * Math.tan(hfov) / Math.sqrt(1 + aspect * aspect); + var gy = gx * aspect; // 行列の要素を設定 + + dst[0] = 2 * gx / (n * sx); + dst[1] = 0; + dst[2] = 0; + dst[3] = 0; + dst[4] = 0; + dst[5] = -2 * gy / (n * sy); + dst[6] = 0; + dst[7] = 0; + dst[8] = 0; + dst[9] = 0; + dst[10] = 0; + dst[11] = (n - f) / (n * f); + dst[12] = -gx / n; + dst[13] = gy / n; + dst[14] = -1; + dst[15] = 1 / n; + return dst; + } + /** + * @summary 変換行列 canvas_to_gocs を取得 + * @desc + *

キャンバス座標系から地心座標系 (GOCS) へ座標を変換するための変換行列を取得する。

+ *

結果は omat に設定するが、omat を省略した場合は新規に生成した行列オブジェクトを使用する。

+ *

キャンバスの幅または高さが 0 のときは結果は不定値となる。

+ * @param {mapray.Matrix} [omat] 結果を設定する行列オブジェクト + * @return {mapray.Matrix} omat または新規に生成した行列 + */ + + }, { + key: "getCanvasToGocs", + value: function getCanvasToGocs(omat) { + /*== canvas_to_view ==*/ + var nMat = this.getCanvasToView(omat); + var n00 = nMat[0]; // n10 = 0 + // n20 = 0 + // n30 = 0 + // n01 = 0 + + var n11 = nMat[5]; // n21 = 0 + // n31 = 0 + // n03 = 0 + // n13 = 0 + // n23 = 0 + + var n32 = nMat[11]; + var n03 = nMat[12]; + var n13 = nMat[13]; // n23 = -1 + + var n33 = nMat[15]; + /*== view_to_gocs ==*/ + + var mMat = this.view_to_gocs; + var m00 = mMat[0]; + var m10 = mMat[1]; + var m20 = mMat[2]; // m30 = 0 + + var m01 = mMat[4]; + var m11 = mMat[5]; + var m21 = mMat[6]; // m31 = 0 + + var m02 = mMat[8]; + var m12 = mMat[9]; + var m22 = mMat[10]; // m32 = 0 + + var m03 = mMat[12]; + var m13 = mMat[13]; + var m23 = mMat[14]; // m33 = 1 + + /*== dst = view_to_gocs * canvas_to_view ==*/ + + var dst = nMat; + dst[0] = m00 * n00; + dst[1] = m10 * n00; + dst[2] = m20 * n00; // dst[ 3] = 0 + + dst[4] = m01 * n11; + dst[5] = m11 * n11; + dst[6] = m21 * n11; // dst[ 7] = 0 + + dst[8] = m03 * n32; + dst[9] = m13 * n32; + dst[10] = m23 * n32; // dst[ 11] = n32 + + dst[12] = m00 * n03 + m01 * n13 - m02 + m03 * n33; + dst[13] = m10 * n03 + m11 * n13 - m12 + m13 * n33; + dst[14] = m20 * n03 + m21 * n13 - m22 + m23 * n33; // dst[ 12] = n33 + + return dst; + } + /** + * @summary 変換行列 view_to_canvas を取得 + * @desc + *

視点座標系からキャンバス座標系へ座標を変換するための変換行列を取得する。

+ *

結果は omat に設定するが、omat を省略した場合は新規に生成した行列オブジェクトを使用する。

+ *

キャンバスの幅または高さが 0 のときは結果は不定値となる。

+ * @param {mapray.Matrix} [omat] 結果を設定する行列オブジェクト + * @return {mapray.Matrix} omat または新規に生成した行列 + */ + + }, { + key: "getViewToCanvas", + value: function getViewToCanvas(omat) { + var dst = omat || GeoMath.createMatrix(); // キャンバス画素数 -> sx, sy + + var sx = this._canvas_size.width; + var sy = this._canvas_size.height; // 近接遠方平面距離 -> n, f + + var n = this.near; + var f = this.far; // n 勾配 (対角線画角を想定) -> gx, gy + + var hfov = this.fov * GeoMath.DEGREE / 2; + var aspect = sy / sx; + var gx = n * Math.tan(hfov) / Math.sqrt(1 + aspect * aspect); + var gy = gx * aspect; // 行列の要素を設定 + + dst[0] = n * sx / (2 * gx); + dst[1] = 0; + dst[2] = 0; + dst[3] = 0; + dst[4] = 0; + dst[5] = -n * sy / (2 * gy); + dst[6] = 0; + dst[7] = 0; + dst[8] = -sx / 2; + dst[9] = -sy / 2; + dst[10] = f / (n - f); + dst[11] = -1; + dst[12] = 0; + dst[13] = 0; + dst[14] = n * f / (n - f); + dst[15] = 0; + return dst; + } + /** + * @summary キャンバス座標に対応するレイを取得 + * @desc + *

キャンバス上の cpos で示した点に対応するレイを取得する。

+ *

始点は近接平面上に置き、方向は長さ 1 に正規化される。

+ *

返されるレイの座標系は GOCS である。

+ * @param {mapray.Vector2} cpos キャンバス上の位置 + * @param {mapray.Ray} [oray] 結果を設定する Ray オブジェクト + * @return {mapray.Ray} oray または新規に生成した Ray + */ + + }, { + key: "getCanvasRay", + value: function getCanvasRay(cpos, oray) { + var x = cpos[0]; + var y = cpos[1]; + var dst = oray || new Ray(); // Q = Mr (x, y, 0, 1)^t + + var mr = this.getCanvasToGocs(Camera._temp_mat); + var qx = x * mr[0] + y * mr[4] + mr[12]; + var qy = x * mr[1] + y * mr[5] + mr[13]; + var qz = x * mr[2] + y * mr[6] + mr[14]; + var qw = x * mr[3] + y * mr[7] + mr[15]; // Q を通常の座標に変換 + + var pos = dst.position; + pos[0] = qx / qw; + pos[1] = qy / qw; + pos[2] = qz / qw; // Vr = pos - Mg (0, 0, 0)^t + + var mg = this.view_to_gocs; + var dir = dst.direction; + dir[0] = pos[0] - mg[12]; + dir[1] = pos[1] - mg[13]; + dir[2] = pos[2] - mg[14]; + GeoMath.normalize3(dir, dir); + return dst; + } + /** + * @summary レンダリング先のサイズ + * @type {object} + * @private + */ + + }, { + key: "createRenderInfo", + + /** + * @summary レンダリング情報を生成します。 + * ビューポート内で実際にレンダリングを行う領域を指定します。(レンダリング領域が指定されなかった場合はビューポート全体にレンダリングを行います) + * @param {number} [sx] レンダリング領域のx位置 + * @param {number} [sy] レンダリング領域のy位置 + * @param {number} [swidth] レンダリング領域の幅 + * @param {number} [sheight] レンダリング領域の高さ + * @return {mapray.Camera.RenderInfo} + * @package + */ + value: function createRenderInfo(sx, sy, swidth, sheight) { + var canvas_size = this._canvas_size; + return new RenderInfo(this, canvas_size.width, canvas_size.height, sx, sy, swidth, sheight); + } + }, { + key: "canvas_size", + get: function get() { + return this._canvas_size; + } + }]); + + return Camera; +}(); + +Camera._temp_mat = GeoMath.createMatrix(); +/** + * @summary カメラから得るレンダリング情報 + * @memberof mapray.Camera + * @private + */ + +var RenderInfo = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Camera} camera 対象カメラ + * @param {number} width ビューポートの幅 + * @param {number} height ビューポートの高さ + * @param {number} [sx] レンダリング領域のx位置(ビューポート中央を0, 右方向を正とする) + * @param {number} [sy] レンダリング領域のy位置(ビューポート中央を0, 上方向を正とする) + * @param {number} [swidth] レンダリング領域の幅 + * @param {number} [sheight] レンダリング領域の高さ + */ + function RenderInfo(camera, width, height, sx, sy, swidth, sheight) { + _classCallCheck(this, RenderInfo); + + /* + * y swidth + * Viewport | |<--->| + * +--------------+--------------+ ----------- + * | | | ^ + * | | +-----+ | -- | + * | sy+---| + | | sheight | + * | | +-----+ | -- | + * | | | | | + * --+--------------+------+-------+--x | + * | | sx | | + * | | | height + * | | | | + * | | | | + * | | | V + * +--------------+--------------+ ----------- + * + * |<---------- width ---------->| + */ + // オブジェクトを生成 + this._view_to_clip = GeoMath.createMatrix(); + this._volume_planes = []; + + for (var i = 0; i < 6; ++i) { + this._volume_planes.push(GeoMath.createVector4()); + } + + this._pixel_step = 0; // オブジェクトを設定 + + this._setup_view_to_clip(camera, width, height, sx, sy, swidth, sheight); + + this._setup_volume_planes(); + + this._setup_pixel_step(width, height); + } + /** + * @summary 視点空間からクリップ同次空間への変換行列 + * @type {mapray.Matrix} + * @readonly + */ + + + _createClass(RenderInfo, [{ + key: "_setup_view_to_clip", + + /** + * @private + */ + value: function _setup_view_to_clip(camera, width, height) { + var sx = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + var sy = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var swidth = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : width; + var sheight = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : height; + // 矩形の中心位置 (単位空間) + var cx = 2 * sx / width; + var cy = 2 * sy / height; // 矩形の半サイズ (単位空間) + + var dx = swidth / width; + var dy = sheight / height; // キャンバスの横幅に対する高さの比 + + var aspect = height / width; // fov を対角線画角と解釈して単位サイズを求める + // (単位空間の水平方向 1 に対する近接平面上での寸法) + + var hfov = camera.fov * GeoMath.DEGREE / 2; // 半画角 (radians) + + var unit = camera.near * Math.tan(hfov) / Math.sqrt(1 + aspect * aspect); // 近接平面上での平面位置 + + var left = (cx - dx) * unit; + var right = (cx + dx) * unit; + var bottom = (cy - dy) * unit * aspect; + var top = (cy + dy) * unit * aspect; + GeoMath.frustum_matrix(left, right, bottom, top, camera.near, camera.far, this._view_to_clip); + } + /** + * @private + */ + + }, { + key: "_setup_volume_planes", + value: function _setup_volume_planes() { + var matrix = this._view_to_clip; + var plane = this._volume_planes; // 視体積の内側を向いた平面を取得 + // これらの式は任意の射影行列に対して有効 + + this._add_matrix_rows(matrix, 3, 2, plane[0]); // near = m3 + m2 + + + this._sub_matrix_rows(matrix, 3, 2, plane[1]); // far = m3 - m2 + + + this._add_matrix_rows(matrix, 3, 0, plane[2]); // left = m3 + m0 + + + this._sub_matrix_rows(matrix, 3, 0, plane[3]); // right = m3 - m0 + + + this._add_matrix_rows(matrix, 3, 1, plane[4]); // bottom = m3 + m1 + + + this._sub_matrix_rows(matrix, 3, 1, plane[5]); // top = m3 - m1 + // 法線を正規化 + + + for (var i = 0; i < 6; ++i) { + var p = plane[i]; + var x = p[0]; + var y = p[1]; + var z = p[2]; + var ilen = 1 / Math.sqrt(x * x + y * y + z * z); // 長さの逆数 + + p[0] *= ilen; + p[1] *= ilen; + p[2] *= ilen; + p[3] *= ilen; + } + } + /** + * @private + */ + + }, { + key: "_setup_pixel_step", + value: function _setup_pixel_step(width, height) { + // mIJ は view_to_clip の I 行 J 列の成分 + // + // 2 (m33 - m32) + // dx = --------------- + // m00 width + // + // 2 (m33 - m32) + // dy = --------------- + // m11 height + var mat = this._view_to_clip; + var m00 = mat[0]; + var m11 = mat[5]; + var m32 = mat[11]; + var m33 = mat[15]; + var n = 2 * (m33 - m32); + var dx = n / (m00 * width); + var dy = n / (m11 * height); + this._pixel_step = Math.sqrt(dx * dx + dy * dy) * Math.SQRT1_2; + } + /** + * @private + */ + + }, { + key: "_add_matrix_rows", + value: function _add_matrix_rows(mat, row1, row2, dst) { + dst[0] = mat[row1] + mat[row2]; + dst[1] = mat[row1 + 4] + mat[row2 + 4]; + dst[2] = mat[row1 + 8] + mat[row2 + 8]; + dst[3] = mat[row1 + 12] + mat[row2 + 12]; + return dst; + } + /** + * @private + */ + + }, { + key: "_sub_matrix_rows", + value: function _sub_matrix_rows(mat, row1, row2, dst) { + dst[0] = mat[row1] - mat[row2]; + dst[1] = mat[row1 + 4] - mat[row2 + 4]; + dst[2] = mat[row1 + 8] - mat[row2 + 8]; + dst[3] = mat[row1 + 12] - mat[row2 + 12]; + return dst; + } + }, { + key: "view_to_clip", + get: function get() { + return this._view_to_clip; + } + /** + * @summary 視体積の平面ベクトル配列 + * @desc + *

以下の順序で 6 枚の平面ベクトルが格納されている。

+ * + *
+     * [near, far, left, right, bottom, top]
+     * 
+ * + *

各平面の x, y, z は長さ 1 に正規化されている。

+ * + * @type {mapray.Vector4[]} + * @readonly + */ + + }, { + key: "volume_planes", + get: function get() { + return this._volume_planes; + } + /** + * @summary 視点空間での画素の変化量 + * @desc + *

ビューポートの画素に対応する視点空間の Z = -1 平面での変化量を返す。

+ * + * @type {number} + * @readonly + */ + + }, { + key: "pixel_step", + get: function get() { + return this._pixel_step; + } + }]); + + return RenderInfo; +}(); + +/** + * @summary WebGL の環境 + * @desc + * WebGL レンダリングコンテキストを生成し、そのコンテキストに関連する情報を提供する。 + * @memberof mapray + * @private + */ +var GLEnv = +/*#__PURE__*/ +function () { + /** + * @param canvas {HTMLCanvasElement} レンダリングターゲットとするキャンバス + */ + function GLEnv(canvas) { + _classCallCheck(this, GLEnv); + + var ctx_attribs = { + depth: true, + antialias: true + }; + + var context = this._getContextWebGL(canvas, ctx_attribs); + + if (!context) { + throw new Error("It doesn't appear your computer can support WebGL."); + } + + this._canvas = canvas; + this._context = context; + + this._setupExtensions(context); + } + /** + * @summary WebGL コンテキストを取得 + * @param {HTMLCanvasElement} canvas Canvas 要素 + * @param {WebGLContextAttributes} ctx_attribs 生成属性 (省略可能) + * @return {WebGLRenderingContext} 取得された WebGL コンテキスト (コンテキストを持たないときは null) + * @private + * + * @see https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2 + */ + + + _createClass(GLEnv, [{ + key: "_getContextWebGL", + value: function _getContextWebGL(canvas, ctx_attribs) { + var contextTypes = ["webgl", "experimental-webgl"]; + + for (var i = 0; i < contextTypes.length; ++i) { + var context = canvas.getContext(contextTypes[i], ctx_attribs); + + if (context) { + return context; + } + } + + return null; + } + /** + * @summary 既知の WebGL 拡張を設定 + * @param {WebGLRenderingContext} gl WebGL コンテキスト + * @private + * @see https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14 + */ + + }, { + key: "_setupExtensions", + value: function _setupExtensions(gl) { + // OES_element_index_uint + this.OES_element_index_uint = gl.getExtension("OES_element_index_uint"); // EXT_texture_filter_anisotropic + + this.EXT_texture_filter_anisotropic = gl.getExtension("EXT_texture_filter_anisotropic") || gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic") || gl.getExtension("MOZ_EXT_texture_filter_anisotropic"); // WEBGL_depth_texture + + this.WEBGL_depth_texture = gl.getExtension("WEBGL_depth_texture") || gl.getExtension("WEBKIT_WEBGL_depth_texture") || gl.getExtension("MOZ_WEBGL_depth_texture"); + } + /** + * @summary レンダリングターゲットとするキャンバス + * @type {HTMLCanvasElement} + * @readonly + */ + + }, { + key: "canvas", + get: function get() { + return this._canvas; + } + /** + * @summary WebGL レンダリングコンテキスト + * @type {WebGLRenderingContext} + * @readonly + */ + + }, { + key: "context", + get: function get() { + return this._context; + } + }]); + + return GLEnv; +}(); + +var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('slice'); +var USES_TO_LENGTH$5 = arrayMethodUsesToLength('slice', { + ACCESSORS: true, + 0: 0, + 1: 2 +}); +var SPECIES$5 = wellKnownSymbol('species'); +var nativeSlice = [].slice; +var max$1 = Math.max; // `Array.prototype.slice` method +// https://tc39.github.io/ecma262/#sec-array.prototype.slice +// fallback for not array-like ES3 strings and DOM objects + +_export({ + target: 'Array', + proto: true, + forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$5 +}, { + slice: function slice(start, end) { + var O = toIndexedObject(this); + var length = toLength(O.length); + var k = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible + + var Constructor, result, n; + + if (isArray(O)) { + Constructor = O.constructor; // cross-realm fallback + + if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) { + Constructor = undefined; + } else if (isObject(Constructor)) { + Constructor = Constructor[SPECIES$5]; + if (Constructor === null) Constructor = undefined; + } + + if (Constructor === Array || Constructor === undefined) { + return nativeSlice.call(O, k, fin); + } + } + + result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0)); + + for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]); + + result.length = n; + return result; + } +}); + +var test$1 = []; +var nativeSort = test$1.sort; // IE8- + +var FAILS_ON_UNDEFINED = fails(function () { + test$1.sort(undefined); +}); // V8 bug + +var FAILS_ON_NULL = fails(function () { + test$1.sort(null); +}); // Old WebKit + +var STRICT_METHOD$2 = arrayMethodIsStrict('sort'); +var FORCED$6 = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD$2; // `Array.prototype.sort` method +// https://tc39.github.io/ecma262/#sec-array.prototype.sort + +_export({ + target: 'Array', + proto: true, + forced: FORCED$6 +}, { + sort: function sort(comparefn) { + return comparefn === undefined ? nativeSort.call(toObject(this)) : nativeSort.call(toObject(this), aFunction$1(comparefn)); + } +}); + +var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('splice'); +var USES_TO_LENGTH$6 = arrayMethodUsesToLength('splice', { + ACCESSORS: true, + 0: 0, + 1: 2 +}); +var max$2 = Math.max; +var min$4 = Math.min; +var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF; +var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded'; // `Array.prototype.splice` method +// https://tc39.github.io/ecma262/#sec-array.prototype.splice +// with adding support of @@species + +_export({ + target: 'Array', + proto: true, + forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 +}, { + splice: function splice(start, deleteCount + /* , ...items */ + ) { + var O = toObject(this); + var len = toLength(O.length); + var actualStart = toAbsoluteIndex(start, len); + var argumentsLength = arguments.length; + var insertCount, actualDeleteCount, A, k, from, to; + + if (argumentsLength === 0) { + insertCount = actualDeleteCount = 0; + } else if (argumentsLength === 1) { + insertCount = 0; + actualDeleteCount = len - actualStart; + } else { + insertCount = argumentsLength - 2; + actualDeleteCount = min$4(max$2(toInteger(deleteCount), 0), len - actualStart); + } + + if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) { + throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED); + } + + A = arraySpeciesCreate(O, actualDeleteCount); + + for (k = 0; k < actualDeleteCount; k++) { + from = actualStart + k; + if (from in O) createProperty(A, k, O[from]); + } + + A.length = actualDeleteCount; + + if (insertCount < actualDeleteCount) { + for (k = actualStart; k < len - actualDeleteCount; k++) { + from = k + actualDeleteCount; + to = k + insertCount; + if (from in O) O[to] = O[from];else delete O[to]; + } + + for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1]; + } else if (insertCount > actualDeleteCount) { + for (k = len - actualDeleteCount; k > actualStart; k--) { + from = k + actualDeleteCount - 1; + to = k + insertCount - 1; + if (from in O) O[to] = O[from];else delete O[to]; + } + } + + for (k = 0; k < insertCount; k++) { + O[k + actualStart] = arguments[k + 2]; + } + + O.length = len - actualDeleteCount + insertCount; + return A; + } +}); + +var nativeExpm1 = Math.expm1; +var exp = Math.exp; // `Math.expm1` method implementation +// https://tc39.github.io/ecma262/#sec-math.expm1 + +var mathExpm1 = !nativeExpm1 // Old FF bug +|| nativeExpm1(10) > 22025.465794806719 || nativeExpm1(10) < 22025.4657948067165168 // Tor Browser bug +|| nativeExpm1(-2e-17) != -2e-17 ? function expm1(x) { + return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : exp(x) - 1; +} : nativeExpm1; + +var nativeCosh = Math.cosh; +var abs$1 = Math.abs; +var E = Math.E; // `Math.cosh` method +// https://tc39.github.io/ecma262/#sec-math.cosh + +_export({ + target: 'Math', + stat: true, + forced: !nativeCosh || nativeCosh(710) === Infinity +}, { + cosh: function cosh(x) { + var t = mathExpm1(abs$1(x) - 1) + 1; + return (t + 1 / (t * E * E)) * (E / 2); + } +}); + +// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags + + +var regexpFlags = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.dotAll) result += 's'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + +// so we use an intermediate function. + + +function RE(s, f) { + return RegExp(s, f); +} + +var UNSUPPORTED_Y = fails(function () { + // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError + var re = RE('a', 'y'); + re.lastIndex = 2; + return re.exec('abcd') != null; +}); +var BROKEN_CARET = fails(function () { + // https://bugzilla.mozilla.org/show_bug.cgi?id=773687 + var re = RE('^r', 'gy'); + re.lastIndex = 2; + return re.exec('str') != null; +}); +var regexpStickyHelpers = { + UNSUPPORTED_Y: UNSUPPORTED_Y, + BROKEN_CARET: BROKEN_CARET +}; + +var nativeExec = RegExp.prototype.exec; // This always refers to the native implementation, because the +// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, +// which loads this file before patching the method. + +var nativeReplace = String.prototype.replace; +var patchedExec = nativeExec; + +var UPDATES_LAST_INDEX_WRONG = function () { + var re1 = /a/; + var re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1.lastIndex !== 0 || re2.lastIndex !== 0; +}(); + +var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET; // nonparticipating capturing group, copied from es5-shim's String#split patch. + +var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; +var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1; + +if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + var sticky = UNSUPPORTED_Y$1 && re.sticky; + var flags = regexpFlags.call(re); + var source = re.source; + var charsAdded = 0; + var strCopy = str; + + if (sticky) { + flags = flags.replace('y', ''); + + if (flags.indexOf('g') === -1) { + flags += 'g'; + } + + strCopy = String(str).slice(re.lastIndex); // Support anchored sticky behavior. + + if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\n')) { + source = '(?: ' + source + ')'; + strCopy = ' ' + strCopy; + charsAdded++; + } // ^(? + rx + ) is needed, in combination with some str slicing, to + // simulate the 'y' flag. + + + reCopy = new RegExp('^(?:' + source + ')', flags); + } + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + source + '$(?!\\s)', flags); + } + + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; + match = nativeExec.call(sticky ? reCopy : re, strCopy); + + if (sticky) { + if (match) { + match.input = match.input.slice(charsAdded); + match[0] = match[0].slice(charsAdded); + match.index = re.lastIndex; + re.lastIndex += match[0].length; + } else re.lastIndex = 0; + } else if (UPDATES_LAST_INDEX_WRONG && match) { + re.lastIndex = re.global ? match.index + match[0].length : lastIndex; + } + + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; +} + +var regexpExec = patchedExec; + +_export({ + target: 'RegExp', + proto: true, + forced: /./.exec !== regexpExec +}, { + exec: regexpExec +}); + +var SPECIES$6 = wellKnownSymbol('species'); +var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + + re.exec = function () { + var result = []; + result.groups = { + a: '7' + }; + return result; + }; + + return ''.replace(re, '$') !== '7'; +}); // IE <= 11 replaces $0 with the whole match, as if it was $& +// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0 + +var REPLACE_KEEPS_$0 = function () { + return 'a'.replace(/./, '$0') === '$0'; +}(); + +var REPLACE = wellKnownSymbol('replace'); // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string + +var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = function () { + if (/./[REPLACE]) { + return /./[REPLACE]('a', '$0') === ''; + } + + return false; +}(); // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec +// Weex JS has frozen built-in prototypes, so use try / catch wrapper + + +var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () { + var re = /(?:)/; + var originalExec = re.exec; + + re.exec = function () { + return originalExec.apply(this, arguments); + }; + + var result = 'ab'.split(re); + return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b'; +}); + +var fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) { + var SYMBOL = wellKnownSymbol(KEY); + var DELEGATES_TO_SYMBOL = !fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + + O[SYMBOL] = function () { + return 7; + }; + + return ''[KEY](O) != 7; + }); + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + + if (KEY === 'split') { + // We can't use real regex here since it causes deoptimization + // and serious performance degradation in V8 + // https://github.com/zloirock/core-js/issues/306 + re = {}; // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + + re.constructor = {}; + + re.constructor[SPECIES$6] = function () { + return re; + }; + + re.flags = ''; + re[SYMBOL] = /./[SYMBOL]; + } + + re.exec = function () { + execCalled = true; + return null; + }; + + re[SYMBOL](''); + return !execCalled; + }); + + if (!DELEGATES_TO_SYMBOL || !DELEGATES_TO_EXEC || KEY === 'replace' && !(REPLACE_SUPPORTS_NAMED_GROUPS && REPLACE_KEEPS_$0 && !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE) || KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) { + var nativeRegExpMethod = /./[SYMBOL]; + var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { + done: true, + value: nativeRegExpMethod.call(regexp, str, arg2) + }; + } + + return { + done: true, + value: nativeMethod.call(str, regexp, arg2) + }; + } + + return { + done: false + }; + }, { + REPLACE_KEEPS_$0: REPLACE_KEEPS_$0, + REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE + }); + var stringMethod = methods[0]; + var regexMethod = methods[1]; + redefine(String.prototype, KEY, stringMethod); + redefine(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { + return regexMethod.call(string, this, arg); + } // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { + return regexMethod.call(string, this); + }); + } + + if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true); +}; + +var charAt$1 = stringMultibyte.charAt; // `AdvanceStringIndex` abstract operation +// https://tc39.github.io/ecma262/#sec-advancestringindex + +var advanceStringIndex = function (S, index, unicode) { + return index + (unicode ? charAt$1(S, index).length : 1); +}; + +// https://tc39.github.io/ecma262/#sec-regexpexec + +var regexpExecAbstract = function (R, S) { + var exec = R.exec; + + if (typeof exec === 'function') { + var result = exec.call(R, S); + + if (typeof result !== 'object') { + throw TypeError('RegExp exec method returned something other than an Object or null'); + } + + return result; + } + + if (classofRaw(R) !== 'RegExp') { + throw TypeError('RegExp#exec called on incompatible receiver'); + } + + return regexpExec.call(R, S); +}; + +fixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) { + return [// `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = requireObjectCoercible(this); + var matcher = regexp == undefined ? undefined : regexp[MATCH]; + return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative(nativeMatch, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + if (!rx.global) return regexpExecAbstract(rx, S); + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + + while ((result = regexpExecAbstract(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + n++; + } + + return n === 0 ? null : A; + }]; +}); + +// https://tc39.github.io/ecma262/#sec-dataview-constructor + +_export({ + global: true, + forced: !arrayBufferNative +}, { + DataView: arrayBuffer.DataView +}); + +/** + * @summary DEM サンプラー + * + * @desc + *

DEM バイナリーのデータをサンプルするために使用する。

+ *

インスタンスは [DemBinary#newSampler()]{@link mapray.DemBinary#newSampler} により作成する。

+ * + * @memberof mapray + * @private + * @see mapray.DemBinary + * @see mapray.DemSamplerLinear + * @see mapray.DemSamplerNearest + */ +var DemSampler = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Area} area DEM 領域 + * @param {number} ρ DEM バイナリの解像度の指数 + * @param {DataView} body DEM 配列データの標高データ部分 + */ + function DemSampler(area, ρ, body) { + _classCallCheck(this, DemSampler); + + var FLT_BYTES = 4; + var p = Math.pow(2, area.z - 1); // 2^(ze-1) + + var c = 1 << ρ; // 画素数 + + this._sx = p / Math.PI * c; + this._sy = -this._sx; + this._ox = (p - area.x) * c; + this._oy = (p - area.y) * c; + this._body = body; + this._pitch = FLT_BYTES * (c + 1); + this._max = c; + } + /** + * @summary 標高値をサンプル + * @param {number} x X 座標 (単位球メルカトル座標系) + * @param {number} y Y 座標 (単位球メルカトル座標系) + * @return {number} 標高値 (メートル) + * @abstract + */ + + + _createClass(DemSampler, [{ + key: "sample", + value: function sample(x, y) { + return 0; + } + }]); + + return DemSampler; +}(); + +/** + * @summary 線形 DEM サンプラー + * @memberof mapray + * @private + * @extends mapray.DemSampler + */ + +var DemSamplerLinear = +/*#__PURE__*/ +function (_DemSampler) { + _inherits(DemSamplerLinear, _DemSampler); + + function DemSamplerLinear(area, ρ, body) { + _classCallCheck(this, DemSamplerLinear); + + return _possibleConstructorReturn(this, _getPrototypeOf(DemSamplerLinear).call(this, area, ρ, body)); + } + /** + * @override + */ + + + _createClass(DemSamplerLinear, [{ + key: "sample", + value: function sample(x, y) { + var u = this._sx * x + this._ox; + var u0 = Math.floor(u); // 右位置 + + var u1 = u0 + 1; // 左位置 + + var v = this._sy * y + this._oy; + var v0 = Math.floor(v); // 上位置 + + var v1 = v0 + 1; // 下位置 + + var h00 = this._sampleInt(u0, v0); // 左上標高 + + + var h10 = this._sampleInt(u1, v0); // 右上標高 + + + var h01 = this._sampleInt(u0, v1); // 左下標高 + + + var h11 = this._sampleInt(u1, v1); // 右下標高 + // 標高値を補間 + + + var fu = u - u0; // 水平小数部 + + var fv = v - v0; // 垂直小数部 + + return (h00 * (1 - fu) + h10 * fu) * (1 - fv) + (h01 * (1 - fu) + h11 * fu) * fv; + } + }, { + key: "_sampleInt", + value: function _sampleInt(u, v) { + var FLT_BYTES = 4; + var cu = GeoMath.clamp(u, 0, this._max); + var cv = GeoMath.clamp(v, 0, this._max); + var offset = this._pitch * cv + FLT_BYTES * cu; + return this._body.getFloat32(offset, true); + } + }]); + + return DemSamplerLinear; +}(DemSampler); + +/** + * @summary 最近傍 DEM サンプラー + * @memberof mapray + * @private + * @extends mapray.DemSampler + */ + +var DemSamplerNearest = +/*#__PURE__*/ +function (_DemSampler) { + _inherits(DemSamplerNearest, _DemSampler); + + function DemSamplerNearest(area, ρ, body) { + _classCallCheck(this, DemSamplerNearest); + + return _possibleConstructorReturn(this, _getPrototypeOf(DemSamplerNearest).call(this, area, ρ, body)); + } + /** + * @override + */ + + + _createClass(DemSamplerNearest, [{ + key: "sample", + value: function sample(x, y) { + var FLT_BYTES = 4; + var u = Math.round(this._sx * x + this._ox); + var v = Math.round(this._sy * y + this._oy); + var offset = this._pitch * v + FLT_BYTES * u; + return this._body.getFloat32(offset, true); + } + }]); + + return DemSamplerNearest; +}(DemSampler); + +/** + * @summary 平均標高マップ + * @memberof mapray + * @private + * @see mapray.DemBinary + * @see mapray.DemBinaryCache + */ +var AvgHeightMaps = +/*#__PURE__*/ +function () { + /** + * @param {number} ρ 解像度の指数 + * @param {DataView} body DEM 配列データの標高データ部分 + */ + function AvgHeightMaps(ρ, body) { + _classCallCheck(this, AvgHeightMaps); + + this._ρ = ρ; + this._maps = []; // Level: -1, -2, ..., -ρ + + if (ρ >= 1) { + // Level: -1 + var first_map = this._create_first_map(body); + + this._maps.push(first_map); // Level: -2 .. -ρ + + + var src_map = first_map; + + for (var lv = -2; lv >= -ρ; --lv) { + var next_map = this._create_next_map(lv, src_map); + + this._maps.push(next_map); + + src_map = next_map; + } + } + } + /** + * レベル -1 の平均標高マップを生成 + * @param {DataView} src DEM 配列データの標高データ部分 + * @return {Float32Array} レベル -1 の平均標高マップ + * @private + */ + + + _createClass(AvgHeightMaps, [{ + key: "_create_first_map", + value: function _create_first_map(src) { + var FLT_BYTES = 4; + var size = 1 << this._ρ - 1; + var dst = new Float32Array(size * size); + var src_pitch = (2 * size + 1) * FLT_BYTES; + var dst_pitch = size; + + for (var j = 0; j < size; ++j) { + var src_index = 2 * j * src_pitch; + var dst_index = j * dst_pitch; + + for (var i = 0; i < size; ++i) { + // 標高データを取り出す + var h00 = src.getFloat32(src_index, true); + var h10 = src.getFloat32(src_index + FLT_BYTES, true); + var h20 = src.getFloat32(src_index + 2 * FLT_BYTES, true); + var h01 = src.getFloat32(src_index + src_pitch, true); + var h11 = src.getFloat32(src_index + src_pitch + FLT_BYTES, true); + var h21 = src.getFloat32(src_index + src_pitch + 2 * FLT_BYTES, true); + var h02 = src.getFloat32(src_index + 2 * src_pitch, true); + var h12 = src.getFloat32(src_index + 2 * src_pitch + FLT_BYTES, true); + var h22 = src.getFloat32(src_index + 2 * (src_pitch + FLT_BYTES), true); // 平均標高を書き込む + + dst[dst_index] = (h00 + 2 * h10 + h20 + 2 * h01 + 4 * h11 + 2 * h21 + h02 + 2 * h12 + h22) / 16; + src_index += 2 * FLT_BYTES; + dst_index += 1; + } + } + + return dst; + } + /** + * レベル -2 .. -ρ の平均標高マップを生成 + * @param {number} lv 生成するマップのレベル + * @param {Float32Array} src 元となる平均標高マップ (レベル lv + 1) + * @return {Float32Array} レベル lv の平均標高マップ + * @private + */ + + }, { + key: "_create_next_map", + value: function _create_next_map(lv, src) { + var size = 1 << this._ρ + lv; + var dst = new Float32Array(size * size); + var src_pitch = 2 * size; + var dst_pitch = size; + + for (var j = 0; j < size; ++j) { + var src_index = 2 * j * src_pitch; + var dst_index = j * dst_pitch; + + for (var i = 0; i < size; ++i) { + // 標高データを取り出す + var h00 = src[src_index]; + var h10 = src[src_index + 1]; + var h01 = src[src_index + src_pitch]; + var h11 = src[src_index + src_pitch + 1]; // 平均標高を書き込む + + dst[dst_index] = (h00 + h10 + h01 + h11) / 4; + src_index += 2; + dst_index += 1; + } + } + + return dst; + } + /** + * @summary 平均標高を取得 + * @desc + *

地表断片 の平均標高を取得する。

+ * @param {number} zg 地表断片分割レベル (0 <= zg < ρ) + * @param {number} xg 地表断片 X 座標 + * @param {number} yg 地表断片 Y 座標 + * @return {number} 平均標高 + */ + + }, { + key: "sample", + value: function sample(zg, xg, yg) { + var map = this._maps[this._ρ - zg - 1]; + var size = 1 << zg; + return map[yg * size + xg]; + } + }]); + + return AvgHeightMaps; +}(); + +/** + * @summary DEM バイナリーデータ + * @memberof mapray + * @private + * @see mapray.DemSampler + */ + +var DemBinary = +/*#__PURE__*/ +function () { + /** + * @param {number} z ズームレベル + * @param {number} x X タイル座標 + * @param {number} y Y タイル座標 + * @param {number} ρ 解像度の指数 + * @param {ArrayBuffer} array DEM 配列データ + */ + function DemBinary(z, x, y, ρ, array) { + _classCallCheck(this, DemBinary); + + this._z = z; + this._x = x; + this._y = y; + this._ρ = ρ; // ヘッダー情報を取得 + + var header = new DataView(array); + this._qlevels = [header.getUint8(DemBinary.OFFSET_QLEVEL_00), // 四分存在レベル (左上) + header.getUint8(DemBinary.OFFSET_QLEVEL_10), // 四分存在レベル (右上) + header.getUint8(DemBinary.OFFSET_QLEVEL_01), // 四分存在レベル (左下) + header.getUint8(DemBinary.OFFSET_QLEVEL_11) // 四分存在レベル (右下) + ]; + this._hmin = header.getFloat32(DemBinary.OFFSET_HMIN, true); // 最小標高 + + this._hmax = header.getFloat32(DemBinary.OFFSET_HMAX, true); // 最大標高 + + this._ω = this._createωArray(header); // 複雑度 + // 標高配列への参照を取得 + + this._body = new DataView(array, DemBinary.HEADER_BYTES); // 標高配列の 1 行の標高数 + + this._size = (1 << ρ) + 1; + } + /** + * @summary ズームレベル + * @type {number} + * @readonly + */ + + + _createClass(DemBinary, [{ + key: "isLeaf", + + /** + * @summary 地表断片に対して葉タイルか? + * @desc + *

地表断片 [zg, xg, yg] に対して、this はサーバー内で最も詳細な DEM データであるかどうかを返す。

+ *

制約: [zg, xg, yg] の領域は this と同じまたは包含されていること。

+ * @param {number} zg 分割レベル + * @param {number} xg X 座標 + * @param {number} yg Y 座標 + * @return {boolean} 葉タイルのとき true, それ以外は false + */ + value: function isLeaf(zg, xg, yg) { + if (zg > this._z) { + return this.getQuadLevel(zg, xg, yg) == 0; + } else { + var q = this._qlevels; + return q[0] == 0 || q[1] == 0 || q[2] == 0 || q[3] == 0; + } + } + /** + * @summary 四分存在レベルを取得 + * @desc + *

制約: zg > this.z かつ [zg, xg, yg] の領域は this に包含されていること。

+ * @param {number} zg 分割レベル + * @param {number} xg X 座標 + * @param {number} yg Y 座標 + * @return {number} 四分存在レベル + */ + + }, { + key: "getQuadLevel", + value: function getQuadLevel(zg, xg, yg) { + var pow = Math.pow(2, this._z - zg); + var u = Math.floor(2 * ((xg + 0.5) * pow - this._x)); + var v = Math.floor(2 * ((yg + 0.5) * pow - this._y)); + return this._qlevels[2 * v + u]; + } + /** + * @summary 四分存在レベルを取得 + * @desc + *

基底タイル座標 (左上(0, 0)、右下(1, 1)) [xt, yt] を含む領域の四分存在レベルを取得する。

+ *

制約: [xt, yt] の領域は this に包含されていること。

+ * @param {number} xt X 座標 + * @param {number} yt Y 座標 + * @return {number} 四分存在レベル + */ + + }, { + key: "getQuadLevelDirect", + value: function getQuadLevelDirect(xt, yt) { + var pow = Math.round(Math.pow(2, this._z + 1)); + var u = GeoMath.clamp(Math.floor(xt * pow), 0, pow - 1) % 2; + var v = GeoMath.clamp(Math.floor(yt * pow), 0, pow - 1) % 2; + return this._qlevels[2 * v + u]; + } + /** + * @summary 標高点正方形の4隅の標高を取得 + * @desc + *

注意: 次の呼び出しで、結果配列は上書きされる。

+ * @param {number} u 水平方向の標高点正方形位置 + * @param {number} v 垂直方向の標高点正方形位置 + * @return {array} 4隅の標高の配列 [左上, 右上, 左下, 右下] + */ + + }, { + key: "getHeights", + value: function getHeights(u, v) { + var FLT_BYTES = 4; + var origin = FLT_BYTES * (v * this._size + u); + var pitch = FLT_BYTES * this._size; + var h = DemBinary._getHeights_result; + h[0] = this._body.getFloat32(origin, true); + h[1] = this._body.getFloat32(origin + FLT_BYTES, true); + h[2] = this._body.getFloat32(origin + pitch, true); + h[3] = this._body.getFloat32(origin + pitch + FLT_BYTES, true); + return h; + } + /** + * @summary 地表断片の分割指数を取得 + * @desc + *

注意: 次の呼び出しで、結果配列は上書きされる。

+ * + * @param {mapray.Area} flake_area 地表断片の領域 + * @param {number} lod 地表詳細レベル (LOD) + * @param {number} cu 水平球面分割レベル + * @param {number} cv 垂直球面分割レベル + * + * @return {array} [水平分割指数, 垂直分割指数] + */ + + }, { + key: "getDivisionPowers", + value: function getDivisionPowers(flake_area, lod, cu, cv) { + var zg = flake_area.z; + var ze = this._z; + var b = GeoMath.LOG2PI - this._ρ + 1; // b = log2π - ρ + 1 + + var ω = this._getComplexity(zg, flake_area.x, flake_area.y); // {gu, gv} = max( {cu, cv}, min( ze + ρ, round( lod + b + ω ) ) − zg ) + + + var arg = Math.min(ze + this._ρ, Math.round(lod + b + ω)) - zg; + var result = DemBinary._getDivisionPowers_result; + result[0] = Math.max(cu, arg); // 水平分割指数 + + result[1] = Math.max(cv, arg); // 垂直分割指数 + + return result; + } + /** + * @summary DEM サンプラーを生成 + * + * @param {mapray.Area} flake_area 地表断片の領域 + * + * @return {mapray.DemSampler} DEM サンプラー + */ + + }, { + key: "newSampler", + value: function newSampler(flake_area) { + // 今のところ、地表断片が 1 標高点またはそれ以上のとき、最近傍サンプラーでも結果が + // 変わらないので、最適化のためにサンプラーを別けている + var samplerClass = flake_area.z - this._z > this._ρ ? DemSamplerLinear : DemSamplerNearest; + return new samplerClass(this, this._ρ, this._body); + } + /** + * @summary 線形 DEM サンプラーを生成 + * + * @return {mapray.DemSamplerLinear} DEM サンプラー + */ + + }, { + key: "newLinearSampler", + value: function newLinearSampler() { + return new DemSamplerLinear(this, this._ρ, this._body); + } + /** + * @summary 平均標高マップを生成 + * @return {mapray.AvgHeightMaps} 平均標高マップ + */ + + }, { + key: "newAvgHeightMaps", + value: function newAvgHeightMaps() { + return new AvgHeightMaps(this._ρ, this._body); + } + /** + * @private + */ + + }, { + key: "_create\u03C9Array", + value: function _createArray(header) { + var FLT_BYTES = 4; + var ωs = []; + var offset = 0; + + for (var down = 0; down < 3; ++down) { + var count = 1 << 2 * down; + var array = new Float32Array(count); + + for (var i = 0; i < count; ++i) { + array[i] = header.getFloat32(DemBinary.OFFSET_ω + offset, true); + offset += FLT_BYTES; + } + + ωs.push(array); + } + + return ωs; + } + /** + * @summary 複雑度を取得 + * @desc + *

this 上の地表断片 (zg, xg, yg) の複雑度 (ω) を取得する。

+ * @param {number} zg 分割レベル + * @param {number} xg X 座標 + * @param {number} yg Y 座標 + * @return {number} 複雑度 + * @private + */ + + }, { + key: "_getComplexity", + value: function _getComplexity(zg, xg, yg) { + var d = zg - this._z; + var p = Math.round(Math.pow(2, d)); + var dmax = 2; // this._ω.length - 1 + + var smax = 4; // 2^c + + var u; + var v; + + if (d <= dmax) { + u = xg - p * this._x; + v = yg - p * this._y; + } else { + u = Math.floor(smax * ((xg + 0.5) / p - this._x)); + v = Math.floor(smax * ((yg + 0.5) / p - this._y)); + } + + var index = Math.min(d, dmax); + var array = this._ω[index]; + return Math.min(array[v * (1 << index) + u], DemBinary.ω_limit); + } + }, { + key: "z", + get: function get() { + return this._z; + } + /** + * @summary X タイル座標 + * @type {number} + * @readonly + */ + + }, { + key: "x", + get: function get() { + return this._x; + } + /** + * @summary Y タイル座標 + * @type {number} + * @readonly + */ + + }, { + key: "y", + get: function get() { + return this._y; + } + /** + * @summary 最小標高 + * @desc + *

このタイルに対応する地表の領域で最も低い点の標高を返す。

+ *

この値は this の葉タイルのデータに基づいているので、this の個々のサンプル値の最小値よりも小さい値の可能性があることに注意されたい。

+ * @type {number} + * @readonly + */ + + }, { + key: "height_min", + get: function get() { + return this._hmin; + } + /** + * @summary 最大標高 + *

このタイルに対応する地表の領域で最も高い点の標高を返す。

+ *

この値は this の葉タイルのデータに基づいているので、this の個々のサンプル値の最大値よりも大きい値の可能性があることに注意されたい。

+ * @type {number} + * @readonly + */ + + }, { + key: "height_max", + get: function get() { + return this._hmax; + } + }]); + + return DemBinary; +}(); + +DemBinary.OFFSET_QLEVEL_00 = 0; +DemBinary.OFFSET_QLEVEL_10 = 1; +DemBinary.OFFSET_QLEVEL_01 = 2; +DemBinary.OFFSET_QLEVEL_11 = 3; +DemBinary.OFFSET_HMIN = 4; +DemBinary.OFFSET_HMAX = 8; +DemBinary.OFFSET_ω = 12; +DemBinary.HEADER_BYTES = 96; +DemBinary.ω_limit = 6; +DemBinary._getHeights_result = new Array(4); +DemBinary._getDivisionPowers_result = new Array(2); + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Int16', function (init) { + return function Int16Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Int32', function (init) { + return function Int32Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +/** + * @summary 地表領域ユーティリティー + * + * @hideconstructor + * @memberof mapray + * @private + */ + +var AreaUtil = +/*#__PURE__*/ +function () { + function AreaUtil() { + _classCallCheck(this, AreaUtil); + } + + _createClass(AreaUtil, null, [{ + key: "getCenter", + + /** + * @summary 地表領域の中心位置を GOCS で取得 + * + * @desc + *

領域 area の中心位置 (GOCS) を dst に格納する。

+ * + * @param {mapray.Area} area 地表領域 + * @param {mapray.Vector3} dst 結果を格納するオブジェクト (GOCS) + * + * @return {mapray.Vector3} dst + */ + value: function getCenter(area, dst) { + switch (area.z) { + case 0: + return getCenter_0(dst); + + case 1: + return getCenter_1(area.x, area.y, dst); + + default: + return getCenter_N(area.z, area.x, area.y, dst); + } + } + }]); + + return AreaUtil; +}(); +/** + * @summary 地表の ZXY 領域を表現 + * + * @desc + *

このクラスは便宜的なものであり実在しない。

+ *

z, x, y プロパティから地表の領域を表す ZXY 座標を読み出せるオブジェクトは、このクラスのインスタンスと解釈する。

+ * + * @class mapray.Area + * @private + * + * @see mapray.AreaUtil + */ +// AreaUtil.getCenter() の一部 + + +function getCenter_0(dst) { + dst[0] = 0; + dst[1] = 0; + dst[2] = 0; + return dst; +} // AreaUtil.getCenter() の一部 + + +function getCenter_1(x, y, dst) { + var r = GeoMath.EARTH_RADIUS; + dst[0] = 0; + dst[1] = r * (x - 0.5); + dst[2] = r * (0.5 - y); + return dst; +} // AreaUtil.getCenter() の一部 + + +function getCenter_N(z, x, y, dst) { + var pi = Math.PI; // 座標範囲 (単位球メルカトル座標系) + + var msize = Math.pow(2, 1 - z) * pi; + var mx_min = -pi + x * msize; + var mx_max = -pi + (x + 1) * msize; + var my_min = pi - (y + 1) * msize; + var my_max = pi - y * msize; // 事前計算変数 + + var λmin = mx_min; + var λmax = mx_max; + var emin = Math.exp(my_min); // Exp[my_min] + + var emax = Math.exp(my_max); // Exp[my_max] + + var e2min = emin * emin; // Exp[my_min]^2 + + var e2max = emax * emax; // Exp[my_max]^2 + // 座標範囲 (地心直交座標系) + // + // z >= 2 のとき、λとφの範囲は以下の区間のどれかに入る + // φ: (-π/2, 0] [0, π/2) + // λ: [-π, -π/2] [-π/2, 0] [0, π/2] [π/2, π] + // + // 区間ごとの関数の変化 (各区間で単調増加または単調減少) + // Sin[φ]: (-1 → 0] [0 → 1) + // Cos[φ]: ( 0 → 1] [1 → 0) + // Sin[λ]: [ 0 → -1] [-1 → 0] [0 → 1] [1 → 0] + // Cos[λ]: [-1 → 0] [ 0 → 1] [1 → 0] [0 → -1] + + var rh = GeoMath.EARTH_RADIUS / 2; + var cosφmin = 2 * emin / (e2min + 1); + var cosφmax = 2 * emax / (e2max + 1); // gx = r Cos[φ] Cos[λ] + // gy = r Cos[φ] Sin[λ] + + if (my_min + my_max < 0) { + // φ : (-π/2, 0] + // Cos[φ]: ( 0 → 1] + if (λmin + λmax < -pi) { + // λ : [-π, -π/2] + // Cos[λ]: [-1 → 0] + // Sin[λ]: [ 0 → -1] + dst[0] = rh * (cosφmax * Math.cos(λmin) + cosφmin * Math.cos(λmax)); + dst[1] = rh * (cosφmax * Math.sin(λmax) + cosφmin * Math.sin(λmin)); + } else if (λmin + λmax < 0) { + // λ : [-π/2, 0] + // Cos[λ]: [ 0 → 1] + // Sin[λ]: [-1 → 0] + dst[0] = rh * (cosφmin * Math.cos(λmin) + cosφmax * Math.cos(λmax)); + dst[1] = rh * (cosφmax * Math.sin(λmin) + cosφmin * Math.sin(λmax)); + } else if (λmin + λmax < pi) { + // λ : [0, π/2] + // Cos[λ]: [1 → 0] + // Sin[λ]: [0 → 1] + dst[0] = rh * (cosφmin * Math.cos(λmax) + cosφmax * Math.cos(λmin)); + dst[1] = rh * (cosφmin * Math.sin(λmin) + cosφmax * Math.sin(λmax)); + } else { + // λ : [π/2, π] + // Cos[λ]: [0 → -1] + // Sin[λ]: [1 → 0] + dst[0] = rh * (cosφmax * Math.cos(λmax) + cosφmin * Math.cos(λmin)); + dst[1] = rh * (cosφmin * Math.sin(λmax) + cosφmax * Math.sin(λmin)); + } + } else { + // φ : [0, π/2) + // Cos[φ]: [1 → 0) + if (λmin + λmax < -pi) { + // λ : [-π, -π/2] + // Cos[λ]: [-1 → 0] + // Sin[λ]: [ 0 → -1] + dst[0] = rh * (cosφmin * Math.cos(λmin) + cosφmax * Math.cos(λmax)); + dst[1] = rh * (cosφmin * Math.sin(λmax) + cosφmax * Math.sin(λmin)); + } else if (λmin + λmax < 0) { + // λ : [-π/2, 0] + // Cos[λ]: [ 0 → 1] + // Sin[λ]: [-1 → 0] + dst[0] = rh * (cosφmax * Math.cos(λmin) + cosφmin * Math.cos(λmax)); + dst[1] = rh * (cosφmin * Math.sin(λmin) + cosφmax * Math.sin(λmax)); + } else if (λmin + λmax < pi) { + // λ : [0, π/2] + // Cos[λ]: [1 → 0] + // Sin[λ]: [0 → 1] + dst[0] = rh * (cosφmax * Math.cos(λmax) + cosφmin * Math.cos(λmin)); + dst[1] = rh * (cosφmax * Math.sin(λmin) + cosφmin * Math.sin(λmax)); + } else { + // λ : [π/2, π] + // Cos[λ]: [0 → -1] + // Sin[λ]: [1 → 0] + dst[0] = rh * (cosφmin * Math.cos(λmax) + cosφmax * Math.cos(λmin)); + dst[1] = rh * (cosφmax * Math.sin(λmax) + cosφmin * Math.sin(λmin)); + } + } // rh * (Sin[φmin] + Sin[φmax]) + + + dst[2] = rh * 2 * (e2max / (e2max + 1) - 1 / (e2min + 1)); + return dst; +} + +/** + * @summary 地表断片メッシュ + * @memberof mapray + * @private + */ + +var FlakeMesh = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {mapray.Area} area 地表断片の領域 + * @param {number[]} dpows 地表断片の分割指数 + * @param {mapray.DemBinary} dem DEM バイナリ + */ + function FlakeMesh(glenv, area, dpows, dem) { + _classCallCheck(this, FlakeMesh); + + var gl = glenv.context; // オブジェクト座標系の中心位置 (GOCS) + + this._center = this._createCenter(area); // 頂点バッファ + + this._vertices = null; // 頂点数 + + this._num_vertices = 0; // 頂点属性辞書 + + this._vertex_attribs = {}; // XY グリッドサイズ + + this._num_quads_x = 0; + this._num_quads_y = 0; // 頂点データを生成 + + this._createVertices(gl, area, dpows, dem); // 頂点属性辞書を設定 + + + this._setupVertexAttribs(gl); // インデックス型 + + + this._index_type = this._num_vertices < 65536 ? gl.UNSIGNED_SHORT : gl.UNSIGNED_INT; // インデックス (GL_TRIANGLES) + + this._indices = null; + this._num_indices = 0; // インデックス (GL_LINES) + + this._wire_indices = null; + this._num_wire_indices = 0; + this._gl = gl; + } + /** + * @summary 中心位置を生成 + * + * @param {mapray.Area} area 地表断片の領域 + * + * @return {mapray.Vector3} 中心位置 (GOCS) + * + * @private + */ + + + _createClass(FlakeMesh, [{ + key: "_createCenter", + value: function _createCenter(area) { + return AreaUtil.getCenter(area, GeoMath.createVector3()); + } + }, { + key: "_createVertices", + value: function _createVertices(gl, area, dpows, dem) { + var target = gl.ARRAY_BUFFER; + var vbo = gl.createBuffer(); + + var data = this._createVerticesData(area, dpows, dem); + + gl.bindBuffer(target, vbo); + gl.bufferData(target, data.array, gl.STATIC_DRAW); + gl.bindBuffer(target, null); + this._vertices = vbo; + this._num_vertices = data.num_vertices; + this._num_quads_x = data.num_quads_x; + this._num_quads_y = data.num_quads_y; + } + }, { + key: "_createVerticesData", + value: function _createVerticesData(area, dpows, dem) { + // 開始位置 (単位球メルカトル座標系) + var msize = Math.pow(2, 1 - area.z) * Math.PI; + var mx_min = area.x * msize - Math.PI; + var my_min = Math.PI - (area.y + 1) * msize; // 分割数 + + var u_count = 1 << dpows[0]; + var v_count = 1 << dpows[1]; // 刻み幅 + + var u_step = 1 / u_count; + var v_step = 1 / v_count; + var mx_step = msize / u_count; + var my_step = msize / v_count; + var center = this._center; + var demSampler = dem.newSampler(area); + var num_vertices = (u_count + 1) * (v_count + 1); + var array = new Float32Array(FlakeMesh.VERTEX_SIZE * num_vertices); + var index = 0; + + for (var iv = 0, my = my_min; iv < v_count + 1; ++iv, my += my_step) { + var ey = Math.exp(my); + var ey2 = ey * ey; + var sinφ = (ey2 - 1) / (ey2 + 1); + var cosφ = 2 * ey / (ey2 + 1); + + for (var iu = 0, mx = mx_min; iu < u_count + 1; ++iu, mx += mx_step) { + var sinλ = Math.sin(mx); + var cosλ = Math.cos(mx); + var height = demSampler.sample(mx, my); + var radius = GeoMath.EARTH_RADIUS + height; // 法線 (GOCS) + + var nx = cosφ * cosλ; + var ny = cosφ * sinλ; + var nz = sinφ; // 位置 (GOCS) + + var gx = radius * nx; + var gy = radius * ny; + var gz = radius * nz; + array[index++] = gx - center[0]; // x + + array[index++] = gy - center[1]; // y + + array[index++] = gz - center[2]; // z + + array[index++] = nx; // nx + + array[index++] = ny; // ny + + array[index++] = nz; // nz + + array[index++] = iu * u_step; // mu + + array[index++] = iv * v_step; // mv + } + } + + return { + array: array, + num_vertices: num_vertices, + num_quads_x: u_count, + num_quads_y: v_count + }; + } + /** + * @summary 頂点属性の辞書を設定 + * @desc + *

this._vertex_attribs に Mesh.AttribData の辞書を設定する。

+ * + * @param {WebGLRenderingContext} gl + * @private + */ + + }, { + key: "_setupVertexAttribs", + value: function _setupVertexAttribs(gl) { + var type = gl.FLOAT; + var stride = FlakeMesh.VERTEX_BYTES; // Mesh.AttribData の辞書 + + this._vertex_attribs = { + "a_position": { + buffer: this._vertices, + num_components: 3, + component_type: type, + normalized: false, + byte_stride: stride, + byte_offset: FlakeMesh.OFFSET_P + }, + "a_normal": { + buffer: this._vertices, + num_components: 3, + component_type: type, + normalized: false, + byte_stride: stride, + byte_offset: FlakeMesh.OFFSET_N + }, + "a_uv": { + buffer: this._vertices, + num_components: 2, + component_type: type, + normalized: false, + byte_stride: stride, + byte_offset: FlakeMesh.OFFSET_UV + } + }; + } + }, { + key: "_createIndices", + value: function _createIndices() { + var gl = this._gl; + var num_quads = this._num_quads_x * this._num_quads_y; + var num_indices = 6 * num_quads; + var typedArray = this._index_type === gl.UNSIGNED_INT ? Int32Array : Int16Array; + var array = new typedArray(num_indices); + var index = 0; + + for (var y = 0; y < this._num_quads_y; ++y) { + for (var x = 0; x < this._num_quads_x; ++x) { + var i00 = (this._num_quads_x + 1) * y + x; // 左下頂点 + + var i10 = i00 + 1; // 右下頂点 + + var i01 = i00 + this._num_quads_x + 1; // 左上頂点 + + var i11 = i01 + 1; // 右上頂点 + // 左下三角形 + + array[index++] = i00; + array[index++] = i10; + array[index++] = i01; // 右上三角形 + + array[index++] = i01; + array[index++] = i10; + array[index++] = i11; + } + } + + var target = gl.ELEMENT_ARRAY_BUFFER; + var vbo = gl.createBuffer(); + gl.bindBuffer(target, vbo); + gl.bufferData(target, array, gl.STATIC_DRAW); + gl.bindBuffer(target, null); + this._indices = vbo; + this._num_indices = num_indices; + } + }, { + key: "_createWireIndices", + value: function _createWireIndices() { + var gl = this._gl; + var typedArray = this._index_type === gl.UNSIGNED_INT ? Int32Array : Int16Array; + var num_indices = 2 * (2 * this._num_quads_x * this._num_quads_y + this._num_quads_x + this._num_quads_y); + var array = new typedArray(num_indices); + var index = 0; // 水平線 + + for (var y = 0; y < this._num_quads_y + 1; ++y) { + for (var x = 0; x < this._num_quads_x; ++x) { + var i00 = (this._num_quads_x + 1) * y + x; // 左下頂点 + + var i10 = i00 + 1; // 右下頂点 + // 下水平線 + + array[index++] = i00; + array[index++] = i10; + } + } // 垂直線 + + + for (x = 0; x < this._num_quads_x + 1; ++x) { + for (y = 0; y < this._num_quads_y; ++y) { + var j00 = (this._num_quads_x + 1) * y + x; // 左下頂点 + + var j01 = j00 + this._num_quads_x + 1; // 左上頂点 + // 左垂直線 + + array[index++] = j00; + array[index++] = j01; + } + } + + var target = gl.ELEMENT_ARRAY_BUFFER; + var vbo = gl.createBuffer(); + gl.bindBuffer(target, vbo); + gl.bufferData(target, array, gl.STATIC_DRAW); + gl.bindBuffer(target, null); + this._wire_indices = vbo; + this._num_wire_indices = num_indices; + } + /** + * @summary 頂点数 + * @type {number} + * @readonly + */ + + }, { + key: "dispose", + + /** + * @summary リソースを破棄 + */ + value: function dispose() { + var gl = this._gl; + this._vertex_attribs = {}; + gl.deleteBuffer(this._vertices); + this._vertices = null; + + if (this._indices) { + gl.deleteBuffer(this._indices); + this._indices = null; + } + + if (this._wire_indices) { + gl.deleteBuffer(this._wire_indices); + this._wire_indices = null; + } + } + /** + * @summary 変換行列を計算 + * @desc + * mat に地表断片座標系から GOCS への変換行列を掛ける。 + * @param {mapray.Matrix} mat 行列 + * @param {mapray.Matrix} dst 結果 + * @return {mapray.Matrix} dst + */ + + }, { + key: "mul_flake_to_gocs", + value: function mul_flake_to_gocs(mat, dst) { + var m00 = mat[0], + m01 = mat[4], + m02 = mat[8], + m03 = mat[12], + m10 = mat[1], + m11 = mat[5], + m12 = mat[9], + m13 = mat[13], + m20 = mat[2], + m21 = mat[6], + m22 = mat[10], + m23 = mat[14], + m30 = mat[3], + m31 = mat[7], + m32 = mat[11], + m33 = mat[15]; + var t03 = this._center[0], + t13 = this._center[1], + t23 = this._center[2]; + dst[0] = m00; + dst[1] = m10; + dst[2] = m20; + dst[3] = m30; + dst[4] = m01; + dst[5] = m11; + dst[6] = m21; + dst[7] = m31; + dst[8] = m02; + dst[9] = m12; + dst[10] = m22; + dst[11] = m32; + dst[12] = m00 * t03 + m01 * t13 + m02 * t23 + m03; + dst[13] = m10 * t03 + m11 * t13 + m12 * t23 + m13; + dst[14] = m20 * t03 + m21 * t13 + m22 * t23 + m23; + dst[15] = m30 * t03 + m31 * t13 + m32 * t23 + m33; + return dst; + } + /** + * @summary メッシュを描画 + * @desc + *

事前に material.bindProgram() すること。

+ * @param {mapray.RenderStage.FlakeMaterial} material マテリアル + */ + + }, { + key: "draw", + value: function draw(material) { + var gl = this._gl; + var isWire = material.isWireframe(); // 頂点属性のバインド + + material.bindVertexAttribs(this._vertex_attribs); // インデックスのバインド + + var indices = isWire ? this.wire_indices : this.indices; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indices); // 描画処理 + + var mode = isWire ? gl.LINES : gl.TRIANGLES; + var num_indices = isWire ? this.num_wire_indices : this.num_indices; + gl.drawElements(mode, num_indices, this._index_type, 0); + } + }, { + key: "num_vertices", + get: function get() { + return this._num_vertices; + } + /** + * @summary インデックス (GL_TRIANGLES) + * @type {WebGLBuffer} + * @readonly + */ + + }, { + key: "indices", + get: function get() { + if (this._indices === null) { + this._createIndices(); + } + + return this._indices; + } + /** + * @summary インデックス数 (GL_TRIANGLES) + * @type {number} + * @readonly + */ + + }, { + key: "num_indices", + get: function get() { + if (this._indices === null) { + this._createIndices(); + } + + return this._num_indices; + } + /** + * @summary インデックス (GL_LINES) + * @type {WebGLBuffer} + * @readonly + */ + + }, { + key: "wire_indices", + get: function get() { + if (this._wire_indices === null) { + this._createWireIndices(); + } + + return this._wire_indices; + } + /** + * @summary インデックス数 (GL_LINES) + * @type {number} + * @readonly + */ + + }, { + key: "num_wire_indices", + get: function get() { + if (this._wire_indices === null) { + this._createWireIndices(); + } + + return this._num_wire_indices; + } + }]); + + return FlakeMesh; +}(); // クラス定数の定義 + + +{ + FlakeMesh.VERTEX_SIZE = 8; // 1頂点の float 数 + + /** + * @summary 1頂点のバイト数 + * @member mapray.FlakeMesh.VERTEX_BYTES + * @type {number} + * @static + * @constant + */ + + FlakeMesh.VERTEX_BYTES = 4 * FlakeMesh.VERTEX_SIZE; + /** + * @summary 位置座標のオフセット + * @member mapray.FlakeMesh.OFFSET_P + * @type {number} + * @static + * @constant + */ + + FlakeMesh.OFFSET_P = 0; + /** + * @summary 法線座標のオフセット + * @member mapray.FlakeMesh.OFFSET_N + * @type {number} + * @static + * @constant + */ + + FlakeMesh.OFFSET_N = 12; + /** + * @summary UV 座標のオフセット + * @member mapray.FlakeMesh.OFFSET_UV + * @type {number} + * @static + * @constant + */ + + FlakeMesh.OFFSET_UV = 24; +} + +/** + * @summary 描画プリミティブ + * @memberof mapray + * @private + * @see mapray.PropSet + * @see mapray.Entity#getPrimitives + */ + +var Primitive = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {mapray.Mesh} mesh メッシュ + * @param {mapray.EntityMaterial} material マテリアル + * @param {mapray.Matrix} transform 変換行列 + */ + function Primitive(glenv, mesh, material, transform) { + _classCallCheck(this, Primitive); + + this._glenv = glenv; + /** + * @summary 描画されるメッシュ + * @desc + *

構築子の mesh 引数が設定されている。

+ * @member mapray.Primitive#mesh + * @type {mapray.Mesh} + */ + + this.mesh = mesh; + /** + * @summary 描画に使用するマテリアル + * @desc + *

構築子の material 引数が設定されている。

+ * @member mapray.Primitive#material + * @type {mapray.EntityMaterial} + */ + + this.material = material; + /** + * @summary モデル座標系から GOCS への変換行列 + * @desc + *

構築子の transform 引数が設定されている。

+ * @member mapray.Primitive#transform + * @type {mapray.Matrix} + */ + + this.transform = transform; + /** + * @summary 中心点 (モデル座標系) + * @desc + *

null のときは零ベクトルと見なす。

+ * @member mapray.Primitive#pivot + * @type {?mapray.Vector3} + * @default null + */ + + this.pivot = null; + /** + * @summary 境界箱 (モデル座標系) + * @desc + *

bbox[0] は座標の最小値、bbox[1] は座標の最大値とする。

+ *

null のときは無限大の境界箱と見なす。

+ * @member mapray.Primitive#bbox + * @type {?Array.} + * @default null + */ + + this.bbox = null; + /** + * @summary プロパティ集合 + * @desc + *

null のときは空集合と見なす。

+ * @member mapray.Primitive#properties + * @type {?mapray.PropSet} + * @default null + */ + + this.properties = null; + /** + * @summary ソート深度 + * @member mapray.Primitive#sort_z + * @type {number} + * @readonly + * @package + */ + + this.sort_z = undefined; + } + /** + * @summary インスタンスの複製を返す + * + * @desc + *

公開プロパティが this と同じインスタンスを生成して返す。

+ *

ただしプロパティ mesh, material, properties は参照コピーで、それ以外は深いコピーとなる。

+ * + * @return {mapray.Primitive} インスタンスの複製 + */ + + + _createClass(Primitive, [{ + key: "fastClone", + value: function fastClone() { + var clone = new Primitive(this._glenv, this.mesh, this.material, GeoMath.createMatrix(this.transform)); + + if (this.pivot) { + clone.pivot = GeoMath.createVector3(this.pivot); + } + + if (this.bbox) { + clone.bbox = this.bbox.map(function (v) { + return GeoMath.createVector3(v); + }); + } + + clone.properties = this.properties; + return clone; + } + /** + * @summary プリミティブが見えるか? + * @desc + *

true を返したときはソート深度 this.sort_z が設定される。

+ * @param {mapray.RenderStage} stage レンダリングステージ + * @return {boolean} プリミティブの一部が視体積に含まれるとき true, それ以外のとき false + * @package + */ + + }, { + key: "isVisible", + value: function isVisible(stage) { + // obj_to_view = stage._gocs_to_view * this.transform + var matrix = Primitive._obj_to_view; + GeoMath.mul_AA(stage._gocs_to_view, this.transform, matrix); + var bbox = this.bbox; + + if (bbox) { + // 境界箱の頂点座標を変換 (視点空間) -> bbox_points + Primitive._transformBBox(bbox, matrix); // 視体積平面と比較 + + + var planes = stage._volume_planes; + + for (var i = 0; i < planes.length; ++i) { + if (Primitive._isBBoxBackSide(planes[i])) { + // 完全に視体積に含まれない + return false; + } + } + } // ソート深度を設定 + + + var pivot = this.pivot; + + if (pivot) { + this.sort_z = matrix[2] * pivot[0] + matrix[6] * pivot[1] + matrix[10] * pivot[2] + matrix[14]; + } else { + this.sort_z = matrix[14]; + } + + return true; + } + /** + * @summary 背景との混合が必要か? + * @param {mapray.RenderStage} stage レンダリングステージ + * @return {boolean} 背景との混合が必要なとき true, それ以外のとき false + * @package + */ + + }, { + key: "isTranslucent", + value: function isTranslucent(stage) { + return this.material.isTranslucent(stage, this); + } + /** + * @summary プリミティブを描画 + * @param {mapray.RenderStage} stage レンダリングステージ + */ + + }, { + key: "draw", + value: function draw(stage) { + var material = this.material; + material.bindProgram(); + material.setParameters(stage, this); + this.mesh.draw(material); + } + /** + * 境界箱の頂点座標を変換 (視点空間) -> bbox_points + * @private + */ + + }], [{ + key: "_transformBBox", + value: function _transformBBox(bbox, matrix) { + for (var iz = 0; iz < 2; ++iz) { + var zm = bbox[iz][2]; + + for (var iy = 0; iy < 2; ++iy) { + var ym = bbox[iy][1]; + + for (var ix = 0; ix < 2; ++ix) { + var xm = bbox[ix][0]; + var bbox_point = Primitive._bbox_points[ix + 2 * iy + 4 * iz]; + bbox_point[0] = matrix[0] * xm + matrix[4] * ym + matrix[8] * zm + matrix[12]; + bbox_point[1] = matrix[1] * xm + matrix[5] * ym + matrix[9] * zm + matrix[13]; + bbox_point[2] = matrix[2] * xm + matrix[6] * ym + matrix[10] * zm + matrix[14]; + } + } + } + } + /** + * bbox_points はすべて plane の裏側か? + * @private + */ + + }, { + key: "_isBBoxBackSide", + value: function _isBBoxBackSide(plane) { + var bbox_points = Primitive._bbox_points; + + for (var i = 0; i < bbox_points.length; ++i) { + var point = bbox_points[i]; + var dist = point[0] * plane[0] + point[1] * plane[1] + point[2] * plane[2] + plane[3]; + + if (dist >= 0) { + // 表側に頂点が存在 + return false; + } + } + + return true; // すべての頂点が裏側 + } + }]); + + return Primitive; +}(); // クラス定数の定義 + + +{ + // 一時領域 + Primitive._obj_to_view = GeoMath.createMatrix(); // モデル空間から視点空間への変換行列 + + Primitive._bbox_points = []; // 境界箱の頂点座標 (視点空間) + + for (var i = 0; i < 8; ++i) { + Primitive._bbox_points.push(GeoMath.createVector3()); + } +} + +/** + * @summary 地表断片レンダリングためのオブジェクト + * + * @memberof mapray + * @private + */ + +var FlakeRenderObject = +/*#__PURE__*/ +function () { + /** + * @param {mapary.Area} area 地表断片の領域 + * @param {mapary.GLEnv} glenv WebGL 環境 + * @param {mapray.FlakeMesh} base_mesh 地表断片の基本メッシュ + */ + function FlakeRenderObject(area, glenv, base_mesh) { + _classCallCheck(this, FlakeRenderObject); + + /** + * @summary 地表分割レベル + * @member mapray.FlakeRenderObject#z + * @type {number} + */ + this.z = area.z; + /** + * @summary 地表タイル X 座標 + * @member mapray.FlakeRenderObject#x + * @type {number} + */ + + this.x = area.x; + /** + * @summary 地表タイル Y 座標 + * @member mapray.FlakeRenderObject#y + * @type {number} + */ + + this.y = area.y; + this._glenv = glenv; + this._base_mesh = base_mesh; + this._edata_list = []; // { mesh: Mesh, producer: FlakePrimitiveProducer } + + this._transform = null; + } + /** + * @summary エンティティ・データを追加 + * + * @param {mapray.Mesh} mesh + * @param {mapray.Entity.FlakePrimitiveProducer} producer + */ + + + _createClass(FlakeRenderObject, [{ + key: "addEntityData", + value: function addEntityData(mesh, producer) { + var edata = { + mesh: mesh, + producer: producer + }; + + this._edata_list.push(edata); + } + /** + * @summary 地表断片上のエンティティ数 + * + * @type {number} + * @readonly + */ + + }, { + key: "getBaseMesh", + + /** + * @summary 地表断片の基本メッシュを取得 + * + * @return {mapray.FlakeMesh} + */ + value: function getBaseMesh() { + return this._base_mesh; + } + /** + * @summary エンティティのプリミティブを取得 + * + * @param {number} index エンティティのインデックス + * @param {mapray.RenderStage} stage レンダリングステージ + * + * @return {mapray.FlakeRenderObject.EntityPrimitivePair} + */ + + }, { + key: "getEntityPrimitive", + value: function getEntityPrimitive(index, stage) { + var edata = this._edata_list[index]; + + var _edata$producer$getMa = edata.producer.getMaterialAndProperties(stage), + material = _edata$producer$getMa.material, + properties = _edata$producer$getMa.properties; // this._transform を設定 + + + if (this._transform === null) { + this._transform = GeoMath.setIdentity(GeoMath.createMatrix()); + var pos = AreaUtil.getCenter(this, GeoMath.createVector3()); + this._transform[12] = pos[0]; + this._transform[13] = pos[1]; + this._transform[14] = pos[2]; + } + + var primitive = new Primitive(this._glenv, edata.mesh, material, this._transform); + primitive.properties = properties; + return { + entity: edata.producer.entity, + primitive: primitive + }; + } + }, { + key: "num_entities", + get: function get() { + return this._edata_list.length; + } + }]); + + return FlakeRenderObject; +}(); + +// https://tc39.github.io/ecma262/#sec-array.prototype.fill + +_export({ + target: 'Array', + proto: true +}, { + fill: arrayFill +}); // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables + +addToUnscopables('fill'); + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Uint8', function (init) { + return function Uint8Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +/** + * @summary 更新されたタイル領域 + * + * @memberof mapray + * @private + */ +var UpdatedTileArea = +/*#__PURE__*/ +function () { + /** + */ + function UpdatedTileArea() { + _classCallCheck(this, UpdatedTileArea); + + this._area_list = []; + this._flat_area_list = null; + } + /** + * @summary 更新された領域は空か? + * + * @return {boolean} 更新領域が存在するとき false, それ以外のとき true + */ + + + _createClass(UpdatedTileArea, [{ + key: "isEmpty", + value: function isEmpty() { + return this._area_list.length == 0; + } + /** + * @summary 更新領域を空にする + */ + + }, { + key: "clear", + value: function clear() { + this._area_list.length = 0; + this._flat_area_list = null; + } + /** + * @summary 更新領域を追加 + * + * @param {object} area 領域 + * @param {number} area.z レベル + * @param {number} area.x X タイル座標 + * @param {number} area.y Y タイル座標 + */ + + }, { + key: "addTileArea", + value: function addTileArea(area) { + this._area_list.push({ + z: area.z, + x: area.x, + y: area.y + }); + + this._flat_area_list = null; + } + /** + * @summary フラット領域配列を取得 + * + * @desc + *

フラット領域配列の各領域は、同じ配列内に祖先領域を含まない。

+ *

各領域は子領域の索引の配列として表す。

+ * + * @return {Uint8Array[]} + */ + + }, { + key: "getFlatAreaList", + value: function getFlatAreaList() { + if (this._flat_area_list === null) { + this._flat_area_list = this._createFlatAreaList(); + } + + return this._flat_area_list; + } + /** + * @summary フラット領域配列を生成 + * + * @return {Uint8Array[]} + * + * @private + */ + + }, { + key: "_createFlatAreaList", + value: function _createFlatAreaList() { + var root_node = new Node(); + + for (var i = 0; i < this._area_list.length; ++i) { + var area = this._area_list[i]; + root_node.addDescendant(area.z, area.x, area.y); + } + + root_node.reduceTree(); + return root_node.collectFlatAreas(0, new Uint8Array(64), []); + } + }]); + + return UpdatedTileArea; +}(); +/** + * @summary UpdatedTileArea のノード + * + * @memberof mapray.UpdatedTileArea + * @private + */ + + +var Node = +/*#__PURE__*/ +function () { + /** + */ + function Node() { + _classCallCheck(this, Node); + + this.present = false; + this.children = new Array(4).fill(null); + } + /** + * @summary 子孫ノード (自身可) を追加 + * + * @param {number} z + * @param {number} x + * @param {number} y + */ + + + _createClass(Node, [{ + key: "addDescendant", + value: function addDescendant(z, x, y) { + if (this.present === true) { + // this はすでに決定しているので子孫は追加しない + return; + } + + if (z == 0) { + this.present = true; + this.children.fill(null); // すでに存在する子孫を取り消す + } else { + // z >= 1 + var p = Math.round(Math.pow(2, z - 1)); // 2^(z - 1) + + var u = Math.floor(x / p); + var v = Math.floor(y / p); + var i = u + 2 * v; + + if (this.children[i] === null) { + this.children[i] = new Node(); + } + + this.children[i].addDescendant(z - 1, x % p, y % p); + } + } + /** + * @summary ツリーを最適化 + * + * @return {number} this が末端なら 1, それ以外なら 0 + */ + + }, { + key: "reduceTree", + value: function reduceTree() { + if (this.present === true) { + return 1; + } // 末端の子供の数 + + + var count = 0; + + for (var i = 0; i < 4; ++i) { + var child = this.children[i]; + + if (child !== null) { + count += child.reduceTree(); + } + } + + if (count == 4) { + // すべての子供が存在し、それらがすべて末端なら this を末端化 + this.present = true; + this.children.fill(null); + return 1; + } else { + // this を末端化しない + return 0; + } + } + /** + * @summary 末端ノードを収集 + * + * @param {number} z レベル + * @param {Uint8Array} indices 領域を表す索引配列 + * @param {Uint8Array[]} olist 収集結果を格納する配列 + * @return {Uint8Array[]} olist + */ + + }, { + key: "collectFlatAreas", + value: function collectFlatAreas(z, indices, olist) { + if (this.present === true) { + olist.push(new Uint8Array(indices.slice(0, z))); + } else { + for (var i = 0; i < 4; ++i) { + var child = this.children[i]; + + if (child !== null) { + indices[z] = i; + child.collectFlatAreas(z + 1, indices, olist); + } + } + } + + return olist; + } + }]); + + return Node; +}(); + +// https://tc39.github.io/ecma262/#sec-array.isarray + +_export({ + target: 'Array', + stat: true +}, { + isArray: isArray +}); + +var ARRAY_BUFFER$1 = 'ArrayBuffer'; +var ArrayBuffer$3 = arrayBuffer[ARRAY_BUFFER$1]; +var NativeArrayBuffer$1 = global_1[ARRAY_BUFFER$1]; // `ArrayBuffer` constructor +// https://tc39.github.io/ecma262/#sec-arraybuffer-constructor + +_export({ + global: true, + forced: NativeArrayBuffer$1 !== ArrayBuffer$3 +}, { + ArrayBuffer: ArrayBuffer$3 +}); +setSpecies(ARRAY_BUFFER$1); + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Uint16', function (init) { + return function Uint16Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Uint32', function (init) { + return function Uint32Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +/** + * @summary メッシュ用のバッファ + * @memberof mapray + * @package + */ +var MeshBuffer = +/*#__PURE__*/ +function () { + /** + *

注意: ARRAY_BUFFER へのバインドは null に設定される。

+ * + * @param {mapray.GLEnv} glenv + * @param {ArrayBuffer|ArrayBufferView} src 元データ + * @param {object} [options] オプション + * @param {mapray.MeshBuffer.Target} [options.target=Target.ATTRIBUTE] 使用目的 + */ + function MeshBuffer(glenv, src, options) { + _classCallCheck(this, MeshBuffer); + + this._glenv = glenv; + var opts = options || {}; // VBO を生成 + + var gl = glenv.context; + + var target = MeshBuffer._getBindingPoint(gl, opts.target); + + var vbo = gl.createBuffer(); + gl.bindBuffer(target, vbo); + gl.bufferData(target, src, gl.STATIC_DRAW); + gl.bindBuffer(target, null); + this._handle = vbo; + } + /** + * @summary バッファのハンドル + * @type {WebGLBuffer} + * @readonly + */ + + + _createClass(MeshBuffer, [{ + key: "dispose", + + /** + * @summary リソースを破棄 + */ + value: function dispose() { + var gl = this._glenv.context; + gl.deleteBuffer(this._handle); + this._handle = null; + } + /** + * @private + */ + + }, { + key: "handle", + get: function get() { + return this._handle; + } + }], [{ + key: "_getBindingPoint", + value: function _getBindingPoint(gl, target) { + switch (target) { + default: + case Target.ATTRIBUTE: + return gl.ARRAY_BUFFER; + + case Target.INDEX: + return gl.ELEMENT_ARRAY_BUFFER; + } + } + }]); + + return MeshBuffer; +}(); +/** + * @summary バッファの使用目的 + * + * @enum {object} + * @memberof mapray.MeshBuffer + * @constant + */ + + +var Target = { + /** + * 頂点属性 + */ + ATTRIBUTE: { + id: "ATTRIBUTE" + }, + + /** + * インデックス + */ + INDEX: { + id: "INDEX" + } +}; +MeshBuffer.Target = Target; + +/** + * @summary モデルメッシュ + * @memberof mapray + * @package + */ + +var Mesh = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv + * @param {mapray.Mesh.Initializer|ArrayBuffer|object} data メッシュデータ + */ + function Mesh(glenv, data) { + _classCallCheck(this, Mesh); + + this._glenv = glenv; + this._draw_mode = undefined; + this._num_vertices = 0; + this._attrib_data = {}; + this._index_data = null; + + if (data instanceof Initializer) { + // Mesh.Initializer + this._initByInitializer(data); + } else if (data instanceof ArrayBuffer) { + // メッシュバイナリ + this._initByInitializer(new BinaryInit(glenv, data).initializer); + } else { + // JSON オブジェクト + this._initByInitializer(new JsonInit(glenv, data).initializer); + } + } + /** + * @summary Initializer による初期化 + * + * @param {mapray.Mesh.Initializer} init 初期化データ + * @private + */ + + + _createClass(Mesh, [{ + key: "_initByInitializer", + value: function _initByInitializer(init) { + this._draw_mode = this._convertDrawMode(init.draw_mode); + this._num_vertices = init.num_vertices; // this._attrib_data + + var src_attrib_data = init.attribute_data; // Mesh.Initializer#addAttribute() を参照 + + for (var i = 0; i < src_attrib_data.length; ++i) { + var sad = src_attrib_data[i]; + this._attrib_data[sad.id] = { + mesh_buffer: sad.buffer, + buffer: sad.buffer.handle, + num_components: sad.num_components, + component_type: this._convertComponentType(sad.component_type), + normalized: sad.normalized, + byte_stride: sad.byte_stride, + byte_offset: sad.byte_offset + }; + } // this._index_data + + + if (init.index_data) { + var src_index_data = init.index_data; // Mesh.Initializer#addIndex() を参照 + + this._index_data = { + mesh_buffer: src_index_data.buffer, + buffer: src_index_data.buffer.handle, + num_indices: src_index_data.num_indices, + type: this._convertComponentType(src_index_data.type), + byte_offset: src_index_data.byte_offset + }; + } + } + /** + * @summary DrawMode 型から GL 描画モードへ変換 + * + * @param {mapray.Mesh.DrawMode} mode 描画モード + * @return {number} GL 描画モード + * @private + */ + + }, { + key: "_convertDrawMode", + value: function _convertDrawMode(mode) { + var gl = this._glenv.context; + + switch (mode) { + case DrawMode.POINTS: + return gl.POINTS; + + case DrawMode.LINES: + return gl.LINES; + + case DrawMode.TRIANGLES: + return gl.TRIANGLES; + + case DrawMode.LINE_LOOP: + return gl.LINE_LOOP; + + case DrawMode.LINE_STRIP: + return gl.LINE_STRIP; + + case DrawMode.TRIANGLE_STRIP: + return gl.TRIANGLE_STRIP; + + case DrawMode.TRIANGLE_FAN: + return gl.TRIANGLE_FAN; + + default: + throw new Error("mapray: invalid Mesh.DrawMode: " + mode); + } + } + /** + * @summary ComponentType 型から GL 要素型へ変換 + * + * @param {mapray.Mesh.ComponentType} type 要素型 + * @return {number} GL 要素型 + * @private + */ + + }, { + key: "_convertComponentType", + value: function _convertComponentType(type) { + var gl = this._glenv.context; + + switch (type) { + case ComponentType.BYTE: + return gl.BYTE; + + case ComponentType.UNSIGNED_BYTE: + return gl.UNSIGNED_BYTE; + + case ComponentType.SHORT: + return gl.SHORT; + + case ComponentType.UNSIGNED_SHORT: + return gl.UNSIGNED_SHORT; + + case ComponentType.UNSIGNED_INT: + return gl.UNSIGNED_INT; + + case ComponentType.FLOAT: + return gl.FLOAT; + + default: + throw new Error("mapray: invalid Mesh.ComponentType: " + type); + } + } + /** + * @summary リソースを破棄 + */ + + }, { + key: "dispose", + value: function dispose() { + this._attrib_data = {}; + this._index_data = null; + } + /** + * @summary メッシュを描画 + * + * @desc + *

事前に material.bindProgram(), material.setParameters() すること。

+ * + * @param {mapray.EntityMaterial} material マテリアル + */ + + }, { + key: "draw", + value: function draw(material) { + var gl = this._glenv.context; // 頂点属性のバインド + + material.bindVertexAttribs(this._attrib_data); + var index_data = this._index_data; + + if (index_data !== null) { + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_data.buffer); + gl.drawElements(this._draw_mode, index_data.num_indices, index_data.type, index_data.byte_offset); + } else { + gl.drawArrays(this._draw_mode, 0, this._num_vertices); + } + } + }]); + + return Mesh; +}(); +/** + * @summary メッシュの初期化オブジェクト + * + * @memberof mapray.Mesh + * @package +*/ + + +var Initializer = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Mesh.DrawMode} draw_mode 描画モード + * @param {number} num_vertices 頂点数 + */ + function Initializer(draw_mode, num_vertices) { + _classCallCheck(this, Initializer); + + this.draw_mode = draw_mode; + this.num_vertices = num_vertices; + this.index_data = null; + this.attribute_data = []; + } + /** + * @summary インデックスデータを追加 + * + * @param {mapray.MeshBuffer} buffer バッファ + * @param {number} num_indices インデックス数 + * @param {mapray.Mesh.ComponentType} type インデックス型 (UNSIGNED_BYTE | UNSIGNED_SHORT | UNSIGNED_INT) + * @param {object} [options] オプション + * @param {number} [options.byte_offset=0] バッファ先頭からのバイトオフセット + */ + + + _createClass(Initializer, [{ + key: "addIndex", + value: function addIndex(buffer, num_indices, type, options) { + var opts = options || {}; + this.index_data = { + buffer: buffer, + num_indices: num_indices, + type: type, + byte_offset: opts.byte_offset !== undefined ? opts.byte_offset : 0 + }; + } + /** + * @summary 頂点属性データを追加 + * + * @param {string} id 属性名 + * @param {mapray.MeshBuffer} buffer バッファ + * @param {number} num_components 要素数 + * @param {mapray.Mesh.ComponentType} component_type 要素型 + * @param {object} [options] オプション + * @param {boolean} [options.normalized=false] 正規化するか? + * @param {number} [options.byte_stride=0] 頂点間のバイトストライド + * @param {number} [options.byte_offset=0] バッファ先頭からのバイトオフセット + */ + + }, { + key: "addAttribute", + value: function addAttribute(id, buffer, num_components, component_type, options) { + var opts = options || {}; + var data = { + id: id, + buffer: buffer, + num_components: num_components, + component_type: component_type, + normalized: opts.normalized !== undefined ? opts.normalized : false, + byte_stride: opts.byte_stride !== undefined ? opts.byte_stride : 0, + byte_offset: opts.byte_offset !== undefined ? opts.byte_offset : 0 + }; + this.attribute_data.push(data); + } + }]); + + return Initializer; +}(); +/** + * @summary 描画モードの列挙型 + * @enum {object} + * @memberof mapray.Mesh + * @constant + */ + + +var DrawMode = { + /** + * 点リスト + */ + POINTS: { + id: "POINTS" + }, + + /** + * 線分リスト + */ + LINES: { + id: "LINES" + }, + + /** + * 三角形リスト + */ + TRIANGLES: { + id: "TRIANGLES" + }, + + /** + * 線分ループ + */ + LINE_LOOP: { + id: "LINE_LOOP" + }, + + /** + * 線分ストリップ + */ + LINE_STRIP: { + id: "LINE_STRIP" + }, + + /** + * 三角形ストリップ + */ + TRIANGLE_STRIP: { + id: "TRIANGLE_STRIP" + }, + + /** + * 三角形ファン + */ + TRIANGLE_FAN: { + id: "TRIANGLE_FAN" + } +}; +/** + * @summary 要素型の列挙型 + * @enum {object} + * @memberof mapray.Mesh + * @constant + */ + +var ComponentType = { + /** + * 符号付き 8 ビット整数型 + */ + BYTE: { + id: "BYTE" + }, + + /** + * 符号なし 8 ビット整数型 + */ + UNSIGNED_BYTE: { + id: "UNSIGNED_BYTE" + }, + + /** + * 符号付き 16 ビット整数型 + */ + SHORT: { + id: "SHORT" + }, + + /** + * 符号なし 16 ビット整数型 + */ + UNSIGNED_SHORT: { + id: "UNSIGNED_SHORT" + }, + + /** + * 符号なし 32 ビット整数型 + */ + UNSIGNED_INT: { + id: "UNSIGNED_INT" + }, + + /** + * 32 ビット浮動小数点数型 + */ + FLOAT: { + id: "FLOAT" + } +}; +/** + * @summary JSON オブジェクトを Mesh.Initializer に変換 + * + * @memberof mapray.Mesh + * @private + */ + +var JsonInit = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv + * @param {object} data メッシュデータ + */ + function JsonInit(glenv, data) { + _classCallCheck(this, JsonInit); + + var vinfo = InitHelper.createVertexInfo(data.vtype); + var num_vcompos = InitHelper.numVertexComponents(vinfo); + var num_vertices = data.vertices.length / num_vcompos; + this._initializer = new Initializer(JsonInit._toDrawMode(data), num_vertices); + + this._addIndex(glenv, data.indices, num_vertices); + + var FLT_BYTES = 4; + var buffer = new MeshBuffer(glenv, InitHelper.toTypedArray(data.vertices, ComponentType.FLOAT)); + var byteStride = num_vcompos * FLT_BYTES; + var byteOffset = 0; + + for (var i = 0; i < vinfo.length; ++i) { + var num_compos = vinfo[i].size; + + this._initializer.addAttribute(vinfo[i].name, buffer, num_compos, ComponentType.FLOAT, { + byte_stride: byteStride, + byte_offset: byteOffset + }); + + byteOffset += num_compos * FLT_BYTES; + } + } + /** + * @summary Mesh.Initializer インスタンスを取得 + * @type {Mesh.Initializer} + * @readonly + */ + + + _createClass(JsonInit, [{ + key: "_addIndex", + + /** + * @summary インデックスデータを追加 + * + * @param {mapray.GLEnv} glenv + * @param {object} indices インデックス配列 + * @param {number} num_vertices 頂点数 + */ + value: function _addIndex(glenv, indices, num_vertices) { + // インデックスの型は頂点数により自動的に決める + var type = num_vertices < 65536 ? ComponentType.UNSIGNED_SHORT : ComponentType.UNSIGNED_INT; + var buffer = new MeshBuffer(glenv, InitHelper.toTypedArray(indices, type), { + target: MeshBuffer.Target.INDEX + }); + + this._initializer.addIndex(buffer, indices.length, type); + } + /** + * @summary Mesh.DrawMode に変換 + * + * @param {object} data メッシュデータ + * @return {mapray.Mesh.DrawMode} 描画モード + * @private + */ + + }, { + key: "initializer", + get: function get() { + return this._initializer; + } + }], [{ + key: "_toDrawMode", + value: function _toDrawMode(data) { + // ptype?: ("triangles" | "lines") = "triangles" + switch (data.ptype) { + case "triangles": + return DrawMode.TRIANGLES; + + case "lines": + return DrawMode.LINES; + + default: + return DrawMode.TRIANGLES; + } + } + }]); + + return JsonInit; +}(); +/** + * @summary メッシュバイナリを Mesh.Initializer に変換 + * + * @memberof mapray.Mesh + * @private + */ + + +var BinaryInit = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv + * @param {ArrayBuffer} data メッシュデータ + */ + function BinaryInit(glenv, data) { + _classCallCheck(this, BinaryInit); + + var header = new DataView(data, 0); + var vtype = header.getUint8(BinaryInit.OFFSET_VTYPE); + var itype = header.getUint8(BinaryInit.OFFSET_ITYPE); + var ptype = header.getUint8(BinaryInit.OFFSET_PTYPE); + var num_vertices = header.getUint32(BinaryInit.OFFSET_NUM_VERTICES, true); + var num_indices = header.getUint32(BinaryInit.OFFSET_NUM_INDICES, true); + this._initializer = new Initializer(BinaryInit._toDrawMode(ptype), num_vertices); + var vinfo = InitHelper.createVertexInfo(vtype); + + var indices = this._createIndexArray(glenv, data, itype, num_indices, vinfo, num_vertices); + + this._addIndex(glenv, itype, indices); + + var FLT_BYTES = 4; + var buffer = new MeshBuffer(glenv, this._createVertexArray(data, vinfo, num_vertices)); + var byteStride = InitHelper.numVertexComponents(vinfo) * FLT_BYTES; + var byteOffset = 0; + + for (var i = 0; i < vinfo.length; ++i) { + var num_compos = vinfo[i].size; + + this._initializer.addAttribute(vinfo[i].name, buffer, num_compos, ComponentType.FLOAT, { + byte_stride: byteStride, + byte_offset: byteOffset + }); + + byteOffset += num_compos * FLT_BYTES; + } + } + /** + * @summary Mesh.Initializer インスタンスを取得 + * @type {Mesh.Initializer} + * @readonly + */ + + + _createClass(BinaryInit, [{ + key: "_createIndexArray", + + /** + * @summary インデックスバッファを作成 (バイナリデータから) + * + * @param {mapray.GLEnv} glenv + * @param {ArrayBuffer} src_buffer バイナリデータ + * @param {number} itype インデックス型 (ENUM_ITYPE_UINT16 | ENUM_ITYPE_UINT32) + * @param {number} num_indices インデックス数 + * @param {array} vinfo 頂点情報 + * @param {number} num_vertices 頂点数 + * @return {Uint16Array|Uint32Array} インデックス配列 + * @private + */ + value: function _createIndexArray(glenv, src_buffer, itype, num_indices, vinfo, num_vertices) { + // 入力配列を作成 + var FLT_BYTES = 4; + var vertices_bytes = InitHelper.numVertexComponents(vinfo) * num_vertices * FLT_BYTES; + var src_view = new DataView(src_buffer, BinaryInit.OFFSET_BODY + vertices_bytes); + var i; + var dst_array; + var index_bytes; + + switch (itype) { + case BinaryInit.ENUM_ITYPE_UINT16: + dst_array = new Uint16Array(num_indices); + index_bytes = 2; + + for (i = 0; i < num_indices; ++i) { + dst_array[i] = src_view.getUint16(index_bytes * i, true); + } + + break; + + case BinaryInit.ENUM_ITYPE_UINT32: + dst_array = new Uint32Array(num_indices); + index_bytes = 4; + + for (i = 0; i < num_indices; ++i) { + dst_array[i] = src_view.getUint32(index_bytes * i, true); + } + + break; + + default: + throw new Error("mapray: unknown itype: " + itype); + } + + return dst_array; + } + /** + * @summary 頂点バッファを作成 (バイナリデータから) + * + * @param {ArrayBuffer} src_buffer バイナリデータ + * @param {array} vinfo 頂点情報 + * @param {number} num_vertices 頂点数 + * @return {Float32Array} 頂点データを格納した配列 + * @private + */ + + }, { + key: "_createVertexArray", + value: function _createVertexArray(src_buffer, vinfo, num_vertices) { + var FLT_BYTES = 4; // 入力配列を作成 + + var num_elements = InitHelper.numVertexComponents(vinfo) * num_vertices; + var src_view = new DataView(src_buffer, BinaryInit.OFFSET_BODY); + var dst_array = new Float32Array(num_elements); + + for (var i = 0; i < num_elements; ++i) { + dst_array[i] = src_view.getFloat32(i * FLT_BYTES, true); + } + + return dst_array; + } + /** + * @summary インデックスデータを追加 + * + * @param {mapray.GLEnv} glenv + * @param {number} itype インデックス型 (ENUM_ITYPE_UINT16 | ENUM_ITYPE_UINT32) + * @param {Uint16Array|Uint32Array} indices インデックス配列 + * @private + */ + + }, { + key: "_addIndex", + value: function _addIndex(glenv, itype, indices) { + var buffer = new MeshBuffer(glenv, indices, { + target: MeshBuffer.Target.INDEX + }); + + var type = BinaryInit._indexTypeToComponentType(itype); + + this._initializer.addIndex(buffer, indices.length, type); + } + /** + * @summary Mesh.DrawMode に変換 + * + * @param {number} ptype プリミティブタイプ + * @return {mapray.Mesh.DrawMode} 描画モード + * @private + */ + + }, { + key: "initializer", + get: function get() { + return this._initializer; + } + }], [{ + key: "_toDrawMode", + value: function _toDrawMode(ptype) { + switch (ptype) { + case BinaryInit.ENUM_PTYPE_TRIANGLES: + return DrawMode.TRIANGLES; + + case BinaryInit.ENUM_PTYPE_LINES: + return DrawMode.LINES; + + default: + throw new Error("mapray: invalid ptype: " + ptype); + } + } + /** + * @summary インデックス型から要素型へ変換 + * + * @param {number} itype インデックス型 (ENUM_ITYPE_UINT16 | ENUM_ITYPE_UINT32) + * @return {mapray.Mesh.ComponentType} 要素型 (UNSIGNED_SHORT | UNSIGNED_INT) + * @private + */ + + }, { + key: "_indexTypeToComponentType", + value: function _indexTypeToComponentType(itype) { + switch (itype) { + case BinaryInit.ENUM_ITYPE_UINT16: + return ComponentType.UNSIGNED_SHORT; + + case BinaryInit.ENUM_ITYPE_UINT32: + default: + return ComponentType.UNSIGNED_INT; + } + } + }]); + + return BinaryInit; +}(); + +{ + // バイナリデータのオフセット + BinaryInit.OFFSET_VTYPE = 0; + BinaryInit.OFFSET_ITYPE = 1; + BinaryInit.OFFSET_PTYPE = 2; + BinaryInit.OFFSET_NUM_VERTICES = 4; + BinaryInit.OFFSET_NUM_INDICES = 8; + BinaryInit.OFFSET_BODY = 12; // ITYPE 列挙値 + + BinaryInit.ENUM_ITYPE_UINT16 = 0; + BinaryInit.ENUM_ITYPE_UINT32 = 1; // PTYPE 列挙値 + + BinaryInit.ENUM_PTYPE_TRIANGLES = 0; + BinaryInit.ENUM_PTYPE_LINES = 1; +} +/** + * @summary 初期化ヘルパー + * + * @memberof mapray.Mesh + * @private + */ + +var InitHelper = +/*#__PURE__*/ +function () { + function InitHelper() { + _classCallCheck(this, InitHelper); + } + + _createClass(InitHelper, null, [{ + key: "createVertexInfo", + + /** + * @summary 頂点情報を生成 + * @desc + *

vtype を以下の形式に変換して返す。ただし vtype が配列なら vtype を返す。

+ *
+     *   [ { name: 頂点属性名, size: 要素数 }, ... ]
+     * 
+ * @param {string|number|array} vtype 頂点タイプまたは頂点情報 + * @return {array} 頂点情報 + */ + value: function createVertexInfo(vtype) { + if (Array.isArray(vtype)) { + // vtype は最初から頂点情報 + return vtype; + } + + var vinfo = null; // vtype: ("P" | "PN" | "PT" | "PNT") + + switch (vtype) { + case "P": + case InitHelper.ENUM_VTYPE_P: + vinfo = [{ + name: InitHelper.ANAME_P, + size: InitHelper.FSIZE_P + }]; + break; + + case "PN": + case InitHelper.ENUM_VTYPE_PN: + vinfo = [{ + name: InitHelper.ANAME_P, + size: InitHelper.FSIZE_P + }, { + name: InitHelper.ANAME_N, + size: InitHelper.FSIZE_N + }]; + break; + + case "PT": + case InitHelper.ENUM_VTYPE_PT: + vinfo = [{ + name: InitHelper.ANAME_P, + size: InitHelper.FSIZE_P + }, { + name: InitHelper.ANAME_T, + size: InitHelper.FSIZE_T + }]; + break; + + case "PNT": + case InitHelper.ENUM_VTYPE_PNT: + vinfo = [{ + name: InitHelper.ANAME_P, + size: InitHelper.FSIZE_P + }, { + name: InitHelper.ANAME_N, + size: InitHelper.FSIZE_N + }, { + name: InitHelper.ANAME_T, + size: InitHelper.FSIZE_T + }]; + break; + + default: + throw new Error("mapray: unknown vtype: " + vtype); + } + + return vinfo; + } + /** + * @summary 頂点データの要素数を取得 + * + * @param {object[]} vinfo 頂点情報 + * @return {number} 頂点データの要素数 + */ + + }, { + key: "numVertexComponents", + value: function numVertexComponents(vinfo) { + var length = vinfo.length; + var num_compos = 0; + + for (var i = 0; i < length; ++i) { + num_compos += vinfo[i].size; + } + + return num_compos; + } + /** + * @summary 型配列に変換 + * + * @param {object} array 入力配列 + * @param {mapray.Mesh.ComponentType} type 変換先の要素型 + * @return {TypedArray} 変換された配列 + */ + + }, { + key: "toTypedArray", + value: function toTypedArray(array, type) { + switch (type) { + case ComponentType.UNSIGNED_SHORT: + return array instanceof Uint16Array ? array : new Uint16Array(array); + + case ComponentType.UNSIGNED_INT: + return array instanceof Uint32Array ? array : new Uint32Array(array); + + case ComponentType.FLOAT: + return array instanceof Float32Array ? array : new Float32Array(array); + + default: + throw new Error("mapray: invalid component type: " + type); + } + } + }]); + + return InitHelper; +}(); + +{ + // VTYPE 列挙値 + InitHelper.ENUM_VTYPE_P = 0; + InitHelper.ENUM_VTYPE_PN = 1; + InitHelper.ENUM_VTYPE_PT = 2; + InitHelper.ENUM_VTYPE_PNT = 3; // 頂点属性名 + + InitHelper.ANAME_P = "a_position"; + InitHelper.ANAME_N = "a_normal"; + InitHelper.ANAME_T = "a_texcoord"; // 要素のサイズ (要素数) + + InitHelper.FSIZE_P = 3; + InitHelper.FSIZE_N = 3; + InitHelper.FSIZE_T = 2; +} +Mesh.Initializer = Initializer; +Mesh.DrawMode = DrawMode; +Mesh.ComponentType = ComponentType; + +/** + * @summary 高度モード + * + * @desc + *

{@link mapray.GeoPoint} などの高度値をどのように解釈するかを指定する列挙値の型である。

+ * + * @enum {object} + * @memberof mapray + * @constant + * @see mapray.Entity + */ +var AltitudeMode = { + /** + * 絶対値 + */ + ABSOLUTE: { + id: "ABSOLUTE" + }, + + /** + * 地表からの相対値 + */ + RELATIVE: { + id: "RELATIVE" + }, + + /** + * 地表と同じ高さ (高度値を無視) + */ + CLAMP: { + id: "CLAMP" + } +}; + +/** + * @summary シーン・エンティティ + * @classdesc + *

シーン・エンティティの基底クラスである。

+ * @memberof mapray + * @see mapray.Scene + * @protected + * @abstract + */ + +var Entity = +/*#__PURE__*/ +function () { + /** + * @desc + *

インスタンス生成後に、それを scene に追加することができる。

+ * + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function Entity(scene, opts) { + _classCallCheck(this, Entity); + + /** + * @summary 所属可能シーン + * @member mapray.Entity#scene + * @type {mapray.Scene} + * @readonly + */ + this.scene = scene; // 高度モード + + this._altitude_mode = AltitudeMode.ABSOLUTE; + this._need_to_create_regions = false; // animation.BindingBlock + // 今のところ Entity (基底クラス) 自体のアニメーション可能パラメータと + // 子孫は存在しないので animation には何も追加しない + + this._animation = new EasyBindingBlock(); + this._visibility = true; // 生成情報から設定 + + if (opts && opts.json) { + this._setupEntityByJson(opts.json); + } + } + /** + * @summary 可視性フラグを取得 + * @type {boolean} + * @readonly + */ + + + _createClass(Entity, [{ + key: "setVisibility", + + /** + * @summary 可視性フラグを設定 + * + * @param {boolean} visibility 可視性フラグ + */ + value: function setVisibility(visibility) { + this._visibility = visibility; + } + /** + * @summary アンカーモード。 + *

隠面処理により本来表示されない状況であっても、何らかの描画を行い位置や角度を確認でき、マウスピック可能となるようにする描画モード。 + * 現在は、{@link mapray.ModelEntity}のみサポートされ、隠面処理により表示されない部分が半透明で描画される。

+ *

このプロパティを有効にする場合は、下記の問題点に注意する必要があります。

+ *
    + *
  • 透明・半透明モデルに適用することは想定されていません。透明・半透明モデルに対してこのプロパティを有効にすると表示が乱れる可能性があります。
  • + *
  • アンカーモードのエンティティどうしの前後判定はzソートにより実装されており、ピクセル単位の前後判定は行われません。
  • + *
+ * @type {boolean} + * @private + * @readonly + */ + + }, { + key: "getBounds", + + /** + * @summary バウンディングボックスを算出 + * + * @abstract + * @return {mapray.GeoRegion} バウンディングボックス + */ + value: function getBounds() { + throw new Error("mapray.Entity#getBounds() method has not been overridden."); + } + /** + * @summary 高度モードが変更された後の通知 + * + * @desc + *

this.altitude_mode が変更されたときに呼び出される。

+ *

既定の実装は何もしない。

+ * + * @param {mapray.AltitudeMode} prev_mode 直前のモード + * + * @abstract + * @private + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode(prev_mode) {} + /** + * @summary PrimitiveProducer インタフェースを取得 + * + * @desc + *

PrimitiveProducer インタフェースを取得するためにシーンレンダラーが呼び出す。 + * PrimitiveProducer インタフェースが実装されていなければ null を返す。

+ *

既定の実装は null を返す。

+ * + * @return {?mapray.Entity.PrimitiveProducer} PrimitiveProducer インタフェース + * + * @abstract + * @package + */ + + }, { + key: "getPrimitiveProducer", + value: function getPrimitiveProducer() { + return null; + } + /** + * @summary FlakePrimitiveProducer インタフェースを取得 + * + * @desc + *

FlakePrimitiveProducer インタフェースを取得するためにシーンレンダラーが呼び出す。 + * FlakePrimitiveProducer インタフェースが実装されていなければ null を返す。

+ *

既定の実装は null を返す。

+ * + * @return {?mapray.Entity.FlakePrimitiveProducer} FlakePrimitiveProducer インタフェース + * + * @abstract + * @package + */ + + }, { + key: "getFlakePrimitiveProducer", + value: function getFlakePrimitiveProducer() { + return null; + } + /** + * JSON データによる Entity 共通の初期化 + * @private + */ + + }, { + key: "_setupEntityByJson", + value: function _setupEntityByJson(json) { + // 高度モード + if (json.altitude_mode) { + switch (json.altitude_mode) { + case "absolute": + this._altitude_mode = AltitudeMode.ABSOLUTE; + break; + + case "relative": + this._altitude_mode = AltitudeMode.RELATIVE; + break; + + case "clamp": + this._altitude_mode = AltitudeMode.CLAMP; + break; + + default: + console.error("unrecognized altitude_mode: " + json.altitude_mode); + } + } + + if (json.visibility !== undefined) this.setVisibility(json.visibility); + } + }, { + key: "visibility", + get: function get() { + return this._visibility; + } + }, { + key: "anchor_mode", + get: function get() { + return false; + } + /** + * @summary アニメーションパラメータ設定 + * + * @type {mapray.animation.BindingBlock} + * @readonly + */ + + }, { + key: "animation", + get: function get() { + return this._animation; + } + /** + * @summary 高度モード + * @type {mapray.AltitudeMode} + */ + + }, { + key: "altitude_mode", + set: function set(value) { + if (this._altitude_mode !== value) { + var prev_mode = this._altitude_mode; + this._altitude_mode = value; + this.onChangeAltitudeMode(prev_mode); + } + }, + get: function get() { + return this._altitude_mode; + } + }]); + + return Entity; +}(); +/** + * @summary エンティティのプリミティブを生産 + * + * @classdesc + *

シーンレンダラーにエンティティのプリミティブを与える。

+ * + * @memberof mapray.Entity + * @private + * @abstract + */ + + +var PrimitiveProducer = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Entity} entity PrimitiveProducer に対応するエンティティ + */ + function PrimitiveProducer(entity) { + _classCallCheck(this, PrimitiveProducer); + + this._entity = entity; + this._need_to_create_regions = false; + } + /** + * @summary エンティティ + * + * @type {mapray.Entity} + * @readonly + */ + + + _createClass(PrimitiveProducer, [{ + key: "needToCreateRegions", + + /** + * @summary 領域が更新されたとき呼び出す + * + * @desc + *

領域を変更したい場合に PrimitiveProducer の実装者が呼び出す必要がある。

+ */ + value: function needToCreateRegions() { + this._need_to_create_regions = true; + } + /** + * @summary need_to_create_regions を取得 + * + * @desc + *

エンティティの領域を変更する (createRegions() を呼び出す) 必要があるかどうかを確認するためにシーンレンダラーが呼び出す。

+ * + * @return {boolean} 領域を変更する必要があるとき true, それ以外のとき false + * + * @see needToCreateRegions() + */ + + }, { + key: "checkToCreateRegions", + value: function checkToCreateRegions() { + var result = this._need_to_create_regions; + this._need_to_create_regions = false; + return result; + } + /** + * @summary エンティティに標高値は必要か? + * + * @desc + *

エンティティが標高値を必要としているかどうかを確認するためレンダラーが呼び出す。

+ *

既定の実装では entity.altitude_mode が AltitudeMode.ABSOLUTE なら false, それ以外なら true を返す。

+ * + * @return {boolean} エンティティに標高値が必要なら true, それ以外なら false + * + * @abstract + */ + + }, { + key: "needsElevation", + value: function needsElevation() { + return this._entity._altitude_mode !== AltitudeMode.ABSOLUTE; + } + /** + * @summary エンティティ領域を生成 + * + * @desc + *

エンティティの領域を確認するためレンダラーが呼び出す。

+ *

既定の実装では [] を返す。

+ * + * @return {mapray.EntityRegion[]} エンティティ領域の配列 + * + * @abstract + */ + + }, { + key: "createRegions", + value: function createRegions() { + return []; + } + /** + * @summary 更新されたエンティティ領域の通知 + * + * @desc + *

エンティティの領域の標高が変化したことを通知するためレンダラーが呼び出す。regions は標高が更新されたエンティティ領域を含む配列である。

+ *

既定の実装では何もしない。

+ * + * @param {mapray.EntityRegion[]} regions エンティティ領域の配列 + * + * @abstract + */ + + }, { + key: "onChangeElevation", + value: function onChangeElevation(regions) {} + /** + * @summary プリミティブ配列を取得 + * + * @desc + *

レンダリング時にこのエンティティを描画するための 0 個以上のプリミティブを含む配列を返す。

+ *

このメソッドが呼び出されたフレームのレンダリングが終了するまで、返した配列とそれに含まれるプリミティブは変更してはならない。

+ * + * @param {mapray.RenderStage} stage レンダリングステージ + * @return {Array.} プリミティブ配列 + * + * @abstract + */ + + }, { + key: "getPrimitives", + value: function getPrimitives(stage) { + throw new Error("mapray.Entity.PrimitiveProducer#getPrimitives() method has not been overridden."); + } + }, { + key: "entity", + get: function get() { + return this._entity; + } + }]); + + return PrimitiveProducer; +}(); +/** + * @summary 地表断片エンティティのプリミティブを生産 + * + * @classdesc + *

シーンレンダラーに地表断片エンティティのプリミティブを与える。

+ * + * @memberof mapray.Entity + * @private + * @abstract + */ + + +var FlakePrimitiveProducer = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Entity} entity FlakePrimitiveProducer に対応するエンティティ + */ + function FlakePrimitiveProducer(entity) { + _classCallCheck(this, FlakePrimitiveProducer); + + this._entity = entity; + this._updated = false; + } + /** + * @summary エンティティ + * + * @type {mapray.Entity} + * @readonly + */ + + + _createClass(FlakePrimitiveProducer, [{ + key: "notifyForUpdate", + + /** + * @summary 位置や形状の変化を通知 + */ + value: function notifyForUpdate() { + this._updated = true; + } + /** + * @summary 領域状態を取得 + * + * @desc + *

area が示す領域の状態を取得する。

+ * + * @param {mapray.Area} area 確認する領域 + * + * @return {mapray.Entity.AreaStatus} 領域の状態 + * + * @abstract + */ + + }, { + key: "getAreaStatus", + value: function getAreaStatus(area) { + return AreaStatus.EMPTY; + } + /** + * @summary メッシュを生成 + * + * @desc + *

area の領域に対応するメッシュを取得する。

+ *

area に形状がないときは null を返す。

+ * + * @param {mapray.Area} area メッシュの領域 + * @param {number[]} dpows 領域の分割指数 + * @param {mapray.DemBinary} dem DEM バイナリ + * + * @return {?mapray.Mesh} + * + * @abstract + */ + + }, { + key: "createMesh", + value: function createMesh(area, dpows, dem) { + return null; + } + /** + * @summary マテリアルとプロパティを取得 + * + * @param {mapray.RenderStage} stage レンダリングステージ + * + * @return {object} { material: mapray.EntityMaterial, properties: mapray.PropSet } + * + * @abstract + */ + + }, { + key: "getMaterialAndProperties", + value: function getMaterialAndProperties(stage) { + throw new Error("mapray.Entity.FlakePrimitiveProducer#getMaterialAndProperties() method has not been overridden."); + } + /** + * @summary 更新状態を確認 + * + * @desc + *

レンダラーが呼び出す。

+ *

更新状態を返してから、更新なし状態に設定する。

+ * + * @return {boolean} 更新ありのとき true, それ以外のとき false + * + * @package + */ + + }, { + key: "checkForUpdate", + value: function checkForUpdate() { + var updated = this._updated; + this._updated = false; + return updated; + } + }, { + key: "entity", + get: function get() { + return this._entity; + } + }]); + + return FlakePrimitiveProducer; +}(); +/** + * @summary 領域状態の列挙型 + * + * @enum {object} + * @memberof mapray.Entity + * @constant + * @private + */ + + +var AreaStatus = { + /** + * 何もない領域 + */ + EMPTY: { + id: "EMPTY" + }, + + /** + * 完全に満たされた領域 + */ + FULL: { + id: "FULL" + }, + + /** + * 部分領域または領域不明 + */ + PARTIAL: { + id: "PARTIAL" + } +}; +Entity.PrimitiveProducer = PrimitiveProducer; +Entity.FlakePrimitiveProducer = FlakePrimitiveProducer; +Entity.AreaStatus = AreaStatus; + +/** + * @summary 地表形状の管理 + * @memberof mapray + * @private + */ + +var Globe = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {mapray.DemProvider} dem_provider DEM プロバイダ + */ + function Globe(glenv, dem_provider) { + _classCallCheck(this, Globe); + + this._glenv = glenv; + this._dem_provider = dem_provider; + this._status = Status.NOT_READY; + this._dem_area_updated = new UpdatedTileArea(); + this._prev_producers = new Set(); + this._ρ = dem_provider.getResolutionPower(); + this._dem_zbias = GeoMath.LOG2PI - this._ρ + 1; // b = log2(π) - ρ + 1 + + this._hist_stats = new HistStats(); + this._flake_reduce_thresh = 1.5; // Flake 削減比率閾値 + + this._flake_reduce_factor = 1.2; // Flake 削減比率係数 + + this._num_cache_flakes = 0; // キャッシュ内の Flake 数 (_root_flake と子孫の数) + + this._num_touch_flakes = 0; // 現行フレームでのアクセス Flake 数 + + this._mesh_reduce_lower = 300; // Mesh 削減下限値 + + this._mesh_reduce_thresh = 1.5; // Mesh 削減比率閾値 + + this._mesh_reduce_factor = 1.2; // Mesh 削減比率係数 + + this._num_cache_meshes = 0; // キャッシュ内の Mesh 数 + + this._num_touch_meshes = 0; // 現行フレームでのアクセス Mesh 数 + + this._max_dem_requesteds = 10; // 最大 REQUESTED 数 + + this._num_dem_requesteds = 0; // 現在の REQUESTED 状態の数 + + this._frame_counter = 0; // 現行フレーム番号 + + this._root_flake = null; + this._avg_height = null; + this._root_cancel_id = null; + + this._requestRoot(); + } + /** + * すべてのリクエストを取り消す + */ + + + _createClass(Globe, [{ + key: "cancel", + value: function cancel() { + if (this._status === Status.READY) { + // root の真子孫を破棄 (リクエストをキャンセル) + var children = this._root_flake._children; + + for (var i = 0; i < 4; ++i) { + children[i].dispose(); + } + } else if (this._status === Status.NOT_READY) { + // リクエスト中の root をキャンセル + this._dem_provider.cancelRequest(this._root_cancel_id); + + this._root_cancel_id = null; + } // assert: this._num_dem_requesteds == 0 + + } + /** + * WebGL 環境 + * @type {mapray.GLEnv} + * @readonly + */ + + }, { + key: "putNextEntityProducers", + + /** + * @summary エンティティ情報を更新 + * + *

getRenderObject() の前にエンティティの情報を更新する。

+ * + * @param {iterable.} producers + */ + value: function putNextEntityProducers(producers) { + var next_producers = new Set(); // 追加、削除、更新のリストを作成 + + var added_producers = []; + var updated_producers = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = producers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var prod = _step.value; + var updated = prod.checkForUpdate(); // 更新チェックとクリア + + if (this._prev_producers.has(prod)) { + if (updated) { + // 更新された + updated_producers.push(prod); + } + + this._prev_producers["delete"](prod); + } else { + // 新規追加 + added_producers.push(prod); + } + + next_producers.add(prod); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var removed_producers = this._prev_producers; // ツリーを更新 + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = removed_producers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var _prod = _step2.value; + + this._root_flake.removeEntityProducer(_prod); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + for (var _i = 0, _added_producers = added_producers; _i < _added_producers.length; _i++) { + var _prod2 = _added_producers[_i]; + + this._root_flake.addEntityProducer(_prod2); + } + + for (var _i2 = 0, _updated_producers = updated_producers; _i2 < _updated_producers.length; _i2++) { + var _prod3 = _updated_producers[_i2]; + + this._root_flake.updateEntityProducer(_prod3); + } // 次の prev_producers を設定 + + + this._prev_producers = next_producers; + } + /** + * @summary リクエスト待ちの DEM タイルの個数を取得 + * + * @return {number} リクエスト待ちの DEM タイルの個数 + */ + + }, { + key: "getNumDemWaitingRequests", + value: function getNumDemWaitingRequests() { + return this._num_dem_requesteds; + } + /** + * @summary 正確度が最も高い DEM タイルデータを検索 + * @desc + *

基底タイル座標 (左上(0, 0)、右下(1, 1)) [xt, yt] の標高データを取得することができる、正確度が最も高い DEM タイルデータを検索する。

+ *

サーバーにさらに正確度が高い DEM タイルデータが存在すれば、それをリクエストする。

+ * @param {number} xt X 座標 (基底タイル座標系) + * @param {number} yt Y 座標 (基底タイル座標系) + * @return {?mapray.DemBinary} DEM タイルデータ (存在しなければ null) + */ + + }, { + key: "findHighestAccuracy", + value: function findHighestAccuracy(xt, yt) { + var flake = this._root_flake; + + if (flake === null) { + // まだ基底タイルが読み込まれていない + return null; + } + + var size = 2; // 2^(flake.z + 1) + + var xf = size * xt; + var yf = size * yt; + var dem_flake = flake; // DEM を持った地表断片 + + for (;;) { + var u = GeoMath.clamp(Math.floor(xf), 0, size - 1) % 2; + var v = GeoMath.clamp(Math.floor(yf), 0, size - 1) % 2; + var child = flake._children[u + 2 * v]; + flake.touch(); + + if (child === null) { + // これ以上のレベルは存在しない + break; + } else if (flake._dem_state === DemState.LOADED) { + // より正確度が高い DEM を持つ地表断片に更新 + dem_flake = flake; + } + + flake = child; + size *= 2; + xf *= 2; + yf *= 2; + } + + dem_flake._requestHighestAccuracy(xt, yt); + + return dem_flake._dem_data; + } + /** + * @summary 現行の標高 (複数) を取得 + * + * @desc + *

現在メモリーにある最高精度の標高値を一括で取得する。

+ *

まだ DEM データが存在しない、または経度, 緯度が範囲外の場所は標高を 0 とする。

+ * + *

このメソッドは DEM のリクエストは発生しない。また DEM のキャッシュには影響を与えない。

+ * + *

一般的に画面に表示されていない場所は標高の精度が低い。

+ * + * @param {number} num_points 入出力データ数 + * @param {number[]} src_array 入力配列 (経度, 緯度, ...) + * @param {number} src_offset 入力データの先頭インデックス + * @param {number} src_stride 入力データのストライド + * @param {number[]} dst_array 出力配列 (標高, ...) + * @param {number} dst_offset 出力データの先頭インデックス + * @param {number} dst_stride 出力データのストライド + * @return {number[]} dst_array + * + * @see mapray.Viewer#getExistingElevations + */ + + }, { + key: "getExistingElevations", + value: function getExistingElevations(num_points, src_array, src_offset, src_stride, dst_array, dst_offset, dst_stride) { + var dPI = 2 * Math.PI; + var demSize = 1 << this._ρ; // 2^ρ + + var src_index = src_offset; + var dst_index = dst_offset; + + for (var i = 0; i < num_points; ++i) { + // 経緯度 (Degrees) + var lon = src_array[src_index]; + var lat = src_array[src_index + 1]; // 正規化経緯度 (Degrees) + + var _lon = lon + 180 * Math.floor((90 - lat) / 360 + Math.floor((90 + lat) / 360)); + + var nlon = _lon - 360 - 360 * Math.floor((_lon - 180) / 360); // 正規化経度 [-180,180) + + var nlat = 90 - Math.abs(90 - lat + 360 * Math.floor((90 + lat) / 360)); // 正規化緯度 [-90,90] + // 単位球メルカトル座標 + + var xm = nlon * GeoMath.DEGREE; + var ym = GeoMath.invGudermannian(nlat * GeoMath.DEGREE); // 基底タイル座標 (左上(0, 0)、右下(1, 1)) + + var xt = xm / dPI + 0.5; + var yt = 0.5 - ym / dPI; + + if (yt >= 0 && yt <= 1) { + // 通常範囲のとき + var dem = this._findHighestAccuracy2(xt, yt); + + if (dem !== null) { + var pow = Math.pow(2, dem.z); // 2^ze + + var uf = demSize * (pow * xt - dem.x); + var vf = demSize * (pow * yt - dem.y); + var ui = GeoMath.clamp(Math.floor(uf), 0, demSize - 1); + var vi = GeoMath.clamp(Math.floor(vf), 0, demSize - 1); + var heights = dem.getHeights(ui, vi); + var h00 = heights[0]; + var h10 = heights[1]; + var h01 = heights[2]; + var h11 = heights[3]; // 標高を補間 + + var s = uf - ui; + var t = vf - vi; + dst_array[dst_index] = (h00 * (1 - s) + h10 * s) * (1 - t) + (h01 * (1 - s) + h11 * s) * t; + } else { + // まだ標高を取得することができない + dst_array[dst_index] = 0; + } + } else { + // 緯度が Web メルカトルの範囲外 (極に近い) + dst_array[dst_index] = 0; + } + + src_index += src_stride; + dst_index += dst_stride; + } + + return dst_array; + } + /** + * @summary 正確度が最も高い DEM タイルデータを検索 + * + * @desc + *

基底タイル座標 (左上(0, 0)、右下(1, 1)) [xt, yt] の標高データを取得することができる、正確度が最も高い DEM タイルデータを検索する。

+ * + * @param {number} xt X 座標 (基底タイル座標系) + * @param {number} yt Y 座標 (基底タイル座標系) + * @return {?mapray.DemBinary} DEM タイルデータ (存在しなければ null) + * + * @private + */ + + }, { + key: "_findHighestAccuracy2", + value: function _findHighestAccuracy2(xt, yt) { + var flake = this._root_flake; + + if (flake === null) { + // まだ基底タイルが読み込まれていない + return null; + } + + var size = 2; // 2^(flake.z + 1) + + var xf = size * xt; + var yf = size * yt; + var dem_flake = flake; // DEM を持った地表断片 + + for (;;) { + var u = GeoMath.clamp(Math.floor(xf), 0, size - 1) % 2; + var v = GeoMath.clamp(Math.floor(yf), 0, size - 1) % 2; + var child = flake._children[u + 2 * v]; + + if (child === null) { + // これ以上のレベルは存在しない + break; + } else if (flake._dem_state === DemState.LOADED) { + // より正確度が高い DEM を持つ地表断片に更新 + dem_flake = flake; + } + + flake = child; + size *= 2; + xf *= 2; + yf *= 2; + } + + return dem_flake._dem_data; + } + /** + * @summary フレームの最後の処理 + */ + + }, { + key: "endFrame", + value: function endFrame() { + var max_touch_flakes = this._hist_stats.getMaxValue(this._num_touch_flakes); + + if (this._num_cache_flakes > this._flake_reduce_thresh * max_touch_flakes) { + this._reduceFlakes(max_touch_flakes); + } + + if (this._num_cache_meshes > this._mesh_reduce_lower && this._num_cache_meshes > this._mesh_reduce_thresh * this._num_touch_meshes) { + this._reduceMeshes(); + } + + this._dem_area_updated.clear(); + + this._num_touch_flakes = 0; + this._num_touch_meshes = 0; + ++this._frame_counter; + } + /** + * _root_flake, _avg_height, _status を設定するためのリクエスト + * @private + */ + + }, { + key: "_requestRoot", + value: function _requestRoot() { + var _this = this; + + var z = 0; + var x = 0; + var y = 0; + this._root_cancel_id = this._dem_provider.requestTile(z, x, y, function (data) { + if (data) { + var dem = new DemBinary(z, x, y, _this._ρ, data); + _this._avg_height = dem.newAvgHeightMaps(); + _this._root_flake = new Flake(null, z, x, y); + + _this._root_flake.setupRoot(_this, dem); + + _this._status = Status.READY; + + _this._dem_area_updated.addTileArea(dem); + } else { + // データ取得に失敗 + _this._status = Status.FAILED; + } + + _this._root_cancel_id = null; + --_this._num_dem_requesteds; + }); + ++this._num_dem_requesteds; + } + /** + * @private + */ + + }, { + key: "_reduceFlakes", + value: function _reduceFlakes(max_touch_flakes) { + // Flake を集めて、優先度で整列 + var flat_flakes = this._root_flake.flattenFlakes(); // assert: flat_flakes.length == this._num_cache_flakes + + + flat_flakes.sort(function (a, b) { + return a.compareForReduce(b); + }); // 優先度の低い Flake を削除 + + var num_cache_flakes = Math.floor(this._flake_reduce_factor * max_touch_flakes); + flat_flakes.slice(num_cache_flakes).forEach(function (flake) { + return flake.dispose(); + }); // assert: this._num_cache_flakes == num_cache_flakes + } + /** + * @private + */ + + }, { + key: "_reduceMeshes", + value: function _reduceMeshes() { + var flat_meshes = this._root_flake.flattenMeshes(); // assert: flat_meshes.length == this._num_cache_meshes + + + flat_meshes.sort(function (a, b) { + return a.compareForReduce(b); + }); + var num_cache_meshes = Math.floor(this._mesh_reduce_factor * this._num_touch_meshes); + flat_meshes.slice(num_cache_meshes).forEach(function (mnode) { + return mnode.dispose(); + }); // assert: this._num_cache_meshes == num_cache_meshes + } + }, { + key: "glenv", + get: function get() { + return this._glenv; + } + /** + * DEM データプロバイダ + * @type {mapray.DemProvider} + * @readonly + */ + + }, { + key: "dem_provider", + get: function get() { + return this._dem_provider; + } + /** + * @summary Globe 状態を取得 + * @type {mapray.Globe.Status} + * @readonly + */ + + }, { + key: "status", + get: function get() { + return this._status; + } + /** + * @summary DEM が更新された領域を取得 + * @type {mapray.UpdatedTileArea} + * @readonly + */ + + }, { + key: "dem_area_updated", + get: function get() { + return this._dem_area_updated; + } + /** + * @summary 基底 Flake を取得 + * @type {mapray.Globe.Flake} + * @readonly + */ + + }, { + key: "root_flake", + get: function get() { + var flake = this._root_flake; + flake.touch(); + return flake; + } + }]); + + return Globe; +}(); +/** + * @summary Globe 状態の列挙型 + * @enum {object} + * @memberof mapray.Globe + * @constant + * @see mapray.Globe#status + */ + + +var Status = { + /** + * 準備中 (初期状態) + */ + NOT_READY: { + id: "NOT_READY" + }, + + /** + * 準備完了 + */ + READY: { + id: "READY" + }, + + /** + * 失敗状態 + */ + FAILED: { + id: "FAILED" + } +}; +Globe.Status = Status; +/** + * @summary 地表断片 + * @memberof mapray.Globe + * @private + */ + +var Flake = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Globe.Flake} parent + * @param {number} z + * @param {number} x + * @param {number} y + */ + function Flake(parent, z, x, y) { + _classCallCheck(this, Flake); + + /** + * @summary 地表分割レベル + * @member mapray.Globe.Flake#z + * @type {number} + */ + this.z = z; + /** + * @summary 地表タイル X 座標 + * @member mapray.Globe.Flake#x + * @type {number} + */ + + this.x = x; + /** + * @summary 地表タイル Y 座標 + * @member mapray.Globe.Flake#y + * @type {number} + */ + + this.y = y; // Flake 階層 + + this._parent = parent; + this._children = [null, null, null, null]; + this._globe = parent !== null ? parent._globe : null; // DEM データ + + this._dem_data = null; // DEM バイナリ、または取り消しオブジェクト + + this._dem_state = DemState.NONE; // エンティティ辞書 Map. + + this._entity_map = null; // MeshNode + + this._meshes = []; // 標高代表値 + + this._prev_Za_dem = null; // 前回の Za (DemBinary) だだし、標高代表が決定しているときは this + + this._prev_Zr_dem = null; // 前回の Zr (DemBinary) + + this._base_height = 0; // 平均標高 (h~) + + this._height_min = 0; // 最大標高 (h⇓) + + this._height_max = 0; // 最小標高 (h⇑) + + this._dem_zlimit = 0; // メッシュ生成時の DEM Z レベル上限 (Zb) + // 境界箱 (AABB) + + this._gocs_x_min = 0; + this._gocs_x_max = 0; + this._gocs_y_min = 0; + this._gocs_y_max = 0; + this._gocs_z_min = 0; + this._gocs_z_max = 0; // キャッシュ管理 + + this._aframe = -1; + + if (this._globe !== null) { + this._globe._num_cache_flakes += 1; + } + } + /** + * 基準の標高 + * @type {number} + * @readonly + */ + + + _createClass(Flake, [{ + key: "setupRoot", + + /** + * @summary 基底 Flake 専用の設定 + * @package + */ + value: function setupRoot(globe, dem) { + this._globe = globe; + this._dem_data = dem; + this._dem_state = DemState.LOADED; + this._entity_map = new Map(); + + this._estimate(); + + globe._num_cache_flakes += 1; + } + /** + * @summary 子 Flake を取得または生成 + * @param {number} u 子 Flake U 座標 (0 または 1) + * @param {number} v 子 Flake V 座標 (0 または 1) + * @return {mapray.Globe.Flake} 子 Flake インスタンス + */ + + }, { + key: "newChild", + value: function newChild(u, v) { + var index = u + 2 * v; + var child = this._children[index]; + + if (child === null) { + // 存在しないときは Flake を生成する + child = new Flake(this, this.z + 1, 2 * this.x + u, 2 * this.y + v); + this._children[index] = child; + } + + child._estimate(); + + child.touch(); + return child; + } + /** + * @summary カリングするか? + * @param {mapray.Vector4[]} clip_planes クリップ平面配列 + * @return {boolean} 見えないとき true, 見えるまたは不明のとき false + */ + + }, { + key: "isInvisible", + value: function isInvisible(clip_planes) { + switch (this.z) { + case 0: + return this._isInvisible_0(clip_planes); + + default: + return this._isInvisible_N(clip_planes); + } + } + /** + * @summary レンダリングオブジェクトを検索 + * + * @param {number} lod 地表詳細レベル (LOD) + * + * @return {mapray.FlakeRenderObject} + */ + + }, { + key: "getRenderObject", + value: function getRenderObject(lod) { + var η = Math.pow(2, -lod) * Flake.ε; // 2^-lod ε + + var cu; // 水平球面分割レベル + + if (η <= 2) { + cu = Math.max(Math.ceil(GeoMath.LOG2PI - this.z - Math.maprayLog2(Math.acos(1 - η))), 0); + } else { + cu = 0; + } + + var cosφ = this._getCosφ(); + + var cv; // 垂直球面分割レベル + + if (η * cosφ <= 2) { + cv = Math.max(Math.ceil(GeoMath.LOG2PI - this.z + Math.maprayLog2(cosφ / Math.acos(1 - η * cosφ))), 0); + } else { + cv = 0; + } + + var node = this._getMeshNode(lod, cu, cv); + + node.touch(); + return node.getRenderObject(); + } + /** + * @summary this と交差する FlakePrimitiveProducer インスタンスの列挙子を取得 + * + * @return {iterable.} + */ + + }, { + key: "getEntityProducers", + value: function getEntityProducers() { + var entity_map = this._getEntityMap(); + + return entity_map.keys(); + } + /** + * @summary Flake ツリーに producer を追加 + * + * 事前条件: + * - this._entity_map !== null + * - this と this の子孫に producer が存在しない + * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + */ + + }, { + key: "addEntityProducer", + value: function addEntityProducer(producer) { + switch (producer.getAreaStatus(this)) { + case Entity.AreaStatus.PARTIAL: + { + // エントリに producer を追加 + this._entity_map.set(producer, false); // this の子孫も同様の処理 + + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this._children[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var child = _step3.value; + + if (child !== null && child._entity_map !== null) { + child.addEntityProducer(producer); + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + break; + + case Entity.AreaStatus.FULL: + { + this._addEntityFullProducer(producer); + } + break; + } + } + /** + * @summary Flake ツリーに producer を追加 + * + * 事前条件: + * - producer.getAreaStatus( this ) === Entity.AreaStatus.FULL + * - this._entity_map !== null + * - this と this の子孫に producer が存在しない + * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + * + * @private + */ + + }, { + key: "_addEntityFullProducer", + value: function _addEntityFullProducer(producer) { + // エントリに producer を追加 + this._entity_map.set(producer, true); // this の子孫も同様の処理 + + + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._children[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var child = _step4.value; + + if (child !== null && child._entity_map !== null) { + child._addEntityFullProducer(producer); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + } + /** + * @summary Flake ツリーから producer を削除 + * + * 事前条件: + * - this._entity_map !== null + * 事後条件: + * - this と this の子孫に producer が存在しない + * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + */ + + }, { + key: "removeEntityProducer", + value: function removeEntityProducer(producer) { + if (!this._entity_map.has(producer)) { + // もともと producer は this と this の子孫に存在しない + return; + } // エントリから producer を削除 + + + this._entity_map["delete"](producer); // this に producer に対応するメッシュが存在すれば削除 + + + this._removeEntityMeshes(producer); // this の子孫も同様の処理 + + + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = this._children[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var child = _step5.value; + + if (child !== null && child._entity_map !== null) { + child.removeEntityProducer(producer); + } + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + /** + * @summary Flake ツリーの producer を更新 + * + * 事前条件: + * - this._entity_map !== null + * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + */ + + }, { + key: "updateEntityProducer", + value: function updateEntityProducer(producer) { + this.removeEntityProducer(producer); + this.addEntityProducer(producer); + } + /** + * @summary 地表断片とレイの交点までの距離を検索 + *

地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点の中で、始点から最も近い交点までの距離を返す。

+ *

ただし地表断片と線分が交差しないときは limit を返す。

+ *

事前条件: this._globe.status === Status.READY

+ * @param {mapray.Ray} ray ray.position を始点として ray.direction 方向に伸びる半直線 + * @param {number} limit この距離までの交点を検索 + * @return {number} ray.position から交点までの距離、ただし交差しなかったときは limit + */ + + }, { + key: "findRayDistance", + value: function findRayDistance(ray, limit) { + var dem_flake; + + for (dem_flake = this; dem_flake._dem_state !== DemState.LOADED; dem_flake = dem_flake._parent) {} + + if (this.z - dem_flake.z === this._globe._ρ) { + return this._findQuadRayDistance(ray, limit, dem_flake); + } else if (this._cullForRayDistance(ray, limit)) { + return limit; + } else { + var dmin = limit; + + for (var v = 0; v < 2; ++v) { + for (var u = 0; u < 2; ++u) { + dmin = this.newChild(u, v).findRayDistance(ray, dmin); + } + } + + return dmin; + } + } + /** + * @summary 自己と子孫を破棄 + */ + + }, { + key: "dispose", + value: function dispose() { + var i; + var parent = this._parent; + + if (parent === null) { + // すでに破棄済み + return; + } + + var globe = this._globe; // メッシュを破棄 + + var meshes = this._meshes; + + while (meshes.length > 0) { + meshes[0].dispose(); + } // 子孫 Flake を破棄 + + + var children = this._children; + + for (i = 0; i < 4; ++i) { + var child = children[i]; + + if (child !== null) { + child.dispose(); + } + } // 親 Flake から this を削除 + + + var pchildren = parent._children; + + for (i = 0; i < 4; ++i) { + if (pchildren[i] === this) { + pchildren[i] = null; + break; + } + } + + this._parent = null; // DEM リクエストの取り消し + + if (this._dem_state === DemState.REQUESTED) { + globe._dem_provider.cancelRequest(this._dem_data); + + --globe._num_dem_requesteds; + } // Flake 数を減らす + + + globe._num_cache_flakes -= 1; + } + /** + * @summary 自己と子孫の Flake リストを取得 + * @return {array} + * @package + */ + + }, { + key: "flattenFlakes", + value: function flattenFlakes() { + var list = []; + + this._flattenFlakes(list); + + return list; + } + /** + * @summary 自己と子孫の MeshNode リストを取得 + * @return {array} + * @package + */ + + }, { + key: "flattenMeshes", + value: function flattenMeshes() { + var list = []; + + this._flattenMeshes(list); + + return list; + } + /** + * @summary 削減用の Flake 比較 + * @param {mapray.Globe.Flake} other 比較対象 + * @return {number} 比較値 + * @package + */ + + }, { + key: "compareForReduce", + value: function compareForReduce(other) { + // 最近アクセスしたものを優先 + // 同じなら Z レベルが小さい方を優先 + var a = this; + var b = other; + var aframe = b._aframe - a._aframe; + return aframe !== 0 ? aframe : a.z - b.z; + } + /** + * @private + */ + + }, { + key: "_flattenFlakes", + value: function _flattenFlakes(list) { + list.push(this); + var children = this._children; + + for (var i = 0; i < 4; ++i) { + var child = children[i]; + + if (child !== null) { + child._flattenFlakes(list); + } + } + } + /** + * @private + */ + + }, { + key: "_flattenMeshes", + value: function _flattenMeshes(list) { + Array.prototype.push.apply(list, this._meshes); + var children = this._children; + + for (var i = 0; i < 4; ++i) { + var child = children[i]; + + if (child !== null) { + child._flattenMeshes(list); + } + } + } + /** + * @summary アクセスフレームを更新 + * @package + */ + + }, { + key: "touch", + value: function touch() { + var globe = this._globe; + + if (this._aframe !== globe._frame_counter) { + this._aframe = globe._frame_counter; + globe._num_touch_flakes += 1; + } + } + /** + * @summary メッシュノードを取得 + * + * @param {number} lod 地表詳細レベル (LOD) + * @param {number} cu 水平球面分割レベル + * @param {number} cv 垂直球面分割レベル + * + * @return {mapray.Globe.MeshNode} メッシュノード + * + * @private + */ + + }, { + key: "_getMeshNode", + value: function _getMeshNode(lod, cu, cv) { + var dem = this._getMeshDemBinary(lod); + + var dpows = dem.getDivisionPowers(this, lod, cu, cv); // キャッシュに存在すれば、それを返す + + var meshes = this._meshes; + var length = meshes.length; + + for (var i = 0; i < length; ++i) { + var item = meshes[i]; + + if (item.match(dem, dpows)) { + return item; + } + } // キャッシュに存在しないので新規に生成 + + + var node = new MeshNode(this, dem, dpows); + meshes.unshift(node); // 検索効率のため先頭に追加 + + return node; + } + /** + * @summary メッシュ用の DEM バイナリを取得 + * @param {number} lod 地表詳細レベル (LOD) + * @return {mapray.DemBinary} DEM タイルデータ + * @private + */ + + }, { + key: "_getMeshDemBinary", + value: function _getMeshDemBinary(lod) { + var zDesired = GeoMath.clamp(Math.round(lod + this._globe._dem_zbias), 0, this._dem_zlimit); + + var dem = this._findNearestDemTile(zDesired); // 上のレベルの DEM をリクエスト + + + if (dem.z < zDesired) { + var qlevel = dem.getQuadLevel(this.z, this.x, this.y); + + if (qlevel > 0) { + this._requestAncestorDemTile(Math.min(dem.z + qlevel, zDesired)); + } + } + + return dem; + } + /** + * @summary 先祖 DEM タイルデータを検索 + * @desc + *

this の (レベルが zlimit またはそれ以下の) 祖先の中で、現在キャッシュに存在する最大レベルの DEM タイルデータを検索する。

+ * @param {number} zlimit 先祖レベルの上限 + * @return {mapray.DemBinary} 先祖 DEM タイルデータ + */ + + }, { + key: "_findNearestDemTile", + value: function _findNearestDemTile(zlimit) { + var flake = this; // zlimit の地表断片を検索 + + var count = this.z - zlimit; + + for (var i = 0; i < count; ++i) { + flake = flake._parent; + } // 次の DemBinary を持つ地表断片を検索 + + + while (flake._dem_state !== DemState.LOADED) { + flake = flake._parent; + } // 見つけた地表断片の DemBinary を返す + + + return flake._dem_data; + } + /** + * @summary 地表断片を包含する DEM タイルデータを要求 + * @desc + *

this を包含または this と一致する、ズームレベル ze の DEM タイルをサーバーに要求する。

+ *

ただしすでにキャッシュにその DEM タイルが存在、または REQUESTED 状態のときは要求しない。

+ *

FAILED 状態かつ ze > 0 のときは、再帰的に ze - 1 を要求する。

+ *

要求が最大数に達しているときは無視する。

+ * @param {number} ze DEM ズームレベル + */ + + }, { + key: "_requestAncestorDemTile", + value: function _requestAncestorDemTile(ze) { + var globe = this._globe; + + if (globe._num_dem_requesteds >= globe._max_dem_requesteds) { + // 要求が最大数に達しているので受け入れない + return; + } + + var flake = this; // zlimit の地表断片を検索 + + var count = this.z - ze; + + for (var i = 0; i < count; ++i) { + flake = flake._parent; + } + + while (true) { + var state = flake._dem_state; + + if (state === DemState.LOADED || state === DemState.REQUESTED) { + // 要求する必要がない + break; + } else if (state === DemState.FAILED) { + // 親でリトライ + flake = flake._parent; + continue; + } else { + // DEM タイルデータを要求 + // assert: state === DemState.NONE + var provider = globe._dem_provider; + flake._dem_data = provider.requestTile(flake.z, flake.x, flake.y, function (data) { + if (flake._parent === null) { + // すでに破棄済みなので無視 + return; + } + + if (data) { + flake._dem_data = new DemBinary(flake.z, flake.x, flake.y, globe._ρ, data); + flake._dem_state = DemState.LOADED; + + globe._dem_area_updated.addTileArea(flake); + } else { + // データ取得に失敗 + flake._dem_data = null; + flake._dem_state = DemState.FAILED; + } + + --globe._num_dem_requesteds; + }); + flake._dem_state = DemState.REQUESTED; + ++globe._num_dem_requesteds; + break; + } + } + } + /** + * @private + */ + + }, { + key: "_isInvisible_0", + value: function _isInvisible_0(clip_planes) { + var r = GeoMath.EARTH_RADIUS + this._height_max; + + for (var i = 0; i < clip_planes.length; ++i) { + var dist = clip_planes[i][3]; // 平面から GOCS 原点 (地球中心) までの距離 + + if (dist < -r) { + // 地球全体がこの平面の裏側にあるので見えない + return true; + } + } + + return false; // 見えている可能性がある + } + /** + * @private + */ + + }, { + key: "_isInvisible_N", + value: function _isInvisible_N(clip_planes) { + var xmin = this._gocs_x_min; + var xmax = this._gocs_x_max; + var ymin = this._gocs_y_min; + var ymax = this._gocs_y_max; + var zmin = this._gocs_z_min; + var zmax = this._gocs_z_max; + + for (var i = 0; i < clip_planes.length; ++i) { + var p = clip_planes[i]; + var px = p[0]; + var py = p[1]; + var pz = p[2]; + var pw = p[3]; // 以下がすべて成り立つとボックス全体は平面の裏側にある + // px*xmin + py*ymin + pz*zmin + pw < 0 + // px*xmax + py*ymin + pz*zmin + pw < 0 + // px*xmin + py*ymax + pz*zmin + pw < 0 + // px*xmax + py*ymax + pz*zmin + pw < 0 + // px*xmin + py*ymin + pz*zmax + pw < 0 + // px*xmax + py*ymin + pz*zmax + pw < 0 + // px*xmin + py*ymax + pz*zmax + pw < 0 + // px*xmax + py*ymax + pz*zmax + pw < 0 + + var c0 = px * xmin + py * ymin; + var c1 = px * xmax + py * ymin; + var c2 = px * xmin + py * ymax; + var c3 = px * xmax + py * ymax; + var c4 = -pz * zmin - pw; + var c5 = -pz * zmax - pw; + + if (c0 < c4 && c1 < c4 && c2 < c4 && c3 < c4 && c0 < c5 && c1 < c5 && c2 < c5 && c3 < c5) { + // ボックス全体が平面の裏側にあるので見えない + return true; + } + } + + return false; // 見えている可能性がある + } + /** + * @summary 中間緯度の余弦 + * @return {number} + * @private + */ + + }, { + key: "_getCos\u03C6", + value: function _getCos() { + var z = this.z; + + if (z > 0) { + var y = this.y; + var p = Math.pow(2, 1 - z); + var y0 = Math.abs(1 - p * y); + var y1 = Math.abs(1 - p * (y + 1)); + var ey = Math.exp(Math.PI * Math.min(y0, y1)); + return 2 * ey / (ey * ey + 1); // Cos[φ] == Cos[gd[y]] == Sech[y] + } else { + // z == 0 のときは φ == 0 とする + return 1; // Cos[0] + } + } + /** + * @summary 標高代表値と境界箱を更新 + * @private + */ + + }, { + key: "_estimate", + value: function _estimate() { + if (this._prev_Za_dem === this) { + // 代表値は決定済みなので何もしない + return; + } + + var zg = this.z; + var ρ = this._globe._ρ; + var zr_dem; + + if (zg < ρ) { + zr_dem = this._findNearestDemTile(zg); + + if (zr_dem === this._prev_Zr_dem) { + // 前回と代表値が変わらないので何もしない + return; + } + + this._prev_Zr_dem = zr_dem; + + this._estimate_low(zr_dem); + + this._dem_zlimit = zg; + } else { + var za_dem = this._findNearestDemTile(zg - ρ); + + if (za_dem.isLeaf(zg, this.x, this.y)) { + this._estimate_leaf(za_dem); + } else { + zr_dem = this._findNearestDemTile(za_dem.z + ρ); + + if (za_dem === this._prev_Za_dem && zr_dem === this._prev_Zr_dem) { + // 前回と代表値が変わらないので何もしない + return; + } + + this._prev_Za_dem = za_dem; + this._prev_Zr_dem = zr_dem; + + this._estimate_high(za_dem, zr_dem); + } + + this._dem_zlimit = za_dem.z + ρ; + } // 境界箱の更新 + + + switch (zg) { + case 0: + this._updataBoundingBox_0(); + + break; + + case 1: + this._updataBoundingBox_1(); + + break; + + default: + this._updataBoundingBox_N(); + + break; + } + } + /** + * @summary 標高代表値を計算 (Zg < ρ) + * @param {mapray.DemBinary} zr_dem レベルが Zr の DEM + * @private + */ + + }, { + key: "_estimate_low", + value: function _estimate_low(zr_dem) { + var zg = this.z; + var xg = this.x; + var yg = this.y; + + var α = this._calcAlpha(); + + this._base_height = this._globe._avg_height.sample(zg, xg, yg); + this._height_min = Math.max(this._base_height + α * Flake.Fm, zr_dem.height_min); + this._height_max = Math.min(this._base_height + α * Flake.Fp, zr_dem.height_max); + + if (zr_dem.z == zg || zr_dem.isLeaf(zg, xg, yg)) { + // 標高代表値が確定した + this._prev_Za_dem = this; + } + } + /** + * @summary 標高代表値を計算 (Zg >= ρ && !L(Za)) + * @param {mapray.DemBinary} za_dem レベルが Za の DEM + * @param {mapray.DemBinary} zr_dem レベルが Zr の DEM + * @private + */ + + }, { + key: "_estimate_high", + value: function _estimate_high(za_dem, zr_dem) { + var globe = this._globe; + var zg = this.z; + var xg = this.x; + var yg = this.y; + var ze = za_dem.z; // -> za + + var xe = za_dem.x; + var ye = za_dem.y; + var ρ = globe._ρ; + var pow = Math.pow(2, ze - zg); + var size = 1 << ρ; + var u = Math.floor(size * ((xg + 0.5) * pow - xe)); + var v = Math.floor(size * ((yg + 0.5) * pow - ye)); + var smin = size * (xg * pow - xe) - u; + var smax = size * ((xg + 1) * pow - xe) - u; + var tmin = size * (yg * pow - ye) - v; + var tmax = size * ((yg + 1) * pow - ye) - v; + var heights = za_dem.getHeights(u, v); + var h00 = heights[0]; + var h10 = heights[1]; + var h01 = heights[2]; + var h11 = heights[3]; + var h0 = (h00 * (1 - smin) + h10 * smin) * (1 - tmin) + (h01 * (1 - smin) + h11 * smin) * tmin; + var h1 = (h00 * (1 - smax) + h10 * smax) * (1 - tmin) + (h01 * (1 - smax) + h11 * smax) * tmin; + var h2 = (h00 * (1 - smin) + h10 * smin) * (1 - tmax) + (h01 * (1 - smin) + h11 * smin) * tmax; + var h3 = (h00 * (1 - smax) + h10 * smax) * (1 - tmax) + (h01 * (1 - smax) + h11 * smax) * tmax; + + var α = this._calcAlpha(); + + this._base_height = 0.25 * (h0 + h1 + h2 + h3); + this._height_min = Math.max(this._base_height + α * Flake.Fm, zr_dem.height_min); + this._height_max = Math.min(this._base_height + α * Flake.Fp, zr_dem.height_max); + + if (ze < zg - ρ) { + // 上のレベルの DEM をリクエスト + var qlevel = za_dem.getQuadLevel(zg, xg, yg); // assert: qlevel > 0 + + this._requestAncestorDemTile(Math.min(ze + qlevel, zg - ρ)); + } else if (zr_dem.z == zg || zr_dem.isLeaf(zg, xg, yg)) { + // 標高代表値が確定した + // assert: ze == zg - ρ + this._prev_Za_dem = this; + } + } + /** + * @summary 標高代表値を計算 (Zg >= ρ && L(Za)) + * @param {mapray.DemBinary} za_dem レベルが Za の DEM + * @private + */ + + }, { + key: "_estimate_leaf", + value: function _estimate_leaf(za_dem) { + var zg = this.z; + var xg = this.x; + var yg = this.y; + var ze = za_dem.z; // -> za + + var xe = za_dem.x; + var ye = za_dem.y; + var pow = Math.pow(2, ze - zg); + var size = 1 << this._globe._ρ; + var u = Math.floor(size * ((xg + 0.5) * pow - xe)); + var v = Math.floor(size * ((yg + 0.5) * pow - ye)); + var smin = size * (xg * pow - xe) - u; + var smax = size * ((xg + 1) * pow - xe) - u; + var tmin = size * (yg * pow - ye) - v; + var tmax = size * ((yg + 1) * pow - ye) - v; + var heights = za_dem.getHeights(u, v); + var h00 = heights[0]; + var h10 = heights[1]; + var h01 = heights[2]; + var h11 = heights[3]; // Hi = Di( Za ) + + var h0 = (h00 * (1 - smin) + h10 * smin) * (1 - tmin) + (h01 * (1 - smin) + h11 * smin) * tmin; + var h1 = (h00 * (1 - smax) + h10 * smax) * (1 - tmin) + (h01 * (1 - smax) + h11 * smax) * tmin; + var h2 = (h00 * (1 - smin) + h10 * smin) * (1 - tmax) + (h01 * (1 - smin) + h11 * smin) * tmax; + var h3 = (h00 * (1 - smax) + h10 * smax) * (1 - tmax) + (h01 * (1 - smax) + h11 * smax) * tmax; + this._base_height = 0.25 * (h0 + h1 + h2 + h3); + this._height_min = Math.min(h0, h1, h2, h3); + this._height_max = Math.max(h0, h1, h2, h3); // 標高代表値が確定した + + this._prev_Za_dem = this; + } + /** + * @summary α を計算 + * @desc + *

中間緯度の標高 0 での緯線の長さを示す値 α を計算する。

+ * @return {number} α + * @private + */ + + }, { + key: "_calcAlpha", + value: function _calcAlpha() { + var pow = Math.pow(2, 1 - this.z); + return pow * Flake.πr / Math.cosh((1 - pow * (this.y + 0.5)) * Math.PI); + } + /** + * @summary 境界箱を更新 (Z == 0) + */ + + }, { + key: "_updataBoundingBox_0", + value: function _updataBoundingBox_0() { + var r = GeoMath.EARTH_RADIUS + this._height_max; + this._gocs_x_min = -r; + this._gocs_x_max = r; + this._gocs_y_min = -r; + this._gocs_y_max = r; + this._gocs_z_min = -r; + this._gocs_z_max = r; + } + /** + * @summary 境界箱を更新 (Z == 1) + */ + + }, { + key: "_updataBoundingBox_1", + value: function _updataBoundingBox_1() { + var r = GeoMath.EARTH_RADIUS + this._height_max; + var x = this.x; + var y = this.y; + this._gocs_x_min = -r; + this._gocs_x_max = r; + this._gocs_y_min = r * (x - 1); + this._gocs_y_max = r * x; + this._gocs_z_min = -r * y; + this._gocs_z_max = r * (1 - y); + } + /** + * @summary 境界箱を更新 (Z >= 2) + */ + + }, { + key: "_updataBoundingBox_N", + value: function _updataBoundingBox_N() { + var pi = Math.PI; + var z = this.z; + var x = this.x; + var y = this.y; // 座標範囲 (単位球メルカトル座標系) + + var msize = Math.pow(2, 1 - z) * pi; + var mx_min = -pi + x * msize; + var mx_max = -pi + (x + 1) * msize; + var my_min = pi - (y + 1) * msize; + var my_max = pi - y * msize; // 事前計算変数 + + var λmin = mx_min; + var λmax = mx_max; + var emin = Math.exp(my_min); // Exp[my_min] + + var emax = Math.exp(my_max); // Exp[my_max] + + var e2min = emin * emin; // Exp[my_min]^2 + + var e2max = emax * emax; // Exp[my_max]^2 + // 座標範囲 (地心直交座標系) + // + // z >= 2 のとき、λとφの範囲は以下の区間のどれかに入る + // φ: (-π/2, 0] [0, π/2) + // λ: [-π, -π/2] [-π/2, 0] [0, π/2] [π/2, π] + // + // 区間ごとの関数の変化 (各区間で単調増加または単調減少) + // Sin[φ]: (-1 → 0] [0 → 1) + // Cos[φ]: ( 0 → 1] [1 → 0) + // Sin[λ]: [ 0 → -1] [-1 → 0] [0 → 1] [1 → 0] + // Cos[λ]: [-1 → 0] [ 0 → 1] [1 → 0] [0 → -1] + + var rmin = GeoMath.EARTH_RADIUS + this._height_min; + var rmax = GeoMath.EARTH_RADIUS + this._height_max; + var cosφmin = 2 * emin / (e2min + 1); + var cosφmax = 2 * emax / (e2max + 1); // gx = r Cos[φ] Cos[λ] + // gy = r Cos[φ] Sin[λ] + // gz = r Sin[φ] + + if (my_min + my_max < 0) { + // φ : (-π/2, 0] + if (λmin + λmax < -pi) { + // λ : [-π, -π/2] + this._gocs_x_min = rmax * cosφmax * Math.cos(λmin); + this._gocs_x_max = rmin * cosφmin * Math.cos(λmax); + this._gocs_y_min = rmax * cosφmax * Math.sin(λmax); + this._gocs_y_max = rmin * cosφmin * Math.sin(λmin); + } else if (λmin + λmax < 0) { + // λ : [-π/2, 0] + this._gocs_x_min = rmin * cosφmin * Math.cos(λmin); + this._gocs_x_max = rmax * cosφmax * Math.cos(λmax); + this._gocs_y_min = rmax * cosφmax * Math.sin(λmin); + this._gocs_y_max = rmin * cosφmin * Math.sin(λmax); + } else if (λmin + λmax < pi) { + // λ : [0, π/2] + this._gocs_x_min = rmin * cosφmin * Math.cos(λmax); + this._gocs_x_max = rmax * cosφmax * Math.cos(λmin); + this._gocs_y_min = rmin * cosφmin * Math.sin(λmin); + this._gocs_y_max = rmax * cosφmax * Math.sin(λmax); + } else { + // λ : [π/2, π] + this._gocs_x_min = rmax * cosφmax * Math.cos(λmax); + this._gocs_x_max = rmin * cosφmin * Math.cos(λmin); + this._gocs_y_min = rmin * cosφmin * Math.sin(λmax); + this._gocs_y_max = rmax * cosφmax * Math.sin(λmin); + } + + this._gocs_z_min = rmax * (e2min - 1) / (e2min + 1); + this._gocs_z_max = rmin * (e2max - 1) / (e2max + 1); + } else { + // φ : [0, π/2) + if (λmin + λmax < -pi) { + // λ : [-π, -π/2] + this._gocs_x_min = rmax * cosφmin * Math.cos(λmin); + this._gocs_x_max = rmin * cosφmax * Math.cos(λmax); + this._gocs_y_min = rmax * cosφmin * Math.sin(λmax); + this._gocs_y_max = rmin * cosφmax * Math.sin(λmin); + } else if (λmin + λmax < 0) { + // λ : [-π/2, 0] + this._gocs_x_min = rmin * cosφmax * Math.cos(λmin); + this._gocs_x_max = rmax * cosφmin * Math.cos(λmax); + this._gocs_y_min = rmax * cosφmin * Math.sin(λmin); + this._gocs_y_max = rmin * cosφmax * Math.sin(λmax); + } else if (λmin + λmax < pi) { + // λ : [0, π/2] + this._gocs_x_min = rmin * cosφmax * Math.cos(λmax); + this._gocs_x_max = rmax * cosφmin * Math.cos(λmin); + this._gocs_y_min = rmin * cosφmax * Math.sin(λmin); + this._gocs_y_max = rmax * cosφmin * Math.sin(λmax); + } else { + // λ : [π/2, π] + this._gocs_x_min = rmax * cosφmin * Math.cos(λmax); + this._gocs_x_max = rmin * cosφmax * Math.cos(λmin); + this._gocs_y_min = rmin * cosφmax * Math.sin(λmax); + this._gocs_y_max = rmax * cosφmin * Math.sin(λmin); + } + + this._gocs_z_min = rmin * (e2min - 1) / (e2min + 1); + this._gocs_z_max = rmax * (e2max - 1) / (e2max + 1); + } + } + /** + * サーバーにさらに正確度が高い DEM タイルデータが存在すれば、それをリクエストする。 + * @param {number} xt X 座標 (基底タイル座標系) + * @param {number} yt Y 座標 (基底タイル座標系) + * @private + */ + + }, { + key: "_requestHighestAccuracy", + value: function _requestHighestAccuracy(xt, yt) { + var qlevel = this._dem_data.getQuadLevelDirect(xt, yt); + + if (qlevel == 0) { + // さらに正確度が高い DEM タイルデータは存在しない + return; + } + + var flake = this; + var size = Math.round(Math.pow(2, this.z + 1)); + var xf = size * xt; + var yf = size * yt; + + for (var i = 0; i < qlevel; ++i) { + var u = GeoMath.clamp(Math.floor(xf), 0, size - 1) % 2; + var v = GeoMath.clamp(Math.floor(yf), 0, size - 1) % 2; + flake = flake.newChild(u, v); + size *= 2; + xf *= 2; + yf *= 2; + } + + flake._requestAncestorDemTile(flake.z); + } + /** + * @summary 地表断片とレイの交点までの距離を検索 + *

地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点までの距離を返す。

+ *

ただし地表断片と線分が交差しないときは limit を返す。

+ * @private + */ + + }, { + key: "_findQuadRayDistance", + value: function _findQuadRayDistance(ray, limit, dem_flake) { + var pts = this._getQuadPositions(dem_flake, Flake._temp_positions); + + var dist = Flake._findTriRayDistance(ray, limit, pts[0], pts[2], pts[1]); + + return dist === limit ? Flake._findTriRayDistance(ray, limit, pts[1], pts[2], pts[3]) : dist; + } + /** + * @summary 三角形とレイの交点までの距離を検索 + *

三角形 p0, p1, p2 と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点までの距離を返す。

+ *

ただし地表断片と線分が交差しないときは limit を返す。

+ * @private + */ + + }, { + key: "_getQuadPositions", + + /** + * @summary 四隅の位置を取得 + * @param {mapray.Globe.Flake} dem_flake DEM の地表断片 + * @param {array} positions 結果の格納先 + * @return {array} positions = [左上, 右上, 左下, 右下] + * @private + */ + value: function _getQuadPositions(dem_flake, positions) { + var xg = this.x; + var yg = this.y; + var xe = dem_flake.x; + var ye = dem_flake.y; + var size = 1 << this._globe._ρ; + + var heights = dem_flake._dem_data.getHeights(xg - size * xe, yg - size * ye); + + var msize = Math.pow(2, 1 - this.z) * Math.PI; + var mx0 = xg * msize - Math.PI; + var my0 = Math.PI - yg * msize; + + for (var iv = 0, my = my0; iv < 2; ++iv, my -= msize) { + var ey = Math.exp(my); + var ey2 = ey * ey; + var sinφ = (ey2 - 1) / (ey2 + 1); + var cosφ = 2 * ey / (ey2 + 1); + + for (var iu = 0, mx = mx0; iu < 2; ++iu, mx += msize) { + var index = iu + 2 * iv; + var radius = GeoMath.EARTH_RADIUS + heights[index]; + var sinλ = Math.sin(mx); + var cosλ = Math.cos(mx); + var pos = positions[index]; + pos[0] = radius * cosφ * cosλ; + pos[1] = radius * cosφ * sinλ; + pos[2] = radius * sinφ; + } + } + + return positions; + } + /** + * @summary 地表断片とレイの交点までの距離を検索 + *

地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) が交差しないときは true, 交差するまたは不明のとき false を返す。 + * @private + */ + + }, { + key: "_cullForRayDistance", + value: function _cullForRayDistance(ray, limit) { + var q = ray.position; + var qx = q[0]; + var qy = q[1]; + var qz = q[2]; + var xmin = this._gocs_x_min; + var xmax = this._gocs_x_max; + var ymin = this._gocs_y_min; + var ymax = this._gocs_y_max; + var zmin = this._gocs_z_min; + var zmax = this._gocs_z_max; + + if (xmin <= qx && qx <= xmax && ymin <= qy && qy <= ymax && zmin <= qz && qz <= zmax) { + // ray の始点が AABB の表面または内部 -> 交差する可能性がある + return false; + } + + var v = ray.direction; + var vx = v[0]; + var vy = v[1]; + var vz = v[2]; + var t; + var px; + var py; + var pz; // yz + + if (qx < xmin && vx > 0) { + t = (xmin - qx) / vx; + + if (t < limit) { + py = qy + t * vy; + pz = qz + t * vz; + + if (ymin <= py && py <= ymax && zmin <= pz && pz <= zmax) { + // ray 線分は AABB の xmin 面内で交差 + return false; + } + } + } else if (qx > xmax && vx < 0) { + t = (xmax - qx) / vx; + + if (t < limit) { + py = qy + t * vy; + pz = qz + t * vz; + + if (ymin <= py && py <= ymax && zmin <= pz && pz <= zmax) { + // ray 線分は AABB の xmax 面内で交差 + return false; + } + } + } // xz + + + if (qy < ymin && vy > 0) { + t = (ymin - qy) / vy; + + if (t < limit) { + px = qx + t * vx; + pz = qz + t * vz; + + if (xmin <= px && px <= xmax && zmin <= pz && pz <= zmax) { + // ray 線分は AABB の ymin 面内で交差 + return false; + } + } + } else if (qy > ymax && vy < 0) { + t = (ymax - qy) / vy; + + if (t < limit) { + px = qx + t * vx; + pz = qz + t * vz; + + if (xmin <= px && px <= xmax && zmin <= pz && pz <= zmax) { + // ray 線分は AABB の ymax 面内で交差 + return false; + } + } + } // xy + + + if (qz < zmin && vz > 0) { + t = (zmin - qz) / vz; + + if (t < limit) { + px = qx + t * vx; + py = qy + t * vy; + + if (xmin <= px && px <= xmax && ymin <= py && py <= ymax) { + // ray 線分は AABB の zmin 面内で交差 + return false; + } + } + } else if (qz > zmax && vz < 0) { + t = (zmax - qz) / vz; + + if (t < limit) { + px = qx + t * vx; + py = qy + t * vy; + + if (xmin <= px && px <= xmax && ymin <= py && py <= ymax) { + // ray 線分は AABB の zmax 面内で交差 + return false; + } + } + } // ray 線分と AABB は交差しない + + + return true; + } + /** + * @summary エンティティのメッシュを削除 + * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + * + * @private + */ + + }, { + key: "_removeEntityMeshes", + value: function _removeEntityMeshes(producer) { + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = this._meshes[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var node = _step6.value; + node.removeEntityMesh(producer); + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + } + /** + * @summary エンティティ辞書を取得 + * + * @return {Map.} + * + * @private + */ + + }, { + key: "_getEntityMap", + value: function _getEntityMap() { + if (this._entity_map === null) { + // 存在しないので新たに生成する + var parent_map = this._parent._getEntityMap(); // 親の辞書 + + + var entity_map = new Map(); + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = parent_map[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var _step7$value = _slicedToArray(_step7.value, 2), + producer = _step7$value[0], + isfull = _step7$value[1]; + + if (isfull) { + // 親が FULL なので、子も FULL + entity_map.set(producer, true); + } else { + switch (producer.getAreaStatus(this)) { + case Entity.AreaStatus.PARTIAL: + entity_map.set(producer, false); + break; + + case Entity.AreaStatus.FULL: + entity_map.set(producer, true); + break; + + default: + // Entity.AreaStatus.EMPTY + break; + } + } + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + + this._entity_map = entity_map; + } + + return this._entity_map; + } + }, { + key: "base_height", + get: function get() { + return this._base_height; + } + /** + * 最小の標高 + * @type {number} + * @readonly + */ + + }, { + key: "height_min", + get: function get() { + return this._height_min; + } + /** + * 最大の標高 + * @type {number} + * @readonly + */ + + }, { + key: "height_max", + get: function get() { + return this._height_max; + } + }], [{ + key: "_findTriRayDistance", + value: function _findTriRayDistance(ray, limit, p0, p1, p2) { + var v = ray.direction; // P1 - P0 + + var p1_p0 = Flake._temp_ray_1; + p1_p0[0] = p1[0] - p0[0]; + p1_p0[1] = p1[1] - p0[1]; + p1_p0[2] = p1[2] - p0[2]; // P2 - P0 + + var p2_p0 = Flake._temp_ray_2; + p2_p0[0] = p2[0] - p0[0]; + p2_p0[1] = p2[1] - p0[1]; + p2_p0[2] = p2[2] - p0[2]; // N = (P1 − P0) × (P2 − P0) + + var n = GeoMath.cross3(p1_p0, p2_p0, Flake._temp_ray_3); // N . V + + var nv = GeoMath.dot3(n, v); + + if (nv < 0) { + var q = ray.position; // P0 - Q + + var p0_q = Flake._temp_ray_4; + p0_q[0] = p0[0] - q[0]; + p0_q[1] = p0[1] - q[1]; + p0_q[2] = p0[2] - q[2]; // N . (P0 - Q) + // t = -------------- + // N . V + + var t = GeoMath.dot3(n, p0_q) / nv; + + if (t >= 0 && t < limit) { + // P = Q + t V + var p = Flake._temp_ray_5; + p[0] = q[0] + t * v[0]; + p[1] = q[1] + t * v[1]; + p[2] = q[2] + t * v[2]; // P0 - P + + var p0_p = Flake._temp_ray_6; + p0_p[0] = p0[0] - p[0]; + p0_p[1] = p0[1] - p[1]; + p0_p[2] = p0[2] - p[2]; // P1 - P + + var p1_p = Flake._temp_ray_7; + p1_p[0] = p1[0] - p[0]; + p1_p[1] = p1[1] - p[1]; + p1_p[2] = p1[2] - p[2]; // P2 - P + + var p2_p = Flake._temp_ray_8; + p2_p[0] = p2[0] - p[0]; + p2_p[1] = p2[1] - p[1]; + p2_p[2] = p2[2] - p[2]; // ((P0 - P) × (P1 - P)) . N >= 0 + // ((P1 - P) × (P2 - P)) . N >= 0 + // ((P2 - P) × (P0 - P)) . N >= 0 + + if (GeoMath.dot3(GeoMath.cross3(p0_p, p1_p, Flake._temp_ray_9), n) >= 0 && GeoMath.dot3(GeoMath.cross3(p1_p, p2_p, Flake._temp_ray_10), n) >= 0 && GeoMath.dot3(GeoMath.cross3(p2_p, p0_p, Flake._temp_ray_11), n) >= 0) { + return t; + } + } + } + + return limit; + } + }]); + + return Flake; +}(); +/** + * @summary 球面分割数の係数 + * @type {number} + * @constant + */ + + +Flake.ε = 0.0625; +/** + * @summary 標高下限係数 + * @type {number} + * @constant + */ + +Flake.Fm = -2.0; +/** + * @summary 標高上限係数 + * @type {number} + * @constant + */ + +Flake.Fp = 2.0; +Flake.πr = Math.PI * GeoMath.EARTH_RADIUS; + +Flake._temp_positions = function () { + var p = []; + + for (var i = 0; i < 4; ++i) { + p.push(GeoMath.createVector3()); + } + + return p; +}(); + +Flake._temp_ray_1 = GeoMath.createVector3(); +Flake._temp_ray_2 = GeoMath.createVector3(); +Flake._temp_ray_3 = GeoMath.createVector3(); +Flake._temp_ray_4 = GeoMath.createVector3(); +Flake._temp_ray_5 = GeoMath.createVector3(); +Flake._temp_ray_6 = GeoMath.createVector3(); +Flake._temp_ray_7 = GeoMath.createVector3(); +Flake._temp_ray_8 = GeoMath.createVector3(); +Flake._temp_ray_9 = GeoMath.createVector3(); +Flake._temp_ray_10 = GeoMath.createVector3(); +Flake._temp_ray_11 = GeoMath.createVector3(); +/** + * @summary 履歴統計 + * @memberof mapray.Globe + * @private + */ + +var HistStats = +/*#__PURE__*/ +function () { + function HistStats() { + _classCallCheck(this, HistStats); + + this._history = []; + this._max_value = 0; + this._hsize = 200; // >= 3 + } + /** + * @summary 最大値を取得 + */ + + + _createClass(HistStats, [{ + key: "getMaxValue", + value: function getMaxValue(value) { + var history = this._history; + var old_max = this._max_value; + + if (history.length < this._hsize) { + // 追加のみ + if (value > old_max) { + this._max_value = value; + } + } else { + // 追加と削除 + if (value >= old_max) { + // 最大値は value に変わる + this._max_value = value; + history.shift(); + } else if (history[0] < old_max) { + // 最大値は変わらず + history.shift(); + } else { + // 最大値は変わる可能性がある + history.shift(); + this._max_value = HistStats._find_max(history); + } + } + + history.push(value); + return this._max_value; + } + }], [{ + key: "_find_max", + value: function _find_max(history) { + var max_value = history[0]; + var length = history.length; + + for (var i = 1; i < length; ++i) { + var value = history[i]; + + if (value > max_value) { + max_value = value; + } + } + + return max_value; + } + }]); + + return HistStats; +}(); +/** + * @summary メッシュ管理ノード + * @memberof mapray.Globe + * @private + */ + + +var MeshNode = +/*#__PURE__*/ +function () { + /** + * @summary 初期化 + * @param {mapray.Globe.Flake} flake 所有者 + * @param {mapray.DemBinary} dem DEM バイナリ + * @param {number[]} dpows 分割指数 + */ + function MeshNode(flake, dem, dpows) { + _classCallCheck(this, MeshNode); + + this._flake = flake; + this._dem = dem; + this._dpows = Array.from(dpows); + this._aframe = -1; // 地表のメッシュ + + this._base_mesh = new FlakeMesh(flake._globe.glenv, flake, dpows, dem); // エンティティのメッシュ + // key: FlakePrimitiveProducer + // value: Mesh | CACHED_EMPTY_MESH + + this._entity_meshes = new Map(); // メッシュ数をカウントアップ + + flake._globe._num_cache_meshes += 1; + } + /** + * @summary FlakeRenderObject インスタンスを取得 + * + * @return {mapray.FlakeRenderObject} + */ + + + _createClass(MeshNode, [{ + key: "getRenderObject", + value: function getRenderObject() { + var flake = this._flake; + var fro = new FlakeRenderObject(flake, flake._globe.glenv, this._base_mesh); // fro にエンティティ毎のデータを追加 + + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; + + try { + for (var _iterator8 = flake.getEntityProducers()[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var producer = _step8.value; + + // producer に対応するキャッシュされた Mesh + var mesh = this._getEntityMesh(producer); + + if (mesh === CACHED_EMPTY_MESH) { + // 空メッシュとしてキャッシュされている --> fro に追加しない + continue; + } + + if (mesh === null) { + // メッシュがキャッシュに存在しないので、メッシュを生成してキャッシュする + mesh = producer.createMesh(flake, this._dpows, this._dem); + + this._setEntityMesh(producer, mesh); + + if (mesh === null) { + // 空メッシュとしてキャッシュされた --> fro に追加しない + continue; + } + } // fro にエンティティを追加 + + + fro.addEntityData(mesh, producer); + } + } catch (err) { + _didIteratorError8 = true; + _iteratorError8 = err; + } finally { + try { + if (!_iteratorNormalCompletion8 && _iterator8["return"] != null) { + _iterator8["return"](); + } + } finally { + if (_didIteratorError8) { + throw _iteratorError8; + } + } + } + + return fro; + } + /** + * @summary 一致するか? + * @param {mapray.DemBinary} dem DEM バイナリ + * @param {number[]} dpows 分割指数 + * @return {boolean} 一致するとき true, 一致しないとき false + */ + + }, { + key: "match", + value: function match(dem, dpows) { + return this._dem === dem && this._dpows[0] === dpows[0] && this._dpows[1] === dpows[1]; + } + /** + * @summary アクセスフレームを更新 + */ + + }, { + key: "touch", + value: function touch() { + var globe = this._flake._globe; + + if (this._aframe !== globe._frame_counter) { + this._aframe = globe._frame_counter; + globe._num_touch_meshes += 1; + } + } + /** + * @summary ノードを破棄 + */ + + }, { + key: "dispose", + value: function dispose() { + if (this._base_mesh === null) { + // すでに破棄されている + return; + } + + var flake = this._flake; // Flake から this ノードを削除 + + var meshes = flake._meshes; + var length = meshes.length; + + for (var i = 0; i < length; ++i) { + if (meshes[i] === this) { + meshes.splice(i, 1); + break; + } + } // メッシュを破棄 + + + this._base_mesh.dispose(); + + this._base_mesh = null; + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; + + try { + for (var _iterator9 = this._entity_meshes.values()[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { + var mesh = _step9.value; + + if (mesh instanceof Mesh) { + mesh.dispose(); + } + } // メッシュ数をカウントダウン + + } catch (err) { + _didIteratorError9 = true; + _iteratorError9 = err; + } finally { + try { + if (!_iteratorNormalCompletion9 && _iterator9["return"] != null) { + _iterator9["return"](); + } + } finally { + if (_didIteratorError9) { + throw _iteratorError9; + } + } + } + + flake._globe._num_cache_meshes -= 1; + } + /** + * @summary 削減用の MeshNode 比較 + * @param {mapray.Globe.MeshNode} other 比較対象 + * @return {number} 比較値 + * @package + */ + + }, { + key: "compareForReduce", + value: function compareForReduce(other) { + // 最近アクセスしたものを優先 + var a = this; + var b = other; + return b._aframe - a._aframe; + } + /** + * @summary エンティティのメッシュを削除 + * + * @desc + *

producer に対応するメッシュが存在すれば削除する。

+ * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + */ + + }, { + key: "removeEntityMesh", + value: function removeEntityMesh(producer) { + this._entity_meshes["delete"](producer); + } + /** + * @summary エンティティのメッシュを取得 + * + * @desc + *

producer に対応するメッシュを取得する。

+ *

ただし存在しないとき null, 空メッシュが設定されているときは CACHED_EMPTY_MESH を返す。

+ * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + * + * @return {?(mapray.Mesh|CACHED_EMPTY_MESH)} + * + * @private + */ + + }, { + key: "_getEntityMesh", + value: function _getEntityMesh(producer) { + var mesh = this._entity_meshes.get(producer); + + return mesh !== undefined ? mesh : null; + } + /** + * @summary エンティティのメッシュを設定 + * + * @desc + *

producer に対応するメッシュを設定する。

+ *

空メッシュを設定するときは mesh に null を指定する。

+ * + * @param {mapray.Entity.FlakePrimitiveProducer} producer + * @param {?mapray.Mesh} mesh + * + * @private + */ + + }, { + key: "_setEntityMesh", + value: function _setEntityMesh(producer, mesh) { + var value = mesh !== null ? mesh : CACHED_EMPTY_MESH; + + this._entity_meshes.set(producer, value); + } + }]); + + return MeshNode; +}(); +/** + * @summary DEM 状態の列挙型 + * @enum {object} + * @memberof mapray.Globe + * @constant + */ + + +var DemState = { + /** + * DEM タイルが存在しない + */ + NONE: { + id: "NONE" + }, + + /** + * DEM タイルが存在する + */ + LOADED: { + id: "LOADED" + }, + + /** + * DEM タイルをリクエスト中 + */ + REQUESTED: { + id: "REQUESTED" + }, + + /** + * DEM タイルのリクエストに失敗 + */ + FAILED: { + id: "FAILED" + } +}; +/** + * @summary キャッシュされた空メッシュを表す + * + * @memberof mapray.Globe + * @constant + */ + +var CACHED_EMPTY_MESH = { + id: "CACHED_EMPTY_MESH" +}; + +/** + * @summary 描画地表断片 + * @memberof mapray + * @private + */ +var RenderFlake = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Globe.Flake} flake 地表断片 + */ + function RenderFlake(flake) { + _classCallCheck(this, RenderFlake); + + /** + * @summary 地表断片 + * @member mapray.RenderFlake#flake + * @type {mapray.Globe.Flake} + */ + this.flake = flake; + /** + * @summary 地表詳細レベル (LOD) + * @member mapray.RenderFlake#lod + * @type {number} + */ + + /** + * @summary LOD (左下) + * @member mapray.RenderFlake#lod_00 + * @type {number} + */ + + /** + * @summary LOD (右下) + * @member mapray.RenderFlake#lod_10 + * @type {number} + */ + + /** + * @summary LOD (左上) + * @member mapray.RenderFlake#lod_01 + * @type {number} + */ + + /** + * @summary LOD (右上) + * @member mapray.RenderFlake#lod_11 + * @type {number} + */ + } + /** + * @summary レンダリングオブジェクトを検索 + * + * @return {mapray.FlakeRenderObject} + */ + + + _createClass(RenderFlake, [{ + key: "getRenderObject", + value: function getRenderObject() { + return this.flake.getRenderObject(this.lod); + } + }]); + + return RenderFlake; +}(); + +/** + * @summary 描画地表断片を収集するツール + * @memberof mapray.RenderStage + * @private + */ + +var FlakeCollector = +/*#__PURE__*/ +function () { + /** + * @param {mapray.RenderStage} stage 所有者である RenderStage + */ + function FlakeCollector(stage) { + _classCallCheck(this, FlakeCollector); + + this._setupViewVectors(stage); + + this._setupClipPlanes(stage); + + var viewer = stage._viewer; + var dem_provider = viewer.dem_provider; + var tile_texture_cache = viewer.tile_texture_cache; + this._min_image_z = tile_texture_cache.getImageZMin(); + var dem_zbias = GeoMath.LOG2PI - dem_provider.getResolutionPower() + 1; // b = log2π - ρ + 1 + + this._max_zbias = Math.max(tile_texture_cache.getImageZBias(), dem_zbias); + this._globe = viewer.globe; + this._rflake_list = []; // デバッグ統計 + + this._debug_stats = viewer.debug_stats; + + if (this._debug_stats) { + this._num_procA_flakes = 0; + this._num_procB_flakes = 0; + } // 事前生成オブジェクト + + + this._view_dir_N = GeoMath.createVector3(); + this._view_dir_V = GeoMath.createVector3(); + } + /** + * @private + */ + + + _createClass(FlakeCollector, [{ + key: "_setupViewVectors", + value: function _setupViewVectors(stage) { + var view_to_gocs = stage._view_to_gocs; + var pixel_step = stage._pixel_step; + var view_pos_Q = GeoMath.createVector3(); + var view_dir_wU = GeoMath.createVector3(); // 地表詳細レベル (LOD) 計算用の Q, w*U ベクトルを設定 + + view_pos_Q[0] = view_to_gocs[12]; + view_pos_Q[1] = view_to_gocs[13]; + view_pos_Q[2] = view_to_gocs[14]; + view_dir_wU[0] = -view_to_gocs[8] * pixel_step; + view_dir_wU[1] = -view_to_gocs[9] * pixel_step; + view_dir_wU[2] = -view_to_gocs[10] * pixel_step; + /** + * @summary 位置ベクトル Q + * @member mapray.FlakeCollector#_view_pos_Q + * @type {mapray.Vector3} + * @private + * @see doc/ImageLevelCalculation.txt + */ + + this._view_pos_Q = view_pos_Q; + /** + * @summary ベクトル w * U + * @member mapray.FlakeCollector#_view_dir_wU + * @type {mapray.Vector3} + * @private + * @see doc/ImageLevelCalculation.txt + */ + + this._view_dir_wU = view_dir_wU; + } + /** + * @private + */ + + }, { + key: "_setupClipPlanes", + value: function _setupClipPlanes(stage) { + var view_to_gocs = stage._view_to_gocs; + var gocs_to_view = stage._gocs_to_view; + var volume_planes = stage._volume_planes; + var clip_planes = []; // 地表遮蔽カリング平面 + + var root_flake = stage._viewer._globe.root_flake; + var rmin = GeoMath.EARTH_RADIUS + root_flake.height_min; // 最小半径 + + var rmax = GeoMath.EARTH_RADIUS + root_flake.height_max; // 最大半径 + // P (視点位置) + + var px = view_to_gocs[12]; + var py = view_to_gocs[13]; + var pz = view_to_gocs[14]; // q = √[(P.P - rmin^2)(rmax^2 - rmin^2)] - rmin^2 + + var p2 = px * px + py * py + pz * pz; + var rmin2 = rmin * rmin; + var rmax2 = rmax * rmax; + var q = Math.sqrt((p2 - rmin2) * (rmax2 - rmin2)) - rmin2; // L = / ‖P‖ + + var plane = GeoMath.createVector4(); + var recip = 1 / Math.sqrt(p2); + plane[0] = px * recip; + plane[1] = py * recip; + plane[2] = pz * recip; + plane[3] = q * recip; + clip_planes.push(plane); // L を基とした遠方距離 + + var far_dist = Math.sqrt(p2 + rmax2 + 2 * q); // 視体積平面を取得して、地心直交座標系に変換 + // (直交変換なので x, y, z は正規化されている) + + for (var i = 0; i < 6; ++i) { + var src_plane = volume_planes[i]; + var dst_plane = GeoMath.createVector4(); + + if (i == 1 && src_plane[3] > far_dist) { + // 遠方平面が必要以上に遠いとき far_dist に置き換える + src_plane = GeoMath.createVector4(src_plane); + src_plane[3] = far_dist; + } + + GeoMath.transformPlane_A(gocs_to_view, src_plane, dst_plane); + clip_planes.push(dst_plane); + } + + this._clip_planes = clip_planes; + } + /** + * @summary 描画地表断片を収集 + * @return {mapray.RenderFlake[]} 収集され描画地表断片の集合 + */ + + }, { + key: "traverse", + value: function traverse() { + this._collectFlakes(this._globe.root_flake); // デバッグ統計 + + + if (this._debug_stats) { + this._debug_stats.num_procA_flakes = this._num_procA_flakes; + this._debug_stats.num_procB_flakes = this._num_procB_flakes; + } + + return this._rflake_list; + } + /** + * @private + */ + + }, { + key: "_collectFlakes", + value: function _collectFlakes(flake) { + if (this._debug_stats !== null) { + this._num_procA_flakes += 1; + } + + if (flake.isInvisible(this._clip_planes)) { + // 地表タイルが見えないので描画しない + return; + } + + if (flake.z < this._min_image_z) { + // 地表タイルより小さな画像タイルしかない + this._collectNextLevelFlakes(flake); // 地表タイルを分割 + + + return; + } + + if (this._debug_stats !== null) { + this._num_procB_flakes += 1; + } // 地表断片の詳細レベルの範囲 + + + var range = this._getLevelOfDetailRange(flake); + + var zt = range.mid + this._max_zbias; // 最大タイルレベル + + if (range.max - range.min > FlakeCollector.MAX_LOD_INTERVAL || zt > flake.z) { + // 地表断片の LOD 幅が閾値より大きい + // or 最大タイルレベル > 地表断片レベル + this._collectNextLevelFlakes(flake); // 地表断片を分割 + + + return; + } // リストに RenderFlake を追加 + + + this._addRenderFlake(flake, range); + } + /** + * @private + */ + + }, { + key: "_collectNextLevelFlakes", + value: function _collectNextLevelFlakes(flake) { + for (var v = 0; v < 2; ++v) { + for (var u = 0; u < 2; ++u) { + this._collectFlakes(flake.newChild(u, v)); + } + } + } + /** + * @summary 地表断片の詳細レベルの範囲を取得 + * @private + */ + + }, { + key: "_getLevelOfDetailRange", + value: function _getLevelOfDetailRange(flake) { + var pi = Math.PI; + var z = flake.z; + var x = flake.x; + var y = flake.y; // 座標範囲 (単位球メルカトル座標系) + + var msize = Math.pow(2, 1 - z) * pi; + var mx_min = -pi + x * msize; + var my_min = pi - (y + 1) * msize; + var max_mstep = pi / 32; + var mcount = Math.ceil(msize / max_mstep); + var mstep = msize / mcount; + var r = GeoMath.EARTH_RADIUS + flake.base_height; + var Q = this._view_pos_Q; + var wU = this._view_dir_wU; + var N = this._view_dir_N; + var V = this._view_dir_V; + var dMin = Number.MAX_VALUE; + var dMax = -Number.MAX_VALUE; + + for (var iy = 0, my = my_min; iy < mcount + 1; ++iy, my += mstep) { + var ey = Math.exp(my); + var ey2 = ey * ey; + var sinφ = (ey2 - 1) / (ey2 + 1); + var cosφ = 2 * ey / (ey2 + 1); + var denom = 1 / (r * cosφ); + + for (var ix = 0, mx = mx_min; ix < mcount + 1; ++ix, mx += mstep) { + var sinλ = Math.sin(mx); + var cosλ = Math.cos(mx); // N + + N[0] = cosφ * cosλ; + N[1] = cosφ * sinλ; + N[2] = sinφ; // V = r N - Q + + V[0] = r * N[0] - Q[0]; + V[1] = r * N[1] - Q[1]; + V[2] = r * N[2] - Q[2]; // w U.V + + var wUV = GeoMath.dot3(wU, V); + + if (wUV <= 0) { + // 頂点が視点の後ろ側 + return { + min: -1000, + max: 1000, + mid: 0 + }; + } // w U.(r N - Q) + // d = --------------- + // r Cos[φ] + + + var deriv = wUV * denom; // 最大最小を更新 + + dMin = Math.min(dMin, deriv); + dMax = Math.max(dMax, deriv); + } + } + + var lodMin = -Math.maprayLog2(dMax); // Log2[1/dMax] + + var lodMax = -Math.maprayLog2(dMin); // Log2[1/dMin] + + return { + min: lodMin, + max: lodMax, + mid: (lodMin + lodMax) / 2 + }; + } + /** + * @summary 単位球メルカトル座標 x, y の地表詳細レベルを計算 + * @desc + *

以下の値が設定されていなければならない。

+ *
    + *
  • this._view_pos_Q
  • + *
  • this._view_dir_wU
  • + *
+ * @param {number} x X 座標 + * @param {number} y Y 座標 + * @param {number} r GOGS 原点からの距離 (Meters) + * @return {number} 地表詳細レベル + * @private + */ + + }, { + key: "_calcLOD", + value: function _calcLOD(x, y, r) { + var sinλ = Math.sin(x); + var cosλ = Math.cos(x); + var ey = Math.exp(y); + var ey2 = ey * ey; + var sinφ = (ey2 - 1) / (ey2 + 1); + var cosφ = 2 * ey / (ey2 + 1); // N + + var N = this._view_dir_N; + N[0] = cosφ * cosλ; + N[1] = cosφ * sinλ; + N[2] = sinφ; // V = r N - Q + + var V = this._view_dir_V; + var Q = this._view_pos_Q; + V[0] = r * N[0] - Q[0]; + V[1] = r * N[1] - Q[1]; + V[2] = r * N[2] - Q[2]; // w U.V + + var wU = this._view_dir_wU; + var wUV = GeoMath.dot3(wU, V); // > 0 (表示される Flake 前提なので正数) + // r Cos[φ] + // 1/d = --------------- + // w U.(r N - Q) + + var inv_d = r * cosφ / wUV; // Log2[1/d] + + return Math.maprayLog2(inv_d); + } + /** + * @summary 四隅の LOD を設定 + * @desc + *

rflake に以下のプロパティを設定する。

+ *
    + *
  • rflake.lod_00
  • + *
  • rflake.lod_10
  • + *
  • rflake.lod_01
  • + *
  • rflake.lod_11
  • + *
+ * @private + */ + + }, { + key: "_setCornerLODs", + value: function _setCornerLODs(rflake) { + var pi = Math.PI; + var flake = rflake.flake; + var z = flake.z; + var x = flake.x; + var y = flake.y; // 座標範囲 (単位球メルカトル座標系) + + var msize = Math.pow(2, 1 - z) * pi; + var mx_min = -pi + x * msize; + var mx_max = -pi + (x + 1) * msize; + var my_min = pi - (y + 1) * msize; + var my_max = pi - y * msize; // GOCS 原点からの距離 + + var r = GeoMath.EARTH_RADIUS + flake.base_height; // 四隅の地表詳細レベル + + rflake.lod_00 = this._calcLOD(mx_min, my_min, r); + rflake.lod_10 = this._calcLOD(mx_max, my_min, r); + rflake.lod_01 = this._calcLOD(mx_min, my_max, r); + rflake.lod_11 = this._calcLOD(mx_max, my_max, r); + } + /** + * @summary 描画地表断片を追加 + * @private + */ + + }, { + key: "_addRenderFlake", + value: function _addRenderFlake(flake, range) { + var rflake = new RenderFlake(flake); + rflake.lod = range.mid; + + this._setCornerLODs(rflake); + + this._rflake_list.push(rflake); + } + }]); + + return FlakeCollector; +}(); +/** + * @summary Flake に対する LOD の許容幅 + * @desc + *

1つの Flake 全体に対する最小 LOD と最大 LOD の間の最大幅である。

+ *

有効な範囲は 0.0 < MAX_LOD_INTERVAL < 1.0 である。

+ * @type {number} + * @constant + */ + + +FlakeCollector.MAX_LOD_INTERVAL = 0.5; + +var nativeJoin = [].join; +var ES3_STRINGS = indexedObject != Object; +var STRICT_METHOD$3 = arrayMethodIsStrict('join', ','); // `Array.prototype.join` method +// https://tc39.github.io/ecma262/#sec-array.prototype.join + +_export({ + target: 'Array', + proto: true, + forced: ES3_STRINGS || !STRICT_METHOD$3 +}, { + join: function join(separator) { + return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator); + } +}); + +/** + * @summary WebGL シェーダラッパー + * @desc + * 頂点シェーダとフラグメントシェーダのセットである。 + * @memberof mapray + * @private + */ +var Shader = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {string} vs_code 頂点シェーダのソースコード + * @param {string} fs_code フラグメントシェーダのソースコード + * @exception {Error} コンパイルエラー + */ + function Shader(glenv, vs_code, fs_code) { + _classCallCheck(this, Shader); + + this._glenv = glenv; + + try { + /** + * @summary 頂点シェーダオブジェクト + * @member mapray.Shader#vs_object + * @type {WebGLShader} + * @readonly + */ + this.vs_object = this._compile_shader('VERTEX_SHADER', vs_code); + /** + * @summary フラグメントシェーダオブジェクト + * @member mapray.Shader#fs_object + * @type {WebGLShader} + * @readonly + */ + + this.fs_object = this._compile_shader('FRAGMENT_SHADER', fs_code); + } catch (e) { + var gl = glenv.context; + if (this.vs_object) gl.deleteShader(this.vs_object); + if (this.fs_object) gl.deleteShader(this.fs_object); + throw e; + } + } + /** + * @summary シェーダを破棄 + */ + + + _createClass(Shader, [{ + key: "dispose", + value: function dispose() { + var gl = this._glenv.context; + + if (this.vs_object) { + gl.deleteShader(this.vs_object); + this.vs_object = null; + } + + if (this.fs_object) { + gl.deleteShader(this.fs_object); + this.fs_object = null; + } + } + /** + * @summary シェーダをコンパイル + * @param {string} type 'VERTEX_SHADER' or 'FRAGMENT_SHADER' + * @param {string} source ソースコード文字列 + * @return {WebGLShader} コンパイルされたシェーダオブジェクト + * @exception {Error} コンパイルエラー + * @private + */ + + }, { + key: "_compile_shader", + value: function _compile_shader(type, source) { + var gl = this._glenv.context; + var shader = gl.createShader(gl[type]); + + if (!shader) { + throw new Error(type + " オブジェクトの生成に失敗しました"); + } + + try { + gl.shaderSource(shader, source); + gl.compileShader(shader); + + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + // コンパイルエラー + var log = gl.getShaderInfoLog(shader); + throw new Error(type + " のコンパイルに失敗: " + log); + } + } catch (e) { + gl.deleteShader(shader); + throw e; + } + + return shader; + } + }]); + + return Shader; +}(); + +/** + * @summary マテリアル + * @memberof mapray + * @private + */ + +var Material = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {string} vs_code 頂点シェーダのソースコード + * @param {string} fs_code フラグメントシェーダのソースコード + */ + function Material(glenv, vs_code, fs_code) { + _classCallCheck(this, Material); + + var shader = new Shader(glenv, vs_code, fs_code); + this._gl = glenv.context; + this._program = this._link_shaders(shader.vs_object, shader.fs_object); + this._vertex_attribs = this._create_vertex_attribs(); + this._uniform_location = this._create_uniform_location(); + shader.dispose(); + } + /** + * @summary シェーダをリンク + * @param {WebGLShader} vs 頂点シェーダ + * @param {WebGLShader} fs フラグメントシェーダ + * @return {WebGLProgram} リンクされたプログラムオブジェクト + * @exception {Error} リンクエラー + * @private + */ + + + _createClass(Material, [{ + key: "_link_shaders", + value: function _link_shaders(vs, fs) { + var gl = this._gl; + var program = gl.createProgram(); + + if (!program) { + throw new Error("プログラムオブジェクトの生成に失敗しました"); + } + + try { + gl.attachShader(program, vs); + gl.attachShader(program, fs); + gl.linkProgram(program); + + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + // リンクエラー + var log = gl.getProgramInfoLog(program); + gl.detachShader(program, fs); + gl.detachShader(program, vs); + throw new Error("シェーダのリンクに失敗: " + log); + } + } catch (e) { + gl.deleteProgram(program); + throw e; + } + + return program; + } + /** + * @summary 頂点属性情報を作成 + * + * @return {array} 頂点属性名前とロケーションの配列 + * @private + */ + + }, { + key: "_create_vertex_attribs", + value: function _create_vertex_attribs() { + var gl = this._gl; + var program = this._program; + var attribs = []; + var num_items = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + + for (var i = 0; i < num_items; ++i) { + var info = gl.getActiveAttrib(program, i); + var attrib = { + name: info.name, + location: gl.getAttribLocation(program, info.name) + }; + attribs.push(attrib); + } + + return attribs; + } + /** + * @summary uniform 変数のロケーション辞書を作成 + * + * @return {object} ロケーション辞書 + * @private + */ + + }, { + key: "_create_uniform_location", + value: function _create_uniform_location() { + var gl = this._gl; + var program = this._program; + var location = {}; // Uniform 変数のロケーション + + var num_items = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + + for (var i = 0; i < num_items; ++i) { + var info = gl.getActiveUniform(program, i); + location[info.name] = gl.getUniformLocation(program, info.name); + } + + return location; + } + /** + * @summary リソースを破棄 + */ + + }, { + key: "dispose", + value: function dispose() { + var gl = this._gl; + gl.deleteProgram(this._program); + this._program = null; + } + /** + * @summary プログラムを束縛 + */ + + }, { + key: "bindProgram", + value: function bindProgram() { + var gl = this._gl; + gl.useProgram(this._program); + } + /** + * @summary 真偽値パラメータを設定 + * @param {string} name 変数名 + * @param {boolean} value 真偽値 + */ + + }, { + key: "setBoolean", + value: function setBoolean(name, value) { + var location = this._uniform_location[name]; + + if (location) { + var gl = this._gl; + gl.uniform1i(location, value ? 1 : 0); + } + } + /** + * @summary 整数パラメータを設定 + * @param {string} name 変数名 + * @param {number} value 整数値 + */ + + }, { + key: "setInteger", + value: function setInteger(name, value) { + var location = this._uniform_location[name]; + + if (location) { + var gl = this._gl; + gl.uniform1i(location, value); + } + } + /** + * @summary float パラメータを設定 + * @param {string} name 変数名 + * @param {number} value float 値 + */ + + }, { + key: "setFloat", + value: function setFloat(name, value) { + var location = this._uniform_location[name]; + + if (location) { + var gl = this._gl; + gl.uniform1f(location, value); + } + } + /** + * @summary 2次ベクトルパラメータを設定 + * @param {string} name 変数名 + * @param {mapray.Vector2} value 2次ベクトル + */ + + }, { + key: "setVector2", + value: function setVector2(name, value) { + var location = this._uniform_location[name]; + + if (location) { + var gl = this._gl; + gl.uniform2fv(location, value); + } + } + /** + * @summary 3次ベクトルパラメータを設定 + * @param {string} name 変数名 + * @param {mapray.Vector3} value 3次ベクトル + */ + + }, { + key: "setVector3", + value: function setVector3(name, value) { + var location = this._uniform_location[name]; + + if (location) { + var gl = this._gl; + gl.uniform3fv(location, value); + } + } + /** + * @summary 4次ベクトルパラメータを設定 + * @param {string} name 変数名 + * @param {mapray.Vector4} value 4次ベクトル + */ + + }, { + key: "setVector4", + value: function setVector4(name, value) { + var location = this._uniform_location[name]; + + if (location) { + var gl = this._gl; + gl.uniform4fv(location, value); + } + } + /** + * @summary 行列パラメータを設定 + * @param {string} name 変数名 + * @param {mapray.Matrix} value 行列 + */ + + }, { + key: "setMatrix", + value: function setMatrix(name, value) { + var location = this._uniform_location[name]; + + if (location) { + var gl = this._gl; + gl.uniformMatrix4fv(location, false, value); + } + } + /** + * @summary 頂点属性データを束縛 + * + * @desc + *

mesh_attribs は頂点属性名から Mesh.AttribData インスタンスを取得する辞書である。

+ * + * @param {object} mesh_attribs メッシュ側の頂点属性データの辞書 + */ + + }, { + key: "bindVertexAttribs", + value: function bindVertexAttribs(mesh_attribs) { + var gl = this._gl; + var mtl_attribs = this._vertex_attribs; // マテリアル側の頂点属性データ配列 + + var num_attribs = mtl_attribs.length; + + for (var i = 0; i < num_attribs; ++i) { + var mtl_attrib = mtl_attribs[i]; + var mesh_attrib = mesh_attribs[mtl_attrib.name]; + var location = mtl_attrib.location; + + if (mesh_attrib !== undefined) { + // 頂点属性データを束縛 + gl.bindBuffer(gl.ARRAY_BUFFER, mesh_attrib.buffer); + gl.enableVertexAttribArray(location); + gl.vertexAttribPointer(location, mesh_attrib.num_components, mesh_attrib.component_type, mesh_attrib.normalized, mesh_attrib.byte_stride, mesh_attrib.byte_offset); + } else { + // メッシュ側に必要な頂点属性がないとき + gl.disableVertexAttribArray(location); + } + } + } + /** + * @summary テクスチャをバインド + * @desc + *

注意: 現行テクスチャ (Active Texture) も変更される。

+ * @param {number} unit テクスチャユニット番号 + * @param {WebGLTexture} texture テクスチャオブジェクト + */ + + }, { + key: "bindTexture2D", + value: function bindTexture2D(unit, texture) { + var gl = this._gl; + gl.activeTexture(gl.TEXTURE0 + unit); + gl.bindTexture(gl.TEXTURE_2D, texture); + } + }]); + + return Material; +}(); + +/** + * @summary 地表断片マテリアル + * @memberof mapray.RenderStage + * @extends mapray.Material + * @private + */ + +var FlakeMaterial = +/*#__PURE__*/ +function (_Material) { + _inherits(FlakeMaterial, _Material); + + /** + * @param {mapray.Viewer} viewer 所有者である Viewer + * @param {string} vs_code 頂点シェーダのソースコード + * @param {string} fs_code フラグメントシェーダのソースコード + */ + function FlakeMaterial(viewer, vs_code, fs_code) { + var _this; + + _classCallCheck(this, FlakeMaterial); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(FlakeMaterial).call(this, viewer.glenv, vs_code, fs_code)); // シェーダ用の事前生成オブジェクト + + _this._flake_to_clip = GeoMath.createMatrixf(); + return _this; + } + /** + * @summary 描画回数 + * @return {number} + * @abstract + */ + + + _createClass(FlakeMaterial, [{ + key: "numDrawings", + value: function numDrawings() { + return 1; + } + /** + * @summary ワイヤーフレーム表示か? + * @return {boolean} + * @abstract + */ + + }, { + key: "isWireframe", + value: function isWireframe() { + return false; + } + /** + * @summary 地表断片のパラメータを設定 + * + * @param {mapray.RenderStage} stage 呼び出し側オブジェクト + * @param {mapray.RenderFlake} rflake 描画地表断片 + * @param {mapray.FlakeMesh} mesh 地表断片メッシュ + * @param {number} index 描画インデックス + * @return {boolean} 描画の有無 + * + * @abstract + */ + + }, { + key: "setFlakeParameter", + value: function setFlakeParameter(stage, rflake, mesh, index) { + return false; + } + /** + * @summary 地表断片の共通パラメータを設定 + * + * @param {mapray.RenderStage} stage 呼び出し側オブジェクト + * @param {mapray.FlakeMesh} mesh 地表断片メッシュ + * @protected + */ + + }, { + key: "setCommonParameter", + value: function setCommonParameter(stage, mesh) { + mesh.mul_flake_to_gocs(stage._gocs_to_clip, this._flake_to_clip); + this.setMatrix("u_obj_to_clip", this._flake_to_clip); + } + }]); + + return FlakeMaterial; +}(Material); + +/** + * @summary 地図画像プロバイダ + * @classdesc + *

レンダラーに地図画像を与えるための抽象クラスである。

+ * + *

このインスタンスには状態 ( {@link mapray.ImageProvider.Status} 型) があり、{@link mapray.ImageProvider#status|status()} + * メソッドにより状態を確認することができる。

+ * + *

初期状態は READY または NOT_READY でなければならず、状態の変化は NOT_READY から READY または NOT_READY から FAILED しか存在しない。

+ *

READY 以外の状態では {@link mapray.ImageProvider#status|status()} を除くメソッドを呼び出すことはできない。

+ * + *

初期状態が NOT_READY になる可能性があるプロバイダは、{@link mapray.ImageProvider#status|status()} メソッドをオーバーライドする必要がある。

+ * + *

以下の抽象メソッドは既定の動作がないので、利用者はこれらのメソッドをオーバーライドした具象クラスを使用しなければならない。

+ *
    + *
  • {@link mapray.ImageProvider#requestTile|requestTile()}
  • + *
  • {@link mapray.ImageProvider#cancelRequest|cancelRequest()}
  • + *
  • {@link mapray.ImageProvider#getImageSize|getImageSize()}
  • + *
  • {@link mapray.ImageProvider#getZoomLevelRange|getZoomLevelRange()}
  • + *
+ * + * @memberof mapray + * @abstract + * @protected + * @see mapray.StandardImageProvider + * @see mapray.Viewer + */ +var ImageProvider = +/*#__PURE__*/ +function () { + function ImageProvider() { + _classCallCheck(this, ImageProvider); + } + + _createClass(ImageProvider, [{ + key: "status", + + /** + * @summary 状態の取得 + * @desc + *

現在の ImageProvider 状態を返す。

+ *

callback を与えたとき、状態が NOT_READY から READY または FAILED に変化したときに callback が呼び出される。 + * NOT_READY 以外の状態で callback 与えても、それは無視されコールバック関数は登録されない。

+ * + * @param {mapray.ImageProvider.StatusCallback} [callback] 状態変化コールバック関数 + * @return {mapray.ImageProvider.Status} 現在の ImageProvider 状態 + * @abstract + */ + value: function status(callback) { + return Status$1.READY; + } + /** + * @summary 地図タイル画像を要求 + * @desc + *

座標が (z, x, y) の地図タイル画像を要求する。

+ *

指定したタイル画像の取得が成功または失敗したときに callback が非同期に呼び出されなければならない。

+ *

だたし [cancelRequest()]{@link mapray.ImageProvider#cancelRequest} により要求が取り消されたとき、callback は呼び出しても呼び出さなくてもよい。また非同期呼び出しである必要もない。

+ * @param {number} z ズームレベル + * @param {number} x X タイル座標 + * @param {number} y Y タイル座標 + * @param {mapray.ImageProvider.RequestCallback} callback 要求コールバック関数 + * @return {object} 要求 ID ([cancelRequest()]{@link mapray.ImageProvider#cancelRequest} に与えるオブジェクト) + * @abstract + */ + + }, { + key: "requestTile", + value: function requestTile(z, x, y, callback) { + throw new Error("mapray.ImageProvider#requestTile() method has not been overridden."); + } + /** + * @summary 地図タイル画像の要求を取り消す + *

[requestTile()]{@link mapray.ImageProvider#requestTile} による要求を可能であれば取り消す。

+ * @param {object} id 要求 ID ([requestTile()]{@link mapray.ImageProvider#requestTile} から得たオブジェクト) + * @abstract + */ + + }, { + key: "cancelRequest", + value: function cancelRequest(id) { + throw new Error("mapray.ImageProvider#cancelRequest() method has not been overridden."); + } + /** + * @summary 地図タイル画像の寸法を取得 + * @desc + *

サーバーが提供する地図タイル画像の寸法をする。

+ *

地図タイル画像は正方形を前提とし、水平方向の画素数を返す。

+ *

制限: this が同じなら常に同じ値を返さなければならない。

+ * @return {number} 地図タイル画像の画素数 + * @abstract + */ + + }, { + key: "getImageSize", + value: function getImageSize() { + throw new Error("mapray.ImageProvider#getImageSize() method has not been overridden."); + } + /** + * @summary 地図画像ズームレベルの範囲を取得 + * @desc + *

サーバーが提供する地図タイル画像のズームレベルの範囲を取得する。

+ *

制限: this が同じなら常に同じ範囲を返さなければならない。

+ * @return {mapray.ImageProvider.Range} ズームレベルの範囲 + * @abstract + */ + + }, { + key: "getZoomLevelRange", + value: function getZoomLevelRange() { + throw new Error("mapray.ImageProvider#getZoomLevelRange() method has not been overridden."); + } + }]); + + return ImageProvider; +}(); +/** + * @summary 地図画像ズームレベル範囲 + * @memberof mapray.ImageProvider + * @see mapray.ImageProvider#getZoomLevelRange + */ + + +var Range = +/*#__PURE__*/ +function () { + /** + * @param {number} min 最小ズームレベル (0 または 0 より大きい整数) + * @param {number} max 最大ズームレベル (min または min より大きい整数) + */ + function Range(min, max) { + _classCallCheck(this, Range); + + this._min = min; + this._max = max; + } + /** + * @summary 最小ズームレベル + * @type {number} + * @readonly + */ + + + _createClass(Range, [{ + key: "min", + get: function get() { + return this._min; + } + /** + * @summary 最大ズームレベル + * @type {number} + * @readonly + */ + + }, { + key: "max", + get: function get() { + return this._max; + } + }]); + + return Range; +}(); + +ImageProvider.Range = Range; +/** + * @summary 地図タイル画像要求コールバック関数型 + * @desc + *

地図タイル画像の取得に成功または失敗したときに呼び出される関数の型である。

+ *

この関数は [requestTile()]{@link mapray.ImageProvider#requestTile} の callback 引数に与える。

+ *

画像の取得に成功したときは、image に Image のインスタンス、失敗したときは null を与える。

+ *

ただし [cancelRequest()]{@link mapray.ImageProvider#cancelRequest} により要求が取り消されたとき、コールバック関数の呼び出しは無視されるので image は任意の値でよい。

+ * @param {Image} image 地図タイル画像または null + * @callback RequestCallback + * @memberof mapray.ImageProvider + */ + +/** + * @summary ImageProvider 状態の列挙型 + * @enum {object} + * @memberof mapray.ImageProvider + * @constant + * @see mapray.ImageProvider#status + */ + +var Status$1 = { + /** + * 準備中 + */ + NOT_READY: { + id: "NOT_READY" + }, + + /** + * 準備完了 + */ + READY: { + id: "READY" + }, + + /** + * 失敗状態 + */ + FAILED: { + id: "FAILED" + } +}; +ImageProvider.Status = Status$1; + +/** + * @summary ダミー画像プロバイダ + * + * 状態は常に READY、レベル 0 のみの巨大画像、ただし画像は永遠に返さない。 + * + * @memberof mapray + * @extends mapray.ImageProvider + * @private + */ + +var EmptyImageProvider = +/*#__PURE__*/ +function (_ImageProvider) { + _inherits(EmptyImageProvider, _ImageProvider); + + /** + */ + function EmptyImageProvider() { + _classCallCheck(this, EmptyImageProvider); + + return _possibleConstructorReturn(this, _getPrototypeOf(EmptyImageProvider).call(this)); + } + /** + * @override + */ + + + _createClass(EmptyImageProvider, [{ + key: "requestTile", + value: function requestTile(z, x, y, callback) { + return this; + } + /** + * @override + */ + + }, { + key: "cancelRequest", + value: function cancelRequest(id) {} + /** + * @override + */ + + }, { + key: "getImageSize", + value: function getImageSize() { + return 4096; + } + /** + * @override + */ + + }, { + key: "getZoomLevelRange", + value: function getZoomLevelRange() { + return new ImageProvider.Range(0, 0); + } + }]); + + return EmptyImageProvider; +}(ImageProvider); + +/** + * @summary タイルテクスチャ + * @memberof mapray + * @private + * @see mapray.TileTextureCache + */ +var TileTexture = +/*#__PURE__*/ +function () { + /** + * @param {number} z 地図ズームレベル + * @param {number} x X タイル座標 + * @param {number} y Y タイル座標 + * @param {WebGLTexture} texture テクスチャオブジェクト + */ + function TileTexture(z, x, y, texture) { + _classCallCheck(this, TileTexture); + + /** + * @summary 地図ズームレベル + * @member mapray.TileTexture#z + * @type {number} + */ + this.z = z; + /** + * @summary X タイル座標 + * @member mapray.TileTexture#x + * @type {number} + */ + + this.x = x; + /** + * @summary Y タイル座標 + * @member mapray.TileTexture#y + * @type {number} + */ + + this.y = y; + /** + * @summary テクスチャオブジェクト + * @member mapray.TileTexture#texture + * @type {WebGLTexture} + */ + + this.texture = texture; + } + /** + * @summary リソースを破棄 + * @param {WebGLRenderingContext} gl WebGL レンダリングコンテキスト + */ + + + _createClass(TileTexture, [{ + key: "dispose", + value: function dispose(gl) { + gl.deleteTexture(this.texture); + this.texture = null; + } + }]); + + return TileTexture; +}(); + +/** + * @summary タイルテクスチャの管理 + * @memberof mapray + * @private + * @see mapray.TileTexture + */ + +var TileTextureCache = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {mapray.ImageProvider} provider 地図画像プロバイダ + */ + function TileTextureCache(glenv, provider) { + var _this = this; + + _classCallCheck(this, TileTextureCache); + + this._glenv = glenv; + this._provider = null; + this._min_image_z = 0; + this._max_image_z = 0; + this._image_zbias = 0; + + var status_callback = function status_callback(status) { + if (status === ImageProvider.Status.READY) { + // EmptyImageProvider から本来の provider に切り替える + _this._flush(); + + _this._resetImageProvider(provider); + } else if (status === ImageProvider.Status.FAILED) { + // provider が READY 状態にならなかった + console.error("ImageProvider.Status.FAILED in TileTextureCache"); + } + }; + + this._resetImageProvider(provider.status(status_callback) === ImageProvider.Status.READY ? provider : new EmptyImageProvider()); // キャッシュを初期化 + + + this._croot = new CacheNode(); // キャッシュ制御変数 + + this._max_accesses = 0; // 最近のフレームの最大アクセスノード数 + + this._frame_counter = 0; // 現行フレーム番号 + + this._lower_bound = 1.0; // >= 1.0 + + this._upper_bound = 1.2; // >= lower_bound + // リクエスト制御変数 + + this._num_requesteds = 0; // 現在の REQUESTED 状態のノード数 + + this._max_requesteds = 75; // 最大 REQUESTED ノード数 + + this._new_requesteds = []; // 新規リクエストのリスト + // WebGL 関連 + + var gl = glenv.context; + var aniso_ext = glenv.EXT_texture_filter_anisotropic; + + if (aniso_ext) { + this._aniso_ext = aniso_ext; + this._max_aniso = gl.getParameter(aniso_ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT); + } + + this._use_mipmap = false; + } + /** + * 画像プロバイダを再設定 + * + * _provider + * _min_image_z + * _max_image_z + * _image_zbias + * + * @private + */ + + + _createClass(TileTextureCache, [{ + key: "_resetImageProvider", + value: function _resetImageProvider(provider) { + this._provider = provider; + var renge = provider.getZoomLevelRange(); + this._min_image_z = renge.min; + this._max_image_z = renge.max; + this._image_zbias = Math.maprayLog2(2 * Math.PI / provider.getImageSize()); + } + /** + * すべてのリクエストを取り消す + */ + + }, { + key: "cancel", + value: function cancel() { + this._flush(); + } + /** + * キャッシュをフラッシュ + * @private + */ + + }, { + key: "_flush", + value: function _flush() { + new NodeCanceller(this, this._croot); // リクエストを取り消す + + this._croot = new CacheNode(); // 取り消したノードは使えないので、単純にすべて捨てる + + this._max_accesses = 0; // assert: this._num_requesteds == 0 + } + /** + * LOD からテクスチャの Z レベルを計算するバイアス値を取得 + * + * @return {number} Log2[2Pi / size] + */ + + }, { + key: "getImageZBias", + value: function getImageZBias() { + return this._image_zbias; + } + /** + * @return {number} タイルの Z レベルの最小値 + */ + + }, { + key: "getImageZMin", + value: function getImageZMin() { + return this._min_image_z; + } + /** + * @summary リクエスト待ちのタイルの個数を取得 + * + * @return {number} リクエスト待ちのタイルの個数 + */ + + }, { + key: "getNumWaitingRequests", + value: function getNumWaitingRequests() { + return this._num_requesteds; + } + /** + * @summary 先祖タイルテクスチャを検索 + * @desc + *

[x, y, z] タイルの祖先の中で、現在キャッシュに存在する最大レベルのタイルテクスチャを検索し、hi に設定する。

+ * + *

ただし検索されるタイルのズームレベルが Z とすると、Z <= max( zlimit, this._min_image_z ) + * という条件から検索し、存在しなければ null となる。

+ * + *

hi より低いレベルにタイルが存在すれば、それを lo に設定し、存在しなければ lo に hi と同じタイルを設定する

+ * + *

プロバイダにもっと相応しいテクスチャが存在する可能性があれば、そのテクスチャを要求する。

+ * + *

前提: z >= this._min_image_z && z >= zlimit

+ * + * @param {number} z 地図ズームレベル + * @param {number} x X タイル座標 + * @param {number} y Y タイル座標 + * @param {number} zlimit 先祖レベルの上限 + * @return {mapray.TileTexture[]} 先祖タイルテクスチャ配列 [hi, lo] + */ + + }, { + key: "findNearestAncestors", + value: function findNearestAncestors(z, x, y, zlimit) { + var depth = 0; + var d_min = this._min_image_z; + var pow = Math.pow(2, 1 - z); + var xf = (x + 0.5) * pow; + var yf = (y + 0.5) * pow; + var node = this._croot; + var u; + var v; + var index; + var children; + var child; // 最小レベルのノード ---> node, depth + + for (; depth < d_min; ++depth) { + u = Math.floor(xf) % 2; + v = Math.floor(yf) % 2; + index = u + 2 * v; + children = node.children; + child = children[index]; + + if (child === null) { + child = new CacheNode(); + children[index] = child; + } + + xf *= 2; + yf *= 2; + node = child; + } + + var d_max = this._max_image_z; + var d_lo = GeoMath.clamp(zlimit - 1, d_min, d_max); + var d_hi = GeoMath.clamp(zlimit, d_min, d_max); + var tex_lo = null; + var tex_hi = null; + + if (d_lo < d_hi) { + /* assert: (d_min < d_max) && (d_min < zlimit <= d_max) */ + for (; depth <= d_lo; ++depth) { + if (node.state === NodeState.LOADED) { + // 候補テクスチャを更新 + tex_lo = node; + } else if (node.state === NodeState.NONE) { + // 新規リクエスト + node.state = NodeState.REQUESTED; + node.req_power = zlimit - depth; + + this._new_requesteds.push([node, depth, Math.floor(0.5 * xf), Math.floor(0.5 * yf)]); + } else if (node.state === NodeState.REQUESTED) { + // 要求度を更新 + node.updateRequestPower(zlimit - depth); + } + + u = Math.floor(xf) % 2; + v = Math.floor(yf) % 2; + index = u + 2 * v; + children = node.children; + child = children[index]; + + if (child === null) { + child = new CacheNode(); + children[index] = child; + } + + xf *= 2; + yf *= 2; + node = child; + } + + tex_hi = tex_lo; + + if (node.state === NodeState.LOADED) { + // 候補テクスチャを更新 + tex_hi = node; + } else if (node.state === NodeState.NONE) { + // 新規リクエスト + node.state = NodeState.REQUESTED; + node.req_power = zlimit - depth; + + this._new_requesteds.push([node, depth, Math.floor(0.5 * xf), Math.floor(0.5 * yf)]); + } else if (node.state === NodeState.REQUESTED) { + // 要求度を更新 + node.updateRequestPower(zlimit - depth); + } + } else { + // if d_lo == d_hi + + /* assert: (d_min == d_max) || (zlimit <= d_min) || (zlimit > d_max) */ + for (;; ++depth) { + if (node.state === NodeState.LOADED) { + // 候補テクスチャを更新 + tex_lo = node; + } else if (node.state === NodeState.NONE) { + // 新規リクエスト + node.state = NodeState.REQUESTED; + node.req_power = zlimit - depth; + + this._new_requesteds.push([node, depth, Math.floor(0.5 * xf), Math.floor(0.5 * yf)]); + } else if (node.state === NodeState.REQUESTED) { + // 要求度を更新 + node.updateRequestPower(zlimit - depth); + } + + if (depth == d_lo) { + tex_hi = tex_lo; + break; + } + + u = Math.floor(xf) % 2; + v = Math.floor(yf) % 2; + index = u + 2 * v; + children = node.children; + child = children[index]; + + if (child === null) { + child = new CacheNode(); + children[index] = child; + } + + xf *= 2; + yf *= 2; + node = child; + } // assert: tex_hi === tex_lo + + } + + node.touch(); + var result = TileTextureCache._findNearestAncestors_result; + result[0] = tex_hi !== null ? tex_hi.data : null; + result[1] = tex_lo !== null ? tex_lo.data : null; + return result; + } + /** + * @summary フレームの最後の処理 + */ + + }, { + key: "endFrame", + value: function endFrame() { + this._performNewRequests(); + + var counter = new NodeCounter(this._croot, this._frame_counter); + this._max_accesses = Math.max(counter.num_accesses, this._max_accesses); + + if (counter.num_loadeds > this._upper_bound * this._max_accesses) { + var num_nodes = Math.floor(this._lower_bound * this._max_accesses); + + this._reduceCache(num_nodes); + } + + ++this._frame_counter; + } + /** + * @summary 新規リクエストを実行 + * @private + */ + + }, { + key: "_performNewRequests", + value: function _performNewRequests() { + // リクエスト数 + var num_requests = Math.min(this._max_requesteds - this._num_requesteds, this._new_requesteds.length); // 基準に基づき、新規リクエストを前半 (num_requests 個) と後半に分割 + + this._new_requesteds.sort(function (a, b) { + var anode = a[0]; + var bnode = b[0]; + return bnode.req_power - anode.req_power; + }); // リクエストを実行 + + + var self = this; + + this._new_requesteds.slice(0, num_requests).forEach(function (req) { + var node = req[0]; + var z = req[1]; + var x = req[2]; + var y = req[3]; + + self._requestTileTexture(z, x, y, node); + }); // リクエストしなかったノードを空に戻す + + + this._new_requesteds.slice(num_requests).forEach(function (req) { + var node = req[0]; + node.state = NodeState.NONE; // assert: node.data === null + }); // 新規リクエストのリストをクリア + + + this._new_requesteds.length = 0; + } + /** + * @summary タイルテクスチャを要求 + * @param {number} z 地図ズームレベル + * @param {number} x X タイル座標 + * @param {number} y Y タイル座標 + * @param {mapray.TileTextureCache.CacheNode} node 対象ノード + * @private + */ + + }, { + key: "_requestTileTexture", + value: function _requestTileTexture(z, x, y, node) { + var _this2 = this; + + node.data = this._provider.requestTile(z, x, y, function (image) { + if (node.state !== NodeState.REQUESTED) { + // キャンセルされているので無視 + return; + } + + if (image) { + node.data = new TileTexture(z, x, y, _this2._createTexture(image)); + node.state = NodeState.LOADED; + } else { + node.data = null; + node.state = NodeState.FAILED; + } + + --_this2._num_requesteds; + }); + ++this._num_requesteds; + } + /** + * @summary テクスチャを生成 + * @desc + *

GL ステートの変更

+ *
    + *
  • TEXTURE_2D_BINDING: null
  • + *
  • UNPACK_FLIP_Y_WEBGL: false
  • + *
+ * @param {Image} image 元画像 + * @return {WebGLTexture} 生成されたテクスチャ + * @private + */ + + }, { + key: "_createTexture", + value: function _createTexture(image) { + var gl = this._glenv.context; + var aniso_ext = this._aniso_ext; + var target = gl.TEXTURE_2D; + var texture = gl.createTexture(); + gl.bindTexture(target, texture); + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); + gl.texImage2D(target, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); + + if (this._use_mipmap) { + gl.generateMipmap(target); + } + + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, this._use_mipmap ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + if (aniso_ext) { + gl.texParameterf(gl.TEXTURE_2D, aniso_ext.TEXTURE_MAX_ANISOTROPY_EXT, this._max_aniso); + } + + gl.bindTexture(target, null); + return texture; + } + /** + * @summary キャッシュを削減 + * @param {number} num_cnodes 目標ノード数 + * @private + */ + + }, { + key: "_reduceCache", + value: function _reduceCache(num_nodes) { + var collector = new NodeCollector(this._croot); // 基準に基づき、ノードを前半 (num_cnodes 個) と後半に分割 + + collector.nodes.sort(function (a, b) { + var aframe = b.aframe - a.aframe; + + if (aframe == 0) { + if (a.state === NodeState.LOADED && b.state === NodeState.LOADED) { + return a.data.z - b.data.z; + } + } + + return aframe; + }); // 後半のノードを削除 + + var gl = this._glenv.context; + collector.nodes.slice(num_nodes).forEach(function (node) { + if (node.state === NodeState.LOADED) { + node.data.dispose(gl); + } + + node.state = NodeState.NONE; + node.data = null; + }); // NodeState.NONE の葉ノードを消去 + + collector.clean(); + } + }]); + + return TileTextureCache; +}(); // クラス定数を定義 + + +TileTextureCache._findNearestAncestors_result = new Array(2); +/** + * @summary キャッシュノード + * + * @memberof mapray.TileTextureCache + * @private + */ + +var CacheNode = +/*#__PURE__*/ +function () { + function CacheNode() { + _classCallCheck(this, CacheNode); + + this.children = [null, null, null, null]; + this.state = NodeState.NONE; + this.data = null; // TileTexture オブジェクト、または取り消しオブジェクト + + this.req_power = -1; // 要求度 + + this.aframe = -1; // 最終アクセスフレーム + } + /** + * 要求度を更新 + */ + + + _createClass(CacheNode, [{ + key: "updateRequestPower", + value: function updateRequestPower(req_power) { + if (req_power > this.req_power) { + this.req_power = req_power; + } + } + /** + * このタイルにアクセスしたことにする + */ + + }, { + key: "touch", + value: function touch() { + this.aframe = true; + } + }]); + + return CacheNode; +}(); +/** + * @summary ノード数の計上 + * + * this.num_loadeds: ロードされているタイル数 + * this.num_accesses: ロードされているタイルのうち、アクセスされたタイル数 + * + * アクセスがあったノードに対して aframe を更新する。 + * + * @memberof mapray.TileTextureCache + * @private + */ + + +var NodeCounter = +/*#__PURE__*/ +function () { + /** + * @param {mapray.TileTextureCache.CacheNode} root 最上位ノード + * @param {number} frame 現在のフレーム + */ + function NodeCounter(root, frame) { + _classCallCheck(this, NodeCounter); + + this.num_loadeds = 0; + this.num_accesses = 0; + this._frame = frame; + + this._traverse(root); + } + /** + * @private + */ + + + _createClass(NodeCounter, [{ + key: "_traverse", + value: function _traverse(node) { + var children = node.children; + var isAccessed = node.aframe === true; + + for (var i = 0; i < 4; ++i) { + var child = children[i]; + + if (child !== null) { + isAccessed = this._traverse(child) || isAccessed; + } + } + + if (node.state === NodeState.LOADED) { + ++this.num_loadeds; + + if (isAccessed) { + ++this.num_accesses; + } + } + + if (isAccessed) { + // アクセスフレームを更新 + node.aframe = this._frame; + } + + return isAccessed; + } + }]); + + return NodeCounter; +}(); +/** + * @summary ノード収集 + * @desc + *

NodeState.LOADED または NodeState.FAILED のノードを this.nodes に収集する。

+ * + * @memberof mapray.TileTextureCache + * @private + */ + + +var NodeCollector = +/*#__PURE__*/ +function () { + /** + * @param {mapray.TileTextureCache.CacheNode} root 最上位ノード + */ + function NodeCollector(root) { + _classCallCheck(this, NodeCollector); + + this._root = root; + this.nodes = []; + + this._traverse(root); + } + /** + * @private + */ + + + _createClass(NodeCollector, [{ + key: "_traverse", + value: function _traverse(node) { + var state = node.state; + + if (state === NodeState.LOADED || state === NodeState.FAILED) { + // LOADED または FAILED なら追加 + this.nodes.push(node); + } + + var children = node.children; + + for (var i = 0; i < 4; ++i) { + var child = children[i]; + + if (child !== null) { + this._traverse(child); + } + } + } + /** + * @summary NodeState.NONE の葉ノードを消去 + */ + + }, { + key: "clean", + value: function clean() { + this._clean_recur(this._root); + } + /** + * @return 自己と子孫がすべて NodeState.NONE のとき true, それいがいのとき false + * @private + */ + + }, { + key: "_clean_recur", + value: function _clean_recur(node) { + var isNodeNone = node.state === NodeState.NONE; + var children = node.children; + + for (var i = 0; i < 4; ++i) { + var child = children[i]; + + if (child !== null) { + var isChildNone = this._clean_recur(child); + + if (isChildNone === true) { + children[i] = null; + } + + isNodeNone = isChildNone && isNodeNone; + } + } + + return isNodeNone; + } + }]); + + return NodeCollector; +}(); +/** + * @summary すべてのリクエストを取り消す + * @memberof mapray.TileTextureCache + * @private + */ + + +var NodeCanceller = +/*#__PURE__*/ +function () { + /** + * @param {mapray.TileTextureCache} owner 最上位ノード + * @param {mapray.TileTextureCache.CacheNode} root 最上位ノード + */ + function NodeCanceller(owner, root) { + _classCallCheck(this, NodeCanceller); + + this._owner = owner; + + this._traverse(root); + } + /** + * @private + */ + + + _createClass(NodeCanceller, [{ + key: "_traverse", + value: function _traverse(node) { + var children = node.children; + + for (var i = 0; i < 4; ++i) { + var child = children[i]; + + if (child !== null) { + this._traverse(child); + } + } + + if (node.state === NodeState.REQUESTED) { + var owner = this._owner; + node.state = NodeState.NONE; + + owner._provider.cancelRequest(node.data); + + --owner._num_requesteds; + } + } + }]); + + return NodeCanceller; +}(); +/** + * @summary ノード状態の列挙型 + * @enum {object} + * @memberof mapray.TileTextureCache + * @constant + */ + + +var NodeState = { + /** + * タイルが存在しない + */ + NONE: { + id: "NONE" + }, + + /** + * タイルが存在する + */ + LOADED: { + id: "LOADED" + }, + + /** + * タイルをリクエスト中 + */ + REQUESTED: { + id: "REQUESTED" + }, + + /** + * タイルのリクエストに失敗 + */ + FAILED: { + id: "FAILED" + } +}; + +var surface_vs_code = "attribute vec4 a_position; // 位置 (地表断片座標系)\nattribute vec2 a_uv; // uv 座標\n\nuniform mat4 u_obj_to_clip; // 地表断片座標系からクリップ座標系への変換\n\nuniform vec4 u_texcoord_rect_hi; // 高レベル画像 左下座標: (x, y), 座標サイズ: (z, w)\nuniform vec4 u_texcoord_rect_lo; // 低レベル画像 左下座標: (x, y), 座標サイズ: (z, w)\nuniform vec4 u_corner_lod; // uv = (0,0), (1,0), (0,1), (1,1) の LOD\n\n#ifdef NIGHTIMAGE\nuniform mat4 u_obj_to_gocs; // 地表断片座標系からGOCS座標系への変換\nuniform float u_opacity; // 不透明度\nuniform vec3 u_sun_direction; // 太陽方向\n\nvarying float v_opacity; // 不透明度(太陽方向による処理)\n#endif\n\nvarying vec2 v_texcoord_hi; // 高レベル画像のテクスチャ座標\nvarying vec2 v_texcoord_lo; // 低レベル画像のテクスチャ座標\nvarying float v_lod; // 補間された LOD\n\n#ifdef NIGHTIMAGE\nfloat sigmoid( float a, float x )\n{\n return 1.0 / ( 1.0 + exp( -( a * x )) );\n}\n#endif\n\nvoid main()\n{\n gl_Position = u_obj_to_clip * a_position;\n\n // uv 座標をテクスチャ座標に変換\n v_texcoord_hi = u_texcoord_rect_hi.xy + u_texcoord_rect_hi.zw * a_uv;\n v_texcoord_lo = u_texcoord_rect_lo.xy + u_texcoord_rect_lo.zw * a_uv;\n\n // LOD の補間\n float u = a_uv.x;\n float v = a_uv.y;\n\n float lod_00 = u_corner_lod.x; // uv = (0,0) の LOD\n float lod_10 = u_corner_lod.y; // uv = (1,0) の LOD\n float lod_01 = u_corner_lod.z; // uv = (0,1) の LOD\n float lod_11 = u_corner_lod.w; // uv = (1,1) の LOD\n\n float lod_u0 = mix( lod_00, lod_10, u ); // uv = (u, 0) の LOD\n float lod_u1 = mix( lod_01, lod_11, u ); // uv = (u, 1) の LOD\n float lod_uv = mix( lod_u0, lod_u1, v ); // uv = (u, v) の LOD\n\n v_lod = lod_uv;\n\n#ifdef NIGHTIMAGE\n vec3 ground_vector = normalize( vec3( u_obj_to_gocs * a_position ) );\n float dir = dot( ground_vector, u_sun_direction );\n float sun_opacity = 1.0 - sigmoid( 5.0, dir );\n v_opacity = sun_opacity * u_opacity; // 不透明度を適用\n#endif\n}\n"; + +var surface_fs_code = "precision mediump float;\n\nvarying vec2 v_texcoord_hi; // 高レベル画像のテクスチャ座標\nvarying vec2 v_texcoord_lo; // 低レベル画像のテクスチャ座標\nvarying float v_lod; // 補間された LOD\n\n#ifdef NIGHTIMAGE\nvarying float v_opacity; // 不透明度(太陽方向による処理)\n#else\nuniform float u_opacity; // 不透明度\n#endif\n\nuniform sampler2D u_image_hi; // 高レベル画像\nuniform sampler2D u_image_lo; // 低レベル画像\n\n/** 画像パラメータ\n *\n * x = u_image_lo の LOD\n * y = 1 / (u_image_hi の LOD - x)\n *\n * ただし u_image_hi と u_image_lo が同じ画像のときは y = 0\n */\nuniform vec2 u_image_param;\n\n\nvoid main()\n{\n vec4 color_hi = texture2D( u_image_hi, v_texcoord_hi );\n vec4 color_lo = texture2D( u_image_lo, v_texcoord_lo );\n\n // 画像の混合率\n float lo_lod = u_image_param.x;\n float delta = u_image_param.y;\n float ratio = clamp( (v_lod - lo_lod) * delta, 0.0, 1.0 );\n\n gl_FragColor = mix( color_lo, color_hi, ratio );\n // 不透明度を適用\n#ifdef NIGHTIMAGE\n gl_FragColor.a *= v_opacity;\n#else\n gl_FragColor.a *= u_opacity;\n#endif\n}\n"; + +var rid_fs_code = "/**\n * マウスピック用ID描画シェーダ (フラグメントシェーダ)\n */\n\nprecision highp float;\nuniform vec4 u_rid; // rid\n\nvoid main()\n{\n gl_FragColor = u_rid;\n}\n"; + +var wireframe_vs_code = "attribute vec4 a_position;\nattribute vec2 a_uv;\n\nuniform mat4 u_obj_to_clip;\n\nvarying vec2 v_uv;\n\nvoid main()\n{\n gl_Position = u_obj_to_clip * a_position;\n v_uv = a_uv;\n}\n"; + +var wireframe_fs_code = "precision mediump float;\n\nvarying vec2 v_uv;\n\nvoid main()\n{\n vec4 color = (v_uv.x < 0.005 || v_uv.y < 0.005 || v_uv.x > 0.995 || v_uv.y > 0.995) ?\n vec4( 1, 1, 0, 1 ) : vec4( 0.5, 0.5, 0.5, 1 );\n gl_FragColor = color;\n}\n"; + +/** + * @summary 地表ワイヤーフレームマテリアル + * @memberof mapray.RenderStage + * @extends mapray.RenderStage.FlakeMaterial + * @private + */ + +var WireframeMaterial = +/*#__PURE__*/ +function (_FlakeMaterial) { + _inherits(WireframeMaterial, _FlakeMaterial); + + /** + * @param {mapray.Viewer} viewer 所有者 Viewer + */ + function WireframeMaterial(viewer) { + _classCallCheck(this, WireframeMaterial); + + return _possibleConstructorReturn(this, _getPrototypeOf(WireframeMaterial).call(this, viewer, wireframe_vs_code, wireframe_fs_code)); + } + /** + * @override + */ + + + _createClass(WireframeMaterial, [{ + key: "isWireframe", + value: function isWireframe() { + return true; + } + /** + * @override + */ + + }, { + key: "setFlakeParameter", + value: function setFlakeParameter(stage, rflake, mesh, index) { + this.setCommonParameter(stage, mesh); + return true; + } + }]); + + return WireframeMaterial; +}(FlakeMaterial); + +/** + * @summary 地図レイヤー + * @classdesc + *

地図レイヤーを表現するオブジェクトである。

+ * + * @hideconstructor + * @memberof mapray + * @see mapray.LayerCollection + */ + +var Layer = +/*#__PURE__*/ +function () { + /** + * @param {mapray.LayerCollection} owner 地図レイヤー管理 + * @param {object|mapray.ImageProvider} init 初期化プロパティ + * @param {mapray.ImageProvider} init.image_provider 画像プロバイダ + * @param {boolean} [init.visibility] 可視性フラグ + * @param {number} [init.opacity] 不透明度 + * @param {Layer.LayerType} [init.type] レイヤータイプ + */ + function Layer(owner, init) { + _classCallCheck(this, Layer); + + this._owner = owner; + this._glenv = owner.glenv; + this._viewer = owner.viewer; + var props = init instanceof ImageProvider ? { + image_provider: init + } : init; + this._image_provider = props.image_provider; + this._visibility = props.visibility || true; + this._opacity = props.opacity || 1.0; + this._type = props.type === Layer.LayerType.NIGHT ? Layer.LayerType.NIGHT : Layer.LayerType.NORMAL; + this._material = null; + this._tile_cache = new TileTextureCache(this._glenv, this._image_provider); + var render_cache = this._viewer._render_cache || (this._viewer._render_cache = {}); + + if (this._type === Layer.LayerType.NIGHT) { + if (!render_cache.surface_night_material) { + render_cache.surface_night_material = new SurfaceMaterial(this._viewer, { + nightMaterial: true + }); + } + + this._material = render_cache.surface_night_material; + } else { + if (!render_cache.surface_material) { + render_cache.surface_material = new SurfaceMaterial(this._viewer); + render_cache.wireframe_material = new WireframeMaterial(this._viewer); + } + + this._material = render_cache.surface_material; + } // プロバイダの状態が変化したら描画レイヤーを更新 + + + this._image_provider.status(function (status) { + owner.dirtyDrawingLayers(); + }); + } + /** + * @summary 画像プロバイダを取得 + * @type {mapray.ImageProvider} + * @readonly + */ + + + _createClass(Layer, [{ + key: "setImageProvider", + + /** + * @summary 画像プロバイダを設定 + * + * @param {mapray.ImageProvider} provider 画像プロバイダ + */ + value: function setImageProvider(provider) { + var _this = this; + + if (this._image_provider !== provider) { + // プロバイダを変更またはプロバイダの状態が変化したら描画レイヤーを更新 + this._owner.dirtyDrawingLayers(); + + provider.status(function (status) { + _this._owner.dirtyDrawingLayers(); + }); + } + + this._image_provider = provider; // タイルキャッシュを再構築 + + this._tile_cache.cancel(); + + this._tile_cache = new TileTextureCache(this._glenv, provider); + } + /** + * @summary 可視性フラグを設定 + * + * @param {boolean} visibility 可視性フラグ + */ + + }, { + key: "setVisibility", + value: function setVisibility(visibility) { + if (this._visibility != visibility) { + // レイヤーの可視性が変化したら描画レイヤーを更新 + this._owner.dirtyDrawingLayers(); + } + + this._visibility = visibility; + } + /** + * @summary 不透明度を設定 + * + * @param {number} opacity 不透明度 + */ + + }, { + key: "setOpacity", + value: function setOpacity(opacity) { + this._opacity = opacity; + } + /** + * @summary マテリアルを取得 + * + * @return {mapray.SurfaceMaterial} マテリアル + * @package + */ + + }, { + key: "getMateral", + value: function getMateral() { + return this._material; + } + }, { + key: "image_provider", + get: function get() { + return this._image_provider; + } + /** + * @summary 可視性フラグを取得 + * @type {boolean} + * @readonly + */ + + }, { + key: "visibility", + get: function get() { + return this._visibility; + } + /** + * @summary 不透明度を取得 + * @type {number} + * @readonly + */ + + }, { + key: "opacity", + get: function get() { + return this._opacity; + } + /** + * @summary タイプを取得 + * @type {LayerType} + * @readonly + */ + + }, { + key: "type", + get: function get() { + return this._type; + } + /** + * @summary タイルテクスチャキャッシュを取得 + * @type {mapray.TileTextureCache} + * @readonly + * @package + */ + + }, { + key: "tile_cache", + get: function get() { + return this._tile_cache; + } + }]); + + return Layer; +}(); +/** + * @summary レイヤータイプ + * @enum {object} + * @memberof mapray.Layer + * @constant + */ + + +var LayerType = { + /** + * 通常のレイヤー + */ + NORMAL: { + id: "NORMAL" + }, + + /** + * 夜部分のみ描画するレイヤー + */ + NIGHT: { + id: "NIGHT" + } +}; +Layer.LayerType = LayerType; + +/** + * @summary 地表面マテリアル + * @memberof mapray.RenderStage + * @extends mapray.RenderStage.FlakeMaterial + * @private + */ + +var SurfaceMaterial = +/*#__PURE__*/ +function (_FlakeMaterial) { + _inherits(SurfaceMaterial, _FlakeMaterial); + + /** + * @param {mapray.Viewer} viewer 所有者である Viewer + */ + function SurfaceMaterial(viewer) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, SurfaceMaterial); + + var preamble = SurfaceMaterial._getPreamble(options); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(SurfaceMaterial).call(this, viewer, preamble + surface_vs_code, preamble + (options.ridMaterial ? rid_fs_code : surface_fs_code))); + + _this.bindProgram(); + + _this.setInteger("u_image_hi", SurfaceMaterial.TEXUNIT_IMAGE_HI); + + _this.setInteger("u_image_lo", SurfaceMaterial.TEXUNIT_IMAGE_LO); + + _this._viewer = viewer; + _this._tile_texture_cache = viewer.tile_texture_cache; + _this._layers = viewer.layers; + _this._dummy_tile_texture = _this._createDummyTileTexture(viewer.glenv); + _this._image_zbias = 0; + _this._identity_matrix = GeoMath.setIdentity(GeoMath.createMatrix()); + _this._flake_to_gocs = GeoMath.createMatrixf(); + return _this; + } + /** + * @summary シェーダの前文を取得 + * + * @param {object} options オプション指定 + * @param {boolean} [options.nightMaterial=false] 夜用マテリアルの場合 true + * + * @private + */ + + + _createClass(SurfaceMaterial, [{ + key: "numDrawings", + + /** + * @override + */ + value: function numDrawings() { + return 1 + this._layers.numDrawingLayers(); + } + /** + * @override + */ + + }, { + key: "setFlakeParameter", + value: function setFlakeParameter(stage, rflake, mesh, index) { + this.setCommonParameter(stage, mesh); + + var param = this._getMaterialParamater(rflake, index); + + if (param !== null) { + var layer = this._layers.getDrawingLayer(index - 1); + + this.setVector4("u_corner_lod", param.corner_lod); + this.setVector4("u_texcoord_rect_hi", param.image_hi.texcoord_rect); + this.setVector4("u_texcoord_rect_lo", param.image_lo.texcoord_rect); + this.setVector2("u_image_param", [param.image_lo.lod, param.image_hi.lod == param.image_lo.lod ? 0 : 1 / (param.image_hi.lod - param.image_lo.lod)]); + this.setFloat("u_opacity", index == 0 ? 1.0 : layer.opacity); + + if (index > 0 && layer.type === Layer.LayerType.NIGHT) { + this.setVector3("u_sun_direction", this._viewer.sun_direction); + mesh.mul_flake_to_gocs(this._identity_matrix, this._flake_to_gocs); + this.setMatrix("u_obj_to_gocs", this._flake_to_gocs); + } + + this.bindTexture2D(SurfaceMaterial.TEXUNIT_IMAGE_HI, param.image_hi.texture); + this.bindTexture2D(SurfaceMaterial.TEXUNIT_IMAGE_LO, param.image_lo.texture); + return true; + } else { + return false; + } + } + /** + * @summary SurfaceMaterial のパラメータを取得 + * @desc + *
+     * オブジェクト構造
+     * {
+     *    // 四隅の地表詳細レベル
+     *    corner_lod: [lod_00, lod_10, lod_01, lod_11],
+     *
+     *    // 高レベル画像の情報
+     *    image_hi: { lod: (number), texture: (WebGLTexture), texcoord_rect: [s, t, w, h] },
+     *
+     *    // 低レベル画像の情報
+     *    image_lo: { lod: (number), texture: (WebGLTexture), texcoord_rect: [s, t, w, h] }
+     * }
+     * 
+ * @private + */ + + }, { + key: "_getMaterialParamater", + value: function _getMaterialParamater(rflake, index) { + var tex_cache = index == 0 ? this._tile_texture_cache : this._layers.getDrawingLayer(index - 1).tile_cache; + this._image_zbias = tex_cache.getImageZBias(); + var flake = rflake.flake; + var zg = flake.z; + + if (zg < tex_cache.getImageZMin()) { + return null; + } + + var x = flake.x; + var y = flake.y; + var zi = Math.ceil(rflake.lod + this._image_zbias); + + if (zg < zi) { + return null; + } + + var tiles = tex_cache.findNearestAncestors(zg, x, y, zi); + + if (index >= 1 && tiles[0] === null) { + return null; + } + + return { + corner_lod: [rflake.lod_00, rflake.lod_10, rflake.lod_01, rflake.lod_11], + image_hi: this._getImageParamater(tiles[0], zg, x, y, zi), + image_lo: this._getImageParamater(tiles[1], zg, x, y, zi - 1) + }; + } + /** + * @summary 画像パラメータを取得 + * @desc + *
+     * オブジェクト構造
+     * {
+     *    lod:           (number),
+     *    texture:       (WebGLTexture),
+     *    texcoord_rect: [s, t, w, h]
+     * }
+     * 
+ * @private + */ + + }, { + key: "_getImageParamater", + value: function _getImageParamater(tile, zg, x, y, zi) { + var pow; + + if (tile !== null) { + pow = Math.pow(2, tile.z - zg); + return { + lod: tile.z - this._image_zbias, + texture: tile.texture, + texcoord_rect: [x * pow - tile.x, 1 - (y + 1) * pow + tile.y, pow, pow] + }; + } else { + pow = Math.pow(2, -zg); + return { + lod: -this._image_zbias, + texture: this._dummy_tile_texture, + texcoord_rect: [x * pow - Math.floor(pow * (x + 0.5)), 1 - (y + 1) * pow + Math.floor(pow * (y + 0.5)), pow, pow] + }; + } + } + /** + * @private + */ + + }, { + key: "_createDummyTileTexture", + value: function _createDummyTileTexture(glenv) { + var gl = glenv.context; + var target = gl.TEXTURE_2D; + var texture = gl.createTexture(); + var pixels = [128, 128, 128, 255]; + gl.bindTexture(target, texture); + gl.texImage2D(target, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(pixels)); + gl.bindTexture(target, null); + return texture; + } + }], [{ + key: "_getPreamble", + value: function _getPreamble(options) { + var is_night = options.nightMaterial === true; + var lines = []; // マクロの定義 + + if (is_night) { + lines.push("#define NIGHTIMAGE"); + } // lines を文字列にして返す + + + return lines.join("\n") + "\n\n"; + } + }]); + + return SurfaceMaterial; +}(FlakeMaterial); + +SurfaceMaterial.TEXUNIT_IMAGE_HI = 0; // 高レベル画像のテクスチャユニット + +SurfaceMaterial.TEXUNIT_IMAGE_LO = 1; // 低レベル画像のテクスチャユニット + +var $indexOf$1 = arrayIncludes.indexOf; +var nativeIndexOf = [].indexOf; +var NEGATIVE_ZERO$1 = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0; +var STRICT_METHOD$4 = arrayMethodIsStrict('indexOf'); +var USES_TO_LENGTH$7 = arrayMethodUsesToLength('indexOf', { + ACCESSORS: true, + 1: 0 +}); // `Array.prototype.indexOf` method +// https://tc39.github.io/ecma262/#sec-array.prototype.indexof + +_export({ + target: 'Array', + proto: true, + forced: NEGATIVE_ZERO$1 || !STRICT_METHOD$4 || !USES_TO_LENGTH$7 +}, { + indexOf: function indexOf(searchElement + /* , fromIndex = 0 */ + ) { + return NEGATIVE_ZERO$1 // convert -0 to +0 + ? nativeIndexOf.apply(this, arguments) || 0 : $indexOf$1(this, searchElement, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +var $reduce$1 = arrayReduce.left; +var STRICT_METHOD$5 = arrayMethodIsStrict('reduce'); +var USES_TO_LENGTH$8 = arrayMethodUsesToLength('reduce', { + 1: 0 +}); // `Array.prototype.reduce` method +// https://tc39.github.io/ecma262/#sec-array.prototype.reduce + +_export({ + target: 'Array', + proto: true, + forced: !STRICT_METHOD$5 || !USES_TO_LENGTH$8 +}, { + reduce: function reduce(callbackfn + /* , initialValue */ + ) { + return $reduce$1(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.github.io/ecma262/#sec-date.now + +_export({ + target: 'Date', + stat: true +}, { + now: function now() { + return new Date().getTime(); + } +}); + +var FAILS_ON_PRIMITIVES = fails(function () { + objectKeys(1); +}); // `Object.keys` method +// https://tc39.github.io/ecma262/#sec-object.keys + +_export({ + target: 'Object', + stat: true, + forced: FAILS_ON_PRIMITIVES +}, { + keys: function keys(it) { + return objectKeys(toObject(it)); + } +}); + +var TO_STRING$1 = 'toString'; +var RegExpPrototype = RegExp.prototype; +var nativeToString = RegExpPrototype[TO_STRING$1]; +var NOT_GENERIC = fails(function () { + return nativeToString.call({ + source: 'a', + flags: 'b' + }) != '/a/b'; +}); // FF44- RegExp#toString has a wrong name + +var INCORRECT_NAME = nativeToString.name != TO_STRING$1; // `RegExp.prototype.toString` method +// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring + +if (NOT_GENERIC || INCORRECT_NAME) { + redefine(RegExp.prototype, TO_STRING$1, function toString() { + var R = anObject(this); + var p = String(R.source); + var rf = R.flags; + var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf); + return '/' + p + '/' + f; + }, { + unsafe: true + }); +} + +// このようにする理由は GeoMath.js の最後を参照 + +var point_cloud_vs_code = "attribute vec4 a_position;\nattribute vec3 a_color;\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform float u_point_size; // 点描画サイズ(負の場合は[m]、正の場合は[px])\n\nuniform float u_debug; // デバッグ用パラメータ(正の場合のみ有効)\n\nvarying vec3 v_color; // 色\n\n\nvoid main(void) {\n gl_Position = u_obj_to_clip * a_position;\n\n if ( u_point_size < 0.0 ) {\n gl_PointSize = -u_point_size / gl_Position.w;\n }\n else {\n gl_PointSize = u_point_size;\n }\n\n if ( u_debug < 0.0 ) {\n v_color = a_color;\n }\n else {\n float alpha = min( 1.0, u_debug );\n v_color = vec3( alpha, 0.0, 1.0 - alpha );\n }\n}\n"; + +var point_cloud_fs_code = "precision highp float;\n\n\nvarying vec3 v_color; // 色\n\n\nvoid main(void) {\n#if POINT_SHAPE_TYPE == 0 // RECTANGLE\n gl_FragColor = vec4( v_color, 1.0 );\n\n#elif POINT_SHAPE_TYPE == 1 // CIRCLE\n if ( length( gl_PointCoord - 0.5 ) > 0.5 ) {\n discard;\n }\n else {\n gl_FragColor = vec4( v_color, 1.0 );\n }\n\n#elif POINT_SHAPE_TYPE == 2 // CIRCLE_WITH_BORDER\n float distance = length( gl_PointCoord - 0.5 );\n if ( distance > 0.5 ) {\n discard;\n }\n else if ( distance > 0.45 ) {\n gl_FragColor = vec4( 0, 0, 0, 1.0 );\n }\n else {\n gl_FragColor = vec4( v_color, 1.0 );\n }\n\n#elif POINT_SHAPE_TYPE == 3 // GRADIENT_CIRCLE\n vec2 p = 2.0 * gl_PointCoord - 1.0;\n if ( length(p) > 1.0 ) {\n discard;\n }\n else {\n gl_FragColor = vec4( v_color * (1.0 - 0.3 * tan((p.x + p.y)*0.7853981633)), 1.0 );\n }\n\n#endif\n}\n"; + +var point_cloud_debug_wire_vs_code = "attribute vec4 a_position;\n\nuniform mat4 u_obj_to_clip;\n\nvoid main(void) {\n gl_Position = u_obj_to_clip * a_position;\n}\n"; + +var point_cloud_debug_wire_fs_code = "precision highp float;\n\nuniform vec3 u_color;\n\nvoid main(void) {\n gl_FragColor = vec4(u_color, 1.0);\n}\n"; + +var point_cloud_debug_face_vs_code = "attribute vec4 a_position;\n\nuniform mat4 u_obj_to_clip;\nvarying vec4 pos;\n\nvoid main(void) {\n pos = gl_Position;\n gl_Position = u_obj_to_clip * a_position;\n}\n"; + +var point_cloud_debug_face_fs_code = "precision highp float;\n\nuniform vec4 u_color;\nvarying vec4 pos;\n\nvoid main(void) {\n // gl_FragCoord.x, gl_FragCoord.y\n if (mod(gl_FragCoord.x, 3.0) < 1.0 && mod(gl_FragCoord.y, 3.0) < 1.0) {\n gl_FragColor = vec4(u_color.x, u_color.y, u_color.z, 1.0);\n }\n else {\n discard;\n }\n}\n"; + +/** + * @summary 点群マテリアル + * @memberof mapray.RenderStage + * @extends mapray.RenderStage.Material + * @private + */ + +var PointCloudMaterial = +/*#__PURE__*/ +function (_Material) { + _inherits(PointCloudMaterial, _Material); + + /** + * @param {mapray.Viewer} viewer 所有者である Viewer + */ + function PointCloudMaterial(viewer) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, PointCloudMaterial); + + var preamble = PointCloudMaterial._getPreamble(options); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(PointCloudMaterial).call(this, viewer.glenv, preamble + point_cloud_vs_code, preamble + point_cloud_fs_code)); + + _this.bindProgram(); + + _this.setFloat("u_point_size", 10); + + _this.setFloat("u_debug", -1.0); + + _this._local_to_clip = GeoMath.createMatrixf(); + return _this; + } + /** + * @summary 点の大きさを設定 + * @param {number} val 設定する値 + */ + + + _createClass(PointCloudMaterial, [{ + key: "setPointSize", + value: function setPointSize(val) { + this.setFloat("u_point_size", val); + } + /** + * @summary デバッグ値を設定 + * @param {number} val 設定する値 + */ + + }, { + key: "setDebug", + value: function setDebug(val) { + this.setFloat("u_debug", val); + } + /** + * @summary 描画位置を設定 + * @param {number} val 設定する値 + */ + + }, { + key: "setDebugBoundsParameter", + value: function setDebugBoundsParameter(stage, center) { + mul_local_to_gocs(stage._gocs_to_clip, center, this._local_to_clip); + this.setMatrix("u_obj_to_clip", this._local_to_clip); + return true; + } + /** + * @summary シェーダの前文を取得 + * @private + */ + + }], [{ + key: "_getPreamble", + value: function _getPreamble(options) { + var lines = []; + var point_shape_type = options.point_shape_type || PointCloud.PointShapeType.CIRCLE; + lines.push("#define POINT_SHAPE_TYPE " + point_shape_type.shader_code); // lines を文字列にして返す + + return lines.join("\n") + "\n\n"; + } + }]); + + return PointCloudMaterial; +}(Material); + +var mul_local_to_gocs = function mul_local_to_gocs(mat, center, dst) { + var m00 = mat[0], + m01 = mat[4], + m02 = mat[8], + m03 = mat[12], + m10 = mat[1], + m11 = mat[5], + m12 = mat[9], + m13 = mat[13], + m20 = mat[2], + m21 = mat[6], + m22 = mat[10], + m23 = mat[14], + m30 = mat[3], + m31 = mat[7], + m32 = mat[11], + m33 = mat[15]; + var t03 = center[0], + t13 = center[1], + t23 = center[2]; + dst[0] = m00; + dst[1] = m10; + dst[2] = m20; + dst[3] = m30; + dst[4] = m01; + dst[5] = m11; + dst[6] = m21; + dst[7] = m31; + dst[8] = m02; + dst[9] = m12; + dst[10] = m22; + dst[11] = m32; + dst[12] = m00 * t03 + m01 * t13 + m02 * t23 + m03; + dst[13] = m10 * t03 + m11 * t13 + m12 * t23 + m13; + dst[14] = m20 * t03 + m21 * t13 + m22 * t23 + m23; + dst[15] = m30 * t03 + m31 * t13 + m32 * t23 + m33; + return dst; +}; +/** + * @summary デバッグ用点群マテリアル(ワイヤーフレーム) + * @memberof mapray.RenderStage + * @extends mapray.RenderStage.Material + * @private + */ + + +var PointCloudDebugWireMaterial = +/*#__PURE__*/ +function (_Material2) { + _inherits(PointCloudDebugWireMaterial, _Material2); + + /** + * @param {mapray.Viewer} viewer 所有者である Viewer + */ + function PointCloudDebugWireMaterial(viewer) { + var _this2; + + _classCallCheck(this, PointCloudDebugWireMaterial); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(PointCloudDebugWireMaterial).call(this, viewer.glenv, point_cloud_debug_wire_vs_code, point_cloud_debug_wire_fs_code)); + + _this2.bindProgram(); + + _this2._color = GeoMath.createVector3([0.0, 0.2, 0.4]); + + _this2.setVector3("u_color", _this2._color); + + _this2._local_to_clip = GeoMath.createMatrixf(); + return _this2; + } + + _createClass(PointCloudDebugWireMaterial, [{ + key: "setDebugBoundsParameter", + value: function setDebugBoundsParameter(stage, center, color) { + mul_local_to_gocs(stage._gocs_to_clip, center, this._local_to_clip); + this.setMatrix("u_obj_to_clip", this._local_to_clip); + + if (color) { + this._color[0] = color[0]; + this._color[1] = color[1]; + this._color[2] = color[2]; + } + + this.setVector3("u_color", this._color); + return true; + } + }]); + + return PointCloudDebugWireMaterial; +}(Material); +/** + * @summary デバッグ用点群マテリアル(サーフェス) + * @memberof mapray.RenderStage + * @extends mapray.RenderStage.Material + * @private + */ + + +var PointCloudDebugFaceMaterial = +/*#__PURE__*/ +function (_Material3) { + _inherits(PointCloudDebugFaceMaterial, _Material3); + + /** + * @param {mapray.Viewer} viewer 所有者である Viewer + */ + function PointCloudDebugFaceMaterial(viewer) { + var _this3; + + _classCallCheck(this, PointCloudDebugFaceMaterial); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PointCloudDebugFaceMaterial).call(this, viewer.glenv, point_cloud_debug_face_vs_code, point_cloud_debug_face_fs_code)); + + _this3.bindProgram(); + + _this3._color = GeoMath.createVector4([0.3, 0.9, 1.0, 0.5]); + + _this3.setVector4("u_color", _this3._color); + + _this3._local_to_clip = GeoMath.createMatrixf(); + return _this3; + } + + _createClass(PointCloudDebugFaceMaterial, [{ + key: "setDebugBoundsParameter", + value: function setDebugBoundsParameter(stage, center, color) { + mul_local_to_gocs(stage._gocs_to_clip, center, this._local_to_clip); + this.setMatrix("u_obj_to_clip", this._local_to_clip); + + if (color) { + this._color[0] = color[0]; + this._color[1] = color[1]; + this._color[2] = color[2]; + this._color[3] = color[3] || 0.0; + } + + this.setVector4("u_color", this._color); + return true; + } + }]); + + return PointCloudDebugFaceMaterial; +}(Material); + +/** + * @summary 点群データを表現するクラス + * @example + * インスタンスの生成は下記のように行う。 + * const provider = new {@link mapray.RawPointCloudProvider}({ + * resource: { + * prefix: "https://..." + * } + * }); + * const point_cloud = viewer.point_cloud_collection.add( provider ); + * point_cloud.setPointShape( {@link mapray.PointCloud.PointShapeType}.GRADIENT_CIRCLE ); + * + * @see mapray.PointCloudProvider + * @see mapray.PointCloudCollection + * @memberof mapray + */ + +var PointCloud = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Scene} scene 所属するシーン + * @param {mapray.PointCloudProvider} provider プロバイダ + */ + function PointCloud(scene, provider) { + _classCallCheck(this, PointCloud); + + this._glenv = scene.glenv; + this._scene = scene; + this._provider = provider; + this._root = Box.createRoot(this); // properties + + this._points_per_pixel = 0.7; + this._point_shape = PointCloud.PointShapeType.CIRCLE; + this._point_size_type = PointCloud.PointSizeType.FLEXIBLE; + this._point_size = 1; + this._point_size_limit = 10; // hidden properties + + this._dispersion = true; + this._debug_shader = false; + this._debug_render_box = false; + this._debug_render_ellipsoid = false; + this._debug_render_axis = false; + this._debug_render_section = false; + + this._checkMaterials(); + + PointCloud._instances.push(this); + } + + _createClass(PointCloud, [{ + key: "init", + + /** + * @summary 初期化 + * mapray.PointCloudBoxCollectorへ追加時に自動的に呼ばれる。 + * @private + */ + value: function () { + var _init = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return this._provider.init(); + + case 2: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function init() { + return _init.apply(this, arguments); + } + + return init; + }() + /** + * @summary 破棄 + * mapray.PointCloudBoxCollectorから削除時に自動的に呼ばれる。 + * @private + */ + + }, { + key: "destroy", + value: function () { + var _destroy = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2() { + var index; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!this._provider) { + _context2.next = 3; + break; + } + + _context2.next = 3; + return this._provider.destroy(); + + case 3: + if (!this._root) { + _context2.next = 7; + break; + } + + _context2.next = 6; + return this._root.dispose(null); + + case 6: + this._root = null; + + case 7: + index = PointCloud._instances.indexOf(this); + + if (index !== -1) { + PointCloud._instances.splice(index, 1); + } + + this._provider = null; + + case 10: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function destroy() { + return _destroy.apply(this, arguments); + } + + return destroy; + }() + /** + * @summary プロバイダ + * @type {mapray.PointCloudProvider} + */ + + }, { + key: "getPointsPerPixel", + // Properties + + /** + * @summary 点群Box読み込みを行う際の解像度[points/pixel] + * @return {number} + */ + value: function getPointsPerPixel() { + return this._points_per_pixel; + } + /** + * @summary 点群Box読み込みを行う際の解像度[points/pixel]を設定 + * @param {number} val 設定する値 + */ + + }, { + key: "setPointsPerPixel", + value: function setPointsPerPixel(val) { + console.assert(val <= 1); + this._points_per_pixel = val; + } + /** + * @summary 点を描画する際の形状 + * @return {mapray.PointCloud.PointShapeType} + */ + + }, { + key: "getPointShape", + value: function getPointShape() { + return this._point_shape; + } + /** + * @summary 点を描画する際の形状を設定 + * @param {mapray.PointCloud.PointShapeType} val 設定する値 + */ + + }, { + key: "setPointShape", + value: function setPointShape(val) { + this._point_shape = val; + } + /** + * @summary 点を描画する際のサイズの指定方法 + * @return {mapray.PointCloud.PointSizeType} + */ + + }, { + key: "getPointSizeType", + value: function getPointSizeType() { + return this._point_size_type; + } + /** + * @summary 点を描画する際のサイズの指定方法を設定 + * @param {mapray.PointCloud.PointSizeType} val 設定する値 + */ + + }, { + key: "setPointSizeType", + value: function setPointSizeType(val) { + this._point_size_type = val; + } + /** + * @summary 点を描画する際のサイズ + * point_size_typeにより単位が異なる + * @see mapray.PointCloud#getPointSizeType + * @return {number} + */ + + }, { + key: "getPointSize", + value: function getPointSize() { + return this._point_size; + } + /** + * @summary 点を描画する際のサイズを設定。 + * {@link mapray.PointCloud#setPointSizeType}により指定された値によって解釈される単位が異なる。 + * @param {number} val 設定する値 + */ + + }, { + key: "setPointSize", + value: function setPointSize(val) { + console.assert(val > 0); + this._point_size = val; + } + /** + * @summary 点を描画する際の最大ピクセルサイズ + * @return {number} + */ + + }, { + key: "getPointSizeLimit", + value: function getPointSizeLimit() { + return this._point_size_limit; + } + /** + * @summary 点を描画する際の最大ピクセルサイズを設定 + * @param {number} val 設定する値 + */ + + }, { + key: "setPointSizeLimit", + value: function setPointSizeLimit(val) { + console.assert(val > 0); + this._point_size_limit = val; + } // hidden properties + + /** + * @private + */ + + }, { + key: "getDispersion", + value: function getDispersion() { + return this._dispersion; + } + /** + * @private + */ + + }, { + key: "setDispersion", + value: function setDispersion(val) { + this._dispersion = val; + } + /** + * @private + */ + + }, { + key: "getDebugShader", + value: function getDebugShader() { + return this._debug_shader; + } + /** + * @private + */ + + }, { + key: "setDebugShader", + value: function setDebugShader(val) { + this._debug_shader = val; + } + /** + * @private + */ + + }, { + key: "setDebugRenderBox", + value: function setDebugRenderBox(val) { + this._debug_render_box = val; + + this._updateDebugMesh(); + } + /** + * @private + */ + + }, { + key: "setDebugRenderEllipsoid", + value: function setDebugRenderEllipsoid(val) { + this._debug_render_ellipsoid = val; + + this._updateDebugMesh(); + } + /** + * @private + */ + + }, { + key: "setDebugRenderAxis", + value: function setDebugRenderAxis(val) { + this._debug_render_axis = val; + + this._updateDebugMesh(); + } + /** + * @private + */ + + }, { + key: "setDebugRenderSection", + value: function setDebugRenderSection(val) { + this._debug_render_section = val; + + this._updateDebugMesh(); + } + /** + * @private + */ + + }, { + key: "_updateDebugMesh", + value: function _updateDebugMesh() { + if (this._root) { + this._root._updateDebugMeshes(); + } + } + /** + * @summary Traverse結果の統計情報を取得。 + * リクエストキューに登録し、{@link mapray.RenderStage}が処理を完了するのを待つ。 + * @return {Promise} + * @private + */ + + }, { + key: "getURL", + + /** + * @summary 指定された level, x, y, z のURLを生成します + * @param {number} level + * @param {number} x + * @param {number} y + * @param {number} z + * @return {string} + * @private + */ + value: function getURL(level, x, y, z) { + return this._urlGenerator(level, x, y, z); + } + /** + * @private + */ + + }, { + key: "_checkMaterials", + value: function _checkMaterials() { + var viewer = this._scene.viewer; + var render_cache = viewer._render_cache || (viewer._render_cache = {}); + + if (!render_cache.point_cloud_materials) { + render_cache.point_cloud_materials = Object.keys(PointShapeType).reduce(function (map, key) { + var point_shape_type = PointShapeType[key]; + map[point_shape_type.id] = new PointCloudMaterial(viewer, { + point_shape_type: point_shape_type + }); + return map; + }, {}); + } + + if (!render_cache.point_cloud_debug_wire_material) { + render_cache.point_cloud_debug_wire_material = new PointCloudDebugWireMaterial(viewer); + } + + if (!render_cache.point_cloud_debug_face_material) { + render_cache.point_cloud_debug_face_material = new PointCloudDebugFaceMaterial(viewer); + } + } + /** + * @private + */ + + }, { + key: "_getMaterial", + value: function _getMaterial(point_shape) { + return this._scene.viewer._render_cache.point_cloud_materials[point_shape.id]; + } + /** + * @private + */ + + }, { + key: "provider", + get: function get() { + return this._provider; + } + /** + * @summary ルートBox + * @type {Box} + * @private + */ + + }, { + key: "root", + get: function get() { + return this._root; + } + }], [{ + key: "requestTraverseSummary", + value: function () { + var _requestTraverseSummary = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3() { + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + return _context3.abrupt("return", new Promise(function (onSuccess) { + var notifier = function notifier(statistics) { + onSuccess(statistics); + var index = PointCloud.getTraverseDataRequestQueue().indexOf(notifier); + if (index !== -1) PointCloud.getTraverseDataRequestQueue().splice(index, 1); + }; + + PointCloud.getTraverseDataRequestQueue().push(notifier); + })); + + case 1: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + function requestTraverseSummary() { + return _requestTraverseSummary.apply(this, arguments); + } + + return requestTraverseSummary; + }() + /** + * @summary Traverse結果取得用のリクエストキューを取得 + * @return {Array} + * @private + */ + + }, { + key: "getTraverseDataRequestQueue", + value: function getTraverseDataRequestQueue() { + return PointCloud._traverseDataRequestQueue || (PointCloud._traverseDataRequestQueue = []); + } + }, { + key: "setStatisticsHandler", + value: function setStatisticsHandler(statistics_handler) { + if (statistics_handler) { + PointCloud._statistics = { + statistics_obj: new Statistics(), + statistics_handler: statistics_handler + }; + } + } + /** + * @private + */ + + }, { + key: "getStatistics", + value: function getStatistics() { + return PointCloud._statistics; + } + /** + * @private + */ + + }, { + key: "getStatisticsHandler", + value: function getStatisticsHandler() { + return PointCloud._statistics_handler; + } + }, { + key: "PointShapeType", + get: function get() { + return PointShapeType; + } + }, { + key: "PointSizeType", + get: function get() { + return PointSizeType; + } + }]); + + return PointCloud; +}(); + +PointCloud._instances = []; +/** + * @private + */ + +var Statistics = +/*#__PURE__*/ +function () { + function Statistics() { + _classCallCheck(this, Statistics); + + this._now = performance ? function () { + return performance.now(); + } : function () { + return Date.now(); + }; + this.clear(); + } + + _createClass(Statistics, [{ + key: "start", + value: function start() { + this._start_time = this._now(); + } + }, { + key: "doneTraverse", + value: function doneTraverse() { + this._done_traverse_time = this._now(); + this.traverse_time += this._done_traverse_time - this._start_time; + } + }, { + key: "done", + value: function done() { + this._done_time = this._now(); + this.render_time += this._done_time - this._done_traverse_time; + this.total_time += this._done_time - this._start_time; + } + }, { + key: "clear", + value: function clear() { + this.render_point_count = 0; + this.total_point_count = 0; + this.render_boxes = 0; + this.total_boxes = 0; + this.loading_boxes = 0; + this.created_boxes = 0; + this.disposed_boxes = 0; + this.total_time = 0.0; + this.traverse_time = 0.0; + this.render_time = 0.0; + } + }]); + + return Statistics; +}(); +/** + * @summary 点描画の種類 + * @constant + * @enum {object} + * @memberof mapray.PointCloud + */ + + +var PointShapeType = { + /** + * 矩形 + */ + RECTANGLE: { + id: "RECTANGLE", + shader_code: 0 + }, + + /** + * 円 + */ + CIRCLE: { + id: "CIRCLE", + shader_code: 1 + }, + + /** + * 境界線付きの円 + */ + CIRCLE_WITH_BORDER: { + id: "CIRCLE_WITH_BORDER", + shader_code: 2 + }, + + /** + * グラデーションで塗り潰した円 + */ + GRADIENT_CIRCLE: { + id: "GRADIENT_CIRCLE", + shader_code: 3 + } +}; +/** + * @summary 点描画のサイズ指定方法の種類 + * @enum {object} + * @constant + * @memberof mapray.PointCloud + */ + +var PointSizeType = { + /** + * setPointSize()により指定された値をピクセルとして解釈する + */ + PIXEL: { + id: "PIXEL" + }, + + /** + * setPointSize()により指定された値をmmとして解釈する + */ + MILLIMETERS: { + id: "MILLIMETERS" + }, + + /** + * setPointSize()により指定された値を参照せず、表示位置に応じて適切なサイズを自動的に指定する。 + */ + FLEXIBLE: { + id: "FLEXIBLE" + } +}; +/** + * @summary 点群ツリーを構成するノード。 + * ルート要素(level === 0) は、Box.createRoot()を用いて作成する。 + * @memberof mapray.PointCloud + * @private + */ + +var Box = +/*#__PURE__*/ +function () { + /** + * @param {Box|null} parent 親Box(level === 0の場合はnull) + * @param {number} level レベル + * @param {number} x x + * @param {number} y y + * @param {number} z z + * @private + */ + function Box(parent, level, x, y, z) { + _classCallCheck(this, Box); + + /** + * @summary 親Box + * @type {Box} + */ + this._parent = parent; + /** + * @summary 所属するPointCloud。 + * ルート要素の場合は Box.createRoot() で設定される。 + * @type {mapray.PointCloud} + */ + + this._owner = parent ? parent._owner : null; + /** + * @summary レベル + * @type {number} + */ + + this.level = level; + /** + * @summary x + * @type {number} + */ + + this.x = x; + /** + * @summary y + * @type {number} + */ + + this.y = y; + /** + * @summary z + * @type {number} + */ + + this.z = z; + /* + 2次元(X,Y)までを下記に図示する。Z軸についても同様。 + ^ Y + | + +-------------+-------------M + | cell (0, 1) | cell (1, 1) | + | | | c: gocs_center [GOCS] + | | | m: gocs_min [GOCS] + | | | M: gocs_max [GOCS] + | | | + +-------------c-------------+ + | cell (0, 0) | cell (1, 0) | + | | | + | | | + | | | + | | | + m-------------+-------------+ --> X + |<--size[m]-->| + */ + + /** + * @summary Box一辺の半分の長さ + * @type {number} + * @private + */ + + var size = this.size = level === 0 ? 2147483648 : // 2^31 + level < 31 ? 1 << 31 - level : Math.pow(0.5, level - 31); + /** + * @summary 軸方向に投影した際の面積 + * @type {number} + * @private + */ + + this.proj_area = 4.0 * this.size * this.size; + /** + * @summary GOCS座標系でのBoxの中心位置 + * @type {mapray.Vector3} + * @private + */ + + this.gocs_center = GeoMath.createVector3([MIN_INT + (2 * x + 1) * size, MIN_INT + (2 * y + 1) * size, MIN_INT + (2 * z + 1) * size]); + /** + * @summary GOCS座標系でのBoxの最小位置 + * @type {mapray.Vector3} + * @private + */ + + this.gocs_min = GeoMath.createVector3([this.gocs_center[0] - size, this.gocs_center[1] - size, this.gocs_center[2] - size]); + /** + * @summary GOCS座標系でのBoxの最大位置 + * @type {mapray.Vector3} + * @private + */ + + this.gocs_max = GeoMath.createVector3([this.gocs_center[0] + size, this.gocs_center[1] + size, this.gocs_center[2] + size]); + /** + * @type {Box.Status} + * @private + */ + + this._status = Box.Status.NOT_LOADED; // (this._status === Box.Status.LOADED) において有効な値 + + /** + * @summary 子Box、セルに関する情報 + * @type {object} + * @private + */ + + this._metaInfo = null; + /** + * @summary 子Box。 + * (u, v, w)のインデックスは (u | v << 1 | w << 2) によって算出される。 + * @type {mapray.Box[]} + * @private + */ + + this._children = [null, null, null, null, null, null, null, null]; + /** + * @type {mapray.Vector3} + * @private + */ + + this.average = null; + /** + * @type {mapray.Vector3} + * @private + */ + + this.eigenVector = null; + /** + * @type {mapray.Vector3} + * @private + */ + + this.eigenVectorLength = null; + /** + * @private + */ + + this._vertex_buffer = null; + /** + * @private + */ + + this._vertex_length = null; + /** + * @private + */ + + this._vertex_attribs = null; + /** + * @private + */ + + this.debug1 = null; + + if (this._owner) { + this._updateDebugMesh(); + } + } + /** + * @private + */ + + + _createClass(Box, [{ + key: "_updateDebugMeshes", + value: function _updateDebugMeshes() { + this._updateDebugMesh(); + + for (var i = 0; i < this._children.length; i++) { + if (this._children[i]) { + this._children[i]._updateDebugMeshes(); + } + } + } + }, { + key: "_updateDebugMesh", + value: function _updateDebugMesh() { + var vertices = []; + var indices = []; + var tindices = []; + + if (this._owner._debug_render_box) { + /* + * 4----------5 + * .´: .´| + * .´ : .´ | + * 0----------1 | + * | 6 - - |----7 + * | .´ | .´ + * |.´ |.´ + * 2----------3 + */ + for (var i = 0; i < Box.CHILDREN_INDICES.length; i++) { + vertices.push(this.size * (2 * Box.CHILDREN_INDICES[i][2] - 1), this.size * (2 * Box.CHILDREN_INDICES[i][1] - 1), this.size * (2 * Box.CHILDREN_INDICES[i][0] - 1)); + } + + indices.push(0, 1, 1, 3, 3, 2, 2, 0, 4, 5, 5, 7, 7, 6, 6, 4, 0, 4, 1, 5, 3, 7, 2, 6); //* + + tindices.push(0, 2, 1, 1, 2, 3, 4, 5, 6, 7, 6, 5, 0, 1, 4, 1, 5, 4, 1, 3, 5, 3, 7, 5, 3, 6, 7, 3, 2, 6, 6, 2, 4, 2, 0, 4); //*/ + } + + if (this.average && !isNaN(this.eigenVector[0][0])) { + if (this._owner._debug_render_axis) { + // Render Normal + var offset = vertices.length / 3; + + for (var _i = 0; _i < 3; _i++) { + var len = Math.max(0.2, this.eigenVectorLength[_i]); + var ev = this.eigenVector[_i]; + + for (var j = 0; j < 3; j++) { + vertices.push(this.average[j] - len * ev[j]); + } + + for (var _j = 0; _j < 3; _j++) { + vertices.push(this.average[_j] + len * ev[_j]); + } + + indices.push(offset++, offset++); + } + } + + if (this._owner._debug_render_section) { + if (this.level > 20 && this.getPointsLength() > 5000 && this.eigenVectorLength[0] < this.size * 0.2) { + // = 10% = (2 * s) / 10 + this._putSectionShapePoints(vertices, indices, tindices); // Render Cross Section + + } + } + + if (this._owner._debug_render_ellipsoid) { + this._putVariancePoints(vertices, indices, tindices); // Render Normal Ring + + } + } + + var meshes = []; + + if (indices.length > 0) { + var mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }], + ptype: "lines", + vertices: vertices, + indices: indices + }; + meshes.push(new Mesh(this._owner._glenv, mesh_data)); + } + + if (tindices.length > 0) { + var _mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }], + ptype: "triangles", + vertices: vertices, + indices: tindices + }; + meshes.push(new Mesh(this._owner._glenv, _mesh_data)); + } + + this.debugMesh = meshes; + } + /** + * @private + */ + + }, { + key: "_putVariancePoints", + value: function _putVariancePoints(vertices, indices, tindices) { + var _this = this; + + var offset = vertices.length / 3; + + var _this$eigenVector = _slicedToArray(this.eigenVector, 3), + e1 = _this$eigenVector[0], + e2 = _this$eigenVector[1], + e3 = _this$eigenVector[2]; + + var _this$eigenVectorLeng = _slicedToArray(this.eigenVectorLength, 3), + e1l = _this$eigenVectorLeng[0], + e2l = _this$eigenVectorLeng[1], + e3l = _this$eigenVectorLeng[2]; + + var G = 6; + var N = 12; + + var cache = PointCloud._variance_points_cache || function () { + var c = { + cos_ro: [], + sin_ro: [], + cos_th: [], + sin_th: [] + }; + + for (var j = 0; j <= G; ++j) { + var ro = Math.PI * j / G; + c.cos_ro[j] = Math.cos(ro); + c.sin_ro[j] = Math.sin(ro); + } + + for (var i = 0; i <= N; ++i) { + var th = 2 * Math.PI * i / N; + c.cos_th[i] = Math.cos(th); + c.sin_th[i] = Math.sin(th); + } + + return PointCloud._variance_points_cache = c; + }(); + + var putPoint = function putPoint(ro, th, vs) { + var cos_ro = cache.cos_ro[ro]; + var sin_ro = cache.sin_ro[ro]; + var cos_th = cache.cos_th[th]; + var sin_th = cache.sin_th[th]; + vs.push(_this.average[0] + sin_ro * (e2l * cos_th * e2[0] + e3l * sin_th * e3[0]) + e1l * cos_ro * e1[0], _this.average[1] + sin_ro * (e2l * cos_th * e2[1] + e3l * sin_th * e3[1]) + e1l * cos_ro * e1[1], _this.average[2] + sin_ro * (e2l * cos_th * e2[2] + e3l * sin_th * e3[2]) + e1l * cos_ro * e1[2]); + }; + + for (var j = 0; j <= G; ++j) { + for (var i = 0; i <= N; ++i) { + putPoint(j, i, vertices); + } + } + + for (var _j2 = 0; _j2 < G; ++_j2) { + for (var _i2 = 0; _i2 < N; ++_i2) { + var p = offset + _j2 * (N + 1) + _i2; + indices.push(p, p + 1, p, p + N + 1); + tindices.push(p, p + 1, p + N + 1, p + N + 1, p + 1, p + N + 2); + } + } + } + /** + * @private + */ + + }, { + key: "_putSectionShapePoints", + value: function _putSectionShapePoints(vertices, indices, tindices) { + var offset = vertices.length / 3; + var a = this.average; + var e = this.eigenVector[0]; + var s = this.size; + var l = Math.sqrt(e[0] * e[0] + e[1] * e[1] + e[2] * e[2]); + var ue = [e[0] / l, e[1] / l, e[2] / l]; + var ps = []; + /* + Compute Intersection(c) of Plane(a, ue) and Line(p, v) + \ a: average point + \ ue ue: eigenVector (normal vector) + a-¯¯ p: point + \ v: vector + p---> . . c c = p + alpha v + v \ + \ (a - p) ue + |-------->| \ alpha = ------------ + alpha v \ v ue + */ + + var q = []; + + for (var i = 0; i < 2; ++i) { + for (var j = 0; j < 2; ++j) { + q.push({ + p: [i > 0 ? s : -s, j > 0 ? s : -s, 0], + v: [0, 0, s] + }, { + p: [j > 0 ? s : -s, 0, i > 0 ? s : -s], + v: [0, s, 0] + }, { + p: [0, i > 0 ? s : -s, j > 0 ? s : -s], + v: [s, 0, 0] + }); + } + } + + var n, t; + + for (var _i3 = 0; _i3 < q.length; _i3++) { + var p = q[_i3].p; + var v = q[_i3].v; + var alpha = ((a[0] - p[0]) * ue[0] + (a[1] - p[1]) * ue[1] + (a[2] - p[2]) * ue[2]) / (v[0] * ue[0] + v[1] * ue[1] + v[2] * ue[2]); + + if (Math.abs(alpha) <= 1.0) { + var c = [p[0] + alpha * v[0], p[1] + alpha * v[1], p[2] + alpha * v[2]]; + var lp = [c[0] - a[0], c[1] - a[1], c[2] - a[2]]; + var angle = void 0; + + if (n) { + angle = Math.atan2(t[0] * lp[0] + t[1] * lp[1] + t[2] * lp[2], n[0] * lp[0] + n[1] * lp[1] + n[2] * lp[2]); + } else { + angle = 0; + t = [ue[1] * lp[2] - ue[2] * lp[1], ue[2] * lp[0] - ue[0] * lp[2], ue[0] * lp[1] - ue[1] * lp[0]]; + n = [t[1] * ue[2] - t[2] * ue[1], t[2] * ue[0] - t[0] * ue[2], t[0] * ue[1] - t[1] * ue[0]]; + } + + ps.push([].concat(c, [angle, lp[0], lp[1], lp[2], n[0] * lp[0] + n[1] * lp[1] + n[2] * lp[2], t[0] * lp[0] + t[1] * lp[1] + t[2] * lp[2]])); + } + } + + ps.sort(function (a, b) { + return a[3] - b[3]; + }); + + for (var _i4 = 0; _i4 < ps.length; ++_i4) { + vertices.push(ps[_i4][0], ps[_i4][1], ps[_i4][2]); + indices.push(offset + _i4); + if (_i4 == ps.length - 1) indices.push(offset);else indices.push(offset + _i4 + 1); + + if (tindices) { + tindices.push(offset, offset + _i4); + if (_i4 == ps.length - 1) tindices.push(offset);else tindices.push(offset + _i4 + 1); + } + } + } + /** + * @summary 読み込みステータス + * @type {mapray.PointCloud.Box.Status} + */ + + }, { + key: "getChildInfo", + + /** + * @summary 子Boxの情報を取得 + * + * @param {number} index 番号 + * @return {Box} + */ + value: function getChildInfo(index) { + if (!this._metaInfo) return null; + return this._metaInfo.children[index]; + } + /** + * @summary Box領域を8分割した領域ごとに点が存在するかを調べる。 + * + * @param {number} index 子Boxと同様の順番 + * @return {boolean} 点が存在する場合に true となる。 + */ + + }, { + key: "cellPointsAvailable", + value: function cellPointsAvailable(index) { + return this._metaInfo && (index === 0 ? this._metaInfo.indices[index] > 0 : this._metaInfo.indices[index] > this._metaInfo.indices[index - 1]); + } + /** + * @summary Boxに含まれる点の数 + * + * @return {number} + */ + + }, { + key: "getPointsLength", + value: function getPointsLength() { + return this._metaInfo ? this._metaInfo.indices[7] : 0; + } + /** + * @summary 子Boxの番号を返します。 + * @param {Box} child 子Box + * @return {number} + */ + + }, { + key: "indexOf", + value: function indexOf(child) { + return this._children.indexOf(child); + } + /** + * @summary カリングするか? + * @param {mapray.Vector4[]} clip_planes クリップ平面配列 + * @return {boolean} 見えないとき true, 見えるまたは不明のとき false + */ + + }, { + key: "isInvisible", + value: function isInvisible(clip_planes) { + if (this.level === 0) return false; + var xmin = this.gocs_min[0]; + var xmax = this.gocs_max[0]; + var ymin = this.gocs_min[1]; + var ymax = this.gocs_max[1]; + var zmin = this.gocs_min[2]; + var zmax = this.gocs_max[2]; + + for (var i = 0; i < clip_planes.length; ++i) { + var p = clip_planes[i]; + var px = p[0]; + var py = p[1]; + var pz = p[2]; + var pw = p[3]; // 以下がすべて成り立つとボックス全体は平面の裏側にある + // px*xmin + py*ymin + pz*zmin + pw < 0 + // px*xmax + py*ymin + pz*zmin + pw < 0 + // px*xmin + py*ymax + pz*zmin + pw < 0 + // px*xmax + py*ymax + pz*zmin + pw < 0 + // px*xmin + py*ymin + pz*zmax + pw < 0 + // px*xmax + py*ymin + pz*zmax + pw < 0 + // px*xmin + py*ymax + pz*zmax + pw < 0 + // px*xmax + py*ymax + pz*zmax + pw < 0 + + var c0 = px * xmin + py * ymin; + var c1 = px * xmax + py * ymin; + var c2 = px * xmin + py * ymax; + var c3 = px * xmax + py * ymax; + var c4 = -pz * zmin - pw; + var c5 = -pz * zmax - pw; + + if (c0 < c4 && c1 < c4 && c2 < c4 && c3 < c4 && c0 < c5 && c1 < c5 && c2 < c5 && c3 < c5) { + // ボックス全体が平面の裏側にあるので見えない + return true; + } + } + + return false; // 見えている可能性がある + } + /** + * @summary 点群の読み込み処理 + * + * @return {Promise} + */ + + }, { + key: "load", + value: function load() { + var _this2 = this; + + if (this._status !== Box.Status.NOT_LOADED) throw new Error("illegal status: " + this._status.id); + if (!this._owner._provider.isReady()) return; + this._status = Box.Status.LOADING; + + var task = this._owner._provider.load(this.level, this.x, this.y, this.z, true); + + this._loadId = task.id; + return task.done.then(function (event) { + _this2._metaInfo = { + children: [], + indices: event.header.indices + }; + { + var childFlags = event.header.childFlags; + + for (var i = 7; i >= 0; --i) { + _this2._metaInfo.children[i] = childFlags & 1 ? {} : null; + childFlags = childFlags >> 1; + } + } + _this2.average = event.header.average; + _this2.eigenVector = event.header.eigenVector; + _this2.eigenVectorLength = event.header.eigenVectorLength; + _this2.debug1 = event.header.debug1; + var values = event.body; + console.assert(values.length > 0); + console.assert(values.length / 6 === _this2._metaInfo.indices[7]); + + { + var number_of_points = values.length / 6; + + for (var _i5 = 0; _i5 < 8; ++_i5) { + if (_this2._metaInfo.indices[_i5] > number_of_points) { + console.log("warning fix indices"); + _this2._metaInfo.indices[_i5] = number_of_points; + } + } + } + + var gl = _this2._owner._glenv.context; + _this2._vertex_buffer = gl.createBuffer(); + _this2._vertex_length = values.length / 6; + gl.bindBuffer(gl.ARRAY_BUFFER, _this2._vertex_buffer); + gl.bufferData(gl.ARRAY_BUFFER, values, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, null); + /* + * +------------+------------+---- + * | a_position | a_color | ... + * +------------+------------+---- + * + * |<--12 bit-->|<--12 bit-->| + */ + + _this2._vertex_attribs = { + "a_position": { + buffer: _this2._vertex_buffer, + num_components: 3, + component_type: gl.FLOAT, + normalized: false, + byte_stride: 24, + byte_offset: 0 + }, + "a_color": { + buffer: _this2._vertex_buffer, + num_components: 3, + component_type: gl.FLOAT, + normalized: false, + byte_stride: 24, + byte_offset: 12 + } + }; + _this2._status = Box.Status.LOADED; + + _this2._updateDebugMesh(); + })["catch"](function (error) { + var skip_error = error.message === "cancel" || error.message === "not loading" || error.message === "The user aborted a request." || error.is_aborted; + + if (!skip_error) { + console.log(error); + _this2._status = Box.Status.DESTROYED; + } + }); + } + /** + * @summary 子Boxを生成。(すでに存在する場合は既存のBoxを返す) + * LOADED 状態でのみ呼ぶことができる + * + * @param {number} index 番号 + * @param {object} [statistics] 統計情報 + * @return {Box} + */ + + }, { + key: "newChild", + value: function newChild(index, statistics) { + var _Box$CHILDREN_INDICES = _slicedToArray(Box.CHILDREN_INDICES[index], 3), + u = _Box$CHILDREN_INDICES[0], + v = _Box$CHILDREN_INDICES[1], + w = _Box$CHILDREN_INDICES[2]; + + return this.newChildAt(u, v, w, statistics); + } + /** + * @summary 子Boxを生成。(すでに存在する場合は既存のBoxを返す) + * LOADED 状態でのみ呼ぶことができる + * + * @param {number} u x方向-側は0、+側は1 + * @param {number} v y方向-側は0、+側は1 + * @param {number} w z方向-側は0、+側は1 + * @param {object} [statistics] 統計情報 + * @return {Box} + */ + + }, { + key: "newChildAt", + value: function newChildAt(u, v, w, statistics) { + console.assert(this._status === Box.Status.LOADED); + var index = u | v << 1 | w << 2; + var child = this._children[index]; + if (child) return child; + if (!this.getChildInfo(index)) return null; + if (statistics) statistics.created_boxes++; + return this._children[index] = new Box(this, this.level + 1, this.x << 1 | u, this.y << 1 | v, this.z << 1 | w); + } + /** + * @summary 子Boxを取得。 + * 存在しない場合は null を返却する。 + * + * @param {number} index 番号 + * @return {Box} + */ + + }, { + key: "getChild", + value: function getChild(index) { + return this._children[index]; + } + /** + * デバッグメッシュを描画 + * + * @param {mapray.RenderStage} render_stage レンダリングステージ + */ + + }, { + key: "_drawDebugMesh", + value: function _drawDebugMesh(render_stage) { + if (!this.debugMesh) return; + var gl = render_stage._glenv.context; + var color = Box.STATUS_COLOR_TABLE[this._status.id]; + gl.disable(gl.CULL_FACE); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this.debugMesh[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var debugMesh = _step.value; + var debug_material = debugMesh._draw_mode === 1 ? this._owner._scene.viewer._render_cache.point_cloud_debug_wire_material : this._owner._scene.viewer._render_cache.point_cloud_debug_face_material; + debug_material.bindProgram(); + debug_material.setDebugBoundsParameter(render_stage, this.gocs_center, color); + debugMesh.draw(debug_material); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + gl.enable(gl.CULL_FACE); + } + /** + * @summary Boxを描画する。 + * Box全体の描画および、Boxの8分割単位での描画に対応。 + * + * @param {mapray.RenderStage} render_stage レンダリングステージ + * @param {number[]|null} target_cells 描画対象の子番号の配列。ただしnullは全体を表す。 + * @param {number[]} points_per_pixels 点の解像度の配列。target_cells同じ順序であり、nullの場合は要素数1となる。 + * @param {object} statistics 統計情報 + */ + + }, { + key: "draw", + value: function draw(render_stage, target_cells, points_per_pixels, statistics) { + if (this.debugMesh) { + this._drawDebugMesh(render_stage); + } + + if (this._status !== Box.Status.LOADED) return; + var gl = render_stage._glenv.context; + var point_shape = this._owner._point_shape; + var point_size_type = this._owner._point_size_type; + var point_size = this._owner._point_size; + var point_size_limit = this._owner._point_size_limit; + var debug_shader = this._owner._debug_shader; + + if (this._status === Box.Status.LOADED) { + var material = this._owner._getMaterial(point_shape); + + material.bindProgram(); + material.setDebugBoundsParameter(render_stage, this.gocs_center); + material.bindVertexAttribs(this._vertex_attribs); + var overlap_scale = 3; + + if (target_cells === null) { + // draw whole points + var ppp = points_per_pixels[0]; + material.setPointSize(point_size_type === PointCloud.PointSizeType.PIXEL ? point_size : point_size_type === PointCloud.PointSizeType.MILLIMETERS ? -0.001 * point_size / render_stage._pixel_step : Math.min(point_size_limit, Math.max(1.0, overlap_scale / ppp))); + material.setDebug(debug_shader ? 0.5 / ppp : -1.0); + gl.drawArrays(gl.POINTS, 0, this._vertex_length); + } else { + // draw only target regions + for (var i = 0; i < target_cells.length; i++) { + var _ppp = points_per_pixels[i]; + material.setPointSize(point_size_type === PointCloud.PointSizeType.PIXEL ? point_size : point_size_type === PointCloud.PointSizeType.MILLIMETERS ? -0.001 * point_size / render_stage._pixel_step : Math.min(point_size_limit, Math.max(1.0, overlap_scale / _ppp))); + material.setDebug(debug_shader ? 0.5 / _ppp : -1.0); + var childIndex = target_cells[i]; + var offset = childIndex > 0 ? this._metaInfo.indices[childIndex - 1] : 0; + var length = this._metaInfo.indices[childIndex] - offset; + if (length > 0) gl.drawArrays(gl.POINTS, offset, length); + } + } + + gl.bindBuffer(gl.ARRAY_BUFFER, null); + + if (statistics) { + statistics.render_boxes++; + + if (target_cells && this._metaInfo.indices) { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = target_cells[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var _childIndex = _step2.value; + + var _offset = _childIndex > 0 ? this._metaInfo.indices[_childIndex - 1] : 0; + + var _length = this._metaInfo.indices[_childIndex] - _offset; + + statistics.render_point_count += _length; + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } else { + statistics.render_point_count += this._vertex_length; + } + } + } + } + /** + * @summary 子孫Boxを全て削除する。 + * 全ての状態でこの関数を呼ぶことができ、複数回呼ぶことができる。 + * @param {object} [statistics] 統計情報 + */ + + }, { + key: "disposeChildren", + value: function disposeChildren(statistics) { + for (var i = 0; i < this._children.length; i++) { + if (this._children[i]) { + this._children[i].dispose(statistics); + + this._children[i] = null; + } + } + } + /** + * @summary Boxを破棄します。子孫Boxも全て削除する。 + * 全ての状態でこの関数を呼ぶことができ、複数回呼ぶことができる。 + * @param {object} [statistics] 統計情報 + */ + + }, { + key: "dispose", + value: function dispose(statistics) { + if (this._status === Box.Status.LOADING) { + if (this._abort_controller) { + this._abort_controller.abort(); + } + + this._owner._provider.cancel(this._loadId); + } + + this.disposeChildren(statistics); + + if (this._vertex_buffer) { + var gl = this._owner._glenv.context; + gl.deleteBuffer(this._vertex_buffer); + this._vertex_buffer = null; + } + + if (this.debugMesh) ; + + if (statistics) statistics.disposed_boxes++; + this._status = Box.Status.DESTROYED; + } + /** + * @summary Boxの文字列表現を返します。 + * @return {string} + */ + + }, { + key: "toString", + value: function toString() { + return "Box-".concat(this.level, "-").concat(this.x, "-").concat(this.y, "-").concat(this.z); + } + /** + * @summary Boxのツリー形式の文字列表現を返します。 + * @param {string} [indent] ルート要素のインデント文字列を指定します。 + * @return {string} + */ + + }, { + key: "toTreeString", + value: function toTreeString() { + var indent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + return this._children.reduce(function (text, child) { + return text + (child ? "\n" + child.toTreeString(indent + " ") : ""); + }, indent + this.toString()); + } + /** + * ルートBoxを生成します。 + * @param {mapray.PointCloud} owner + * @return {Box} + */ + + }, { + key: "status", + get: function get() { + return this._status; + } + /** + * @summary 読み込みが完了しているか + * + * @type {boolean} + */ + + }, { + key: "is_loaded", + get: function get() { + return this._status === Box.Status.LOADED; + } + /** + * @summary 親ノード + * + * @type {Box} + */ + + }, { + key: "parent", + get: function get() { + return this._parent; + } + }], [{ + key: "createRoot", + value: function createRoot(owner) { + var box = new Box(null, 0, 0, 0, 0); + box._owner = owner; + return box; + } + }, { + key: "Status", + get: function get() { + return Status$2; + } + }]); + + return Box; +}(); + +Box.CHILDREN_INDICES = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [0, 0, 1], [1, 0, 1], [0, 1, 1], [1, 1, 1]]; +/** + * @summary Boxの状態。 + *
+ *                                                                      
+ *              load()                            dispose()             
+ * NOT_LOADED ---------> LOADING -------> LOADED -----------> DESTROYED 
+ *                              \                          /            
+ *                               `------>-----------------´             
+ *                                  error or dispose()                  
+ * 
+ * @enum {object} + * @memberof mapray.PointCloud.Box + * @constant + * @see mapray.PointCloud.Box#status + */ + +var Status$2 = { + /** + * 準備中 (初期状態)。 + * load()を呼ぶと LOADING へ遷移し読み込み処理が開始される。 + */ + NOT_LOADED: { + id: "NOT_LOADED" + }, + + /** + * 読み込み中。 + * 読み込み処理が終了すると、LOADED か DESTROYED のいずれかに遷移する。 + * 正常に処理が完了すると LOADED 、何らかのエラーが発生した場合は DESTROYED となる。 + * また、LOADING 中に dispose() が呼ばれた場合、即座に DESTROYED に遷移する。 + */ + LOADING: { + id: "LOADING" + }, + + /** + * 読み込み完了(描画可能)。 + * dispose()を呼ぶと DESTROYED に遷移する。 + */ + LOADED: { + id: "LOADED" + }, + + /** + * 破棄状態 + * 他の状態に遷移することはない。 + */ + DESTROYED: { + id: "DESTROYED" + } +}; +Box.STATUS_COLOR_TABLE = {}; +{ + Box.STATUS_COLOR_TABLE[Box.Status.LOADED.id] = [0.0, 0.8, 1.0, 0.5]; + Box.STATUS_COLOR_TABLE[Box.Status.DESTROYED.id] = [1.0, 0.0, 0.0]; + Box.STATUS_COLOR_TABLE[Box.Status.LOADING.id] = [1.0, 1.0, 0.0]; + Box.STATUS_COLOR_TABLE[Box.Status.NOT_LOADED.id] = [0.0, 1.0, 0.0]; +} +var MIN_INT = 1 << 31; + +/** + * @summary Boxをレンダリングするためのオブジェクト + * + * @memberof mapray + * @private + */ + +var PointCloudBoxRenderObject = +/*#__PURE__*/ +function () { + /** + * @param {mapray.PointCloud.Box} box 描画対象 + * @param {number} distance 視点からBoxまでの距離 + * @param {number} parent_points_per_pixel 親Boxの点の細かさ + */ + function PointCloudBoxRenderObject(box, distance, parent_points_per_pixel) { + _classCallCheck(this, PointCloudBoxRenderObject); + + this._box = box; + this._distance = distance; + this._target_children = []; + this._points_per_pixel = []; + this._parent_points_per_pixel = parent_points_per_pixel; + } + /** + * @summary 描画対象 + * @type {mapray.PointCloud.Box} + */ + + + _createClass(PointCloudBoxRenderObject, [{ + key: "pushRegion", + + /** + * @summary 描画対象領域を追加する + * @param {number} child 領域 + * @param {number} points_per_pixel 描画する点の細かさ + */ + value: function pushRegion(child, points_per_pixel) { + if (this._target_children !== null) { + var index = this._target_children.indexOf(child); + + if (index === -1) { + this._target_children.push(child); + + this._points_per_pixel.push(points_per_pixel); + } else { + this._target_children[index] = child; + this._points_per_pixel[index] = points_per_pixel; + } + } + } + /** + * @summary 描画対象を全領域にする + * @param {number} points_per_pixel 描画する点の細かさ + */ + + }, { + key: "setWholeRegion", + value: function setWholeRegion(points_per_pixel) { + this._target_children = null; + this._points_per_pixel = [points_per_pixel]; + } + /** + * @summary 描画 + * @param {mapray.RenderStage} render_stage レンダリングステージ + * @param {object} statistics 統計情報 + */ + + }, { + key: "draw", + value: function draw(render_stage, statistics) { + this._box.draw(render_stage, this._target_children, this._points_per_pixel, statistics); + } + }, { + key: "box", + get: function get() { + return this._box; + } + /** + * @summary カメラからの距離 + * @type {number} + */ + + }, { + key: "distance", + get: function get() { + return this._distance; + } + /** + * @summary 親Boxの点の解像度 + * @type {number} + */ + + }, { + key: "parent_points_per_pixel", + get: function get() { + return this._parent_points_per_pixel; + } + }]); + + return PointCloudBoxRenderObject; +}(); + +/** + * @summary Boxを収集するツール + * @memberof mapray + * @private + */ + +var PointCloudBoxCollector = +/*#__PURE__*/ +function () { + /** + * @param {mapray.RenderStage} stage 所有者である RenderStage + * @param {number} load_limit 読み込みが必要なBoxリストに保持する要素数の上限 + */ + function PointCloudBoxCollector(stage) { + var load_limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10; + + _classCallCheck(this, PointCloudBoxCollector); + + this._setupViewVectors(stage); + + this._setupClipPlanes(stage); + + this._point_cloud_collection = stage._point_cloud_collection; + /** + * 描画するBoxのリスト。 + * @private + */ + + this._render_boxes = []; + /** + * Box => PointCloudBoxRenderObject の辞書 + * @private + */ + + this._render_boxes_map = new Map(); + /** + * 読み込みが必要なBoxリスト。常に優先度でソート済み。 + * @private + */ + + this._load_boxes = []; + /** + * 読み込みが必要なBoxリストの要素数の上限 + * @private + */ + + this._load_limit = load_limit; + } + /** + * @private + */ + + + _createClass(PointCloudBoxCollector, [{ + key: "_setupViewVectors", + value: function _setupViewVectors(stage) { + var view_to_gocs = stage._view_to_gocs; + var pixel_step = stage._pixel_step; + var view_pos_Q = GeoMath.createVector3(); + var view_dir_wU = GeoMath.createVector3(); // 地表詳細レベル (LOD) 計算用の Q, w*U ベクトルを設定 + + view_pos_Q[0] = view_to_gocs[12]; + view_pos_Q[1] = view_to_gocs[13]; + view_pos_Q[2] = view_to_gocs[14]; + view_dir_wU[0] = -view_to_gocs[8] * pixel_step; + view_dir_wU[1] = -view_to_gocs[9] * pixel_step; + view_dir_wU[2] = -view_to_gocs[10] * pixel_step; + /** + * @summary 位置ベクトル Q + * @member mapray.FlakeCollector#_view_pos_Q + * @type {mapray.Vector3} + * @private + * @see doc/ImageLevelCalculation.txt + */ + + this._view_pos_Q = view_pos_Q; + /** + * @summary ベクトル w * U + * @member mapray.FlakeCollector#_view_dir_wU + * @type {mapray.Vector3} + * @private + * @see doc/ImageLevelCalculation.txt + */ + + this._view_dir_wU = view_dir_wU; + } + /** + * @private + */ + + }, { + key: "_setupClipPlanes", + value: function _setupClipPlanes(stage) { + var view_to_gocs = stage._view_to_gocs; + var gocs_to_view = stage._gocs_to_view; + this.volume_planes = stage._volume_planes; // const volume_planes = stage._volume_planes; + + var clip_planes = []; // 地表遮蔽カリング平面 + + var root_flake = stage._viewer._globe.root_flake; + var rmin = GeoMath.EARTH_RADIUS + root_flake.height_min; // 最小半径 + + var rmax = GeoMath.EARTH_RADIUS + root_flake.height_max; // 最大半径 + // P (視点位置) + + var px = view_to_gocs[12]; + var py = view_to_gocs[13]; + var pz = view_to_gocs[14]; // q = √[(P.P - rmin^2)(rmax^2 - rmin^2)] - rmin^2 + + var p2 = px * px + py * py + pz * pz; + var rmin2 = rmin * rmin; + var rmax2 = rmax * rmax; + var q = Math.sqrt((p2 - rmin2) * (rmax2 - rmin2)) - rmin2; // L = / ‖P‖ + + var plane = GeoMath.createVector4(); + var recip = 1 / Math.sqrt(p2); + plane[0] = px * recip; + plane[1] = py * recip; + plane[2] = pz * recip; + plane[3] = q * recip; // clip_planes.push( plane ); + // L を基とした遠方距離 + + var far_dist = Math.sqrt(p2 + rmax2 + 2 * q); // 視体積平面を取得して、地心直交座標系に変換 + // (直交変換なので x, y, z は正規化されている) + + for (var i = 0; i < 6; ++i) { + var src_plane = this.volume_planes[i]; + var dst_plane = GeoMath.createVector4(); + + if (i == 1 && src_plane[3] > far_dist) { + // 遠方平面が必要以上に遠いとき far_dist に置き換える + src_plane = GeoMath.createVector4(src_plane); + src_plane[3] = far_dist; + } + + GeoMath.transformPlane_A(gocs_to_view, src_plane, dst_plane); + clip_planes.push(dst_plane); + } + + this._clip_planes = clip_planes; + } + /** + * @summary 点群Boxを収集する + * @param {mapray.PointCloud} point_cloud 点群 + * @param {object} statistics 統計情報 + * @return {mapray.RenderFlake[]} 収集された点群Boxの集合 + */ + + }, { + key: "traverse", + value: function traverse(point_cloud, statistics) { + this._points_per_pixel = point_cloud.getPointsPerPixel(); + this._dispersion = point_cloud.getDispersion(); + this._statistics = statistics; + + this._updateBox(point_cloud.root, 0); + + return { + visible_boxes: this._render_boxes, + load_boxes: this._load_boxes + }; + } + /** + * @private + */ + + }, { + key: "_updateBox", + value: function _updateBox(box, parent_ppp) { + if (this._statistics) { + this._statistics.total_boxes++; + if (box.status === Box.Status.LOADING) this._statistics.loading_boxes++; + + if (box.getPointsLength()) { + this._statistics.total_point_count += box.getPointsLength(); + } + } + + if (box.isInvisible(this._clip_planes)) { + box.disposeChildren(this._statistics); + return; + } + + var box_ppp, lodStatus; + + if (box.is_loaded) { + box_ppp = this._calcPointsPerPixel(box); + lodStatus = box_ppp < this._points_per_pixel ? LodStatus.LOAD_NEXT_LEVEL : LodStatus.UNLOAD_NEXT_LEVEL; + } else { + lodStatus = LodStatus.KEEP_STATUS; + } + + if (lodStatus === LodStatus.LOAD_NEXT_LEVEL) { + // if more detaild data is required then load nextLevel + // 子Boxがない領域を描画する + // [A] + // |--a1--[B] + // |--a2--[C] + // `--a3-- x + // - Aは、8分割された領域のうち、a1, a2, a3の領域に点が含まれている。 + // - このうちa1, a2については子Box(B, C)を持っており、a3は子Boxを持っていない。 + // - この場合、a3の領域についはAが描画する。(a1, a2の領域については、B, Cにより描画される) + this._collectNextLevel(box, box_ppp); + + for (var i = 0; i < 8; i++) { + if (box.cellPointsAvailable(i) && !box.getChild(i)) { + this._pushBox(box, i, box_ppp, parent_ppp); + } + } + + return; + } + + if (lodStatus === LodStatus.UNLOAD_NEXT_LEVEL) { + // if more detaild data is not required then dispose children + box.disposeChildren(this._statistics); + } + + if (box.status !== Box.Status.DESTROYED) { + // [A] + // |--a1--[B] + // |--a2--[C] + // `--a3-- x + // - Bが読み込まれている場合はBを描画する。 + // - Bの読み込みが完了するまでは、Aがa1領域を描画する(読み込み中は枠のみ描画される場合があるため、Bも描画する)。 + this._pushBox(box, null, box_ppp, parent_ppp); + + if (box.status === Box.Status.LOADING || box.status === Box.Status.NOT_LOADED) { + if (box.level > 1) { + this._pushBox(box.parent, box.parent.indexOf(box), parent_ppp, parent_ppp); + } + } + } + } + /** + * @スクリーン1画素あたりの点の数[points/pixel]を計算する。 + * 例えば、2画素につき1点の間隔で並んでいる場合は0.5を返す。 + * @param {mapray.PointCloud.Box} box Box + * @private + */ + + }, { + key: "_calcPointsPerPixel", + value: function _calcPointsPerPixel(box) { + var is_plane = box.eigenVectorLength[0] < box.size * 0.8; + var points_per_pixel; + + if (is_plane && this._dispersion && box.eigenVectorLength[0] > 0) { + var dir = GeoMath.normalize3(this._view_dir_wU, GeoMath.createVector3f()); + + var _box$eigenVector = _slicedToArray(box.eigenVector, 3), + ev1 = _box$eigenVector[0], + ev2 = _box$eigenVector[1], + ev3 = _box$eigenVector[2]; + + var _box$eigenVectorLengt = _slicedToArray(box.eigenVectorLength, 3), + ev1l = _box$eigenVectorLengt[0], + ev2l = _box$eigenVectorLengt[1], + ev3l = _box$eigenVectorLengt[2]; + + var n = [GeoMath.dot3(ev2, dir), GeoMath.dot3(ev1, dir), GeoMath.dot3(ev3, dir)]; + var s = n[0] * n[0] / (ev2l * ev2l) + n[2] * n[2] / (ev3l * ev3l); + var nn = [s * ev3l * ev1l / ev2l * n[0], s * ev2l * ev3l / ev1l * n[1], s * ev1l * ev2l / ev3l * n[2]]; + GeoMath.normalize3(nn, nn); + var area_calc = (nn[0] * n[0] + nn[1] * n[1] + nn[2] * n[2]) * (Math.PI * ev1l * ev2l * ev3l / Math.sqrt(nn[0] * nn[0] * ev2l * ev2l + nn[1] * nn[1] * ev1l * ev1l + nn[2] * nn[2] * ev3l * ev3l)); + var area = Math.min(Math.max(area_calc, 0.05 * box.proj_area), box.proj_area); + points_per_pixel = Math.sqrt(box.getPointsLength() / area); + } else { + points_per_pixel = 64 / box.size; // (128 / (2*box.size)) = 1セルの大きさ(点の間隔) + } + + var diff = [box.gocs_center[0] + box.average[0] - this._view_pos_Q[0], box.gocs_center[1] + box.average[1] - this._view_pos_Q[1], box.gocs_center[2] + box.average[2] - this._view_pos_Q[2]]; // ω スクリーン上の1画素の一辺の長さを、box.averageの位置に投影した長さ + + var ω = GeoMath.dot3(this._view_dir_wU, diff); + return ω * points_per_pixel; + } + /** + * @summary 描画対象を追加 + * + * @param {mapray.PointCloud.Box} box + * @param {number|null} targetChild cell領域を指定する場合は数字、全体を描画する場合はnullを指定する + * @param ppp 描画時の解像度 (points per pixel) + * @param parent_ppp 親Boxの描画時の解像度 (points per pixel) + * @private + */ + + }, { + key: "_pushBox", + value: function _pushBox(box, target_child, ppp, parent_ppp) { + var ro = this._render_boxes_map.get(box); + + if (ro) { + if (target_child === null) ro.setWholeRegion(ppp);else ro.pushRegion(target_child, ppp); + } else { + var diff = box.is_loaded ? [box.gocs_center[0] + box.average[0] - this._view_pos_Q[0], box.gocs_center[1] + box.average[1] - this._view_pos_Q[1], box.gocs_center[2] + box.average[2] - this._view_pos_Q[2]] : [box.gocs_center[0] - this._view_pos_Q[0], box.gocs_center[1] - this._view_pos_Q[1], box.gocs_center[2] - this._view_pos_Q[2]]; + var distance = Math.sqrt(diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2]); + ro = new PointCloudBoxRenderObject(box, distance, parent_ppp); + if (target_child === null) ro.setWholeRegion(ppp);else ro.pushRegion(target_child, ppp); + + this._render_boxes.push(ro); + + this._render_boxes_map.set(box, ro); + + if (box.status === Box.Status.NOT_LOADED) { + this._pushLoadBox(ro); + } + } + } + /** + * @summary 描画対象を追加 + * + * @param {mapray.PointCloud.Box} box + * @param {number|null} targetChild cell領域を指定する場合は数字、全体を描画する場合はnullを指定する + * @param ppp 描画時の解像度 (points per pixel) + * @param parent_ppp 親Boxの描画時の解像度 (points per pixel) + * @private + */ + + }, { + key: "_pushLoadBox", + value: function _pushLoadBox(ro) { + var index = this._binarySearch(this._load_boxes, ro, function (ro1, ro2) { + return ro1.parent_points_per_pixel < ro2.parent_points_per_pixel; + }); // this._load_boxes.splice( index, 0, ro ); + + + if (index === -1) this._load_boxes.push(ro);else this._insert_with_limit(this._load_boxes, index, ro, this._load_limit); + } + /** + * @private + */ + + }, { + key: "_insert_with_limit", + value: function _insert_with_limit(list, index, item, limit) { + if (limit === undefined || limit - list.length > 0) { + list.splice(index, 0, item); + } else { + // we couldn't increase the size + if (index === list.length) return; + + for (var i = list.length - 1; i > index; i--) { + list[i] = list[i - 1]; + } + + list[index] = item; + } + } + /** + * @param Array sorted_list ソート済みリスト + * + * @private + */ + + }, { + key: "_binarySearch", + value: function _binarySearch(sorted_list, value, compareFunc) { + if (sorted_list.length === 0) return -1; + if (compareFunc(value, sorted_list[0])) return 0; + if (compareFunc(sorted_list[sorted_list.length - 1], value)) return sorted_list.length; + if (sorted_list.length === 1) return sorted_list.length; + return this._binarySearchInner(sorted_list, value, compareFunc, 0, sorted_list.length - 1); + } + /** + * @private + */ + + }, { + key: "_binarySearchInner", + value: function _binarySearchInner(sorted_list, value, compareFunc, min, max) { + if (max - min === 1) return max; + var mid = 0.5 * (min + max) | 0; + if (compareFunc(sorted_list[mid], value)) min = mid;else max = mid; + return this._binarySearchInner(sorted_list, value, compareFunc, min, max); + } + /** + * @private + */ + + }, { + key: "_collectNextLevel", + value: function _collectNextLevel(box, parent_ppp) { + var child; + + for (var i = 0; i < 8; i++) { + if (child = box.newChild(i, this._statistics)) { + this._updateBox(child, parent_ppp); + } + } + } + }]); + + return PointCloudBoxCollector; +}(); +/** + * @summary Boxの解像度の状態を表す列挙型 + * @enum {object} + * @memberof mapray.PointCloud.Box + * @constant + * @see mapray.PointCloud.Box#status + */ + + +var LodStatus = { + /** + * 目標解像度に達しておらず、次のレベルのBoxを読み込む必要があることを示しす。 + */ + LOAD_NEXT_LEVEL: 1, + + /** + * 読み込み中などの理由で解像度が計算できないため、現状を維持することを示す。 + */ + KEEP_STATUS: 0, + + /** + * 目標解像度に達しており、次のレベルのBoxが必要ないことを示す。 + */ + UNLOAD_NEXT_LEVEL: -1 +}; + +var slice = [].slice; +var factories = {}; + +var construct = function (C, argsLength, args) { + if (!(argsLength in factories)) { + for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']'; // eslint-disable-next-line no-new-func + + + factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')'); + } + + return factories[argsLength](C, args); +}; // `Function.prototype.bind` method implementation +// https://tc39.github.io/ecma262/#sec-function.prototype.bind + + +var functionBind = Function.bind || function bind(that +/* , ...args */ +) { + var fn = aFunction$1(this); + var partArgs = slice.call(arguments, 1); + + var boundFunction = function bound() + /* args... */ + { + var args = partArgs.concat(slice.call(arguments)); + return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args); + }; + + if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype; + return boundFunction; +}; + +// https://tc39.github.io/ecma262/#sec-function.prototype.bind + +_export({ + target: 'Function', + proto: true +}, { + bind: functionBind +}); + +/** + * @summary フレームバッファ + * + * @memberof mapray + * @private + */ +var FrameBuffer = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {number} width 幅 + * @param {number} height 高さ + * @param {object} options オプション + * @param {object[]} options.color_containers テクスチャオプションの配列 + * @param {object} [options.depth_containers] 深度テクスチャオプション + */ + function FrameBuffer(glenv, width, height) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + _classCallCheck(this, FrameBuffer); + + this._glenv = glenv; + this._width = width; + this._height = height; + this._options = options; + + var _this$_buildBuffers = this._buildBuffers(options), + frame_buffer = _this$_buildBuffers.frame_buffer, + color_containers = _this$_buildBuffers.color_containers, + depth_container = _this$_buildBuffers.depth_container; + + this._frame_buffer = frame_buffer; + this._color_containers = color_containers; + this._depth_container = depth_container; + } + /** + * @summary バッファの生成 + * @private + */ + + + _createClass(FrameBuffer, [{ + key: "_buildBuffers", + value: function _buildBuffers(options) { + var ret = {}; + var width = this._width; + var height = this._height; + var gl = this._glenv.context; + var frame_buffer = ret.frame_buffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, frame_buffer); + ret.color_containers = options.color_containers.map(function (color_container, index) { + var type = color_container.type || FrameBuffer.ContainerType.RENDER_BUFFER; + var c_options = color_container.options || {}; + + if (type === FrameBuffer.ContainerType.RENDER_BUFFER) { + var buffer = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, buffer); + gl.renderbufferStorage(gl.RENDERBUFFER, c_options.internal_format, width, height); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + index, gl.RENDERBUFFER, buffer); + return buffer; + } else { + // type === FrameBuffer.ContainerType.TEXTURE + var texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D(gl.TEXTURE_2D, 0, c_options.internal_format, width, height, 0, c_options.format, c_options.type, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + index, gl.TEXTURE_2D, texture, 0); + return texture; + } + }); + + if (options.depth_container) { + var type = options.depth_container.type || FrameBuffer.ContainerType.RENDER_BUFFER; + var d_options = options.depth_container.options || {}; + + if (type === FrameBuffer.ContainerType.RENDER_BUFFER) { + var buffer = ret.depth_container = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, buffer); + gl.renderbufferStorage(gl.RENDERBUFFER, d_options.internal_format, width, height); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, buffer); + } else { + // type === FrameBuffer.ContainerType.TEXTURE + var depth_container = ret.depth_container = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, depth_container); + gl.texImage2D(gl.TEXTURE_2D, 0, d_options.internal_format, width, height, 0, d_options.format, d_options.type, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.framebufferTexture2D(gl.FRAMEBUFFER, options.depth_container.attach_type, gl.TEXTURE_2D, depth_container, 0); + } + } + + if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) { + throw new Error("ERROR: " + gl.checkFramebufferStatus(gl.FRAMEBUFFER)); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + return ret; + } + /** + * @summary リソースを破棄する + */ + + }, { + key: "dispose", + value: function dispose() { + var _this = this; + + var gl = this._glenv.context; + gl.deleteFramebuffer(this._frame_buffer); + this._frame_buffer = null; + + this._color_containers.forEach(function (container) { + _this._delete_container(container); + }); + + this._color_containers = []; + + this._delete_container(container, this._depth_container); + + this._depth_container = null; + } + /** + * @private + */ + + }, { + key: "_delete_container", + value: function _delete_container(container) { + var gl = this._glenv.context; + + if (container instanceof WebGLTexture) { + gl.deleteTexture(container); + } else if (container instanceof WebGLRenderbuffer) { + gl.deleteRenderbuffer(container); + } + } + /** + * @summary フレームバッファ + * @type {WebGLFramebuffer} + */ + + }, { + key: "getColorContainer", + + /** + * @summary カラーデータを取得 + * @param {number} index + * @type {WebGLTexture|WebGLRenderbuffer} + */ + value: function getColorContainer(index) { + return this._color_containers[index]; + } + /** + * @summary カラーデータ数 + * @type {number} + */ + + }, { + key: "bind", + + /** + * @summary フレームバッファをバインドする。 + * 呼び出し側がバインド・アンバインドが対応するように使用する。 + */ + value: function bind() { + if (FrameBuffer.active_frame_buffer) { + throw new Error("Invalid status: already bound"); + } + + var gl = this._glenv.context; + gl.bindFramebuffer(gl.FRAMEBUFFER, this._frame_buffer); + FrameBuffer.active_frame_buffer = this; + } + /** + * @summary フレームバッファをアンバインドする。 + * 呼び出し側がバインド・アンバインドが対応するように使用する。 + */ + + }, { + key: "unbind", + value: function unbind() { + if (FrameBuffer.active_frame_buffer !== this) { + throw new Error("Invalid status"); + } + + var gl = this._glenv.context; + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + FrameBuffer.active_frame_buffer = null; + } + }, { + key: "frame_buffer", + get: function get() { + return this._frame_buffer; + } + /** + * @summary カラーデータを取得(0番目を取得) + * @type {WebGLTexture|WebGLRenderbuffer} + */ + + }, { + key: "color_container", + get: function get() { + return this._color_containers[0]; + } + }, { + key: "color_container_length", + get: function get() { + return this._color_containers.length; + } + /** + * @summary 深度データ + * @type {WebGLTexture|WebGLRenderbuffer} + */ + + }, { + key: "depth_container", + get: function get() { + return this._depth_container; + } + }]); + + return FrameBuffer; +}(); + +FrameBuffer.active_frame_buffer = null; +/** + * @summary 要素型の列挙型 + * @enum {object} + * @memberof mapray.ContainerType + * @constant + */ + +var ContainerType = { + /** + * Render Buffer + */ + RENDER_BUFFER: { + id: "RENDER_BUFFER" + }, + + /** + * Texture + */ + TEXTURE: { + id: "TEXTURE" + } +}; +FrameBuffer.ContainerType = ContainerType; + +var depth_vs_code = "/**\n * 深度描画用シェーダ (頂点シェーダ)\n */\n\nattribute vec3 a_position;\n\n\nvoid\nmain( void ) {\n gl_Position = vec4( a_position, 1.0 );\n}\n"; + +var depth_fs_code = "// define PASS_BASE 0 or 1 JS側で指定される\n\n/**\n * 深度描画用シェーダ (フラグメントシェーダ)\n */\n\nuniform highp sampler2D u_sampler;\n\nvoid\nmain( void ) {\n highp float fdepth = texture2D( u_sampler, vec2( 0.5, 0.5 ) ).r; // r:[0.0-1.0](24bit), g:0.0, b:0.0, a:1.0\n\n /* 疑似コード PASS_BASEは0か4を想定\n int n[8]; // 各 n[i] の値は範囲 [0, 7], ただし n[0] は [0, 8]\n for ( int i = 0; i < 8; ++i ) {\n n[i] = 0;\n for ( int w = (i == 0 ? 3 : 2); w >= 0; --w ) {\n if ( fdepth >= 1.0 ) {\n n[i] += (1 << w);\n fdepth = fract( fdepth );\n }\n fdepth *= 2.0;\n }\n }\n\n gl_FragColor = vec4( n[PASS_BASE + 0],\n n[PASS_BASE + 1],\n n[PASS_BASE + 2],\n n[PASS_BASE + 3]\n ) / NMAX;\n */\n\n#if PASS_BASE == 1\n for ( int i=0; i<12; i++ ) {\n fdepth = fract( fdepth * 2.0 );\n }\n#endif // PASS_BASE\n\n highp vec4 v;\n\n int n = 0;\n if ( fdepth >= 1.0 ) { n += 0x8; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x4; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x2; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x1; fdepth = fract( fdepth ); } fdepth *= 2.0;\n v[0] = float(n) / 15.0;\n\n n = 0;\n if ( fdepth >= 1.0 ) { n += 0x4; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x2; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x1; fdepth = fract( fdepth ); } fdepth *= 2.0;\n v[1] = float(n) / 15.0;\n\n n = 0;\n if ( fdepth >= 1.0 ) { n += 0x4; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x2; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x1; fdepth = fract( fdepth ); } fdepth *= 2.0;\n v[2] = float(n) / 15.0;\n\n n = 0;\n if ( fdepth >= 1.0 ) { n += 0x4; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x2; fdepth = fract( fdepth ); } fdepth *= 2.0;\n if ( fdepth >= 1.0 ) { n += 0x1; fdepth = fract( fdepth ); } fdepth *= 2.0;\n v[3] = float(n) / 15.0;\n\n gl_FragColor = v;\n}\n"; + +/** + * @summary マウスピック処理に関連する処理を行う + * + * @memberof mapray + * @private + */ + +var PickTool = +/*#__PURE__*/ +function () { + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + */ + function PickTool(glenv) { + _classCallCheck(this, PickTool); + + this._glenv = glenv; + var gl = this._glenv.context; + this._camera = new Camera({ + width: 1, + height: 1 + }); + this._frame_buffer = new FrameBuffer(this._glenv, 1, 1, { + color_containers: [{ + type: FrameBuffer.ContainerType.RENDER_BUFFER, + options: { + internal_format: gl.RGBA4 + } + }], + depth_container: { + type: FrameBuffer.ContainerType.TEXTURE, + attach_type: gl.DEPTH_STENCIL_ATTACHMENT, + options: { + internal_format: gl.DEPTH_STENCIL, + format: gl.DEPTH_STENCIL, + type: glenv.WEBGL_depth_texture.UNSIGNED_INT_24_8_WEBGL + } + } + }); + this._depth_to_color_frame_buffer = new FrameBuffer(this._glenv, 1, 1, { + color_containers: [{ + type: FrameBuffer.ContainerType.RENDER_BUFFER, + options: { + internal_format: gl.RGBA4 + } + }] + }); + this._depth_to_color_materials = [new Material(this._glenv, depth_vs_code, define_PASS_BASE_0 + "\n\n" + depth_fs_code), new Material(this._glenv, depth_vs_code, define_PASS_BASE_1 + "\n\n" + depth_fs_code)]; + { + var vertex_buf = gl.createBuffer(); + { + var vertices = [-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, +1.0]; + gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buf); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, null); + } + var texcoord_buf = gl.createBuffer(); + { + var texcoord = [0, 1, 0, 0, 1, 0, 1, 1]; + gl.bindBuffer(gl.ARRAY_BUFFER, texcoord_buf); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texcoord), gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, null); + } + { + var indices = [0, 1, 2, 0, 2, 3]; + this._indices_length = indices.length; + this._index_buf = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._index_buf); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); + } + this._vertex_attribs = { + "a_position": { + buffer: vertex_buf, + num_components: 2, + component_type: gl.FLOAT, + normalized: false, + byte_stride: 0, + byte_offset: 0 + }, + "a_texcoord": { + buffer: texcoord_buf, + num_components: 2, + component_type: gl.FLOAT, + normalized: false, + byte_stride: 0, + byte_offset: 0 + } + }; + } + this._rid_value = new Uint8Array(4); + this._depth_value = new Uint8Array(4); + } + /** + * @summary ピック用カメラを返却する。同じインスタンスが返却される。 + * @param {mapray.Camera} viewer_camera Viewreのカメラ + */ + + + _createClass(PickTool, [{ + key: "pickCamera", + value: function pickCamera(viewer_camera) { + var cw = viewer_camera.canvas_size.width; + var ch = viewer_camera.canvas_size.height; + + this._camera.copyViewParameters(viewer_camera); + + var hfov_rad = viewer_camera.fov * GeoMath.DEGREE / 2; + var hfov_rad2 = Math.atan(Math.sqrt(2) * Math.tan(hfov_rad) / Math.sqrt(cw * cw + ch * ch)); + this._camera.fov = 2 * hfov_rad2 / GeoMath.DEGREE; + return this._camera; + } + /** + * @summary Scene描画処理直前に呼ばれる + */ + + }, { + key: "beforeRender", + value: function beforeRender() { + this._frame_buffer.bind(); + } + /** + * @summary Scene描画処理直後に呼ばれる + */ + + }, { + key: "afterRender", + value: function afterRender() { + this._frame_buffer.unbind(); + } + /** + * @summary Scene描画処理がキャンセルされたときに呼ばれる + */ + + }, { + key: "renderCanceled", + value: function renderCanceled() { + this._frame_buffer.unbind(); + } + /** + * @summary ridを、描画済みテクスチャから読む(1ステップ前の値が返却される) + * @return {number} + */ + + }, { + key: "readRid", + value: function readRid() { + var gl = this._glenv.context; + var startRid = Date.now(); + + this._frame_buffer.bind(); + + var startRidRead, endRidRead; + startRidRead = Date.now(); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, this._rid_value); + endRidRead = Date.now(); // 4bit x4 の値が 8bit x4 に格納されている。 + + /* + const rid = Math.round( + this._rid_value[0] / 17 << 12 | + this._rid_value[1] / 17 << 8 | + this._rid_value[2] / 17 << 4 | + this._rid_value[3] / 17 + ); + */ + + var rid = Math.round(COEFFICIENTS_RID[0] * Math.round(this._rid_value[0] / 17.0) + COEFFICIENTS_RID[1] * Math.round(this._rid_value[1] / 17.0) + COEFFICIENTS_RID[2] * Math.round(this._rid_value[2] / 17.0) + COEFFICIENTS_RID[3] * Math.round(this._rid_value[3] / 17.0)); + + this._frame_buffer.unbind(); + + var endRid = Date.now(); + + if (endRid - startRid > 7) { + console.log("Render and Read Index: " + (endRid - startRid) + "ms gl.readPixels:" + (endRidRead - startRidRead) + "ms"); + } + + return rid; + } + /** + * @summary 深度値を、描画済みテクスチャから読み(1ステップ前の値が返却される)、Gocs座標系に変換する + * @return {mapray.Matrix} view_to_clip View座標系からクリップ座標系への変換マトリックス + * @return {mapray.Matrix} view_to_gocs View座標系からView座標系への変換マトリックス + * @return {mapray.Vector3} + */ + + }, { + key: "readDepth", + value: function readDepth(view_to_clip, view_to_gocs) { + var gl = this._glenv.context; + var startDepth = Date.now(); + var startDepthRead, endDepthRead; + + this._depth_to_color_frame_buffer.bind(); + + var depth_clip = 0; + gl.viewport(0, 0, 1, 1); + + for (var i = 0; i < 2; i++) { + var material = this._depth_to_color_materials[i]; + material.bindProgram(); + material.bindVertexAttribs(this._vertex_attribs); + material.setInteger("u_sampler", 0); + material.bindTexture2D(0, this._frame_buffer.depth_container); + gl.depthFunc(gl.ALWAYS); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._index_buf); + gl.drawElements(gl.TRIANGLES, this._indices_length, gl.UNSIGNED_SHORT, 0); + gl.bindTexture(gl.TEXTURE_2D, null); + startDepthRead = Date.now(); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, this._depth_value); + endDepthRead = Date.now(); // 4bit x4 の値が 8bit x4 に格納されている。 => [0.0 〜 1.0] + + /* + depth_clip += ( + this._depth_value[ 0 ] * Math.pow(2, i==0 ? -3 : -15) / 17.0 + + this._depth_value[ 1 ] * Math.pow(2, i==0 ? -6 : -18) / 17.0 + + this._depth_value[ 2 ] * Math.pow(2, i==0 ? -9 : -21) / 17.0 + + this._depth_value[ 3 ] * Math.pow(2, i==0 ? -12 : -24) / 17.0 + ); + */ + + var coef = COEFFICIENTS_DEPTH[i]; + + for (var j = 0; j < 4; j++) { + depth_clip += coef[j] * this._depth_value[j]; + } + } + + this._depth_to_color_frame_buffer.unbind(); + + depth_clip = 2.0 * depth_clip - 1.0; // [0.0 〜 1.0] => [-1.0 〜 1.0] + + var vtc = view_to_clip; + /* + const ctv = GeoMath.inverse(vtc, GeoMath.createMatrix()); + const v = GeoMath.mul( ctv, [ 0, 0, c ] ); + */ + + var v = [vtc[8] / vtc[0], vtc[9] / vtc[5], -1.0, (depth_clip + vtc[10]) / vtc[14]]; // const point = GeoMath.mul_Av( view_to_gocs, v ); + + var m = view_to_gocs; + var w = m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3]; + var point = GeoMath.createVector3([(m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12] * v[3]) / w, (m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13] * v[3]) / w, (m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14] * v[3]) / w]); + var endDepth = Date.now(); + + if (endDepth - startDepth > 7) { + console.log("Render and Read Depth: " + (endDepth - startDepth) + "ms gl.readPixels:" + (endDepthRead - startDepthRead) + "ms"); + } + + return point; + } + }]); + + return PickTool; +}(); + +var COEFFICIENTS_RID = []; + +for (var i$1 = 0; i$1 < 4; i$1++) { + COEFFICIENTS_RID[i$1] = Math.pow(16, 3 - i$1); +} + +var COEFFICIENTS_DEPTH = [[], []]; + +for (var _i = 0; _i < 4; _i++) { + COEFFICIENTS_DEPTH[0][_i] = Math.pow(2, -3 * (_i + 1)) / 17.0; + COEFFICIENTS_DEPTH[1][_i] = Math.pow(2, -3 * (_i + 5)) / 17.0; +} + +var define_PASS_BASE_0 = "#define PASS_BASE 0"; +var define_PASS_BASE_1 = "#define PASS_BASE 1"; + +/** + * @summary 描画対象 + * @enum {object} + * @memberof mapray.AbstractRenderStage + * @constant + * @private + */ + +var RenderTarget = { + /** + * 通常のシーン描画 + */ + SCENE: { + id: "SCENE" + }, + + /** + * マウスピックなど、RID取得を目的とした描画 + */ + RID: { + id: "RID" + } +}; +/** + * @summary 1フレーム分のレンダリングを実行 + * @desc + * {@link mapray.Viewer} インスタンスはフレーム毎にこのクラスのインスタンスを生成してレンダリングを実行する。 + * + * @memberof mapray + * @private + */ + +var AbstractRenderStage = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Viewer} viewer 所有者である Viewer + * @param {mapray.Camera} camera カメラ + * @param {object} [renderInfo] レンダリング領域 + * @param {number} [renderInfo.sx] レンダリング領域のx位置(ビューポート中央を0, 右方向を正とする) + * @param {number} [renderInfo.sy] レンダリング領域のy位置(ビューポート中央を0, 上方向を正とする) + * @param {number} [renderInfo.swidth] レンダリング領域の幅 + * @param {number} [renderInfo.sheight] レンダリング領域の高さ + */ + function AbstractRenderStage(viewer, camera, renderInfo) { + _classCallCheck(this, AbstractRenderStage); + + this._viewer = viewer; + this._glenv = viewer.glenv; + this._width = camera.canvas_size.width; + this._height = camera.canvas_size.height; + + if (this._width === 0 || this._height === 0) { + // 画素がないのでレンダリングを省略 + this._rendering_cancel = true; + return; + } // _view_to_gocs, _gocs_to_view, _view_to_clip, _gocs_to_clip + + + this._setupBasicMatrices(renderInfo, camera); // カメラ情報 + + + this._volume_planes = renderInfo.volume_planes; // 視体積の平面ベクトル配列 (視点空間) + + this._pixel_step = renderInfo.pixel_step; // 画素の変化量 (視点空間) + // モデルシーン + + this._scene = viewer.scene; // リソースキャッシュ + + this._globe = viewer.globe; + this._tile_texture_cache = viewer.tile_texture_cache; + this._point_cloud_collection = viewer.point_cloud_collection; // 地形 + + this._flake_material = null; + this._flake_list = null; // 半透明化モード + + this._translucent_mode = false; // フレーム間のオブジェクトキャッシュ + + var render_cache = viewer._render_cache || (viewer._render_cache = {}); + + if (!render_cache.surface_material) { + render_cache.surface_material = new SurfaceMaterial(viewer); + render_cache.wireframe_material = new WireframeMaterial(viewer); + } + + if (!render_cache.surface_pick_material) { + render_cache.surface_pick_material = new SurfaceMaterial(viewer, { + ridMaterial: true + }); + } // デバッグ統計 + + + this._debug_stats = viewer.debug_stats; + } + /** + * 半透明化モードを取得。エンティティモデルを半透明化して描画する。 + * Sceneがエンティティへ"半透明化モード"を伝達するのに用いる。 + * @see mapray.Entity#anchor_mode + * @return {boolean} + * @private + */ + + + _createClass(AbstractRenderStage, [{ + key: "getTranslucentMode", + value: function getTranslucentMode() { + return this._translucent_mode; + } + /** + * @summary 半透明化モードを設定。 + * @see getTranslucentMode() + * @parm {boolean} transparent_mode + * @private + */ + + }, { + key: "setTranslucentMode", + value: function setTranslucentMode(translucent_mode) { + this._translucent_mode = translucent_mode; + } + /** + * @private + */ + + }, { + key: "_setupBasicMatrices", + value: function _setupBasicMatrices(renderInfo, camera) { + this._view_to_gocs = camera.view_to_gocs; + this._gocs_to_view = GeoMath.createMatrix(); + GeoMath.inverse_A(this._view_to_gocs, this._gocs_to_view); + this._view_to_clip = renderInfo.view_to_clip; + this._gocs_to_clip = GeoMath.createMatrix(); + GeoMath.mul_PzA(this._view_to_clip, this._gocs_to_view, this._gocs_to_clip); + } + /** + * @type {RenderTarget} + * @abstract + */ + + }, { + key: "getRenderTarget", + value: function getRenderTarget() { + throw new Error("not implemented"); + } + /** + * @summary Sceneがレンダリングを確定したことを通知 + * pick_objectは、primitiveがpickされたときに返却すべきオブジェクトを指定する。 + * @param {Primitive} primitive + * @param {mapray.Entity} [pick_object] + * @abstract + */ + + }, { + key: "onPushPrimitive", + value: function onPushPrimitive(primitive, pick_object) {} + /** + * @summary 1フレームのレンダリングを実行 + * @abstract + */ + + }, { + key: "render", + value: function render() { + throw new Error("not implemented"); + } + /** + * @summary 1フレームのレンダリングを実行 + * @abstract + * @private + */ + + }, { + key: "_render", + value: function _render() { + var gl = this._glenv.context; // 描画領域全体にビューポートを設定 + + gl.viewport(0, 0, this._width, this._height); + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.depthMask(true); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + if (this._rendering_cancel) return; // 地表断片データの収集 + + if (this._globe.status !== Globe.Status.READY) { + // まだ基底タイルデータが読み込まれていないので地表をレンダリングできない + this._rendering_cancel = true; + return; + } + + gl.enable(gl.CULL_FACE); + gl.enable(gl.DEPTH_TEST); + gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE); // FB のα値は変えない + + gl.depthFunc(gl.LEQUAL); + var collector = new FlakeCollector(this); + this._flake_list = collector.traverse(); + + var vis_ground = this._viewer.getVisibility(Viewer.Category.GROUND); + + var vis_entity = this._viewer.getVisibility(Viewer.Category.ENTITY); // すべての地表断片を描画 + + + this._prepare_draw_flake(); + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._flake_list[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var rflake = _step.value; + var fro = rflake.getRenderObject(); + + if (vis_ground) { + this._draw_flake_base(rflake, fro.getBaseMesh()); + } + + if (vis_entity) { + this._draw_entities_on_flake(fro); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + this._draw_point_cloud(); // モデルシーン描画 + + + if (vis_entity) { + this._scene.draw(this); + } + } + /** + * @summary 地表断片を描画する前の準備 + * + * @private + */ + + }, { + key: "_prepare_draw_flake", + value: function _prepare_draw_flake() { + // RenderFlake#getRenderObject() の前に必要な処理 + var producers = this._scene.getFlakePrimitiveProducers(); + + this._globe.putNextEntityProducers(producers); + } + /** + * @summary 地表とレイヤーを描画 + * + * @param {mapray.RenderFlake} rflake 地表断片データ + * @param {mapray.FlakeMesh} mesh 地表断片メッシュ + * + * @private + */ + + }, { + key: "_draw_flake_base", + value: function _draw_flake_base(rflake, mesh) { + var gl = this._glenv.context; + var material = this._flake_material; + material.bindProgram(); + var num_drawings = material.numDrawings(); // 一番下の不透明地表 + + if (material.setFlakeParameter(this, rflake, mesh, 0)) { + gl.disable(gl.BLEND); + gl.depthMask(true); + mesh.draw(material); + } // レイヤーの地表 (半透明の可能性あり) + + + for (var i = 1; i < num_drawings; ++i) { + var mat = this._viewer.layers.getDrawingLayer(i - 1).getMateral(); + + if (material !== mat) { + material = mat; + material.bindProgram(); + } + + if (material.setFlakeParameter(this, rflake, mesh, i)) { + if (this.getRenderTarget() === RenderTarget.SCENE) { + gl.enable(gl.BLEND); + } + + gl.depthMask(false); + mesh.draw(material); + } + } // 描画地表断頂点数を記録 + + + var stats = this._debug_stats; + + if (stats !== null) { + stats.num_drawing_flake_vertices += mesh.num_vertices; + } + } + /** + * @summary 地表断片上のエンティティを描画 + * + * @param {mapray.FlakeRenderObject} fro FlakeRenderObject インスタンス + * + * @private + */ + + }, { + key: "_draw_entities_on_flake", + value: function _draw_entities_on_flake(fro) { + var num_entities = fro.num_entities; + + if (num_entities == 0) { + // エンティティなし + return; + } + + var gl = this._glenv.context; + gl.enable(gl.POLYGON_OFFSET_FILL); + gl.depthMask(false); // 地表に張り付いていることが前提なので深度は変更しない + // todo: 仮のポリゴンオフセット + // 実験で得た適切な値 (Windows, GeForce GT750) + // Chrome+ANGLE: -8, -8 + // Chrome+EGL: -40, -40 + + gl.polygonOffset(-8, -8); // 透明色のマテリアルであっても、RID描画時は gl.BLEND を無効にする。 + + var setBlend; + + if (this.getRenderTarget() === RenderTarget.SCENE) { + setBlend = function setBlend(enable) { + if (enable) gl.enable(gl.BLEND);else gl.disable(gl.BLEND); + }; + } else { + gl.disable(gl.BLEND); + + setBlend = function setBlend() {}; + } + + for (var i = 0; i < num_entities; ++i) { + var _fro$getEntityPrimiti = fro.getEntityPrimitive(i, this), + primitive = _fro$getEntityPrimiti.primitive, + entity = _fro$getEntityPrimiti.entity; + + setBlend(primitive.isTranslucent(this)); + this.onPushPrimitive(primitive, entity); + primitive.draw(this); + } + + gl.depthMask(true); + gl.disable(gl.POLYGON_OFFSET_FILL); + } + }, { + key: "_draw_point_cloud", + value: function _draw_point_cloud() {} + }]); + + return AbstractRenderStage; +}(); +/** + * @summary 1フレーム分のレンダリングを実行 + * @desc + * {@link mapray.Viewer} インスタンスはフレーム毎にこのクラスのインスタンスを生成してレンダリングを実行する。 + * + * @memberof mapray + * @private + */ + + +var RenderStage = +/*#__PURE__*/ +function (_AbstractRenderStage) { + _inherits(RenderStage, _AbstractRenderStage); + + /** + * @param viewer {mapray.Viewer} 所有者である Viewer + */ + function RenderStage(viewer) { + var _this; + + _classCallCheck(this, RenderStage); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(RenderStage).call(this, viewer, viewer.camera, viewer.camera.createRenderInfo())); // 地表マテリアルの選択 + + _this._flake_material = viewer.render_mode === Viewer.RenderMode.WIREFRAME ? viewer._render_cache.wireframe_material : viewer._render_cache.surface_material; + return _this; + } + /** + * @type {RenderTarget} + * @override + */ + + + _createClass(RenderStage, [{ + key: "getRenderTarget", + value: function getRenderTarget() { + return RenderTarget.SCENE; + } + /** + * @summary 1フレームのレンダリングを実行 + * @override + */ + + }, { + key: "render", + value: function render() { + this._render(); + + if (this._rendering_cancel) return; // 描画地表断片数を記録 + + var stats = this._debug_stats; + + if (stats !== null) { + stats.num_drawing_flakes = this._flake_list.length; + } // フレーム終了処理 + + + this._globe.endFrame(); + + this._tile_texture_cache.endFrame(); + + this._viewer.layers.endFrame(); + } + /** + * @summary 点群を描画 + * + * @private + */ + + }, { + key: "_draw_point_cloud", + value: function _draw_point_cloud() { + // const debug_handlers = PointCloud.getDebugHandlers() || {}; + var traverseDataRequestQueue = PointCloud.getTraverseDataRequestQueue(); + var traverseData = traverseDataRequestQueue.length === 0 ? null : []; + var s = PointCloud.getStatistics() || {}; // const statistics = ; + + if (s.statistics_obj) s.statistics_obj.clear(); + + for (var i = 0; i < this._point_cloud_collection.length; ++i) { + if (s.statistics_obj) s.statistics_obj.start(); + + var point_cloud = this._point_cloud_collection.get(i); + + var load_limit = Math.max(0, 10 - point_cloud.provider.getNumberOfRequests()); + var pcb_collector = new PointCloudBoxCollector(this, load_limit); + var traverse_result = pcb_collector.traverse(point_cloud, s.statistics_obj); + if (s.statistics_obj) s.statistics_obj.doneTraverse(); + + if (point_cloud.provider.isReady()) { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = traverse_result.load_boxes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var ro = _step2.value; + ro.box.load(); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = traverse_result.visible_boxes[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var _ro = _step3.value; + + _ro.draw(this, s.statistics_obj); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + point_cloud.provider.flushQueue(); + + if (traverseData) { + traverseData.push({ + point_cloud: point_cloud, + pcb_collection: traverse_result.visible_boxes + }); + } + + if (s.statistics_obj) s.statistics_obj.done(); + } + + if (traverseData) { + for (var _i = 0; _i < traverseDataRequestQueue.length; _i++) { + traverseDataRequestQueue[_i](traverseData); + } + } + + if (s.statistics_handler) { + s.statistics_handler(s.statistics_obj); + } + } + }]); + + return RenderStage; +}(AbstractRenderStage); +/** + * @summary マウスピック用に1フレーム分のレンダリングを実行 + * @desc + * {@link mapray.Viewer} のpick関数内でインスタンスが生成されレンダリングが実行される。 + * + * @memberof mapray + * @private + */ + + +var PickStage = +/*#__PURE__*/ +function (_AbstractRenderStage2) { + _inherits(PickStage, _AbstractRenderStage2); + + /** + * @param {mapray.Viewer} viewer 所有者である Viewer + * @param {number} size オフスクリーン幅 = オフスクリーン高さ + * @param {mapray.Vector2} screen_pos スクリーン上のピクセル位置 + */ + function PickStage(viewer, screen_pos) { + var _this2; + + _classCallCheck(this, PickStage); + + var pick_tool = viewer.pick_tool_cache || (viewer.pick_tool_cache = new PickTool(viewer.glenv)); + var camera = pick_tool.pickCamera(viewer.camera, screen_pos); + var renderInfo = camera.createRenderInfo(+screen_pos[0] - viewer.camera.canvas_size.width / 2, -screen_pos[1] + viewer.camera.canvas_size.height / 2); + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(PickStage).call(this, viewer, camera, renderInfo)); // 地表マテリアルの選択 + + _this2._flake_material = viewer._render_cache.surface_pick_material; + _this2._pick_tool = pick_tool; + _this2._rid_map = [null]; // rid == 0 は要素なしを意味する + + _this2._pick_result = {}; + return _this2; + } + /** + * @override + */ + + + _createClass(PickStage, [{ + key: "onPushPrimitive", + value: function onPushPrimitive(primitive, pick_object) { + primitive.rid = this._rid_map.length; + + this._rid_map.push(pick_object); + } + /** + * @type {RenderTarget} + * @override + */ + + }, { + key: "getRenderTarget", + value: function getRenderTarget() { + return RenderTarget.RID; + } + /** + * スクリーンの任意の点における三次元位置や描画対象に関する情報を取得します。 + * @return 位置情報や描画対象に関する情報 + * @override + */ + + }, { + key: "render", + value: function render() { + var pick_tool = this._pick_tool; + pick_tool.beforeRender(); + var gl = this._glenv.context; + gl.disable(gl.DITHER); + + this._render(); + + gl.enable(gl.DITHER); + + if (this._rendering_cancel) { + pick_tool.renderCanceled(); + return; + } + + pick_tool.afterRender(); + var rid = pick_tool.readRid(); + + if (rid > 0) { + var pick_object = this._rid_map[rid]; + + if (pick_object instanceof Entity) { + this._pick_result.entity = pick_object; + } + } + + this._pick_result.point = pick_tool.readDepth(this._view_to_clip, this._view_to_gocs); + } + /** + * @type {mapray.Viewer.PickResult} + */ + + }, { + key: "pick_result", + get: function get() { + return this._pick_result; + } + }]); + + return PickStage; +}(AbstractRenderStage); + +/** + * @summary クレデンシャルモード + * @desc + *

HTTP リクエストのクレデンシャルモードを表現する型である。

+ * @enum {object} + * @memberof mapray + * @constant + * @see https://developer.mozilla.org/docs/Web/API/Request/credentials + * @see mapray.StandardDemProvider + */ +var CredentialMode = { + /** + * 決してクッキーを送信しない + */ + OMIT: { + id: "OMIT", + credentials: "omit" + }, + + /** + * URL が呼び出し元のスクリプトと同一オリジンだった場合のみ、クッキーを送信 + */ + SAME_ORIGIN: { + id: "SAME_ORIGIN", + credentials: "same-origin" + }, + + /** + * クロスオリジンの呼び出しであっても、常にクッキーを送信 + */ + INCLUDE: { + id: "INCLUDE", + credentials: "include" + } +}; + +/** + * @summary 標準地図画像プロバイダ + * @classdesc + *

汎用的な地図画像プロバイダの実装である。

+ *

構築子の引数に prefix, suffix, size, zmin, zmax を与えた場合、各メソッドの動作は以下のようになる。 + * ここで c1, c2, c3 は opts.coord_order の指定に従った第1、第2、第3の座標である。

+ *
+ *   requestTile( z, x, y ) -> URL が prefix + c1 + '/' + c2 + '/' + c3 + suffix の画像を要求
+ *   getImageSize()         -> size を返す
+ *   getZoomLevelRange()    -> new ImageProvider.Range( zmin, zmax ) を返す
+ * 
+ * @memberof mapray + * @extends mapray.ImageProvider + */ + +var StandardImageProvider = +/*#__PURE__*/ +function (_ImageProvider) { + _inherits(StandardImageProvider, _ImageProvider); + + /** + * @param {string} prefix URL の先頭文字列 + * @param {string} suffix URL の末尾文字列 + * @param {number} size 地図タイル画像の寸法 + * @param {number} zmin 最小ズームレベル + * @param {number} zmax 最大ズームレベル + * @param {object} [opts] オプション集合 + * @param {mapray.StandardImageProvider.CoordOrder} [opts.coord_order=ZXY] URL の座標順序 + * @param {mapray.StandardImageProvider.CoordSystem} [opts.coord_system=UPPER_LEFT] タイル XY 座標系 + * @param {mapray.CredentialMode} [opts.credentials=SAME_ORIGIN] クレデンシャルモード + */ + function StandardImageProvider(prefix, suffix, size, zmin, zmax, opts) { + var _this; + + _classCallCheck(this, StandardImageProvider); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(StandardImageProvider).call(this)); + _this._prefix = prefix; + _this._suffix = suffix; + _this._size = size; + _this._min_level = zmin; + _this._max_level = zmax; // タイル座標を並び替える関数 + + var orderCoords; + + if (opts && opts.coord_order) { + if (opts.coord_order === CoordOrder.ZYX) { + orderCoords = function orderCoords(z, x, y) { + return z + "/" + y + "/" + x; + }; + } else if (opts.coord_order === CoordOrder.XYZ) { + orderCoords = function orderCoords(z, x, y) { + return x + "/" + y + "/" + z; + }; + } + } + + if (!orderCoords) { + // その他の場合は既定値 COORD_ORDER_ZXY を使う + orderCoords = function orderCoords(z, x, y) { + return z + "/" + x + "/" + y; + }; + } // XY 座標を変換する関数 + + + var convCoords; + + if (opts && opts.coord_system) { + if (opts.coord_system === CoordSystem.LOWER_LEFT) { + convCoords = function convCoords(z, x, y) { + var size = Math.round(Math.pow(2, z)); + return orderCoords(z, x, size - y - 1); + }; + } + } + + if (!convCoords) { + // その他の場合は既定値 UPPER_LEFT (無変換) を使う + convCoords = orderCoords; + } // 座標部分の URL を取得する関数 + + + _this._coords_part = convCoords; // crossorigin 属性の値 + + _this._crossOrigin = "anonymous"; + + if (opts && opts.credentials) { + if (opts.credentials === CredentialMode.OMIT) { + _this._crossOrigin = null; + } else if (opts.credentials === CredentialMode.INCLUDE) { + _this._crossOrigin = "use-credentials"; + } + } + + return _this; + } + /** + * @override + */ + + + _createClass(StandardImageProvider, [{ + key: "requestTile", + value: function requestTile(z, x, y, callback) { + var image = new Image(); + + image.onload = function () { + callback(image); + }; + + image.onerror = function () { + callback(null); + }; + + if (this._crossOrigin !== null) { + image.crossOrigin = this._crossOrigin; + } + + image.src = this._makeURL(z, x, y); + return image; // 要求 ID (実態は Image) + } + /** + * @override + */ + + }, { + key: "cancelRequest", + value: function cancelRequest(id) {} // TODO: Image 読み込みの取り消し方法は不明 + + /** + * @override + */ + + }, { + key: "getImageSize", + value: function getImageSize() { + return this._size; + } + /** + * @override + */ + + }, { + key: "getZoomLevelRange", + value: function getZoomLevelRange() { + return new ImageProvider.Range(this._min_level, this._max_level); + } + /** + * URL を作成 + * @private + */ + + }, { + key: "_makeURL", + value: function _makeURL(z, x, y) { + return this._prefix + this._coords_part(z, x, y) + this._suffix; + } + }]); + + return StandardImageProvider; +}(ImageProvider); +/** + * @summary URL 座標順序の列挙型 + * @desc + * {@link mapray.StandardImageProvider} の構築子で opts.coord_order パラメータに指定する値の型である。 + * @enum {object} + * @memberof mapray.StandardImageProvider + * @constant + */ + + +var CoordOrder = { + /** + * 座標順序 Z/X/Y (既定値) + */ + ZXY: { + id: "ZXY" + }, + + /** + * 座標順序 Z/Y/X + */ + ZYX: { + id: "ZYX" + }, + + /** + * 座標順序 Z/X/Y + */ + XYZ: { + id: "XYZ" + } +}; +/** + * @summary タイル XY 座標系の列挙型 + * @desc + * {@link mapray.StandardImageProvider} の構築子で opts.coord_system パラメータに指定する値の型である。 + * @enum {object} + * @memberof mapray.StandardImageProvider + * @constant + */ + +var CoordSystem = { + /** + * 原点:左上, X軸:右方向, Y軸:下方向 (既定値) + */ + UPPER_LEFT: { + id: "UPPER_LEFT" + }, + + /** + * 原点:左下, X軸:右方向, Y軸:上方向 + */ + LOWER_LEFT: { + id: "LOWER_LEFT" + } +}; // クラス定数の定義 + +{ + StandardImageProvider.CoordOrder = CoordOrder; + StandardImageProvider.CoordSystem = CoordSystem; +} + +var nativeAssign = Object.assign; +var defineProperty$9 = Object.defineProperty; // `Object.assign` method +// https://tc39.github.io/ecma262/#sec-object.assign + +var objectAssign = !nativeAssign || fails(function () { + // should have correct order of operations (Edge bug) + if (descriptors && nativeAssign({ + b: 1 + }, nativeAssign(defineProperty$9({}, 'a', { + enumerable: true, + get: function () { + defineProperty$9(this, 'b', { + value: 3, + enumerable: false + }); + } + }), { + b: 2 + })).b !== 1) return true; // should work with symbols and should have deterministic property order (V8 bug) + + var A = {}; + var B = {}; // eslint-disable-next-line no-undef + + var symbol = Symbol(); + var alphabet = 'abcdefghijklmnopqrst'; + A[symbol] = 7; + alphabet.split('').forEach(function (chr) { + B[chr] = chr; + }); + return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet; +}) ? function assign(target, source) { + // eslint-disable-line no-unused-vars + var T = toObject(target); + var argumentsLength = arguments.length; + var index = 1; + var getOwnPropertySymbols = objectGetOwnPropertySymbols.f; + var propertyIsEnumerable = objectPropertyIsEnumerable.f; + + while (argumentsLength > index) { + var S = indexedObject(arguments[index++]); + var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); + var length = keys.length; + var j = 0; + var key; + + while (length > j) { + key = keys[j++]; + if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key]; + } + } + + return T; +} : nativeAssign; + +// https://tc39.github.io/ecma262/#sec-object.assign + +_export({ + target: 'Object', + stat: true, + forced: Object.assign !== objectAssign +}, { + assign: objectAssign +}); + +/** + * @summary DEM データプロバイダ + * @classdesc + *

レンダラーに DEM データを与えるための抽象クラスである。

+ *

以下の抽象メソッドは既定の動作がないので、利用者はこれらのメソッドをオーバライドした具象クラスを使用しなければならない。

+ *
    + *
  • [requestTile()]{@link mapray.DemProvider#requestTile}
  • + *
  • [cancelRequest()]{@link mapray.DemProvider#cancelRequest}
  • + *
+ *

[getResolutionPower()]{@link mapray.DemProvider#getResolutionPower} の既定の実装は 8 を返す。DEM タイルの解像度が 256 以外のときはこのメソッドをオーバーロードする必要がある。

+ * @memberof mapray + * @abstract + * @protected + * @see mapray.StandardDemProvider + * @see mapray.Viewer + */ +var DemProvider = +/*#__PURE__*/ +function () { + function DemProvider() { + _classCallCheck(this, DemProvider); + } + + _createClass(DemProvider, [{ + key: "requestTile", + + /** + * @summary DEM タイルデータを要求 + * @desc + *

座標が (z, x, y) の DEM タイルデータを要求する。

+ *

指定したタイルデータの取得が成功または失敗したときに callback が非同期に呼び出されなければならない。

+ *

だたし [cancelRequest()]{@link mapray.DemProvider#cancelRequest} により要求が取り消されたとき、callback は呼び出しても呼び出さなくてもよい。また非同期呼び出しである必要もない。

+ * @param {number} z ズームレベル + * @param {number} x X タイル座標 + * @param {number} y Y タイル座標 + * @param {mapray.DemProvider.RequestCallback} callback 要求コールバック関数 + * @return {object} 要求 ID ([cancelRequest()]{@link mapray.DemProvider#cancelRequest} に与えるオブジェクト) + * @abstract + */ + value: function requestTile(z, x, y, callback) { + throw new Error("mapray.DemProvider#requestTile() method has not been overridden."); + } + /** + * @summary DEM タイルデータの要求を取り消す + *

[requestTile()]{@link mapray.DemProvider#requestTile} による要求を可能であれば取り消す。

+ * @param {object} id 要求 ID ([requestTile()]{@link mapray.DemProvider#requestTile} から得たオブジェクト) + * @abstract + */ + + }, { + key: "cancelRequest", + value: function cancelRequest(id) { + throw new Error("mapray.DemProvider#cancelRequest() method has not been overridden."); + } + /** + * @summary 解像度の指数を取得 + * @desc + *

DEM タイルデータ解像度の、2 を底とする対数を取得する。DEM タイルデータの解像度は必ず 2 のべき乗である。

+ *

制限: this が同じなら常に同じ値を返さなければならない。

+ * @return {number} 解像度指数 + * @abstract + */ + + }, { + key: "getResolutionPower", + value: function getResolutionPower() { + return 8; + } + }]); + + return DemProvider; +}(); + +/** + * @summary 標準 DEM プロバイダ + * @classdesc + *

汎用的な DEM プロバイダの実装である。

+ *

構築子の引数に prefix を与えた場合、各メソッドの動作は以下のようになる。 + *

+ *   requestTile( z, x, y ) -> URL が prefix + z + '/' + x + '/' + y + suffix のデータを要求
+ * 
+ * @memberof mapray + * @extends mapray.DemProvider + */ + +var StandardDemProvider = +/*#__PURE__*/ +function (_DemProvider) { + _inherits(StandardDemProvider, _DemProvider); + + /** + * @param {string} prefix URL の先頭文字列 + * @param {string} suffix URL の末尾文字列 + * @param {object} [options] オプション集合 + * @param {mapray.CredentialMode} [options.credentials=OMIT] クレデンシャルモード + * @param {object} [options.headers={}] リクエストに追加するヘッダーの辞書 + */ + function StandardDemProvider(prefix, suffix, options) { + var _this; + + _classCallCheck(this, StandardDemProvider); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(StandardDemProvider).call(this)); + var opts = options || {}; + _this._prefix = prefix; + _this._suffix = suffix; + _this._credentials = (opts.credentials || CredentialMode.OMIT).credentials; + _this._headers = Object.assign({}, opts.headers); + return _this; + } + /** + * @override + */ + + + _createClass(StandardDemProvider, [{ + key: "requestTile", + value: function requestTile(z, x, y, callback) { + var actrl = new AbortController(); + fetch(this._makeURL(z, x, y), { + credentials: this._credentials, + headers: this._headers, + signal: actrl.signal + }).then(function (response) { + return response.ok ? response.arrayBuffer() : Promise.reject(Error(response.statusText)); + }).then(function (buffer) { + // データ取得に成功 + callback(buffer); + })["catch"](function () { + // データ取得に失敗または取り消し + callback(null); + }); + return actrl; + } + /** + * @override + */ + + }, { + key: "cancelRequest", + value: function cancelRequest(id) { + var actrl = id; // 要求 ID を AbortController に変換 + + actrl.abort(); // 取り消したので要求を中止 + } + /** + * URL を作成 + * @private + */ + + }, { + key: "_makeURL", + value: function _makeURL(z, x, y) { + return this._prefix + z + '/' + x + '/' + y + this._suffix; + } + }]); + + return StandardDemProvider; +}(DemProvider); + +/** + * @summary 地図レイヤー管理 + * @classdesc + *

地図レイヤーを管理するオブジェクトである。

+ *

インスタンスは {@link mapray.Viewer#layers} から得ることができる。

+ * + * @hideconstructor + * @memberof mapray + * @see mapray.Layer + */ + +var LayerCollection = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Viewer} viewer Viewer + * @param {array} layers 初期化プロパティ配列 + */ + function LayerCollection(viewer, layers) { + _classCallCheck(this, LayerCollection); + + this._viewer = viewer; + this._glenv = viewer._glenv; + this._layers = []; + this._draw_layers = null; // 初期レイヤーを追加 + + for (var i = 0; i < layers.length; ++i) { + this.add(layers[i]); + } + } + /** + * @summary Viewerを取得 + * @type {mapray.Viewer} + * @readonly + * @package + */ + + + _createClass(LayerCollection, [{ + key: "getLayer", + + /** + * @summary レイヤーを取得 + * + * @param {number} index レイヤーの場所 + * @return {mapray.Layer} レイヤー + */ + value: function getLayer(index) { + return this._layers[index]; + } + /** + * @summary すべてのレイヤーを削除 + */ + + }, { + key: "clear", + value: function clear() { + while (this.num_layers() > 0) { + this.remove(0); + } + } + /** + * @summary レイヤーを末尾に追加 + * + * @param {object|mapray.ImageProvider} layer レイヤーのプロパティ + * @param {mapray.ImageProvider} layer.image_provider 画像プロバイダ + * @param {boolean} [layer.visibility] 可視性フラグ + * @param {number} [layer.opacity] 不透明度 + */ + + }, { + key: "add", + value: function add(layer) { + this.insert(this.num_layers, layer); + } + /** + * @summary レイヤーを末尾に追加 + * + * @param {number} index 挿入場所 + * @param {object|mapray.ImageProvider} layer レイヤーのプロパティ + * @param {mapray.ImageProvider} layer.image_provider 画像プロバイダ + * @param {boolean} [layer.visibility] 可視性フラグ + * @param {number} [layer.opacity] 不透明度 + */ + + }, { + key: "insert", + value: function insert(index, layer) { + this._layers.splice(index, 0, new Layer(this, layer)); + + this.dirtyDrawingLayers(); + } + /** + * @summary 特定のレイヤーを削除 + * + * @param {number} index 削除場所 + */ + + }, { + key: "remove", + value: function remove(index) { + this._layers.splice(index, 1); + + this.dirtyDrawingLayers(); + } + /** + * @summary 描画レイヤー数を取得 + * + * @return {number} 描画レイヤー数 + * @package + */ + + }, { + key: "numDrawingLayers", + value: function numDrawingLayers() { + if (this._draw_layers === null) { + this._updataDrawingLayers(); + } + + return this._draw_layers.length; + } + /** + * @summary 描画レイヤーを取得 + * + * @param {number} index レイヤーの場所 + * @return {mapray.Layer} レイヤー + * @package + */ + + }, { + key: "getDrawingLayer", + value: function getDrawingLayer(index) { + if (this._draw_layers === null) { + this._updataDrawingLayers(); + } + + return this._draw_layers[index]; + } + /** + * @summary フレームの最後の処理 + * @package + */ + + }, { + key: "endFrame", + value: function endFrame() { + var layers = this._layers; + + for (var i = 0; i < layers.length; ++i) { + layers[i].tile_cache.endFrame(); + } + } + /** + * @summary 取り消し処理 + * @package + */ + + }, { + key: "cancel", + value: function cancel() { + var layers = this._layers; + + for (var i = 0; i < layers.length; ++i) { + layers[i].tile_cache.cancel(); + } + } + /** + * @summary 描画レイヤー配列を無効化 + * @package + */ + + }, { + key: "dirtyDrawingLayers", + value: function dirtyDrawingLayers() { + this._draw_layers = null; + } + /** + * @summary 描画レイヤー配列を更新 + * @private + */ + + }, { + key: "_updataDrawingLayers", + value: function _updataDrawingLayers() { + var num_layers = this.num_layers; + var draw_layers = []; + + for (var i = 0; i < num_layers; ++i) { + var layer = this._layers[i]; + + if (layer.image_provider.status() === ImageProvider.Status.READY && layer.visibility === true) { + draw_layers.push(layer); + } + } + + this._draw_layers = draw_layers; + } + }, { + key: "viewer", + get: function get() { + return this._viewer; + } + /** + * @summary WebGL 環境を取得 + * @type {mapray.GLEnv} + * @readonly + * @package + */ + + }, { + key: "glenv", + get: function get() { + return this._glenv; + } + /** + * @summary レイヤー数 + * @type {number} + * @readonly + */ + + }, { + key: "num_layers", + get: function get() { + return this._layers.length; + } + }]); + + return LayerCollection; +}(); + +/** + * @summary PointCloudを管理するクラス + * @see mapray.Viewer#point_cloud_collection + * + * @memberof mapray + */ + +var PointCloudCollection = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Scene} scene 所属するシーン + */ + function PointCloudCollection(scene) { + _classCallCheck(this, PointCloudCollection); + + this._scene = scene; + this._items = []; + } + /** + * @summary 点群オブジェクト数 + * @type {number} + * @readonly + */ + + + _createClass(PointCloudCollection, [{ + key: "get", + + /** + * @summary 点群オブジェクトを取得 + * + * @param {number} index 番号 + * @return {mapray.PointCloud} 点群 + */ + value: function get(index) { + return this._items[index]; + } + /** + * @summary 点群オブジェクトを追加 + * + * @param {PointCloudProvider} item 点群プロバイダ + * @return {mapray.PointCloud} 点群 + */ + + }, { + key: "add", + value: function add(item) { + return this.insert(this.length, item); + } + /** + * @summary 点群オブジェクトを指定した位置に追加 + * + * @param {number} index 番号 + * @param {PointCloudProvider} item 点群プロバイダ + * @return {mapray.PointCloud} 点群 + */ + + }, { + key: "insert", + value: function insert(index, item) { + var point_cloud = new PointCloud(this._scene, item); + + this._items.splice(index, 0, point_cloud); + + point_cloud.init(); + return point_cloud; + } + /** + * @summary 指定した位置の点群オブジェクトを削除 + * + * @param {number} index 番号 + * @return {mapray.PointCloud} 削除された点群 + */ + + }, { + key: "removeByIndex", + value: function removeByIndex(index) { + var removedItem = this._items.splice(index, 1)[0]; + + removedItem.destroy(); + return removedItem; + } + /** + * @summary 指定した点群オブジェクトを削除 + * + * @param {mapray.PointCloud} item 削除する点群 + */ + + }, { + key: "remove", + value: function remove(item) { + var index = this._items.indexOf(item); + + if (index === -1) { + throw new Error("Couldn't find item: " + item); + } + + this.removeByIndex(index); + } + }, { + key: "length", + get: function get() { + return this._items.length; + } + }]); + + return PointCloudCollection; +}(); + +/** + * @summary レンダリングコールバック + * @classdesc + *

レンダリングループでの各箇所で呼び出されるコールバック関数を実装するための抽象クラスである。

+ *

サブクラスでは以下のメソッドをオーバーライドすることができる。オーバーライドしないメソッドは何もしない。

+ *
    + *
  • [onStart()]{@link mapray.RenderCallback#onStart}
  • + *
  • [onUpdateFrame()]{@link mapray.RenderCallback#onUpdateFrame}
  • + *
  • [onStop()]{@link mapray.RenderCallback#onStop}
  • + *
+ * @memberof mapray + * @protected + * @abstract + * @see mapray.Viewer + */ +var RenderCallback = +/*#__PURE__*/ +function () { + function RenderCallback() { + _classCallCheck(this, RenderCallback); + + this._viewer = null; + this._is_started_ = false; + } + /** + * View に取り付ける + * @package + */ + + + _createClass(RenderCallback, [{ + key: "attach", + value: function attach(viewer) { + if (this._viewer) { + throw new Error("RenderCallback instance is already attached"); + } + + this._viewer = viewer; + this._is_started_ = false; + } + /** + * View から切り離す + * すでに onStart() を呼び出してい場合、onStop() を呼び出す。 + * @package + */ + + }, { + key: "detach", + value: function detach() { + if (this._is_started_) { + this.onStop(); + this._is_started_ = false; + } + + this._viewer = null; + } + /** + * フレーム onUpdateFrame() の呼び出し + * 取り付けてから最初のフレームのときは onStart() を呼び出す。 + * @package + */ + + }, { + key: "onUpdateFrameInner", + value: function onUpdateFrameInner(delta_time) { + if (!this._is_started_) { + this.onStart(); + this._is_started_ = true; + } + + this.onUpdateFrame(delta_time); + } + /** + * @summary 保有者 Viewer + * @desc + *

この RenderCallback インスタンスが設定されている Viewer インスタンスを示す。

+ *

ただし RenderCallback インスタンスがどの Viewer インスタンスにも設定されていない状態では null となる。

+ * @type {?mapray.Viewer} + * @readonly + */ + + }, { + key: "onStart", + + /** + * @summary レンダリングループ開始の処理 + * @abstract + */ + value: function onStart() {} + /** + * @summary フレームレンダリング前の処理 + * @param {number} delta_time 前フレームからの経過時間 (秒) + * @abstract + */ + + }, { + key: "onUpdateFrame", + value: function onUpdateFrame(delta_time) {} + /** + * @summary レンダリングループ終了の処理 + * @abstract + */ + + }, { + key: "onStop", + value: function onStop() {} + }, { + key: "viewer", + get: function get() { + return this._viewer; + } + }]); + + return RenderCallback; +}(); + +/** + * @summary 無機能 RenderCallback + * @desc + *

Viewer に RenderCallback が設定されていないときに使用する内部クラスである。

+ * @memberof mapray + * @extends mapray.RenderCallback + * @private + */ + +var NullRenderCallback = +/*#__PURE__*/ +function (_RenderCallback) { + _inherits(NullRenderCallback, _RenderCallback); + + function NullRenderCallback() { + _classCallCheck(this, NullRenderCallback); + + return _possibleConstructorReturn(this, _getPrototypeOf(NullRenderCallback).call(this)); + } + + return NullRenderCallback; +}(RenderCallback); + +/** + * @summary モデルシーン + * + * @classdesc + *

表示するエンティティを管理するクラスである。

+ *

インスタンスは {@link mapray.Viewer#scene} から得ることができる。

+ * + * @hideconstructor + * @memberof mapray + * @see mapray.SceneLoader + */ + +var Scene = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Viewer} viewer Viewer インスタンス (未構築) + * @param {mapray.GLEnv} glenv GLEnv インスタンス + */ + function Scene(viewer, glenv) { + var _this = this; + + _classCallCheck(this, Scene); + + this._viewer = viewer; + this._glenv = glenv; + this._enode_list = []; // ENode のリスト + + this._loaders = []; // 現在読み込み中の SceneLoader (取り消し用) + // animation.BindingBlock + + this._animation = new EasyBindingBlock(); + + this._animation.addDescendantUnbinder(function () { + _this._unbindDescendantAnimations(); + }); + } + /** + * WebGL レンダリングコンテキスト情報 + * @type {mapray.GLEnv} + * @readonly + * @package + */ + + + _createClass(Scene, [{ + key: "clearEntities", + + /** + * @summary すべてのエンティティを削除 + */ + value: function clearEntities() { + this._enode_list = []; + } + /** + * @summary エンティティを末尾に追加 + * @param {mapray.Entity} entity エンティティ + */ + + }, { + key: "addEntity", + value: function addEntity(entity) { + if (entity.scene !== this) { + throw new Error("invalid entity"); + } + + this._enode_list.push(new ENode(entity)); + } + /** + * @summary エンティティを削除 + * @param {mapray.Entity} entity エンティティ + */ + + }, { + key: "removeEntity", + value: function removeEntity(entity) { + var array = this._enode_list; + + for (var i = 0; i < array.length; ++i) { + if (array[i].entity === entity) { + array.splice(i, 1); + break; + } + } + } + /** + * @summary エンティティを取得 + * @param {number} index インデックス + * @return {mapray.Entity} エンティティ + */ + + }, { + key: "getEntity", + value: function getEntity(index) { + return this._enode_list[index].entity; + } + /** + * @summary シーンを描画 + * @param {mapray.RenderStage} stage レンダリングステージ + * @package + */ + + }, { + key: "draw", + value: function draw(stage) { + this._prepare_entities(); // プリミティブの配列を生成 + + + var op_prims = []; // 不透明プリミティブ + + var tp_prims = []; // 半透明プリミティブ + + var ac_prims = []; // アンカープリミティブ + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._enode_list[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var entity = _step.value.entity; + if (!entity.visibility) continue; + + this._add_primitives(stage, entity, op_prims, tp_prims, ac_prims); + } // プリミティブ配列を整列してから描画 + + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + this._draw_opaque_primitives(stage, op_prims); + + this._draw_translucent_primitives(stage, tp_prims); + + this._draw_anchor_primitives(stage, ac_prims); + } + /** + * @summary 描画前のエンティティの準備 + * @private + */ + + }, { + key: "_prepare_entities", + value: function _prepare_entities() { + var dem_area_updated = this._viewer.globe.dem_area_updated; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this._enode_list[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var enode = _step2.value; + var producer = enode.entity.getPrimitiveProducer(); + + if (producer === null || !producer.needsElevation()) { + // producer が存在しないとき、または + // producer が標高を必要としないときは何もしない + continue; + } + + if (producer.checkToCreateRegions() || enode.regions === null) { + // 領域情報が分からない、または領域情報が変化した可能性があるとき + enode.regions = producer.createRegions(); + + if (enode.regions.length > 0) { + enode.regions.forEach(function (region) { + region.compile(); + }); + producer.onChangeElevation(enode.regions); + } + } else { + if (dem_area_updated.isEmpty()) { + // 更新された DEM 領域は存在しない + // 標高の変化はないので以下の処理を省く + continue; + } + + var regions = []; // 標高に変化があった領域 + + enode.regions.forEach(function (region) { + if (region.intersectsWith(dem_area_updated)) { + // 領域の標高に変化があった + regions.push(region); + } + }); + + if (regions.length > 0) { + // 標高が変化した可能性がある領域を通知 + producer.onChangeElevation(regions); + } + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + /** + * 視体積に含まれるプリミティブを追加 + * @private + */ + + }, { + key: "_add_primitives", + value: function _add_primitives(stage, entity, op_prims, tp_prims, ac_prims) { + var producer = entity.getPrimitiveProducer(); + if (producer === null) return; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = producer.getPrimitives(stage)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var primitive = _step3.value; + + if (primitive.isVisible(stage)) { + var dst_prims = entity.anchor_mode ? ac_prims : primitive.isTranslucent(stage) ? tp_prims : op_prims; + stage.onPushPrimitive(primitive, entity); + dst_prims.push(primitive); + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + /** + * 不透明プリミティブを整列してから描画 + * @private + */ + + }, { + key: "_draw_opaque_primitives", + value: function _draw_opaque_primitives(stage, primitives) { + // 不透明プリミティブの整列: 近接 -> 遠方 (Z 降順) + primitives.sort(function (a, b) { + return b.sort_z - a.sort_z; + }); + var gl = this._glenv.context; + gl.disable(gl.BLEND); + gl.depthMask(true); + + for (var i = 0; i < primitives.length; ++i) { + primitives[i].draw(stage); + } + } + /** + * 半透明プリミティブを整列してから描画 + * @private + */ + + }, { + key: "_draw_translucent_primitives", + value: function _draw_translucent_primitives(stage, primitives) { + // 半透明プリミティブの整列: 遠方 -> 近接 (Z 昇順) + primitives.sort(function (a, b) { + return a.sort_z - b.sort_z; + }); + var gl = this._glenv.context; + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + gl.enable(gl.BLEND); + } else { + gl.disable(gl.BLEND); + } + + gl.depthMask(false); + + for (var i = 0; i < primitives.length; ++i) { + primitives[i].draw(stage); + } + + gl.disable(gl.BLEND); + gl.depthMask(true); + } + /** + * @summary アンカープリミティブを整列してから描画。 + *

{@link mapray.AbstractRenderStage#getRenderTarget} が {@link mapray.AbstractRenderStage.RenderTarget.SCENE} の場合は、 + * 隠面処理で隠れてえしまう部分は半透明で描画し、それ以外の部分は通常の描画を行う。結果的にアンカーオブジェクトが隠面において重なった場合は色が混ざった表示となる

+ *

{@link mapray.AbstractRenderStage#getRenderTarget} が {@link mapray.AbstractRenderStage.RenderTarget.RID} の場合は、 + * 隠面処理で隠れてえしまう部分は強制的に描画し、それ以外の部分は通常の描画を行う。結果的にアンカーオブジェクトが隠面において重なった場合はzソートした順番でRIDが上書きされる

+ * @see {@link mapray.Entity#anchor_mode} + * @private + */ + + }, { + key: "_draw_anchor_primitives", + value: function _draw_anchor_primitives(stage, primitives) { + // 不透明プリミティブの整列: 近接 -> 遠方 (Z 降順) + primitives.sort(function (a, b) { + return b.sort_z - a.sort_z; + }); + var gl = this._glenv.context; + gl.disable(gl.DEPTH_TEST); + gl.depthMask(false); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + stage.setTranslucentMode(true); + gl.enable(gl.BLEND); + } else { + gl.disable(gl.BLEND); + } // 遠方 -> 近接 (Z 昇順) + + + for (var i = primitives.length - 1; i >= 0; --i) { + primitives[i].draw(stage); + } + + gl.depthMask(true); + gl.enable(gl.DEPTH_TEST); + stage.setTranslucentMode(false); // 近接 -> 遠方 (Z 降順) + + for (var i = 0; i < primitives.length; ++i) { + primitives[i].draw(stage); + } + + gl.disable(gl.BLEND); + } + /** + * すべての SceneLoader の読み込みを取り消す + * @package + */ + + }, { + key: "cancelLoaders", + value: function cancelLoaders() { + var loaders = this._loaders.concat(); // 複製 + + + for (var i = 0; i < loaders.length; ++i) { + loaders[i].cancel(); + } + } + /** + * 読み込み中の SceneLoader を登録 + * @param {mapray.SceneLoader} loader 登録するローダー + * @package + */ + + }, { + key: "addLoader", + value: function addLoader(loader) { + this._loaders.push(loader); + } + /** + * 読み込み中の SceneLoader を削除 + * @param {mapray.SceneLoader} loader 削除するローダー + * @package + */ + + }, { + key: "removeLoader", + value: function removeLoader(loader) { + var index = this._loaders.indexOf(loader); + + if (index >= 0) { + this._loaders.splice(index, 1); + } + } + /** + * @summary FlakePrimitiveProducer の反復可能オブジェクトを取得 + * + * @return {iterable.} + * + * @package + */ + + }, { + key: "getFlakePrimitiveProducers", + value: function getFlakePrimitiveProducers() { + var producers = []; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._enode_list[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var entity = _step4.value.entity; + if (!entity.visibility) continue; + var prod = entity.getFlakePrimitiveProducer(); + + if (prod !== null) { + producers.push(prod); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return producers; + } + /** + * EasyBindingBlock.DescendantUnbinder 処理 + * + * @private + */ + + }, { + key: "_unbindDescendantAnimations", + value: function _unbindDescendantAnimations() { + // すべてのエンティティを解除 + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = this._enode_list[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var entity = _step5.value.entity; + entity.animation.unbindAllRecursively(); + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + }, { + key: "glenv", + get: function get() { + return this._glenv; + } + /** + * this を保有する親オブジェクト + * @type {mapray.Viewer} + * @readonly + */ + + }, { + key: "viewer", + get: function get() { + return this._viewer; + } + /** + * @summary アニメーションパラメータ設定 + * + * @type {mapray.animation.BindingBlock} + * @readonly + */ + + }, { + key: "animation", + get: function get() { + return this._animation; + } + /** + * エンティティ数 + * @type {number} + * @readonly + */ + + }, { + key: "num_entities", + get: function get() { + return this._enode_list.length; + } + }]); + + return Scene; +}(); +/** + * エンティティ管理用ノード + * + * @memberof mapray.Scene + * @private + */ + + +var ENode = +/** + * @param {mapray.Entity} entity 管理対象のエンティティ + */ +function ENode(entity) { + _classCallCheck(this, ENode); + + /** + * @summary 管理対象のエンティティ + * @member mapray.Scene.ENode#entity + * @type {mapray.Entity} + * @readonly + */ + this.entity = entity; + this.regions = null; +}; + +var quot = /"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value) +// https://tc39.github.io/ecma262/#sec-createhtml + +var createHtml = function (string, tag, attribute, value) { + var S = String(requireObjectCoercible(string)); + var p1 = '<' + tag; + if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"'; + return p1 + '>' + S + ''; +}; + +// of a tag and escaping quotes in arguments + +var stringHtmlForced = function (METHOD_NAME) { + return fails(function () { + var test = ''[METHOD_NAME]('"'); + return test !== test.toLowerCase() || test.split('"').length > 3; + }); +}; + +// https://tc39.github.io/ecma262/#sec-string.prototype.link + + +_export({ + target: 'String', + proto: true, + forced: stringHtmlForced('link') +}, { + link: function link(url) { + return createHtml(this, 'a', 'href', url); + } +}); + +// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof + +_export({ + target: 'Array', + proto: true, + forced: arrayLastIndexOf !== [].lastIndexOf +}, { + lastIndexOf: arrayLastIndexOf +}); + +var getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f; +var nativeStartsWith = ''.startsWith; +var min$5 = Math.min; +var CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic('startsWith'); // https://github.com/zloirock/core-js/pull/702 + +var MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () { + var descriptor = getOwnPropertyDescriptor$4(String.prototype, 'startsWith'); + return descriptor && !descriptor.writable; +}(); // `String.prototype.startsWith` method +// https://tc39.github.io/ecma262/#sec-string.prototype.startswith + +_export({ + target: 'String', + proto: true, + forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC +}, { + startsWith: function startsWith(searchString + /* , position = 0 */ + ) { + var that = String(requireObjectCoercible(this)); + notARegexp(searchString); + var index = toLength(min$5(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = String(searchString); + return nativeStartsWith ? nativeStartsWith.call(that, search, index) : that.slice(index, index + search.length) === search; + } +}); + +/** + * @private + */ +var HTTP = +/*#__PURE__*/ +function () { + function HTTP() { + _classCallCheck(this, HTTP); + } + + _createClass(HTTP, null, [{ + key: "get", + value: function () { + var _get = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee(url, query) { + var option, + _args = arguments; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + option = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}; + _context.next = 3; + return this.fetch(HTTP.METHOD.GET, url, query, null, option); + + case 3: + return _context.abrupt("return", _context.sent); + + case 4: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function get(_x5, _x6) { + return _get.apply(this, arguments); + } + + return get; + }() + }, { + key: "post", + value: function () { + var _post = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2(url, query, body) { + var option, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + option = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : {}; + _context2.next = 3; + return this.fetch(HTTP.METHOD.POST, url, query, body, option); + + case 3: + return _context2.abrupt("return", _context2.sent); + + case 4: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function post(_x7, _x8, _x9) { + return _post.apply(this, arguments); + } + + return post; + }() + }, { + key: "patch", + value: function () { + var _patch = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3(url, query, body) { + var option, + _args3 = arguments; + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + option = _args3.length > 3 && _args3[3] !== undefined ? _args3[3] : {}; + _context3.next = 3; + return this.fetch(HTTP.METHOD.PATCH, url, query, body, option); + + case 3: + return _context3.abrupt("return", _context3.sent); + + case 4: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + + function patch(_x10, _x11, _x12) { + return _patch.apply(this, arguments); + } + + return patch; + }() + }, { + key: "put", + value: function () { + var _put = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee4(url, query, body) { + var option, + _args4 = arguments; + return regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + option = _args4.length > 3 && _args4[3] !== undefined ? _args4[3] : {}; + _context4.next = 3; + return this.fetch(HTTP.METHOD.PUT, url, query, body, option); + + case 3: + return _context4.abrupt("return", _context4.sent); + + case 4: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function put(_x13, _x14, _x15) { + return _put.apply(this, arguments); + } + + return put; + }() + }, { + key: "delete", + value: function () { + var _delete2 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee5(url, query) { + var option, + _args5 = arguments; + return regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + option = _args5.length > 2 && _args5[2] !== undefined ? _args5[2] : {}; + _context5.next = 3; + return this.fetch(HTTP.METHOD.DELETE, url, query, null, option); + + case 3: + return _context5.abrupt("return", _context5.sent); + + case 4: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function _delete(_x16, _x17) { + return _delete2.apply(this, arguments); + } + + return _delete; + }() + /** + * @summary call fetch + * + *
+     * query = {
+     *     key1: value1,
+     *     key2: value2,
+     * };
+     * URL: url?key1=value1&key2=value2
+     * 
+ * window.fetch(); + * + * @private + * @param {string} method + * @param {string} url + * @param {object} query + * @param {object|string} body + * @param {object} [option] second argument of window.fetch(url, [init]). + */ + + }, { + key: "fetch", + value: function (_fetch) { + function fetch(_x, _x2, _x3, _x4) { + return _fetch.apply(this, arguments); + } + + fetch.toString = function () { + return _fetch.toString(); + }; + + return fetch; + }( + /*#__PURE__*/ + function () { + var _ref = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee6(method, url, query, body) { + var option, + queryText, + response, + _args6 = arguments; + return regeneratorRuntime.wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + option = _args6.length > 4 && _args6[4] !== undefined ? _args6[4] : {}; + queryText = !query ? "" : "?" + Object.keys(query).map(function (k) { + return k + "=" + query[k]; + }).join("&"); + option.method = method; + if (body) option.body = _typeof(body) === "object" ? JSON.stringify(body) : body; + _context6.prev = 4; + _context6.next = 7; + return fetch(url + queryText, option); + + case 7: + response = _context6.sent; + _context6.next = 13; + break; + + case 10: + _context6.prev = 10; + _context6.t0 = _context6["catch"](4); + throw new FetchError("Failed to fetch", url, null, _context6.t0); + + case 13: + if (response.ok) { + _context6.next = 15; + break; + } + + throw new FetchError("Failed to fetch: " + response.statusText, url, response); + + case 15: + return _context6.abrupt("return", response); + + case 16: + case "end": + return _context6.stop(); + } + } + }, _callee6, null, [[4, 10]]); + })); + + return function (_x18, _x19, _x20, _x21) { + return _ref.apply(this, arguments); + }; + }()) + }, { + key: "isJson", + value: function isJson(mimeType) { + return mimeType.startsWith("application/json") || mimeType === "model/gltf+json"; + } + }]); + + return HTTP; +}(); + +HTTP.METHOD = { + GET: "GET", + POST: "POST", + PATCH: "PATCH", + PUT: "PUT", + DELETE: "DELETE" +}; +HTTP.CONTENT_TYPE = "Content-Type"; +HTTP.RESPONSE_STATUS = { + NO_CONTENT: 204 +}; +/** + * @private + */ + +var FetchError = +/*#__PURE__*/ +function (_Error) { + _inherits(FetchError, _Error); + + function FetchError(message, url, response, cause) { + var _this; + + _classCallCheck(this, FetchError); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(FetchError).call(this, message + " " + url)); + + if (Error.captureStackTrace) { + Error.captureStackTrace(_assertThisInitialized(_this), FetchError); + } + + _this.name = "FetchError"; + _this.url = url; + _this.response = response; + _this.cause = cause; + var is_aborted = false; + + if (cause) { + is_aborted = cause.message === "The user aborted a request."; + _this.stack += "\nCaused-By: " + (cause.stack || cause); + } + + _this.is_aborted = is_aborted; + return _this; + } + + return FetchError; +}(_wrapNativeSuper(Error)); + +var defineProperty$a = objectDefineProperty.f; +var getOwnPropertyNames$2 = objectGetOwnPropertyNames.f; +var setInternalState$6 = internalState.set; +var MATCH$2 = wellKnownSymbol('match'); +var NativeRegExp = global_1.RegExp; +var RegExpPrototype$1 = NativeRegExp.prototype; +var re1 = /a/g; +var re2 = /a/g; // "new" should create a new object, old webkit bug + +var CORRECT_NEW = new NativeRegExp(re1) !== re1; +var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y; +var FORCED$7 = descriptors && isForced_1('RegExp', !CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () { + re2[MATCH$2] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match + + return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i'; +})); // `RegExp` constructor +// https://tc39.github.io/ecma262/#sec-regexp-constructor + +if (FORCED$7) { + var RegExpWrapper = function RegExp(pattern, flags) { + var thisIsRegExp = this instanceof RegExpWrapper; + var patternIsRegExp = isRegexp(pattern); + var flagsAreUndefined = flags === undefined; + var sticky; + + if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) { + return pattern; + } + + if (CORRECT_NEW) { + if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source; + } else if (pattern instanceof RegExpWrapper) { + if (flagsAreUndefined) flags = regexpFlags.call(pattern); + pattern = pattern.source; + } + + if (UNSUPPORTED_Y$2) { + sticky = !!flags && flags.indexOf('y') > -1; + if (sticky) flags = flags.replace(/y/g, ''); + } + + var result = inheritIfRequired(CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype$1, RegExpWrapper); + if (UNSUPPORTED_Y$2 && sticky) setInternalState$6(result, { + sticky: sticky + }); + return result; + }; + + var proxy = function (key) { + key in RegExpWrapper || defineProperty$a(RegExpWrapper, key, { + configurable: true, + get: function () { + return NativeRegExp[key]; + }, + set: function (it) { + NativeRegExp[key] = it; + } + }); + }; + + var keys$3 = getOwnPropertyNames$2(NativeRegExp); + var index = 0; + + while (keys$3.length > index) proxy(keys$3[index++]); + + RegExpPrototype$1.constructor = RegExpWrapper; + RegExpWrapper.prototype = RegExpPrototype$1; + redefine(global_1, 'RegExp', RegExpWrapper); +} // https://tc39.github.io/ecma262/#sec-get-regexp-@@species + + +setSpecies('RegExp'); + +var ITERATOR$7 = wellKnownSymbol('iterator'); +var nativeUrl = !fails(function () { + var url = new URL('b?a=1&b=2&c=3', 'http://a'); + var searchParams = url.searchParams; + var result = ''; + url.pathname = 'c%20d'; + searchParams.forEach(function (value, key) { + searchParams['delete']('b'); + result += key + value; + }); + return isPure && !url.toJSON || !searchParams.sort || url.href !== 'http://a/c%20d?a=1&c=3' || searchParams.get('c') !== '3' || String(new URLSearchParams('?a=1')) !== 'a=1' || !searchParams[ITERATOR$7] // throws in Edge + || new URL('https://a@b').username !== 'a' || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' // not punycoded in Edge + || new URL('http://тест').host !== 'xn--e1aybc' // not escaped in Chrome 62- + || new URL('http://a#б').hash !== '#%D0%B1' // fails in Chrome 66- + || result !== 'a1c3' // throws in Safari + || new URL('http://x', undefined).host !== 'x'; +}); + +var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +var base = 36; +var tMin = 1; +var tMax = 26; +var skew = 38; +var damp = 700; +var initialBias = 72; +var initialN = 128; // 0x80 + +var delimiter = '-'; // '\x2D' + +var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars + +var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process'; +var baseMinusTMin = base - tMin; +var floor$3 = Math.floor; +var stringFromCharCode = String.fromCharCode; +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + */ + +var ucs2decode = function (string) { + var output = []; + var counter = 0; + var length = string.length; + + while (counter < length) { + var value = string.charCodeAt(counter++); + + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + var extra = string.charCodeAt(counter++); + + if ((extra & 0xFC00) == 0xDC00) { + // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + + return output; +}; +/** + * Converts a digit/integer into a basic code point. + */ + + +var digitToBasic = function (digit) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26); +}; +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + */ + + +var adapt = function (delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor$3(delta / damp) : delta >> 1; + delta += floor$3(delta / numPoints); + + for (; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor$3(delta / baseMinusTMin); + } + + return floor$3(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + */ +// eslint-disable-next-line max-statements + + +var encode = function (input) { + var output = []; // Convert the input in UCS-2 to an array of Unicode code points. + + input = ucs2decode(input); // Cache the length. + + var inputLength = input.length; // Initialize the state. + + var n = initialN; + var delta = 0; + var bias = initialBias; + var i, currentValue; // Handle the basic code points. + + for (i = 0; i < input.length; i++) { + currentValue = input[i]; + + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + var basicLength = output.length; // number of basic code points. + + var handledCPCount = basicLength; // number of code points that have been handled; + // Finish the basic string with a delimiter unless it's empty. + + if (basicLength) { + output.push(delimiter); + } // Main encoding loop: + + + while (handledCPCount < inputLength) { + // All non-basic code points < n have been handled already. Find the next larger one: + var m = maxInt; + + for (i = 0; i < input.length; i++) { + currentValue = input[i]; + + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } // Increase `delta` enough to advance the decoder's state to , but guard against overflow. + + + var handledCPCountPlusOne = handledCPCount + 1; + + if (m - n > floor$3((maxInt - delta) / handledCPCountPlusOne)) { + throw RangeError(OVERFLOW_ERROR); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (i = 0; i < input.length; i++) { + currentValue = input[i]; + + if (currentValue < n && ++delta > maxInt) { + throw RangeError(OVERFLOW_ERROR); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer. + var q = delta; + + for (var k = base;; + /* no condition */ + k += base) { + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) break; + var qMinusT = q - t; + var baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT))); + q = floor$3(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + } + + return output.join(''); +}; + +var stringPunycodeToAscii = function (input) { + var encoded = []; + var labels = input.toLowerCase().replace(regexSeparators, '\u002E').split('.'); + var i, label; + + for (i = 0; i < labels.length; i++) { + label = labels[i]; + encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label); + } + + return encoded.join('.'); +}; + +var getIterator = function (it) { + var iteratorMethod = getIteratorMethod(it); + + if (typeof iteratorMethod != 'function') { + throw TypeError(String(it) + ' is not iterable'); + } + + return anObject(iteratorMethod.call(it)); +}; + +var $fetch$1 = getBuiltIn('fetch'); +var Headers = getBuiltIn('Headers'); +var ITERATOR$8 = wellKnownSymbol('iterator'); +var URL_SEARCH_PARAMS = 'URLSearchParams'; +var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator'; +var setInternalState$7 = internalState.set; +var getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS); +var getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR); +var plus = /\+/g; +var sequences = Array(4); + +var percentSequence = function (bytes) { + return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\da-f]{2}){' + bytes + '})', 'gi')); +}; + +var percentDecode = function (sequence) { + try { + return decodeURIComponent(sequence); + } catch (error) { + return sequence; + } +}; + +var deserialize = function (it) { + var result = it.replace(plus, ' '); + var bytes = 4; + + try { + return decodeURIComponent(result); + } catch (error) { + while (bytes) { + result = result.replace(percentSequence(bytes--), percentDecode); + } + + return result; + } +}; + +var find = /[!'()~]|%20/g; +var replace = { + '!': '%21', + "'": '%27', + '(': '%28', + ')': '%29', + '~': '%7E', + '%20': '+' +}; + +var replacer = function (match) { + return replace[match]; +}; + +var serialize = function (it) { + return encodeURIComponent(it).replace(find, replacer); +}; + +var parseSearchParams = function (result, query) { + if (query) { + var attributes = query.split('&'); + var index = 0; + var attribute, entry; + + while (index < attributes.length) { + attribute = attributes[index++]; + + if (attribute.length) { + entry = attribute.split('='); + result.push({ + key: deserialize(entry.shift()), + value: deserialize(entry.join('=')) + }); + } + } + } +}; + +var updateSearchParams = function (query) { + this.entries.length = 0; + parseSearchParams(this.entries, query); +}; + +var validateArgumentsLength = function (passed, required) { + if (passed < required) throw TypeError('Not enough arguments'); +}; + +var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) { + setInternalState$7(this, { + type: URL_SEARCH_PARAMS_ITERATOR, + iterator: getIterator(getInternalParamsState(params).entries), + kind: kind + }); +}, 'Iterator', function next() { + var state = getInternalIteratorState(this); + var kind = state.kind; + var step = state.iterator.next(); + var entry = step.value; + + if (!step.done) { + step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value]; + } + + return step; +}); // `URLSearchParams` constructor +// https://url.spec.whatwg.org/#interface-urlsearchparams + +var URLSearchParamsConstructor = function URLSearchParams() +/* init */ +{ + anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS); + var init = arguments.length > 0 ? arguments[0] : undefined; + var that = this; + var entries = []; + var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key; + setInternalState$7(that, { + type: URL_SEARCH_PARAMS, + entries: entries, + updateURL: function () { + /* empty */ + }, + updateSearchParams: updateSearchParams + }); + + if (init !== undefined) { + if (isObject(init)) { + iteratorMethod = getIteratorMethod(init); + + if (typeof iteratorMethod === 'function') { + iterator = iteratorMethod.call(init); + next = iterator.next; + + while (!(step = next.call(iterator)).done) { + entryIterator = getIterator(anObject(step.value)); + entryNext = entryIterator.next; + if ((first = entryNext.call(entryIterator)).done || (second = entryNext.call(entryIterator)).done || !entryNext.call(entryIterator).done) throw TypeError('Expected sequence with length 2'); + entries.push({ + key: first.value + '', + value: second.value + '' + }); + } + } else for (key in init) if (has(init, key)) entries.push({ + key: key, + value: init[key] + '' + }); + } else { + parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + ''); + } + } +}; + +var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype; +redefineAll(URLSearchParamsPrototype, { + // `URLSearchParams.prototype.appent` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-append + append: function append(name, value) { + validateArgumentsLength(arguments.length, 2); + var state = getInternalParamsState(this); + state.entries.push({ + key: name + '', + value: value + '' + }); + state.updateURL(); + }, + // `URLSearchParams.prototype.delete` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-delete + 'delete': function (name) { + validateArgumentsLength(arguments.length, 1); + var state = getInternalParamsState(this); + var entries = state.entries; + var key = name + ''; + var index = 0; + + while (index < entries.length) { + if (entries[index].key === key) entries.splice(index, 1);else index++; + } + + state.updateURL(); + }, + // `URLSearchParams.prototype.get` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-get + get: function get(name) { + validateArgumentsLength(arguments.length, 1); + var entries = getInternalParamsState(this).entries; + var key = name + ''; + var index = 0; + + for (; index < entries.length; index++) { + if (entries[index].key === key) return entries[index].value; + } + + return null; + }, + // `URLSearchParams.prototype.getAll` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-getall + getAll: function getAll(name) { + validateArgumentsLength(arguments.length, 1); + var entries = getInternalParamsState(this).entries; + var key = name + ''; + var result = []; + var index = 0; + + for (; index < entries.length; index++) { + if (entries[index].key === key) result.push(entries[index].value); + } + + return result; + }, + // `URLSearchParams.prototype.has` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-has + has: function has(name) { + validateArgumentsLength(arguments.length, 1); + var entries = getInternalParamsState(this).entries; + var key = name + ''; + var index = 0; + + while (index < entries.length) { + if (entries[index++].key === key) return true; + } + + return false; + }, + // `URLSearchParams.prototype.set` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-set + set: function set(name, value) { + validateArgumentsLength(arguments.length, 1); + var state = getInternalParamsState(this); + var entries = state.entries; + var found = false; + var key = name + ''; + var val = value + ''; + var index = 0; + var entry; + + for (; index < entries.length; index++) { + entry = entries[index]; + + if (entry.key === key) { + if (found) entries.splice(index--, 1);else { + found = true; + entry.value = val; + } + } + } + + if (!found) entries.push({ + key: key, + value: val + }); + state.updateURL(); + }, + // `URLSearchParams.prototype.sort` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-sort + sort: function sort() { + var state = getInternalParamsState(this); + var entries = state.entries; // Array#sort is not stable in some engines + + var slice = entries.slice(); + var entry, entriesIndex, sliceIndex; + entries.length = 0; + + for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) { + entry = slice[sliceIndex]; + + for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) { + if (entries[entriesIndex].key > entry.key) { + entries.splice(entriesIndex, 0, entry); + break; + } + } + + if (entriesIndex === sliceIndex) entries.push(entry); + } + + state.updateURL(); + }, + // `URLSearchParams.prototype.forEach` method + forEach: function forEach(callback + /* , thisArg */ + ) { + var entries = getInternalParamsState(this).entries; + var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3); + var index = 0; + var entry; + + while (index < entries.length) { + entry = entries[index++]; + boundFunction(entry.value, entry.key, this); + } + }, + // `URLSearchParams.prototype.keys` method + keys: function keys() { + return new URLSearchParamsIterator(this, 'keys'); + }, + // `URLSearchParams.prototype.values` method + values: function values() { + return new URLSearchParamsIterator(this, 'values'); + }, + // `URLSearchParams.prototype.entries` method + entries: function entries() { + return new URLSearchParamsIterator(this, 'entries'); + } +}, { + enumerable: true +}); // `URLSearchParams.prototype[@@iterator]` method + +redefine(URLSearchParamsPrototype, ITERATOR$8, URLSearchParamsPrototype.entries); // `URLSearchParams.prototype.toString` method +// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior + +redefine(URLSearchParamsPrototype, 'toString', function toString() { + var entries = getInternalParamsState(this).entries; + var result = []; + var index = 0; + var entry; + + while (index < entries.length) { + entry = entries[index++]; + result.push(serialize(entry.key) + '=' + serialize(entry.value)); + } + + return result.join('&'); +}, { + enumerable: true +}); +setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS); +_export({ + global: true, + forced: !nativeUrl +}, { + URLSearchParams: URLSearchParamsConstructor +}); // Wrap `fetch` for correct work with polyfilled `URLSearchParams` +// https://github.com/zloirock/core-js/issues/674 + +if (!nativeUrl && typeof $fetch$1 == 'function' && typeof Headers == 'function') { + _export({ + global: true, + enumerable: true, + forced: true + }, { + fetch: function fetch(input + /* , init */ + ) { + var args = [input]; + var init, body, headers; + + if (arguments.length > 1) { + init = arguments[1]; + + if (isObject(init)) { + body = init.body; + + if (classof(body) === URL_SEARCH_PARAMS) { + headers = init.headers ? new Headers(init.headers) : new Headers(); + + if (!headers.has('content-type')) { + headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); + } + + init = objectCreate(init, { + body: createPropertyDescriptor(0, String(body)), + headers: createPropertyDescriptor(0, headers) + }); + } + } + + args.push(init); + } + + return $fetch$1.apply(this, args); + } + }); +} + +var web_urlSearchParams = { + URLSearchParams: URLSearchParamsConstructor, + getState: getInternalParamsState +}; + +var codeAt = stringMultibyte.codeAt; +var NativeURL = global_1.URL; +var URLSearchParams$1 = web_urlSearchParams.URLSearchParams; +var getInternalSearchParamsState = web_urlSearchParams.getState; +var setInternalState$8 = internalState.set; +var getInternalURLState = internalState.getterFor('URL'); +var floor$4 = Math.floor; +var pow$1 = Math.pow; +var INVALID_AUTHORITY = 'Invalid authority'; +var INVALID_SCHEME = 'Invalid scheme'; +var INVALID_HOST = 'Invalid host'; +var INVALID_PORT = 'Invalid port'; +var ALPHA = /[A-Za-z]/; +var ALPHANUMERIC = /[\d+\-.A-Za-z]/; +var DIGIT = /\d/; +var HEX_START = /^(0x|0X)/; +var OCT = /^[0-7]+$/; +var DEC = /^\d+$/; +var HEX = /^[\dA-Fa-f]+$/; // eslint-disable-next-line no-control-regex + +var FORBIDDEN_HOST_CODE_POINT = /[\u0000\u0009\u000A\u000D #%/:?@[\\]]/; // eslint-disable-next-line no-control-regex + +var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\u0000\u0009\u000A\u000D #/:?@[\\]]/; // eslint-disable-next-line no-control-regex + +var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g; // eslint-disable-next-line no-control-regex + +var TAB_AND_NEW_LINE = /[\u0009\u000A\u000D]/g; +var EOF; + +var parseHost = function (url, input) { + var result, codePoints, index; + + if (input.charAt(0) == '[') { + if (input.charAt(input.length - 1) != ']') return INVALID_HOST; + result = parseIPv6(input.slice(1, -1)); + if (!result) return INVALID_HOST; + url.host = result; // opaque host + } else if (!isSpecial(url)) { + if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST; + result = ''; + codePoints = arrayFrom(input); + + for (index = 0; index < codePoints.length; index++) { + result += percentEncode(codePoints[index], C0ControlPercentEncodeSet); + } + + url.host = result; + } else { + input = stringPunycodeToAscii(input); + if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST; + result = parseIPv4(input); + if (result === null) return INVALID_HOST; + url.host = result; + } +}; + +var parseIPv4 = function (input) { + var parts = input.split('.'); + var partsLength, numbers, index, part, radix, number, ipv4; + + if (parts.length && parts[parts.length - 1] == '') { + parts.pop(); + } + + partsLength = parts.length; + if (partsLength > 4) return input; + numbers = []; + + for (index = 0; index < partsLength; index++) { + part = parts[index]; + if (part == '') return input; + radix = 10; + + if (part.length > 1 && part.charAt(0) == '0') { + radix = HEX_START.test(part) ? 16 : 8; + part = part.slice(radix == 8 ? 1 : 2); + } + + if (part === '') { + number = 0; + } else { + if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input; + number = parseInt(part, radix); + } + + numbers.push(number); + } + + for (index = 0; index < partsLength; index++) { + number = numbers[index]; + + if (index == partsLength - 1) { + if (number >= pow$1(256, 5 - partsLength)) return null; + } else if (number > 255) return null; + } + + ipv4 = numbers.pop(); + + for (index = 0; index < numbers.length; index++) { + ipv4 += numbers[index] * pow$1(256, 3 - index); + } + + return ipv4; +}; // eslint-disable-next-line max-statements + + +var parseIPv6 = function (input) { + var address = [0, 0, 0, 0, 0, 0, 0, 0]; + var pieceIndex = 0; + var compress = null; + var pointer = 0; + var value, length, numbersSeen, ipv4Piece, number, swaps, swap; + + var char = function () { + return input.charAt(pointer); + }; + + if (char() == ':') { + if (input.charAt(1) != ':') return; + pointer += 2; + pieceIndex++; + compress = pieceIndex; + } + + while (char()) { + if (pieceIndex == 8) return; + + if (char() == ':') { + if (compress !== null) return; + pointer++; + pieceIndex++; + compress = pieceIndex; + continue; + } + + value = length = 0; + + while (length < 4 && HEX.test(char())) { + value = value * 16 + parseInt(char(), 16); + pointer++; + length++; + } + + if (char() == '.') { + if (length == 0) return; + pointer -= length; + if (pieceIndex > 6) return; + numbersSeen = 0; + + while (char()) { + ipv4Piece = null; + + if (numbersSeen > 0) { + if (char() == '.' && numbersSeen < 4) pointer++;else return; + } + + if (!DIGIT.test(char())) return; + + while (DIGIT.test(char())) { + number = parseInt(char(), 10); + if (ipv4Piece === null) ipv4Piece = number;else if (ipv4Piece == 0) return;else ipv4Piece = ipv4Piece * 10 + number; + if (ipv4Piece > 255) return; + pointer++; + } + + address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece; + numbersSeen++; + if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++; + } + + if (numbersSeen != 4) return; + break; + } else if (char() == ':') { + pointer++; + if (!char()) return; + } else if (char()) return; + + address[pieceIndex++] = value; + } + + if (compress !== null) { + swaps = pieceIndex - compress; + pieceIndex = 7; + + while (pieceIndex != 0 && swaps > 0) { + swap = address[pieceIndex]; + address[pieceIndex--] = address[compress + swaps - 1]; + address[compress + --swaps] = swap; + } + } else if (pieceIndex != 8) return; + + return address; +}; + +var findLongestZeroSequence = function (ipv6) { + var maxIndex = null; + var maxLength = 1; + var currStart = null; + var currLength = 0; + var index = 0; + + for (; index < 8; index++) { + if (ipv6[index] !== 0) { + if (currLength > maxLength) { + maxIndex = currStart; + maxLength = currLength; + } + + currStart = null; + currLength = 0; + } else { + if (currStart === null) currStart = index; + ++currLength; + } + } + + if (currLength > maxLength) { + maxIndex = currStart; + maxLength = currLength; + } + + return maxIndex; +}; + +var serializeHost = function (host) { + var result, index, compress, ignore0; // ipv4 + + if (typeof host == 'number') { + result = []; + + for (index = 0; index < 4; index++) { + result.unshift(host % 256); + host = floor$4(host / 256); + } + + return result.join('.'); // ipv6 + } else if (typeof host == 'object') { + result = ''; + compress = findLongestZeroSequence(host); + + for (index = 0; index < 8; index++) { + if (ignore0 && host[index] === 0) continue; + if (ignore0) ignore0 = false; + + if (compress === index) { + result += index ? ':' : '::'; + ignore0 = true; + } else { + result += host[index].toString(16); + if (index < 7) result += ':'; + } + } + + return '[' + result + ']'; + } + + return host; +}; + +var C0ControlPercentEncodeSet = {}; +var fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, { + ' ': 1, + '"': 1, + '<': 1, + '>': 1, + '`': 1 +}); +var pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, { + '#': 1, + '?': 1, + '{': 1, + '}': 1 +}); +var userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, { + '/': 1, + ':': 1, + ';': 1, + '=': 1, + '@': 1, + '[': 1, + '\\': 1, + ']': 1, + '^': 1, + '|': 1 +}); + +var percentEncode = function (char, set) { + var code = codeAt(char, 0); + return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char); +}; + +var specialSchemes = { + ftp: 21, + file: null, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +var isSpecial = function (url) { + return has(specialSchemes, url.scheme); +}; + +var includesCredentials = function (url) { + return url.username != '' || url.password != ''; +}; + +var cannotHaveUsernamePasswordPort = function (url) { + return !url.host || url.cannotBeABaseURL || url.scheme == 'file'; +}; + +var isWindowsDriveLetter = function (string, normalized) { + var second; + return string.length == 2 && ALPHA.test(string.charAt(0)) && ((second = string.charAt(1)) == ':' || !normalized && second == '|'); +}; + +var startsWithWindowsDriveLetter = function (string) { + var third; + return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (string.length == 2 || (third = string.charAt(2)) === '/' || third === '\\' || third === '?' || third === '#'); +}; + +var shortenURLsPath = function (url) { + var path = url.path; + var pathSize = path.length; + + if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) { + path.pop(); + } +}; + +var isSingleDot = function (segment) { + return segment === '.' || segment.toLowerCase() === '%2e'; +}; + +var isDoubleDot = function (segment) { + segment = segment.toLowerCase(); + return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e'; +}; // States: + + +var SCHEME_START = {}; +var SCHEME = {}; +var NO_SCHEME = {}; +var SPECIAL_RELATIVE_OR_AUTHORITY = {}; +var PATH_OR_AUTHORITY = {}; +var RELATIVE = {}; +var RELATIVE_SLASH = {}; +var SPECIAL_AUTHORITY_SLASHES = {}; +var SPECIAL_AUTHORITY_IGNORE_SLASHES = {}; +var AUTHORITY = {}; +var HOST = {}; +var HOSTNAME = {}; +var PORT = {}; +var FILE = {}; +var FILE_SLASH = {}; +var FILE_HOST = {}; +var PATH_START = {}; +var PATH = {}; +var CANNOT_BE_A_BASE_URL_PATH = {}; +var QUERY = {}; +var FRAGMENT = {}; // eslint-disable-next-line max-statements + +var parseURL = function (url, input, stateOverride, base) { + var state = stateOverride || SCHEME_START; + var pointer = 0; + var buffer = ''; + var seenAt = false; + var seenBracket = false; + var seenPasswordToken = false; + var codePoints, char, bufferCodePoints, failure; + + if (!stateOverride) { + url.scheme = ''; + url.username = ''; + url.password = ''; + url.host = null; + url.port = null; + url.path = []; + url.query = null; + url.fragment = null; + url.cannotBeABaseURL = false; + input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, ''); + } + + input = input.replace(TAB_AND_NEW_LINE, ''); + codePoints = arrayFrom(input); + + while (pointer <= codePoints.length) { + char = codePoints[pointer]; + + switch (state) { + case SCHEME_START: + if (char && ALPHA.test(char)) { + buffer += char.toLowerCase(); + state = SCHEME; + } else if (!stateOverride) { + state = NO_SCHEME; + continue; + } else return INVALID_SCHEME; + + break; + + case SCHEME: + if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) { + buffer += char.toLowerCase(); + } else if (char == ':') { + if (stateOverride && (isSpecial(url) != has(specialSchemes, buffer) || buffer == 'file' && (includesCredentials(url) || url.port !== null) || url.scheme == 'file' && !url.host)) return; + url.scheme = buffer; + + if (stateOverride) { + if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null; + return; + } + + buffer = ''; + + if (url.scheme == 'file') { + state = FILE; + } else if (isSpecial(url) && base && base.scheme == url.scheme) { + state = SPECIAL_RELATIVE_OR_AUTHORITY; + } else if (isSpecial(url)) { + state = SPECIAL_AUTHORITY_SLASHES; + } else if (codePoints[pointer + 1] == '/') { + state = PATH_OR_AUTHORITY; + pointer++; + } else { + url.cannotBeABaseURL = true; + url.path.push(''); + state = CANNOT_BE_A_BASE_URL_PATH; + } + } else if (!stateOverride) { + buffer = ''; + state = NO_SCHEME; + pointer = 0; + continue; + } else return INVALID_SCHEME; + + break; + + case NO_SCHEME: + if (!base || base.cannotBeABaseURL && char != '#') return INVALID_SCHEME; + + if (base.cannotBeABaseURL && char == '#') { + url.scheme = base.scheme; + url.path = base.path.slice(); + url.query = base.query; + url.fragment = ''; + url.cannotBeABaseURL = true; + state = FRAGMENT; + break; + } + + state = base.scheme == 'file' ? FILE : RELATIVE; + continue; + + case SPECIAL_RELATIVE_OR_AUTHORITY: + if (char == '/' && codePoints[pointer + 1] == '/') { + state = SPECIAL_AUTHORITY_IGNORE_SLASHES; + pointer++; + } else { + state = RELATIVE; + continue; + } + + break; + + case PATH_OR_AUTHORITY: + if (char == '/') { + state = AUTHORITY; + break; + } else { + state = PATH; + continue; + } + + case RELATIVE: + url.scheme = base.scheme; + + if (char == EOF) { + url.username = base.username; + url.password = base.password; + url.host = base.host; + url.port = base.port; + url.path = base.path.slice(); + url.query = base.query; + } else if (char == '/' || char == '\\' && isSpecial(url)) { + state = RELATIVE_SLASH; + } else if (char == '?') { + url.username = base.username; + url.password = base.password; + url.host = base.host; + url.port = base.port; + url.path = base.path.slice(); + url.query = ''; + state = QUERY; + } else if (char == '#') { + url.username = base.username; + url.password = base.password; + url.host = base.host; + url.port = base.port; + url.path = base.path.slice(); + url.query = base.query; + url.fragment = ''; + state = FRAGMENT; + } else { + url.username = base.username; + url.password = base.password; + url.host = base.host; + url.port = base.port; + url.path = base.path.slice(); + url.path.pop(); + state = PATH; + continue; + } + + break; + + case RELATIVE_SLASH: + if (isSpecial(url) && (char == '/' || char == '\\')) { + state = SPECIAL_AUTHORITY_IGNORE_SLASHES; + } else if (char == '/') { + state = AUTHORITY; + } else { + url.username = base.username; + url.password = base.password; + url.host = base.host; + url.port = base.port; + state = PATH; + continue; + } + + break; + + case SPECIAL_AUTHORITY_SLASHES: + state = SPECIAL_AUTHORITY_IGNORE_SLASHES; + if (char != '/' || buffer.charAt(pointer + 1) != '/') continue; + pointer++; + break; + + case SPECIAL_AUTHORITY_IGNORE_SLASHES: + if (char != '/' && char != '\\') { + state = AUTHORITY; + continue; + } + + break; + + case AUTHORITY: + if (char == '@') { + if (seenAt) buffer = '%40' + buffer; + seenAt = true; + bufferCodePoints = arrayFrom(buffer); + + for (var i = 0; i < bufferCodePoints.length; i++) { + var codePoint = bufferCodePoints[i]; + + if (codePoint == ':' && !seenPasswordToken) { + seenPasswordToken = true; + continue; + } + + var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet); + if (seenPasswordToken) url.password += encodedCodePoints;else url.username += encodedCodePoints; + } + + buffer = ''; + } else if (char == EOF || char == '/' || char == '?' || char == '#' || char == '\\' && isSpecial(url)) { + if (seenAt && buffer == '') return INVALID_AUTHORITY; + pointer -= arrayFrom(buffer).length + 1; + buffer = ''; + state = HOST; + } else buffer += char; + + break; + + case HOST: + case HOSTNAME: + if (stateOverride && url.scheme == 'file') { + state = FILE_HOST; + continue; + } else if (char == ':' && !seenBracket) { + if (buffer == '') return INVALID_HOST; + failure = parseHost(url, buffer); + if (failure) return failure; + buffer = ''; + state = PORT; + if (stateOverride == HOSTNAME) return; + } else if (char == EOF || char == '/' || char == '?' || char == '#' || char == '\\' && isSpecial(url)) { + if (isSpecial(url) && buffer == '') return INVALID_HOST; + if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return; + failure = parseHost(url, buffer); + if (failure) return failure; + buffer = ''; + state = PATH_START; + if (stateOverride) return; + continue; + } else { + if (char == '[') seenBracket = true;else if (char == ']') seenBracket = false; + buffer += char; + } + + break; + + case PORT: + if (DIGIT.test(char)) { + buffer += char; + } else if (char == EOF || char == '/' || char == '?' || char == '#' || char == '\\' && isSpecial(url) || stateOverride) { + if (buffer != '') { + var port = parseInt(buffer, 10); + if (port > 0xFFFF) return INVALID_PORT; + url.port = isSpecial(url) && port === specialSchemes[url.scheme] ? null : port; + buffer = ''; + } + + if (stateOverride) return; + state = PATH_START; + continue; + } else return INVALID_PORT; + + break; + + case FILE: + url.scheme = 'file'; + if (char == '/' || char == '\\') state = FILE_SLASH;else if (base && base.scheme == 'file') { + if (char == EOF) { + url.host = base.host; + url.path = base.path.slice(); + url.query = base.query; + } else if (char == '?') { + url.host = base.host; + url.path = base.path.slice(); + url.query = ''; + state = QUERY; + } else if (char == '#') { + url.host = base.host; + url.path = base.path.slice(); + url.query = base.query; + url.fragment = ''; + state = FRAGMENT; + } else { + if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) { + url.host = base.host; + url.path = base.path.slice(); + shortenURLsPath(url); + } + + state = PATH; + continue; + } + } else { + state = PATH; + continue; + } + break; + + case FILE_SLASH: + if (char == '/' || char == '\\') { + state = FILE_HOST; + break; + } + + if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) { + if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);else url.host = base.host; + } + + state = PATH; + continue; + + case FILE_HOST: + if (char == EOF || char == '/' || char == '\\' || char == '?' || char == '#') { + if (!stateOverride && isWindowsDriveLetter(buffer)) { + state = PATH; + } else if (buffer == '') { + url.host = ''; + if (stateOverride) return; + state = PATH_START; + } else { + failure = parseHost(url, buffer); + if (failure) return failure; + if (url.host == 'localhost') url.host = ''; + if (stateOverride) return; + buffer = ''; + state = PATH_START; + } + + continue; + } else buffer += char; + + break; + + case PATH_START: + if (isSpecial(url)) { + state = PATH; + if (char != '/' && char != '\\') continue; + } else if (!stateOverride && char == '?') { + url.query = ''; + state = QUERY; + } else if (!stateOverride && char == '#') { + url.fragment = ''; + state = FRAGMENT; + } else if (char != EOF) { + state = PATH; + if (char != '/') continue; + } + + break; + + case PATH: + if (char == EOF || char == '/' || char == '\\' && isSpecial(url) || !stateOverride && (char == '?' || char == '#')) { + if (isDoubleDot(buffer)) { + shortenURLsPath(url); + + if (char != '/' && !(char == '\\' && isSpecial(url))) { + url.path.push(''); + } + } else if (isSingleDot(buffer)) { + if (char != '/' && !(char == '\\' && isSpecial(url))) { + url.path.push(''); + } + } else { + if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) { + if (url.host) url.host = ''; + buffer = buffer.charAt(0) + ':'; // normalize windows drive letter + } + + url.path.push(buffer); + } + + buffer = ''; + + if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) { + while (url.path.length > 1 && url.path[0] === '') { + url.path.shift(); + } + } + + if (char == '?') { + url.query = ''; + state = QUERY; + } else if (char == '#') { + url.fragment = ''; + state = FRAGMENT; + } + } else { + buffer += percentEncode(char, pathPercentEncodeSet); + } + + break; + + case CANNOT_BE_A_BASE_URL_PATH: + if (char == '?') { + url.query = ''; + state = QUERY; + } else if (char == '#') { + url.fragment = ''; + state = FRAGMENT; + } else if (char != EOF) { + url.path[0] += percentEncode(char, C0ControlPercentEncodeSet); + } + + break; + + case QUERY: + if (!stateOverride && char == '#') { + url.fragment = ''; + state = FRAGMENT; + } else if (char != EOF) { + if (char == "'" && isSpecial(url)) url.query += '%27';else if (char == '#') url.query += '%23';else url.query += percentEncode(char, C0ControlPercentEncodeSet); + } + + break; + + case FRAGMENT: + if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet); + break; + } + + pointer++; + } +}; // `URL` constructor +// https://url.spec.whatwg.org/#url-class + + +var URLConstructor = function URL(url +/* , base */ +) { + var that = anInstance(this, URLConstructor, 'URL'); + var base = arguments.length > 1 ? arguments[1] : undefined; + var urlString = String(url); + var state = setInternalState$8(that, { + type: 'URL' + }); + var baseState, failure; + + if (base !== undefined) { + if (base instanceof URLConstructor) baseState = getInternalURLState(base);else { + failure = parseURL(baseState = {}, String(base)); + if (failure) throw TypeError(failure); + } + } + + failure = parseURL(state, urlString, null, baseState); + if (failure) throw TypeError(failure); + var searchParams = state.searchParams = new URLSearchParams$1(); + var searchParamsState = getInternalSearchParamsState(searchParams); + searchParamsState.updateSearchParams(state.query); + + searchParamsState.updateURL = function () { + state.query = String(searchParams) || null; + }; + + if (!descriptors) { + that.href = serializeURL.call(that); + that.origin = getOrigin.call(that); + that.protocol = getProtocol.call(that); + that.username = getUsername.call(that); + that.password = getPassword.call(that); + that.host = getHost.call(that); + that.hostname = getHostname.call(that); + that.port = getPort.call(that); + that.pathname = getPathname.call(that); + that.search = getSearch.call(that); + that.searchParams = getSearchParams.call(that); + that.hash = getHash.call(that); + } +}; + +var URLPrototype = URLConstructor.prototype; + +var serializeURL = function () { + var url = getInternalURLState(this); + var scheme = url.scheme; + var username = url.username; + var password = url.password; + var host = url.host; + var port = url.port; + var path = url.path; + var query = url.query; + var fragment = url.fragment; + var output = scheme + ':'; + + if (host !== null) { + output += '//'; + + if (includesCredentials(url)) { + output += username + (password ? ':' + password : '') + '@'; + } + + output += serializeHost(host); + if (port !== null) output += ':' + port; + } else if (scheme == 'file') output += '//'; + + output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : ''; + if (query !== null) output += '?' + query; + if (fragment !== null) output += '#' + fragment; + return output; +}; + +var getOrigin = function () { + var url = getInternalURLState(this); + var scheme = url.scheme; + var port = url.port; + if (scheme == 'blob') try { + return new URL(scheme.path[0]).origin; + } catch (error) { + return 'null'; + } + if (scheme == 'file' || !isSpecial(url)) return 'null'; + return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : ''); +}; + +var getProtocol = function () { + return getInternalURLState(this).scheme + ':'; +}; + +var getUsername = function () { + return getInternalURLState(this).username; +}; + +var getPassword = function () { + return getInternalURLState(this).password; +}; + +var getHost = function () { + var url = getInternalURLState(this); + var host = url.host; + var port = url.port; + return host === null ? '' : port === null ? serializeHost(host) : serializeHost(host) + ':' + port; +}; + +var getHostname = function () { + var host = getInternalURLState(this).host; + return host === null ? '' : serializeHost(host); +}; + +var getPort = function () { + var port = getInternalURLState(this).port; + return port === null ? '' : String(port); +}; + +var getPathname = function () { + var url = getInternalURLState(this); + var path = url.path; + return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : ''; +}; + +var getSearch = function () { + var query = getInternalURLState(this).query; + return query ? '?' + query : ''; +}; + +var getSearchParams = function () { + return getInternalURLState(this).searchParams; +}; + +var getHash = function () { + var fragment = getInternalURLState(this).fragment; + return fragment ? '#' + fragment : ''; +}; + +var accessorDescriptor = function (getter, setter) { + return { + get: getter, + set: setter, + configurable: true, + enumerable: true + }; +}; + +if (descriptors) { + objectDefineProperties(URLPrototype, { + // `URL.prototype.href` accessors pair + // https://url.spec.whatwg.org/#dom-url-href + href: accessorDescriptor(serializeURL, function (href) { + var url = getInternalURLState(this); + var urlString = String(href); + var failure = parseURL(url, urlString); + if (failure) throw TypeError(failure); + getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); + }), + // `URL.prototype.origin` getter + // https://url.spec.whatwg.org/#dom-url-origin + origin: accessorDescriptor(getOrigin), + // `URL.prototype.protocol` accessors pair + // https://url.spec.whatwg.org/#dom-url-protocol + protocol: accessorDescriptor(getProtocol, function (protocol) { + var url = getInternalURLState(this); + parseURL(url, String(protocol) + ':', SCHEME_START); + }), + // `URL.prototype.username` accessors pair + // https://url.spec.whatwg.org/#dom-url-username + username: accessorDescriptor(getUsername, function (username) { + var url = getInternalURLState(this); + var codePoints = arrayFrom(String(username)); + if (cannotHaveUsernamePasswordPort(url)) return; + url.username = ''; + + for (var i = 0; i < codePoints.length; i++) { + url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet); + } + }), + // `URL.prototype.password` accessors pair + // https://url.spec.whatwg.org/#dom-url-password + password: accessorDescriptor(getPassword, function (password) { + var url = getInternalURLState(this); + var codePoints = arrayFrom(String(password)); + if (cannotHaveUsernamePasswordPort(url)) return; + url.password = ''; + + for (var i = 0; i < codePoints.length; i++) { + url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet); + } + }), + // `URL.prototype.host` accessors pair + // https://url.spec.whatwg.org/#dom-url-host + host: accessorDescriptor(getHost, function (host) { + var url = getInternalURLState(this); + if (url.cannotBeABaseURL) return; + parseURL(url, String(host), HOST); + }), + // `URL.prototype.hostname` accessors pair + // https://url.spec.whatwg.org/#dom-url-hostname + hostname: accessorDescriptor(getHostname, function (hostname) { + var url = getInternalURLState(this); + if (url.cannotBeABaseURL) return; + parseURL(url, String(hostname), HOSTNAME); + }), + // `URL.prototype.port` accessors pair + // https://url.spec.whatwg.org/#dom-url-port + port: accessorDescriptor(getPort, function (port) { + var url = getInternalURLState(this); + if (cannotHaveUsernamePasswordPort(url)) return; + port = String(port); + if (port == '') url.port = null;else parseURL(url, port, PORT); + }), + // `URL.prototype.pathname` accessors pair + // https://url.spec.whatwg.org/#dom-url-pathname + pathname: accessorDescriptor(getPathname, function (pathname) { + var url = getInternalURLState(this); + if (url.cannotBeABaseURL) return; + url.path = []; + parseURL(url, pathname + '', PATH_START); + }), + // `URL.prototype.search` accessors pair + // https://url.spec.whatwg.org/#dom-url-search + search: accessorDescriptor(getSearch, function (search) { + var url = getInternalURLState(this); + search = String(search); + + if (search == '') { + url.query = null; + } else { + if ('?' == search.charAt(0)) search = search.slice(1); + url.query = ''; + parseURL(url, search, QUERY); + } + + getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); + }), + // `URL.prototype.searchParams` getter + // https://url.spec.whatwg.org/#dom-url-searchparams + searchParams: accessorDescriptor(getSearchParams), + // `URL.prototype.hash` accessors pair + // https://url.spec.whatwg.org/#dom-url-hash + hash: accessorDescriptor(getHash, function (hash) { + var url = getInternalURLState(this); + hash = String(hash); + + if (hash == '') { + url.fragment = null; + return; + } + + if ('#' == hash.charAt(0)) hash = hash.slice(1); + url.fragment = ''; + parseURL(url, hash, FRAGMENT); + }) + }); +} // `URL.prototype.toJSON` method +// https://url.spec.whatwg.org/#dom-url-tojson + + +redefine(URLPrototype, 'toJSON', function toJSON() { + return serializeURL.call(this); +}, { + enumerable: true +}); // `URL.prototype.toString` method +// https://url.spec.whatwg.org/#URL-stringification-behavior + +redefine(URLPrototype, 'toString', function toString() { + return serializeURL.call(this); +}, { + enumerable: true +}); + +if (NativeURL) { + var nativeCreateObjectURL = NativeURL.createObjectURL; + var nativeRevokeObjectURL = NativeURL.revokeObjectURL; // `URL.createObjectURL` method + // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL + // eslint-disable-next-line no-unused-vars + + if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) { + return nativeCreateObjectURL.apply(NativeURL, arguments); + }); // `URL.revokeObjectURL` method + // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL + // eslint-disable-next-line no-unused-vars + + if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) { + return nativeRevokeObjectURL.apply(NativeURL, arguments); + }); +} + +setToStringTag(URLConstructor, 'URL'); +_export({ + global: true, + forced: !nativeUrl, + sham: !descriptors +}, { + URL: URLConstructor +}); + +var DATA_URL_PATTERN = new RegExp("^data:"); +var ABSOLUTE_URL_PATTERN = new RegExp("^https?://"); +/** + * @summary Utility Class for DOM + * @private + * @memberof mapray + */ + +var Dom = +/*#__PURE__*/ +function () { + function Dom() { + _classCallCheck(this, Dom); + } + + _createClass(Dom, null, [{ + key: "createCanvasContext", + + /** + * @param {number} width + * @param {number} height + * @return {CanvasRenderingContext2D} + */ + value: function createCanvasContext(width, height) { + var canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas.getContext("2d"); + } + /** + * @summary 画像を読み込みます。 + * @param {string|Blob} src + * @Param {object} options + * @param {mapray.CredentialMode} [options.credentials=mapray.CredentialMode.SAME_ORIGIN] + */ + + }, { + key: "loadImage", + value: function () { + var _loadImage = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee(src) { + var options, + _args = arguments; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}; + _context.next = 3; + return new Promise(function (resolve, reject) { + var image = new Image(); + + image.onload = function (event) { + return resolve(event.target); + }; + + image.onerror = function (event) { + return reject(new Error("Failed to load image")); + }; + + if (options.credentials !== CredentialMode.OMIT) { + image.crossOrigin = options.credentials === CredentialMode.INCLUDE ? "use-credentials" : "anonymous"; + } + + image.src = src instanceof Blob ? URL.createObjectURL(src) : src; + }); + + case 3: + return _context.abrupt("return", _context.sent); + + case 4: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + function loadImage(_x) { + return _loadImage.apply(this, arguments); + } + + return loadImage; + }() + /** + * @summary 画像が読み込まれるまで待ちます。 + * @param {HTMLImageElement} image + */ + + }, { + key: "waitForLoad", + value: function () { + var _waitForLoad = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2(image) { + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (image.src) { + _context2.next = 2; + break; + } + + throw new Error("src was not set"); + + case 2: + if (!image.complete) { + _context2.next = 4; + break; + } + + return _context2.abrupt("return", image); + + case 4: + _context2.next = 6; + return new Promise(function (resolve, reject) { + var prevOnLoad = image.onload; + var prevOnError = image.onerror; + + image.onload = function (event) { + if (prevOnLoad) prevOnLoad(event); + resolve(event.target); + }; + + image.onerror = function (event) { + if (prevOnError) prevOnError(event); + reject(new Error("Failed to load image")); + }; + }); + + case 6: + return _context2.abrupt("return", _context2.sent); + + case 7: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + function waitForLoad(_x2) { + return _waitForLoad.apply(this, arguments); + } + + return waitForLoad; + }() + }, { + key: "resolveUrl", + value: function resolveUrl(baseUrl, url) { + if (DATA_URL_PATTERN.test(url) || ABSOLUTE_URL_PATTERN.test(url)) { + // url がデータ url または絶対 url のときは + // そのまま url をリクエスト + return url; + } else { + // それ以外のときは url を相対 url と解釈し + // 基底 url と結合した url をリクエスト + return baseUrl + url; + } + } + }]); + + return Dom; +}(); + +Dom.SYSTEM_FONT_FAMILY = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"; + +/** + * @classdesc リソースクラス + * URLやDB、クラウドサービス等、各種リソースへのアクセスを同一インターフェースで提供することを目的とした抽象クラスです。 + * 基本機能: + * ・コンストラクタ等によりあらかじめURLやデータの位置を示すプロパティを設定 + * ・load()によりリソースを読み込む + * ・loadSubResource()によりサブリソースを読み込む + * + * @memberof mapray + */ + +var Resource = +/*#__PURE__*/ +function () { + function Resource() { + _classCallCheck(this, Resource); + } + + _createClass(Resource, [{ + key: "load", + + /** + * リソースを読み込みます。 + */ + value: function () { + var _load = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + throw new Error("Not Implemented"); + + case 2: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + function load() { + return _load.apply(this, arguments); + } + + return load; + }() + /** + * @summary リソースの読み込みをキャンセルできる場合はキャンセルします。 + */ + + }, { + key: "cancel", + value: function cancel() {} + /** + * @summary サブリソースをサポートするかを返します。 + * @return {boolean} + */ + + }, { + key: "loadSubResourceSupported", + value: function loadSubResourceSupported() { + return false; + } + /** + * @summary サブリソースを読み込みます。 + * @param {string} url URL + * @param {object} options + * @param {mapray.Resource.ResourceType} [options.type] 返却するタイプを指定します。 + * @return {object} options.type に応じた型で返却されます。 + */ + + }, { + key: "loadSubResource", + value: function () { + var _loadSubResource = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2(url) { + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + throw new Error("Not Supported"); + + case 2: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + function loadSubResource(_x) { + return _loadSubResource.apply(this, arguments); + } + + return loadSubResource; + }() + /** + * @summary 関連リソースをサポートするかを返します。 + * @return {boolean} + */ + + }, { + key: "resolveResourceSupported", + value: function resolveResourceSupported() { + return false; + } + /** + * @summary 関連リソースを読み込みます。 + * @return {boolean} + */ + + }, { + key: "resolveResource", + value: function () { + var _resolveResource = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3(url) { + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + throw new Error("Not Supported"); + + case 1: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + function resolveResource(_x2) { + return _resolveResource.apply(this, arguments); + } + + return resolveResource; + }() + /** + * @summary リソース型 + */ + + }], [{ + key: "ResourceType", + get: function get() { + return ResourceType; + } + }]); + + return Resource; +}(); +/** + * @summary リソースの種類 + * @enum {object} + * @memberof mapray.ResourceType + * @constant + */ + + +var ResourceType = { + /** + * JSON + */ + JSON: { + id: "JSON" + }, + + /** + * バイナリ(ArrayBuffer) + */ + BINARY: { + id: "BINARY" + }, + + /** + * 画像(Image) + */ + IMAGE: { + id: "IMAGE" + } +}; +/** + * @classdesc URLリソースです。 + */ + +var URLResource = +/*#__PURE__*/ +function (_Resource) { + _inherits(URLResource, _Resource); + + /** + * @param {string} url + * @param {object} [options] + * @param {mapray.Resource.ResourceType} [options.type] + * @param {mapray.Transform} [options.transform] + */ + function URLResource(url) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, URLResource); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(URLResource).call(this)); + _this._url = url; + var index = url.lastIndexOf('/'); + if (index === -1) throw new Error("invalid url"); + _this._base_url = _this._url.substr(0, index + 1); + _this._type = options.type || "json"; + _this._transform = options.transform || defaultTransformCallback; + _this._abort_ctrl = new AbortController(); + return _this; + } + /** + * @summary リソースのurl + * @type {string} + */ + + + _createClass(URLResource, [{ + key: "load", + + /** + * @summary このリソースを読み込みます。 + * @param {object} [options] + */ + value: function () { + var _load2 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee4() { + var options, + _args4 = arguments; + return regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + options = _args4.length > 0 && _args4[0] !== undefined ? _args4[0] : {}; + _context4.next = 3; + return this._loadURLResource(this._url, options.type || this._type, options); + + case 3: + return _context4.abrupt("return", _context4.sent); + + case 4: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function load() { + return _load2.apply(this, arguments); + } + + return load; + }() + /** + * @summary リソースの読み込みをキャンセルします。 + */ + + }, { + key: "cancel", + value: function cancel() { + this._abort_ctrl.abort(); + } + /** + * @summary このクラスでのデフォルト実装では、trueを返却します。 + * @return {boolean} + */ + + }, { + key: "loadSubResourceSupported", + value: function loadSubResourceSupported() { + return true; + } + /** + * @summary サブリソースを読み込みます。 + * @param {string} subUrl URL + * @param {object} options + * @param {mapray.Resource.ResourceType} [options.type] 返却するタイプを指定します。 + * @return {object} options.type に応じた型で返却されます。 + */ + + }, { + key: "loadSubResource", + value: function () { + var _loadSubResource2 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee5(subUrl) { + var options, + _args5 = arguments; + return regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + options = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : {}; + _context5.next = 3; + return this._loadURLResource(Dom.resolveUrl(this._base_url, subUrl), options.type, options); + + case 3: + return _context5.abrupt("return", _context5.sent); + + case 4: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function loadSubResource(_x3) { + return _loadSubResource2.apply(this, arguments); + } + + return loadSubResource; + }() + /** + * @summary 関連リソースをサポートするかを返します。 + * @return {boolean} + */ + + }, { + key: "resolveResourceSupported", + value: function resolveResourceSupported() { + return true; + } + /** + * @summary 関連リソースを読み込みます。 + * @param {string} url  + * @return {Resource} + */ + + }, { + key: "resolveResource", + value: function resolveResource(sub_url) { + var url = Dom.resolveUrl(this._base_url, sub_url); + return new URLResource(url, { + transform: this._transform + }); + } + /** + * @param {string} url + * @param {mapray.Resource.ResourceType} [type] + * @private + */ + + }, { + key: "_loadURLResource", + value: function () { + var _loadURLResource2 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee6(url, type) { + var options, + tr, + http_option, + response, + _args6 = arguments; + return regeneratorRuntime.wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + options = _args6.length > 2 && _args6[2] !== undefined ? _args6[2] : {}; + tr = this._transform(url, type); + + if (!(type === ResourceType.IMAGE)) { + _context6.next = 6; + break; + } + + _context6.next = 5; + return Dom.loadImage(tr.url, tr); + + case 5: + return _context6.abrupt("return", _context6.sent); + + case 6: + http_option = this._make_fetch_params(tr) || {}; + if (options.signal) http_option.signal = options.signal; + _context6.next = 10; + return HTTP.get(tr.url, null, http_option); + + case 10: + response = _context6.sent; + + if (response.ok) { + _context6.next = 13; + break; + } + + throw new Error(response.statusText); + + case 13: + if (!(type === ResourceType.JSON)) { + _context6.next = 19; + break; + } + + _context6.next = 16; + return response.json(); + + case 16: + _context6.t0 = _context6.sent; + _context6.next = 27; + break; + + case 19: + if (!(type === ResourceType.BINARY)) { + _context6.next = 25; + break; + } + + _context6.next = 22; + return response.arrayBuffer(); + + case 22: + _context6.t1 = _context6.sent; + _context6.next = 26; + break; + + case 25: + _context6.t1 = response; + + case 26: + _context6.t0 = _context6.t1; + + case 27: + return _context6.abrupt("return", _context6.t0); + + case 28: + case "end": + return _context6.stop(); + } + } + }, _callee6, this); + })); + + function _loadURLResource(_x4, _x5) { + return _loadURLResource2.apply(this, arguments); + } + + return _loadURLResource; + }() + /** + * fetch() の init 引数に与えるオブジェクトを生成 + * @private + */ + + }, { + key: "_make_fetch_params", + value: function _make_fetch_params(tr) { + var init = { + signal: this._abort_ctrl.signal, + credentials: (tr.credentials || CredentialMode.OMIT).credentials + }; + + if (tr.headers) { + init.headers = tr.headers; + } + + return init; + } + }, { + key: "url", + get: function get() { + return this._url; + } + }]); + + return URLResource; +}(Resource); + +function defaultTransformCallback(url, type) { + return { + url: url + }; +} + +/** + * @summary ローダークラス + * @memberof mapray + */ + +var Loader = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Scene} scene 読み込み先のシーン + * @param {mapray.Resource} resource + * @param {object} [options={}] + * @param {object} [options.onLoad] 全ての読み込み完了時に呼ばれる + * @param {mapray.Loader.EntityCallback} [options.onEntity] エンティティが読み込まれるたびに呼ばれる + */ + function Loader(scene, resource) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + _classCallCheck(this, Loader); + + this._scene = scene; + + if (!(resource instanceof Resource)) { + throw new Error("Unsupported Resource Type: " + resource); + } + + this._resource = resource; + this._status = Loader.Status.NOT_LOADED; + this._onLoad = options.onLoad || defaultOnLoadCallback; + this._onEntity = options.onEntity || defaultOnEntityCallback; + } + /** + * @summary 読み込み先のシーン + * @type {mapray.Scene} + * @readonly + */ + + + _createClass(Loader, [{ + key: "_setStatus", + + /** + * @private + */ + value: function _setStatus(status) { + this._status = status; + } + /** + * @summary 読み込みを実行します。 + * @returns {Promise} + */ + + }, { + key: "load", + value: function load() { + var _this = this; + + if (this.status !== Loader.Status.NOT_LOADED) { + return Promise.reject(new Error("Illegal Status: " + this.status)); + } + + return Promise.resolve().then(function () { + _this._setStatus(Loader.Status.LOADING); + + _this.scene.addLoader(_this); + + return _this._load(); + })["catch"](function (error) { + // JSON データの取得に失敗 (キャンセルによる失敗の可能性あり) + console.log(error); + + _this._scene.removeLoader(_this); + + _this._onLoad(_this, false); + + if (_this._status !== Loader.Status.CANCELED) { + _this._setStatus(Loader.Status.ABORTED); + } + + throw error; + }).then(function (value) { + _this._scene.removeLoader(_this); + + if (_this._status === Loader.Status.CANCELED) { + _this._onLoad(_this, false); + + throw new Error("canceled"); + } else { + _this._setStatus(Loader.Status.LOADED); + + _this._onLoad(_this, true); + + return value; + } + }); + } + /** + * @summary 読み込み処理の実態。継承クラスによって実装される。 + * @private + */ + + }, { + key: "_load", + value: function _load() { + throw new Error("_load() is not implemented in " + this.constructor.name); + } + /** + * @summary 読み込みの取り消し + * @desc + *

終了コールバック関数は isSuccess == false で呼び出される。

+ */ + + }, { + key: "cancel", + value: function cancel() { + if (this._status === Loader.Status.LOADING || this._status === Loader.Status.LOADED) { + this._setStatus(Loader.Status.CANCELED); + + this._resource.cancel(); + + this._cancel(); // this._scene.removeLoader( this ); + // this._onLoad( this, false ); + + } + } + /** + * @summary キャンセル時に行う処理。継承クラスによって実装される。 + * @private + */ + + }, { + key: "_cancel", + value: function _cancel() {} + /** + * 取り消し状態のとき例外を投げる + * @private + */ + + }, { + key: "_check_cancel", + value: function _check_cancel() { + if (this.status === Loader.Status.CANCELED) { + throw new Error("canceled"); + } + } + }, { + key: "scene", + get: function get() { + return this._scene; + } + /** + * @summary シーンリソース + * @type {string} + * @readonly + */ + + }, { + key: "resource", + get: function get() { + return this._resource; + } + /** + * ローダー読み込みの状態 + * @readonly + */ + + }, { + key: "status", + get: function get() { + return this._status; + } + }]); + + return Loader; +}(); +/** + * @summary Entity読み込みコールバック + * @callback EntityCallback + * @desc + *

読み込み処理の中でEntityが生成される際に呼ばれる。 + * 一度の読み込み(load()呼び出し)において複数のエンティティが生成される場合は、エンティティが生成されるたびに呼ばれる。 + * この関数をLoaderに指定する場合は、callback処理の中でEntityをsceneへ追加する必要がある。 + * geojsonのように、要素ごとにプロパティを含められるような場合は、propにより値にアクセスする。 + *

+ * + * @param {mapray.Loader} loader Loader + * @param {mapray.Entity} entity 読み込まれたEntity + * @param {object} prop エンティティ生成の元となるオブジェクト + * + * @example + * const loader = new mapray.SceneLoader( viewer.scene, resource, { + * onEntity: ( loader, entity, prop ) => { + * entity.setScale( [ 2, 2, 2 ] ); + * loader.scene.addEntity( entity ); + * } + * } ); + * loader.load(); + * + * @memberof mapray.Loader + */ + + +Loader.Status = { + NOT_LOADED: "Not Loaded", + LOADING: "Loading", + LOADED: "Loaded", + CANCELED: "Canceled", + ERROR: "ERROR" +}; + +function defaultOnLoadCallback(loader, isSuccess) {} + +function defaultOnEntityCallback(loader, entity) { + loader.scene.addEntity(entity); +} + +// このようにする理由は GeoMath.js の最後を参照 + +/** + * @summary glTF オブジェクトの共通データ + * + * @classdesc + *

多くの glTF オブジェクトに共通に存在する、次のプロパティの値を取得する。

+ *

+ *   - name
+ *   - extensions
+ *   - extras
+ * 
+ * + * @memberof mapray.gltf + * @private + */ +var CommonData = +/*#__PURE__*/ +function () { + /** + * @param {object} json JSON オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + */ + function CommonData(json, ctx) { + _classCallCheck(this, CommonData); + + // specification/2.0/schema/glTFChildOfRootProperty.schema.json + this._name = json.name || null; + this._extensions = ctx.extractUsedExtensions(json.extensions || {}); + this._extras = json.extras || {}; + } + /** + * @summary オブジェクト名を取得 + * + * @return {?string} オブジェクト名 + */ + + + _createClass(CommonData, [{ + key: "getName", + value: function getName() { + return this._name; + } + /** + * @summary 拡張機能固有オブジェクトを取得 + * + * @param {string} id 拡張機能の識別子 + * + * @return {?object} 拡張機能固有オブジェクト + */ + + }, { + key: "getExtensions", + value: function getExtensions(id) { + var extension = this._extensions[id]; + return extension !== undefined ? extension : null; + } + /** + * @summary アプリケーション固有データを取得 + * + * @param {string} id アプリケーション固有データの識別子 + * + * @return {?object} アプリケーション固有データ + */ + + }, { + key: "getExtras", + value: function getExtras(id) { + var extra = this._extras[id]; + return extra !== undefined ? extra : null; + } + }]); + + return CommonData; +}(); + +/** + * 読み込んだ glTF データの内容 + * + * @memberof mapray.gltf + * @private + */ + +var Content = +/*#__PURE__*/ +function () { + /** + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {mapray.gltf.Scene[]} scenes シーンの配列 + * @param {number} default_scene_index 既定シーンの索引 (既定シーンがないときは -1) + */ + function Content(ctx, scenes, default_scene_index) { + _classCallCheck(this, Content); + + this._commonData = new CommonData(ctx.gjson, ctx); + this._scenes = scenes; + this._default_scene_index = default_scene_index; + } + /** + * glTF オブジェクトの共通データ + * + * @type {mapray.gltf.CommonData} + * @readonly + */ + + + _createClass(Content, [{ + key: "commonData", + get: function get() { + return this._commonData; + } + /** + * @summary シーンの配列 + * + * @type {mapray.gltf.Scene[]} + * @readonly + */ + + }, { + key: "scenes", + get: function get() { + return this._scenes; + } + /** + * @summary 既定シーンの索引 + * + *

既定シーンの索引を返す。ただし既定シーンがないときは -1 を返す。

+ * + * @type {number} + * @readonly + */ + + }, { + key: "default_scene_index", + get: function get() { + return this._default_scene_index; + } + }]); + + return Content; +}(); + +/** + * @summary モデルテクスチャ + * @memberof mapray + * @package + */ +var Texture = +/*#__PURE__*/ +function () { + /** + *

オプション mag_filter, min_filter, wrap_s, wrap_t は WebGL の定数と同じ値を指定する。 + * これらのうち、指定がなかったオプションは usage オプションにより決定される。

+ * + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {?(HTMLImageElement|HTMLCanvasElement)} image 元画像 (usage=COLOR のときは null) + * @param {object} [options] オプション集合 + * @param {mapray.Texture.Usage} [options.usage=GENERAL] テクスチャ用途 + * @param {number} [options.mag_filter] 拡大フィルタ (NEAREST | LINEAR) + * @param {number} [options.min_filter] 縮小フィルタ (NEAREST | LINEAR | NEAREST_MIPMAP_NEAREST | + * LINEAR_MIPMAP_NEAREST | NEAREST_MIPMAP_LINEAR | LINEAR_MIPMAP_LINEAR) + * @param {number} [options.wrap_s] S Wrap (CLAMP_TO_EDGE | MIRRORED_REPEAT | REPEAT) + * @param {number} [options.wrap_t] T Wrap (CLAMP_TO_EDGE | MIRRORED_REPEAT | REPEAT) + * @param {boolean} [options.flip_y=true] 画像読み込み時に上下を反転するか? + * @param {mapray.Vector4} [options.color=[1,1,1,1]] usage=COLOR のときの色指定 + */ + function Texture(glenv, image, options) { + _classCallCheck(this, Texture); + + var opts = options || {}; + this._glenv = glenv; + this._handle = this._createTexture(image, opts); + } + /** + * @summary テクスチャのハンドル + * @type {WebGLTexture} + * @readonly + */ + + + _createClass(Texture, [{ + key: "dispose", + + /** + * @summary リソースを破棄 + */ + value: function dispose() { + var gl = this._glenv.context; + gl.deleteTexture(this._handle); + this._handle = null; + } + /** + * WebGL テクスチャオブジェクトを生成 + * + * @param {?(HTMLImageElement|HTMLCanvasElement)} image 元画像 + * @param {object} opts オプション集合 + * @return {WebGLTexture} WebGL テクスチャオブジェクト + * @private + */ + + }, { + key: "_createTexture", + value: function _createTexture(image, opts) { + var gl = this._glenv.context; + var target = gl.TEXTURE_2D; + var texture = gl.createTexture(); + + var params = Texture._getParameters(gl, opts); + + gl.bindTexture(target, texture); + var flip_y = opts.flip_y !== undefined ? opts.flip_y : true; + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flip_y); + + if (opts.usage === Texture.Usage.COLOR) { + // 均一色テクスチャー + gl.texImage2D(target, 0, params.format, 1, 1, 0, params.format, params.type, Texture._getColorArray(opts)); + } else { + // 画像テクスチャー + gl.texImage2D(target, 0, params.format, params.format, params.type, image); + } + + if (flip_y) { + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); + } + + if (Texture._generateMipmapQ(gl, params)) { + gl.generateMipmap(target); + } + + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, params.mag_filter); + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, params.min_filter); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, params.wrap_s); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, params.wrap_t); + gl.bindTexture(target, null); + return texture; + } + /** + * テクスチャの生成パラメータを取得 + * + * @param {WebGLRenderingContext} gl WebGL コンテキスト + * @param {object} opts オプション集合 + * @return {object} 生成パラメータ + * @private + */ + + }, { + key: "handle", + get: function get() { + return this._handle; + } + }], [{ + key: "_getParameters", + value: function _getParameters(gl, opts) { + var params = { + format: gl.RGBA, + type: gl.UNSIGNED_BYTE, + mag_filter: gl.LINEAR, + min_filter: gl.LINEAR_MIPMAP_LINEAR, + wrap_s: gl.REPEAT, + wrap_t: gl.REPEAT + }; + + if (opts.usage === Texture.Usage.SIMPLETEXT) { + params.format = gl.ALPHA; + params.min_filter = gl.LINEAR; + params.wrap_s = gl.CLAMP_TO_EDGE; + params.wrap_t = gl.CLAMP_TO_EDGE; + } else if (opts.usage === Texture.Usage.TEXT) { + params.min_filter = gl.LINEAR; + params.wrap_s = gl.CLAMP_TO_EDGE; + params.wrap_t = gl.CLAMP_TO_EDGE; + } else if (opts.usage === Texture.Usage.COLOR) { + params.mag_filter = gl.NEAREST; + params.min_filter = gl.NEAREST; + } else if (opts.usage === Texture.Usage.ICON) { + params.min_filter = gl.LINEAR; + params.wrap_s = gl.CLAMP_TO_EDGE; + params.wrap_t = gl.CLAMP_TO_EDGE; + } // オプション指定による上書き + + + if (opts.mag_filter !== undefined) { + params.mag_filter = opts.mag_filter; + } + + if (opts.min_filter !== undefined) { + params.min_filter = opts.min_filter; + } + + if (opts.wrap_s !== undefined) { + params.wrap_s = opts.wrap_s; + } + + if (opts.wrap_t !== undefined) { + params.wrap_t = opts.wrap_t; + } + + return params; + } + /** + * テクスチャの生成パラメータを取得 + * + * @param {object} opts オプション集合 + * @return {Uint8Array} 均一色用の画像データ + * @private + */ + + }, { + key: "_getColorArray", + value: function _getColorArray(opts) { + var color = opts.color || [1, 1, 1, 1]; + var pixels = color.map(function (value) { + return Math.round(255 * value); + }); + return new Uint8Array(pixels); + } + /** + * ミップマップを生成するか? + * + * @param {WebGLRenderingContext} gl WebGL コンテキスト + * @param {object} params 生成パラメータ + * @return {boolean} ミップマップを生成するとき true, それ以外のとき false + * @private + */ + + }, { + key: "_generateMipmapQ", + value: function _generateMipmapQ(gl, params) { + var filter = params.min_filter; + return filter == gl.NEAREST_MIPMAP_NEAREST || filter == gl.LINEAR_MIPMAP_NEAREST || filter == gl.NEAREST_MIPMAP_LINEAR || filter == gl.LINEAR_MIPMAP_LINEAR; + } + }]); + + return Texture; +}(); +/** + * @summary テクスチャの用途 + * @desc + * {@link mapray.Texture} の構築子で opts.usage パラメータに指定する値の型である。 + * @enum {object} + * @memberof mapray.Texture + * @constant + */ + + +var Usage = { + /** + * 一般用途 (既定値) + */ + GENERAL: { + id: "GENERAL" + }, + + /** + * 均一色 + */ + COLOR: { + id: "COLOR" + }, + + /** + * テキスト表示 + */ + TEXT: { + id: "TEXT" + }, + + /** + * シンプルテキスト表示 + */ + SIMPLETEXT: { + id: "SIMPLETEXT" + }, + + /** + * アイコン + */ + ICON: { + id: "ICON" + } +}; // クラス定数の定義 + +{ + Texture.Usage = Usage; +} + +/** + * @summary エンティティ・マテリアル + * @classdesc + * このクラスは、mapray.RenderStage.getRenderTarget()の値により異なる動作をする。 + *
    + *
  • + * mapray.RenderStage.RenderTarget.SCENEの場合は、通常通り描画を行う。 + * setParametersは、描画に必要な全てのパラメータを設定します。 + *
  • mapray.RenderStage.RenderTarget.RIDの場合は、 + * setParametersは、RID描画に必要なパラメータのみ設定します(一般にテクスチャや色情報は除外される)。 + * このクラスでの実装は、setParameters()により、u_ridが設定されるようになっています。 + *
+ * @memberof mapray + * @extends mapray.Material + * @private + */ + +var EntityMaterial = +/*#__PURE__*/ +function (_Material) { + _inherits(EntityMaterial, _Material); + + /** + * @param {mapray.GLEnv} glenv WebGL 環境 + * @param {string} vs_code 頂点シェーダのソースコード + * @param {string} fs_code フラグメントシェーダのソースコード + */ + function EntityMaterial(glenv, vs_code, fs_code) { + _classCallCheck(this, EntityMaterial); + + return _possibleConstructorReturn(this, _getPrototypeOf(EntityMaterial).call(this, glenv, vs_code, fs_code)); + } + /** + * @summary 背景との混合が必要か? + * @param {mapray.RenderStage} stage レンダリングステージ + * @param {mapray.Primitive} primitive プリミティブ + * @return {boolean} 背景との混合が必要なとき true, それ以外のとき false + * @default false + * @abstract + */ + + + _createClass(EntityMaterial, [{ + key: "isTranslucent", + value: function isTranslucent(stage, primitive) { + return false; + } + /** + * @summary マテリアルパラメータを設定 + * @desc + *

事前に material.bindProgram() すること。

+ * @param {mapray.RenderStage} stage レンダリングステージ + * @param {mapray.Primitive} primitive プリミティブ + * @abstract + */ + + }, { + key: "setParameters", + value: function setParameters(stage, primitive) { + if (stage.getRenderTarget() === RenderTarget.RID) { + this._setRenderId(primitive.rid); + } + } + /** + * @summary u_obj_to_clip 変数を設定 + * @param {mapray.RenderStage} stage レンダリングステージ + * @param {mapray.Primitive} primitive プリミティブ + * @protected + */ + + }, { + key: "setObjToClip", + value: function setObjToClip(stage, primitive) { + var obj_to_gocs = primitive.transform; + var obj_to_clip = EntityMaterial._obj_to_clip; // obj_to_clip = gocs_to_clip * obj_to_gocs + + GeoMath.mul_GA(stage._gocs_to_clip, obj_to_gocs, obj_to_clip); + this.setMatrix("u_obj_to_clip", obj_to_clip); + } + /** + * @summary u_obj_to_view 変数を設定 + * @param {mapray.RenderStage} stage レンダリングステージ + * @param {mapray.Primitive} primitive プリミティブ + * @protected + */ + + }, { + key: "setObjToView", + value: function setObjToView(stage, primitive) { + var obj_to_gocs = primitive.transform; + var obj_to_view = EntityMaterial._obj_to_view; // obj_to_view = gocs_to_view * obj_to_gocs + + GeoMath.mul_AA(stage._gocs_to_view, obj_to_gocs, obj_to_view); + this.setMatrix("u_obj_to_view", obj_to_view); + } + /** + * @private + */ + + }, { + key: "_setRenderId", + value: function _setRenderId(id) { + this.setVector4("u_rid", [(id >> 12 & 0xF) / 0xF, (id >> 8 & 0xF) / 0xF, (id >> 4 & 0xF) / 0xF, (id & 0xF) / 0xF]); + } + }]); + + return EntityMaterial; +}(Material); // クラス定数の定義 + + +{ + EntityMaterial._obj_to_clip = GeoMath.createMatrixf(); // 計算用一時領域 + + EntityMaterial._obj_to_view = GeoMath.createMatrixf(); // 計算用一時領域 +} + +var model_vs_code = "attribute vec4 a_position; // 位置 (モデル座標系)\nattribute vec3 a_normal; // 法線 (モデル座標系)\nattribute vec2 a_texcoord; // テクスチャ座標\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform mat4 u_obj_to_view; // モデル座標系から視点座標系への変換\n\nvarying vec3 v_normal; // 法線 (視点座標系)\nvarying vec2 v_texcoord; // テクスチャ座標\n\n\nvoid\nmain()\n{\n gl_Position = u_obj_to_clip * a_position;\n\n#ifndef UNLIT\n v_normal = normalize( vec3( u_obj_to_view * vec4( a_normal, 0.0 ) ) ); // 法線 (視点座標系)\n#endif\n\n v_texcoord = a_texcoord;\n}\n"; + +var model_fs_code = "precision highp float;\n\nvarying vec3 v_normal; // 法線 (視点座標系)\nvarying vec2 v_texcoord; // テクスチャ座標\n\nuniform vec3 u_light_dir; // ライト逆方向 (視点座標系) と強さ\nuniform vec4 u_base_color; // 基本色係数\nuniform sampler2D u_base_image; // 基本色画像\n\n\nvoid\nmain()\n{\n#ifndef UNLIT\n vec3 normal = normalize( v_normal ); // 法線 (視点座標系)\n\n vec3 dlit = vec3( dot( normal, u_light_dir ) ); // 拡散光の強さ\n#else\n vec3 dlit = vec3( 1.0 );\n#endif\n\n gl_FragColor = u_base_color * texture2D( u_base_image, v_texcoord ) * vec4( dlit, 1.0 );\n}\n"; + +/** + * @summary 基本マテリアル + * @memberof mapray + * @extends mapray.EntityMaterial + * @private + */ + +var ModelMaterial = +/*#__PURE__*/ +function (_EntityMaterial) { + _inherits(ModelMaterial, _EntityMaterial); + + /** + * @param {mapray.GLEnv} glenv + * @param {object} [options] オプション指定 + * @param {boolean} [options.is_unlit=false] 無照光か? + */ + function ModelMaterial(glenv) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, ModelMaterial); + + var preamble = ModelMaterial._getPreamble(options); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(ModelMaterial).call(this, glenv, preamble + model_vs_code, preamble + (options.ridMaterial ? rid_fs_code : model_fs_code))); // 均一色テクスチャ + + _this._white_texture = new Texture(glenv, null, { + usage: Texture.Usage.COLOR, + color: [1, 1, 1, 1] + }); // 不変パラメータを事前設定 + + _this.bindProgram(); + + _this.setInteger("u_base_image", ModelMaterial.TEXUNIT_BASE_IMAGE); + + return _this; + } + /** + * @override + */ + + + _createClass(ModelMaterial, [{ + key: "setParameters", + value: function setParameters(stage, primitive) { + _get(_getPrototypeOf(ModelMaterial.prototype), "setParameters", this).call(this, stage, primitive); + + var props = primitive.properties; + var pbrMR = props.pbrMetallicRoughness; // u_obj_to_clip, u_obj_to_view + + this.setObjToClip(stage, primitive); + this.setObjToView(stage, primitive); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + // 基本色係数 + var bcf = pbrMR["baseColorFactor"]; + var u_base_color = stage.getTranslucentMode() ? [0.5 * bcf[0], 0.5 * bcf[1], 0.5 * bcf[2], 0.5 * bcf[3]] : bcf; + this.setVector4("u_base_color", u_base_color); // ライト逆方向 (視点座標系) と強さ + + this.setVector3("u_light_dir", [0, 0, 1]); // テクスチャのバインド + + var base_image_texture = this._selectTexture(pbrMR["baseColorTexture"], this._white_texture); + + this.bindTexture2D(ModelMaterial.TEXUNIT_BASE_IMAGE, base_image_texture.handle); + } + } + /** + * テクスチャを選択 + * @param {object} texinfo + * @param {mapray.Texture} alt_texure + * @return {mapray.Texture} + * @private + */ + + }, { + key: "_selectTexture", + value: function _selectTexture(texinfo, alt_texure) { + if (texinfo !== null) { + return texinfo.texture; + } else { + return alt_texure; + } + } + /** + * @summary シェーダの前文を取得 + * + * @param {object} options オプション指定 + * @param {boolean} [options.is_unlit=false] 無照光か? + * + * @private + */ + + }], [{ + key: "_getPreamble", + value: function _getPreamble(options) { + var is_unlit = options.is_unlit !== undefined ? options.is_unlit : false; + var lines = []; // UNLIT マクロの定義 + + if (is_unlit) { + lines.push("#define UNLIT"); + } // lines を文字列にして返す + + + return lines.join("\n") + "\n\n"; + } + }]); + + return ModelMaterial; +}(EntityMaterial); // クラス定数の定義 + + +{ + ModelMaterial.TEXUNIT_BASE_IMAGE = 0; // 基本色画像のテクスチャユニット +} + +/** + * glTF の sampler に対応 + * @memberof mapray.gltf + * @private + */ +var Sampler = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {object} index サンプラー索引 (非数の場合は既定値サンプラー) + */ + function Sampler(ctx, index) { + _classCallCheck(this, Sampler); + + // specification/2.0/schema/sampler.schema.json + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#samplers + var jsampler = typeof index == 'number' ? ctx.gjson.samplers[index] : {}; + this._magFilter = jsampler.magFilter; // フィルタの既定値は実装依存 + + this._minFilter = jsampler.minFilter; // ↑↑↑ + + this._wrapS = jsampler.wrapS !== undefined ? jsampler.wrapS : Sampler.WRAP_DEFAULT; + this._wrapT = jsampler.wrapT !== undefined ? jsampler.wrapT : Sampler.WRAP_DEFAULT; + } + /** + * 拡大フィルタ + * @type {number|undefined} + * @readonly + */ + + + _createClass(Sampler, [{ + key: "magFilter", + get: function get() { + return this._magFilter; + } + /** + * 縮小フィルタ + * @type {number|undefined} + * @readonly + */ + + }, { + key: "minFilter", + get: function get() { + return this._minFilter; + } + /** + * S-wrap + * @type {number} + * @readonly + */ + + }, { + key: "wrapS", + get: function get() { + return this._wrapS; + } + /** + * T-wrap + * @type {number} + * @readonly + */ + + }, { + key: "wrapT", + get: function get() { + return this._wrapT; + } + }]); + + return Sampler; +}(); + +Sampler.WRAP_DEFAULT = 10497; // REPEAT + +/** + * glTF の texture に対応 + * @memberof mapray.gltf + * @private + */ + +var Texture$1 = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {object} index テクスチャ索引 + */ + function Texture(ctx, index) { + _classCallCheck(this, Texture); + + // specification/2.0/schema/texture.schema.json + var jtexture = ctx.gjson.textures[index]; + this._sampler = new Sampler(ctx, jtexture.sampler); + this._source = ctx.findImage(jtexture.source); + } + /** + * イメージを取得 + * @type {mapray.gltf.Image} + * @readonly + */ + + + _createClass(Texture, [{ + key: "source", + get: function get() { + return this._source; + } + /** + * サンプラを取得 + * @type {mapray.gltf.Sampler} + * @readonly + */ + + }, { + key: "sampler", + get: function get() { + return this._sampler; + } + }]); + + return Texture; +}(); + +/** + * glTF の textureInfo に対応 + * @memberof mapray.gltf + * @private + */ + +var TextureInfo = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {object} jtexinfo テクスチャ情報 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + */ + function TextureInfo(jtexinfo, ctx) { + _classCallCheck(this, TextureInfo); + + // specification/2.0/schema/textureInfo.schema.json + this._texture = new Texture$1(ctx, jtexinfo.index); + this._texCoord = jtexinfo.texCoord !== undefined ? jtexinfo.texCoord : 0; + } + /** + * 参照するテクスチャを取得 + * @type {mapray.gltf.Texture} + */ + + + _createClass(TextureInfo, [{ + key: "texture", + get: function get() { + return this._texture; + } + /** + * 参照するテクスチャを設定 + * @type {mapray.gltf.Texture} + */ + , + set: function set(value) { + this._texture = value; + } + /** + * テクスチャ座標のインデックス + * @type {number} + * @readonly + */ + + }, { + key: "texCoord", + get: function get() { + return this._texCoord; + } + }]); + + return TextureInfo; +}(); + +/** + * glTF の normalTextureInfo に対応 + * @memberof mapray.gltf + * @private + */ + +var NormalTextureInfo = +/*#__PURE__*/ +function (_TextureInfo) { + _inherits(NormalTextureInfo, _TextureInfo); + + /** + * 初期化 + * @param {object} jtexinfo テクスチャ情報 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + */ + function NormalTextureInfo(jtexinfo, ctx) { + var _this; + + _classCallCheck(this, NormalTextureInfo); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(NormalTextureInfo).call(this, jtexinfo, ctx)); // specification/2.0/schema/material.normalTextureInfo.schema.json + + _this._scale = jtexinfo.scale !== undefined ? jtexinfo.scale : 1.0; + return _this; + } + /** + * 法線スケール + * @type {number} + * @readonly + */ + + + _createClass(NormalTextureInfo, [{ + key: "texCoord", + get: function get() { + return this._scale; + } + }]); + + return NormalTextureInfo; +}(TextureInfo); + +/** + * glTF の occlusionTextureInfo に対応 + * @memberof mapray.gltf + * @private + */ + +var OcclusionTextureInfo = +/*#__PURE__*/ +function (_TextureInfo) { + _inherits(OcclusionTextureInfo, _TextureInfo); + + /** + * 初期化 + * @param {object} jtexinfo テクスチャ情報 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + */ + function OcclusionTextureInfo(jtexinfo, ctx) { + var _this; + + _classCallCheck(this, OcclusionTextureInfo); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(OcclusionTextureInfo).call(this, jtexinfo, ctx)); // specification/2.0/schema/material.occlusionTextureInfo.schema.json + + _this._strength = jtexinfo.strength !== undefined ? jtexinfo.strength : 1.0; + return _this; + } + /** + * 遮蔽強度 + * @type {number} + * @readonly + */ + + + _createClass(OcclusionTextureInfo, [{ + key: "strength", + get: function get() { + return this._strength; + } + }]); + + return OcclusionTextureInfo; +}(TextureInfo); + +/** + * @summary エンティティ用のモデルデータを格納 + * + * @classdesc + *

エンティティが使用するモデルデータを格納するクラスである。

+ * + * @memberof mapray + * @private + * @see mapray.ModelEntity + */ + +var ModelContainer = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Scene} scene エンティティが所属するシーン + * @param {mapray.gltf.Content} content 入力モデルデータ + */ + function ModelContainer(scene, content) { + _classCallCheck(this, ModelContainer); + + this._entries = []; // 辞書: 整数 -> Entry + + this._name_map = {}; // 辞書: 名前 -> Entry + + this._default = null; // 既定モデルの Entry + + this._offset_transform = GeoMath.setIdentity(GeoMath.createMatrix()); + var share = {}; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = content.scenes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var gltf_scene = _step.value; + var entry = new Entry$1(scene, gltf_scene, share); + + this._entries.push(entry); + + if (gltf_scene.name !== null) { + this._name_map[gltf_scene.name] = entry; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + if (content.default_scene_index >= 0) { + if (content.default_scene_index < this._entries.length) { + this._default = this._entries[content.default_scene_index]; + } else { + throw new Error("default_scene_index is out of range"); + } + } else { + if (this._entries.length >= 1) { + this._default = this._entries[0]; + } + } + } + /** + * @summary 対応可能な glTF 拡張機能の配列を取得 + * + * @desc + *

例えば {@link mapray.gltf.Tools.load} の supported_extensions オプションのために使用する。

+ *

glTF のコンテンツがこれらの拡張機能だけで対応できないとき、読み込みに失敗することがある。

+ * + * @return {string[]} + */ + + + _createClass(ModelContainer, [{ + key: "setOffsetTransform", + + /** + * @summary オフセット用の変換行列を設定 + * + * @param {mapray.Matrix} matrix モデルの頂点座標を変換する変換行列 + */ + value: function setOffsetTransform(matrix) { + GeoMath.copyMatrix(matrix, this._offset_transform); + } + /** + * @summary モデルデータを生成 + * + * @desc + *

id で指定したモデルのプリミティブを生成する。ただし id を省略したときは既定のモデルが選択される。

+ *

id で指定したモデルが存在しないとき、または id を省略したがモデルがまったく存在しないとき null を返す。

+ * + * @param {number|string} [id] モデル ID + * @return {?mapray.Primitive[]} モデルのプリミティブ配列 + */ + + }, { + key: "createPrimitives", + value: function createPrimitives(id, options) { + var entry = this._getEntry(id); + + if (entry === null) return null; + var primitives = []; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = entry.getPrimitives(options)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var prim = _step2.value; + var cloned_prim = prim.fastClone(); + GeoMath.mul_AA(this._offset_transform, cloned_prim.transform, cloned_prim.transform); // オフセット変換行列を適用 + + cloned_prim.properties = Builder.fastCloneProperties(cloned_prim.properties); + primitives.push(cloned_prim); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return primitives; + } + /** + * @summary エントリーを取得 + * + * @param {number|string} [id] モデル ID + * @return {?mapray.ModelContainer.Entry} モデルエントリー + * @private + */ + + }, { + key: "_getEntry", + value: function _getEntry(id) { + if (typeof id == 'number') { + // id を整数で指定 + if (0 <= id && id < this._entries.length) { + return this._entries[id]; + } + } else if (typeof id == 'string') { + // id を名前で指定 + if (this._name_map.hasOwnProperty(id)) { + return this._name_map[id]; + } + } else { + // id 指定なし + if (this._entries.length > 0) { + return this._entries[0]; + } + } + + return null; + } + }], [{ + key: "getSupportedExtensions_glTF", + value: function getSupportedExtensions_glTF() { + return ["KHR_materials_unlit"]; + } + }]); + + return ModelContainer; +}(); +/** + * @summary モデルエントリー + * + * @memberof mapray.ModelContainer + * @private + */ + + +var Entry$1 = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Scene} mr_scene Mapray シーン + * @param {mapray.gltf.Scene} gltf_scene glTF シーン + * @param {object} share Builder インスタンス間の共有情報 + */ + function Entry(mr_scene, gltf_scene, share) { + _classCallCheck(this, Entry); + + this._builder = new Builder(mr_scene, gltf_scene, share); + } + /** + * @summary mapray.Primitive の配列を取得 + * @desc + *

transform プロパティはプリミティブ座標系からエンティティ座標系への変換になっている。

+ * @type {mapray.Primitive[]} + * @readonly + */ + + + _createClass(Entry, [{ + key: "getPrimitives", + value: function getPrimitives(options) { + return this._builder.getPrimitives(options); + } + }]); + + return Entry; +}(); +/** + * @summary glTF シーンから mapray.Primitive の配列を構築 + * + * @memberof mapray.ModelContainer + * @private + */ + + +var Builder = +/*#__PURE__*/ +function () { + /** + * @param {mapray.Scene} mr_scene Mapray シーン + * @param {mapray.gltf.Scene} gltf_scene glTF シーン + * @param {object} share Builder インスタンス間の共有情報 + */ + function Builder(mr_scene, gltf_scene, share) { + _classCallCheck(this, Builder); + + // share を初期化 + if (!share.buffer_map) { + share.buffer_map = new Map(); // gltf.Buffer -> MeshBuffer + + share.texture_map = new Map(); // gltf.Texture -> Texture + } + + this._mr_scene = mr_scene; + this._glenv = mr_scene.glenv; + this._primitives = []; + this._pickPrimitives = []; + this._buffer_map = share.buffer_map; + this._texture_map = share.texture_map; + var identity = GeoMath.setIdentity(GeoMath.createMatrix()); // シーンからシーンへの変換 (恒等行列) + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = gltf_scene.root_nodes[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var node = _step3.value; + + this._addNode(node, identity); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + /** + * @summary mapray.Primitive の配列を取得 + * @desc + *

transform プロパティはプリミティブ座標系からエンティティ座標系への変換になっている。

+ * @type {mapray.Primitive[]} + * @readonly + */ + + + _createClass(Builder, [{ + key: "getPrimitives", + value: function getPrimitives() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return options.ridMaterial ? this._pickPrimitives : this._primitives; + } + /** + * ノードを追加 + * + * @param {mapray.gltf.Node} node 追加対象のノード + * @param {mapray.Matrix} ptos 親ノード座標系からシーン座標系への変換 + * @private + */ + + }, { + key: "_addNode", + value: function _addNode(node, ptos) { + var ntos = Builder._getNodeToScene(node, ptos); + + if (node.mesh !== null) { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = node.mesh.primitives[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var primitive = _step4.value; + + // プリミティブを追加 + this._primitives.push(this._createPrimitive(primitive, ntos, { + ridMaterial: false + })); + + this._pickPrimitives.push(this._createPrimitive(primitive, ntos, { + ridMaterial: true + })); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + } // 子孫の処理 + + + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = node.children[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var child = _step5.value; + + this._addNode(child, ntos); + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + /** + * node 座標系からシーン座標系の変換行列を取得 + * + * @param {mapray.gltf.Node} node 追加対象のノード + * @param {mapray.Matrix} ptos 親ノード座標系からシーン座標系への変換行列 + * @return {mapray.Matrix} node 座標系からシーン座標系の変換行列 + * @private + */ + + }, { + key: "_createPrimitive", + + /** + * プリミティブを生成 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @param {mapray.Matrix} ntos ノード座標系からシーン座標系への変換 + * @return {mapray.Primitive} 出力プリミティブ + * @private + */ + value: function _createPrimitive(iprim, ntos) { + var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + var mesh = this._createMesh(iprim); + + var material = this._createMaterial(iprim, { + ridMaterial: opts.ridMaterial + }); + + var oprim = new Primitive(this._glenv, mesh, material, GeoMath.createMatrix(ntos)); + oprim.pivot = this._createMeshPivot(iprim); + oprim.bbox = this._createBoundingBox(iprim); + oprim.properties = this._createProperties(iprim); + return oprim; + } + /** + * メッシュを生成 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @return {mapray.Mesh} メッシュ + * @private + */ + + }, { + key: "_createMesh", + value: function _createMesh(iprim) { + var init = new Mesh.Initializer(Builder._convertPrimitiveMode(iprim), Builder._calcNumVertices(iprim)); + var attributes = iprim.attributes; + + for (var name in attributes) { + this._addAttribToInit(init, name, attributes[name]); + } + + var indices = iprim.indices; + + if (indices !== null) { + this._addIndexToInit(init, indices); + } + + return new Mesh(this._glenv, init); + } + /** + * 描画モードに変換 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @return {mapray.Mesh.DrawMode} 描画モード + * @private + */ + + }, { + key: "_addAttribToInit", + + /** + * 頂点属性をイニシャライザに追加 + * + * @param {mapray.Mesh.Initializer} init 追加先 + * @param {string} name 属性名 + * @param {mapray.gltf.Accessor} accessor アクセサ + * @private + */ + value: function _addAttribToInit(init, name, accessor) { + var buffer = this._findMeshBuffer(accessor.bufferView.buffer, MeshBuffer.Target.ATTRIBUTE); + + var num_components = Builder._NumComponents[accessor.type]; + var component_type = Builder._ComponentType[accessor.componentType]; + var options = { + normalized: accessor.normalized, + byte_stride: accessor.bufferView.byteStride, + byte_offset: accessor.bufferView.byteOffset + accessor.byteOffset + }; + var id = Builder._VertexAttribId[name] || name; + init.addAttribute(id, buffer, num_components, component_type, options); + } + /** + * インデックスをイニシャライザに追加 + * + * @param {mapray.Mesh.Initializer} init 追加先 + * @param {mapray.gltf.Accessor} accessor アクセサ + * @private + */ + + }, { + key: "_addIndexToInit", + value: function _addIndexToInit(init, accessor) { + var buffer = this._findMeshBuffer(accessor.bufferView.buffer, MeshBuffer.Target.INDEX); + + var num_indices = accessor.count; + var type = Builder._ComponentType[accessor.componentType]; + var options = { + byte_offset: accessor.bufferView.byteOffset + accessor.byteOffset + }; + init.addIndex(buffer, num_indices, type, options); + } + /** + * MeshBuffer インスタンスを検索 + * + * @param {mapray.gltf.Buffer} buffer 入力バッファ + * @param {mapray.MeshBuffer.Target} target 使用目的 + * @return {mapray.MeshBuffer} + * @private + */ + + }, { + key: "_findMeshBuffer", + value: function _findMeshBuffer(buffer, target) { + var meshBuffer = this._buffer_map.get(buffer); + + if (meshBuffer === undefined) { + meshBuffer = new MeshBuffer(this._glenv, buffer.binary, { + target: target + }); + + this._buffer_map.set(buffer, meshBuffer); + } + + return meshBuffer; + } + /** + * マテリアルを生成 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @return {mapray.EntityMaterial} マテリアル + * @private + */ + + }, { + key: "_createMaterial", + value: function _createMaterial(iprim) { + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + // キャッシュの場所とオプションを決定 + var cache_suffix = "basic"; + var options = {}; + + if (iprim.material && iprim.material.commonData.getExtensions("KHR_materials_unlit")) { + cache_suffix = "unlit"; + options.is_unlit = true; + } + + if (opts.ridMaterial) { + options.ridMaterial = true; + } // マテリアルのインスタンスを取得 + + + var scene = this._mr_scene; + var cache_id = "_ModelEntity_model_material_" + cache_suffix + (opts.ridMaterial ? "_pick" : ""); + + if (!scene[cache_id]) { + // scene にマテリアルをキャッシュ + scene[cache_id] = new ModelMaterial(scene.glenv, options); + } + + return scene[cache_id]; + } + /** + * メッシュ基点を生成 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @return {?mapray.Vector3} メッシュ基点 + * @private + */ + + }, { + key: "_createMeshPivot", + value: function _createMeshPivot(iprim) { + var pivot = null; + + var bbox = this._createBoundingBox(iprim); + + if (bbox !== null) { + pivot = GeoMath.createVector3(); // 境界箱の中点 + + for (var i = 0; i < 3; ++i) { + pivot[i] = (bbox[0][i] + bbox[1][i]) / 2; + } + } + + return pivot; + } + /** + * 境界箱を生成 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @return {?mapray.Vector3[]} 境界箱 + * @private + */ + + }, { + key: "_createBoundingBox", + value: function _createBoundingBox(iprim) { + var bbox = null; + var attrib = iprim.attributes['POSITION']; + + if (attrib !== undefined) { + var min = attrib.min; + var max = attrib.max; + + if (min !== null && max !== null) { + bbox = [GeoMath.createVector3(min), GeoMath.createVector3(max)]; + } + } + + return bbox; + } + /** + * プロパティを生成 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @return {object} プロパティ + * @private + */ + + }, { + key: "_createProperties", + value: function _createProperties(iprim) { + var material = iprim.material; + + if (material === null) { + // 既定のマテリアル + return { + pbrMetallicRoughness: { + baseColorFactor: GeoMath.createVector4f([1.0, 1.0, 1.0, 1.0]), + baseColorTexture: null, + metallicFactor: 1.0, + roughnessFactor: 1.0, + metallicRoughnessTexture: null + }, + doubleSided: false, + alphaMode: "OPAQUE", + alphaCutoff: 0.5, + emissiveFactor: GeoMath.createVector3f([0.0, 0.0, 0.0]), + emissiveTexture: null, + normalTexture: null, + occlusionTexture: null + }; + } else { + var pbrMR = material.pbrMetallicRoughness; + return { + pbrMetallicRoughness: { + baseColorFactor: GeoMath.createVector4f(pbrMR.baseColorFactor), + baseColorTexture: this._createTextureParam(pbrMR.baseColorTexture), + metallicFactor: pbrMR.metallicFactor, + roughnessFactor: pbrMR.roughnessFactor, + metallicRoughnessTexture: this._createTextureParam(pbrMR.metallicRoughnessTexture) + }, + doubleSided: material.doubleSided, + alphaMode: material.alphaMode, + alphaCutoff: material.alphaCutoff, + emissiveFactor: GeoMath.createVector3f(material.emissiveFactor), + emissiveTexture: this._createTextureParam(material.emissiveTexture), + normalTexture: this._createTextureParam(material.normalTexture), + occlusionTexture: this._createTextureParam(material.occlusionTexture) + }; + } + } + /** + * テクスチャパラメータを生成 + * + * @param {mapray.gltf.TextureInfo} texinfo TextureInfo インスタンス + * @return {object} テクスチャパラメータ + * @private + */ + + }, { + key: "_createTextureParam", + value: function _createTextureParam(texinfo) { + if (texinfo === null) { + return null; + } + + var param = { + texture: this._findTexture(texinfo.texture), + texCoord: texinfo.texCoord + }; + + if (texinfo instanceof NormalTextureInfo) { + param.scale = texinfo.scale; + } else if (texinfo instanceof OcclusionTextureInfo) { + param.strength = texinfo.strength; + } + + return param; + } + /** + * モデル用のプロパティを複製 + * + * @param {mapray.PropSet} props + * @return {mapray.PropSet} + * + * @see _createProperties() + */ + + }, { + key: "_findTexture", + + /** + * テクスチャパラメータを生成 + * + * @param {mapray.gltf.Texture} itexture glTF テクスチャ + * @return {mapray.Texture} テクスチャ + * @private + */ + value: function _findTexture(itexture) { + var otexture = this._texture_map.get(itexture); + + if (otexture === undefined) { + var sampler = itexture.sampler; + var gl = this._glenv.context; + var tex_opts = { + mag_filter: sampler.magFilter !== undefined ? sampler.magFilter : gl.LINEAR, + min_filter: sampler.minFilter !== undefined ? sampler.minFilter : gl.LINEAR_MIPMAP_LINEAR, + wrap_s: sampler.wrapS, + wrap_t: sampler.wrapT, + flip_y: false // glTF のテクスチャ座標は左上が原点なので画像を反転しない + + }; + otexture = new Texture(this._glenv, itexture.source.image, tex_opts); + + this._texture_map.set(itexture, otexture); + } + + return otexture; + } + }], [{ + key: "_getNodeToScene", + value: function _getNodeToScene(node, ptos) { + var ntos = ptos; // node 座標系からシーン座標系の変換 + + var ntop = node.matrix; // node 座標系から親ノード座標系の変換 + + if (ntop !== null) { + ntos = GeoMath.createMatrix(); + GeoMath.mul_AA(ptos, ntop, ntos); + } + + return ntos; + } + }, { + key: "_convertPrimitiveMode", + value: function _convertPrimitiveMode(iprim) { + return Builder._DrawMode[iprim.mode]; + } + /** + * 頂点数を計算 + * + * @param {mapray.gltf.Primitive} iprim 入力プリミティブ + * @return {number} 頂点数 + * @private + */ + + }, { + key: "_calcNumVertices", + value: function _calcNumVertices(iprim) { + var attributes = iprim.attributes; + var counts = []; + + for (var name in attributes) { + var accessor = attributes[name]; + counts.push(accessor.count); + } + + return Math.min.apply(null, counts); + } + }, { + key: "fastCloneProperties", + value: function fastCloneProperties(props) { + var src_pbr = props.pbrMetallicRoughness; + return { + pbrMetallicRoughness: { + baseColorFactor: GeoMath.createVector3f(src_pbr.baseColorFactor), + baseColorTexture: Builder._fastCloneTextureParam(src_pbr.baseColorTexture), + metallicFactor: src_pbr.metallicFactor, + roughnessFactor: src_pbr.roughnessFactor, + metallicRoughnessTexture: Builder._fastCloneTextureParam(src_pbr.metallicRoughnessTexture) + }, + doubleSided: props.doubleSided, + alphaMode: props.alphaMode, + alphaCutoff: props.alphaCutoff, + emissiveFactor: GeoMath.createVector3f(props.emissiveFactor), + emissiveTexture: Builder._fastCloneTextureParam(props.emissiveTexture), + normalTexture: Builder._fastCloneTextureParam(props.normalTexture), + occlusionTexture: Builder._fastCloneTextureParam(props.occlusionTexture) + }; + } + /** + * テクスチャパラメータを複製 + * + * @param {object} param + * @return {!object} + * + * @private + * @see _createTextureParam() + */ + + }, { + key: "_fastCloneTextureParam", + value: function _fastCloneTextureParam(iparam) { + if (iparam === null) return null; + var oparam = { + texture: iparam.texture, + texCoord: iparam.texCoord + }; + + if ('scale' in iparam) { + oparam.scale = iparam.scale; + } else if ('strength' in iparam) { + oparam.strength = iparam.strength; + } + + return oparam; + } + }]); + + return Builder; +}(); // gltf.Primitive.mode -> mapray.Mesh.DrawMode + + +Builder._DrawMode = { + 0: Mesh.DrawMode.POINTS, + 1: Mesh.DrawMode.LINES, + 2: Mesh.DrawMode.LINE_LOOP, + 3: Mesh.DrawMode.LINE_STRIP, + 4: Mesh.DrawMode.TRIANGLES, + 5: Mesh.DrawMode.TRIANGLE_STRIP, + 6: Mesh.DrawMode.TRIANGLE_FAN +}; // gltf.Accessor.type -> 要素数 + +Builder._NumComponents = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4 +}; // gltf.Accessor.componentType -> mapray.Mesh.ComponentType + +Builder._ComponentType = { + 5120: Mesh.ComponentType.BYTE, + 5121: Mesh.ComponentType.UNSIGNED_BYTE, + 5122: Mesh.ComponentType.SHORT, + 5123: Mesh.ComponentType.UNSIGNED_SHORT, + 5125: Mesh.ComponentType.UNSIGNED_INT, + 5126: Mesh.ComponentType.FLOAT +}; // gltf.Primitive.attributes のキー -> 頂点属性 ID + +Builder._VertexAttribId = { + 'POSITION': "a_position", + 'NORMAL': "a_normal", + 'TANGENT': "a_tangent", + 'TEXCOORD_0': "a_texcoord", + 'TEXCOORD_1': "a_texcoord1", + 'COLOR_0': "a_color" +}; + +var line_vs_code = "/**\n * 太さ付き線分の頂点シェーダ\n */\n\nattribute vec4 a_position; // 頂点位置 (モデル座標系)\nattribute vec3 a_direction; // 線分方向 (モデル座標系) = 終点位置 - 始点位置\nattribute vec2 a_where; // 線分の4隅指定: 始点左: {-1, 1}, 始点右: {-1, -1}, 終点左: {1, 1}, 終点右: {1, -1}\nattribute float a_length;\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform vec3 u_sparam; // 画面パラメータ: {2/w, 2/h, h/w}\nuniform vec2 u_thickness; // 線の太さの半分: {u, v}\n\nvarying highp float v_length; // 始点からの距離 (PathEntityのみ利用)\n\nvec2\noffset( vec4 cpos )\n{\n vec4 q0 = cpos;\n q0.y *= u_sparam.z; // q0 = A * q0\n vec4 q1 = cpos + u_obj_to_clip * vec4( a_direction, 0 );\n q1.y *= u_sparam.z; // q1 = A * q1\n\n vec2 ds = normalize( q1.xy / q1.w - q0.xy / q0.w );\n vec2 wt = a_where * u_thickness;\n return mat2( ds.x, ds.y, -ds.y, ds.x ) * wt;\n}\n\nvoid\nmain()\n{\n gl_Position = u_obj_to_clip * a_position;\n gl_Position.xy += offset( gl_Position ) * u_sparam.xy * gl_Position.w;\n v_length = a_length;\n}\n"; + +var line_fs_code = "/**\n * 太さ付き線分のフラグメントシェーダ\n * RID描画に対応\n */\n\nprecision mediump float;\n\n\n\n#ifdef PATH\nuniform highp float u_lower_length; // 距離の下限値 (PathEntityのみ利用)\nuniform highp float u_upper_length; // 距離の上限値 (PathEntityのみ利用)\n\nvarying highp float v_length; // 始点からの距離 (PathEntityのみ利用)\n#endif // PATH\n\n#ifdef RID\nuniform highp vec4 u_rid; // rid\n#else // RID\nuniform vec4 u_color; // 線の基本色と不透明度\n#endif // RID\n\n\nvoid\nmain()\n{\n#ifdef PATH\n if ( u_lower_length <= v_length && v_length <= u_upper_length ) {\n#endif // PATH\n\n#ifdef RID\n gl_FragColor = u_rid;\n#else // RID\n gl_FragColor = vec4( u_color.xyz * u_color.w, u_color.w );\n#endif // RID\n\n#ifdef PATH\n }\n else {\n discard; // フラグメントを破棄\n }\n#endif // PATH\n}\n"; + +/** + * @summary 太さ付き線分専用マテリアル + * @memberof mapray + * @extends mapray.EntityMaterial + * @private + */ + +var LineMaterial = +/*#__PURE__*/ +function (_EntityMaterial) { + _inherits(LineMaterial, _EntityMaterial); + + /** + * @param {mapray.GLEnv} glenv + */ + function LineMaterial(glenv, line_type) { + var _this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + _classCallCheck(this, LineMaterial); + + var preamble = LineMaterial._getPreamble(line_type, options); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(LineMaterial).call(this, glenv, preamble + line_vs_code, preamble + line_fs_code)); + _this._line_type = line_type; + return _this; + } + /** + * @override + */ + + + _createClass(LineMaterial, [{ + key: "isTranslucent", + value: function isTranslucent(stage, primitive) { + var props = primitive.properties; + var opacity = props.opacity !== undefined ? props.opacity : LineMaterial.DEFAULT_OPACITY; + return opacity < 1.0; + } + /** + * @override + */ + + }, { + key: "setParameters", + value: function setParameters(stage, primitive) { + _get(_getPrototypeOf(LineMaterial.prototype), "setParameters", this).call(this, stage, primitive); + + var props = primitive.properties; // u_obj_to_clip + + this.setObjToClip(stage, primitive); // 画面パラメータ: {2/w, 2/h, h/w} + // vec3 u_sparam + + var sparam = LineMaterial._sparam; + sparam[0] = 2 / stage._width; + sparam[1] = 2 / stage._height; + sparam[2] = stage._height / stage._width; + this.setVector3("u_sparam", sparam); // 線の太さの半分: {u, v} + // vec2 u_thickness + + var param_width = props.width || LineMaterial.DEFAULT_WIDTH; + var thickness = LineMaterial._thickness; + thickness[0] = param_width / 2; + thickness[1] = param_width / 2; + this.setVector2("u_thickness", thickness); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + // 線の基本色 + // vec4 u_color + var param_color = props.color !== undefined ? props.color : LineMaterial.DEFAULT_COLOR; + var param_opacity = props.opacity !== undefined ? props.opacity : LineMaterial.DEFAULT_OPACITY; + var color = LineMaterial._color; + GeoMath.copyVector3(param_color, color); + color[3] = param_opacity; + this.setVector4("u_color", color); + } // RID rendering also requires u_lower_length and u_upper_length. + + + if (this._line_type == AbstractLineEntity.LineType.PATH) { + var lower_length = props["lower_length"]; + this.setFloat("u_lower_length", lower_length); + var upper_length = props["upper_length"]; + this.setFloat("u_upper_length", upper_length); + } + } + /** + * @summary シェーダの前文を取得 + * + * @param {AbstractLineEntity.LineType} line_type + * @param {object} options + * + * @private + */ + + }], [{ + key: "_getPreamble", + value: function _getPreamble(line_type, options) { + var lines = []; + + if (line_type == AbstractLineEntity.LineType.PATH) { + lines.push("#define PATH"); + } + + if (options.ridMaterial) { + lines.push("#define RID"); + } // lines を文字列にして返す + + + return lines.join("\n") + "\n\n"; + } + }]); + + return LineMaterial; +}(EntityMaterial); // クラス定数の定義 + + +{ + LineMaterial.DEFAULT_WIDTH = 1.0; + LineMaterial.DEFAULT_COLOR = GeoMath.createVector3f([1.0, 1.0, 1.0]); + LineMaterial.DEFAULT_OPACITY = 1.0; + LineMaterial.DEFAULT_LOWER_LENGTH = 0.0; + LineMaterial.DEFAULT_UPPER_LENGTH = 0.0; // 計算用一時領域 + + LineMaterial._sparam = GeoMath.createVector3f(); + LineMaterial._thickness = GeoMath.createVector2f(); + LineMaterial._color = GeoMath.createVector4f(); +} + +/** + * @summary 地理空間的Region + * + * @memberof mapray + */ + +var GeoRegion = +/*#__PURE__*/ +function () { + /** + * 初期値は empty である。 + * lon は次の条件とする。 + *

条件 this._min_lon < this._max_lon

+ *

条件 this._max_lon - this._min_lon <= 360

+ */ + function GeoRegion() { + _classCallCheck(this, GeoRegion); + + this._empty = true; + this._min_lon = 0; + this._max_lon = 0; + this._min_lat = 0; + this._max_lat = 0; + this._min_alt = 0; + this._max_alt = 0; + } + /** + * @summary 空確認 + * + * @return {boolean} empty値 + */ + + + _createClass(GeoRegion, [{ + key: "empty", + value: function empty() { + return this._empty; + } + /** + * @summary Pointを追加 + *

条件 this._min_lon < this._max_lon

+ *

条件 this._max_lon - this._min_lon <= 360

+ * + * @param {number} lon 地理空間位置 longitude + * @param {number} lat 地理空間位置 latitude + * @param {number} alt 地理空間位置 altitude + * @private + */ + + }, { + key: "_add", + value: function _add(lon, lat, alt) { + if (this._empty) { + this._empty = false; + lon = lon - 360 * Math.floor(lon / 360 + 0.5); + this._min_lon = this._max_lon = lon; + this._min_lat = this._max_lat = lat; + this._min_alt = this._max_alt = alt; + } else { + var right_min_lon = this._calcRightPosition(this._min_lon, lon); + + if (right_min_lon <= this._max_lon) ; else { + var right_max_lon = this._calcRightPosition(this._max_lon, lon); + + var length1 = right_max_lon - this._max_lon; + var length2 = right_min_lon - 360 - this._min_lon; + + if (Math.abs(length1) <= Math.abs(length2)) { + // expand east + this._max_lon = this._max_lon + length1; + } else { + // expand west + this._min_lon = this._min_lon + length2; + } + } + + if (lat < this._min_lat) this._min_lat = lat;else if (lat > this._max_lat) this._max_lat = lat; + if (alt < this._min_alt) this._min_alt = alt;else if (alt > this._max_alt) this._max_alt = alt; + } + } + /** + * @summary base_lon より右となる最小の longitude を算出 + * + * @param {number} base_lon 基準となるlongitude + * @param {number} lon 確認したいlongitude + * @return {number} 最小longitude + * @private + */ + + }, { + key: "_calcRightPosition", + value: function _calcRightPosition(base_lon, lon) { + var diff = lon - base_lon; + diff = diff - 360 * Math.floor(diff / 360); + return base_lon + diff; + } + /** + * @summary GeoPointを追加 + * + * @param {mapary.GeoPoint} point 地理空間位置 + */ + + }, { + key: "addPoint", + value: function addPoint(point) { + this._add(point.longitude, point.latitude, point.altitude); + } + /** + * @summary GeoPointを追加 + * + * @param {...mapary.GeoPoint} points 地理空間位置 + */ + + }, { + key: "addPoints", + value: function addPoints() { + var _this = this; + + for (var _len = arguments.length, points = new Array(_len), _key = 0; _key < _len; _key++) { + points[_key] = arguments[_key]; + } + + points.forEach(function (point) { + _this._add(point.longitude, point.latitude, point.altitude); + }); + } + /** + * @summary PointArrayを追加 + * + * @param {number[]} pointsArray 地理空間位置Array + */ + + }, { + key: "addPointsAsArray", + value: function addPointsAsArray(pointsArray) { + for (var i = 0; i < pointsArray.length; i += 3) { + this._add(pointsArray[i], pointsArray[i + 1], pointsArray[i + 2]); + } + } + /** + * @summary GeoRegionを結合 + * + * @param {mapray.GeoRegion} region 地理空間Region + */ + + }, { + key: "merge", + value: function merge(region) { + if (region.empty()) { + return; + } + + if (this._empty) { + this._min_lon = region._min_lon; + this._max_lon = region._max_lon; + this._min_lat = region._min_lat; + this._max_lat = region._max_lat; + this._min_alt = region._min_alt; + this._max_alt = region._max_alt; + this._empty = false; + } else { + // 内包判定 + var right_min_lon = this._calcRightPosition(this._min_lon, region._min_lon); + + var right_max_lon = this._calcRightPosition(this._min_lon, region._max_lon); + + if (right_min_lon > right_max_lon) { + right_min_lon -= 360; + } + + var min_include = false; + + if (right_min_lon >= this._min_lon && right_min_lon <= this._max_lon) { + min_include = true; + } + + var max_include = false; + + if (right_max_lon >= this._min_lon && right_max_lon <= this._max_lon) { + max_include = true; + } // 1.thisがregionを内包 + + + if (min_include && max_include) ; // 内包状態 -> 変化無し + // 2.westのみ内包 -> east拡大 + else if (min_include) { + this._max_lon = right_max_lon; + } // 3.eastのみ内包 -> west拡大 + else if (max_include) { + this._min_lon = right_min_lon; + } // 4.regionがthisを内包 + else if (this._min_lon >= right_min_lon && this._max_lon <= right_max_lon) { + this._min_lon = region._min_lon; + this._max_lon = region._max_lon; + } // 5.共有無し + else { + // east と west 比較 + var length1 = right_max_lon - this._max_lon; + var length2 = right_min_lon - 360 - this._min_lon; + + if (Math.abs(length1) <= Math.abs(length2)) { + // expand east + this._max_lon = this._max_lon + length1; + } else { + // expand west + this._min_lon = this._min_lon + length2; + } + } // lat と alt + + + this._min_lat = Math.min(this._min_lat, region._min_lat); + this._max_lat = Math.max(this._max_lat, region._max_lat); + this._min_alt = Math.min(this._min_alt, region._min_alt); + this._max_alt = Math.max(this._max_alt, region._max_alt); + } + } + /** + * @summary Region内の任意点の取得 + * center ( 0.5, 0.5 ) + * east ( 1, 0.5 ) + * west ( 0, 0.5 ) + * north ( 0.5, 1 ) + * south ( 0.5, 0 ) + * northEast ( 1, 1 ) + * southWest ( 0, 0 ) + * + * @param {number} lon_pos longitude位置割合 + * @param {number} lat_pos latitude位置割合 + * @param {number} [alt_pos] anlitude位置割合 + * @return {mapary.GeoPoint} GeoPoint + */ + + }, { + key: "getPoint", + value: function getPoint(lon_pos, lat_pos) { + var alt_pos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + + if (this._empty) { + return null; + } + + return new GeoPoint((1 - lon_pos) * this._min_lon + lon_pos * this._max_lon, (1 - lat_pos) * this._min_lat + lat_pos * this._max_lat, (1 - alt_pos) * this._min_alt + alt_pos * this._max_alt); + } + /** + * @summary SouthWestのGeopointを返却 + * + * @return {mapary.GeoPoint} 南西(min)のGeoPoint + */ + + }, { + key: "getSouthWest", + value: function getSouthWest() { + if (this._empty) { + return null; + } + + return new GeoPoint(this._min_lon, this._min_lat, this._min_alt); + } + /** + * @summary NorthEastのGeopointを返却 + * + * @return {mapary.GeoPoint} 北東(max)のGeoPoint + */ + + }, { + key: "getNorthEast", + value: function getNorthEast() { + if (this._empty) { + return null; + } + + return new GeoPoint(this._max_lon, this._max_lat, this._max_alt); + } + /** + * @summary 中心位置のGeopointを返却 + * + * @return {mapary.GeoPoint} 中心(center)のGeoPoint + */ + + }, { + key: "getCenter", + value: function getCenter() { + if (this._empty) { + return null; + } + + return this.getPoint(0.5, 0.5, 0.5); + } + /** + * @summary RegionのLongitude方向 の地表面距離を算出 + * + * @return {number} Longitude方向の地表面距離 + */ + + }, { + key: "getLongitudeDistance", + value: function getLongitudeDistance() { + if (this._empty) { + return null; + } + + return this.getPoint(0, 0.5).getGeographicalDistance(this.getPoint(1, 0.5)); + } + /** + * @summary RegionのLatitude方向 の地表面距離を算出 + * + * @return {number} Latitude方向の地表面距離 + */ + + }, { + key: "getLatitudeDistance", + value: function getLatitudeDistance() { + if (this._empty) { + return null; + } + + return this.getPoint(0.5, 0).getGeographicalDistance(this.getPoint(0.5, 1)); + } + }]); + + return GeoRegion; +}(); + +/** + * @summary エンティティ領域 + * + * @classdesc + *

標高の変化に伴い、エンティティの更新を行うためのクラスである。

+ * + * @memberof mapray + * @private + * @see mapray.UpdatedTileArea + */ + +var EntityRegion = +/*#__PURE__*/ +function () { + /** + */ + function EntityRegion() { + _classCallCheck(this, EntityRegion); + + this._is_compiled = false; + this._point_array = new Float64Array(0); + this._num_points = 0; + this._node_array = new Uint32Array(0); + this._next_node = 0; + } + /** + * @summary 位置を追加 + * + * @desc + *

point.altitude は無視される。

+ * + * @param {mapray.GeoPoint} point 位置 + */ + + + _createClass(EntityRegion, [{ + key: "addPoint", + value: function addPoint(point) { + this._checkNotCompiled(); + + this._ensurePointArrayCapacity(2); + + var index = 2 * this._num_points; + this._point_array[index] = point.longitude; + this._point_array[index + 1] = point.latitude; + this._num_points += 1; + } + /** + * @summary 複数の位置を追加 + * + * @param {number[]} points 頂点配列 (経度, 緯度, ...) + * @param {number} offset 先頭インデックス + * @param {number} stride ストライド + * @param {number} num_points 頂点数 + */ + + }, { + key: "addPoints", + value: function addPoints(points, offset, stride, num_points) { + this._checkNotCompiled(); + + this._ensurePointArrayCapacity(2 * num_points); + + var src_index = offset; + var dst_index = 2 * this._num_points; + var dst_array = this._point_array; + + for (var i = 0; i < num_points; ++i) { + dst_array[dst_index] = points[src_index]; + dst_array[dst_index + 1] = points[src_index + 1]; + src_index += stride; + dst_index += 2; + } + + this._num_points += num_points; + } + /** + * @summary 比較処理用に翻訳 + * + * @package + */ + + }, { + key: "compile", + value: function compile() { + if (this._is_compiled) { + // すでに翻訳済み + return; + } + + this._buildCollisionQuadTree(); // this._node_array から使っていない最後の領域を削除 + + + if (this._node_array.length > this._next_node) { + this._node_array = new Uint32Array(this._node_array.slice(0, this._next_node)); + } + + this._point_array = null; // 翻訳後は使わないので捨てる + + this._is_compiled = true; // 翻訳済みにする + } + /** + * @summary this と area は交差するか? + * + * @param {mapray.UpdatedTileArea} area 判定する領域 + * + * @return {boolean} 交差するとき true, それ以外のとき false + * + * @package + */ + + }, { + key: "intersectsWith", + value: function intersectsWith(area) { + if (this._node_array.length == 0) { + // this は空領域 + return false; + } + + var area_list = area.getFlatAreaList(); + + for (var i = 0; i < area_list.length; ++i) { + if (this._intersectsWith(area_list[i])) { + // ある領域が交差した + return true; + } + } // すべての領域が交差しなかった + + + return false; + } + /** + * @summary this と area は交差するか? (単一領域) + * + * @param {Uint8Array} area 判定する領域 + * + * @return {boolean} 交差するとき true, それ以外のとき false + * + * @private + */ + + }, { + key: "_intersectsWith", + value: function _intersectsWith(area) { + // assert this._node_array.length > 0 + var node = 0; + var node_array = this._node_array; + + for (var i = 0; i < area.length; ++i) { + node = node_array[node + area[i]]; + + if (node == FULL_INDEX) { + // 交差する (area は全域ノードの内側) + return true; + } else if (node == EMPTY_INDEX) { + // 交差しない (area は空ノードの内側) + return false; + } + } // 交差する + // area.length == 0 (全球領域) または area の最後が this 階層の途中 + + + return true; + } + /** + * @summary すでに翻訳されてるときエラー + * + * @private + */ + + }, { + key: "_checkNotCompiled", + value: function _checkNotCompiled() { + if (this._is_compiled) { + throw new Error("EitityRegion is already compiled."); + } + } + /** + * @summary this._point_array の容量を十分にする + * + * @param {number} added_size 追加サイズ + * + * @private + */ + + }, { + key: "_ensurePointArrayCapacity", + value: function _ensurePointArrayCapacity(added_size) { + var old_size = 2 * this._num_points; + var needed_capacity = old_size + added_size; + var old_capacity = this._point_array.length; + + if (needed_capacity > old_capacity) { + // 配列を拡張する + var new_capacity = Math.max(needed_capacity, Math.floor(1.5 * old_capacity)); + var new_point_array = new Float64Array(new_capacity); + new_point_array.set(this._point_array.slice(0, old_size)); + this._point_array = new_point_array; + } + } + /** + * @summary 領域判定四分木を構築 + * + * @private + */ + + }, { + key: "_buildCollisionQuadTree", + value: function _buildCollisionQuadTree() { + var dPI = 2 * Math.PI; + var point_array = this._point_array; + var num_floats = 2 * this._num_points; + + for (var i = 0; i < num_floats;) { + // 経緯度 (Degrees) + var lon = point_array[i++]; + var lat = point_array[i++]; // 正規化経緯度 (Degrees) + + var _lon = lon + 180 * Math.floor((90 - lat) / 360 + Math.floor((90 + lat) / 360)); + + var nlon = _lon - 360 - 360 * Math.floor((_lon - 180) / 360); // 正規化経度 [-180,180) + + var nlat = 90 - Math.abs(90 - lat + 360 * Math.floor((90 + lat) / 360)); // 正規化緯度 [-90,90] + // 単位球メルカトル座標 + + var xm = nlon * GeoMath.DEGREE; + var ym = GeoMath.invGudermannian(nlat * GeoMath.DEGREE); // 基底タイル座標 (左上(0, 0)、右下(1, 1)) + + var xt = xm / dPI + 0.5; + var yt = 0.5 - ym / dPI; // ノードを追加 + + this._addCollisionQuadTreeNode(xt, yt); + } // 全域ノードを設定 + + + if (this._next_node > 0) { + this._setFullNodeRecur(0); + + this._reduceNodeRecur(0); + } + } + /** + * @summary 領域判定四分木のノードを追加 + * + * @param {number} xt 基底タイル座標 X + * @param {number} yt 基底タイル座標 Y + * + * @private + */ + + }, { + key: "_addCollisionQuadTreeNode", + value: function _addCollisionQuadTreeNode(xt, yt) { + if (yt < 0 || yt > 1) { + // 緯度が範囲外 (極に近い) + return; + } + + var size = 1 << MAX_LEVEL; + var ubits = GeoMath.clamp(Math.floor(xt * size), 0, size - 1); + var vbits = Math.min(Math.floor(yt * size), size - 1); // >= 0 + + var node = this._findRootNode(); + + for (var mask = size >> 1; mask != 0; mask >>= 1) { + var u = (ubits & mask) == 0 ? 0 : 1; + var v = (vbits & mask) == 0 ? 0 : 2; + node = this._findChildNode(node, u + v); + } + } + /** + * @summary 最上位ノードを検索 + * + * @return {number} 最上位ノード + * + * @private + */ + + }, { + key: "_findRootNode", + value: function _findRootNode() { + if (this._next_node == 0) { + // まだ最上位ノードが存在しない + // 最上位ノードを生成する + this._ensureNodeArrayCapacity(); + + for (var i = 0; i < 4; ++i) { + this._node_array[i] = EMPTY_INDEX; + } + + this._next_node = 4; + } + + return 0; + } + /** + * @summary 子ノードを検索 + * + * @param {number} parent 親ノード + * @param {number} ichild 子ノード序列 (0-3) + * @return {number} 子ノード + * + * @private + */ + + }, { + key: "_findChildNode", + value: function _findChildNode(parent, ichild) { + var child = this._node_array[parent + ichild]; + + if (child == 0) { + // まだ子ノードが存在しない + // 子ノードを生成する + this._ensureNodeArrayCapacity(); + + child = this._next_node; + + for (var i = 0; i < 4; ++i) { + this._node_array[child + i] = EMPTY_INDEX; + } + + this._next_node += 4; // 親ノードに生成した子ノードを取り付ける + + this._node_array[parent + ichild] = child; + } + + return child; + } + /** + * @summary 全域ノードを再帰的に設定 + * + * @desc + *

末端ノードの子ノードを FULL_INDEX に設定する。

+ * + * @param {number} node ノードの索引 + * + * @private + */ + + }, { + key: "_setFullNodeRecur", + value: function _setFullNodeRecur(node) { + var node_array = this._node_array; + var is_leaf = true; + + for (var i = 0; i < 4; ++i) { + var child = node_array[node + i]; + + if (child != EMPTY_INDEX) { + this._setFullNodeRecur(child); + + is_leaf = false; + } + } // 末端なら子ノードを FULL_INDEX + + + if (is_leaf) { + for (i = 0; i < 4; ++i) { + node_array[node + i] = FULL_INDEX; + } + } + } + /** + * @summary 全域ノードを再帰的に設定 + * + * @param {number} node ノードの索引 + * @return {boolean} 全域ノードなら true, その他なら false + * + * @private + */ + + }, { + key: "_reduceNodeRecur", + value: function _reduceNodeRecur(node) { + var node_array = this._node_array; + var num_fulls = 0; + + for (var i = 0; i < 4; ++i) { + var child = node_array[node + i]; + + if (child == FULL_INDEX) { + ++num_fulls; + } else if (child != EMPTY_INDEX) { + if (this._reduceNodeRecur(child)) { + node_array[node + i] = FULL_INDEX; + ++num_fulls; + } + } + } + + return num_fulls == 4; + } + /** + * @summary this._node_array の容量を十分にする + * + * @private + */ + + }, { + key: "_ensureNodeArrayCapacity", + value: function _ensureNodeArrayCapacity() { + var old_size = this._next_node; + var needed_capacity = old_size + 4; + var old_capacity = this._node_array.length; + + if (needed_capacity > old_capacity) { + // 配列を拡張する + var new_capacity = Math.max(needed_capacity, Math.floor(1.5 * old_capacity)); + var new_node_array = new Uint32Array(new_capacity); + new_node_array.set(this._node_array.slice(0, old_size)); + this._node_array = new_node_array; + } + } + }]); + + return EntityRegion; +}(); + +var MAX_LEVEL = 20; // 整数: 0~30 + +var EMPTY_INDEX = 0; // 空ノードの索引 + +var FULL_INDEX = 4294967295; // 全域ノードの索引 = 2^32 - 1 + +/** + * @summary 4分木ベースの領域管理 + * + *

Entity.FlakePrimitiveProducer の getAreaStatus() と createMesh() + * メソッドを補助するためのクラスである。

+ * + * @memberof mapray + * @private + * @see mapray.Entity.FlakePrimitiveProducer + */ + +var QAreaManager = +/*#__PURE__*/ +function () { + /** + */ + function QAreaManager() { + _classCallCheck(this, QAreaManager); + + this._tree_root = null; // QAreaNode | AreaStatus.EMPTY | AreaStatus.FULL + } + /** + * @summary 領域状態を取得 + * + * @desc + *

area が示す領域の状態を取得する。

+ * + * @param {mapray.Area} area 確認する領域 + * + * @return {mapray.Entity.AreaStatus} 領域の状態 + */ + + + _createClass(QAreaManager, [{ + key: "getAreaStatus", + value: function getAreaStatus(area) { + var node = this._get_area_node(area); + + if (node === Entity.AreaStatus.EMPTY || node === Entity.AreaStatus.FULL) { + // Entity.AreaStatus のとき + return node; + } else { + // QAreaNode のとき + return Entity.AreaStatus.PARTIAL; + } + } + /** + * @summary 内容データを取得 + * + * @param {mapray.Area} area 対象領域 + * + * @return {object|mapray.Entity.AreaStatus} area に対応する内容データ | AreaStatus.EMPTY | AreaStatus.FULL + */ + + }, { + key: "getAreaContent", + value: function getAreaContent(area) { + var node = this._get_area_node(area); + + if (node === Entity.AreaStatus.EMPTY || node === Entity.AreaStatus.FULL) { + // Entity.AreaStatus のとき + return node; + } else { + // QAreaNode のとき + return node.content; + } + } + /** + * @summary 初めの内容データを取得 + * + * @desc + *

最上位領域の内容データを生成するための内容データを取得する。

+ *

FlakePrimitiveProducer の実装者がこのメソッドを実装する。

+ * + * @return {object} 内容データ + * + * @abstract + */ + + }, { + key: "getInitialContent", + value: function getInitialContent() { + return null; + } + /** + * @summary 領域の内容データを生成 + * + * @desc + *

領域と parent_content から内容データを生成する。

+ *

パラメータの座標系は正規化メルカトル座標系である。

+ *

FlakePrimitiveProducer の実装者がこのメソッドを実装する。

+ * + * @param {number} min_x 領域の最小 x 座標 + * @param {number} min_y 領域の最小 y 座標 + * @param {number} msize 領域の寸法 + * @param {object} parent_content 親領域の内容データ + * + * @return {object|mapray.Entity.AreaStatus} 内容データ | AreaStatus.EMPTY | AreaStatus.FULL + * + * @abstract + */ + + }, { + key: "createAreaContent", + value: function createAreaContent(min_x, min_y, msize, parent_content) { + return Entity.AreaStatus.EMPTY; + } + /** + * @summary 内容データが更新されたこと通知 + * + * @desc + *

内容データが更新されときに FlakePrimitiveProducer の実装者がこのメソッドを呼び出す。

+ */ + + }, { + key: "notifyForUpdateContent", + value: function notifyForUpdateContent() { + this._tree_root = null; + } + /** + * @summary 領域のノードを生成 + * + * @param {number} min_x 領域の最小 x 座標 + * @param {number} max_y 領域の最大 y 座標 + * @param {number} msize 領域の寸法 + * @param {object} parent_content 親領域の内容データ + * + * @return {QAreaNode|mapray.Entity.AreaStatus} ノード | AreaStatus.EMPTY | AreaStatus.FULL + * + * @private + */ + + }, { + key: "_create_area_node", + value: function _create_area_node(min_x, max_y, msize, parent_content) { + var content = this.createAreaContent(min_x, max_y - msize, msize, parent_content); + + if (content === Entity.AreaStatus.EMPTY || content === Entity.AreaStatus.FULL) { + return content; + } else { + return new QAreaNode(content); + } + } + /** + * @summary 領域のノードを取得 + * + * @desc + *

area に対応するノードを取得する。

+ * + * @param {mapray.Area} area 領域 + * + * @return {QAreaNode|mapray.Entity.AreaStatus} area に対応するノード | AreaStatus.EMPTY | AreaStatus.FULL + * + * @private + */ + + }, { + key: "_get_area_node", + value: function _get_area_node(area) { + var msize = 2; + var min_x = -1; + var max_y = 1; + + if (this._tree_root === null) { + var content = this.getInitialContent(); + this._tree_root = this._create_area_node(min_x, max_y, msize, content); + } + + var node = this._tree_root; + var tsize = Math.round(Math.pow(2, area.z)); // 現行レベルでの縦横タイル数 + + var rx = area.x; // 現行レベルでのタイル x 座標 + + var ry = area.y; // 現行レベルでのタイル y 座標 + + while (tsize != 1 && node !== Entity.AreaStatus.EMPTY && node !== Entity.AreaStatus.FULL) { + tsize /= 2; + var u = rx >= tsize ? 1 : 0; + var v = ry >= tsize ? 1 : 0; + msize /= 2; + min_x += u * msize; + max_y -= v * msize; + var index = u + 2 * v; + var child = node.children[index]; + + if (child === null) { + // 子ノードを生成して node に設定 + child = this._create_area_node(min_x, max_y, msize, node.content); + node.children[index] = child; + } + + rx -= u * tsize; + ry -= v * tsize; + node = child; + } + + return node; + } + }]); + + return QAreaManager; +}(); +/** + * @summary QAreaManager が管理するノード + * + * @memberof mapray.QAreaManager + * @private + */ + + +var QAreaNode = +/** + * @param {object} content 内容データ + */ +function QAreaNode(content) { + _classCallCheck(this, QAreaNode); + + this.children = [null, null, null, null]; // QAreaNode | AreaStatus.EMPTY | AreaStatus.FULL + + this.content = content; +}; + +/** + * @summary 線エンティティ + * + * @classdesc + *

{@link mapray.MarkerLineEntity} と {@link mapray.PathEntity} の共通機能を + * 提供するクラスである。

+ * + * @memberof mapray + * @extends mapray.Entity + * @abstract + * @protected + */ + +var AbstractLineEntity = +/*#__PURE__*/ +function (_Entity) { + _inherits(AbstractLineEntity, _Entity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {mapray.AbstractLineEntity.LineType} line_type クラス種別 + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function AbstractLineEntity(scene, line_type, opts) { + var _this; + + _classCallCheck(this, AbstractLineEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(AbstractLineEntity).call(this, scene, opts)); + _this._line_type = line_type; + + if (_this.altitude_mode === AltitudeMode.CLAMP) { + _this._producer = new FlakePrimitiveProducer$1(_assertThisInitialized(_this)); + _this._is_flake_mode = true; + } else { + _this._producer = new PrimitiveProducer$1(_assertThisInitialized(_this)); + _this._is_flake_mode = false; + } + + return _this; + } + /** + * @override + */ + + + _createClass(AbstractLineEntity, [{ + key: "getPrimitiveProducer", + value: function getPrimitiveProducer() { + return !this._is_flake_mode ? this._producer : null; + } + /** + * @override + */ + + }, { + key: "getFlakePrimitiveProducer", + value: function getFlakePrimitiveProducer() { + return this._is_flake_mode ? this._producer : null; + } + /** + * @override + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode(prev_mode) { + if (this.altitude_mode === AltitudeMode.CLAMP) { + this._producer = new FlakePrimitiveProducer$1(this); + this._is_flake_mode = true; + } else { + this._producer = new PrimitiveProducer$1(this); + this._is_flake_mode = false; + } + } + /** + * @summary 線の太さを設定 + * + * @param {number} width 線の太さ (画素単位) + */ + + }, { + key: "setLineWidth", + value: function setLineWidth(width) { + if (this._width !== width) { + this._width = width; + + this._producer.onChangeProperty(); + } + } + /** + * @summary 基本色を設定 + * + * @param {mapray.Vector3} color 基本色 + */ + + }, { + key: "setColor", + value: function setColor(color) { + if (this._color[0] !== color[0] || this._color[1] !== color[1] || this._color[2] !== color[2]) { + // 位置が変更された + GeoMath.copyVector3(color, this._color); + + this._producer.onChangeProperty(); + } + } + /** + * @summary 不透明度を設定 + * + * @param {number} opacity 不透明度 + */ + + }, { + key: "setOpacity", + value: function setOpacity(opacity) { + if (this._opacity !== opacity) { + this._opacity = opacity; + + this._producer.onChangeProperty(); + } + } + /** + * @summary すべての頂点のバウンディングを算出 + * + * @override + * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion + */ + + }, { + key: "getBounds", + value: function getBounds() { + var region = new GeoRegion(); + region.addPointsAsArray(this._point_array); + return region; + } + /** + * @summary 専用マテリアルを取得 + * @private + */ + + }, { + key: "_getLineMaterial", + value: function _getLineMaterial(render_target) { + var scene = this.scene; + var cache_id = "_AbstractLineEntity_material" + (this._line_type === LineType.PATH ? "_path" : "_markerline") + (render_target === RenderTarget.RID ? "_pick" : ""); + + if (!scene[cache_id]) { + // scene にマテリアルをキャッシュ + var opt = { + ridMaterial: render_target === RenderTarget.RID + }; + scene[cache_id] = new LineMaterial(scene.glenv, this._line_type, opt); + } + + return scene[cache_id]; + } + }]); + + return AbstractLineEntity; +}(Entity); +/** + * @summary MarkerLineEntity の PrimitiveProducer + * + * @private + */ + + +var PrimitiveProducer$1 = +/*#__PURE__*/ +function (_Entity$PrimitiveProd) { + _inherits(PrimitiveProducer, _Entity$PrimitiveProd); + + /** + * @param {mapray.MarkerLineEntity} entity + */ + function PrimitiveProducer(entity) { + var _this2; + + _classCallCheck(this, PrimitiveProducer); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(PrimitiveProducer).call(this, entity)); // プリミティブの要素 + + _this2._transform = GeoMath.setIdentity(GeoMath.createMatrix()); + _this2._pivot = GeoMath.createVector3(); + _this2._bbox = [GeoMath.createVector3(), GeoMath.createVector3()]; + _this2._properties = { + width: 1.0, + color: GeoMath.createVector3f(), + opacity: 1.0 + }; + + if (entity._line_type == LineType.PATH) { + _this2._properties["lower_length"] = 0.0; + _this2._properties["upper_length"] = 0.0; + } // プリミティブ + + + var material = entity._getLineMaterial(RenderTarget.SCENE); + + var primitive = new Primitive(entity.scene.glenv, null, material, _this2._transform); + primitive.pivot = _this2._pivot; + primitive.bbox = _this2._bbox; + primitive.properties = _this2._properties; + _this2._primitive = primitive; + + var pick_material = entity._getLineMaterial(RenderTarget.RID); + + var pickPrimitive = new Primitive(entity.scene.glenv, null, pick_material, _this2._transform); + pickPrimitive.pivot = _this2._pivot; + pickPrimitive.bbox = _this2._bbox; + pickPrimitive.properties = _this2._properties; + _this2._pickPrimitive = pickPrimitive; // プリミティブ配列 + + _this2._primitives = [primitive]; + _this2._pickPrimitives = [pickPrimitive]; + _this2._geom_dirty = true; + return _this2; + } + /** + * @override + */ + + + _createClass(PrimitiveProducer, [{ + key: "createRegions", + value: function createRegions() { + var region = new EntityRegion(); + region.addPoints(this.entity._point_array, 0, 3, this._numPoints()); + return [region]; + } + /** + * @override + */ + + }, { + key: "onChangeElevation", + value: function onChangeElevation(regions) { + this._geom_dirty = true; + } + /** + * @override + */ + + }, { + key: "getPrimitives", + value: function getPrimitives(stage) { + if (this._num_floats < 6) { + // 2頂点未満は表示しない + return []; + } else { + this._updatePrimitive(); + + return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives; + } + } + /** + * @summary 頂点が変更されたことを通知 + */ + + }, { + key: "onChangePoints", + value: function onChangePoints() { + this.needToCreateRegions(); + this._geom_dirty = true; + } + /** + * @summary プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeProperty", + value: function onChangeProperty() {} + /** + * @summary プリミティブの更新 + * + * @desc + *
+     * 条件: this._num_floats >= 6
+     * 入力:
+     *   this._geom_dirty
+     *   this.entity._point_array
+     *   this.entity._num_floats
+     *   this.entity._width
+     *   this.entity._color
+     *   this.entity._opacity
+     *   this.entity._length_array
+     * 出力:
+     *   this._transform
+     *   this._pivot
+     *   this._bbox
+     *   this._properties
+     *   this._primitive.mesh
+     *   this._geom_dirty
+     * 
+ * + * @private + */ + + }, { + key: "_updatePrimitive", + value: function _updatePrimitive() { + this._updateProperties(); + + if (!this._geom_dirty) { + // メッシュは更新する必要がない + return; + } + + var entity = this.entity; // GeoPoint 平坦化配列を GOCS 平坦化配列に変換 + + var num_points = this._numPoints(); + + var gocs_buffer = GeoPoint.toGocsArray(this._getFlatGeoPoints_with_Absolute(), num_points, new Float64Array(entity._num_floats)); // プリミティブの更新 + // primitive.transform + // primitive.pivot + // primitive.bbox + + this._updateTransformPivotBBox(gocs_buffer, num_points); + + var add_length = entity._line_type === LineType.PATH; + var length_array = add_length ? entity._length_array : undefined; // メッシュ生成 + + var mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }, { + name: "a_direction", + size: 3 + }, { + name: "a_where", + size: 2 + }], + vertices: this._createVertices(gocs_buffer, num_points, length_array), + indices: this._createIndices() + }; + + if (add_length) { + mesh_data.vtype.push({ + name: "a_length", + size: 1 + }); + } + + var mesh = new Mesh(entity.scene.glenv, mesh_data); // メッシュ設定 + // primitive.mesh + + var primitive = this._primitive; + + if (primitive.mesh) { + primitive.mesh.dispose(); + } + + primitive.mesh = mesh; + var pickPrimitive = this._pickPrimitive; + + if (pickPrimitive.mesh) { + pickPrimitive.mesh.dispose(); + } + + pickPrimitive.mesh = mesh; // 更新終了 + + this._geom_dirty = false; + } + /** + * @summary プロパティを更新 + * + * @desc + *
+     * 入力:
+     *   this.entity._width
+     *   this.entity._color
+     *   this.entity._opacity
+     *   this.entity._lower_length
+     *   this.entity._upper_length
+     * 出力:
+     *   this._properties
+     * 
+ * + * @private + */ + + }, { + key: "_updateProperties", + value: function _updateProperties() { + var entity = this.entity; + var props = this._properties; + props.width = entity._width; + GeoMath.copyVector3(entity._color, props.color); + props.opacity = entity._opacity; + props.lower_length = entity._lower_length; + props.upper_length = entity._upper_length; + } + /** + * @summary GeoPoint 平坦化配列を取得 (絶対高度) + * + * @return {number[]} GeoPoint 平坦化配列 + * @private + */ + + }, { + key: "_getFlatGeoPoints_with_Absolute", + value: function _getFlatGeoPoints_with_Absolute() { + var entity = this.entity; + var point_array = entity._point_array; + var num_floats = entity._num_floats; + var abs_buffer = null; + + switch (entity.altitude_mode) { + case AltitudeMode.RELATIVE: + var num_points = this._numPoints(); + + abs_buffer = new Float64Array(num_floats); // abs_buffer[] の高度要素に現在の標高を設定 + + entity.scene.viewer.getExistingElevations(num_points, point_array, 0, 3, abs_buffer, 2, 3); // abs_buffer[] に経度要素と緯度要素を設定し、高度要素に絶対高度を設定 + + for (var i = 0; i < num_floats; i += 3) { + abs_buffer[i] = point_array[i]; // 経度 + + abs_buffer[i + 1] = point_array[i + 1]; // 緯度 + + abs_buffer[i + 2] += point_array[i + 2]; // 絶対高度 + } + + break; + + default: + // AltitudeMode.ABSOLUTE + abs_buffer = point_array; + break; + } + + return abs_buffer; + } + /** + * @summary プリミティブの更新 + * + * @desc + *
+     * 出力:
+     *   this._transform
+     *   this._pivot
+     *   this._bbox
+     * 
+ * + * @param {Float64Array} gocs_buffer 入力頂点配列 (GOCS) + * @param {number} num_points 入力頂点数 + * @private + */ + + }, { + key: "_updateTransformPivotBBox", + value: function _updateTransformPivotBBox(gocs_buffer, num_points) { + // モデル座標系の原点 (GOCS) + var ox = gocs_buffer[0]; + var oy = gocs_buffer[1]; + var oz = gocs_buffer[2]; // 変換行列の更新 + + var transform = this._transform; + transform[12] = ox; + transform[13] = oy; + transform[14] = oz; // 統計 + + var xsum = 0; + var ysum = 0; + var zsum = 0; + var xmin = Number.MAX_VALUE; + var ymin = Number.MAX_VALUE; + var zmin = Number.MAX_VALUE; + var xmax = -Number.MAX_VALUE; + var ymax = -Number.MAX_VALUE; + var zmax = -Number.MAX_VALUE; + + for (var i = 0; i < num_points; ++i) { + var b = 3 * i; + var x = gocs_buffer[b] - ox; + var y = gocs_buffer[b + 1] - oy; + var z = gocs_buffer[b + 2] - oz; + xsum += x; + ysum += y; + zsum += z; + + if (x < xmin) { + xmin = x; + } + + if (y < ymin) { + ymin = y; + } + + if (z < zmin) { + zmin = z; + } + + if (x > xmax) { + xmax = x; + } + + if (y > ymax) { + ymax = y; + } + + if (z > zmax) { + zmax = z; + } + } // 中心点 + + + var pivot = this._pivot; + pivot[0] = xsum / num_points; + pivot[1] = ysum / num_points; + pivot[2] = zsum / num_points; // 境界箱 + + var bbox = this._bbox; + var bmin = bbox[0]; + var bmax = bbox[1]; + bmin[0] = xmin; + bmin[1] = ymin; + bmin[2] = zmin; + bmax[0] = xmax; + bmax[1] = ymax; + bmax[2] = zmax; + } + /** + * @summary 頂点配列の生成 + * + * @param {Float64Array} gocs_buffer 入力頂点配列 (GOCS) + * @param {number} num_points 入力頂点数 + * @return {Float32Array} Mesh 用の頂点配列 + * + * @private + */ + + }, { + key: "_createVertices", + value: function _createVertices(gocs_buffer, num_points) { + var length_array = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + // 頂点の距離を追加するか + var add_length = length_array !== undefined; // モデル座標系の原点 (GOCS) + + var ox = gocs_buffer[0]; + var oy = gocs_buffer[1]; + var oz = gocs_buffer[2]; + var num_segments = num_points - 1; + var num_vertices = 4 * num_segments; + var vertices = new Float32Array((add_length ? 9 : 8) * num_vertices); + + for (var i = 0; i < num_segments; ++i) { + var b = 3 * i; + var sx = gocs_buffer[b] - ox; + var sy = gocs_buffer[b + 1] - oy; + var sz = gocs_buffer[b + 2] - oz; + var ex = gocs_buffer[b + 3] - ox; + var ey = gocs_buffer[b + 4] - oy; + var ez = gocs_buffer[b + 5] - oz; + var dx = gocs_buffer[b + 3] - gocs_buffer[b]; + var dy = gocs_buffer[b + 4] - gocs_buffer[b + 1]; + var dz = gocs_buffer[b + 5] - gocs_buffer[b + 2]; + var v = (add_length ? 36 : 32) * i; // 始左、始右、終左、終右のループ + + for (var j = 0; j < 4; ++j) { + var start = j < 2; + var id = v + j * (add_length ? 9 : 8); + vertices[id] = start ? sx : ex; // a_position.x + + vertices[id + 1] = start ? sy : ey; // a_position.y + + vertices[id + 2] = start ? sz : ez; // a_position.z + + vertices[id + 3] = dx; // a_direction.x + + vertices[id + 4] = dy; // a_direction.y + + vertices[id + 5] = dz; // a_direction.z + + switch (j) { + case 0: + vertices[id + 6] = -1; // a_where.x + + vertices[id + 7] = 1; // a_where.y + + break; + + case 1: + vertices[id + 6] = -1; // a_where.x + + vertices[id + 7] = -1; // a_where.y + + break; + + case 2: + vertices[id + 6] = 1; // a_where.x + + vertices[id + 7] = 1; // a_where.y + + break; + + case 3: + vertices[id + 6] = 1; // a_where.x + + vertices[id + 7] = -1; // a_where.y + + break; + } + + if (add_length) { + vertices[id + 8] = length_array[start ? i : i + 1]; + } + } + } + + return vertices; + } + /** + * @summary 頂点インデックスの生成 + * + * @desc + *
+     * 条件: this.entity._num_floats >= 6
+     * 入力: this.entity._num_floats
+     * 
+ * + * @return {Uint32Array} インデックス配列 + * + * @private + */ + + }, { + key: "_createIndices", + value: function _createIndices() { + var num_points = this._numPoints(); + + var num_segments = num_points - 1; + var num_indices = 6 * num_segments; + var indices = new Uint32Array(num_indices); + + for (var i = 0; i < num_segments; ++i) { + var base_d = 6 * i; + var base_s = 4 * i; + indices[base_d] = base_s; + indices[base_d + 1] = base_s + 1; + indices[base_d + 2] = base_s + 2; + indices[base_d + 3] = base_s + 2; + indices[base_d + 4] = base_s + 1; + indices[base_d + 5] = base_s + 3; + } + + return indices; + } + /** + * @summary 頂点数を取得 + * + * @return {number} 頂点数 + * + * @private + */ + + }, { + key: "_numPoints", + value: function _numPoints() { + return Math.floor(this.entity._num_floats / 3); + } + }]); + + return PrimitiveProducer; +}(Entity.PrimitiveProducer); +/** + * @summary MarkerLineEntity の FlakePrimitiveProducer + * + * @private + */ + + +var FlakePrimitiveProducer$1 = +/*#__PURE__*/ +function (_Entity$FlakePrimitiv) { + _inherits(FlakePrimitiveProducer, _Entity$FlakePrimitiv); + + /** + * @param {mapray.MarkerLineEntity} entity + */ + function FlakePrimitiveProducer(entity) { + var _this3; + + _classCallCheck(this, FlakePrimitiveProducer); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(FlakePrimitiveProducer).call(this, entity)); + _this3._material_map = Object.keys(RenderTarget).reduce(function (map, key) { + var render_target = RenderTarget[key]; + map.set(render_target, entity._getLineMaterial(render_target)); + return map; + }, new Map()); + _this3._properties = null; + _this3._area_manager = new LineAreaManager(entity); + return _this3; + } + /** + * @override + */ + + + _createClass(FlakePrimitiveProducer, [{ + key: "getAreaStatus", + value: function getAreaStatus(area) { + return this._area_manager.getAreaStatus(area); + } + /** + * @override + */ + + }, { + key: "createMesh", + value: function createMesh(area, dpows, dem) { + var segments = this._divideXY(area, dpows); + + if (segments.length == 0) { + return null; + } + + var add_length = this.entity._line_type === LineType.PATH; // メッシュ生成 + + var mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }, { + name: "a_direction", + size: 3 + }, { + name: "a_where", + size: 2 + }], + vertices: this._createVertices(area, dem, segments, add_length), + indices: this._createIndices(segments.length) + }; + + if (add_length) { + mesh_data.vtype.push({ + name: "a_length", + size: 1 + }); + } + + return new Mesh(this.entity.scene.glenv, mesh_data); + } + /** + * @override + */ + + }, { + key: "getMaterialAndProperties", + value: function getMaterialAndProperties(stage) { + if (this._properties === null) { + var entity = this.entity; + this._properties = { + width: entity._width, + color: GeoMath.createVector3f(entity._color), + opacity: entity._opacity + }; + + if (entity._line_type == LineType.PATH) { + this._properties["lower_length"] = entity._lower_length; + this._properties["upper_length"] = entity._upper_length; + } + } + + return { + material: this._material_map.get(stage.getRenderTarget()), + properties: this._properties + }; + } + /** + * @summary 頂点が変更されたことを通知 + */ + + }, { + key: "onChangePoints", + value: function onChangePoints() { + this._area_manager.notifyForUpdateContent(); + + this.notifyForUpdate(); + } + /** + * @summary プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeProperty", + value: function onChangeProperty() { + this._properties = null; + } + /** + * @summary すべての線分を垂直グリッドで分割 + * + * @param {mapray.Area} area 地表断片の領域 + * @param {number} msize area 寸法 ÷ π (厳密値) + * @param {number} dpow area の x 分割指数 + * + * @private + */ + + }, { + key: "_divideXOnly", + value: function _divideXOnly(area, msize, dpow) { + var x_min = Math.PI * (area.x * msize - 1); + var x_max = Math.PI * ((area.x + 1) * msize - 1); + var div_x = 1 << dpow; // 横分割数: 2^dpow + + var step_x = (x_max - x_min) / div_x; // 横分割間隔 + + var segments = []; // 垂直グリッド線で分割 + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._area_manager.getAreaContent(area)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _step$value = _slicedToArray(_step.value, 6), + px = _step$value[0], + py = _step$value[1], + pl = _step$value[2], + qx = _step$value[3], + qy = _step$value[4], + ql = _step$value[5]; + + var _ref = px <= qx ? [px, py, pl, qx, qy, ql] : [qx, qy, ql, px, py, pl], + _ref2 = _slicedToArray(_ref, 6), + x0 = _ref2[0], + y0 = _ref2[1], + l0 = _ref2[2], + x1 = _ref2[3], + y1 = _ref2[4], + l1 = _ref2[5]; // assert: x0 <= x1 + + + if (x1 < x_min || x0 >= x_max) { + // 線分の x 座標が area の範囲外 + continue; + } + + if (x0 == x1) { + // 垂直線分なので、垂直グリッド線で分割しない + segments.push([x0, y0, l0, x1, y1, l1]); + continue; + } // 左端でトリミング + + + var tx0 = x0; + var ty0 = y0; + var tl0 = l0; + + if (x0 < x_min) { + var mu1 = (x_min - x0) / (x1 - x0); + var mu0 = 1 - mu1; + tx0 = x_min; + ty0 = mu0 * y0 + mu1 * y1; // 左端線と線分の交点の y 座標 + + tl0 = mu0 * l0 + mu1 * l1; + } // 右端でトリミング + + + var tx1 = x1; + var ty1 = y1; + var tl1 = l1; + + if (x1 > x_max) { + var _mu = (x_max - x0) / (x1 - x0); + + var _mu2 = 1 - _mu; + + tx1 = x_max; + ty1 = _mu2 * y0 + _mu * y1; // 右端線と線分の交点の y 座標 + + tl1 = _mu2 * l0 + _mu * l1; + } // グリッド線の範囲 + + + var i_min = Math.max(Math.ceil((x0 - x_min) / step_x), 1); + var i_max = Math.min(Math.floor((x1 - x_min) / step_x), div_x - 1); + var prev_x = tx0; + var prev_y = ty0; + var prev_l = tl0; + + for (var i = i_min; i <= i_max; ++i) { + var next_x = x_min + step_x * i; // 垂直グリッド線の x 座標 + + var _mu3 = (next_x - x0) / (x1 - x0); + + var _mu4 = 1 - _mu3; + + var next_y = _mu4 * y0 + _mu3 * y1; // 垂直グリッド線と線分の交点の y 座標 + + var next_l = _mu4 * l0 + _mu3 * l1; + + if (prev_x != next_x || prev_y != next_y) { + segments.push([prev_x, prev_y, prev_l, next_x, next_y, next_l]); + } + + prev_x = next_x; + prev_y = next_y; + prev_l = next_l; + } + + if (prev_x != tx1 || prev_y != ty1) { + segments.push([prev_x, prev_y, prev_l, tx1, ty1, tl1]); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return segments; + } + /** + * @summary すべての線分をグリッドで分割 + * + * @param {mapray.Area} area 地表断片の領域 + * @param {number[]} dpows area の xy 分割指数 + * + * @private + */ + + }, { + key: "_divideXY", + value: function _divideXY(area, dpows) { + // area 寸法 ÷ π (厳密値) + // 線分の場合、領域の端によるクリッピングがシビアなので厳密値 (2^整数) を使う + var msize = 2 / Math.round(Math.pow(2, area.z)); // area の y 座標の範囲 + + var y_min = Math.PI * (1 - (area.y + 1) * msize); + var y_max = Math.PI * (1 - area.y * msize); + var div_y = 1 << dpows[1]; // 縦分割数: 2^dpow + + var step_y = (y_max - y_min) / div_y; // 縦分割間隔 + + var segments = []; // 水平グリッド線で分割 + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this._divideXOnly(area, msize, dpows[0])[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var _step2$value = _slicedToArray(_step2.value, 6), + px = _step2$value[0], + py = _step2$value[1], + pl = _step2$value[2], + qx = _step2$value[3], + qy = _step2$value[4], + ql = _step2$value[5]; + + var _ref3 = py <= qy ? [px, py, pl, qx, qy, ql] : [qx, qy, ql, px, py, pl], + _ref4 = _slicedToArray(_ref3, 6), + x0 = _ref4[0], + y0 = _ref4[1], + l0 = _ref4[2], + x1 = _ref4[3], + y1 = _ref4[4], + l1 = _ref4[5]; // assert: y0 <= y1 + + + if (y1 < y_min || y0 >= y_max) { + // 線分の y 座標が area の範囲外 + continue; + } + + if (y0 == y1) { + // 水平線分なので、水平グリッド線で分割しない + segments.push([x0, y0, l0, x1, y1, l1]); + continue; + } // 下端でトリミング + + + var tx0 = x0; + var ty0 = y0; + var tl0 = l0; + + if (y0 < y_min) { + var mu1 = (y_min - y0) / (y1 - y0); + var mu0 = 1 - mu1; + tx0 = mu0 * x0 + mu1 * x1; // 下端線と線分の交点の x 座標 + + ty0 = y_min; + tl0 = mu0 * l0 + mu1 * l1; + } // 上端でトリミング + + + var tx1 = x1; + var ty1 = y1; + var tl1 = l1; + + if (y1 > y_max) { + var _mu5 = (y_max - y0) / (y1 - y0); + + var _mu6 = 1 - _mu5; + + tx1 = _mu6 * x0 + _mu5 * x1; // 上端線と線分の交点の x 座標 + + ty1 = y_max; + tl1 = _mu6 * l0 + _mu5 * l1; + } // グリッド線の範囲 + + + var i_min = Math.max(Math.ceil((y0 - y_min) / step_y), 1); + var i_max = Math.min(Math.floor((y1 - y_min) / step_y), div_y - 1); + var prev_x = tx0; + var prev_y = ty0; + var prev_l = tl0; + + for (var i = i_min; i <= i_max; ++i) { + var next_y = y_min + step_y * i; // 水平グリッド線の y 座標 + + var _mu7 = (next_y - y0) / (y1 - y0); + + var _mu8 = 1 - _mu7; + + var next_x = _mu8 * x0 + _mu7 * x1; // 水平グリッド線と線分の交点の x 座標 + + var next_l = _mu8 * l0 + _mu7 * l1; + + if (prev_x != next_x || prev_y != next_y) { + segments.push([prev_x, prev_y, prev_l, next_x, next_y, next_l]); + } + + prev_x = next_x; + prev_y = next_y; + prev_l = next_l; + } + + if (prev_x != tx1 || prev_y != ty1) { + segments.push([prev_x, prev_y, prev_l, tx1, ty1, tl1]); + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return segments; + } + /** + * @summary 頂点配列の生成 + * + * @param {mapray.Area} area 地表断片の領域 + * @param {mapray.DemBinary} dem DEM バイナリ + * + * @return {Float32Array} Mesh 用の頂点配列 + * + * @private + */ + + }, { + key: "_createVertices", + value: function _createVertices(area, dem, segments) { + var add_length = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + var sampler = dem.newLinearSampler(); + + var _AreaUtil$getCenter = AreaUtil.getCenter(area, GeoMath.createVector3()), + _AreaUtil$getCenter2 = _slicedToArray(_AreaUtil$getCenter, 3), + ox = _AreaUtil$getCenter2[0], + oy = _AreaUtil$getCenter2[1], + oz = _AreaUtil$getCenter2[2]; + + var num_segments = segments.length; + var num_vertices = 4 * num_segments; + var vertices = new Float32Array((add_length ? 9 : 8) * num_vertices); + + for (var i = 0; i < num_segments; ++i) { + var _segments$i = _slicedToArray(segments[i], 6), + smx = _segments$i[0], + smy = _segments$i[1], + prev_length = _segments$i[2], + emx = _segments$i[3], + emy = _segments$i[4], + next_length = _segments$i[5]; + + var _toGocs = toGocs(smx, smy, sampler), + _toGocs2 = _slicedToArray(_toGocs, 3), + sgx = _toGocs2[0], + sgy = _toGocs2[1], + sgz = _toGocs2[2]; + + var _toGocs3 = toGocs(emx, emy, sampler), + _toGocs4 = _slicedToArray(_toGocs3, 3), + egx = _toGocs4[0], + egy = _toGocs4[1], + egz = _toGocs4[2]; + + var sx = sgx - ox; + var sy = sgy - oy; + var sz = sgz - oz; + var ex = egx - ox; + var ey = egy - oy; + var ez = egz - oz; + var dx = egx - sgx; + var dy = egy - sgy; + var dz = egz - sgz; + var v = (add_length ? 36 : 32) * i; // 始左、始右、終左、終右のループ + + for (var j = 0; j < 4; ++j) { + var start = j < 2; + var id = v + j * (add_length ? 9 : 8); + vertices[id] = start ? sx : ex; // a_position.x + + vertices[id + 1] = start ? sy : ey; // a_position.y + + vertices[id + 2] = start ? sz : ez; // a_position.z + + vertices[id + 3] = dx; // a_direction.x + + vertices[id + 4] = dy; // a_direction.y + + vertices[id + 5] = dz; // a_direction.z + + switch (j) { + case 0: + vertices[id + 6] = -1; // a_where.x + + vertices[id + 7] = 1; // a_where.y + + break; + + case 1: + vertices[id + 6] = -1; // a_where.x + + vertices[id + 7] = -1; // a_where.y + + break; + + case 2: + vertices[id + 6] = 1; // a_where.x + + vertices[id + 7] = 1; // a_where.y + + break; + + case 3: + vertices[id + 6] = 1; // a_where.x + + vertices[id + 7] = -1; // a_where.y + + break; + } + + if (add_length) { + vertices[id + 8] = start ? prev_length : next_length; + } + } + } + + return vertices; + } + /** + * @summary @summary 頂点インデックスの生成 + * + * @param {number} num_segments 線分の数 + * + * @return {Uint32Array} Mesh 用の頂点インデックス + * + * @private + */ + + }, { + key: "_createIndices", + value: function _createIndices(num_segments) { + var num_indices = 6 * num_segments; + var indices = new Uint32Array(num_indices); + + for (var i = 0; i < num_segments; ++i) { + var base_d = 6 * i; + var base_s = 4 * i; + indices[base_d] = base_s; + indices[base_d + 1] = base_s + 1; + indices[base_d + 2] = base_s + 2; + indices[base_d + 3] = base_s + 2; + indices[base_d + 4] = base_s + 1; + indices[base_d + 5] = base_s + 3; + } + + return indices; + } + }]); + + return FlakePrimitiveProducer; +}(Entity.FlakePrimitiveProducer); +/** + * @private + */ + + +function toGocs(x, y, sampler) { + var λ = x; + var φ = GeoMath.gudermannian(y); + var r = GeoMath.EARTH_RADIUS + sampler.sample(x, y); + var cosφ = Math.cos(φ); + return [r * cosφ * Math.cos(λ), r * cosφ * Math.sin(λ), r * Math.sin(φ)]; +} +/** + * @summary 線分の領域管理 + * + * @private + */ + + +var LineAreaManager = +/*#__PURE__*/ +function (_QAreaManager) { + _inherits(LineAreaManager, _QAreaManager); + + /** + * @param {mapray.MarkerLineEntity} entity 管理対象のエンティティ + */ + function LineAreaManager(entity) { + var _this4; + + _classCallCheck(this, LineAreaManager); + + _this4 = _possibleConstructorReturn(this, _getPrototypeOf(LineAreaManager).call(this)); + _this4._entity = entity; + return _this4; + } + /** + * @override + */ + + + _createClass(LineAreaManager, [{ + key: "getInitialContent", + value: function getInitialContent() { + var Degree = GeoMath.DEGREE; + var RAngle = Math.PI / 2; // 直角 + + var TwoPI = 2 * Math.PI; // 2π + + var segments = []; // 頂点データ + + var points = this._entity._point_array; + var end_point = this._entity._num_floats; + + if (end_point < 6) { + // 線分なし + return segments; + } + + var is_path = this._entity._line_type === LineType.PATH; + var length_array = is_path ? this._entity._length_array : null; // 線分の始点 (ラジアン) + + var lon0 = points[0] * Degree; + var lat0 = points[1] * Degree; + var length0 = is_path ? length_array[0] : 0; + var lon1; + var lat1; + var length1; + + for (var i = 3; i < end_point; i += 3, lon0 = lon1, lat0 = lat1, length0 = length1) { + // 線分の終点 (ラジアン) + lon1 = points[i] * Degree; + lat1 = points[i + 1] * Degree; + length1 = is_path ? length_array[i / 3] : 0; + + if (lat0 <= -RAngle || lat0 >= RAngle || lat1 <= -RAngle || lat1 >= RAngle) { + // 端点の緯度の絶対値が RAngle 以上の線分は除外 + // ※ まだ検討していないので、とりあえずの処置 + continue; + } // 単位球メルカトル座標系に変換 + + + var x0 = lon0; + var y0 = GeoMath.invGudermannian(lat0); + var l0 = length0; + var x1 = lon1; + var y1 = GeoMath.invGudermannian(lat1); + var l1 = length1; // 左端点と右端点 + + var _ref5 = x0 < x1 ? [x0, y0, l0, x1, y1, l1] : [x1, y1, l1, x0, y0, l0], + _ref6 = _slicedToArray(_ref5, 6), + xL = _ref6[0], + yL = _ref6[1], + lL = _ref6[2], + xR = _ref6[3], + yR = _ref6[4], + lR = _ref6[5]; // -π <= xL < π になるように xL を正規化 + + + if (xL < -Math.PI || xL >= Math.PI) { + var dx = xR - xL; + xL -= TwoPI * (Math.floor((xL - Math.PI) / TwoPI) + 1); + + if (xL < -Math.PI || xL >= Math.PI) { + // 誤差対策 + xL = -Math.PI; + } + + xR = xL + dx; + } + + if (xL == xR && yL == yR) { + // 長さ 0 の線分は除外 + continue; + } // 線分を追加 + + + segments.push([xL, yL, lL, xR, yR, lR]); + + if (xR > Math.PI) { + // 線分が 180 度子午線をまたぐとき + // こちらは多少厳密さを無視する + segments.push([xL - TwoPI, yL, lL, xR - TwoPI, yR, lR]); + } + } + + return segments; + } + /** + * @override + */ + + }, { + key: "createAreaContent", + value: function createAreaContent(min_x, min_y, msize, parent_content) { + // 単位球メルカトルでの領域に変換 + var x_area_min = Math.PI * min_x; + var x_area_max = Math.PI * (min_x + msize); + var y_area_min = Math.PI * min_y; + var y_area_max = Math.PI * (min_y + msize); + var segments = []; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = parent_content[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var segment = _step3.value; + + var _segment = _slicedToArray(segment, 5), + xP = _segment[0], + yP = _segment[1], + + /*lP*/ + xQ = _segment[3], + yQ + /*lQ*/ + = _segment[4]; + + if (this._intersect(x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ)) { + segments.push(segment); + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return segments.length > 0 ? segments : Entity.AreaStatus.EMPTY; + } + /** + * @summary 矩形と線分の交差判定 + * + * @desc + *

矩形領域と線分が交差するかどうかを返す。

+ *

矩形領域には x 座標が x_area_max の点と、y 座標が y_area_max の点は含まれないものとする。

+ * + *
+     * 事前条件:
+     *   x_area_min < x_area_max
+     *   y_area_min < y_area_max
+     * 
+ * + * @param {number} x_area_min 矩形領域の最小 x 座標 + * @param {number} x_area_max 矩形領域の最大 x 座標 + * @param {number} y_area_min 矩形領域の最小 y 座標 + * @param {number} y_area_max 矩形領域の最大 y 座標 + * @param {number} xP 線分端点 P の x 座標 + * @param {number} yP 線分端点 P の y 座標 + * @param {number} xQ 線分端点 Q の x 座標 + * @param {number} yQ 線分端点 Q の y 座標 + * + * @return {boolean} 交差するとき true, それ以外のとき false + * + * @private + */ + + }, { + key: "_intersect", + value: function _intersect(x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ) { + if (Math.abs(xP - xQ) < Math.abs(yP - yQ)) { + // 線分が垂直に近いとき + return this._nhorz_intersect(x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ); + } else { + // 線分が水平に近いとき + return this._nhorz_intersect(y_area_min, y_area_max, x_area_min, x_area_max, yP, xP, yQ, xQ); + } + } + /** + * @summary 矩形と非水平線分の交差判定 + * + * @desc + *

矩形領域と線分が交差するかどうかを返す。

+ *

矩形領域には x 座標が x_area_max の点と、y 座標が y_area_max の点は含まれないものとする。

+ * + *
+     * 事前条件:
+     *   x_area_min < x_area_max
+     *   y_area_min < y_area_max
+     *   yP != yQ
+     * 
+ * + *

注意: |yP - yQ| が小さいと精度が悪くなる。

+ * + * @param {number} x_area_min 矩形領域の最小 x 座標 + * @param {number} x_area_max 矩形領域の最大 x 座標 + * @param {number} y_area_min 矩形領域の最小 y 座標 + * @param {number} y_area_max 矩形領域の最大 y 座標 + * @param {number} xP 線分端点 P の x 座標 + * @param {number} yP 線分端点 P の y 座標 + * @param {number} xQ 線分端点 Q の x 座標 + * @param {number} yQ 線分端点 Q の y 座標 + * + * @return {boolean} 交差するとき true, それ以外のとき false + * + * @private + */ + + }, { + key: "_nhorz_intersect", + value: function _nhorz_intersect(x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ) { + // 線分の y 座標の範囲 + var _ref7 = yP < yQ ? [yP, yQ] : [yQ, yP], + _ref8 = _slicedToArray(_ref7, 2), + y_line_min = _ref8[0], + y_line_max = _ref8[1]; + + if (y_line_min >= y_area_max || y_line_max < y_area_min) { + // 線分の y 範囲が矩形領域の y 範囲の外側なので交差しない + return false; + } // 矩形領域と線分の y 座標が重なる範囲 (順不同) + + + var y_range_0 = y_area_min >= y_line_max ? y_area_min : y_line_max; + var y_range_1 = y_area_max <= y_line_min ? y_area_max : y_line_min; // y が {y_range_0, y_range_1} 範囲での線分の x 範囲 (順不同) + + var x_range_0 = xP + (xQ - xP) * (y_range_0 - yP) / (yQ - yP); + var x_range_1 = xP + (xQ - xP) * (y_range_1 - yP) / (yQ - yP); // y が {y_range_0, y_range_1} 範囲での線分の x 範囲 + + var _ref9 = x_range_0 < x_range_1 ? [x_range_0, x_range_1] : [x_range_1, x_range_0], + _ref10 = _slicedToArray(_ref9, 2), + x_range_min = _ref10[0], + x_range_max = _ref10[1]; // [x_range_min, x_range_max] 範囲は矩形領域の x の範囲と重なるか? + + + return x_range_min < x_area_max && x_range_max >= x_area_min; + } + }]); + + return LineAreaManager; +}(QAreaManager); +/** +* @summary エンティティの種類の列挙型 +* @enum {object} +* @memberof mapray.AbstractLineEntity +* @constant +* @see mapray.AbstractLineEntity#line_type +*/ + + +var LineType = { + /** + * MarkerLineEntity + */ + MARKERLINE: { + id: "MARKERLINE" + }, + + /** + * PathEntity + */ + PATH: { + id: "PATH" + } +}; +AbstractLineEntity.LineType = LineType; + +/** + * @summary 太さ付き連続線エンティティ + * @memberof mapray + * @extends mapray.AbstractLineEntity + */ + +var MarkerLineEntity = +/*#__PURE__*/ +function (_AbstractLineEntity) { + _inherits(MarkerLineEntity, _AbstractLineEntity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function MarkerLineEntity(scene, opts) { + var _this; + + _classCallCheck(this, MarkerLineEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(MarkerLineEntity).call(this, scene, AbstractLineEntity.LineType.MARKERLINE, opts)); + _this._point_array = new Float64Array(0); + _this._num_floats = 0; + _this._width = 1.0; + _this._color = GeoMath.createVector3([1.0, 1.0, 1.0]); + _this._opacity = 1.0; + + _this._setupAnimationBindingBlock(); // 生成情報から設定 + + + if (opts && opts.json) { + _this._setupByJson(opts.json); + } + + return _this; + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + + _createClass(MarkerLineEntity, [{ + key: "_setupAnimationBindingBlock", + value: function _setupAnimationBindingBlock() { + var _this2 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var vector3 = Type.find("vector3"); // パラメータ名: width + // パラメータ型: number + // 線の太さ + + block.addEntry("width", [number], null, function (value) { + _this2.setLineWidth(value); + }); // パラメータ名: color + // パラメータ型: vector3 + // 色 + + block.addEntry("color", [vector3], null, function (value) { + _this2.setColor(value); + }); // パラメータ名: opacity + // パラメータ型: number + // 不透明度 + + block.addEntry("opacity", [number], null, function (value) { + _this2.setOpacity(value); + }); + } + /** + * @summary 複数の頂点を追加 + * + * @desc + *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式の配列を与える。

+ * + * @param {number[]} points 頂点の配列 + */ + + }, { + key: "addPoints", + value: function addPoints(points) { + var add_size = points.length; + + if (add_size == 0) { + // 追加頂点が無いので変化なし + return; + } // バッファを拡張 + + + var target_size = this._num_floats + add_size; + var buffer_size = this._point_array.length; + + if (target_size > buffer_size) { + var new_buffer = new Float64Array(Math.max(target_size, 2 * buffer_size)); + var old_buffer = this._point_array; + var copy_size = this._num_floats; + + for (var i = 0; i < copy_size; ++i) { + new_buffer[i] = old_buffer[i]; + } + + this._point_array = new_buffer; + } // 頂点追加処理 + + + var buffer = this._point_array; + var base = this._num_floats; + + for (var j = 0; j < add_size; ++j) { + buffer[base + j] = points[j]; + } + + this._num_floats = target_size; // 形状が変化した可能性がある + + this._producer.onChangePoints(); + } + /** + * @private + */ + + }, { + key: "_setupByJson", + value: function _setupByJson(json) { + // json.points + this.addPoints(json.points); // json.line_width + // .color + // .opacity + + if (json.line_width !== undefined) this.setLineWidth(json.line_width); + if (json.color !== undefined) this.setColor(json.color); + if (json.opacity !== undefined) this.setOpacity(json.opacity); + } + }]); + + return MarkerLineEntity; +}(AbstractLineEntity); + +/** + * @summary 太さ付き連続線エンティティ + * @memberof mapray + * @extends mapray.AbstractLineEntity + */ + +var PathEntity = +/*#__PURE__*/ +function (_AbstractLineEntity) { + _inherits(PathEntity, _AbstractLineEntity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function PathEntity(scene, opts) { + var _this; + + _classCallCheck(this, PathEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(PathEntity).call(this, scene, AbstractLineEntity.LineType.PATH, opts)); + _this._point_array = new Float64Array(0); + _this._num_floats = 0; + _this._length_array = new Float64Array(0); + _this._width = 1.0; + _this._color = GeoMath.createVector3([1.0, 1.0, 1.0]); + _this._opacity = 1.0; + _this._lower_length = 0; + _this._upper_length = 0; + + _this._setupAnimationBindingBlock(); // 生成情報から設定 + + + if (opts && opts.json) { + _this._setupByJson(opts.json); + } + + return _this; + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + + _createClass(PathEntity, [{ + key: "_setupAnimationBindingBlock", + value: function _setupAnimationBindingBlock() { + var _this2 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var vector3 = Type.find("vector3"); // パラメータ名: width + // パラメータ型: number + // 線の太さ + + block.addEntry("width", [number], null, function (value) { + _this2.setLineWidth(value); + }); // パラメータ名: color + // パラメータ型: vector3 + // 色 + + block.addEntry("color", [vector3], null, function (value) { + _this2.setColor(value); + }); // パラメータ名: opacity + // パラメータ型: number + // 不透明度 + + block.addEntry("opacity", [number], null, function (value) { + _this2.setOpacity(value); + }); // パラメータ名: lower_length + // パラメータ型: number + // 距離の下限値 + + block.addEntry("lower_length", [number], null, function (value) { + _this2.setLowerLength(value); + }); // パラメータ名: upper_length + // パラメータ型: number + // 距離の上限値 + + block.addEntry("upper_length", [number], null, function (value) { + _this2.setUpperLength(value); + }); + } + /** + * @summary 距離の下限値を設定 + * + * @param {number} lower_length 距離の下限値 + */ + + }, { + key: "setLowerLength", + value: function setLowerLength(lower_length) { + if (this._lower_length !== lower_length) { + this._lower_length = lower_length; + + this._producer.onChangeProperty(); + } + } + /** + * @summary 距離の上限値を設定 + * + * @param {number} upper_length 距離の上限値 + */ + + }, { + key: "setUpperLength", + value: function setUpperLength(upper_length) { + if (this._upper_length !== upper_length) { + this._upper_length = upper_length; + + this._producer.onChangeProperty(); + } + } + /** + * @summary 複数の頂点を追加 + * + * @desc + *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式の配列を与える。

+ * + * @param {number[]} points 頂点の配列 + * @param {number[]} length_array 始点からの距離の配列 + */ + + }, { + key: "addPoints", + value: function addPoints(points, length_array) { + var add_size = points.length; + var add_length_size = length_array.length; + + if (add_size == 0 || add_length_size == 0) { + // 追加頂点が無いので変化なし + return; + } + + var num_length_floats = this._num_floats / 3; // バッファを拡張 + + var target_size = this._num_floats + add_size; + var buffer_size = this._point_array.length; + + if (target_size > buffer_size) { + var new_buffer = new Float64Array(Math.max(target_size, 2 * buffer_size)); + var old_buffer = this._point_array; + var copy_size = this._num_floats; + + for (var i = 0; i < copy_size; ++i) { + new_buffer[i] = old_buffer[i]; + } + + this._point_array = new_buffer; + } // 距離配列バッファを拡張 + + + var target_length_size = num_length_floats + add_length_size; + var buffer_length_size = this._length_array.length; + + if (target_length_size > buffer_length_size) { + var _new_buffer = new Float64Array(Math.max(target_length_size, 2 * buffer_length_size)); + + var _old_buffer = this._length_array; + var _copy_size = num_length_floats; + + for (var _i = 0; _i < _copy_size; ++_i) { + _new_buffer[_i] = _old_buffer[_i]; + } + + this._length_array = _new_buffer; + } // 頂点追加処理 + + + var buffer = this._point_array; + var base = this._num_floats; + + for (var _i2 = 0; _i2 < points.length; ++_i2) { + buffer[base + _i2] = points[_i2]; + } // 距離の配列を追加 + + + var buffer_length = this._length_array; + var base_length = num_length_floats; + + for (var _i3 = 0; _i3 < length_array.length; ++_i3) { + buffer_length[base_length + _i3] = length_array[_i3]; + } + + this._num_floats = target_size; // 形状が変化した可能性がある + + this._producer.onChangePoints(); + } + /** + * @private + */ + + }, { + key: "_setupByJson", + value: function _setupByJson(json) { + // json.points + this.addPoints(json.points.positions, json.points.lengths); // json.line_width + // .color + // .opacity + // .lower_length + // .upper_length + + if (json.line_width !== undefined) this.setLineWidth(json.line_width); + if (json.color !== undefined) this.setColor(json.color); + if (json.opacity !== undefined) this.setOpacity(json.opacity); + if (json.lower_length !== undefined) this.setLowerLength(json.lower_length); + if (json.upper_length !== undefined) this.setUpperLength(json.upper_length); + } + }]); + + return PathEntity; +}(AbstractLineEntity); + +var text_vs_code = "/**\n * テキスト (頂点シェーダ)\n */\n\nattribute vec4 a_position; // 頂点位置 (モデル座標系)\nattribute vec2 a_offset; // 頂点変位 (スクリーン座標系)\nattribute vec2 a_texcoord; // テクスチャ座標\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform vec2 u_sparam; // 画面パラメータ: {2/w, 2/h}\n\nvarying vec2 v_texcoord; // テキストのテクスチャ座標\n\nvoid\nmain()\n{\n gl_Position = u_obj_to_clip * a_position;\n gl_Position.xy += a_offset * u_sparam * gl_Position.w;\n v_texcoord = a_texcoord;\n}"; + +var text_fs_code = "/**\n * テキスト (フラグメントシェーダ)\n */\n\nprecision mediump float;\n\nvarying vec2 v_texcoord; // テクスチャ座標\nuniform sampler2D u_image; // 画像\n\nvoid\nmain()\n{\n gl_FragColor = texture2D( u_image, v_texcoord );\n}"; + +/** + * @summary テキストマテリアル + * @memberof mapray + * @extends mapray.EntityMaterial + * @private + * @see mapray.TextEntity + */ + +var TextMaterial = +/*#__PURE__*/ +function (_EntityMaterial) { + _inherits(TextMaterial, _EntityMaterial); + + /** + * @param {mapray.GLEnv} glenv + */ + function TextMaterial(glenv) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, TextMaterial); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(TextMaterial).call(this, glenv, text_vs_code, options.ridMaterial ? rid_fs_code : text_fs_code)); // 不変パラメータを事前設定 + + _this.bindProgram(); + + _this.setInteger("u_image", TextMaterial.TEXUNIT_IMAGE); + + return _this; + } + /** + * @override + */ + + + _createClass(TextMaterial, [{ + key: "isTranslucent", + value: function isTranslucent(stage, primitive) { + var props = primitive.properties; // If drawing background color, alpha is disable. + + return !props.enable_bg; + } + /** + * @override + */ + + }, { + key: "setParameters", + value: function setParameters(stage, primitive) { + _get(_getPrototypeOf(TextMaterial.prototype), "setParameters", this).call(this, stage, primitive); + + var props = primitive.properties; // mat4 u_obj_to_clip + + this.setObjToClip(stage, primitive); // 画面パラメータ: {2/w, 2/h} + // vec2 u_sparam + + var sparam = TextMaterial._sparam; + sparam[0] = 2 / stage._width; + sparam[1] = 2 / stage._height; + this.setVector2("u_sparam", sparam); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + // テクスチャのバインド + // sampler2D u_image + var image_tex = props["image"]; + this.bindTexture2D(TextMaterial.TEXUNIT_IMAGE, image_tex.handle); + } + } + }]); + + return TextMaterial; +}(EntityMaterial); // クラス定数の定義 + + +{ + TextMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット + // 計算用一時領域 + + TextMaterial._sparam = GeoMath.createVector2f(); +} + +var text_vs_code$1 = "/**\n * テキスト (頂点シェーダ)\n */\n\nattribute vec4 a_position; // 頂点位置 (モデル座標系)\nattribute vec2 a_offset; // 頂点変位 (スクリーン座標系)\nattribute vec2 a_texcoord; // テクスチャ座標\nattribute vec4 a_color; // テキストの色と不透明度\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform vec2 u_sparam; // 画面パラメータ: {2/w, 2/h}\n\nvarying vec2 v_texcoord; // テキストのテクスチャ座標\nvarying vec4 v_color; // テキストの色と不透明度\n\nvoid\nmain()\n{\n gl_Position = u_obj_to_clip * a_position;\n gl_Position.xy += a_offset * u_sparam * gl_Position.w;\n v_texcoord = a_texcoord;\n v_color = a_color;\n}\n"; + +var text_fs_code$1 = "/**\n * テキスト (フラグメントシェーダ)\n */\n\nprecision mediump float;\n\nvarying vec2 v_texcoord; // テキストのテクスチャ座標\nvarying vec4 v_color; // テキストの色と不透明度\n\nuniform sampler2D u_image; // テキスト画像\n\nvoid\nmain()\n{\n float level = texture2D( u_image, v_texcoord ).w; // 輝度\n float alpha = v_color.w * level;\n gl_FragColor = vec4( v_color.xyz * alpha, alpha );\n}\n"; + +/** + * @summary テキストマテリアル + * @memberof mapray + * @extends mapray.EntityMaterial + * @private + * @see mapray.TextEntity + */ + +var SimpleTextMaterial = +/*#__PURE__*/ +function (_EntityMaterial) { + _inherits(SimpleTextMaterial, _EntityMaterial); + + /** + * @param {mapray.GLEnv} glenv + */ + function SimpleTextMaterial(glenv) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, SimpleTextMaterial); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(SimpleTextMaterial).call(this, glenv, text_vs_code$1, options.ridMaterial ? rid_fs_code : text_fs_code$1)); // 不変パラメータを事前設定 + + _this.bindProgram(); + + _this.setInteger("u_image", SimpleTextMaterial.TEXUNIT_IMAGE); + + return _this; + } + /** + * @override + */ + + + _createClass(SimpleTextMaterial, [{ + key: "isTranslucent", + value: function isTranslucent(stage, primitive) { + // アンチエイリアス用のブレンドのため常に半透明 + return true; + } + /** + * @override + */ + + }, { + key: "setParameters", + value: function setParameters(stage, primitive) { + _get(_getPrototypeOf(SimpleTextMaterial.prototype), "setParameters", this).call(this, stage, primitive); + + var props = primitive.properties; // mat4 u_obj_to_clip + + this.setObjToClip(stage, primitive); // 画面パラメータ: {2/w, 2/h} + // vec2 u_sparam + + var sparam = SimpleTextMaterial._sparam; + sparam[0] = 2 / stage._width; + sparam[1] = 2 / stage._height; + this.setVector2("u_sparam", sparam); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + // テクスチャのバインド + // sampler2D u_image + var image_tex = props["image"]; + this.bindTexture2D(SimpleTextMaterial.TEXUNIT_IMAGE, image_tex.handle); + } + } + }]); + + return SimpleTextMaterial; +}(EntityMaterial); // クラス定数の定義 + + +{ + SimpleTextMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット + // 計算用一時領域 + + SimpleTextMaterial._sparam = GeoMath.createVector2f(); +} + +/** + * @summary Utility Class for Color + * @memberof mapray + */ +var Color = +/*#__PURE__*/ +function () { + /** + * @param r {number} The red (0.0 ~ 1.0) + * @param g {number} The green (0.0 ~ 1.0) + * @param b {number} The blue (0.0 ~ 1.0) + * @param a {number} The alpha (0.0 ~ 1.0) + */ + function Color(r, g, b, a) { + _classCallCheck(this, Color); + + this._r = r; + this._g = g; + this._b = b; + this._a = a; + } + /** + * @summary 不透明色を生成 + * @param {mapray.Vector3} + * @return {mapray.Color} + */ + + + _createClass(Color, [{ + key: "toArray", + + /** + * @summary 色配列に変換する + * @desc + *

0から255に正規化。 [R, G, B, A]の順番

+ * + * @return {mapray.Vector4} dst + */ + value: function toArray() { + return this._a === 0 ? [0, 0, 0, 0] : [this.floatToByte(this._r) / this._a, this.floatToByte(this._g) / this._a, this.floatToByte(this._b) / this._a, this._a]; + } + /** + * @summary 色配列に変換する + * @desc + *

0から1に正規化。 [R, G, B, A]の順番

+ * + * @return {mapray.Vector4} dst + */ + + }, { + key: "toVector4", + value: function toVector4() { + return this._a === 0 ? [0, 0, 0, 0] : [this._r / this._a, this._g / this._a, this._b / this._a, this._a]; + } + /** + * @summary RGBA文字列に変換する + * @desc + *

RGBA文字列に変換して文字列を返却

+ * + * @return {mapray.string} + */ + + }, { + key: "toRGBString", + value: function toRGBString() { + var rgba = this.toArray(); + return "rgba(".concat(Math.round(rgba[0]), ",").concat(Math.round(rgba[1]), ",").concat(Math.round(rgba[2]), ",").concat(rgba[3], ")"); + } + /** + * @summary 0~1.0の色値を255までで正規化 + * @desc + *

0から1で正規化された色値を255までに拡張する

+ * + * @return {mapray.string} + */ + + }, { + key: "floatToByte", + value: function floatToByte(value) { + return value === 1.0 ? 255.0 : value * 256.0 | 0; + } + /** + * @summary Red + * @type {number} + * @readonly + */ + + }, { + key: "r", + get: function get() { + return this._r; + } + /** + * @summary Green + * @type {number} + * @readonly + */ + + }, { + key: "g", + get: function get() { + return this._g; + } + /** + * @summary Blue + * @type {number} + * @readonly + */ + + }, { + key: "b", + get: function get() { + return this._b; + } + /** + * @summary Alpha + * @type {number} + * @readonly + */ + + }, { + key: "a", + get: function get() { + return this._a; + } + }], [{ + key: "generateOpacityColor", + value: function generateOpacityColor(rgb) { + return new Color(rgb[0], rgb[1], rgb[2], 1); + } + /** + * @summary 色を代入 + * @desc + *

src を dst に代入する。

+ * @param {mapray.Color} src 代入元 + * @param {mapray.Color} dst 代入先 + * @return {mapray.Color} dst + */ + + }, { + key: "copyColor", + value: function copyColor(src, dst) { + dst._r = src._r; + dst._g = src._g; + dst._b = src._b; + dst._a = src._a; + return dst; + } + /** + * @summary 不透明色を代入 + * @desc + *

src を dst に代入する。

+ * @param {mapray.Vector3} rgb 代入元 + * @param {mapray.Color} dst 代入先 + * @return {mapray.Color} dst + */ + + }, { + key: "setOpacityColor", + value: function setOpacityColor(rgb, dst) { + dst._r = rgb[0]; + dst._g = rgb[1]; + dst._b = rgb[2]; + dst._a = 1; + } + }]); + + return Color; +}(); + +/** + * @summary 点エンティティ + * + * @classdesc + *

{@link mapray.ImageIconEntity} と {@link mapray.PinEntity} + * と {@link mapray.TextEntity} の共通機能を提供するクラスである。

+ * + * @memberof mapray + * @extends mapray.Entity + * @abstract + * @protected + */ + +var AbstractPointEntity = +/*#__PURE__*/ +function (_Entity) { + _inherits(AbstractPointEntity, _Entity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function AbstractPointEntity(scene, opts) { + var _this; + + _classCallCheck(this, AbstractPointEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(AbstractPointEntity).call(this, scene, opts)); // 要素管理 + + _this._entries = []; + return _this; + } + /** + * @summary すべてのEntryのバウンディングを算出 + * + * @override + * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion + */ + + + _createClass(AbstractPointEntity, [{ + key: "getBounds", + value: function getBounds() { + var region = new GeoRegion(); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var entry = _step.value; + region.addPoint(entry._position); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return region; + } + }]); + + return AbstractPointEntity; +}(Entity); + +/** + * @summary テキストエンティティ + * + * @memberof mapray + * @extends mapray.Entity + */ + +var TextEntity = +/*#__PURE__*/ +function (_AbstractPointEntity) { + _inherits(TextEntity, _AbstractPointEntity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function TextEntity(scene, opts) { + var _this; + + _classCallCheck(this, TextEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(TextEntity).call(this, scene, opts)); // テキストの親プロパティ + + _this._text_parent_props = { + font_style: "normal", + font_weight: "normal", + font_size: TextEntity.DEFAULT_FONT_SIZE, + font_family: TextEntity.DEFAULT_FONT_FAMILY, + color: Color.generateOpacityColor(TextEntity.DEFAULT_COLOR), + stroke_color: Color.generateOpacityColor(TextEntity.DEFAULT_STROKE_COLOR), + stroke_width: TextEntity.DEFAULT_STROKE_WIDTH, + bg_color: Color.generateOpacityColor(TextEntity.DEFAULT_BG_COLOR), + enable_stroke: false, + enable_bg: false + }; + + _this._animation.addDescendantUnbinder(function () { + _this._unbindDescendantAnimations(); + }); + + _this._setupAnimationBindingBlock(); // 生成情報から設定 + + + if (opts && opts.json) { + _this._setupByJson(opts.json); + } + + return _this; + } + /** + * @override + */ + + + _createClass(TextEntity, [{ + key: "getPrimitiveProducer", + value: function getPrimitiveProducer() { + return this._primitive_producer; + } + /** + * @override + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode(prev_mode) { + if (this._primitive_producer) { + this._primitive_producer.onChangeAltitudeMode(); + } + } + /** + * EasyBindingBlock.DescendantUnbinder 処理 + * + * @private + */ + + }, { + key: "_unbindDescendantAnimations", + value: function _unbindDescendantAnimations() { + // すべてのエントリーを解除 + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var entry = _step.value; + entry.animation.unbindAllRecursively(); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + }, { + key: "_setupAnimationBindingBlock", + value: function _setupAnimationBindingBlock() { + var _this2 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var string = Type.find("string"); + var vector3 = Type.find("vector3"); // パラメータ名: font_style + // パラメータ型: string + // フォントスタイル + + block.addEntry("font_style", [string], null, function (value) { + _this2.setFontStyle(value); + }); // パラメータ名: font_weight + // パラメータ型: string + // フォントの太さ + + block.addEntry("font_weight", [string], null, function (value) { + _this2.setFontWeight(value); + }); // パラメータ名: font_size + // パラメータ型: number + // フォントの大きさ + + block.addEntry("font_size", [number], null, function (value) { + _this2.setFontSize(value); + }); // パラメータ名: color + // パラメータ型: vector3 + // テキストの色 + + block.addEntry("color", [vector3], null, function (value) { + _this2.setColor(value); + }); // パラメータ名: stroke_color + // パラメータ型: vector3 + // 縁の色 + + block.addEntry("stroke_color", [vector3], null, function (value) { + _this2.setStrokeColor(value); + }); // パラメータ名: stroke_width + // パラメータ型: number + // 縁の線幅 + + block.addEntry("stroke_width", [number], null, function (value) { + _this2.setStrokeLineWidth(value); + }); + } + /** + * @summary フォントスタイルを設定 + * @param {string} style フォントスタイル ("normal" | "italic" | "oblique") + */ + + }, { + key: "setFontStyle", + value: function setFontStyle(style) { + this._setValueProperty("font_style", style); + } + /** + * @summary フォントの太さを設定 + * @param {string} weight フォントの太さ ("normal" | "bold") + */ + + }, { + key: "setFontWeight", + value: function setFontWeight(weight) { + this._setValueProperty("font_weight", weight); + } + /** + * @summary フォントの大きさを設定 + * @param {number} size フォントの大きさ (Pixels) + */ + + }, { + key: "setFontSize", + value: function setFontSize(size) { + this._setValueProperty("font_size", size); + } + /** + * @summary フォントファミリーを設定 + * @param {string} family フォントファミリー + * @see https://developer.mozilla.org/ja/docs/Web/CSS/font-family + */ + + }, { + key: "setFontFamily", + value: function setFontFamily(family) { + this._setValueProperty("font_family", family); + } + /** + * @summary テキストの色を設定 + * @param {mapray.Vector3} color テキストの色 + */ + + }, { + key: "setColor", + value: function setColor(color) { + this._setColorProperty("color", color); + } + /** + * @summary テキスト縁の色を設定 + * @param {mapray.Vector3} color 縁の色 + */ + + }, { + key: "setStrokeColor", + value: function setStrokeColor(color) { + this._setColorProperty("stroke_color", color); + } + /** + * @summary テキスト縁の太さを設定 + * @param {mapray.number} width 縁の線幅 + */ + + }, { + key: "setStrokeLineWidth", + value: function setStrokeLineWidth(width) { + this._setValueProperty("stroke_width", width); + } + /** + * @summary テキスト縁を有効にするかどうか + * @param {boolean} enable trueなら有効 + */ + + }, { + key: "setEnableStroke", + value: function setEnableStroke(enable) { + this._setValueProperty("enable_stroke", enable); + + this._primitive_producer = new PrimitiveProducer$2(this); + } + /** + * @summary テキスト背景の色を設定 + * @param {mapray.Vector3} color テキストの色 + */ + + }, { + key: "setBackgroundColor", + value: function setBackgroundColor(color) { + this._setColorProperty("bg_color", color); + } + /** + * @summary テキスト背景を有効にするかどうか + * @param {boolean} enable trueなら有効 + */ + + }, { + key: "setEnableBackground", + value: function setEnableBackground(enable) { + this._setValueProperty("enable_bg", enable); + + this._primitive_producer = new PrimitiveProducer$2(this); + } + /** + * @summary テキストを追加 + * @param {string} text テキスト + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {string} [props.font_style] フォントスタイル ("normal" | "italic" | "oblique") + * @param {string} [props.font_weight] フォントの太さ ("normal" | "bold") + * @param {number} [props.font_size] フォントの大きさ (Pixels) + * @param {string} [props.font_family] フォントファミリー + * @param {mapray.Color} [props.color] テキストの色 + * @param {mapray.Color} [props.stroke_color] テキスト縁の色 + * @param {number} [props.stroke_width] テキスト縁の幅 + * @param {mapray.Color} [props.bg_color] テキスト背景色 + * @param {boolean} [props.enable_stroke] テキストの縁取りを有効にするか + * @param {string} [props.id] Entryを識別するID + * @return {mapray.TextEntity.Entry} 追加したEntry + */ + + }, { + key: "addText", + value: function addText(text, position, props) { + var entry = new Entry$2(this, text, position, props); + + this._entries.push(entry); + + this._primitive_producer = new PrimitiveProducer$2(this); + + this._primitive_producer.onAddTextEntry(); + + return entry; + } + /** + * @summary 専用マテリアルを取得 + * @private + */ + + }, { + key: "_getTextMaterial", + value: function _getTextMaterial(render_target) { + var scene = this.scene; + + if (render_target === RenderTarget.SCENE) { + if (!scene._TextEntity_text_material) { + // scene にマテリアルをキャッシュ + scene._TextEntity_text_material = new TextMaterial(scene.glenv); + } + + return scene._TextEntity_text_material; + } else if (render_target === RenderTarget.RID) { + if (!scene._TextEntity_text_material_pick) { + // scene にマテリアルをキャッシュ + scene._TextEntity_text_material_pick = new TextMaterial(scene.glenv, { + ridMaterial: true + }); + } + + return scene._TextEntity_text_material_pick; + } + } + /** + * @summary テキストだけを描画する専用マテリアルを取得 + * @private + */ + + }, { + key: "_getSimpleTextMaterial", + value: function _getSimpleTextMaterial(render_target) { + var scene = this.scene; + + if (render_target === RenderTarget.SCENE) { + if (!scene._SimpleTextEntity_text_material) { + // scene にマテリアルをキャッシュ + scene._SimpleTextEntity_text_material = new SimpleTextMaterial(scene.glenv); + } + + return scene._SimpleTextEntity_text_material; + } else if (render_target === RenderTarget.RID) { + if (!scene._SimpleTextEntity_text_material_pick) { + // scene にマテリアルをキャッシュ + scene._SimpleTextEntity_text_material_pick = new SimpleTextMaterial(scene.glenv, { + ridMaterial: true + }); + } + + return scene._SimpleTextEntity_text_material_pick; + } + } + /** + * @private + */ + + }, { + key: "_setValueProperty", + value: function _setValueProperty(name, value) { + var props = this._text_parent_props; + + if (props[name] != value) { + props[name] = value; + + if (this._primitive_producer) { + this._primitive_producer.onChangeParentProperty(); + } + } + } + /** + * @private + */ + + }, { + key: "_setColorProperty", + value: function _setColorProperty(name, value) { + var dst = this._text_parent_props[name]; + + if (dst.r != value[0] || dst.g != value[1] || dst.b != value[2]) { + Color.setOpacityColor(value, dst); + + if (this._primitive_producer) { + this._primitive_producer.onChangeParentProperty(); + } + } + } + /** + * @private + */ + + }, { + key: "_setupByJson", + value: function _setupByJson(json) { + var position = new GeoPoint(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = json.entries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var entry = _step2.value; + position.setFromArray(entry.position); + this.addText(entry.text, position, entry); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + if (json.font_style !== undefined) this.setFontStyle(json.font_style); + if (json.font_weight !== undefined) this.setFontWeight(json.font_weight); + if (json.font_size !== undefined) this.setFontSize(json.font_size); + if (json.font_family !== undefined) this.setFontFamily(json.font_family); + if (json.color !== undefined) this.setColor(json.color); + if (json.stroke_color !== undefined) this.setStrokeColor(json.stroke_color); + if (json.stroke_width !== undefined) this.setStrokeLineWidth(json.stroke_width); + if (json.enable_stroke !== undefined) this.setEnableStroke(json.enable_stroke); + if (json.bg_color !== undefined) this.setBackgroundColor(json.bg_color); + if (json.enable_bg !== undefined) this.setEnableBackground(json.enable_bg); + } + /** + * @private + */ + + }, { + key: "_enableStroke", + value: function _enableStroke() { + return this._text_parent_props["enable_stroke"]; + } + /** + * @summary IDでEntryを取得 + * @param {string} id ID + * @return {mapray.TextEntity.Entry} IDが一致するEntry(無ければundefined) + */ + + }, { + key: "getEntry", + value: function getEntry(id) { + return this._entries.find(function (entry) { + return entry.id === id; + }); + } + }]); + + return TextEntity; +}(AbstractPointEntity); // クラス定数の定義 + + +{ + TextEntity.DEFAULT_FONT_SIZE = 16; + TextEntity.DEFAULT_FONT_FAMILY = "sans-serif"; + TextEntity.DEFAULT_COLOR = [1, 1, 1]; + TextEntity.DEFAULT_STROKE_COLOR = [0.0, 0.0, 0.0]; + TextEntity.DEFAULT_STROKE_WIDTH = 0.48; + TextEntity.DEFAULT_BG_COLOR = [0.3, 0.3, 0.3]; + TextEntity.DEFAULT_TEXT_UPPER = 1.1; + TextEntity.DEFAULT_TEXT_LOWER = 0.38; + TextEntity.SAFETY_PIXEL_MARGIN = 1; + TextEntity.MAX_IMAGE_WIDTH = 4096; +} +/** + * @summary TextEntity の PrimitiveProducer + * + * TODO: relative で標高の変化のたびにテクスチャを生成する必要はないので + * Layout でのテクスチャの生成とメッシュの生成を分離する + * + * @private + */ + +var PrimitiveProducer$2 = +/*#__PURE__*/ +function (_Entity$PrimitiveProd) { + _inherits(PrimitiveProducer, _Entity$PrimitiveProd); + + /** + * @param {mapray.TextEntity} entity + */ + function PrimitiveProducer(entity) { + var _this3; + + _classCallCheck(this, PrimitiveProducer); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PrimitiveProducer).call(this, entity)); + _this3._glenv = entity.scene.glenv; + _this3._dirty = true; // プリミティブの要素 + + _this3._transform = GeoMath.setIdentity(GeoMath.createMatrix()); + _this3._properties = { + enable_bg: false, + image: null // テキスト画像 + + }; // プリミティブ + + var material = null, + pickMaterial = null; + + if (_this3._isSimpleText()) { + material = entity._getSimpleTextMaterial(RenderTarget.SCENE); + pickMaterial = entity._getSimpleTextMaterial(RenderTarget.RID); + } else { + material = entity._getTextMaterial(RenderTarget.SCENE); + pickMaterial = entity._getTextMaterial(RenderTarget.RID); + } + + var primitive = new Primitive(_this3._glenv, null, material, _this3._transform); + primitive.properties = _this3._properties; + _this3._primitive = primitive; + var pickPrimitive = new Primitive(_this3._glenv, null, pickMaterial, _this3._transform); + pickPrimitive.properties = _this3._properties; + _this3._pickPrimitive = pickPrimitive; // プリミティブ配列 + + _this3._primitives = []; + _this3._pickPrimitives = []; + return _this3; + } + /** + * @override + */ + + + _createClass(PrimitiveProducer, [{ + key: "createRegions", + value: function createRegions() { + var region = new EntityRegion(); + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this.entity._entries[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var position = _step3.value.position; + region.addPoint(position); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return [region]; + } + /** + * @override + */ + + }, { + key: "onChangeElevation", + value: function onChangeElevation(regions) { + this._dirty = true; + } + /** + * @override + */ + + }, { + key: "getPrimitives", + value: function getPrimitives(stage) { + this._updatePrimitive(); + + return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives; + } + /** + * @summary 親プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeParentProperty", + value: function onChangeParentProperty() { + this._dirty = true; + } + /** + * @summary 子プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeChildProperty", + value: function onChangeChildProperty() { + this._dirty = true; + } + /** + * @summary 高度モードが変更されたことを通知 + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode() { + this._dirty = true; + } + /** + * @summary テキストが追加されたことを通知 + */ + + }, { + key: "onAddTextEntry", + value: function onAddTextEntry() { + // 変化した可能性がある + this.needToCreateRegions(); + this._dirty = true; + } + /** + * @summary プリミティブの更新 + * + * @desc + * 入力: + * this.entity._entries + * this._dirty + * 出力: + * this._transform + * this._properties.image + * this._primitive.mesh + * this._primitives + * this._dirty + * + * @return {array.} this._primitives + * + * @private + */ + + }, { + key: "_updatePrimitive", + value: function _updatePrimitive() { + if (!this._dirty) { + // 更新する必要はない + return; + } + + this._updateProperties(); + + if (this.entity._entries.length == 0) { + this._primitives = []; + this._pickPrimitives = []; + this._dirty = false; + return; + } // 各エントリーの GOCS 位置を生成 (平坦化配列) + + + var gocs_array = this._createFlatGocsArray(); // プリミティブの更新 + // primitive.transform + + + this._updateTransform(gocs_array); + + var layout = new Layout(this, gocs_array); + + if (!layout.isValid()) { + // 更新に失敗 + this._primitives = []; + this._dirty = false; + return this._primitives; + } // テクスチャ設定 + + + var properties = this._properties; + + if (properties.image) { + properties.image.dispose(); + } + + properties.image = layout.texture; // メッシュ生成 + + var vtype = []; + + if (this._isSimpleText()) { + vtype = [{ + name: "a_position", + size: 3 + }, { + name: "a_offset", + size: 2 + }, { + name: "a_texcoord", + size: 2 + }, { + name: "a_color", + size: 4 + }]; + } else { + vtype = [{ + name: "a_position", + size: 3 + }, { + name: "a_offset", + size: 2 + }, { + name: "a_texcoord", + size: 2 + }]; + } + + var mesh_data = { + vtype: vtype, + vertices: layout.vertices, + indices: layout.indices + }; + var mesh = new Mesh(this._glenv, mesh_data); // メッシュ設定 + // primitive.mesh + + var primitive = this._primitive; + + if (primitive.mesh) { + primitive.mesh.dispose(); + } + + primitive.mesh = mesh; + var pickPrimitive = this._pickPrimitive; + + if (pickPrimitive.mesh) { + pickPrimitive.mesh.dispose(); + } + + pickPrimitive.mesh = mesh; // 更新に成功 + + this._primitives = [primitive]; + this._pickPrimitives = [pickPrimitive]; + this._dirty = false; + } + /** + * @summary プロパティを更新 + * + * @desc + *
+     * 入力:
+     *   this.entity
+     * 出力:
+     *   this._properties
+     * 
+ * + * @private + */ + + }, { + key: "_updateProperties", + value: function _updateProperties() { + var entity = this.entity; + var props = this._properties; + props.enable_bg = entity._text_parent_props.enable_bg; + } + /** + * @summary プリミティブの更新 + * + * @desc + * 条件: + * this.entity._entries.length > 0 + * 入力: + * this.entity._entries.length + * 出力: + * this._transform + * + * @param {number[]} gocs_array GOCS 平坦化配列 + * + * @private + */ + + }, { + key: "_updateTransform", + value: function _updateTransform(gocs_array) { + var num_entries = this.entity._entries.length; + var xsum = 0; + var ysum = 0; + var zsum = 0; + + for (var i = 0; i < num_entries; ++i) { + var ibase = 3 * i; + xsum += gocs_array[ibase]; + ysum += gocs_array[ibase + 1]; + zsum += gocs_array[ibase + 2]; + } // 変換行列の更新 + + + var transform = this._transform; + transform[12] = xsum / num_entries; + transform[13] = ysum / num_entries; + transform[14] = zsum / num_entries; + } + /** + * @summary GOCS 平坦化配列を取得 + * + * 入力: this.entity._entries + * + * @return {number[]} GOCS 平坦化配列 + * @private + */ + + }, { + key: "_createFlatGocsArray", + value: function _createFlatGocsArray() { + var num_points = this.entity._entries.length; + return GeoPoint.toGocsArray(this._getFlatGeoPoints_with_Absolute(), num_points, new Float64Array(3 * num_points)); + } + /** + * @summary GeoPoint 平坦化配列を取得 (絶対高度) + * + * 入力: this.entity._entries + * + * @return {number[]} GeoPoint 平坦化配列 + * @private + */ + + }, { + key: "_getFlatGeoPoints_with_Absolute", + value: function _getFlatGeoPoints_with_Absolute() { + var owner = this.entity; + var entries = owner._entries; + var num_points = entries.length; + var flat_array = new Float64Array(3 * num_points); // flat_array[] に経度要素と緯度要素を設定 + + for (var i = 0; i < num_points; ++i) { + var pos = entries[i].position; + flat_array[3 * i] = pos.longitude; + flat_array[3 * i + 1] = pos.latitude; + } + + switch (owner.altitude_mode) { + case AltitudeMode.RELATIVE: + case AltitudeMode.CLAMP: + // flat_array[] の高度要素に現在の標高を設定 + owner.scene.viewer.getExistingElevations(num_points, flat_array, 0, 3, flat_array, 2, 3); + + if (owner.altitude_mode === AltitudeMode.RELATIVE) { + // flat_array[] の高度要素に相対高度を加える + for (var _i = 0; _i < num_points; ++_i) { + flat_array[3 * _i + 2] += entries[_i].position.altitude; + } + } + + break; + + default: + // AltitudeMode.ABSOLUTE + // flat_array[] の高度要素に絶対高度を設定 + for (var _i2 = 0; _i2 < num_points; ++_i2) { + flat_array[3 * _i2 + 2] = entries[_i2].position.altitude; + } + + break; + } + + return flat_array; + } + /** + * @summary シンプルテキストモードかどうかを確認 + * + * + * @return {boolean} シンプルテキストモードならtrue. + * @private + */ + + }, { + key: "_isSimpleText", + value: function _isSimpleText() { + var entity = this.entity; + var enable = true; // check enable bg color or stroke; + + if (entity._text_parent_props.enable_bg || entity._text_parent_props.enable_stroke) { + enable = false; + } // check enable stroke + + + var i = 0; + + while (enable && entity._entries.length > i) { + var entry = entity._entries[i]; + enable = !entry.enable_stroke; + i++; + } + + return enable; + } + }]); + + return PrimitiveProducer; +}(Entity.PrimitiveProducer); +/** + * @summary テキスト要素 + * @hideconstructor + * @memberof mapray.TextEntity + * @public + */ + + +var Entry$2 = +/*#__PURE__*/ +function () { + /** + * @param {mapray.TextEntity} owner 所有者 + * @param {string} text テキスト + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {string} [props.font_style] フォントスタイル ("normal" | "italic" | "oblique") + * @param {string} [props.font_weight] フォントの太さ ("normal" | "bold") + * @param {number} [props.font_size] フォントの大きさ (Pixels) + * @param {string} [props.font_family] フォントファミリー + * @param {mapray.Color} [props.color] テキストの色 + * @param {mapray.Color} [props.stroke_color] テキスト縁の色 + * @param {number} [props.stroke_width] テキスト縁の幅 + * @param {number} [props.enable_stroke] テキストの縁取りを有効にするか + * @param {string} [props.id] Entryを識別するID + */ + function Entry(owner, text, position, props) { + _classCallCheck(this, Entry); + + this._owner = owner; + this._text = text; + this._position = position.clone(); // animation.BindingBlock + + this._animation = new EasyBindingBlock(); + + this._setupAnimationBindingBlock(); + + this._props = Object.assign({}, props); // props の複製 + + this._copyColorProperty("color"); // deep copy + + + this._copyColorProperty("stroke_color"); // deep copy + + + this._copyColorProperty("bg_color"); // deep copy + + } + /** + * @summary テキスト + * @type {string} + * @readonly + * @package + */ + + + _createClass(Entry, [{ + key: "_setupAnimationBindingBlock", + + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + value: function _setupAnimationBindingBlock() { + var _this4 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var string = Type.find("string"); + var vector3 = Type.find("vector3"); // パラメータ名: position + // パラメータ型: vector3 + // ベクトルの要素が longitude, latitude, altitude 順であると解釈 + + var position_temp = new GeoPoint(); + block.addEntry("position", [vector3], null, function (value) { + position_temp.setFromArray(value); // Vector3 -> GeoPoint + + _this4.setPosition(position_temp); + }); // パラメータ名: font_style + // パラメータ型: string + // フォントスタイル + + block.addEntry("font_style", [string], null, function (value) { + _this4.setFontStyle(value); + }); // パラメータ名: font_weight + // パラメータ型: string + // フォントの太さ + + block.addEntry("font_weight", [string], null, function (value) { + _this4.setFontWeight(value); + }); // パラメータ名: font_size + // パラメータ型: number + // フォントの大きさ + + block.addEntry("font_size", [number], null, function (value) { + _this4.setFontSize(value); + }); // パラメータ名: color + // パラメータ型: vector3 + // テキストの色 + + block.addEntry("color", [vector3], null, function (value) { + _this4.setColor(value); + }); // パラメータ名: stroke_color + // パラメータ型: vector3 + // 縁の色 + + block.addEntry("stroke_color", [vector3], null, function (value) { + _this4.setStrokeColor(value); + }); // パラメータ名: stroke_width + // パラメータ型: number + // 縁の線幅 + + block.addEntry("stroke_width", [number], null, function (value) { + _this4.setStrokeLineWidth(value); + }); // パラメータ名: text + // パラメータ型: string + // テキスト + + block.addEntry("text", [string], null, function (value) { + _this4.setText(value); + }); + } + /** + * @summary テキスト原点位置を設定 + * + * @param {mapray.GeoPoint} position テキスト原点の位置 + */ + + }, { + key: "setPosition", + value: function setPosition(position) { + if (this._position.longitude !== position.longitude || this._position.latitude !== position.latitude || this._position.altitude !== position.altitude) { + // 位置が変更された + this._position.assign(position); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + /** + * @summary フォントスタイルを設定 + * @param {string} style フォントスタイル ("normal" | "italic" | "oblique") + */ + + }, { + key: "setFontStyle", + value: function setFontStyle(style) { + this._setValueProperty("font_style", style); + } + /** + * @summary フォントの太さを設定 + * @param {string} weight フォントの太さ ("normal" | "bold") + */ + + }, { + key: "setFontWeight", + value: function setFontWeight(weight) { + this._setValueProperty("font_weight", weight); + } + /** + * @summary フォントの大きさを設定 + * @param {number} size フォントの大きさ (Pixels) + */ + + }, { + key: "setFontSize", + value: function setFontSize(size) { + this._setValueProperty("font_size", size); + } + /** + * @summary テキストの色を設定 + * @param {mapray.Vector3} color テキストの色 + */ + + }, { + key: "setColor", + value: function setColor(color) { + this._setColorProperty("color", color); + } + /** + * @summary テキスト縁の色を設定 + * @param {mapray.Vector3} color 縁の色 + */ + + }, { + key: "setStrokeColor", + value: function setStrokeColor(color) { + this._setColorProperty("stroke_color", color); + } + /** + * @summary テキスト縁の太さを設定 + * @param {mapray.number} width 縁の線幅 + */ + + }, { + key: "setStrokeLineWidth", + value: function setStrokeLineWidth(width) { + this._setValueProperty("stroke_width", width); + } + /** + * @summary テキスト縁を有効にするかどうか + * @param {boolean} enable trueなら有効 + */ + + }, { + key: "setEnableStroke", + value: function setEnableStroke(enable) { + this._setValueProperty("enable_stroke", enable); + + this._owner._primitive_producer = new PrimitiveProducer$2(this._owner); + } + /** + * @summary テキストを設定 + * @param {string} text テキスト + */ + + }, { + key: "setText", + value: function setText(text) { + if (this._text !== text) { + this._text = text; + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + /** + * @private + */ + + }, { + key: "_copyColorProperty", + value: function _copyColorProperty(name) { + var props = this._props; + + if (props.hasOwnProperty(name)) { + props[name] = Color.generateOpacityColor(props[name]); + } + } + /** + * @private + */ + + }, { + key: "_setValueProperty", + value: function _setValueProperty(name, value) { + var props = this._props; + + if (props[name] != value) { + props[name] = value; + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + /** + * @private + */ + + }, { + key: "_setColorProperty", + value: function _setColorProperty(name, value) { + var dst = this._props[name]; + + if (dst) { + if (dst.r != value[0] || dst.g != value[1] || dst.b != value[2]) { + Color.setOpacityColor(value, dst); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } else { + this._props[name] = Color.generateOpacityColor(value); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + }, { + key: "text", + get: function get() { + return this._text; + } + /** + * @summary 位置 + * @type {mapray.GeoPoint} + * @readonly + * @package + */ + + }, { + key: "position", + get: function get() { + return this._position; + } + /** + * @summary ID + * @type {string} + * @readonly + */ + + }, { + key: "id", + get: function get() { + return this._props.hasOwnProperty("id") ? this._props.id : ""; + } + /** + * @summary フォントサイズ (Pixels) + * @type {number} + * @readonly + * @package + */ + + }, { + key: "size", + get: function get() { + var props = this._props; + var parent = this._owner._text_parent_props; + return props.font_size || parent.font_size; + } + /** + * @summary テキストの色 + * @type {mapray.Vector3} + * @readonly + * @package + */ + + }, { + key: "color", + get: function get() { + var props = this._props; + var parent = this._owner._text_parent_props; + return props.color || parent.color; + } + /** + * @summary フォント + * @type {string} + * @readonly + * @package + * @see https://developer.mozilla.org/ja/docs/Web/CSS/font + */ + + }, { + key: "font", + get: function get() { + var props = this._props; + var parent = this._owner._text_parent_props; + var style = props.font_style || parent.font_style; + var variant = "normal"; + var weight = props.font_weight || parent.font_weight; + var family = props.font_family || parent.font_family; + return style + " " + variant + " " + weight + " " + this.size + "px " + family; + } + /** + * @summary テキスト縁の色 + * @type {mapray.Color} + * @readonly + * @package + */ + + }, { + key: "stroke_color", + get: function get() { + var props = this._props; + var parent = this._owner._text_parent_props; + return props.stroke_color || parent.stroke_color; + } + /** + * @summary 縁の幅 (Pixels) + * @type {number} + * @readonly + * @package + */ + + }, { + key: "stroke_width", + get: function get() { + var props = this._props; + var parent = this._owner._text_parent_props; + return props.stroke_width || parent.stroke_width; + } + /** + * @summary 縁を描画するか + * @type {boolean} + * @readonly + * @package + */ + + }, { + key: "enable_stroke", + get: function get() { + var props = this._props; + var parent = this._owner._text_parent_props; + return props.enable_stroke || parent.enable_stroke; + } + /** + * @summary 背景色 + * @type {mapray.Color} + * @readonly + * @package + */ + + }, { + key: "bg_color", + get: function get() { + var props = this._props; + var parent = this._owner._text_parent_props; + return props.bg_color || parent.bg_color; + } + /** + * @summary 背景描画するか + * @type {boolean} + * @readonly + * @package + */ + + }, { + key: "enable_background", + get: function get() { + // Enable or Disable background can be set by parent. + var parent = this._owner._text_parent_props; + return parent.enable_bg; + } + /** + * @summary アニメーションパラメータ設定 + * + * @type {mapray.animation.BindingBlock} + * @readonly + */ + + }, { + key: "animation", + get: function get() { + return this._animation; + } + }]); + + return Entry; +}(); + +TextEntity.Entry = Entry$2; +/** + * @summary テキスト画像を Canvas 上にレイアウト + * + * @memberof mapray.TextEntity + * @private + */ + +var Layout = +/*#__PURE__*/ +function () { + /** + * @desc + * 入力: + * owner._glenv + * owner.entity._entries + * owner._transform + * + * @param {PrimitiveProducer} owner 所有者 + * @param {number[]} gocs_array GOCS 平坦化配列 + */ + function Layout(owner, gocs_array) { + _classCallCheck(this, Layout); + + this._owner = owner; + this._items = this._createItemList(); + this._is_valid = true; + + var row_layouts = this._createRowLayouts(); + + if (row_layouts.length == 0) { + // 有効なテキストが1つも無い + this._is_valid = false; + return; + } // アイテムの配置の設定とキャンバスサイズの決定 + + + var size = this._setupLocation(row_layouts); + + if (this._isSimpleTextWithAllItems(this._items)) { + this._texture = this._createTextureForSimple(size.width, size.height); + this._vertices = this._createVerticesForSimple(size.width, size.height, gocs_array); + } else { + this._texture = this._createTexture(size.width, size.height); + this._vertices = this._createVertices(size.width, size.height, gocs_array); + } + + this._indices = this._createIndices(); + } + /** + * @summary 有効なオブジェクトか? + * @desc + *

無効のとき、他のメソッドは呼び出せない。

+ * @return {boolean} 有効のとき true, 無効のとき false + */ + + + _createClass(Layout, [{ + key: "isValid", + value: function isValid() { + return this._is_valid; + } + /** + * @summary テクスチャ + * @type {mapray.Texture} + * @readonly + */ + + }, { + key: "_createItemList", + + /** + * @summary レイアウトアイテムのリストを生成 + * @return {array.} + * @private + */ + value: function _createItemList() { + var context = Dom.createCanvasContext(1, 1); + var items = []; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._owner.entity._entries[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var entry = _step4.value; + items.push(new LItem(this, entry, context)); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return items; + } + /** + * @summary RowLayout のリストを生成 + * @return {array.} + * @private + */ + + }, { + key: "_createRowLayouts", + value: function _createRowLayouts() { + // アイテムリストの複製 + var items = [].concat(this._items); // RowLayout 内であまり高さに差が出ないように、アイテムリストを高さで整列 + + items.sort(function (a, b) { + return a.height_pixel - b.height_pixel; + }); // リストを生成 + + var row_layouts = []; + + while (items.length > 0) { + var row_layout = new RowLayout(items); + + if (row_layout.isValid()) { + row_layouts.push(row_layout); + } + } + + return row_layouts; + } + /** + * @summary テクスチャを生成 + * @param {number} width 横幅 + * @param {number} height 高さ + * @return {mapray.Texture} テキストテクスチャ + * @private + */ + + }, { + key: "_createTexture", + value: function _createTexture(width, height) { + var context = Dom.createCanvasContext(width, height); + context.textAlign = "left"; + context.textBaseline = "alphabetic"; + context.fillStyle = "rgba( 255, 255, 255, 1.0 )"; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + + if (item._entry.enable_background) { + item.drawRect(context); + } + + if (item._entry.enable_stroke) { + item.drawStrokeText(context); + } + + item.drawText(context); + } + + var glenv = this._owner._glenv; + var opts = { + usage: Texture.Usage.TEXT + }; + return new Texture(glenv, context.canvas, opts); + } + /** + * @summary 頂点配列を生成 + * + * @param {number} width 横幅 + * @param {number} height 高さ + * @param {number[]} gocs_array GOCS 平坦化配列 + * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...] + * + * @private + */ + + }, { + key: "_createVertices", + value: function _createVertices(width, height, gocs_array) { + var vertices = []; // テキスト集合の原点 (GOCS) + + var transform = this._owner._transform; + var xo = transform[12]; + var yo = transform[13]; + var zo = transform[14]; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; // テキストの位置 (モデル座標系) + + var ibase = 3 * i; + var xm = gocs_array[ibase] - xo; + var ym = gocs_array[ibase + 1] - yo; + var zm = gocs_array[ibase + 2] - zo; // ベースライン左端 (キャンバス座標系) + + var xc = item.pos_x; + var yc = item.pos_y; + var upper = item.upper; + var lower = item.lower; + var xsize = item.width; + var xn = 1 / width; + var yn = 1 / height; // 左下 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-xsize / 2, -lower); // a_offset + + vertices.push(xc * xn, 1 - (yc + lower) * yn); // a_texcoord + // 右下 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(xsize / 2, -lower); // a_offset + + vertices.push((xc + xsize) * xn, 1 - (yc + lower) * yn); // a_texcoord + // 左上 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-xsize / 2, upper); // a_offset + + vertices.push(xc * xn, 1 - (yc - upper) * yn); // a_texcoord + // 右上 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(xsize / 2, upper); // a_offset + + vertices.push((xc + xsize) * xn, 1 - (yc - upper) * yn); // a_texcoord + } + + return vertices; + } + /** + * @summary 単純テキスト用テクスチャを生成 + * @param {number} width 横幅 + * @param {number} height 高さ + * @return {mapray.Texture} テキストテクスチャ + * @private + */ + + }, { + key: "_createTextureForSimple", + value: function _createTextureForSimple(width, height) { + var context = Dom.createCanvasContext(width, height); + context.textAlign = "left"; + context.textBaseline = "alphabetic"; + context.fillStyle = "rgba( 255, 255, 255, 1.0 )"; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + item.drawText(context); + } + + var glenv = this._owner._glenv; + var opts = { + usage: Texture.Usage.SIMPLETEXT + }; + return new Texture(glenv, context.canvas, opts); + } + /** + * @summary 単純テキスト用頂点配列を生成 + * + * @param {number} width 横幅 + * @param {number} height 高さ + * @param {number[]} gocs_array GOCS 平坦化配列 + * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...] + * + * @private + */ + + }, { + key: "_createVerticesForSimple", + value: function _createVerticesForSimple(width, height, gocs_array) { + var vertices = []; // テキスト集合の原点 (GOCS) + + var transform = this._owner._transform; + var xo = transform[12]; + var yo = transform[13]; + var zo = transform[14]; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + var entry = item.entry; // テキストの色 + + var color = entry.color.toVector4(); // テキストの位置 (モデル座標系) + + var ibase = 3 * i; + var xm = gocs_array[ibase] - xo; + var ym = gocs_array[ibase + 1] - yo; + var zm = gocs_array[ibase + 2] - zo; // ベースライン左端 (キャンバス座標系) + + var xc = item.pos_x; + var yc = item.pos_y; + var upper = item.upper; + var lower = item.lower; + var xsize = item.width; + var xn = 1 / width; + var yn = 1 / height; // 左下 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-xsize / 2, -lower); // a_offset + + vertices.push(xc * xn, 1 - (yc + lower) * yn); // a_texcoord + + vertices.push(color[0], color[1], color[2], 1); // a_color + // 右下 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(xsize / 2, -lower); // a_offset + + vertices.push((xc + xsize) * xn, 1 - (yc + lower) * yn); // a_texcoord + + vertices.push(color[0], color[1], color[2], 1); // a_color + // 左上 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-xsize / 2, upper); // a_offset + + vertices.push(xc * xn, 1 - (yc - upper) * yn); // a_texcoord + + vertices.push(color[0], color[1], color[2], 1); // a_color + // 右上 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(xsize / 2, upper); // a_offset + + vertices.push((xc + xsize) * xn, 1 - (yc - upper) * yn); // a_texcoord + + vertices.push(color[0], color[1], color[2], 1); // a_color + } + + return vertices; + } + /** + * @summary インデックス配列を生成 + * @return {array.} インデックス配列 [] + * @private + */ + + }, { + key: "_createIndices", + value: function _createIndices() { + var indices = []; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + var b = 4 * i; + indices.push(b, b + 1, b + 2, b + 2, b + 1, b + 3); + } + + return indices; + } + /** + * @summary アイテムの配置を設定 + * @param {array.} row_layouts + * @return {object} キャンバスサイズ + * @private + */ + + }, { + key: "_setupLocation", + value: function _setupLocation(row_layouts) { + var width = 0; + var height = 0; + height += TextEntity.SAFETY_PIXEL_MARGIN; + + for (var i = 0; i < row_layouts.length; ++i) { + var row_layout = row_layouts[i]; + row_layout.locate(height); + width = Math.max(row_layout.width_assumed, width); + height += row_layout.height_pixel + TextEntity.SAFETY_PIXEL_MARGIN; + } + + return { + width: width, + height: height + }; + } + /** + * @summary シンプルテキストモードかどうか + * @param {mapray.TextEntity.LItem} item + * @return {boolean} シンプルテキストモードならtrue + * @private + */ + + }, { + key: "_isSimpleText", + value: function _isSimpleText(item) { + if (item._entry.enable_background || item._entry.enable_stroke) { + return false; + } + + return true; + } + /** + * @summary シンプルテキストモードかどうか + * @param {array.} items + * @return {boolean} シンプルテキストモードならtrue + * @private + */ + + }, { + key: "_isSimpleTextWithAllItems", + value: function _isSimpleTextWithAllItems(items) { + var enable = true; + var i = 0; + + while (enable && items.length > i) { + var item = items[i]; + enable = this._isSimpleText(item); + i++; + } + + return enable; + } + }, { + key: "texture", + get: function get() { + return this._texture; + } + /** + * @summary 頂点配列 + * @desc + * 条件: + * this._entries.length > 0 + * 入力: + * this._entries + * this._transform + * @type {Float32Array} + * @readonly + */ + + }, { + key: "vertices", + get: function get() { + return this._vertices; + } + /** + * @summary インデックス配列 + * @type {Uint32Array} + * @readonly + */ + + }, { + key: "indices", + get: function get() { + return this._indices; + } + }]); + + return Layout; +}(); +/** + * @summary レイアウト対象 + * @memberof mapray.TextEntity + * @private + */ + + +var LItem = +/*#__PURE__*/ +function () { + /** + * @param {mapray.TextEntity.Layout} layout 所有者 + * @param {mapray.TextEntity.Entry} entry TextEntity エントリ + * @param {CanvasRenderingContext2D} context 測定用コンテキスト + */ + function LItem(layout, entry, context) { + _classCallCheck(this, LItem); + + this._entry = entry; // テキストの基点 + + this._pos_x = 0; // 左端 + + this._pos_y = 0; // ベースライン位置 + // テキストの横幅 + + context.font = entry.font; + this._width = context.measureText(entry.text).width; // テキストの上下範囲 + + this._upper = entry.size * TextEntity.DEFAULT_TEXT_UPPER; + this._lower = entry.size * TextEntity.DEFAULT_TEXT_LOWER; + this._is_canceled = false; + } + /** + * @type {mapray.TextEntity.Entry} + * @readonly + */ + + + _createClass(LItem, [{ + key: "cancel", + + /** + * @summary 取り消し状態に移行 + */ + value: function cancel() { + this._is_canceled = true; + } + /** + * @summary 配置を決定 + * @param {number} x テキスト矩形左辺の X 座標 (キャンバス座標系) + * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系) + */ + + }, { + key: "locate", + value: function locate(x, y) { + this._pos_x = x; + this._pos_y = y + Math.ceil(this._upper); + } + /** + * @summary テキストだけを描画 (stokeやfillRectとは組み合わせ不可) + * @desc + *

context は以下のように設定していること。

+ *
+     *   context.textAlign    = "left";
+     *   context.textBaseline = "alphabetic";
+     *   context.fillStyle    = "rgba( 255, 255, 255, 1.0 )";
+     * 
+ * @param {CanvasRenderingContext2D} context 描画先コンテキスト + */ + + }, { + key: "drawTextOnly", + value: function drawTextOnly(context) { + var entry = this._entry; + context.font = entry.font; + context.fillText(entry.text, this._pos_x, this._pos_y); + } + /** + * @summary テキストを描画 + * @desc + *

context は以下のように設定していること。

+ *
+     *   context.textAlign    = "left";
+     *   context.textBaseline = "alphabetic";
+     *   context.fillStyle    = "rgba( 255, 255, 255, 1.0 )";
+     * 
+ * @param {CanvasRenderingContext2D} context 描画先コンテキスト + */ + + }, { + key: "drawText", + value: function drawText(context) { + var entry = this._entry; + context.font = entry.font; + context.fillStyle = entry.color.toRGBString(); + context.fillText(entry.text, this._pos_x, this._pos_y); + } + /** + * @summary テキストの淵を描画 + * @desc + *

drawTextOnlyとは組み合わせ不可

+ * @param {CanvasRenderingContext2D} context 描画先コンテキスト + */ + + }, { + key: "drawStrokeText", + value: function drawStrokeText(context) { + /* + context.fillText() + .------------. + |',',',',',',| + |',',',',',',| + |',',',',',',| + |',',',',',',| + |',',',',',',| + context.strokeText() + .--------------------. + |',',',',',',',',',',| + |','.------------.,',| + |','|',',',',',',|,',| + |','|','.----.,',|,',| + |','|','| |,',|,',| + |','|','| |,',|,',| + |<--|-->| + a b + b will be overwrite by fillText(); + */ + var entry = this._entry; + context.font = entry.font; + context.strokeStyle = entry.stroke_color.toRGBString(); + context.lineWidth = entry.stroke_width * 2; + context.lineJoin = "round"; + context.strokeText(entry.text, this._pos_x, this._pos_y); + } + /** + * @summary テキストの背景を描画 + * @desc + *

drawTextOnlyとは組み合わせ不可

+ * @param {CanvasRenderingContext2D} context 描画先コンテキスト + */ + + }, { + key: "drawRect", + value: function drawRect(context) { + var entry = this._entry; + context.fillStyle = entry.bg_color.toRGBString(); + context.fillRect(this._pos_x - TextEntity.SAFETY_PIXEL_MARGIN, this._pos_y - this._upper - TextEntity.SAFETY_PIXEL_MARGIN, this.width_pixel + TextEntity.SAFETY_PIXEL_MARGIN, this.height_pixel + TextEntity.SAFETY_PIXEL_MARGIN); + } + }, { + key: "entry", + get: function get() { + return this._entry; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "pos_x", + get: function get() { + return this._pos_x; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "pos_y", + get: function get() { + return this._pos_y; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "width", + get: function get() { + return this._width; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "upper", + get: function get() { + return this._upper; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "lower", + get: function get() { + return this._lower; + } + /** + * キャンバス上でのテキストの横画素数 + * @type {number} + * @readonly + */ + + }, { + key: "width_pixel", + get: function get() { + return Math.ceil(this._width); + } + /** + * キャンバス上でのテキストの縦画素数 + * @type {number} + * @readonly + */ + + }, { + key: "height_pixel", + get: function get() { + return Math.ceil(this._upper) + Math.ceil(this._lower); + } + /** + * 取り消し状態か? + * @type {boolean} + * @readonly + */ + + }, { + key: "is_canceled", + get: function get() { + return this._is_canceled; + } + }]); + + return LItem; +}(); +/** + * @summary 水平レイアウト + * @memberof mapray.TextEntity + * @private + */ + + +var RowLayout = +/*#__PURE__*/ +function () { + /** + * @desc + *

レイアウトされた、またはレイアウトに失敗したアイテムは src_items から削除される。

+ *

レイアウトに失敗したアイテムは取り消し (is_canceled) になる。

+ * @param {array.} src_items アイテムリスト + */ + function RowLayout(src_items) { + _classCallCheck(this, RowLayout); + + var width_assumed_total = 0; + var height_pixel_max = 0; + var row_items = []; + width_assumed_total += TextEntity.SAFETY_PIXEL_MARGIN; // 左マージン + + while (src_items.length > 0) { + var item = src_items.shift(); + var width_assumed = item.width_pixel + TextEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン + + if (width_assumed_total + width_assumed <= TextEntity.MAX_IMAGE_WIDTH) { + // 行にアイテムを追加 + row_items.push(item); + width_assumed_total += width_assumed; + height_pixel_max = Math.max(item.height_pixel, height_pixel_max); + } else { + if (row_items.length == 0) { + // テキストが長すぎて表示できない + item.cancel(); + } else { + // 次の行になるため差し戻して終了 + src_items.unshift(item); + break; + } + } + } + + this._items = row_items; + this._width_assumed = width_assumed_total; + this._height_pixel = height_pixel_max; + } + /** + * @summary 有効なオブジェクトか? + * @desc + *

無効のとき、他のメソッドは呼び出せない。

+ * @return {boolean} 有効のとき true, 無効のとき false + */ + + + _createClass(RowLayout, [{ + key: "isValid", + value: function isValid() { + return this._items.length > 0; + } + /** + * + * @type {array.} + * @readonly + */ + + }, { + key: "locate", + + /** + * @summary レイアウトの配置を決定 + * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系) + */ + value: function locate(y) { + var items = this._items; + var x = 0; + x += TextEntity.SAFETY_PIXEL_MARGIN; // 左マージン + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + item.locate(x, y); + x += item.width_pixel + TextEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン + } + } + }, { + key: "items", + get: function get() { + return this._items; + } + /** + * キャンバス上での行の横占有画素数 + * @type {number} + * @readonly + */ + + }, { + key: "width_assumed", + get: function get() { + return this._width_assumed; + } + /** + * キャンバス上での行の縦画素数 + * @type {number} + * @readonly + */ + + }, { + key: "height_pixel", + get: function get() { + return this._height_pixel; + } + }]); + + return RowLayout; +}(); + +/** + * @summary モデルエンティティ + * @memberof mapray + * @extends mapray.Entity + */ + +var ModelEntity = +/*#__PURE__*/ +function (_Entity) { + _inherits(ModelEntity, _Entity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + * + * @throws Error ModelContainer からモデルが見つからなかった + */ + function ModelEntity(scene, opts) { + var _this; + + _classCallCheck(this, ModelEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(ModelEntity).call(this, scene, opts)); + _this._position = new GeoPoint(0, 0, 0); + _this._rotation = GeoMath.setIdentity(GeoMath.createMatrix()); + _this._scale = GeoMath.createVector3([1, 1, 1]); + _this._primitive_producer = new PrimitiveProducer$3(_assertThisInitialized(_this)); + + _this._setupAnimationBindingBlock(); // アンカーモード + + + _this._anchor_mode = false; + + if (opts && opts.json) { + var json = opts.json; + var refs = opts.refs || {}; + + _this._setupTransform(json); + + _this._setupModelObject(json, refs); + } + + return _this; + } + /** + * @override + * @private + */ + + + _createClass(ModelEntity, [{ + key: "setAnchorMode", + + /** + * @summary アンカーモードを設定。 + * @see {@link mapray.Entity#anchor_mode} + * @param {boolean} anchor_mode + * @private + */ + value: function setAnchorMode(anchor_mode) { + this._anchor_mode = anchor_mode; + } + /** + * @override + */ + + }, { + key: "getPrimitiveProducer", + value: function getPrimitiveProducer() { + return this._primitive_producer; + } + /** + * @override + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode(prev_mode) { + this._primitive_producer.onChangeAltitudeMode(); + } + /** + * @summary bboxを利用して簡易的にバウンディングを算出 + * + * @override + * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion + */ + + }, { + key: "getBounds", + value: function getBounds() { + var bounds = this._primitive_producer.getBounds(); + + var region = new GeoRegion(); + region.addPointsAsArray(bounds); + return region; + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + }, { + key: "_setupAnimationBindingBlock", + value: function _setupAnimationBindingBlock() { + var _this2 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var vector3 = Type.find("vector3"); + var matrix = Type.find("matrix"); // パラメータ名: position + // パラメータ型: vector3 + // ベクトルの要素が longitude, latitude, altitude 順であると解釈 + + var position_temp = new GeoPoint(); + block.addEntry("position", [vector3], null, function (value) { + position_temp.setFromArray(value); // Vector3 -> GeoPoint + + _this2.setPosition(position_temp); + }); // パラメータ名: orientation + // パラメータ型: matrix | vector3 + // 型が matrix のとき MLOCS での回転行列 + // 型が vector3 のとき、要素が heading, tilt, roll 順であると解釈 + + var orientation_temp = new Orientation(); + var orientation_type; + + var orientation_tsolver = function orientation_tsolver(curve) { + orientation_type = AnimUtil.findFirstTypeSupported(curve, [matrix, vector3]); + return orientation_type; + }; + + block.addEntry("orientation", [matrix, vector3], orientation_tsolver, function (value) { + if (orientation_type === matrix) { + _this2._setRotation(value); + } else { + // orientation_type === vector3 + orientation_temp.heading = value[0]; + orientation_temp.tilt = value[1]; + orientation_temp.roll = value[2]; + + _this2.setOrientation(orientation_temp); + } + }); // パラメータ名: scale + // パラメータ型: vector3 | number + // 型が vector3 のときは XYZ 別の倍率 + // 型が number のときは均等倍率 + + var scale_temp = GeoMath.createVector3(); + var scale_type; + + var scale_tsolver = function scale_tsolver(curve) { + scale_type = AnimUtil.findFirstTypeSupported(curve, [vector3, number]); + return scale_type; + }; + + block.addEntry("scale", [vector3, number], scale_tsolver, function (value) { + if (scale_type === vector3) { + _this2.setScale(value); + } else { + // scale_type === number + scale_temp[0] = value; + scale_temp[1] = value; + scale_temp[2] = value; + + _this2.setScale(scale_temp); + } + }); + } + /** + * @summary position, orientation, scale を設定 + * + * @param {object} json 生成情報 + * + * @private + */ + + }, { + key: "_setupTransform", + value: function _setupTransform(json) { + var tr = json.transform; // + // position + + this.setPosition(new GeoPoint().setFromArray(tr.position)); // heading, tilt, roll + + this.setOrientation(new Orientation(tr.heading, tr.tilt, tr.roll)); // scale + + var scale = tr.scale !== undefined ? tr.scale : [1, 1, 1]; // + + if (typeof scale == 'number') { + // スケールをベクトルに正規化 + scale = [scale, scale, scale]; + } + + this.setScale(scale); + } + /** + * @summary モデルを設定 + * + * @param {object} json 生成情報 + * @param {object} refs 参照辞書 + * + * @throws Error + * + * @private + */ + + }, { + key: "_setupModelObject", + value: function _setupModelObject(json, refs) { + var container = refs[json.ref_model]; + + this._primitive_producer.setModelObject(container, json.index); + } + /** + * @summary モデル原点位置を設定 + * + * @param {mapray.GeoPoint} value モデル原点の位置 + */ + + }, { + key: "setPosition", + value: function setPosition(value) { + var op = this._position; // 変更前の位置 + + if (value.longitude != op.longitude || value.latitude != op.latitude || value.altitude != op.altitude) { + // 位置が変更された + this._position.assign(value); + + this._primitive_producer.onChangePosition(); + } + } + /** + * @summary モデルの向きを設定 + * + * @param {mapray.Orientation} value モデルの向き + */ + + }, { + key: "setOrientation", + value: function setOrientation(value) { + value.getTransformMatrix(sameScaleVector3, this._rotation); + } + /** + * @summary モデルのスケールを設定 + * + * @param {mapray.Vector3} value モデルのスケール + */ + + }, { + key: "setScale", + value: function setScale(value) { + GeoMath.copyVector3(value, this._scale); + } + /** + * @summary モデルの回転を設定 + * + * @desc + *

今のところアニメーション専用

+ * + * @param {mapray.Matrix} value 回転行列 + * + * @private + */ + + }, { + key: "_setRotation", + value: function _setRotation(value) { + GeoMath.copyMatrix(value, this._rotation); + } + /** + * @summary モデル位置の標高を取得 + * + * @return {number} 標高値 + * + * @private + */ + + }, { + key: "_getElevation", + value: function _getElevation() { + return this.scene.viewer.getExistingElevation(this._position); + } + }, { + key: "anchor_mode", + get: function get() { + return this._anchor_mode; + } + }]); + + return ModelEntity; +}(Entity); +/** + * @summary ModelEntity の PrimitiveProducer + * + * @private + */ + + +var PrimitiveProducer$3 = +/*#__PURE__*/ +function (_Entity$PrimitiveProd) { + _inherits(PrimitiveProducer, _Entity$PrimitiveProd); + + /** + * @param {mapray.ModelEntity} entity + */ + function PrimitiveProducer(entity) { + var _this3; + + _classCallCheck(this, PrimitiveProducer); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PrimitiveProducer).call(this, entity)); + _this3._primitives = []; // プリミティブ配列 + + _this3._pickPrimitives = []; // プリミティブ配列 + + _this3._ptoe_array = []; // 各プリミティブ座標系からエンティティ座標系への変換行列 + + _this3._abs_position = null; // 絶対高度に変換した位置のキャッシュ (null なら無効) + + return _this3; + } + /** + * @summary モデルを設定 + * + * @param {mapray.ModelContainer} container モデルコンテナ + * @param {number|string} [id] モデル ID + * + * @throws Error + */ + + + _createClass(PrimitiveProducer, [{ + key: "setModelObject", + value: function setModelObject(container, index) { + var primitives = container.createPrimitives(index, { + ridMaterial: false + }); + var pickPrimitives = container.createPrimitives(index, { + ridMaterial: true + }); + + if (primitives) { + this._primitives = primitives; + this._pickPrimitives = pickPrimitives; + this._ptoe_array = primitives.map(function (prim) { + return GeoMath.createMatrix(prim.transform); + }); + } else { + // ModelContainer からモデルが見つからなかった + throw new Error("model is not found in ModelContainer"); + } + } + /** + * @override + */ + + }, { + key: "createRegions", + value: function createRegions() { + var region = new EntityRegion(); + region.addPoint(this.entity._position); + return [region]; + } + /** + * @override + */ + + }, { + key: "onChangeElevation", + value: function onChangeElevation(regions) { + this._abs_position = null; // キャッシュを無効化 + } + /** + * @override + */ + + }, { + key: "getPrimitives", + value: function getPrimitives(stage) { + var entity = this.entity; // this._abs_position を更新 + + this._updateAbsPosition(); + + var mlocs_to_gocs = this._abs_position.getMlocsToGocsMatrix(GeoMath.createMatrix()); + + var entity_to_mlocs = mul_RS(entity._rotation, entity._scale, GeoMath.createMatrix()); + var entity_to_gocs = GeoMath.mul_AA(mlocs_to_gocs, entity_to_mlocs, GeoMath.createMatrix()); // Primitive#transform を設定 + + var primitives = stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives; + var ptoe_array = this._ptoe_array; + + for (var i = 0; i < primitives.length; ++i) { + var prim = primitives[i]; + var ptoe = ptoe_array[i]; // prim.transform = entity_to_gocs * ptoe + + GeoMath.mul_AA(entity_to_gocs, ptoe, prim.transform); + } + + return primitives; + } + /** + * @summary bboxを利用して簡易的にバウンディングを算出 + * + * @return {Float64Array} min_lon,min_lat,min_alt,max_lon,max_lat,max_alt + */ + + }, { + key: "getBounds", + value: function getBounds() { + var entity = this.entity; // this._abs_position を更新 + + this._updateAbsPosition(); + + var mlocs_to_gocs = this._abs_position.getMlocsToGocsMatrix(GeoMath.createMatrix()); + + var entity_to_mlocs = mul_RS(entity._rotation, entity._scale, GeoMath.createMatrix()); + var entity_to_gocs = GeoMath.mul_AA(mlocs_to_gocs, entity_to_mlocs, GeoMath.createMatrix()); // Primitive#transform を設定 + + var primitives = this._primitives; + var ptoe_array = this._ptoe_array; + var min_lon = Number.MAX_VALUE; + var max_lon = -Number.MAX_VALUE; + var min_lat = Number.MAX_VALUE; + var max_lat = -Number.MAX_VALUE; + var min_alt = Number.MAX_VALUE; + var max_alt = -Number.MAX_VALUE; + var transform = new Float64Array(4 * 4); + + for (var i = 0; i < primitives.length; ++i) { + var prim = primitives[i]; + var ptoe = ptoe_array[i]; // prim.transform = entity_to_gocs * ptoe + + GeoMath.mul_AA(entity_to_gocs, ptoe, transform); + var bbox = prim.bbox; + var bbox0_x = bbox[0][0] * transform[0] + bbox[0][1] * transform[4] + bbox[0][2] * transform[8] + transform[12]; + var bbox0_y = bbox[0][0] * transform[1] + bbox[0][1] * transform[5] + bbox[0][2] * transform[9] + transform[13]; + var bbox0_z = bbox[0][0] * transform[2] + bbox[0][1] * transform[6] + bbox[0][2] * transform[10] + transform[14]; + var bbox1_x = bbox[1][0] * transform[0] + bbox[1][1] * transform[4] + bbox[1][2] * transform[8] + transform[12]; + var bbox1_y = bbox[1][0] * transform[1] + bbox[1][1] * transform[5] + bbox[1][2] * transform[9] + transform[13]; + var bbox1_z = bbox[1][0] * transform[2] + bbox[1][1] * transform[6] + bbox[1][2] * transform[10] + transform[14]; + var points0 = new GeoPoint(); + points0.setFromGocs([bbox0_x, bbox0_y, bbox0_z]); + var points1 = new GeoPoint(); + points1.setFromGocs([bbox1_x, bbox1_y, bbox1_z]); // bbox0 + + var lon = points0.longitude; + var lat = points0.latitude; + var alt = points0.altitude; + if (lon < min_lon) min_lon = lon; + if (lon > max_lon) max_lon = lon; + if (lat < min_lat) min_lat = lat; + if (lat > max_lat) max_lat = lat; + if (alt < min_alt) min_alt = alt; + if (alt > max_alt) max_alt = alt; // bbox1 + + lon = points1.longitude; + lat = points1.latitude; + alt = points1.altitude; + if (lon < min_lon) min_lon = lon; + if (lon > max_lon) max_lon = lon; + if (lat < min_lat) min_lat = lat; + if (lat > max_lat) max_lat = lat; + if (alt < min_alt) min_alt = alt; + if (alt > max_alt) max_alt = alt; + } + + var bounds_array = new Float64Array(3 * 2); + bounds_array[0] = min_lon; + bounds_array[1] = min_lat; + bounds_array[2] = min_alt; + bounds_array[3] = max_lon; + bounds_array[4] = max_lat; + bounds_array[5] = max_alt; + return bounds_array; + } + /** + * @summary 高度モードが変更されたときに呼び出される + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode() { + this._abs_position = null; // キャッシュを無効化 + } + /** + * @summary 位置が変更されたときに呼び出される + */ + + }, { + key: "onChangePosition", + value: function onChangePosition() { + this.needToCreateRegions(); + this._abs_position = null; + } + /** + * @summary 絶対高度位置を更新 + * + * 出力: this._abs_position + * + * @private + */ + + }, { + key: "_updateAbsPosition", + value: function _updateAbsPosition() { + if (this._abs_position !== null) { + // キャッシュされている + return; + } + + var entity = this.entity; + this._abs_position = entity._position.clone(); + + switch (entity.altitude_mode) { + case AltitudeMode.RELATIVE: + this._abs_position.altitude += entity._getElevation(); + break; + + case AltitudeMode.CLAMP: + this._abs_position.altitude = entity._getElevation(); + break; + } + } + }]); + + return PrimitiveProducer; +}(Entity.PrimitiveProducer); // 等倍を表すベクトル + + +var sameScaleVector3 = GeoMath.createVector3([1, 1, 1]); +/** + * @summary 回転行列 * 倍率 + * + * @param {mapray.Matrix} rmat 回転行列 + * @param {mapray.Vector3} svec 倍率ベクトル + * @param {mapray.Matrix} dst 結果 + * + * @return {mapray.Matrix} dst + * + * @private + */ + +function mul_RS(rmat, svec, dst) { + var sx = svec[0]; + var sy = svec[1]; + var sz = svec[2]; + dst[0] = rmat[0] * sx; + dst[1] = rmat[1] * sx; + dst[2] = rmat[2] * sx; + dst[3] = 0; + dst[4] = rmat[4] * sy; + dst[5] = rmat[5] * sy; + dst[6] = rmat[6] * sy; + dst[7] = 0; + dst[8] = rmat[8] * sz; + dst[9] = rmat[9] * sz; + dst[10] = rmat[10] * sz; + dst[11] = 0; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 1; + return dst; +} + +var exportTypedArrayStaticMethod$1 = arrayBufferViewCore.exportTypedArrayStaticMethod; // `%TypedArray%.from` method +// https://tc39.github.io/ecma262/#sec-%typedarray%.from + +exportTypedArrayStaticMethod$1('from', typedArrayFrom, typedArrayConstructorsRequireWrappers); + +var polygon_vs_code = "/**\n * 多角形の頂点シェーダ\n */\n\nattribute vec4 a_position; // 位置 (モデル座標系)\nattribute vec3 a_normal; // 法線 (モデル座標系)\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform mat4 u_obj_to_view; // モデル座標系から視点座標系への変換\nuniform bool u_lighting; // 照光の有無\nuniform vec3 u_light_dir; // ライト逆方向 (視点座標系) と強さ\n\nvarying vec3 v_lit_diffuse; // 拡散光ライト\n\n\nvoid\nmain()\n{\n gl_Position = u_obj_to_clip * a_position;\n\n if ( u_lighting ) {\n // 法線 (視点座標系)\n vec3 normal = normalize( vec3( u_obj_to_view * vec4( a_normal, 0.0 ) ) );\n\n // 拡散光の強さ\n v_lit_diffuse = vec3( dot( normal, u_light_dir ) );\n }\n else {\n // 照光なしのときは 1 に固定\n v_lit_diffuse = vec3( 1 );\n }\n}\n"; + +var polygon_fs_code = "/**\n * 多角形のフラグメントシェーダ\n */\n\nprecision mediump float;\n\nvarying vec3 v_lit_diffuse; // 拡散光ライト\n\nuniform vec4 u_color; // 基本色と不透明度\n\n\nvoid\nmain()\n{\n vec3 color = u_color.xyz * v_lit_diffuse;\n float opacity = u_color.w;\n\n gl_FragColor = vec4( color * opacity, opacity );\n}\n"; + +/** + * @summary 多角形分専用マテリアル + * @memberof mapray + * @extends mapray.EntityMaterial + * @private + */ + +var PolygonMaterial = +/*#__PURE__*/ +function (_EntityMaterial) { + _inherits(PolygonMaterial, _EntityMaterial); + + /** + * @param {mapray.GLEnv} glenv + */ + function PolygonMaterial(glenv) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, PolygonMaterial); + + return _possibleConstructorReturn(this, _getPrototypeOf(PolygonMaterial).call(this, glenv, polygon_vs_code, options.ridMaterial ? rid_fs_code : polygon_fs_code)); + } + /** + * @override + */ + + + _createClass(PolygonMaterial, [{ + key: "isTranslucent", + value: function isTranslucent(stage, primitive) { + var props = primitive.properties; + var opacity = props.opacity !== undefined ? props.opacity : PolygonMaterial.DEFAULT_OPACITY; + return opacity < 1.0; + } + /** + * @override + */ + + }, { + key: "setParameters", + value: function setParameters(stage, primitive) { + _get(_getPrototypeOf(PolygonMaterial.prototype), "setParameters", this).call(this, stage, primitive); + + var props = primitive.properties; // 変換行列 + // u_obj_to_clip, u_obj_to_view + + this.setObjToClip(stage, primitive); + this.setObjToView(stage, primitive); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + // 基本色 + // vec4 u_color + var param_color = props.color !== undefined ? props.color : PolygonMaterial.DEFAULT_COLOR; + var param_opacity = props.opacity !== undefined ? props.opacity : PolygonMaterial.DEFAULT_OPACITY; + var color = PolygonMaterial._color; + GeoMath.copyVector3(param_color, color); + color[3] = param_opacity; + this.setVector4("u_color", color); // 照光の有無 + // bool u_lighting + + this.setBoolean("u_lighting", props.lighting); // ライト逆方向 (視点座標系) と強さ + // vec3 u_light_dir + + this.setVector3("u_light_dir", [0, 0, 1]); + } + } + }]); + + return PolygonMaterial; +}(EntityMaterial); // クラス定数の定義 + + +{ + PolygonMaterial.DEFAULT_COLOR = GeoMath.createVector3f([1.0, 1.0, 1.0]); + PolygonMaterial.DEFAULT_OPACITY = 1.0; // 計算用一時領域 + + PolygonMaterial._color = GeoMath.createVector4f(); +} + +/** + * @summary 多角形を三角形に分割 + * + * @classdesc + *

入力した多角形を三角形に分割して結果を返す。

+ *

構築子と addBoundary() でで多角形を入力して、run() メソッドでそれを三角形に分割して返す。

+ * + *

実装のアルゴリズムと用語は基本的にコンピュータ・ジオメトリ (近代科学社) の第3章「多角形の三角形分割」を参考にしている。

+ * + * @memberof mapray + * @private + */ +var Triangulator = +/*#__PURE__*/ +function () { + /** + * @desc + *

points は多角形の頂点の xy 座標の配列である。

+ *

座標系は x 軸が右方向、y 軸が上方向を想定している。

+ * + * @param {number[]} points 頂点配列 + * @param {number} offset 最初の頂点のインデックス (>= 0) + * @param {number} stride 頂点の間隔 (>= 2) + * @param {number} count 頂点数 + */ + function Triangulator(points, offset, stride, count) { + _classCallCheck(this, Triangulator); + + this._points = new Float64Array(2 * count); + this._polygons = new Set(); // 頂点座標を複製 + + var src = offset; + var dst = 0; + + for (var i = 0; i < count; ++i) { + this._points[dst] = points[src]; + this._points[dst + 1] = points[src + 1]; + src += stride; + dst += 2; + } + } + /** + * @summary 多角形の境界を追加 + * + * @desc + *

インデックスの順序は外側境界のときは反時計回り、内側境界のときは時計回りでなければならない。

+ *

内側境界を追加するときは、その外側の境界も追加しなければならない。追加の順序はどちらが先でも良い。

+ *

境界内または複数の境界間でエッジが交差してはならない。同じように頂点が他の頂点またはエッジの上に乗ってはならない。

+ * + * @param {number[]} indices 多角形の境界を表す 3 個以上の頂点インデックス + */ + + + _createClass(Triangulator, [{ + key: "addBoundary", + value: function addBoundary(indices) { + this._polygons.add(Polygon.create(this._points, indices)); + } + /** + * @summary 多角形を三角形に分割して結果を取得 + * + * @desc + *

各々の三角形は 3 つの整数インデックスが反時計回りに並べて表現される。 + * すべての三角形に対して、その表現を連結した配列を出力する。

+ *

インデックスは入力頂点の最初の頂点を 0 とする。

+ * + * @throws Error 想定外の多角形 + * + * @return {Uint32Array} 三角形の頂点インデックスの配列 + */ + + }, { + key: "run", + value: function run() { + // 多角形を y 単調多角形に分割 + this._makeYMonotonePolygons(); + + var triangles = new Uint32Array(3 * this._numTriangles()); + var offset = 0; // 各 y 単調多角形を三角形に分割 + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._polygons[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var polygon = _step.value; + + var temp = this._makeTriangleArray(polygon); + + triangles.set(temp, offset); + offset += temp.length; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + return triangles; + } + /** + * @summary 三角形の数を取得 + * + * @return {number} 三角形の数 + * + * @private + */ + + }, { + key: "_numTriangles", + value: function _numTriangles() { + var count = 0; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this._polygons[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var polygon = _step2.value; + count += polygon.numVertices() - 2; + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + return count; + } + /** + * @summary 多角形を y 単調多角形に分割 + * + * @desc + *

this._polygons を y 軸単調な部分多角形に分割する。

+ * + * @private + */ + + }, { + key: "_makeYMonotonePolygons", + value: function _makeYMonotonePolygons() { + var vertices = this._getYOrderedVertices(); + + var edge_mgr = new EdgeManager(); + var diag_mgr = new DiagonalManager(this._polygons); + + for (var i = 0; i < vertices.length; ++i) { + var vertex = vertices[i]; + + switch (vertex.getVertexType()) { + case "start": + { + var ledge = vertex.getFrontEdge(); + edge_mgr.addEdge(ledge, vertex); + } + break; + + case "end": + { + var _ledge = vertex.getBackEdge(); + + var lhelp = edge_mgr.getHelper(_ledge); + + if (lhelp.getVertexType() == "merge") { + diag_mgr.addDiagonal(vertex, lhelp); + } + + edge_mgr.removeEdge(_ledge); + } + break; + + case "split": + { + var nedge = edge_mgr.findNearestLeftEdge(vertex); + diag_mgr.addDiagonal(vertex, edge_mgr.getHelper(nedge)); + edge_mgr.setHelper(nedge, vertex); + var redge = vertex.getFrontEdge(); + edge_mgr.addEdge(redge, vertex); + } + break; + + case "merge": + { + var _redge = vertex.getBackEdge(); + + var rhelp = edge_mgr.getHelper(_redge); + + if (rhelp.getVertexType() == "merge") { + diag_mgr.addDiagonal(vertex, rhelp); + } + + edge_mgr.removeEdge(_redge); + + var _nedge = edge_mgr.findNearestLeftEdge(vertex); + + var nhelp = edge_mgr.getHelper(_nedge); + + if (nhelp.getVertexType() == "merge") { + diag_mgr.addDiagonal(vertex, nhelp); + } + + edge_mgr.setHelper(_nedge, vertex); + } + break; + + default: + { + // "regular" + if (vertex.isRightInner()) { + // vertex の局所右は多角形の内側 + var uedge = vertex.getBackEdge(); + var uhelp = edge_mgr.getHelper(uedge); + + if (uhelp.getVertexType() == "merge") { + diag_mgr.addDiagonal(vertex, uhelp); + } + + edge_mgr.removeEdge(uedge); + var dedge = vertex.getFrontEdge(); + edge_mgr.addEdge(dedge, vertex); + } else { + // vertex の局所右は多角形の外側 + var _nedge2 = edge_mgr.findNearestLeftEdge(vertex); + + var _nhelp = edge_mgr.getHelper(_nedge2); + + if (_nhelp.getVertexType() == "merge") { + diag_mgr.addDiagonal(vertex, _nhelp); + } + + edge_mgr.setHelper(_nedge2, vertex); + } + } + break; + } + } // this._polygons を対角線により分割 + + + diag_mgr.splitPolygons(); + } + /** + * @summary 上から順の頂点配列を取得 + * + * @return {Vertex[]} Y 位置降順の頂点配列 + * + * @private + */ + + }, { + key: "_getYOrderedVertices", + value: function _getYOrderedVertices() { + var vertices = []; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this._polygons[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var polygon = _step3.value; + Array.prototype.push.apply(vertices, polygon.getVertices()); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + return vertices.sort(function (a, b) { + return Vertex.comparePositionY(b, a); + }); + } + /** + * @summary 多角形を三角形に分割 + * + * @desc + *

y 単調多角形 polygon を 1 つ以上の三角形に分割して返す。

+ *

1 つの三角形は 3 つの整数インデックスで表現され、三角形数の3倍の長さの整数配列を返す。 + * このインデックスは入力頂点配列に対するもので、3 頂点は反時計回りで格納される。

+ * + * @param {Polygon} polygon y 単調多角形 + * + * @return {Uint32Array} 三角形の配列 + * + * @private + */ + + }, { + key: "_makeTriangleArray", + value: function _makeTriangleArray(polygon) { + var ti = 0; + var triangles = new Uint32Array(3 * (polygon.numVertices() - 2)); + var stack = new Stack(); + var vi = 0; + var vertices = polygon.getVertices().sort(function (a, b) { + return Vertex.comparePositionY(b, a); + }); + var is_right = vertices[0].prev === vertices[1]; // スタックのチェインが右側か? + + stack.push(vertices[vi++]); + stack.push(vertices[vi++]); + + while (vi < vertices.length - 1) { + var _vertex = vertices[vi]; + var is_same_chain = is_right ? _vertex === stack.top.prev : _vertex === stack.top.next; + + if (is_same_chain) { + var _v = stack.pop(); + + while (stack.size > 0) { + var v3 = stack.top; + + var _ref = is_right ? [_v, v3] : [v3, _v], + _ref2 = _slicedToArray(_ref, 2), + a = _ref2[0], + b = _ref2[1]; + + if (Vertex.isCCW(_vertex, a, b)) { + // 対角線が多角形の内部 -> 三角形を取り出す + triangles[ti++] = _vertex.id; + triangles[ti++] = a.id; + triangles[ti++] = b.id; + _v = stack.pop(); + } else { + break; + } + } + + stack.push(_v); // 最後にポップした頂点をスタックに戻す + + stack.push(_vertex); + } else { + // すべての頂点をスタックからポップ + var _v2 = stack.pop(); + + while (stack.size > 0) { + // 三角形を取り出す + var _v3 = stack.pop(); + + var _ref3 = is_right ? [_v2, _v3] : [_v3, _v2], + _ref4 = _slicedToArray(_ref3, 2), + _a = _ref4[0], + _b = _ref4[1]; + + triangles[ti++] = _vertex.id; + triangles[ti++] = _a.id; + triangles[ti++] = _b.id; + _v2 = _v3; + } + + stack.push(vertices[vi - 1]); + stack.push(_vertex); // スタックのチェインが左右反転 + + is_right = !is_right; + } + + ++vi; + } // スタックの最初と最後の頂点を除いて、最下点から + // スタック上のすべての頂点への対角線を加える + + + var vertex = vertices[vi]; + var v2 = stack.pop(); + + while (stack.size > 0) { + // 三角形を取り出す + var _v4 = stack.pop(); + + var _ref5 = is_right ? [v2, _v4] : [_v4, v2], + _ref6 = _slicedToArray(_ref5, 2), + _a2 = _ref6[0], + _b2 = _ref6[1]; + + triangles[ti++] = vertex.id; + triangles[ti++] = _a2.id; + triangles[ti++] = _b2.id; + v2 = _v4; + } + + return triangles; + } + }]); + + return Triangulator; +}(); +/** + * @summary 多角形の頂点 + * + * @private + */ + + +var Vertex = +/*#__PURE__*/ +function () { + /** + * @param {number} id 頂点 ID + * @param {number} x x 座標 + * @param {number} y y 座標 + */ + function Vertex(id, x, y) { + _classCallCheck(this, Vertex); + + this.id = id; + this.x = x; + this.y = y; + this.polygon = null; + this.next = null; + this.prev = null; + } + /** + * @summary 複製 + * + * @desc + *

ただし this.polygon, this.next, this.prev には null が設定される。

+ * + * @return {Vertex} this の複製 + */ + + + _createClass(Vertex, [{ + key: "clone", + value: function clone() { + return new Vertex(this.id, this.x, this.y); + } + /** + * @summary 頂点タイプを取得 + * + * @desc + * 以下のタイプの何れかを返す。 + *
+     *   "start"    出発点 (□)
+     *   "end"      最終点 (■)
+     *   "split"    分離点 (▲)
+     *   "merge"    統合点 (▼)
+     *   "regular"  普通点 (●)
+     * 
+ * + * @return {string} 頂点タイプ + */ + + }, { + key: "getVertexType", + value: function getVertexType() { + var prev = this.prev; + var next = this.next; + var cprev = Vertex.comparePositionY(prev, this); + var cnext = Vertex.comparePositionY(next, this); + + if (cprev > 0 && cnext > 0 || cprev < 0 && cnext < 0) { + // 両側の点が上、または両側の点が下にある + // r: (prev -> this) ベクトルに対して左 (反時計回り) に直角なベクトル + var rx = prev.y - this.y; + var ry = this.x - prev.x; // v: (this -> next) ベクトル + + var vx = next.x - this.x; + var vy = next.y - this.y; // dot( r, v ): 負数なら内角が 180 度より大きい + + var dot = rx * vx + ry * vy; + + if (cprev > 0 && cnext > 0) { + // 両側の点が上にある + return dot < 0 ? "merge" : "end"; + } else { + // 両側の点が下にある + return dot < 0 ? "split" : "start"; + } + } else { + // 片方の点が上で片方の点が下 + return "regular"; + } + } + /** + * @summary 前方エッジ + * + * @return {Vertex} 前方エッジの始点 + */ + + }, { + key: "getFrontEdge", + value: function getFrontEdge() { + return this; + } + /** + * @summary 後方エッジ + * + * @return {Vertex} 後方エッジの始点 + */ + + }, { + key: "getBackEdge", + value: function getBackEdge() { + return this.prev; + } + /** + * @summary 頂点の局所右は多角形の内側か? + * + * @desc + *

頂点の局所的な右側は多角形の内側かどうかを返す。

+ *

this は regular タイプの頂点でなければならない。

+ * + * @return {boolean} 内側のとき true, そうでなければ false + */ + + }, { + key: "isRightInner", + value: function isRightInner() { + // 次の点のほうが下のとき、vertex の右が内側 + return Vertex.comparePositionY(this.next, this) < 0; + } + /** + * @summary 点の高さを比較 + * + * @desc + *

v1 の点が v2 の点より低いとき -1, v1 の点が v2 の点より高いとき +1, 高さが同じとき 0 を返す。

+ * + * @param {Vertex} v1 頂点 1 + * @param {Vertex} v2 頂点 2 + * + * @return {number} 比較結果 + */ + + }], [{ + key: "comparePositionY", + value: function comparePositionY(v1, v2) { + if (v1.y < v2.y || v1.y == v2.y && v1.x > v2.x) { + // v1 (<) v2 + return -1; + } else if (v1.y > v2.y || v1.y == v2.y && v1.x < v2.x) { + // v1 (>) v2 + return 1; + } else { + // v1 (=) v2 + return 0; + } + } + /** + * @summary 3 点は反時計回りか? + * + * @param {Vertex} v1 頂点 1 + * @param {Vertex} v2 頂点 2 + * @param {Vertex} v3 頂点 3 + * + * @return {boolean} 反時計回りのとき true, そうでなければ false + */ + + }, { + key: "isCCW", + value: function isCCW(v1, v2, v3) { + // a = v2 - v1 + var ax = v2.x - v1.x; + var ay = v2.y - v1.y; // b = v3 - v1 + + var bx = v3.x - v1.x; + var by = v3.y - v1.y; // det( |a b| ) > 0 + + return ax * by - ay * bx > 0; + } + }]); + + return Vertex; +}(); +/** + * @summary 多角形 + * + * @private + */ + + +var Polygon = +/*#__PURE__*/ +function () { + function Polygon() { + _classCallCheck(this, Polygon); + + this._first = null; + } + /** + * @summary 多角形を生成 + * + * @desc + *

coords は多角形の頂点の xy 座標の配列である。

+ *

座標系は x 軸が右方向、y 軸が上方向を想定している。

+ *

indices での頂点の順序は反時計回りである。

+ * + * @param {number[]} coords 座標配列 + * @param {number[]} indices 多角形の頂点インデックス配列 (indices.length >= 3) + * + * @return {Polygon} Polygon インスタンス + */ + + + _createClass(Polygon, [{ + key: "numVertices", + + /** + * @summary 頂点数を取得 + * + * @return {number} 頂点数 + */ + value: function numVertices() { + var count = 0; + var vertex = this._first; + ++count; + var end = this._first; + + for (vertex = vertex.next; vertex !== end; vertex = vertex.next) { + ++count; + } + + return count; + } + /** + * @summary すべての頂点の配列を取得 + * + * @return {Vertex[]} すべての頂点の配列 + */ + + }, { + key: "getVertices", + value: function getVertices() { + var array = []; + var vertex = this._first; + array.push(vertex); + var end = this._first; + + for (vertex = vertex.next; vertex !== end; vertex = vertex.next) { + array.push(vertex); + } + + return array; + } + /** + * @summary 頂点を更新 + * + * @private + */ + + }, { + key: "_updateVertices", + value: function _updateVertices() { + var vertex = this._first; + vertex.polygon = this; + var end = this._first; + + for (vertex = vertex.next; vertex !== end; vertex = vertex.next) { + vertex.polygon = this; + } + } + }], [{ + key: "create", + value: function create(coords, indices) { + var poly = new Polygon(); + var id = indices[0]; + var base = 2 * id; + var vertex = new Vertex(id, coords[base], coords[base + 1]); + poly._first = vertex; + + for (var i = 1; i < indices.length; ++i) { + var before = vertex; + id = indices[i]; + base = 2 * id; + vertex = new Vertex(id, coords[base], coords[base + 1]); + before.next = vertex; + vertex.prev = before; + } // ここで vertex は最後の頂点 + + + poly._first.prev = vertex; + vertex.next = poly._first; + + poly._updateVertices(); + + return poly; + } + /** + * @summary 多角形を生成 + * + * @param {Vertex} first 最初の頂点 + * + * @return {Polygon} Polygon インスタンス + */ + + }, { + key: "createByVertex", + value: function createByVertex(first) { + var poly = new Polygon(); + poly._first = first; + + poly._updateVertices(); + + return poly; + } + }]); + + return Polygon; +}(); +/** + * @summary 単調多角形に分割するためのエッジ管理 + * + * @classdesc + *

追加されるエッジの局所右は常に多角形の内側になる。

+ * + * @private + */ + + +var EdgeManager = +/*#__PURE__*/ +function () { + /** + */ + function EdgeManager() { + _classCallCheck(this, EdgeManager); + + this._edges = new Map(); + } + /** + * @summary エッジを追加 + * + * @param {Vertex} edge 追加するエッジ + * @param {Vertex} helper 初期ヘルパー頂点 + */ + + + _createClass(EdgeManager, [{ + key: "addEdge", + value: function addEdge(edge, helper) { + this._edges.set(edge, { + helper: helper + }); + } + /** + * @summary エッジを削除 + * + * @param {Vertex} edge 削除するエッジ + */ + + }, { + key: "removeEdge", + value: function removeEdge(edge) { + this._edges["delete"](edge); + } + /** + * @summary エッジにヘルパーを設定 + * + * @param {Vertex} edge 対象エッジ + * @param {Vertex} helper ヘルパー頂点 + */ + + }, { + key: "setHelper", + value: function setHelper(edge, helper) { + this._edges.get(edge).helper = helper; + } + /** + * @summary エッジのヘルパーを取得 + * + * @param {Vertex} edge 対象エッジ + * + * @return {Vertex} ヘルパー頂点 + */ + + }, { + key: "getHelper", + value: function getHelper(edge) { + return this._edges.get(edge).helper; + } + /** + * @summary 頂点の左側で最も近いエッジを検索 + * + * @desc + *

vertex を左に (多角形の内側を) 移動しながら最初に突き当たるエッジを取得する。 + * そのようなエッジが常に存在することが前提になっている。

+ * + *

vertex の局所左は常に多角形の内側になる。

+ * + * @param {Vertex} vertex 対象頂点 + * + * @return {Vertex} エッジ + */ + + }, { + key: "findNearestLeftEdge", + value: function findNearestLeftEdge(vertex) { + // このメソッドが呼び出された時点での前提状態: + // - どちらかの端点が vertex のエッジは存在しない + // - 両端の y 座標が同じエッジは存在しない + // - すべてのエッジは vertex を通る水平線と交差する + // TODO: + // このメソッドは多角形の頂点数 n に対して計算量は最悪 O(n), 平均は不明 + // 最悪の場合、ポリゴン分割全体の計算量が O(n^2) になってしまう + // そのため、このめメソッド単体で最悪 O(log n) または平均 O(log n) 以下にしたい + var nearest_edge; + var min_distance = Number.MAX_VALUE; + var vx = vertex.x; + var vy = vertex.y; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._edges[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var _step4$value = _slicedToArray(_step4.value, 1), + edge = _step4$value[0]; + + // エッジ始点 p + var px = edge.x; + var py = edge.y; // エッジ終点 q + + var qx = edge.next.x; + var qy = edge.next.y; // エッジの x 座標勾配 + + var gx = (qx - px) / (qy - py); // 水平線とエッジの交点の x 座標 + + var rx = px + (vy - py) * gx; // vertex と交点 r との符号付き距離 (正のとき r は vertex の左側) + + var distance = vx - rx; + + if (distance > 0) { + if (distance < min_distance) { + // 近いエッジを更新 + min_distance = distance; + nearest_edge = edge; + } + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + if (nearest_edge === undefined) { + // 想定に反して左のエッジが見つからなかった + throw new Error("Probably a degenerate polygon"); + } + + return nearest_edge; + } + }]); + + return EdgeManager; +}(); +/** + * @summary 対角線 + * + * @private + */ + + +var Diagonal = +/** + * @param {Vertex} v1 対角線の端点1 + * @param {Vertex} v2 対角線の端点2 + */ +function Diagonal(v1, v2) { + _classCallCheck(this, Diagonal); + + this.v1 = v1; + this.v2 = v2; +}; +/** + * @summary 対角線管理 + * + * @private + */ + + +var DiagonalManager = +/*#__PURE__*/ +function () { + /** + * @param {Set.} polygons 多角形集合 + */ + function DiagonalManager(polygons) { + _classCallCheck(this, DiagonalManager); + + this._polygons = polygons; + this._diagonals = []; + this._dmap = new DiagonalMap(); + } + /** + * @brief 対角線を追加 + * + * @param {Vertex} v1 対角線の端点1 + * @param {Vertex} v2 対角線の端点2 + */ + + + _createClass(DiagonalManager, [{ + key: "addDiagonal", + value: function addDiagonal(v1, v2) { + var diagonal = new Diagonal(v1, v2); + + this._diagonals.push(diagonal); + + this._dmap.addDiagonal(diagonal); + } + /** + * @brief すべての多角形を対角線で分割 + */ + + }, { + key: "splitPolygons", + value: function splitPolygons() { + // 対角線の順序をランダムにして、分割方向が偏らないようにする + // これにより頂点数 n に対して計算量 O(n log n) が期待できる + this._shuffleArray(this._diagonals); // 個々の対角線で多角形を分割 + + + while (this._diagonals.length > 0) { + var diagonal = this._diagonals.pop(); + + this._dmap.removeDiagonal(diagonal); + + var v1 = diagonal.v1; + var v2 = diagonal.v2; + + var _this$_splitPolygonHa = this._splitPolygonHalf(v1, v2), + _this$_splitPolygonHa2 = _slicedToArray(_this$_splitPolygonHa, 2), + v1a = _this$_splitPolygonHa2[0], + v2a = _this$_splitPolygonHa2[1]; + + var _this$_splitPolygonHa3 = this._splitPolygonHalf(v2, v1), + _this$_splitPolygonHa4 = _slicedToArray(_this$_splitPolygonHa3, 2), + v2b = _this$_splitPolygonHa4[0], + v1b = _this$_splitPolygonHa4[1]; + + var p1 = v1.polygon; + var p2 = v2.polygon; + + if (p1 === p2) { + // diagonal は多角形 p1 内の対角線 + this._polygons["delete"](p1); + + this._polygons.add(Polygon.createByVertex(v1a)); + + this._polygons.add(Polygon.createByVertex(v1b)); + } else { + // diagonal は多角形 p1, p2 間の対角線 + this._polygons["delete"](p1); + + this._polygons["delete"](p2); + + this._polygons.add(Polygon.createByVertex(v1a)); + } // 対角線の端点を新しく生成された端点に置き換える + + + this._replaceVertexInDiagonals(v1, v1a, v1b); + + this._replaceVertexInDiagonals(v2, v2a, v2b); + } + } + /** + * @summary 多角形分割の半分の処理 + * + * @param {Vertex} sv 開始点 + * @param {Vertex} ev 終了点 + * + * @return {Vertex[]} [新 sv, 新 ev] + * + * @private + */ + + }, { + key: "_splitPolygonHalf", + value: function _splitPolygonHalf(sv, ev) { + var sc = sv.clone(); + var ec = ev.clone(); + sc.prev = sv.prev; + sc.next = ec; + sv.prev.next = sc; + ec.prev = sc; + ec.next = ev.next; + ev.next.prev = ec; + return [sc, ec]; + } + /** + * @summary 対角線の端点の置き換え + * + * @desc + *

端点の1つが vo の対角線のその端点を va または vb に置き換える。

+ *

候補端点 va, vb のうち、置き換えると対角線が多角形の内側になる方を選ぶ。

+ *

一方が内側で、一方が外側になるはず。

+ * + * @param {Vertex} vo 元の端点 + * @param {Vertex} va 候補端点 a + * @param {Vertex} vb 候補端点 b + * + * @private + */ + + }, { + key: "_replaceVertexInDiagonals", + value: function _replaceVertexInDiagonals(vo, va, vb) { + // 一旦 this._dmap から対角線を抜き取って、端点を書き換えてから戻す + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = this._dmap.removeDiagonals(vo)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var diagonal = _step5.value; + // vo の反対側の端点 + var vo_oppo = diagonal.v1 === vo ? diagonal.v2 : diagonal.v1; // 対角線の端点の書き換え + + diagonal.v1 = this._testDiagonal(va, vo_oppo) ? va : vb; + diagonal.v2 = vo_oppo; // 対角線を戻す + + this._dmap.addDiagonal(diagonal); + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + /** + * @summary 対角線テスト + * + *

端点が v1, v2 の線分は多角形の (v1 の) 内側に入るか?

+ * + * @param {Vertex} v1 端点1 + * @param {Vertex} v2 端点2 + * + * @return {boolean} 内側に入るとき true, それ以外のとき false + * + * @private + */ + + }, { + key: "_testDiagonal", + value: function _testDiagonal(v1, v2) { + // a: v1 から順方向のベクトル + var ax = v1.next.x - v1.x; + var ay = v1.next.y - v1.y; // b: v1 から逆方向のベクトル + + var bx = v1.prev.x - v1.x; + var by = v1.prev.y - v1.y; // c: v1 から v2 のベクトル + + var cx = v2.x - v1.x; + var cy = v2.y - v1.y; // cross(a) . c > 0 + + var aflag = ax * cy - cx * ay > 0; // cross(b) . c < 0 + + var bflag = bx * cy - cx * by < 0; // |ax bx| + // |ay by| + + var det = ax * by - bx * ay; + return det >= 0 ? aflag && bflag : aflag || bflag; + } + /** + * @summary 配列の並びをランダム化 + * + * @param {array} array 処理対象の配列 + * + * @private + */ + + }, { + key: "_shuffleArray", + value: function _shuffleArray(array) { + // Fisher-Yates のシャッフル + // TODO: 用途上、再現性のある乱数を使ってもよいし、そのほうが何かあった時に原因をつかみやすい + for (var i = array.length - 1; i > 0; --i) { + var j = Math.floor(Math.random() * (i + 1)); // 0 <= j <= i + // array[i] と array[j] を交換 + + var temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + } + }]); + + return DiagonalManager; +}(); +/** + * @summary 辞書: 対角線頂点 → 対角線リスト + * + * @classdesc + *

対角線の頂点から、その頂点を端点とする対角線の配列を取得する。

+ *

1 つの頂点に対して対角線は最大 3 本なので、追加、削除、検索の計算量は多角形の頂点数 n に対して O(1) である。

+ * + * @memberof DiagonalManager + * @private + */ + + +var DiagonalMap = +/*#__PURE__*/ +function () { + function DiagonalMap() { + _classCallCheck(this, DiagonalMap); + + // 辞書を生成 + // key: Vertex + // value: Diagonal[] + this._map = new Map(); + } + /** + * @summary 対角線を登録 + * + * @param {Diagonal} diagonal 追加する対角線 + */ + + + _createClass(DiagonalMap, [{ + key: "addDiagonal", + value: function addDiagonal(diagonal) { + this._addDiagonalByVertex(diagonal.v1, diagonal); + + this._addDiagonalByVertex(diagonal.v2, diagonal); + } + /** + * @summary 対角線の登録を解除 + * + * @param {Diagonal} diagonal 削除する対角線 + */ + + }, { + key: "removeDiagonal", + value: function removeDiagonal(diagonal) { + this._removeDiagonalByVertex(diagonal.v1, diagonal); + + this._removeDiagonalByVertex(diagonal.v2, diagonal); + } + /** + * @summary vertex を端点とする、すべの対角線の登録を解除 + * + * @param {Vertex} vertex 対角線の端点 + * + * @return {Diagonal[]} 登録を解除された対角線の配列 + */ + + }, { + key: "removeDiagonals", + value: function removeDiagonals(vertex) { + var diagonals = this._map.get(vertex); + + if (diagonals !== undefined) { + // 辞書から対角線を削除 + var cloned = diagonals.slice(); + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = cloned[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var diag = _step6.value; + this.removeDiagonal(diag); + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + + return cloned; + } else { + // 存在しなかった + return []; + } + } + /** + * @summary 対角線を登録 + * + * @param {Vertex} vertex どちらかの端点 + * @param {Diagonal} diagonal 追加する対角線 + * + * @private + */ + + }, { + key: "_addDiagonalByVertex", + value: function _addDiagonalByVertex(vertex, diagonal) { + var array = this._map.get(vertex); + + if (array === undefined) { + // vertex に対する最初の対角線 + this._map.set(vertex, [diagonal]); + } else { + // vertex に対する2つ目以降の対角線 + if (array.indexOf(diagonal) != -1) { + // 対角線は二重登録されないはずが... + throw new Error("Unexpected"); + } + + if (array.length < 1 || array.length > 2) { + // 同一頂点の対角線は最大3本のはずが... + throw new Error("Unexpected"); + } + + array.push(diagonal); + } + } + /** + * @summary 対角線を削除 + * + * @param {Vertex} vertex どちらかの端点 + * @param {Diagonal} diagonal 削除する対角線 + * + * @private + */ + + }, { + key: "_removeDiagonalByVertex", + value: function _removeDiagonalByVertex(vertex, diagonal) { + var array = this._map.get(vertex); + + if (array === undefined) { + // 存在するはずが... + throw new Error("Unexpected"); + } + + var index = array.indexOf(diagonal); + + if (index == -1) { + // 存在するはずが... + throw new Error("Unexpected"); + } // 配列から diagonal を削除 + + + array.splice(index, 1); // 配列が空になったら配列を削除 + + if (array.length == 0) { + this._map["delete"](vertex); + } + } + }]); + + return DiagonalMap; +}(); +/** + * @summary スタック + * + * @private + */ + + +var Stack = +/*#__PURE__*/ +function () { + function Stack() { + _classCallCheck(this, Stack); + + this._array = new Array(); + } + + _createClass(Stack, [{ + key: "push", + value: function push(item) { + this._array.push(item); + } + }, { + key: "pop", + value: function pop() { + return this._array.pop(); + } + }, { + key: "size", + get: function get() { + return this._array.length; + } + }, { + key: "top", + get: function get() { + var a = this._array; + return a.length > 0 ? a[a.length - 1] : null; + } + }]); + + return Stack; +}(); + +var globalIsFinite = global_1.isFinite; // `Number.isFinite` method +// https://tc39.github.io/ecma262/#sec-number.isfinite + +var numberIsFinite = Number.isFinite || function isFinite(it) { + return typeof it == 'number' && globalIsFinite(it); +}; + +// https://tc39.github.io/ecma262/#sec-number.isfinite + +_export({ + target: 'Number', + stat: true +}, { + isFinite: numberIsFinite +}); + +/** + * @summary 凸多角形 + * + * @memberof mapray + * + * @private + */ +var ConvexPolygon = +/*#__PURE__*/ +function () { + /** + *

3 点またはそれ以上の頂点座標を反時計回りで指定する。

+ * + * @param {iterable.} coords 頂点座標の並び x0, y0, x1, y1, ... + */ + function ConvexPolygon(coords) { + _classCallCheck(this, ConvexPolygon); + + this._vertices = Float64Array.from(coords); + this._num_vertices = this._vertices.length / 2; + } + /** + * @summary 凸多角形の頂点数 + * + * @type {number} + * + * @readonly + */ + + + _createClass(ConvexPolygon, [{ + key: "isValid", + + /** + * @summary 妥当性を検査 + * + * @desc + *

this が妥当な凸多角形かどうかを確かめる。

+ * + * @return {boolean} this が妥当なとき true, それ以外のとき false + */ + value: function isValid() { + if (this._num_vertices < 3) { + // 3 頂点未満の多角形は非対応 + return false; + } // 座標が有効な数値であることをチェック + + + for (var i = 0; i < this._num_vertices; ++i) { + var x = this._vertices[2 * i]; + var y = this._vertices[2 * i + 1]; + + if (!Number.isFinite(x) || !Number.isFinite(y)) { + // 有効な数値ではない座標が含まれる + return false; + } + } // 長さ 0 の稜線が無いことをチェック + + + for (var ei = 0; ei < this._num_vertices; ++ei) { + var si = ei != 0 ? ei - 1 : this._num_vertices - 1; + var sx = this._vertices[2 * si]; + var sy = this._vertices[2 * si + 1]; + var ex = this._vertices[2 * ei]; + var ey = this._vertices[2 * ei + 1]; + + if (sx == ex && sy == ey) { + // 同一位置の隣接頂点が含まれる + return false; + } + } // 内角が 0 でない、または 180 度より大きくないことをチェック + + + for (var oi = 0; oi < this._num_vertices; ++oi) { + var ox = this._vertices[2 * oi]; + var oy = this._vertices[2 * oi + 1]; // 前方への方向ベクトル + + var fi = oi == this._num_vertices - 1 ? 0 : oi + 1; + var fx = this._vertices[2 * fi] - ox; + var fy = this._vertices[2 * fi + 1] - oy; // 後方への方向ベクトル + + var bi = oi == 0 ? this._num_vertices - 1 : oi - 1; + var bx = this._vertices[2 * bi] - ox; + var by = this._vertices[2 * bi + 1] - oy; // 面積と内積 + + var det = fx * by - bx * fy; + var dot = fx * bx + fy * by; + + if (det < 0 || det == 0 && dot > 0) { + // 内角 θ は 0 < θ <= 180 ではない + return false; + } + } + + return true; + } + /** + * @summary 交差凸多角形を取得 + * + * @desc + *

凸多角形 this と凸多角形 polygon が交差すれば、交差部分の凸多角形を返す。

+ *

this と polygon が交差しないときは null を返す。

+ *

this が polygon を包含するときは polygon を返す可能性がある。

+ * + * @param {ConvexPolygon} polygon 凸多角形 + * + * @return {?ConvexPolygon} 交差凸多角形、ただし交差しないときは null + * + * @throws Error 凸多角形の切り取りに失敗 + */ + + }, { + key: "getIntersection", + value: function getIntersection(polygon) { + try { + return this._clip_by_polygon(polygon); + } catch (e) { + throw new Error("ConvexPolygon#getIntersection failed"); + } + } + /** + * @summary 凸多角形同士に交差があるかどうか? + * + * @desc + *

凸多角形 this と凸多角形 polygon が交差するかどうかを返す。

+ * + * @param {ConvexPolygon} polygon 凸多角形 + * + * @return {boolean} 交差するとき true, 交差しないとき false + * + * @throws Error 交差の確認に失敗 + */ + + }, { + key: "hasIntersection", + value: function hasIntersection(polygon) { + try { + return this._clip_by_polygon(polygon) !== null; + } catch (e) { + throw new Error("ConvexPolygon#hasIntersection failed"); + } + } + /** + * @summary 凸多角形を包含するか? + * + * @desc + *

凸多角形 this は凸多角形 polygon を包含するかどうかを返す。

+ * + * @param {ConvexPolygon} polygon 凸多角形 + * + * @return {boolean} this が polygon を包含するとき true, それ以外は false + */ + + }, { + key: "includes", + value: function includes(polygon) { + for (var ei = 0; ei < this._num_vertices; ++ei) { + var si = ei != 0 ? ei - 1 : this._num_vertices - 1; // 直線上の 1 点 + + var px = this._vertices[2 * si]; + var py = this._vertices[2 * si + 1]; // 直線の内側方向 + + var nx = py - this._vertices[2 * ei + 1]; + var ny = this._vertices[2 * ei] - px; // 判定数値 + + var dval = px * nx + py * ny; // this の si-ei 稜線の + + for (var i = 0; i < polygon._num_vertices; ++i) { + // polygon の 1 点 + var qx = polygon._vertices[2 * i]; + var qy = polygon._vertices[2 * i + 1]; + + if (qx * nx + qy * ny < dval) { + // polygon の 1 点が this の外側 + // polygon は this の完全に内側ではない + return false; + } + } + } // polygon は this の完全に内側である + + + return true; + } + /** + * @summary 凸多角形により凸多角形を切り取る + * + * @desc + *

凸多角形 this により凸多角形 polygon を切り取った凸多角形を返す。

+ *

this が polygon を包含するときは polygon を返す。

+ *

this と polygon が交差しないときは null を返す。

+ * + * @param {ConvexPolygon} polygon 凸多角形 + * + * @return {?ConvexPolygon} 凸多角形または null + * + * @throws Error 凸多角形の切り取りに失敗 + * + * @private + */ + + }, { + key: "_clip_by_polygon", + value: function _clip_by_polygon(polygon) { + var current = polygon; + + for (var ei = 0; ei < this._num_vertices; ++ei) { + var si = ei != 0 ? ei - 1 : this._num_vertices - 1; // 直線上の 1 点 + + var px = this._vertices[2 * si]; + var py = this._vertices[2 * si + 1]; // 直線の内側方向 + + var nx = py - this._vertices[2 * ei + 1]; + var ny = this._vertices[2 * ei] - px; // 判定数値 + + var dval = px * nx + py * ny; // 半空間による切り取り + + current = current._clip_by_halfspace(nx, ny, dval); + + if (current === null) { + // this と polygon は交差しない + break; + } + } + + return current; + } + /** + * @summary 半空間により凸多角形を切り取る + * + * @desc + *

半空間により凸多角形 this を切り取ったり、その凸多角形を返す。

+ *

半空間が this を内包するときは this を返す。

+ *

半空間と this が交差しないときは null を返す。

+ * + * @param {number} nx 半空間の内側方向の x 座標 + * @param {number} ny 半空間の内側方向の y 座標 + * @param {number} dval 判定用数値 + * + * @return {?ConvexPolygon} 凸多角形または null + * + * @throws Error 半空間による切り取りに失敗 + * + * @private + */ + + }, { + key: "_clip_by_halfspace", + value: function _clip_by_halfspace(nx, ny, dval) { + // 半空間の境界線からの距離範囲 + var dist_min = Number.MAX_VALUE; + var dist_max = -Number.MAX_VALUE; + + for (var i = 0; i < this._num_vertices; ++i) { + // 頂点座標 + var px = this._vertices[2 * i]; + var py = this._vertices[2 * i + 1]; // dist == 0 半空間の境界線上 + // dist > 0 半空間の内側 + // dist < 0 半空間の外側 + + var dist = px * nx + py * ny - dval; // 最大最小を更新 + + dist_min = Math.min(dist_min, dist); + dist_max = Math.max(dist_max, dist); + } + + if (dist_min >= 0) { + // 半空間は this を内包する + return this; + } + + if (dist_max <= 0) { + // 半空間 と this は交差しない + return null; + } // ここで dist_min < 0 < dist_max なので、半空間の境界線は凸多角形 + // this の内部を通過している (接していない) + + + return this._clip_by_crossed_halfspace(nx, ny, dval); + } + /** + * @summary 半空間により凸多角形を切り取る (一部交差前提) + * + * @desc + *

半空間により凸多角形 this を切り取ったり、その凸多角形を返す。

+ *

このメソッドは凸多角形 this の境界線と半空間の境界線が異なる + * 2 点で交差していることが前提になっている。

+ * + * @param {number} nx 半空間の内側方向の x 座標 + * @param {number} ny 半空間の内側方向の y 座標 + * @param {number} dval 判定用数値 + * + * @return {ConvexPolygon} 凸多角形 + * + * @throws Error 半空間による切り取りに失敗 + * + * @private + */ + + }, { + key: "_clip_by_crossed_halfspace", + value: function _clip_by_crossed_halfspace(nx, ny, dval) { + var _this$_get_cross_edge = this._get_cross_edges_by_crossed_halfspace_boundary(nx, ny, dval), + _this$_get_cross_edge2 = _slicedToArray(_this$_get_cross_edge, 2), + ce0 = _this$_get_cross_edge2[0], + ce1 = _this$_get_cross_edge2[1]; + + var polygon = []; // 最初の頂点 + + polygon.push(ce0.qx); + polygon.push(ce0.qy); // 中間頂点のインデックス + + var first_i = ce0.ei; // 最初の中間頂点 + + var last_i = ce1.ei; // 最後の中間頂点の次 + // 中間の頂点 + + for (var i = first_i; i != last_i; i = (i + 1) % this._num_vertices) { + polygon.push(this._vertices[2 * i]); + polygon.push(this._vertices[2 * i + 1]); + } // 最後の頂点 + + + polygon.push(ce1.qx); + polygon.push(ce1.qy); + return new ConvexPolygon(polygon); + } + /** + * @summary 半空間境界線と交差する2稜線のデータを取得 (2点交差前提) + * + * @desc + *

2要素の配列を返す。

+ *

最初の要素は切り取りにより前方が残される稜線のデータである。

+ *

次の要素は切り取りにより後方が残される稜線のデータである。

+ * + *

配列の各要素のオブジェクトプロパティは次のようになる。

+ *
+     *   ei: 境界線と交差した稜線の終点インデックス
+     *   qx: 境界線と稜線が交差した位置の x 座標
+     *   qy: 境界線と稜線が交差した位置の y 座標
+     * 
+ * + * @param {number} nx 半空間の内側方向の x 座標 + * @param {number} ny 半空間の内側方向の y 座標 + * @param {number} dval 判定用数値 + * + * @return {object[]} 2稜線の交差データ + * + * @throws Error 2点の交差が見つからなかった + * + * @private + */ + + }, { + key: "_get_cross_edges_by_crossed_halfspace_boundary", + value: function _get_cross_edges_by_crossed_halfspace_boundary(nx, ny, dval) { + var cross_edges = new Array(2); + + for (var si = 0, ce_count = 0; ce_count < 2; ++si) { + if (si == this._num_vertices) { + // 妥当でない凸多角形、数値計算誤差、非数値の混入などで + // 2点の交差が見つからず、無限ループになる可能性がある + // それを避けるため、すべての稜線を調べ終わったら例外で + // 強制的に終了する + throw new Error("cross edges could not be found"); + } + + var ei = (si + 1) % this._num_vertices; // 稜線の始点位置 + + var sx = this._vertices[2 * si]; + var sy = this._vertices[2 * si + 1]; // 稜線の終点位置 + + var ex = this._vertices[2 * ei]; + var ey = this._vertices[2 * ei + 1]; // 境界線からの距離 + + var sd = sx * nx + sy * ny - dval; + var ed = ex * nx + ey * ny - dval; // 半空間境界線と si-ei 稜線の交差があればデータを追加 + + if (sd <= 0 && 0 < ed || ed <= 0 && 0 < sd) { + var t = sd / (sd - ed); + var qx = sx + (ex - sx) * t; + var qy = sy + (ey - sy) * t; + cross_edges[sd < ed ? 0 : 1] = { + ei: ei, + qx: qx, + qy: qy + }; + ++ce_count; + } + } + + return cross_edges; + } + }, { + key: "num_vertices", + get: function get() { + return this._num_vertices; + } + /** + * @summary 凸多角形の頂点座標配列 + * + * @desc + *

反時計回りで格納された頂点座標の配列 [x0, y0, x1, y1, ...] を返す。

+ *

返された配列の内容は this に対して変更操作が行われるまで有効である。

+ * + * @type {number[]} + * + * @readonly + */ + + }, { + key: "vertices", + get: function get() { + return this._vertices; + } + /** + * @summary 矩形から凸多角形を生成 + * + * @param {number} x_min x 座標の最小値 + * @param {number} y_min y 座標の最小値 + * @param {number} x_max x 座標の最大値 + * @param {number} y_max y 座標の最大値 + * + * @return {mapray.ConvexPolygon} 凸多角形 + */ + + }], [{ + key: "createByRectangle", + value: function createByRectangle(x_min, y_min, x_max, y_max) { + // 入力座標配列 + var coords = [x_min, y_min, x_max, y_min, x_max, y_max, x_min, y_max]; // 凸多角形を生成 + + return new ConvexPolygon(coords); + } + }]); + + return ConvexPolygon; +}(); + +/** + * @summary 多角形エンティティ + * @memberof mapray + * @extends mapray.Entity + */ + +var PolygonEntity = +/*#__PURE__*/ +function (_Entity) { + _inherits(PolygonEntity, _Entity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function PolygonEntity(scene, opts) { + var _this; + + _classCallCheck(this, PolygonEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(PolygonEntity).call(this, scene, opts)); + _this._extruded_height = 0.0; + _this._color = GeoMath.createVector3([1, 1, 1]); + _this._opacity = 1.0; // 頂点管理 + + _this._boundaries = []; // Boundary のリスト + + _this._position = null; // 中央付近の GeoPoint + // this._producer + // this._is_flake_mode + + if (_this.altitude_mode === AltitudeMode.CLAMP) { + _this._producer = new FlakePrimitiveProducer$2(_assertThisInitialized(_this)); + _this._is_flake_mode = true; + } else { + _this._producer = new PrimitiveProducer$4(_assertThisInitialized(_this)); + _this._is_flake_mode = false; + } + + _this._setupAnimationBindingBlock(); // 生成情報から設定 + + + if (opts && opts.json) { + _this._setupByJson(opts.json); + } + + return _this; + } + /** + * @summary 押し出し量(0より大きい値) + * @type {number} + */ + + + _createClass(PolygonEntity, [{ + key: "getPrimitiveProducer", + + /** + * @override + */ + value: function getPrimitiveProducer() { + return !this._is_flake_mode ? this._producer : null; + } + /** + * @override + */ + + }, { + key: "getFlakePrimitiveProducer", + value: function getFlakePrimitiveProducer() { + return this._is_flake_mode ? this._producer : null; + } + /** + * @override + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode(prev_mode) { + if (this.altitude_mode === AltitudeMode.CLAMP) { + this._producer = new FlakePrimitiveProducer$2(this); + this._is_flake_mode = true; + } else { + this._producer = new PrimitiveProducer$4(this); + this._is_flake_mode = false; + } + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + }, { + key: "_setupAnimationBindingBlock", + value: function _setupAnimationBindingBlock() { + var _this2 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var vector3 = Type.find("vector3"); // パラメータ名: color + // パラメータ型: vector3 + // 色 + + block.addEntry("color", [vector3], null, function (value) { + _this2.setColor(value); + }); // パラメータ名: opacity + // パラメータ型: number + // 不透明度 + + block.addEntry("opacity", [number], null, function (value) { + _this2.setOpacity(value); + }); // パラメータ名: height + // パラメータ型: number + // 線の太さ + + block.addEntry("height", [number], null, function (value) { + _this2.setExtrudedHeight(value); + }); + } + /** + * @summary 基本色を設定 + * @param {mapray.Vector3} color 基本色 + */ + + }, { + key: "setColor", + value: function setColor(color) { + if (this._color[0] !== color[0] || this._color[1] !== color[1] || this._color[2] !== color[2]) { + GeoMath.copyVector3(color, this._color); + + this._producer.onChangeProperty(); + } + } + /** + * @summary 不透明度を設定 + * @param {number} opacity 不透明度 + */ + + }, { + key: "setOpacity", + value: function setOpacity(opacity) { + if (this._opacity !== opacity) { + this._opacity = opacity; + + this._producer.onChangeProperty(); + } + } + /** + * @summary 押し出し量を設定 + * @param {number} opacity 押し出し量 + */ + + }, { + key: "setExtrudedHeight", + value: function setExtrudedHeight(height) { + this.extruded_height = height; + } + /** + * @summary 外側境界を追加 + * + * @desc + *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式で配列を与える。

+ * + * @param {number[]} points 頂点の配列 + */ + + }, { + key: "addOuterBoundary", + value: function addOuterBoundary(points) { + this._addBoundary(points, false); + } + /** + * @summary 内側境界を追加 + * + * @desc + *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式で配列を与える。

+ * + * @param {number[]} points 頂点の配列 + */ + + }, { + key: "addInnerBoundary", + value: function addInnerBoundary(points) { + this._addBoundary(points, true); + } + /** + * @summary すべての頂点のバウンディングを算出 + * + * @override + * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion + */ + + }, { + key: "getBounds", + value: function getBounds() { + var region = new GeoRegion(); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._boundaries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var bo = _step.value; + region.addPointsAsArray(bo.points); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return region; + } + /** + * @summary 境界を追加 + * + * @desc + *

addOuterBoundary(), addInnerBoundary() の実装である。

+ * + * @param {number[]} points 頂点の配列 + * + * @private + */ + + }, { + key: "_addBoundary", + value: function _addBoundary(points, is_inner) { + this._boundaries.push(new Boundary(points, is_inner)); + + this._position = null; // 境界の変更を通知 + + this._producer.onChangeBoundary(); + } + /** + * @summary 専用マテリアルを取得 + * @private + */ + + }, { + key: "_getMaterial", + value: function _getMaterial(render_target) { + var scene = this.scene; + + if (render_target === RenderTarget.SCENE) { + if (!scene._PolygonEntity_material) { + // scene にマテリアルをキャッシュ + scene._PolygonEntity_material = new PolygonMaterial(scene.glenv); + } + + return scene._PolygonEntity_material; + } else if (render_target === RenderTarget.RID) { + if (!scene._PolygonEntity_material_pick) { + // scene にマテリアルをキャッシュ + scene._PolygonEntity_material_pick = new PolygonMaterial(scene.glenv, { + ridMaterial: true + }); + } + + return scene._PolygonEntity_material_pick; + } + } + /** + * @private + */ + + }, { + key: "_setupByJson", + value: function _setupByJson(json) { + // json.boundaries + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = json.boundaries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var boundary = _step2.value; + + if (boundary.type == "inner") { + this.addInnerBoundary(boundary.points); + } else { + this.addOuterBoundary(boundary.points); + } + } // json.extruded_height + + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + if (json.extruded_height !== undefined) { + this.extruded_height = json.extruded_height; + } // json.color + // .opacity + + + if (json.color !== undefined) GeoMath.copyVector3(json.color, this._color); + if (json.opacity !== undefined) this._opacity = json.opacity; + } + /** + * @summary 中央位置を取得 + * + * @desc + *

中央位置を計算して返す。多角形が存在しないときは null を返す。

+ * + *

中央位置が変化する可能性があるときは this._position にを null を設定すること。

+ * + *
+     * 入力: this._boundaries
+     * 
+ * + * @return {mapray.GeoPoint} 中央位置 (高度は 0) または null + * + * @private + */ + + }, { + key: "_getPosition", + value: function _getPosition() { + if (this._position !== null) { + // キャッシュさている値を返す + return this._position; + } + + if (this._boundaries.length == 0) { + // 多角形が存在しない + return null; + } + + var min_lon = Number.MAX_VALUE; + var max_lon = -Number.MAX_VALUE; + var min_lat = Number.MAX_VALUE; + var max_lat = -Number.MAX_VALUE; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this._boundaries[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var bo = _step3.value; + var count = bo.num_points; + var points = bo.points; + + for (var i = 0; i < count; ++i) { + var lon = points[3 * i]; + var lat = points[3 * i + 1]; + if (lon < min_lon) min_lon = lon; + if (lon > max_lon) max_lon = lon; + if (lat < min_lat) min_lat = lat; + if (lat > max_lat) max_lat = lat; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + this._position = new GeoPoint((min_lon + max_lon) / 2, (min_lat + max_lat) / 2); + return this._position; + } + /** + * @summary すべての境界の頂点数の合計を取得 + * + * @private + */ + + }, { + key: "_countNumPointsOnBoundaries", + value: function _countNumPointsOnBoundaries() { + var num_points = 0; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._boundaries[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var bo = _step4.value; + num_points += bo.num_points; + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return num_points; + } + /** + * @summary 結合された境界点列を取得 + * + * @return {Float64Array} 結合された境界点列 + */ + + }, { + key: "_getCombinedBoundaryPoints", + value: function _getCombinedBoundaryPoints() { + var points = new Float64Array(3 * this._countNumPointsOnBoundaries()); + var offset = 0; + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = this._boundaries[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var bo = _step5.value; + points.set(bo.points, offset); + offset += 3 * bo.num_points; + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + + return points; + } + /** + * @summary 結合された 2D 境界点列を取得 (高度なし) + * + * @return {Float64Array} 結合された 2D 境界点列 + */ + + }, { + key: "_getCombinedBoundary2DPoints", + value: function _getCombinedBoundary2DPoints() { + var dst_points = new Float64Array(2 * this._countNumPointsOnBoundaries()); + var di = 0; + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = this._boundaries[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var bo = _step6.value; + var src_size = 3 * bo.num_points; + var src_points = bo.points; + + for (var si = 0; si < src_size; si += 3) { + dst_points[di++] = src_points[si]; + dst_points[di++] = src_points[si + 1]; + } + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + + return dst_points; + } + /** + * @summary 三角形リストを生成 + * + * @desc + *

this.entity._boundaries を三角形に変換してリストを返す。ただし変換に失敗したときは null を返す。

+ * + * @return {Uint32Array} 三角形リストまたは null + * + * @private + */ + + }, { + key: "_createTriangles", + value: function _createTriangles() { + var src_points = this._getCombinedBoundary2DPoints(); + + var num_src_points = this._countNumPointsOnBoundaries(); // 境界を登録 + + + var triangulator = new Triangulator(src_points, 0, 2, num_src_points); + var index = 0; + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = this._boundaries[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var bo = _step7.value; + var num_indices = bo.num_points; + var indices = new Uint32Array(num_indices); + + for (var i = 0; i < num_indices; ++i) { + indices[i] = index++; + } + + triangulator.addBoundary(indices); + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + + try { + // 変換を実行 + return triangulator.run(); + } catch (e) { + // 変換に失敗 + console.error(e.message); + return null; + } + } + }, { + key: "extruded_height", + set: function set(value) { + var prev = this._extruded_height; + + if (prev !== value) { + this._extruded_height = value; + + this._producer.onChangeExtruded(); + } + } + /** + * @summary 押し出し量 + * @type {number} + */ + , + get: function get() { + return this._extruded_height; + } + }]); + + return PolygonEntity; +}(Entity); +/** + * @summary PolygonEntity の PrimitiveProducer + * + * @private + */ + + +var PrimitiveProducer$4 = +/*#__PURE__*/ +function (_Entity$PrimitiveProd) { + _inherits(PrimitiveProducer, _Entity$PrimitiveProd); + + /** + * @param {mapray.PolygonEntity} entity + */ + function PrimitiveProducer(entity) { + var _this3; + + _classCallCheck(this, PrimitiveProducer); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PrimitiveProducer).call(this, entity)); + _this3._status = Status$3.INVALID; + _this3._triangles = null; // 三角形リスト (Uint32Array) + // プリミティブの要素 + + _this3._transform = GeoMath.setIdentity(GeoMath.createMatrix()); + _this3._pivot = GeoMath.createVector3(); + _this3._bbox = [GeoMath.createVector3(), GeoMath.createVector3()]; + _this3._properties = { + color: GeoMath.createVector3f(), + opacity: 1.0, + lighting: false + }; // プリミティブ + + var primitive = new Primitive(entity.glenv, null, entity._getMaterial(RenderTarget.SCENE), _this3._transform); + primitive.pivot = _this3._pivot; + primitive.bbox = _this3._bbox; + primitive.properties = _this3._properties; + _this3._primitive = primitive; + var pickPrimitive = new Primitive(entity.glenv, null, entity._getMaterial(RenderTarget.RID), _this3._transform); + pickPrimitive.pivot = _this3._pivot; + pickPrimitive.bbox = _this3._bbox; + pickPrimitive.properties = _this3._properties; + _this3._pickPrimitive = pickPrimitive; + return _this3; + } + /** + * @override + */ + + + _createClass(PrimitiveProducer, [{ + key: "needsElevation", + value: function needsElevation() { + var owner = this.entity; + return owner.altitude_mode !== AltitudeMode.ABSOLUTE; + } + /** + * @override + */ + + }, { + key: "createRegions", + value: function createRegions() { + var owner = this.entity; + + if (this._status === Status$3.INVALID) { + // 多角形なし、または三角形に変換できなかったとき + return []; + } // 正常な多角形のとき + + + var region = new EntityRegion(); + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; + + try { + for (var _iterator8 = owner._boundaries[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var bo = _step8.value; + region.addPoints(bo.points, 0, 3, bo.num_points); + } + } catch (err) { + _didIteratorError8 = true; + _iteratorError8 = err; + } finally { + try { + if (!_iteratorNormalCompletion8 && _iterator8["return"] != null) { + _iterator8["return"](); + } + } finally { + if (_didIteratorError8) { + throw _iteratorError8; + } + } + } + + region.addPoint(owner._getPosition()); + return [region]; + } + /** + * @override + */ + + }, { + key: "onChangeElevation", + value: function onChangeElevation(regions) { + if (this._status === Status$3.NORMAL) { + this._status = Status$3.MESH_DIRTY; + } + } + /** + * @override + */ + + }, { + key: "getPrimitives", + value: function getPrimitives(stage) { + if (this._status === Status$3.INVALID) { + // 多角形なし、または三角形に変換できなかったとき + return []; + } else if (this._status === Status$3.TRIANGLE_DIRTY) { + this._triangles = this.entity._createTriangles(); + + if (this._triangles === null) { + // 多角形の三角形化に失敗 + this._primitive.mesh = null; + this._pickPrimitive.mesh = null; + this._status = Status$3.INVALID; + return []; + } + + this._updatePrimitiveMesh(); + } else if (this._status === Status$3.MESH_DIRTY) { + this._updatePrimitiveMesh(); + } + + this._updatePrimitiveProperties(); + + this._status = Status$3.NORMAL; + return stage.getRenderTarget() === RenderTarget.SCENE ? [this._primitive] : [this._pickPrimitive]; + } + /** + * @summary 押し出しモードが変更されたことを通知 + */ + + }, { + key: "onChangeExtruded", + value: function onChangeExtruded() { + if (this._status === Status$3.NORMAL) { + this._status = Status$3.MESH_DIRTY; + } + } + /** + * @summary プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeProperty", + value: function onChangeProperty() {} // することなし + + /** + * @summary 境界が変更されたことを通知 + */ + + }, { + key: "onChangeBoundary", + value: function onChangeBoundary() { + this._status = Status$3.TRIANGLE_DIRTY; + this._triangles = null; + this.needToCreateRegions(); + } + /** + * @summary プリミティブの更新 + * + * 入力: + * this.entity + * this._triangles + * 出力: + * this._transform + * this._pivot + * this._bbox + * this._primitive.mesh + * + * @private + */ + + }, { + key: "_updatePrimitiveMesh", + value: function _updatePrimitiveMesh() { + var cb_data = new BoundaryConbiner(this.entity); // プリミティブの更新 + // primitive.transform + // primitive.pivot + // primitive.bbox + + this._updateTransformPivotBBox(cb_data); // メッシュ生成 + + + var mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }, { + name: "a_normal", + size: 3 + }], + vertices: this._createVertices(cb_data), + indices: this._createIndices(cb_data) + }; + var mesh = new Mesh(this.entity.scene.glenv, mesh_data); // メッシュ設定 + + this._primitive.mesh = mesh; + this._pickPrimitive.mesh = mesh; + } + /** + * @summary プリミティブの更新 + * + * @desc + *
+     * 出力:
+     *   this._transform
+     *   this._pivot
+     *   this._bbox
+     * 
+ * + * @param {BoundaryConbiner} cb_data 入力データ + * + * @private + */ + + }, { + key: "_updateTransformPivotBBox", + value: function _updateTransformPivotBBox(cb_data) { + // 変換行列の更新 + var transform = this._transform; + transform[12] = cb_data.origin[0]; + transform[13] = cb_data.origin[1]; + transform[14] = cb_data.origin[2]; // 統計 + + var xmin = Number.MAX_VALUE; + var ymin = Number.MAX_VALUE; + var zmin = Number.MAX_VALUE; + var xmax = -Number.MAX_VALUE; + var ymax = -Number.MAX_VALUE; + var zmax = -Number.MAX_VALUE; // [cb_data.upper, cb_data.lower] + + var points_array = [cb_data.upper]; + + if (cb_data.lower) { + points_array.push(cb_data.lower); + } + + for (var j = 0; j < points_array.length; ++j) { + var points = points_array[j]; + + for (var i = 0; i < cb_data.num_points; ++i) { + var b = 3 * i; + var x = points[b]; + var y = points[b + 1]; + var z = points[b + 2]; + + if (x < xmin) { + xmin = x; + } + + if (y < ymin) { + ymin = y; + } + + if (z < zmin) { + zmin = z; + } + + if (x > xmax) { + xmax = x; + } + + if (y > ymax) { + ymax = y; + } + + if (z > zmax) { + zmax = z; + } + } + } // 中心点 + + + var pivot = this._pivot; + pivot[0] = (xmin + xmax) / 2; + pivot[1] = (ymin + ymax) / 2; + pivot[2] = (zmin + zmax) / 2; // 境界箱 + + var bbox = this._bbox; + var bmin = bbox[0]; + var bmax = bbox[1]; + bmin[0] = xmin; + bmin[1] = ymin; + bmin[2] = zmin; + bmax[0] = xmax; + bmax[1] = ymax; + bmax[2] = zmax; + } + /** + * @summary 頂点配列の生成 + * + * @desc + * 生成される形式は [Px, Py, Pz, Nx, Ny, Nz, ...] のような形で、それぞれの座標はローカル座標系になる。 + * 配列の頂点データは 2 つの領域で分かれ、上面ポリゴンの頂点配列(S1) → 側面ポリゴンの頂点配列(S2) の順序で格納される。 + * ただし cb_data.lower == null のとき、配列は S1 部分しか設定されない。 + * + * S1 は cb_data.upper に対応する頂点データが同じ順序で格納される。 + * + * S2 は cb_data.num_points 個の四角形に対する頂点データが順番に並んでいる。 + * 各四角形の頂点データは 左下、右下、左上、右上 の順序で格納されている。 + * + * 入力: this.entity._boundaries + * + * @param {BoundaryConbiner} cb_data 入力データ + * + * @return {Float32Array} Mesh 用の頂点配列 + * + * @private + */ + + }, { + key: "_createVertices", + value: function _createVertices(cb_data) { + var fpv = 6; // 1頂点データあたりの float 数 + + var s1_num_floats = fpv * cb_data.num_points; // 上面のデータサイズ + + var s2_num_floats = cb_data.lower ? fpv * (4 * cb_data.num_points) : 0; // 側面のデータサイズ + + var s3_num_floats = cb_data.lower ? s1_num_floats : 0; // 底面のデータサイズ + + var vertices = new Float32Array(s1_num_floats + s2_num_floats + s3_num_floats); // 上面の法線を取得 + + var unormal = GeoMath.normalize3(cb_data.origin, GeoMath.createVector3()); // 上面の頂点データ + + for (var i = 0; i < cb_data.num_points; ++i) { + var b = 3 * i; + var px = cb_data.upper[b]; + var py = cb_data.upper[b + 1]; + var pz = cb_data.upper[b + 2]; + var vi = fpv * i; + vertices[vi] = px; // a_position.x + + vertices[vi + 1] = py; // a_position.y + + vertices[vi + 2] = pz; // a_position.z + + setVec3ToArray(unormal, vertices, vi + 3); // a_normal + } // 側面の頂点データ + + + if (cb_data.lower) { + var p00 = GeoMath.createVector3(); // 左下位置 + + var p10 = GeoMath.createVector3(); // 右下位置 + + var p01 = GeoMath.createVector3(); // 左上位置 + + var p11 = GeoMath.createVector3(); // 右上位置 + + var snormal = GeoMath.createVector3(); // 側面の法線 + + var beg_i = 0; // bo の最初の頂点のインデックス + + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; + + try { + for (var _iterator9 = this.entity._boundaries[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { + var bo = _step9.value; + var end_i = beg_i + bo.num_points; // bo の最後の頂点のインデックス + 1 + + for (var _i = beg_i; _i < end_i; ++_i) { + var i0 = _i; + var i1 = _i + 1 < end_i ? _i + 1 : beg_i; // 四隅の位置を取得 + + var b0 = 3 * i0; + var b1 = 3 * i1; + setArrayToVec3(cb_data.lower, b0, p00); + setArrayToVec3(cb_data.lower, b1, p10); + setArrayToVec3(cb_data.upper, b0, p01); + setArrayToVec3(cb_data.upper, b1, p11); // 側面の法線を取得 + + setTriangleNormal(p00, p10, p01, snormal); // 四隅の頂点データを設定 + + var _vi = s1_num_floats + 4 * fpv * _i; + + setVec3ToArray(p00, vertices, _vi); // a_position + + setVec3ToArray(snormal, vertices, _vi + 3); // a_normal + + _vi += fpv; + setVec3ToArray(p10, vertices, _vi); // a_position + + setVec3ToArray(snormal, vertices, _vi + 3); // a_normal + + _vi += fpv; + setVec3ToArray(p01, vertices, _vi); // a_position + + setVec3ToArray(snormal, vertices, _vi + 3); // a_normal + + _vi += fpv; + setVec3ToArray(p11, vertices, _vi); // a_position + + setVec3ToArray(snormal, vertices, _vi + 3); // a_normal + } + + beg_i = end_i; + } + } catch (err) { + _didIteratorError9 = true; + _iteratorError9 = err; + } finally { + try { + if (!_iteratorNormalCompletion9 && _iterator9["return"] != null) { + _iterator9["return"](); + } + } finally { + if (_didIteratorError9) { + throw _iteratorError9; + } + } + } + } + + if (cb_data.lower) { + var bnormal = GeoMath.scale3(-1.0, unormal, GeoMath.createVector3()); // 底面の頂点データ + + for (var _i2 = 0; _i2 < cb_data.num_points; ++_i2) { + var _b = 3 * _i2; + + var _px = cb_data.lower[_b]; + var _py = cb_data.lower[_b + 1]; + var _pz = cb_data.lower[_b + 2]; + + var _vi2 = s1_num_floats + s2_num_floats + fpv * _i2; + + vertices[_vi2] = _px; // a_position.x + + vertices[_vi2 + 1] = _py; // a_position.y + + vertices[_vi2 + 2] = _pz; // a_position.z + + setVec3ToArray(bnormal, vertices, _vi2 + 3); // a_normal + } + } + + return vertices; + } + /** + * @summary インデックス配列の生成 + * + * 入力: this._triangles + * + * @param {BoundaryConbiner} cb_data 入力データ + * + * @return {Uint32Array} インデックス配列 + * + * @private + */ + + }, { + key: "_createIndices", + value: function _createIndices(cb_data) { + // 頂点の並びは _createVertices() を参照 + var num_upper_triangles = this._triangles.length / 3; + var num_side_triangles = cb_data.lower ? 2 * cb_data.num_points : 0; + var num_bottom_triangles = cb_data.lower ? num_upper_triangles : 0; + var indices = new Uint32Array(3 * (num_upper_triangles + num_side_triangles + num_bottom_triangles)); // 前半に上面のポリゴンを設定 + + indices.set(this._triangles); // 側面のポリゴンを設定 + + if (cb_data.lower) { + var num_quads = cb_data.num_points; + var ioffset = 3 * num_upper_triangles; // indices 内の現在の四角形のオフセット + + var voffset = cb_data.num_points; // 頂点配列内の現在の四角形のオフセット + + for (var i = 0; i < num_quads; ++i, ioffset += 6, voffset += 4) { + // 左下三角形 + indices[ioffset] = voffset; + indices[ioffset + 1] = voffset + 1; + indices[ioffset + 2] = voffset + 2; // 右上三角形 + + indices[ioffset + 3] = voffset + 2; + indices[ioffset + 4] = voffset + 1; + indices[ioffset + 5] = voffset + 3; + } + } // 底面のポリゴンを設定 + + + if (cb_data.lower) { + var len = this._triangles.length / 3; + + var _voffset = cb_data.num_points + 4 * cb_data.num_points; + + for (var _i3 = 0; _i3 < len; ++_i3) { + indices[(num_upper_triangles + num_side_triangles + _i3) * 3 + 0] = this._triangles[_i3 * 3 + 0] + _voffset; + indices[(num_upper_triangles + num_side_triangles + _i3) * 3 + 1] = this._triangles[_i3 * 3 + 2] + _voffset; + indices[(num_upper_triangles + num_side_triangles + _i3) * 3 + 2] = this._triangles[_i3 * 3 + 1] + _voffset; + } + } + + return indices; + } + /** + * @summary プリミティブのプロパティを更新 + * + * 入力: this.entity + * 出力: this._properties + * + * @private + */ + + }, { + key: "_updatePrimitiveProperties", + value: function _updatePrimitiveProperties() { + var owner = this.entity; + var props = this._properties; + GeoMath.copyVector3(owner._color, props.color); + props.opacity = owner._opacity; + props.lighting = this.extruded_height !== 0.0; + } + }]); + + return PrimitiveProducer; +}(Entity.PrimitiveProducer); +/** + * @summary PolygonEntity の FlakePrimitiveProducer + * + * @private + */ + + +var FlakePrimitiveProducer$2 = +/*#__PURE__*/ +function (_Entity$FlakePrimitiv) { + _inherits(FlakePrimitiveProducer, _Entity$FlakePrimitiv); + + /** + * @param {mapray.PolygonEntity} entity + */ + function FlakePrimitiveProducer(entity) { + var _this4; + + _classCallCheck(this, FlakePrimitiveProducer); + + _this4 = _possibleConstructorReturn(this, _getPrototypeOf(FlakePrimitiveProducer).call(this, entity)); + _this4._material_map = Object.keys(RenderTarget).reduce(function (map, key) { + var render_target = RenderTarget[key]; + map.set(render_target, entity._getMaterial(render_target)); + return map; + }, new Map()); + _this4._properties = null; + _this4._area_manager = new PolygonAreaManager(entity); + return _this4; + } + /** + * @override + */ + + + _createClass(FlakePrimitiveProducer, [{ + key: "getAreaStatus", + value: function getAreaStatus(area) { + return this._area_manager.getAreaStatus(area); + } + /** + * @override + */ + + }, { + key: "createMesh", + value: function createMesh(area, dpows, dem) { + // ConvexPolygon の配列、または Entity.AreaStatus.FULL + var polygons = this._area_manager.getAreaContent(area); + + var msize = Math.PI * Math.pow(2, 1 - area.z); + var x_min = area.x * msize - Math.PI; + var y_min = Math.PI - (area.y + 1) * msize; + var div_x = 1 << dpows[0]; + var div_y = 1 << dpows[1]; // サブメッシュの配列を生成 + + var submeshes = this._createSubmeshes(x_min, y_min, x_min + msize, y_min + msize, div_x, div_y, polygons); // メッシュ生成 + + + var mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }, { + name: "a_normal", + size: 3 + }], + vertices: this._createVertices(submeshes, area, dem), + indices: this._createIndices(submeshes) + }; + return new Mesh(this.entity.scene.glenv, mesh_data); + } + /** + * @override + */ + + }, { + key: "getMaterialAndProperties", + value: function getMaterialAndProperties(stage) { + if (this._properties === null) { + var entity = this.entity; + this._properties = { + color: GeoMath.createVector3f(entity._color), + opacity: entity._opacity, + lighting: false + }; + } + + return { + material: this._material_map.get(stage.getRenderTarget()), + properties: this._properties + }; + } + /** + * @summary 押し出しモードが変更されたことを通知 + */ + + }, { + key: "onChangeExtruded", + value: function onChangeExtruded() {} // flake_mode なので押し出しモードは関係ない + + /** + * @summary プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeProperty", + value: function onChangeProperty() { + this._properties = null; + } + /** + * @summary 境界が変更されたことを通知 + */ + + }, { + key: "onChangeBoundary", + value: function onChangeBoundary() { + this._area_manager.notifyForUpdateContent(); + + this.notifyForUpdate(); + } + /** + * @summary 頂点配列を生成 + * + * @param {iterable.} submeshes + * @param {mapray.Area} area + * @param {mapray.DemBinary} dem + * + * @return {Float32Array} + * + * @private + */ + + }, { + key: "_createVertices", + value: function _createVertices(submeshes, area, dem) { + var origin = AreaUtil.getCenter(area, GeoMath.createVector3()); + var sampler = dem.newSampler(area); // 頂点配列を生成 + + var num_vertices = 0; + var _iteratorNormalCompletion10 = true; + var _didIteratorError10 = false; + var _iteratorError10 = undefined; + + try { + for (var _iterator10 = submeshes[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { + var smesh = _step10.value; + num_vertices += smesh.getNumVertices(); + } + } catch (err) { + _didIteratorError10 = true; + _iteratorError10 = err; + } finally { + try { + if (!_iteratorNormalCompletion10 && _iterator10["return"] != null) { + _iterator10["return"](); + } + } finally { + if (_didIteratorError10) { + throw _iteratorError10; + } + } + } + + var vertices = new Float32Array(6 * num_vertices); // 頂点配列に座標を書き込む + + var offset = 0; + var _iteratorNormalCompletion11 = true; + var _didIteratorError11 = false; + var _iteratorError11 = undefined; + + try { + for (var _iterator11 = submeshes[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { + var _smesh = _step11.value; + offset = _smesh.addVertices(origin, sampler, vertices, offset); + } + } catch (err) { + _didIteratorError11 = true; + _iteratorError11 = err; + } finally { + try { + if (!_iteratorNormalCompletion11 && _iterator11["return"] != null) { + _iterator11["return"](); + } + } finally { + if (_didIteratorError11) { + throw _iteratorError11; + } + } + } + + return vertices; + } + /** + * @summary インデックス配列を生成 + * + * @param {iterable.} submeshes + * + * @return {Uint32Array} + * + * @private + */ + + }, { + key: "_createIndices", + value: function _createIndices(submeshes) { + // インデックス配列を生成 + var num_triangles = 0; + var _iteratorNormalCompletion12 = true; + var _didIteratorError12 = false; + var _iteratorError12 = undefined; + + try { + for (var _iterator12 = submeshes[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) { + var smesh = _step12.value; + num_triangles += smesh.getNumTriangles(); + } + } catch (err) { + _didIteratorError12 = true; + _iteratorError12 = err; + } finally { + try { + if (!_iteratorNormalCompletion12 && _iterator12["return"] != null) { + _iterator12["return"](); + } + } finally { + if (_didIteratorError12) { + throw _iteratorError12; + } + } + } + + var indices = new Uint32Array(3 * num_triangles); // インデックス配列にインデックスを書き込む + + var voffset = 0; + var ioffset = 0; + var _iteratorNormalCompletion13 = true; + var _didIteratorError13 = false; + var _iteratorError13 = undefined; + + try { + for (var _iterator13 = submeshes[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { + var _smesh2 = _step13.value; + ioffset = _smesh2.addIndices(voffset, indices, ioffset); + voffset += _smesh2.getNumVertices(); + } + } catch (err) { + _didIteratorError13 = true; + _iteratorError13 = err; + } finally { + try { + if (!_iteratorNormalCompletion13 && _iterator13["return"] != null) { + _iterator13["return"](); + } + } finally { + if (_didIteratorError13) { + throw _iteratorError13; + } + } + } + + return indices; + } + /** + * @summary サブメッシュの配列を生成 + * + *

polygons は領域と交差する ConvexPolygon の配列である。ただし領域が多角形で覆われているときは + * Entity.AreaStatus.FULL になる場合がある。

+ * + * @param {number} x_min 領域の最小 x 座標 + * @param {number} y_min 領域の最小 y 座標 + * @param {number} x_max 領域の最大 x 座標 + * @param {number} y_max 領域の最大 y 座標 + * @param {number} div_x 領域の x 方向の分割数 + * @param {number} div_y 領域の y 方向の分割数 + * @param {iterable.|mapray.Entity.AreaStatus} polygons + * + * @return {iterable.} サブメッシュの配列 + * + * @private + */ + + }, { + key: "_createSubmeshes", + value: function _createSubmeshes(x_min, y_min, x_max, y_max, div_x, div_y, polygons) { + if (polygons === Entity.AreaStatus.FULL) { + // 領域内は多角形に覆われている + return [new RectSubmesh(x_min, y_min, x_max, y_max, div_x, div_y)]; + } else if (polygons.length == 0) { + // 領域内に多角形は無い + return []; + } else if (div_x == 1 && div_y == 1) { + // これ以上分割できないので切り取り多角形を返す + var t1 = [x_min, y_min, x_max, y_min, x_min, y_max]; // 左下三角形 + + var t2 = [x_min, y_max, x_max, y_min, x_max, y_max]; // 右上三角形 + + var m1 = this._create_clipped_polygons_submeshes(t1, polygons); + + var m2 = this._create_clipped_polygons_submeshes(t2, polygons); + + return m1.concat(m2); + } else { + if (div_x >= div_y) { + // 左右分割 + var msize = (x_max - x_min) / 2; + var div_w = div_x / 2; + + var _m = this._create_submeshes_sp(x_min, y_min, x_min + msize, y_max, div_w, div_y, polygons); + + var _m2 = this._create_submeshes_sp(x_min + msize, y_min, x_max, y_max, div_w, div_y, polygons); + + return _m.concat(_m2); + } else { + // 上下分割 + var _msize = (y_max - y_min) / 2; + + var _div_w = div_y / 2; + + var _m3 = this._create_submeshes_sp(x_min, y_min, x_max, y_min + _msize, div_x, _div_w, polygons); + + var _m4 = this._create_submeshes_sp(x_min, y_min + _msize, x_max, y_max, div_x, _div_w, polygons); + + return _m3.concat(_m4); + } + } + } + /** + * @summary サブメッシュの配列を生成 + * + * @desc + *

_createSubmeshes() との違いは polygons に Entity.AreaStatus.FULL を指定できない。 + * また、polygons には領域の外側の多角形が含まれている可能性がある。

+ * + * @param {number} x_min 領域の最小 x 座標 + * @param {number} y_min 領域の最小 y 座標 + * @param {number} x_max 領域の最大 x 座標 + * @param {number} y_max 領域の最大 y 座標 + * @param {number} div_x 領域の x 方向の分割数 + * @param {number} div_y 領域の y 方向の分割数 + * @param {iterable.} polygons + * + * @return {Submesh[]} サブメッシュの配列 + * + * @private + */ + + }, { + key: "_create_submeshes_sp", + value: function _create_submeshes_sp(x_min, y_min, x_max, y_max, div_x, div_y, polygons) { + // 領域を凸多角形に変換 + var area_rect = ConvexPolygon.createByRectangle(x_min, y_min, x_max, y_max); + var selected_polygons = []; + var _iteratorNormalCompletion14 = true; + var _didIteratorError14 = false; + var _iteratorError14 = undefined; + + try { + for (var _iterator14 = polygons[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) { + var polygon = _step14.value; + + if (polygon.includes(area_rect)) { + // polygon は area_rect を覆う + // つまり area_rect は全体の多角形に覆われている + selected_polygons = Entity.AreaStatus.FULL; + break; + } + + try { + if (area_rect.hasIntersection(polygon)) { + // 領域と交差しているので polygon 追加 + selected_polygons.push(polygon); + } + } catch (e) {// polygon の交差判定に失敗したときは polygon は無いことにする + } + } + } catch (err) { + _didIteratorError14 = true; + _iteratorError14 = err; + } finally { + try { + if (!_iteratorNormalCompletion14 && _iterator14["return"] != null) { + _iterator14["return"](); + } + } finally { + if (_didIteratorError14) { + throw _iteratorError14; + } + } + } + + return this._createSubmeshes(x_min, y_min, x_max, y_max, div_x, div_y, selected_polygons); + } + /** + * @summary 凸多角形のサブメッシュの配列を生成 + * + * @desc + *

area_triangle の三角形で src_polygons の凸多角形を切り取り、それらの切り取られた凸多角形に対応する + * PolygonsSubmesh インスタンスの配列を生成する。

+ * + * arit = Area Right Isosceles Triangle (領域直角二等辺三角形) + * + * @param {number[]} arit_coords 領域の三角形座標配列 (左下または右上の三角形) + * @param {iterable.} src_polygons 切り取り対象の凸多角形の配列 + * + * @return {PolygonsSubmesh[]} PolygonsSubmesh の配列 + * + * @private + */ + + }, { + key: "_create_clipped_polygons_submeshes", + value: function _create_clipped_polygons_submeshes(arit_coords, src_polygons) { + var area_polygon = new ConvexPolygon(arit_coords); + var clipped_polygons = []; + var _iteratorNormalCompletion15 = true; + var _didIteratorError15 = false; + var _iteratorError15 = undefined; + + try { + for (var _iterator15 = src_polygons[Symbol.iterator](), _step15; !(_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done); _iteratorNormalCompletion15 = true) { + var polygon = _step15.value; + + try { + var clipped = area_polygon.getIntersection(polygon); + + if (clipped !== null) { + clipped_polygons.push(clipped); + } + } catch (e) {// polygon の切り抜きに失敗したときは polygon の切り抜きは返さない + } + } + } catch (err) { + _didIteratorError15 = true; + _iteratorError15 = err; + } finally { + try { + if (!_iteratorNormalCompletion15 && _iterator15["return"] != null) { + _iterator15["return"](); + } + } finally { + if (_didIteratorError15) { + throw _iteratorError15; + } + } + } + + if (clipped_polygons.length > 0) { + return [new PolygonsSubmesh(arit_coords, clipped_polygons)]; + } else { + return []; + } + } + }]); + + return FlakePrimitiveProducer; +}(Entity.FlakePrimitiveProducer); +/** + * @summary 多角形の境界 + * + * @classdesc + *

多角形の1つの境界を表現する。

+ *

外側境界のときは反時計回り、内側境界のときは時計回りで格納される。

+ * + * @private + */ + + +var Boundary = +/*#__PURE__*/ +function () { + /** + * @desc + *

points は addOuterBoundary(), addInnerBoundary() と同じ形式である。

+ * + * @param {number[]} points 境界の頂点データ + * @param {boolean} is_inner 内側境界か? + */ + function Boundary(points, is_inner) { + _classCallCheck(this, Boundary); + + var num_points = Math.floor(points.length / 3); + this._points = new Float64Array(3 * num_points); + this._num_points = num_points; + var is_ccw = Boundary.isCCW(points, num_points); + var si; + var si_step; + + if (!is_inner && is_ccw || is_inner && !is_ccw) { + // 順方向 + si = 0; + si_step = 3; + } else { + // 逆方向 + si = 3 * (num_points - 1); + si_step = -3; + } // 内部の配列にコピー + + + for (var i = 0; i < num_points; ++i) { + this._points[3 * i] = points[si]; + this._points[3 * i + 1] = points[si + 1]; + this._points[3 * i + 2] = points[si + 2]; + si += si_step; + } + } + /** + * @summary 頂点座標の配列 + * @type {number[]} + * @readonly + */ + + + _createClass(Boundary, [{ + key: "points", + get: function get() { + return this._points; + } + /** + * @summary 頂点数 + * @type {number} + * @readonly + */ + + }, { + key: "num_points", + get: function get() { + return this._num_points; + } + /** + * @summary 境界は反時計回りか? + * + * @param {number[]} points 境界の頂点データ + * + * @return {boolean} 反時計回りのとき true, それ以外のとき false + */ + + }], [{ + key: "isCCW", + value: function isCCW(points, num_points) { + // 頂上の点、同じ高さなら左側優先 + var top_i; + var top_x = -Number.MAX_VALUE; + var top_y = -Number.MAX_VALUE; + + for (var i = 0; i < num_points; ++i) { + var x = points[3 * i]; + var y = points[3 * i + 1]; + + if (y > top_y || y == top_y && x < top_x) { + top_i = i; + top_x = x; + top_y = y; + } + } // top の前方の点 + + + var next_i = top_i == num_points - 1 ? 0 : top_i + 1; + var next_x = points[3 * next_i]; + var next_y = points[3 * next_i + 1]; // top の後方の点 + + var prev_i = top_i == 0 ? num_points - 1 : top_i - 1; + var prev_x = points[3 * prev_i]; + var prev_y = points[3 * prev_i + 1]; // prev と next は top より下または同じ高さだが、少なくともどちらか一方は top より下になる + // またエッジは交差しないことが前提なので、2 つのエッジの内角は 0 度より大きく 180 度未満になる + // したがって a, b の行列式が正のとき反時計回り、それ以外のとき時計回り + + var ax = next_x - top_x; + var ay = next_y - top_y; + var bx = prev_x - top_x; + var by = prev_y - top_y; + return ax * by - bx * ay > 0; + } + }]); + + return Boundary; +}(); +/** + * @summary 境界線データを結合 + * + * @classdesc + *

pe._bounaries に対応する上頂点と底頂点の LOCS 平坦化配列を取得する。

+ *

pe._extruded_height === 0 のときは lower に null を設定する。

+ * + *
+ * プロパティ:
+ *   origin: Vector3       // LOCS の原点位置 (GOCS)
+ *   num_points: number    // upper の頂点数
+ *   upper: Float64Array   // 上頂点 (LOCS, 順序は pe._bounaries.points の連結)
+ *   lower: Float64Array   // 底頂点 (LOCS, 順序は upper と同じ, nullable)
+ * 
+ * + * @private + */ + + +var BoundaryConbiner = +/** + * @desc + *
+ * 入力:
+ *   pe.viewer
+ *   pe.altitude_mode
+ *   pe._extruded_height
+ *   pe._bounaries
+ * 
+ * + * @param {mapray.PolygonEntity} pe 呼び出し側のポリゴンエンティティ + */ +function BoundaryConbiner(pe) { + _classCallCheck(this, BoundaryConbiner); + + /* + pe._extruded_height !== 0 == 0 + + --- _.-*---*._ _.-*---*._ + upper_points *-_ _-* *-_ _-* + --- | *----* | *----* + | | | | + --- | | | | + lower_points *-_| |_-* (null) + --- *----* + */ + var viewer = pe.scene.viewer; + var altitude_mode = pe.altitude_mode; + + var src_points = pe._getCombinedBoundaryPoints(); + + var num_points = pe._countNumPointsOnBoundaries(); + + var base_points = Float64Array.from(src_points); + + if (altitude_mode === AltitudeMode.RELATIVE) { + var elevation = viewer.getExistingElevation(pe._getPosition()); + + for (var i = 0; i < num_points; ++i) { + var ai = 3 * i + 2; + base_points[ai] += elevation; + } + } + + var upper_points = null; + var lower_points = null; + + if (pe._extruded_height !== 0) { + if (altitude_mode === AltitudeMode.CLAMP) { + upper_points = base_points; + lower_points = Float64Array.from(src_points); + + for (var _i4 = 0; _i4 < num_points; ++_i4) { + var _ai = 3 * _i4 + 2; + + lower_points[_ai] = 0; + } + } else { + // altitude_mode !== AltitudeMode.ABSOLUTE || altitude_mode !== AltitudeMode.RELATIVE + lower_points = base_points; + upper_points = Float64Array.from(src_points); + + for (var _i5 = 0; _i5 < num_points; ++_i5) { + var _ai2 = 3 * _i5 + 2; + + upper_points[_ai2] = lower_points[_ai2] + pe._extruded_height; + } + } + } else { + upper_points = base_points; + } + + var origin = pe._getPosition().getAsGocs(GeoMath.createVector3()); // LOCS 平坦化配列 + + + var upper_ocs_points = GeoPoint.toGocsArray(upper_points, num_points, new Float64Array(3 * num_points)); + + for (var _i6 = 0; _i6 < num_points; ++_i6) { + var d = 3 * _i6; + upper_ocs_points[d] -= origin[0]; + upper_ocs_points[d + 1] -= origin[1]; + upper_ocs_points[d + 2] -= origin[2]; + } + + var lower_ocs_points = null; + + if (lower_points) { + // ASSERT: lower_points != null + lower_ocs_points = GeoPoint.toGocsArray(lower_points, num_points, new Float64Array(3 * num_points)); + + for (var _i7 = 0; _i7 < num_points; ++_i7) { + var _d = 3 * _i7; + + lower_ocs_points[_d] -= origin[0]; + lower_ocs_points[_d + 1] -= origin[1]; + lower_ocs_points[_d + 2] -= origin[2]; + } + } // プロパティを設定 + + + this.origin = origin; + this.num_points = num_points; + this.upper = upper_ocs_points; + this.lower = lower_ocs_points; +}; +/** + * @summary 多角形の領域管理 + * + * @private + */ + + +var PolygonAreaManager = +/*#__PURE__*/ +function (_QAreaManager) { + _inherits(PolygonAreaManager, _QAreaManager); + + /** + * @param {mapray.PolygonEntity} entity 管理対象のエンティティ + */ + function PolygonAreaManager(entity) { + var _this5; + + _classCallCheck(this, PolygonAreaManager); + + _this5 = _possibleConstructorReturn(this, _getPrototypeOf(PolygonAreaManager).call(this)); + _this5._entity = entity; + return _this5; + } + /** + * @override + */ + + + _createClass(PolygonAreaManager, [{ + key: "getInitialContent", + value: function getInitialContent() { + var src_indices = this._entity._createTriangles() || []; + var num_src_indices = src_indices.length; + + var src_coords = this._entity._getCombinedBoundary2DPoints(); + + var content = []; // ConvexPolygon の配列 + + for (var _si = 0; _si < num_src_indices; _si += 3) { + var i0 = src_indices[_si]; + var i1 = src_indices[_si + 1]; + var i2 = src_indices[_si + 2]; + + this._add_polygon_to_array(src_coords, i0, i1, i2, content); + } + + return content; + } + /** + * @override + */ + + }, { + key: "createAreaContent", + value: function createAreaContent(min_x, min_y, msize, parent_content) { + // 単位球メルカトルでの領域に変換 + var x_area_min = Math.PI * min_x; + var y_area_min = Math.PI * min_y; + var x_area_max = Math.PI * (min_x + msize); + var y_area_max = Math.PI * (min_y + msize); // 領域を凸多角形に変換 + + var area_rect = ConvexPolygon.createByRectangle(x_area_min, y_area_min, x_area_max, y_area_max); + var content = []; // ConvexPolygon の配列 + + var _iteratorNormalCompletion16 = true; + var _didIteratorError16 = false; + var _iteratorError16 = undefined; + + try { + for (var _iterator16 = parent_content[Symbol.iterator](), _step16; !(_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done); _iteratorNormalCompletion16 = true) { + var polygon = _step16.value; + + if (polygon.includes(area_rect)) { + // polygon は area_rect を覆う + // つまり area_rect は全体の多角形に覆われている + return Entity.AreaStatus.FULL; + } + + try { + if (area_rect.hasIntersection(polygon)) { + // 領域と交差しているので polygon 追加 + content.push(polygon); + } + } catch (e) {// polygon の交差判定に失敗したときは polygon は無いことにする + } + } + } catch (err) { + _didIteratorError16 = true; + _iteratorError16 = err; + } finally { + try { + if (!_iteratorNormalCompletion16 && _iterator16["return"] != null) { + _iterator16["return"](); + } + } finally { + if (_didIteratorError16) { + throw _iteratorError16; + } + } + } + + return content.length > 0 ? content : Entity.AreaStatus.EMPTY; + } + /** + * @summary 三角形を凸多角形として追加 + * + * @param {number[]} src_coords 入力頂点の座標配列 (経緯度) + * @param {number} si0 三角形の頂点 0 + * @param {number} si1 三角形の頂点 1 + * @param {number} si2 三角形の頂点 2 + * @param {mapray.ConvexPolygon[]} dst_polygons 出力先の ConvexPolygon 配列 + * + * @private + */ + + }, { + key: "_add_polygon_to_array", + value: function _add_polygon_to_array(src_coords, si0, si1, si2, dst_polygons) { + var Degree = GeoMath.DEGREE; + var RAngle = Math.PI / 2; // 直角 + + var TwoPI = 2 * Math.PI; // 2π + // 三角形の頂点座標配列 (単位球メルカトル座標系) を作成 + + var vertices = []; + var mx_min_1 = Number.MAX_VALUE; // オフセット処理前の最小 mx 座標 + + for (var _i8 = 0, _arr = [si0, si1, si2]; _i8 < _arr.length; _i8++) { + var _si2 = _arr[_i8]; + var lon = src_coords[2 * _si2] * Degree; + var lat = src_coords[2 * _si2 + 1] * Degree; + + if (Math.abs(lat) >= RAngle) { + // 緯度の絶対値が RAngle 以上の頂点が存在する三角形は除外 + // ※ まだ検討していないので、とりあえずの処置 + return; + } + + var mx = lon; + var my = GeoMath.invGudermannian(lat); + vertices.push(mx); + vertices.push(my); + mx_min_1 = Math.min(mx, mx_min_1); + } // mx_min_2: mx 座標が mx_min_1 だった頂点のオフセット後の mx 座標 + + + var mx_min_2 = mx_min_1 - TwoPI * (Math.floor((mx_min_1 - Math.PI) / TwoPI) + 1); + + if (mx_min_2 < -Math.PI || mx_min_2 >= Math.PI) { + // 数値計算誤差により稀に区間からはみ出る可能性があるので + mx_min_2 = -Math.PI; + } // Assert: -Math.PI <= mx_min_2 < Math.PI + // mx 座標にオフセットを適用 + + + var mx_max_2 = -Number.MAX_VALUE; // オフセット後の最大 mx 座標 + + for (var i = 0; i < 3; ++i) { + var ix = 2 * i; + var mx_1 = vertices[ix]; // オフセット前の mx 座標 + // mx_2: オフセット後の mx 座標 + + var dx_1 = mx_1 - mx_min_1; // Assert: dx_1 >= 0 + + var mx_2 = mx_min_2 + dx_1; // Assert: mx_2 >= mx_min_2 + // Assert: (mx_1 == mx_min_1) ⇒ (mx_2 == mx_min_2) + + vertices[ix] = mx_2; + mx_max_2 = Math.max(mx_2, mx_max_2); + } // オフセットを適用した三角形を加える + + + dst_polygons.push(new ConvexPolygon(vertices)); // 三角形が 180 度子午線をまたぐとき + // 360 度左にずらした三角形をもう1つ加える + + if (mx_max_2 > Math.PI) { + for (var _i9 = 0; _i9 < 3; ++_i9) { + var _ix = 2 * _i9; + + var _mx_ = vertices[_ix]; // オフセット後の mx 座標 + + var mx_3 = _mx_ - TwoPI; // 360 度左にずらした mx 座標 + + vertices[_ix] = mx_3; + } + + dst_polygons.push(new ConvexPolygon(vertices)); + } + } + }]); + + return PolygonAreaManager; +}(QAreaManager); +/** + * @summary サブメッシュ + * + * @private + */ + + +var Submesh = +/*#__PURE__*/ +function () { + /** + */ + function Submesh() { + _classCallCheck(this, Submesh); + } + /** + * @summary 頂点数を取得 + * + * @return {number} 頂点数 + * + * @abstract + */ + + + _createClass(Submesh, [{ + key: "getNumVertices", + value: function getNumVertices() { + throw ""; + } + /** + * @summary 三角形数を取得 + * + * @return {number} 三角形数 + * + * @abstract + */ + + }, { + key: "getNumTriangles", + value: function getNumTriangles() { + throw ""; + } + /** + * @summary 頂点配列に頂点データを書き込む + * + * @param {mapray.Vector3} origin 座標系の原点 (GOCS) + * @param {mapray.Sampler} sampler DEM サンプラー + * @param {number[]} vertices 書き込み先の配列 + * @param {number} offset 書き込み開始インデックス + * + * @return {number} offset + 書き込んだ要素数 + * + * @abstract + */ + + }, { + key: "addVertices", + value: function addVertices(origin, sampler, vertices, offset) { + throw ""; + } + /** + * @summary インデックス配列にインデックスを書き込む + * + * @param {number} voffset this 用頂点の先頭の頂点インデックス + * @param {number[]} indices 書き込み先の配列 + * @param {number} ioffset 書き込み開始インデックス + * + * @return {number} ioffset + 書き込んだ要素数 + * + * @abstract + */ + + }, { + key: "addIndices", + value: function addIndices(voffset, indices, ioffset) { + throw ""; + } + }]); + + return Submesh; +}(); +/** + * @summary 矩形サブメッシュ + * + * @private + */ + + +var RectSubmesh = +/*#__PURE__*/ +function (_Submesh) { + _inherits(RectSubmesh, _Submesh); + + /** + * @param {number} x_min + * @param {number} y_min + * @param {number} x_max + * @param {number} y_max + * @param {number} div_x + * @param {number} div_y + */ + function RectSubmesh(x_min, y_min, x_max, y_max, div_x, div_y) { + var _this6; + + _classCallCheck(this, RectSubmesh); + + _this6 = _possibleConstructorReturn(this, _getPrototypeOf(RectSubmesh).call(this)); + _this6._x_min = x_min; + _this6._y_min = y_min; + _this6._x_max = x_max; + _this6._y_max = y_max; + _this6._div_x = div_x; + _this6._div_y = div_y; + return _this6; + } + /** + * @override + */ + + + _createClass(RectSubmesh, [{ + key: "getNumVertices", + value: function getNumVertices() { + return (this._div_x + 1) * (this._div_y + 1); + } + /** + * @override + */ + + }, { + key: "getNumTriangles", + value: function getNumTriangles() { + return 2 * this._div_x * this._div_y; + } + /** + * @override + */ + + }, { + key: "addVertices", + value: function addVertices(origin, sampler, vertices, offset) { + // 刻み幅 + var mx_step = (this._x_max - this._x_min) / this._div_x; + var my_step = (this._y_max - this._y_min) / this._div_y; + var end_iu = this._div_x + 1; + var end_iv = this._div_y + 1; + var index = offset; + + for (var iv = 0, my = this._y_min; iv < end_iv; ++iv, my += my_step) { + var ey = Math.exp(my); + var ey2 = ey * ey; + var sinφ = (ey2 - 1) / (ey2 + 1); + var cosφ = 2 * ey / (ey2 + 1); + + for (var iu = 0, mx = this._x_min; iu < end_iu; ++iu, mx += mx_step) { + var sinλ = Math.sin(mx); + var cosλ = Math.cos(mx); + var height = sampler.sample(mx, my); + var radius = GeoMath.EARTH_RADIUS + height; // 法線 (GOCS) + + var nx = cosφ * cosλ; + var ny = cosφ * sinλ; + var nz = sinφ; // 位置 (GOCS) + + var gx = radius * nx; + var gy = radius * ny; + var gz = radius * nz; + vertices[index++] = gx - origin[0]; // x + + vertices[index++] = gy - origin[1]; // y + + vertices[index++] = gz - origin[2]; // z + + vertices[index++] = nx; // nx + + vertices[index++] = ny; // ny + + vertices[index++] = nz; // nz + } + } + + return index; + } + /** + * @override + */ + + }, { + key: "addIndices", + value: function addIndices(voffset, indices, ioffset) { + var div_x = this._div_x; + var div_y = this._div_y; + var index = ioffset; + + for (var y = 0; y < div_y; ++y) { + for (var x = 0; x < div_x; ++x) { + var i00 = voffset + (div_x + 1) * y + x; // 左下頂点 + + var i10 = i00 + 1; // 右下頂点 + + var i01 = i00 + div_x + 1; // 左上頂点 + + var i11 = i01 + 1; // 右上頂点 + // 左下三角形 + + indices[index++] = i00; + indices[index++] = i10; + indices[index++] = i01; // 右上三角形 + + indices[index++] = i01; + indices[index++] = i10; + indices[index++] = i11; + } + } + + return index; + } + }]); + + return RectSubmesh; +}(Submesh); +/** + * @summary 凸多角形集合サブメッシュ + * + * @private + */ + + +var PolygonsSubmesh = +/*#__PURE__*/ +function (_Submesh2) { + _inherits(PolygonsSubmesh, _Submesh2); + + /** + * this の生存中はパラメータのオブジェクトを変更しないこと。 + * + * @param {number[]} arit_coords 領域の三角形座標配列 (左下または右上の三角形) + * @param {iterable.} polygons arit_coords の上にある凸多角形集合 + */ + function PolygonsSubmesh(arit_coords, polygons) { + var _this7; + + _classCallCheck(this, PolygonsSubmesh); + + _this7 = _possibleConstructorReturn(this, _getPrototypeOf(PolygonsSubmesh).call(this)); + _this7._arit_coords = arit_coords; + _this7._polygons = polygons; + _this7._num_vertices = 0; + _this7._num_triangles = 0; + var _iteratorNormalCompletion17 = true; + var _didIteratorError17 = false; + var _iteratorError17 = undefined; + + try { + for (var _iterator17 = polygons[Symbol.iterator](), _step17; !(_iteratorNormalCompletion17 = (_step17 = _iterator17.next()).done); _iteratorNormalCompletion17 = true) { + var polygon = _step17.value; + _this7._num_vertices += polygon.num_vertices; + _this7._num_triangles += polygon.num_vertices - 2; + } + } catch (err) { + _didIteratorError17 = true; + _iteratorError17 = err; + } finally { + try { + if (!_iteratorNormalCompletion17 && _iterator17["return"] != null) { + _iterator17["return"](); + } + } finally { + if (_didIteratorError17) { + throw _iteratorError17; + } + } + } + + return _this7; + } + /** + * @override + */ + + + _createClass(PolygonsSubmesh, [{ + key: "getNumVertices", + value: function getNumVertices() { + return this._num_vertices; + } + /** + * @override + */ + + }, { + key: "getNumTriangles", + value: function getNumTriangles() { + return this._num_triangles; + } + /** + * @override + */ + + }, { + key: "addVertices", + value: function addVertices(origin, sampler, vertices, offset) { + var plane = this._get_elevation_plane(sampler); + + var index = offset; + var _iteratorNormalCompletion18 = true; + var _didIteratorError18 = false; + var _iteratorError18 = undefined; + + try { + for (var _iterator18 = this._polygons[Symbol.iterator](), _step18; !(_iteratorNormalCompletion18 = (_step18 = _iterator18.next()).done); _iteratorNormalCompletion18 = true) { + var polygon = _step18.value; + index = this._add_polygon_vertices(polygon, plane, origin, vertices, index); + } + } catch (err) { + _didIteratorError18 = true; + _iteratorError18 = err; + } finally { + try { + if (!_iteratorNormalCompletion18 && _iterator18["return"] != null) { + _iterator18["return"](); + } + } finally { + if (_didIteratorError18) { + throw _iteratorError18; + } + } + } + + return index; + } + /** + * @override + */ + + }, { + key: "addIndices", + value: function addIndices(voffset, indices, ioffset) { + var iofs_next = ioffset; + var vofs_next = voffset; + var _iteratorNormalCompletion19 = true; + var _didIteratorError19 = false; + var _iteratorError19 = undefined; + + try { + for (var _iterator19 = this._polygons[Symbol.iterator](), _step19; !(_iteratorNormalCompletion19 = (_step19 = _iterator19.next()).done); _iteratorNormalCompletion19 = true) { + var polygon = _step19.value; + iofs_next = this._add_polygon_indices(polygon, vofs_next, indices, iofs_next); + vofs_next += polygon.num_vertices; + } + } catch (err) { + _didIteratorError19 = true; + _iteratorError19 = err; + } finally { + try { + if (!_iteratorNormalCompletion19 && _iterator19["return"] != null) { + _iterator19["return"](); + } + } finally { + if (_didIteratorError19) { + throw _iteratorError19; + } + } + } + + return iofs_next; + } + /** + * @summary 凸多角形の頂点を追加 + * + * @param {mapray.ConvexPolygon} polygon 凸多角形 + * @param {number[]} plane 平面係数 + * @param {mapray.Vector3} origin 座標系の原点 (GOCS) + * @param {number[]} vertices 書き込み先の配列 + * @param {number} offset 書き込み開始インデックス + * + * @return {number} offset + 書き込んだ要素数 + * + * @private + */ + + }, { + key: "_add_polygon_vertices", + value: function _add_polygon_vertices(polygon, plane, origin, vertices, offset) { + var index = offset; + var num_vertices = polygon.num_vertices; + var src_vertices = polygon.vertices; + + for (var vi = 0; vi < num_vertices; ++vi) { + var mx = src_vertices[2 * vi]; + var my = src_vertices[2 * vi + 1]; + var ey = Math.exp(my); + var ey2 = ey * ey; + var sinλ = Math.sin(mx); + var cosλ = Math.cos(mx); + var sinφ = (ey2 - 1) / (ey2 + 1); + var cosφ = 2 * ey / (ey2 + 1); // mx*plane[0] + my*plane[1] + height*plane[2] + plane[3] == 0 + + var height = -(mx * plane[0] + my * plane[1] + plane[3]) / plane[2]; + var radius = GeoMath.EARTH_RADIUS + height; // 法線 (GOCS) + + var nx = cosφ * cosλ; + var ny = cosφ * sinλ; + var nz = sinφ; // 位置 (GOCS) + + var gx = radius * nx; + var gy = radius * ny; + var gz = radius * nz; + vertices[index++] = gx - origin[0]; // x + + vertices[index++] = gy - origin[1]; // y + + vertices[index++] = gz - origin[2]; // z + + vertices[index++] = nx; // nx + + vertices[index++] = ny; // ny + + vertices[index++] = nz; // nz + } + + return index; + } + /** + * @summary 凸多角形のインデックスを追加 + * + * @param {mapray.ConvexPolygon} polygon 凸多角形 + * @param {number} voffset this 用頂点の先頭の頂点インデックス + * @param {number[]} indices 書き込み先の配列 + * @param {number} ioffset 書き込み開始インデックス + * + * @return {number} ioffset + 書き込んだ要素数 + * + * @private + */ + + }, { + key: "_add_polygon_indices", + value: function _add_polygon_indices(polygon, voffset, indices, ioffset) { + var index = ioffset; + var num_triangles = polygon.num_vertices - 2; + + for (var i = 1; i <= num_triangles; ++i) { + indices[index++] = voffset; + indices[index++] = voffset + i; + indices[index++] = voffset + i + 1; + } + + return index; + } + /** + * @summary 平面ベースで標高を計算するための係数を取得 + * + * @param {mapray.Sampler} sampler + * + * @return {number[]} 平面係数 [x, y, z, w] + * + * @private + */ + + }, { + key: "_get_elevation_plane", + value: function _get_elevation_plane(sampler) { + var coords = this._arit_coords; // 三角形の頂点の高さを取得 + + var z_coords = new Array(3); + + for (var i = 0; i < 3; ++i) { + var mx = coords[2 * i]; + var my = coords[2 * i + 1]; + z_coords[i] = sampler.sample(mx, my); + } + + var ox = coords[0]; + var oy = coords[1]; + var oz = z_coords[0]; + var x1 = coords[2] - ox; + var y1 = coords[3] - oy; + var z1 = z_coords[1] - oz; + var x2 = coords[4] - ox; + var y2 = coords[5] - oy; + var z2 = z_coords[2] - oz; // [nx, ny, nz] = [x1, y1, z1] x [x2, y2, z2] + + var nx = y1 * z2 - z1 * y2; + var ny = z1 * x2 - x1 * z2; + var nz = x1 * y2 - y1 * x2; + return [nx, ny, nz, -ox * nx - oy * ny - oz * nz]; + } + }]); + + return PolygonsSubmesh; +}(Submesh); +/** + * @summary 配列からベクトルを設定 + * + * array[index] から vec に設定する。 + * + * @private + */ + + +function setArrayToVec3(array, index, vec) { + vec[0] = array[index]; + vec[1] = array[index + 1]; + vec[2] = array[index + 2]; +} +/** + * @summary 配列からベクトルを設定 + * + * vec から array[index] に設定する。 + * + * @private + */ + + +function setVec3ToArray(vec, array, index) { + array[index] = vec[0]; + array[index + 1] = vec[1]; + array[index + 2] = vec[2]; +} +/** + * @summary 3頂点から正規化法線ベクトルを設定 + * @private + */ + + +function setTriangleNormal(p0, p1, p2, normal) { + for (var i = 0; i < 3; ++i) { + temp_normal_ax[i] = p1[i] - p0[i]; + temp_normal_ay[i] = p2[i] - p0[i]; + } + + GeoMath.cross3(temp_normal_ax, temp_normal_ay, normal); + GeoMath.normalize3(normal, normal); + return normal; +} + +var temp_normal_ax = GeoMath.createVector3(); +var temp_normal_ay = GeoMath.createVector3(); +/** + * @summary 内部ステータス + * @enum {object} + * @constant + * @private + */ + +var Status$3 = { + INVALID: { + id: "INVALID" + }, + NORMAL: { + id: "NORMAL" + }, + TRIANGLE_DIRTY: { + id: "TRIANGLE_DIRTY" + }, + MESH_DIRTY: { + id: "MESH_DIRTY" + } +}; + +// https://tc39.github.io/ecma262/#sec-typedarray-objects + +typedArrayConstructor('Int8', function (init) { + return function Int8Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + +/** + * glTF の bufferView に対応 + * @memberof mapray.gltf + * @private + */ +var BufferView = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {number} index バッファビュー索引 + */ + function BufferView(ctx, index) { + _classCallCheck(this, BufferView); + + // glTF の bufferView オブジェクト (specification/2.0/schema/bufferView.schema.json) + var jbufferView = ctx.gjson.bufferViews[index]; + this._buffer = ctx.findBuffer(jbufferView.buffer); + this._byteLength = jbufferView.byteLength; + this._target = jbufferView.target; // ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER + + this._byteOffset = jbufferView.byteOffset !== undefined ? jbufferView.byteOffset : 0; + this._byteStride = jbufferView.byteStride !== undefined ? jbufferView.byteStride : 0; + } + /** + * 参照する gltf.Buffer インスタンスを取得 + * @type {mapray.gltf.Buffer} + * @readonly + */ + + + _createClass(BufferView, [{ + key: "rebuildBySplitter", + + /** + * バッファ分割用の再構築処理 + * + * @param {mapray.gltf.Buffer} buffer 部分バッファ + */ + value: function rebuildBySplitter(buffer) { + // 部分バッファ全体を参照するようにする + this._buffer = buffer; + this._byteLength = buffer.byteLength; + this._byteOffset = 0; + } + }, { + key: "buffer", + get: function get() { + return this._buffer; + } + /** + * ファッファ先頭からのバイトオフセット + * @type {number} + * @readonly + */ + + }, { + key: "byteOffset", + get: function get() { + return this._byteOffset; + } + /** + * インタリーブのバイトストライド + * @type {number} + * @readonly + */ + + }, { + key: "byteStride", + get: function get() { + return this._byteStride; + } + }]); + + return BufferView; +}(); + +/** + * glTF の accessor に対応 + * @memberof mapray.gltf + * @private + */ + +var Accessor = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {number} index アクセサ索引 + */ + function Accessor(ctx, index) { + _classCallCheck(this, Accessor); + + // glTF の accessor オブジェクト (specification/2.0/schema/accessor.schema.json) + var jaccessor = ctx.gjson.accessors[index]; + this._type = jaccessor.type; // 文字列: SCALAR, VEC2, VEC3, VEC4, MAT2, MAT3, MAT4 + + this._componentType = jaccessor.componentType; // GL_UNSIGNED_INT ... + + this._count = jaccessor.count; // >= 1 + + this._bufferView = new BufferView(ctx, jaccessor.bufferView); + this._byteOffset = jaccessor.byteOffset !== undefined ? jaccessor.byteOffset : 0; + this._normalized = jaccessor.normalized || false; + this._min = jaccessor.min ? jaccessor.min.slice() : null; + this._max = jaccessor.max ? jaccessor.max.slice() : null; + this._index = index; + } + /** + * 対応する glTF オブジェクトでの索引を取得 + * @type {number} + * @readonly + */ + + + _createClass(Accessor, [{ + key: "getRangeInBuffer", + + /** + * バッファ内でのデータ範囲を取得 + * + * @return {object} データ範囲 = { first: 先頭オフセット, last: 末尾オフセット + 1 } + */ + value: function getRangeInBuffer() { + var view = this._bufferView; + var compo_size = Accessor._ComponentData[this._componentType].bytes; + var data_size = compo_size * Accessor._NumComponents[this._type]; // データのバイト数 + + var stride = view.byteStride == 0 ? data_size : view.byteStride; // ストライド + + var first_offset = this._byteOffset + view.byteOffset; // バッファ内での先頭オフセット + + return { + first: first_offset, + last: first_offset + stride * (this._count - 1) + data_size // バッファ内での末尾オフセット + 1 + + }; + } + /** + * バイトオーダーを修正 + * + * @param {mapray.BitVector} modmap 修正マップ + */ + + }, { + key: "modifyByteOrder", + value: function modifyByteOrder(modmap) { + var compo_data = Accessor._ComponentData[this._componentType]; + var compo_bytes = compo_data.bytes; + + if (compo_bytes == 1) { + return; // 1 バイト要素はバイトオーダーがないので処理しない + } + + var num_compos = Accessor._NumComponents[this._type]; // 属性の要素数 + + var byte_offset = this._byteOffset + this._bufferView.byteOffset; // バッファ先頭からのバイト数 + + var compo_stride = this._bufferView.byteStride == 0 ? // 要素単位のストライド + num_compos : this._bufferView.byteStride / compo_bytes; + var arraybuffer = this._bufferView.buffer.binary; + var dataview = new DataView(arraybuffer, byte_offset); + var typedarray = new compo_data.typedarray(arraybuffer, byte_offset); + var getCompo = compo_data.getcompo; // DataView データ取得関数 + + var compo_shorts = compo_bytes / 2; // 1 要素の short 数 + + var short_offset = byte_offset / 2; // バッファ先頭からの short 数 + + var short_stride = compo_stride * compo_shorts; // short 単位のストライド + + for (var i = 0; i < this._count; ++i) { + var short_base_index = short_offset + i * short_stride; + var compo_base_index = i * compo_stride; + + for (var c = 0; c < num_compos; ++c) { + var short_index = short_base_index + c * compo_shorts; + + if (modmap.getBit(short_index)) { + continue; // すでに修正済みの要素なのでスキップ + } + + var compo_index = compo_base_index + c; // リトルエンディアン (glTF 仕様) を想定して要素を読み込む + + var value = getCompo.call(dataview, compo_index * compo_bytes, true); // ネイティブエンディアン (WebGL 仕様) で要素を書き戻す + + typedarray[compo_index] = value; + modmap.setBit(short_index, true); + } + } + } + /** + * 範囲チェック + * + * @param {number} first バッファに対する開始位置 + * @param {number} last バッファに対する終了位置 + 1 + * @return {boolean} 最初のバイトが範囲に含まれるか? + */ + + }, { + key: "isIncluded", + value: function isIncluded(first, last) { + var byte_offset = this._byteOffset + this._bufferView.byteOffset; + return first <= byte_offset && byte_offset < last; + } + /** + * バッファ分割用の再構築処理 + * + * @param {mapray.gltf.Buffer} buffer 部分バッファ + * @param {number} first 元バッファに対する buffer の開始位置 + */ + + }, { + key: "rebuildBySplitter", + value: function rebuildBySplitter(buffer, first) { + this._index = -1; // 元バッファ先頭からのデータのバイト位置 + + var old_byte_offset = this._byteOffset + this._bufferView.byteOffset; // 部分バッファ先頭からのデータのバイト位置 + + this._byteOffset = old_byte_offset - first; // bufferView を部分バッファと一致するように更新 + + this._bufferView.rebuildBySplitter(buffer); + } + }, { + key: "index", + get: function get() { + return this._index; + } + /** + * 参照する gltf.BufferView インスタンスを取得 + * @type {mapray.gltf.BufferView} + * @readonly + */ + + }, { + key: "bufferView", + get: function get() { + return this._bufferView; + } + /** + * データの型を取得 + * @type {string} + * @readonly + */ + + }, { + key: "type", + get: function get() { + return this._type; + } + /** + * データ要素の型を取得 + * @type {number} + * @readonly + */ + + }, { + key: "componentType", + get: function get() { + return this._componentType; + } + /** + * データの個数を取得 + * @type {number} + * @readonly + */ + + }, { + key: "count", + get: function get() { + return this._count; + } + /** + * バッファビュー先頭からのバイトオフセットを取得 + * @type {number} + * @readonly + */ + + }, { + key: "byteOffset", + get: function get() { + return this._byteOffset; + } + /** + * 正規化するか? + * @type {boolean} + * @readonly + */ + + }, { + key: "normalized", + get: function get() { + return this._normalized; + } + /** + * 座標の最小値 + * @type {?number[]} + * @readonly + */ + + }, { + key: "min", + get: function get() { + return this._min; + } + /** + * 座標の最大値 + * @type {?number[]} + * @readonly + */ + + }, { + key: "max", + get: function get() { + return this._max; + } + }]); + + return Accessor; +}(); + +Accessor._NumComponents = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 +}; +Accessor._ComponentData = { + 5120: { + bytes: 1, + getcompo: DataView.prototype.getInt8, + typedarray: Int8Array + }, + // BYTE + 5121: { + bytes: 1, + getcompo: DataView.prototype.getUint8, + typedarray: Uint8Array + }, + // UNSIGNED_BYTE + 5122: { + bytes: 2, + getcompo: DataView.prototype.getInt16, + typedarray: Int16Array + }, + // SHORT + 5123: { + bytes: 2, + getcompo: DataView.prototype.getUint16, + typedarray: Uint16Array + }, + // UNSIGNED_SHORT + 5125: { + bytes: 4, + getcompo: DataView.prototype.getUint32, + typedarray: Uint32Array + }, + // UNSIGNED_INT + 5126: { + bytes: 4, + getcompo: DataView.prototype.getFloat32, + typedarray: Float32Array + } // FLOAT + +}; + +/** + * glTF の material に対応 + * @memberof mapray.gltf + * @private + */ + +var Material$1 = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {number} index マテリアル索引 + */ + function Material(ctx, index) { + _classCallCheck(this, Material); + + var jmaterial = ctx.gjson.materials[index]; + this._commonData = new CommonData(jmaterial, ctx); + this._pbrMetallicRoughness = { + baseColorFactor: [1.0, 1.0, 1.0, 1.0], + baseColorTexture: null, + metallicFactor: 1.0, + roughnessFactor: 1.0, + metallicRoughnessTexture: null + }; + this._doubleSided = false; + this._alphaMode = "OPAQUE"; + this._alphaCutoff = 0.5; + this._emissiveFactor = [0.0, 0.0, 0.0]; + this._emissiveTexture = null; + this._normalTexture = null; + this._occlusionTexture = null; // glTF の material オブジェクト (specification/2.0/schema/material.schema.json) + + this._setupPbrMetallicRoughness(jmaterial, ctx); + + this._setupGenericParameters(jmaterial, ctx); + } + /** + * glTF オブジェクトの共通データ + * + * @type {mapray.gltf.CommonData} + * @readonly + */ + + + _createClass(Material, [{ + key: "_setupPbrMetallicRoughness", + + /** + * this._pbrMetallicRoughness を設定 + * + * @param {object} jmaterial glTF の material オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @private + */ + value: function _setupPbrMetallicRoughness(jmaterial, ctx) { + if (jmaterial.pbrMetallicRoughness === undefined) { + return; + } // glTF の pbrMetallicRoughness オブジェクト (specification/2.0/schema/material.pbrMetallicRoughness.schema.json) + + + var src = jmaterial.pbrMetallicRoughness; + var dst = this._pbrMetallicRoughness; + + if (src.baseColorFactor !== undefined) { + dst.baseColorFactor = src.baseColorFactor.slice(); + } + + if (src.baseColorTexture !== undefined) { + dst.baseColorTexture = new TextureInfo(src.baseColorTexture, ctx); + ctx.addTextureInfo(dst.baseColorTexture); + } + + if (src.metallicFactor !== undefined) { + dst.metallicFactor = src.metallicFactor; + } + + if (src.roughnessFactor !== undefined) { + dst.roughnessFactor = src.roughnessFactor; + } + + if (src.metallicRoughnessTexture !== undefined) { + dst.metallicRoughnessTexture = new TextureInfo(src.metallicRoughnessTexture, ctx); + ctx.addTextureInfo(dst.metallicRoughnessTexture); + } + } + /** + * this._doubleSided などを設定 + * + * @param {object} jmaterial glTF の material オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @private + */ + + }, { + key: "_setupGenericParameters", + value: function _setupGenericParameters(jmaterial, ctx) { + if (jmaterial.doubleSided !== undefined) { + this._doubleSided = jmaterial.doubleSided; + } + + if (jmaterial.alphaMode !== undefined) { + this._alphaMode = jmaterial.alphaMode; + } + + if (jmaterial.alphaCutoff !== undefined) { + this._alphaCutoff = jmaterial.alphaCutoff; + } + + if (jmaterial.emissiveFactor !== undefined) { + this._emissiveFactor = jmaterial.emissiveFactor.slice(); + } + + if (jmaterial.emissiveTexture !== undefined) { + this._emissiveTexture = new TextureInfo(jmaterial.emissiveTexture, ctx); + ctx.addTextureInfo(this._emissiveTexture); + } + + if (jmaterial.normalTexture !== undefined) { + this._normalTexture = new NormalTextureInfo(jmaterial.normalTexture, ctx); + ctx.addTextureInfo(this._normalTexture); + } + + if (jmaterial.occlusionTexture !== undefined) { + this._occlusionTexture = new OcclusionTextureInfo(jmaterial.occlusionTexture, ctx); + ctx.addTextureInfo(this._occlusionTexture); + } + } + }, { + key: "commonData", + get: function get() { + return this._commonData; + } + /** + * MetallicRoughness PBR パラメータ + * @type {object} + * @readonly + */ + + }, { + key: "pbrMetallicRoughness", + get: function get() { + return this._pbrMetallicRoughness; + } + /** + * 両面レンダリングの有無 + * @type {boolean} + * @readonly + */ + + }, { + key: "doubleSided", + get: function get() { + return this._doubleSided; + } + /** + * αモード + * @type {string} + * @readonly + */ + + }, { + key: "alphaMode", + get: function get() { + return this._alphaMode; + } + /** + * αカットオフ + * @type {number} + * @readonly + */ + + }, { + key: "alphaCutoff", + get: function get() { + return this._alphaCutoff; + } + /** + * 自己発光係数 + * @type {mapray.Vector3} + * @readonly + */ + + }, { + key: "emissiveFactor", + get: function get() { + return this._emissiveFactor; + } + /** + * 自己発光テクスチャ + * @type {?mapray.gltf.TextureInfo} + * @readonly + */ + + }, { + key: "emissiveTexture", + get: function get() { + return this._emissiveTexture; + } + /** + * 法線テクスチャ + * @type {?mapray.gltf.NormalTextureInfo} + * @readonly + */ + + }, { + key: "normalTexture", + get: function get() { + return this._normalTexture; + } + /** + * 遮蔽テクスチャ + * @type {?mapray.gltf.OcclusionTextureInfo} + * @readonly + */ + + }, { + key: "occlusionTexture", + get: function get() { + return this._occlusionTexture; + } + }]); + + return Material; +}(); + +/** + * glTF の primitive に対応 + * @memberof mapray.gltf + * @private + */ + +var Primitive$1 = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {object} jprimitive glTF の primitive オブジェクト (specification/2.0/schema/mesh.primitive.schema.json) + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + */ + function Primitive(jprimitive, ctx) { + _classCallCheck(this, Primitive); + + this._mode = jprimitive.mode !== undefined ? jprimitive.mode : 4; + this._attributes = {}; + this._indices = null; + this._material = null; + + this._setupAttributes(jprimitive.attributes, ctx); + + this._setupIndices(jprimitive, ctx); + + this._setupMaterial(jprimitive, ctx); + } + /** + * プリミティブモード + * + * @type {number} + * @readonly + */ + + + _createClass(Primitive, [{ + key: "_setupAttributes", + + /** + * this._attributes を設定 + * + * @param {object} jattributes glTF の primitive/attributes オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @private + */ + value: function _setupAttributes(jattributes, ctx) { + for (var name in jattributes) { + var accessor = new Accessor(ctx, jattributes[name]); + this._attributes[name] = accessor; + ctx.addAccessor(accessor, "ATTRIBUTE"); + } + } + /** + * this._indices を設定 + * + * @param {object} jprimitive glTF の primitive オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @private + */ + + }, { + key: "_setupIndices", + value: function _setupIndices(jprimitive, ctx) { + if (jprimitive.indices !== undefined) { + var accessor = new Accessor(ctx, jprimitive.indices); + this._indices = accessor; + ctx.addAccessor(accessor, "INDEX"); + } + } + /** + * this._material を設定 + * + * @param {object} jprimitive glTF の primitive オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @private + */ + + }, { + key: "_setupMaterial", + value: function _setupMaterial(jprimitive, ctx) { + if (jprimitive.material !== undefined) { + this._material = new Material$1(ctx, jprimitive.material); + } + } + }, { + key: "mode", + get: function get() { + return this._mode; + } + /** + * @summary 頂点属性の辞書 + * + *

頂点属性名から Accessor を引く辞書

+ * + * @type {object} + * @readonly + */ + + }, { + key: "attributes", + get: function get() { + return this._attributes; + } + /** + * インデックス + * + * @type {?mapray.gltf.Accessor} + * @readonly + */ + + }, { + key: "indices", + get: function get() { + return this._indices; + } + /** + * マテリアル + * + * @type {?mapray.gltf.Material} + * @readonly + */ + + }, { + key: "material", + get: function get() { + return this._material; + } + }]); + + return Primitive; +}(); + +/** + * glTF の mesh に対応 + * @memberof mapray.gltf + * @private + */ + +var Mesh$1 = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {number} index メッシュ索引 + */ + function Mesh(ctx, index) { + _classCallCheck(this, Mesh); + + this._primitives = []; // glTF の mesh オブジェクト (specification/2.0/schema/mesh.schema.json) + + var jmesh = ctx.gjson.meshes[index]; + var jprimitives = jmesh.primitives; + + for (var i = 0; i < jprimitives.length; ++i) { + // glTF の primitive オブジェクト (specification/2.0/schema/mesh.primitive.schema.json) + var jprimitive = jprimitives[i]; + + this._primitives.push(new Primitive$1(jprimitive, ctx)); + } + } + /** + * プリミティブの配列を取得 + * + * @type {mapray.gltf.Primitive[]} + * @readonly + */ + + + _createClass(Mesh, [{ + key: "primitives", + get: function get() { + return this._primitives; + } + }]); + + return Mesh; +}(); + +/** + * glTF の node に対応 + * @memberof mapray.gltf + * @private + */ + +var Node$1 = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {number} index ノード索引 + */ + function Node(ctx, index) { + _classCallCheck(this, Node); + + // glTF の node オブジェクト (specification/2.0/schema/node.schema.json) + var jnode = ctx.gjson.nodes[index]; + this._commonData = new CommonData(jnode, ctx); + this._children = []; + this._matrix = null; + this._mesh = null; + + this._setupChildren(jnode, ctx); + + this._setupMatrix(jnode); + + this._setupMesh(jnode, ctx); + } + /** + * glTF オブジェクトの共通データ + * + * @type {mapray.gltf.CommonData} + * @readonly + */ + + + _createClass(Node, [{ + key: "_setupChildren", + + /** + * this._children を設定 + * + * @param {object} jnode glTF の node オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @private + */ + value: function _setupChildren(jnode, ctx) { + var children = jnode.children; + if (children === undefined) return; + + for (var i = 0; i < children.length; ++i) { + var index = children[i]; + + this._children.push(new Node(ctx, index)); + } + } + /** + * this._matrix を設定 + * + * @param {object} jnode glTF の node オブジェクト + * @private + */ + + }, { + key: "_setupMatrix", + value: function _setupMatrix(jnode) { + if (jnode.matrix) { + // 行列指定 + this._matrix = GeoMath.createMatrix(jnode.matrix); + } else if (jnode.scale || jnode.rotation || jnode.translation) { + // SQT 指定 + var _ref = jnode.scale || [1, 1, 1], + _ref2 = _slicedToArray(_ref, 3), + sx = _ref2[0], + sy = _ref2[1], + sz = _ref2[2]; + + var _ref3 = jnode.rotation || [0, 0, 0, 1], + _ref4 = _slicedToArray(_ref3, 4), + qx = _ref4[0], + qy = _ref4[1], + qz = _ref4[2], + qw = _ref4[3]; + + var _ref5 = jnode.translation || [0, 0, 0], + _ref6 = _slicedToArray(_ref5, 3), + tx = _ref6[0], + ty = _ref6[1], + tz = _ref6[2]; // [ 1 - 2y^2 - 2z^2, 2x y - 2w z, 2x z + 2w y ] + // rotation[x, y, z, w] = [ 2x y + 2w z, 1 - 2x^2 - 2z^2, 2y z - 2w x ] + // [ 2x z - 2w y, 2y z + 2w x, 1 - 2x^2 - 2y^2 ] + + + this._matrix = GeoMath.createMatrix([(1 - 2 * (qy * qy + qz * qz)) * sx, 2 * (qx * qy + qz * qw) * sx, 2 * (qx * qz - qy * qw) * sx, 0, 2 * (qx * qy - qz * qw) * sy, (1 - 2 * (qx * qx + qz * qz)) * sy, 2 * (qx * qw + qy * qz) * sy, 0, 2 * (qy * qw + qx * qz) * sz, 2 * (qy * qz - qx * qw) * sz, (1 - 2 * (qx * qx + qy * qy)) * sz, 0, tx, ty, tz, 1]); + } + } + /** + * this._mesh を設定 + * + * @param {object} jnode glTF の node オブジェクト + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @private + */ + + }, { + key: "_setupMesh", + value: function _setupMesh(jnode, ctx) { + var index = jnode.mesh; + if (index === undefined) return; // メッシュなしのノード + + this._mesh = new Mesh$1(ctx, index); + } + }, { + key: "commonData", + get: function get() { + return this._commonData; + } + /** + * 子ノードの配列を取得 + * @type {mapray.gltf.Node[]} + * @readonly + */ + + }, { + key: "children", + get: function get() { + return this._children; + } + /** + * 変換行列を取得 + * @type {?mapray.Matrix} + * @readonly + */ + + }, { + key: "matrix", + get: function get() { + return this._matrix; + } + /** + * メッシュを取得 + * @type {?mapray.gltf.Mesh} + * @readonly + */ + + }, { + key: "mesh", + get: function get() { + return this._mesh; + } + }]); + + return Node; +}(); + +/** + * @summary glTF scene + * + * @classdesc + *

glTF の scene に対応するオブジェクトである。

+ * + * @memberof mapray.gltf + * @private + * @see https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/schema/scene.schema.json + */ + +var Scene$1 = +/*#__PURE__*/ +function () { + /** + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {number} index シーン索引 + */ + function Scene(ctx, index) { + _classCallCheck(this, Scene); + + // glTF の scene オブジェクト + var jscene = ctx.gjson.scenes[index]; + this._commonData = new CommonData(jscene, ctx); + this._root_nodes = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = (jscene.nodes || [])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var node_index = _step.value; + + this._root_nodes.push(new Node$1(ctx, node_index)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * glTF オブジェクトの共通データ + * + * @type {mapray.gltf.CommonData} + * @readonly + */ + + + _createClass(Scene, [{ + key: "commonData", + get: function get() { + return this._commonData; + } + /** + * 最上位ノードの配列 + * + * @type {mapray.gltf.Node[]} + * @readonly + */ + + }, { + key: "root_nodes", + get: function get() { + return this._root_nodes; + } + /** + * @summary シーン名を取得 + * + *

シーン名が存在すればシーン名の文字列を返し、存在しなければ null を返す。

+ * + * @type {?string} + * @readonly + */ + + }, { + key: "name", + get: function get() { + return this._commonData.getName(); + } + }]); + + return Scene; +}(); + +/** + * バッファの分割を補助 + * + * @memberof mapray.gltf + * @private + */ +var BufferSplitter = +/*#__PURE__*/ +function () { + /** + */ + function BufferSplitter() { + _classCallCheck(this, BufferSplitter); + + // 処理しやすいように最初と最後はにダミーの断片を置く + var frag0 = new Fragment(-2, -1); + var frag1 = new Fragment(Math.pow(2, 32) + 1, Math.pow(2, 32) + 2); + frag0.next = frag1; + frag1.prev = frag0; + this._fragments = frag0; + } + /** + * 分割を更新 + * + * @param {mapray.gltf.Accessor} accessor バッファを参照するアクセサ + */ + + + _createClass(BufferSplitter, [{ + key: "update", + value: function update(accessor) { + var range = accessor.getRangeInBuffer(); + + this._updateByRange({ + first: BufferSplitter._floor4(range.first), + last: range.last + }); + } + /** + * 分割の更新を終了 + * + * @param {mapray.gltf.Buffer} buffer 分割されるバッファ + */ + + }, { + key: "close", + value: function close(buffer) { + // 先頭のダミーを削除 + this._fragments = this._fragments.next; // 部分バッファを設定 + + for (var frag = this._fragments;; frag = frag.next) { + if (frag.next === null) { + // 最後のダミーを削除 + frag.prev.next = null; + break; + } + + frag.buffer = buffer.createSubBuffer(frag.first, frag.last); + } + } + /** + * アクセサを部分バッファで再構築 + * + * @param {mapray.gltf.Accessor} accessor 再構築するアクセサ + */ + + }, { + key: "rebuildAccessor", + value: function rebuildAccessor(accessor) { + for (var frag = this._fragments; frag !== null; frag = frag.next) { + if (accessor.isIncluded(frag.first, frag.last)) { + accessor.rebuildBySplitter(frag.buffer, frag.first); + break; + } + } + } + /** + * 分割を更新 + * + * @param {object} range Accessor の範囲 + * @private + */ + + }, { + key: "_updateByRange", + value: function _updateByRange(range) { + for (var frag = this._fragments; frag.next !== null;) { + if (frag.isInside(range)) { + // frag 断片と frag.next 断片の間に新しい range 断片を挿入 + var frag0 = frag; + var frag1 = frag.next; + var fragx = new Fragment(range.first, range.last); + frag0.next = fragx; + frag1.prev = fragx; + fragx.prev = frag0; + fragx.next = frag1; + break; + } else if (frag.isTouch(range)) { + // range に frag を統合し、frag を削除し、frag.prev から始める + var _frag = frag.prev; + var _frag2 = frag.next; + _frag.next = _frag2; + _frag2.prev = _frag; + range = frag.mergeRange(range); + frag = _frag; + } else { + frag = frag.next; + } + } + } + /** + * 4 の倍数に切り下げ + * + * @param {number} value 切り下げる値 + * @return {number} value を 4 の倍数に切り下げた整数 + * @private + */ + + }], [{ + key: "_floor4", + value: function _floor4(value) { + return 4 * Math.floor(value / 4); + } + }]); + + return BufferSplitter; +}(); +/** + * バッファの断片 + * + * @memberof mapray.gltf.BufferSplitter + * @private + */ + + +var Fragment = +/*#__PURE__*/ +function () { + /** + * @param {number} first 先頭オフセット + * @param {number} last 末尾オフセット + 1 + */ + function Fragment(first, last) { + _classCallCheck(this, Fragment); + + this.first = first; + this.last = last; + this.buffer = null; // 部分バッファ + + this.prev = null; + this.next = null; + } + /** + * range は frag と frag.next の間の内側か? + * + * @param {object} range + * @return {boolean} + * @private + */ + + + _createClass(Fragment, [{ + key: "isInside", + value: function isInside(range) { + return this.last < range.first && range.last < this.next.first; + } + /** + * range は frag と接触しているか? + * + * @param {object} range + * @return {boolean} + */ + + }, { + key: "isTouch", + value: function isTouch(range) { + return this.last >= range.first && range.last >= this.first; + } + /** + * this と range を結合した range を取得 + * + * @param {object} range + * @return {object} + */ + + }, { + key: "mergeRange", + value: function mergeRange(range) { + return { + first: Math.min(this.first, range.first), + last: Math.max(this.last, range.last) + }; + } + }]); + + return Fragment; +}(); + +/** + * @summary ビット配列 + * + * @memberof mapray + * @private + */ +var BitVector = +/*#__PURE__*/ +function () { + /** + * 初期値はすべてのビットが false である。 + * + * @param {number} length ビット数 + */ + function BitVector(length) { + _classCallCheck(this, BitVector); + + this._length = length; + this._array = new Uint32Array(Math.ceil(length / 32)); + } + /** + * @summary ビット数 + * @type {number} + * @readonly + */ + + + _createClass(BitVector, [{ + key: "setBit", + + /** + * @summary ビットを設定 + * + * @param {number} index インデックス + * @param {boolean} value 値 + */ + value: function setBit(index, value) { + var uint32_index = Math.floor(index / 32); + var uint32_value = this._array[uint32_index]; + var uint32_mask = 1 << index % 32; + this._array[uint32_index] = value ? uint32_value | uint32_mask : uint32_value & ~uint32_mask; + } + /** + * @summary ビットを取得 + * + * @param {number} index インデックス + * @return {boolean} 値 + */ + + }, { + key: "getBit", + value: function getBit(index) { + var uint32_index = Math.floor(index / 32); + var uint32_value = this._array[uint32_index]; + var uint32_mask = 1 << index % 32; + return (uint32_value & uint32_mask) != 0; + } + }, { + key: "length", + get: function get() { + return this._length; + } + }]); + + return BitVector; +}(); + +/** + * コンテキストでの Buffer 管理アイテム + * + * @memberof mapray.gltf + * @private + */ + +var BufferEntry = +/*#__PURE__*/ +function () { + /** + * @param {mapray.gltf.Buffer} buffer バッファ + */ + function BufferEntry(buffer) { + _classCallCheck(this, BufferEntry); + + this._buffer = buffer; + this._attrib_accessors = []; + this._index_accessors = []; + } + /** + * 管理対象のバッファを取得 + * + * @type {mapray.gltf.Buffer} + * @readonly + */ + + + _createClass(BufferEntry, [{ + key: "addAttributeAccessor", + + /** + * 頂点属性で使われている Accessor インスタンスを追加 + */ + value: function addAttributeAccessor(accessor) { + this._attrib_accessors.push(accessor); + } + /** + * インデックスで使われている Accessor インスタンスを追加 + */ + + }, { + key: "addIndexAccessor", + value: function addIndexAccessor(accessor) { + this._index_accessors.push(accessor); + } + /** + * バイナリをマシンのバイトオーダーに合わせて書き換え + */ + + }, { + key: "rewriteByteOrder", + value: function rewriteByteOrder() { + var modmap = new BitVector(Math.ceil(this._buffer.byteLength / 2)); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._getUnitedOriginalAccessors()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var accessor = _step.value; + accessor.modifyByteOrder(modmap); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * バッファを分割し、Accessor を再構築 + */ + + }, { + key: "splitBufferAndRebuildAccessors", + value: function splitBufferAndRebuildAccessors() { + this._splitBufferAndRebuildAccessors(this._attrib_accessors); + + this._splitBufferAndRebuildAccessors(this._index_accessors); + } + /** + * バッファを分割し、Accessor を再構築 + * + * @param {iterable.} accessors 入力 Accessor 反復子 + */ + + }, { + key: "_splitBufferAndRebuildAccessors", + value: function _splitBufferAndRebuildAccessors(accessors) { + var splitter = new BufferSplitter(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = BufferEntry._getOriginalAccessors(accessors)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var accessor = _step2.value; + splitter.update(accessor); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + splitter.close(this._buffer); + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = accessors[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var _accessor = _step3.value; + splitter.rebuildAccessor(_accessor); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + /** + * バッファを参照ている原初 Accessor の反復子 + * + * @return {iterable.} 原初 Accessor 反復子 + * @private + */ + + }, { + key: "_getUnitedOriginalAccessors", + value: function _getUnitedOriginalAccessors() { + return BufferEntry._getOriginalAccessors(this._attrib_accessors.concat(this._index_accessors)); + } + /** + * 原初 Accessor の反復子を取得 + * + * @param {iterable.} accessors 入力 Accessor 反復子 + * @return {iterable.} 原初 Accessor 反復子 + * @private + */ + + }, { + key: "buffer", + get: function get() { + return this._buffer; + } + }], [{ + key: "_getOriginalAccessors", + value: function _getOriginalAccessors(accessors) { + var orig_accessors = new Map(); + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = accessors[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var accessor = _step4.value; + var key = accessor.index; + + if (!orig_accessors.has(key)) { + orig_accessors.set(key, accessor); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return orig_accessors.values(); + } + }]); + + return BufferEntry; +}(); + +/** + * コンテキストでの Image 管理アイテム + * + * @memberof mapray.gltf + * @private + */ +var ImageEntry = +/*#__PURE__*/ +function () { + /** + * @param {mapray.gltf.Image} image イメージ + */ + function ImageEntry(image) { + _classCallCheck(this, ImageEntry); + + this._image = image; + this._texinfo_objects = []; + } + /** + * イメージを取得 + * @type {mapray.gltf.Texture} + * @readonly + */ + + + _createClass(ImageEntry, [{ + key: "addTextureInfo", + + /** + * TextureInfo インスタンスを追加 + * + * @param {mapray.gltf.TextureInfo} info 追加する TextureInfo インスタンス + */ + value: function addTextureInfo(info) { + this._texinfo_objects.push(info); + } + /** + * テクスチャ情報を再構築 + */ + + }, { + key: "rebuildTextureInfo", + value: function rebuildTextureInfo() { + var texinfo_objects = this._texinfo_objects; + + if (texinfo_objects.length <= 1) { + // イメージが複数の TextureInfo から参照されないので + // 何も変更しない + return; + } // この画像を使っている代表テクスチャ + + + var representative_texture = texinfo_objects[0].texture; // この画像を使っている (テクスチャ情報内の) テクスチャを + // 代表テクスチャに置き換える + + for (var i = 1; i < texinfo_objects.length; ++i) { + texinfo_objects[i].texture = representative_texture; + } + } + }, { + key: "image", + get: function get() { + return this._image; + } + }]); + + return ImageEntry; +}(); + +/** + * glTF の buffer に対応 + * @memberof mapray.gltf + * @private + */ +var Buffer = +/*#__PURE__*/ +function () { + /** + * @param {mapray.gltf.Context} [ctx] 読み込みコンテキスト + * @param {number} [index] buffers 索引 + */ + function Buffer(ctx, index) { + var _this = this; + + _classCallCheck(this, Buffer); + + if (ctx === undefined) { + // 引数なし構築 (特殊インスタンス用) + this._index = -1; + this._byteLength = 0; + this._uri = null; + this._binary = null; + } else { + this._index = index; // glTF の buffer オブジェクト (specification/2.0/schema/buffer.schema.json) + + var jbuffer = ctx.gjson.buffers[index]; + this._byteLength = jbuffer.byteLength; + + if (jbuffer.uri !== undefined) { + ctx.onStartLoadBuffer(); + ctx.loadBinary(jbuffer.uri).then(function (buffer) { + // バイナリデータの取得に成功 + _this._binary = buffer; + ctx.onFinishLoadBuffer(); + })["catch"](function (error) { + // バイナリデータの取得に失敗 + console.error(error); + ctx.onFinishLoadBuffer(error); + }); + } else { + // todo: GLB-stored Buffer + this._uri = null; + this._binary = null; + } + } + } + /** + * 対応する glTF オブジェクトでの索引を取得 + * @type {number} + * @readonly + */ + + + _createClass(Buffer, [{ + key: "createSubBuffer", + + /** + * 部分バッファを生成 + * + * @param {number} first 最初のバイト位置 + * @param {number} last 最後のバイト位置 + 1 + * @return {mapray.gltf.Buffer} 部分バッファ + */ + value: function createSubBuffer(first, last) { + var subBuffer = new Buffer(); + subBuffer._byteLength = last - first; + subBuffer._binary = this._binary.slice(first, last); + return subBuffer; + } + }, { + key: "index", + get: function get() { + return this._index; + } + /** + * バイナリデータ + * @type {ArrayBuffer} + * @readonly + */ + + }, { + key: "binary", + get: function get() { + return this._binary; + } + /** + * バイナリデータのバイト数を取得 + * @type {number} + * @readonly + */ + + }, { + key: "byteLength", + get: function get() { + return this._byteLength; + } + }]); + + return Buffer; +}(); + +/** + * glTF の image に対応 + * @memberof mapray.gltf + * @private + */ + +var Image$1 = +/*#__PURE__*/ +function () { + /** + * 初期化 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {number} index images 索引 + */ + function Image(ctx, index) { + var _this = this; + + _classCallCheck(this, Image); + + this._index = index; // glTF の image オブジェクト (specification/2.0/schema/image.schema.json) + + var jimage = ctx.gjson.images[index]; + + if (jimage.uri !== undefined) { + ctx.onStartLoadImage(); + ctx.loadImage(jimage.uri).then(function (image) { + _this._image = image; + ctx.onFinishLoadImage(); + })["catch"](function (error) { + ctx.onFinishLoadImage(error); + }); + } else if (jimage.bufferView !== undefined) { + this._bufferView = new BufferView(ctx, jimage.bufferView); + } // mimeType は "image/jpeg" または "image/png" で bufferView のときは必須 + // uri のときは任意であるが mimeType が指定されているとき、タイプは mimeType と解釈する + + + this._mimeType = jimage.mimeType; + this._image = null; + } + /** + * 対応する glTF オブジェクトでの索引を取得 + * @type {number} + * @readonly + */ + + + _createClass(Image, [{ + key: "index", + get: function get() { + return this._index; + } + /** + * 画像データ + * @type {HTMLImageElement} + * @readonly + */ + + }, { + key: "image", + get: function get() { + return this._image; + } + }]); + + return Image; +}(); + +/** + * glTF 読込みコンテキスト + * + * @memberof mapray.gltf + * @private + */ + +var Context = +/*#__PURE__*/ +function () { + /** + * @param {object} body Tool.load() の同名パラメータを参照 + * @param {object} [options] Tool.load() の同名パラメータを参照 + */ + function Context(body, options) { + _classCallCheck(this, Context); + + var opts = options || {}; + this._gjson = body; + this._base_resource = opts.base_resource; + this._binary_type = opts.binary_type; + this._image_type = opts.image_type; + this._supported_extensions = opts.supported_extensions || []; + this._resolve = null; // Promise の resolve() 関数 + + this._reject = null; // Promise の reject() 関数 + + this._used_extensions = new Set(); // コンテンツが使用する拡張機能名の集合 + + this._scenes = []; + this._default_scene_index = -1; + this._buffer_entries = []; // 共有用バッファの管理 (疎配列) + + this._image_entries = []; // 共有用イメージの管理 (疎配列) + + this._body_finished = false; // body の解析を終えたか? + + this._load_count = 0; // 現在リクエスト中のオブジェクト数 + + this._load_error = null; // エラーが発生したときのエラーオブジェクト + + this._settled = false; // Promise の状態が Fulfilled または Rejected か? + } + /** + * @summary glTF の読込みと解析 + * + * @return {Promise} 読込み Promise (mapray.gltf.Content) + */ + + + _createClass(Context, [{ + key: "load", + value: function load() { + var _this = this; + + return new Promise(function (resolve, reject) { + _this._resolve = resolve; + _this._reject = reject; // glTF バージョンを確認 + + var version = _this._loadVersion(); + + if (version.major < 2) { + reject(new Error("glTF version error")); + return; + } // コンテンツに必須の拡張機能をサポートしているかを確認 + + + var supported_ext = _this._getSupportedExtensionNames(); + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = _this._enumRequiredExtensionNames()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var required_ext = _step.value; + + if (!supported_ext.has(required_ext)) { + reject(new Error("glTF extension error: " + required_ext)); + return; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + _this._loadExtensionsUsed(); + + _this._loadScenes(); + + _this._loadDefaultSceneIndex(); + + _this._onFinishLoadBody(); + }); + } + /** + * glTF バージョンを解析 + * + * @return {object} { major: major_version, minor: minor_version } + * @private + */ + + }, { + key: "_loadVersion", + value: function _loadVersion() { + // asset.schema + var asset = this._gjson.asset; // 必須 + + var version = asset.version; // 必須 + + var version_array = /^(\d+)\.(\d+)/.exec(version); + var major_version = Number(version_array[1]); + var minor_version = Number(version_array[2]); + return { + major: major_version, + minor: minor_version + }; + } + /** + * @summary 必須の拡張機能の名前を列挙 + * + * @desc + *

glTF アセットから必須の拡張機能を解析して、 + * その拡張機能の名前を列挙する。

+ * + * @return {iterable.} 拡張機能名の列挙 + * + * @private + */ + + }, { + key: "_enumRequiredExtensionNames", + value: function _enumRequiredExtensionNames() { + return this._gjson.extensionsRequired || []; + } + /** + * @summary 対応可能な拡張機能の名前の集合を取得 + * + * @desc + *

glTF のローダーとクライアントが対応できる拡張機能の + * 名前の集合を取得する。

+ * + * @return {Set.} 拡張機能名の集合 + * + * @private + */ + + }, { + key: "_getSupportedExtensionNames", + value: function _getSupportedExtensionNames() { + // ローダー自身が対応できる拡張機能 + // ※ 今のところサポートできる拡張機能はない + var supported_extensions_by_loader = []; // ローダーを呼び出す側が対応できる拡張機能 + + var supported_extensions_by_client = this._supported_extensions; + return new Set(supported_extensions_by_loader.concat(supported_extensions_by_client)); + } + /** + * @summary コンテンツが使用する拡張機能を読み込む + * + * @desc + *

extensionsUsed プロパティを読み込み this._used_extensions を設定する。

+ * + * @private + */ + + }, { + key: "_loadExtensionsUsed", + value: function _loadExtensionsUsed() { + this._used_extensions = new Set(this._gjson.extensionsUsed || []); + } + /** + * @summary すべてのシーンを読み込む + * + *

シーンを読み込み、オブジェクトを this._scenes の配列に設定する。

+ * + * @private + */ + + }, { + key: "_loadScenes", + value: function _loadScenes() { + var num_scenes = (this._gjson.scenes || []).length; + var scenes = []; + + for (var index = 0; index < num_scenes; ++index) { + scenes.push(new Scene$1(this, index)); + } + + this._scenes = scenes; + } + /** + * @summary 既定シーンの索引を読み込む + * + *

既定のシーン索引を解析し、this._default_scene_index に設定する。

+ * + * @private + */ + + }, { + key: "_loadDefaultSceneIndex", + value: function _loadDefaultSceneIndex() { + if (typeof this._gjson.scene == 'number') { + this._default_scene_index = this._gjson.scene; + } + } + /** + * glTF 最上位オブジェクト + * @type {object} + * @readonly + */ + + }, { + key: "extractUsedExtensions", + + /** + * @summary 拡張機能の抽出 + * + * @desc + *

拡張機能固有オブジェクト extensions から extensionsUsed + * に存在するものだけを抽出する。

+ * + * @param {object} extensions + * + * @return {object} + */ + value: function extractUsedExtensions(extensions) { + var dict = {}; + + for (var key in extensions) { + if (this._used_extensions.has(key)) { + dict[key] = extensions[key]; + } + } + + return dict; + } + /** + * バッファデータの読み込みを開始 + * @param {mapray.gltf.Context} ctx 読み込みコンテキスト + * @param {string} url バッファデータの URL + * @private + */ + + }, { + key: "loadBinary", + value: function loadBinary(path) { + return this._base_resource.loadSubResource(path, { + type: this._binary_type + }); + } + }, { + key: "loadImage", + value: function loadImage(path) { + return this._base_resource.loadSubResource(path, { + type: this._image_type + }); + } + /** + * バッファを検索 + * @param {number} index バッファ索引 + * @return {mapray.gltf.Buffer} gltf.Buffer オブジェクト + */ + + }, { + key: "findBuffer", + value: function findBuffer(index) { + if (this._buffer_entries[index] === undefined) { + this._buffer_entries[index] = new BufferEntry(new Buffer(this, index)); + } + + return this._buffer_entries[index].buffer; + } + /** + * イメージを検索 + * @param {number} index イメージ索引 + * @return {mapray.gltf.Image} gltf.Image オブジェクト + */ + + }, { + key: "findImage", + value: function findImage(index) { + if (this._image_entries[index] === undefined) { + this._image_entries[index] = new ImageEntry(new Image$1(this, index)); + } + + return this._image_entries[index].image; + } + /** + * gltf.Accessor を追加 + * + * @param {mapray.gltf.Accessor} accessor アクセサオブジェクト + * @param {string} usage 用途 ("ATTRIBUTE" | "INDEX") + */ + + }, { + key: "addAccessor", + value: function addAccessor(accessor, usage) { + var entry = this._buffer_entries[accessor.bufferView.buffer.index]; + + switch (usage) { + case "ATTRIBUTE": + entry.addAttributeAccessor(accessor); + break; + + case "INDEX": + entry.addIndexAccessor(accessor); + break; + } + } + /** + * gltf.TextureInfo を追加 + * + * @param {mapray.gltf.TextureInfo} info テクスチャ情報 + */ + + }, { + key: "addTextureInfo", + value: function addTextureInfo(info) { + var image = info.texture.source; + var entry = this._image_entries[image.index]; + entry.addTextureInfo(info); + } + /** + * バイナリを読み込み始めたときの処理 + */ + + }, { + key: "onStartLoadBuffer", + value: function onStartLoadBuffer() { + this._load_count += 1; + } + /** + * バイナリを読み込み終わったときの処理 + * + * @param {Error} [error] 失敗したときのエラーオブジェクト + */ + + }, { + key: "onFinishLoadBuffer", + value: function onFinishLoadBuffer(error) { + if (error) { + this._load_error = error; + } + + this._load_count -= 1; + + this._onFinishLoadSomething(); + } + /** + * 画像を読み込み始めたときの処理 + */ + + }, { + key: "onStartLoadImage", + value: function onStartLoadImage() { + this._load_count += 1; + } + /** + * 画像を読み込み終わったときの処理 + * + * @param {Error} [error] 失敗したときのエラーオブジェクト + */ + + }, { + key: "onFinishLoadImage", + value: function onFinishLoadImage(error) { + if (error) { + this._load_error = error; + } + + this._load_count -= 1; + + this._onFinishLoadSomething(); + } + /** + * glTF 本体を読み込み終わったときの処理 + * @private + */ + + }, { + key: "_onFinishLoadBody", + value: function _onFinishLoadBody() { + this._body_finished = true; + + this._onFinishLoadSomething(); + } + /** + * 何かを読み込み終わったときの処理 + * @private + */ + + }, { + key: "_onFinishLoadSomething", + value: function _onFinishLoadSomething() { + if (this._settled) ; else if (this._load_error !== null) { + // どこかで失敗した + this._reject(this._load_error); + + this._settled = true; + } else if (this._body_finished && this._load_count == 0) { + // 外部ファイルも含めて、すべて読み込み終わった + this._rewriteBuffersForByteOrder(); + + this._splitBuffersAndRebuildAccessors(); + + this._rebuildTextureInfo(); + + this._resolve(new Content(this, this._scenes, this._default_scene_index)); + + this._settled = true; + } + } + /** + * すべてのバッファのバイトオーダーを書き換える + * @private + */ + + }, { + key: "_rewriteBuffersForByteOrder", + value: function _rewriteBuffersForByteOrder() { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = this._buffer_entries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var entry = _step2.value; + + if (entry !== undefined) { + entry.rewriteByteOrder(); + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + /** + * バッファを分割し、Accessor を再構築 + * @private + */ + + }, { + key: "_splitBuffersAndRebuildAccessors", + value: function _splitBuffersAndRebuildAccessors() { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this._buffer_entries[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var entry = _step3.value; + + if (entry !== undefined) { + entry.splitBufferAndRebuildAccessors(); + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + /** + * テクスチャ情報を再構築 + * @private + */ + + }, { + key: "_rebuildTextureInfo", + value: function _rebuildTextureInfo() { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._image_entries[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var entry = _step4.value; + + if (entry !== undefined) { + entry.rebuildTextureInfo(); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + } + }, { + key: "gjson", + get: function get() { + return this._gjson; + } + }]); + + return Context; +}(); + +/** + * glTF 関連のツール + * + * @memberof mapray.gltf + * @private + */ + +var Tool = +/*#__PURE__*/ +function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "load", + + /** + * @summary glTF データを解析してオブジェクトを構築 + * + * @param {object} body データの本体 (JSON オブジェクト) + * @param {object} [options] オプション集合 + * @param {string} [options.base_resouece] 基底となるリソース + * @param {any} [options.binary_type] バイナリタイプ + * @param {any} [options.image_type] イメージタイプ + * @param {string[]} [options.supported_extensions] ローダーを呼び出す側が対応できる glTF 拡張機能のリスト + * @return {Promise} 読込み Promise (mapray.gltf.Content) + */ + value: function load(body, options) { + var context = new Context(body, options); + return context.load(); + } + }]); + + return Tool; +}(); + +/** + * @summary シーンの読み込み + * @memberof mapray + */ + +var SceneLoader = +/*#__PURE__*/ +function (_Loader) { + _inherits(SceneLoader, _Loader); + + /** + * @desc + *

url で指定したシーンデータの読み込みを開始し、scene にエンティティを構築する。

+ *

読み込みが終了したとき options.callback を呼び出す。

+ * @param {mapray.Scene} scene 読み込み先のシーン + * @param {string} resource シーンリソース + * @param {object} [options] オプション集合 + * @param {mapray.Loader.TransformCallback} [options.transform] リソース要求変換関数 + * @param {mapray.Loader.EntityCallback} [options.onEntity] エンティティコールバック + * @param {mapray.SceneLoader.FinishCallback} [options.callback] 終了コールバック関数 + */ + function SceneLoader(scene, resource) { + var _this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + _classCallCheck(this, SceneLoader); + + if (resource instanceof Resource) ; else if (typeof resource === "string") { + resource = new URLResource(resource, { + type: "json", + transform: options.transform + }); + } else { + throw new Error("Unsupported Resource: " + resource); + } + + _this = _possibleConstructorReturn(this, _getPrototypeOf(SceneLoader).call(this, scene, resource, { + onEntity: options.onEntity, + onLoad: options.callback + })); + _this._glenv = scene.glenv; + _this._references = {}; + _this._finished = false; + return _this; + } + /** + * @summary オブジェクト参照を取得 + * @desc + *

注意: シーンの読み込みが終了したことを確認してからこのメソッドを呼び出すこと。

+ * @param {string} id 識別子 + * @return {?(mapray.ModelContainer|mapray.Entity)} オブジェクト + */ + + + _createClass(SceneLoader, [{ + key: "getReference", + value: function getReference(id) { + var ref = this._references[id]; + return ref !== undefined ? ref : null; + } + /** + * @summary オブジェクト参照を設定 + * @desc + *

オブジェクト item を識別子 id で参照できるように this に設定する。

+ * @param {string} id 識別子 + * @param {mapray.ModelContainer|mapray.Entity} item オブジェクト + * @private + */ + + }, { + key: "_setReference", + value: function _setReference(id, item) { + // 参照を設定 + this._references[id] = item; + } + /** + * @summary 読み込み処理の実態。継承クラスによって実装される。 + * @private + */ + + }, { + key: "_load", + value: function _load() { + var _this2 = this; + + return this._resource.load({ + type: ResourceType.JSON + }).then(function (oscene) { + // JSON データの取得に成功 + _this2._check_cancel(); + + return _this2._load_object(oscene); + }); + } + /** + * JSON シーンオブジェクトを解析 + * @private + */ + + }, { + key: "_load_object", + value: function _load_object(oscene) { + var _this3 = this; + + return Promise.resolve().then(function () { + return _this3._load_model_register(oscene); + }).then(function () { + return _this3._postload_object(oscene); + }); + } + /** + * 残りのオブジェクトを読み込む + * @private + */ + + }, { + key: "_postload_object", + value: function _postload_object(oscene) { + if (this.status !== Loader.Status.LOADING) return; + + this._load_entity_list(oscene); + } + /** + * @private + */ + + }, { + key: "_load_model_register", + value: function _load_model_register(oscene) { + var model_register = oscene["model_register"]; + if (!model_register) return; + var keys = Object.keys(model_register); + var asyncTasks = []; + + for (var i = 0; i < keys.length; ++i) { + var id = keys[i]; + var model = model_register[id]; + asyncTasks.push(this._load_model_container(oscene, id, model)); + } + + return Promise.all(asyncTasks); + } + /** + * @private + */ + + }, { + key: "_load_model_container", + value: function _load_model_container(oscene, id, model) { + var _this4 = this; + + var url = model.link; + if (!this._resource.resolveResourceSupported()) return Promise.reject(new Error("Sub Resource is not supported")); + + var gltf_resource = this._resource.resolveResource(url); + + return gltf_resource.load({ + type: ResourceType.JSON + }).then(function (json) { + // モデルデータの取得に成功 + _this4._check_cancel(); // データを解析して gltf.Content を構築 + + + return Tool.load(json, { + base_resource: gltf_resource, + binary_type: ResourceType.BINARY, + image_type: ResourceType.IMAGE, + supported_extensions: ModelContainer.getSupportedExtensions_glTF() + }); + }).then(function (content) { + // モデルデータの構築に成功 + var container = new ModelContainer(_this4._scene, content); + + if (model.offset_transform) { + var matrix = SceneLoader.parseOffsetTransform(model.offset_transform); + container.setOffsetTransform(matrix); + } + + _this4._setReference(id, container); + }); + } + /** + * @private + */ + + }, { + key: "_load_entity_list", + value: function _load_entity_list(oscene) { + var entity_list = oscene["entity_list"]; + if (!entity_list) return; + var scene = this._scene; + + for (var i = 0; i < entity_list.length; ++i) { + var item = entity_list[i]; + var type = item.type; + var entity = null; + + switch (type) { + case "markerline": + entity = new MarkerLineEntity(scene, { + json: item, + refs: this._references + }); + break; + + case "path": + entity = new PathEntity(scene, { + json: item, + refs: this._references + }); + break; + + case "text": + entity = new TextEntity(scene, { + json: item, + refs: this._references + }); + break; + + case "model": + entity = new ModelEntity(scene, { + json: item, + refs: this._references + }); + break; + + case "polygon": + entity = new PolygonEntity(scene, { + json: item, + refs: this._references + }); + break; + + default: + console.error("mapray: unknown entity type: " + type); + break; + } + + if (entity) { + this._onEntity(this, entity, item); + + var id = item.id; + + if (id) { + this._setReference(id, entity); + } + } + } + } + /** + * スキーマ のオブジェクトを解析 + * + * @param {object} offset_transform オブジェクト + * @return {mapray.Matrix} オフセット変換行列 + * @package + */ + + }], [{ + key: "parseOffsetTransform", + value: function parseOffsetTransform(offset_transform) { + var ot = offset_transform; // + + var translate = ot.translate || [0, 0, 0]; + var orientation = new Orientation(ot.heading, ot.tilt, ot.roll); + var scale = ot.scale !== undefined ? ot.scale : [1, 1, 1]; // + + if (typeof scale == 'number') { + // スケールをベクトルに正規化 + scale = [scale, scale, scale]; + } // scale -> orientation -> translate 順の変換 + + + var matrix = GeoMath.createMatrix(); + orientation.getTransformMatrix(scale, matrix); + matrix[12] = translate[0]; + matrix[13] = translate[1]; + matrix[14] = translate[2]; + return matrix; + } + }]); + + return SceneLoader; +}(Loader); +/** + * @summary 終了コールバック + * @callback FinishCallback + * @desc + *

シーンの読み込みが終了したときに呼び出される関数の型である。

+ * @param {mapray.SceneLoader} loader 読み込みを実行したローダー + * @param {boolean} isSuccess 成功したとき true, 失敗したとき false + * @memberof mapray.SceneLoader + */ + + +SceneLoader._defaultHeaders = {}; + +/** + * @summary 追加コンテナの表示制御 + * + * @class ContainerController + */ +var ContainerController = +/*#__PURE__*/ +function () { + /** + * @summary コンストラクタ + * @param {HTMLElement} container ルートコンテナ(Viewerクラスのcontainer_element) + * @param {object} options 表示オプション + * @param {boolean} options.visibility 表示・非表示 + * @param {ContainerPosition} options.position 表示位置 + * @memberof ContainerController + */ + function ContainerController(container, options) { + _classCallCheck(this, ContainerController); + + this._visibility = options && options.visibility || true; + this._position = options && options.position || ContainerPosition.TOP_LEFT; + var container_element; + + if (typeof container == "string") { + // コンテナを ID 指定したとき + container_element = document.getElementById(container); + } else { + // コンテナを直接要素で指定のとき + container_element = container; + } + + this._viewer_container = container_element; + this._container = null; + this._is_compact = false; + var self = this; + window.addEventListener("resize", function () { + self._sizeChanged(); + }, false); + } + /** + * @summary 表示・非表示の設定 + * + * @param {boolean} visibility + * @memberof ContainerController + */ + + + _createClass(ContainerController, [{ + key: "setVisibility", + value: function setVisibility(visibility) { + this._visibility = visibility; // 表示状態の更新 + + this._setContainerVisibility(); + } + /** + * @summary 表示位置 + * + * @param {ContainerPosition} position + * @memberof ContainerController + */ + + }, { + key: "setPosition", + value: function setPosition(position) { + this._position = position; // コンテナの再作成 + + this._deleteContainer(); + + this.createContainer(); + } + /** + * @summary コンテナの表示設定 + * + * @memberof ContainerController + */ + + }, { + key: "_setContainerVisibility", + value: function _setContainerVisibility() { + if (this._container) { + this._visibility ? this._container.style.visibility = "visible" : this._container.style.visibility = "collapse"; + } + } + /** + * @summary インスタンスの破棄 + * + * @memberof ContainerController + */ + + }, { + key: "_destroy", + value: function _destroy() { + var self = this; + window.removeEventListener("resize", function () { + self._sizeChanged(); + }, false); + + this._deleteContainer(); + } + /** + * @summary 追加コンテナの削除 + * + * @memberof ContainerController + */ + + }, { + key: "_deleteContainer", + value: function _deleteContainer() { + var parent_container = this._container.parentElement; + parent_container.removeChild(this._container); + this._container = null; + } + /** + * @summary リサイズイベント + * + * @memberof ContainerController + * @abstract + */ + + }, { + key: "_sizeChanged", + value: function _sizeChanged() {} + /** + * @summary 追加コンテナの作成 + * + * @memberof ContainerController + * @abstract + */ + + }, { + key: "createContainer", + value: function createContainer() {} + }]); + + return ContainerController; +}(); +/** + * @summary ロゴ・著作権表示位置の列挙型 + * @enum {object} + * @memberof ContainerController + * @constant + */ + + +var ContainerPosition = { + /** + * 左上 + */ + TOP_LEFT: { + id: "top-left" + }, + + /** + * 右上 + */ + TOP_RIGHT: { + id: "top-right" + }, + + /** + * 左下 + */ + BOTTOM_LEFT: { + id: "bottom-left" + }, + + /** + * 右下 + */ + BOTTOM_RIGHT: { + id: "bottom-right" + } +}; +{ + ContainerController._compact_size = 500; + ContainerController.ContainerPosition = ContainerPosition; +} + +/** + * @summary ロゴの表示制御 + * + * @class LogoController + * @extends {mapray.ContainerController} + */ + +var LogoController = +/*#__PURE__*/ +function (_ContainerController) { + _inherits(LogoController, _ContainerController); + + /** + * @summary コンストラクタ + * @param {HTMLElement} container ルートコンテナ(Viewerクラスのcontainer_element) + * @param {object} options 表示オプション + * @param {boolean} options.visibility 表示・非表示 + * @param {ContainerController.ContainerPosition} options.position 表示位置 + * @memberof LogoController + */ + function LogoController(container, options) { + var _this; + + _classCallCheck(this, LogoController); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(LogoController).call(this, container, options)); + _this._position = options && options.position || ContainerController.ContainerPosition.BOTTOM_LEFT; + return _this; + } + /** + * @summary リサイズイベント + * + * @memberof LogoController + */ + + + _createClass(LogoController, [{ + key: "_sizeChanged", + value: function _sizeChanged() { + if (this._container) { + var sub_container = this._container.children[0]; + var parent_container = this._container.parentElement; + + if (parent_container.parentElement.clientWidth < ContainerController._compact_size) { + sub_container.classList.add("mapray-logo-compact"); + } else { + sub_container.classList.remove("mapray-logo-compact"); + } + } + } + /** + * @summary 追加コンテナの作成 + * + * @memberof LogoController + */ + + }, { + key: "createContainer", + value: function createContainer() { + var name = "control-" + this._position.id; + + var parent_container = this._viewer_container.getElementsByClassName(name)[0]; + + var main_container = document.createElement("div"); + main_container.className = "control"; + var sub_container = document.createElement("a"); + sub_container.className = "mapray-logo"; + sub_container.href = "https://mapray.com"; + sub_container.target = "_blank"; + main_container.appendChild(sub_container); + this._container = main_container; + parent_container.appendChild(this._container); + + this._sizeChanged(); + } + }]); + + return LogoController; +}(ContainerController); + +/** + * @summary 著作権表示の表示制御 + * + * @class AttributionController + * @extends {mapray.ContainerController} + */ + +var AttributionController = +/*#__PURE__*/ +function (_ContainerController) { + _inherits(AttributionController, _ContainerController); + + /** + * @summary コンストラクタ + * @param {HTMLElement} container ルートコンテナ(Viewerクラスのcontainer_element) + * @param {object} options 表示オプション + * @param {boolean} options.isVisible 表示・非表示 + * @param {ContainerController.ContainerPosition} options.position 表示位置 + * @param {array} options.attributions 著作権リスト + * @param {string} options.attributions.display 表示名 + * @param {string} options.attributions.link リンク + * @memberof AttributionController + */ + function AttributionController(container, options) { + var _this; + + _classCallCheck(this, AttributionController); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(AttributionController).call(this, container, options)); + _this._position = options && options.position || ContainerController.ContainerPosition.BOTTOM_RIGHT; + _this._attributions = []; + + if (options && options.attributions) { + _this.copyAttributions(options.attributions); + } else { + _this.copyAttributions(AttributionController._default_attribution); + } + + return _this; + } + /** + * @summary 著作権表示の追加 + * + * @param {object} attribution 著作権表示オブジェクト + * @param {string} attribution.display 表示名 + * @param {string} attribution.link リンク + * @memberof AttributionController + */ + + + _createClass(AttributionController, [{ + key: "addAttribution", + value: function addAttribution(attribution) { + this._attributions.push(attribution); // コンテナの再作成 + + + this._deleteContainer(); + + this.createContainer(); + } + /** + * @summary 著作権表示のリセット + * + * @memberof AttributionController + */ + + }, { + key: "clearAttribution", + value: function clearAttribution() { + this._attributions = []; // コンテナの再作成 + + this._deleteContainer(); + + this.createContainer(); + } + /** + * @summary リサイズイベント + * + * @memberof AttributionController + */ + + }, { + key: "_sizeChanged", + value: function _sizeChanged() { + if (this._container) { + var parent_container = this._container.parentElement; + + if (parent_container.parentElement.clientWidth < ContainerController._compact_size) { + this._container.classList.add("mapray-attribution-compact"); + } else { + this._container.classList.remove("mapray-attribution-compact"); + } + } + } + /** + * @summary 追加コンテナの作成 + * + * @memberof AttributionController + */ + + }, { + key: "createContainer", + value: function createContainer() { + var name = "control-" + this._position.id; + + var parent_container = this._viewer_container.getElementsByClassName(name)[0]; + + var main_container = document.createElement("div"); + main_container.classList.add("control"); + main_container.classList.add("mapray-attribution"); + var sub_container = document.createElement("div"); + sub_container.classList.add("mapray-attribution-container"); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._attributions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var attribution = _step.value; + + if (attribution.display) { + var attribution_container = document.createElement("a"); + + if (attribution.link) { + attribution_container.href = attribution.link; + attribution_container.target = "_blank"; + } + + var text = document.createTextNode(attribution.display); + attribution_container.appendChild(text); + sub_container.appendChild(attribution_container); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + main_container.appendChild(sub_container); + this._container = main_container; + parent_container.appendChild(this._container); + + this._sizeChanged(); + } + }, { + key: "copyAttributions", + value: function copyAttributions(src) { + this._attributions = src.map(function (d) { + return d; + }); + } + }]); + + return AttributionController; +}(ContainerController); // クラス変数の定義 + + +{ + AttributionController._default_attribution = [{ + display: "©Mapray", + link: "https://mapray.com" + }, { + display: "©JAXA", + link: "http://www.jaxa.jp/" + }, { + display: "測量法に基づく国土地理院長承認(複製)H30JHf626", + link: "https://www.gsi.go.jp/kiban/index.html" + }]; +} + +/** + * @summary 表示管理 + * @classdesc + *

mapray の表示を管理するクラスである。

+ * @memberof mapray + */ + +var Viewer = +/*#__PURE__*/ +function () { + /** + * @param {string|Element} container コンテナ (ID または要素) + * @param {object} [options] 生成オプション + * @param {mapray.DemProvider} [options.dem_provider] DEM プロバイダ + * @param {mapray.ImageProvider} [options.image_provider] 画像プロバイダ + * @param {array} [options.layers] 地図レイヤー情報の配列 + * @param {boolean} [options.ground_visibility=true] 地表の可視性 + * @param {boolean} [options.entity_visibility=true] エンティティの可視性 + * @param {mapray.RenderCallback} [options.render_callback] レンダリングコールバック + * @param {mapray.Viewer.RenderMode} [options.render_mode] レンダリングモード + * @param {mapray.DebugStats} [options.debug_stats] デバッグ統計オブジェクト + * @param {mapray.LogoController} [options.logo_controller] ロゴ表示制御オブジェクト + * @param {mapray.AttributionController} [options.attribution_controller] 著作権表示制御オブジェクト + */ + function Viewer(container, options) { + _classCallCheck(this, Viewer); + + var container_element; + + if (typeof container == "string") { + // コンテナを ID 指定したとき + container_element = document.getElementById(container); + } else { + // コンテナを直接要素で指定のとき + container_element = container; + } + + var canvas = this._createCanvas(container_element); // インスタンス変数 + + + this._container_element = container_element; + this._canvas_element = canvas; + this._glenv = new GLEnv(canvas); + this._camera = new Camera(canvas); + this._animation = this._createAnimationBindingBlock(); + this._dem_provider = this._createDemProvider(options); + this._image_provider = this._createImageProvider(options); + this._layers = this._createLayerCollection(options); + this._globe = new Globe(this._glenv, this._dem_provider); + this._tile_texture_cache = new TileTextureCache(this._glenv, this._image_provider); + this._scene = new Scene(this, this._glenv); + this._ground_visibility = Viewer._getBoolOption(options, "ground_visibility", true); + this._entity_visibility = Viewer._getBoolOption(options, "entity_visibility", true); + this._render_mode = options && options.render_mode || RenderMode.SURFACE; + this._debug_stats = options && options.debug_stats || null; + this._point_cloud_collection = this._createPointCloudCollection(options); + this._render_callback = this._createRenderCallback(options); + this._frame_req_id = 0; + this._previous_time = undefined; + this._is_destroyed = false; + this._sun_direction = GeoMath.createVector3([0, 0, 1]); + this._postProcesses = []; // マウス・Attribution開発 + + this._logo_controller = options && options.logo_controller || new LogoController(this._container_element); + this._attribution_controller = options && options.attribution_controller || new AttributionController(this._container_element); // ロゴ・著作権表示用コンテナの作成 + + this._createLogoAttributionContainer(); + + this._logo_controller.createContainer(); + + this._attribution_controller.createContainer(); // 最初のフレームの準備 + + + this._requestNextFrame(); + + this._updateCanvasSize(); + } + /** + * @summary インスタンスを破棄 + * + * @desc + *

次の順番で処理を行い、インスタンスを破棄する。

+ * + *
    + *
  1. アニメーションフレームを止める。(this.{@link mapray.Viewer#render_callback render_callback} の {@link mapray.RenderCallback#onUpdateFrame onUpdateFrame()} が呼び出されなくなる)
  2. + *
  3. this.{@link mapray.Viewer#render_callback render_callback} の {@link mapray.RenderCallback#onStop onStop()} を呼び出す。({@link mapray.RenderCallback#onStart onStart()} がすでに呼び出されている場合)
  4. + *
  5. {@link mapray.RenderCallback} インスタンスを this から切り離す。({@link mapray.RenderCallback#viewer} プロパティは null を返すようになる)
  6. + *
  7. this.{@link mapray.Viewer#canvas_element canvas_element} を this.{@link mapray.Viewer#container_element container_element} から取り外す。(キャンバスは表示されなくなる)
  8. + *
  9. データプロバイダのリクエスト、シーンデータのロードの取り消しを試みる。
  10. + *
+ * + *

このメソッドを呼び出した後は this に直接的または間接的にアクセスすることはできない。ただし {@link mapray.Viewer#destroy destroy()} の呼び出しは除く。

+ * + *

このメソッドは {@link mapray.RenderCallback} のメソッドから呼び出してはならない。

+ */ + + + _createClass(Viewer, [{ + key: "destroy", + value: function destroy() { + if (this._is_destroyed) { + // すでに this は破棄済み + return; + } // フレームを止める + + + if (this._frame_req_id != 0) { + window.maprayCancelAnimationFrame(this._frame_req_id); + this._frame_req_id = 0; + } // RenderCallback の取り外し + + + this._render_callback.detach(); + + this._render_callback = this._createRenderCallback(); // NullRenderCallback + // キャンバスをコンテナから外す + + this._container_element.removeChild(this._canvas_element); // DemProvider のリクエストを取り消す + + + this._globe.cancel(); // ImageProvider のリクエストを取り消す + + + this._tile_texture_cache.cancel(); // 各レイヤーの のリクエストを取り消す + + + this._layers.cancel(); // 各 SceneLoader の読み込みを取り消す + + + this._scene.cancelLoaders(); // マウス・Attribution開発 + + + this._logo_controller._destroy(); + + this._attribution_controller._destroy(); + + this._attribution_controller = null; // ロゴ・著作権用コンテナの削除 + + this._deleteLogoAttributionContainer(); // 破棄確定 + + + this._is_destroyed = true; + } + /** + * キャンバス要素を生成 + * @param {Element} container + * @return {HTMLCanvasElement} + * @private + */ + + }, { + key: "_createCanvas", + value: function _createCanvas(container) { + var canvas = document.createElement("canvas"); + canvas.className = "mapray-canvas"; + canvas.style.width = "100%"; + canvas.style.height = "100%"; + container.appendChild(canvas); + return canvas; + } + /** + * DemProvider を生成 + * @private + */ + + }, { + key: "_createDemProvider", + value: function _createDemProvider(options) { + if (options && options.dem_provider) return options.dem_provider;else return new StandardDemProvider("/dem/", ".bin"); + } + /** + * animation.BindingBlock を生成 + * @private + */ + + }, { + key: "_createAnimationBindingBlock", + value: function _createAnimationBindingBlock() { + var _this = this; + + var abb = new EasyBindingBlock(); + abb.addDescendantUnbinder(function () { + _this._unbindDescendantAnimations(); + }); + return abb; + } + /** + * ImageProvider を生成 + * @private + */ + + }, { + key: "_createImageProvider", + value: function _createImageProvider(options) { + if (options && options.image_provider) return options.image_provider;else return new StandardImageProvider("http://cyberjapandata.gsi.go.jp/xyz/std/", ".png", 256, 0, 18); + } + /** + * LayerCollection を生成 + * @private + */ + + }, { + key: "_createLayerCollection", + value: function _createLayerCollection(options) { + var layers = options && options.layers ? options.layers : {}; + return new LayerCollection(this, layers); + } + /** + * PointCloudCollection を生成 + * @private + */ + + }, { + key: "_createPointCloudCollection", + value: function _createPointCloudCollection(options) { + var point_cloud_providers = options && options.point_cloud_providers ? options.point_cloud_providers : {}; + return new PointCloudCollection(this._scene, point_cloud_providers); + } + /** + * RenderCallback を生成 + * @private + */ + + }, { + key: "_createRenderCallback", + value: function _createRenderCallback(options) { + var callback; + if (options && options.render_callback) callback = options.render_callback;else callback = new NullRenderCallback(); + callback.attach(this); + return callback; + } + /** + * @summary ロゴ・著作権表示用コンテナの作成 + * + * @memberof Viewer + */ + + }, { + key: "_createLogoAttributionContainer", + value: function _createLogoAttributionContainer() { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = Viewer._positions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var position = _step.value; + var container = document.createElement("div"); + container.className = position; + + this._container_element.appendChild(container); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * @summary ロゴ・著作権表示用コンテナの削除 + * + * @memberof Viewer + */ + + }, { + key: "_deleteLogoAttributionContainer", + value: function _deleteLogoAttributionContainer() { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = Viewer._positions[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var position = _step2.value; + var container = document.getElementById(position); + + if (container) { + this._container_element.removeChild(position); + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + /** + * ブール値のオプションを取得 + * @private + */ + + }, { + key: "setVisibility", + + /** + * @summary 可視性を設定 + * @desc + *

target に属するオブジェクトを表示するかどうかを指定する。

+ *

可視性は Viewer の構築子の ground_visibility と entity_visibility オプションでも指定することができる。

+ * + * @param {mapray.Viewer.Category} target 表示対象 + * @param {boolean} visibility 表示するとき true, 表示しないとき false + * + * @see {@link mapray.Viewer#getVisibility} + */ + value: function setVisibility(target, visibility) { + switch (target) { + case Category.GROUND: + this._ground_visibility = visibility; + break; + + case Category.ENTITY: + this._entity_visibility = visibility; + break; + + default: + throw new Error("invalid target: " + target); + } + } + /** + * @summary 可視性を取得 + * @desc + *

target に属するオブジェクトを表示するかどうかを取得する。

+ * + * @param {mapray.Viewer.Category} target 表示対象 + * @return {boolean} 表示するとき true, 表示しないとき false + * + * @see {@link mapray.Viewer#setVisibility} + */ + + }, { + key: "getVisibility", + value: function getVisibility(target, visibility) { + switch (target) { + case Category.GROUND: + return this._ground_visibility; + + case Category.ENTITY: + return this._entity_visibility; + + default: + throw new Error("invalid target: " + target); + } + } + /** + * @summary 指定位置の標高を取得 + * @desc + *

緯度 lat, 経度 lon が示す場所の標高を返す。

+ *

現在メモリに存在する DEM データの中で最も正確度が高いデータから標高を計算する。

+ *

さらに正確度が高い DEM データがサーバーに存在すれば、それを非同期に読み込む。そのため時間を置いてこのメソッドを呼び出すと、さらに正確な値が取得できることがある。

+ * @param {number} lat 緯度 (Degrees) + * @param {number} lon 経度 (Degrees) + * @return {number} 標高 (Meters) + */ + + }, { + key: "getElevation", + value: function getElevation(lat, lon) { + // 正規化緯経度 (Degrees) + var _lon = lon + 180 * Math.floor((90 - lat) / 360 + Math.floor((90 + lat) / 360)); + + var nlat = 90 - Math.abs(90 - lat + 360 * Math.floor((90 + lat) / 360)); // 正規化緯度 [-90,90] + + var nlon = _lon - 360 - 360 * Math.floor((_lon - 180) / 360); // 正規化緯度 [-180,180) + // 単位球メルカトル座標 + + var xm = nlon * GeoMath.DEGREE; + var ym = GeoMath.invGudermannian(nlat * GeoMath.DEGREE); // 基底タイル座標 (左上(0, 0)、右下(1, 1)) + + var dPI = 2 * Math.PI; + var xt = xm / dPI + 0.5; + var yt = 0.5 - ym / dPI; + + if (yt < 0 || yt > 1) { + // 緯度が Web メルカトルの範囲外 (極に近い) + return 0; + } // 正確度が最も高い DEM タイルの取得 + + + var globe = this._globe; + var dem = globe.findHighestAccuracy(xt, yt); + + if (dem === null) { + // まだ標高を取得することができない + return 0; + } // 標高をサンプル + + + var ρ = globe.dem_provider.getResolutionPower(); + var size = 1 << ρ; // 2^ρ + + var pow = Math.pow(2, dem.z); // 2^ze + + var uf = size * (pow * xt - dem.x); + var vf = size * (pow * yt - dem.y); + var ui = GeoMath.clamp(Math.floor(uf), 0, size - 1); + var vi = GeoMath.clamp(Math.floor(vf), 0, size - 1); + var heights = dem.getHeights(ui, vi); + var h00 = heights[0]; + var h10 = heights[1]; + var h01 = heights[2]; + var h11 = heights[3]; // 標高を補間 + + var s = uf - ui; + var t = vf - vi; + return (h00 * (1 - s) + h10 * s) * (1 - t) + (h01 * (1 - s) + h11 * s) * t; + } + /** + * @summary 現行の標高を取得 + * + * @desc + *

現在メモリーにある最高精度の標高値を取得する。

+ *

まだ DEM データが存在しない、または経度, 緯度が範囲外の場所は標高を 0 とする。

+ * + *

このメソッドは DEM のリクエストは発生しない。また DEM のキャッシュには影響を与えない。

+ * + *

一般的に画面に表示されていない場所は標高の精度が低い。

+ * + * @param {mapray.GeoPoint} position 位置 (高度は無視される) + * @return {number} 標高 + * + * @see mapray.Viewer#getExistingElevations + */ + + }, { + key: "getExistingElevation", + value: function getExistingElevation(position) { + var array = [position.longitude, position.latitude, 0]; + + this._globe.getExistingElevations(1, array, 0, 3, array, 2, 3); + + return array[2]; + } + /** + * @summary 現行の標高 (複数) を取得 + * + * @desc + *

現在メモリーにある最高精度の標高値を一括で取得する。

+ *

まだ DEM データが存在しない、または経度, 緯度が範囲外の場所は標高を 0 とする。

+ * + *

このメソッドは DEM のリクエストは発生しない。また DEM のキャッシュには影響を与えない。

+ * + *

一般的に画面に表示されていない場所は標高の精度が低い。

+ * + * @param {number} num_points 入出力データ数 + * @param {number[]} src_array 入力配列 (経度, 緯度, ...) + * @param {number} src_offset 入力データの先頭インデックス + * @param {number} src_stride 入力データのストライド + * @param {number[]} dst_array 出力配列 (標高, ...) + * @param {number} dst_offset 出力データの先頭インデックス + * @param {number} dst_stride 出力データのストライド + * @return {number[]} dst_array + * + * @see mapray.Viewer#getExistingElevation + */ + + }, { + key: "getExistingElevations", + value: function getExistingElevations(num_points, src_array, src_offset, src_stride, dst_array, dst_offset, dst_stride) { + return this._globe.getExistingElevations(num_points, src_array, src_offset, src_stride, dst_array, dst_offset, dst_stride); + } + /** + * @summary レイと地表の交点を取得 + * @desc + *

ray と地表の最も近い交点を取得する。ただし交点が存在しない場合は null を返す。

+ * @param {mapray.Ray} ray レイ (GOCS) + * @return {?mapray.Vector3} 交点または null + */ + + }, { + key: "getRayIntersection", + value: function getRayIntersection(ray) { + var globe = this._globe; + + if (globe.status !== Globe.Status.READY) { + // Globe の準備ができていない + return null; + } + + var distance = globe.root_flake.findRayDistance(ray, Number.MAX_VALUE); + + if (distance === Number.MAX_VALUE) { + // 交点が見つからなかった + return null; + } // P = Q + distance V + + + var p = GeoMath.createVector3(); + var q = ray.position; + var v = ray.direction; + p[0] = q[0] + distance * v[0]; + p[1] = q[1] + distance * v[1]; + p[2] = q[2] + distance * v[2]; + return p; + } + /** + * @summary Canvas画面のキャプチャ + * + * @param {object} options オプション + * @return {blob} データ + */ + + }, { + key: "capture", + value: function () { + var _capture = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + var _this2 = this; + + var options, + mimeType, + _args = arguments; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + options = _args.length > 0 && _args[0] !== undefined ? _args[0] : { + type: 'jpeg' + }; + + if (this._canvas_element) { + _context.next = 3; + break; + } + + throw new Error('Canvas is null.'); + + case 3: + mimeType = options.type === 'png' ? 'image/png' : 'image/jpeg'; + _context.next = 6; + return new Promise(function (resolve) { + _this2._postProcesses.push(function () { + _this2._canvas_element.toBlob(resolve, mimeType); + + return false; + }); + }); + + case 6: + return _context.abrupt("return", _context.sent); + + case 7: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function capture() { + return _capture.apply(this, arguments); + } + + return capture; + }() + /** + * 次のフレーム更新を要求する。 + * @private + */ + + }, { + key: "_requestNextFrame", + value: function _requestNextFrame() { + var _this3 = this; + + this._frame_req_id = window.maprayRequestAnimationFrame(function () { + return _this3._updateFrame(); + }); + } + /** + * フレーム更新のときに呼び出される。 + * @private + * @see mapray.RenderStage + */ + + }, { + key: "_updateFrame", + value: function _updateFrame() { + var delta_time = this._updateTime(); + + this._requestNextFrame(); + + this._updateCanvasSize(); + + this._render_callback.onUpdateFrameInner(delta_time); + + if (this._debug_stats !== null) { + this._debug_stats.clearStats(); + } + + var stage = new RenderStage(this); + stage.render(); + + this._postProcess(); + + this._finishDebugStats(); + } + /** + * 現在のビューにおいて指定されたスクリーン位置の情報を取得します + * @param {Vector2} screen_position スクリーン位置(キャンバス左上を原点としたピクセル座標) + * @return {mapray.Viewer.PickResult} ピック結果 + */ + + }, { + key: "pick", + value: function pick(screen_position) { + var stage = new PickStage(this, screen_position); + stage.render(); + return stage.pick_result; + } + /** + * @summary 時間の更新 + * @return {number} 前フレームからの経過時間 (秒) + * @private + */ + + }, { + key: "_updateTime", + value: function _updateTime() { + var now_time = window.maprayNow(); + var delta_time = this._previous_time !== undefined ? (now_time - this._previous_time) / 1000 : 0; + this._previous_time = now_time; + return delta_time; + } + /** + * @summary Canvas サイズを更新 + * @private + */ + + }, { + key: "_updateCanvasSize", + value: function _updateCanvasSize() { + var canvas = this._canvas_element; // 要素のサイズとキャンバスのサイズを一致させる + + if (canvas.width != canvas.clientWidth) { + canvas.width = canvas.clientWidth; + } + + if (canvas.height != canvas.clientHeight) { + canvas.height = canvas.clientHeight; + } + } + /** + * @summary ポストプロセスを実行 + * @private + */ + + }, { + key: "_postProcess", + value: function _postProcess() { + if (this._postProcesses.length === 0) { + return; + } + + var nextProcesses = []; + + this._postProcesses.forEach(function (item) { + if (item()) { + nextProcesses.push(item); + } + }); + + this._postProcesses = nextProcesses; + } + /** + * @summary デバッグ統計の最終処理 + * @private + */ + + }, { + key: "_finishDebugStats", + value: function _finishDebugStats() { + var stats = this._debug_stats; + + if (stats === null) { + // 統計オブジェクトは指定されていない + return; + } // 統計値の取得 + + + stats.num_wait_reqs_dem = this._globe.getNumDemWaitingRequests(); + stats.num_wait_reqs_img = this._tile_texture_cache.getNumWaitingRequests(); // 統計の更新を通知 + + stats.onUpdate(); + } + /** + * EasyBindingBlock.DescendantUnbinder 処理 + * + * @private + */ + + }, { + key: "_unbindDescendantAnimations", + value: function _unbindDescendantAnimations() { + this._scene.animation.unbindAllRecursively(); + } + /** + * 太陽ベクトルの情報を設定します + * @param {Vector3} direction 方向(GOCS 正規化されていること) + */ + + }, { + key: "setSunDirection", + value: function setSunDirection(direction) { + GeoMath.copyVector3(direction, this._sun_direction); + } + /** + * 太陽ベクトルの情報のコピーを取得します + * @param {Vector3} dst 方向(GOCS 正規化されていること) + * @return {Vector3} ベクトルのコピー(GOCS) + */ + + }, { + key: "getSunDirection", + value: function getSunDirection(dst) { + return GeoMath.copyVector3(this._sun_direction, dst); + } + }, { + key: "container_element", + + /** + * @summary コンテナ要素 (キャンバス要素を保有する) + * @type {Element} + * @readonly + */ + get: function get() { + return this._container_element; + } + /** + * @summary キャンバス要素 + * @type {Element} + * @readonly + */ + + }, { + key: "canvas_element", + get: function get() { + return this._canvas_element; + } + /** + * @summary アニメーションパラメータ設定 + * @type {mapray.animation.BindingBlock} + * @readonly + */ + + }, { + key: "animation", + get: function get() { + return this._animation; + } + /** + * DEM データプロバイダ + * @type {mapray.DemProvider} + * @readonly + */ + + }, { + key: "dem_provider", + get: function get() { + return this._dem_provider; + } + /** + * @summary 画像プロバイダ + * @type {mapray.ImageProvider} + * @readonly + */ + + }, { + key: "image_provider", + get: function get() { + return this._image_provider; + } + /** + * @summary 地図レイヤー管理 + * @type {mapray.LayerCollection} + * @readonly + */ + + }, { + key: "layers", + get: function get() { + return this._layers; + } + /** + * @summary 点群管理 + * @type {mapray.PointCloudCollection} + * @readonly + */ + + }, { + key: "point_cloud_collection", + get: function get() { + return this._point_cloud_collection; + } + /** + * @summary レンダリングコールバック + * @type {mapray.RenderCallback} + * @readonly + */ + + }, { + key: "render_callback", + get: function get() { + return this._render_callback; + } + /** + * @summary レンダリングモード + * @type {mapray.RenderMode} + * @readonly + */ + + }, { + key: "render_mode", + get: function get() { + return this._render_mode; + } + /** + * @summary レンダリングモードを設定 + * @type {mapray.RenderMode} + */ + , + set: function set(val) { + this._render_mode = val; + } + /** + * @summary デバッグ統計オブジェクト + * @type {?mapray.DebugStats} + * @readonly + */ + + }, { + key: "debug_stats", + get: function get() { + return this._debug_stats; + } + /** + * @summary カメラ + * @type {mapray.Camera} + * @readonly + */ + + }, { + key: "camera", + get: function get() { + return this._camera; + } + /** + * @summary モデルシーン + * @type {mapray.Scene} + * @readonly + */ + + }, { + key: "scene", + get: function get() { + return this._scene; + } + /** + * 内部的に実装で使用される WebGL レンダリングコンテキスト情報 + * @type {mapray.GLEnv} + * @readonly + * @package + */ + + }, { + key: "glenv", + get: function get() { + return this._glenv; + } + /** + * @type {mapray.Globe} + * @readonly + * @package + */ + + }, { + key: "globe", + get: function get() { + return this._globe; + } + /** + * 内部的に実装で使用される地図画像タイル管理 + * @type {mapray.TileTextureCache} + * @readonly + * @package + */ + + }, { + key: "tile_texture_cache", + get: function get() { + return this._tile_texture_cache; + } + /** + * + * @type {mapray.LogoController} + * @readonly + * @memberof Viewer + */ + + }, { + key: "logo_controller", + get: function get() { + return this._logo_controller; + } + /** + * + * @type {mapray.AttributionController} + * @readonly + * @memberof Viewer + */ + + }, { + key: "attribution_controller", + get: function get() { + return this._attribution_controller; + } + /** + * @summary 太陽ベクトル。非公開とする。APIでは、メモリー破壊が起こらない Viewer#getSunDirection を公開する。 + * @type {Vector3} + * @private + * @readonly + * @memberof Viewer + */ + + }, { + key: "sun_direction", + get: function get() { + return this._sun_direction; + } + }], [{ + key: "_getBoolOption", + value: function _getBoolOption(options, name, defaultValue) { + return options && options[name] !== undefined ? options[name] : defaultValue; + } + }]); + + return Viewer; +}(); +/** + * @summary ピック結果 + * @typedef {object} PickResult + * @desc + *

関数型 {@link mapray.Viewer.pick} の戻り値のオブジェクト構造である。

+ * @property {mapray.Vector3} [point] ピックした3次元位置 + * @property {mapray.Entity} [entity|undefined] ピックしたエンティティ(ピック位置にエンティティがない場合はundefined) + * @memberof mapray.Viewer + */ + +/** + * @summary 表示対象の列挙型 + * @desc + *

{@link mapray.Viewer#setVisibility} と {@link mapray.Viewer#getVisibility} メソッドの target 引数に指定する値の型である。

+ * @enum {object} + * @memberof mapray.Viewer + * @constant + */ + + +var Category = { + /** + * 地表 (レイヤーも含む) + */ + GROUND: { + id: "GROUND" + }, + + /** + * エンティティ + */ + ENTITY: { + id: "ENTITY" + } +}; +/** + * @summary レンダリングモードの列挙型 + * @desc + * {@link mapray.Viewer} の構築子の options.render_mode パラメータ、または {@link mapray.Viewer#render_mode} プロパティに指定する値の型である。 + * @enum {object} + * @memberof mapray.Viewer + * @constant + */ + +var RenderMode = { + /** + * ポリゴン面 (既定値) + */ + SURFACE: { + id: "SURFACE" + }, + + /** + * ワイヤーフレーム + */ + WIREFRAME: { + id: "WIREFRAME" + } +}; // クラス定数の定義 + +{ + Viewer.Category = Category; + Viewer.RenderMode = RenderMode; // マウス・Attribution開発 + + Viewer.ContainerPosition = ContainerController.ContainerPosition; // ロゴ・著作権表示用コンテナ名称 + + Viewer._positions = ["control-top-left", "control-top-right", "control-bottom-left", "control-bottom-right"]; +} + +/** + * @summary クラウド DEM プロバイダ + * @memberof mapray + * @extends mapray.DemProvider + */ + +var CloudDemProvider = +/*#__PURE__*/ +function (_DemProvider) { + _inherits(CloudDemProvider, _DemProvider); + + /** + * @param {string} api_key API キーの文字列 + */ + function CloudDemProvider(api_key) { + var _this; + + _classCallCheck(this, CloudDemProvider); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(CloudDemProvider).call(this)); + _this._headers = { + 'X-Api-Key': api_key + }; + return _this; + } + /** + * @override + */ + + + _createClass(CloudDemProvider, [{ + key: "requestTile", + value: function requestTile(z, x, y, callback) { + var actrl = new AbortController(); + fetch(this._makeURL(z, x, y), { + headers: this._headers, + signal: actrl.signal + }).then(function (response) { + return response.ok ? response.arrayBuffer() : Promise.reject(Error(response.statusText)); + }).then(function (buffer) { + // データ取得に成功 + callback(buffer); + })["catch"](function () { + // データ取得に失敗または取り消し + callback(null); + }); + return actrl; + } + /** + * @override + */ + + }, { + key: "cancelRequest", + value: function cancelRequest(id) { + var actrl = id; // 要求 ID を AbortController に変換 + + actrl.abort(); // 取り消したので要求を中止 + } + /** + * URL を作成 + * @private + */ + + }, { + key: "_makeURL", + value: function _makeURL(z, x, y) { + return 'https://tiles.mapray.com/dem/' + z + '/' + x + '/' + y + '.bin'; + } + }]); + + return CloudDemProvider; +}(DemProvider); + +var pin_vs_code = "/**\n * テキスト (頂点シェーダ)\n */\n\nattribute vec4 a_position; // 頂点位置 (モデル座標系)\nattribute vec2 a_offset; // 頂点変位 (スクリーン座標系)\nattribute vec2 a_texcoord; // テクスチャ座標\nattribute vec2 a_texmaskcoord; // テクスチャマスク座標\nattribute vec3 a_fg_color; // 前景色\nattribute vec3 a_bg_color; // 背景色\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform vec2 u_sparam; // 画面パラメータ: {2/w, 2/h}\n\nvarying vec2 v_texcoord; // テクスチャ座標\nvarying vec2 v_texmaskcoord; // テクスチャマスク座標\nvarying vec3 v_fg_color; // 前景色\nvarying vec3 v_bg_color; // 背景色\n\nvoid\nmain()\n{\n gl_Position = u_obj_to_clip * a_position;\n gl_Position.xy += a_offset * u_sparam * gl_Position.w;\n v_texcoord = a_texcoord;\n v_texmaskcoord = a_texmaskcoord;\n v_fg_color = a_fg_color;\n v_bg_color = a_bg_color;\n}\n"; + +var pin_fs_code = "/**\n * テキスト (フラグメントシェーダ)\n */\n\nprecision mediump float;\n\nvarying vec2 v_texcoord; // アイコンのテクスチャ座標\nvarying vec2 v_texmaskcoord; // アイコンマスクのテクスチャ座標\nvarying vec3 v_fg_color; // 前景色\nvarying vec3 v_bg_color; // 背景色\n\nuniform sampler2D u_image; // アイコン画像\nuniform sampler2D u_image_mask; // アイコンマスク画像\n\n\nvoid\nmain()\n{\n float alpha = texture2D( u_image, v_texcoord ).w; // 輝度\n float mask = texture2D( u_image_mask, v_texmaskcoord ).w; // マスク\n alpha *= mask;\n gl_FragColor = vec4(v_fg_color * alpha + v_bg_color * (1.0 - alpha), 1.0);\n}\n"; + +/** + * @summary テキストマテリアル + * @memberof mapray + * @extends mapray.EntityMaterial + * @private + * @see mapray.PinEntity + */ + +var PinMaterial = +/*#__PURE__*/ +function (_EntityMaterial) { + _inherits(PinMaterial, _EntityMaterial); + + /** + * @param {mapray.GLEnv} glenv + */ + function PinMaterial(glenv) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, PinMaterial); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(PinMaterial).call(this, glenv, pin_vs_code, options.ridMaterial ? rid_fs_code : pin_fs_code)); // 不変パラメータを事前設定 + + _this.bindProgram(); + + _this.setInteger("u_image", PinMaterial.TEXUNIT_IMAGE); + + _this.setInteger("u_image_mask", PinMaterial.TEXUNIT_IMAGE_MASK); + + return _this; + } + /** + * @override + */ + + + _createClass(PinMaterial, [{ + key: "isTranslucent", + value: function isTranslucent(stage, primitive) { + return false; + } + /** + * @override + */ + + }, { + key: "setParameters", + value: function setParameters(stage, primitive) { + _get(_getPrototypeOf(PinMaterial.prototype), "setParameters", this).call(this, stage, primitive); + + var props = primitive.properties; // mat4 u_obj_to_clip + + this.setObjToClip(stage, primitive); // 画面パラメータ: {2/w, 2/h} + // vec2 u_sparam + + var sparam = PinMaterial._sparam; + sparam[0] = 2 / stage._width; + sparam[1] = 2 / stage._height; + this.setVector2("u_sparam", sparam); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + // テクスチャのバインド + // sampler2D u_image + var image = props["image"]; + this.bindTexture2D(PinMaterial.TEXUNIT_IMAGE, image.handle); // テクスチャマスクのバインド + // sampler2D u_image_mask + + var image_mask = props["image_mask"]; + this.bindTexture2D(PinMaterial.TEXUNIT_IMAGE_MASK, image_mask.handle); + } + } + }]); + + return PinMaterial; +}(EntityMaterial); // クラス定数の定義 + + +{ + PinMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット + + PinMaterial.TEXUNIT_IMAGE_MASK = 1; // 画像のテクスチャユニット + // 計算用一時領域 + + PinMaterial._sparam = GeoMath.createVector2f(); + PinMaterial._bg_color = GeoMath.createVector3f(); + PinMaterial._fg_color = GeoMath.createVector3f(); +} + +/** + * @classdesc + * アイコン画像のローダーです。 + * 何らかのプロパティに応じて、アイコンが読み込まれます。 + * 同一リソースが要求された場合は、読み込み中または読み込み済みのアイコンを返却します。 + * 同一リソースであるかの判定には、getKey(prop)関数により返却される値を用います。 + * @private + */ + +var IconLoader = +/*#__PURE__*/ +function () { + /** + * @summary コンストラクタ + */ + function IconLoader() { + _classCallCheck(this, IconLoader); + + this._cache = new Map(); + } + /** + * @summary プロパティに応じたアイコンを返却します。 + * すでに同一リソースを生成した場合は生成済みのインスタンスを返却し、そうでない場合はdoCreate(prop)により生成します。 + * @param {any} prop + * @return {IconLoaderItem} + */ + + + _createClass(IconLoader, [{ + key: "create", + value: function create(prop) { + var key = this.getKey(prop); + + var value = this._cache.get(key); + + if (!value) this._cache.set(key, value = this.doCreate(prop)); + return value; + } + /** + * @summary プロパティに応じたアイコンを生成します。 + * @abstract + * @param {any} prop プロパティ + * @return {IconLoaderItem} + */ + + }, { + key: "doCreate", + value: function doCreate(prop) {} + /** + * @summary プロパティに応じたキーを返却します。 + * 必要に応じてオーバーライドされることを想定した関数です。 + * ディフォルトでは、プロパティ自体がキーとなるように動作します。 + * @param {any} prop プロパティ + */ + + }, { + key: "getKey", + value: function getKey(prop) { + return prop; + } + /** + * @summary プロパティに応じたアイコンの読み込みを開始し、インスタンスを返却します。 + * 読み込みは開始しますが読み込み完了していない可能性があります。 + * この関数はasync関数ではありません。読み込み終了を監視するには、この関数の返却値に対してonEnd(callback)を呼び出します。 + * @param {any} prop プロパティ + * @return {IconLoaderItem} + */ + + }, { + key: "load", + value: function load(prop) { + var icon = this.create(prop); + icon.load(); + return icon; + } + }]); + + return IconLoader; +}(); +/** + * @classdesc アイコン画像ローダーのアイコンです。抽象クラスです。 + * ステータスの管理、読み込み完了後の通知等を行います。 + * @private + */ + + +var IconLoaderItem = +/*#__PURE__*/ +function () { + function IconLoaderItem() { + _classCallCheck(this, IconLoaderItem); + + this._status = IconLoaderItem.Status.NOT_LOADED; + this._funcs = []; + this._icon = null; + } + /** + * @summary アイコンの状態 + * @type {IconLoaderItem.Status} + * @readonly + */ + + + _createClass(IconLoaderItem, [{ + key: "isLoaded", + + /** + * @summary アイコンの読み込みが完了しているか + * @return {boolean} + */ + value: function isLoaded() { + return this._status === IconLoaderItem.Status.LOADED; + } + /** + * @summary アイコンの読み込みが完了した時点で呼び出されるコールバック関数を登録します。 + * この関数を呼び出した時点で読み込みが完了している場合は、即座にコールバック関数を実行します。 + * @param {function} + */ + + }, { + key: "onEnd", + value: function onEnd(func) { + var alreadyDone = this._status === IconLoaderItem.Status.LOADED || this._status === IconLoaderItem.Status.ABORTED; + if (alreadyDone) func(this);else this._funcs.push(func); + } + /** + * @summary アイコン読み込み関数(doLoad())を実行し、成功時、失敗時それぞれ後続処理を行います。 + */ + + }, { + key: "load", + value: function () { + var _load = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + var i; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!(this._status === IconLoaderItem.Status.NOT_LOADED)) { + _context.next = 14; + break; + } + + this._status = IconLoaderItem.Status.LOADING; + _context.prev = 2; + _context.next = 5; + return this.doLoad(); + + case 5: + this._icon = _context.sent; + this._status = IconLoaderItem.Status.LOADED; + _context.next = 12; + break; + + case 9: + _context.prev = 9; + _context.t0 = _context["catch"](2); + this._status = IconLoaderItem.Status.ABORTED; + + case 12: + for (i = 0; i < this._funcs.length; i++) { + this._funcs[i](this); + } + + this._funcs.length = 0; + + case 14: + case "end": + return _context.stop(); + } + } + }, _callee, this, [[2, 9]]); + })); + + function load() { + return _load.apply(this, arguments); + } + + return load; + }() + /** + * @summary アイコンを読み込みます。この関数はオーバーライドされることを想定されています。 + * @abstract + * @return {Image} + */ + + }, { + key: "doLoad", + value: function () { + var _doLoad = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2() { + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + throw new Error("doLoad() is not implemented in: " + this.constructor.name); + + case 1: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function doLoad() { + return _doLoad.apply(this, arguments); + } + + return doLoad; + }() + /** + * @summary アイコンを取得します。 + * アイコンが読み込まれるまではnullを返却します。 + * @return {Image|null} + */ + + }, { + key: "draw", + + /** + * @summary アイコンをキャンバスコンテキストに描画します。 + * @param {CanvasRenderingContext2D} context + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + value: function draw(context, x, y, width, height) { + context.drawImage(this.icon, x, y, width, height); + } + }, { + key: "status", + get: function get() { + return this._status; + } + }, { + key: "icon", + get: function get() { + return this._icon; + } + /** + * @summary アイコンの幅 + * アイコンが読み込まれるまでは-1を返却します。 + * @return {number} + */ + + }, { + key: "width", + get: function get() { + return this._icon ? this.icon.width : -1; + } + /** + * @summary アイコンの高さ + * アイコンが読み込まれるまでは-1を返却します。 + * @return {number} + */ + + }, { + key: "height", + get: function get() { + return this._icon ? this.icon.height : -1; + } + }]); + + return IconLoaderItem; +}(); +/** + * @private + */ + + +IconLoaderItem.Status = { + NOT_LOADED: "not loaded", + LOADING: "loading", + LOADED: "loaded", + ABORTED: "aborted" +}; +/** + * @classdesc アイコン画像のURLを指定してアイコンを読み込むアイコンローダーです。 + * urlは下記のように生成します。 + * url = urlPrefix + id + urlSuffix + * @private + */ + +var URLTemplateIconLoader = +/*#__PURE__*/ +function (_IconLoader) { + _inherits(URLTemplateIconLoader, _IconLoader); + + /** + * @param {string} urlPrefix + * @param {string} urlSuffix + */ + function URLTemplateIconLoader(urlPrefix, urlSuffix) { + var _this; + + _classCallCheck(this, URLTemplateIconLoader); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(URLTemplateIconLoader).call(this)); + _this.urlPrefix = urlPrefix; + _this.urlSuffix = urlSuffix; + return _this; + } + /** + * @override + */ + + + _createClass(URLTemplateIconLoader, [{ + key: "doCreate", + value: function doCreate(id) { + return new URLIconLoaderItem(this.urlPrefix + id + this.urlSuffix); + } + }]); + + return URLTemplateIconLoader; +}(IconLoader); +/** + * @classdesc URLTemplateIconLoaderのアイコンです。 + * + * @private + */ + + +var URLIconLoaderItem = +/*#__PURE__*/ +function (_IconLoaderItem) { + _inherits(URLIconLoaderItem, _IconLoaderItem); + + /** + * @param {string} url + */ + function URLIconLoaderItem(url) { + var _this2; + + _classCallCheck(this, URLIconLoaderItem); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(URLIconLoaderItem).call(this)); + _this2.url = url; + return _this2; + } + /** + * @override + */ + + + _createClass(URLIconLoaderItem, [{ + key: "doLoad", + value: function () { + var _doLoad2 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3() { + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return Dom.loadImage(this.url, { + crossOrigin: "Anonymous" + }); + + case 2: + return _context3.abrupt("return", _context3.sent); + + case 3: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + + function doLoad() { + return _doLoad2.apply(this, arguments); + } + + return doLoad; + }() + }]); + + return URLIconLoaderItem; +}(IconLoaderItem); +/** + * @classdesc テキストアイコンを生成するアイコンローダーです。 + * + * @private + */ + + +var TextIconLoader = +/*#__PURE__*/ +function (_IconLoader2) { + _inherits(TextIconLoader, _IconLoader2); + + function TextIconLoader() { + _classCallCheck(this, TextIconLoader); + + return _possibleConstructorReturn(this, _getPrototypeOf(TextIconLoader).apply(this, arguments)); + } + + _createClass(TextIconLoader, [{ + key: "doCreate", + + /** + * プロパティに応じたアイコンを生成します。 + * @param {string} prop.text プロパティ + */ + value: function doCreate(prop) { + return new TextIconLoaderItem(prop.text, prop.props); + } + /** + * プロパティに応じたキーを返却します。 + * @param {string} prop.text プロパティ + */ + + }, { + key: "getKey", + value: function getKey(prop) { + return prop.text; + } + }]); + + return TextIconLoader; +}(IconLoader); +/** + * @classdesc TextIconLoaderのアイコンです。 + * + * @private + */ + + +var TextIconLoaderItem = +/*#__PURE__*/ +function (_IconLoaderItem2) { + _inherits(TextIconLoaderItem, _IconLoaderItem2); + + /** + * @param {string} text text + * @param {mapray.Vector2} [props.size] size in pixel + * @param {string} [props.font_family] font family + */ + function TextIconLoaderItem(text) { + var _this3; + + var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, TextIconLoaderItem); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(TextIconLoaderItem).call(this)); + _this3.text = text; + _this3.props = props; + return _this3; + } + /** + * @override + */ + + + _createClass(TextIconLoaderItem, [{ + key: "doLoad", + value: function () { + var _doLoad3 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee4() { + var props, size, fontFamily, context; + return regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + props = this.props; + size = props.size ? props.size[0] : 20; + fontFamily = props.font_family ? "'" + props.font_family + "'" : Dom.SYSTEM_FONT_FAMILY; + context = Dom.createCanvasContext(size, size); + context.textAlign = "center"; + context.textBaseline = "alphabetic"; + context.font = size * 0.6756756757 + "px " + fontFamily; + context.fillText(this.text, size * 0.5, size * 0.7432432432); + return _context4.abrupt("return", context.canvas); + + case 9: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function doLoad() { + return _doLoad3.apply(this, arguments); + } + + return doLoad; + }() + /** + * @override + */ + + }, { + key: "draw", + value: function draw(context, x, y, width, height) { + context.drawImage(this.icon, x, y, width, height); + } + }]); + + return TextIconLoaderItem; +}(IconLoaderItem); +/** + * @classdesc 画像からアイコンを生成するアイコンローダーです。 + * + * @private + */ + + +var ImageIconLoader = +/*#__PURE__*/ +function (_IconLoader3) { + _inherits(ImageIconLoader, _IconLoader3); + + function ImageIconLoader() { + _classCallCheck(this, ImageIconLoader); + + return _possibleConstructorReturn(this, _getPrototypeOf(ImageIconLoader).apply(this, arguments)); + } + + _createClass(ImageIconLoader, [{ + key: "doCreate", + + /** + * プロパティに応じたアイコンを生成します。 + * @param {string} prop.text プロパティ + */ + value: function doCreate(image_src) { + return new ImageIconLoaderItem(image_src); + } + }]); + + return ImageIconLoader; +}(IconLoader); +/** + * @classdesc ImageIconLoaderのアイコンです。 + * + * @private + */ + + +var ImageIconLoaderItem = +/*#__PURE__*/ +function (_IconLoaderItem3) { + _inherits(ImageIconLoaderItem, _IconLoaderItem3); + + /** + * @param {string|HTMLImageElement|HTMLCanvasElement} image_src image source + */ + function ImageIconLoaderItem(image_src) { + var _this4; + + _classCallCheck(this, ImageIconLoaderItem); + + _this4 = _possibleConstructorReturn(this, _getPrototypeOf(ImageIconLoaderItem).call(this)); + _this4._image_src = image_src; + return _this4; + } + /** + * @override + */ + + + _createClass(ImageIconLoaderItem, [{ + key: "doLoad", + value: function () { + var _doLoad4 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee5() { + var image_src, image; + return regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + image_src = this._image_src; + + if (!(image_src instanceof Resource)) { + _context5.next = 7; + break; + } + + _context5.next = 4; + return image_src.load({ + type: ResourceType.IMAGE + }); + + case 4: + _context5.t0 = _context5.sent; + _context5.next = 22; + break; + + case 7: + if (!(typeof image_src === "string")) { + _context5.next = 13; + break; + } + + _context5.next = 10; + return Dom.loadImage(image_src); + + case 10: + _context5.t1 = _context5.sent; + _context5.next = 21; + break; + + case 13: + if (!(image_src instanceof HTMLImageElement)) { + _context5.next = 19; + break; + } + + _context5.next = 16; + return Dom.waitForLoad(image_src); + + case 16: + _context5.t2 = _context5.sent; + _context5.next = 20; + break; + + case 19: + _context5.t2 = image_src instanceof HTMLCanvasElement ? image_src : null; + + case 20: + _context5.t1 = _context5.t2; + + case 21: + _context5.t0 = _context5.t1; + + case 22: + image = _context5.t0; + + if (image) { + _context5.next = 25; + break; + } + + throw new Error("not supported: " + image_src); + + case 25: + return _context5.abrupt("return", image); + + case 26: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function doLoad() { + return _doLoad4.apply(this, arguments); + } + + return doLoad; + }() + }]); + + return ImageIconLoaderItem; +}(IconLoaderItem); + +/** + * @summary ピンエンティティ + * @memberof mapray + * @extends mapray.Entity + * + * @example + * var pin = new mapray.PinEntity(viewer.scene); + * pin.addTextPin( "32", new mapray.GeoPoint(139.768, 35.635) ); + * pin.addTextPin( "A", new mapray.GeoPoint(139.768, 35.636), { fg_color: [0.0, 0.0, 1.0], bg_color: [1.0, 0.0, 0.0] } ); + * pin.addTextPin( "始", new mapray.GeoPoint(139.768, 35.637), { size: 50 } ); + * pin.addTextPin( "終", new mapray.GeoPoint(139.768, 35.639), { size: 50, font_family: "Georgia" } ); + * pin.addPin( new mapray.GeoPoint(139.766, 35.6361) ); + * pin.addMakiIconPin( "ferry-15", new mapray.GeoPoint(139.764, 35.6361), { size: 150, fg_color: [0.2, 0.2, 0.2], bg_color: [1.0, 1.0, 1.0] } ); + * pin.addMakiIconPin( "car-15", new mapray.GeoPoint(139.762, 35.6361), { size: 60, fg_color: [1.0, 1.0, 1.0], bg_color: [0.2, 0.2, 0.2] } ); + * pin.addMakiIconPin( "bus-15", new mapray.GeoPoint(139.760, 35.6361), { size: 40, fg_color: [1.0, 0.3, 0.1], bg_color: [0.1, 0.3, 1.0] } ); + * pin.addMakiIconPin( "bus-15", new mapray.GeoPoint(139.759, 35.6361) ); + * pin.addMakiIconPin( "car-15", new mapray.GeoPoint(139.758, 35.6361) ); + * viewer.scene.addEntity(pin); + * + */ + +var PinEntity = +/*#__PURE__*/ +function (_AbstractPointEntity) { + _inherits(PinEntity, _AbstractPointEntity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + */ + function PinEntity(scene, opts) { + var _this; + + _classCallCheck(this, PinEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(PinEntity).call(this, scene, opts)); // 親プロパティ + + _this._parent_props = { + fg_color: null, + bg_color: null, + size: null, + font_family: null + }; // Entity.PrimitiveProducer インスタンス + + _this._primitive_producer = new PrimitiveProducer$5(_assertThisInitialized(_this)); + + _this._animation.addDescendantUnbinder(function () { + _this._unbindDescendantAnimations(); + }); + + _this._setupAnimationBindingBlock(); // 生成情報から設定 + + + if (opts && opts.json) { + _this._setupByJson(opts.json); + } + + return _this; + } + /** + * @override + */ + + + _createClass(PinEntity, [{ + key: "getPrimitiveProducer", + value: function getPrimitiveProducer() { + return this._primitive_producer; + } + /** + * @override + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode(prev_mode) { + this._primitive_producer.onChangeAltitudeMode(); + } + /** + * EasyBindingBlock.DescendantUnbinder 処理 + * + * @private + */ + + }, { + key: "_unbindDescendantAnimations", + value: function _unbindDescendantAnimations() { + // すべてのエントリーを解除 + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var entry = _step.value; + entry.animation.unbindAllRecursively(); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + }, { + key: "_setupAnimationBindingBlock", + value: function _setupAnimationBindingBlock() { + var _this2 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var vector2 = Type.find("vector2"); + var vector3 = Type.find("vector3"); // パラメータ名: fg_color + // パラメータ型: vector3 + // アイコンの色 + + block.addEntry("fg_color", [vector3], null, function (value) { + _this2.setFGColor(value); + }); // パラメータ名: bg_color + // パラメータ型: vector3 + // アイコン背景の色 + + block.addEntry("bg_color", [vector3], null, function (value) { + _this2.setBGColor(value); + }); // パラメータ名: size + // パラメータ型: vector2 | number + // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈 + // 型が number のとき アイコンのピクセルサイズX, Y は同値 + + var size_temp = GeoMath.createVector2(); + var size_type; + + var size_tsolver = function size_tsolver(curve) { + size_type = AnimUtil.findFirstTypeSupported(curve, [vector2, number]); + return size_type; + }; + + block.addEntry("size", [vector2, number], size_tsolver, function (value) { + if (size_type === vector2) { + _this2.setSize(value); + } else { + // size_type === number + size_temp[0] = value; + size_temp[1] = value; + + _this2.setSize(size_temp); + } + }); + } + /** + * @summary アイコンのピクセルサイズを指定 + * @param {mapray.Vector3} size アイコンのピクセルサイズ + */ + + }, { + key: "setSize", + value: function setSize(size) { + this._setVector2Property("size", size); + } + /** + * @summary アイコンの色を設定 + * @param {mapray.Vector3} color アイコンの色 + */ + + }, { + key: "setFGColor", + value: function setFGColor(color) { + this._setVector3Property("fg_color", color); + } + /** + * @summary アイコン背景の色を設定 + * @param {mapray.Vector3} color アイコン背景の色 + */ + + }, { + key: "setBGColor", + value: function setBGColor(color) { + this._setVector3Property("bg_color", color); + } + /** + * @summary テキストアイコンのフォントを設定 + * @param {string} font_family フォントファミリー + */ + + }, { + key: "setFontFamily", + value: function setFontFamily(font_family) { + this._setValueProperty("font_family", font_family); + } + /** + * Add Pin + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {float} [props.size] アイコンサイズ + * @param {mapray.Vector3} [props.fg_color] アイコン色 + * @param {mapray.Vector3} [props.bg_color] 背景色 + * @param {string} [props.id] Entryを識別するID + * @return {mapray.PinEntity.TextPinEntry} 追加したEntry + */ + + }, { + key: "addPin", + value: function addPin(position, props) { + return this.addTextPin("", position, props); + } + /** + * Add Maki Icon Pin + * @param {string} id   ID of Maki Icon + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {float} [props.size] アイコンサイズ + * @param {mapray.Vector3} [props.fg_color] アイコン色 + * @param {mapray.Vector3} [props.bg_color] 背景色 + * @param {string} [props.id] Entryを識別するID + * @return {mapray.PinEntity.MakiIconPinEntry} 追加したEntry + */ + + }, { + key: "addMakiIconPin", + value: function addMakiIconPin(id, position, props) { + var entry = new MakiIconPinEntry(this, id, position, props); + + this._entries.push(entry); + + this._primitive_producer.onAddEntry(); + + return entry; + } + /** + * Add Text Pin + * @param {string} text   ピンに表示されるテキスト + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {float} [props.size] アイコンサイズ + * @param {mapray.Vector3} [props.fg_color] アイコン色 + * @param {mapray.Vector3} [props.bg_color] 背景色 + * @param {string} [props.font_family] フォントファミリー + * @param {string} [props.id] Entryを識別するID + * @return {mapray.PinEntity.TextPinEntry} 追加したEntry + */ + + }, { + key: "addTextPin", + value: function addTextPin(text, position, props) { + var entry = new TextPinEntry(this, text, position, props); + + this._entries.push(entry); + + this._primitive_producer.onAddEntry(); + + return entry; + } + /** + * @summary 専用マテリアルを取得 + * @private + */ + + }, { + key: "_getMaterial", + value: function _getMaterial(render_target) { + var scene = this.scene; + + if (render_target === RenderTarget.SCENE) { + if (!scene._PinEntity_pin_material) { + // scene にマテリアルをキャッシュ + scene._PinEntity_pin_material = new PinMaterial(scene.glenv); + } + + return scene._PinEntity_pin_material; + } else if (render_target === RenderTarget.RID) { + if (!scene._PinEntity_pin_material_pick) { + // scene にマテリアルをキャッシュ + scene._PinEntity_pin_material_pick = new PinMaterial(scene.glenv, { + ridMaterial: true + }); + } + + return scene._PinEntity_pin_material_pick; + } + } + /** + * @private + */ + + }, { + key: "_setValueProperty", + value: function _setValueProperty(name, value) { + var props = this._parent_props; + + if (props[name] != value) { + props[name] = value; + + this._primitive_producer.onChangeParentProperty(); + } + } + /** + * @private + */ + + }, { + key: "_setVector3Property", + value: function _setVector3Property(name, value) { + var dst = this._parent_props[name]; + + if (!dst) { + dst = this._parent_props[name] = GeoMath.createVector3f(value); + + this._primitive_producer.onChangeParentProperty(); + } else if (dst[0] !== value[0] || dst[1] !== value[1] || dst[2] !== value[2]) { + GeoMath.copyVector3(value, dst); + + this._primitive_producer.onChangeParentProperty(); + } + } + /** + * @private + */ + + }, { + key: "_setVector2Property", + value: function _setVector2Property(name, value) { + var dst = this._parent_props[name]; + + if (!dst) { + this._parent_props[name] = GeoMath.createVector2f(value); + + this._primitive_producer.onChangeParentProperty(); + } else if (dst[0] !== value[0] || dst[1] !== value[1]) { + GeoMath.copyVector2(value, dst); + + this._primitive_producer.onChangeParentProperty(); + } + } + /** + * @private + */ + + }, { + key: "_setupByJson", + value: function _setupByJson(json) { + var position = new GeoPoint(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = json.entries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var entry = _step2.value; + position.setFromArray(entry.position); + this.addPin(position, entry); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + if (json.size) this.setSize(json.size); + if (json.fg_color) this.setFGColor(json.fg_color); + if (json.bg_color) this.setBGColor(json.bg_color); + if (json.font_family) this.setBGColor(json.font_family); + } + /** + * @summary IDでEntryを取得 + * @param {string} id ID + * @return {mapray.PinEntity.MakiIconPinEntry|mapray.PinEntity.TextPinEntry} IDが一致するEntry(無ければundefined) + */ + + }, { + key: "getEntry", + value: function getEntry(id) { + return this._entries.find(function (entry) { + return entry.id === id; + }); + } + }]); + + return PinEntity; +}(AbstractPointEntity); // クラス定数の定義 + + +{ + PinEntity.SAFETY_PIXEL_MARGIN = 1; + PinEntity.MAX_IMAGE_WIDTH = 4096; + PinEntity.CIRCLE_SEP_LENGTH = 32; + PinEntity.DEFAULT_SIZE = GeoMath.createVector2f([30, 30]); + PinEntity.DEFAULT_FONT_FAMILY = "sans-serif"; + PinEntity.DEFAULT_FG_COLOR = GeoMath.createVector3f([1.0, 1.0, 1.0]); + PinEntity.DEFAULT_BG_COLOR = GeoMath.createVector3f([0.35, 0.61, 0.81]); + PinEntity.SAFETY_PIXEL_MARGIN = 1; + PinEntity.MAX_IMAGE_WIDTH = 4096; +} +/** + * @summary PrimitiveProducer + * + * TODO: relative で標高の変化のたびにテクスチャを生成する必要はないので + * Layout でのテクスチャの生成とメッシュの生成を分離する + * + * @private + */ + +var PrimitiveProducer$5 = +/*#__PURE__*/ +function (_Entity$PrimitiveProd) { + _inherits(PrimitiveProducer, _Entity$PrimitiveProd); + + /** + * @param {mapray.PinEntity} entity + */ + function PrimitiveProducer(entity) { + var _this3; + + _classCallCheck(this, PrimitiveProducer); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PrimitiveProducer).call(this, entity)); + _this3._glenv = entity.scene.glenv; + _this3._dirty = true; // プリミティブの要素 + + _this3._transform = GeoMath.setIdentity(GeoMath.createMatrix()); + _this3._properties = { + image: null, + // 画像 + image_mask: null // マスク画像 + + }; // プリミティブ + + var primitive = new Primitive(_this3._glenv, null, entity._getMaterial(RenderTarget.SCENE), _this3._transform); + primitive.properties = _this3._properties; + _this3._primitive = primitive; + var pickPrimitive = new Primitive(_this3._glenv, null, entity._getMaterial(RenderTarget.RID), _this3._transform); + pickPrimitive.properties = _this3._properties; + _this3._pickPrimitive = pickPrimitive; // プリミティブ配列 + + _this3._primitives = []; + _this3._pickPrimitives = []; + return _this3; + } + /** + * @override + */ + + + _createClass(PrimitiveProducer, [{ + key: "createRegions", + value: function createRegions() { + var region = new EntityRegion(); + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this.entity._entries[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var position = _step3.value.position; + region.addPoint(position); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return [region]; + } + /** + * @override + */ + + }, { + key: "onChangeElevation", + value: function onChangeElevation(regions) { + this._dirty = true; + } + /** + * @override + */ + + }, { + key: "getPrimitives", + value: function getPrimitives(stage) { + this._updatePrimitive(stage); + + return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives; + } + /** + * @summary 親プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeParentProperty", + value: function onChangeParentProperty() { + this._dirty = true; + } + /** + * @summary 子プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeChildProperty", + value: function onChangeChildProperty() { + this._dirty = true; + } + /** + * @summary 高度モードが変更されたことを通知 + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode() { + this._dirty = true; + } + /** + * @summary エントリが追加されたことを通知 + */ + + }, { + key: "onAddEntry", + value: function onAddEntry() { + // 変化した可能性がある + this.needToCreateRegions(); + this._dirty = true; + } + /** + * @summary プリミティブの更新 + * + * @desc + * 入力: + * this.entity._entries + * this._dirty + * 出力: + * this._transform + * this._properties.image + * this._primitive.mesh + * this._primitives + * this._dirty + * + * @return {array.} this._primitives + * + * @private + */ + + }, { + key: "_updatePrimitive", + value: function _updatePrimitive() { + if (!this._dirty) { + // 更新する必要はない + return; + } + + if (this.entity._entries.length == 0) { + this._primitives = []; + this._pickPrimitives = []; + this._dirty = false; + return; + } // 各エントリーの GOCS 位置を生成 (平坦化配列) + + + var gocs_array = this._createFlatGocsArray(); // プリミティブの更新 + // primitive.transform + + + this._updateTransform(gocs_array); + + var layout = new Layout$1(this, gocs_array); + + if (!layout.isValid()) { + // 更新に失敗 + this._primitives = []; + this._pickPrimitives = []; + this._dirty = false; + return; + } // テクスチャ設定 + + + var properties = this._properties; + + if (properties.image) { + properties.image.dispose(); + } + + properties.image = layout.texture; + + if (properties.image_mask) { + properties.image_mask.dispose(); + } + + properties.image_mask = layout.texture_mask; // メッシュ生成 + + var mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }, { + name: "a_offset", + size: 2 + }, { + name: "a_texcoord", + size: 2 + }, { + name: "a_texmaskcoord", + size: 2 + }, { + name: "a_fg_color", + size: 3 + }, { + name: "a_bg_color", + size: 3 + }], + vertices: layout.vertices, + indices: layout.indices + }; + var mesh = new Mesh(this._glenv, mesh_data); // メッシュ設定 + // primitive.mesh + + var primitive = this._primitive; + + if (primitive.mesh) { + primitive.mesh.dispose(); + } + + var pickPrimitive = this._pickPrimitive; + + if (pickPrimitive.mesh) { + pickPrimitive.mesh.dispose(); + } + + primitive.mesh = mesh; + pickPrimitive.mesh = mesh; // 更新に成功 + + this._primitives = [primitive]; + this._pickPrimitives = [pickPrimitive]; + this._dirty = false; + } + /** + * @summary プリミティブの更新 + * + * @desc + * 条件: + * this.entity._entries.length > 0 + * 入力: + * this.entity._entries.length + * 出力: + * this._transform + * + * @param {number[]} gocs_array GOCS 平坦化配列 + * + * @private + */ + + }, { + key: "_updateTransform", + value: function _updateTransform(gocs_array) { + var num_entries = this.entity._entries.length; + var xsum = 0; + var ysum = 0; + var zsum = 0; + + for (var i = 0; i < num_entries; ++i) { + var ibase = 3 * i; + xsum += gocs_array[ibase]; + ysum += gocs_array[ibase + 1]; + zsum += gocs_array[ibase + 2]; + } // 変換行列の更新 + + + var transform = this._transform; + transform[12] = xsum / num_entries; + transform[13] = ysum / num_entries; + transform[14] = zsum / num_entries; + } + /** + * @summary GOCS 平坦化配列を取得 + * + * 入力: this.entity._entries + * + * @return {number[]} GOCS 平坦化配列 + * @private + */ + + }, { + key: "_createFlatGocsArray", + value: function _createFlatGocsArray() { + var num_points = this.entity._entries.length; + return GeoPoint.toGocsArray(this._getFlatGeoPoints_with_Absolute(), num_points, new Float64Array(3 * num_points)); + } + /** + * @summary GeoPoint 平坦化配列を取得 (絶対高度) + * + * 入力: this.entity._entries + * + * @return {number[]} GeoPoint 平坦化配列 + * @private + */ + + }, { + key: "_getFlatGeoPoints_with_Absolute", + value: function _getFlatGeoPoints_with_Absolute() { + var owner = this.entity; + var entries = owner._entries; + var num_points = entries.length; + var flat_array = new Float64Array(3 * num_points); // flat_array[] に経度要素と緯度要素を設定 + + for (var i = 0; i < num_points; ++i) { + var pos = entries[i].position; + flat_array[3 * i] = pos.longitude; + flat_array[3 * i + 1] = pos.latitude; + } + + switch (owner.altitude_mode) { + case AltitudeMode.RELATIVE: + case AltitudeMode.CLAMP: + // flat_array[] の高度要素に現在の標高を設定 + owner.scene.viewer.getExistingElevations(num_points, flat_array, 0, 3, flat_array, 2, 3); + + if (owner.altitude_mode === AltitudeMode.RELATIVE) { + // flat_array[] の高度要素に絶対高度を設定 + for (var _i = 0; _i < num_points; ++_i) { + flat_array[3 * _i + 2] += entries[_i].position.altitude; + } + } + + break; + + default: + // AltitudeMode.ABSOLUTE + // flat_array[] の高度要素に絶対高度を設定 + for (var _i2 = 0; _i2 < num_points; ++_i2) { + flat_array[3 * _i2 + 2] = entries[_i2].position.altitude; + } + + break; + } + + return flat_array; + } + }]); + + return PrimitiveProducer; +}(Entity.PrimitiveProducer); +/** + * @summary ピン要素 + * @hideconstructor + * @memberof mapray.PinEntity + * @public + * @abstract + */ + + +var AbstractPinEntry = +/*#__PURE__*/ +function () { + function AbstractPinEntry(owner, position, props) { + _classCallCheck(this, AbstractPinEntry); + + this._owner = owner; + this._position = position.clone(); // animation.BindingBlock + + this._animation = new EasyBindingBlock(); + + this._setupAnimationBindingBlock(); + + this._props = Object.assign({}, props); // props の複製 + + this._copyPropertyVector3f("fg_color"); // deep copy + + + this._copyPropertyVector3f("bg_color"); // deep copy + + + this._copyPropertyVector2f("size"); // deep copy + + } + + _createClass(AbstractPinEntry, [{ + key: "_loadIcon", + value: function _loadIcon() { + throw new Error("loadIcon() is not implemented: " + this.constructor.name); + } + /** + * @summary 位置 + * @type {mapray.GeoPoint} + * @readonly + * @package + */ + + }, { + key: "_setupAnimationBindingBlock", + + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + value: function _setupAnimationBindingBlock() { + var _this4 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var vector2 = Type.find("vector2"); + var vector3 = Type.find("vector3"); // パラメータ名: position + // パラメータ型: vector3 + // ベクトルの要素が longitude, latitude, altitude 順であると解釈 + + var position_temp = new GeoPoint(); + block.addEntry("position", [vector3], null, function (value) { + position_temp.setFromArray(value); // Vector3 -> GeoPoint + + _this4.setPosition(position_temp); + }); // パラメータ名: fg_color + // パラメータ型: vector3 + // アイコンの色 + + block.addEntry("fg_color", [vector3], null, function (value) { + _this4.setFGColor(value); + }); // パラメータ名: bg_color + // パラメータ型: vector3 + // アイコン背景の色 + + block.addEntry("bg_color", [vector3], null, function (value) { + _this4.setBGColor(value); + }); // パラメータ名: size + // パラメータ型: vector2 | number + // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈 + // 型が number のとき アイコンのピクセルサイズX, Y は同値 + + var size_temp = GeoMath.createVector2(); + var size_type; + + var size_tsolver = function size_tsolver(curve) { + size_type = AnimUtil.findFirstTypeSupported(curve, [vector2, number]); + return size_type; + }; + + block.addEntry("size", [vector2, number], size_tsolver, function (value) { + if (size_type === vector2) { + _this4.setSize(value); + } else { + // size_type === number + size_temp[0] = value; + size_temp[1] = value; + + _this4.setSize(size_temp); + } + }); + } + /** + * @summary モデル原点位置を設定 + * + * @param {mapray.GeoPoint} position モデル原点の位置 + */ + + }, { + key: "setPosition", + value: function setPosition(position) { + if (this._position.longitude !== position.longitude || this._position.latitude !== position.latitude || this._position.altitude !== position.altitude) { + // 位置が変更された + this._position.assign(position); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + /** + * @summary アイコンのピクセルサイズを指定 + * @param {mapray.Vector3} size アイコンのピクセルサイズ + */ + + }, { + key: "setSize", + value: function setSize(size) { + this._setVector2Property("size", size); + } + /** + * @summary アイコンの色を設定 + * @param {mapray.Vector3} color アイコンの色 + */ + + }, { + key: "setFGColor", + value: function setFGColor(color) { + this._setVector3Property("fg_color", color); + } + /** + * @summary アイコン背景の色を設定 + * @param {mapray.Vector3} color アイコン背景の色 + */ + + }, { + key: "setBGColor", + value: function setBGColor(color) { + this._setVector3Property("bg_color", color); + } + /** + * @private + */ + + }, { + key: "_copyPropertyVector3f", + value: function _copyPropertyVector3f(name) { + var props = this._props; + + if (props.hasOwnProperty(name)) { + props[name] = GeoMath.createVector3f(props[name]); + } + } + /** + * @private + */ + + }, { + key: "_copyPropertyVector2f", + value: function _copyPropertyVector2f(name) { + var props = this._props; + + if (props.hasOwnProperty(name)) { + if (typeof props[name] === 'number') { + props[name] = GeoMath.createVector2f([props[name], props[name]]); + } else { + props[name] = GeoMath.createVector2f(props[name]); + } + } + } + /** + * @private + */ + + }, { + key: "_setVector3Property", + value: function _setVector3Property(name, value) { + var dst = this._props[name]; + + if (!dst) { + dst = this._props[name] = GeoMath.createVector3f(value); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } else if (dst[0] !== value[0] || dst[1] !== value[1] || dst[2] !== value[2]) { + GeoMath.copyVector3(value, dst); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + /** + * @private + */ + + }, { + key: "_setVector2Property", + value: function _setVector2Property(name, value) { + var dst = this._props[name]; + + if (!dst) { + this._props[name] = GeoMath.createVector2f(value); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } else if (dst[0] !== value[0] || dst[1] !== value[1]) { + GeoMath.copyVector2(value, dst); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + }, { + key: "isLoaded", + value: function isLoaded() { + return this._icon.isLoaded(); + } + }, { + key: "draw", + value: function draw(context, x, y, width, height) { + this._icon.draw(context, x, y, width, height); + } + }, { + key: "position", + get: function get() { + return this._position; + } + /** + * @summary ID + * @type {string} + * @readonly + */ + + }, { + key: "id", + get: function get() { + return this._props.hasOwnProperty("id") ? this._props.id : ""; + } + /** + * @summary アイコンサイズ (Pixels) + * @type {mapray.Vector2} + * @readonly + * @package + */ + + }, { + key: "size", + get: function get() { + var props = this._props; + var parent = this._owner._parent_props; + return props.size || parent.size || (this.icon ? GeoMath.createVector2f([this.icon.width, this.icon.height]) : PinEntity.DEFAULT_SIZE); + } + /** + * @summary アイコン色 + * @type {mapray.Vector3} + * @readonly + * @package + */ + + }, { + key: "fg_color", + get: function get() { + var props = this._props; + var parent = this._owner._parent_props; + return props.fg_color || parent.fg_color || PinEntity.DEFAULT_FG_COLOR; + } + /** + * @summary アイコン背景色 + * @type {mapray.Vector3} + * @readonly + * @package + */ + + }, { + key: "bg_color", + get: function get() { + var props = this._props; + var parent = this._owner._parent_props; + return props.bg_color || parent.bg_color || PinEntity.DEFAULT_BG_COLOR; + } + /** + * @summary アニメーションパラメータ設定 + * + * @type {mapray.animation.BindingBlock} + * @readonly + */ + + }, { + key: "animation", + get: function get() { + return this._animation; + } + }, { + key: "icon", + get: function get() { + return this._icon; + } + }]); + + return AbstractPinEntry; +}(); + +PinEntity.AbstractPinEntry = AbstractPinEntry; +/** + * @summary MakiIcon要素 + * @hideconstructor + * @memberof mapray.PinEntity + * @extends mapray.PinEntity.AbstractPinEntry + * @public + */ + +var MakiIconPinEntry = +/*#__PURE__*/ +function (_AbstractPinEntry) { + _inherits(MakiIconPinEntry, _AbstractPinEntry); + + /** + * @param {mapray.PinEntity} owner 所有者 + * @param {string} id MakiアイコンのID + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {float} [props.size] アイコンサイズ + * @param {mapray.Vector3} [props.fg_color] アイコン色 + * @param {mapray.Vector3} [props.bg_color] 背景色 + * @param {string} [props.id] Entryを識別するID + */ + function MakiIconPinEntry(owner, id, position, props) { + var _this5; + + _classCallCheck(this, MakiIconPinEntry); + + _this5 = _possibleConstructorReturn(this, _getPrototypeOf(MakiIconPinEntry).call(this, owner, position, props)); + + _this5.setId(id); + + _this5._setupMakiIconPinAnimationBindingBlock(); + + return _this5; + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + + _createClass(MakiIconPinEntry, [{ + key: "_setupMakiIconPinAnimationBindingBlock", + value: function _setupMakiIconPinAnimationBindingBlock() { + var _this6 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var string = Type.find("string"); // パラメータ名: id + // パラメータ型: string + // アイコンのID + + block.addEntry("id", [string], null, function (value) { + _this6.setId(value); + }); + } + /** + * @summary アイコンのIDを設定 + * @param {string} maki_id アイコンのID + */ + + }, { + key: "setId", + value: function setId(maki_id) { + var _this7 = this; + + if (this._maki_id !== maki_id) { + // アイコンのIDが変更された + this._maki_id = maki_id; + this._icon = MakiIconPinEntry.makiIconLoader.load(maki_id); + + this._icon.onEnd(function (item) { + _this7._owner.getPrimitiveProducer()._dirty = true; + }); + } + } + }]); + + return MakiIconPinEntry; +}(AbstractPinEntry); + +PinEntity.MakiIconPinEntry = MakiIconPinEntry; +{ + MakiIconPinEntry.makiIconLoader = new URLTemplateIconLoader("https://resource.mapray.com/styles/v1/icons/maki/", ".svg"); +} +/** + * @summary MakiIcon要素 + * @hideconstructor + * @memberof mapray.PinEntity + * @extends mapray.PinEntity.AbstractPinEntry + * @public + */ + +var TextPinEntry = +/*#__PURE__*/ +function (_AbstractPinEntry2) { + _inherits(TextPinEntry, _AbstractPinEntry2); + + /** + * @param {mapray.PinEntity} owner 所有者 + * @param {string} text テキスト + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {float} [props.size] アイコンピクセルサイズ + * @param {mapray.Vector3} [props.fg_color] アイコン色 + * @param {mapray.Vector3} [props.bg_color] 背景色 + * @param {string} [props.font_family] フォントファミリー + * @param {string} [props.id] Entryを識別するID + */ + function TextPinEntry(owner, text, position, props) { + var _this8; + + _classCallCheck(this, TextPinEntry); + + _this8 = _possibleConstructorReturn(this, _getPrototypeOf(TextPinEntry).call(this, owner, position, props)); + + _this8.setText(text); + + _this8._setupTextPinAnimationBindingBlock(); + + return _this8; + } + /** + * @summary フォントファミリー + * @type {string} + * @readonly + * @package + */ + + + _createClass(TextPinEntry, [{ + key: "_setupTextPinAnimationBindingBlock", + + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + value: function _setupTextPinAnimationBindingBlock() { + var _this9 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var string = Type.find("string"); // パラメータ名: text + // パラメータ型: string + // テキスト + + block.addEntry("text", [string], null, function (value) { + _this9.setText(value); + }); + } + /** + * @summary テキストを設定 + * @param {string} text テキスト + */ + + }, { + key: "setText", + value: function setText(text) { + var _this10 = this; + + if (this._text !== text) { + // テキストが変更された + this._text = text; + this._icon = TextPinEntry.textIconLoader.load({ + text: this._text, + props: { + size: this.size, + font_family: this.font_family + } + }); + + this._icon.onEnd(function (item) { + _this10._owner.getPrimitiveProducer()._dirty = true; + }); + } + } + }, { + key: "font_family", + get: function get() { + var props = this._props; + var parent = this._owner._parent_props; + return props.font_family || parent.font_family || PinEntity.DEFAULT_FONT_FAMILY; + } + }]); + + return TextPinEntry; +}(AbstractPinEntry); + +PinEntity.TextPinEntry = TextPinEntry; +{ + TextPinEntry.textIconLoader = new TextIconLoader(); +} +/** + * @summary 要素を Canvas 上にレイアウト + * + * @memberof mapray.PinEntity + * @private + */ + +var Layout$1 = +/*#__PURE__*/ +function () { + /** + * @desc + * 入力: + * owner._glenv + * owner.entity._entries + * owner._transform + * + * @param {PrimitiveProducer} owner 所有者 + * @param {number[]} gocs_array GOCS 平坦化配列 + */ + function Layout(owner, gocs_array) { + _classCallCheck(this, Layout); + + this._owner = owner; + this._items = this._createItemList(); + this._is_valid = true; + + var row_layouts = this._createRowLayouts(); + + if (row_layouts.length == 0) { + // 有効なテキストが1つも無い + this._is_valid = false; + return; + } // アイテムの配置の設定とキャンバスサイズの決定 + + + var size = this._setupLocation(row_layouts); + + this._texture = this._createTexture(size.width, size.height); + this._texture_mask = this._createTextureMask(); + this._vertices = this._createVertices(size.width, size.height, gocs_array); + this._indices = this._createIndices(); + } + /** + * @summary 有効なオブジェクトか? + * @desc + *

無効のとき、他のメソッドは呼び出せない。

+ * @return {boolean} 有効のとき true, 無効のとき false + */ + + + _createClass(Layout, [{ + key: "isValid", + value: function isValid() { + return this._is_valid; + } + /** + * @summary テクスチャ + * @type {mapray.Texture} + * @readonly + */ + + }, { + key: "_createItemList", + + /** + * @summary レイアウトアイテムのリストを生成 + * @return {array.} + * @private + */ + value: function _createItemList() { + var map = new Map(); + var items = []; + var counter = 0; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._owner.entity._entries[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var entry = _step4.value; + + if (entry.isLoaded()) { + var item = map.get(entry.icon); + + if (!item) { + map.set(entry.icon, item = new LItem$1(this)); + items.push(item); + } + + item.add(counter++, entry); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return items; + } + /** + * @summary RowLayout のリストを生成 + * @return {array.} + * @private + */ + + }, { + key: "_createRowLayouts", + value: function _createRowLayouts() { + // アイテムリストの複製 + var items = [].concat(this._items); // RowLayout 内であまり高さに差が出ないように、アイテムリストを高さで整列 + + items.sort(function (a, b) { + return a.height_pixel - b.height_pixel; + }); // リストを生成 + + var row_layouts = []; + + while (items.length > 0) { + var row_layout = new RowLayout$1(items); + + if (row_layout.isValid()) { + row_layouts.push(row_layout); + } + } + + return row_layouts; + } + /** + * @summary テクスチャを生成 + * @param {number} width 横幅 + * @param {number} height 高さ + * @return {mapray.Texture} テキストテクスチャ + * @private + */ + + }, { + key: "_createTexture", + value: function _createTexture(width, height) { + var context = Dom.createCanvasContext(width, height); + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + item.draw(context); + } + + var glenv = this._owner._glenv; + var opts = { + usage: Texture.Usage.ICON + }; + return new Texture(glenv, context.canvas, opts); + } + }, { + key: "_createTextureMask", + value: function _createTextureMask() { + var context = Dom.createCanvasContext(3, 3); + context.fillRect(1, 1, 1, 1); + var glenv = this._owner._glenv; + var opts = { + usage: Texture.Usage.ICON, + mag_filter: glenv.context.NEAREST + }; + return new Texture(glenv, context.canvas, opts); + } + /** + * @summary 頂点配列を生成 + * + * @param {number} width 横幅 + * @param {number} height 高さ + * @param {number[]} gocs_array GOCS 平坦化配列 + * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...] + * + * @private + */ + + }, { + key: "_createVertices", + value: function _createVertices(width, height, gocs_array) { + var vertices = []; // テキスト集合の原点 (GOCS) + + var transform = this._owner._transform; + var xo = transform[12]; + var yo = transform[13]; + var zo = transform[14]; + /* + || + | | + | |<--rx--->| + ___-------___ ---- + / \ ^ + / \ ry + | | | ---- + | | v ^ + | c | ---- size.y + | | ^ V + | | | ---- + \ / | + '----_0___3_----' | + | | | + | | h + | | | + | | | + | | | + | | v + 1---2 ------------ + + >| w |< + */ + + var xn = 1 / width; + var yn = 1 / height; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + + for (var ie = 0; ie < item.entries.length; ie++) { + var eitem = item.entries[ie]; + var entry = eitem.entry; + var size = entry.size; + var rx = size[0] * 1.5 / 2; + var ry = size[1] * 1.5 / 2; + var h = ry * 2; + var w = Math.max(2, rx / 10); // Relativize based on (xo, yo, zo) + + var ibase = eitem.index * 3; + var xm = gocs_array[ibase] - xo; + var ym = gocs_array[ibase + 1] - yo; + var zm = gocs_array[ibase + 2] - zo; + var fg_color = entry.fg_color; + var bg_color = entry.bg_color; // Image dimensions (Image Coordinate) + + var xc = item.pos_x; + var yc = item.pos_y; + var xsize = item.width; + var ysize = item.height; + + var vertices_push_texture = function vertices_push_texture(px, py) { + vertices.push((xc + xsize * px) * xn, 1 - (yc + ysize * py) * yn); + }; // p0 + + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-w / 2, h - ry); // a_offset + + vertices_push_texture(0.5 - w / 2 / rx, 1.5 / 2 + 0.5); // a_texcoord + + vertices.push(-0.25 + 0.5, -0.25 + 0.5); // a_texmaskcoord + + vertices.push.apply(vertices, _toConsumableArray(fg_color)); + vertices.push.apply(vertices, _toConsumableArray(bg_color)); // p1 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-w / 2, 0); // a_offset + + vertices_push_texture(0.5 - w / 2 / rx, 1.5 / 2 + 0.5); // a_texcoord + + vertices.push(-0.25 + 0.5, -0.25 + 0.5); // a_texmaskcoord + + vertices.push.apply(vertices, _toConsumableArray(fg_color)); + vertices.push.apply(vertices, _toConsumableArray(bg_color)); // p2 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(w / 2, 0); // a_offset + + vertices_push_texture(0.5 + w / 2 / rx, 1.5 / 2 + 0.5); // a_texcoord + + vertices.push(-0.25 + 0.5, -0.25 + 0.5); // a_texmaskcoord + + vertices.push.apply(vertices, _toConsumableArray(fg_color)); + vertices.push.apply(vertices, _toConsumableArray(bg_color)); // p3 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(w / 2, h - ry); // a_offset + + vertices_push_texture(0.5 + w / 2 / rx, 1.5 / 2 + 0.5); // a_texcoord + + vertices.push(-0.25 + 0.5, -0.25 + 0.5); // a_texmaskcoord + + vertices.push.apply(vertices, _toConsumableArray(fg_color)); + vertices.push.apply(vertices, _toConsumableArray(bg_color)); // c + + vertices.push(xm, ym, zm); // a_position + + vertices.push(0, h); // a_offset + + vertices_push_texture(0.5, 0.5); // a_texcoord + + vertices.push(0.5, 0.5); // a_texmaskcoord + + vertices.push.apply(vertices, _toConsumableArray(fg_color)); + vertices.push.apply(vertices, _toConsumableArray(bg_color)); + + for (var k = 1; k < PinEntity.CIRCLE_SEP_LENGTH; k++) { + var th = (k / PinEntity.CIRCLE_SEP_LENGTH * 2 - 0.5) * Math.PI; + var cos_th = Math.cos(th); + var sin_th = Math.sin(th); + vertices.push(xm, ym, zm); // a_position + + vertices.push(rx * cos_th, ry * sin_th + h); // a_offset + + vertices_push_texture(1.5 * cos_th / 2 + 0.5, -1.5 * sin_th / 2 + 0.5); // a_texcoord + + vertices.push(cos_th * 0.25 + 0.5, sin_th * 0.25 + 0.5); // a_texmaskcoord + + vertices.push.apply(vertices, _toConsumableArray(fg_color)); + vertices.push.apply(vertices, _toConsumableArray(bg_color)); + } + } + } + + return vertices; + } + /** + * @summary インデックス配列を生成 + * @return {array.} インデックス配列 [] + * @private + */ + + }, { + key: "_createIndices", + value: function _createIndices() { + var indices = []; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + + for (var ie = 0; ie < item.entries.length; ie++) { + var eitem = item.entries[ie]; + var base = (4 + 1 + PinEntity.CIRCLE_SEP_LENGTH - 1) * eitem.index; + var p = base; + var p0 = p; + var p3 = p + 3; + indices.push(p, p + 1, p + 2); + indices.push(p, p + 2, p + 3); + p += 4; + var centerPos = p++; + indices.push(centerPos, p0, p3); + indices.push(centerPos, p3, p); + + for (var j = 1; j < PinEntity.CIRCLE_SEP_LENGTH - 1; j++) { + indices.push(centerPos, p++, p); + } + + indices.push(centerPos, p++, p0); + } + } + + return indices; + } + /** + * @summary アイテムの配置を設定 + * @param {array.} row_layouts + * @return {object} キャンバスサイズ + * @private + */ + + }, { + key: "_setupLocation", + value: function _setupLocation(row_layouts) { + var width = 0; + var height = 0; + height += PinEntity.SAFETY_PIXEL_MARGIN; + + for (var i = 0; i < row_layouts.length; ++i) { + var row_layout = row_layouts[i]; + row_layout.locate(height); + width = Math.max(row_layout.width_assumed, width); + height += row_layout.height_pixel + PinEntity.SAFETY_PIXEL_MARGIN; + } + + return { + width: width, + height: height + }; + } + }, { + key: "texture", + get: function get() { + return this._texture; + } + /** + * @summary テクスチャマスク + * @type {mapray.Texture} + * @readonly + */ + + }, { + key: "texture_mask", + get: function get() { + return this._texture_mask; + } + /** + * @summary 頂点配列 + * @desc + * 条件: + * this._entries.length > 0 + * 入力: + * this._entries + * this._transform + * @type {Float32Array} + * @readonly + */ + + }, { + key: "vertices", + get: function get() { + return this._vertices; + } + /** + * @summary インデックス配列 + * @type {Uint32Array} + * @readonly + */ + + }, { + key: "indices", + get: function get() { + return this._indices; + } + }]); + + return Layout; +}(); +/** + * @summary レイアウト対象 + * @memberof mapray.PinEntity + * @private + */ + + +var LItem$1 = +/*#__PURE__*/ +function () { + /** + * @param {mapray.PinEntity.Layout} layout 所有者 + * @param {mapray.PinEntity.Entry} entry PinEntityのエントリ + */ + function LItem(layout) { + _classCallCheck(this, LItem); + + this.entries = []; // テキストの基点 + + this._pos_x = 0; // 左端 + + this._pos_y = 0; // ベースライン位置 + + this._height = this._width = null; + this._is_canceled = false; + } + + _createClass(LItem, [{ + key: "add", + value: function add(index, entry) { + var size = entry.size; + if (this._width === null || this._width < size[0]) this._width = size[0]; + if (this._height === null || this._height < size[1]) this._height = size[1]; + this.entries.push({ + index: index, + entry: entry + }); + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "cancel", + + /** + * @summary 取り消し状態に移行 + */ + value: function cancel() { + this._is_canceled = true; + } + /** + * @summary 配置を決定 + * @param {number} x テキスト矩形左辺の X 座標 (キャンバス座標系) + * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系) + */ + + }, { + key: "locate", + value: function locate(x, y) { + this._pos_x = x; + this._pos_y = y; + } + }, { + key: "draw", + value: function draw(context) { + this.entries[0].entry.draw(context, this._pos_x, this.pos_y, this.width, this.height); + } + }, { + key: "pos_x", + get: function get() { + return this._pos_x; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "pos_y", + get: function get() { + return this._pos_y; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "width", + get: function get() { + return this._width; + } + }, { + key: "height", + get: function get() { + return this._height; + } + /** + * キャンバス上でのテキストの横画素数 + * @type {number} + * @readonly + */ + + }, { + key: "width_pixel", + get: function get() { + return Math.ceil(this._width); + } + /** + * キャンバス上でのテキストの縦画素数 + * @type {number} + * @readonly + */ + + }, { + key: "height_pixel", + get: function get() { + return Math.ceil(this._height); + } + /** + * 取り消し状態か? + * @type {boolean} + * @readonly + */ + + }, { + key: "is_canceled", + get: function get() { + return this._is_canceled; + } + }]); + + return LItem; +}(); +/** + * @summary 水平レイアウト + * @memberof mapray.PinEntity + * @private + */ + + +var RowLayout$1 = +/*#__PURE__*/ +function () { + /** + * @desc + *

レイアウトされた、またはレイアウトに失敗したアイテムは src_items から削除される。

+ *

レイアウトに失敗したアイテムは取り消し (is_canceled) になる。

+ * @param {array.} src_items アイテムリスト + */ + function RowLayout(src_items) { + _classCallCheck(this, RowLayout); + + var width_assumed_total = 0; + var height_pixel_max = 0; + var row_items = []; + width_assumed_total += PinEntity.SAFETY_PIXEL_MARGIN; // 左マージン + + while (src_items.length > 0) { + var item = src_items.shift(); + var width_assumed = item.width_pixel + PinEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン + + if (width_assumed_total + width_assumed <= PinEntity.MAX_IMAGE_WIDTH) { + // 行にアイテムを追加 + row_items.push(item); + width_assumed_total += width_assumed; + height_pixel_max = Math.max(item.height_pixel, height_pixel_max); + } else { + if (row_items.length == 0) { + // テキストが長すぎて表示できない + item.cancel(); + } else { + // 次の行になるため差し戻して終了 + src_items.unshift(item); + break; + } + } + } + + this._items = row_items; + this._width_assumed = width_assumed_total; + this._height_pixel = height_pixel_max; + } + /** + * @summary 有効なオブジェクトか? + * @desc + *

無効のとき、他のメソッドは呼び出せない。

+ * @return {boolean} 有効のとき true, 無効のとき false + */ + + + _createClass(RowLayout, [{ + key: "isValid", + value: function isValid() { + return this._items.length > 0; + } + /** + * + * @type {array.} + * @readonly + */ + + }, { + key: "locate", + + /** + * @summary レイアウトの配置を決定 + * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系) + */ + value: function locate(y) { + var items = this._items; + var x = 0; + x += PinEntity.SAFETY_PIXEL_MARGIN; // 左マージン + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + item.locate(x, y); + x += item.width_pixel + PinEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン + } + } + }, { + key: "items", + get: function get() { + return this._items; + } + /** + * キャンバス上での行の横占有画素数 + * @type {number} + * @readonly + */ + + }, { + key: "width_assumed", + get: function get() { + return this._width_assumed; + } + /** + * キャンバス上での行の縦画素数 + * @type {number} + * @readonly + */ + + }, { + key: "height_pixel", + get: function get() { + return this._height_pixel; + } + }]); + + return RowLayout; +}(); + +var image_icon_vs_code = "/**\n * テキスト (頂点シェーダ)\n */\n\nattribute vec4 a_position; // 頂点位置 (モデル座標系)\nattribute vec2 a_offset; // 頂点変位 (スクリーン座標系)\nattribute vec2 a_texcoord; // テクスチャ座標\n\nuniform mat4 u_obj_to_clip; // モデル座標系からクリップ座標系への変換\nuniform vec2 u_sparam; // 画面パラメータ: {2/w, 2/h}\n\nvarying vec2 v_texcoord; // テクスチャ座標\n\nvoid\nmain()\n{\n gl_Position = u_obj_to_clip * a_position;\n gl_Position.xy += a_offset * u_sparam * gl_Position.w;\n v_texcoord = a_texcoord;\n}\n"; + +var image_icon_fs_code = "/**\n * テキスト (フラグメントシェーダ)\n */\n\nprecision mediump float;\n\nvarying vec2 v_texcoord; // テクスチャ座標\nuniform sampler2D u_image; // 画像\n\n\nvoid\nmain()\n{\n gl_FragColor = texture2D( u_image, v_texcoord );\n}\n"; + +/** + * @summary イメージアイコンマテリアル + * @memberof mapray + * @extends mapray.EntityMaterial + * @private + * @see mapray.ImageIconEntity + */ + +var ImageIconMaterial = +/*#__PURE__*/ +function (_EntityMaterial) { + _inherits(ImageIconMaterial, _EntityMaterial); + + /** + * @param {mapray.GLEnv} glenv + */ + function ImageIconMaterial(glenv) { + var _this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, ImageIconMaterial); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(ImageIconMaterial).call(this, glenv, image_icon_vs_code, options.ridMaterial ? rid_fs_code : image_icon_fs_code)); // 不変パラメータを事前設定 + + _this.bindProgram(); + + _this.setInteger("u_image", ImageIconMaterial.TEXUNIT_IMAGE); // this.setInteger( "u_image_mask", ImageIconMaterial.TEXUNIT_IMAGE_MASK ); + + + return _this; + } + /** + * @override + */ + + + _createClass(ImageIconMaterial, [{ + key: "isTranslucent", + value: function isTranslucent(stage, primitive) { + // 半透明画像は非対応 + return false; + } + /** + * @override + */ + + }, { + key: "setParameters", + value: function setParameters(stage, primitive) { + _get(_getPrototypeOf(ImageIconMaterial.prototype), "setParameters", this).call(this, stage, primitive); + + var props = primitive.properties; // mat4 u_obj_to_clip + + this.setObjToClip(stage, primitive); // 画面パラメータ: {2/w, 2/h} + // vec2 u_sparam + + var sparam = ImageIconMaterial._sparam; + sparam[0] = 2 / stage._width; + sparam[1] = 2 / stage._height; + this.setVector2("u_sparam", sparam); + + if (stage.getRenderTarget() === RenderTarget.SCENE) { + // テクスチャのバインド + // sampler2D u_image + var image = props["image"]; + this.bindTexture2D(ImageIconMaterial.TEXUNIT_IMAGE, image.handle); // テクスチャマスクのバインド + // sampler2D u_image_mask + // var image_mask = props["image_mask"]; + // this.bindTexture2D( ImageIconMaterial.TEXUNIT_IMAGE_MASK, image_mask.handle ); + } + } + }]); + + return ImageIconMaterial; +}(EntityMaterial); // クラス定数の定義 + + +{ + ImageIconMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット + // ImageIconMaterial.TEXUNIT_IMAGE_MASK = 1; // 画像マスクのテクスチャユニット + // 計算用一時領域 + + ImageIconMaterial._sparam = GeoMath.createVector2f(); + ImageIconMaterial._bg_color = GeoMath.createVector3f(); + ImageIconMaterial._fg_color = GeoMath.createVector3f(); +} + +/** + * @summary 画像アイコンエンティティ + * @memberof mapray + * @extends mapray.Entity + */ + +var ImageIconEntity = +/*#__PURE__*/ +function (_AbstractPointEntity) { + _inherits(ImageIconEntity, _AbstractPointEntity); + + /** + * @param {mapray.Scene} scene 所属可能シーン + * @param {object} [opts] オプション集合 + * @param {object} [opts.json] 生成情報 + * @param {object} [opts.refs] 参照辞書 + * @param {mapray.Loader.TransformCallback} [opts.transform] + */ + function ImageIconEntity(scene, opts) { + var _this; + + _classCallCheck(this, ImageIconEntity); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(ImageIconEntity).call(this, scene, opts)); // 親プロパティ + + _this._parent_props = { + size: null, + origin: null + }; // Entity.PrimitiveProducer インスタンス + + _this._primitive_producer = new PrimitiveProducer$6(_assertThisInitialized(_this)); + + _this._animation.addDescendantUnbinder(function () { + _this._unbindDescendantAnimations(); + }); + + _this._setupAnimationBindingBlock(); // 生成情報から設定 + + + if (opts && opts.json) { + _this._setupByJson(opts.json); + } + + return _this; + } + /** + * @override + */ + + + _createClass(ImageIconEntity, [{ + key: "getPrimitiveProducer", + value: function getPrimitiveProducer() { + return this._primitive_producer; + } + /** + * EasyBindingBlock.DescendantUnbinder 処理 + * + * @private + */ + + }, { + key: "_unbindDescendantAnimations", + value: function _unbindDescendantAnimations() { + // すべてのエントリーを解除 + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this._entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var entry = _step.value; + entry.animation.unbindAllRecursively(); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + + }, { + key: "_setupAnimationBindingBlock", + value: function _setupAnimationBindingBlock() { + var _this2 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var vector2 = Type.find("vector2"); // パラメータ名: size + // パラメータ型: vector2 | number + // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈 + // 型が number のとき アイコンのピクセルサイズX, Y の値 + + var size_temp = GeoMath.createVector2(); + var size_type; + + var size_tsolver = function size_tsolver(curve) { + size_type = AnimUtil.findFirstTypeSupported(curve, [vector2, number]); + return size_type; + }; + + block.addEntry("size", [vector2, number], size_tsolver, function (value) { + if (size_type === vector2) { + _this2.setSize(value); + } else { + // size_type === number + size_temp[0] = value; + size_temp[1] = value; + + _this2.setSize(size_temp); + } + }); + } + /** + * @summary アイコンのサイズを指定 + * @param {mapray.Vector2} size アイコンのピクセルサイズ + */ + + }, { + key: "setSize", + value: function setSize(size) { + this._setVector2Property("size", size); + } + /** + * @summary アイコンの原点位置を指定 + * @param {mapray.Vector2} origin アイコンの原点位置 + */ + + }, { + key: "setOrigin", + value: function setOrigin(origin) { + this._setVector2Property("origin", origin); + } + /** + * @summary Add Image Icon + * @param {URL|HTMLImageElement|HTMLCanvasElement} image_src 画像 + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {mapray.Vector2} [props.size] アイコンサイズ + * @param {string} [props.id] Entryを識別するID + * @param {mapray.Loader.Transform} [props.transform] URL変換関数 + * @return {mapray.ImageIconEntity.ImageEntry} 追加したEntry + */ + + }, { + key: "addImageIcon", + value: function addImageIcon(image_src, position, props) { + var entry = new ImageEntry$1(this, image_src, position, props); + + this._entries.push(entry); + + this._primitive_producer.onAddEntry(); + + return entry; + } + /** + * @summary 専用マテリアルを取得 + * @private + */ + + }, { + key: "_getMaterial", + value: function _getMaterial(render_target) { + var scene = this.scene; + + if (render_target === RenderTarget.SCENE) { + if (!scene._ImageEntity_image_material) { + // scene にマテリアルをキャッシュ + scene._ImageEntity_image_material = new ImageIconMaterial(scene.glenv); + } + + return scene._ImageEntity_image_material; + } else if (render_target === RenderTarget.RID) { + if (!scene._ImageEntity_image_material_pick) { + // scene にマテリアルをキャッシュ + scene._ImageEntity_image_material_pick = new ImageIconMaterial(scene.glenv, { + ridMaterial: true + }); + } + + return scene._ImageEntity_image_material_pick; + } + } + /** + * @private + */ + + }, { + key: "_setValueProperty", + value: function _setValueProperty(name, value) { + var props = this._parent_props; + + if (props[name] != value) { + props[name] = value; + + this._primitive_producer.onChangeParentProperty(); + } + } + /** + * @private + */ + + }, { + key: "_setVector2Property", + value: function _setVector2Property(name, value) { + var dst = this._parent_props[name]; + + if (!dst) { + this._parent_props[name] = GeoMath.createVector2f(value); + + this._primitive_producer.onChangeParentProperty(); + } else if (dst[0] !== value[0] || dst[1] !== value[1]) { + GeoMath.copyVector2(value, dst); + + this._primitive_producer.onChangeParentProperty(); + } + } + /** + * @private + */ + + }, { + key: "_setupByJson", + value: function _setupByJson(json) { + var position = new GeoPoint(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = json.entries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var entry = _step2.value; + position.setFromArray(entry.position); + this.addImageIcon(position, entry); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + if (json.size) this.setSize(json.size); + if (json.origin) this.setOrigin(json.origin); + } + /** + * @summary IDでEntryを取得 + * @param {string} id ID + * @return {mapray.ImageIconEntity.ImageEntry} IDが一致するEntry(無ければundefined) + */ + + }, { + key: "getEntry", + value: function getEntry(id) { + return this._entries.find(function (entry) { + return entry.id === id; + }); + } + }]); + + return ImageIconEntity; +}(AbstractPointEntity); // クラス定数の定義 + + +{ + ImageIconEntity.DEFAULT_COLOR = GeoMath.createVector3f([1, 1, 1]); + ImageIconEntity.SAFETY_PIXEL_MARGIN = 1; + ImageIconEntity.MAX_IMAGE_WIDTH = 4096; + ImageIconEntity.CIRCLE_SEP_LENGTH = 32; + ImageIconEntity.DEFAULT_ICON_SIZE = GeoMath.createVector2f([30, 30]); + ImageIconEntity.DEFAULT_ORIGIN = GeoMath.createVector2f([0.5, 0.5]); + ImageIconEntity.SAFETY_PIXEL_MARGIN = 1; + ImageIconEntity.MAX_IMAGE_WIDTH = 4096; +} +/** + * @summary PrimitiveProducer + * + * TODO: relative で標高の変化のたびにテクスチャを生成する必要はないので + * Layout でのテクスチャの生成とメッシュの生成を分離する + * + * @private + */ + +var PrimitiveProducer$6 = +/*#__PURE__*/ +function (_Entity$PrimitiveProd) { + _inherits(PrimitiveProducer, _Entity$PrimitiveProd); + + /** + * @param {mapray.ImageIconEntity} entity + */ + function PrimitiveProducer(entity) { + var _this3; + + _classCallCheck(this, PrimitiveProducer); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PrimitiveProducer).call(this, entity)); + _this3._glenv = entity.scene.glenv; + _this3._dirty = true; // プリミティブの要素 + + _this3._transform = GeoMath.setIdentity(GeoMath.createMatrix()); + _this3._properties = { + image: null // アイコン画像 + + }; // プリミティブ + + var primitive = new Primitive(_this3._glenv, null, entity._getMaterial(RenderTarget.SCENE), _this3._transform); + primitive.properties = _this3._properties; + _this3._primitive = primitive; + var pickPrimitive = new Primitive(_this3._glenv, null, entity._getMaterial(RenderTarget.RID), _this3._transform); + pickPrimitive.properties = _this3._properties; + _this3._pickPrimitive = pickPrimitive; // プリミティブ配列 + + _this3._primitives = []; + _this3._pickPrimitives = []; + return _this3; + } + /** + * @override + */ + + + _createClass(PrimitiveProducer, [{ + key: "createRegions", + value: function createRegions() { + var region = new EntityRegion(); + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = this.entity._entries[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var position = _step3.value.position; + region.addPoint(position); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return [region]; + } + /** + * @override + */ + + }, { + key: "onChangeElevation", + value: function onChangeElevation(regions) { + this._dirty = true; + } + /** + * @override + */ + + }, { + key: "getPrimitives", + value: function getPrimitives(stage) { + this._updatePrimitive(); + + return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives; + } + /** + * @summary 親プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeParentProperty", + value: function onChangeParentProperty() { + this._dirty = true; + } + /** + * @summary 子プロパティが変更されたことを通知 + */ + + }, { + key: "onChangeChildProperty", + value: function onChangeChildProperty() { + this._dirty = true; + } + /** + * @summary 高度モードが変更されたことを通知 + */ + + }, { + key: "onChangeAltitudeMode", + value: function onChangeAltitudeMode() { + this._dirty = true; + } + /** + * @summary エントリが追加されたことを通知 + */ + + }, { + key: "onAddEntry", + value: function onAddEntry() { + // 変化した可能性がある + this.needToCreateRegions(); + this._dirty = true; + } + /** + * @summary プリミティブの更新 + * + * @desc + * 入力: + * this.entity._entries + * this._dirty + * 出力: + * this._transform + * this._properties.image + * this._primitive.mesh + * this._primitives + * this._dirty + * + * @return {array.} this._primitives + * + * @private + */ + + }, { + key: "_updatePrimitive", + value: function _updatePrimitive() { + if (!this._dirty) { + // 更新する必要はない + return; + } + + if (this.entity._entries.length == 0) { + this._primitives = []; + this._pickPrimitives = []; + this._dirty = false; + return; + } // 各エントリーの GOCS 位置を生成 (平坦化配列) + + + var gocs_array = this._createFlatGocsArray(); // プリミティブの更新 + // primitive.transform + + + this._updateTransform(gocs_array); + + var layout = new Layout$2(this, gocs_array); + + if (!layout.isValid()) { + // 更新に失敗 + this._primitives = []; + this._pickPrimitives = []; + this._dirty = false; + return; + } // テクスチャ設定 + + + var properties = this._properties; + + if (properties.image) { + properties.image.dispose(); + } + + properties.image = layout.texture; // メッシュ生成 + + var mesh_data = { + vtype: [{ + name: "a_position", + size: 3 + }, { + name: "a_offset", + size: 2 + }, { + name: "a_texcoord", + size: 2 + }], + vertices: layout.vertices, + indices: layout.indices + }; + var mesh = new Mesh(this._glenv, mesh_data); // メッシュ設定 + // primitive.mesh + + var primitive = this._primitive; + + if (primitive.mesh) { + primitive.mesh.dispose(); + } + + primitive.mesh = mesh; + var pickPrimitive = this._pickPrimitive; + + if (pickPrimitive.mesh) { + pickPrimitive.mesh.dispose(); + } + + pickPrimitive.mesh = mesh; // 更新に成功 + + this._primitives = [primitive]; + this._pickPrimitives = [pickPrimitive]; + this._dirty = false; + } + /** + * @summary プリミティブの更新 + * + * @desc + * 条件: + * this.entity._entries.length > 0 + * 入力: + * this.entity._entries.length + * 出力: + * this._transform + * + * @param {number[]} gocs_array GOCS 平坦化配列 + * + * @private + */ + + }, { + key: "_updateTransform", + value: function _updateTransform(gocs_array) { + var num_entries = this.entity._entries.length; + var xsum = 0; + var ysum = 0; + var zsum = 0; + + for (var i = 0; i < num_entries; ++i) { + var ibase = 3 * i; + xsum += gocs_array[ibase]; + ysum += gocs_array[ibase + 1]; + zsum += gocs_array[ibase + 2]; + } // 変換行列の更新 + + + var transform = this._transform; + transform[12] = xsum / num_entries; + transform[13] = ysum / num_entries; + transform[14] = zsum / num_entries; + } + /** + * @summary GOCS 平坦化配列を取得 + * + * 入力: this.entity._entries + * + * @return {number[]} GOCS 平坦化配列 + * @private + */ + + }, { + key: "_createFlatGocsArray", + value: function _createFlatGocsArray() { + var num_points = this.entity._entries.length; + return GeoPoint.toGocsArray(this._getFlatGeoPoints_with_Absolute(), num_points, new Float64Array(3 * num_points)); + } + /** + * @summary GeoPoint 平坦化配列を取得 (絶対高度) + * + * 入力: this.entity._entries + * + * @return {number[]} GeoPoint 平坦化配列 + * @private + */ + + }, { + key: "_getFlatGeoPoints_with_Absolute", + value: function _getFlatGeoPoints_with_Absolute() { + var owner = this.entity; + var entries = owner._entries; + var num_points = entries.length; + var flat_array = new Float64Array(3 * num_points); // flat_array[] に経度要素と緯度要素を設定 + + for (var i = 0; i < num_points; ++i) { + var pos = entries[i].position; + flat_array[3 * i] = pos.longitude; + flat_array[3 * i + 1] = pos.latitude; + } + + switch (owner.altitude_mode) { + case AltitudeMode.RELATIVE: + case AltitudeMode.CLAMP: + // flat_array[] の高度要素に現在の標高を設定 + owner.scene.viewer.getExistingElevations(num_points, flat_array, 0, 3, flat_array, 2, 3); + + if (owner.altitude_mode === AltitudeMode.RELATIVE) { + // flat_array[] の高度要素に絶対高度を設定 + for (var _i = 0; _i < num_points; ++_i) { + flat_array[3 * _i + 2] += entries[_i].position.altitude; + } + } + + break; + + default: + // AltitudeMode.ABSOLUTE + // flat_array[] の高度要素に絶対高度を設定 + for (var _i2 = 0; _i2 < num_points; ++_i2) { + flat_array[3 * _i2 + 2] = entries[_i2].position.altitude; + } + + break; + } + + return flat_array; + } + }]); + + return PrimitiveProducer; +}(Entity.PrimitiveProducer); +/** + * @summary 要素 + * @hideconstructor + * @memberof mapray.ImageIconEntity + * @public + */ + + +var ImageEntry$1 = +/*#__PURE__*/ +function () { + /** + * @param {mapray.ImageIconEntity} owner 所有者 + * @param {string} image_src アイコン画像 + * @param {mapray.GeoPoint} position 位置 + * @param {object} [props] プロパティ + * @param {mapray.Vector2} [props.size] アイコンサイズ + * @param {string} [props.id] Entryを識別するID + * @param {mapray.Loader.Transform} [props.transform] URL変換関数 + */ + function ImageEntry(owner, image_src, position, props) { + _classCallCheck(this, ImageEntry); + + this._owner = owner; + this._position = position.clone(); // animation.BindingBlock + + this._animation = new EasyBindingBlock(); + + this._setupAnimationBindingBlock(); + + this._props = Object.assign({}, props); // props の複製 + + this._copyPropertyVector2f("size"); // deep copy + + + this._copyPropertyVector2f("origin"); // deep copy + + + this.setImage(image_src); + } + /** + * @summary 位置 + * @type {mapray.GeoPoint} + * @readonly + * @package + */ + + + _createClass(ImageEntry, [{ + key: "_setupAnimationBindingBlock", + + /** + * アニメーションの BindingBlock を初期化 + * + * @private + */ + value: function _setupAnimationBindingBlock() { + var _this4 = this; + + var block = this.animation; // 実体は EasyBindingBlock + + var number = Type.find("number"); + var string = Type.find("string"); + var vector2 = Type.find("vector2"); + var vector3 = Type.find("vector3"); // パラメータ名: image_src + // パラメータ型: string + // 画像のパス + + block.addEntry("image_src", [string], null, function (value) { + _this4.setImage(value); + }); // パラメータ名: position + // パラメータ型: vector3 + // ベクトルの要素が longitude, latitude, altitude 順であると解釈 + + var position_temp = new GeoPoint(); + block.addEntry("position", [vector3], null, function (value) { + position_temp.setFromArray(value); // Vector3 -> GeoPoint + + _this4.setPosition(position_temp); + }); // パラメータ名: size + // パラメータ型: vector2 | number + // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈 + // 型が number のとき アイコンのピクセルサイズX, Y は同値 + + var size_temp = GeoMath.createVector2(); + var size_type; + + var size_tsolver = function size_tsolver(curve) { + size_type = AnimUtil.findFirstTypeSupported(curve, [vector2, number]); + return size_type; + }; + + block.addEntry("size", [vector2, number], size_tsolver, function (value) { + if (size_type === vector2) { + _this4.setSize(value); + } else { + // size_type === number + size_temp[0] = value; + size_temp[1] = value; + + _this4.setSize(size_temp); + } + }); + } + /** + * @summary 画像のパスを設定 + * @param {string} image_src 画像のパス + */ + + }, { + key: "setImage", + value: function setImage(image_src) { + var _this5 = this; + + if (this._image_src !== image_src) { + // 画像のパスが変更された + this._image_src = image_src; + var resource = image_src instanceof Resource ? image_src : new URLResource(image_src, { + transform: this._props.transform + }); + this._icon = ImageEntry.iconLoader.load(resource); + + this._icon.onEnd(function (item) { + _this5._owner.getPrimitiveProducer()._dirty = true; + }); + } + } + /** + * @summary テキスト原点位置を設定 + * + * @param {mapray.GeoPoint} position テキスト原点の位置 + */ + + }, { + key: "setPosition", + value: function setPosition(position) { + if (this._position.longitude !== position.longitude || this._position.latitude !== position.latitude || this._position.altitude !== position.altitude) { + // 位置が変更された + this._position.assign(position); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + /** + * @summary アイコンのサイズを指定 + * @param {mapray.Vector2} size アイコンのピクセルサイズ + */ + + }, { + key: "setSize", + value: function setSize(size) { + this._setVector2Property("size", size); + } + /** + * @private + */ + + }, { + key: "_copyPropertyVector3f", + value: function _copyPropertyVector3f(name) { + var props = this._props; + + if (props.hasOwnProperty(name)) { + props[name] = GeoMath.createVector3f(props[name]); + } + } + /** + * @private + */ + + }, { + key: "_copyPropertyVector2f", + value: function _copyPropertyVector2f(name) { + var props = this._props; + + if (props.hasOwnProperty(name)) { + if (typeof props[name] === 'number') { + props[name] = GeoMath.createVector2f([props[name], props[name]]); + } else { + props[name] = GeoMath.createVector2f(props[name]); + } + } + } + /** + * @private + */ + + }, { + key: "_setVector2Property", + value: function _setVector2Property(name, value) { + var dst = this._props[name]; + + if (!dst) { + this._props[name] = GeoMath.createVector2f(value); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } else if (dst[0] !== value[0] || dst[1] !== value[1]) { + GeoMath.copyVector2(value, dst); + + this._owner.getPrimitiveProducer().onChangeChildProperty(); + } + } + }, { + key: "isLoaded", + value: function isLoaded() { + return this._icon.isLoaded(); + } + }, { + key: "draw", + value: function draw(context, x, y, width, height) { + this._icon.draw(context, x, y, width, height); + } + }, { + key: "position", + get: function get() { + return this._position; + } + /** + * @summary ID + * @type {string} + * @readonly + */ + + }, { + key: "id", + get: function get() { + return this._props.hasOwnProperty("id") ? this._props.id : ""; + } + /** + * @summary アイコンサイズ (Pixels) + * @type {mapray.Vector2} + * @readonly + * @package + */ + + }, { + key: "size", + get: function get() { + var props = this._props; + var parent = this._owner._parent_props; + return props.size || parent.size || GeoMath.createVector2f([this._icon.width, this._icon.height]); + } + /** + * @summary アイコンオリジン位置 (左上を(0, 0)、右下を(1, 1)としする数字を指定する。) + * @type {mapray.Vector2} + * @readonly + * @package + */ + + }, { + key: "origin", + get: function get() { + var props = this._props; + var parent = this._owner._parent_props; + return props.origin || parent.origin || ImageIconEntity.DEFAULT_ORIGIN; + } + /** + * @summary アニメーションパラメータ設定 + * + * @type {mapray.animation.BindingBlock} + * @readonly + */ + + }, { + key: "animation", + get: function get() { + return this._animation; + } + }, { + key: "icon", + get: function get() { + return this._icon; + } + }]); + + return ImageEntry; +}(); + +ImageIconEntity.ImageEntry = ImageEntry$1; +{ + ImageEntry$1.iconLoader = new ImageIconLoader(); +} +/** + * @summary Pin画像を Canvas 上にレイアウト + * @memberof mapray.ImageIconEntity + * @private + */ + +var Layout$2 = +/*#__PURE__*/ +function () { + /** + * @desc + * 入力: + * owner._glenv + * owner.entity._entries + * owner._transform + * + * @param {PrimitiveProducer} owner 所有者 + * @param {number[]} gocs_array GOCS 平坦化配列 + */ + function Layout(owner, gocs_array) { + _classCallCheck(this, Layout); + + this._owner = owner; + this._items = this._createItemList(); + this._is_valid = true; + + var row_layouts = this._createRowLayouts(); + + if (row_layouts.length == 0) { + // 有効なテキストが1つも無い + this._is_valid = false; + return; + } // アイテムの配置の設定とキャンバスサイズの決定 + + + var size = this._setupLocation(row_layouts); + + this._texture = this._createTexture(size.width, size.height); + this._vertices = this._createVertices(size.width, size.height, gocs_array); + this._indices = this._createIndices(); + } + /** + * @summary 有効なオブジェクトか? + * @desc + *

無効のとき、他のメソッドは呼び出せない。

+ * @return {boolean} 有効のとき true, 無効のとき false + */ + + + _createClass(Layout, [{ + key: "isValid", + value: function isValid() { + return this._is_valid; + } + /** + * @summary テクスチャ + * @type {mapray.Texture} + * @readonly + */ + + }, { + key: "_createItemList", + + /** + * @summary レイアウトアイテムのリストを生成 + * @return {array.} + * @private + */ + value: function _createItemList() { + var map = new Map(); + var items = []; + var counter = 0; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = this._owner.entity._entries[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var entry = _step4.value; + + if (entry.isLoaded()) { + var item = map.get(entry.icon); + + if (!item) { + map.set(entry.icon, item = new LItem$2(this)); + items.push(item); + } + + item.add(counter++, entry); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + return items; + } + /** + * @summary RowLayout のリストを生成 + * @return {array.} + * @private + */ + + }, { + key: "_createRowLayouts", + value: function _createRowLayouts() { + // アイテムリストの複製 + var items = [].concat(this._items); // RowLayout 内であまり高さに差が出ないように、アイテムリストを高さで整列 + + items.sort(function (a, b) { + return a.height_pixel - b.height_pixel; + }); // リストを生成 + + var row_layouts = []; + + while (items.length > 0) { + var row_layout = new RowLayout$2(items); + + if (row_layout.isValid()) { + row_layouts.push(row_layout); + } + } + + return row_layouts; + } + /** + * @summary テクスチャを生成 + * @param {number} width 横幅 + * @param {number} height 高さ + * @return {mapray.Texture} テキストテクスチャ + * @private + */ + + }, { + key: "_createTexture", + value: function _createTexture(width, height) { + var context = Dom.createCanvasContext(width, height); + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + item.draw(context); + } + + var glenv = this._owner._glenv; + var opts = { + usage: Texture.Usage.ICON + }; + return new Texture(glenv, context.canvas, opts); + } + /** + * @summary 頂点配列を生成 + * + * @param {number} width 横幅 + * @param {number} height 高さ + * @param {number[]} gocs_array GOCS 平坦化配列 + * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...] + * + * @private + */ + + }, { + key: "_createVertices", + value: function _createVertices(width, height, gocs_array) { + var vertices = []; // テキスト集合の原点 (GOCS) + + var transform = this._owner._transform; + var xo = transform[12]; + var yo = transform[13]; + var zo = transform[14]; + /* + |<----size[0]px---->| + 0-------------------3 ------------------ + | | ^ ^ + | | | origin[1] | + | | | | + | | v | size[1]px + | o | --- | + | | ^ | + | | | 1-origin[1] | + | | v v + 1-------------------2 ------------------ + + | |<----->| 1 - origin[0] + |<--------->| origin[0] + */ + + var xn = 1 / width; + var yn = 1 / height; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + + for (var ie = 0; ie < item.entries.length; ie++) { + var eitem = item.entries[ie]; + var entry = eitem.entry; + var size = entry.size; + var origin = entry.origin; // Relativize based on (xo, yo, zo) + + var ibase = eitem.index * 3; + var xm = gocs_array[ibase] - xo; + var ym = gocs_array[ibase + 1] - yo; + var zm = gocs_array[ibase + 2] - zo; // Image dimensions (Image Coordinate) + + var xc = item.pos_x; + var yc = item.pos_y; + var xsize = item.width; + var ysize = item.height; // p0 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-origin[0] * size[0], origin[1] * size[1]); // a_offset + + vertices.push(xc * xn, 1.0 - yc * yn); // a_texcoord + // p1 + + vertices.push(xm, ym, zm); // a_position + + vertices.push(-origin[0] * size[0], -(1 - origin[1]) * size[1]); // a_offset + + vertices.push(xc * xn, 1 - (yc + ysize) * yn); // a_texcoord + // p2 + + vertices.push(xm, ym, zm); // a_position + + vertices.push((1 - origin[0]) * size[0], -(1 - origin[1]) * size[1]); // a_offset + + vertices.push((xc + xsize) * xn, 1 - (yc + ysize) * yn); // a_texcoord + // p3 + + vertices.push(xm, ym, zm); // a_position + + vertices.push((1 - origin[0]) * size[0], origin[1] * size[1]); // a_offset + + vertices.push((xc + xsize) * xn, 1 - yc * yn); // a_texcoord + } + } + + return vertices; + } + /** + * @summary インデックス配列を生成 + * @return {array.} インデックス配列 [] + * @private + */ + + }, { + key: "_createIndices", + value: function _createIndices() { + var indices = []; + var items = this._items; + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + if (item.is_canceled) continue; + + for (var ie = 0; ie < item.entries.length; ie++) { + var eitem = item.entries[ie]; + var base = 4 * eitem.index; + var p = base; + indices.push(p, p + 1, p + 2); + indices.push(p, p + 2, p + 3); + } + } + + return indices; + } + /** + * @summary アイテムの配置を設定 + * @param {array.} row_layouts + * @return {object} キャンバスサイズ + * @private + */ + + }, { + key: "_setupLocation", + value: function _setupLocation(row_layouts) { + var width = 0; + var height = 0; + height += ImageIconEntity.SAFETY_PIXEL_MARGIN; + + for (var i = 0; i < row_layouts.length; ++i) { + var row_layout = row_layouts[i]; + row_layout.locate(height); + width = Math.max(row_layout.width_assumed, width); + height += row_layout.height_pixel + ImageIconEntity.SAFETY_PIXEL_MARGIN; + } + + return { + width: width, + height: height + }; + } + }, { + key: "texture", + get: function get() { + return this._texture; + } + /** + * @summary 頂点配列 + * @desc + * 条件: + * this._entries.length > 0 + * 入力: + * this._entries + * this._transform + * @type {Float32Array} + * @readonly + */ + + }, { + key: "vertices", + get: function get() { + return this._vertices; + } + /** + * @summary インデックス配列 + * @type {Uint32Array} + * @readonly + */ + + }, { + key: "indices", + get: function get() { + return this._indices; + } + }]); + + return Layout; +}(); +/** + * @summary レイアウト対象 + * @memberof mapray.ImageIconEntity + * @private + */ + + +var LItem$2 = +/*#__PURE__*/ +function () { + /** + * @param {mapray.ImageIconEntity.Layout} layout 所有者 + * @param {mapray.ImageIconEntity.Entry} entry ImageIconEntityのエントリ + */ + function LItem(layout) { + _classCallCheck(this, LItem); + + this.entries = []; // テキストの基点 + + this._pos_x = 0; // 左端 + + this._pos_y = 0; // ベースライン位置 + + this._height = this._width = null; + this._is_canceled = false; + } + + _createClass(LItem, [{ + key: "add", + value: function add(index, entry) { + var size = entry.size; + if (this._width === null || this._width < size[0]) this._width = size[0]; + if (this._height === null || this._height < size[1]) this._height = size[1]; + this.entries.push({ + index: index, + entry: entry + }); + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "cancel", + + /** + * @summary 取り消し状態に移行 + */ + value: function cancel() { + this._is_canceled = true; + } + /** + * @summary 配置を決定 + * @param {number} x テキスト矩形左辺の X 座標 (キャンバス座標系) + * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系) + */ + + }, { + key: "locate", + value: function locate(x, y) { + this._pos_x = x; + this._pos_y = y; + } + }, { + key: "draw", + value: function draw(context) { + this.entries[0].entry.draw(context, this._pos_x, this.pos_y, this.width, this.height); // @Todo: fix this + } + }, { + key: "pos_x", + get: function get() { + return this._pos_x; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "pos_y", + get: function get() { + return this._pos_y; + } + /** + * @type {number} + * @readonly + */ + + }, { + key: "width", + get: function get() { + return this._width; + } + }, { + key: "height", + get: function get() { + return this._height; + } + /** + * キャンバス上でのテキストの横画素数 + * @type {number} + * @readonly + */ + + }, { + key: "width_pixel", + get: function get() { + return Math.ceil(this._width); + } + /** + * キャンバス上でのテキストの縦画素数 + * @type {number} + * @readonly + */ + + }, { + key: "height_pixel", + get: function get() { + return Math.ceil(this._height); + } + /** + * 取り消し状態か? + * @type {boolean} + * @readonly + */ + + }, { + key: "is_canceled", + get: function get() { + return this._is_canceled; + } + }]); + + return LItem; +}(); +/** + * @summary 水平レイアウト + * @memberof mapray.ImageIconEntity + * @private + */ + + +var RowLayout$2 = +/*#__PURE__*/ +function () { + /** + * @desc + *

レイアウトされた、またはレイアウトに失敗したアイテムは src_items から削除される。

+ *

レイアウトに失敗したアイテムは取り消し (is_canceled) になる。

+ * @param {array.} src_items アイテムリスト + */ + function RowLayout(src_items) { + _classCallCheck(this, RowLayout); + + var width_assumed_total = 0; + var height_pixel_max = 0; + var row_items = []; + width_assumed_total += ImageIconEntity.SAFETY_PIXEL_MARGIN; // 左マージン + + while (src_items.length > 0) { + var item = src_items.shift(); + var width_assumed = item.width_pixel + ImageIconEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン + + if (width_assumed_total + width_assumed <= ImageIconEntity.MAX_IMAGE_WIDTH) { + // 行にアイテムを追加 + row_items.push(item); + width_assumed_total += width_assumed; + height_pixel_max = Math.max(item.height_pixel, height_pixel_max); + } else { + if (row_items.length == 0) { + // テキストが長すぎて表示できない + item.cancel(); + } else { + // 次の行になるため差し戻して終了 + src_items.unshift(item); + break; + } + } + } + + this._items = row_items; + this._width_assumed = width_assumed_total; + this._height_pixel = height_pixel_max; + } + /** + * @summary 有効なオブジェクトか? + * @desc + *

無効のとき、他のメソッドは呼び出せない。

+ * @return {boolean} 有効のとき true, 無効のとき false + */ + + + _createClass(RowLayout, [{ + key: "isValid", + value: function isValid() { + return this._items.length > 0; + } + /** + * + * @type {array.} + * @readonly + */ + + }, { + key: "locate", + + /** + * @summary レイアウトの配置を決定 + * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系) + */ + value: function locate(y) { + var items = this._items; + var x = 0; + x += ImageIconEntity.SAFETY_PIXEL_MARGIN; // 左マージン + + for (var i = 0; i < items.length; ++i) { + var item = items[i]; + item.locate(x, y); + x += item.width_pixel + ImageIconEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン + } + } + }, { + key: "items", + get: function get() { + return this._items; + } + /** + * キャンバス上での行の横占有画素数 + * @type {number} + * @readonly + */ + + }, { + key: "width_assumed", + get: function get() { + return this._width_assumed; + } + /** + * キャンバス上での行の縦画素数 + * @type {number} + * @readonly + */ + + }, { + key: "height_pixel", + get: function get() { + return this._height_pixel; + } + }]); + + return RowLayout; +}(); + +var propertyIsEnumerable = objectPropertyIsEnumerable.f; // `Object.{ entries, values }` methods implementation + +var createMethod$5 = function (TO_ENTRIES) { + return function (it) { + var O = toIndexedObject(it); + var keys = objectKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + + while (length > i) { + key = keys[i++]; + + if (!descriptors || propertyIsEnumerable.call(O, key)) { + result.push(TO_ENTRIES ? [key, O[key]] : O[key]); + } + } + + return result; + }; +}; + +var objectToArray = { + // `Object.entries` method + // https://tc39.github.io/ecma262/#sec-object.entries + entries: createMethod$5(true), + // `Object.values` method + // https://tc39.github.io/ecma262/#sec-object.values + values: createMethod$5(false) +}; + +var $values = objectToArray.values; // `Object.values` method +// https://tc39.github.io/ecma262/#sec-object.values + +_export({ + target: 'Object', + stat: true +}, { + values: function values(O) { + return $values(O); + } +}); + +/** + * GeoJSON形式(
rfc7946)のデータをシーンに読み込みます。 + * @memberof mapray + */ + +var GeoJSONLoader = +/*#__PURE__*/ +function (_Loader) { + _inherits(GeoJSONLoader, _Loader); + + /** + * @desc + *

url で指定したシーンデータの読み込みを開始し、scene にエンティティを構築する。

+ *

読み込みが終了したとき options.callback を呼び出す。

+ * @param {mapray.Scene} scene 読み込み先のシーン + * @param {string} resource シーンファイルの URL + * @param {object} [options] オプション集合 + * @param {mapray.Loader.TransformCallback} [options.transform] リソース要求変換関数 + * @param {mapray.GeoJSONLoader.FinishCallback} [options.callback] 終了コールバック関数 + * @param {mapray.Loader.EntityCallback} [options.onEntity] エンティティコールバック関数 + */ + function GeoJSONLoader(scene, resource) { + var _this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + _classCallCheck(this, GeoJSONLoader); + + if (resource instanceof Resource) ; else if (typeof resource === "string") { + resource = new URLResource(resource, { + type: "json", + transform: options.transform + }); + } else { + throw new Error("Unsupported Resource: " + resource); + } + + _this = _possibleConstructorReturn(this, _getPrototypeOf(GeoJSONLoader).call(this, scene, resource, { + onEntity: options.onEntity, + onLoad: options.onLoad + })); // PinEntity + + _this._getPointFGColor = options.getPointFGColor || defaultGetPointFGColorCallback; + _this._getPointBGColor = options.getPointBGColor || defaultGetPointBGColorCallback; + _this._getPointSize = options.getPointSize || defaultGetPointSizeCallback; + _this._getPointIconId = options.getPointIconId || defaultGetPointIconIdCallback; // MarkerLineEntity + + _this._getLineColor = options.getLineColor || defaultGetLineColorCallback; + _this._getLineWidth = options.getLineWidth || defaultGetLineWidthCallback; // PolygonEntity + + _this._getFillColor = options.getFillColor || defaultGetFillColorCallback; + _this._getExtrudedHeight = options.getExtrudedHeight || defaultGetExtrudedHeightCallback; // Common + + _this._getAltitudeMode = options.getAltitudeMode || defaultGetAltitudeModeCallback; + _this._getAltitude = options.getAltitude || defaultGetAltitudeCallback; + _this._glenv = scene.glenv; + _this._references = {}; + _this._cancelled = false; + _this._finished = false; + return _this; + } + /** + * @summary 読み込み処理の実態。継承クラスによって実装される。 + * @private + */ + + + _createClass(GeoJSONLoader, [{ + key: "_load", + value: function _load() { + var _this2 = this; + + return this._resource.load({ + type: ResourceType.JSON + }).then(function (geoJson) { + // JSON データの取得に成功 + _this2._check_cancel(); + + _this2._load_geojson_object(geoJson); + }); + } + /** + * Load GeoJSON Object + * @private + */ + + }, { + key: "_load_geojson_object", + value: function _load_geojson_object(geojson) { + var success; + + if (geojson.type === TYPES.FEATURE_COLLECTION) { + var features = geojson.features; + success = false; + + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + + var s = this._load_geojson_object(feature.featureId ? feature.feature : feature); // @ToDo: Unknown + // var s = this._load_geojson_object( feature ); + + + if (s && !success) success = s; + } + } else if (geojson.type === TYPES.FEATURE) { + var geometry = geojson.geometry; + success = this._load_geometry_object(geometry, geojson); + } else if (SUPPORTED_GEOMETRY_TYPES.indexOf(geojson.type) !== -1) { + success = this._load_geometry_object(geojson, null); + } else { + throw new Error("Unnsupported Type: " + geojson.type); + } + + if (this._cancelled) return false; + return success; + } + /** + * Load Geometry Object + * @private + */ + + }, { + key: "_load_geometry_object", + value: function _load_geometry_object(geometry) { + var geojson = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var coords = geometry.coordinates; + + if (!coords && !geometry) { + return false; + } + + switch (geometry.type) { + case GEOMETRY_TYPES.POINT: + case GEOMETRY_TYPES.MULTI_POINT: + return this._loadPoint(geometry, geojson); + + case GEOMETRY_TYPES.LINE_STRING: + case GEOMETRY_TYPES.MULTI_LINE_STRING: + return this._loadLines(geometry, geojson); + + case GEOMETRY_TYPES.POLYGON: + case GEOMETRY_TYPES.MULTI_POLYGON: + return this._loadPolygons(geometry, geojson); + + case GEOMETRY_TYPES.GEOMETRY_COLLECTION: + return true; + + default: + throw new Error("Invalid GeoJSON type: " + geometry.type); + } + } + /** + * fetch() の init 引数に与えるオブジェクトを生成 + * @private + */ + + }, { + key: "_make_fetch_params", + value: function _make_fetch_params(tr) { + var init = { + signal: this._abort_ctrl.signal, + credentials: (tr.credentials || CredentialMode.OMIT).credentials + }; + + if (tr.headers) { + init.headers = tr.headers || GeoJSONLoader._defaultHeaders; + } + + return init; + } + /** + * @private + */ + + }, { + key: "_loadLines", + value: function _loadLines(geometry, geojson) { + var _this3 = this; + + var color4 = this._getLineColor(geojson); + + var width = this._getLineWidth(geojson); + + var altitude = this._getAltitude(geojson); + + var altitude_mode = this._getAltitudeMode(geojson); + + if (!geometry || color4.length !== 4) { + return false; + } + + var type = geometry.type; + var coords = geometry.coordinates; + var rgb = color4.slice(0, 3); + var alpha = color4[3]; // If multiline, split entity + + if (type === GEOMETRY_TYPES.MULTI_LINE_STRING) { + coords.forEach(function (points) { + if (!_this3._generateLine(points, width, rgb, alpha, altitude_mode, altitude, geojson)) { + return false; + } + }); + return true; + } else { + // type === GEOMETRY_TYPES.LINE_STRING + return this._generateLine(coords, width, rgb, alpha, altitude_mode, altitude, geojson); + } + } + /** + * @private + */ + + }, { + key: "_generateLine", + value: function _generateLine(points, width, color, opaticy, altitude_mode, altitude, geojson) { + if (!points) { + return false; + } + + var entity = new MarkerLineEntity(this._scene); + entity.altitude_mode = altitude_mode; + + var fp = this._flatten(points, altitude); + + entity.addPoints(fp); + entity.setLineWidth(width); + entity.setColor(color); + entity.setOpacity(opaticy); + + this._onEntity(this, entity, geojson); + + return true; + } + /** + * @private + */ + + }, { + key: "_loadPoint", + value: function _loadPoint(geometry, geojson) { + var fgColor = this._getPointFGColor(geojson); + + var bgColor = this._getPointBGColor(geojson); + + var iconId = this._getPointIconId(geojson); + + var size = this._getPointSize(geojson); + + var altitude_mode = this._getAltitudeMode(geojson); + + var altitude = this._getAltitude(geojson); + + if (!geometry) { + return false; + } + + var type = geometry.type; + var props = { + "fg_color": fgColor.slice(0, 3), + "bg_color": bgColor.slice(0, 3), + size: size + }; // If multiline, split entity + + if (type === GEOMETRY_TYPES.POINT) { + var entity = new PinEntity(this._scene); + entity.altitude_mode = altitude_mode; + + var alt = this._getActualValue(altitude, geometry.coordinates[2], GeoJSONLoader.defaultAltitude); + + var coords = new GeoPoint(geometry.coordinates[0], geometry.coordinates[1], alt); + + if (iconId !== null) { + entity.addMakiIconPin(iconId, coords, props); + } else { + entity.addPin(coords, props); + } + + this._onEntity(this, entity, geojson); + } else { + // type === GEOMETRY_TYPES.MULTI_POINT + var entity = new PinEntity(this._scene); + entity.altitude_mode = altitude_mode; + + for (var i = 0; i < geometry.coordinates.length; i++) { + var targetCoordinates = geometry.coordinates[i]; + + var alt = this._getActualValue(altitude, geometry.coordinates[2], GeoJSONLoader.defaultAltitude); + + var coords = new GeoPoint(targetCoordinates[0], targetCoordinates[1], alt); + + if (iconId !== null) { + entity.addMakiIconPin(iconId, coords, props); // entity.addPin( coords, props ); + } else { + entity.addPin(coords, props); + } + } + + this._onEntity(this, entity, geojson); + } + + return true; + } + /** + * @private + */ + + }, { + key: "_loadPolygons", + value: function _loadPolygons(geometry, geojson) { + var _this4 = this; + + var color4 = this._getFillColor(geojson); + + var altitude_mode = this._getAltitudeMode(geojson); + + var altitude = this._getAltitude(geojson); + + var extruded_height = this._getExtrudedHeight(geojson); + + if (!geometry || color4.length !== 4) { + return false; + } + + var type = geometry.type; + var coords = geometry.coordinates; + var rgb = color4.slice(0, 3); + var alpha = color4[3]; // If multiline, split entity + + if (type === GEOMETRY_TYPES.MULTI_POLYGON) { + coords.forEach(function (points) { + if (!_this4._generatePolygon(points, rgb, alpha, altitude_mode, altitude, extruded_height, geojson)) { + return false; + } + }); + return true; + } else { + // type === GEOMETRY_TYPES.POLYGON + return this._generatePolygon(coords, rgb, alpha, altitude_mode, altitude, extruded_height, geojson); + } + } + /** + * @private + */ + + }, { + key: "_generatePolygon", + value: function _generatePolygon(pointsList, color, opaticy, altitude_mode, altitude, extruded_height, geojson) { + if (!pointsList) { + return false; + } + + var entity = new PolygonEntity(this._scene); + entity.altitude_mode = altitude_mode; + entity.extruded_height = extruded_height; + entity.setColor(color); + entity.setOpacity(opaticy); + + for (var i = 0; i < pointsList.length; i++) { + var fp = this._flatten(pointsList[i], altitude, pointsList[i].length - 1); + + if (!fp) return false; + if (i === 0) entity.addOuterBoundary(fp);else entity.addInnerBoundary(fp); + } + + this._onEntity(this, entity, geojson); + + return true; + } + /** + * @private + */ + + }, { + key: "_getActualValue", + value: function _getActualValue(valueFromCallback, valueInGeoJSON, defaultValue) { + return valueFromCallback != null ? valueFromCallback : // value from callback is the most prioritized + valueInGeoJSON != null ? valueInGeoJSON : // value in GeoJSON will be used if defined + defaultValue // default value + ; + } + /** + * @private + */ + + }, { + key: "_flatten", + value: function _flatten(ary, altitude) { + var _this5 = this; + + var len = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ary.length; + return ary.reduce(function (p, c, i) { + return i >= len ? p : p.concat(c.slice(0, 2), _this5._getActualValue(altitude, c[2], GeoJSONLoader.defaultAltitude)); + }, []); + } + }]); + + return GeoJSONLoader; +}(Loader); + +{ + GeoJSONLoader._defaultHeaders = {}; + GeoJSONLoader.defaultLineColor = [0, 0, 0, 1]; + GeoJSONLoader.defaultFillColor = [0, 0, 0, 1]; + GeoJSONLoader.defaultLineWidth = 1; + GeoJSONLoader.defaultPointFGColor = [1.0, 1.0, 1.0]; + GeoJSONLoader.defaultPointBGColor = [0.35, 0.61, 0.81]; + GeoJSONLoader.defaultPointSize = 30; + GeoJSONLoader.defaultPointIconId = null; + GeoJSONLoader.defaultAltitude = 0.0; + GeoJSONLoader.defaultExtrudedHeight = 0.0; +} + +function defaultGetLineColorCallback(geojson) { + return GeoJSONLoader.defaultLineColor; +} + +function defaultGetLineWidthCallback(geojson) { + return GeoJSONLoader.defaultLineWidth; +} + +function defaultGetFillColorCallback(geojson) { + return GeoJSONLoader.defaultFillColor; +} + +function defaultGetPointFGColorCallback(geojson) { + return GeoJSONLoader.defaultPointFGColor; +} + +function defaultGetPointBGColorCallback(geojson) { + return GeoJSONLoader.defaultPointBGColor; +} + +function defaultGetPointSizeCallback(geojson) { + return GeoJSONLoader.defaultPointSize; +} + +function defaultGetPointIconIdCallback(geojson) { + return GeoJSONLoader.defaultPointIconId; +} + +function defaultGetAltitudeModeCallback(geojson) { + return AltitudeMode.ABSOLUTE; +} + +function defaultGetAltitudeCallback(geojson) { + return null; +} + +function defaultGetExtrudedHeightCallback(geojson) { + return GeoJSONLoader.defaultExtrudedHeight; +} + +var TYPES = { + FEATURE: "Feature", + FEATURE_COLLECTION: "FeatureCollection" +}; +var GEOMETRY_TYPES = { + POINT: "Point", + MULTI_POINT: "MultiPoint", + LINE_STRING: "LineString", + MULTI_LINE_STRING: "MultiLineString", + POLYGON: "Polygon", + MULTI_POLYGON: "MultiPolygon", + GEOMETRY_COLLECTION: "GeometryCollection", + FEATURE: "Feature" +}; +var SUPPORTED_GEOMETRY_TYPES = Object.values(GEOMETRY_TYPES); + +/** + * @summary デバッグ統計 + * @classdesc + *

エンジン開発用の統計オブジェクトである。

+ *

NOTE: オブジェクトの振舞いはエンジンの実装に依存するため、一般アプリの開発では使用できない。

+ * @memberof mapray + */ +var DebugStats = +/*#__PURE__*/ +function () { + /** + */ + function DebugStats() { + _classCallCheck(this, DebugStats); + + /** + * @summary リクエスト待ちの DEM 数 + * @member mapray.DebugStats#num_wait_reqs_dem + * @type {number} + */ + + /** + * @summary リクエスト待ちの画像数 + * @member mapray.DebugStats#num_wait_reqs_img + * @type {number} + */ + + /** + * @summary 描画地表断片数 + * @member mapray.DebugStats#num_drawing_flakes + * @type {number} + */ + + /** + * @summary 描画地表断頂点数 + * @member mapray.DebugStats#num_drawing_flake_vertices + * @type {number} + */ + + /** + * @summary 地表断片処理 A の数 + * @member mapray.DebugStats#num_procA_flakes + * @type {number} + */ + + /** + * @summary 地表断片処理 B の数 + * @member mapray.DebugStats#num_procB_flakes + * @type {number} + */ + this.clearStats(); + } + /** + * 統計値をクリア + * @package + */ + + + _createClass(DebugStats, [{ + key: "clearStats", + value: function clearStats() { + this.num_wait_reqs_dem = 0; + this.num_wait_reqs_img = 0; + this.num_drawing_flakes = 0; + this.num_drawing_flake_vertices = 0; + this.num_procA_flakes = 0; + this.num_procB_flakes = 0; + } + /** + * @summary 更新が完了したときに呼び出される + * @abstract + */ + + }, { + key: "onUpdate", + value: function onUpdate() {} + }]); + + return DebugStats; +}(); + +var trim$1 = stringTrim.trim; +var $parseInt = global_1.parseInt; +var hex = /^[+-]?0[Xx]/; +var FORCED$8 = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22; // `parseInt` method +// https://tc39.github.io/ecma262/#sec-parseint-string-radix + +var numberParseInt = FORCED$8 ? function parseInt(string, radix) { + var S = trim$1(String(string)); + return $parseInt(S, radix >>> 0 || (hex.test(S) ? 16 : 10)); +} : $parseInt; + +// https://tc39.github.io/ecma262/#sec-parseint-string-radix + +_export({ + global: true, + forced: parseInt != numberParseInt +}, { + parseInt: numberParseInt +}); + +var getOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor.f; +var nativeEndsWith = ''.endsWith; +var min$6 = Math.min; +var CORRECT_IS_REGEXP_LOGIC$1 = correctIsRegexpLogic('endsWith'); // https://github.com/zloirock/core-js/pull/702 + +var MDN_POLYFILL_BUG$1 = !CORRECT_IS_REGEXP_LOGIC$1 && !!function () { + var descriptor = getOwnPropertyDescriptor$5(String.prototype, 'endsWith'); + return descriptor && !descriptor.writable; +}(); // `String.prototype.endsWith` method +// https://tc39.github.io/ecma262/#sec-string.prototype.endswith + +_export({ + target: 'String', + proto: true, + forced: !MDN_POLYFILL_BUG$1 && !CORRECT_IS_REGEXP_LOGIC$1 +}, { + endsWith: function endsWith(searchString + /* , endPosition = @length */ + ) { + var that = String(requireObjectCoercible(this)); + notARegexp(searchString); + var endPosition = arguments.length > 1 ? arguments[1] : undefined; + var len = toLength(that.length); + var end = endPosition === undefined ? len : min$6(toLength(endPosition), len); + var search = String(searchString); + return nativeEndsWith ? nativeEndsWith.call(that, search, end) : that.slice(end - search.length, end) === search; + } +}); + +/** + * @summary データセットを表現する抽象クラス + */ + +var AbstractDataset = +/*#__PURE__*/ +function () { + /** + * @param {MaprayApi} api + */ + function AbstractDataset(api) { + _classCallCheck(this, AbstractDataset); + + this._aip = api; + } + /** + * @summary データセットのidを取得 + * @return {string} + */ + + + _createClass(AbstractDataset, [{ + key: "getId", + value: function getId() { + return this._id; + } + /** + * @summary オーナーのidを取得 + * @return {string} + */ + + }, { + key: "getOwnerId", + value: function getOwnerId() { + return this._owner_id; + } + /** + * @summary 名前を取得 + * @return {string} + */ + + }, { + key: "getName", + value: function getName() { + return this._name; + } + /** + * @summary 説明を取得 + * @return {string} + */ + + }, { + key: "getDescription", + value: function getDescription() { + return this._description; + } + /** + * @summary 作成日時を取得 + * @return {Date} + */ + + }, { + key: "getCreatedAt", + value: function getCreatedAt() { + return this._created_at; + } + /** + * @summary 更新日時を取得 + * @return {Date} + */ + + }, { + key: "getUpdatedAt", + value: function getUpdatedAt() { + return this._updated_at; + } + /** + * @private + * @param {json} サーバから返却されたjson + */ + + }, { + key: "_restoreFromJson", + value: function _restoreFromJson(json) { + this._id = json.id; + this._owner_id = json.owner_id; + this._name = json.name; + this._description = json.description; + this._created_at = new Date(json.created_at); + this._updated_at = new Date(json.updated_at); + } + }]); + + return AbstractDataset; +}(); +/** + * @summary データセットを表現するクラス + */ + +var Dataset = +/*#__PURE__*/ +function (_AbstractDataset) { + _inherits(Dataset, _AbstractDataset); + + /** + * @param {MaprayApi} api + */ + function Dataset(api) { + _classCallCheck(this, Dataset); + + return _possibleConstructorReturn(this, _getPrototypeOf(Dataset).call(this, api)); + } + /** + * @private + * @param {json} サーバから返却されたjson + */ + + + _createClass(Dataset, [{ + key: "_restoreFromJson", + value: function _restoreFromJson(json) { + _get(_getPrototypeOf(Dataset.prototype), "_restoreFromJson", this).call(this, json); + } + /** + * @private + * @param {MaprayApi} api + * @param {json} サーバから返却されたjson + * @return {Dataset} + */ + + }], [{ + key: "createFromJson", + value: function createFromJson(api, json) { + var dataset = new Dataset(api); + + dataset._restoreFromJson(json); + + return dataset; + } + }]); + + return Dataset; +}(AbstractDataset); +/** + * @summary 3Dデータセットを表現するクラス + */ + +var Dataset3D = +/*#__PURE__*/ +function (_AbstractDataset2) { + _inherits(Dataset3D, _AbstractDataset2); + + /** + * @param {MaprayApi} api + */ + function Dataset3D(api) { + _classCallCheck(this, Dataset3D); + + return _possibleConstructorReturn(this, _getPrototypeOf(Dataset3D).call(this, api)); + } + /** + * @summary 原点位置 + * @return {mapray.GeoPoint} + */ + + + _createClass(Dataset3D, [{ + key: "getOrigin", + value: function getOrigin() { + return this._origin; + } + /** + * @summary モデルが公開されているURL + * @return {string} + */ + + }, { + key: "getUrl", + value: function getUrl() { + return this._url; + } + /** + * @summary フォーマット + * @private + * @return {string} + */ + + }, { + key: "getFormat", + value: function getFormat() { + return this._format; + } + /** + * @summary シーンID + * @private + * @return {string} + */ + + }, { + key: "getSceneId", + value: function getSceneId() { + return this._scene_id; + } + /** + * @summary Path + * @private + * @return {string} + */ + + }, { + key: "getPath", + value: function getPath() { + return this._path; + } + /** + * @summary SRID + * @private + * @return {string} + */ + + }, { + key: "getSRID", + value: function getSRID() { + return this._srid; + } + /** + * @private + * @param {json} サーバから返却されたjson + */ + + }, { + key: "_restoreFromJson", + value: function _restoreFromJson(json) { + /* missing options + "x": 137.715, + "y": 34.71111, + "z": 0, + "roll": 0, + "tilt": 0, + "heading": 0, + "sx": 1, + "sy": 1, + "sz": 1, + "offset_x": 0, + "offset_y": 0, + "offset_z": 0, + "offset_roll": 0, + "offset_tilt": 0, + "offset_heading": 0, + "offset_sx": 1, + "offset_sy": 1, + "offset_sz": 1, + "altitude_mode": "absolute", + */ + _get(_getPrototypeOf(Dataset3D.prototype), "_restoreFromJson", this).call(this, json); + + this._url = json.url; + this._scene_id = json.scene_id; + this._path = json.path; + this._format = json.format; + this._srid = json.srid; + this._origin = new GeoPoint(json.x, json.y, json.z); + } + /** + * @private + * @param {MaprayApi} api + * @param {json} サーバから返却されたjson + * @return {Dataset3D} + */ + + }], [{ + key: "createFromJson", + value: function createFromJson(api, json) { + var dataset = new Dataset3D(api); + + dataset._restoreFromJson(json); + + return dataset; + } + }]); + + return Dataset3D; +}(AbstractDataset); +/** + * @summary 点群データセットを表現するクラス + */ + +var PointCloudDataset = +/*#__PURE__*/ +function (_AbstractDataset3) { + _inherits(PointCloudDataset, _AbstractDataset3); + + /** + * @param {MaprayApi} api + */ + function PointCloudDataset(api) { + _classCallCheck(this, PointCloudDataset); + + return _possibleConstructorReturn(this, _getPrototypeOf(PointCloudDataset).call(this, api)); + } + /** + * @summary 点群ファイルが公開されているURLを取得 + */ + + + _createClass(PointCloudDataset, [{ + key: "getUrl", + value: function getUrl() { + return this._url; + } + /** + * @summary 点群のバウンディングボックスを取得 + */ + + }, { + key: "getBoundingBox", + value: function getBoundingBox() { + return this._bounding_box; + } + /** + * @summary 1レベルに1ボックスしか存在しないボックスの中で最も高いレベルのボックス。 + * (点群に含まれる全ての点を包含するボックスの中で最も高いレベルのボックス) + * @return string + */ + + }, { + key: "getContentRoot", + value: function getContentRoot() { + return this._content_root; + } + /** + * @summary フォーマット(現在はrawのみ対応) + * @return string + */ + + }, { + key: "getFormat", + value: function getFormat() { + return this._format; + } + /** + * @private + * @param {json} サーバから返却されたjson + */ + + }, { + key: "_restoreFromJson", + value: function _restoreFromJson(json) { + _get(_getPrototypeOf(PointCloudDataset.prototype), "_restoreFromJson", this).call(this, json); // this._srid = json.srid; + + + this._url = json.url; + this._bounding_box = json.bbox; + this._content_root = Array.isArray(json.content_root) ? json.content_root.join("/") : json.content_root; + this._format = json.format; + } + /** + * @private + * @param {MaprayApi} api + * @param {json} サーバから返却されたjson + * @return {PointCloudDataset} + */ + + }], [{ + key: "createFromJson", + value: function createFromJson(api, json) { + var dataset = new PointCloudDataset(api); + + dataset._restoreFromJson(json); + + return dataset; + } + }]); + + return PointCloudDataset; +}(AbstractDataset); + +/** + * @summary Mapray Cloudに登録されたデータにおいて、URLアクセスを要するリソースを表現する。 + *

+ *
index.htmlのように基準となるファイルを指定し、そのファイルからの相対パスでサブリソースへアクセスする。 + *
+ * コンストラクタで基準となるファイルを指定し、load()はこのファイルを読み込む。 + * loadSubResource( sub_url )は、sub_urlが相対パスの場合は基準となるファイルからの相対パスとして解釈される。 + *
ルートパスを指定し配下のリソースへアクセスする。 + *
+ * コンストラクタで基準となるURLを指定する。この時、URLは必ず/で終了する必要があり、load()は動作が定義されない。 + * loadSubResource( sub_url )は、sub_urlが相対パスの場合は基準となるURLからの相対パスとして解釈される。 + *
+ * @private + */ + +var ApiUrlResource = +/*#__PURE__*/ +function (_Resource) { + _inherits(ApiUrlResource, _Resource); + + /** + * @param {MaprayApi} api + * @param {string} url + */ + function ApiUrlResource(api, url) { + var _this; + + _classCallCheck(this, ApiUrlResource); + + var index = url.lastIndexOf("/"); + if (index === -1) throw new Error("invalid url"); //super( api, url.substr( 0, index + 1 ) ); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(ApiUrlResource).call(this)); + _this._api = api; + _this._url = url; + _this._base_url = url.substr(0, index + 1); + return _this; + } + /** + * @param {object} options + * @override + */ + + + _createClass(ApiUrlResource, [{ + key: "load", + value: function () { + var _load = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + var options, + response, + _args = arguments; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + options = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}; + _context.next = 3; + return this._api.fetch(HTTP.METHOD.GET, this._url); + + case 3: + response = _context.sent; + + if (!(options.type === ResourceType.JSON)) { + _context.next = 10; + break; + } + + _context.next = 7; + return response.json(); + + case 7: + _context.t0 = _context.sent; + _context.next = 11; + break; + + case 10: + _context.t0 = response; + + case 11: + return _context.abrupt("return", _context.t0); + + case 12: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function load() { + return _load.apply(this, arguments); + } + + return load; + }() + /** + * @override + */ + + }, { + key: "loadSubResourceSupported", + value: function loadSubResourceSupported() { + return true; + } + /** + * @summary リソースにアクセスする。sub_urlは相対・絶対の両方に対応。 + * @override + * @param {string} sub_url + * @return {Resource} + */ + + }, { + key: "loadSubResource", + value: function () { + var _loadSubResource = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2(sub_url) { + var options, + url, + response, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + options = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {}; + url = Dom.resolveUrl(this._base_url, sub_url); + _context2.next = 4; + return this._api.fetch(HTTP.METHOD.GET, url); + + case 4: + response = _context2.sent; + + if (response.ok) { + _context2.next = 7; + break; + } + + throw new Error(response.statusText); + + case 7: + if (!(options.type === ResourceType.BINARY)) { + _context2.next = 13; + break; + } + + _context2.next = 10; + return response.arrayBuffer(); + + case 10: + _context2.t0 = _context2.sent; + _context2.next = 25; + break; + + case 13: + if (!(options.type === ResourceType.IMAGE)) { + _context2.next = 23; + break; + } + + _context2.t2 = Dom; + _context2.next = 17; + return response.blob(); + + case 17: + _context2.t3 = _context2.sent; + _context2.next = 20; + return _context2.t2.loadImage.call(_context2.t2, _context2.t3); + + case 20: + _context2.t1 = _context2.sent; + _context2.next = 24; + break; + + case 23: + _context2.t1 = response; + + case 24: + _context2.t0 = _context2.t1; + + case 25: + return _context2.abrupt("return", _context2.t0); + + case 26: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function loadSubResource(_x) { + return _loadSubResource.apply(this, arguments); + } + + return loadSubResource; + }() + }]); + + return ApiUrlResource; +}(Resource); +/** + * Mapray Cloudに登録されたDatasetを表現するリソース。 + */ + + +var DatasetResource = +/*#__PURE__*/ +function (_Resource2) { + _inherits(DatasetResource, _Resource2); + + function DatasetResource(api, datasetId) { + var _this2; + + _classCallCheck(this, DatasetResource); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(DatasetResource).call(this)); + _this2._api = api; + _this2._datasetId = datasetId; + return _this2; + } + /** + * @return {Promise(object)} データ(geojson) + */ + + + _createClass(DatasetResource, [{ + key: "load", + value: function () { + var _load2 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3() { + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return this._api.getFeatures(this._datasetId); + + case 2: + return _context3.abrupt("return", _context3.sent); + + case 3: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + + function load() { + return _load2.apply(this, arguments); + } + + return load; + }() + }]); + + return DatasetResource; +}(Resource); +/** + * Mapray Cloudに登録された3DDatasetのモデルを表現するリソース。 + */ + +var Dataset3DSceneResource = +/*#__PURE__*/ +function (_Resource3) { + _inherits(Dataset3DSceneResource, _Resource3); + + /** + * @param {MaprayApi} api + * @param {string|string[]} datasetIds データセットのid。複数指定する場合は配列を指定する。 + */ + function Dataset3DSceneResource(api, datasetIds) { + var _this3; + + _classCallCheck(this, Dataset3DSceneResource); + + _this3 = _possibleConstructorReturn(this, _getPrototypeOf(Dataset3DSceneResource).call(this)); + _this3._api = api; + _this3._datasetIds = Array.isArray(datasetIds) ? datasetIds : [datasetIds]; + return _this3; + } + /** + * @return {Promise(object)} シーンファイル(json) + */ + + + _createClass(Dataset3DSceneResource, [{ + key: "load", + value: function () { + var _load3 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee4() { + return regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return this._api.get3DDatasetScene(this._datasetIds); + + case 2: + return _context4.abrupt("return", _context4.sent); + + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function load() { + return _load3.apply(this, arguments); + } + + return load; + }() + /** + * @protected + */ + + }, { + key: "resolveResourceSupported", + value: function resolveResourceSupported() { + return true; + } + /** + * @summary シーンファイルに含まれるモデル及びモデルに関連づけられたリソースへアクセス際に利用されるResource。 + * @param {string} sub_url モデルURL + * @return {Resource} + */ + + }, { + key: "resolveResource", + value: function resolveResource(sub_url) { + return new ApiUrlResource(this._api, sub_url); + } + }]); + + return Dataset3DSceneResource; +}(Resource); +/** + * Mapray Cloudに登録されたPoint Cloud Datasetを表現するリソース。 + */ + +var PointCloudDatasetResource = +/*#__PURE__*/ +function (_Resource4) { + _inherits(PointCloudDatasetResource, _Resource4); + + /** + * @param {MaprayApi} api + * @param {string} datasetId データセットのid + */ + function PointCloudDatasetResource(api, datasetId) { + var _this4; + + _classCallCheck(this, PointCloudDatasetResource); + + _this4 = _possibleConstructorReturn(this, _getPrototypeOf(PointCloudDatasetResource).call(this)); + _this4._api = api; + _this4._datasetId = datasetId; + return _this4; + } + /** + * @return {Promise} 点群定義(json) + */ + + + _createClass(PointCloudDatasetResource, [{ + key: "load", + value: function () { + var _load4 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee5() { + return regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + _context5.next = 2; + return this._api.getPointCloudDataset(this._datasetId); + + case 2: + return _context5.abrupt("return", _context5.sent); + + case 3: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function load() { + return _load4.apply(this, arguments); + } + + return load; + }() + /** + * @protected + */ + + }, { + key: "resolveResourceSupported", + value: function resolveResourceSupported() { + return true; + } + /** + * @param {string} sub_url 点群が公開されているURLへアクセスするためのResource。 + * @return {Resource} 点群ファイルリソース + */ + + }, { + key: "resolveResource", + value: function resolveResource(sub_url) { + return new ApiUrlResource(this._api, sub_url); + } + }]); + + return PointCloudDatasetResource; +}(Resource); + +var MaprayApiError = +/*#__PURE__*/ +function (_FetchError) { + _inherits(MaprayApiError, _FetchError); + + function MaprayApiError(code, message, url, response, cause) { + var _this; + + _classCallCheck(this, MaprayApiError); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(MaprayApiError).call(this, message + " [" + code + "]", url)); + + if (Error.captureStackTrace) { + Error.captureStackTrace(_assertThisInitialized(_this), MaprayApiError); + } + + _this.name = "MaprayApiError"; + _this.code = code; + _this.resonse = response; + _this.cause = cause; + + if (cause) { + _this.stack += "\nCaused-By: " + cause.stack; + } + + return _this; + } + + return MaprayApiError; +}(FetchError); +/** + * @summary Mapray Cloudへアクセスするためのクラスです。 + * @classdesc + *

+ * このクラスを利用するには事前にMapray Cloudアカウントを作成する必要があります。 + * https://cloud.mapray.comからサインアップすることができます。 + *

+ *

+ * 事前に下記の情報を調べておきます。 + *

+ *
+ *
User ID + *
Mapray Cloudのユーザー情報ページから確認します。 + * 右上メニューのAccountメニューからこのページを開くことができます。 + *
Token + *
Mapray CloudのTokenページでトークンを作成します。 + * 上部のTokensタブからこのページを開くことができます。 + *
データセット等のID + *
Mapray Cloudへデータをアップロードし、そのデータを使用するには、データセットページ + * からGeoJsonやglTFデータをアップロードしておき、表中のIDを確認します。 + *
+ * + * @memberof mapray + * @example + * const maprayApi = new mapray.MaprayApi({ + * basePath: "https://api.mapray.com", + * version: "v1", + * userId: "...", + * token: "..." + * }); + * const datasets = await maprayApi.getDatasets(); + * ... + */ + + +var MaprayApi = +/*#__PURE__*/ +function (_HTTP) { + _inherits(MaprayApi, _HTTP); + + /** + * @param {object} option + * @param {string} [option.basePath=https://cloud.mapray.com] Mapray CloudのURLを指定します。通常は省略します。 + * @param {string} option.version Mapray Cloud の APIバージョン "v1" のように指定します。 + * @param {string} option.userId Mapray Cloud アカウントの User ID を指定します。 + * @param {string} option.token Mapray Cloud で生成した Token を指定します。 + */ + function MaprayApi() { + var _this2; + + var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, MaprayApi); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(MaprayApi).call(this)); + var basePath = option.basePath.endsWith("/") ? option.basePath.slice(0, -1) : option.basePath; + _this2._option = { + basePath: basePath || DEFAULT_BASE_PATH, + version: option.version, + token: option.token, + userId: option.userId + }; + return _this2; + } // Dataset, 3DDataset, PointCloudDataset + + /** + * @summary データセットのリストを取得します。 + * ページごとにデータセットリストを取得します。 + * @param {number} [page=1] 取得する要素のページ番号 + * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。 + * @return {Dataset[]} + */ + + + _createClass(MaprayApi, [{ + key: "loadDatasets", + value: function () { + var _loadDatasets = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + var _this3 = this; + + var page, + limit, + datasets_json, + _args = arguments; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + page = _args.length > 0 && _args[0] !== undefined ? _args[0] : 1; + limit = _args.length > 1 && _args[1] !== undefined ? _args[1] : 5; + _context.next = 4; + return this.getDatasets(page, limit); + + case 4: + datasets_json = _context.sent; + return _context.abrupt("return", datasets_json.map(function (dataset_json) { + return Dataset.createFromJson(_this3, dataset_json); + })); + + case 6: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function loadDatasets() { + return _loadDatasets.apply(this, arguments); + } + + return loadDatasets; + }() + /** + * @summary 指定したIDのデータセットを取得します。 + * @param {string} datasetId データセットのID + * @return {Dataset} + */ + + }, { + key: "loadDataset", + value: function () { + var _loadDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2(datasetId) { + var dataset_json; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return this.getDataset(datasetId); + + case 2: + dataset_json = _context2.sent; + return _context2.abrupt("return", Dataset.createFromJson(this, dataset_json)); + + case 4: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function loadDataset(_x) { + return _loadDataset.apply(this, arguments); + } + + return loadDataset; + }() + /** + * @summary 3Dデータセットのリストを取得します。 + * ページごとにデータセットリストを取得します。 + * @param {number} [page=1] 取得する要素のページ番号 + * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。 + * @return {Dataset3D[]} + */ + + }, { + key: "load3DDatasets", + value: function () { + var _load3DDatasets = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3() { + var _this4 = this; + + var page, + limit, + datasets_json, + _args3 = arguments; + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + page = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : 1; + limit = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : 5; + _context3.next = 4; + return this.get3DDatasets(page, limit); + + case 4: + datasets_json = _context3.sent; + return _context3.abrupt("return", datasets_json.map(function (dataset_json) { + return Dataset3D.createFromJson(_this4, dataset_json); + })); + + case 6: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + + function load3DDatasets() { + return _load3DDatasets.apply(this, arguments); + } + + return load3DDatasets; + }() + /** + * @summary 指定したIDの3Dデータセットを取得します。 + * @param {string} datasetId + * @return {Dataset3D} + */ + + }, { + key: "load3DDataset", + value: function () { + var _load3DDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee4(datasetId) { + var dataset_json; + return regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return this.get3DDataset(datasetId); + + case 2: + dataset_json = _context4.sent; + return _context4.abrupt("return", Dataset3D.createFromJson(this, dataset_json)); + + case 4: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function load3DDataset(_x2) { + return _load3DDataset.apply(this, arguments); + } + + return load3DDataset; + }() + /** + * @summary 点群データセットのリストを取得します。 + * ページごとにデータセットリストを取得します。 + * @param {number} [page=1] 取得する要素のページ番号 + * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。 + * @return {PointCloudDataset[]} + */ + + }, { + key: "loadPointCloudDatasets", + value: function () { + var _loadPointCloudDatasets = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee5() { + var _this5 = this; + + var page, + limit, + datasets_json, + _args5 = arguments; + return regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + page = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : 1; + limit = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : 5; + _context5.next = 4; + return this.getPointCloudDatasets(page, limit); + + case 4: + datasets_json = _context5.sent; + return _context5.abrupt("return", datasets_json.map(function (dataset_json) { + return PointCloudDataset.createFromJson(_this5, dataset_json); + })); + + case 6: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function loadPointCloudDatasets() { + return _loadPointCloudDatasets.apply(this, arguments); + } + + return loadPointCloudDatasets; + }() + /** + * @summary 指定したIDの点群データセットを取得します。 + * @param {string} datasetId データセットID + * @return {PointCloudDataset} + */ + + }, { + key: "loadPointCloudDataset", + value: function () { + var _loadPointCloudDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee6(datasetId) { + var dataset_json; + return regeneratorRuntime.wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 2; + return this.getPointCloudDataset(datasetId); + + case 2: + dataset_json = _context6.sent; + return _context6.abrupt("return", PointCloudDataset.createFromJson(this, dataset_json)); + + case 4: + case "end": + return _context6.stop(); + } + } + }, _callee6, this); + })); + + function loadPointCloudDataset(_x3) { + return _loadPointCloudDataset.apply(this, arguments); + } + + return loadPointCloudDataset; + }() // Resources + + /** + * @summary 指定したIDのデータセットをリソースとして取得します。 + * @param {string} datasetId データセットID + * @return {Resource} + */ + + }, { + key: "getDatasetAsResource", + value: function getDatasetAsResource(datasetId) { + return new DatasetResource(this, datasetId); + } + /** + * @summary 指定したIDの3Dデータセットのシーンファイルをリソースとして取得します。 + * @param {string[]} datasetId データセットIDのリスト + * @return {Resource} + */ + + }, { + key: "get3DDatasetAsResource", + value: function get3DDatasetAsResource(datasetIds) { + return new Dataset3DSceneResource(this, datasetIds); + } + /** + * @summary 指定したIDの点群データセットの定義ファイルをリソースとして取得します。 + * @param {string} datasetId データセットID + * @return {Resource} + */ + + }, { + key: "getPointCloudDatasetAsResource", + value: function getPointCloudDatasetAsResource(datasetId) { + return new PointCloudDatasetResource(this, datasetId); + } // RestAPI + + /** + * @summary データセットリストを取得します + * @param {number} [page=1] 取得する要素のページ番号 + * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。 + * @return {object} json + */ + + }, { + key: "getDatasets", + value: function () { + var _getDatasets = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee7() { + var page, + limit, + opt, + _args7 = arguments; + return regeneratorRuntime.wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + page = _args7.length > 0 && _args7[0] !== undefined ? _args7[0] : 1; + limit = _args7.length > 1 && _args7[1] !== undefined ? _args7[1] : 5; + opt = this._option; + _context7.next = 5; + return this.get("datasets", [opt.userId], { + page: page, + limit: limit + }); + + case 5: + return _context7.abrupt("return", _context7.sent); + + case 6: + case "end": + return _context7.stop(); + } + } + }, _callee7, this); + })); + + function getDatasets() { + return _getDatasets.apply(this, arguments); + } + + return getDatasets; + }() + /** + * @summary get dataset + * @param {string} datasetId + * @return {object} json + */ + + }, { + key: "getDataset", + value: function () { + var _getDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee8(datasetId) { + var opt; + return regeneratorRuntime.wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + opt = this._option; + _context8.next = 3; + return this.get("datasets", [opt.userId, datasetId], null); + + case 3: + return _context8.abrupt("return", _context8.sent); + + case 4: + case "end": + return _context8.stop(); + } + } + }, _callee8, this); + })); + + function getDataset(_x4) { + return _getDataset.apply(this, arguments); + } + + return getDataset; + }() + /** + * @summary データセットを作成します。 + * @param {string} name 名前 + * @param {string} description 説明 + * @return {object} + */ + + }, { + key: "createDataset", + value: function () { + var _createDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee9(name, description) { + var opt, body; + return regeneratorRuntime.wrap(function _callee9$(_context9) { + while (1) { + switch (_context9.prev = _context9.next) { + case 0: + opt = this._option; + body = { + name: name, + description: description + }; + _context9.next = 4; + return this.post("datasets", [opt.userId], null, body); + + case 4: + return _context9.abrupt("return", _context9.sent); + + case 5: + case "end": + return _context9.stop(); + } + } + }, _callee9, this); + })); + + function createDataset(_x5, _x6) { + return _createDataset.apply(this, arguments); + } + + return createDataset; + }() + /** + * @summary データセットを削除します。 + * @return {object} json + */ + + }, { + key: "deleteDataset", + value: function () { + var _deleteDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee10(datasetId + /*, option={ wait: true }*/ + ) { + var opt; + return regeneratorRuntime.wrap(function _callee10$(_context10) { + while (1) { + switch (_context10.prev = _context10.next) { + case 0: + opt = this._option; + _context10.next = 3; + return this["delete"]("datasets", [opt.userId, datasetId]); + + case 3: + return _context10.abrupt("return", _context10.sent); + + case 4: + case "end": + return _context10.stop(); + } + } + }, _callee10, this); + })); + + function deleteDataset(_x7) { + return _deleteDataset.apply(this, arguments); + } + + return deleteDataset; + }() + /** + * @summary GeoJSONの内容を取得します。 + * @param {string} datasetId データセットID + * @return {object} json + */ + + }, { + key: "getFeatures", + value: function () { + var _getFeatures = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee11(datasetId) { + var opt; + return regeneratorRuntime.wrap(function _callee11$(_context11) { + while (1) { + switch (_context11.prev = _context11.next) { + case 0: + opt = this._option; + _context11.next = 3; + return this.get("datasets", [opt.userId, datasetId, "features"]); + + case 3: + return _context11.abrupt("return", _context11.sent); + + case 4: + case "end": + return _context11.stop(); + } + } + }, _callee11, this); + })); + + function getFeatures(_x8) { + return _getFeatures.apply(this, arguments); + } + + return getFeatures; + }() + /** + * @summary GeoJSON要素をアップロード(挿入)します。 + * @param {string} datasetId データセットID + * @return {object} json + */ + + }, { + key: "insertFeature", + value: function () { + var _insertFeature = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee12(datasetId, feature) { + var opt; + return regeneratorRuntime.wrap(function _callee12$(_context12) { + while (1) { + switch (_context12.prev = _context12.next) { + case 0: + opt = this._option; + _context12.next = 3; + return this.post("datasets", [opt.userId, datasetId, "features"], null, feature); + + case 3: + return _context12.abrupt("return", _context12.sent); + + case 4: + case "end": + return _context12.stop(); + } + } + }, _callee12, this); + })); + + function insertFeature(_x9, _x10) { + return _insertFeature.apply(this, arguments); + } + + return insertFeature; + }() + /** + * @summary GeoJSON要素を更新(上書き)します。 + * @param {string} datasetId データセットID + * @param {string} featureId GeoJSON要素ID + * @param {object} feature GeoJSON要素 + * @return {object} json + */ + + }, { + key: "updateFeature", + value: function () { + var _updateFeature = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee13(datasetId, featureId, feature) { + var opt; + return regeneratorRuntime.wrap(function _callee13$(_context13) { + while (1) { + switch (_context13.prev = _context13.next) { + case 0: + opt = this._option; + _context13.next = 3; + return this.put("datasets", [opt.userId, "features", featureId], null, feature); + + case 3: + return _context13.abrupt("return", _context13.sent); + + case 4: + case "end": + return _context13.stop(); + } + } + }, _callee13, this); + })); + + function updateFeature(_x11, _x12, _x13) { + return _updateFeature.apply(this, arguments); + } + + return updateFeature; + }() + /** + * @summary 3Dデータセットのリストを取得します。 + * @param {number} [page=1] 取得する要素のページ番号 + * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。 + * @return {object} json + */ + + }, { + key: "get3DDatasets", + value: function () { + var _get3DDatasets = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee14() { + var page, + limit, + opt, + _args14 = arguments; + return regeneratorRuntime.wrap(function _callee14$(_context14) { + while (1) { + switch (_context14.prev = _context14.next) { + case 0: + page = _args14.length > 0 && _args14[0] !== undefined ? _args14[0] : 1; + limit = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : 5; + opt = this._option; + _context14.next = 5; + return this.get("3ddatasets", [opt.userId], { + page: page, + limit: limit + }); + + case 5: + return _context14.abrupt("return", _context14.sent); + + case 6: + case "end": + return _context14.stop(); + } + } + }, _callee14, this); + })); + + function get3DDatasets() { + return _get3DDatasets.apply(this, arguments); + } + + return get3DDatasets; + }() + /** + * @summary 3D datastを作成します。 + * @param {string} name 名前 + * @param {string} description 説明 + * @param {object} option + * @param {string} option.path glTFファイルのパスを指定します(アップロードする際はディレクトリを指定するため、ディレクトリルートからのglTFファイルへのパスを指定します) + * @param {string} option.format "glTF"を指定します + * @param {string} option.srid 現在は4326(WGS 84)を指定します + * @param {number} option.x 経度 + * @param {number} option.y 緯度 + * @param {number} option.z 高さ + * @return {object} json + */ + + }, { + key: "create3DDataset", + value: function () { + var _create3DDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee15(name, description, option) { + var opt, body; + return regeneratorRuntime.wrap(function _callee15$(_context15) { + while (1) { + switch (_context15.prev = _context15.next) { + case 0: + opt = this._option; + body = { + name: name, + description: description, + path: option.path, + format: option.format, + srid: option.srid, + x: option.x, + y: option.y, + z: option.z + }; + _context15.next = 4; + return this.post("3ddatasets", [opt.userId], null, body); + + case 4: + return _context15.abrupt("return", _context15.sent); + + case 5: + case "end": + return _context15.stop(); + } + } + }, _callee15, this); + })); + + function create3DDataset(_x14, _x15, _x16) { + return _create3DDataset.apply(this, arguments); + } + + return create3DDataset; + }() + /** + * @summary 3Dデータセットを更新します。 + * @param {string} datasetId データセットId + * @param {string} name 名前 + * @param {string} description 説明 + * @param {object} option + * @param {string} option.path glTFファイルのパスを指定します(アップロードする際はディレクトリを指定するため、ディレクトリルートからのglTFファイルへのパスを指定します) + * @param {string} option.format "glTF"を指定します + * @param {string} option.srid 現在は4326(WGS 84)を指定します + * @param {number} option.x 経度 + * @param {number} option.y 緯度 + * @param {number} option.z 高さ + * @return {object} json + */ + + }, { + key: "update3DDataset", + value: function () { + var _update3DDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee16(datasetId, name, description, option) { + var opt, body; + return regeneratorRuntime.wrap(function _callee16$(_context16) { + while (1) { + switch (_context16.prev = _context16.next) { + case 0: + opt = this._option; + body = { + name: name, + description: description, + path: option.path, + format: option.format, + srid: option.srid, + x: option.x, + y: option.y, + z: option.z + }; + _context16.next = 4; + return this.patch("3ddatasets", [opt.userId, datasetId], null, body); + + case 4: + return _context16.abrupt("return", _context16.sent); + + case 5: + case "end": + return _context16.stop(); + } + } + }, _callee16, this); + })); + + function update3DDataset(_x17, _x18, _x19, _x20) { + return _update3DDataset.apply(this, arguments); + } + + return update3DDataset; + }() + /** + * @summary 3Dデータセットアップロード用URLを取得します。 + * @param {string} datasetId データセットId + * @return {object} json + */ + + }, { + key: "create3DDatasetUploadUrl", + value: function () { + var _create3DDatasetUploadUrl = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee17(datasetId) { + var opt; + return regeneratorRuntime.wrap(function _callee17$(_context17) { + while (1) { + switch (_context17.prev = _context17.next) { + case 0: + opt = this._option; + _context17.next = 3; + return this.post("3ddatasets", ["uploads", opt.userId, datasetId], null, {}); + + case 3: + return _context17.abrupt("return", _context17.sent); + + case 4: + case "end": + return _context17.stop(); + } + } + }, _callee17, this); + })); + + function create3DDatasetUploadUrl(_x21) { + return _create3DDatasetUploadUrl.apply(this, arguments); + } + + return create3DDatasetUploadUrl; + }() + /** + * @summary 3Dデータセット情報を取得します。 + * データセットが保持するデータにアクセスするには、get3DDatasetScene()を利用します。 + * @param {string} datasetId データセットId + * @return {object} json + */ + + }, { + key: "get3DDataset", + value: function () { + var _get3DDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee18(datasetId) { + var opt; + return regeneratorRuntime.wrap(function _callee18$(_context18) { + while (1) { + switch (_context18.prev = _context18.next) { + case 0: + opt = this._option; + _context18.next = 3; + return this.get("3ddatasets", [opt.userId, datasetId], null); + + case 3: + return _context18.abrupt("return", _context18.sent); + + case 4: + case "end": + return _context18.stop(); + } + } + }, _callee18, this); + })); + + function get3DDataset(_x22) { + return _get3DDataset.apply(this, arguments); + } + + return get3DDataset; + }() + /** + * @summary 3Dデータセットを削除します。 + * @param {string} datasetId データセットId + * @return {object} json + */ + + }, { + key: "delete3DDataset", + value: function () { + var _delete3DDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee19(datasetId) { + var opt; + return regeneratorRuntime.wrap(function _callee19$(_context19) { + while (1) { + switch (_context19.prev = _context19.next) { + case 0: + opt = this._option; + _context19.next = 3; + return this["delete"]("3ddatasets", [opt.userId, datasetId]); + + case 3: + return _context19.abrupt("return", _context19.sent); + + case 4: + case "end": + return _context19.stop(); + } + } + }, _callee19, this); + })); + + function delete3DDataset(_x23) { + return _delete3DDataset.apply(this, arguments); + } + + return delete3DDataset; + }() + /** + * @summary 3Dデータセットに含まれる scene情報 を取得します。 + * @param {string|string[]} datasetIds + * @return {object} シーンファイルの実体 + */ + + }, { + key: "get3DDatasetScene", + value: function () { + var _get3DDatasetScene = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee20(datasetIds) { + var opt, response; + return regeneratorRuntime.wrap(function _callee20$(_context20) { + while (1) { + switch (_context20.prev = _context20.next) { + case 0: + opt = this._option; + _context20.next = 3; + return this.get("3ddatasets", ["scene", opt.userId], { + "3ddatasets_ids": Array.isArray(datasetIds) ? datasetIds.join(",") : datasetIds + }); + + case 3: + response = _context20.sent; + response.entity_list.forEach(function (entity) { + var indexStr = entity.index; + var index = parseInt(indexStr); + + if (index.toString() !== indexStr) { + throw new Error("Internal Error: ID couldn't be convert to 'number'"); + } + + entity.index = index; + }); + return _context20.abrupt("return", response); + + case 6: + case "end": + return _context20.stop(); + } + } + }, _callee20, this); + })); + + function get3DDatasetScene(_x24) { + return _get3DDatasetScene.apply(this, arguments); + } + + return get3DDatasetScene; + }() + /** + * @summary 点群データセットリストを取得します。 + * @param {number} [page=1] 取得する要素のページ番号 + * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。 + * @return {object} json + */ + + }, { + key: "getPointCloudDatasets", + value: function () { + var _getPointCloudDatasets = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee21() { + var page, + limit, + opt, + _args21 = arguments; + return regeneratorRuntime.wrap(function _callee21$(_context21) { + while (1) { + switch (_context21.prev = _context21.next) { + case 0: + page = _args21.length > 0 && _args21[0] !== undefined ? _args21[0] : 1; + limit = _args21.length > 1 && _args21[1] !== undefined ? _args21[1] : 5; + opt = this._option; + _context21.next = 5; + return this.get("pcdatasets", [opt.userId], { + page: page, + limit: limit + }); + + case 5: + return _context21.abrupt("return", _context21.sent); + + case 6: + case "end": + return _context21.stop(); + } + } + }, _callee21, this); + })); + + function getPointCloudDatasets() { + return _getPointCloudDatasets.apply(this, arguments); + } + + return getPointCloudDatasets; + }() + /** + * @summary 点群データセットを取得します。 + * @param {string} datasetId データセットId + * @return {object} json + */ + + }, { + key: "getPointCloudDataset", + value: function () { + var _getPointCloudDataset = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee22(datasetId) { + var opt; + return regeneratorRuntime.wrap(function _callee22$(_context22) { + while (1) { + switch (_context22.prev = _context22.next) { + case 0: + opt = this._option; + _context22.next = 3; + return this.get("pcdatasets", [opt.userId, datasetId]); + + case 3: + return _context22.abrupt("return", _context22.sent); + + case 4: + case "end": + return _context22.stop(); + } + } + }, _callee22, this); + })); + + function getPointCloudDataset(_x25) { + return _getPointCloudDataset.apply(this, arguments); + } + + return getPointCloudDataset; + }() + /** + * @private + * @return {object} json + */ + + }, { + key: "get", + value: function () { + var _get = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee23(api, args, query) { + var option, + _args23 = arguments; + return regeneratorRuntime.wrap(function _callee23$(_context23) { + while (1) { + switch (_context23.prev = _context23.next) { + case 0: + option = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {}; + _context23.next = 3; + return this.fetchAPI(HTTP.METHOD.GET, api, args, query, null, option); + + case 3: + return _context23.abrupt("return", _context23.sent); + + case 4: + case "end": + return _context23.stop(); + } + } + }, _callee23, this); + })); + + function get(_x26, _x27, _x28) { + return _get.apply(this, arguments); + } + + return get; + }() + /** + * @private + * @return {object} json + */ + + }, { + key: "post", + value: function () { + var _post = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee24(api, args, query, body) { + var option, + _args24 = arguments; + return regeneratorRuntime.wrap(function _callee24$(_context24) { + while (1) { + switch (_context24.prev = _context24.next) { + case 0: + option = _args24.length > 4 && _args24[4] !== undefined ? _args24[4] : {}; + + if (typeof body !== "string") { + body = JSON.stringify(body); + } + + _context24.next = 4; + return this.fetchAPI(HTTP.METHOD.POST, api, args, query, body, option); + + case 4: + return _context24.abrupt("return", _context24.sent); + + case 5: + case "end": + return _context24.stop(); + } + } + }, _callee24, this); + })); + + function post(_x29, _x30, _x31, _x32) { + return _post.apply(this, arguments); + } + + return post; + }() + /** + * @private + * @return {object} json + */ + + }, { + key: "patch", + value: function () { + var _patch = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee25(api, args, query, body) { + var option, + _args25 = arguments; + return regeneratorRuntime.wrap(function _callee25$(_context25) { + while (1) { + switch (_context25.prev = _context25.next) { + case 0: + option = _args25.length > 4 && _args25[4] !== undefined ? _args25[4] : {}; + + if (typeof body !== "string") { + body = JSON.stringify(body); + } + + _context25.next = 4; + return this.fetchAPI(HTTP.METHOD.PATCH, api, args, query, body, option); + + case 4: + return _context25.abrupt("return", _context25.sent); + + case 5: + case "end": + return _context25.stop(); + } + } + }, _callee25, this); + })); + + function patch(_x33, _x34, _x35, _x36) { + return _patch.apply(this, arguments); + } + + return patch; + }() + /** + * @private + * @return {object} json + */ + + }, { + key: "put", + value: function () { + var _put = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee26(api, args, query, body) { + var option, + _args26 = arguments; + return regeneratorRuntime.wrap(function _callee26$(_context26) { + while (1) { + switch (_context26.prev = _context26.next) { + case 0: + option = _args26.length > 4 && _args26[4] !== undefined ? _args26[4] : {}; + + if (typeof body !== "string") { + body = JSON.stringify(body); + } + + _context26.next = 4; + return this.fetchAPI(HTTP.METHOD.PUT, api, args, query, body, option); + + case 4: + return _context26.abrupt("return", _context26.sent); + + case 5: + case "end": + return _context26.stop(); + } + } + }, _callee26, this); + })); + + function put(_x37, _x38, _x39, _x40) { + return _put.apply(this, arguments); + } + + return put; + }() + /** + * @private + * @return {object} json + */ + + }, { + key: "delete", + value: function () { + var _delete2 = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee27(api, args, query) { + var option, + _args27 = arguments; + return regeneratorRuntime.wrap(function _callee27$(_context27) { + while (1) { + switch (_context27.prev = _context27.next) { + case 0: + option = _args27.length > 3 && _args27[3] !== undefined ? _args27[3] : {}; + _context27.next = 3; + return this.fetchAPI(HTTP.METHOD.DELETE, api, args, query, null, option); + + case 3: + return _context27.abrupt("return", _context27.sent); + + case 4: + case "end": + return _context27.stop(); + } + } + }, _callee27, this); + })); + + function _delete(_x41, _x42, _x43) { + return _delete2.apply(this, arguments); + } + + return _delete; + }() + /** + * @private + * @return {object} json + */ + + }, { + key: "fetchAPI", + value: function () { + var _fetchAPI = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee28(method, api, args, query, body) { + var option, + opt, + url, + response, + _args28 = arguments; + return regeneratorRuntime.wrap(function _callee28$(_context28) { + while (1) { + switch (_context28.prev = _context28.next) { + case 0: + option = _args28.length > 5 && _args28[5] !== undefined ? _args28[5] : {}; + opt = this._option; + url = opt.basePath + "/" + api + "/" + opt.version + (args.length > 0 ? "/" + args.join("/") : ""); // console.log( "MaprayAPI: " + method + " " + api + " (" + args.join("/") + ")" ); + + _context28.next = 5; + return this.fetch(method, url, query, body, option); + + case 5: + response = _context28.sent; + _context28.next = 8; + return response.json(); + + case 8: + return _context28.abrupt("return", _context28.sent); + + case 9: + case "end": + return _context28.stop(); + } + } + }, _callee28, this); + })); + + function fetchAPI(_x44, _x45, _x46, _x47, _x48) { + return _fetchAPI.apply(this, arguments); + } + + return fetchAPI; + }() + /** + * @private + */ + + }, { + key: "fetch", + value: function () { + var _fetch = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee29(method, url, query, body) { + var option, + opt, + headers, + response, + errorResponseJson, + _args29 = arguments; + return regeneratorRuntime.wrap(function _callee29$(_context29) { + while (1) { + switch (_context29.prev = _context29.next) { + case 0: + option = _args29.length > 4 && _args29[4] !== undefined ? _args29[4] : {}; + opt = this._option; + headers = option.headers || (option.headers = {}); + headers["x-api-key"] = opt.token; + _context29.prev = 4; + _context29.next = 7; + return HTTP.fetch(method, url, query, body, option); + + case 7: + response = _context29.sent; + _context29.next = 26; + break; + + case 10: + _context29.prev = 10; + _context29.t0 = _context29["catch"](4); + + if (!(_context29.t0.name === "FetchError" && _context29.t0.response)) { + _context29.next = 25; + break; + } + + _context29.prev = 13; + _context29.next = 16; + return _context29.t0.response.json(); + + case 16: + errorResponseJson = _context29.sent; + _context29.next = 22; + break; + + case 19: + _context29.prev = 19; + _context29.t1 = _context29["catch"](13); + throw new MaprayApiError(-1, "Failed to fetch", url, null, _context29.t0); + + case 22: + throw new MaprayApiError(errorObject.code, errorObject.error, url, _context29.t0.response, _context29.t0); + + case 25: + throw new MaprayApiError(-1, "Failed to fetch", url, null, _context29.t0); + + case 26: + return _context29.abrupt("return", response); + + case 27: + case "end": + return _context29.stop(); + } + } + }, _callee29, this, [[4, 10], [13, 19]]); + })); + + function fetch(_x49, _x50, _x51, _x52) { + return _fetch.apply(this, arguments); + } + + return fetch; + }() + }]); + + return MaprayApi; +}(HTTP); + +MaprayApi.DEFAULT_BASE_PATH = "https://cloud.mapray.com"; + +/** + * @summary 点群データプロバイダ + *

このインスタンスには状態 ({@link mapray.PointCloudProvider.Status}型) があり、{@link mapray.PointCloudProvider.Status.INITIALIZED}以外の状態では新規に読み込み({@link mapray.PointCloudProvider#load})を行うことができない。

+ * + *

以下の抽象メソッドは既定の動作がないので、利用者はこれらのメソッドをオーバーライドした具象クラスを使用しなければならない。

+ *
    + *
  • {@link mapray.PointCloudProvider#doInit}
  • + *
  • {@link mapray.PointCloudProvider#doLoad}
  • + *
  • {@link mapray.PointCloudProvider#doDestroy}
  • + *
+ * + * @memberof mapray + * @abstract + * @protected + */ +var PointCloudProvider = +/*#__PURE__*/ +function () { + function PointCloudProvider() { + + _classCallCheck(this, PointCloudProvider); + + this._status = PointCloudProvider.Status.NOT_INITIALIZED; + } + /** + * @summary 初期化。 + * 継承クラスではdoInit()を継承する + */ + + + _createClass(PointCloudProvider, [{ + key: "init", + value: function () { + var _init = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!(this._status !== PointCloudProvider.Status.NOT_INITIALIZED)) { + _context.next = 2; + break; + } + + throw new Error("invalid status"); + + case 2: + _context.prev = 2; + _context.next = 5; + return this.doInit(); + + case 5: + this._status = PointCloudProvider.Status.INITIALIZED; + _context.next = 12; + break; + + case 8: + _context.prev = 8; + _context.t0 = _context["catch"](2); + this._status = PointCloudProvider.Status.DESTROYED; + throw _context.t0; + + case 12: + case "end": + return _context.stop(); + } + } + }, _callee, this, [[2, 8]]); + })); + + function init() { + return _init.apply(this, arguments); + } + + return init; + }() + /** + * @summary リクエスト可能な状態かを返す。 + * 初期化が完了しているかだけではなく、現在処理中のリクエスト数も考慮した上でリクエスト可能な状態か判断する。 + * @return {boolean} + * @protected + */ + + }, { + key: "isReady", + value: function isReady() { + return this._status == PointCloudProvider.Status.INITIALIZED && this.getNumberOfRequests() < 10; + } + /** + * @summary 点群を読み込む + * 継承クラスではdoLoad()を継承する + * @param {number} level レベル + * @param {number} x x + * @param {number} y y + * @param {number} z z + * @returns {mapray.PointCloudProvider.Status.Request} request + */ + + }, { + key: "load", + value: function load(level, x, y, z) { + if (this._status !== PointCloudProvider.Status.INITIALIZED) { + return { + id: -1, + done: Promise.reject(new Error("invalid status")) + }; + } + + var id = PointCloudProvider._id_max++; + return { + id: id, + done: this.doLoad(id, level, x, y, z) + }; + } + }, { + key: "flushQueue", + value: function flushQueue() {} + }, { + key: "toString", + value: function toString() { + return "PointCloudProvider"; + } + /** + * @summary 実行中のリクエストをキャンセルする + * @param {number} id リクエストID + */ + + }, { + key: "cancel", + value: function cancel(id) { + if (this._status !== PointCloudProvider.Status.INITIALIZED) throw new Error("invalid status"); + console.log("cancel not implemented"); + } + /** + * @summary 実行中のリクエスト数を返す + * @abstract + */ + + }, { + key: "getNumberOfRequests", + value: function getNumberOfRequests() { + throw new Error("not implemented"); + } + /** + * @summary 破棄 + * 継承クラスではdoDestroy()を継承する + */ + + }, { + key: "destroy", + value: function () { + var _destroy = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2() { + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(this._status !== PointCloudProvider.Status.INITIALIZED)) { + _context2.next = 2; + break; + } + + throw new Error("invalid status"); + + case 2: + _context2.prev = 2; + _context2.next = 5; + return this.doDestroy(); + + case 5: + _context2.prev = 5; + this._status = PointCloudProvider.Status.DESTROYED; + return _context2.finish(5); + + case 8: + case "end": + return _context2.stop(); + } + } + }, _callee2, this, [[2,, 5, 8]]); + })); + + function destroy() { + return _destroy.apply(this, arguments); + } + + return destroy; + }() + /** + * @summary 初期化を行う + * @protected + * @abstract + */ + + }, { + key: "doInit", + value: function () { + var _doInit = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3() { + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + throw new Error("not implemented"); + + case 1: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + function doInit() { + return _doInit.apply(this, arguments); + } + + return doInit; + }() + /** + * @summary 読み込みを行う + * @protected + * @abstract + * @param {number} id リクエストid + * @param {number} level レベル + * @param {number} x x + * @param {number} y y + * @param {number} z z + */ + + }, { + key: "doLoad", + value: function () { + var _doLoad = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee4(id, level, x, y, z) { + return regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + throw new Error("not implemented"); + + case 1: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + + function doLoad(_x, _x2, _x3, _x4, _x5) { + return _doLoad.apply(this, arguments); + } + + return doLoad; + }() + /** + * @summary 破棄を行う + * @protected + * @abstract + */ + + }, { + key: "doDestroy", + value: function () { + var _doDestroy = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee5() { + return regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + throw new Error("not implemented"); + + case 1: + case "end": + return _context5.stop(); + } + } + }, _callee5); + })); + + function doDestroy() { + return _doDestroy.apply(this, arguments); + } + + return doDestroy; + }() + }], [{ + key: "Status", + get: function get() { + return Status$4; + } + }]); + + return PointCloudProvider; +}(); + +PointCloudProvider._id_max = 0; +/** + * @typedef {Object} Request + * @property {number} id リクエストID + * @property {Promise} done リクエストの完了を示すプロミス + * @memberof mapray.PointCloudProvider + */ + +/** + * @summary 状態の列挙型 + * @enum {object} + * @memberof mapray.PointCloudProvider + * @constant + * @see mapray.PointCloudProvider#status + */ + +var Status$4 = { + /** + * 初期化前 (初期状態) + */ + NOT_INITIALIZED: { + id: "NOT_INITIALIZED" + }, + + /** + * 初期化済み(読み込み可能) + */ + INITIALIZED: { + id: "INITIALIZED" + }, + + /** + * 破棄状態 + */ + DESTROYED: { + id: "DESTROYED" + } +}; + +var RawPointCloudProvider = +/*#__PURE__*/ +function (_PointCloudProvider) { + _inherits(RawPointCloudProvider, _PointCloudProvider); + + /** + * resource 点群定義(json)リソース。 + * @param {mapray.Resource} resource + * @param {object} option + */ + function RawPointCloudProvider(resource) { + var _this; + + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, RawPointCloudProvider); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(RawPointCloudProvider).call(this, option)); + _this._suffix = ".xyz"; + + if (resource instanceof Resource) { + _this._info_resource = resource; + } else if (resource.url) { + _this._info_resource = new URLResource(resource.url, resource.option); + } else { + throw new Error("unsupported resource"); + } + + _this._taskMap = new Map(); + _this._requests = 0; + return _this; + } + /** + * @private + */ + + + _createClass(RawPointCloudProvider, [{ + key: "_createPath", + value: function _createPath(level, x, y, z) { + return level + "/" + x + "/" + y + "/" + z + this._suffix; + } + /** + * @override + */ + + }, { + key: "doInit", + value: function () { + var _doInit = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + var info; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return this._info_resource.load({ + type: ResourceType.JSON + }); + + case 2: + info = _context.sent; + + if (info.url) { + this._resource = this._info_resource.resolveResource(info.url); + } else { + this._resource = this._info_resource; + } + + case 4: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function doInit() { + return _doInit.apply(this, arguments); + } + + return doInit; + }() + /** + * @override + */ + + }, { + key: "doDestroy", + value: function () { + var _doDestroy = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee2() { + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + function doDestroy() { + return _doDestroy.apply(this, arguments); + } + + return doDestroy; + }() + }, { + key: "getNumberOfRequests", + value: function getNumberOfRequests() { + return this._requests; + } + /** + * @override + */ + + }, { + key: "doLoad", + value: function () { + var _doLoad = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee3(id, level, x, y, z) { + var abortController, path, buffer, header, p, buf; + return regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + this._requests++; + _context3.prev = 1; + abortController = new AbortController(); + + this._taskMap.set(id, { + id: id, + abortController: abortController + }); + + path = this._createPath(level, x, y, z); + _context3.next = 7; + return this._resource.loadSubResource(path, { + type: ResourceType.BINARY, + signal: abortController.signal + }); + + case 7: + buffer = _context3.sent; + header = {}; + p = 0; + header.childFlags = new Uint8Array(buffer, p, 1)[0]; + p += 1; + header.debug1 = new Int8Array(buffer, p, 1)[0]; + p += 1; + p += 2; // skip + + header.indices = new Int32Array(buffer, p, 8); + p += 32; + header.average = new Float32Array(buffer, p, 3); + p += 12; + header.eigenVector = []; + header.eigenVectorLength = []; + header.eigenVector[0] = new Float32Array(buffer, p, 3); + p += 12; + header.eigenVectorLength[0] = new Float32Array(buffer, p, 1)[0]; + p += 4; + header.eigenVector[1] = new Float32Array(buffer, p, 3); + p += 12; + header.eigenVectorLength[1] = new Float32Array(buffer, p, 1)[0]; + p += 4; + header.eigenVector[2] = new Float32Array(buffer, p, 3); + p += 12; + header.eigenVectorLength[2] = new Float32Array(buffer, p, 1)[0]; + p += 4; + console.assert(p == 96); + buf = new Float32Array(buffer, p); + + this._taskMap["delete"](id); + + return _context3.abrupt("return", { + header: header, + body: buf + }); + + case 37: + _context3.prev = 37; + this._requests--; + return _context3.finish(37); + + case 40: + case "end": + return _context3.stop(); + } + } + }, _callee3, this, [[1,, 37, 40]]); + })); + + function doLoad(_x, _x2, _x3, _x4, _x5) { + return _doLoad.apply(this, arguments); + } + + return doLoad; + }() + /** + * @override + */ + + }, { + key: "cancel", + value: function cancel(id) { + var item = this._taskMap.get(id); + + if (item) { + item.abortController.abort(); + } + } + }]); + + return RawPointCloudProvider; +}(PointCloudProvider); + +/** + * Mapray 関連の機能全体が含まれる名前空間 + * @namespace mapray + */ + +var mapray = { + animation: animation, + Viewer: Viewer, + Camera: Camera, + GeoMath: GeoMath, + GeoPoint: GeoPoint, + GeoRegion: GeoRegion, + Orientation: Orientation, + Ray: Ray, + AltitudeMode: AltitudeMode, + CredentialMode: CredentialMode, + Layer: Layer, + LayerCollection: LayerCollection, + DemProvider: DemProvider, + StandardDemProvider: StandardDemProvider, + CloudDemProvider: CloudDemProvider, + ImageProvider: ImageProvider, + RenderCallback: RenderCallback, + StandardImageProvider: StandardImageProvider, + Scene: Scene, + Entity: Entity, + MarkerLineEntity: MarkerLineEntity, + PathEntity: PathEntity, + TextEntity: TextEntity, + ModelEntity: ModelEntity, + PolygonEntity: PolygonEntity, + PinEntity: PinEntity, + ImageIconEntity: ImageIconEntity, + SceneLoader: SceneLoader, + GeoJSONLoader: GeoJSONLoader, + Resource: Resource, + URLResource: URLResource, + MaprayApi: MaprayApi, + DebugStats: DebugStats, + PointCloud: PointCloud, + RawPointCloudProvider: RawPointCloudProvider, + LogoController: LogoController, + // マウス・Attribution開発 + AttributionController: AttributionController // マウス・Attribution開発 + +}; // 互換関数を登録 + +{ + /* requestAnimationFrame 互換関数 + * @param {function} callback + * @return {number} requestID + * @see https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame + */ + window.maprayRequestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame; + /* cancelAnimationFrame 互換関数 + * @param {number} requestID + * @see https://developer.mozilla.org/ja/docs/Web/API/window/cancelAnimationFrame + */ + + window.maprayCancelAnimationFrame = window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.oCancelAnimationFrame; + /* Performance.now 互換関数 + * @see https://developer.mozilla.org/en-US/docs/Web/API/Performance/now + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now + */ + + var perf = window.performance; + var now = perf && (perf.now || perf.mozNow || perf.msNow || perf.oNow || perf.webkitNow); + var date = new Date(); + window.maprayNow = now ? function () { + return now.call(perf); + } : function () { + return date.getTime(); + }; + /* Math.log2 互換関数 + * @function Math.maprayLog2 + * @see https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/log2 + */ + + Math.maprayLog2 = Math.log2 || function (x) { + return 1.4426950408889634074 * Math.log(x); + }; +} + +return mapray; + +}))); +//# sourceMappingURL=mapray.js.map diff --git a/_deploy/public/mapray-js/v0.8.6/mapray.js.map b/_deploy/public/mapray-js/v0.8.6/mapray.js.map new file mode 100644 index 00000000..882cae1c --- /dev/null +++ b/_deploy/public/mapray-js/v0.8.6/mapray.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mapray.js","sources":["../../../../node_modules/core-js/internals/global.js","../../../../node_modules/core-js/internals/fails.js","../../../../node_modules/core-js/internals/descriptors.js","../../../../node_modules/core-js/internals/is-object.js","../../../../node_modules/core-js/internals/document-create-element.js","../../../../node_modules/core-js/internals/ie8-dom-define.js","../../../../node_modules/core-js/internals/an-object.js","../../../../node_modules/core-js/internals/to-primitive.js","../../../../node_modules/core-js/internals/object-define-property.js","../../../../node_modules/core-js/internals/create-property-descriptor.js","../../../../node_modules/core-js/internals/create-non-enumerable-property.js","../../../../node_modules/core-js/internals/has.js","../../../../node_modules/core-js/internals/set-global.js","../../../../node_modules/core-js/internals/shared-store.js","../../../../node_modules/core-js/internals/inspect-source.js","../../../../node_modules/core-js/internals/native-weak-map.js","../../../../node_modules/core-js/internals/is-pure.js","../../../../node_modules/core-js/internals/shared.js","../../../../node_modules/core-js/internals/uid.js","../../../../node_modules/core-js/internals/shared-key.js","../../../../node_modules/core-js/internals/hidden-keys.js","../../../../node_modules/core-js/internals/internal-state.js","../../../../node_modules/core-js/internals/redefine.js","../../../../node_modules/core-js/modules/es.date.to-string.js","../../../../node_modules/core-js/internals/object-property-is-enumerable.js","../../../../node_modules/core-js/internals/classof-raw.js","../../../../node_modules/core-js/internals/indexed-object.js","../../../../node_modules/core-js/internals/require-object-coercible.js","../../../../node_modules/core-js/internals/to-indexed-object.js","../../../../node_modules/core-js/internals/object-get-own-property-descriptor.js","../../../../node_modules/core-js/internals/path.js","../../../../node_modules/core-js/internals/get-built-in.js","../../../../node_modules/core-js/internals/to-integer.js","../../../../node_modules/core-js/internals/to-length.js","../../../../node_modules/core-js/internals/to-absolute-index.js","../../../../node_modules/core-js/internals/array-includes.js","../../../../node_modules/core-js/internals/object-keys-internal.js","../../../../node_modules/core-js/internals/enum-bug-keys.js","../../../../node_modules/core-js/internals/object-get-own-property-names.js","../../../../node_modules/core-js/internals/object-get-own-property-symbols.js","../../../../node_modules/core-js/internals/own-keys.js","../../../../node_modules/core-js/internals/copy-constructor-properties.js","../../../../node_modules/core-js/internals/is-forced.js","../../../../node_modules/core-js/internals/export.js","../../../../node_modules/core-js/modules/es.math.log2.js","../../../../node_modules/core-js/modules/es.function.name.js","../../src/animation/AnimationError.js","../../../../node_modules/core-js/internals/a-possible-prototype.js","../../../../node_modules/core-js/internals/object-set-prototype-of.js","../../../../node_modules/core-js/internals/inherit-if-required.js","../../../../node_modules/core-js/internals/object-keys.js","../../../../node_modules/core-js/internals/object-define-properties.js","../../../../node_modules/core-js/internals/html.js","../../../../node_modules/core-js/internals/object-create.js","../../../../node_modules/core-js/internals/whitespaces.js","../../../../node_modules/core-js/internals/string-trim.js","../../../../node_modules/core-js/modules/es.number.constructor.js","../../src/animation/Time.js","../../src/animation/Interval.js","../../../../node_modules/core-js/internals/native-symbol.js","../../../../node_modules/core-js/internals/use-symbol-as-uid.js","../../../../node_modules/core-js/internals/is-array.js","../../../../node_modules/core-js/internals/to-object.js","../../../../node_modules/core-js/internals/object-get-own-property-names-external.js","../../../../node_modules/core-js/internals/well-known-symbol.js","../../../../node_modules/core-js/internals/well-known-symbol-wrapped.js","../../../../node_modules/core-js/internals/define-well-known-symbol.js","../../../../node_modules/core-js/internals/set-to-string-tag.js","../../../../node_modules/core-js/internals/a-function.js","../../../../node_modules/core-js/internals/function-bind-context.js","../../../../node_modules/core-js/internals/array-species-create.js","../../../../node_modules/core-js/internals/array-iteration.js","../../../../node_modules/core-js/modules/es.symbol.js","../../../../node_modules/core-js/modules/es.symbol.description.js","../../../../node_modules/core-js/modules/es.symbol.iterator.js","../../../../node_modules/core-js/internals/add-to-unscopables.js","../../../../node_modules/core-js/internals/array-method-uses-to-length.js","../../../../node_modules/core-js/modules/es.array.includes.js","../../../../node_modules/core-js/internals/iterators.js","../../../../node_modules/core-js/internals/correct-prototype-getter.js","../../../../node_modules/core-js/internals/object-get-prototype-of.js","../../../../node_modules/core-js/internals/iterators-core.js","../../../../node_modules/core-js/internals/create-iterator-constructor.js","../../../../node_modules/core-js/internals/define-iterator.js","../../../../node_modules/core-js/modules/es.array.iterator.js","../../../../node_modules/core-js/internals/to-string-tag-support.js","../../../../node_modules/core-js/internals/classof.js","../../../../node_modules/core-js/internals/object-to-string.js","../../../../node_modules/core-js/modules/es.object.to-string.js","../../../../node_modules/core-js/internals/is-regexp.js","../../../../node_modules/core-js/internals/not-a-regexp.js","../../../../node_modules/core-js/internals/correct-is-regexp-logic.js","../../../../node_modules/core-js/modules/es.string.includes.js","../../../../node_modules/core-js/internals/string-multibyte.js","../../../../node_modules/core-js/modules/es.string.iterator.js","../../../../node_modules/core-js/internals/dom-iterables.js","../../../../node_modules/core-js/modules/web.dom-collections.iterator.js","../../src/OrderedMap.js","../../src/animation/Invariance.js","../../../../node_modules/core-js/internals/freezing.js","../../../../node_modules/core-js/internals/internal-metadata.js","../../../../node_modules/core-js/internals/is-array-iterator-method.js","../../../../node_modules/core-js/internals/get-iterator-method.js","../../../../node_modules/core-js/internals/call-with-safe-iteration-closing.js","../../../../node_modules/core-js/internals/iterate.js","../../../../node_modules/core-js/internals/an-instance.js","../../../../node_modules/core-js/internals/check-correctness-of-iteration.js","../../../../node_modules/core-js/internals/collection.js","../../../../node_modules/core-js/internals/redefine-all.js","../../../../node_modules/core-js/internals/set-species.js","../../../../node_modules/core-js/internals/collection-strong.js","../../../../node_modules/core-js/modules/es.map.js","../../src/animation/Type_impl.js","../../../../node_modules/core-js/modules/es.array.find.js","../../../../node_modules/core-js/modules/es.set.js","../../../../node_modules/core-js/internals/array-buffer-native.js","../../../../node_modules/core-js/internals/to-index.js","../../../../node_modules/core-js/internals/ieee754.js","../../../../node_modules/core-js/internals/array-fill.js","../../../../node_modules/core-js/internals/array-buffer.js","../../../../node_modules/core-js/internals/species-constructor.js","../../../../node_modules/core-js/modules/es.array-buffer.slice.js","../../../../node_modules/core-js/internals/array-buffer-view-core.js","../../../../node_modules/core-js/internals/typed-array-constructors-require-wrappers.js","../../../../node_modules/core-js/internals/to-positive-integer.js","../../../../node_modules/core-js/internals/to-offset.js","../../../../node_modules/core-js/internals/typed-array-from.js","../../../../node_modules/core-js/internals/typed-array-constructor.js","../../../../node_modules/core-js/modules/es.typed-array.float32-array.js","../../../../node_modules/core-js/modules/es.typed-array.float64-array.js","../../../../node_modules/core-js/internals/array-copy-within.js","../../../../node_modules/core-js/modules/es.typed-array.copy-within.js","../../../../node_modules/core-js/modules/es.typed-array.every.js","../../../../node_modules/core-js/modules/es.typed-array.fill.js","../../../../node_modules/core-js/modules/es.typed-array.filter.js","../../../../node_modules/core-js/modules/es.typed-array.find.js","../../../../node_modules/core-js/modules/es.typed-array.find-index.js","../../../../node_modules/core-js/modules/es.typed-array.for-each.js","../../../../node_modules/core-js/modules/es.typed-array.includes.js","../../../../node_modules/core-js/modules/es.typed-array.index-of.js","../../../../node_modules/core-js/modules/es.typed-array.iterator.js","../../../../node_modules/core-js/modules/es.typed-array.join.js","../../../../node_modules/core-js/internals/array-method-is-strict.js","../../../../node_modules/core-js/internals/array-last-index-of.js","../../../../node_modules/core-js/modules/es.typed-array.last-index-of.js","../../../../node_modules/core-js/modules/es.typed-array.map.js","../../../../node_modules/core-js/internals/array-reduce.js","../../../../node_modules/core-js/modules/es.typed-array.reduce.js","../../../../node_modules/core-js/modules/es.typed-array.reduce-right.js","../../../../node_modules/core-js/modules/es.typed-array.reverse.js","../../../../node_modules/core-js/modules/es.typed-array.set.js","../../../../node_modules/core-js/modules/es.typed-array.slice.js","../../../../node_modules/core-js/modules/es.typed-array.some.js","../../../../node_modules/core-js/modules/es.typed-array.sort.js","../../../../node_modules/core-js/modules/es.typed-array.subarray.js","../../../../node_modules/core-js/modules/es.typed-array.to-locale-string.js","../../../../node_modules/core-js/modules/es.typed-array.to-string.js","../../src/GeoMath.js","../../src/animation/predefined_types.js","../../src/animation/Type.js","../../src/animation/Curve.js","../../../../node_modules/core-js/internals/create-property.js","../../../../node_modules/core-js/internals/array-from.js","../../../../node_modules/core-js/modules/es.array.from.js","../../src/animation/Updater.js","../../src/animation/TypeMismatchError.js","../../src/animation/Binder.js","../../../../node_modules/core-js/internals/engine-user-agent.js","../../../../node_modules/core-js/internals/engine-v8-version.js","../../../../node_modules/core-js/internals/array-method-has-species-support.js","../../../../node_modules/core-js/modules/es.array.concat.js","../../src/animation/BindingBlock.js","../../src/animation/EasyBindingBlock.js","../../src/animation/ConstantCurve.js","../../src/animation/AnimUtil.js","../../src/animation/KFLinearCurve.js","../../src/animation/KFStepCurve.js","../../../../node_modules/core-js/modules/es.array.map.js","../../src/animation/ComboVectorCurve.js","../../src/animation/index.js","../../../../node_modules/core-js/internals/array-for-each.js","../../../../node_modules/core-js/modules/es.array.for-each.js","../../../../node_modules/core-js/internals/native-promise-constructor.js","../../../../node_modules/core-js/internals/engine-is-ios.js","../../../../node_modules/core-js/internals/task.js","../../../../node_modules/core-js/internals/microtask.js","../../../../node_modules/core-js/internals/new-promise-capability.js","../../../../node_modules/core-js/internals/promise-resolve.js","../../../../node_modules/core-js/internals/host-report-errors.js","../../../../node_modules/core-js/internals/perform.js","../../../../node_modules/core-js/modules/es.promise.js","../../../../node_modules/core-js/modules/web.dom-collections.for-each.js","../../../../node_modules/regenerator-runtime/runtime.js","../../src/Ray.js","../../src/Camera.js","../../src/GLEnv.js","../../../../node_modules/core-js/modules/es.array.slice.js","../../../../node_modules/core-js/modules/es.array.sort.js","../../../../node_modules/core-js/modules/es.array.splice.js","../../../../node_modules/core-js/internals/math-expm1.js","../../../../node_modules/core-js/modules/es.math.cosh.js","../../../../node_modules/core-js/internals/regexp-flags.js","../../../../node_modules/core-js/internals/regexp-sticky-helpers.js","../../../../node_modules/core-js/internals/regexp-exec.js","../../../../node_modules/core-js/modules/es.regexp.exec.js","../../../../node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","../../../../node_modules/core-js/internals/advance-string-index.js","../../../../node_modules/core-js/internals/regexp-exec-abstract.js","../../../../node_modules/core-js/modules/es.string.match.js","../../../../node_modules/core-js/modules/es.data-view.js","../../src/DemSampler.js","../../src/DemSamplerLinear.js","../../src/DemSamplerNearest.js","../../src/AvgHeightMaps.js","../../src/DemBinary.js","../../../../node_modules/core-js/modules/es.typed-array.int16-array.js","../../../../node_modules/core-js/modules/es.typed-array.int32-array.js","../../src/AreaUtil.js","../../src/FlakeMesh.js","../../src/Primitive.js","../../src/FlakeRenderObject.js","../../../../node_modules/core-js/modules/es.array.fill.js","../../../../node_modules/core-js/modules/es.typed-array.uint8-array.js","../../src/UpdatedTileArea.js","../../../../node_modules/core-js/modules/es.array.is-array.js","../../../../node_modules/core-js/modules/es.array-buffer.constructor.js","../../../../node_modules/core-js/modules/es.typed-array.uint16-array.js","../../../../node_modules/core-js/modules/es.typed-array.uint32-array.js","../../src/MeshBuffer.js","../../src/Mesh.js","../../src/AltitudeMode.js","../../src/Entity.js","../../src/Globe.js","../../src/RenderFlake.js","../../src/FlakeCollector.js","../../../../node_modules/core-js/modules/es.array.join.js","../../src/Shader.js","../../src/Material.js","../../src/FlakeMaterial.js","../../src/ImageProvider.js","../../src/EmptyImageProvider.js","../../src/TileTexture.js","../../src/TileTextureCache.js","../../src/WireframeMaterial.js","../../src/Layer.js","../../src/SurfaceMaterial.js","../../../../node_modules/core-js/modules/es.array.index-of.js","../../../../node_modules/core-js/modules/es.array.reduce.js","../../../../node_modules/core-js/modules/es.date.now.js","../../../../node_modules/core-js/modules/es.object.keys.js","../../../../node_modules/core-js/modules/es.regexp.to-string.js","../../src/GeoPoint.js","../../src/PointCloudMaterial.js","../../src/PointCloud.js","../../src/PointCloudBoxRenderObject.js","../../src/PointCloudBoxCollector.js","../../../../node_modules/core-js/internals/function-bind.js","../../../../node_modules/core-js/modules/es.function.bind.js","../../src/FrameBuffer.js","../../src/PickTool.js","../../src/RenderStage.js","../../src/CredentialMode.js","../../src/StandardImageProvider.js","../../../../node_modules/core-js/internals/object-assign.js","../../../../node_modules/core-js/modules/es.object.assign.js","../../src/DemProvider.js","../../src/StandardDemProvider.js","../../src/LayerCollection.js","../../src/PointCloudCollection.js","../../src/RenderCallback.js","../../src/NullRenderCallback.js","../../src/Scene.js","../../../../node_modules/core-js/internals/create-html.js","../../../../node_modules/core-js/internals/string-html-forced.js","../../../../node_modules/core-js/modules/es.string.link.js","../../../../node_modules/core-js/modules/es.array.last-index-of.js","../../../../node_modules/core-js/modules/es.string.starts-with.js","../../src/HTTP.js","../../../../node_modules/core-js/modules/es.regexp.constructor.js","../../../../node_modules/core-js/internals/native-url.js","../../../../node_modules/core-js/internals/string-punycode-to-ascii.js","../../../../node_modules/core-js/internals/get-iterator.js","../../../../node_modules/core-js/modules/web.url-search-params.js","../../../../node_modules/core-js/modules/web.url.js","../../src/util/Dom.js","../../src/Resource.js","../../src/Loader.js","../../src/Orientation.js","../../src/gltf/CommonData.js","../../src/gltf/Content.js","../../src/Texture.js","../../src/EntityMaterial.js","../../src/ModelMaterial.js","../../src/gltf/Sampler.js","../../src/gltf/Texture.js","../../src/gltf/TextureInfo.js","../../src/gltf/NormalTextureInfo.js","../../src/gltf/OcclusionTextureInfo.js","../../src/ModelContainer.js","../../src/LineMaterial.js","../../src/GeoRegion.js","../../src/EntityRegion.js","../../src/QAreaManager.js","../../src/AbstractLineEntity.js","../../src/MarkerLineEntity.js","../../src/PathEntity.js","../../src/TextMaterial.js","../../src/SimpleTextMaterial.js","../../src/util/Color.js","../../src/AbstractPointEntity.js","../../src/TextEntity.js","../../src/ModelEntity.js","../../../../node_modules/core-js/modules/es.typed-array.from.js","../../src/PolygonMaterial.js","../../src/Triangulator.js","../../../../node_modules/core-js/internals/number-is-finite.js","../../../../node_modules/core-js/modules/es.number.is-finite.js","../../src/ConvexPolygon.js","../../src/PolygonEntity.js","../../../../node_modules/core-js/modules/es.typed-array.int8-array.js","../../src/gltf/BufferView.js","../../src/gltf/Accessor.js","../../src/gltf/Material.js","../../src/gltf/Primitive.js","../../src/gltf/Mesh.js","../../src/gltf/Node.js","../../src/gltf/Scene.js","../../src/gltf/BufferSplitter.js","../../src/BitVector.js","../../src/gltf/BufferEntry.js","../../src/gltf/ImageEntry.js","../../src/gltf/Buffer.js","../../src/gltf/Image.js","../../src/gltf/Context.js","../../src/gltf/Tool.js","../../src/SceneLoader.js","../../src/ContainerController.js","../../src/LogoController.js","../../src/AttributionController.js","../../src/Viewer.js","../../src/CloudDemProvider.js","../../src/PinMaterial.js","../../src/IconLoader.js","../../src/PinEntity.js","../../src/ImageIconMaterial.js","../../src/ImageIconEntity.js","../../../../node_modules/core-js/internals/object-to-array.js","../../../../node_modules/core-js/modules/es.object.values.js","../../src/GeoJSONLoader.js","../../src/DebugStats.js","../../../../node_modules/core-js/internals/number-parse-int.js","../../../../node_modules/core-js/modules/es.parse-int.js","../../../../node_modules/core-js/modules/es.string.ends-with.js","../../src/MaprayApiModel.js","../../src/MaprayApiResource.js","../../src/MaprayApi.js","../../src/PointCloudProvider.js","../../src/RawPointCloudProvider.js","../../src/index.js"],"sourcesContent":["var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","module.exports = false;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.6.4',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var redefine = require('../internals/redefine');\n\nvar DatePrototype = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar nativeDateToString = DatePrototype[TO_STRING];\nvar getTime = DatePrototype.getTime;\n\n// `Date.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-date.prototype.tostring\nif (new Date(NaN) + '' != INVALID_DATE) {\n redefine(DatePrototype, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? nativeDateToString.call(this) : INVALID_DATE;\n });\n}\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","var $ = require('../internals/export');\n\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\n// `Math.log2` method\n// https://tc39.github.io/ecma262/#sec-math.log2\n$({ target: 'Math', stat: true }, {\n log2: function log2(x) {\n return log(x) / LN2;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar FunctionPrototype = Function.prototype;\nvar FunctionPrototypeToString = FunctionPrototype.toString;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.github.io/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !(NAME in FunctionPrototype)) {\n defineProperty(FunctionPrototype, NAME, {\n configurable: true,\n get: function () {\n try {\n return FunctionPrototypeToString.call(this).match(nameRE)[1];\n } catch (error) {\n return '';\n }\n }\n });\n}\n","/**\n * @summary アニメーション共通のエラー\n *\n * @memberof mapray.animation\n * @extends Error\n *\n * @see {@link mapray.animation.Binder}\n */\nclass AnimationError extends Error {\n\n /**\n * @param {string} message エラーの説明\n */\n constructor( message )\n {\n super( message );\n this.name = \"mapray.animation.AnimationError\";\n }\n\n}\n\n\nexport default AnimationError;\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","/**\n * @summary アニメーション時刻\n *\n * @classdesc\n *

アニメーションの時刻を表現するクラスである。

\n *

このクラスのインスタンスはイミュータブルである。

\n *\n * @memberof mapray.animation\n * @hideconstructor\n */\nclass Time\n{\n\n /**\n * 非公開の構築子\n *\n * @param {number} ntime 数値時刻\n */\n constructor( ntime )\n {\n this._ntime = ntime;\n }\n\n\n /**\n * @summary 表現可能な最初の時刻\n *\n * @type {mapray.animation.Time}\n * @readonly\n */\n static get\n MIN_TIME() { return TIME_MIN_TIME; }\n\n\n /**\n * @summary 表現可能な最後の時刻\n *\n * @type {mapray.animation.Time}\n * @readonly\n */\n static get\n MAX_TIME() { return TIME_MAX_TIME; }\n\n\n /**\n * @summary 時刻に対応する数値の最小値\n *\n * @type {number}\n * @readonly\n */\n static get\n MIN_NTIME() { return TIME_MIN_NTIME; }\n\n\n /**\n * @summary 時刻に対応する数値の最大値\n *\n * @type {number}\n * @readonly\n */\n static get\n MAX_NTIME() { return TIME_MAX_NTIME; }\n\n\n /**\n * @summary 数値を時刻に変換\n *\n * @desc\n *

時刻に対応する数値から Time インスタンスを生成する。

\n *

条件: Time.MIN_NTIME <= ntime <= Time.MAX_NTIME

\n *\n * @param {number} ntime 時刻に対応する数値\n *\n * @return {mapray.animation.Time} Time インスタンス\n */\n static\n fromNumber( ntime )\n {\n return new Time( ntime );\n }\n\n\n /**\n * @summary 時刻を数値に変換\n *\n * @desc\n *

this の時刻に対応する数値を取得する。

\n *\n * @return {number} 時刻に対応する数値\n */\n toNumber()\n {\n return this._ntime;\n }\n\n\n /** @summary 時刻の比較 (==)\n *\n * @desc\n *

this の時刻と rhs の時刻が同じとき true, それ以外のとき false を返す。

\n *\n * @param {mapray.animation.Time} rhs 時刻\n *\n * @return {boolean} 比較結果\n */\n equals( rhs )\n {\n return this._ntime == rhs._ntime;\n }\n\n\n /** @summary 時刻の比較 (<)\n *\n * @desc\n *

this の時刻が rhs の時刻より前のとき true, それ以外のとき false を返す。

\n *\n * @param {mapray.animation.Time} rhs 時刻\n *\n * @return {boolean} 比較結果\n */\n lessThan( rhs )\n {\n return this._ntime < rhs._ntime;\n }\n\n\n /** @summary 時刻の比較 (<=)\n *\n * @desc\n *

this の時刻が rhs の時刻より前または同じとき true, それ以外のとき false を返す。

\n *\n * @param {mapray.animation.Time} rhs 時刻\n *\n * @return {boolean} 比較結果\n */\n lessEqual( rhs )\n {\n return this._ntime <= rhs._ntime;\n }\n\n}\n\n\nconst TIME_MIN_NTIME = -Number.MAX_VALUE;\nconst TIME_MAX_NTIME = +Number.MAX_VALUE;\nconst TIME_MIN_TIME = Time.fromNumber( TIME_MIN_NTIME );\nconst TIME_MAX_TIME = Time.fromNumber( TIME_MAX_NTIME );\n\n\nexport default Time;\n","import Time from \"./Time\";\n\n\n/**\n * @summary アニメーション時刻の区間\n *\n * @classdesc\n *

アニメーション時刻の区間を表現するクラスである。

\n *

このクラスのインスタンスはイミュータブルである。

\n *\n * @memberof mapray.animation\n */\nclass Interval\n{\n\n /**\n * @desc\n *

下限 lower と上限 upper の時刻区間を生成する。

\n *

端点である lower と upper が区間に含まれるかどうかは l_open と u_open により指定する。

\n *\n *
\n     *  interval       | l_open  u_open\n     * ----------------+----------------\n     *  [lower, upper] | false   false\n     *  [lower, upper) | false   true\n     *  (lower, upper] | true    false\n     *  (lower, upper) | true    true\n     * 
\n *\n * @param {mapray.animation.Time} lower 区間の下限時刻\n * @param {mapray.animation.Time} upper 区間の上限時刻\n * @param {boolean} [l_open=false] lower が区間にが含まれるとき false, 含まれないとき true\n * @param {boolean} [u_open=false] upper が区間にが含まれるとき false, 含まれないとき true\n */\n constructor( lower, upper, l_open, u_open )\n {\n this._lower = lower;\n this._upper = upper;\n this._l_open = (l_open === undefined) ? false : l_open;\n this._u_open = (u_open === undefined) ? false : u_open;\n }\n\n\n /**\n * @summary 全時刻区間\n *\n * @type {mapray.animation.Interval}\n * @readonly\n */\n static get\n UNIVERSAL() { return INTERVAL_UNIVERSAL; }\n\n\n /**\n * @summary 下限時刻\n *\n * @type {mapray.animation.Time}\n * @readonly\n */\n get\n lower() { return this._lower; }\n\n\n /**\n * @summary 上限時刻\n *\n * @type {mapray.animation.Time}\n * @readonly\n */\n get\n upper() { return this._upper; }\n\n\n /**\n * @summary 下限時刻は除外されるか?\n *\n * @type {boolean}\n * @readonly\n */\n get\n l_open() { return this._l_open; }\n\n\n /**\n * @summary 上限時刻は除外されるか?\n *\n * @type {boolean}\n * @readonly\n */\n get\n u_open() { return this._u_open; }\n\n\n /**\n * @summary 空時刻区間か?\n *\n * @desc\n *

this が空の時刻区間かどうかを返す。

\n *

空時刻区間の場合、区間内に 1 つも時刻が存在しない。

\n *\n * @return {boolean} 空時刻区間のとき true, それ以外のとき false\n */\n isEmpty()\n {\n let lower = this._lower;\n let upper = this._upper;\n\n return upper.lessThan( lower ) || upper.equals( lower ) && (this._l_open || this._u_open);\n }\n\n\n /**\n * @summary 単一時刻区間か?\n *\n * @desc\n *

this が単一時刻の時刻区間かどうかを返す。

\n *

単一時刻区間の場合、区間内にただ 1 つの時刻が存在する。

\n *

単一時刻区間であるなら lower == upper であり、逆は必ずしも成り立たない。

\n *\n * @return {boolean} 単一時刻区間のとき true, それ以外のとき false\n */\n isSingle()\n {\n return this._lower.equals( this._upper ) && !(this._l_open || this._u_open);\n }\n\n\n /**\n * @summary 通常時刻区間か?\n *\n * @desc\n *

this が通常の時刻区間かどうかを返す。

\n *

通常時刻区間の場合、区間内に無限個の時刻が存在する。

\n *

通常時刻区間であるなら lower < upper であり、逆も成り立つ。

\n *\n * @return {boolean} 通常時刻区間のとき true, それ以外のとき false\n */\n isProper()\n {\n return this._lower.lessThan( this._upper );\n }\n\n\n /**\n * @summary 先行しているか?\n *\n * @desc\n *

this のすべての時刻が rhs のすべての時刻より先行しているときに true, それ以外のときは false を返す。

\n *

this または rhs のどちらか、または両方が空時刻区間のときは true を返す。

\n *\n * @param {mapray.animation.Interval} rhs 時刻区間\n *\n * @return {boolean} this が rhs に先行しているとき true, それ以外のとき false\n */\n precedes( rhs )\n {\n if ( this.isEmpty() || rhs.isEmpty() ) {\n // this または rhs のどちらか、または両方が空時刻区間のときの仕様\n return true;\n }\n else {\n let ut1 = this._upper;\n let uo1 = this._u_open;\n let lt2 = rhs._lower;\n let lo2 = rhs._l_open;\n return ut1.lessThan( lt2 ) || ut1.equals( lt2 ) && (uo1 || lo2);\n }\n }\n\n\n /**\n * @summary 包含しているか?\n *\n * @desc\n *

rhs のすべての時刻が this に含まれるとき true, それ以外のときは false を返す。

\n *

rhs が空時刻区間のときは true を返す。

\n *

これは rhs ⊆ this と等価である。

\n *\n * @param {mapray.animation.Interval} rhs 時刻区間\n *\n * @return {boolean} this が rhs を包含しているとき true, それ以外のとき false\n */\n includes( rhs )\n {\n if ( rhs.isEmpty() ) {\n // rhs が空時刻区間のときの仕様\n return true;\n }\n else {\n let lt1 = this._lower;\n let lt2 = rhs._lower;\n let lo1 = this._l_open;\n let lo2 = rhs._l_open;\n let inc_l = lt1.lessThan( lt2 ) || lt1.equals( lt2 ) && (!lo1 || lo2);\n\n let ut1 = this._upper;\n let ut2 = rhs._upper;\n let uo1 = this._u_open;\n let uo2 = rhs._u_open;\n let inc_u = ut2.lessThan( ut1 ) || ut2.equals( ut1 ) && (uo2 || !uo1);\n\n return inc_l && inc_u;\n }\n }\n\n\n /**\n * @summary 時刻を包含しているか?\n *\n * @desc\n *

rhs の時刻が this に含まれるとき true, それ以外のときは false を返す。

\n *

このメソッドは this.includes( new Interval( rhs, rhs ) ) と同等である。

\n *\n * @param {mapray.animation.Time} rhs 時刻\n *\n * @return {boolean} this が rhs を包含しているとき true, それ以外のとき false\n */\n includesTime( rhs )\n {\n let lower = this._lower;\n let inc_l = lower.lessThan( rhs ) || lower.equals( rhs ) && !this._l_open;\n\n let upper = this._upper;\n let inc_u = rhs.lessThan( upper ) || rhs.equals( upper ) && !this._u_open;\n\n return inc_l && inc_u;\n }\n\n\n /**\n * @summary 共通時刻区間は存在するか?\n *\n * @desc\n *

!this.getIntersection( rhs ).isEmpty() と同じである。

\n *\n * @param {mapray.animation.Interval} rhs 時刻区間\n *\n * @return {boolean} 共通時刻区間\n *\n * @see {@link mapray.animation.Interval#getIntersection}\n */\n hasIntersection( rhs )\n {\n // todo: オブジェクトを生成しないように最適化\n return !this.getIntersection( rhs ).isEmpty();\n }\n\n\n /**\n * @summary 先行時刻区間を取得\n *\n * @desc\n *

this のすべての時刻に対して、先の時刻となるすべての時刻を含む先行時刻区間を返す。

\n *

this が空時刻区間のときは全時刻区間を返し、this\n * に表現可能な最初の時刻が含まれるときは空時刻区間を返す。

\n *

this.getPrecedings().precedes( this ) は常に true を返す。

\n *\n * @return {mapray.animation.Interval} 先行時刻区間\n */\n getPrecedings()\n {\n if ( this.isEmpty() ) {\n // 空時刻区間のときは全時刻区間を返す仕様\n return INTERVAL_UNIVERSAL;\n }\n else {\n return new Interval( Time.MIN_TIME, this._lower, false, !this._l_open );\n }\n }\n\n\n /**\n * @summary 後続時刻区間を取得\n *\n * @desc\n *

this のすべての時刻に対して、後の時刻となるすべての時刻を含む後続時刻区間を返す。

\n *

this が空時刻区間のときは全時刻区間を返し、this\n * に表現可能な最後の時刻が含まれるときは空時刻区間を返す。

\n *

this.precedes( this.getFollowings() ) は常に true を返す。

\n *\n * @return {mapray.animation.Interval} 後続時刻区間\n */\n getFollowings()\n {\n if ( this.isEmpty() ) {\n // 空時刻区間のときは全時刻区間を返す仕様\n return INTERVAL_UNIVERSAL;\n }\n else {\n return new Interval( this._upper, Time.MAX_TIME, !this._u_open, false );\n }\n }\n\n\n /**\n * @summary 共通時刻区間を取得\n *\n * @desc\n *

this と rhs の共通時刻区間 (this ∩ rhs) を返す。

\n *

this と rhs に共通の時刻が存在しなければ空時刻区間を返す。

\n *\n * @param {mapray.animation.Interval} rhs 時刻区間\n *\n * @return {mapray.animation.Interval} 共通時刻区間\n *\n * @see {@link mapray.animation.Interval#hasIntersection}\n */\n getIntersection( rhs )\n {\n // B = Lb ∩ Ub とするとき\n // A ∩ B = A ∩ Lb ∩ Ub\n\n // A ∩ Lb\n let cross = this._getIntersectionByLower( rhs._lower, rhs._l_open );\n // (A ∩ Lb) ∩ Ub\n return cross._getIntersectionByUpper( rhs._upper, rhs._u_open );\n }\n\n\n /**\n * @summary 合併時刻区間を取得\n *\n * @desc\n *

this と rhs を合併した時刻集合 (this ∪ rhs) を時刻区間の配列として返す。

\n *

0 から 2 個の時刻区間を含む配列を返す。配列の要素に空時刻区間は含まれない。

\n *

2 要素の配列 v が返されたとき、v[0] と v[1] の間に時刻が存在し、さらに\n * v[0].precedes( v[1] ) は true となる。

\n *\n * @param {mapray.animation.Interval} rhs 時刻区間\n *\n * @return {mapray.animation.Interval[]} 合併時刻区間\n */\n getUnion( rhs )\n {\n if ( this.isEmpty() ) {\n return rhs.isEmpty() ? [] : [rhs];\n }\n else if ( rhs.isEmpty() ) {\n // Assert: !this.isEmpty() && rhs.isEmpty()\n return [this];\n }\n // Assert: !this.isEmpty() && !rhs.isEmpty()\n\n let lt1 = this._lower;\n let ut1 = this._upper;\n let lo1 = this._l_open;\n let uo1 = this._u_open;\n\n let lt2 = rhs._lower;\n let ut2 = rhs._upper;\n let lo2 = rhs._l_open;\n let uo2 = rhs._u_open;\n\n if ( ut1.lessThan( lt2 ) || (ut1.equals( lt2 ) && uo1 && lo2) ) {\n // Assert: this と rhs は離れている、かつ this が先行\n return [this, rhs];\n }\n else if ( ut2.lessThan( lt1 ) || (lt1.equals( ut2 ) && lo1 && uo2) ) {\n // Assert: this と rhs は離れている、かつ rhs が先行\n return [rhs, this];\n }\n // Assert: this と rhs は交差または隣接している (単一の時刻区間に合併できる)\n\n let [lower, l_open] =\n (lt1.lessThan( lt2 ) || lt1.equals( lt2 ) && lo2) ?\n [lt1, lo1] : [lt2, lo2];\n\n let [upper, u_open] =\n (ut2.lessThan( ut1 ) || ut2.equals( ut1 ) && uo2) ?\n [ut1, uo1] : [ut2, uo2];\n\n return [new Interval( lower, upper, l_open, u_open )];\n }\n\n\n /**\n * @summary 時刻区間の差を取得\n *\n * @desc\n *

this から rhs を差し引いた時刻集合 (this - rhs) を時刻区間の配列として返す。

\n *

0 から 2 個の時刻区間を含む配列を返す。配列の要素に空時刻区間は含まれない。

\n *

2 要素の配列 v が返されたとき、v[0] と v[1] の間に時刻が存在し、さらに\n * v[0].precedes( v[1] ) は true となる。

\n *\n * @param {mapray.animation.Interval} rhs 時刻区間\n *\n * @return {mapray.animation.Interval[]} 時刻区間の差\n */\n getDifference( rhs )\n {\n // B = Lb ∩ Ub とするとき\n // A - B = A ∩ ~B\n // = (A ∩ ~Lb) ∪ (A ∩ ~Ub)\n\n // A ∩ ~Lb\n let i1 = this._getIntersectionByUpper( rhs._lower, !rhs._l_open );\n // A ∩ ~Ub\n let i2 = this._getIntersectionByLower( rhs._upper, !rhs._u_open );\n // (A ∩ ~Lb) ∪ (A ∩ ~Ub)\n return i1.getUnion( i2 );\n }\n\n\n /**\n * @summary 補時刻区間を取得\n *\n * @desc\n *

全時刻区間 から this を差し引いた時刻集合を時刻区間の配列として返す。

\n *

0 から 2 個の時刻区間を含む配列を返す。配列の要素に空時刻区間は含まれない。

\n *

2 要素の配列 v が返されたとき、v[0] と v[1] の間に時刻が存在し、さらに\n * v[0].precedes( v[1] ) は true となる。

\n *\n * @return {mapray.animation.Interval[]} 補時刻区間\n */\n getComplement()\n {\n return INTERVAL_UNIVERSAL.getDifference( this );\n }\n\n\n /**\n * @summary 下限時刻区間との共通時刻区間を取得\n *\n * @desc\n *

this ∩ Lower(bound, open) → Interval

\n *\n * @param {mapray.animation.Time} bound\n * @param {boolean} open\n *\n * @return {mapray.animation.Interval} 共通時刻区間\n *\n * @private\n */\n _getIntersectionByLower( bound, open )\n {\n if ( bound.lessThan( this._lower ) || bound.equals( this._lower ) && this._l_open ) {\n return this;\n }\n else {\n return new Interval( bound, this._upper, open, this._u_open );\n }\n }\n\n\n /**\n * @summary 上限時刻区間との共通時刻区間を取得\n *\n * @desc\n *

this ∩ Upper(bound, open) → Interval

\n *\n * @param {mapray.animation.Time} bound\n * @param {boolean} open\n *\n * @return {mapray.animation.Interval} 共通時刻区間\n *\n * @private\n */\n _getIntersectionByUpper( bound, open )\n {\n if ( this._upper.lessThan( bound ) || this._upper.equals( bound ) && this._u_open ) {\n return this;\n }\n else {\n return new Interval( this._lower, bound, this._l_open, open );\n }\n }\n\n}\n\n\nconst INTERVAL_UNIVERSAL = new Interval( Time.MIN_TIME, Time.MAX_TIME );\n\n\nexport default Interval;\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return $stringify.apply(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","module.exports = {};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (e) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (f) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","// 辞書は二分探索木により実現している\n// 二分探索木の挿入・削除操作は2色木で実装している\n// 2色木のアルゴリズムは近代科学社の「アルゴリズムイントロダクション第3版」(以降 IA3) を参考にした\n\n\n/**\n * @summary 2色木の番兵 (T.nil)\n *\n * @desc\n *

根の親、葉の子、または空辞書の root を表現する。

\n *\n * @see IA3/13.1 2色木の性質\n *\n * @private\n */\nlet T_nil;\n\n\n/**\n * @summary 順序あり辞書\n *\n * @classdesc\n *

キーの値により順序付けされる辞書である。

\n *

等価 (equivalent) キーを持つ複数のアイテムは存在できない。

\n *

this はキーと値の参照を保有している。保有しているキーのインスタンスを変更すると動作は保証されない。

\n *\n * @memberof mapray\n * @private\n */\nclass OrderedMap {\n\n /**\n * @param {mapray.OrderedMap.Compare} compare キー比較関数\n */\n constructor( compare )\n {\n this._compare = compare;\n this._root = T_nil;\n this._size = 0;\n }\n\n\n /**\n * @summary 要素数\n *\n * @type {number}\n * @readonly\n */\n get size() { return this._size; }\n\n\n /**\n * @summary インスタンスを複製\n *\n * @desc\n *

キー比較関数、キー、値はシャローコピーされる。

\n *\n *

計算量: 要素数 n に対して O(n)

\n *\n * @return {mapray.OrderedMap} this の複製\n */\n clone()\n {\n let cloned = new OrderedMap( this._compare );\n\n if ( this._root !== T_nil ) {\n cloned._root = this._root._clone( T_nil );\n }\n\n cloned._size = this._size;\n\n return cloned;\n }\n\n\n /**\n * @summary 要素は存在しないか?\n *\n *

計算量: 要素数 n に対して O(1)

\n *\n * @return {boolean} 要素が存在しないとき true, そうでないとき false\n */\n isEmpty()\n {\n return this._root === T_nil;\n }\n\n\n /**\n * @summary 先頭要素を検索\n *\n * @desc\n *

順序が最初の要素を検索する。

\n *\n *

計算量: 要素数 n に対して O(log n)

\n *\n * @return {!mapray.OrderedMap.Item} 検索されたアイテム (this が空なら null)\n */\n findFirst()\n {\n if ( this._root !== T_nil ) {\n return this._root._findMinimum();\n }\n else {\n return null;\n }\n }\n\n\n /**\n * @summary 末尾要素を検索\n *\n * @desc\n *

順序が最後の要素を検索する。

\n *\n *

計算量: 要素数 n に対して O(log n)

\n *\n * @return {!mapray.OrderedMap.Item} 検索されたアイテム (this が空なら null)\n */\n findLast()\n {\n if ( this._root !== T_nil ) {\n return this._root._findMaximum();\n }\n else {\n return null;\n }\n }\n\n\n /**\n * @summary 下限要素を検索\n *\n * @desc\n *

bound と同じまたは後になるキーが存在すれば、その中で最初の要素を返す。

\n *

そのような要素が存在しない場合は null を返す。

\n *\n *

計算量: 要素数 n に対して O(log n)

\n *\n * @param {mapray.OrderedMap.Key} bound 境界キー\n *\n * @return {?mapray.OrderedMap.Item} 検索された要素、存在しなければ null\n */\n findLower( bound )\n {\n return this._root._findLowerBound( bound, this._compare );\n }\n\n\n /**\n * @summary 上限要素を検索\n *\n * @desc\n *

bound より後になるキーが存在すれば、その中で最初の要素を返す。

\n *

そのような要素が存在しない場合は null を返す。

\n *\n *

計算量: 要素数 n に対して O(log n)

\n *\n * @param {mapray.OrderedMap.Key} bound 境界キー\n *\n * @return {?mapray.OrderedMap.Item} 検索された要素、存在しなければ null\n */\n findUpper( bound )\n {\n return this._root._findUpperBound( bound, this._compare );\n }\n\n\n /**\n * @summary 要素を検索\n *\n * @desc\n *

key と同じキーの要素が存在すれば返す。

\n *

そのような要素が存在しない場合は null を返す。

\n *\n *

計算量: 要素数 n に対して O(log n)

\n *\n * @param {mapray.OrderedMap.Key} key キー\n *\n * @return {?mapray.OrderedMap.Item} 検索された要素、存在しなければ null\n */\n findEqual( key )\n {\n return this._root._findEqual( key, this._compare );\n }\n\n\n /**\n * @summary すべての要素を削除\n *\n * @desc\n *

計算量: 要素数 n に対して O(1)

\n */\n clear()\n {\n this._root = T_nil;\n this._size = 0;\n }\n\n\n /**\n * @summary 要素を挿入\n *\n * @desc\n *

キーを key として value を挿入し、そのアイテムを返す。

\n *\n *

計算量: 要素数 n に対して O(log n)

\n *\n * @param {mapray.OrderedMap.Key} key キー\n * @param {mapray.OrderedMap.Value} value 値\n *\n * @return {mapray.OrderedMap.Item} 挿入された要素\n */\n insert( key, value )\n {\n // 参照: IA3/13.3 挿入\n\n let trail = this._root;\n let parent = T_nil;\n const comp = this._compare;\n\n while ( trail !== T_nil ) {\n parent = trail;\n if ( comp( key, trail.key ) ) {\n // 左へ下る\n trail = trail._child_L;\n }\n else if ( comp( trail.key, key ) ) {\n // 右へ下る\n trail = trail._child_R;\n }\n else {\n // キーが一致したアイテムの値を更新して返す\n trail._value = value;\n return trail;\n }\n }\n\n // 新しいアイテムを追加\n const item = new Item( parent, key, value );\n item._is_red = true; // 黒 → 赤\n\n if ( parent === T_nil ) {\n this._root = item;\n }\n else if ( comp( key, parent.key ) ) {\n parent._child_L = item;\n }\n else {\n parent._child_R = item;\n }\n\n // 要素数を増加\n ++this._size;\n\n // 2色木条件の回復\n this._insert_fixup( item );\n return item;\n }\n\n\n /**\n * @summary 挿入後に2色木条件を満たすように木を修正\n *\n * @desc\n *

計算量: 要素数 n に対して最悪 O(log n)

\n *\n * @param {mapray.OrderedMap.Item} item 挿入されたアイテム\n *\n * @see IA3/13.3 挿入\n *\n * @private\n */\n _insert_fixup( item )\n {\n let trail = item;\n\n while ( trail._parent._is_red /* 赤 */ ) {\n // ここでは、常に不変式 a, b, c を満たす\n if ( trail._parent === trail._parent._parent._child_L ) {\n // trail の親が祖父の左側\n let uncle = trail._parent._parent._child_R;\n if ( uncle._is_red /* 赤 */ ) {\n // 場合 1\n trail._parent._is_red = false; // 黒\n uncle._is_red = false; // 黒\n trail._parent._parent._is_red = true; // 赤\n trail = trail._parent._parent;\n }\n else {\n if ( trail === trail._parent._child_R ) {\n // 場合 2\n trail = trail._parent;\n this._rotate_L( trail );\n }\n\n // 場合 2,3\n trail._parent._is_red = false; // 黒\n trail._parent._parent._is_red = true; // 赤\n this._rotate_R( trail._parent._parent );\n }\n }\n else {\n // trail の親が祖父の右側\n let uncle = trail._parent._parent._child_L;\n if ( uncle._is_red /* 赤 */ ) {\n // 場合 1\n trail._parent._is_red = false; // 黒\n uncle._is_red = false; // 黒\n trail._parent._parent._is_red = true; // 赤\n trail = trail._parent._parent;\n }\n else {\n if ( trail === trail._parent._child_L ) {\n // 場合 2\n trail = trail._parent;\n this._rotate_R( trail );\n }\n\n // 場合 2,3\n trail._parent._is_red = false; // 黒\n trail._parent._parent._is_red = true; // 赤\n this._rotate_L( trail._parent._parent );\n }\n }\n }\n \n this._root._is_red = false; // 黒\n // ここで2色木条件を完全に満たす\n }\n\n\n /**\n * @summary 要素を削除\n *\n * @desc\n *

last を省略したときは first を削除して、first の後続を返す。このとき first に null\n * を指定することはできない。

\n *\n *

last を指定したときは first から last の前までの要素を削除して last を返す。last は\n * first と同じか後の要素でなければならない。

\n *\n *

null は this の末尾要素の次の要素を表す。

\n *\n *

計算量: 1 要素の削除の場合、要素数 n に対して O(log n)

\n *\n * todo: 複数要素の削除の計算量を分析\n *\n * @param {?mapray.OrderedMap.Item} first 削除する先頭の要素\n * @param {?mapray.OrderedMap.Item} [last] 削除する最後の要素の次\n *\n * @return {?mapray.OrderedMap.Item} 削除された要素の次の要素\n *\n * @private\n */\n remove( first, last )\n {\n if ( last === undefined ) {\n return this._remove( first );\n }\n else {\n for ( let item = first; item != last; ) {\n item = this._remove( item );\n }\n return last;\n }\n }\n\n\n /**\n * @summary アイテムを削除\n *\n * @desc\n *

計算量: 全体ツリーのアイテム数 n に対して最悪 O(log n)

\n *\n * @param {mapray.OrderedMap.Item} item 削除対象\n *\n * @return {?mapray.OrderedMap.Item} item の後続、存在しなければ null\n *\n * @see IA3/13.4 削除\n *\n * @private\n */\n _remove( item )\n {\n // item の後続 (無ければ null)\n const succ = item.findSuccessor();\n\n let orgY_is_red;\n let x_item;\n \n if ( item._child_L === T_nil ) {\n // (a) 左側なし\n orgY_is_red = item._is_red;\n x_item = item._child_R;\n this._replace( item._child_R, item );\n }\n else if ( item._child_R === T_nil ) {\n // (b) 右側なし (左側あり)\n orgY_is_red = item._is_red;\n x_item = item._child_L;\n this._replace( item._child_L, item );\n }\n else {\n // 左右あり\n orgY_is_red = succ._is_red;\n x_item = succ._child_R;\n\n if ( succ._parent === item ) {\n // (c) item の後続が item の右の子\n // x_item が T_nil であっても親を設定\n x_item._parent = succ;\n }\n else {\n // (d) item の後続が item の右の子の左側\n this._replace( succ._child_R, succ );\n succ._child_R = item._child_R;\n succ._child_R._parent = succ;\n }\n\n // (c), (d)\n this._replace( succ, item );\n succ._child_L = item._child_L;\n succ._child_L._parent = succ;\n succ._is_red = item._is_red;\n }\n \n // 要素数を減少\n --this._size;\n\n if ( !orgY_is_red /* 黒 */ ) {\n // 2色木条件の回復\n this._remove_fixup( x_item );\n }\n\n return succ;\n }\n\n\n /**\n * @summary 削除後に2色木条件を満たすように木を修正\n *\n * @param {mapray.OrderedMap.Item} x_item\n *\n * @see IA3/13.4 削除\n *\n * @private\n */\n _remove_fixup( x_item )\n {\n let trail = x_item;\n\n while ( trail !== this._root && !trail._is_red /* 黒 */ ) {\n if ( trail === trail._parent._child_L ) {\n // trail は親の左側\n let sibling = trail._parent._child_R;\n\n if ( sibling._is_red /* 赤 */ ) {\n // 場合 1\n sibling._is_red = false; // 黒\n trail._parent._is_red = true; // 赤\n this._rotate_L( trail._parent );\n sibling = trail._parent._child_R;\n }\n\n if ( !sibling._child_L._is_red /* 黒 */ &&\n !sibling._child_R._is_red /* 黒 */ ) {\n // 場合 2\n sibling._is_red = true; // 赤\n trail = trail._parent;\n }\n else {\n if ( !sibling._child_R._is_red /* 黒 */ ) {\n // 場合 3\n sibling._child_L._is_red = false; // 黒\n sibling._is_red = true; // 赤\n this._rotate_R( sibling );\n sibling = trail._parent._child_R;\n }\n\n // 場合 3,4\n sibling._is_red = trail._parent._is_red;\n trail._parent._is_red = false; // 黒\n sibling._child_R._is_red = false; // 黒\n this._rotate_L( trail._parent );\n trail = this._root;\n }\n }\n else {\n // trail は親の右側\n let sibling = trail._parent._child_L;\n\n if ( sibling._is_red /* 赤 */ ) {\n // 場合 1\n sibling._is_red = false; // 黒\n trail._parent._is_red = true; // 赤\n this._rotate_R( trail._parent );\n sibling = trail._parent._child_L;\n }\n\n if ( !sibling._child_R._is_red /* 黒 */ &&\n !sibling._child_L._is_red /* 黒 */ ) {\n // 場合 2\n sibling._is_red = true; // 赤\n trail = trail._parent;\n }\n else {\n if ( !sibling._child_L._is_red /* 黒 */ ) {\n // 場合 3\n sibling._child_R._is_red = false; // 黒\n sibling._is_red = true; // 赤\n this._rotate_L( sibling );\n sibling = trail._parent._child_L;\n }\n\n // 場合 3,4\n sibling._is_red = trail._parent._is_red;\n trail._parent._is_red = false; // 黒\n sibling._child_L._is_red = false; // 黒\n this._rotate_R( trail._parent );\n trail = this._root;\n }\n }\n }\n\n trail._is_red = false; // 黒\n }\n\n\n /**\n * @summary アイテムの置き換え\n *\n * @desc\n *

dst の場所を src アイテムで置き換える。src が T_nil のときは dst の場所は葉になる。

\n *

dst の親の左または右の子供 (または this._root) と src._parent は変更されるが、dst\n * 自身の内容は変更されない。

\n *\n * @param {mapray.OrderedMap.Item} src\n * @param {mapray.OrderedMap.Item} dst\n *\n * @private\n */\n _replace( src, dst )\n {\n let dp = dst._parent;\n\n if ( dp !== T_nil ) {\n if ( dp._child_L === dst ) {\n // dst は dp の左側\n dp._child_L = src;\n }\n else {\n // dst は dp の右側\n dp._child_R = src;\n }\n }\n else {\n // dst は最上位\n this._root = src;\n }\n\n // src の親を変更\n src._parent = dp;\n }\n\n\n /**\n * @summary アイテムを左回転\n *\n * 計算量: O(1)\n *\n * @see IA3/13.2 回転\n *\n * @param {mapray.OrderedMap.Item} pivot 回転中心のアイテム\n *\n * @private\n */\n _rotate_L( pivot )\n {\n // next は回転後に pivot の位置になる\n let next = pivot._child_R;\n\n // pivot の右側を next の左側に設定\n pivot._child_R = next._child_L;\n\n if ( next._child_L !== T_nil ) {\n next._child_L._parent = pivot;\n }\n\n // next の親を pivot の元の親に設定\n next._parent = pivot._parent;\n\n if ( pivot._parent === T_nil ) {\n this._root = next;\n }\n else if ( pivot === pivot._parent._child_L ) {\n pivot._parent._child_L = next;\n }\n else {\n pivot._parent._child_R = next;\n }\n\n // next の左側を pivot に設定\n next._child_L = pivot;\n pivot._parent = next;\n }\n\n\n /**\n * @summary アイテムを右回転\n *\n * 計算量: O(1)\n *\n * @see IA3/13.2 回転\n *\n * @param {mapray.OrderedMap.Item} pivot 回転中心のアイテム\n *\n * @private\n */\n _rotate_R( pivot )\n {\n // next は回転後に pivot の位置になる\n let next = pivot._child_L;\n\n // pivot の左側を next の右側に設定\n pivot._child_L = next._child_R;\n\n if ( next._child_R !== T_nil ) {\n next._child_R._parent = pivot;\n }\n\n // next の親を pivot の元の親に設定\n next._parent = pivot._parent;\n\n if ( pivot._parent === T_nil ) {\n this._root = next;\n }\n else if ( pivot === pivot._parent._child_R ) {\n pivot._parent._child_R = next;\n }\n else {\n pivot._parent._child_L = next;\n }\n\n // next の右側を pivot に設定\n next._child_R = pivot;\n pivot._parent = next;\n }\n\n}\n\n\n/**\n * @summary OrderedMap のアイテム\n *\n * @classdesc\n *

すべての this._child_L のアイテム L に対して Compare( L._key, this._key ) が成り立つ。

\n *

すべての this._child_R のアイテム R に対して Compare( this._key, R._key ) が成り立つ。

\n *\n * @memberof mapray.OrderedMap\n * @private\n */\nclass Item {\n\n /**\n * @desc\n *

色は黒に設定される。

\n *\n * @param {mapray.OrderedMap.Item} parent 親アイテム\n * @param {mapray.OrderedMap.Key} key アイテムのキー\n * @param {mapray.OrderedMap.Value} value アイテムの値\n */\n constructor( parent, key, value )\n {\n this._parent = parent;\n this._child_L = T_nil; // 左側ツリー\n this._child_R = T_nil; // 右側ツリー\n this._is_red = false; // 色: 黒=false, 赤=true\n\n this._key = key;\n this._value = value;\n }\n\n\n /**\n * @summary キー\n *\n * @type {mapray.OrderedMap.Key}\n * @readonly\n */\n get key() { return this._key; }\n\n\n /**\n * @summary 値\n *\n * @type {mapray.OrderedMap.Value}\n * @readonly\n */\n get value() { return this._value; }\n\n\n /**\n * @summary インスタンスを複製\n *\n * @desc\n *

キー、値はシャローコピーされる。

\n *\n * @param {mapray.OrderedMap.Item} parant 親アイテム (this が根のときは T_nil)\n *\n * @return {mapray.OrderedMap.Item} this の複製\n *\n * @private\n */\n _clone( parent )\n {\n // 子孫と色以外を複製\n let cloned = new Item( parent, this._key, this._value );\n\n // 左側子孫を複製\n if ( this._child_L !== T_nil ) {\n cloned._child_L = this._child_L._clone( cloned );\n }\n\n // 右側子孫を複製\n if ( this._child_R !== T_nil ) {\n cloned._child_R = this._child_R._clone( cloned );\n }\n\n // 色を複製\n cloned._is_red = this._is_red;\n\n return cloned;\n }\n\n\n /**\n * @summary 先頭アイテムの検索\n *\n * @desc\n *

this ツリーの中で最も先の順序のアイテムを検索する。

\n *\n *

計算量: this ツリーのアイテム数 n に対して O(log n)

\n *\n * @return {mapray.OrderedMap.Item} 検索されたアイテム\n *\n * @private\n */\n _findMinimum()\n {\n let item = this; // 追跡ポインタ\n\n while ( item._child_L !== T_nil ) {\n item = item._child_L;\n }\n\n return item;\n }\n\n\n /**\n * @summary 後尾アイテムの検索\n *\n * @desc\n *

this ツリーの中で最も後の順序のアイテムを検索する。

\n *\n *

計算量: this ツリーのアイテム数 n に対して O(log n)

\n *\n * @return {mapray.OrderedMap.Item} 検索されたアイテム\n *\n * @private\n */\n _findMaximum()\n {\n let item = this; // 追跡ポインタ\n\n while ( item._child_R !== T_nil ) {\n item = item._child_R;\n }\n\n return item;\n }\n\n\n /**\n * @summary 前のアイテムの検索\n *\n * @desc\n *

root ツリーから this の前の順序のアイテムを検索する。this が先頭なら null を返す。

\n *\n *

計算量: 辞書の要素数 n に対して最悪 O(log n)

\n *

todo: 平均計算量を分析する

\n *\n * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null\n */\n findPredecessor()\n {\n // 左側子孫がいれば、左側子孫の後尾\n if ( this._child_L !== T_nil ) {\n return this._child_L._findMaximum();\n }\n\n // 左側子孫がいなければ、this を右側子孫として持つ最も近い祖先\n // それがなければ this は全体ツリーの先頭なので検索失敗\n let item = this;\n let parent = item._parent;\n\n while ( parent !== T_nil && item === parent._child_L ) {\n item = parent;\n parent = item._parent;\n }\n\n return (parent !== T_nil) ? parent : null;\n }\n\n\n /**\n * @summary 次のアイテムの検索\n *\n * @desc\n *

root ツリーから this の次の順序のアイテムを検索する。this が後尾なら null を返す。

\n *\n *

計算量: 辞書の要素数 n に対して最悪 O(log n)

\n *

todo: 平均計算量を分析する

\n *\n * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null\n */\n findSuccessor()\n {\n // 右側子孫がいれば、右側子孫の先頭\n if ( this._child_R !== T_nil ) {\n return this._child_R._findMinimum();\n }\n\n // 右側子孫がいなければ、this を左側子孫として持つ最も近い祖先\n // それがなければ this は全体ツリーの後尾なので検索失敗\n let item = this;\n let parent = item._parent;\n\n while ( parent !== T_nil && item === parent._child_R ) {\n item = parent;\n parent = item._parent;\n }\n\n return (parent !== T_nil) ? parent : null;\n }\n\n\n /**\n * @summary 下限アイテムを検索\n *\n * @desc\n *

this ツリーの中で !comp(item.key, bkey) となる最初のアイテムを検索する。

\n *

つまり bkey と同じまたは後になるキーが this ツリーに存在すれば、その中で最初のアイテムを返す。

\n *

そのようなアイテムが存在しない場合は null を返す。

\n *

this が T_nil の場合は null を返す。

\n *\n *

計算量: this ツリーのアイテム数 n に対して最悪 O(log n)

\n *\n * @param {mapray.OrderedMap.Key} bkey 境界キー\n * @param {mapray.OrderedMap.Compare} comp キー比較関数\n *\n * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null\n *\n * @private\n */\n _findLowerBound( bkey, comp )\n {\n let item = this;\n\n while ( item !== T_nil ) {\n if ( comp( bkey, item._key ) ) {\n // bkey < item.key\n if ( item._child_L !== T_nil ) {\n let found = item._child_L._findLowerBound( bkey, comp );\n if ( found !== null ) return found;\n }\n return item;\n }\n else if ( comp( item._key, bkey ) ) {\n // bkey > item.key\n item = item._child_R;\n }\n else {\n // bkey == item.key (等価)\n return item;\n }\n }\n\n return null;\n }\n\n\n /**\n * @summary 上限アイテムを検索\n *\n * @desc\n *

this ツリーの中で comp(bkey, item.key) となる最初のアイテムを検索する。

\n *

つまり bkey より後になるキーが this ツリーに存在すれば、その中で最初のアイテムを返す。

\n *

そのようなアイテムが存在しない場合は null を返す。

\n *

this が T_nil の場合は null を返す。

\n *\n *

計算量: this ツリーのアイテム数 n に対して最悪 O(log n)

\n *\n * @param {mapray.OrderedMap.Key} bkey 境界キー\n * @param {mapray.OrderedMap.Compare} comp キー比較関数\n *\n * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null\n *\n * @private\n */\n _findUpperBound( bkey, comp )\n {\n let item = this;\n\n while ( item !== T_nil ) {\n if ( comp( bkey, item._key ) ) {\n // bkey < item.key\n if ( item._child_L !== T_nil ) {\n let found = item._child_L._findUpperBound( bkey, comp );\n if ( found !== null ) return found;\n }\n return item;\n }\n else {\n // bkey >= item.key\n item = item._child_R;\n }\n }\n\n return null;\n }\n\n\n /**\n * @summary 等価キーのアイテムを検索\n *\n * @desc\n *

this ツリーの中で !comp(key, item.key) かつ !comp(item.key, key) となるアイテムを検索する。

\n *

そのようなアイテムが存在しない場合は null を返す。

\n *

this == T_nil の場合は null を返す。

\n *\n *

計算量: this ツリーのアイテム数 n に対して最悪 O(log n)

\n *\n * @param {mapray.OrderedMap.Key} key キー\n * @param {mapray.OrderedMap.Compare} comp キー比較関数\n *\n * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null\n *\n * @private\n */\n _findEqual( key, comp )\n {\n let item = this;\n\n while ( item !== T_nil ) {\n if ( comp( key, item._key ) ) {\n // key < item.key\n item = item._child_L;\n }\n else if ( comp( item._key, key ) ) {\n // bkey > item.key\n item = item._child_R;\n }\n else {\n // bkey == item.key (等価)\n return item;\n }\n }\n\n return null;\n }\n\n\n /**\n * @summary 下限アイテムを検索 (検討中)\n *\n * @desc\n *

root ツリーの中で !comp(item.key, bkey) となる最初のアイテムを検索する。

\n *

つまり bkey と同じまたは後になるキーが root ツリーに存在すれば、その中で最初のアイテムを返す。

\n *

そのようなアイテムが存在しない場合は null を返す。

\n *\n *

計算量: root ツリーのアイテム数 n に対して最悪 O(log^2 n)

\n *\n * @param {mapray.OrderedMap.Key} bkey 境界キー\n * @param {mapray.OrderedMap.Compare} comp キー比較関数\n *\n * @return {?mapray.OrderedMap.Item} 検索されたアイテム、存在しなければ null\n *\n * @private\n */\n _findLowerBoundR( bkey, comp )\n {\n let item = this;\n\n if ( item._parent !== T_nil ) {\n // item == root\n return item._findLowerBound( bkey, comp );\n }\n\n let imin = item._findMinimum();\n let imax = item._findMaximum();\n\n do {\n if ( !comp( bkey, imin._key ) && !comp( imax._key, bkey ) ) {\n // imin <= bkey <= imax なので\n // item._findLowerBound() で必ず見つかる\n break;\n }\n\n if ( item._parent._child_L === item ) {\n // item は parent の左側なので、登ると imax のみが変化\n imax = item._findMaximum();\n }\n else {\n // item は parent の右側なので、登ると imin のみが変化\n imin = item._findMinimum();\n }\n\n // item は登る\n item = item._parent;\n\n } while ( item._parent !== T_nil );\n // item == root\n\n return item._findLowerBound( bkey, comp );\n }\n\n}\n\n\n// 番兵を生成\nT_nil = new Item();\n\n\n/**\n * @summary キー比較関数\n *\n * @desc\n *

a が b より順序が先なら true を返す。そうでないなら false を返す。

\n *

すべての x について !Compare(x, x) であること。

\n *

Compare(x, y) && Compare(y, z) なら Compare(x, z) であること。

\n *

equiv(a, b) を !Compare(a, b) && !Compare(b, a) と定義するとき、\n * equiv(x, y) && equiv(y, z) なら equiv(x, z) であること。

\n *\n * @param {mapray.OrderedMap.Key} a キー値 a\n * @param {mapray.OrderedMap.Key} b キー値 b\n *\n * @return {boolean} a が b より順序が先なら true, そうでないなら false\n *\n * @callback Compare\n *\n * @memberof mapray.OrderedMap\n * @private\n */\n\n\nexport default OrderedMap;\n","import Interval from \"./Interval\";\nimport OrderedMap from \"../OrderedMap\";\n\n\n/**\n * @summary アニメーション関数値の不変性情報\n *\n * @classdesc\n *

Curve のサブクラスの実装者が、アニメーション関数値が一定となる時刻区間を表明するために利用するクラスである。

\n *\n * @see {@link mapray.animation.Curve#getInvariance}\n *\n * @memberof mapray.animation\n */\nclass Invariance\n{\n\n constructor()\n {\n this._imap = createEmptyMap();\n }\n\n\n /**\n * @summary 複製を取得\n *\n * @desc\n *

this と同じ内容のインスタンスを生成する。

\n *\n *

計算量: 時刻区間数 n に対して O(n)

\n *\n * @return {mapray.animation.Invariance} this の複製\n */\n clone()\n {\n let cloned = new Invariance();\n\n // Time と Interval はイミュータブルなのでシャローコピーで十分\n cloned._imap = this._imap.clone();\n\n return cloned;\n }\n\n\n /**\n * @summary 同一値の時刻区間を上書き\n *\n * @desc\n *

this が持っているすべての同一値時刻区間に interval の時刻区間部分を上書きする。

\n *\n *

イメージ的には interval 部分に毎回新しい色を重ねていく。最終的にできた各色の区間を同一値の時刻区間と見なす。

\n *\n * @param {mapray.animation.Interval} interval 同一値を持つ時刻区間\n *\n * @return {mapray.animation.Invariance} this\n */\n write( interval )\n {\n // todo: 計算量を分析 (remove() に依存)\n\n this.remove( interval );\n this._insert( interval );\n\n return this;\n }\n\n\n /**\n * @summary 時刻区間の消去\n *\n * @desc\n *

this が持っているすべての同一値時刻区間から interval の時刻区間部分を消去する。

\n *\n *

イメージ的には {@link mapray.animation.Invariance#write write()} で重ねた色の\n * interval 部分を透明にする。

\n *\n * @param {mapray.animation.Interval} interval 時刻区間\n *\n * @return {mapray.animation.Invariance} this\n */\n remove( interval )\n {\n // todo: 計算量を分析 (OrderMap#remove() に依存)\n\n if ( interval.isEmpty() ) {\n // 空時刻区間の消去は変化なし\n return this;\n }\n\n // interval.lower 半区間に内包される最初の要素 (無ければ null)\n let fit = interval.l_open ?\n this._imap.findUpper( interval.lower ) :\n this._imap.findLower( interval.lower );\n\n // fit に先行する要素 (無ければ null)\n let pfit = (fit !== null) ? fit.findPredecessor() : this._imap.findLast();\n this._chopItem( pfit, interval );\n\n if ( fit !== null && interval.includes( fit.value ) ) {\n // fit は interval に内包される最初の要素\n\n // interval の後続で最初の要素 (無ければ null)\n let it2 = interval.u_open ?\n this._imap.findLower( interval.upper ) :\n this._imap.findUpper( interval.upper );\n\n // it2 の先行 (非 null)\n let it1 = (it2 !== null) ? it2.findPredecessor() : this._imap.findLast();\n\n // fit の後続で interval に内包されない最初の要素 (無ければ null)\n let lit = interval.includes( it1.value ) ? it2 : it1;\n\n // interval に内包される要素をすべて削除\n this._imap.remove( fit, lit );\n\n // lit は interval と交差している可能性がある\n this._chopItem( lit, interval );\n }\n else {\n // interval はどの時刻区間も内包しない\n\n // fit は interval と交差している可能性がある\n this._chopItem( fit, interval );\n }\n\n return this;\n }\n\n\n /**\n * @summary 選択範囲に絞った不変性情報を取得\n *\n * @desc\n *

interval で指定した選択範囲と交差する一定値時刻区間を選択して、新しい不変性情報のインスタンスを返す。

\n *\n * @param {mapray.animation.Interval} narrow 選択範囲\n *\n * @return {mapray.animation.Invariance} 範囲を狭めた不変性情報\n */\n getNarrowed( narrow )\n {\n const invr = new Invariance();\n\n if ( narrow.isEmpty() ) {\n // 交差しないので空を返す\n return invr;\n }\n\n // narrow と交差する範囲を決定\n const lo1 = this._imap.findUpper( narrow.lower );\n const lo0 = (lo1 !== null) ? lo1.findPredecessor() : this._imap.findLast();\n const lower = (lo0 !== null && lo0.value.hasIntersection( narrow )) ? lo0 : lo1;\n\n const upper = narrow.u_open ?\n this._imap.findLower( narrow.upper ) : \n this._imap.findUpper( narrow.upper );\n\n // invr へ [lower, upper) を追加\n for ( let it = lower; it !== upper; it = it.findSuccessor() ) {\n invr._imap.insert( it.key, it.value );\n }\n\n return invr;\n }\n\n\n /**\n * @summary 複数の Invariance を統合\n *\n * @desc\n *

invariances のすべての同一値時刻区間の共通区間を持った Invariance インスタンスを生成する。

\n *\n * @param {mapray.animation.Invariance[]} invariances 統合元のリスト\n *\n * @return {mapray.animation.Invariance} 統合結果\n */\n static\n merge( invariances )\n {\n let result = new Invariance();\n result.write( Interval.UNIVERSAL );\n\n for ( let source of invariances ) {\n result._merge_from_invariance( source );\n }\n\n return result;\n }\n\n\n /**\n * @summary 時刻区間の配列を取得\n *\n * @desc\n *

Proper の時刻区間が時刻順で格納された配列を返す。

\n *\n * @return {mapray.animation.Interval[]} 時刻区間の配列\n *\n * @package\n */\n _$getArray()\n {\n let array = [];\n\n for ( let it = this._imap.findFirst(); it !== null; it = it.findSuccessor() ) {\n array.push( it.value );\n }\n\n return array;\n }\n\n\n /**\n * @summary 不変性情報を修正\n *\n * @desc\n *

Curve#getInvariance() で得た一部の不変性情報 subinvr を元に this を更新する。

\n *

更新後の this は Curve インスタンス全体の不変性情報と一致することが期待される。

\n *\n * @param {mapray.animation.Invariance} subinvr 更新部分\n *\n * @package\n */\n _$modify( subinvr )\n {\n // subinvr の最初と最後\n let ita = subinvr._imap.findFirst();\n if ( ita === null ) {\n // subinvr は空なので変化なし\n return;\n }\n let itb = subinvr._imap.findLast();\n\n // subinvr の全範囲をくりぬく\n let ai = ita.value;\n let bi = itb.value;\n this.remove( new Interval( ai.lower, bi.upper, ai.l_open, bi.u_open ) );\n\n // subinvr のすべての時刻区間を挿入\n // 計算量: this の要素数 n, subinvr の要素数 m に対して O(m log n)\n for ( let it = ita; it !== null; it = it.findSuccessor() ) {\n this._insert( it.value );\n }\n }\n\n\n /**\n * @summary 時刻区間を整列により拡張\n *\n * @desc\n *

interval の端が this のある区間内にないなら、前または次の区間の境界まで拡大する。

\n *\n *

事前条件: !interval.isEmpty()

\n *\n * @param {mapray.animation.Interval} interval 拡大対象の時刻区間\n *\n * @return {mapray.animation.Interval} 拡大された時刻区間\n *\n * @package\n */\n _$expandIntervalByAlignment( interval )\n {\n const map = this._imap;\n\n // 左側\n let lower; // Interval\n {\n const it1 = map.findLower( interval.lower );\n if ( it1 !== null &&\n it1.value.lower.equals( interval.lower ) &&\n (interval.l_open || !it1.value.l_open) ) {\n // intervalの下限時刻 と it1 の下限時刻が一致し、\n // interval の左端時刻が it1 区間に含まれる\n lower = interval;\n }\n else {\n const it0 = (it1 !== null) ? it1.findPredecessor() : map.findLast();\n if ( it0 !== null ) {\n if ( it0.value.hasIntersection( interval ) ) {\n // interval の左端と it0 が交差する\n lower = interval;\n }\n else {\n // interval の左端と it0 が交差しない\n lower = it0.value.getFollowings();\n }\n }\n else {\n // interval の左端と交差する区間はなく、その左側にも区間がない\n lower = Interval.UNIVERSAL;\n }\n }\n }\n\n // 右側\n let upper; // Interval\n {\n const it1 = map.findLower( interval.upper );\n if ( it1 !== null &&\n interval.upper.equals( it1.value.lower ) &&\n (!interval.u_open || !it1.value.l_open) ) {\n // interval 上限時刻と it1 の下限時刻が一致し、\n // interval の右端時刻が it1 区間に含まれる\n upper = interval;\n }\n else {\n const it0 = (it1 !== null) ? it1.findPredecessor() : map.findLast();\n if ( it0 !== null &&\n it0.value.hasIntersection( interval ) &&\n (interval.upper.lessThan( it0.value.upper ) ||\n interval.upper.equals( it0.value.upper ) &&\n (interval.u_open || !it0.value.u_open)) ) {\n // interval の右端と it0 が交差する\n upper = interval;\n }\n else {\n // interval の右端と it0 が交差しない\n upper = (it1 !== null) ? it1.value.getPrecedings() : Interval.UNIVERSAL;\n }\n }\n }\n\n return new Interval( lower.lower, upper.upper,\n lower.l_open, upper.u_open );\n }\n\n\n /**\n * @summary item から interval 部分を削り取る\n *\n * @desc\n *

item の時刻区間から interval 部分を消去する。

\n *

ただし item が null のときは何もしない。

\n *

最後に item は無効になる。

\n *\n * @param {?mapray.OrderedMap.Item} item\n * @param {mapray.animation.Interval} interval\n *\n * @private\n */\n _chopItem( item, interval )\n {\n if ( item === null ) {\n // 何もしない\n return;\n }\n\n let diffs = item.value.getDifference( interval );\n\n // 削った時刻区間を入れ替え\n this._imap.remove( item );\n\n for ( let di of diffs ) {\n if ( di.isProper() ) {\n this._imap.insert( di.lower, di );\n }\n }\n }\n\n\n /**\n * @summary 時刻区間を挿入\n *\n * @desc\n *

条件: this._imap に interval と交差する区間が存在しない

\n *\n *

計算量: 時刻区間数 n に対して最悪 O(log n)

\n *\n * @param {mapray.animation.Interval} interval 時刻区間\n *\n * @private\n */\n _insert( interval )\n {\n if ( !interval.isProper() ) {\n // Empty と Single の時刻区間は保持しない\n return;\n }\n\n this._imap.insert( interval.lower, interval );\n }\n\n\n /**\n * @summary Invariance を統合\n *\n * 計算量:\n * this の時刻区間数 k\n * source の時刻区間数 n\n * this の各時刻区間範囲内の source の時刻区間数 m (平均値)\n * merged_imap の時刻区間数 p\n *\n * findSuccessor() を O(1) と考えたとき\n * O(k * (m * log p + log n))\n *\n * @param {mapray.animation.Invariance} source\n *\n * @private\n */\n _merge_from_invariance( source )\n {\n let merged_imap = createEmptyMap();\n\n for ( let target = this._imap.findFirst(); target !== null; target = target.findSuccessor() ) {\n mergeIntervalInvariance( target.value, source, merged_imap );\n }\n\n this._imap = merged_imap;\n }\n\n}\n\n\n/**\n * @summary _merge_from_invariance() の一部\n *\n * 計算量:\n * source の時刻区間数 n\n * tgtIv 範囲内の source 時刻区間数 m\n * merged_imap の時刻区間数 p\n *\n * findSuccessor() を O(1) と考えたとき\n * O(m * log p + log n)\n * \n * @param {mapray.animation.Interval} tgtIv 時刻区間\n * @param {mapray.animation.Invariance} source\n * @param {mapray.OrderedMap} merged_imap\n *\n * @private\n */\nfunction\nmergeIntervalInvariance( tgtIv, source, merged_imap )\n{\n let src_imap = source._imap;\n\n // tgtIv の範囲の source 内の時刻区間を決定\n // 計算量: source の時刻区間数 n に対して O(log n)\n let lower = src_imap.findLower( tgtIv.lower );\n let fit = (lower !== null) ? lower.findPredecessor() : null;\n if ( fit === null ) {\n fit = src_imap.findFirst();\n }\n let lit = src_imap.findUpper( tgtIv.upper );\n\n // fit から lit までの時刻区間と tgtIv との交差を merged_imap へ追加\n // 計算量: merged_imap の時刻区間数 p, tgtIv 範囲内の source 時刻区間数 m\n // に対して最悪 O(m * log n * log p)\n for ( let it = fit; it !== lit; it = it.findSuccessor() ) {\n let srcIv = it.value;\n let cross = tgtIv.getIntersection( srcIv );\n if ( cross.isProper() ) {\n merged_imap.insert( cross.lower, cross );\n }\n }\n}\n\n\n/** \n * @summary 空の時刻区間マップを生成\n *\n * @desc\n * Proper 時刻区間が交差せず、時刻順に並んでいる\n * この条件では時刻区間の下限時刻をキーとして整列できる\n *\n * @return {mapray.OrderedMap}\n *\n * @private\n */\nfunction\ncreateEmptyMap()\n{\n return new OrderedMap( (a, b) => a.lessThan( b ) );\n}\n\n\nexport default Invariance;\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var anObject = require('../internals/an-object');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {\n var boundFunction = bind(fn, that, AS_ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, next, step;\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = AS_ENTRIES\n ? boundFunction(anObject(step = iterable[index])[0], step[1])\n : boundFunction(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n\niterate.stop = function (result) {\n return new Result(true, result);\n};\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar create = require('../internals/object-create');\nvar redefineAll = require('../internals/redefine-all');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/define-iterator');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n index: create(null),\n first: undefined,\n last: undefined,\n size: 0\n });\n if (!DESCRIPTORS) that.size = 0;\n if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n var previous, index;\n // change existing entry\n if (entry) {\n entry.value = value;\n // create new entry\n } else {\n state.last = entry = {\n index: index = fastKey(key, true),\n key: key,\n value: value,\n previous: previous = state.last,\n next: undefined,\n removed: false\n };\n if (!state.first) state.first = entry;\n if (previous) previous.next = entry;\n if (DESCRIPTORS) state.size++;\n else that.size++;\n // add to index\n if (index !== 'F') state.index[index] = entry;\n } return that;\n };\n\n var getEntry = function (that, key) {\n var state = getInternalState(that);\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return state.index[index];\n // frozen object case\n for (entry = state.first; entry; entry = entry.next) {\n if (entry.key == key) return entry;\n }\n };\n\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n var that = this;\n var state = getInternalState(that);\n var data = state.index;\n var entry = state.first;\n while (entry) {\n entry.removed = true;\n if (entry.previous) entry.previous = entry.previous.next = undefined;\n delete data[entry.index];\n entry = entry.next;\n }\n state.first = state.last = undefined;\n if (DESCRIPTORS) state.size = 0;\n else that.size = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = this;\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.next;\n var prev = entry.previous;\n delete state.index[entry.index];\n entry.removed = true;\n if (prev) prev.next = next;\n if (next) next.previous = prev;\n if (state.first == entry) state.first = next;\n if (state.last == entry) state.last = prev;\n if (DESCRIPTORS) state.size--;\n else that.size--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n var state = getInternalState(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.next : state.first) {\n boundFunction(entry.value, entry.key, this);\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(this, key);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = getEntry(this, key);\n return entry && entry.value;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key === 0 ? 0 : key, value);\n }\n } : {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return define(this, value = value === 0 ? 0 : value, value);\n }\n });\n if (DESCRIPTORS) defineProperty(C.prototype, 'size', {\n get: function () {\n return getInternalState(this).size;\n }\n });\n return C;\n },\n setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) {\n var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {\n setInternalState(this, {\n type: ITERATOR_NAME,\n target: iterated,\n state: getInternalCollectionState(iterated),\n kind: kind,\n last: undefined\n });\n }, function () {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var entry = state.last;\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n // get next entry\n if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n // or finish the iteration\n state.target = undefined;\n return { value: undefined, done: true };\n }\n // return step by kind\n if (kind == 'keys') return { value: entry.key, done: false };\n if (kind == 'values') return { value: entry.value, done: false };\n return { value: [entry.key, entry.value], done: false };\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(CONSTRUCTOR_NAME);\n }\n};\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.github.io/ecma262/#sec-map-objects\nmodule.exports = collection('Map', function (init) {\n return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","import AnimationError from \"./AnimationError\";\n\n\n/**\n * @summary アニメーション値の型\n *\n * @classdesc\n *

アニメーションする値の型を表現するための抽象クラスである。

\n *

Binder インスタンスと結合するパラメータ値の型と、Curve インスタンスが返却する値の型を表現する。

\n *\n *

Type の具象クラスのインスタンスは {@link mapray.animation.Type.register}()\n * により登録し、{@link mapray.animation.Type.find}() により取得することができる。

\n *\n *

特定の Type の具象クラスのインスタンスは 1 つしか存在しない。そのため Type インスタンスが表す型の同一性は\n * === 演算子で判断することができる。

\n *\n * @abstract\n * @memberof mapray.animation\n */\nclass Type\n{\n\n /**\n * @param {string} name 型の登録名\n * @protected\n */\n constructor( name )\n {\n this._name = name;\n }\n\n\n /**\n * @summary 型名\n *\n * @type {string}\n * @readonly\n */\n get name() { return this._name; }\n\n\n /**\n * @summary 変換可能か?\n *\n * @desc\n *

from 型の値を this 型の値への変換が可能かどうかを返す。

\n *

this と from が同一なら、必ず true を返す。

\n *

このメソッドが true を返した場合は convertValue() により from 型の値を\n * this 型の値に変換することが可能である。

\n *\n * @param {mapray.animation.Type} from 変換元の型\n *\n * @return {boolean} 変換可能かなら true, そうでないなら false\n *\n * @see {@link mapray.animation.Type#convertValue}\n *\n * @abstract\n */\n isConvertible( from )\n {\n this._override_error( \"isConvertible\" );\n }\n\n\n /**\n * @summary 値を変換\n *\n * @desc\n *

value を this 型へ変換したオブジェクトを返す。

\n *

変換結果が value と同じ値の場合、value 自身を返すことも可能である。

\n *\n *

事前条件1: value は from 型のオブジェクトである
\n * 事前条件2: this.isConvertible( from ) == true

\n *\n * @param {mapray.animation.Type} from 変換元の型\n * @param {object} value 変換元の値 (from 型)\n *\n * @return {object} 変換された値 (this 型)\n *\n * @see {@link mapray.animation.Type#isConvertible}\n *\n * @abstract\n */\n convertValue( from, value )\n {\n this._override_error( \"convertValue\" );\n }\n\n\n /**\n * @summary 既定値を取得\n *\n * @desc\n *

this 型の既定値を返す。

\n *\n * @return {object} 既定値 (this 型)\n *\n * @abstract\n */\n getDefaultValue()\n {\n this._override_error( \"getDefaultValue\" );\n }\n\n\n /**\n * @summary 値の複製を取得\n *\n * @desc\n *

value の新しい複製を返す。

\n *

ただし value がイミュータブルの場合、value 自身を返すことも可能である。

\n *\n *

事前条件: value は this 型のオブジェクトである

\n *\n * @param {object} value 複製元の値 (this 型)\n *\n * @return {object} 複製された値 (this 型)\n *\n * @abstract\n */\n getCloneValue( value )\n {\n this._override_error( \"getCloneValue\" );\n }\n\n\n /**\n * @summary 型を登録\n *\n * @desc\n *

名前を name として type 型を登録する。

\n *

登録された type は name により検索することができる。

\n *\n * @param {string} name 型の名前\n * @param {mapray.animation.Type} type Type インスタンス\n *\n * @return {mapray.animation.Type} type\n *\n * @throws {@link mapray.animation.Type.AlreadyRegisteredError} name がすでに登録されているとき\n *\n * @see {@link mapray.animation.Type.find}\n */\n static\n register( name, type )\n {\n if ( type_register_map.has( name ) ) {\n // name はすでに登録済み\n throw new AlreadyRegisteredError( \"specified name (\" + name + \") has already been registered\" );\n }\n\n type_register_map.set( name, type );\n\n return type;\n }\n\n\n /**\n * @summary 型を検索\n *\n * @desc\n *

名前が name として登録された Type インスタンスを返す。

\n *\n *

name の型が登録されている場合、name に対して常に同じインスタンスを返す。\n *\n * @param {string} name 型の名前\n *\n * @return {mapray.animation.Type}\n *\n * @throws {@link mapray.animation.Type.NotRegisteredError} name に対応する型が登録されていないとき\n *\n * @see {@link mapray.animation.Type.register}\n */\n static\n find( name )\n {\n let type = type_register_map.get( name );\n\n if ( type === undefined ) {\n // name は登録されていない\n throw new NotRegisteredError( \"type with the specified name (\" + name + \") is not registered\" );\n }\n\n return type;\n }\n\n\n /**\n * @summary メソッドがオーバーライドされていない\n *\n * arguments.callee と Error#stack は互換性が低いので、関数名の取得に使わなかった\n *\n * @param {string} func_name\n *\n * @private\n */\n _override_error( func_name )\n {\n throw new Error( \"Type#\" + func_name + \"() method has not been overridden in \"\n + this.constructor.name );\n }\n\n}\n\n\n/**\n * @summary 型の多重登録エラー\n *\n * @memberof mapray.animation.Type\n * @extends mapray.animation.AnimationError\n *\n * @see {@link mapray.animation.Type.register}\n */\nclass AlreadyRegisteredError extends AnimationError {\n\n /**\n * @param {string} message エラーの説明\n */\n constructor( message )\n {\n super( message );\n this.name = \"mapray.animation.Type.AlreadyRegisteredError\";\n }\n\n}\nType.AlreadyRegisteredError = AlreadyRegisteredError;\n\n\n/**\n * @summary 型の未登録エラー\n *\n * @memberof mapray.animation.Type\n * @extends mapray.animation.AnimationError\n *\n * @see {@link mapray.animation.Type.find}\n */\nclass NotRegisteredError extends AnimationError {\n\n /**\n * @param {string} message エラーの説明\n */\n constructor( message )\n {\n super( message );\n this.name = \"mapray.animation.Type.NotRegisteredError\";\n }\n\n}\nType.NotRegisteredError = NotRegisteredError;\n\n\n/**\n * @summary 型の登録情報\n *\n * @type {Map.}\n * @readonly\n *\n * @private\n */\nconst type_register_map = new Map();\n\n\nexport default Type;\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Set` constructor\n// https://tc39.github.io/ecma262/#sec-set-objects\nmodule.exports = collection('Set', function (init) {\n return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","module.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n","var toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\n\n// `ToIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length or index');\n return length;\n};\n","// IEEE754 conversions based on https://github.com/feross/ieee754\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = 1 / 0;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = new Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare\n if (number != number || number === Infinity) {\n // eslint-disable-next-line no-self-compare\n mantissa = number != number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n if (number * (c = pow(2, -exponent)) < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent = exponent + eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n buffer[--index] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa = mantissa + pow(2, mantissaLength);\n exponent = exponent - eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.fill` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","'use strict';\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefineAll = require('../internals/redefine-all');\nvar fails = require('../internals/fails');\nvar anInstance = require('../internals/an-instance');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar IEEE754 = require('../internals/ieee754');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar arrayFill = require('../internals/array-fill');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar $DataView = global[DATA_VIEW];\nvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar RangeError = global.RangeError;\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(number, 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key) {\n defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = bytes.slice(start, start + count);\n return isLittleEndian ? pack : pack.reverse();\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = conversion(+value);\n for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n setInternalState(this, {\n bytes: arrayFill.call(new Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) this.byteLength = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = getInternalState(buffer).byteLength;\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n setInternalState(this, {\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength');\n addGetter($DataView, 'buffer');\n addGetter($DataView, 'byteLength');\n addGetter($DataView, 'byteOffset');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n }\n });\n} else {\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new NativeArrayBuffer(); // eslint-disable-line no-new\n new NativeArrayBuffer(1.5); // eslint-disable-line no-new\n new NativeArrayBuffer(NaN); // eslint-disable-line no-new\n return NativeArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new NativeArrayBuffer(toIndex(length));\n };\n var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];\n for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) {\n createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n }\n }\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf($DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var nativeSetInt8 = $DataViewPrototype.setInt8;\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar anObject = require('../internals/an-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar nativeArrayBufferSlice = ArrayBuffer.prototype.slice;\n\nvar INCORRECT_SLICE = fails(function () {\n return !new ArrayBuffer(2).slice(1, undefined).byteLength;\n});\n\n// `ArrayBuffer.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-arraybuffer.prototype.slice\n$({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, {\n slice: function slice(start, end) {\n if (nativeArrayBufferSlice !== undefined && end === undefined) {\n return nativeArrayBufferSlice.call(anObject(this), start); // FF fix\n }\n var length = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n var result = new (speciesConstructor(this, ArrayBuffer))(toLength(fin - first));\n var viewSource = new DataView(this);\n var viewTarget = new DataView(result);\n var index = 0;\n while (first < fin) {\n viewTarget.setUint8(index++, viewSource.getUint8(first++));\n } return result;\n }\n});\n","'use strict';\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar uid = require('../internals/uid');\n\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar isPrototypeOf = ObjectPrototype.isPrototypeOf;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQIRED = false;\nvar NAME;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar isView = function isView(it) {\n var klass = classof(it);\n return klass === 'DataView' || has(TypedArrayConstructorsList, klass);\n};\n\nvar isTypedArray = function (it) {\n return isObject(it) && has(TypedArrayConstructorsList, classof(it));\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (setPrototypeOf) {\n if (isPrototypeOf.call(TypedArray, C)) return C;\n } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n return C;\n }\n } throw TypeError('Target is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n delete TypedArrayConstructor.prototype[KEY];\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n redefine(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n delete TypedArrayConstructor[KEY];\n }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n redefine(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow\n TypedArray = function TypedArray() {\n throw TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQIRED = true;\n defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n } });\n for (NAME in TypedArrayConstructorsList) if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n","/* eslint-disable no-new */\nvar global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar NATIVE_ARRAY_BUFFER_VIEWS = require('../internals/array-buffer-view-core').NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = global.ArrayBuffer;\nvar Int8Array = global.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n","var toInteger = require('../internals/to-integer');\n\nmodule.exports = function (it) {\n var result = toInteger(it);\n if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n return result;\n};\n","var toPositiveInteger = require('../internals/to-positive-integer');\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n","var toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar bind = require('../internals/function-bind-context');\nvar aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, step, iterator, next;\n if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n O = [];\n while (!(step = next.call(iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2], 2);\n }\n length = toLength(O.length);\n result = new (aTypedArrayConstructor(this))(length);\n for (i = 0; length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar anInstance = require('../internals/an-instance');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar toOffset = require('../internals/to-offset');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar typedArrayFrom = require('../internals/typed-array-from');\nvar forEach = require('../internals/array-iteration').forEach;\nvar setSpecies = require('../internals/set-species');\nvar definePropertyModule = require('../internals/object-define-property');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar InternalStateModule = require('../internals/internal-state');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar round = Math.round;\nvar RangeError = global.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\nvar addGetter = function (it, key) {\n nativeDefineProperty(it, key, { get: function () {\n return getInternalState(this)[key];\n } });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n return isTypedArrayIndex(target, key = toPrimitive(key, true))\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n && isObject(descriptor)\n && has(descriptor, 'value')\n && !has(descriptor, 'get')\n && !has(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!has(descriptor, 'writable') || descriptor.writable)\n && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return fromList(TypedArrayConstructor, data);\n } else {\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({\n global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Float32Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Float32', function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Float64Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Float64', function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $copyWithin = require('../internals/array-copy-within');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.copyWithin` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.copywithin\nexportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {\n return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $every = require('../internals/array-iteration').every;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every\nexportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {\n return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $fill = require('../internals/array-fill');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.fill\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n return $fill.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $filter = require('../internals/array-iteration').filter;\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter\nexportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {\n var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $find = require('../internals/array-iteration').find;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find\nexportTypedArrayMethod('find', function find(predicate /* , thisArg */) {\n return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $findIndex = require('../internals/array-iteration').findIndex;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex\nexportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {\n return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.foreach\nexportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {\n $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $includes = require('../internals/array-includes').includes;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.includes\nexportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {\n return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $indexOf = require('../internals/array-includes').indexOf;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.indexof\nexportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {\n return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayIterators = require('../modules/es.array.iterator');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar Uint8Array = global.Uint8Array;\nvar arrayValues = ArrayIterators.values;\nvar arrayKeys = ArrayIterators.keys;\nvar arrayEntries = ArrayIterators.entries;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];\n\nvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\nvar typedArrayValues = function values() {\n return arrayValues.call(aTypedArray(this));\n};\n\n// `%TypedArray%.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.entries\nexportTypedArrayMethod('entries', function entries() {\n return arrayEntries.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.keys\nexportTypedArrayMethod('keys', function keys() {\n return arrayKeys.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.values\nexportTypedArrayMethod('values', typedArrayValues, !CORRECT_ITER_NAME);\n// `%TypedArray%.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype-@@iterator\nexportTypedArrayMethod(ITERATOR, typedArrayValues, !CORRECT_ITER_NAME);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $join = [].join;\n\n// `%TypedArray%.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.join\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('join', function join(separator) {\n return $join.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $lastIndexOf = require('../internals/array-last-index-of');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.lastindexof\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n return $lastIndexOf.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $map = require('../internals/array-iteration').map;\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.map\nexportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {\n return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n return new (aTypedArrayConstructor(speciesConstructor(O, O.constructor)))(length);\n });\n});\n","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduce = require('../internals/array-reduce').left;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce\nexportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {\n return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduceRight = require('../internals/array-reduce').right;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduceRicht` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright\nexportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar floor = Math.floor;\n\n// `%TypedArray%.prototype.reverse` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reverse\nexportTypedArrayMethod('reverse', function reverse() {\n var that = this;\n var length = aTypedArray(that).length;\n var middle = floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toOffset = require('../internals/to-offset');\nvar toObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line no-undef\n new Int8Array(1).set({});\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, FORCED);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar speciesConstructor = require('../internals/species-constructor');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $slice = [].slice;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line no-undef\n new Int8Array(1).slice();\n});\n\n// `%TypedArray%.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice\nexportTypedArrayMethod('slice', function slice(start, end) {\n var list = $slice.call(aTypedArray(this), start, end);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n}, FORCED);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $some = require('../internals/array-iteration').some;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.some\nexportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {\n return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $sort = [].sort;\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n return $sort.call(aTypedArray(this), comparefn);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar fails = require('../internals/fails');\n\nvar Int8Array = global.Int8Array;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $toLocaleString = [].toLocaleString;\nvar $slice = [].slice;\n\n// iOS Safari 6.x fails here\nvar TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {\n $toLocaleString.call(new Int8Array(1));\n});\n\nvar FORCED = fails(function () {\n return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();\n}) || !fails(function () {\n Int8Array.prototype.toLocaleString.call([1, 2]);\n});\n\n// `%TypedArray%.prototype.toLocaleString` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring\nexportTypedArrayMethod('toLocaleString', function toLocaleString() {\n return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);\n}, FORCED);\n","'use strict';\nvar exportTypedArrayMethod = require('../internals/array-buffer-view-core').exportTypedArrayMethod;\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar Uint8Array = global.Uint8Array;\nvar Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};\nvar arrayToString = [].toString;\nvar arrayJoin = [].join;\n\nif (fails(function () { arrayToString.call({}); })) {\n arrayToString = function toString() {\n return arrayJoin.call(this);\n };\n}\n\nvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n// `%TypedArray%.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring\nexportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n","/**\n * @summary 数学ユーティリティー\n *\n * @classdesc\n *

数学関連の関数または定数を定義するユーティリティークラスである。

\n *

このクラスは static メンバーしか持たない。

\n *\n * @hideconstructor\n * @memberof mapray\n * @see mapray.Matrix\n */\nclass GeoMath {\n\n /**\n * @summary 行列オブジェクトを作成\n * @desc\n *

mat を複製する。ただし mat を省略したときは、すべての要素が 0 の行列を生成する。

\n *\n * @param {mapray.Matrix} [mat] 入力行列\n * @return {mapray.Matrix} 新しい行列\n */\n static createMatrix( mat )\n {\n return new Float64Array( mat || 16 );\n }\n\n\n /**\n * @summary 行列 (単精度) オブジェクトを作成\n * @param {mapray.Matrix} [mat] 入力行列\n * @return {mapray.Matrix} 新しい行列\n * @package\n */\n static createMatrixf( mat )\n {\n return new Float32Array( mat || 16 );\n }\n\n\n /**\n * @summary 4 次ベクトルの生成\n * @desc\n *

vec を複製して 4 次ベクトルを生成する。ただし vec を省略したときは、すべての要素が 0 のベクトルを生成する。

\n * @param {mapray.Vector4} [vec] 入力ベクトル\n * @return {mapray.Vector4} 新しいベクトル\n */\n static createVector4( vec )\n {\n return new Float64Array( vec || 4 );\n }\n\n\n /**\n * @summary 4 次ベクトル (単精度) の生成\n * @param {mapray.Vector4} [vec] 入力ベクトル\n * @return {mapray.Vector4} 新しいベクトル\n * @package\n */\n static createVector4f( vec )\n {\n return new Float32Array( vec || 4 );\n }\n\n\n /**\n * @summary 3 次ベクトルの生成\n *

vec を複製して 3 次ベクトルを生成する。ただし vec を省略したときは、すべての要素が 0 のベクトルを生成する。

\n * @param {mapray.Vector3} [vec] 入力ベクトル\n * @return {mapray.Vector3} 新しいベクトル\n */\n static createVector3( vec )\n {\n return new Float64Array( vec || 3 );\n }\n\n\n /**\n * @summary 3 次ベクトル (単精度) の生成\n * @param {mapray.Vector3} [vec] 入力ベクトル\n * @return {mapray.Vector3} 新しいベクトル\n * @package\n */\n static createVector3f( vec )\n {\n return new Float32Array( vec || 3 );\n }\n\n\n /**\n * @summary 2 次ベクトルの生成\n *

vec を複製して 2 次ベクトルを生成する。ただし vec を省略したときは、すべての要素が 0 のベクトルを生成する。

\n * @param {mapray.Vector2} [vec] 入力ベクトル\n * @return {mapray.Vector2} 新しいベクトル\n */\n static createVector2( vec )\n {\n return new Float64Array( vec || 2 );\n }\n\n\n /**\n * @summary 2 次ベクトル (単精度) の生成\n * @param {mapray.Vector2} [vec] 入力ベクトル\n * @return {mapray.Vector2} 新しいベクトル\n * @package\n */\n static createVector2f( vec )\n {\n return new Float32Array( vec || 2 );\n }\n\n\n /**\n * @summary 行列を代入\n * @desc\n *

src を dst に代入する。

\n * @param {mapray.Matrix} src 代入元\n * @param {mapray.Matrix} dst 代入先\n * @return {mapray.Matrix} dst\n */\n static copyMatrix( src, dst )\n {\n for ( var i = 0; i < 16; ++i ) {\n dst[i] = src[i];\n }\n return dst;\n }\n\n\n /**\n * @summary 4 次ベクトルを代入\n * @desc\n *

src を dst に代入する。

\n * @param {mapray.Vector4} src 代入元\n * @param {mapray.Vector4} dst 代入先\n * @return {mapray.Vector4} dst\n */\n static copyVector4( src, dst )\n {\n for ( var i = 0; i < 4; ++i ) {\n dst[i] = src[i];\n }\n return dst;\n }\n\n\n /**\n * @summary 3 次ベクトルを代入\n * @desc\n *

src を dst に代入する。

\n * @param {mapray.Vector3} src 代入元\n * @param {mapray.Vector3} dst 代入先\n * @return {mapray.Vector3} dst\n */\n static copyVector3( src, dst )\n {\n for ( var i = 0; i < 3; ++i ) {\n dst[i] = src[i];\n }\n return dst;\n }\n\n\n /**\n * @summary 2 次ベクトルを代入\n * @desc\n *

src を dst に代入する。

\n * @param {mapray.Vector2} src 代入元\n * @param {mapray.Vector2} dst 代入先\n * @return {mapray.Vector2} dst\n */\n static copyVector2( src, dst )\n {\n dst[0] = src[0];\n dst[1] = src[1];\n return dst;\n }\n\n\n /**\n * @summary 恒等行列を設定\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n static setIdentity( dst )\n {\n dst[ 0] = 1;\n dst[ 1] = 0;\n dst[ 2] = 0;\n dst[ 3] = 0;\n dst[ 4] = 0;\n dst[ 5] = 1;\n dst[ 6] = 0;\n dst[ 7] = 0;\n dst[ 8] = 0;\n dst[ 9] = 0;\n dst[10] = 1;\n dst[11] = 0;\n dst[12] = 0;\n dst[13] = 0;\n dst[14] = 0;\n dst[15] = 1;\n return dst;\n }\n\n\n /**\n * @summary 3 次ベクトルの内積を計算\n * @param {mapray.Vector3} a 左のベクトル\n * @param {mapray.Vector3} b 右のベクトル\n * @return {number} a と b の内積\n */\n static dot3( a, b )\n {\n return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n }\n\n\n /**\n * @summary 3次ベクトルの外積を計算\n * @param {mapray.Vector3} a 左のベクトル\n * @param {mapray.Vector3} b 右のベクトル\n * @param {mapray.Vector3} dst a と b の外積を代入するベクトル\n * @return {mapray.Vector3} dst\n */\n static cross3( a, b, dst )\n {\n var x = a[1]*b[2] - a[2]*b[1];\n var y = a[2]*b[0] - a[0]*b[2];\n var z = a[0]*b[1] - a[1]*b[0];\n dst[0] = x;\n dst[1] = y;\n dst[2] = z;\n return dst;\n }\n\n\n /**\n * @summary 3次ベクトルの正規化を計算\n * @param {mapray.Vector3} vec ベクトル\n * @param {mapray.Vector3} dst 正規化された値を代入するベクトル\n * @return {mapray.Vector3} dst\n */\n static normalize3( vec, dst )\n {\n var x = vec[0];\n var y = vec[1];\n var z = vec[2];\n var ilen = 1 / Math.sqrt( x*x + y*y + z*z ); // 長さの逆数\n dst[0] = vec[0] * ilen;\n dst[1] = vec[1] * ilen;\n dst[2] = vec[2] * ilen;\n return dst;\n }\n\n\n\n static scale3( a, vec, dst )\n {\n dst[0] = a * vec[0];\n dst[1] = a * vec[1];\n dst[2] = a * vec[2];\n return dst;\n }\n\n\n\n /**\n * @summary 行列の積を計算 (アフィン変換 x アフィン変換)\n * @param {mapray.Matrix} a 左の行列\n * @param {mapray.Matrix} b 右の行列\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n static mul_AA( a, b, dst )\n {\n var a00 = a[ 0], a01 = a[ 4], a02 = a[ 8], a03 = a[12],\n a10 = a[ 1], a11 = a[ 5], a12 = a[ 9], a13 = a[13],\n a20 = a[ 2], a21 = a[ 6], a22 = a[10], a23 = a[14];\n \n var b00 = b[ 0], b01 = b[ 4], b02 = b[ 8], b03 = b[12],\n b10 = b[ 1], b11 = b[ 5], b12 = b[ 9], b13 = b[13],\n b20 = b[ 2], b21 = b[ 6], b22 = b[10], b23 = b[14];\n \n dst[ 0] = a00*b00 + a01*b10 + a02*b20;\n dst[ 1] = a10*b00 + a11*b10 + a12*b20;\n dst[ 2] = a20*b00 + a21*b10 + a22*b20;\n dst[ 3] = 0;\n\n dst[ 4] = a00*b01 + a01*b11 + a02*b21;\n dst[ 5] = a10*b01 + a11*b11 + a12*b21;\n dst[ 6] = a20*b01 + a21*b11 + a22*b21;\n dst[ 7] = 0;\n\n dst[ 8] = a00*b02 + a01*b12 + a02*b22;\n dst[ 9] = a10*b02 + a11*b12 + a12*b22;\n dst[10] = a20*b02 + a21*b12 + a22*b22;\n dst[11] = 0;\n\n dst[12] = a00*b03 + a01*b13 + a02*b23 + a03;\n dst[13] = a10*b03 + a11*b13 + a12*b23 + a13;\n dst[14] = a20*b03 + a21*b13 + a22*b23 + a23;\n dst[15] = 1;\n \n return dst;\n }\n\n\n /**\n * @summary 行列の積を計算 (一般変換 x アフィン変換)\n * @param {mapray.Matrix} a 左の行列\n * @param {mapray.Matrix} b 右の行列\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n static mul_GA( a, b, dst )\n {\n var a00 = a[ 0], a01 = a[ 4], a02 = a[ 8], a03 = a[12],\n a10 = a[ 1], a11 = a[ 5], a12 = a[ 9], a13 = a[13],\n a20 = a[ 2], a21 = a[ 6], a22 = a[10], a23 = a[14],\n a30 = a[ 3], a31 = a[ 7], a32 = a[11], a33 = a[15];\n \n var b00 = b[ 0], b01 = b[ 4], b02 = b[ 8], b03 = b[12],\n b10 = b[ 1], b11 = b[ 5], b12 = b[ 9], b13 = b[13],\n b20 = b[ 2], b21 = b[ 6], b22 = b[10], b23 = b[14];\n \n dst[ 0] = a00*b00 + a01*b10 + a02*b20;\n dst[ 1] = a10*b00 + a11*b10 + a12*b20;\n dst[ 2] = a20*b00 + a21*b10 + a22*b20;\n dst[ 3] = a30*b00 + a31*b10 + a32*b20;\n\n dst[ 4] = a00*b01 + a01*b11 + a02*b21;\n dst[ 5] = a10*b01 + a11*b11 + a12*b21;\n dst[ 6] = a20*b01 + a21*b11 + a22*b21;\n dst[ 7] = a30*b01 + a31*b11 + a32*b21;\n\n dst[ 8] = a00*b02 + a01*b12 + a02*b22;\n dst[ 9] = a10*b02 + a11*b12 + a12*b22;\n dst[10] = a20*b02 + a21*b12 + a22*b22;\n dst[11] = a30*b02 + a31*b12 + a32*b22;\n\n dst[12] = a00*b03 + a01*b13 + a02*b23 + a03;\n dst[13] = a10*b03 + a11*b13 + a12*b23 + a13;\n dst[14] = a20*b03 + a21*b13 + a22*b23 + a23;\n dst[15] = a30*b03 + a31*b13 + a32*b23 + a33;\n \n return dst;\n }\n\n\n /**\n * @summary 行列の積を計算 (投影変換 x アフィン変換)\n * @param {mapray.Matrix} a 左の行列\n * @param {mapray.Matrix} b 右の行列\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n static mul_PzA( a, b, dst )\n {\n var a00 = a[ 0], a02 = a[ 8], a03 = a[12];\n var a11 = a[ 5], a12 = a[ 9], a13 = a[13];\n var a22 = a[10], a23 = a[14];\n var a32 = a[11], a33 = a[15];\n \n var b00 = b[ 0], b01 = b[ 4], b02 = b[ 8], b03 = b[12],\n b10 = b[ 1], b11 = b[ 5], b12 = b[ 9], b13 = b[13],\n b20 = b[ 2], b21 = b[ 6], b22 = b[10], b23 = b[14];\n \n dst[ 0] = a00*b00 + a02*b20;\n dst[ 1] = a11*b10 + a12*b20;\n dst[ 2] = a22*b20;\n dst[ 3] = a32*b20;\n\n dst[ 4] = a00*b01 + a02*b21;\n dst[ 5] = a11*b11 + a12*b21;\n dst[ 6] = a22*b21;\n dst[ 7] = a32*b21;\n\n dst[ 8] = a00*b02 + a02*b22;\n dst[ 9] = a11*b12 + a12*b22;\n dst[10] = a22*b22;\n dst[11] = a32*b22;\n\n dst[12] = a00*b03 + a02*b23 + a03;\n dst[13] = a11*b13 + a12*b23 + a13;\n dst[14] = a22*b23 + a23;\n dst[15] = a32*b23 + a33;\n \n return dst;\n }\n\n\n /**\n * @summary 逆行列を計算 (アフィン変換)\n * @param {mapray.Matrix} mat 行列\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n static inverse_A( mat, dst )\n {\n var a00 = mat[ 0], a01 = mat[ 4], a02 = mat[ 8], a03 = mat[12],\n a10 = mat[ 1], a11 = mat[ 5], a12 = mat[ 9], a13 = mat[13],\n a20 = mat[ 2], a21 = mat[ 6], a22 = mat[10], a23 = mat[14];\n\n // cofactors\n var b00 = a11*a22 - a21*a12;\n var b01 = a20*a12 - a10*a22;\n var b02 = a10*a21 - a20*a11;\n\n var b10 = a21*a02 - a01*a22;\n var b11 = a00*a22 - a20*a02;\n var b12 = a20*a01 - a00*a21;\n\n var b20 = a01*a12 - a11*a02;\n var b21 = a10*a02 - a00*a12;\n var b22 = a00*a11 - a10*a01;\n \n var b30 = -(a03*b00 + a13*b10 + a23*b20);\n var b31 = -(a03*b01 + a13*b11 + a23*b21);\n var b32 = -(a03*b02 + a13*b12 + a23*b22);\n\n // 1/det(mat)\n var idet = 1 / (a00*b00 + a01*b01 + a02*b02);\n \n // matの余因子行列 / det(mat)\n dst[ 0] = b00 * idet;\n dst[ 1] = b01 * idet;\n dst[ 2] = b02 * idet;\n dst[ 3] = 0;\n\n dst[ 4] = b10 * idet;\n dst[ 5] = b11 * idet;\n dst[ 6] = b12 * idet;\n dst[ 7] = 0;\n\n dst[ 8] = b20 * idet;\n dst[ 9] = b21 * idet;\n dst[10] = b22 * idet;\n dst[11] = 0;\n\n dst[12] = b30 * idet;\n dst[13] = b31 * idet;\n dst[14] = b32 * idet;\n dst[15] = 1;\n \n return dst;\n }\n\n\n /**\n * @summary 平面ベクトルを変換 (アフィン変換)\n * @desc\n *

mat には平面ベクトルを変換する行列を指定する。\n * 位置ベクトルを変換する行列が M なら、平面ベクトルを変換する行列は M-1 を指定する。

\n *\n *

dst には plane * mat が代入される。

\n *\n * @param mat {mapray.Matrix} 変換行列\n * @param plane {mapray.Vector4} 平面ベクトル\n * @param dst {mapray.Vector4} 結果を代入するベクトル\n * @return {mapray.Vector4} dst\n */\n static transformPlane_A( mat, plane, dst )\n {\n var m = mat;\n var x = plane[0];\n var y = plane[1];\n var z = plane[2];\n var w = plane[3];\n\n dst[0] = x*m[ 0] + y*m[ 1] + z*m[ 2];\n dst[1] = x*m[ 4] + y*m[ 5] + z*m[ 6];\n dst[2] = x*m[ 8] + y*m[ 9] + z*m[10];\n dst[3] = x*m[12] + y*m[13] + z*m[14] + w;\n\n return dst;\n }\n\n\n /**\n * @summary 座標変換行列を計算 (Inou 球面座標系 → 地心直交座標系)\n * @desc\n *

原点が position の直交座標系 (LOCS) から地心直交座標系 (GOCS) に変換する行列を計算する。

\n *

position.height + GeoMath.EARTH_RADIUS > 0 かつ position.latitude == 0 のとき、LOCS の Z 軸は上方向、Y 軸は北方向、X 軸は東方向となる。

\n *\n * @param {object} position 位置 (Inou 球面座標系)\n * @param {number} position.latitude 緯度 (Degrees)\n * @param {number} position.longitude 経度 (Degrees)\n * @param {number} position.height 高度 (Meters)\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n *\n * @deprecated {@link mapray.GeoPoint#getMlocsToGocsMatrix} の使用を推奨\n */\n static iscs_to_gocs_matrix( position, dst )\n {\n var λ = position.longitude * GeoMath.DEGREE;\n var φ = position.latitude * GeoMath.DEGREE;\n var sinλ = Math.sin( λ );\n var cosλ = Math.cos( λ );\n var sinφ = Math.sin( φ );\n var cosφ = Math.cos( φ );\n var r = GeoMath.EARTH_RADIUS + position.height;\n\n // ∂u/∂λ\n dst[ 0] = -sinλ;\n dst[ 1] = cosλ;\n dst[ 2] = 0;\n dst[ 3] = 0;\n\n // ∂u/∂φ\n dst[ 4] = -cosλ * sinφ;\n dst[ 5] = -sinλ * sinφ;\n dst[ 6] = cosφ;\n dst[ 7] = 0;\n\n // u = {x, y, z} / r\n dst[ 8] = cosφ * cosλ;\n dst[ 9] = cosφ * sinλ;\n dst[10] = sinφ;\n dst[11] = 0;\n\n // {x, y, z}\n dst[12] = r * cosφ * cosλ;\n dst[13] = r * cosφ * sinλ;\n dst[14] = r * sinφ;\n dst[15] = 1;\n\n return dst;\n }\n\n\n /**\n * @summary 地心直交座標を Inou 球面座標に変換\n *\n * @param {mapray.Vector3} src 入力 GOCS 座標 (Meters)\n * @param {object} dst 出力 ISCS 座標\n * @param {number} dst.latitude 緯度 (Degrees)\n * @param {number} dst.longitude 経度 (Degrees)\n * @param {number} dst.height 高度 (Meters)\n * @return {object} dst\n *\n * @deprecated {@link mapray.GeoPoint#setFromGocs} の使用を推奨\n */\n static gocs_to_iscs( src, dst )\n {\n var x = src[0];\n var y = src[1];\n var z = src[2];\n\n var x2 = x * x;\n var y2 = y * y;\n var z2 = z * z;\n\n // 緯度 φ = ArcTan[z / √(x^2 + y^2)]\n // 経度 λ = ArcTan[x, y]\n if ( x != 0 || y != 0 ) {\n dst.latitude = Math.atan( z / Math.sqrt( x2 + y2 ) ) / GeoMath.DEGREE;\n dst.longitude = Math.atan2( y, x ) / GeoMath.DEGREE;\n }\n else { // x == 0 && y == 0\n if ( z > 0 )\n dst.latitude = 90;\n else if ( z < 0 )\n dst.latitude = -90;\n else\n dst.latitude = 0;\n\n dst.longitude = 0;\n }\n\n // 高度 h = √(x^2 + y^2 + z^2) - R\n dst.height = Math.sqrt( x2 + y2 + z2 ) - GeoMath.EARTH_RADIUS;\n\n return dst;\n }\n\n\n /**\n * @summary 座標変換行列を計算 (視点座標系 → クリップ同次座標系)\n * @param {number} left\n * @param {number} right\n * @param {number} bottom\n * @param {number} top\n * @param {number} nearVal\n * @param {number} farVal\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n *\n * @see https://www.opengl.org/sdk/docs/man2/xhtml/glFrustum.xml\n */\n static frustum_matrix( left, right, bottom, top, nearVal, farVal, dst )\n {\n dst[ 0] = 2 * nearVal / (right - left);\n dst[ 1] = 0;\n dst[ 2] = 0;\n dst[ 3] = 0;\n\n dst[ 4] = 0;\n dst[ 5] = 2 * nearVal / (top - bottom);\n dst[ 6] = 0;\n dst[ 7] = 0;\n\n dst[ 8] = (right + left) / (right - left);\n dst[ 9] = (top + bottom) / (top - bottom);\n dst[10] = (farVal + nearVal) / (nearVal - farVal);\n dst[11] = -1;\n\n dst[12] = 0;\n dst[13] = 0;\n dst[14] = 2 * farVal * nearVal / (nearVal - farVal);\n dst[15] = 0;\n\n return dst;\n }\n\n\n /**\n * @summary 座標変換行列を計算 (右手座標系 → 視点座標系)\n *\n * @param {mapray.Vector3} eye 視点の位置\n * @param {mapray.Vector3} center 注視点の位置\n * @param {mapray.Vector3} up 上方向ベクトル\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n static lookat_matrix( eye, center, up, dst )\n {\n var xaxis = GeoMath._xaxis;\n var yaxis = GeoMath._yaxis;\n var zaxis = GeoMath._zaxis;\n\n zaxis[0] = eye[0] - center[0];\n zaxis[1] = eye[1] - center[1];\n zaxis[2] = eye[2] - center[2];\n GeoMath.normalize3( zaxis, zaxis );\n\n GeoMath.cross3( up, zaxis, xaxis );\n GeoMath.normalize3( xaxis, xaxis );\n\n GeoMath.cross3( zaxis, xaxis, yaxis ); // 単位ベクトルになっている\n\n dst[ 0] = xaxis[0];\n dst[ 1] = xaxis[1];\n dst[ 2] = xaxis[2];\n dst[ 3] = 0;\n\n dst[ 4] = yaxis[0];\n dst[ 5] = yaxis[1];\n dst[ 6] = yaxis[2];\n dst[ 7] = 0;\n\n dst[ 8] = zaxis[0];\n dst[ 9] = zaxis[1];\n dst[10] = zaxis[2];\n dst[11] = 0;\n\n dst[12] = eye[0];\n dst[13] = eye[1];\n dst[14] = eye[2];\n dst[15] = 1;\n\n return dst;\n }\n\n\n /**\n * @summary 任意軸回りの回転行列\n * @desc\n *

axis を Z 軸方向とすると、X 軸から Y 軸の方向に angle 度回転させる変換行列を返す。

\n * @param {mapray.Vector3} axis 回転軸 (単位ベクトル)\n * @param {number} angle 回転角 (Degrees)\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n static rotation_matrix( axis, angle, dst )\n {\n var θ = angle * GeoMath.DEGREE;\n var sinθ = Math.sin( θ );\n var cosθ = Math.cos( θ );\n\n var ax = axis[0];\n var ay = axis[1];\n var az = axis[2];\n\n dst[ 0] = ax * ax * (1 - cosθ) + cosθ;\n dst[ 1] = ax * ay * (1 - cosθ) + az * sinθ;\n dst[ 2] = ax * az * (1 - cosθ) - ay * sinθ;\n dst[ 3] = 0;\n\n dst[ 4] = ax * ay * (1 - cosθ) - az * sinθ;\n dst[ 5] = ay * ay * (1 - cosθ) + cosθ;\n dst[ 6] = ay * az * (1 - cosθ) + ax * sinθ;\n dst[ 7] = 0;\n\n dst[ 8] = ax * az * (1 - cosθ) + ay * sinθ;\n dst[ 9] = ay * az * (1 - cosθ) - ax * sinθ;\n dst[10] = az * az * (1 - cosθ) + cosθ;\n dst[11] = 0;\n\n dst[12] = 0;\n dst[13] = 0;\n dst[14] = 0;\n dst[15] = 1;\n\n return dst;\n }\n\n\n /**\n * @summary KML 互換のモデル変換行列\n *\n * @desc\n *

変換は scale -> roll -> tilt -> heading の順に行われる。

\n *\n * @param {number} heading Z 軸を中心に Y 軸から X 軸の方向の回転角 (Degrees)\n * @param {number} tilt X 軸を中心に Z 軸から Y 軸の方向の回転角 (Degrees)\n * @param {number} roll Y 軸を中心に X 軸から Z 軸の方向の回転角 (Degrees)\n * @param {mapray.Vector3} scale スケール\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n *\n * @package\n * @see https://developers.google.com/kml/documentation/kmlreference#model\n *\n * @deprecated {@link mapray.Orientation#getTransformMatrix} の使用を推奨\n */\n static kml_model_matrix( heading, tilt, roll, scale, dst )\n {\n var h = heading * GeoMath.DEGREE;\n var t = tilt * GeoMath.DEGREE;\n var r = roll * GeoMath.DEGREE;\n\n var sinH = Math.sin( h );\n var cosH = Math.cos( h );\n var sinT = Math.sin( t );\n var cosT = Math.cos( t );\n var sinR = Math.sin( r );\n var cosR = Math.cos( r );\n\n var sx = scale[0];\n var sy = scale[1];\n var sz = scale[2];\n\n dst[ 0] = sx * (sinH*sinR*sinT + cosH*cosR);\n dst[ 1] = sx * (cosH*sinR*sinT - sinH*cosR);\n dst[ 2] = sx * sinR * cosT;\n dst[ 3] = 0;\n\n dst[ 4] = sy * sinH * cosT;\n dst[ 5] = sy * cosH * cosT;\n dst[ 6] = -sy * sinT;\n dst[ 7] = 0;\n\n dst[ 8] = sz * (sinH*cosR*sinT - cosH*sinR);\n dst[ 9] = sz * (cosH*cosR*sinT + sinH*sinR);\n dst[10] = sz * cosR * cosT;\n dst[11] = 0;\n\n dst[12] = 0;\n dst[13] = 0;\n dst[14] = 0;\n dst[15] = 1;\n\n return dst;\n }\n\n\n /**\n * @summary グーデルマン関数\n * @param {number} x 数値\n * @return {number} gd( x )\n */\n static gudermannian( x )\n {\n return 2 * Math.atan( Math.exp( x ) ) - Math.PI / 2;\n }\n\n\n /** \n * @summary 逆グーデルマン関数\n * @param {number} x 数値\n * @return {number} gd-1( x )\n */\n static invGudermannian( x )\n {\n return Math.log( Math.tan( x / 2 + Math.PI / 4 ) );\n }\n\n\n /**\n * @summary 値を指定区間内に制限\n * @param {number} x 値\n * @param {number} min 最小値\n * @param {number} max 最大値\n * @return {number} min <= x <= max のとき x, x < min のとき min, x > max のとき max\n */\n static clamp( x, min, max )\n {\n return Math.min( Math.max( x, min ), max );\n }\n\n}\n\n\n/**\n * @summary 地球の半径\n * @desc\n *

Inou 球面座標系で定義された、地球の半径 (Meters) である。

\n * @type {number}\n * @constant\n */\nGeoMath.EARTH_RADIUS = 6378137;\n\n\n/**\n * @summary 1度に対応するラジアンの数値\n * @desc\n *

この数値は π / 180 である。

\n *

度数を DEGREE で掛け合せることによってラジアンに変換することができる。

\n * @type {number}\n * @constant\n */\nGeoMath.DEGREE = 0.017453292519943295769;\n\n\n/**\n * @summary log2(π)\n * @type {number}\n * @constant\n */\nGeoMath.LOG2PI = 1.6514961294723187980;\n\n\n/**\n * @summary 4行4列の行列を表現\n * @desc\n *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 16 要素の配列に置き換えることができる。\n * この配列の数値の並びは列優先である。

\n *\n * @class mapray.Matrix\n * @see mapray.GeoMath\n */\n\n\n/**\n * @summary 2次ベクトルを表現\n * @desc\n *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 2 要素の配列に置き換えることができる。

\n *\n * @class mapray.Vector2\n * @see mapray.GeoMath\n */\n\n\n/**\n * @summary 3次ベクトルを表現\n * @desc\n *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 3 要素の配列に置き換えることができる。

\n *\n * @class mapray.Vector3\n * @see mapray.GeoMath\n */\n\n\n/**\n * @summary 4次ベクトルを表現\n * @desc\n *

このクラスは実在しない便宜的なものであり、Array や TypedArray 等の 4 要素の配列に置き換えることができる。

\n *\n * @class mapray.Vector4\n * @see mapray.GeoMath\n */\n\n\n// GeoMath の内部テンポラリ変数を生成\n{\n GeoMath._xaxis = GeoMath.createVector3();\n GeoMath._yaxis = GeoMath.createVector3();\n GeoMath._zaxis = GeoMath.createVector3();\n}\n\n\n/**\n * @summary 球面座標\n *\n * @classdesc\n *

経度、緯度、高度により位置を表現する。

\n *\n * @memberof mapray\n */\nclass GeoPoint {\n\n /**\n * @desc\n *

経度、緯度、高度を与えてインスタンスを生成する。

\n *\n * @param {number} [longitude=0] 経度 (Degrees)\n * @param {number} [latitude=0] 緯度 (Degrees)\n * @param {number} [altitude=0] 高度 (Meters)\n */\n constructor( longitude, latitude, altitude )\n {\n /**\n * @summary 経度 (Degrees)\n * @member mapray.GeoPoint#longitude\n * @type {number}\n */\n this.longitude = (longitude !== undefined) ? longitude : 0;\n\n /**\n * @summary 緯度 (Degrees)\n * @member mapray.GeoPoint#latitude\n * @type {number}\n */\n this.latitude = (latitude !== undefined) ? latitude : 0;\n\n /**\n * @summary 高度 (Meters)\n * @member mapray.GeoPoint#altitude\n * @type {number}\n */\n this.altitude = (altitude !== undefined) ? altitude : 0;\n }\n\n\n /**\n * @summary インスタンスを複製\n *\n * @desc\n *

this の複製を生成して返す。

\n *\n * @return {mapray.GeoPoint} this の複製\n */\n clone()\n {\n return new GeoPoint( this.longitude, this.latitude, this.altitude );\n }\n\n\n /**\n * @summary インスタンスを代入\n *\n * @desc\n *

src を this に代入する。

\n *\n * @param {mapray.GeoPoint} src 代入元\n * @return {mapray.GeoPoint} this\n */\n assign( src )\n {\n this.longitude = src.longitude;\n this.latitude = src.latitude;\n this.altitude = src.altitude;\n\n return this;\n }\n\n\n /**\n * @summary 配列からの設定\n *\n * @desc\n *

longitude, latitude, altitude の順序で格納されている配列 position によりプロパティを設定する。

\n *

position の長さは 2 または 3 で、長さが 2 なら altitude は 0 に設定される。

\n *\n * @param {number[]} position [longitude, latitude, altitude] または [longitude, latitude]\n * @return {mapray.GeoPoint} this\n */\n setFromArray( position )\n {\n this.longitude = position[0];\n this.latitude = position[1];\n this.altitude = (position.length > 2) ? position[2] : 0;\n\n return this;\n }\n\n\n /**\n * @summary 地心直交座標からの設定\n *\n * @desc\n *

地心直交座標 position を球面座標に変換して this に設定する。

\n *\n * @param {mapray.Vector3} position 入力 GOCS 座標 (Meters)\n * @return {mapray.GeoPoint} this\n */\n setFromGocs( position )\n {\n var x = position[0];\n var y = position[1];\n var z = position[2];\n\n var x2 = x * x;\n var y2 = y * y;\n var z2 = z * z;\n\n // 緯度 φ = ArcTan[z / √(x^2 + y^2)]\n // 経度 λ = ArcTan[x, y]\n if ( x != 0 || y != 0 ) {\n this.latitude = Math.atan( z / Math.sqrt( x2 + y2 ) ) / GeoMath.DEGREE;\n this.longitude = Math.atan2( y, x ) / GeoMath.DEGREE;\n }\n else { // x == 0 && y == 0\n if ( z > 0 )\n this.latitude = 90;\n else if ( z < 0 )\n this.latitude = -90;\n else\n this.latitude = 0;\n\n this.longitude = 0;\n }\n\n // 高度 h = √(x^2 + y^2 + z^2) - R\n this.altitude = Math.sqrt( x2 + y2 + z2 ) - GeoMath.EARTH_RADIUS;\n\n return this;\n }\n\n\n /**\n * @summary 地心直交座標として取得\n *\n * @param {mapray.Vector3} dst 結果を格納するオブジェクト\n * @return {mapray.Vector3} dst\n */\n getAsGocs( dst )\n {\n var λ = this.longitude * GeoMath.DEGREE;\n var φ = this.latitude * GeoMath.DEGREE;\n var r = GeoMath.EARTH_RADIUS + this.altitude;\n var cosφ = Math.cos( φ );\n\n dst[0] = r * cosφ * Math.cos( λ );\n dst[1] = r * cosφ * Math.sin( λ );\n dst[2] = r * Math.sin( φ );\n\n return dst;\n }\n\n\n /**\n * @summary 座標変換行列を計算 (MLOCS → GOCS)\n * @desc\n *

原点が this の Mapray ローカル直交座標系 (MLOCS) から地心直交座標系 (GOCS) に変換する行列を計算する。

\n *\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n getMlocsToGocsMatrix( dst )\n {\n var λ = this.longitude * GeoMath.DEGREE;\n var φ = this.latitude * GeoMath.DEGREE;\n var sinλ = Math.sin( λ );\n var cosλ = Math.cos( λ );\n var sinφ = Math.sin( φ );\n var cosφ = Math.cos( φ );\n var r = GeoMath.EARTH_RADIUS + this.altitude;\n\n // ∂u/∂λ\n dst[ 0] = -sinλ;\n dst[ 1] = cosλ;\n dst[ 2] = 0;\n dst[ 3] = 0;\n\n // ∂u/∂φ\n dst[ 4] = -cosλ * sinφ;\n dst[ 5] = -sinλ * sinφ;\n dst[ 6] = cosφ;\n dst[ 7] = 0;\n\n // u = {x, y, z} / r\n dst[ 8] = cosφ * cosλ;\n dst[ 9] = cosφ * sinλ;\n dst[10] = sinφ;\n dst[11] = 0;\n\n // {x, y, z}\n dst[12] = r * cosφ * cosλ;\n dst[13] = r * cosφ * sinλ;\n dst[14] = r * sinφ;\n dst[15] = 1;\n\n return dst;\n }\n\n\n /**\n * @summary 鉛直上方向のベクトルを計算\n *\n * @param {mapray.Vector3} dst 結果を代入するオブジェクト\n * @return {mapray.Vector3} dst\n */\n getUpwardVector( dst )\n {\n var λ = this.longitude * GeoMath.DEGREE;\n var φ = this.latitude * GeoMath.DEGREE;\n var cosφ = Math.cos( φ );\n\n dst[0] = cosφ * Math.cos( λ );\n dst[1] = cosφ * Math.sin( λ );\n dst[2] = Math.sin( φ );\n return dst;\n }\n\n\n /**\n * @summary 地表面(高度0)での2地点間の距離を算出\n * @desc\n *

GeoMath.DEGREE を半径とする真球として計算する。

\n *\n * @param {mapray.GeoPoint} to\n * @return {number} arc 距離(m)\n */\n getGeographicalDistance( to ) {\n var from_vec = this.getAsGocs( GeoMath.createVector3() );\n var to_vec = to.getAsGocs( GeoMath.createVector3() );\n var cross = GeoMath.cross3( from_vec, to_vec, GeoMath.createVector3() );\n return GeoMath.EARTH_RADIUS * Math.atan2(\n Math.sqrt( cross[0]*cross[0] + cross[1]*cross[1] + cross[2]*cross[2] ),\n GeoMath.dot3( from_vec, to_vec )\n );\n }\n\n\n /**\n * @summary 球面座標を地心直交座標に変換\n *\n * @param {number[]} points [lon_0, lat_0, alt_0, ...]\n * @param {number} num_points 点の数\n * @param {number[]} dst [x0, y0, z0, ...] (結果を格納する配列)\n * @return {number[]} dst\n *\n * @see {@link mapray.GeoPoint.getAsGocs}\n */\n static\n toGocsArray( points, num_points, dst )\n {\n var degree = GeoMath.DEGREE;\n var radius = GeoMath.EARTH_RADIUS;\n\n for ( var i = 0; i < num_points; ++i ) {\n var b = 3*i;\n\n var λ = points[b] * degree;\n var φ = points[b + 1] * degree;\n var r = radius + points[b + 2];\n var cosφ = Math.cos( φ );\n\n dst[b] = r * cosφ * Math.cos( λ );\n dst[b + 1] = r * cosφ * Math.sin( λ );\n dst[b + 2] = r * Math.sin( φ );\n }\n\n return dst;\n }\n\n}\n\n\n/**\n * @summary 方向表現\n *\n * @classdesc\n *

heading (機首方位)、tilt (前後の傾き)、roll (左右の傾き) により方向を表現する。

\n *\n * @memberof mapray\n * @see https://developers.google.com/kml/documentation/kmlreference#model\n */\nclass Orientation {\n\n /**\n * @desc\n *

heading, tilt, roll に角度を与えてインスタンスを生成する。

\n *\n * @param {number} [heading=0] 機首方位 (Degrees)\n * @param {number} [tilt=0] 前後の傾き (Degrees)\n * @param {number} [roll=0] 左右の傾き (Degrees)\n */\n constructor( heading, tilt, roll )\n {\n /**\n * @summary 機首方位 (Degrees)\n * @member mapray.Orientation#heading\n * @type {number}\n */\n this.heading = (heading !== undefined) ? heading : 0;\n\n /**\n * @summary 前後の傾き (Degrees)\n * @member mapray.Orientation#tilt\n * @type {number}\n */\n this.tilt = (tilt !== undefined) ? tilt : 0;\n\n /**\n * @summary 左右の傾き (Degrees)\n * @member mapray.Orientation#roll\n * @type {number}\n */\n this.roll = (roll !== undefined) ? roll : 0;\n }\n\n\n /**\n * @summary インスタンスを複製\n *\n * @desc\n *

this の複製を生成して返す。

\n *\n * @return {mapray.Orientation} this の複製\n */\n clone()\n {\n return new Orientation( this.heading, this.tilt, this.roll );\n }\n\n\n /**\n * @summary インスタンスを代入\n *\n * @desc\n *

src を this に代入する。

\n *\n * @param {mapray.Orientation} src 代入元\n * @return {mapray.Orientation} this\n */\n assign( src )\n {\n this.heading = src.heading;\n this.tilt = src.tilt;\n this.roll = src.roll;\n\n return this;\n }\n\n\n /**\n * @summary 変換行列を取得\n *\n * @desc\n *

変換は scale -> roll -> tilt -> heading の順に行われる。

\n *\n * @param {mapray.Vector3} scale スケール\n * @param {mapray.Matrix} dst 結果を代入する行列\n * @return {mapray.Matrix} dst\n */\n getTransformMatrix( scale, dst )\n {\n var h = this.heading * GeoMath.DEGREE;\n var t = this.tilt * GeoMath.DEGREE;\n var r = this.roll * GeoMath.DEGREE;\n\n var sinH = Math.sin( h );\n var cosH = Math.cos( h );\n var sinT = Math.sin( t );\n var cosT = Math.cos( t );\n var sinR = Math.sin( r );\n var cosR = Math.cos( r );\n\n var sx = scale[0];\n var sy = scale[1];\n var sz = scale[2];\n\n dst[ 0] = sx * (sinH*sinR*sinT + cosH*cosR);\n dst[ 1] = sx * (cosH*sinR*sinT - sinH*cosR);\n dst[ 2] = sx * sinR * cosT;\n dst[ 3] = 0;\n\n dst[ 4] = sy * sinH * cosT;\n dst[ 5] = sy * cosH * cosT;\n dst[ 6] = -sy * sinT;\n dst[ 7] = 0;\n\n dst[ 8] = sz * (sinH*cosR*sinT - cosH*sinR);\n dst[ 9] = sz * (cosH*cosR*sinT + sinH*sinR);\n dst[10] = sz * cosR * cosT;\n dst[11] = 0;\n\n dst[12] = 0;\n dst[13] = 0;\n dst[14] = 0;\n dst[15] = 1;\n\n return dst;\n }\n\n}\n\n\nexport default GeoMath;\nexport { GeoPoint, Orientation }; // 下を参照\n\n\n/*\n * 解説: このファイルで GeoPoint クラスと Orientation クラスを定義している理由\n *\n * GeoPoint と Orientation のインタフェースは GeoMath に依存しないが、GeoMath\n * のインタフェースは GeoPoint や Orientation に依存する可能性がある。\n *\n * 一方、GeoPoint と Orientation の内部実装では一部の GeoMath インタフェースを\n * 使用できたほうが都合がよい。\n *\n * GeoPoint と Orientation を個別のファイルで定義したいが、この場合実装のために\n * GeoMath をインポートすることになる。\n *\n * そうすると、GeoMath.js に GeoPoint や Orientation が (循環依存のため)\n * インポートできなくなってしまう。\n *\n * そこで GeoMath.js 内で GeoPoint と Orientation を定義する。これで GeoPoint\n * と Orientation の実装で GeoMath を使用でき、GeoMath のインタフェースと実装で\n * GeoPoint や Orientation を使用できる。\n *\n * GeoPoint はまず GeoMath.js から GeoPoint.js にエクスポートし、さらに\n * GeoPoint.js から GeoPoint を他のファイルにエクスポートする。\n * Orientation も同様のことを行う。\n *\n * このようにすることで、他のファイルからは実装の事情は見えなくなる。\n */\n","import Type from \"./Type_impl.js\";\nimport GeoMath from \"../GeoMath\";\n\n\n/**\n * @summary 真理値型\n *\n * @classdesc\n *

登録名: \"boolean\"

\n *

実装型: boolean

\n *

次の型へ変換可能: {@link mapray.animation.NumberType}

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Type\n * @hideconstructor\n */\nclass BooleanType extends Type\n{\n\n /**\n */\n constructor()\n {\n super( \"boolean\" );\n this._number_type = null;\n this._convertibles = new Set( [this] );\n }\n\n\n /**\n * @private\n */\n _postinit()\n {\n this._number_type = Type.find( \"number\" );\n this._convertibles.add( this._number_type );\n }\n\n\n /**\n * @override\n */\n isConvertible( from )\n {\n return this._convertibles.has( from );\n }\n\n\n /**\n * @override\n */\n convertValue( from, value )\n {\n if ( from === this ) {\n // 同一型\n return value;\n }\n else {\n // assert: from === this._number_type\n return value >= 0.5;\n }\n }\n\n\n /**\n * @override\n */\n getDefaultValue()\n {\n return false;\n }\n\n\n /**\n * @override\n */\n getCloneValue( value )\n {\n return value;\n }\n\n}\n\n\n/**\n * @summary 数値型\n *\n * @classdesc\n *

登録名: \"number\"

\n *

実装型: number

\n *

次の型へ変換可能: {@link mapray.animation.BooleanType}

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Type\n * @hideconstructor\n */\nclass NumberType extends Type\n{\n\n /**\n */\n constructor()\n {\n super( \"number\" );\n this._boolean_type = null;\n this._convertibles = new Set( [this] );\n }\n\n\n /**\n * @private\n */\n _postinit()\n {\n this._boolean_type = Type.find( \"boolean\" );\n this._convertibles.add( this._boolean_type );\n }\n\n\n /**\n * @override\n */\n isConvertible( from )\n {\n return this._convertibles.has( from );\n }\n\n\n /**\n * @override\n */\n convertValue( from, value )\n {\n if ( from === this ) {\n // 同一型\n return value;\n }\n else {\n // assert: from === this._boolean_type\n return value ? 1 : 0;\n }\n }\n\n\n /**\n * @override\n */\n getDefaultValue()\n {\n return 0;\n }\n\n\n /**\n * @override\n */\n getCloneValue( value )\n {\n return value;\n }\n\n}\n\n\n/**\n * @summary 文字列型\n *\n * @classdesc\n *

登録名: \"string\"

\n *

実装型: string

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Type\n * @hideconstructor\n */\nclass StringType extends Type\n{\n\n /**\n */\n constructor()\n {\n super( \"string\" );\n }\n\n\n /**\n * @private\n */\n _postinit()\n {\n }\n\n\n /**\n * @override\n */\n isConvertible( from )\n {\n return from === this;\n }\n\n\n /**\n * @override\n */\n convertValue( from, value )\n {\n return value;\n }\n\n\n /**\n * @override\n */\n getDefaultValue()\n {\n return \"\";\n }\n\n\n /**\n * @override\n */\n getCloneValue( value )\n {\n return value;\n }\n\n}\n\n\n/**\n * @summary 2 次ベクトル型\n *\n * @classdesc\n *

登録名: \"vector2\"

\n *

実装型: {@link mapray.Vector2}

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Type\n * @hideconstructor\n */\nclass Vector2Type extends Type\n{\n\n /**\n */\n constructor()\n {\n super( \"vector2\" );\n }\n\n\n /**\n * @private\n */\n _postinit()\n {\n }\n\n\n /**\n * @override\n */\n isConvertible( from )\n {\n return from === this;\n }\n\n\n /**\n * @override\n */\n convertValue( from, value )\n {\n return value;\n }\n\n\n /**\n * @override\n */\n getDefaultValue()\n {\n return GeoMath.createVector2();\n }\n\n\n /**\n * @override\n */\n getCloneValue( value )\n {\n return GeoMath.createVector2( value );\n }\n\n}\n\n\n/**\n * @summary 3 次ベクトル型\n *\n * @classdesc\n *

登録名: \"vector3\"

\n *

実装型: {@link mapray.Vector3}

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Type\n * @hideconstructor\n */\nclass Vector3Type extends Type\n{\n\n /**\n */\n constructor()\n {\n super( \"vector3\" );\n }\n\n\n /**\n * @private\n */\n _postinit()\n {\n }\n\n\n /**\n * @override\n */\n isConvertible( from )\n {\n return from === this;\n }\n\n\n /**\n * @override\n */\n convertValue( from, value )\n {\n return value;\n }\n\n\n /**\n * @override\n */\n getDefaultValue()\n {\n return GeoMath.createVector3();\n }\n\n\n /**\n * @override\n */\n getCloneValue( value )\n {\n return GeoMath.createVector3( value );\n }\n\n}\n\n\n/**\n * @summary 4 次ベクトル型\n *\n * @classdesc\n *

登録名: \"vector4\"

\n *

実装型: {@link mapray.Vector4}

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Type\n * @hideconstructor\n */\nclass Vector4Type extends Type\n{\n\n /**\n */\n constructor()\n {\n super( \"vector4\" );\n }\n\n\n /**\n * @private\n */\n _postinit()\n {\n }\n\n\n /**\n * @override\n */\n isConvertible( from )\n {\n return from === this;\n }\n\n\n /**\n * @override\n */\n convertValue( from, value )\n {\n return value;\n }\n\n\n /**\n * @override\n */\n getDefaultValue()\n {\n return GeoMath.createVector4();\n }\n\n\n /**\n * @override\n */\n getCloneValue( value )\n {\n return GeoMath.createVector4( value );\n }\n\n}\n\n\n/**\n * @summary 行列型\n *\n * @classdesc\n *

登録名: \"matrix\"

\n *

実装型: {@link mapray.Matrix}

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Type\n * @hideconstructor\n */\nclass MatrixType extends Type\n{\n\n /**\n */\n constructor()\n {\n super( \"matrix\" );\n }\n\n\n /**\n * @private\n */\n _postinit()\n {\n }\n\n\n /**\n * @override\n */\n isConvertible( from )\n {\n return from === this;\n }\n\n\n /**\n * @override\n */\n convertValue( from, value )\n {\n return value;\n }\n\n\n /**\n * @override\n */\n getDefaultValue()\n {\n return GeoMath.setIdentity( GeoMath.createMatrix() );\n }\n\n\n /**\n * @override\n */\n getCloneValue( value )\n {\n return GeoMath.createMatrix( value );\n }\n\n}\n\n\n/**\n * @summary 事前定義型を登録\n *\n * @private\n */\nexport function\nregisterPredefinedTypes()\n{\n const type_classes = [\n BooleanType,\n NumberType,\n StringType,\n Vector3Type,\n Vector2Type,\n Vector4Type,\n MatrixType\n ];\n\n const type_instances = [];\n\n // 型を登録\n for ( let type_class of type_classes ) {\n let type = new type_class();\n Type.register( type.name, type );\n type_instances.push( type );\n }\n\n // 登録後の処理\n for ( let type of type_instances ) {\n type._postinit();\n }\n}\n","import Type from \"./Type_impl.js\";\nimport {registerPredefinedTypes} from \"./predefined_types\";\n\n// Type の使用と同時に事前定義型を使えるようにする\nregisterPredefinedTypes();\n\nexport default Type;\n","/**\n * @summary アニメーション関数\n *\n * @classdesc\n *

指定時刻のアニメーション関数値を取得するための抽象クラスである。

\n *\n * @abstract\n * @memberof mapray.animation\n */\nclass Curve\n{\n\n /**\n * @protected\n */\n constructor()\n {\n this._value_change_listeners = new Set();\n }\n\n\n /**\n * @summary 型はサポートされるか?\n *\n * @desc\n *

type 型がアニメーション関数の返却値の型として使用できるかどうかを返す。

\n *

this の生存中、このメソッドの type に対する結果は一定である。

\n *

このメソッドが true を返した場合、getValue() により\n * アニメーション関数値を type 型で取得することが可能である。

\n *\n * @param {mapray.animation.Type} type 確認する型\n *\n * @return {boolean} type がサポートされるとき true, それ以外は false\n *\n * @see {@link mapray.animation.Curve#getValue}\n *\n * @abstract\n */\n isTypeSupported( type )\n {\n this._override_error( \"isTypeSupported\" );\n }\n\n\n /**\n * @summary 指定時刻の値を取得\n *\n * @desc\n *

時刻 time のアニメーション関数値を type 型として取得する。

\n *\n *

事前条件: this.isTypeSupported( type ) == true

\n *\n * @param {mapray.animation.Time} time 時刻パラメータ\n * @param {mapray.animation.Type} type 返却値の型\n *\n * @return {object} 時刻 time に対する type 型の値\n *\n * @see {@link mapray.animation.Curve#isTypeSupported}\n *\n * @abstract\n */\n getValue( time, type )\n {\n this._override_error( \"getValue\" );\n }\n\n\n /**\n * @summary 不変性情報を取得\n *\n * @desc\n *

interval で指定される範囲の不変性情報を返す。

\n *\n *

不変性情報は interval に内包されるまたは交差する時刻区間を持っている。

\n *

一部が interval と交差する時刻区間はクリップしない。

\n *\n *

事前条件: interval.isEmpty() == false

\n *\n * @param {mapray.animation.Interval} interval 対象とする時刻区間\n *\n * @return {mapray.animation.Invariance} 不変性情報\n *\n * @abstract\n */\n getInvariance( interval )\n {\n this._override_error( \"getInvariance\" );\n }\n\n\n /**\n * @summary 関数値が変化したことを通知\n *\n * @desc\n *

時刻区間 interval の範囲の関数値が変化したことをフレームワークに通知する。

\n *

このメソッドは関数値が変化したときにサブクラスの実装者が呼び出す。

\n *\n * @param {mapray.animation.Interval} interval 関数値が変化した時刻区間\n *\n * @see {@link mapray.animation.Curve#addValueChangeListener}\n * @see {@link mapray.animation.Curve#removeValueChangeListener}\n *\n * @protected\n */\n notifyValueChange( interval )\n {\n if ( interval.isEmpty() ) {\n // 空時刻区間なので実際には変化なし\n // ValueChangeListener の事前条件も満たさない\n return;\n }\n\n // 関数値変化リスナーの呼び出し\n for ( let vcl of this._value_change_listeners ) {\n vcl( interval );\n }\n }\n\n\n /**\n * @summary 関数値変化リスナーの登録\n *\n * @param {mapray.animation.Curve.ValueChangeListener} vcl 関数値変化リスナー\n *\n * @see {@link mapray.animation.Curve#notifyValueChange}\n * @see {@link mapray.animation.Curve#removeValueChangeListener}\n */\n addValueChangeListener( vcl )\n {\n this._value_change_listeners.add( vcl );\n }\n\n\n /**\n * @summary 関数値変化リスナーの登録解除\n *\n * @param {mapray.animation.Curve.ValueChangeListener} vcl 関数値変化リスナー\n *\n * @see {@link mapray.animation.Curve#notifyValueChange}\n * @see {@link mapray.animation.Curve#addValueChangeListener}\n */\n removeValueChangeListener( vcl )\n {\n this._value_change_listeners.delete( vcl );\n }\n\n\n /**\n * @summary メソッドがオーバーライドされていない\n *\n * arguments.callee と Error#stack は互換性が低いので、関数名の取得に使わなかった\n *\n * @param {string} func_name\n *\n * @private\n */\n _override_error( func_name )\n {\n throw new Error( \"Curve#\" + func_name + \"() method has not been overridden in \"\n + this.constructor.name );\n }\n\n}\n\n\n/**\n * @summary アニメーション関数値変化リスナー\n *\n * @desc\n *

アニメーション関数値の変化を監視するためのリスナー関数の型である。

\n *

このリスナーを登録した Curve インスタンスの関数値が変化したときに呼び出される。

\n *

interval は関数値が変化した Curve インスタンスでの時刻範囲である。

\n *\n *

事前条件: interval.isEmpty() == false

\n *\n * @param {mapray.animation.Interval} interval 関数値が変化した時刻区間\n *\n * @callback ValueChangeListener\n *\n * @memberof mapray.animation.Curve\n *\n * @see {@link mapray.animation.Curve#notifyValueChange}\n * @see {@link mapray.animation.Curve#addValueChangeListener}\n * @see {@link mapray.animation.Curve#removeValueChangeListener}\n */\n\n\nexport default Curve;\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","import Interval from \"./Interval\";\nimport Invariance from \"./Invariance\";\nimport OrderedMap from \"../OrderedMap\";\n\n\n/**\n * @summary アニメーションパラメータの更新管理\n *\n * @classdesc\n *

アニメーション関数と結合しているアニメーションパラメータを更新するための機能を提供する。

\n *\n * @memberof mapray.animation\n */\nclass Updater\n{\n\n /**\n */\n constructor()\n {\n // 前回更新した時刻 (一度も更新していないときは null)\n this._prev_time = null;\n\n // Curve -> Tracked 辞書\n this._track_binders = new Map();\n\n // パラメータがまだ更新されていない、またはアニメーション関数値と\n // 矛盾する可能性のある Binder インスタンス\n this._dirty_binders = new Set();\n\n // 関数値が変化した Curve を管理\n this._vary_curves = new VaryCurves();\n }\n\n\n /**\n * @summary アニメーションパラメータを更新\n *\n * @desc\n *

時刻 time でのアニメーション関数値をアニメーションパラメータに設定する。

\n *\n * @param {mapray.animation.Time} time 時刻\n */\n update( time )\n {\n this._update_dirty_binders( time );\n\n if ( this._prev_time !== null ) {\n const vary_curves = this._vary_curves.getVaryCurves( this._prev_time, time );\n for ( let curve of vary_curves ) {\n let tracked = this._track_binders.get( curve );\n tracked.updateBinders( time );\n }\n }\n\n this._flush_dirty_binders();\n\n // 前回の時刻を更新\n this._prev_time = time;\n }\n\n\n /**\n * @summary Binder インスタンスの登録\n *\n * @desc\n *

事前条件: binder は this で管理されていない

\n *\n * @param {mapray.animation.Binder} binder\n *\n * @package\n */\n _$register( binder )\n {\n // 最初は dirty_binders に登録\n this._dirty_binders.add( binder );\n }\n\n\n /**\n * @summary Binder インスタンスの抹消\n *\n * @desc\n *

事前条件: binder は this で管理されている

\n *\n * @param {mapray.animation.Binder} binder\n *\n * @package\n */\n _$unregister( binder )\n {\n if ( this._dirty_binders.delete( binder ) ) {\n // binder は dirty_binders 側に存在していた\n }\n else {\n // binder は track_binders 側に存在する\n let tracked = this._track_binders.get( binder._$curve );\n tracked.unregister( binder );\n }\n }\n\n\n /**\n * @summary _dirty_binders のすべてのパラメータを更新\n *\n * @param {mapray.animation.Time} time\n *\n * @private\n */\n _update_dirty_binders( time )\n {\n for ( let binder of this._dirty_binders ) {\n binder._$update( time );\n }\n }\n\n\n /**\n * @summary _dirty_binders から _track_binders へ Binder を移動\n *\n * @private\n */\n _flush_dirty_binders()\n {\n for ( let binder of Array.from( this._dirty_binders ) ) {\n // dirty_binders から binder を削除\n this._dirty_binders.delete( binder );\n\n // track_binders へ binder を追加\n let curve = binder._$curve;\n let tracked = this._track_binders.get( curve );\n\n if ( tracked === undefined ) {\n // curve を使っている Binder インスタンスが初めて登録される\n tracked = new Tracked( this, curve, binder );\n this._track_binders.set( curve, tracked );\n }\n else {\n // 2つ目以降の Binder インスタンス\n tracked.register( binder );\n }\n }\n }\n\n}\n\n\n/**\n * @summary 追跡されたバインダ\n *\n * @memberof mapray.animation.Updater\n * @private\n */\nclass Tracked {\n\n /**\n * @desc\n *

updater._track_binders に追加されるときに呼び出される。

\n *

updater._vary_curves も更新する。

\n *\n * @param {mapray.animation.Updater} updater this を管理する Updater インスタンス\n * @param {mapray.animation.Curve} curve 対象とする Curve インスタンス\n * @param {mapray.animation.Binder} init_binder 最初の Binder インスタンス\n */\n constructor( updater, curve, init_binder )\n {\n this._updater = updater;\n this._curve = curve;\n\n // curve と結合している Binder インスタンスの集合\n this._binders = new Set( [init_binder] );\n\n // curve の現在の不変性\n this._invariance = curve.getInvariance( Interval.UNIVERSAL );\n\n // アニメーション関数値の変更管理\n this._listener = interval => { this._onValueChange( interval ); };\n curve.addValueChangeListener( this._listener );\n\n // vary_curves に curve を追加\n updater._vary_curves.addCurve( curve, this._invariance );\n }\n\n\n /**\n * @summary Curve を持つ Binder を登録\n *\n * @param {mapray.animation.Binder} binder\n */\n register( binder )\n {\n // Assert: !this._binders.has( binder )\n this._binders.add( binder );\n }\n\n\n /**\n * @summary Curve を持つ Binder を抹消\n *\n * @desc\n *

this が updater._track_binders から削除されることがある。

\n *

curve が updater._vary_curves から削除されることがある。

\n *\n * @param {mapray.animation.Binder} binder\n */\n unregister( binder )\n {\n // Assert: this._binders.has( binder )\n this._binders.delete( binder );\n\n if ( this._binders.size > 0 ) {\n // まだ this._curve と関連した Binder インスタンスが this に存在する\n return;\n }\n\n // this._curve と関連した唯一の Binder インスタンスが this から削除された\n\n // vary_curves から curve を削除\n this._updater._vary_curves.removeCurve( this._curve, this._invariance );\n\n // 変更を追跡する必要はなくなったのでリスナーを削除\n this._curve.removeValueChangeListener( this._listener );\n\n // this を this._updater から削除\n this._updater._track_binders.delete( this._curve );\n }\n\n\n /**\n * @summary アニメーションパラメータを更新\n *\n * @desc\n *

時刻 time でのアニメーション関数値をアニメーションパラメータに設定する。

\n *\n * @param {mapray.animation.Time} time 時刻\n */\n updateBinders( time )\n {\n for ( let binder of this._binders ) {\n binder._$update( time );\n }\n }\n\n\n /**\n * @summary アニメーション間数値が変更された\n *\n * @param {mapray.animation.Interval} chg_ival 変更された時刻区間\n *\n * @private\n */\n _onValueChange( chg_ival )\n {\n // assert: !chg_ival.isEmpty()\n // assert: this._updater._prev_time != null\n\n if ( chg_ival.includesTime( this._updater._prev_time ) ) {\n // 現在設定されているパラメータ値と矛盾が生じる\n // this._binders を dirty_binders に移動\n this._move_to_dirty_binders();\n }\n else {\n // 不変性情報を部分的に更新\n let subinvr = this._curve.getInvariance( chg_ival );\n this._updater._vary_curves.modifyCurve( this._curve, chg_ival, subinvr, this._invariance );\n this._invariance._$modify( subinvr );\n }\n }\n\n\n /**\n * @summary this を dirty_binders に移動\n *\n * @desc\n *

this は updater._track_binders, updater._vary_curves から削除される。

\n *\n * @private\n */\n _move_to_dirty_binders()\n {\n for ( let binder of Array.from( this._binders ) ) {\n // this から binder を削除\n this.unregister( binder );\n // dirty_binders に binder を追加\n this._updater._dirty_binders.add( binder );\n }\n }\n\n}\n\n\n/**\n * @summary 時刻間での関数値が変化した Curve を得る\n *\n * @memberof mapray.animation.Updater\n * @private\n */\nclass VaryCurves {\n\n /**\n */\n constructor()\n {\n // 連続変化の時刻区間 (すべて Proper)\n // OrderedMap\n // 外から内部に入る、内部で動くとき変化する\n // 下限が '[' のとき、左から下限に入る、下限から左へ出るとき変化する\n // 上限が ']' のとき、右から上限に入る、上限から右へ出るとき変化する\n this._continuous = createTimeMap();\n\n // 単発変化の時刻 []\n // OrderedMap>\n // 点を通過、点に入る、点から出るとき変化する\n this._oneshot = createTimeMap();\n\n // 単発変化の時刻 [)\n // OrderedMap>\n // 点を通過、左から点に入る、点から左へ出るとき変化する\n this._oneshot_L = createTimeMap();\n\n // 単発変化の時刻 (]\n // OrderedMap>\n // 点を通過、右から点に入る、点から右へ出るとき変化する\n this._oneshot_R = createTimeMap();\n }\n\n\n /**\n * @summary Curve を追加\n *\n * @desc\n *

データベースに不変性が invariance である curve を追加する。

\n *\n *

事前条件: curve は filter 内に存在しない

\n *\n * @param {mapray.animation.Curve} curve 追加する Curve インスタンス\n * @param {mapray.animation.Invariance} invariance curve の不変性情報\n * @param {mapray.animation.Interval} [filter] 追加する時刻区間 (前回の不変性情報で整列済み)\n */\n addCurve( curve, invariance, filter = Interval.UNIVERSAL )\n {\n const invr_ivals = invariance.getNarrowed( filter )._$getArray();\n\n if ( invr_ivals.length == 0 ) {\n // 全時刻区間が変化\n this._addToGeneric( curve, filter );\n }\n else {\n // 不変区間が存在する場合\n const lastIndex = invr_ivals.length - 1;\n\n // 最初\n {\n const invr_ival = invr_ivals[0];\n const vary_ival = filter.getIntersection( invr_ival.getPrecedings() );\n if ( !vary_ival.isEmpty() ) {\n this._addToGeneric( curve, vary_ival );\n }\n else if ( isSameInterval_L( filter, invr_ival ) &&\n !this._hasContiguous_L( invr_ival, curve ) ) {\n // invr_ival と filter の左が一致して、curve を持った invr_ival の左隣接が存在しない\n if ( invr_ival.l_open ) {\n this._addToOneshotGroup( curve, invr_ival, \"_oneshot_R\" );\n }\n else if ( !invr_ival.getPrecedings().isEmpty() ) {\n this._addToOneshotGroup( curve, invr_ival, \"_oneshot_L\" );\n }\n }\n }\n\n // 中間\n for ( let i = 0; i < lastIndex; ++i ) {\n const lower = invr_ivals[i ].getFollowings();\n const upper = invr_ivals[i + 1].getPrecedings();\n const vary_ival = lower.getIntersection( upper );\n\n if ( vary_ival.isEmpty() ) {\n // lower と upper に間がない\n this._addToOneshotGroup( curve, lower, lower.l_open ?\n \"_oneshot_R\" : \"_oneshot_L\" );\n }\n else {\n // lower と upper に間がある\n this._addToGeneric( curve, vary_ival );\n }\n }\n\n // 最後\n {\n const invr_ival = invr_ivals[lastIndex];\n const vary_ival = filter.getIntersection( invr_ival.getFollowings() );\n if ( !vary_ival.isEmpty() ) {\n this._addToGeneric( curve, vary_ival );\n }\n else if ( isSameInterval_R( filter, invr_ival ) &&\n !this._hasContiguous_R( invr_ival, curve ) ) {\n if ( invr_ival.u_open ) {\n this._addToOneshotGroup( curve, invr_ival, \"_oneshot_L\" );\n }\n else if ( !invr_ival.getFollowings().isEmpty() ) {\n this._addToOneshotGroup( curve, invr_ival, \"_oneshot_R\" );\n }\n }\n }\n }\n }\n\n\n /**\n * @summary interval の左の隣接する区間は存在するか?\n *\n * @desc\n *

continuous の中に interval の左に隣接する区間があり、かつ\n * curve を持っているものは存在するかどうかを返す。

\n *\n * @param {mapray.animation.Interval} interval (!= Φ)\n * @param {mapray.animation.Curve} curve\n *\n * @return {boolean}\n *\n * @private\n */\n _hasContiguous_L( interval, curve )\n {\n const map = this._continuous;\n\n // interval の左のアイテム\n const it1 = map.findLower( interval.lower );\n const it0 = (it1 !== null) ? it1.findPredecessor() : map.findLast();\n\n if ( it0 !== null ) {\n const pred = it0.value; // ContCurves\n const pred_ival = pred.interval;\n\n if ( pred_ival.upper.equals( interval.lower ) &&\n (interval.l_open && !pred_ival.u_open ||\n !interval.l_open && pred_ival.u_open) ) {\n // 隣接している\n if ( pred.curves.has( curve ) ) {\n // 隣接して curve を持っている\n return true;\n }\n }\n }\n\n return false;\n }\n\n\n /**\n * @summary interval の右の隣接する区間は存在するか?\n *\n * @desc\n *

continuous の中に interval の右に隣接する区間があり、かつ\n * curve を持っているものは存在するかどうかを返す。

\n *\n * @param {mapray.animation.Interval} interval (!= Φ)\n * @param {mapray.animation.Curve} curve\n *\n * @return {boolean}\n *\n * @private\n */\n _hasContiguous_R( interval, curve )\n {\n const map = this._continuous;\n\n // interval の右のアイテム\n const it = map.findLower( interval.upper );\n if ( it === null ) {\n // interval の右に区間が存在しない\n return false;\n }\n\n const succ = it.value; // ContCurves\n const succ_ival = succ.interval;\n\n if ( !succ_ival.lower.equals( interval.upper ) ) {\n // 境界が不一致\n return false;\n }\n\n if ( succ_ival.l_open && interval.u_open ||\n !succ_ival.l_open && !interval.u_open ) {\n // 重複または離れている\n return false;\n }\n\n return succ.curves.has( curve );\n }\n\n\n /**\n * @summary Curve を削除\n *\n * @desc\n *

filter 範囲の curve を削除する。filter は整列済みを想定しているので区間の分割は行わない。

\n *\n *

事前条件: curve は invariance と矛盾しない状態で this に存在する

\n *

事前条件: !filter.isEmpty()

\n *\n *

todo: 削除後に隣接区間が同じ集合になったときの統合処理

\n *\n * @param {mapray.animation.Curve} curve 削除する Curve インスタンス\n * @param {mapray.animation.Invariance} invariance curve の不変性情報\n * @param {mapray.animation.Interval} [filter] 削除する時刻区間 (invariance で整列済み)\n */\n removeCurve( curve, invariance, filter = Interval.UNIVERSAL )\n {\n const invr_ivals = invariance.getNarrowed( filter )._$getArray();\n\n if ( invr_ivals.length == 0 ) {\n // filter の全時刻区間が変化\n this._removeForGeneric( curve, filter );\n }\n else {\n // 不変区間が存在する場合\n const lastIndex = invr_ivals.length - 1;\n\n // 最初\n {\n const invr_ival = invr_ivals[0];\n const vary_ival = filter.getIntersection( invr_ival.getPrecedings() );\n if ( !vary_ival.isEmpty() ) {\n this._removeForGeneric( curve, vary_ival );\n }\n else {\n if ( isSameInterval_L( filter, invr_ival ) ) {\n // oneshot_L/R の可能性に対応\n this._removeForOneshotGroup( curve, filter );\n }\n }\n }\n\n // 中間\n for ( let i = 0; i < lastIndex; ++i ) {\n const lower = invr_ivals[i ].getFollowings();\n const upper = invr_ivals[i + 1].getPrecedings();\n const vary_ival = lower.getIntersection( upper );\n\n if ( vary_ival.isEmpty() ) {\n // ai と bi に間がない\n this._removeForOneshotGroup( curve, lower );\n }\n else {\n // ai と bi に間がある\n this._removeForGeneric( curve, vary_ival );\n }\n }\n\n // 最後\n {\n const invr_ival = invr_ivals[lastIndex];\n const vary_ival = filter.getIntersection( invr_ival.getFollowings() );\n if ( !vary_ival.isEmpty() ) {\n this._removeForGeneric( curve, vary_ival );\n }\n else {\n if ( isSameInterval_R( filter, invr_ival ) ) {\n // oneshot_L/R の可能性に対応\n const upper = filter.upper;\n this._removeForOneshotGroup( curve, new Interval( upper, upper ) );\n }\n }\n }\n }\n }\n\n\n /**\n * @summary Curve を変更\n *\n * @param {mapray.animation.Curve} curve\n * @param {mapray.animation.Interval} chg_ival 更新時刻区間 (!= Φ)\n * @param {mapray.animation.Invariance} sub_invr 更新部分の Invariance\n * @param {mapray.animation.Invariance} old_invr 以前の Invariance\n */\n modifyCurve( curve, chg_ival, sub_invr, old_invr )\n {\n // old_invr を基にして chg_ival を整列拡張\n const aligned = old_invr._$expandIntervalByAlignment( chg_ival );\n\n // this のデータベースから aligned 区間の curve を削除\n this.removeCurve( curve, old_invr, aligned );\n\n // aligned 区間で sub_invr を追加\n this.addCurve( curve, sub_invr, aligned );\n }\n\n\n /**\n * @summary 関数値が変化した Curve インスタンス集合を取得\n *\n * @desc\n *

時刻が prev_time から time に連続変化したときに、関数値が変化する可能性のある\n * Curve インスタンスを得るための列挙可能オブジェクトを返す。

\n *\n * @param {mapray.animation.Time} prev_time 始点時刻\n * @param {mapray.animation.Time} time 終点時刻\n *\n * @return {iterable.}\n */\n getVaryCurves( prev_time, time )\n {\n if ( prev_time.lessThan( time ) ) {\n // 順再生\n return this._collectCurves( prev_time, time );\n }\n else if ( time.lessThan( prev_time ) ) {\n // 逆再生\n return this._collectCurves( time, prev_time );\n }\n else {\n // 時刻変わらず\n return [];\n }\n }\n\n\n /**\n * @summary curve を continuous または oneshot へ追加\n *\n * @desc\n *

curve を continuous または oneshot に登録する。\n * ただし interval.isEmpty() のときは何もしない。

\n *\n * @param {mapray.animation.Curve} curve 追加する Curve インスタンス\n * @param {mapray.animation.Interval} interval 変化する時刻区間\n *\n * @private\n */\n _addToGeneric( curve, interval )\n {\n if ( interval.isProper() ) {\n this._addToContinuous( curve, interval );\n }\n else if ( interval.isSingle() ) {\n this._addToOneshotGroup( curve, interval, \"_oneshot\" );\n }\n }\n\n\n /**\n * @summary curve を oneshot 族へ追加\n *\n * @param {mapray.animation.Curve} curve 追加する Curve インスタンス\n * @param {mapray.animation.Interval} interval lower が時刻として使われる\n * @param {string} pname oneshot 族のプロパティ名\n *\n * @private\n */\n _addToOneshotGroup( curve, interval, pname )\n {\n let map = this[pname]; // OrderedMap>\n let time = interval.lower;\n\n let item = map.findEqual( time );\n if ( item === null ) {\n // 新規の時刻\n // 空の Set インスタンスを追加\n item = map.insert( time, new Set() );\n }\n\n item.value.add( curve );\n }\n\n\n /**\n * @summary curve を continuous へ追加\n *\n * @desc\n *

事前条件: interval.isProper()

\n *\n * @param {mapray.animation.Curve} curve 追加する Curve インスタンス\n * @param {mapray.animation.Interval} interval 変化する時刻区間\n *\n * @private\n */\n _addToContinuous( curve, interval )\n {\n // assert: interval.isProper()\n\n // A は追加する連続区間\n // T は登録済みの連続区間 (A と交差する区間の中で一番左側の区間)\n\n // 交差タイプ\n //\n // (1) 登録済みの区間に A と交差する区間はない\n // A: ====\n //\n // (2) T は A の左から飛び出し、右からは飛び出していない\n // A: ====\n // T: ====\n //\n // (3) T は A の右から飛び出し、左からは飛び出していない\n // A: ====\n // T: ====\n //\n // (4) T は A の左右どちらからも飛び出している\n // A: ===\n // T: =====\n //\n // (5) T は A の左右どちらからも飛び出していない\n // A: =====\n // T: ===\n\n // 記号の意味\n //\n // $X は X.getPrecedings()\n // X$ は X.getFollowings()\n\n let A_ival = interval; // A\n let A_curve = curve;\n\n for (;;) {\n // assert: A != Φ\n\n let target = this._removeFirstCrossInContinuous( A_ival );\n\n if ( target !== null ) {\n let T_ival = target.cc.interval; // T: A と交差する区間で一番左側の区間\n let T_curves = target.cc.curves; // T の Curve インタンス集合\n let A_x_T = target.cross; // A∩T\n\n let $A_x_T = A_ival.getPrecedings().getIntersection( T_ival ); // $A∩T\n\n if ( $A_x_T.isEmpty() ) {\n // 交差タイプ (3) または (5)\n\n let A_x_$T = A_ival.getIntersection( T_ival.getPrecedings() ); // A∩$T\n if ( !A_x_$T.isEmpty() ) {\n // (d) A∩$T != Φ なら、A∩$T として、A_curve を新規登録\n this._addForContinuous( A_x_$T, A_curve );\n }\n }\n else {\n // 交差タイプ (2) または (4)\n\n // (b) $A∩T として、T_curves を新規登録\n this._addForContinuous( $A_x_T, new Set( T_curves ) );\n }\n\n let A$_x_T = A_ival.getFollowings().getIntersection( T_ival ); // A$∩T\n\n if ( A$_x_T.isEmpty() ) {\n // 交差タイプ (2) または (5)\n \n // (a) A∩T として、T_curves に A_curve を加えた集合を新規登録\n this._addForContinuous( A_x_T, T_curves.add( A_curve ) );\n\n // (z) A∩T$ != Φ なら、A を A∩T$ として再処理\n let A_x_T$ = A_ival.getIntersection( T_ival.getFollowings() ); // A∩T$\n\n if ( !A_x_T$.isEmpty() ) {\n A_ival = A_x_T$;\n continue;\n }\n }\n else {\n // 交差タイプ (3) または (4)\n\n // (c) A$∩T として、T_curves を新規登録\n this._addForContinuous( A$_x_T, new Set( T_curves ) );\n\n // (a) A∩T として、T_curves に A_curve を加えた集合を新規登録\n this._addForContinuous( A_x_T, T_curves.add( A_curve ) );\n }\n }\n else {\n // 交差タイプ (1)\n\n // A として、A_curve を新規登録\n this._addForContinuous( A_ival, A_curve );\n }\n\n break;\n }\n }\n\n\n /**\n * @summary 最初に interval と交差する要素を削除\n *\n * @desc\n *

\n *

this._continuous 内の時刻区間の中から、最初に interval と交差する要素を削除しする。\n * その交差区間と要素が持っていた ContCurves インスタンスを返す。

\n *

ただし、交差する区間が存在しなければ null を返す。

\n *\n * @param {mapray.animation.Interval} interval 時刻区間\n *\n * @return {!object} { cc: ContCurves, cross: Interval }\n *\n * @private\n */\n _removeFirstCrossInContinuous( interval )\n {\n let map = this._continuous; // 各区間は Proper 前提\n\n let t1 = map.findUpper( interval.lower );\n let t0 = (t1 !== null) ? t1.findPredecessor() : map.findLast();\n\n if ( t0 !== null ) {\n let cross = interval.getIntersection( t0.value.interval );\n if ( !cross.isEmpty() ) {\n let cc = t0.value;\n map.remove( t0 );\n return { cc, cross };\n }\n }\n\n if ( t1 !== null ) {\n let cross = interval.getIntersection( t1.value.interval );\n if ( !cross.isEmpty() ) {\n let cc = t1.value;\n map.remove( t1 );\n return { cc, cross };\n }\n }\n\n // 交差は存在しない\n return null;\n }\n\n\n /**\n * @summary curves を continuous または oneshot へ追加\n *\n * @desc\n *

interval.isSingle() のときは curves を this._oneshot の Curve 集合に追加する。

\n *

interval.isProper() のときは ContCurves インスタンスを新規に this._continuous へ追加する。

\n *\n *

事前条件: !interval.isEmpty()

\n *\n * @param {mapray.animation.Interval} interval 時刻区間、または時刻 (lower を時刻とする)\n * @param {mapray.animation.Curve|Set} curves 追加する Curve インスタンス、またはその集合\n *\n * @private\n */\n _addForContinuous( interval, curves )\n {\n let time = interval.lower; // 時刻へ変換\n\n if ( interval.isSingle() ) {\n // oneshot: curves を Curve 集合へ追加\n let it = this._oneshot.findEqual( time );\n if ( it === null ) {\n // 新規の時刻\n // 空の Set インスタンスを追加\n it = this._oneshot.insert( time, new Set() );\n }\n\n let dst_set = it.value;\n\n if ( curves instanceof Set ) {\n // 複数 Curve\n for ( let curve of curves ) {\n dst_set.add( curve );\n }\n }\n else {\n // 単一 Curve\n dst_set.add( curves );\n }\n }\n else {\n // continuous: curves を新規追加\n this._continuous.insert( time, new ContCurves( interval, curves ) );\n }\n }\n\n\n /**\n * @summary curve を continuous または oneshot から削除\n *\n * @desc\n *

curve を continuous または oneshot から削除するe。\n * ただし interval.isEmpty() のときは何もしない。

\n *\n * @param {mapray.animation.Curve} curve 削除する Curve インスタンス\n * @param {mapray.animation.Interval} interval 変化する時刻区間\n *\n * @private\n */\n _removeForGeneric( curve, interval )\n {\n if ( interval.isProper() ) {\n this._removeForContinuous( curve, interval );\n }\n else if ( interval.isSingle() ) {\n this._removeForOneshotGroup( curve, interval );\n }\n }\n\n\n /**\n * @summary curve を oneshot 族から削除\n *\n * @desc\n *

ある oneshot 族の時刻 interval.lower に curve\n * が存在すれば削除し、存在しなければ何もしない。

\n *\n * @param {mapray.animation.Curve} curve 削除する Curve インスタンス\n * @param {mapray.animation.Interval} interval lower が時刻として使われる\n *\n * @private\n */\n _removeForOneshotGroup( curve, interval )\n {\n const time = interval.lower;\n\n for ( const pname of [\"_oneshot\", \"_oneshot_L\", \"_oneshot_R\"] ) {\n const map = this[pname]; // OrderedMap>\n const item = map.findEqual( time );\n\n if ( item !== null ) {\n const curves = item.value;\n\n // curve を削除し、空になったら curves も削除\n if ( curves.has( curve ) ) {\n curves.delete( curve );\n if ( curves.size == 0 ) {\n map.remove( item );\n }\n }\n\n // curve は複数に所属することはないので、1つ削除したら終了\n break;\n }\n }\n }\n\n\n /**\n * @summary curves を continuous または oneshot から削除\n *\n * @desc\n *

interval 区間にある continuous と oneshot の curve を削除する。

\n *

事前条件: interval.isProper()

\n *\n * @param {mapray.animation.Curve} curve 削除する Curve インスタンス\n * @param {mapray.animation.Interval} interval 時刻区間\n *\n * @private\n */\n _removeForContinuous( curve, interval )\n {\n // this._continuous\n {\n let map = this._continuous; // 各区間は Proper 前提\n let it1 = map.findUpper( interval.lower );\n let it0 = (it1 !== null) ? it1.findPredecessor() : map.findLast();\n let end = map.findUpper( interval.upper );\n\n for ( let it = (it0 || it1); it !== end; ) {\n let curves = it.value.curves;\n curves.delete( curve );\n it = (curves.size == 0) ? map.remove( it ) : it.findSuccessor();\n }\n }\n\n // this._oneshot\n {\n let map = this._oneshot;\n let it0 = map.findLower( interval.lower );\n let end = map.findUpper( interval.upper );\n\n for ( let it = it0; it !== end; ) {\n let curves = it.value;\n curves.delete( curve );\n it = (curves.size == 0) ? map.remove( it ) : it.findSuccessor();\n }\n }\n }\n\n\n /**\n * @summary Curve インスタンスを収集\n *\n * @desc\n * 事前条件: t1.lessThan( t2 )\n *\n * @param {mapray.animation.Time} t1\n * @param {mapray.animation.Time} t2\n *\n * @return {iterable.}\n *\n * @private\n */\n _collectCurves( t1, t2 )\n {\n let curves = new Set(); // Set\n\n this._collectContinuousCurves( t1, t2, curves );\n this._collectOneshotCurves( t1, t2, \"_oneshot\", true, true, curves );\n this._collectOneshotCurves( t1, t2, \"_oneshot_L\", false, true, curves );\n this._collectOneshotCurves( t1, t2, \"_oneshot_R\", true, false, curves );\n\n return curves;\n }\n\n\n /**\n * @summary continuous から Curve インスタンスを収集\n *\n * @desc\n * 事前条件: t1.lessThan( t2 )\n *\n * @param {mapray.animation.Time} t1\n * @param {mapray.animation.Time} t2\n * @param {Set.} curves\n *\n * @private\n */\n _collectContinuousCurves( t1, t2, curves )\n {\n // 時刻区間 [t1, ∞) と交差する最初の時刻区間\n let it_A = this._continuous.findLower( t1 );\n if ( it_A !== null ) {\n // it_A != null でも、時刻区間 Pred と交差している可能性もある\n let it_Pred = it_A.findPredecessor();\n if ( it_Pred !== null ) {\n if ( it_Pred.value.interval.includesTime( t1 ) ) {\n // Pred と [t1, ∞) が交差するので it_Pred に置き換える\n it_A = it_Pred;\n }\n }\n }\n else {\n // it_A == null でも、時刻区間 Last と交差している可能性がある\n let it_Last = this._continuous.findLast();\n if ( it_Last !== null ) {\n if ( it_Last.value.interval.includesTime( t1 ) ) {\n // Last と [t1, ∞) が交差するので it_Last に置き換える\n it_A = it_Last;\n }\n }\n }\n\n // 時刻区間 (∞, t2] と交差する最後の時刻区間の直後\n let it_Z = this._continuous.findLower( t2 );\n if ( it_Z !== null ) {\n let Z_ival = it_Z.value.interval;\n if ( Z_ival.lower.equals( t2 ) && !Z_ival.l_open ) {\n // it_Z の最小時刻がギリギリ (∞, t2] に入るので it_Z の直後を選ぶ\n it_Z = it_Z.findSuccessor();\n }\n }\n\n // assert: it_A != null || it_Z == null\n\n // Curve インスタンスを収集\n for ( let it = it_A; it !== it_Z; it = it.findSuccessor() ) {\n for ( let curve of it.value.curves ) {\n curves.add( curve );\n }\n }\n }\n\n\n /**\n * @summary oneshot から Curve インスタンスを収集\n *\n * @desc\n * 事前条件: t1.lessThan( t2 )\n *\n * @param {mapray.animation.Time} t1\n * @param {mapray.animation.Time} t2\n * @param {string} pname\n * @param {boolean} closed1\n * @param {boolean} closed2\n * @param {Set.} curves\n *\n * @private\n */\n _collectOneshotCurves( t1, t2, pname, closed1, closed2, curves )\n {\n let map = this[pname]; // OrderedMap>\n\n // 時刻区間 [t1, ∞) に含まれる最初の時刻\n let it_A = closed1 ? map.findLower( t1 ) : map.findUpper( t1 );\n\n // 時刻区間 (∞, t2] に含まれる最後の時刻区間の直後\n let it_Z = closed1 ? map.findUpper( t2 ) : map.findLower( t2 );\n\n // assert: it_A != null || it_Z == null\n\n // Curve インスタンスを収集\n for ( let it = it_A; it !== it_Z; it = it.findSuccessor() ) {\n for ( let curve of it.value ) {\n curves.add( curve );\n }\n }\n }\n\n}\n\n\n/**\n * summary VaryCurves#continuous の値\n *\n * @memberof mapray.animation.Updater.VaryCurves\n * @private\n */\nclass ContCurves {\n\n /**\n * @param {mapray.animation.Interval} interval 継続的に変化する時刻区間\n * @param {mapray.animation.Curve|Set} curves 初期の Curve インスタンス、またはその集合\n */\n constructor( interval, curves )\n {\n // assert: interval.isProper()\n this.interval = interval;\n this.curves = new Set( (curves instanceof Set) ? curves : [curves] );\n }\n\n}\n\n\n/**\n * @summary Time を昇順に順序付ける辞書を生成\n *\n * @private\n */\nfunction\ncreateTimeMap()\n{\n return new OrderedMap( (a, b) => a.lessThan( b ) );\n}\n\n\n/**\n * @summary a と b の左側は同じか?\n *\n * @param {mapray.animation.Interval} a\n * @param {mapray.animation.Interval} b\n *\n * @private\n */\nfunction\nisSameInterval_L( a, b )\n{\n return a.lower.equals( b.lower ) && (a.l_open && b.l_open || !a.l_open && !b.l_open);\n}\n\n\n/**\n * @summary a と b の右側は同じか?\n *\n * @param {mapray.animation.Interval} a\n * @param {mapray.animation.Interval} b\n *\n * @private\n */\nfunction\nisSameInterval_R( a, b )\n{\n return a.upper.equals( b.upper ) && (a.u_open && b.u_open || !a.u_open && !b.u_open);\n}\n\n\nexport default Updater;\n","import AnimationError from \"./AnimationError\";\n\n\n/**\n * @summary 型不一致エラー\n *\n * @memberof mapray.animation\n * @extends mapray.animation.AnimationError\n *\n * @see {@link mapray.animation.Binder}\n */\nclass TypeMismatchError extends AnimationError {\n\n /**\n * @param {string} message エラーの説明\n */\n constructor( message )\n {\n super( message );\n this.name = \"mapray.animation.TypeMismatchError\";\n }\n\n}\n\n\nexport default TypeMismatchError;\n","import TypeMismatchError from \"./TypeMismatchError\";\n\n\n/**\n * @summary アニメーションパラメータの結合\n *\n * @classdesc\n *

パラメータ、Curve インスタンス、Updater インスンタンスを結合する。

\n *\n * @see {@link mapray.animation.Curve}\n * @see {@link mapray.animation.Updater}\n *\n * @memberof mapray.animation\n */\nclass Binder\n{\n\n /**\n * @desc\n *

パラメータと curve と updater を結合する。

\n *

パラメータ値は setter を通して設定される。

\n *

setter には type 型の値が渡される。

\n *\n * @param {mapray.animation.Updater} updater アニメーションパラメータの更新管理\n * @param {mapray.animation.Curve} curve アニメーション関数\n * @param {mapray.animation.Type} type パラメータ値の型\n * @param {mapray.animation.Binder.Setter} setter パラメータ設定関数\n *\n * @throws {@link mapray.animation.TypeMismatchError} curve が type 型をサポートしていないとき\n */\n constructor( updater, curve, type, setter )\n {\n if ( !curve.isTypeSupported( type ) ) {\n throw new TypeMismatchError( \"type mismatch error\" );\n }\n\n this._updater = updater;\n this._curve = curve;\n this._type = type;\n this._setter = setter;\n\n // updater に this を登録\n updater._$register( this );\n }\n\n\n /**\n * @summary アニメーションパラメータの更新管理\n *\n * @type {mapray.animation.Updater}\n * @readonly\n */\n get updater() { return this._updater; }\n\n\n /**\n * @summary アニメーション関数\n *\n * @type {mapray.animation.Curve}\n * @readonly\n */\n get curve() { return this._curve; }\n\n\n /**\n * @summary パラメータ値の型\n *\n * @type {mapray.animation.Type}\n * @readonly\n *\n * @see {@link mapray.animation.Binder.Setter}\n */\n get type() { return this._type; }\n\n\n /**\n * @summary パラメータ設定関数\n *\n * @type {mapray.animation.Binder.Setter}\n * @readonly\n */\n get setter() { return this._setter; }\n\n\n /**\n * @summary 結合を解除\n */\n unbind()\n {\n // updater から this を抹消\n this._updater._$unregister( this );\n }\n\n\n /**\n * @summary アニメーション関数\n *\n * @type {mapray.animation.Curve}\n * @readonly\n *\n * @package\n */\n get\n _$curve()\n {\n return this._curve;\n }\n\n\n /**\n * @summary アニメーションパラメータを更新\n *\n * @desc\n *

時刻 time でのアニメーション関数値をアニメーションパラメータに設定する。

\n *\n * @param {mapray.animation.Time} time 時刻\n *\n * @package\n */\n _$update( time )\n {\n let value = this._curve.getValue( time, this._type );\n let setter = this._setter;\n setter( value );\n }\n\n}\n\n\n/**\n * @summary パラメータ設定関数\n *\n * @desc\n *

Binder インスタンスの type 型のオブジェクトを受け取り、実際のパラメータを設定するための関数である。

\n *\n * @param {object} value type 型のオブジェクト\n *\n * @callback Setter\n *\n * @memberof mapray.animation.Binder\n *\n * @see {@link mapray.animation.Binder}\n * @see {@link mapray.animation.Binder#setter}\n * @see {@link mapray.animation.Binder#type}\n */\n\n\nexport default Binder;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","/**\n * @summary アニメーション設定の標準インタフェース\n *\n * @classdesc\n *

オブジェクトのアニメーション可能パラメータにアニメーションを設定 (バインド)\n + するための標準的なインタフェースを提供する。

\n *\n *

具体的には内部で各パラメータに適した {@link mapray.animation.Binder Binder}\n * インスタンスの生成し、ユーザーが簡単にアニメーションを設定できるようにする。

\n *\n *

一般的に、アニメーション可能パラメータを持つオブジェクトの animation\n * プロパティから、このインタフェースを得ることができる。

\n *\n *

注意: アニメーションを設定しているパラメータは\n * {@link mapray.animation.Updater Updater} のメソッドを通してのみ更新することができる。\n * それ以外の手段でパラメータを更新した場合はパラメータ値に矛盾が生じる可能性がある。

\n *\n * @see {@link mapray.animation.Binder}\n * @see {@link mapray.animation.Updater}\n *\n * @memberof mapray.animation\n * @abstract\n */\nclass BindingBlock\n{\n\n /**\n * @protected\n */\n constructor()\n {\n }\n\n\n /**\n * @summary アニメーション可能パラメータの情報を取得\n *\n * @desc\n *

アニメーションに対応したパラメータの情報を配列として取得する。

\n *

返される配列は 0 個またはそれ以上の要素を含み、要素間のパラメータ ID は重複しない。

\n *

this の生存期間中、(順序以外) 常に同じ内容を返す。

\n *\n * @return {mapray.animation.BindingBlock.Parameter[]}\n *\n * @abstract\n */\n enumSupportedParameters()\n {\n this._override_error( \"enumSupportedParameters\" );\n }\n\n\n /**\n * @summary パラメータは結合中か?\n *\n * @desc\n *

id が示すパラメータが結合されているとき true, 結合されていないとき false を返す。

\n *

ただし id が示すパラメータがアニメーションに対応していないときは false を返す。

\n *\n * @param {string} id パラメータ ID\n *\n * @return {boolean}\n *\n * @abstract\n */\n isBound( id )\n {\n this._override_error( \"isBound\" );\n }\n\n\n /**\n * @summary パラメータに結合されている Updater インスタンスを取得\n *\n * @desc\n *

id が示すパラメータが結合されている Updater インスタンスを返す。

\n *

ただし this.isBound( id ) == false のときは null を返す。

\n *\n * @param {string} id パラメータ ID\n *\n * @return {?mapray.animation.Updater}\n *\n * @abstract\n */\n getBoundUpdater( id )\n {\n this._override_error( \"getBoundUpdater\" );\n }\n\n\n /**\n * @summary パラメータに結合されている Curve インスタンスを取得\n *\n * @desc\n *

id が示すパラメータが結合されている Curve インスタンスを返す。

\n *

ただし this.isBound( id ) == false のときは null を返す。

\n *\n * @param {string} id パラメータ ID\n *\n * @return {?mapray.animation.Curve}\n *\n * @abstract\n */\n getBoundCurve( id )\n {\n this._override_error( \"getBoundCurve\" );\n }\n\n\n /**\n * @summary パラメータにアニメーションを結合\n *\n * @desc\n *

id が示すパラメータと updater と curve を結びつける。ただし、すでに id\n * が示すパラメータに結合があれば、先にその結合を解除してから行う。

\n *\n *

パラメータが結合されている間、updater によりそのパラメータを更新することができる。

\n *\n * @param {string} id パラメータ ID\n * @param {mapray.animation.Updater} updater アニメーションパラメータ更新管理\n * @param {mapray.animation.Curve} curve アニメーション関数\n *\n * @throws {@link mapray.animation.AnimationError}\n * id が示すパラメータはアニメーションに対応していない\n *\n * @throws {@link mapray.animation.TypeMismatchError}\n * id が示すパラメータの型と curve の型に互換性がないとき\n *\n * @see {@link mapray.animation.Binder}\n *\n * @abstract\n */\n bind( id, updater, curve )\n {\n this._override_error( \"bind\" );\n }\n\n\n /**\n * @summary パラメータの結合を解除\n *\n * @desc\n *

id が示すパラメータの結合を解除する。

\n *

ただし this.isBound( id ) == false のときは何もしない。

\n *\n * @param {string} id パラメータ ID\n *\n * @abstract\n */\n unbind( id )\n {\n this._override_error( \"unbind\" );\n }\n\n\n /**\n * @summary すべてのパラメータの結合を解除\n *\n * @desc\n *

現在結合されているすべてのパラメータの結合を解除する。

\n *\n * @abstract\n */\n unbindAll()\n {\n this._override_error( \"unbindAll\" );\n }\n\n\n /**\n * @summary すべてのパラメータの結合を解除 (子孫含む)\n *\n * @desc\n *

現在結合されているすべてのパラメータの結合を解除する。

\n *

もしパラメータを持つオブジェクトの子オブジェクトも BindingBlock\n * インタフェースを持っていれば、子孫も含めて結合を解除する。

\n *\n * @abstract\n */\n unbindAllRecursively()\n {\n this._override_error( \"unbindAllRecursively\" );\n }\n\n\n /**\n * @summary メソッドがオーバーライドされていない\n *\n * arguments.callee と Error#stack は互換性が低いので、関数名の取得に使わなかった\n *\n * @param {string} func_name\n *\n * @private\n */\n _override_error( func_name )\n {\n throw new Error( \"BindingBlock#\" + func_name + \"() method has not been overridden in \"\n + this.constructor.name );\n }\n\n}\n\n\n/**\n * @summary アニメーション可能パラメータの情報\n *\n * @see {@link mapray.animation.BindingBlock#enumSupportedParameters}\n * @memberof mapray.animation.BindingBlock\n */\nclass Parameter {\n\n /**\n * @param {string} id パラメータ ID\n * @param {mapray.animation.Type[]} types サポートする型のリスト\n */\n constructor( id, types )\n {\n this._id = id;\n this._types = types.concat(); // 複製\n }\n\n\n /**\n * @summary パラメータ ID\n *\n * @type {string}\n *\n * @readonly\n */\n get id() { return this._id; }\n\n\n /**\n * @summary サポートする型のリスト\n *\n * @desc\n *

パラメータに結合可能なアニメーション関数の型の配列である。

\n *

配列は 1 またはそれ以上の型を含む。

\n *\n * @type {mapray.animation.Type[]}\n *\n * @see {@link mapray.animation.Curve#isTypeSupported}\n *\n * @readonly\n */\n get types() { return this._types; }\n\n}\nBindingBlock.Parameter = Parameter;\n\n\nexport default BindingBlock;\n","import BindingBlock from \"./BindingBlock\";\nimport Binder from \"./Binder\";\nimport AnimationError from \"./AnimationError\";\nimport TypeMismatchError from \"./TypeMismatchError\";\n\n\n/**\n * @summary アニメーションパラメータ設定のヘルパークラス\n *\n * @memberof mapray.animation\n * @extends mapray.animation.BindingBlock\n */\nclass EasyBindingBlock extends BindingBlock\n{\n\n /**\n */\n constructor()\n {\n super();\n\n // アニメーション可能なパラメータ\n this._entries = new Map(); // Map\n\n // 結合中のパラメータ\n this._bounds = new Map(); // Map\n\n // すべての子孫の結合を解除するための関数のリスト\n this._descendant_unbinders = []; // DescendantUnbinder[]\n\n // 不変条件: this._bounds.has( id ) ⇒ this._entries.has( id )\n // this._bounds.has( id ) ⇔ (this._bounds.get( id ) !== undefined) ⇔ this.isBound()\n }\n\n\n /**\n * @summary アニメーション可能パラメータを追加\n *\n * @desc\n *

識別子を id としてアニメーション可能なパラメータを登録する。

\n *\n *

types にはこのパラメータに結合可能なアニメーション関数の 1 つまたはそれ以上の型を配列で与える。

\n *\n *

types に 2 つ以上の型が存在するときは type_solver に型を決定する関数を指定しなければならない。\n * 1 つしか型が存在しないとき type_solver は無視されるので null を与えてもよい。

\n *\n *

setter は実際のパラメータに値を設定する関数である。

\n *\n *

id に対応するパラメータがすでに結合されている場合はその結合が解除される。

\n *\n * @param {string} id パラメータ ID\n * @param {mapray.animation.Type[]} types サポートする型のリスト\n * @param {?mapray.animation.EasyBindingBlock.TypeSolver} type_solver 型決定関数\n * @param {mapray.animation.Binder.Setter} setter パラメータ設定関数\n *\n * @see {@link mapray.animation.BindingBlock.Parameter}\n */\n addEntry( id, types, type_solver, setter )\n {\n // 上書きで追加\n this._entries.set( id, new Entry( types, type_solver, setter ) );\n\n // すでに結合されている場合は解除する\n let binder = this._bounds.get( id );\n if ( binder !== undefined ) {\n binder.unbind();\n this._bounds.delete( id );\n }\n }\n\n\n /**\n * @summary 子孫の結合を解除するための関数を追加\n *\n * @param {mapray.animation.EasyBindingBlock.DescendantUnbinder} unbinder 子孫の結合を解除するための関数\n *\n * @see {@link mapray.animation.BindingBlock#unbindAllRecursively}\n */\n addDescendantUnbinder( unbinder )\n {\n this._descendant_unbinders.push( unbinder );\n }\n\n\n /**\n * @override\n */\n enumSupportedParameters()\n {\n let parameters = [];\n\n for ( let [id, enrty] of this._entries ) {\n parameters.push( new BindingBlock.Parameter( id, enrty.types ) );\n }\n\n return parameters;\n }\n\n\n /**\n * @override\n */\n isBound( id )\n {\n // 不変条件により !this._entries.has( id ) ⇒ !this._bounds.has( id ) が\n // 成り立つので、id がアニメーションに対応していないときは仕様通り false を返す\n\n return this._bounds.has( id );\n }\n\n\n /**\n * @override\n */\n getBoundUpdater( id )\n {\n let binder = this._bounds.get( id );\n return (binder !== undefined) ? binder.updater : null;\n }\n\n\n /**\n * @override\n */\n getBoundCurve( id )\n {\n let binder = this._bounds.get( id );\n return (binder !== undefined) ? binder.curve : null;\n }\n\n\n /**\n * @override\n */\n bind( id, updater, curve )\n {\n let entry = this._entries.get( id );\n if ( entry === undefined ) {\n // id のパラメータはアニメーションに非対応\n throw new AnimationError( \"unsupported parameter\" );\n }\n\n // すでに結合されている場合は先に解除\n this.unbind( id );\n\n // 型を決定\n let types = entry.types;\n let type = (types.length == 1) ? types[0] : entry.type_solver( curve );\n\n if ( type == null || !curve.isTypeSupported( type ) ) {\n // curve は id のパラメータが要求する型に対応できない\n throw new TypeMismatchError( \"type mismatch error\" );\n }\n\n // パラメータを結合\n this._bounds.set( id, new Binder( updater, curve, type, entry.setter ) );\n\n // assert: this.isBound( id )\n // assert: this.getBoundUpdater( id ) === updater\n // assert: this.getBoundCurve( id ) === curve\n }\n\n\n /**\n * @override\n */\n unbind( id )\n {\n let binder = this._bounds.get( id );\n if ( binder !== undefined ) {\n binder.unbind();\n this._bounds.delete( id );\n }\n\n // assert: !this.isBound( id )\n }\n\n\n /**\n * @override\n */\n unbindAll()\n {\n for ( let [/*id*/, binder] of this._bounds ) {\n binder.unbind();\n }\n this._bounds.clear();\n\n // assert: 任意の id に対して !this.isBound( id )\n }\n\n\n /**\n * @override\n */\n unbindAllRecursively()\n {\n // 子孫\n for ( let unbinder of this._descendant_unbinders ) {\n unbinder();\n }\n\n // 自身\n this.unbindAll();\n }\n\n}\n\n\n/**\n * @summary パラメータ情報\n *\n * @memberof mapray.animation.EasyBindingBlock\n * @private\n */\nclass Entry {\n\n /**\n * @param {mapray.animation.Type[]} types サポートする型のリスト\n * @param {?mapray.animation.EasyBindingBlock.TypeSolver} type_solver 型決定関数\n * @param {mapray.animation.Binder.Setter} setter パラメータ設定関数\n */\n constructor( types, type_solver, setter )\n {\n if ( types.length < 1 || (types.length >= 2 && !type_solver) ) {\n // 型は 1 つ以上で、2 つ以上のときは TypeSolver が必要\n // これは事前条件であるが、気付き用に投げる\n throw new AnimationError( \"bad parameter entry\" );\n }\n\n this.types = types.concat(); // 複製\n this.type_solver = type_solver;\n this.setter = setter;\n }\n\n}\n\n\n/**\n * @summary 型決定関数\n *\n * @desc\n *

ここで説明する types と setter は {@link mapray.animation.EasyBindingBlock#addEntry addEntry()}\n * の引数、curve は {@link mapray.animation.EasyBindingBlock#bind bind()} の引数である。

\n *\n *

types と curve がサポートする型から、setter 関数に渡されるパラメータの型 (curve から得る関数値の型も同じ)\n * を決定して返す。

\n *\n *

この関数は types に含まれる型、かつ curve がサポートする型以外は返さない。そのような型が決定できなければ\n * null を返す。

\n *\n *

この関数は types に複数の型を指定したときに、bind() の呼び出しのタイミングで呼び出される。types\n * に 1 つの型しか存在しないときは呼び出されない。

\n *\n * @param {mapray.animation.Curve} curve\n *\n * @return {?mapray.animation.Type}\n *\n * @callback TypeSolver\n *\n * @memberof mapray.animation.EasyBindingBlock\n *\n * @see {@link mapray.animation.EasyBindingBlock#addEntry}\n * @see {@link mapray.animation.EasyBindingBlock#bind}\n * @see {@link mapray.animation.Curve#isTypeSupported}\n * @see {@link mapray.animation.Binder.Setter}\n */\n\n\n/**\n * @summary 子孫の結合を解除するための関数\n *\n * @desc\n *

一般的な実装では、直接の子オブジェクトの .animation.unbindAllRecursively() を呼び出す。

\n *\n * @callback DescendantUnbinder\n *\n * @memberof mapray.animation.EasyBindingBlock\n *\n * @see {@link mapray.animation.EasyBindingBlock#addDescendantUnbinder}\n * @see {@link mapray.animation.BindingBlock#unbindAllRecursively}\n */\n\n\nexport default EasyBindingBlock;\n","import Curve from \"./Curve\";\nimport Interval from \"./Interval\";\nimport Invariance from \"./Invariance\";\n\n\n/**\n * @summary 定数関数\n *\n * @classdesc\n *

すべての時刻で同じ値を返す任意型の関数である。

\n *

関数値の型は構築子のパラメータにより指定する。

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Curve\n */\nclass ConstantCurve extends Curve\n{\n\n /**\n * @desc\n *

type 型の value を定数値とする定数関数を生成する。

\n *

type は任意の型を指定することができる。

\n *

value を省略したときは type 型の既定値を返す定数関数となる。

\n *\n * @param {mapray.animation.Type} type 関数値の型\n * @param {object} [value] 初期定数値 (type 型)\n */\n constructor( type, value )\n {\n super();\n\n this._constant_type = type;\n this._constant_value = type.getDefaultValue();\n\n // 初期値が指定されているときは設定\n if ( value !== undefined ) {\n this.setConstantValue( value );\n }\n }\n\n\n /**\n * @summary 定数値を設定\n *\n * @param {object} value 定数値 (関数値の型)\n */\n setConstantValue( value )\n {\n if ( value == this._constant_value ) {\n // 同じ値で変化なし\n // == 演算子で比較できない型は常に違う値と判断されることもある\n return;\n }\n\n // 定数値を変更\n this._constant_value = this._constant_type.getCloneValue( value );\n\n // 全時刻の値が変化\n this.notifyValueChange( Interval.UNIVERSAL );\n }\n\n\n /**\n * @override\n */\n isTypeSupported( type )\n {\n let from_type = this._constant_type;\n return type.isConvertible( from_type );\n }\n\n\n /**\n * @override\n */\n getValue( time, type )\n {\n let from_type = this._constant_type;\n let from_value = from_type.getCloneValue( this._constant_value );\n return type.convertValue( from_type, from_value );\n }\n\n\n /**\n * @override\n */\n getInvariance( interval )\n {\n // 全時間で一定\n // (UNIVERSAL と非空区間は必ず交差するので interval の参照は不要)\n const invariance = new Invariance();\n return invariance.write( Interval.UNIVERSAL );\n }\n\n}\n\n\nexport default ConstantCurve;\n","import Type from \"./Type\";\n\n\n/**\n * @summary アニメーション実装者用のユーティリティ\n *\n * @hideconstructor\n * @memberof mapray.animation\n *\n * @private\n */\nclass AnimUtil\n{\n\n /**\n * @summary type の次元を取得\n *\n * @desc\n *

type が number のとき 1, vector2, vector3, vector4\n * のときはベクトルの次数を返す。それ以外の型のときは 0 を返す。

\n *\n * @param {mapray.animation.Type} type\n *\n * @return {number} type の次元、type が非対応のときは 0\n */\n static\n getDimension( type )\n {\n if ( Type.find( \"number\" ) === type ) {\n // スカラーは 1\n return 1;\n }\n else if ( Type.find( \"vector2\" ) === type ) {\n return 2;\n }\n else if ( Type.find( \"vector3\" ) === type ) {\n return 3;\n }\n else if ( Type.find( \"vector4\" ) === type ) {\n return 4;\n }\n else {\n // 非対応の型\n return 0;\n }\n }\n\n\n /**\n * @summary キーフレームのインデックスを検索\n *\n * @desc\n *

key_times の [lower, upper) の範囲に time より後の時刻が存在すれば、その中で最小のインデックスを返す。\n * そのような時刻が存在しなければ upper を返す。

\n *\n *

返された値を i, key_times を k とすると time の位置は次のように解釈できる。

\n *
\n     *   i == lower のとき: time < k[i]\n     *   i == upper のとき: k[i-1] <= time\n     *   それ以外のとき: k[i-1] <= time < k[i]\n     * 
\n *\n *

事前条件: upper - lower >= 1

\n *\n *

計算量: upper - lower を n とするとき、O(log n)

\n *\n * @param {mapray.animation.Time} time 検索キー\n * @param {mapray.animation.Time[]} key_times 検索対象配列\n * @param {number} lower 下限インデックス\n * @param {number} upper 上限インデックス\n *\n * @return {number} 検索されたインデックス\n */\n static\n findKeyFrameIndex( time, key_times, lower, upper )\n {\n let l_idx = lower;\n let u_idx = upper;\n\n for (;;) {\n if ( u_idx - l_idx >= 2 ) {\n let m_idx = Math.floor( (l_idx + u_idx) / 2 ); // 中間インデックス\n let m_time = key_times[m_idx];\n\n if ( m_time.lessThan( time ) ) {\n // m_time < time なので [m_idx, u_idx) に存在するかもしれない\n l_idx = m_idx;\n }\n else if ( time.lessThan( m_time ) ) {\n // m_time > time なので [l_idx, m_idx) を確認\n u_idx = m_idx;\n }\n else {\n // m_time == time なので m_idx の次が結果になる\n return m_idx + 1;\n }\n }\n else {\n // u_idx - l_idx == 1\n let l_time = key_times[l_idx];\n return time.lessThan( l_time ) ? l_idx : u_idx;\n }\n }\n\n return 0; // 警告回避\n }\n\n\n /**\n * @summary 最初にサポートする型を検索\n *\n * @desc\n *

types の中で curve がサポートする最初の型を返す。

\n *

types に curve がサポートする型が存在しなければ null を返す。

\n *\n * @param {mapray.animation.Curve} curve\n * @param {iterable.} types\n *\n * @return {?mapray.animation.Type}\n */\n static\n findFirstTypeSupported( curve, types )\n {\n for ( let type of types ) {\n if ( curve.isTypeSupported( type ) ) {\n return type;\n }\n }\n return null;\n }\n\n}\n\n\nexport default AnimUtil;\n","import Curve from \"./Curve\";\nimport Type from \"./Type\";\nimport Time from \"./Time\";\nimport Interval from \"./Interval\";\nimport Invariance from \"./Invariance\";\nimport AnimUtil from \"./AnimUtil\";\nimport AnimationError from \"./AnimationError\";\n\n\n/**\n * @summary キーフレームによる線形関数\n *\n * @classdesc\n *

キーフレーム間を数値またはベクトルを線形に補間する関数である。

\n *

関数値の型は構築子のパラメータにより number, vector2, vector3 または vector4 を指定する。

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Curve\n */\nclass KFLinearCurve extends Curve\n{\n\n /**\n *

type 型の関数を keyframes により生成する。

\n *

type は number, vector2, vector3 または vector4 を指定することができる。

\n *

keyframes を省略したときは type 型の既定値を返す定数関数と同等になる。keyframes の形式に関しては\n * {@link mapray.animation.KFLinearCurve#setKeyFrames setKeyFrames()} を参照のこと。

\n *\n * @param {mapray.animation.Type} type 関数値の型\n * @param {object[]} [keyframes] 初期キーフレーム\n */\n constructor( type, keyframes )\n {\n super();\n\n const dimension = AnimUtil.getDimension( type );\n if ( dimension == 0 ) {\n throw AnimationError( \"unsupported type\" );\n }\n\n this._value_type = type; // number | vector2 | vector3 | vector4\n this._dimension = dimension; // 1〜4\n this._num_keyframes = undefined; // >= 2\n this._key_times = undefined; // Time[]\n this._key_values = undefined; // Float64Array\n\n if ( keyframes !== undefined ) {\n // 初期のキーフレームを設定\n this.setKeyFrames( keyframes );\n }\n else {\n // 既定のキーフレームを設定\n const t0 = Time.fromNumber( 0 );\n const t1 = Time.fromNumber( 1 );\n const dv = type.getDefaultValue();\n this.setKeyFrames( [t0, dv, t1, dv] );\n }\n }\n\n\n /**\n * @summary キーフレーム設定\n *\n * @desc\n *

keyframes により、すべてのキーフレームを指定する。

\n *\n *

\n * 条件1: keyframes.length >= 4 (キーフレーム数 >= 2)
\n * 条件2: すべての i, j において、i < j ⇔ 時刻i < 時刻j
\n * 条件3: すべての i において、値i は構築子の type 引数で指定した型のインスタンス\n *

\n *\n * @param {object[]} keyframes [時刻0, 値0, 時刻1, 値1, ...]\n */\n setKeyFrames( keyframes )\n {\n const dimension = this._dimension;\n\n this._num_keyframes = keyframes.length / 2;\n this._key_times = new Array( this._num_keyframes );\n this._key_values = new Float64Array( this._num_keyframes * dimension );\n\n // キーフレームを設定\n for ( let ti = 0, vi = 0; ti < this._num_keyframes; ++ti, vi += dimension ) {\n const time = keyframes[2*ti ];\n const value = keyframes[2*ti + 1];\n\n // 時刻を配列に設定\n this._key_times[ti] = time;\n\n // 値を配列に設定\n if ( dimension == 1 ) {\n // スカラー\n this._key_values[vi] = value;\n }\n else {\n // ベクトル\n for ( let j = 0; j < dimension; ++j ) {\n this._key_values[vi + j] = value[j];\n }\n }\n }\n\n // 全時刻の値が変化\n this.notifyValueChange( Interval.UNIVERSAL );\n }\n\n\n /**\n * @override\n */\n isTypeSupported( type )\n {\n let from_type = this._value_type;\n return type.isConvertible( from_type );\n }\n\n\n /**\n * @override\n */\n getValue( time, type )\n {\n let from_type = this._value_type;\n let from_value = this._getInterpolatedValue( time );\n return type.convertValue( from_type, from_value );\n }\n\n\n /**\n * @override\n */\n getInvariance( interval )\n {\n const first_time = this._key_times[0];\n const last_time = this._key_times[this._num_keyframes - 1];\n const ival_inner = new Interval( first_time, last_time, true, true );\n\n // 全体の不変性情報 (2区間程度なので毎回生成)\n const invr_full = new Invariance();\n invr_full.write( ival_inner.getPrecedings() ); // 最初のキーの時刻とその前の区間\n invr_full.write( ival_inner.getFollowings() ); // 最後のキーの時刻とその後の区間\n\n // interval 範囲に絞って返す\n return invr_full.getNarrowed( interval );\n }\n\n\n /**\n * @summary time での補間値を取得\n *\n * @param {mapray.animation.Time} time\n *\n * @return {object} 補間値 (this._value_type に適応した型)\n *\n * @private\n */\n _getInterpolatedValue( time )\n {\n // this._key_times に time より後の時刻が存在すれば、その中で最小のインデックス\n // そのような時刻が存在しなければ this._num_keyframes\n const index = AnimUtil.findKeyFrameIndex( time, this._key_times, 0, this._num_keyframes );\n\n if ( index == 0 ) {\n // time が最初のキー時刻と同じか、その前のときは最初のキー値で一定\n return this._createKeyFrameValue( 0 );\n }\n else if ( index == this._num_keyframes ) {\n // time が最後のキー時刻と同じか、その後のときは最後のキー値で一定\n return this._createKeyFrameValue( index - 1 );\n }\n else {\n // その他のときは前後のキー値で線形補間\n return this._createValueBy2Keys( index - 1, index, time );\n }\n }\n\n\n /**\n * @summary キーフレーム値を生成\n *\n * @param {number} index キーフレームのインデックス\n *\n * @return {object} キーフレーム値 (this._value_type に適応した型)\n *\n * @private\n */\n _createKeyFrameValue( index )\n {\n const dimension = this._dimension;\n const key_values = this._key_values;\n\n if ( dimension == 1 ) {\n // スカラー\n return key_values[index];\n }\n else {\n // ベクトル\n let vi = dimension * index;\n let vec = new Float64Array( dimension );\n for ( let i = 0; i < dimension; ++i ) {\n vec[i] = key_values[vi + i];\n }\n return vec;\n }\n }\n\n\n /**\n * @summary キーフレーム間の補間値を生成\n *\n * @param {number} i0 先キーフレームのインデックス\n * @param {number} i1 後キーフレームのインデックス\n * @param {mapray.animation.Time} time\n *\n * @return {object} 補間値 (this._value_type に適応した型)\n *\n * @private\n */\n _createValueBy2Keys( i0, i1, time )\n {\n const x0 = this._key_times[i0].toNumber();\n const x1 = this._key_times[i1].toNumber();\n const r1 = (time.toNumber() - x0) / (x1 - x0);\n const r0 = 1 - r1;\n\n const dimension = this._dimension;\n const key_values = this._key_values;\n\n if ( dimension == 1 ) {\n // スカラー\n return r0*key_values[i0] + r1*key_values[i1];\n }\n else {\n // ベクトル\n let vi0 = dimension * i0;\n let vi1 = dimension * i1;\n let vec = new Float64Array( dimension );\n for ( let i = 0; i < dimension; ++i ) {\n vec[i] = r0*key_values[vi0 + i] + r1*key_values[vi1 + i];\n }\n return vec;\n }\n }\n\n}\n\n\nexport default KFLinearCurve;\n","import Curve from \"./Curve\";\nimport Type from \"./Type\";\nimport Time from \"./Time\";\nimport Interval from \"./Interval\";\nimport Invariance from \"./Invariance\";\nimport AnimUtil from \"./AnimUtil\";\n\n\n/**\n * @summary キーフレームによる階段関数\n *\n * @classdesc\n *

あるキーフレームから次のキーフレームの直前まで一定の値を返す階段関数である。

\n *

構築子により任意の関数値の型を指定することができる。

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Curve\n */\nclass KFStepCurve extends Curve\n{\n\n /**\n * @desc\n *

type 型の階段関数を keyframes により生成する。

\n *

type は任意の型を指定することができる。

\n *

keyframes を省略したときは type 型の既定値を返す定数関数と同等になる。keyframes の形式に関しては\n * {@link mapray.animation.KFStepCurve#setKeyFrames setKeyFrames()} を参照のこと。

\n *\n * @param {mapray.animation.Type} type 関数値の型\n * @param {object[]} [keyframes] 初期キーフレーム\n */\n constructor( type, keyframes )\n {\n super();\n\n this._value_type = type; // any type\n this._num_keyframes = undefined; // >= 1\n this._key_times = undefined; // Time[]\n this._key_values = undefined; // object[]\n\n if ( keyframes !== undefined ) {\n // 初期のキーフレームを設定\n this.setKeyFrames( keyframes );\n }\n else {\n // 既定のキーフレームを設定\n const t0 = Time.fromNumber( 0 );\n const dv = type.getDefaultValue();\n this.setKeyFrames( [t0, dv] );\n }\n }\n\n\n /**\n * @summary キーフレーム設定\n *\n * @desc\n *

keyframes により、すべてのキーフレームを指定する。

\n *\n *

\n * 条件1: keyframes.length >= 2 (キーフレーム数 >= 1)
\n * 条件2: すべての i, j において、i < j ⇔ 時刻i < 時刻j
\n * 条件3: すべての i において、値i は構築子の type 引数で指定した型のインスタンス\n *

\n *\n * @param {object[]} keyframes [時刻0, 値0, 時刻1, 値1, ...]\n */\n setKeyFrames( keyframes )\n {\n this._num_keyframes = keyframes.length / 2;\n this._key_times = new Array( this._num_keyframes );\n this._key_values = new Array( this._num_keyframes );\n\n // キーフレームを設定\n for ( let i = 0; i < this._num_keyframes; ++i ) {\n const time = keyframes[2*i ];\n const value = keyframes[2*i + 1];\n\n this._key_times[i] = time;\n this._key_values[i] = this._value_type.getCloneValue( value );\n }\n\n // 全時刻の値が変化\n this.notifyValueChange( Interval.UNIVERSAL );\n }\n\n\n /**\n * @override\n */\n isTypeSupported( type )\n {\n const from_type = this._value_type;\n return type.isConvertible( from_type );\n }\n\n\n /**\n * @override\n */\n getValue( time, type )\n {\n const from_type = this._value_type;\n const from_value = this._getInterpolatedValue( time );\n return type.convertValue( from_type, from_value );\n }\n\n\n /**\n * @override\n */\n getInvariance( interval )\n {\n if ( this._num_keyframes == 1 ) {\n // キーフレームが 1 個のときは ConstantCurve と同じく、全時間で一定値\n // (UNIVERSAL と非空区間は必ず交差するので interval の参照は不要)\n return new Invariance().write( Interval.UNIVERSAL );\n }\n else {\n // assert: this._num_keyframes >= 2\n const invr = new Invariance();\n\n // 最初から2番目のキー時刻より前は一定値\n const first = this._key_times[1];\n invr.write( new Interval( first, first ).getPrecedings() );\n\n // 最後のキー時刻とその後は一定値\n const lastL = this._key_times[this._num_keyframes - 2];\n const lastU = this._key_times[this._num_keyframes - 1];\n invr.write( new Interval( lastL, lastU, false, true ).getFollowings() );\n\n // interval 範囲に絞って返す\n return invr.getNarrowed( interval );\n }\n }\n\n\n /**\n * @summary time での補間値を取得\n *\n * @param {mapray.animation.Time} time\n *\n * @return {object} 補間値 (this._value_type に適応した型)\n *\n * @private\n */\n _getInterpolatedValue( time )\n {\n // this._key_times に time より後の時刻が存在すれば、その中で最小のインデックス\n // そのような時刻が存在しなければ this._num_keyframes\n const found = AnimUtil.findKeyFrameIndex( time, this._key_times, 0, this._num_keyframes );\n\n // キー値のインデックス\n const index = (found > 0) ? found - 1 : 0;\n\n // 補間値を生成\n return this._value_type.getCloneValue( this._key_values[index] );\n }\n\n}\n\n\nexport default KFStepCurve;\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","import Curve from \"./Curve\";\nimport Interval from \"./Interval\";\nimport Invariance from \"./Invariance\";\nimport Type from \"./Type\";\nimport ConstantCurve from \"./ConstantCurve\";\nimport TypeMismatchError from \"./TypeMismatchError\";\nimport AnimUtil from \"./AnimUtil\";\n\n\n/**\n * @summary 複合ベクトル関数\n *\n * @classdesc\n *

複数の数値関数から構成されるベクトル関数である。

\n *

関数値の型は構築子のパラメータにより vector2, vector3 または vector4 を指定する。

\n *

子関数は number または number へ変換可能な型でなければならない。

\n *\n * @memberof mapray.animation\n * @extends mapray.animation.Curve\n */\nclass ComboVectorCurve extends Curve\n{\n\n /**\n * @desc\n *

type 型のベクトル関数を生成する。ベクトルの各要素の値は子関数の値になる。

\n *\n *

children を省略したときは、ベクトルの全要素が 0 となる定数関数と同等になる。children の形式に関しては\n * {@link mapray.animation.ComboVectorCurve#setChildren setChildren()} を参照のこと。

\n *\n * @param {mapray.animation.Type} type 関数値の型 (ベクトル型)\n * @param {mapray.animation.Curve[]} [children] 初期の全子関数\n *\n * @throws {@link mapray.animation.TypeMismatchError} type または children に非対応の型が存在するとき\n */\n constructor( type, children )\n {\n super();\n\n const dimension = AnimUtil.getDimension( type );\n if ( dimension < 2 && dimension > 4 ) {\n // type はベクトル型ではない\n throw new TypeMismatchError( \"unexpected type\" );\n }\n\n this._vector_type = type;\n this._dimension = dimension; // 2〜4\n this._children = new Array( dimension ); // 子関数の配列\n this._listeners = new Array( dimension ); // 子関数に対応した ValueChangeListener\n\n this._setupInitialChildren();\n\n // 初期値が指定されているときは設定\n if ( children !== undefined ) {\n this.setChildren( children );\n }\n }\n\n\n /**\n * @summary 子関数を設定 (個別)\n *\n * @desc\n *

index の要素のみの子関数を設定する。その他の要素は変更されない。

\n *\n * @param {number} index 要素インデックス\n * @param {mapray.animation.Curve} curve 子関数\n *\n * @throws {@link mapray.animation.TypeMismatchError} curve が非対応の型のとき\n */\n setChild( index, curve )\n {\n this._setChildCommon( index, curve );\n\n // curve が未知なので全時刻の値が変化したことにする\n this.notifyValueChange( Interval.UNIVERSAL );\n }\n\n\n /**\n * @summary 子関数を設定 (一括)\n *\n * @desc\n *

curves にすべての子関数を指定する。curves の要素数はベクトルの次数と同数である。

\n *\n * @param {mapray.animation.Curve[]} curves 全子関数\n *\n * @throws {@link mapray.animation.TypeMismatchError} curves に非対応の型が存在するとき\n */\n setChildren( curves )\n {\n for ( let i = 0; i < this._dimension; ++i ) {\n this._setChildCommon( i, curves[i] );\n }\n\n // curves が未知なので全時刻の値が変化したことにする\n this.notifyValueChange( Interval.UNIVERSAL );\n }\n\n\n /**\n * @override\n */\n isTypeSupported( type )\n {\n let from_type = this._vector_type;\n return type.isConvertible( from_type );\n }\n\n\n /**\n * @override\n */\n getValue( time, type )\n {\n let from_type = this._vector_type;\n let from_value = this._getCompoundValue( time );\n return type.convertValue( from_type, from_value );\n }\n\n\n /**\n * @override\n */\n getInvariance( interval )\n {\n // すべての子関数の不変性情報の交差\n const invariances = this._children.map( child => child.getInvariance( interval ) );\n return Invariance.merge( invariances );\n }\n\n\n /**\n * 初期の子関数とリスナーを設定\n *\n * @private\n */\n _setupInitialChildren()\n {\n const init_child = new ConstantCurve( vec_compo_type );\n\n for ( let i = 0; i < this._dimension; ++i ) {\n const listener = interval => { this.notifyValueChange( interval ); };\n init_child.addValueChangeListener( listener );\n\n this._children[i] = init_child;\n this._listeners[i] = listener;\n }\n }\n\n\n /**\n * @summary 子要素を設定 (共通ルーチン)\n *\n * @param {number} index\n * @param {mapray.animation.Curve} curve\n *\n * @throws {@link mapray.animation.TypeMismatchError}\n *\n * @private\n */\n _setChildCommon( index, curve )\n {\n if ( !curve.isTypeSupported( vec_compo_type ) ) {\n // curve の型をベクトルの要素の型に変換できない\n throw new TypeMismatchError( \"type mismatch error\" );\n }\n\n // 以前の子のリスナーを解除\n let old_child = this._children[index];\n let old_listener = this._listeners[index];\n old_child.removeValueChangeListener( old_listener );\n\n // 新しい子のリスナーを設定\n let listener = interval => { this.notifyValueChange( interval ); };\n curve.addValueChangeListener( listener );\n\n // 新しい子を設定\n this._children[index] = curve;\n this._listeners[index] = listener;\n }\n\n\n /**\n * @summary time での複合値を取得\n *\n * @param {mapray.animation.Time} time\n *\n * @return {number[]} 複合値 (this._vector_type に適応した型)\n *\n * @private\n */\n _getCompoundValue( time )\n {\n const dimension = this._dimension;\n\n let vec = new Float64Array( dimension );\n\n for ( let i = 0; i < dimension; ++i ) {\n vec[i] = this._children[i].getValue( time, vec_compo_type );\n }\n\n return vec;\n }\n\n}\n\n\n/**\n * ベクトルの要素型\n * @private\n */\nconst vec_compo_type = Type.find( \"number\" );\n\n\nexport default ComboVectorCurve;\n","import AnimationError from \"./AnimationError\";\nimport Time from \"./Time\";\nimport Interval from \"./Interval\";\nimport Invariance from \"./Invariance\";\nimport Type from \"./Type\";\nimport Curve from \"./Curve\";\nimport Updater from \"./Updater\";\nimport Binder from \"./Binder\";\nimport TypeMismatchError from \"./TypeMismatchError\";\nimport BindingBlock from \"./BindingBlock\";\nimport EasyBindingBlock from \"./EasyBindingBlock\";\nimport ConstantCurve from \"./ConstantCurve\";\nimport KFLinearCurve from \"./KFLinearCurve\";\nimport KFStepCurve from \"./KFStepCurve\";\nimport ComboVectorCurve from \"./ComboVectorCurve\";\n\n\n/**\n * アニメーション関連の機能全体が含まれる名前空間\n *\n * @namespace animation\n * @memberof mapray\n */\nlet animation = {\n AnimationError,\n Time,\n Interval,\n Invariance,\n Type,\n Curve,\n Updater,\n Binder,\n TypeMismatchError,\n BindingBlock,\n EasyBindingBlock,\n ConstantCurve,\n KFLinearCurve,\n KFStepCurve,\n ComboVectorCurve\n};\n\n\nexport default animation;\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar classof = require('../internals/classof-raw');\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !IS_IOS) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar classof = require('../internals/classof-raw');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar IS_NODE = classof(process) == 'process';\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\n // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // We can't detect it synchronously, so just check versions\n if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && typeof PromiseRejectionEvent != 'function') return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (promise, state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(promise, state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (handler = global['on' + name]) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (promise, state) {\n task.call(global, function () {\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (promise, state) {\n task.call(global, function () {\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, promise, state, unwrap) {\n return function (value) {\n fn(promise, state, value, unwrap);\n };\n};\n\nvar internalReject = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(promise, state, true);\n};\n\nvar internalResolve = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, promise, wrapper, state),\n bind(internalReject, promise, wrapper, state)\n );\n } catch (error) {\n internalReject(promise, wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(promise, state, false);\n }\n } catch (error) {\n internalReject(promise, { done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n } catch (error) {\n internalReject(this, state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(this, state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, promise, state);\n this.reject = bind(internalReject, promise, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","import GeoMath from \"./GeoMath\";\n\n\n/**\n * @summary 始点と方向\n * @classdesc\n *

始点と方向で表現される半直線である。

\n * @memberof mapray\n * @see mapray.Viewer#getRayIntersection\n * @see mapray.Camera#getCanvasRay\n */\nclass Ray {\n\n /**\n * @desc\n *

pos の参照を {@link mapray.Ray#position}, dir の参照を {@link mapray.Ray#direction} に代入する。

\n *

ただし引数を省略したとき、対応するメンバーには新たに生成されたベクトルが代入される。

\n * @param {mapray.Vector3} [pos] レイの始点\n * @param {mapray.Vector3} [dir] レイの方向\n */\n constructor( pos, dir )\n {\n /**\n * @summary レイの始点\n * @member mapray.Ray#position\n * @type {mapray.Vector3}\n * @default [0, 0, 0]\n */\n this.position = pos || GeoMath.createVector3();\n\n /**\n * @summary レイの方向\n * @desc\n *

非零ベクトルでなければならない。

\n * @member mapray.Ray#direction\n * @type {mapray.Vector3}\n * @default [0, 0, -1]\n */\n this.direction = dir || GeoMath.createVector3( [0, 0, -1] );\n }\n\n}\n\n\nexport default Ray;\n","import GeoMath from \"./GeoMath\";\nimport Ray from \"./Ray\";\n \n\n/**\n * @summary 視点を表現するカメラ\n *\n * @classdesc\n *

視点を表現するカメラである。

\n *

インスタンスは {@link mapray.Viewer#camera} から得ることができる。

\n *\n * @hideconstructor\n * @memberof mapray\n * @see mapray.Viewer\n */\nclass Camera {\n\n /**\n * @summary Cameraオブジェクトを生成\n * canvas_sizeには、width, heightプロパティを持つオブジェクトを指定する。\n * createRenderInfo()が呼ばれる度にwidth, height値が参照される。\n * canvas要素が指定される他、オフスクリーンレンダリング時にはwidth, height値を持ったオブジェクトが指定されます。\n *\n * @param {object} canvas_size レンダリング先サイズ\n * @param {number} canvas_size.width 幅\n * @param {number} canvas_size.height 高さ\n * @package\n */\n constructor( canvas_size )\n {\n /**\n * @summary レンダリング先のサイズ\n * @type {object}\n */\n this._canvas_size = canvas_size;\n\n /**\n * @summary カメラの画角 (Degrees)\n * @member mapray.Camera#fov\n * @type {number}\n * @default 46\n */\n this.fov = 46;\n\n /**\n * @summary 近接平面距離 (Meters)\n * @member mapray.Camera#near\n * @type {number}\n * @default 1\n */\n this.near = 1;\n\n /**\n * @summary 遠方平面距離 (Meters)\n * @member mapray.Camera#far\n * @type {number}\n * @default 1000\n */\n this.far = 1000;\n\n /**\n * @summary 視点空間から GOCS への変換行列\n * @member mapray.Camera#view_to_gocs\n * @type {mapray.Matrix}\n * @default 恒等行列\n */\n this.view_to_gocs = GeoMath.createMatrix();\n GeoMath.setIdentity( this.view_to_gocs );\n }\n\n /**\n * @summary カメラの姿勢や視体積に関するパラメータをコピーします。\n * キャンバスサイズはコピーされません。\n * @private\n */\n copyViewParameters( camera ) {\n this.fov = camera.fov;\n this.near = camera.near;\n this.far = camera.far;\n GeoMath.copyMatrix( camera.view_to_gocs, this.view_to_gocs );\n }\n\n\n /**\n * @summary 変換行列 canvas_to_view を取得\n * @desc\n *

キャンバス座標系から視点座標系へ座標を変換するための変換行列を取得する。

\n *

結果は omat に設定するが、omat を省略した場合は新規に生成した行列オブジェクトを使用する。

\n *

キャンバスの幅または高さが 0 のときは結果は不定値となる。

\n * @param {mapray.Matrix} [omat] 結果を設定する行列オブジェクト\n * @return {mapray.Matrix} omat または新規に生成した行列\n */\n getCanvasToView( omat )\n {\n var dst = omat || GeoMath.createMatrix();\n\n // キャンバス画素数 -> sx, sy\n var sx = this._canvas_size.width;\n var sy = this._canvas_size.height;\n\n // 近接遠方平面距離 -> n, f\n var n = this.near;\n var f = this.far;\n\n // n 勾配 (対角線画角を想定) -> gx, gy\n var hfov = this.fov * GeoMath.DEGREE / 2;\n var aspect = sy / sx;\n var gx = n * Math.tan( hfov ) / Math.sqrt( 1 + aspect * aspect );\n var gy = gx * aspect;\n\n // 行列の要素を設定\n dst[ 0] = 2 * gx / (n * sx);\n dst[ 1] = 0;\n dst[ 2] = 0;\n dst[ 3] = 0;\n\n dst[ 4] = 0;\n dst[ 5] = -2 * gy / (n * sy);\n dst[ 6] = 0;\n dst[ 7] = 0;\n\n dst[ 8] = 0;\n dst[ 9] = 0;\n dst[10] = 0;\n dst[11] = (n - f) / (n * f);\n\n dst[12] = -gx / n;\n dst[13] = gy / n;\n dst[14] = -1;\n dst[15] = 1 / n;\n\n return dst;\n }\n\n\n /**\n * @summary 変換行列 canvas_to_gocs を取得\n * @desc\n *

キャンバス座標系から地心座標系 (GOCS) へ座標を変換するための変換行列を取得する。

\n *

結果は omat に設定するが、omat を省略した場合は新規に生成した行列オブジェクトを使用する。

\n *

キャンバスの幅または高さが 0 のときは結果は不定値となる。

\n * @param {mapray.Matrix} [omat] 結果を設定する行列オブジェクト\n * @return {mapray.Matrix} omat または新規に生成した行列\n */\n getCanvasToGocs( omat )\n {\n /*== canvas_to_view ==*/\n var nMat = this.getCanvasToView( omat );\n\n var n00 = nMat[ 0];\n // n10 = 0\n // n20 = 0\n // n30 = 0\n\n // n01 = 0\n var n11 = nMat[ 5];\n // n21 = 0\n // n31 = 0\n\n // n03 = 0\n // n13 = 0\n // n23 = 0\n var n32 = nMat[11];\n\n var n03 = nMat[12];\n var n13 = nMat[13];\n // n23 = -1\n var n33 = nMat[15];\n\n /*== view_to_gocs ==*/\n var mMat = this.view_to_gocs;\n\n var m00 = mMat[ 0];\n var m10 = mMat[ 1];\n var m20 = mMat[ 2];\n // m30 = 0\n\n var m01 = mMat[ 4];\n var m11 = mMat[ 5];\n var m21 = mMat[ 6];\n // m31 = 0\n\n var m02 = mMat[ 8];\n var m12 = mMat[ 9];\n var m22 = mMat[10];\n // m32 = 0\n\n var m03 = mMat[12];\n var m13 = mMat[13];\n var m23 = mMat[14];\n // m33 = 1\n\n /*== dst = view_to_gocs * canvas_to_view ==*/\n var dst = nMat;\n\n dst[ 0] = m00 * n00;\n dst[ 1] = m10 * n00;\n dst[ 2] = m20 * n00;\n // dst[ 3] = 0\n\n dst[ 4] = m01 * n11;\n dst[ 5] = m11 * n11;\n dst[ 6] = m21 * n11;\n // dst[ 7] = 0\n\n dst[ 8] = m03 * n32;\n dst[ 9] = m13 * n32;\n dst[10] = m23 * n32;\n // dst[ 11] = n32\n\n dst[12] = m00 * n03 + m01 * n13 - m02 + m03 * n33;\n dst[13] = m10 * n03 + m11 * n13 - m12 + m13 * n33;\n dst[14] = m20 * n03 + m21 * n13 - m22 + m23 * n33;\n // dst[ 12] = n33\n\n return dst;\n }\n\n\n /**\n * @summary 変換行列 view_to_canvas を取得\n * @desc\n *

視点座標系からキャンバス座標系へ座標を変換するための変換行列を取得する。

\n *

結果は omat に設定するが、omat を省略した場合は新規に生成した行列オブジェクトを使用する。

\n *

キャンバスの幅または高さが 0 のときは結果は不定値となる。

\n * @param {mapray.Matrix} [omat] 結果を設定する行列オブジェクト\n * @return {mapray.Matrix} omat または新規に生成した行列\n */\n getViewToCanvas( omat )\n {\n var dst = omat || GeoMath.createMatrix();\n\n // キャンバス画素数 -> sx, sy\n var sx = this._canvas_size.width;\n var sy = this._canvas_size.height;\n\n // 近接遠方平面距離 -> n, f\n var n = this.near;\n var f = this.far;\n\n // n 勾配 (対角線画角を想定) -> gx, gy\n var hfov = this.fov * GeoMath.DEGREE / 2;\n var aspect = sy / sx;\n var gx = n * Math.tan( hfov ) / Math.sqrt( 1 + aspect * aspect );\n var gy = gx * aspect;\n\n // 行列の要素を設定\n dst[ 0] = n * sx / (2 * gx);\n dst[ 1] = 0;\n dst[ 2] = 0;\n dst[ 3] = 0;\n\n dst[ 4] = 0;\n dst[ 5] = -n * sy / (2 * gy);\n dst[ 6] = 0;\n dst[ 7] = 0;\n\n dst[ 8] = -sx / 2;\n dst[ 9] = -sy / 2;\n dst[10] = f / (n - f);\n dst[11] = -1;\n\n dst[12] = 0;\n dst[13] = 0;\n dst[14] = n * f / (n - f);\n dst[15] = 0;\n\n return dst;\n }\n\n\n /**\n * @summary キャンバス座標に対応するレイを取得\n * @desc\n *

キャンバス上の cpos で示した点に対応するレイを取得する。

\n *

始点は近接平面上に置き、方向は長さ 1 に正規化される。

\n *

返されるレイの座標系は GOCS である。

\n * @param {mapray.Vector2} cpos キャンバス上の位置\n * @param {mapray.Ray} [oray] 結果を設定する Ray オブジェクト\n * @return {mapray.Ray} oray または新規に生成した Ray\n */\n getCanvasRay( cpos, oray )\n {\n var x = cpos[0];\n var y = cpos[1];\n var dst = oray || new Ray();\n\n // Q = Mr (x, y, 0, 1)^t\n var mr = this.getCanvasToGocs( Camera._temp_mat );\n var qx = x * mr[0] + y * mr[4] + mr[12];\n var qy = x * mr[1] + y * mr[5] + mr[13];\n var qz = x * mr[2] + y * mr[6] + mr[14];\n var qw = x * mr[3] + y * mr[7] + mr[15];\n\n // Q を通常の座標に変換\n var pos = dst.position;\n pos[0] = qx / qw;\n pos[1] = qy / qw;\n pos[2] = qz / qw;\n\n // Vr = pos - Mg (0, 0, 0)^t\n var mg = this.view_to_gocs;\n var dir = dst.direction;\n dir[0] = pos[0] - mg[12];\n dir[1] = pos[1] - mg[13];\n dir[2] = pos[2] - mg[14];\n GeoMath.normalize3( dir, dir );\n\n return dst;\n }\n\n\n /**\n * @summary レンダリング先のサイズ\n * @type {object}\n * @private\n */\n get canvas_size() {\n return this._canvas_size;\n }\n\n\n /**\n * @summary レンダリング情報を生成します。\n * ビューポート内で実際にレンダリングを行う領域を指定します。(レンダリング領域が指定されなかった場合はビューポート全体にレンダリングを行います)\n * @param {number} [sx] レンダリング領域のx位置\n * @param {number} [sy] レンダリング領域のy位置\n * @param {number} [swidth] レンダリング領域の幅\n * @param {number} [sheight] レンダリング領域の高さ\n * @return {mapray.Camera.RenderInfo}\n * @package\n */\n createRenderInfo( sx, sy, swidth, sheight )\n {\n const canvas_size = this._canvas_size;\n return new RenderInfo( this, canvas_size.width, canvas_size.height, sx, sy, swidth, sheight );\n }\n\n}\n\n\nCamera._temp_mat = GeoMath.createMatrix();\n\n\n/**\n * @summary カメラから得るレンダリング情報\n * @memberof mapray.Camera\n * @private\n */\nclass RenderInfo {\n\n /**\n * @param {mapray.Camera} camera 対象カメラ\n * @param {number} width ビューポートの幅\n * @param {number} height ビューポートの高さ\n * @param {number} [sx] レンダリング領域のx位置(ビューポート中央を0, 右方向を正とする)\n * @param {number} [sy] レンダリング領域のy位置(ビューポート中央を0, 上方向を正とする)\n * @param {number} [swidth] レンダリング領域の幅\n * @param {number} [sheight] レンダリング領域の高さ\n */\n constructor( camera, width, height, sx, sy, swidth, sheight )\n {\n /*\n * y swidth \n * Viewport | |<--->| \n * +--------------+--------------+ -----------\n * | | | ^ \n * | | +-----+ | -- | \n * | sy+---| + | | sheight | \n * | | +-----+ | -- | \n * | | | | | \n * --+--------------+------+-------+--x | \n * | | sx | | \n * | | | height\n * | | | | \n * | | | | \n * | | | V \n * +--------------+--------------+ -----------\n * \n * |<---------- width ---------->| \n */\n // オブジェクトを生成\n this._view_to_clip = GeoMath.createMatrix();\n this._volume_planes = [];\n for ( var i = 0; i < 6; ++i ) {\n this._volume_planes.push( GeoMath.createVector4() );\n }\n this._pixel_step = 0;\n\n // オブジェクトを設定\n this._setup_view_to_clip( camera, width, height, sx, sy, swidth, sheight );\n this._setup_volume_planes();\n this._setup_pixel_step( width, height );\n }\n\n\n /**\n * @summary 視点空間からクリップ同次空間への変換行列\n * @type {mapray.Matrix}\n * @readonly\n */\n get view_to_clip() { return this._view_to_clip; }\n\n\n /**\n * @summary 視体積の平面ベクトル配列\n * @desc\n *

以下の順序で 6 枚の平面ベクトルが格納されている。

\n *\n *
\n     * [near, far, left, right, bottom, top]\n     * 
\n *\n *

各平面の x, y, z は長さ 1 に正規化されている。

\n *\n * @type {mapray.Vector4[]}\n * @readonly\n */\n get volume_planes() { return this._volume_planes; }\n\n\n /**\n * @summary 視点空間での画素の変化量\n * @desc\n *

ビューポートの画素に対応する視点空間の Z = -1 平面での変化量を返す。

\n *\n * @type {number}\n * @readonly\n */\n get pixel_step() { return this._pixel_step; }\n\n\n /**\n * @private\n */\n _setup_view_to_clip( camera, width, height, sx=0, sy=0, swidth=width, sheight=height )\n {\n // 矩形の中心位置 (単位空間)\n const cx = 2 * sx / width;\n const cy = 2 * sy / height;\n\n // 矩形の半サイズ (単位空間)\n const dx = swidth / width;\n const dy = sheight / height;\n\n // キャンバスの横幅に対する高さの比\n const aspect = height / width;\n\n // fov を対角線画角と解釈して単位サイズを求める\n // (単位空間の水平方向 1 に対する近接平面上での寸法)\n const hfov = camera.fov * GeoMath.DEGREE / 2; // 半画角 (radians)\n const unit = camera.near * Math.tan( hfov ) / Math.sqrt( 1 + aspect * aspect );\n\n // 近接平面上での平面位置\n const left = (cx - dx) * unit;\n const right = (cx + dx) * unit;\n const bottom = (cy - dy) * unit * aspect;\n const top = (cy + dy) * unit * aspect;\n\n GeoMath.frustum_matrix( left, right, bottom, top, camera.near, camera.far,\n this._view_to_clip );\n }\n\n\n /**\n * @private\n */\n _setup_volume_planes()\n {\n var matrix = this._view_to_clip;\n var plane = this._volume_planes;\n\n // 視体積の内側を向いた平面を取得\n // これらの式は任意の射影行列に対して有効\n this._add_matrix_rows( matrix, 3, 2, plane[0] ); // near = m3 + m2\n this._sub_matrix_rows( matrix, 3, 2, plane[1] ); // far = m3 - m2\n this._add_matrix_rows( matrix, 3, 0, plane[2] ); // left = m3 + m0\n this._sub_matrix_rows( matrix, 3, 0, plane[3] ); // right = m3 - m0\n this._add_matrix_rows( matrix, 3, 1, plane[4] ); // bottom = m3 + m1\n this._sub_matrix_rows( matrix, 3, 1, plane[5] ); // top = m3 - m1\n\n // 法線を正規化\n for ( var i = 0; i < 6; ++i ) {\n var p = plane[i];\n var x = p[0];\n var y = p[1];\n var z = p[2];\n var ilen = 1 / Math.sqrt( x*x + y*y + z*z ); // 長さの逆数\n p[0] *= ilen;\n p[1] *= ilen;\n p[2] *= ilen;\n p[3] *= ilen;\n }\n }\n\n\n /**\n * @private\n */\n _setup_pixel_step( width, height )\n {\n // mIJ は view_to_clip の I 行 J 列の成分\n //\n // 2 (m33 - m32)\n // dx = ---------------\n // m00 width\n //\n // 2 (m33 - m32)\n // dy = ---------------\n // m11 height\n\n var mat = this._view_to_clip;\n var m00 = mat[ 0];\n var m11 = mat[ 5];\n var m32 = mat[11];\n var m33 = mat[15];\n\n var n = 2 * (m33 - m32);\n var dx = n / (m00 * width);\n var dy = n / (m11 * height);\n\n this._pixel_step = Math.sqrt( dx*dx + dy*dy ) * Math.SQRT1_2;\n }\n\n\n /**\n * @private\n */\n _add_matrix_rows( mat, row1, row2, dst )\n {\n dst[0] = mat[row1] + mat[row2];\n dst[1] = mat[row1 + 4] + mat[row2 + 4];\n dst[2] = mat[row1 + 8] + mat[row2 + 8];\n dst[3] = mat[row1 + 12] + mat[row2 + 12];\n return dst;\n }\n\n\n /**\n * @private\n */\n _sub_matrix_rows( mat, row1, row2, dst )\n {\n dst[0] = mat[row1] - mat[row2];\n dst[1] = mat[row1 + 4] - mat[row2 + 4];\n dst[2] = mat[row1 + 8] - mat[row2 + 8];\n dst[3] = mat[row1 + 12] - mat[row2 + 12];\n return dst;\n }\n\n}\n\n\nexport default Camera;\n","/**\n * @summary WebGL の環境\n * @desc\n * WebGL レンダリングコンテキストを生成し、そのコンテキストに関連する情報を提供する。\n * @memberof mapray\n * @private\n */\nclass GLEnv {\n\n /**\n * @param canvas {HTMLCanvasElement} レンダリングターゲットとするキャンバス\n */\n constructor( canvas )\n {\n var ctx_attribs = { depth: true, antialias: true };\n\n var context = this._getContextWebGL( canvas, ctx_attribs );\n\n if ( !context ) {\n throw new Error( \"It doesn't appear your computer can support WebGL.\" );\n }\n\n this._canvas = canvas;\n this._context = context;\n this._setupExtensions( context );\n }\n\n\n /** \n * @summary WebGL コンテキストを取得\n * @param {HTMLCanvasElement} canvas Canvas 要素\n * @param {WebGLContextAttributes} ctx_attribs 生成属性 (省略可能)\n * @return {WebGLRenderingContext} 取得された WebGL コンテキスト (コンテキストを持たないときは null)\n * @private\n *\n * @see https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n */\n _getContextWebGL( canvas, ctx_attribs )\n {\n var contextTypes = [\"webgl\", \"experimental-webgl\"];\n for ( var i = 0; i < contextTypes.length; ++i ) {\n var context = canvas.getContext( contextTypes[i], ctx_attribs );\n if ( context ) {\n return context;\n }\n }\n return null;\n }\n\n\n /** \n * @summary 既知の WebGL 拡張を設定\n * @param {WebGLRenderingContext} gl WebGL コンテキスト\n * @private\n * @see https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14\n */\n _setupExtensions( gl )\n {\n // OES_element_index_uint\n this.OES_element_index_uint = gl.getExtension( \"OES_element_index_uint\" );\n\n // EXT_texture_filter_anisotropic\n this.EXT_texture_filter_anisotropic =\n gl.getExtension( \"EXT_texture_filter_anisotropic\" ) ||\n gl.getExtension( \"WEBKIT_EXT_texture_filter_anisotropic\" ) ||\n gl.getExtension( \"MOZ_EXT_texture_filter_anisotropic\" );\n\n // WEBGL_depth_texture\n this.WEBGL_depth_texture =\n gl.getExtension( \"WEBGL_depth_texture\" ) ||\n gl.getExtension( \"WEBKIT_WEBGL_depth_texture\" ) ||\n gl.getExtension( \"MOZ_WEBGL_depth_texture\" );\n }\n\n\n /**\n * @summary レンダリングターゲットとするキャンバス\n * @type {HTMLCanvasElement}\n * @readonly\n */\n get canvas() { return this._canvas; }\n\n\n /**\n * @summary WebGL レンダリングコンテキスト\n * @type {WebGLRenderingContext}\n * @readonly\n */\n get context() { return this._context; }\n\n}\n\nexport default GLEnv;\n","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar test = [];\nvar nativeSort = test.sort;\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n test.sort(null);\n});\n// Old WebKit\nvar STRICT_METHOD = arrayMethodIsStrict('sort');\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD;\n\n// `Array.prototype.sort` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.sort\n$({ target: 'Array', proto: true, forced: FORCED }, {\n sort: function sort(comparefn) {\n return comparefn === undefined\n ? nativeSort.call(toObject(this))\n : nativeSort.call(toObject(this), aFunction(comparefn));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n","var nativeExpm1 = Math.expm1;\nvar exp = Math.exp;\n\n// `Math.expm1` method implementation\n// https://tc39.github.io/ecma262/#sec-math.expm1\nmodule.exports = (!nativeExpm1\n // Old FF bug\n || nativeExpm1(10) > 22025.465794806719 || nativeExpm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || nativeExpm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : exp(x) - 1;\n} : nativeExpm1;\n","var $ = require('../internals/export');\nvar expm1 = require('../internals/math-expm1');\n\nvar nativeCosh = Math.cosh;\nvar abs = Math.abs;\nvar E = Math.E;\n\n// `Math.cosh` method\n// https://tc39.github.io/ecma262/#sec-math.cosh\n$({ target: 'Math', stat: true, forced: !nativeCosh || nativeCosh(710) === Infinity }, {\n cosh: function cosh(x) {\n var t = expm1(abs(x) - 1) + 1;\n return (t + 1 / (t * E * E)) * (E / 2);\n }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return regexMethod.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var $ = require('../internals/export');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\n\n// `DataView` constructor\n// https://tc39.github.io/ecma262/#sec-dataview-constructor\n$({ global: true, forced: !NATIVE_ARRAY_BUFFER }, {\n DataView: ArrayBufferModule.DataView\n});\n","/**\n * @summary DEM サンプラー\n *\n * @desc\n *

DEM バイナリーのデータをサンプルするために使用する。

\n *

インスタンスは [DemBinary#newSampler()]{@link mapray.DemBinary#newSampler} により作成する。

\n *\n * @memberof mapray\n * @private\n * @see mapray.DemBinary\n * @see mapray.DemSamplerLinear\n * @see mapray.DemSamplerNearest\n */\nclass DemSampler {\n\n /**\n * @param {mapray.Area} area DEM 領域\n * @param {number} ρ DEM バイナリの解像度の指数\n * @param {DataView} body DEM 配列データの標高データ部分\n */\n constructor( area, ρ, body )\n {\n var FLT_BYTES = 4;\n\n var p = Math.pow( 2, area.z - 1 ); // 2^(ze-1)\n var c = 1 << ρ; // 画素数\n\n this._sx = p / Math.PI * c;\n this._sy = -this._sx;\n this._ox = (p - area.x) * c;\n this._oy = (p - area.y) * c;\n this._body = body;\n this._pitch = FLT_BYTES * (c + 1);\n this._max = c;\n }\n\n\n /**\n * @summary 標高値をサンプル\n * @param {number} x X 座標 (単位球メルカトル座標系)\n * @param {number} y Y 座標 (単位球メルカトル座標系)\n * @return {number} 標高値 (メートル)\n * @abstract\n */\n sample( x, y )\n {\n return 0;\n }\n\n}\n\n\nexport default DemSampler;\n","import DemSampler from \"./DemSampler\";\nimport GeoMath from \"./GeoMath\";\n\n\n/**\n * @summary 線形 DEM サンプラー\n * @memberof mapray\n * @private\n * @extends mapray.DemSampler\n */\nclass DemSamplerLinear extends DemSampler {\n\n constructor( area, ρ, body )\n {\n super( area, ρ, body );\n }\n\n\n /**\n * @override\n */\n sample( x, y )\n {\n var u = this._sx * x + this._ox;\n var u0 = Math.floor( u ); // 右位置\n var u1 = u0 + 1; // 左位置\n\n var v = this._sy * y + this._oy;\n var v0 = Math.floor( v ); // 上位置\n var v1 = v0 + 1; // 下位置\n\n var h00 = this._sampleInt( u0, v0 ); // 左上標高\n var h10 = this._sampleInt( u1, v0 ); // 右上標高\n var h01 = this._sampleInt( u0, v1 ); // 左下標高\n var h11 = this._sampleInt( u1, v1 ); // 右下標高\n\n // 標高値を補間\n var fu = u - u0; // 水平小数部\n var fv = v - v0; // 垂直小数部\n return (h00 * (1 - fu) + h10 * fu) * (1 - fv) + (h01 * (1 - fu) + h11 * fu) * fv;\n }\n\n\n _sampleInt( u, v )\n {\n var FLT_BYTES = 4;\n\n var cu = GeoMath.clamp( u, 0, this._max );\n var cv = GeoMath.clamp( v, 0, this._max );\n var offset = this._pitch * cv + FLT_BYTES * cu;\n\n return this._body.getFloat32( offset, true );\n }\n\n}\n\n\nexport default DemSamplerLinear;\n","import DemSampler from \"./DemSampler\";\n\n\n/**\n * @summary 最近傍 DEM サンプラー\n * @memberof mapray\n * @private\n * @extends mapray.DemSampler\n */\nclass DemSamplerNearest extends DemSampler {\n\n constructor( area, ρ, body )\n {\n super( area, ρ, body );\n }\n\n\n /**\n * @override\n */\n sample( x, y )\n {\n var FLT_BYTES = 4;\n\n var u = Math.round( this._sx * x + this._ox );\n var v = Math.round( this._sy * y + this._oy );\n\n var offset = this._pitch * v + FLT_BYTES * u;\n return this._body.getFloat32( offset, true );\n }\n\n}\n\n\nexport default DemSamplerNearest;\n","/**\n * @summary 平均標高マップ\n * @memberof mapray\n * @private\n * @see mapray.DemBinary\n * @see mapray.DemBinaryCache\n */\nclass AvgHeightMaps {\n\n /**\n * @param {number} ρ 解像度の指数\n * @param {DataView} body DEM 配列データの標高データ部分\n */\n constructor( ρ, body )\n {\n this._ρ = ρ;\n this._maps = []; // Level: -1, -2, ..., -ρ\n\n if ( ρ >= 1 ) {\n // Level: -1\n var first_map = this._create_first_map( body );\n this._maps.push( first_map );\n\n // Level: -2 .. -ρ\n var src_map = first_map;\n for ( var lv = -2; lv >= -ρ; --lv ) {\n var next_map = this._create_next_map( lv, src_map );\n this._maps.push( next_map );\n src_map = next_map;\n }\n }\n }\n\n\n /**\n * レベル -1 の平均標高マップを生成\n * @param {DataView} src DEM 配列データの標高データ部分\n * @return {Float32Array} レベル -1 の平均標高マップ\n * @private\n */\n _create_first_map( src )\n {\n var FLT_BYTES = 4;\n\n var size = 1 << (this._ρ - 1);\n var dst = new Float32Array( size * size );\n\n var src_pitch = (2*size + 1) * FLT_BYTES;\n var dst_pitch = size;\n\n for ( var j = 0; j < size; ++j ) {\n var src_index = 2*j * src_pitch;\n var dst_index = j * dst_pitch;\n\n for ( var i = 0; i < size; ++i ) {\n // 標高データを取り出す\n var h00 = src.getFloat32( src_index, true );\n var h10 = src.getFloat32( src_index + FLT_BYTES, true );\n var h20 = src.getFloat32( src_index + 2*FLT_BYTES, true );\n var h01 = src.getFloat32( src_index + src_pitch, true );\n var h11 = src.getFloat32( src_index + src_pitch + FLT_BYTES, true );\n var h21 = src.getFloat32( src_index + src_pitch + 2*FLT_BYTES, true );\n var h02 = src.getFloat32( src_index + 2*src_pitch, true );\n var h12 = src.getFloat32( src_index + 2*src_pitch + FLT_BYTES, true );\n var h22 = src.getFloat32( src_index + 2*(src_pitch + FLT_BYTES), true );\n\n // 平均標高を書き込む\n dst[dst_index] = (h00 + 2*h10 + h20 + 2*h01 + 4*h11 + 2*h21 + h02 + 2*h12 + h22) / 16;\n\n src_index += 2*FLT_BYTES;\n dst_index += 1;\n }\n }\n\n return dst;\n }\n\n\n /**\n * レベル -2 .. -ρ の平均標高マップを生成\n * @param {number} lv 生成するマップのレベル\n * @param {Float32Array} src 元となる平均標高マップ (レベル lv + 1)\n * @return {Float32Array} レベル lv の平均標高マップ\n * @private\n */\n _create_next_map( lv, src )\n {\n var size = 1 << (this._ρ + lv);\n var dst = new Float32Array( size * size );\n\n var src_pitch = 2*size;\n var dst_pitch = size;\n\n for ( var j = 0; j < size; ++j ) {\n var src_index = 2*j * src_pitch;\n var dst_index = j * dst_pitch;\n\n for ( var i = 0; i < size; ++i ) {\n // 標高データを取り出す\n var h00 = src[src_index];\n var h10 = src[src_index + 1];\n var h01 = src[src_index + src_pitch];\n var h11 = src[src_index + src_pitch + 1];\n\n // 平均標高を書き込む\n dst[dst_index] = (h00 + h10 + h01 + h11) / 4;\n\n src_index += 2;\n dst_index += 1;\n }\n }\n\n return dst;\n }\n\n\n /**\n * @summary 平均標高を取得\n * @desc\n *

地表断片 の平均標高を取得する。

\n * @param {number} zg 地表断片分割レベル (0 <= zg < ρ)\n * @param {number} xg 地表断片 X 座標\n * @param {number} yg 地表断片 Y 座標\n * @return {number} 平均標高\n */\n sample( zg, xg, yg )\n {\n var map = this._maps[this._ρ - zg - 1];\n var size = 1 << zg;\n return map[yg * size + xg];\n }\n\n}\n\n\nexport default AvgHeightMaps;\n","import GeoMath from \"./GeoMath\";\nimport DemSamplerLinear from \"./DemSamplerLinear\";\nimport DemSamplerNearest from \"./DemSamplerNearest\";\nimport AvgHeightMaps from \"./AvgHeightMaps\";\n\n\n/**\n * @summary DEM バイナリーデータ\n * @memberof mapray\n * @private\n * @see mapray.DemSampler\n */\nclass DemBinary {\n\n /**\n * @param {number} z ズームレベル\n * @param {number} x X タイル座標\n * @param {number} y Y タイル座標\n * @param {number} ρ 解像度の指数\n * @param {ArrayBuffer} array DEM 配列データ\n */\n constructor( z, x, y, ρ, array )\n {\n this._z = z;\n this._x = x;\n this._y = y;\n this._ρ= ρ;\n\n // ヘッダー情報を取得\n var header = new DataView( array );\n this._qlevels = [\n header.getUint8( DemBinary.OFFSET_QLEVEL_00 ), // 四分存在レベル (左上)\n header.getUint8( DemBinary.OFFSET_QLEVEL_10 ), // 四分存在レベル (右上)\n header.getUint8( DemBinary.OFFSET_QLEVEL_01 ), // 四分存在レベル (左下)\n header.getUint8( DemBinary.OFFSET_QLEVEL_11 ) // 四分存在レベル (右下)\n ];\n this._hmin = header.getFloat32( DemBinary.OFFSET_HMIN, true ); // 最小標高\n this._hmax = header.getFloat32( DemBinary.OFFSET_HMAX, true ); // 最大標高\n this._ω = this._createωArray( header ); // 複雑度\n\n // 標高配列への参照を取得\n this._body = new DataView( array, DemBinary.HEADER_BYTES );\n\n // 標高配列の 1 行の標高数\n this._size = (1 << ρ) + 1;\n }\n\n\n /**\n * @summary ズームレベル\n * @type {number}\n * @readonly\n */\n get z()\n {\n return this._z;\n }\n\n\n /**\n * @summary X タイル座標\n * @type {number}\n * @readonly\n */\n get x()\n {\n return this._x;\n }\n\n\n /**\n * @summary Y タイル座標\n * @type {number}\n * @readonly\n */\n get y()\n {\n return this._y;\n }\n\n\n /**\n * @summary 最小標高\n * @desc\n *

このタイルに対応する地表の領域で最も低い点の標高を返す。

\n *

この値は this の葉タイルのデータに基づいているので、this の個々のサンプル値の最小値よりも小さい値の可能性があることに注意されたい。

\n * @type {number}\n * @readonly\n */\n get height_min()\n {\n return this._hmin;\n }\n\n\n /**\n * @summary 最大標高\n *

このタイルに対応する地表の領域で最も高い点の標高を返す。

\n *

この値は this の葉タイルのデータに基づいているので、this の個々のサンプル値の最大値よりも大きい値の可能性があることに注意されたい。

\n * @type {number}\n * @readonly\n */\n get height_max()\n {\n return this._hmax;\n }\n\n /**\n * @summary 地表断片に対して葉タイルか?\n * @desc\n *

地表断片 [zg, xg, yg] に対して、this はサーバー内で最も詳細な DEM データであるかどうかを返す。

\n *

制約: [zg, xg, yg] の領域は this と同じまたは包含されていること。

\n * @param {number} zg 分割レベル\n * @param {number} xg X 座標\n * @param {number} yg Y 座標\n * @return {boolean} 葉タイルのとき true, それ以外は false\n */\n isLeaf( zg, xg, yg )\n {\n if ( zg > this._z ) {\n return this.getQuadLevel( zg, xg, yg ) == 0;\n }\n else {\n var q = this._qlevels;\n return (q[0] == 0) || (q[1] == 0) || (q[2] == 0) || (q[3] == 0);\n }\n }\n\n\n /**\n * @summary 四分存在レベルを取得\n * @desc\n *

制約: zg > this.z かつ [zg, xg, yg] の領域は this に包含されていること。

\n * @param {number} zg 分割レベル\n * @param {number} xg X 座標\n * @param {number} yg Y 座標\n * @return {number} 四分存在レベル\n */\n getQuadLevel( zg, xg, yg )\n {\n var pow = Math.pow( 2, this._z - zg );\n var u = Math.floor( 2 * ((xg + 0.5) * pow - this._x) );\n var v = Math.floor( 2 * ((yg + 0.5) * pow - this._y) );\n return this._qlevels[2*v + u];\n }\n\n\n /**\n * @summary 四分存在レベルを取得\n * @desc\n *

基底タイル座標 (左上(0, 0)、右下(1, 1)) [xt, yt] を含む領域の四分存在レベルを取得する。

\n *

制約: [xt, yt] の領域は this に包含されていること。

\n * @param {number} xt X 座標\n * @param {number} yt Y 座標\n * @return {number} 四分存在レベル\n */\n getQuadLevelDirect( xt, yt )\n {\n var pow = Math.round( Math.pow( 2, this._z + 1 ) );\n var u = GeoMath.clamp( Math.floor( xt * pow ), 0, pow - 1 ) % 2;\n var v = GeoMath.clamp( Math.floor( yt * pow ), 0, pow - 1 ) % 2;\n return this._qlevels[2*v + u];\n }\n\n\n /**\n * @summary 標高点正方形の4隅の標高を取得\n * @desc\n *

注意: 次の呼び出しで、結果配列は上書きされる。

\n * @param {number} u 水平方向の標高点正方形位置\n * @param {number} v 垂直方向の標高点正方形位置\n * @return {array} 4隅の標高の配列 [左上, 右上, 左下, 右下]\n */\n getHeights( u, v )\n {\n var FLT_BYTES = 4;\n var origin = FLT_BYTES * (v * this._size + u);\n var pitch = FLT_BYTES * this._size;\n\n var h = DemBinary._getHeights_result;\n h[0] = this._body.getFloat32( origin, true );\n h[1] = this._body.getFloat32( origin + FLT_BYTES, true );\n h[2] = this._body.getFloat32( origin + pitch, true );\n h[3] = this._body.getFloat32( origin + pitch + FLT_BYTES, true );\n return h;\n }\n\n\n /**\n * @summary 地表断片の分割指数を取得\n * @desc\n *

注意: 次の呼び出しで、結果配列は上書きされる。

\n *\n * @param {mapray.Area} flake_area 地表断片の領域\n * @param {number} lod 地表詳細レベル (LOD)\n * @param {number} cu 水平球面分割レベル\n * @param {number} cv 垂直球面分割レベル\n *\n * @return {array} [水平分割指数, 垂直分割指数]\n */\n getDivisionPowers( flake_area, lod, cu, cv )\n {\n var zg = flake_area.z;\n var ze = this._z;\n var b = GeoMath.LOG2PI - this._ρ + 1; // b = log2π - ρ + 1\n var ω = this._getComplexity( zg, flake_area.x, flake_area.y );\n\n // {gu, gv} = max( {cu, cv}, min( ze + ρ, round( lod + b + ω ) ) − zg )\n var arg = Math.min( ze + this._ρ, Math.round( lod + b + ω ) ) - zg;\n\n var result = DemBinary._getDivisionPowers_result;\n result[0] = Math.max( cu, arg ); // 水平分割指数\n result[1] = Math.max( cv, arg ); // 垂直分割指数\n return result;\n }\n\n\n /**\n * @summary DEM サンプラーを生成\n *\n * @param {mapray.Area} flake_area 地表断片の領域\n *\n * @return {mapray.DemSampler} DEM サンプラー\n */\n newSampler( flake_area )\n {\n // 今のところ、地表断片が 1 標高点またはそれ以上のとき、最近傍サンプラーでも結果が\n // 変わらないので、最適化のためにサンプラーを別けている\n var samplerClass = (flake_area.z - this._z > this._ρ) ? DemSamplerLinear : DemSamplerNearest;\n return new samplerClass( this, this._ρ, this._body );\n }\n\n\n /**\n * @summary 線形 DEM サンプラーを生成\n *\n * @return {mapray.DemSamplerLinear} DEM サンプラー\n */\n newLinearSampler()\n {\n return new DemSamplerLinear( this, this._ρ, this._body );\n }\n\n\n /**\n * @summary 平均標高マップを生成\n * @return {mapray.AvgHeightMaps} 平均標高マップ\n */\n newAvgHeightMaps()\n {\n return new AvgHeightMaps( this._ρ, this._body );\n }\n\n\n /**\n * @private\n */\n _createωArray( header )\n {\n var FLT_BYTES = 4;\n\n var ωs = [];\n var offset = 0;\n for ( var down = 0; down < 3; ++down ) {\n var count = 1 << (2 * down);\n var array = new Float32Array( count );\n for ( var i = 0; i < count; ++i ) {\n array[i] = header.getFloat32( DemBinary.OFFSET_ω + offset, true );\n offset += FLT_BYTES;\n }\n ωs.push( array );\n }\n\n return ωs;\n }\n\n\n /**\n * @summary 複雑度を取得\n * @desc\n *

this 上の地表断片 (zg, xg, yg) の複雑度 (ω) を取得する。

\n * @param {number} zg 分割レベル\n * @param {number} xg X 座標\n * @param {number} yg Y 座標\n * @return {number} 複雑度\n * @private\n */\n _getComplexity( zg, xg, yg )\n {\n var d = zg - this._z;\n var p = Math.round( Math.pow( 2, d ) );\n\n var dmax = 2; // this._ω.length - 1\n var smax = 4; // 2^c\n\n var u;\n var v;\n if ( d <= dmax ) {\n u = xg - p * this._x;\n v = yg - p * this._y;\n }\n else {\n u = Math.floor( smax * ((xg + 0.5) / p - this._x) );\n v = Math.floor( smax * ((yg + 0.5) / p - this._y) );\n }\n\n var index = Math.min( d, dmax );\n var array = this._ω[index];\n return Math.min( array[v * (1 << index) + u], DemBinary.ω_limit );\n }\n\n}\n\n\nDemBinary.OFFSET_QLEVEL_00 = 0;\nDemBinary.OFFSET_QLEVEL_10 = 1;\nDemBinary.OFFSET_QLEVEL_01 = 2;\nDemBinary.OFFSET_QLEVEL_11 = 3;\nDemBinary.OFFSET_HMIN = 4;\nDemBinary.OFFSET_HMAX = 8;\nDemBinary.OFFSET_ω = 12;\nDemBinary.HEADER_BYTES = 96;\nDemBinary.ω_limit = 6;\nDemBinary._getHeights_result = new Array( 4 );\nDemBinary._getDivisionPowers_result = new Array( 2 );\n\n\nexport default DemBinary;\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int16Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int16', function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int32Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int32', function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","import GeoMath from \"./GeoMath\";\n\n\n/**\n * @summary 地表領域ユーティリティー\n *\n * @hideconstructor\n * @memberof mapray\n * @private\n */\nclass AreaUtil\n{\n\n /**\n * @summary 地表領域の中心位置を GOCS で取得\n *\n * @desc\n *

領域 area の中心位置 (GOCS) を dst に格納する。

\n *\n * @param {mapray.Area} area 地表領域\n * @param {mapray.Vector3} dst 結果を格納するオブジェクト (GOCS)\n *\n * @return {mapray.Vector3} dst\n */\n static\n getCenter( area, dst )\n {\n switch ( area.z ) {\n case 0: return getCenter_0( dst );\n case 1: return getCenter_1( area.x, area.y, dst );\n default: return getCenter_N( area.z, area.x, area.y, dst );\n }\n }\n\n}\n\n\n/**\n * @summary 地表の ZXY 領域を表現\n *\n * @desc\n *

このクラスは便宜的なものであり実在しない。

\n *

z, x, y プロパティから地表の領域を表す ZXY 座標を読み出せるオブジェクトは、このクラスのインスタンスと解釈する。

\n *\n * @class mapray.Area\n * @private\n *\n * @see mapray.AreaUtil\n */\n\n\n// AreaUtil.getCenter() の一部\nfunction\ngetCenter_0( dst )\n{\n dst[0] = 0;\n dst[1] = 0;\n dst[2] = 0;\n\n return dst;\n}\n\n\n// AreaUtil.getCenter() の一部\nfunction\ngetCenter_1( x, y, dst )\n{\n var r = GeoMath.EARTH_RADIUS;\n\n dst[0] = 0;\n dst[1] = r * (x - 0.5);\n dst[2] = r * (0.5 - y);\n\n return dst;\n}\n\n\n// AreaUtil.getCenter() の一部\nfunction\ngetCenter_N( z, x, y, dst )\n{\n var pi = Math.PI;\n\n // 座標範囲 (単位球メルカトル座標系)\n var msize = Math.pow( 2, 1 - z ) * pi;\n var mx_min = -pi + x * msize;\n var mx_max = -pi + (x + 1) * msize;\n var my_min = pi - (y + 1) * msize;\n var my_max = pi - y * msize;\n\n // 事前計算変数\n var λmin = mx_min;\n var λmax = mx_max;\n var emin = Math.exp( my_min ); // Exp[my_min]\n var emax = Math.exp( my_max ); // Exp[my_max]\n var e2min = emin * emin; // Exp[my_min]^2\n var e2max = emax * emax; // Exp[my_max]^2\n\n // 座標範囲 (地心直交座標系)\n //\n // z >= 2 のとき、λとφの範囲は以下の区間のどれかに入る\n // φ: (-π/2, 0] [0, π/2)\n // λ: [-π, -π/2] [-π/2, 0] [0, π/2] [π/2, π]\n //\n // 区間ごとの関数の変化 (各区間で単調増加または単調減少)\n // Sin[φ]: (-1 → 0] [0 → 1)\n // Cos[φ]: ( 0 → 1] [1 → 0)\n // Sin[λ]: [ 0 → -1] [-1 → 0] [0 → 1] [1 → 0]\n // Cos[λ]: [-1 → 0] [ 0 → 1] [1 → 0] [0 → -1]\n\n var rh = GeoMath.EARTH_RADIUS / 2;\n var cosφmin = 2 * emin / (e2min + 1);\n var cosφmax = 2 * emax / (e2max + 1);\n\n // gx = r Cos[φ] Cos[λ]\n // gy = r Cos[φ] Sin[λ]\n if ( my_min + my_max < 0 ) {\n // φ : (-π/2, 0]\n // Cos[φ]: ( 0 → 1]\n if ( λmin + λmax < -pi ) {\n // λ : [-π, -π/2]\n // Cos[λ]: [-1 → 0]\n // Sin[λ]: [ 0 → -1]\n dst[0] = rh * (cosφmax * Math.cos( λmin ) + cosφmin * Math.cos( λmax ));\n dst[1] = rh * (cosφmax * Math.sin( λmax ) + cosφmin * Math.sin( λmin ));\n }\n else if ( λmin + λmax < 0 ) {\n // λ : [-π/2, 0]\n // Cos[λ]: [ 0 → 1]\n // Sin[λ]: [-1 → 0]\n dst[0] = rh * (cosφmin * Math.cos( λmin ) + cosφmax * Math.cos( λmax ));\n dst[1] = rh * (cosφmax * Math.sin( λmin ) + cosφmin * Math.sin( λmax ));\n }\n else if ( λmin + λmax < pi ) {\n // λ : [0, π/2]\n // Cos[λ]: [1 → 0]\n // Sin[λ]: [0 → 1]\n dst[0] = rh * (cosφmin * Math.cos( λmax ) + cosφmax * Math.cos( λmin ));\n dst[1] = rh * (cosφmin * Math.sin( λmin ) + cosφmax * Math.sin( λmax ));\n }\n else {\n // λ : [π/2, π]\n // Cos[λ]: [0 → -1]\n // Sin[λ]: [1 → 0]\n dst[0] = rh * (cosφmax * Math.cos( λmax ) + cosφmin * Math.cos( λmin ));\n dst[1] = rh * (cosφmin * Math.sin( λmax ) + cosφmax * Math.sin( λmin ));\n }\n }\n else {\n // φ : [0, π/2)\n // Cos[φ]: [1 → 0)\n if ( λmin + λmax < -pi ) {\n // λ : [-π, -π/2]\n // Cos[λ]: [-1 → 0]\n // Sin[λ]: [ 0 → -1]\n dst[0] = rh * (cosφmin * Math.cos( λmin ) + cosφmax * Math.cos( λmax ));\n dst[1] = rh * (cosφmin * Math.sin( λmax ) + cosφmax * Math.sin( λmin ));\n }\n else if ( λmin + λmax < 0 ) {\n // λ : [-π/2, 0]\n // Cos[λ]: [ 0 → 1]\n // Sin[λ]: [-1 → 0]\n dst[0] = rh * (cosφmax * Math.cos( λmin ) + cosφmin * Math.cos( λmax ));\n dst[1] = rh * (cosφmin * Math.sin( λmin ) + cosφmax * Math.sin( λmax ));\n }\n else if ( λmin + λmax < pi ) {\n // λ : [0, π/2]\n // Cos[λ]: [1 → 0]\n // Sin[λ]: [0 → 1]\n dst[0] = rh * (cosφmax * Math.cos( λmax ) + cosφmin * Math.cos( λmin ));\n dst[1] = rh * (cosφmax * Math.sin( λmin ) + cosφmin * Math.sin( λmax ));\n }\n else {\n // λ : [π/2, π]\n // Cos[λ]: [0 → -1]\n // Sin[λ]: [1 → 0]\n dst[0] = rh * (cosφmin * Math.cos( λmax ) + cosφmax * Math.cos( λmin ));\n dst[1] = rh * (cosφmax * Math.sin( λmax ) + cosφmin * Math.sin( λmin ));\n }\n }\n\n // rh * (Sin[φmin] + Sin[φmax])\n dst[2] = rh * 2 * (e2max / (e2max + 1) - 1 / (e2min + 1));\n\n return dst;\n}\n\n\nexport default AreaUtil;\n","import GeoMath from \"./GeoMath\";\nimport AreaUtil from \"./AreaUtil\";\n\n\n/**\n * @summary 地表断片メッシュ\n * @memberof mapray\n * @private\n */\nclass FlakeMesh {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {mapray.Area} area 地表断片の領域\n * @param {number[]} dpows 地表断片の分割指数\n * @param {mapray.DemBinary} dem DEM バイナリ\n */\n constructor( glenv, area, dpows, dem )\n {\n var gl = glenv.context;\n\n // オブジェクト座標系の中心位置 (GOCS)\n this._center = this._createCenter( area );\n\n // 頂点バッファ\n this._vertices = null;\n\n // 頂点数\n this._num_vertices = 0;\n\n // 頂点属性辞書\n this._vertex_attribs = {};\n\n // XY グリッドサイズ\n this._num_quads_x = 0;\n this._num_quads_y = 0;\n\n // 頂点データを生成\n this._createVertices( gl, area, dpows, dem );\n\n // 頂点属性辞書を設定\n this._setupVertexAttribs( gl );\n\n // インデックス型\n this._index_type = (this._num_vertices < 65536) ? gl.UNSIGNED_SHORT : gl.UNSIGNED_INT;\n\n // インデックス (GL_TRIANGLES)\n this._indices = null;\n this._num_indices = 0;\n\n // インデックス (GL_LINES)\n this._wire_indices = null;\n this._num_wire_indices = 0;\n\n this._gl = gl;\n }\n\n\n /**\n * @summary 中心位置を生成\n *\n * @param {mapray.Area} area 地表断片の領域\n *\n * @return {mapray.Vector3} 中心位置 (GOCS)\n *\n * @private\n */\n _createCenter( area )\n {\n return AreaUtil.getCenter( area, GeoMath.createVector3() );\n }\n\n\n _createVertices( gl, area, dpows, dem )\n {\n var target = gl.ARRAY_BUFFER;\n var vbo = gl.createBuffer();\n var data = this._createVerticesData( area, dpows, dem );\n\n gl.bindBuffer( target, vbo );\n gl.bufferData( target, data.array, gl.STATIC_DRAW );\n gl.bindBuffer( target, null );\n\n this._vertices = vbo;\n this._num_vertices = data.num_vertices;\n this._num_quads_x = data.num_quads_x;\n this._num_quads_y = data.num_quads_y;\n }\n\n\n _createVerticesData( area, dpows, dem )\n {\n // 開始位置 (単位球メルカトル座標系)\n var msize = Math.pow( 2, 1 - area.z ) * Math.PI;\n var mx_min = area.x * msize - Math.PI;\n var my_min = Math.PI - (area.y + 1) * msize;\n\n // 分割数\n var u_count = 1 << dpows[0];\n var v_count = 1 << dpows[1];\n\n // 刻み幅\n var u_step = 1 / u_count;\n var v_step = 1 / v_count;\n var mx_step = msize / u_count;\n var my_step = msize / v_count;\n\n var center = this._center;\n var demSampler = dem.newSampler( area );\n\n var num_vertices = (u_count + 1) * (v_count + 1);\n var array = new Float32Array( FlakeMesh.VERTEX_SIZE * num_vertices );\n var index = 0;\n\n for ( var iv = 0, my = my_min; iv < v_count + 1; ++iv, my += my_step ) {\n var ey = Math.exp( my );\n var ey2 = ey * ey;\n var sinφ = (ey2 - 1) / (ey2 + 1);\n var cosφ = 2 * ey / (ey2 + 1);\n for ( var iu = 0, mx = mx_min; iu < u_count + 1; ++iu, mx += mx_step ) {\n var sinλ = Math.sin( mx );\n var cosλ = Math.cos( mx );\n\n var height = demSampler.sample( mx, my );\n var radius = GeoMath.EARTH_RADIUS + height;\n\n // 法線 (GOCS)\n var nx = cosφ * cosλ;\n var ny = cosφ * sinλ;\n var nz = sinφ;\n\n // 位置 (GOCS)\n var gx = radius * nx;\n var gy = radius * ny;\n var gz = radius * nz;\n\n array[index++] = gx - center[0]; // x\n array[index++] = gy - center[1]; // y\n array[index++] = gz - center[2]; // z\n array[index++] = nx; // nx\n array[index++] = ny; // ny\n array[index++] = nz; // nz\n array[index++] = iu * u_step; // mu\n array[index++] = iv * v_step; // mv\n }\n }\n\n return {\n array: array,\n num_vertices: num_vertices,\n num_quads_x: u_count,\n num_quads_y: v_count\n };\n }\n\n\n /**\n * @summary 頂点属性の辞書を設定\n * @desc\n *

this._vertex_attribs に Mesh.AttribData の辞書を設定する。

\n *\n * @param {WebGLRenderingContext} gl\n * @private\n */\n _setupVertexAttribs( gl )\n {\n var type = gl.FLOAT;\n var stride = FlakeMesh.VERTEX_BYTES;\n\n // Mesh.AttribData の辞書\n this._vertex_attribs = {\n\n \"a_position\": {\n buffer: this._vertices,\n num_components: 3,\n component_type: type,\n normalized: false,\n byte_stride: stride,\n byte_offset: FlakeMesh.OFFSET_P\n },\n\n \"a_normal\": {\n buffer: this._vertices,\n num_components: 3,\n component_type: type,\n normalized: false,\n byte_stride: stride,\n byte_offset: FlakeMesh.OFFSET_N\n },\n\n \"a_uv\": {\n buffer: this._vertices,\n num_components: 2,\n component_type: type,\n normalized: false,\n byte_stride: stride,\n byte_offset: FlakeMesh.OFFSET_UV\n }\n\n };\n }\n\n\n _createIndices()\n {\n var gl = this._gl;\n\n var num_quads = this._num_quads_x * this._num_quads_y;\n var num_indices = 6 * num_quads;\n\n var typedArray = (this._index_type === gl.UNSIGNED_INT) ? Int32Array : Int16Array;\n\n var array = new typedArray( num_indices );\n var index = 0;\n\n for ( var y = 0; y < this._num_quads_y; ++y ) {\n for ( var x = 0; x < this._num_quads_x; ++x ) {\n var i00 = (this._num_quads_x + 1) * y + x; // 左下頂点\n var i10 = i00 + 1; // 右下頂点\n var i01 = i00 + this._num_quads_x + 1; // 左上頂点\n var i11 = i01 + 1; // 右上頂点\n\n // 左下三角形\n array[index++] = i00;\n array[index++] = i10;\n array[index++] = i01;\n\n // 右上三角形\n array[index++] = i01;\n array[index++] = i10;\n array[index++] = i11;\n }\n }\n\n var target = gl.ELEMENT_ARRAY_BUFFER;\n var vbo = gl.createBuffer();\n\n gl.bindBuffer( target, vbo );\n gl.bufferData( target, array, gl.STATIC_DRAW );\n gl.bindBuffer( target, null );\n\n this._indices = vbo;\n this._num_indices = num_indices;\n }\n\n\n _createWireIndices()\n {\n var gl = this._gl;\n\n var typedArray = (this._index_type === gl.UNSIGNED_INT) ? Int32Array : Int16Array;\n var num_indices = 2 * (2 * this._num_quads_x * this._num_quads_y + this._num_quads_x + this._num_quads_y);\n\n var array = new typedArray( num_indices );\n var index = 0;\n\n // 水平線\n for ( var y = 0; y < this._num_quads_y + 1; ++y ) {\n for ( var x = 0; x < this._num_quads_x; ++x ) {\n var i00 = (this._num_quads_x + 1) * y + x; // 左下頂点\n var i10 = i00 + 1; // 右下頂点\n // 下水平線\n array[index++] = i00;\n array[index++] = i10;\n }\n }\n\n // 垂直線\n for ( x = 0; x < this._num_quads_x + 1; ++x ) {\n for ( y = 0; y < this._num_quads_y; ++y ) {\n var j00 = (this._num_quads_x + 1) * y + x; // 左下頂点\n var j01 = j00 + this._num_quads_x + 1; // 左上頂点\n // 左垂直線\n array[index++] = j00;\n array[index++] = j01;\n }\n }\n\n var target = gl.ELEMENT_ARRAY_BUFFER;\n var vbo = gl.createBuffer();\n\n gl.bindBuffer( target, vbo );\n gl.bufferData( target, array, gl.STATIC_DRAW );\n gl.bindBuffer( target, null );\n\n this._wire_indices = vbo;\n this._num_wire_indices = num_indices;\n }\n\n /**\n * @summary 頂点数\n * @type {number}\n * @readonly\n */\n get num_vertices()\n {\n return this._num_vertices;\n }\n\n /**\n * @summary インデックス (GL_TRIANGLES)\n * @type {WebGLBuffer}\n * @readonly\n */\n get indices()\n {\n if ( this._indices === null ) {\n this._createIndices();\n }\n return this._indices;\n }\n\n\n /**\n * @summary インデックス数 (GL_TRIANGLES)\n * @type {number}\n * @readonly\n */\n get num_indices()\n {\n if ( this._indices === null ) {\n this._createIndices();\n }\n return this._num_indices;\n }\n\n\n /**\n * @summary インデックス (GL_LINES)\n * @type {WebGLBuffer}\n * @readonly\n */\n get wire_indices()\n {\n if ( this._wire_indices === null ) {\n this._createWireIndices();\n }\n return this._wire_indices;\n }\n\n\n /**\n * @summary インデックス数 (GL_LINES)\n * @type {number}\n * @readonly\n */\n get num_wire_indices()\n {\n if ( this._wire_indices === null ) {\n this._createWireIndices();\n }\n return this._num_wire_indices;\n }\n\n\n /**\n * @summary リソースを破棄\n */\n dispose()\n {\n var gl = this._gl;\n\n this._vertex_attribs = {};\n\n gl.deleteBuffer( this._vertices );\n this._vertices = null;\n\n if ( this._indices ) {\n gl.deleteBuffer( this._indices );\n this._indices = null;\n }\n\n if ( this._wire_indices ) {\n gl.deleteBuffer( this._wire_indices );\n this._wire_indices = null;\n }\n }\n\n\n /** \n * @summary 変換行列を計算\n * @desc\n * mat に地表断片座標系から GOCS への変換行列を掛ける。\n * @param {mapray.Matrix} mat 行列\n * @param {mapray.Matrix} dst 結果\n * @return {mapray.Matrix} dst\n */\n mul_flake_to_gocs( mat, dst )\n {\n var m00 = mat[ 0], m01 = mat[ 4], m02 = mat[ 8], m03 = mat[12],\n m10 = mat[ 1], m11 = mat[ 5], m12 = mat[ 9], m13 = mat[13],\n m20 = mat[ 2], m21 = mat[ 6], m22 = mat[10], m23 = mat[14],\n m30 = mat[ 3], m31 = mat[ 7], m32 = mat[11], m33 = mat[15];\n\n var t03 = this._center[0],\n t13 = this._center[1],\n t23 = this._center[2];\n\n dst[ 0] = m00;\n dst[ 1] = m10;\n dst[ 2] = m20;\n dst[ 3] = m30;\n\n dst[ 4] = m01;\n dst[ 5] = m11;\n dst[ 6] = m21;\n dst[ 7] = m31;\n\n dst[ 8] = m02;\n dst[ 9] = m12;\n dst[10] = m22;\n dst[11] = m32;\n\n dst[12] = m00*t03 + m01*t13 + m02*t23 + m03;\n dst[13] = m10*t03 + m11*t13 + m12*t23 + m13;\n dst[14] = m20*t03 + m21*t13 + m22*t23 + m23;\n dst[15] = m30*t03 + m31*t13 + m32*t23 + m33;\n\n return dst;\n }\n\n\n /**\n * @summary メッシュを描画\n * @desc\n *

事前に material.bindProgram() すること。

\n * @param {mapray.RenderStage.FlakeMaterial} material マテリアル\n */\n draw( material )\n {\n var gl = this._gl;\n var isWire = material.isWireframe();\n\n // 頂点属性のバインド\n material.bindVertexAttribs( this._vertex_attribs );\n\n // インデックスのバインド\n var indices = isWire ? this.wire_indices : this.indices;\n gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, indices );\n\n // 描画処理\n var mode = isWire ? gl.LINES : gl.TRIANGLES;\n var num_indices = isWire ? this.num_wire_indices : this.num_indices;\n gl.drawElements( mode, num_indices, this._index_type, 0 );\n }\n\n}\n\n\n// クラス定数の定義\n{\n FlakeMesh.VERTEX_SIZE = 8; // 1頂点の float 数\n\n\n /**\n * @summary 1頂点のバイト数\n * @member mapray.FlakeMesh.VERTEX_BYTES\n * @type {number}\n * @static\n * @constant\n */\n FlakeMesh.VERTEX_BYTES = 4 * FlakeMesh.VERTEX_SIZE;\n\n\n /**\n * @summary 位置座標のオフセット\n * @member mapray.FlakeMesh.OFFSET_P\n * @type {number}\n * @static\n * @constant\n */\n FlakeMesh.OFFSET_P = 0;\n\n\n /**\n * @summary 法線座標のオフセット\n * @member mapray.FlakeMesh.OFFSET_N\n * @type {number}\n * @static\n * @constant\n */\n FlakeMesh.OFFSET_N = 12;\n\n\n /**\n * @summary UV 座標のオフセット\n * @member mapray.FlakeMesh.OFFSET_UV\n * @type {number}\n * @static\n * @constant\n */\n FlakeMesh.OFFSET_UV = 24;\n}\n\n\nexport default FlakeMesh;\n","import GeoMath from \"./GeoMath\";\n\n\n/**\n * @summary 描画プリミティブ\n * @memberof mapray\n * @private\n * @see mapray.PropSet\n * @see mapray.Entity#getPrimitives\n */\nclass Primitive {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {mapray.Mesh} mesh メッシュ\n * @param {mapray.EntityMaterial} material マテリアル\n * @param {mapray.Matrix} transform 変換行列\n */\n constructor( glenv, mesh, material, transform )\n {\n this._glenv = glenv;\n\n /**\n * @summary 描画されるメッシュ\n * @desc\n *

構築子の mesh 引数が設定されている。

\n * @member mapray.Primitive#mesh\n * @type {mapray.Mesh}\n */\n this.mesh = mesh;\n\n /**\n * @summary 描画に使用するマテリアル\n * @desc\n *

構築子の material 引数が設定されている。

\n * @member mapray.Primitive#material\n * @type {mapray.EntityMaterial}\n */\n this.material = material;\n\n /**\n * @summary モデル座標系から GOCS への変換行列\n * @desc\n *

構築子の transform 引数が設定されている。

\n * @member mapray.Primitive#transform\n * @type {mapray.Matrix}\n */\n this.transform = transform;\n\n /**\n * @summary 中心点 (モデル座標系)\n * @desc\n *

null のときは零ベクトルと見なす。

\n * @member mapray.Primitive#pivot\n * @type {?mapray.Vector3}\n * @default null\n */\n this.pivot = null;\n\n /**\n * @summary 境界箱 (モデル座標系)\n * @desc\n *

bbox[0] は座標の最小値、bbox[1] は座標の最大値とする。

\n *

null のときは無限大の境界箱と見なす。

\n * @member mapray.Primitive#bbox\n * @type {?Array.}\n * @default null\n */\n this.bbox = null;\n\n /**\n * @summary プロパティ集合\n * @desc\n *

null のときは空集合と見なす。

\n * @member mapray.Primitive#properties\n * @type {?mapray.PropSet}\n * @default null\n */\n this.properties = null;\n\n /**\n * @summary ソート深度\n * @member mapray.Primitive#sort_z\n * @type {number}\n * @readonly\n * @package\n */\n this.sort_z = undefined;\n }\n\n\n /**\n * @summary インスタンスの複製を返す\n *\n * @desc\n *

公開プロパティが this と同じインスタンスを生成して返す。

\n *

ただしプロパティ mesh, material, properties は参照コピーで、それ以外は深いコピーとなる。

\n *\n * @return {mapray.Primitive} インスタンスの複製\n */\n fastClone()\n {\n var clone = new Primitive( this._glenv, this.mesh, this.material, GeoMath.createMatrix( this.transform ) );\n\n if ( this.pivot ) {\n clone.pivot = GeoMath.createVector3( this.pivot );\n }\n\n if ( this.bbox ) {\n clone.bbox = this.bbox.map( v => GeoMath.createVector3( v ) );\n }\n\n clone.properties = this.properties;\n\n return clone;\n }\n\n\n /**\n * @summary プリミティブが見えるか?\n * @desc\n *

true を返したときはソート深度 this.sort_z が設定される。

\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @return {boolean} プリミティブの一部が視体積に含まれるとき true, それ以外のとき false\n * @package\n */\n isVisible( stage )\n {\n // obj_to_view = stage._gocs_to_view * this.transform\n var matrix = Primitive._obj_to_view;\n GeoMath.mul_AA( stage._gocs_to_view, this.transform, matrix );\n\n var bbox = this.bbox;\n if ( bbox ) {\n // 境界箱の頂点座標を変換 (視点空間) -> bbox_points\n Primitive._transformBBox( bbox, matrix );\n\n // 視体積平面と比較\n var planes = stage._volume_planes;\n for ( var i = 0; i < planes.length; ++i ) {\n if ( Primitive._isBBoxBackSide( planes[i] ) ) {\n // 完全に視体積に含まれない\n return false;\n }\n }\n }\n\n // ソート深度を設定\n var pivot = this.pivot;\n if ( pivot ) {\n this.sort_z = matrix[2]*pivot[0] + matrix[6]*pivot[1] + matrix[10]*pivot[2] + matrix[14];\n }\n else {\n this.sort_z = matrix[14];\n }\n\n return true;\n }\n\n\n /**\n * @summary 背景との混合が必要か?\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @return {boolean} 背景との混合が必要なとき true, それ以外のとき false\n * @package\n */\n isTranslucent( stage )\n {\n return this.material.isTranslucent( stage, this );\n }\n\n\n /**\n * @summary プリミティブを描画\n * @param {mapray.RenderStage} stage レンダリングステージ\n */\n draw( stage )\n {\n var material = this.material;\n material.bindProgram();\n material.setParameters( stage, this );\n this.mesh.draw( material );\n }\n\n\n /**\n * 境界箱の頂点座標を変換 (視点空間) -> bbox_points\n * @private\n */\n static _transformBBox( bbox, matrix )\n {\n for ( var iz = 0; iz < 2; ++iz ) {\n var zm = bbox[iz][2];\n for ( var iy = 0; iy < 2; ++iy ) {\n var ym = bbox[iy][1];\n for ( var ix = 0; ix < 2; ++ix ) {\n var xm = bbox[ix][0];\n var bbox_point = Primitive._bbox_points[ix + 2*iy + 4*iz];\n bbox_point[0] = matrix[0]*xm + matrix[4]*ym + matrix[ 8]*zm + matrix[12];\n bbox_point[1] = matrix[1]*xm + matrix[5]*ym + matrix[ 9]*zm + matrix[13];\n bbox_point[2] = matrix[2]*xm + matrix[6]*ym + matrix[10]*zm + matrix[14];\n }\n }\n }\n }\n\n\n /**\n * bbox_points はすべて plane の裏側か?\n * @private\n */\n static _isBBoxBackSide( plane )\n {\n var bbox_points = Primitive._bbox_points;\n\n for ( var i = 0; i < bbox_points.length; ++i ) {\n var point = bbox_points[i];\n var dist = point[0]*plane[0] + point[1]*plane[1] + point[2]*plane[2] + plane[3];\n if ( dist >= 0 ) {\n // 表側に頂点が存在\n return false;\n }\n }\n\n return true; // すべての頂点が裏側\n }\n\n}\n\n\n// クラス定数の定義\n{\n // 一時領域\n Primitive._obj_to_view = GeoMath.createMatrix(); // モデル空間から視点空間への変換行列\n Primitive._bbox_points = []; // 境界箱の頂点座標 (視点空間)\n for ( var i = 0; i < 8; ++i ) {\n Primitive._bbox_points.push( GeoMath.createVector3() );\n }\n}\n\n\n/**\n * @summary プロパティ集合\n * @desc\n *

プリミティブのプロパティ集合を表現する。

\n *

props を PropSet のインスタンス、name をプロパティ名とするとき、props.name または props[\"name\"]\n * でプロパティ名からプロパティ値を取得することができる。

\n *

このクラスは実際には存在せず、一般的に Object で代用することができる。

\n * @class mapray.PropSet\n * @private\n * @see mapray.Primitive\n */\n\n\nexport default Primitive;\n","import Primitive from \"./Primitive\";\nimport GeoMath from \"./GeoMath\";\nimport AreaUtil from \"./AreaUtil\";\n\n\n/**\n * @summary 地表断片レンダリングためのオブジェクト\n *\n * @memberof mapray\n * @private\n */\nclass FlakeRenderObject {\n\n /**\n * @param {mapary.Area} area 地表断片の領域\n * @param {mapary.GLEnv} glenv WebGL 環境\n * @param {mapray.FlakeMesh} base_mesh 地表断片の基本メッシュ\n */\n constructor( area, glenv, base_mesh )\n {\n /**\n * @summary 地表分割レベル\n * @member mapray.FlakeRenderObject#z\n * @type {number}\n */\n this.z = area.z;\n\n /**\n * @summary 地表タイル X 座標\n * @member mapray.FlakeRenderObject#x\n * @type {number}\n */\n this.x = area.x;\n\n /**\n * @summary 地表タイル Y 座標\n * @member mapray.FlakeRenderObject#y\n * @type {number}\n */\n this.y = area.y;\n\n this._glenv = glenv;\n this._base_mesh = base_mesh;\n this._edata_list = []; // { mesh: Mesh, producer: FlakePrimitiveProducer }\n this._transform = null;\n }\n\n\n /**\n * @summary エンティティ・データを追加\n *\n * @param {mapray.Mesh} mesh\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n */\n addEntityData( mesh, producer )\n {\n let edata = { mesh: mesh, producer: producer };\n this._edata_list.push( edata );\n }\n\n\n /**\n * @summary 地表断片上のエンティティ数\n *\n * @type {number}\n * @readonly\n */\n get num_entities()\n {\n return this._edata_list.length;\n }\n\n\n /**\n * @summary 地表断片の基本メッシュを取得\n *\n * @return {mapray.FlakeMesh}\n */\n getBaseMesh()\n {\n return this._base_mesh;\n }\n\n\n /**\n * @summary エンティティのプリミティブを取得\n *\n * @param {number} index エンティティのインデックス\n * @param {mapray.RenderStage} stage レンダリングステージ\n *\n * @return {mapray.FlakeRenderObject.EntityPrimitivePair}\n */\n getEntityPrimitive( index, stage )\n {\n let edata = this._edata_list[index];\n let { material, properties } = edata.producer.getMaterialAndProperties( stage );\n\n // this._transform を設定\n if ( this._transform === null ) {\n this._transform = GeoMath.setIdentity( GeoMath.createMatrix() );\n let pos = AreaUtil.getCenter( this, GeoMath.createVector3() );\n this._transform[12] = pos[0];\n this._transform[13] = pos[1];\n this._transform[14] = pos[2];\n }\n\n const primitive = new Primitive( this._glenv, edata.mesh, material, this._transform );\n primitive.properties = properties;\n\n return {\n entity: edata.producer.entity,\n primitive: primitive\n };\n }\n\n}\n\n\n/**\n * @typedef {Object} EntityPrimitivePair\n * @memberof mapray.FlakeRenderObject\n * @property {mapray.Entity} entity\n * @property {mapray.Primitive} primitive\n */\n\n\nexport default FlakeRenderObject;\n","var $ = require('../internals/export');\nvar fill = require('../internals/array-fill');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.fill` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.fill\n$({ target: 'Array', proto: true }, {\n fill: fill\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('fill');\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint8Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","/**\n * @summary 更新されたタイル領域\n *\n * @memberof mapray\n * @private\n */\nclass UpdatedTileArea {\n\n /**\n */\n constructor()\n {\n this._area_list = [];\n this._flat_area_list = null;\n }\n\n\n /**\n * @summary 更新された領域は空か?\n *\n * @return {boolean} 更新領域が存在するとき false, それ以外のとき true\n */\n isEmpty()\n {\n return (this._area_list.length == 0);\n }\n\n\n /**\n * @summary 更新領域を空にする\n */\n clear()\n {\n this._area_list.length = 0;\n this._flat_area_list = null;\n }\n\n\n /**\n * @summary 更新領域を追加\n *\n * @param {object} area 領域\n * @param {number} area.z レベル\n * @param {number} area.x X タイル座標\n * @param {number} area.y Y タイル座標\n */\n addTileArea( area )\n {\n this._area_list.push( { z: area.z, x: area.x, y: area.y } );\n this._flat_area_list = null;\n }\n\n\n /**\n * @summary フラット領域配列を取得\n *\n * @desc\n *

フラット領域配列の各領域は、同じ配列内に祖先領域を含まない。

\n *

各領域は子領域の索引の配列として表す。

\n *\n * @return {Uint8Array[]}\n */\n getFlatAreaList()\n {\n if ( this._flat_area_list === null ) {\n this._flat_area_list = this._createFlatAreaList();\n }\n\n return this._flat_area_list;\n }\n\n\n /**\n * @summary フラット領域配列を生成\n *\n * @return {Uint8Array[]}\n *\n * @private\n */\n _createFlatAreaList()\n {\n var root_node = new Node();\n\n for ( var i = 0; i < this._area_list.length; ++i ) {\n var area = this._area_list[i];\n root_node.addDescendant( area.z, area.x, area.y );\n }\n\n root_node.reduceTree();\n\n return root_node.collectFlatAreas( 0, new Uint8Array( 64 ), [] );\n }\n\n}\n\n\n/**\n * @summary UpdatedTileArea のノード\n *\n * @memberof mapray.UpdatedTileArea\n * @private\n */\nclass Node {\n\n /**\n */\n constructor()\n {\n this.present = false;\n this.children = new Array( 4 ).fill( null );\n }\n\n\n /**\n * @summary 子孫ノード (自身可) を追加\n *\n * @param {number} z\n * @param {number} x\n * @param {number} y\n */\n addDescendant( z, x, y )\n {\n if ( this.present === true ) {\n // this はすでに決定しているので子孫は追加しない\n return;\n }\n\n if ( z == 0 ) {\n this.present = true;\n this.children.fill( null ); // すでに存在する子孫を取り消す\n }\n else { // z >= 1\n var p = Math.round( Math.pow( 2, z - 1 ) ); // 2^(z - 1)\n var u = Math.floor( x / p );\n var v = Math.floor( y / p );\n\n var i = u + 2*v;\n if ( this.children[i] === null ) {\n this.children[i] = new Node();\n }\n\n this.children[i].addDescendant( z - 1, x % p, y % p );\n }\n }\n\n\n /**\n * @summary ツリーを最適化\n *\n * @return {number} this が末端なら 1, それ以外なら 0\n */\n reduceTree()\n {\n if ( this.present === true ) {\n return 1;\n }\n\n // 末端の子供の数\n var count = 0;\n for ( var i = 0; i < 4; ++i ) {\n var child = this.children[i];\n if ( child !== null ) {\n count += child.reduceTree();\n }\n }\n\n if ( count == 4 ) {\n // すべての子供が存在し、それらがすべて末端なら this を末端化\n this.present = true;\n this.children.fill( null );\n return 1;\n }\n else {\n // this を末端化しない\n return 0;\n }\n }\n\n\n /**\n * @summary 末端ノードを収集\n *\n * @param {number} z レベル\n * @param {Uint8Array} indices 領域を表す索引配列\n * @param {Uint8Array[]} olist 収集結果を格納する配列\n * @return {Uint8Array[]} olist\n */\n collectFlatAreas( z, indices, olist )\n {\n if ( this.present === true ) {\n olist.push( new Uint8Array( indices.slice( 0, z ) ) );\n }\n else {\n for ( var i = 0; i < 4; ++i ) {\n var child = this.children[i];\n if ( child !== null ) {\n indices[z] = i;\n child.collectFlatAreas( z + 1, indices, olist );\n }\n }\n }\n\n return olist;\n }\n\n}\n\n\nexport default UpdatedTileArea;\n","var $ = require('../internals/export');\nvar isArray = require('../internals/is-array');\n\n// `Array.isArray` method\n// https://tc39.github.io/ecma262/#sec-array.isarray\n$({ target: 'Array', stat: true }, {\n isArray: isArray\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar arrayBufferModule = require('../internals/array-buffer');\nvar setSpecies = require('../internals/set-species');\n\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar ArrayBuffer = arrayBufferModule[ARRAY_BUFFER];\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\n\n// `ArrayBuffer` constructor\n// https://tc39.github.io/ecma262/#sec-arraybuffer-constructor\n$({ global: true, forced: NativeArrayBuffer !== ArrayBuffer }, {\n ArrayBuffer: ArrayBuffer\n});\n\nsetSpecies(ARRAY_BUFFER);\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint16Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint16', function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint32Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint32', function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","/**\n * @summary メッシュ用のバッファ\n * @memberof mapray\n * @package\n */\nclass MeshBuffer {\n\n /**\n *

注意: ARRAY_BUFFER へのバインドは null に設定される。

\n *\n * @param {mapray.GLEnv} glenv\n * @param {ArrayBuffer|ArrayBufferView} src 元データ\n * @param {object} [options] オプション\n * @param {mapray.MeshBuffer.Target} [options.target=Target.ATTRIBUTE] 使用目的\n */\n constructor( glenv, src, options )\n {\n this._glenv = glenv;\n var opts = options || {};\n\n // VBO を生成\n var gl = glenv.context;\n var target = MeshBuffer._getBindingPoint( gl, opts.target );\n var vbo = gl.createBuffer();\n gl.bindBuffer( target, vbo );\n gl.bufferData( target, src, gl.STATIC_DRAW );\n gl.bindBuffer( target, null );\n\n this._handle = vbo;\n }\n\n\n /**\n * @summary バッファのハンドル\n * @type {WebGLBuffer}\n * @readonly\n */\n get handle() { return this._handle; }\n\n\n /**\n * @summary リソースを破棄\n */\n dispose()\n {\n var gl = this._glenv.context;\n gl.deleteBuffer( this._handle );\n this._handle = null;\n }\n\n\n /**\n * @private\n */\n static\n _getBindingPoint( gl, target )\n {\n switch ( target ) {\n default:\n case Target.ATTRIBUTE: return gl.ARRAY_BUFFER;\n case Target.INDEX: return gl.ELEMENT_ARRAY_BUFFER;\n }\n }\n\n}\n\n\n/**\n * @summary バッファの使用目的\n *\n * @enum {object}\n * @memberof mapray.MeshBuffer\n * @constant\n */\nvar Target = {\n\n /**\n * 頂点属性\n */\n ATTRIBUTE: { id: \"ATTRIBUTE\" },\n\n /**\n * インデックス\n */\n INDEX: { id: \"INDEX\" }\n\n};\n\n\nMeshBuffer.Target = Target;\n\n\nexport default MeshBuffer;\n","import MeshBuffer from \"./MeshBuffer\";\n\n\n/**\n * @summary モデルメッシュ\n * @memberof mapray\n * @package\n */\nclass Mesh {\n\n /**\n * @param {mapray.GLEnv} glenv\n * @param {mapray.Mesh.Initializer|ArrayBuffer|object} data メッシュデータ\n */\n constructor( glenv, data )\n {\n this._glenv = glenv;\n\n this._draw_mode = undefined;\n this._num_vertices = 0;\n this._attrib_data = {};\n this._index_data = null;\n\n if ( data instanceof Initializer ) {\n // Mesh.Initializer\n this._initByInitializer( data );\n }\n else if ( data instanceof ArrayBuffer ) {\n // メッシュバイナリ\n this._initByInitializer( (new BinaryInit( glenv, data )).initializer );\n }\n else {\n // JSON オブジェクト\n this._initByInitializer( (new JsonInit( glenv, data )).initializer );\n }\n }\n\n\n /**\n * @summary Initializer による初期化\n *\n * @param {mapray.Mesh.Initializer} init 初期化データ\n * @private\n */\n _initByInitializer( init )\n {\n this._draw_mode = this._convertDrawMode( init.draw_mode );\n this._num_vertices = init.num_vertices;\n\n // this._attrib_data\n var src_attrib_data = init.attribute_data; // Mesh.Initializer#addAttribute() を参照\n for ( var i = 0; i < src_attrib_data.length; ++i ) {\n var sad = src_attrib_data[i];\n this._attrib_data[sad.id] = {\n mesh_buffer: sad.buffer,\n buffer: sad.buffer.handle,\n num_components: sad.num_components,\n component_type: this._convertComponentType( sad.component_type ),\n normalized: sad.normalized,\n byte_stride: sad.byte_stride,\n byte_offset: sad.byte_offset\n };\n }\n\n // this._index_data\n if ( init.index_data ) {\n var src_index_data = init.index_data; // Mesh.Initializer#addIndex() を参照\n this._index_data = {\n mesh_buffer: src_index_data.buffer,\n buffer: src_index_data.buffer.handle,\n num_indices: src_index_data.num_indices,\n type: this._convertComponentType( src_index_data.type ),\n byte_offset: src_index_data.byte_offset\n };\n }\n }\n\n\n /**\n * @summary DrawMode 型から GL 描画モードへ変換\n *\n * @param {mapray.Mesh.DrawMode} mode 描画モード\n * @return {number} GL 描画モード\n * @private\n */\n _convertDrawMode( mode )\n {\n var gl = this._glenv.context;\n\n switch ( mode ) {\n case DrawMode.POINTS: return gl.POINTS;\n case DrawMode.LINES: return gl.LINES;\n case DrawMode.TRIANGLES: return gl.TRIANGLES;\n case DrawMode.LINE_LOOP: return gl.LINE_LOOP;\n case DrawMode.LINE_STRIP: return gl.LINE_STRIP;\n case DrawMode.TRIANGLE_STRIP: return gl.TRIANGLE_STRIP;\n case DrawMode.TRIANGLE_FAN: return gl.TRIANGLE_FAN;\n default: throw new Error( \"mapray: invalid Mesh.DrawMode: \" + mode );\n }\n }\n\n\n /**\n * @summary ComponentType 型から GL 要素型へ変換\n *\n * @param {mapray.Mesh.ComponentType} type 要素型\n * @return {number} GL 要素型\n * @private\n */\n _convertComponentType( type )\n {\n var gl = this._glenv.context;\n\n switch ( type ) {\n case ComponentType.BYTE: return gl.BYTE;\n case ComponentType.UNSIGNED_BYTE: return gl.UNSIGNED_BYTE;\n case ComponentType.SHORT: return gl.SHORT;\n case ComponentType.UNSIGNED_SHORT: return gl.UNSIGNED_SHORT;\n case ComponentType.UNSIGNED_INT: return gl.UNSIGNED_INT;\n case ComponentType.FLOAT: return gl.FLOAT;\n default: throw new Error( \"mapray: invalid Mesh.ComponentType: \" + type );\n }\n }\n\n\n /**\n * @summary リソースを破棄\n */\n dispose()\n {\n this._attrib_data = {};\n this._index_data = null;\n }\n\n\n /**\n * @summary メッシュを描画\n *\n * @desc\n *

事前に material.bindProgram(), material.setParameters() すること。

\n *\n * @param {mapray.EntityMaterial} material マテリアル\n */\n draw( material )\n {\n var gl = this._glenv.context;\n\n // 頂点属性のバインド\n material.bindVertexAttribs( this._attrib_data );\n\n var index_data = this._index_data;\n if ( index_data !== null ) {\n gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, index_data.buffer );\n gl.drawElements( this._draw_mode, index_data.num_indices, index_data.type, index_data.byte_offset );\n }\n else {\n gl.drawArrays( this._draw_mode, 0, this._num_vertices );\n }\n }\n\n}\n\n\n/**\n * @summary メッシュの初期化オブジェクト\n *\n * @memberof mapray.Mesh\n * @package\n*/\nclass Initializer {\n\n /**\n * @param {mapray.Mesh.DrawMode} draw_mode 描画モード\n * @param {number} num_vertices 頂点数\n */\n constructor( draw_mode, num_vertices )\n {\n this.draw_mode = draw_mode;\n this.num_vertices = num_vertices;\n this.index_data = null;\n this.attribute_data = [];\n }\n\n\n /**\n * @summary インデックスデータを追加\n *\n * @param {mapray.MeshBuffer} buffer バッファ\n * @param {number} num_indices インデックス数\n * @param {mapray.Mesh.ComponentType} type インデックス型 (UNSIGNED_BYTE | UNSIGNED_SHORT | UNSIGNED_INT)\n * @param {object} [options] オプション\n * @param {number} [options.byte_offset=0] バッファ先頭からのバイトオフセット\n */\n addIndex( buffer, num_indices, type, options )\n {\n var opts = options || {};\n\n this.index_data = {\n buffer: buffer,\n num_indices: num_indices,\n type: type,\n byte_offset: (opts.byte_offset !== undefined) ? opts.byte_offset : 0\n };\n }\n\n\n /**\n * @summary 頂点属性データを追加\n *\n * @param {string} id 属性名\n * @param {mapray.MeshBuffer} buffer バッファ\n * @param {number} num_components 要素数\n * @param {mapray.Mesh.ComponentType} component_type 要素型\n * @param {object} [options] オプション\n * @param {boolean} [options.normalized=false] 正規化するか?\n * @param {number} [options.byte_stride=0] 頂点間のバイトストライド\n * @param {number} [options.byte_offset=0] バッファ先頭からのバイトオフセット\n */\n addAttribute( id, buffer, num_components, component_type, options )\n {\n var opts = options || {};\n\n var data = {\n id: id,\n buffer: buffer,\n num_components: num_components,\n component_type: component_type,\n normalized: (opts.normalized !== undefined) ? opts.normalized : false,\n byte_stride: (opts.byte_stride !== undefined) ? opts.byte_stride : 0,\n byte_offset: (opts.byte_offset !== undefined) ? opts.byte_offset : 0\n };\n\n this.attribute_data.push( data );\n }\n\n}\n\n\n/**\n * @summary 描画モードの列挙型\n * @enum {object}\n * @memberof mapray.Mesh\n * @constant\n */\nvar DrawMode = {\n\n /**\n * 点リスト\n */\n POINTS: { id: \"POINTS\" },\n\n /**\n * 線分リスト\n */\n LINES: { id: \"LINES\" },\n\n /**\n * 三角形リスト\n */\n TRIANGLES: { id: \"TRIANGLES\" },\n\n /**\n * 線分ループ\n */\n LINE_LOOP: { id: \"LINE_LOOP\" },\n\n /**\n * 線分ストリップ\n */\n LINE_STRIP: { id: \"LINE_STRIP\" },\n\n /**\n * 三角形ストリップ\n */\n TRIANGLE_STRIP: { id: \"TRIANGLE_STRIP\" },\n\n /**\n * 三角形ファン\n */\n TRIANGLE_FAN: { id: \"TRIANGLE_FAN\" }\n\n};\n\n\n/**\n * @summary 要素型の列挙型\n * @enum {object}\n * @memberof mapray.Mesh\n * @constant\n */\nvar ComponentType = {\n\n /**\n * 符号付き 8 ビット整数型\n */\n BYTE: { id: \"BYTE\" },\n\n /**\n * 符号なし 8 ビット整数型\n */\n UNSIGNED_BYTE: { id: \"UNSIGNED_BYTE\" },\n\n /**\n * 符号付き 16 ビット整数型\n */\n SHORT: { id: \"SHORT\" },\n\n /**\n * 符号なし 16 ビット整数型\n */\n UNSIGNED_SHORT: { id: \"UNSIGNED_SHORT\" },\n\n /**\n * 符号なし 32 ビット整数型\n */\n UNSIGNED_INT: { id: \"UNSIGNED_INT\" },\n\n /**\n * 32 ビット浮動小数点数型\n */\n FLOAT: { id: \"FLOAT\" }\n\n};\n\n\n/**\n * @summary JSON オブジェクトを Mesh.Initializer に変換\n *\n * @memberof mapray.Mesh\n * @private\n */\nclass JsonInit\n{\n\n /**\n * @param {mapray.GLEnv} glenv\n * @param {object} data メッシュデータ\n */\n constructor( glenv, data )\n {\n var vinfo = InitHelper.createVertexInfo( data.vtype );\n var num_vcompos = InitHelper.numVertexComponents( vinfo );\n var num_vertices = data.vertices.length / num_vcompos;\n\n this._initializer = new Initializer( JsonInit._toDrawMode( data ), num_vertices );\n\n this._addIndex( glenv, data.indices, num_vertices );\n\n var FLT_BYTES = 4;\n var buffer = new MeshBuffer( glenv, InitHelper.toTypedArray( data.vertices, ComponentType.FLOAT ) );\n var byteStride = num_vcompos * FLT_BYTES;\n var byteOffset = 0;\n\n for ( var i = 0; i < vinfo.length; ++i ) {\n var num_compos = vinfo[i].size;\n this._initializer.addAttribute( vinfo[i].name, buffer, num_compos, ComponentType.FLOAT,\n { byte_stride: byteStride, byte_offset: byteOffset } );\n byteOffset += num_compos * FLT_BYTES;\n }\n }\n\n\n /**\n * @summary Mesh.Initializer インスタンスを取得\n * @type {Mesh.Initializer}\n * @readonly\n */\n get initializer() { return this._initializer; }\n\n\n /**\n * @summary インデックスデータを追加\n *\n * @param {mapray.GLEnv} glenv\n * @param {object} indices インデックス配列\n * @param {number} num_vertices 頂点数\n */\n _addIndex( glenv, indices, num_vertices )\n {\n // インデックスの型は頂点数により自動的に決める\n var type = (num_vertices < 65536) ? ComponentType.UNSIGNED_SHORT : ComponentType.UNSIGNED_INT;\n\n var buffer = new MeshBuffer( glenv, InitHelper.toTypedArray( indices, type ),\n { target: MeshBuffer.Target.INDEX } );\n\n this._initializer.addIndex( buffer, indices.length, type );\n }\n\n\n /**\n * @summary Mesh.DrawMode に変換\n *\n * @param {object} data メッシュデータ\n * @return {mapray.Mesh.DrawMode} 描画モード\n * @private\n */\n static\n _toDrawMode( data )\n {\n // ptype?: (\"triangles\" | \"lines\") = \"triangles\"\n switch ( data.ptype ) {\n case \"triangles\": return DrawMode.TRIANGLES;\n case \"lines\": return DrawMode.LINES;\n default: return DrawMode.TRIANGLES;\n }\n }\n\n\n}\n\n\n/**\n * @summary メッシュバイナリを Mesh.Initializer に変換\n *\n * @memberof mapray.Mesh\n * @private\n */\nclass BinaryInit\n{\n\n /**\n * @param {mapray.GLEnv} glenv\n * @param {ArrayBuffer} data メッシュデータ\n */\n constructor( glenv, data )\n {\n var header = new DataView( data, 0 );\n\n var vtype = header.getUint8( BinaryInit.OFFSET_VTYPE );\n var itype = header.getUint8( BinaryInit.OFFSET_ITYPE );\n var ptype = header.getUint8( BinaryInit.OFFSET_PTYPE );\n var num_vertices = header.getUint32( BinaryInit.OFFSET_NUM_VERTICES, true );\n var num_indices = header.getUint32( BinaryInit.OFFSET_NUM_INDICES, true );\n\n this._initializer = new Initializer( BinaryInit._toDrawMode( ptype ), num_vertices );\n\n var vinfo = InitHelper.createVertexInfo( vtype );\n\n var indices = this._createIndexArray( glenv, data, itype, num_indices, vinfo, num_vertices );\n this._addIndex( glenv, itype, indices );\n\n var FLT_BYTES = 4;\n var buffer = new MeshBuffer( glenv, this._createVertexArray( data, vinfo, num_vertices ) );\n var byteStride = InitHelper.numVertexComponents( vinfo ) * FLT_BYTES;\n var byteOffset = 0;\n\n for ( var i = 0; i < vinfo.length; ++i ) {\n var num_compos = vinfo[i].size;\n this._initializer.addAttribute( vinfo[i].name, buffer, num_compos, ComponentType.FLOAT,\n { byte_stride: byteStride, byte_offset: byteOffset } );\n byteOffset += num_compos * FLT_BYTES;\n }\n }\n\n\n /**\n * @summary Mesh.Initializer インスタンスを取得\n * @type {Mesh.Initializer}\n * @readonly\n */\n get initializer() { return this._initializer; }\n\n\n /**\n * @summary インデックスバッファを作成 (バイナリデータから)\n *\n * @param {mapray.GLEnv} glenv\n * @param {ArrayBuffer} src_buffer バイナリデータ\n * @param {number} itype インデックス型 (ENUM_ITYPE_UINT16 | ENUM_ITYPE_UINT32)\n * @param {number} num_indices インデックス数\n * @param {array} vinfo 頂点情報\n * @param {number} num_vertices 頂点数\n * @return {Uint16Array|Uint32Array} インデックス配列\n * @private\n */\n _createIndexArray( glenv, src_buffer, itype, num_indices, vinfo, num_vertices )\n {\n // 入力配列を作成\n var FLT_BYTES = 4;\n var vertices_bytes = InitHelper.numVertexComponents( vinfo ) * num_vertices * FLT_BYTES;\n var src_view = new DataView( src_buffer, BinaryInit.OFFSET_BODY + vertices_bytes );\n\n var i;\n var dst_array;\n var index_bytes;\n\n switch ( itype ) {\n case BinaryInit.ENUM_ITYPE_UINT16:\n dst_array = new Uint16Array( num_indices );\n index_bytes = 2;\n for ( i = 0; i < num_indices; ++i ) {\n dst_array[i] = src_view.getUint16( index_bytes * i, true );\n }\n break;\n case BinaryInit.ENUM_ITYPE_UINT32:\n dst_array = new Uint32Array( num_indices );\n index_bytes = 4;\n for ( i = 0; i < num_indices; ++i ) {\n dst_array[i] = src_view.getUint32( index_bytes * i, true );\n }\n break;\n default:\n throw new Error( \"mapray: unknown itype: \" + itype );\n }\n\n return dst_array;\n }\n\n\n /**\n * @summary 頂点バッファを作成 (バイナリデータから)\n *\n * @param {ArrayBuffer} src_buffer バイナリデータ\n * @param {array} vinfo 頂点情報\n * @param {number} num_vertices 頂点数\n * @return {Float32Array} 頂点データを格納した配列\n * @private\n */\n _createVertexArray( src_buffer, vinfo, num_vertices )\n {\n var FLT_BYTES = 4;\n\n // 入力配列を作成\n var num_elements = InitHelper.numVertexComponents( vinfo ) * num_vertices;\n var src_view = new DataView( src_buffer, BinaryInit.OFFSET_BODY );\n var dst_array = new Float32Array( num_elements );\n for ( var i = 0; i < num_elements; ++i ) {\n dst_array[i] = src_view.getFloat32( i * FLT_BYTES, true );\n }\n\n return dst_array;\n }\n\n\n /**\n * @summary インデックスデータを追加\n *\n * @param {mapray.GLEnv} glenv\n * @param {number} itype インデックス型 (ENUM_ITYPE_UINT16 | ENUM_ITYPE_UINT32)\n * @param {Uint16Array|Uint32Array} indices インデックス配列\n * @private\n */\n _addIndex( glenv, itype, indices )\n {\n var buffer = new MeshBuffer( glenv, indices, { target: MeshBuffer.Target.INDEX } );\n var type = BinaryInit._indexTypeToComponentType( itype );\n\n this._initializer.addIndex( buffer, indices.length, type );\n }\n\n\n /**\n * @summary Mesh.DrawMode に変換\n *\n * @param {number} ptype プリミティブタイプ\n * @return {mapray.Mesh.DrawMode} 描画モード\n * @private\n */\n static\n _toDrawMode( ptype )\n {\n switch ( ptype ) {\n case BinaryInit.ENUM_PTYPE_TRIANGLES: return DrawMode.TRIANGLES;\n case BinaryInit.ENUM_PTYPE_LINES: return DrawMode.LINES;\n default: throw new Error( \"mapray: invalid ptype: \" + ptype );\n }\n }\n\n\n /**\n * @summary インデックス型から要素型へ変換\n *\n * @param {number} itype インデックス型 (ENUM_ITYPE_UINT16 | ENUM_ITYPE_UINT32)\n * @return {mapray.Mesh.ComponentType} 要素型 (UNSIGNED_SHORT | UNSIGNED_INT)\n * @private\n */\n static\n _indexTypeToComponentType( itype )\n {\n switch ( itype ) {\n case BinaryInit.ENUM_ITYPE_UINT16:\n return ComponentType.UNSIGNED_SHORT;\n case BinaryInit.ENUM_ITYPE_UINT32:\n default:\n return ComponentType.UNSIGNED_INT;\n }\n }\n\n}\n\n{\n // バイナリデータのオフセット\n BinaryInit.OFFSET_VTYPE = 0;\n BinaryInit.OFFSET_ITYPE = 1;\n BinaryInit.OFFSET_PTYPE = 2;\n BinaryInit.OFFSET_NUM_VERTICES = 4;\n BinaryInit.OFFSET_NUM_INDICES = 8;\n BinaryInit.OFFSET_BODY = 12;\n\n // ITYPE 列挙値\n BinaryInit.ENUM_ITYPE_UINT16 = 0;\n BinaryInit.ENUM_ITYPE_UINT32 = 1;\n\n // PTYPE 列挙値\n BinaryInit.ENUM_PTYPE_TRIANGLES = 0;\n BinaryInit.ENUM_PTYPE_LINES = 1;\n}\n\n\n/**\n * @summary 初期化ヘルパー\n *\n * @memberof mapray.Mesh\n * @private\n */\nclass InitHelper\n{\n\n /**\n * @summary 頂点情報を生成\n * @desc\n *

vtype を以下の形式に変換して返す。ただし vtype が配列なら vtype を返す。

\n *
\n     *   [ { name: 頂点属性名, size: 要素数 }, ... ]\n     * 
\n * @param {string|number|array} vtype 頂点タイプまたは頂点情報\n * @return {array} 頂点情報\n */\n static\n createVertexInfo( vtype )\n {\n if ( Array.isArray( vtype ) ) {\n // vtype は最初から頂点情報\n return vtype;\n }\n\n var vinfo = null;\n\n // vtype: (\"P\" | \"PN\" | \"PT\" | \"PNT\")\n switch ( vtype ) {\n case \"P\":\n case InitHelper.ENUM_VTYPE_P:\n vinfo = [\n { name: InitHelper.ANAME_P, size: InitHelper.FSIZE_P }\n ];\n break;\n case \"PN\":\n case InitHelper.ENUM_VTYPE_PN:\n vinfo = [\n { name: InitHelper.ANAME_P, size: InitHelper.FSIZE_P },\n { name: InitHelper.ANAME_N, size: InitHelper.FSIZE_N }\n ];\n break;\n case \"PT\":\n case InitHelper.ENUM_VTYPE_PT:\n vinfo = [\n { name: InitHelper.ANAME_P, size: InitHelper.FSIZE_P },\n { name: InitHelper.ANAME_T, size: InitHelper.FSIZE_T }\n ];\n break;\n case \"PNT\":\n case InitHelper.ENUM_VTYPE_PNT:\n vinfo = [\n { name: InitHelper.ANAME_P, size: InitHelper.FSIZE_P },\n { name: InitHelper.ANAME_N, size: InitHelper.FSIZE_N },\n { name: InitHelper.ANAME_T, size: InitHelper.FSIZE_T }\n ];\n break;\n default:\n throw new Error( \"mapray: unknown vtype: \" + vtype );\n }\n\n return vinfo;\n }\n\n\n /**\n * @summary 頂点データの要素数を取得\n *\n * @param {object[]} vinfo 頂点情報\n * @return {number} 頂点データの要素数\n */\n static\n numVertexComponents( vinfo )\n {\n var length = vinfo.length;\n var num_compos = 0;\n\n for ( var i = 0; i < length; ++i ) {\n num_compos += vinfo[i].size;\n }\n\n return num_compos;\n }\n\n\n /**\n * @summary 型配列に変換\n *\n * @param {object} array 入力配列\n * @param {mapray.Mesh.ComponentType} type 変換先の要素型\n * @return {TypedArray} 変換された配列\n */\n static\n toTypedArray( array, type )\n {\n switch ( type ) {\n case ComponentType.UNSIGNED_SHORT:\n return (array instanceof Uint16Array) ? array : new Uint16Array( array );\n case ComponentType.UNSIGNED_INT:\n return (array instanceof Uint32Array) ? array : new Uint32Array( array );\n case ComponentType.FLOAT:\n return (array instanceof Float32Array) ? array : new Float32Array( array );\n default:\n throw new Error( \"mapray: invalid component type: \" + type );\n }\n }\n\n}\n\n{\n // VTYPE 列挙値\n InitHelper.ENUM_VTYPE_P = 0;\n InitHelper.ENUM_VTYPE_PN = 1;\n InitHelper.ENUM_VTYPE_PT = 2;\n InitHelper.ENUM_VTYPE_PNT = 3;\n\n // 頂点属性名\n InitHelper.ANAME_P = \"a_position\";\n InitHelper.ANAME_N = \"a_normal\";\n InitHelper.ANAME_T = \"a_texcoord\";\n\n // 要素のサイズ (要素数)\n InitHelper.FSIZE_P = 3;\n InitHelper.FSIZE_N = 3;\n InitHelper.FSIZE_T = 2;\n}\n\n\nMesh.Initializer = Initializer;\nMesh.DrawMode = DrawMode;\nMesh.ComponentType = ComponentType;\n\n\nexport default Mesh;\n","/**\n * @summary 高度モード\n *\n * @desc\n *

{@link mapray.GeoPoint} などの高度値をどのように解釈するかを指定する列挙値の型である。

\n *\n * @enum {object}\n * @memberof mapray\n * @constant\n * @see mapray.Entity\n */\nvar AltitudeMode = {\n\n /**\n * 絶対値\n */\n ABSOLUTE: { id: \"ABSOLUTE\" },\n\n\n /**\n * 地表からの相対値\n */\n RELATIVE: { id: \"RELATIVE\" },\n\n\n /**\n * 地表と同じ高さ (高度値を無視)\n */\n CLAMP: { id: \"CLAMP\" }\n\n};\n\n\nexport default AltitudeMode;\n","import AltitudeMode from \"./AltitudeMode\";\nimport EasyBindingBlock from \"./animation/EasyBindingBlock\";\n\n\n/**\n * @summary シーン・エンティティ\n * @classdesc\n *

シーン・エンティティの基底クラスである。

\n * @memberof mapray\n * @see mapray.Scene\n * @protected\n * @abstract\n */\nclass Entity {\n\n /**\n * @desc\n *

インスタンス生成後に、それを scene に追加することができる。

\n *\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, opts )\n {\n /**\n * @summary 所属可能シーン\n * @member mapray.Entity#scene\n * @type {mapray.Scene}\n * @readonly\n */\n this.scene = scene;\n\n // 高度モード\n this._altitude_mode = AltitudeMode.ABSOLUTE;\n\n this._need_to_create_regions = false;\n\n // animation.BindingBlock\n // 今のところ Entity (基底クラス) 自体のアニメーション可能パラメータと\n // 子孫は存在しないので animation には何も追加しない\n this._animation = new EasyBindingBlock();\n\n this._visibility = true;\n\n // 生成情報から設定\n if ( opts && opts.json ) {\n this._setupEntityByJson( opts.json );\n }\n }\n\n\n /**\n * @summary 可視性フラグを取得\n * @type {boolean}\n * @readonly\n */\n get visibility() { return this._visibility; }\n\n\n /**\n * @summary 可視性フラグを設定\n *\n * @param {boolean} visibility 可視性フラグ\n */\n setVisibility( visibility )\n {\n this._visibility = visibility;\n }\n\n\n /**\n * @summary アンカーモード。\n *

隠面処理により本来表示されない状況であっても、何らかの描画を行い位置や角度を確認でき、マウスピック可能となるようにする描画モード。\n * 現在は、{@link mapray.ModelEntity}のみサポートされ、隠面処理により表示されない部分が半透明で描画される。

\n *

このプロパティを有効にする場合は、下記の問題点に注意する必要があります。

\n *
    \n *
  • 透明・半透明モデルに適用することは想定されていません。透明・半透明モデルに対してこのプロパティを有効にすると表示が乱れる可能性があります。
  • \n *
  • アンカーモードのエンティティどうしの前後判定はzソートにより実装されており、ピクセル単位の前後判定は行われません。
  • \n *
\n * @type {boolean}\n * @private\n * @readonly\n */\n get anchor_mode() { return false; }\n\n\n /**\n * @summary アニメーションパラメータ設定\n *\n * @type {mapray.animation.BindingBlock}\n * @readonly\n */\n get animation() { return this._animation; }\n\n\n /**\n * @summary 高度モード\n * @type {mapray.AltitudeMode}\n */\n set altitude_mode( value )\n {\n if ( this._altitude_mode !== value ) {\n var prev_mode = this._altitude_mode;\n this._altitude_mode = value;\n this.onChangeAltitudeMode( prev_mode );\n }\n }\n\n\n get altitude_mode()\n {\n return this._altitude_mode;\n }\n\n\n /**\n * @summary バウンディングボックスを算出\n *\n * @abstract\n * @return {mapray.GeoRegion} バウンディングボックス\n */\n getBounds()\n {\n throw new Error( \"mapray.Entity#getBounds() method has not been overridden.\" );\n }\n\n\n /**\n * @summary 高度モードが変更された後の通知\n *\n * @desc\n *

this.altitude_mode が変更されたときに呼び出される。

\n *

既定の実装は何もしない。

\n *\n * @param {mapray.AltitudeMode} prev_mode 直前のモード\n *\n * @abstract\n * @private\n */\n onChangeAltitudeMode( prev_mode )\n {\n }\n\n\n /**\n * @summary PrimitiveProducer インタフェースを取得\n *\n * @desc\n *

PrimitiveProducer インタフェースを取得するためにシーンレンダラーが呼び出す。\n * PrimitiveProducer インタフェースが実装されていなければ null を返す。

\n *

既定の実装は null を返す。

\n *\n * @return {?mapray.Entity.PrimitiveProducer} PrimitiveProducer インタフェース\n *\n * @abstract\n * @package\n */\n getPrimitiveProducer()\n {\n return null;\n }\n\n\n /**\n * @summary FlakePrimitiveProducer インタフェースを取得\n *\n * @desc\n *

FlakePrimitiveProducer インタフェースを取得するためにシーンレンダラーが呼び出す。\n * FlakePrimitiveProducer インタフェースが実装されていなければ null を返す。

\n *

既定の実装は null を返す。

\n *\n * @return {?mapray.Entity.FlakePrimitiveProducer} FlakePrimitiveProducer インタフェース\n *\n * @abstract\n * @package\n */\n getFlakePrimitiveProducer()\n {\n return null;\n }\n\n\n /**\n * JSON データによる Entity 共通の初期化\n * @private\n */\n _setupEntityByJson( json )\n {\n // 高度モード\n if ( json.altitude_mode ) {\n switch ( json.altitude_mode ) {\n case \"absolute\":\n this._altitude_mode = AltitudeMode.ABSOLUTE;\n break;\n case \"relative\":\n this._altitude_mode = AltitudeMode.RELATIVE;\n break;\n case \"clamp\":\n this._altitude_mode = AltitudeMode.CLAMP;\n break;\n default:\n console.error( \"unrecognized altitude_mode: \" + json.altitude_mode );\n }\n }\n\n if ( json.visibility !== undefined ) this.setVisibility( json.visibility );\n }\n\n}\n\n\n/**\n * @summary エンティティのプリミティブを生産\n *\n * @classdesc\n *

シーンレンダラーにエンティティのプリミティブを与える。

\n *\n * @memberof mapray.Entity\n * @private\n * @abstract\n */\nclass PrimitiveProducer {\n\n /**\n * @param {mapray.Entity} entity PrimitiveProducer に対応するエンティティ\n */\n constructor( entity )\n {\n this._entity = entity;\n this._need_to_create_regions = false;\n }\n\n\n /**\n * @summary エンティティ\n *\n * @type {mapray.Entity}\n * @readonly\n */\n get entity() { return this._entity; }\n\n\n /**\n * @summary 領域が更新されたとき呼び出す\n *\n * @desc\n *

領域を変更したい場合に PrimitiveProducer の実装者が呼び出す必要がある。

\n */\n needToCreateRegions()\n {\n this._need_to_create_regions = true;\n }\n\n\n /**\n * @summary need_to_create_regions を取得\n *\n * @desc\n *

エンティティの領域を変更する (createRegions() を呼び出す) 必要があるかどうかを確認するためにシーンレンダラーが呼び出す。

\n *\n * @return {boolean} 領域を変更する必要があるとき true, それ以外のとき false\n *\n * @see needToCreateRegions()\n */\n checkToCreateRegions()\n {\n var result = this._need_to_create_regions;\n this._need_to_create_regions = false;\n return result;\n }\n\n\n /**\n * @summary エンティティに標高値は必要か?\n *\n * @desc\n *

エンティティが標高値を必要としているかどうかを確認するためレンダラーが呼び出す。

\n *

既定の実装では entity.altitude_mode が AltitudeMode.ABSOLUTE なら false, それ以外なら true を返す。

\n *\n * @return {boolean} エンティティに標高値が必要なら true, それ以外なら false\n *\n * @abstract\n */\n needsElevation()\n {\n return (this._entity._altitude_mode !== AltitudeMode.ABSOLUTE);\n }\n\n\n /**\n * @summary エンティティ領域を生成\n *\n * @desc\n *

エンティティの領域を確認するためレンダラーが呼び出す。

\n *

既定の実装では [] を返す。

\n *\n * @return {mapray.EntityRegion[]} エンティティ領域の配列\n *\n * @abstract\n */\n createRegions()\n {\n return [];\n }\n\n\n /**\n * @summary 更新されたエンティティ領域の通知\n *\n * @desc\n *

エンティティの領域の標高が変化したことを通知するためレンダラーが呼び出す。regions は標高が更新されたエンティティ領域を含む配列である。

\n *

既定の実装では何もしない。

\n *\n * @param {mapray.EntityRegion[]} regions エンティティ領域の配列\n *\n * @abstract\n */\n onChangeElevation( regions )\n {\n }\n\n\n /**\n * @summary プリミティブ配列を取得\n *\n * @desc\n *

レンダリング時にこのエンティティを描画するための 0 個以上のプリミティブを含む配列を返す。

\n *

このメソッドが呼び出されたフレームのレンダリングが終了するまで、返した配列とそれに含まれるプリミティブは変更してはならない。

\n *\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @return {Array.} プリミティブ配列\n *\n * @abstract\n */\n getPrimitives( stage )\n {\n throw new Error( \"mapray.Entity.PrimitiveProducer#getPrimitives() method has not been overridden.\" );\n }\n\n}\n\n\n/**\n * @summary 地表断片エンティティのプリミティブを生産\n *\n * @classdesc\n *

シーンレンダラーに地表断片エンティティのプリミティブを与える。

\n *\n * @memberof mapray.Entity\n * @private\n * @abstract\n */\nclass FlakePrimitiveProducer {\n\n /**\n * @param {mapray.Entity} entity FlakePrimitiveProducer に対応するエンティティ\n */\n constructor( entity )\n {\n this._entity = entity;\n this._updated = false;\n }\n\n\n /**\n * @summary エンティティ\n *\n * @type {mapray.Entity}\n * @readonly\n */\n get entity() { return this._entity; }\n\n\n\n /**\n * @summary 位置や形状の変化を通知\n */\n notifyForUpdate()\n {\n this._updated = true;\n }\n\n\n /**\n * @summary 領域状態を取得\n *\n * @desc\n *

area が示す領域の状態を取得する。

\n *\n * @param {mapray.Area} area 確認する領域\n *\n * @return {mapray.Entity.AreaStatus} 領域の状態\n *\n * @abstract\n */\n getAreaStatus( area )\n {\n return AreaStatus.EMPTY;\n }\n\n\n /**\n * @summary メッシュを生成\n *\n * @desc\n *

area の領域に対応するメッシュを取得する。

\n *

area に形状がないときは null を返す。

\n *\n * @param {mapray.Area} area メッシュの領域\n * @param {number[]} dpows 領域の分割指数\n * @param {mapray.DemBinary} dem DEM バイナリ\n *\n * @return {?mapray.Mesh}\n *\n * @abstract\n */\n createMesh( area, dpows, dem )\n {\n return null;\n }\n\n\n /**\n * @summary マテリアルとプロパティを取得\n *\n * @param {mapray.RenderStage} stage レンダリングステージ\n *\n * @return {object} { material: mapray.EntityMaterial, properties: mapray.PropSet }\n *\n * @abstract\n */\n getMaterialAndProperties( stage )\n {\n throw new Error( \"mapray.Entity.FlakePrimitiveProducer#getMaterialAndProperties() method has not been overridden.\" );\n }\n\n\n /**\n * @summary 更新状態を確認\n *\n * @desc\n *

レンダラーが呼び出す。

\n *

更新状態を返してから、更新なし状態に設定する。

\n *\n * @return {boolean} 更新ありのとき true, それ以外のとき false\n *\n * @package\n */\n checkForUpdate()\n {\n let updated = this._updated;\n\n this._updated = false;\n\n return updated;\n }\n\n}\n\n\n/**\n * @summary 領域状態の列挙型\n *\n * @enum {object}\n * @memberof mapray.Entity\n * @constant\n * @private\n */\nvar AreaStatus = {\n\n /**\n * 何もない領域\n */\n EMPTY: { id: \"EMPTY\" },\n\n\n /**\n * 完全に満たされた領域\n */\n FULL: { id: \"FULL\" },\n\n\n /**\n * 部分領域または領域不明\n */\n PARTIAL: { id: \"PARTIAL\" }\n\n};\n\n\nEntity.PrimitiveProducer = PrimitiveProducer;\nEntity.FlakePrimitiveProducer = FlakePrimitiveProducer;\nEntity.AreaStatus = AreaStatus;\n\n\nexport default Entity;\n","import GeoMath from \"./GeoMath\";\nimport DemBinary from \"./DemBinary\";\nimport FlakeMesh from \"./FlakeMesh\";\nimport FlakeRenderObject from \"./FlakeRenderObject\";\nimport UpdatedTileArea from \"./UpdatedTileArea\";\nimport Mesh from \"./Mesh\";\nimport Entity from \"./Entity\";\n\n\n/**\n * @summary 地表形状の管理\n * @memberof mapray\n * @private\n */\nclass Globe {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {mapray.DemProvider} dem_provider DEM プロバイダ\n */\n constructor( glenv, dem_provider )\n {\n this._glenv = glenv;\n this._dem_provider = dem_provider;\n this._status = Status.NOT_READY;\n this._dem_area_updated = new UpdatedTileArea();\n this._prev_producers = new Set();\n\n this._ρ = dem_provider.getResolutionPower();\n this._dem_zbias = GeoMath.LOG2PI - this._ρ + 1; // b = log2(π) - ρ + 1\n\n this._hist_stats = new HistStats();\n\n this._flake_reduce_thresh = 1.5; // Flake 削減比率閾値\n this._flake_reduce_factor = 1.2; // Flake 削減比率係数\n this._num_cache_flakes = 0; // キャッシュ内の Flake 数 (_root_flake と子孫の数)\n this._num_touch_flakes = 0; // 現行フレームでのアクセス Flake 数\n\n this._mesh_reduce_lower = 300; // Mesh 削減下限値\n this._mesh_reduce_thresh = 1.5; // Mesh 削減比率閾値\n this._mesh_reduce_factor = 1.2; // Mesh 削減比率係数\n this._num_cache_meshes = 0; // キャッシュ内の Mesh 数\n this._num_touch_meshes = 0; // 現行フレームでのアクセス Mesh 数\n\n this._max_dem_requesteds = 10; // 最大 REQUESTED 数\n this._num_dem_requesteds = 0; // 現在の REQUESTED 状態の数\n\n this._frame_counter = 0; // 現行フレーム番号\n\n this._root_flake = null;\n this._avg_height = null;\n this._root_cancel_id = null;\n this._requestRoot();\n }\n\n /**\n * すべてのリクエストを取り消す\n */\n cancel()\n {\n if ( this._status === Status.READY ) {\n // root の真子孫を破棄 (リクエストをキャンセル)\n var children = this._root_flake._children;\n for ( var i = 0; i < 4; ++i ) {\n children[i].dispose();\n }\n }\n else if ( this._status === Status.NOT_READY ) {\n // リクエスト中の root をキャンセル\n this._dem_provider.cancelRequest( this._root_cancel_id );\n this._root_cancel_id = null;\n }\n\n // assert: this._num_dem_requesteds == 0\n }\n\n /**\n * WebGL 環境\n * @type {mapray.GLEnv}\n * @readonly\n */\n get glenv()\n {\n return this._glenv;\n }\n\n /**\n * DEM データプロバイダ\n * @type {mapray.DemProvider}\n * @readonly\n */\n get dem_provider()\n {\n return this._dem_provider;\n }\n\n /**\n * @summary Globe 状態を取得\n * @type {mapray.Globe.Status}\n * @readonly\n */\n get status()\n {\n return this._status;\n }\n\n /**\n * @summary DEM が更新された領域を取得\n * @type {mapray.UpdatedTileArea}\n * @readonly\n */\n get dem_area_updated()\n {\n return this._dem_area_updated;\n }\n\n /**\n * @summary 基底 Flake を取得\n * @type {mapray.Globe.Flake}\n * @readonly\n */\n get root_flake()\n {\n var flake = this._root_flake;\n flake.touch();\n return flake;\n }\n\n /**\n * @summary エンティティ情報を更新\n *\n *

getRenderObject() の前にエンティティの情報を更新する。

\n *\n * @param {iterable.} producers\n */\n putNextEntityProducers( producers )\n {\n let next_producers = new Set();\n\n // 追加、削除、更新のリストを作成\n let added_producers = [];\n let updated_producers = [];\n\n for ( let prod of producers ) {\n let updated = prod.checkForUpdate(); // 更新チェックとクリア\n\n if ( this._prev_producers.has( prod ) ) {\n if ( updated ) {\n // 更新された\n updated_producers.push( prod );\n }\n this._prev_producers.delete( prod );\n }\n else {\n // 新規追加\n added_producers.push( prod );\n }\n\n next_producers.add( prod );\n }\n\n let removed_producers = this._prev_producers;\n\n // ツリーを更新\n for ( let prod of removed_producers ) {\n this._root_flake.removeEntityProducer( prod );\n }\n for ( let prod of added_producers ) {\n this._root_flake.addEntityProducer( prod );\n }\n for ( let prod of updated_producers ) {\n this._root_flake.updateEntityProducer( prod );\n }\n\n // 次の prev_producers を設定\n this._prev_producers = next_producers;\n }\n\n /**\n * @summary リクエスト待ちの DEM タイルの個数を取得\n *\n * @return {number} リクエスト待ちの DEM タイルの個数\n */\n getNumDemWaitingRequests()\n {\n return this._num_dem_requesteds;\n }\n\n /**\n * @summary 正確度が最も高い DEM タイルデータを検索\n * @desc\n *

基底タイル座標 (左上(0, 0)、右下(1, 1)) [xt, yt] の標高データを取得することができる、正確度が最も高い DEM タイルデータを検索する。

\n *

サーバーにさらに正確度が高い DEM タイルデータが存在すれば、それをリクエストする。

\n * @param {number} xt X 座標 (基底タイル座標系)\n * @param {number} yt Y 座標 (基底タイル座標系)\n * @return {?mapray.DemBinary} DEM タイルデータ (存在しなければ null)\n */\n findHighestAccuracy( xt, yt )\n {\n var flake = this._root_flake;\n if ( flake === null ) {\n // まだ基底タイルが読み込まれていない\n return null;\n }\n\n var size = 2; // 2^(flake.z + 1)\n var xf = size * xt;\n var yf = size * yt;\n var dem_flake = flake; // DEM を持った地表断片\n\n for (;;) {\n var u = GeoMath.clamp( Math.floor( xf ), 0, size - 1 ) % 2;\n var v = GeoMath.clamp( Math.floor( yf ), 0, size - 1 ) % 2;\n var child = flake._children[u + 2*v];\n\n flake.touch();\n\n if ( child === null ) {\n // これ以上のレベルは存在しない\n break;\n }\n else if ( flake._dem_state === DemState.LOADED ) {\n // より正確度が高い DEM を持つ地表断片に更新\n dem_flake = flake;\n }\n\n flake = child;\n size *= 2;\n xf *= 2;\n yf *= 2;\n }\n\n dem_flake._requestHighestAccuracy( xt, yt );\n\n return dem_flake._dem_data;\n }\n\n /**\n * @summary 現行の標高 (複数) を取得\n *\n * @desc\n *

現在メモリーにある最高精度の標高値を一括で取得する。

\n *

まだ DEM データが存在しない、または経度, 緯度が範囲外の場所は標高を 0 とする。

\n *\n *

このメソッドは DEM のリクエストは発生しない。また DEM のキャッシュには影響を与えない。

\n *\n *

一般的に画面に表示されていない場所は標高の精度が低い。

\n *\n * @param {number} num_points 入出力データ数\n * @param {number[]} src_array 入力配列 (経度, 緯度, ...)\n * @param {number} src_offset 入力データの先頭インデックス\n * @param {number} src_stride 入力データのストライド\n * @param {number[]} dst_array 出力配列 (標高, ...)\n * @param {number} dst_offset 出力データの先頭インデックス\n * @param {number} dst_stride 出力データのストライド\n * @return {number[]} dst_array\n *\n * @see mapray.Viewer#getExistingElevations\n */\n getExistingElevations( num_points, src_array, src_offset, src_stride, dst_array, dst_offset, dst_stride )\n {\n var dPI = 2 * Math.PI;\n var demSize = 1 << this._ρ; // 2^ρ\n\n var src_index = src_offset;\n var dst_index = dst_offset;\n\n for ( var i = 0; i < num_points; ++i ) {\n // 経緯度 (Degrees)\n var lon = src_array[src_index];\n var lat = src_array[src_index + 1];\n\n // 正規化経緯度 (Degrees)\n var _lon = lon + 180 * Math.floor( (90 - lat) / 360 + Math.floor( (90 + lat) / 360 ) );\n var nlon = _lon - 360 - 360 * Math.floor( (_lon - 180) / 360 ); // 正規化経度 [-180,180)\n var nlat = 90 - Math.abs( 90 - lat + 360 * Math.floor( (90 + lat) / 360 ) ); // 正規化緯度 [-90,90]\n\n // 単位球メルカトル座標\n var xm = nlon * GeoMath.DEGREE;\n var ym = GeoMath.invGudermannian( nlat * GeoMath.DEGREE );\n\n // 基底タイル座標 (左上(0, 0)、右下(1, 1))\n var xt = xm / dPI + 0.5;\n var yt = 0.5 - ym / dPI;\n\n if ( yt >= 0 && yt <= 1 ) {\n // 通常範囲のとき\n var dem = this._findHighestAccuracy2( xt, yt );\n if ( dem !== null ) {\n var pow = Math.pow( 2, dem.z ); // 2^ze\n var uf = demSize * (pow * xt - dem.x);\n var vf = demSize * (pow * yt - dem.y);\n var ui = GeoMath.clamp( Math.floor( uf ), 0, demSize - 1 );\n var vi = GeoMath.clamp( Math.floor( vf ), 0, demSize - 1 );\n\n var heights = dem.getHeights( ui, vi );\n var h00 = heights[0];\n var h10 = heights[1];\n var h01 = heights[2];\n var h11 = heights[3];\n\n // 標高を補間\n var s = uf - ui;\n var t = vf - vi;\n dst_array[dst_index] = (h00 * (1 - s) + h10 * s) * (1 - t) + (h01 * (1 - s) + h11 * s) * t;\n }\n else {\n // まだ標高を取得することができない\n dst_array[dst_index] = 0;\n }\n }\n else {\n // 緯度が Web メルカトルの範囲外 (極に近い)\n dst_array[dst_index] = 0;\n }\n\n src_index += src_stride;\n dst_index += dst_stride;\n }\n\n return dst_array;\n }\n\n /**\n * @summary 正確度が最も高い DEM タイルデータを検索\n *\n * @desc\n *

基底タイル座標 (左上(0, 0)、右下(1, 1)) [xt, yt] の標高データを取得することができる、正確度が最も高い DEM タイルデータを検索する。

\n *\n * @param {number} xt X 座標 (基底タイル座標系)\n * @param {number} yt Y 座標 (基底タイル座標系)\n * @return {?mapray.DemBinary} DEM タイルデータ (存在しなければ null)\n *\n * @private\n */\n _findHighestAccuracy2( xt, yt )\n {\n var flake = this._root_flake;\n if ( flake === null ) {\n // まだ基底タイルが読み込まれていない\n return null;\n }\n\n var size = 2; // 2^(flake.z + 1)\n var xf = size * xt;\n var yf = size * yt;\n var dem_flake = flake; // DEM を持った地表断片\n\n for (;;) {\n var u = GeoMath.clamp( Math.floor( xf ), 0, size - 1 ) % 2;\n var v = GeoMath.clamp( Math.floor( yf ), 0, size - 1 ) % 2;\n var child = flake._children[u + 2*v];\n\n if ( child === null ) {\n // これ以上のレベルは存在しない\n break;\n }\n else if ( flake._dem_state === DemState.LOADED ) {\n // より正確度が高い DEM を持つ地表断片に更新\n dem_flake = flake;\n }\n\n flake = child;\n size *= 2;\n xf *= 2;\n yf *= 2;\n }\n\n return dem_flake._dem_data;\n }\n\n /**\n * @summary フレームの最後の処理\n */\n endFrame()\n {\n var max_touch_flakes = this._hist_stats.getMaxValue( this._num_touch_flakes );\n if ( this._num_cache_flakes > this._flake_reduce_thresh * max_touch_flakes ) {\n this._reduceFlakes( max_touch_flakes );\n }\n\n if ( this._num_cache_meshes > this._mesh_reduce_lower &&\n this._num_cache_meshes > this._mesh_reduce_thresh * this._num_touch_meshes ) {\n this._reduceMeshes();\n }\n\n this._dem_area_updated.clear();\n\n this._num_touch_flakes = 0;\n this._num_touch_meshes = 0;\n ++this._frame_counter;\n }\n\n /**\n * _root_flake, _avg_height, _status を設定するためのリクエスト\n * @private\n */\n _requestRoot()\n {\n const z = 0;\n const x = 0;\n const y = 0;\n\n this._root_cancel_id = this._dem_provider.requestTile( z, x, y, data => {\n if ( data ) {\n var dem = new DemBinary( z, x, y, this._ρ, data );\n this._avg_height = dem.newAvgHeightMaps();\n this._root_flake = new Flake( null, z, x, y );\n this._root_flake.setupRoot( this, dem );\n this._status = Status.READY;\n this._dem_area_updated.addTileArea( dem );\n }\n else { // データ取得に失敗\n this._status = Status.FAILED;\n }\n this._root_cancel_id = null;\n --this._num_dem_requesteds;\n } );\n ++this._num_dem_requesteds;\n }\n\n /**\n * @private\n */\n _reduceFlakes( max_touch_flakes )\n {\n // Flake を集めて、優先度で整列\n var flat_flakes = this._root_flake.flattenFlakes();\n // assert: flat_flakes.length == this._num_cache_flakes\n flat_flakes.sort( (a, b) => a.compareForReduce( b ) );\n\n // 優先度の低い Flake を削除\n var num_cache_flakes = Math.floor( this._flake_reduce_factor * max_touch_flakes );\n flat_flakes.slice( num_cache_flakes ).forEach( flake => flake.dispose() );\n // assert: this._num_cache_flakes == num_cache_flakes\n }\n\n /**\n * @private\n */\n _reduceMeshes()\n {\n var flat_meshes = this._root_flake.flattenMeshes();\n // assert: flat_meshes.length == this._num_cache_meshes\n flat_meshes.sort( (a, b) => a.compareForReduce( b ) );\n\n var num_cache_meshes = Math.floor( this._mesh_reduce_factor * this._num_touch_meshes );\n flat_meshes.slice( num_cache_meshes ).forEach( mnode => mnode.dispose() );\n // assert: this._num_cache_meshes == num_cache_meshes\n }\n\n}\n\n\n/**\n * @summary Globe 状態の列挙型\n * @enum {object}\n * @memberof mapray.Globe\n * @constant\n * @see mapray.Globe#status\n */\nvar Status = {\n /**\n * 準備中 (初期状態)\n */\n NOT_READY: { id: \"NOT_READY\" },\n\n /**\n * 準備完了\n */\n READY: { id: \"READY\" },\n\n /**\n * 失敗状態\n */\n FAILED: { id: \"FAILED\" }\n};\nGlobe.Status = Status;\n\n\n/**\n * @summary 地表断片\n * @memberof mapray.Globe\n * @private\n */\nclass Flake {\n\n /**\n * @param {mapray.Globe.Flake} parent\n * @param {number} z\n * @param {number} x\n * @param {number} y\n */\n constructor( parent, z, x, y )\n {\n /**\n * @summary 地表分割レベル\n * @member mapray.Globe.Flake#z\n * @type {number}\n */\n this.z = z;\n\n /**\n * @summary 地表タイル X 座標\n * @member mapray.Globe.Flake#x\n * @type {number}\n */\n this.x = x;\n\n /**\n * @summary 地表タイル Y 座標\n * @member mapray.Globe.Flake#y\n * @type {number}\n */\n this.y = y;\n\n // Flake 階層\n this._parent = parent;\n this._children = [null, null, null, null];\n this._globe = (parent !== null) ? parent._globe : null;\n\n // DEM データ\n this._dem_data = null; // DEM バイナリ、または取り消しオブジェクト\n this._dem_state = DemState.NONE;\n\n // エンティティ辞書 Map.\n this._entity_map = null;\n\n // MeshNode\n this._meshes = [];\n\n // 標高代表値\n this._prev_Za_dem = null; // 前回の Za (DemBinary) だだし、標高代表が決定しているときは this\n this._prev_Zr_dem = null; // 前回の Zr (DemBinary)\n\n this._base_height = 0; // 平均標高 (h~)\n this._height_min = 0; // 最大標高 (h⇓)\n this._height_max = 0; // 最小標高 (h⇑)\n this._dem_zlimit = 0; // メッシュ生成時の DEM Z レベル上限 (Zb)\n\n // 境界箱 (AABB)\n this._gocs_x_min = 0;\n this._gocs_x_max = 0;\n this._gocs_y_min = 0;\n this._gocs_y_max = 0;\n this._gocs_z_min = 0;\n this._gocs_z_max = 0;\n\n // キャッシュ管理\n this._aframe = -1;\n if ( this._globe !== null ) {\n this._globe._num_cache_flakes += 1;\n }\n }\n\n /**\n * 基準の標高\n * @type {number}\n * @readonly\n */\n get base_height()\n {\n return this._base_height;\n }\n\n /**\n * 最小の標高\n * @type {number}\n * @readonly\n */\n get height_min()\n {\n return this._height_min;\n }\n\n /**\n * 最大の標高\n * @type {number}\n * @readonly\n */\n get height_max()\n {\n return this._height_max;\n }\n\n /**\n * @summary 基底 Flake 専用の設定\n * @package\n */\n setupRoot( globe, dem )\n {\n this._globe = globe;\n this._dem_data = dem;\n this._dem_state = DemState.LOADED;\n this._entity_map = new Map();\n this._estimate();\n globe._num_cache_flakes += 1;\n }\n\n /**\n * @summary 子 Flake を取得または生成\n * @param {number} u 子 Flake U 座標 (0 または 1)\n * @param {number} v 子 Flake V 座標 (0 または 1)\n * @return {mapray.Globe.Flake} 子 Flake インスタンス\n */\n newChild( u, v )\n {\n var index = u + 2*v;\n var child = this._children[index];\n\n if ( child === null ) {\n // 存在しないときは Flake を生成する\n child = new Flake( this, this.z + 1, 2*this.x + u, 2*this.y + v );\n this._children[index] = child;\n }\n\n child._estimate();\n child.touch();\n return child;\n }\n\n /**\n * @summary カリングするか?\n * @param {mapray.Vector4[]} clip_planes クリップ平面配列\n * @return {boolean} 見えないとき true, 見えるまたは不明のとき false\n */\n isInvisible( clip_planes )\n {\n switch ( this.z ) {\n case 0: return this._isInvisible_0( clip_planes );\n default: return this._isInvisible_N( clip_planes );\n }\n }\n\n /**\n * @summary レンダリングオブジェクトを検索\n *\n * @param {number} lod 地表詳細レベル (LOD)\n *\n * @return {mapray.FlakeRenderObject}\n */\n getRenderObject( lod )\n {\n var η = Math.pow( 2, -lod ) * Flake.ε; // 2^-lod ε\n\n var cu; // 水平球面分割レベル\n if ( η <= 2 ) {\n cu = Math.max( Math.ceil( GeoMath.LOG2PI - this.z - Math.maprayLog2( Math.acos( 1 - η ) ) ), 0 );\n }\n else {\n cu = 0;\n }\n\n var cosφ = this._getCosφ();\n var cv; // 垂直球面分割レベル\n if ( η * cosφ <= 2 ) {\n cv = Math.max( Math.ceil( GeoMath.LOG2PI - this.z + Math.maprayLog2( cosφ / Math.acos( 1 - η * cosφ ) ) ), 0 );\n }\n else {\n cv = 0;\n }\n\n var node = this._getMeshNode( lod, cu, cv );\n node.touch();\n\n return node.getRenderObject();\n }\n\n /**\n * @summary this と交差する FlakePrimitiveProducer インスタンスの列挙子を取得\n *\n * @return {iterable.}\n */\n getEntityProducers()\n {\n let entity_map = this._getEntityMap();\n return entity_map.keys();\n }\n\n /**\n * @summary Flake ツリーに producer を追加\n *\n * 事前条件:\n * - this._entity_map !== null\n * - this と this の子孫に producer が存在しない\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n */\n addEntityProducer( producer )\n {\n switch ( producer.getAreaStatus( this ) ) {\n\n case Entity.AreaStatus.PARTIAL: {\n // エントリに producer を追加\n this._entity_map.set( producer, false );\n\n // this の子孫も同様の処理\n for ( let child of this._children ) {\n if ( child !== null && child._entity_map !== null ) {\n child.addEntityProducer( producer );\n }\n }\n } break;\n\n case Entity.AreaStatus.FULL: {\n this._addEntityFullProducer( producer );\n } break;\n\n default: // Entity.AreaStatus.EMPTY\n break;\n }\n }\n\n /**\n * @summary Flake ツリーに producer を追加\n *\n * 事前条件:\n * - producer.getAreaStatus( this ) === Entity.AreaStatus.FULL\n * - this._entity_map !== null\n * - this と this の子孫に producer が存在しない\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n *\n * @private\n */\n _addEntityFullProducer( producer )\n {\n // エントリに producer を追加\n this._entity_map.set( producer, true );\n\n // this の子孫も同様の処理\n for ( let child of this._children ) {\n if ( child !== null && child._entity_map !== null ) {\n child._addEntityFullProducer( producer );\n }\n }\n }\n\n /**\n * @summary Flake ツリーから producer を削除\n *\n * 事前条件:\n * - this._entity_map !== null\n * 事後条件:\n * - this と this の子孫に producer が存在しない\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n */\n removeEntityProducer( producer )\n {\n if ( !this._entity_map.has( producer ) ) {\n // もともと producer は this と this の子孫に存在しない\n return;\n }\n\n // エントリから producer を削除\n this._entity_map.delete( producer );\n\n // this に producer に対応するメッシュが存在すれば削除\n this._removeEntityMeshes( producer );\n\n // this の子孫も同様の処理\n for ( let child of this._children ) {\n if ( child !== null && child._entity_map !== null ) {\n child.removeEntityProducer( producer );\n }\n }\n }\n\n /**\n * @summary Flake ツリーの producer を更新\n *\n * 事前条件:\n * - this._entity_map !== null\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n */\n updateEntityProducer( producer )\n {\n this.removeEntityProducer( producer );\n this.addEntityProducer( producer );\n }\n\n /**\n * @summary 地表断片とレイの交点までの距離を検索\n *

地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点の中で、始点から最も近い交点までの距離を返す。

\n *

ただし地表断片と線分が交差しないときは limit を返す。

\n *

事前条件: this._globe.status === Status.READY

\n * @param {mapray.Ray} ray ray.position を始点として ray.direction 方向に伸びる半直線\n * @param {number} limit この距離までの交点を検索\n * @return {number} ray.position から交点までの距離、ただし交差しなかったときは limit\n */\n findRayDistance( ray, limit )\n {\n var dem_flake;\n for ( dem_flake = this; dem_flake._dem_state !== DemState.LOADED; dem_flake = dem_flake._parent ) {}\n\n if ( this.z - dem_flake.z === this._globe._ρ ) {\n return this._findQuadRayDistance( ray, limit, dem_flake );\n }\n else if ( this._cullForRayDistance( ray, limit ) ) {\n return limit;\n }\n else {\n var dmin = limit;\n for ( var v = 0; v < 2; ++ v ) {\n for ( var u = 0; u < 2; ++ u ) {\n dmin = this.newChild( u, v ).findRayDistance( ray, dmin );\n }\n }\n return dmin;\n }\n }\n\n /**\n * @summary 自己と子孫を破棄\n */\n dispose()\n {\n var i;\n\n var parent = this._parent;\n if ( parent === null ) {\n // すでに破棄済み\n return;\n }\n\n var globe = this._globe;\n\n // メッシュを破棄\n var meshes = this._meshes;\n while ( meshes.length > 0 ) {\n meshes[0].dispose();\n }\n\n // 子孫 Flake を破棄\n var children = this._children;\n for ( i = 0; i < 4; ++i ) {\n var child = children[i];\n if ( child !== null ) {\n child.dispose();\n }\n }\n\n // 親 Flake から this を削除\n var pchildren = parent._children;\n for ( i = 0; i < 4; ++i ) {\n if ( pchildren[i] === this ) {\n pchildren[i] = null;\n break;\n }\n }\n this._parent = null;\n\n // DEM リクエストの取り消し\n if ( this._dem_state === DemState.REQUESTED ) {\n globe._dem_provider.cancelRequest( this._dem_data );\n --globe._num_dem_requesteds;\n }\n\n // Flake 数を減らす\n globe._num_cache_flakes -= 1;\n }\n\n /**\n * @summary 自己と子孫の Flake リストを取得\n * @return {array}\n * @package\n */\n flattenFlakes()\n {\n var list = [];\n this._flattenFlakes( list );\n return list;\n }\n\n /**\n * @summary 自己と子孫の MeshNode リストを取得\n * @return {array}\n * @package\n */\n flattenMeshes()\n {\n var list = [];\n this._flattenMeshes( list );\n return list;\n }\n\n /**\n * @summary 削減用の Flake 比較\n * @param {mapray.Globe.Flake} other 比較対象\n * @return {number} 比較値\n * @package\n */\n compareForReduce( other )\n {\n // 最近アクセスしたものを優先\n // 同じなら Z レベルが小さい方を優先\n var a = this;\n var b = other;\n var aframe = b._aframe - a._aframe;\n return (aframe !== 0) ? aframe : a.z - b.z;\n }\n\n /**\n * @private\n */\n _flattenFlakes( list )\n {\n list.push( this );\n var children = this._children;\n for ( var i = 0; i < 4; ++i ) {\n var child = children[i];\n if ( child !== null ) {\n child._flattenFlakes( list );\n }\n }\n }\n\n /**\n * @private\n */\n _flattenMeshes( list )\n {\n Array.prototype.push.apply( list, this._meshes );\n var children = this._children;\n for ( var i = 0; i < 4; ++i ) {\n var child = children[i];\n if ( child !== null ) {\n child._flattenMeshes( list );\n }\n }\n }\n\n /**\n * @summary アクセスフレームを更新\n * @package\n */\n touch()\n {\n var globe = this._globe;\n if ( this._aframe !== globe._frame_counter ) {\n this._aframe = globe._frame_counter;\n globe._num_touch_flakes += 1;\n }\n }\n\n /**\n * @summary メッシュノードを取得\n *\n * @param {number} lod 地表詳細レベル (LOD)\n * @param {number} cu 水平球面分割レベル\n * @param {number} cv 垂直球面分割レベル\n *\n * @return {mapray.Globe.MeshNode} メッシュノード\n *\n * @private\n */\n _getMeshNode( lod, cu, cv )\n {\n var dem = this._getMeshDemBinary( lod );\n var dpows = dem.getDivisionPowers( this, lod, cu, cv );\n\n // キャッシュに存在すれば、それを返す\n var meshes = this._meshes;\n var length = meshes.length;\n for ( var i = 0; i < length; ++i ) {\n var item = meshes[i];\n if ( item.match( dem, dpows ) ) {\n return item;\n }\n }\n\n // キャッシュに存在しないので新規に生成\n var node = new MeshNode( this, dem, dpows );\n meshes.unshift( node ); // 検索効率のため先頭に追加\n return node;\n }\n\n /**\n * @summary メッシュ用の DEM バイナリを取得\n * @param {number} lod 地表詳細レベル (LOD)\n * @return {mapray.DemBinary} DEM タイルデータ\n * @private\n */\n _getMeshDemBinary( lod )\n {\n var zDesired = GeoMath.clamp( Math.round( lod + this._globe._dem_zbias ),\n 0, this._dem_zlimit );\n\n var dem = this._findNearestDemTile( zDesired );\n\n // 上のレベルの DEM をリクエスト\n if ( dem.z < zDesired ) {\n var qlevel = dem.getQuadLevel( this.z, this.x, this.y );\n if ( qlevel > 0 ) {\n this._requestAncestorDemTile( Math.min( dem.z + qlevel, zDesired ) );\n }\n }\n\n return dem;\n }\n\n /**\n * @summary 先祖 DEM タイルデータを検索\n * @desc\n *

this の (レベルが zlimit またはそれ以下の) 祖先の中で、現在キャッシュに存在する最大レベルの DEM タイルデータを検索する。

\n * @param {number} zlimit 先祖レベルの上限\n * @return {mapray.DemBinary} 先祖 DEM タイルデータ\n */\n _findNearestDemTile( zlimit )\n {\n var flake = this;\n\n // zlimit の地表断片を検索\n var count = this.z - zlimit;\n for ( var i = 0; i < count; ++i ) {\n flake = flake._parent;\n }\n\n // 次の DemBinary を持つ地表断片を検索\n while ( flake._dem_state !== DemState.LOADED ) {\n flake = flake._parent;\n }\n\n // 見つけた地表断片の DemBinary を返す\n return flake._dem_data;\n }\n\n /**\n * @summary 地表断片を包含する DEM タイルデータを要求\n * @desc\n *

this を包含または this と一致する、ズームレベル ze の DEM タイルをサーバーに要求する。

\n *

ただしすでにキャッシュにその DEM タイルが存在、または REQUESTED 状態のときは要求しない。

\n *

FAILED 状態かつ ze > 0 のときは、再帰的に ze - 1 を要求する。

\n *

要求が最大数に達しているときは無視する。

\n * @param {number} ze DEM ズームレベル\n */\n _requestAncestorDemTile( ze )\n {\n var globe = this._globe;\n\n if ( globe._num_dem_requesteds >= globe._max_dem_requesteds ) {\n // 要求が最大数に達しているので受け入れない\n return;\n }\n\n var flake = this;\n\n // zlimit の地表断片を検索\n var count = this.z - ze;\n for ( var i = 0; i < count; ++i ) {\n flake = flake._parent;\n }\n\n while ( true ) {\n var state = flake._dem_state;\n if ( state === DemState.LOADED || state === DemState.REQUESTED ) {\n // 要求する必要がない\n break;\n }\n else if ( state === DemState.FAILED ) {\n // 親でリトライ\n flake = flake._parent;\n continue;\n }\n else {\n // DEM タイルデータを要求\n // assert: state === DemState.NONE\n var provider = globe._dem_provider;\n\n flake._dem_data = provider.requestTile( flake.z, flake.x, flake.y, data => {\n if ( flake._parent === null ) {\n // すでに破棄済みなので無視\n return;\n }\n if ( data ) {\n flake._dem_data = new DemBinary( flake.z, flake.x, flake.y, globe._ρ, data );\n flake._dem_state = DemState.LOADED;\n globe._dem_area_updated.addTileArea( flake );\n }\n else { // データ取得に失敗\n flake._dem_data = null;\n flake._dem_state = DemState.FAILED;\n }\n --globe._num_dem_requesteds;\n } );\n\n flake._dem_state = DemState.REQUESTED;\n ++globe._num_dem_requesteds;\n break;\n }\n }\n }\n\n /**\n * @private\n */\n _isInvisible_0( clip_planes )\n {\n var r = GeoMath.EARTH_RADIUS + this._height_max;\n\n for ( var i = 0; i < clip_planes.length; ++i ) {\n var dist = clip_planes[i][3]; // 平面から GOCS 原点 (地球中心) までの距離\n if ( dist < -r ) {\n // 地球全体がこの平面の裏側にあるので見えない\n return true;\n }\n }\n\n return false; // 見えている可能性がある\n }\n\n /**\n * @private\n */\n _isInvisible_N( clip_planes )\n {\n var xmin = this._gocs_x_min;\n var xmax = this._gocs_x_max;\n var ymin = this._gocs_y_min;\n var ymax = this._gocs_y_max;\n var zmin = this._gocs_z_min;\n var zmax = this._gocs_z_max;\n\n for ( var i = 0; i < clip_planes.length; ++i ) {\n var p = clip_planes[i];\n var px = p[0];\n var py = p[1];\n var pz = p[2];\n var pw = p[3];\n\n // 以下がすべて成り立つとボックス全体は平面の裏側にある\n // px*xmin + py*ymin + pz*zmin + pw < 0\n // px*xmax + py*ymin + pz*zmin + pw < 0\n // px*xmin + py*ymax + pz*zmin + pw < 0\n // px*xmax + py*ymax + pz*zmin + pw < 0\n // px*xmin + py*ymin + pz*zmax + pw < 0\n // px*xmax + py*ymin + pz*zmax + pw < 0\n // px*xmin + py*ymax + pz*zmax + pw < 0\n // px*xmax + py*ymax + pz*zmax + pw < 0\n\n var c0 = px*xmin + py*ymin;\n var c1 = px*xmax + py*ymin;\n var c2 = px*xmin + py*ymax;\n var c3 = px*xmax + py*ymax;\n var c4 = -pz*zmin - pw;\n var c5 = -pz*zmax - pw;\n\n if ( c0 < c4 && c1 < c4 && c2 < c4 && c3 < c4 &&\n c0 < c5 && c1 < c5 && c2 < c5 && c3 < c5 ) {\n // ボックス全体が平面の裏側にあるので見えない\n return true;\n }\n }\n\n return false; // 見えている可能性がある\n }\n\n /**\n * @summary 中間緯度の余弦\n * @return {number}\n * @private\n */\n _getCosφ()\n {\n var z = this.z;\n if ( z > 0 ) {\n var y = this.y;\n var p = Math.pow( 2, 1 - z );\n var y0 = Math.abs( 1 - p * y );\n var y1 = Math.abs( 1 - p * (y + 1) );\n var ey = Math.exp( Math.PI * Math.min( y0, y1 ) );\n return 2 * ey / (ey*ey + 1); // Cos[φ] == Cos[gd[y]] == Sech[y]\n }\n else {\n // z == 0 のときは φ == 0 とする\n return 1; // Cos[0]\n }\n }\n\n /**\n * @summary 標高代表値と境界箱を更新\n * @private\n */\n _estimate()\n {\n if ( this._prev_Za_dem === this ) {\n // 代表値は決定済みなので何もしない\n return;\n }\n\n var zg = this.z;\n var ρ = this._globe._ρ;\n var zr_dem;\n\n if ( zg < ρ ) {\n zr_dem = this._findNearestDemTile( zg );\n if ( zr_dem === this._prev_Zr_dem ) {\n // 前回と代表値が変わらないので何もしない\n return;\n }\n this._prev_Zr_dem = zr_dem;\n this._estimate_low( zr_dem );\n this._dem_zlimit = zg;\n }\n else {\n var za_dem = this._findNearestDemTile( zg - ρ );\n\n if ( za_dem.isLeaf( zg, this.x, this.y ) ) {\n this._estimate_leaf( za_dem );\n }\n else {\n zr_dem = this._findNearestDemTile( za_dem.z + ρ );\n if ( za_dem === this._prev_Za_dem && zr_dem === this._prev_Zr_dem ) {\n // 前回と代表値が変わらないので何もしない\n return;\n }\n this._prev_Za_dem = za_dem;\n this._prev_Zr_dem = zr_dem;\n this._estimate_high( za_dem, zr_dem );\n }\n this._dem_zlimit = za_dem.z + ρ;\n }\n\n // 境界箱の更新\n switch ( zg ) {\n case 0: this._updataBoundingBox_0(); break;\n case 1: this._updataBoundingBox_1(); break;\n default: this._updataBoundingBox_N(); break;\n }\n }\n\n /**\n * @summary 標高代表値を計算 (Zg < ρ)\n * @param {mapray.DemBinary} zr_dem レベルが Zr の DEM\n * @private\n */\n _estimate_low( zr_dem )\n {\n var zg = this.z;\n var xg = this.x;\n var yg = this.y;\n var α = this._calcAlpha();\n\n this._base_height = this._globe._avg_height.sample( zg, xg, yg );\n this._height_min = Math.max( this._base_height + α * Flake.Fm, zr_dem.height_min );\n this._height_max = Math.min( this._base_height + α * Flake.Fp, zr_dem.height_max );\n\n if ( zr_dem.z == zg || zr_dem.isLeaf( zg, xg, yg ) ) {\n // 標高代表値が確定した\n this._prev_Za_dem = this;\n }\n }\n\n /**\n * @summary 標高代表値を計算 (Zg >= ρ && !L(Za))\n * @param {mapray.DemBinary} za_dem レベルが Za の DEM\n * @param {mapray.DemBinary} zr_dem レベルが Zr の DEM\n * @private\n */\n _estimate_high( za_dem, zr_dem )\n {\n var globe = this._globe;\n var zg = this.z;\n var xg = this.x;\n var yg = this.y;\n\n var ze = za_dem.z; // -> za\n var xe = za_dem.x;\n var ye = za_dem.y;\n\n var ρ = globe._ρ;\n var pow = Math.pow( 2, ze - zg );\n var size = 1 << ρ;\n\n var u = Math.floor( size * ((xg + 0.5) * pow - xe) );\n var v = Math.floor( size * ((yg + 0.5) * pow - ye) );\n\n var smin = size * ( xg * pow - xe) - u;\n var smax = size * ((xg + 1) * pow - xe) - u;\n var tmin = size * ( yg * pow - ye) - v;\n var tmax = size * ((yg + 1) * pow - ye) - v;\n\n var heights = za_dem.getHeights( u, v );\n var h00 = heights[0];\n var h10 = heights[1];\n var h01 = heights[2];\n var h11 = heights[3];\n\n var h0 = (h00 * (1 - smin) + h10 * smin) * (1 - tmin) + (h01 * (1 - smin) + h11 * smin) * tmin;\n var h1 = (h00 * (1 - smax) + h10 * smax) * (1 - tmin) + (h01 * (1 - smax) + h11 * smax) * tmin;\n var h2 = (h00 * (1 - smin) + h10 * smin) * (1 - tmax) + (h01 * (1 - smin) + h11 * smin) * tmax;\n var h3 = (h00 * (1 - smax) + h10 * smax) * (1 - tmax) + (h01 * (1 - smax) + h11 * smax) * tmax;\n\n var α = this._calcAlpha();\n\n this._base_height = 0.25 * (h0 + h1 + h2 + h3);\n this._height_min = Math.max( this._base_height + α * Flake.Fm, zr_dem.height_min );\n this._height_max = Math.min( this._base_height + α * Flake.Fp, zr_dem.height_max );\n\n if ( ze < zg - ρ ) {\n // 上のレベルの DEM をリクエスト\n var qlevel = za_dem.getQuadLevel( zg, xg, yg );\n // assert: qlevel > 0\n this._requestAncestorDemTile( Math.min( ze + qlevel, zg - ρ ) );\n }\n else if ( zr_dem.z == zg || zr_dem.isLeaf( zg, xg, yg ) ) {\n // 標高代表値が確定した\n // assert: ze == zg - ρ\n this._prev_Za_dem = this;\n }\n }\n\n /**\n * @summary 標高代表値を計算 (Zg >= ρ && L(Za))\n * @param {mapray.DemBinary} za_dem レベルが Za の DEM\n * @private\n */\n _estimate_leaf( za_dem )\n {\n var zg = this.z;\n var xg = this.x;\n var yg = this.y;\n\n var ze = za_dem.z; // -> za\n var xe = za_dem.x;\n var ye = za_dem.y;\n\n var pow = Math.pow( 2, ze - zg );\n var size = 1 << this._globe._ρ;\n\n var u = Math.floor( size * ((xg + 0.5) * pow - xe) );\n var v = Math.floor( size * ((yg + 0.5) * pow - ye) );\n\n var smin = size * ( xg * pow - xe) - u;\n var smax = size * ((xg + 1) * pow - xe) - u;\n var tmin = size * ( yg * pow - ye) - v;\n var tmax = size * ((yg + 1) * pow - ye) - v;\n\n var heights = za_dem.getHeights( u, v );\n var h00 = heights[0];\n var h10 = heights[1];\n var h01 = heights[2];\n var h11 = heights[3];\n\n // Hi = Di( Za )\n var h0 = (h00 * (1 - smin) + h10 * smin) * (1 - tmin) + (h01 * (1 - smin) + h11 * smin) * tmin;\n var h1 = (h00 * (1 - smax) + h10 * smax) * (1 - tmin) + (h01 * (1 - smax) + h11 * smax) * tmin;\n var h2 = (h00 * (1 - smin) + h10 * smin) * (1 - tmax) + (h01 * (1 - smin) + h11 * smin) * tmax;\n var h3 = (h00 * (1 - smax) + h10 * smax) * (1 - tmax) + (h01 * (1 - smax) + h11 * smax) * tmax;\n\n this._base_height = 0.25 * (h0 + h1 + h2 + h3);\n this._height_min = Math.min( h0, h1, h2, h3 );\n this._height_max = Math.max( h0, h1, h2, h3 );\n\n // 標高代表値が確定した\n this._prev_Za_dem = this;\n }\n\n /**\n * @summary α を計算\n * @desc\n *

中間緯度の標高 0 での緯線の長さを示す値 α を計算する。

\n * @return {number} α\n * @private\n */\n _calcAlpha()\n {\n var pow = Math.pow( 2, 1 - this.z );\n return pow * Flake.πr / Math.cosh( (1 - pow * (this.y + 0.5)) * Math.PI );\n }\n\n /**\n * @summary 境界箱を更新 (Z == 0)\n */\n _updataBoundingBox_0()\n {\n var r = GeoMath.EARTH_RADIUS + this._height_max;\n\n this._gocs_x_min = -r;\n this._gocs_x_max = r;\n\n this._gocs_y_min = -r;\n this._gocs_y_max = r;\n\n this._gocs_z_min = -r;\n this._gocs_z_max = r;\n }\n\n /**\n * @summary 境界箱を更新 (Z == 1)\n */\n _updataBoundingBox_1()\n {\n var r = GeoMath.EARTH_RADIUS + this._height_max;\n var x = this.x;\n var y = this.y;\n\n this._gocs_x_min = -r;\n this._gocs_x_max = r;\n\n this._gocs_y_min = r * (x - 1);\n this._gocs_y_max = r * x;\n\n this._gocs_z_min = -r * y;\n this._gocs_z_max = r * (1 - y);\n }\n\n /**\n * @summary 境界箱を更新 (Z >= 2)\n */\n _updataBoundingBox_N()\n {\n var pi = Math.PI;\n var z = this.z;\n var x = this.x;\n var y = this.y;\n\n // 座標範囲 (単位球メルカトル座標系)\n var msize = Math.pow( 2, 1 - z ) * pi;\n var mx_min = -pi + x * msize;\n var mx_max = -pi + (x + 1) * msize;\n var my_min = pi - (y + 1) * msize;\n var my_max = pi - y * msize;\n\n // 事前計算変数\n var λmin = mx_min;\n var λmax = mx_max;\n var emin = Math.exp( my_min ); // Exp[my_min]\n var emax = Math.exp( my_max ); // Exp[my_max]\n var e2min = emin * emin; // Exp[my_min]^2\n var e2max = emax * emax; // Exp[my_max]^2\n\n // 座標範囲 (地心直交座標系)\n //\n // z >= 2 のとき、λとφの範囲は以下の区間のどれかに入る\n // φ: (-π/2, 0] [0, π/2)\n // λ: [-π, -π/2] [-π/2, 0] [0, π/2] [π/2, π]\n //\n // 区間ごとの関数の変化 (各区間で単調増加または単調減少)\n // Sin[φ]: (-1 → 0] [0 → 1)\n // Cos[φ]: ( 0 → 1] [1 → 0)\n // Sin[λ]: [ 0 → -1] [-1 → 0] [0 → 1] [1 → 0]\n // Cos[λ]: [-1 → 0] [ 0 → 1] [1 → 0] [0 → -1]\n\n var rmin = GeoMath.EARTH_RADIUS + this._height_min;\n var rmax = GeoMath.EARTH_RADIUS + this._height_max;\n var cosφmin = 2 * emin / (e2min + 1);\n var cosφmax = 2 * emax / (e2max + 1);\n\n // gx = r Cos[φ] Cos[λ]\n // gy = r Cos[φ] Sin[λ]\n // gz = r Sin[φ]\n if ( my_min + my_max < 0 ) {\n // φ : (-π/2, 0]\n\n if ( λmin + λmax < -pi ) {\n // λ : [-π, -π/2]\n\n this._gocs_x_min = rmax * cosφmax * Math.cos( λmin );\n this._gocs_x_max = rmin * cosφmin * Math.cos( λmax );\n\n this._gocs_y_min = rmax * cosφmax * Math.sin( λmax );\n this._gocs_y_max = rmin * cosφmin * Math.sin( λmin );\n }\n else if ( λmin + λmax < 0 ) {\n // λ : [-π/2, 0]\n\n this._gocs_x_min = rmin * cosφmin * Math.cos( λmin );\n this._gocs_x_max = rmax * cosφmax * Math.cos( λmax );\n\n this._gocs_y_min = rmax * cosφmax * Math.sin( λmin );\n this._gocs_y_max = rmin * cosφmin * Math.sin( λmax );\n }\n else if ( λmin + λmax < pi ) {\n // λ : [0, π/2]\n\n this._gocs_x_min = rmin * cosφmin * Math.cos( λmax );\n this._gocs_x_max = rmax * cosφmax * Math.cos( λmin );\n\n this._gocs_y_min = rmin * cosφmin * Math.sin( λmin );\n this._gocs_y_max = rmax * cosφmax * Math.sin( λmax );\n }\n else {\n // λ : [π/2, π]\n\n this._gocs_x_min = rmax * cosφmax * Math.cos( λmax );\n this._gocs_x_max = rmin * cosφmin * Math.cos( λmin );\n\n this._gocs_y_min = rmin * cosφmin * Math.sin( λmax );\n this._gocs_y_max = rmax * cosφmax * Math.sin( λmin );\n }\n\n this._gocs_z_min = rmax * (e2min - 1) / (e2min + 1);\n this._gocs_z_max = rmin * (e2max - 1) / (e2max + 1);\n }\n else {\n // φ : [0, π/2)\n\n if ( λmin + λmax < -pi ) {\n // λ : [-π, -π/2]\n\n this._gocs_x_min = rmax * cosφmin * Math.cos( λmin );\n this._gocs_x_max = rmin * cosφmax * Math.cos( λmax );\n\n this._gocs_y_min = rmax * cosφmin * Math.sin( λmax );\n this._gocs_y_max = rmin * cosφmax * Math.sin( λmin );\n }\n else if ( λmin + λmax < 0 ) {\n // λ : [-π/2, 0]\n\n this._gocs_x_min = rmin * cosφmax * Math.cos( λmin );\n this._gocs_x_max = rmax * cosφmin * Math.cos( λmax );\n\n this._gocs_y_min = rmax * cosφmin * Math.sin( λmin );\n this._gocs_y_max = rmin * cosφmax * Math.sin( λmax );\n }\n else if ( λmin + λmax < pi ) {\n // λ : [0, π/2]\n\n this._gocs_x_min = rmin * cosφmax * Math.cos( λmax );\n this._gocs_x_max = rmax * cosφmin * Math.cos( λmin );\n\n this._gocs_y_min = rmin * cosφmax * Math.sin( λmin );\n this._gocs_y_max = rmax * cosφmin * Math.sin( λmax );\n }\n else {\n // λ : [π/2, π]\n\n this._gocs_x_min = rmax * cosφmin * Math.cos( λmax );\n this._gocs_x_max = rmin * cosφmax * Math.cos( λmin );\n\n this._gocs_y_min = rmin * cosφmax * Math.sin( λmax );\n this._gocs_y_max = rmax * cosφmin * Math.sin( λmin );\n }\n\n this._gocs_z_min = rmin * (e2min - 1) / (e2min + 1);\n this._gocs_z_max = rmax * (e2max - 1) / (e2max + 1);\n }\n }\n\n /**\n * サーバーにさらに正確度が高い DEM タイルデータが存在すれば、それをリクエストする。\n * @param {number} xt X 座標 (基底タイル座標系)\n * @param {number} yt Y 座標 (基底タイル座標系)\n * @private\n */\n _requestHighestAccuracy( xt, yt )\n {\n var qlevel = this._dem_data.getQuadLevelDirect( xt, yt );\n if ( qlevel == 0 ) {\n // さらに正確度が高い DEM タイルデータは存在しない\n return;\n }\n\n var flake = this;\n var size = Math.round( Math.pow( 2, this.z + 1 ) );\n var xf = size * xt;\n var yf = size * yt;\n\n for ( var i = 0; i < qlevel; ++i ) {\n var u = GeoMath.clamp( Math.floor( xf ), 0, size - 1 ) % 2;\n var v = GeoMath.clamp( Math.floor( yf ), 0, size - 1 ) % 2;\n flake = flake.newChild( u, v );\n size *= 2;\n xf *= 2;\n yf *= 2;\n }\n\n flake._requestAncestorDemTile( flake.z );\n }\n\n /**\n * @summary 地表断片とレイの交点までの距離を検索\n *

地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点までの距離を返す。

\n *

ただし地表断片と線分が交差しないときは limit を返す。

\n * @private\n */\n _findQuadRayDistance( ray, limit, dem_flake )\n {\n var pts = this._getQuadPositions( dem_flake, Flake._temp_positions );\n var dist = Flake._findTriRayDistance( ray, limit, pts[0], pts[2], pts[1] );\n return (dist === limit) ? Flake._findTriRayDistance( ray, limit, pts[1], pts[2], pts[3] ) : dist;\n }\n\n /**\n * @summary 三角形とレイの交点までの距離を検索\n *

三角形 p0, p1, p2 と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点までの距離を返す。

\n *

ただし地表断片と線分が交差しないときは limit を返す。

\n * @private\n */\n static _findTriRayDistance( ray, limit, p0, p1, p2 )\n {\n var v = ray.direction;\n\n // P1 - P0\n var p1_p0 = Flake._temp_ray_1;\n p1_p0[0] = p1[0] - p0[0];\n p1_p0[1] = p1[1] - p0[1];\n p1_p0[2] = p1[2] - p0[2];\n\n // P2 - P0\n var p2_p0 = Flake._temp_ray_2;\n p2_p0[0] = p2[0] - p0[0];\n p2_p0[1] = p2[1] - p0[1];\n p2_p0[2] = p2[2] - p0[2];\n\n // N = (P1 − P0) × (P2 − P0)\n var n = GeoMath.cross3( p1_p0, p2_p0, Flake._temp_ray_3 );\n // N . V\n var nv = GeoMath.dot3( n, v );\n\n if ( nv < 0 ) {\n var q = ray.position;\n\n // P0 - Q\n var p0_q = Flake._temp_ray_4;\n p0_q[0] = p0[0] - q[0];\n p0_q[1] = p0[1] - q[1];\n p0_q[2] = p0[2] - q[2];\n\n // N . (P0 - Q)\n // t = --------------\n // N . V\n var t = GeoMath.dot3( n, p0_q ) / nv;\n if ( t >= 0 && t < limit ) {\n // P = Q + t V\n var p = Flake._temp_ray_5;\n p[0] = q[0] + t * v[0];\n p[1] = q[1] + t * v[1];\n p[2] = q[2] + t * v[2];\n\n // P0 - P\n var p0_p = Flake._temp_ray_6;\n p0_p[0] = p0[0] - p[0];\n p0_p[1] = p0[1] - p[1];\n p0_p[2] = p0[2] - p[2];\n\n // P1 - P\n var p1_p = Flake._temp_ray_7;\n p1_p[0] = p1[0] - p[0];\n p1_p[1] = p1[1] - p[1];\n p1_p[2] = p1[2] - p[2];\n\n // P2 - P\n var p2_p = Flake._temp_ray_8;\n p2_p[0] = p2[0] - p[0];\n p2_p[1] = p2[1] - p[1];\n p2_p[2] = p2[2] - p[2];\n\n // ((P0 - P) × (P1 - P)) . N >= 0\n // ((P1 - P) × (P2 - P)) . N >= 0\n // ((P2 - P) × (P0 - P)) . N >= 0\n if ( GeoMath.dot3( GeoMath.cross3( p0_p, p1_p, Flake._temp_ray_9 ), n ) >= 0 &&\n GeoMath.dot3( GeoMath.cross3( p1_p, p2_p, Flake._temp_ray_10 ), n ) >= 0 &&\n GeoMath.dot3( GeoMath.cross3( p2_p, p0_p, Flake._temp_ray_11 ), n ) >= 0 ) {\n return t;\n }\n }\n }\n\n return limit;\n }\n\n /**\n * @summary 四隅の位置を取得\n * @param {mapray.Globe.Flake} dem_flake DEM の地表断片\n * @param {array} positions 結果の格納先\n * @return {array} positions = [左上, 右上, 左下, 右下]\n * @private\n */\n _getQuadPositions( dem_flake, positions )\n {\n var xg = this.x;\n var yg = this.y;\n var xe = dem_flake.x;\n var ye = dem_flake.y;\n\n var size = 1 << this._globe._ρ;\n var heights = dem_flake._dem_data.getHeights( xg - size * xe, yg - size * ye );\n\n var msize = Math.pow( 2, 1 - this.z ) * Math.PI;\n var mx0 = xg * msize - Math.PI;\n var my0 = Math.PI - yg * msize;\n\n for ( var iv = 0, my = my0; iv < 2; ++iv, my -= msize ) {\n var ey = Math.exp( my );\n var ey2 = ey * ey;\n var sinφ = (ey2 - 1) / (ey2 + 1);\n var cosφ = 2 * ey / (ey2 + 1);\n for ( var iu = 0, mx = mx0; iu < 2; ++iu, mx += msize ) {\n var index = iu + 2*iv;\n var radius = GeoMath.EARTH_RADIUS + heights[index];\n var sinλ = Math.sin( mx );\n var cosλ = Math.cos( mx );\n\n var pos = positions[index];\n pos[0] = radius * cosφ * cosλ;\n pos[1] = radius * cosφ * sinλ;\n pos[2] = radius * sinφ;\n }\n }\n\n return positions;\n }\n\n /**\n * @summary 地表断片とレイの交点までの距離を検索\n *

地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) が交差しないときは true, 交差するまたは不明のとき false を返す。\n * @private\n */\n _cullForRayDistance( ray, limit )\n {\n var q = ray.position;\n var qx = q[0];\n var qy = q[1];\n var qz = q[2];\n\n var xmin = this._gocs_x_min;\n var xmax = this._gocs_x_max;\n var ymin = this._gocs_y_min;\n var ymax = this._gocs_y_max;\n var zmin = this._gocs_z_min;\n var zmax = this._gocs_z_max;\n\n if ( xmin <= qx && qx <= xmax &&\n ymin <= qy && qy <= ymax &&\n zmin <= qz && qz <= zmax ) {\n // ray の始点が AABB の表面または内部 -> 交差する可能性がある\n return false;\n }\n\n var v = ray.direction;\n var vx = v[0];\n var vy = v[1];\n var vz = v[2];\n\n var t;\n var px;\n var py;\n var pz;\n\n // yz\n if ( qx < xmin && vx > 0 ) {\n t = (xmin - qx) / vx;\n if ( t < limit ) {\n py = qy + t * vy;\n pz = qz + t * vz;\n if ( ymin <= py && py <= ymax &&\n zmin <= pz && pz <= zmax ) {\n // ray 線分は AABB の xmin 面内で交差\n return false;\n }\n }\n }\n else if ( qx > xmax && vx < 0 ) {\n t = (xmax - qx) / vx;\n if ( t < limit ) {\n py = qy + t * vy;\n pz = qz + t * vz;\n if ( ymin <= py && py <= ymax &&\n zmin <= pz && pz <= zmax ) {\n // ray 線分は AABB の xmax 面内で交差\n return false;\n }\n }\n }\n\n // xz\n if ( qy < ymin && vy > 0 ) {\n t = (ymin - qy) / vy;\n if ( t < limit ) {\n px = qx + t * vx;\n pz = qz + t * vz;\n if ( xmin <= px && px <= xmax &&\n zmin <= pz && pz <= zmax ) {\n // ray 線分は AABB の ymin 面内で交差\n return false;\n }\n }\n }\n else if ( qy > ymax && vy < 0 ) {\n t = (ymax - qy) / vy;\n if ( t < limit ) {\n px = qx + t * vx;\n pz = qz + t * vz;\n if ( xmin <= px && px <= xmax &&\n zmin <= pz && pz <= zmax ) {\n // ray 線分は AABB の ymax 面内で交差\n return false;\n }\n }\n }\n\n // xy\n if ( qz < zmin && vz > 0 ) {\n t = (zmin - qz) / vz;\n if ( t < limit ) {\n px = qx + t * vx;\n py = qy + t * vy;\n if ( xmin <= px && px <= xmax &&\n ymin <= py && py <= ymax ) {\n // ray 線分は AABB の zmin 面内で交差\n return false;\n }\n }\n }\n else if ( qz > zmax && vz < 0 ) {\n t = (zmax - qz) / vz;\n if ( t < limit ) {\n px = qx + t * vx;\n py = qy + t * vy;\n if ( xmin <= px && px <= xmax &&\n ymin <= py && py <= ymax ) {\n // ray 線分は AABB の zmax 面内で交差\n return false;\n }\n }\n }\n\n // ray 線分と AABB は交差しない\n return true;\n }\n\n\n /**\n * @summary エンティティのメッシュを削除\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n *\n * @private\n */\n _removeEntityMeshes( producer )\n {\n for ( let node of this._meshes ) {\n node.removeEntityMesh( producer );\n }\n }\n\n\n /**\n * @summary エンティティ辞書を取得\n *\n * @return {Map.}\n *\n * @private\n */\n _getEntityMap()\n {\n if ( this._entity_map === null ) {\n // 存在しないので新たに生成する\n\n let parent_map = this._parent._getEntityMap(); // 親の辞書\n let entity_map = new Map();\n\n for ( let [producer, isfull] of parent_map ) {\n if ( isfull ) {\n // 親が FULL なので、子も FULL\n entity_map.set( producer, true );\n }\n else {\n switch ( producer.getAreaStatus( this ) ) {\n case Entity.AreaStatus.PARTIAL:\n entity_map.set( producer, false );\n break;\n case Entity.AreaStatus.FULL:\n entity_map.set( producer, true );\n break;\n default: // Entity.AreaStatus.EMPTY\n break;\n }\n }\n }\n\n this._entity_map = entity_map;\n }\n\n return this._entity_map;\n }\n\n}\n\n\n/**\n * @summary 球面分割数の係数\n * @type {number}\n * @constant\n */\nFlake.ε = 0.0625;\n\n/**\n * @summary 標高下限係数\n * @type {number}\n * @constant\n */\nFlake.Fm = -2.0;\n\n/**\n * @summary 標高上限係数\n * @type {number}\n * @constant\n */\nFlake.Fp = 2.0;\n\n\nFlake.πr = Math.PI * GeoMath.EARTH_RADIUS;\n\nFlake._temp_positions = function() {\n var p = [];\n for ( var i = 0; i < 4; ++i ) { p.push( GeoMath.createVector3() ); }\n return p;\n}();\nFlake._temp_ray_1 = GeoMath.createVector3();\nFlake._temp_ray_2 = GeoMath.createVector3();\nFlake._temp_ray_3 = GeoMath.createVector3();\nFlake._temp_ray_4 = GeoMath.createVector3();\nFlake._temp_ray_5 = GeoMath.createVector3();\nFlake._temp_ray_6 = GeoMath.createVector3();\nFlake._temp_ray_7 = GeoMath.createVector3();\nFlake._temp_ray_8 = GeoMath.createVector3();\nFlake._temp_ray_9 = GeoMath.createVector3();\nFlake._temp_ray_10 = GeoMath.createVector3();\nFlake._temp_ray_11 = GeoMath.createVector3();\n\n\n/**\n * @summary 履歴統計\n * @memberof mapray.Globe\n * @private\n */\nclass HistStats {\n\n constructor()\n {\n this._history = [];\n this._max_value = 0;\n this._hsize = 200; // >= 3\n }\n\n /**\n * @summary 最大値を取得\n */\n getMaxValue( value )\n {\n var history = this._history;\n var old_max = this._max_value;\n\n if ( history.length < this._hsize ) {\n // 追加のみ\n if ( value > old_max ) {\n this._max_value = value;\n }\n }\n else {\n // 追加と削除\n if ( value >= old_max ) {\n // 最大値は value に変わる\n this._max_value = value;\n history.shift();\n }\n else if ( history[0] < old_max ) {\n // 最大値は変わらず\n history.shift();\n }\n else {\n // 最大値は変わる可能性がある\n history.shift();\n this._max_value = HistStats._find_max( history );\n }\n }\n\n history.push( value );\n\n return this._max_value;\n }\n\n static\n _find_max( history )\n {\n var max_value = history[0];\n\n var length = history.length;\n for ( var i = 1; i < length; ++i ) {\n var value = history[i];\n if ( value > max_value ) {\n max_value = value;\n }\n }\n\n return max_value;\n }\n\n}\n\n\n/**\n * @summary メッシュ管理ノード\n * @memberof mapray.Globe\n * @private\n */\nclass MeshNode {\n\n /**\n * @summary 初期化\n * @param {mapray.Globe.Flake} flake 所有者\n * @param {mapray.DemBinary} dem DEM バイナリ\n * @param {number[]} dpows 分割指数\n */\n constructor( flake, dem, dpows )\n {\n this._flake = flake;\n this._dem = dem;\n this._dpows = Array.from( dpows );\n this._aframe = -1;\n\n // 地表のメッシュ\n this._base_mesh = new FlakeMesh( flake._globe.glenv, flake, dpows, dem );\n\n // エンティティのメッシュ\n // key: FlakePrimitiveProducer\n // value: Mesh | CACHED_EMPTY_MESH\n this._entity_meshes = new Map();\n\n // メッシュ数をカウントアップ\n flake._globe._num_cache_meshes += 1;\n }\n\n /**\n * @summary FlakeRenderObject インスタンスを取得\n *\n * @return {mapray.FlakeRenderObject}\n */\n getRenderObject()\n {\n let flake = this._flake;\n let fro = new FlakeRenderObject( flake, flake._globe.glenv, this._base_mesh );\n\n // fro にエンティティ毎のデータを追加\n for ( let producer of flake.getEntityProducers() ) {\n // producer に対応するキャッシュされた Mesh\n let mesh = this._getEntityMesh( producer );\n\n if ( mesh === CACHED_EMPTY_MESH ) {\n // 空メッシュとしてキャッシュされている --> fro に追加しない\n continue;\n }\n\n if ( mesh === null ) {\n // メッシュがキャッシュに存在しないので、メッシュを生成してキャッシュする\n mesh = producer.createMesh( flake, this._dpows, this._dem );\n this._setEntityMesh( producer, mesh );\n\n if ( mesh === null ) {\n // 空メッシュとしてキャッシュされた --> fro に追加しない\n continue;\n }\n }\n\n // fro にエンティティを追加\n fro.addEntityData( mesh, producer );\n }\n\n return fro;\n }\n\n /**\n * @summary 一致するか?\n * @param {mapray.DemBinary} dem DEM バイナリ\n * @param {number[]} dpows 分割指数\n * @return {boolean} 一致するとき true, 一致しないとき false\n */\n match( dem, dpows )\n {\n return (this._dem === dem) && (this._dpows[0] === dpows[0]) && (this._dpows[1] === dpows[1]);\n }\n\n /**\n * @summary アクセスフレームを更新\n */\n touch()\n {\n var globe = this._flake._globe;\n if ( this._aframe !== globe._frame_counter ) {\n this._aframe = globe._frame_counter;\n globe._num_touch_meshes += 1;\n }\n }\n\n /**\n * @summary ノードを破棄\n */\n dispose()\n {\n if ( this._base_mesh === null ) {\n // すでに破棄されている\n return;\n }\n\n var flake = this._flake;\n\n // Flake から this ノードを削除\n var meshes = flake._meshes;\n var length = meshes.length;\n for ( var i = 0; i < length; ++i ) {\n if ( meshes[i] === this ) {\n meshes.splice( i, 1 );\n break;\n }\n }\n\n // メッシュを破棄\n this._base_mesh.dispose();\n this._base_mesh = null;\n\n for ( let mesh of this._entity_meshes.values() ) {\n if ( mesh instanceof Mesh ) {\n mesh.dispose();\n }\n }\n\n // メッシュ数をカウントダウン\n flake._globe._num_cache_meshes -= 1;\n }\n\n /**\n * @summary 削減用の MeshNode 比較\n * @param {mapray.Globe.MeshNode} other 比較対象\n * @return {number} 比較値\n * @package\n */\n compareForReduce( other )\n {\n // 最近アクセスしたものを優先\n var a = this;\n var b = other;\n return b._aframe - a._aframe;\n }\n\n\n /**\n * @summary エンティティのメッシュを削除\n *\n * @desc\n *

producer に対応するメッシュが存在すれば削除する。

\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n */\n removeEntityMesh( producer )\n {\n this._entity_meshes.delete( producer );\n }\n\n\n /**\n * @summary エンティティのメッシュを取得\n *\n * @desc\n *

producer に対応するメッシュを取得する。

\n *

ただし存在しないとき null, 空メッシュが設定されているときは CACHED_EMPTY_MESH を返す。

\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n *\n * @return {?(mapray.Mesh|CACHED_EMPTY_MESH)}\n *\n * @private\n */\n _getEntityMesh( producer )\n {\n let mesh = this._entity_meshes.get( producer );\n\n return (mesh !== undefined) ? mesh : null;\n }\n\n\n /**\n * @summary エンティティのメッシュを設定\n *\n * @desc\n *

producer に対応するメッシュを設定する。

\n *

空メッシュを設定するときは mesh に null を指定する。

\n *\n * @param {mapray.Entity.FlakePrimitiveProducer} producer\n * @param {?mapray.Mesh} mesh\n *\n * @private\n */\n _setEntityMesh( producer, mesh )\n {\n let value = (mesh !== null) ? mesh : CACHED_EMPTY_MESH;\n\n this._entity_meshes.set( producer, value );\n }\n\n}\n\n\n/**\n * @summary DEM 状態の列挙型\n * @enum {object}\n * @memberof mapray.Globe\n * @constant\n */\nvar DemState = {\n /**\n * DEM タイルが存在しない\n */\n NONE: { id: \"NONE\" },\n\n /**\n * DEM タイルが存在する\n */\n LOADED: { id: \"LOADED\" },\n\n /**\n * DEM タイルをリクエスト中\n */\n REQUESTED: { id: \"REQUESTED\" },\n\n /**\n * DEM タイルのリクエストに失敗\n */\n FAILED: { id: \"FAILED\" }\n};\n\n\n/**\n * @summary キャッシュされた空メッシュを表す\n *\n * @memberof mapray.Globe\n * @constant\n */\nconst CACHED_EMPTY_MESH = { id: \"CACHED_EMPTY_MESH\" };\n\n\nexport default Globe;\n","/**\n * @summary 描画地表断片\n * @memberof mapray\n * @private\n */\nclass RenderFlake {\n\n /**\n * @param {mapray.Globe.Flake} flake 地表断片\n */\n constructor( flake )\n {\n /**\n * @summary 地表断片\n * @member mapray.RenderFlake#flake\n * @type {mapray.Globe.Flake}\n */\n this.flake = flake;\n\n /**\n * @summary 地表詳細レベル (LOD)\n * @member mapray.RenderFlake#lod\n * @type {number}\n */\n\n /**\n * @summary LOD (左下)\n * @member mapray.RenderFlake#lod_00\n * @type {number}\n */\n\n /**\n * @summary LOD (右下)\n * @member mapray.RenderFlake#lod_10\n * @type {number}\n */\n\n /**\n * @summary LOD (左上)\n * @member mapray.RenderFlake#lod_01\n * @type {number}\n */\n\n /**\n * @summary LOD (右上)\n * @member mapray.RenderFlake#lod_11\n * @type {number}\n */\n }\n\n\n /**\n * @summary レンダリングオブジェクトを検索\n *\n * @return {mapray.FlakeRenderObject}\n */\n getRenderObject()\n {\n return this.flake.getRenderObject( this.lod );\n }\n\n}\n\n\nexport default RenderFlake;\n","import GeoMath from \"./GeoMath\";\nimport RenderFlake from \"./RenderFlake\";\n\n\n/**\n * @summary 描画地表断片を収集するツール\n * @memberof mapray.RenderStage\n * @private\n */\nclass FlakeCollector {\n\n /**\n * @param {mapray.RenderStage} stage 所有者である RenderStage\n */\n constructor( stage )\n {\n this._setupViewVectors( stage );\n this._setupClipPlanes( stage );\n\n var viewer = stage._viewer;\n var dem_provider = viewer.dem_provider;\n var tile_texture_cache = viewer.tile_texture_cache;\n\n this._min_image_z = tile_texture_cache.getImageZMin();\n\n var dem_zbias = GeoMath.LOG2PI - dem_provider.getResolutionPower() + 1; // b = log2π - ρ + 1\n this._max_zbias = Math.max( tile_texture_cache.getImageZBias(), dem_zbias );\n\n this._globe = viewer.globe;\n this._rflake_list = [];\n\n // デバッグ統計\n this._debug_stats = viewer.debug_stats;\n if ( this._debug_stats ) {\n this._num_procA_flakes = 0;\n this._num_procB_flakes = 0;\n }\n\n // 事前生成オブジェクト\n this._view_dir_N = GeoMath.createVector3();\n this._view_dir_V = GeoMath.createVector3();\n }\n\n\n /**\n * @private\n */\n _setupViewVectors( stage )\n {\n var view_to_gocs = stage._view_to_gocs;\n var pixel_step = stage._pixel_step;\n\n var view_pos_Q = GeoMath.createVector3();\n var view_dir_wU = GeoMath.createVector3();\n\n // 地表詳細レベル (LOD) 計算用の Q, w*U ベクトルを設定\n view_pos_Q[0] = view_to_gocs[12];\n view_pos_Q[1] = view_to_gocs[13];\n view_pos_Q[2] = view_to_gocs[14];\n\n view_dir_wU[0] = -view_to_gocs[ 8] * pixel_step;\n view_dir_wU[1] = -view_to_gocs[ 9] * pixel_step;\n view_dir_wU[2] = -view_to_gocs[10] * pixel_step;\n\n /**\n * @summary 位置ベクトル Q\n * @member mapray.FlakeCollector#_view_pos_Q\n * @type {mapray.Vector3}\n * @private\n * @see doc/ImageLevelCalculation.txt\n */\n this._view_pos_Q = view_pos_Q;\n\n /**\n * @summary ベクトル w * U\n * @member mapray.FlakeCollector#_view_dir_wU\n * @type {mapray.Vector3}\n * @private\n * @see doc/ImageLevelCalculation.txt\n */\n this._view_dir_wU = view_dir_wU;\n }\n\n\n /**\n * @private\n */\n _setupClipPlanes( stage )\n {\n var view_to_gocs = stage._view_to_gocs;\n var gocs_to_view = stage._gocs_to_view;\n var volume_planes = stage._volume_planes;\n var clip_planes = [];\n\n // 地表遮蔽カリング平面\n var root_flake = stage._viewer._globe.root_flake;\n var rmin = GeoMath.EARTH_RADIUS + root_flake.height_min; // 最小半径\n var rmax = GeoMath.EARTH_RADIUS + root_flake.height_max; // 最大半径\n\n // P (視点位置)\n var px = view_to_gocs[12];\n var py = view_to_gocs[13];\n var pz = view_to_gocs[14];\n\n // q = √[(P.P - rmin^2)(rmax^2 - rmin^2)] - rmin^2\n var p2 = px*px + py*py + pz*pz;\n var rmin2 = rmin*rmin;\n var rmax2 = rmax*rmax;\n var q = Math.sqrt( (p2 - rmin2) * (rmax2 - rmin2) ) - rmin2;\n\n // L = / ‖P‖\n var plane = GeoMath.createVector4();\n var recip = 1 / Math.sqrt( p2 );\n plane[0] = px * recip;\n plane[1] = py * recip;\n plane[2] = pz * recip;\n plane[3] = q * recip;\n clip_planes.push( plane );\n\n // L を基とした遠方距離\n var far_dist = Math.sqrt( p2 + rmax2 + 2*q );\n\n // 視体積平面を取得して、地心直交座標系に変換\n // (直交変換なので x, y, z は正規化されている)\n for ( var i = 0; i < 6; ++i ) {\n var src_plane = volume_planes[i];\n var dst_plane = GeoMath.createVector4();\n\n if ( i == 1 && src_plane[3] > far_dist ) {\n // 遠方平面が必要以上に遠いとき far_dist に置き換える\n src_plane = GeoMath.createVector4( src_plane );\n src_plane[3] = far_dist;\n }\n\n GeoMath.transformPlane_A( gocs_to_view, src_plane, dst_plane );\n\n clip_planes.push( dst_plane );\n }\n\n this._clip_planes = clip_planes;\n }\n\n\n /**\n * @summary 描画地表断片を収集\n * @return {mapray.RenderFlake[]} 収集され描画地表断片の集合\n */\n traverse()\n {\n this._collectFlakes( this._globe.root_flake );\n\n // デバッグ統計\n if ( this._debug_stats ) {\n this._debug_stats.num_procA_flakes = this._num_procA_flakes;\n this._debug_stats.num_procB_flakes = this._num_procB_flakes;\n }\n\n return this._rflake_list;\n }\n\n\n /**\n * @private\n */\n _collectFlakes( flake )\n {\n if ( this._debug_stats !== null ) {\n this._num_procA_flakes += 1;\n }\n\n if ( flake.isInvisible( this._clip_planes ) ) {\n // 地表タイルが見えないので描画しない\n return;\n }\n\n if ( flake.z < this._min_image_z ) {\n // 地表タイルより小さな画像タイルしかない\n this._collectNextLevelFlakes( flake ); // 地表タイルを分割\n return;\n }\n\n if ( this._debug_stats !== null ) {\n this._num_procB_flakes += 1;\n }\n\n // 地表断片の詳細レベルの範囲\n var range = this._getLevelOfDetailRange( flake );\n var zt = range.mid + this._max_zbias; // 最大タイルレベル\n\n if ( range.max - range.min > FlakeCollector.MAX_LOD_INTERVAL || zt > flake.z ) {\n // 地表断片の LOD 幅が閾値より大きい\n // or 最大タイルレベル > 地表断片レベル\n this._collectNextLevelFlakes( flake ); // 地表断片を分割\n return;\n }\n\n // リストに RenderFlake を追加\n this._addRenderFlake( flake, range );\n }\n\n\n /**\n * @private\n */\n _collectNextLevelFlakes( flake )\n {\n for ( var v = 0; v < 2; ++v ) {\n for ( var u = 0; u < 2; ++u ) {\n this._collectFlakes( flake.newChild( u, v ) );\n }\n }\n }\n\n\n /**\n * @summary 地表断片の詳細レベルの範囲を取得\n * @private\n */\n _getLevelOfDetailRange( flake )\n {\n var pi = Math.PI;\n var z = flake.z;\n var x = flake.x;\n var y = flake.y;\n\n // 座標範囲 (単位球メルカトル座標系)\n var msize = Math.pow( 2, 1 - z ) * pi;\n var mx_min = -pi + x * msize;\n var my_min = pi - (y + 1) * msize;\n\n var max_mstep = pi / 32;\n var mcount = Math.ceil( msize / max_mstep );\n var mstep = msize / mcount;\n\n var r = GeoMath.EARTH_RADIUS + flake.base_height;\n var Q = this._view_pos_Q;\n var wU = this._view_dir_wU;\n\n var N = this._view_dir_N;\n var V = this._view_dir_V;\n var dMin = Number.MAX_VALUE;\n var dMax = -Number.MAX_VALUE;\n\n for ( var iy = 0, my = my_min; iy < mcount + 1; ++iy, my += mstep ) {\n var ey = Math.exp( my );\n var ey2 = ey * ey;\n var sinφ = (ey2 - 1) / (ey2 + 1);\n var cosφ = 2 * ey / (ey2 + 1);\n var denom = 1 / (r * cosφ);\n for ( var ix = 0, mx = mx_min; ix < mcount + 1; ++ix, mx += mstep ) {\n var sinλ = Math.sin( mx );\n var cosλ = Math.cos( mx );\n\n // N\n N[0] = cosφ * cosλ;\n N[1] = cosφ * sinλ;\n N[2] = sinφ;\n\n // V = r N - Q\n V[0] = r * N[0] - Q[0];\n V[1] = r * N[1] - Q[1];\n V[2] = r * N[2] - Q[2];\n\n // w U.V\n var wUV = GeoMath.dot3( wU, V );\n if ( wUV <= 0 ) {\n // 頂点が視点の後ろ側\n return { min: -1000, max: 1000, mid: 0 };\n }\n\n // w U.(r N - Q)\n // d = ---------------\n // r Cos[φ]\n var deriv = wUV * denom;\n\n // 最大最小を更新\n dMin = Math.min( dMin, deriv );\n dMax = Math.max( dMax, deriv );\n }\n }\n\n var lodMin = -Math.maprayLog2( dMax ); // Log2[1/dMax]\n var lodMax = -Math.maprayLog2( dMin ); // Log2[1/dMin]\n\n return {\n min: lodMin,\n max: lodMax,\n mid: (lodMin + lodMax) / 2\n };\n }\n\n\n /**\n * @summary 単位球メルカトル座標 x, y の地表詳細レベルを計算\n * @desc\n *

以下の値が設定されていなければならない。

\n *
    \n *
  • this._view_pos_Q
  • \n *
  • this._view_dir_wU
  • \n *
\n * @param {number} x X 座標\n * @param {number} y Y 座標\n * @param {number} r GOGS 原点からの距離 (Meters)\n * @return {number} 地表詳細レベル\n * @private\n */\n _calcLOD( x, y, r )\n {\n var sinλ = Math.sin( x );\n var cosλ = Math.cos( x );\n var ey = Math.exp( y );\n var ey2 = ey * ey;\n var sinφ = (ey2 - 1) / (ey2 + 1);\n var cosφ = 2 * ey / (ey2 + 1);\n\n // N\n var N = this._view_dir_N;\n N[0] = cosφ * cosλ;\n N[1] = cosφ * sinλ;\n N[2] = sinφ;\n\n // V = r N - Q\n var V = this._view_dir_V;\n var Q = this._view_pos_Q;\n V[0] = r * N[0] - Q[0];\n V[1] = r * N[1] - Q[1];\n V[2] = r * N[2] - Q[2];\n\n // w U.V\n var wU = this._view_dir_wU;\n var wUV = GeoMath.dot3( wU, V ); // > 0 (表示される Flake 前提なので正数)\n\n // r Cos[φ]\n // 1/d = ---------------\n // w U.(r N - Q)\n var inv_d = r * cosφ / wUV;\n\n // Log2[1/d]\n return Math.maprayLog2( inv_d );\n }\n\n\n /**\n * @summary 四隅の LOD を設定\n * @desc\n *

rflake に以下のプロパティを設定する。

\n *
    \n *
  • rflake.lod_00
  • \n *
  • rflake.lod_10
  • \n *
  • rflake.lod_01
  • \n *
  • rflake.lod_11
  • \n *
\n * @private\n */\n _setCornerLODs( rflake )\n {\n var pi = Math.PI;\n var flake = rflake.flake;\n var z = flake.z;\n var x = flake.x;\n var y = flake.y;\n\n // 座標範囲 (単位球メルカトル座標系)\n var msize = Math.pow( 2, 1 - z ) * pi;\n var mx_min = -pi + x * msize;\n var mx_max = -pi + (x + 1) * msize;\n var my_min = pi - (y + 1) * msize;\n var my_max = pi - y * msize;\n\n // GOCS 原点からの距離\n var r = GeoMath.EARTH_RADIUS + flake.base_height;\n\n // 四隅の地表詳細レベル\n rflake.lod_00 = this._calcLOD( mx_min, my_min, r );\n rflake.lod_10 = this._calcLOD( mx_max, my_min, r );\n rflake.lod_01 = this._calcLOD( mx_min, my_max, r );\n rflake.lod_11 = this._calcLOD( mx_max, my_max, r );\n }\n\n\n /**\n * @summary 描画地表断片を追加\n * @private\n */\n _addRenderFlake( flake, range )\n {\n var rflake = new RenderFlake( flake );\n\n rflake.lod = range.mid;\n this._setCornerLODs( rflake );\n\n this._rflake_list.push( rflake );\n }\n\n}\n\n\n/**\n * @summary Flake に対する LOD の許容幅\n * @desc\n *

1つの Flake 全体に対する最小 LOD と最大 LOD の間の最大幅である。

\n *

有効な範囲は 0.0 < MAX_LOD_INTERVAL < 1.0 である。

\n * @type {number}\n * @constant\n */\nFlakeCollector.MAX_LOD_INTERVAL = 0.5;\n\n\nexport default FlakeCollector;\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","/**\n * @summary WebGL シェーダラッパー\n * @desc\n * 頂点シェーダとフラグメントシェーダのセットである。\n * @memberof mapray\n * @private\n */\nclass Shader {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {string} vs_code 頂点シェーダのソースコード\n * @param {string} fs_code フラグメントシェーダのソースコード\n * @exception {Error} コンパイルエラー\n */\n constructor( glenv, vs_code, fs_code )\n {\n this._glenv = glenv;\n\n try {\n /**\n * @summary 頂点シェーダオブジェクト\n * @member mapray.Shader#vs_object\n * @type {WebGLShader}\n * @readonly\n */\n this.vs_object = this._compile_shader( 'VERTEX_SHADER', vs_code );\n\n /**\n * @summary フラグメントシェーダオブジェクト\n * @member mapray.Shader#fs_object\n * @type {WebGLShader}\n * @readonly\n */\n this.fs_object = this._compile_shader( 'FRAGMENT_SHADER', fs_code );\n }\n catch ( e ) {\n var gl = glenv.context;\n if ( this.vs_object )\n gl.deleteShader( this.vs_object );\n if ( this.fs_object )\n gl.deleteShader( this.fs_object );\n throw e;\n }\n }\n\n\n /**\n * @summary シェーダを破棄\n */\n dispose()\n {\n var gl = this._glenv.context;\n if ( this.vs_object ) {\n gl.deleteShader( this.vs_object );\n this.vs_object = null;\n }\n if ( this.fs_object ) {\n gl.deleteShader( this.fs_object );\n this.fs_object = null;\n }\n }\n\n\n /**\n * @summary シェーダをコンパイル\n * @param {string} type 'VERTEX_SHADER' or 'FRAGMENT_SHADER'\n * @param {string} source ソースコード文字列\n * @return {WebGLShader} コンパイルされたシェーダオブジェクト\n * @exception {Error} コンパイルエラー\n * @private\n */\n _compile_shader( type, source )\n {\n var gl = this._glenv.context;\n var shader = gl.createShader( gl[type] );\n if ( !shader ) {\n throw new Error( type + \" オブジェクトの生成に失敗しました\" );\n }\n try {\n gl.shaderSource( shader, source );\n gl.compileShader( shader );\n if ( !gl.getShaderParameter( shader, gl.COMPILE_STATUS ) ) {\n // コンパイルエラー\n var log = gl.getShaderInfoLog( shader );\n throw new Error( type + \" のコンパイルに失敗: \" + log );\n }\n }\n catch ( e ) {\n gl.deleteShader( shader );\n throw e;\n }\n return shader;\n }\n\n}\n\n\nexport default Shader;\n","import Shader from \"./Shader\";\n\n\n/**\n * @summary マテリアル\n * @memberof mapray\n * @private\n */\nclass Material {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {string} vs_code 頂点シェーダのソースコード\n * @param {string} fs_code フラグメントシェーダのソースコード\n */\n constructor( glenv, vs_code, fs_code )\n {\n var shader = new Shader( glenv, vs_code, fs_code );\n this._gl = glenv.context;\n this._program = this._link_shaders( shader.vs_object, shader.fs_object );\n this._vertex_attribs = this._create_vertex_attribs();\n this._uniform_location = this._create_uniform_location();\n\n shader.dispose();\n }\n\n\n /**\n * @summary シェーダをリンク\n * @param {WebGLShader} vs 頂点シェーダ\n * @param {WebGLShader} fs フラグメントシェーダ\n * @return {WebGLProgram} リンクされたプログラムオブジェクト\n * @exception {Error} リンクエラー\n * @private\n */\n _link_shaders( vs, fs )\n {\n var gl = this._gl;\n var program = gl.createProgram();\n if ( !program ) {\n throw new Error( \"プログラムオブジェクトの生成に失敗しました\" );\n }\n try {\n gl.attachShader( program, vs );\n gl.attachShader( program, fs );\n gl.linkProgram( program );\n if ( !gl.getProgramParameter( program, gl.LINK_STATUS ) ) {\n // リンクエラー\n var log = gl.getProgramInfoLog( program );\n gl.detachShader( program, fs );\n gl.detachShader( program, vs );\n throw new Error( \"シェーダのリンクに失敗: \" + log );\n }\n }\n catch ( e ) {\n gl.deleteProgram( program );\n throw e;\n }\n return program;\n }\n\n\n /**\n * @summary 頂点属性情報を作成\n *\n * @return {array} 頂点属性名前とロケーションの配列\n * @private\n */\n _create_vertex_attribs()\n {\n var gl = this._gl;\n var program = this._program;\n var attribs = [];\n\n var num_items = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n for ( var i = 0; i < num_items; ++i ) {\n var info = gl.getActiveAttrib( program, i );\n var attrib = { name: info.name,\n location: gl.getAttribLocation( program, info.name ) };\n attribs.push( attrib );\n }\n\n return attribs;\n }\n\n\n /**\n * @summary uniform 変数のロケーション辞書を作成\n *\n * @return {object} ロケーション辞書\n * @private\n */\n _create_uniform_location()\n {\n var gl = this._gl;\n var program = this._program;\n var location = {};\n\n // Uniform 変数のロケーション\n var num_items = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n for ( var i = 0; i < num_items; ++i ) {\n var info = gl.getActiveUniform( program, i );\n location[info.name] = gl.getUniformLocation( program, info.name );\n }\n\n return location;\n }\n\n\n /**\n * @summary リソースを破棄\n */\n dispose()\n {\n var gl = this._gl;\n gl.deleteProgram( this._program );\n this._program = null;\n }\n\n\n /**\n * @summary プログラムを束縛\n */\n bindProgram()\n {\n var gl = this._gl;\n gl.useProgram( this._program );\n }\n\n\n /**\n * @summary 真偽値パラメータを設定\n * @param {string} name 変数名\n * @param {boolean} value 真偽値\n */\n setBoolean( name, value )\n {\n var location = this._uniform_location[name];\n if ( location ) {\n var gl = this._gl;\n gl.uniform1i( location, value ? 1 : 0 );\n }\n }\n\n\n /**\n * @summary 整数パラメータを設定\n * @param {string} name 変数名\n * @param {number} value 整数値\n */\n setInteger( name, value )\n {\n var location = this._uniform_location[name];\n if ( location ) {\n var gl = this._gl;\n gl.uniform1i( location, value );\n }\n }\n\n\n /**\n * @summary float パラメータを設定\n * @param {string} name 変数名\n * @param {number} value float 値\n */\n setFloat( name, value )\n {\n var location = this._uniform_location[name];\n if ( location ) {\n var gl = this._gl;\n gl.uniform1f( location, value );\n }\n }\n\n\n /**\n * @summary 2次ベクトルパラメータを設定\n * @param {string} name 変数名\n * @param {mapray.Vector2} value 2次ベクトル\n */\n setVector2( name, value )\n {\n var location = this._uniform_location[name];\n if ( location ) {\n var gl = this._gl;\n gl.uniform2fv( location, value );\n }\n }\n\n\n /**\n * @summary 3次ベクトルパラメータを設定\n * @param {string} name 変数名\n * @param {mapray.Vector3} value 3次ベクトル\n */\n setVector3( name, value )\n {\n var location = this._uniform_location[name];\n if ( location ) {\n var gl = this._gl;\n gl.uniform3fv( location, value );\n }\n }\n\n\n /**\n * @summary 4次ベクトルパラメータを設定\n * @param {string} name 変数名\n * @param {mapray.Vector4} value 4次ベクトル\n */\n setVector4( name, value )\n {\n var location = this._uniform_location[name];\n if ( location ) {\n var gl = this._gl;\n gl.uniform4fv( location, value );\n }\n }\n\n\n /**\n * @summary 行列パラメータを設定\n * @param {string} name 変数名\n * @param {mapray.Matrix} value 行列\n */\n setMatrix( name, value )\n {\n var location = this._uniform_location[name];\n if ( location ) {\n var gl = this._gl;\n gl.uniformMatrix4fv( location, false, value );\n }\n }\n\n\n /**\n * @summary 頂点属性データを束縛\n *\n * @desc\n *

mesh_attribs は頂点属性名から Mesh.AttribData インスタンスを取得する辞書である。

\n *\n * @param {object} mesh_attribs メッシュ側の頂点属性データの辞書\n */\n bindVertexAttribs( mesh_attribs )\n {\n var gl = this._gl;\n var mtl_attribs = this._vertex_attribs; // マテリアル側の頂点属性データ配列\n var num_attribs = mtl_attribs.length;\n\n for ( var i = 0; i < num_attribs; ++i ) {\n var mtl_attrib = mtl_attribs[i];\n var mesh_attrib = mesh_attribs[mtl_attrib.name];\n var location = mtl_attrib.location;\n\n if ( mesh_attrib !== undefined ) {\n // 頂点属性データを束縛\n gl.bindBuffer( gl.ARRAY_BUFFER, mesh_attrib.buffer );\n gl.enableVertexAttribArray( location );\n gl.vertexAttribPointer( location,\n mesh_attrib.num_components,\n mesh_attrib.component_type,\n mesh_attrib.normalized,\n mesh_attrib.byte_stride,\n mesh_attrib.byte_offset );\n }\n else {\n // メッシュ側に必要な頂点属性がないとき\n gl.disableVertexAttribArray( location );\n }\n }\n }\n\n\n /**\n * @summary テクスチャをバインド\n * @desc\n *

注意: 現行テクスチャ (Active Texture) も変更される。

\n * @param {number} unit テクスチャユニット番号\n * @param {WebGLTexture} texture テクスチャオブジェクト\n */\n bindTexture2D( unit, texture )\n {\n var gl = this._gl;\n gl.activeTexture( gl.TEXTURE0 + unit );\n gl.bindTexture( gl.TEXTURE_2D, texture );\n }\n\n}\n\n\nexport default Material;\n","import Material from \"./Material\";\nimport GeoMath from \"./GeoMath\";\n\n\n/**\n * @summary 地表断片マテリアル\n * @memberof mapray.RenderStage\n * @extends mapray.Material\n * @private\n */\nclass FlakeMaterial extends Material {\n\n /**\n * @param {mapray.Viewer} viewer 所有者である Viewer\n * @param {string} vs_code 頂点シェーダのソースコード\n * @param {string} fs_code フラグメントシェーダのソースコード\n */\n constructor( viewer, vs_code, fs_code )\n {\n super( viewer.glenv, vs_code, fs_code );\n\n // シェーダ用の事前生成オブジェクト\n this._flake_to_clip = GeoMath.createMatrixf();\n }\n\n\n /**\n * @summary 描画回数\n * @return {number}\n * @abstract\n */\n numDrawings()\n {\n return 1;\n }\n\n\n /**\n * @summary ワイヤーフレーム表示か?\n * @return {boolean}\n * @abstract\n */\n isWireframe()\n {\n return false;\n }\n\n\n /**\n * @summary 地表断片のパラメータを設定\n *\n * @param {mapray.RenderStage} stage 呼び出し側オブジェクト\n * @param {mapray.RenderFlake} rflake 描画地表断片\n * @param {mapray.FlakeMesh} mesh 地表断片メッシュ\n * @param {number} index 描画インデックス\n * @return {boolean} 描画の有無\n *\n * @abstract\n */\n setFlakeParameter( stage, rflake, mesh, index )\n {\n return false;\n }\n\n\n /**\n * @summary 地表断片の共通パラメータを設定\n *\n * @param {mapray.RenderStage} stage 呼び出し側オブジェクト\n * @param {mapray.FlakeMesh} mesh 地表断片メッシュ\n * @protected\n */\n setCommonParameter( stage, mesh )\n {\n mesh.mul_flake_to_gocs( stage._gocs_to_clip, this._flake_to_clip );\n this.setMatrix( \"u_obj_to_clip\", this._flake_to_clip );\n }\n\n}\n\n\nexport default FlakeMaterial;\n","/**\n * @summary 地図画像プロバイダ\n * @classdesc\n *

レンダラーに地図画像を与えるための抽象クラスである。

\n *\n *

このインスタンスには状態 ( {@link mapray.ImageProvider.Status} 型) があり、{@link mapray.ImageProvider#status|status()}\n * メソッドにより状態を確認することができる。

\n *\n *

初期状態は READY または NOT_READY でなければならず、状態の変化は NOT_READY から READY または NOT_READY から FAILED しか存在しない。

\n *

READY 以外の状態では {@link mapray.ImageProvider#status|status()} を除くメソッドを呼び出すことはできない。

\n *\n *

初期状態が NOT_READY になる可能性があるプロバイダは、{@link mapray.ImageProvider#status|status()} メソッドをオーバーライドする必要がある。

\n *\n *

以下の抽象メソッドは既定の動作がないので、利用者はこれらのメソッドをオーバーライドした具象クラスを使用しなければならない。

\n *
    \n *
  • {@link mapray.ImageProvider#requestTile|requestTile()}
  • \n *
  • {@link mapray.ImageProvider#cancelRequest|cancelRequest()}
  • \n *
  • {@link mapray.ImageProvider#getImageSize|getImageSize()}
  • \n *
  • {@link mapray.ImageProvider#getZoomLevelRange|getZoomLevelRange()}
  • \n *
\n *\n * @memberof mapray\n * @abstract\n * @protected\n * @see mapray.StandardImageProvider\n * @see mapray.Viewer\n */\nclass ImageProvider {\n\n /**\n * @summary 状態の取得\n * @desc\n *

現在の ImageProvider 状態を返す。

\n *

callback を与えたとき、状態が NOT_READY から READY または FAILED に変化したときに callback が呼び出される。\n * NOT_READY 以外の状態で callback 与えても、それは無視されコールバック関数は登録されない。

\n *\n * @param {mapray.ImageProvider.StatusCallback} [callback] 状態変化コールバック関数\n * @return {mapray.ImageProvider.Status} 現在の ImageProvider 状態\n * @abstract\n */\n status( callback )\n {\n return Status.READY;\n }\n\n\n /**\n * @summary 地図タイル画像を要求\n * @desc\n *

座標が (z, x, y) の地図タイル画像を要求する。

\n *

指定したタイル画像の取得が成功または失敗したときに callback が非同期に呼び出されなければならない。

\n *

だたし [cancelRequest()]{@link mapray.ImageProvider#cancelRequest} により要求が取り消されたとき、callback は呼び出しても呼び出さなくてもよい。また非同期呼び出しである必要もない。

\n * @param {number} z ズームレベル\n * @param {number} x X タイル座標\n * @param {number} y Y タイル座標\n * @param {mapray.ImageProvider.RequestCallback} callback 要求コールバック関数\n * @return {object} 要求 ID ([cancelRequest()]{@link mapray.ImageProvider#cancelRequest} に与えるオブジェクト)\n * @abstract\n */\n requestTile( z, x, y, callback )\n {\n throw new Error( \"mapray.ImageProvider#requestTile() method has not been overridden.\" );\n }\n\n\n /**\n * @summary 地図タイル画像の要求を取り消す\n *

[requestTile()]{@link mapray.ImageProvider#requestTile} による要求を可能であれば取り消す。

\n * @param {object} id 要求 ID ([requestTile()]{@link mapray.ImageProvider#requestTile} から得たオブジェクト)\n * @abstract\n */\n cancelRequest( id )\n {\n throw new Error( \"mapray.ImageProvider#cancelRequest() method has not been overridden.\" );\n }\n\n\n /**\n * @summary 地図タイル画像の寸法を取得\n * @desc\n *

サーバーが提供する地図タイル画像の寸法をする。

\n *

地図タイル画像は正方形を前提とし、水平方向の画素数を返す。

\n *

制限: this が同じなら常に同じ値を返さなければならない。

\n * @return {number} 地図タイル画像の画素数\n * @abstract\n */\n getImageSize()\n {\n throw new Error( \"mapray.ImageProvider#getImageSize() method has not been overridden.\" );\n }\n\n\n /**\n * @summary 地図画像ズームレベルの範囲を取得\n * @desc\n *

サーバーが提供する地図タイル画像のズームレベルの範囲を取得する。

\n *

制限: this が同じなら常に同じ範囲を返さなければならない。

\n * @return {mapray.ImageProvider.Range} ズームレベルの範囲\n * @abstract\n */\n getZoomLevelRange()\n {\n throw new Error( \"mapray.ImageProvider#getZoomLevelRange() method has not been overridden.\" );\n }\n\n}\n\n\n/**\n * @summary 地図画像ズームレベル範囲\n * @memberof mapray.ImageProvider\n * @see mapray.ImageProvider#getZoomLevelRange\n */\nclass Range {\n\n /**\n * @param {number} min 最小ズームレベル (0 または 0 より大きい整数)\n * @param {number} max 最大ズームレベル (min または min より大きい整数)\n */\n constructor( min, max )\n {\n this._min = min;\n this._max = max;\n }\n\n\n /**\n * @summary 最小ズームレベル\n * @type {number}\n * @readonly\n */\n get min() { return this._min; }\n\n\n /**\n * @summary 最大ズームレベル\n * @type {number}\n * @readonly\n */\n get max() { return this._max; }\n\n}\n\nImageProvider.Range = Range;\n\n\n/**\n * @summary 地図タイル画像要求コールバック関数型\n * @desc\n *

地図タイル画像の取得に成功または失敗したときに呼び出される関数の型である。

\n *

この関数は [requestTile()]{@link mapray.ImageProvider#requestTile} の callback 引数に与える。

\n *

画像の取得に成功したときは、image に Image のインスタンス、失敗したときは null を与える。

\n *

ただし [cancelRequest()]{@link mapray.ImageProvider#cancelRequest} により要求が取り消されたとき、コールバック関数の呼び出しは無視されるので image は任意の値でよい。

\n * @param {Image} image 地図タイル画像または null\n * @callback RequestCallback\n * @memberof mapray.ImageProvider\n */\n\n\n/**\n * @summary ImageProvider 状態の列挙型\n * @enum {object}\n * @memberof mapray.ImageProvider\n * @constant\n * @see mapray.ImageProvider#status\n */\nvar Status = {\n\n /**\n * 準備中\n */\n NOT_READY: { id: \"NOT_READY\" },\n\n /**\n * 準備完了\n */\n READY: { id: \"READY\" },\n\n /**\n * 失敗状態\n */\n FAILED: { id: \"FAILED\" }\n\n};\n\nImageProvider.Status = Status;\n\n\n/**\n * @summary 状態変化コールバック関数型\n *\n * @param {mapray.ImageProvider.Status} status READY または FAILED (NOT_READEY から遷移した状態)\n * @callback StatusCallback\n * @memberof mapray.ImageProvider\n */\n\n\nexport default ImageProvider;\n","import ImageProvider from \"./ImageProvider\";\n\n\n/**\n * @summary ダミー画像プロバイダ\n *\n * 状態は常に READY、レベル 0 のみの巨大画像、ただし画像は永遠に返さない。\n *\n * @memberof mapray\n * @extends mapray.ImageProvider\n * @private\n */\nclass EmptyImageProvider extends ImageProvider {\n\n /**\n */\n constructor()\n {\n super();\n }\n\n\n /**\n * @override\n */\n requestTile( z, x, y, callback )\n {\n return this;\n }\n\n\n /**\n * @override\n */\n cancelRequest( id )\n {\n }\n\n\n /**\n * @override\n */\n getImageSize()\n {\n return 4096;\n }\n\n\n /**\n * @override\n */\n getZoomLevelRange()\n {\n return new ImageProvider.Range( 0, 0 );\n }\n\n}\n\n\nexport default EmptyImageProvider;\n","/**\n * @summary タイルテクスチャ\n * @memberof mapray\n * @private\n * @see mapray.TileTextureCache\n */\nclass TileTexture {\n\n /**\n * @param {number} z 地図ズームレベル\n * @param {number} x X タイル座標\n * @param {number} y Y タイル座標\n * @param {WebGLTexture} texture テクスチャオブジェクト\n */\n constructor( z, x, y, texture )\n {\n /**\n * @summary 地図ズームレベル\n * @member mapray.TileTexture#z\n * @type {number}\n */\n this.z = z;\n\n /**\n * @summary X タイル座標\n * @member mapray.TileTexture#x\n * @type {number}\n */\n this.x = x;\n\n /**\n * @summary Y タイル座標\n * @member mapray.TileTexture#y\n * @type {number}\n */\n this.y = y;\n\n /**\n * @summary テクスチャオブジェクト\n * @member mapray.TileTexture#texture\n * @type {WebGLTexture}\n */\n this.texture = texture;\n }\n\n\n /**\n * @summary リソースを破棄\n * @param {WebGLRenderingContext} gl WebGL レンダリングコンテキスト\n */\n dispose( gl )\n {\n gl.deleteTexture( this.texture );\n this.texture = null;\n }\n\n}\n\n\nexport default TileTexture;\n","import ImageProvider from \"./ImageProvider\";\nimport EmptyImageProvider from \"./EmptyImageProvider\";\nimport TileTexture from \"./TileTexture\";\nimport GeoMath from \"./GeoMath\";\n\n\n/**\n * @summary タイルテクスチャの管理\n * @memberof mapray\n * @private\n * @see mapray.TileTexture\n */\nclass TileTextureCache {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {mapray.ImageProvider} provider 地図画像プロバイダ\n */\n constructor( glenv, provider )\n {\n this._glenv = glenv;\n this._provider = null;\n this._min_image_z = 0;\n this._max_image_z = 0;\n this._image_zbias = 0;\n\n var status_callback = ( status ) => {\n if ( status === ImageProvider.Status.READY ) {\n // EmptyImageProvider から本来の provider に切り替える\n this._flush();\n this._resetImageProvider( provider );\n }\n else if ( status === ImageProvider.Status.FAILED ) {\n // provider が READY 状態にならなかった\n console.error( \"ImageProvider.Status.FAILED in TileTextureCache\" );\n }\n };\n\n this._resetImageProvider( (provider.status( status_callback ) === ImageProvider.Status.READY) ? provider : new EmptyImageProvider() );\n\n // キャッシュを初期化\n this._croot = new CacheNode();\n\n // キャッシュ制御変数\n this._max_accesses = 0; // 最近のフレームの最大アクセスノード数\n this._frame_counter = 0; // 現行フレーム番号\n\n this._lower_bound = 1.0; // >= 1.0\n this._upper_bound = 1.2; // >= lower_bound\n\n // リクエスト制御変数\n this._num_requesteds = 0; // 現在の REQUESTED 状態のノード数\n this._max_requesteds = 75; // 最大 REQUESTED ノード数\n this._new_requesteds = []; // 新規リクエストのリスト\n\n // WebGL 関連\n var gl = glenv.context;\n\n var aniso_ext = glenv.EXT_texture_filter_anisotropic;\n if ( aniso_ext ) {\n this._aniso_ext = aniso_ext;\n this._max_aniso = gl.getParameter( aniso_ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n }\n this._use_mipmap = false;\n }\n\n\n /**\n * 画像プロバイダを再設定\n *\n * _provider\n * _min_image_z\n * _max_image_z\n * _image_zbias\n *\n * @private\n */\n _resetImageProvider( provider )\n {\n this._provider = provider;\n\n var renge = provider.getZoomLevelRange();\n this._min_image_z = renge.min;\n this._max_image_z = renge.max;\n\n this._image_zbias = Math.maprayLog2( 2 * Math.PI / provider.getImageSize() );\n }\n\n\n /**\n * すべてのリクエストを取り消す\n */\n cancel()\n {\n this._flush();\n }\n\n\n /**\n * キャッシュをフラッシュ\n * @private\n */\n _flush()\n {\n new NodeCanceller( this, this._croot ); // リクエストを取り消す\n this._croot = new CacheNode(); // 取り消したノードは使えないので、単純にすべて捨てる\n this._max_accesses = 0;\n // assert: this._num_requesteds == 0\n }\n\n\n /**\n * LOD からテクスチャの Z レベルを計算するバイアス値を取得\n *\n * @return {number} Log2[2Pi / size]\n */\n getImageZBias()\n {\n return this._image_zbias;\n }\n\n\n /**\n * @return {number} タイルの Z レベルの最小値\n */\n getImageZMin()\n {\n return this._min_image_z;\n }\n\n\n /**\n * @summary リクエスト待ちのタイルの個数を取得\n *\n * @return {number} リクエスト待ちのタイルの個数\n */\n getNumWaitingRequests()\n {\n return this._num_requesteds;\n }\n\n\n /**\n * @summary 先祖タイルテクスチャを検索\n * @desc\n *

[x, y, z] タイルの祖先の中で、現在キャッシュに存在する最大レベルのタイルテクスチャを検索し、hi に設定する。

\n *\n *

ただし検索されるタイルのズームレベルが Z とすると、Z <= max( zlimit, this._min_image_z )\n * という条件から検索し、存在しなければ null となる。

\n *\n *

hi より低いレベルにタイルが存在すれば、それを lo に設定し、存在しなければ lo に hi と同じタイルを設定する

\n *\n *

プロバイダにもっと相応しいテクスチャが存在する可能性があれば、そのテクスチャを要求する。

\n *\n *

前提: z >= this._min_image_z && z >= zlimit

\n *\n * @param {number} z 地図ズームレベル\n * @param {number} x X タイル座標\n * @param {number} y Y タイル座標\n * @param {number} zlimit 先祖レベルの上限\n * @return {mapray.TileTexture[]} 先祖タイルテクスチャ配列 [hi, lo]\n */\n findNearestAncestors( z, x, y, zlimit )\n {\n var depth = 0;\n var d_min = this._min_image_z;\n\n var pow = Math.pow( 2, 1 - z );\n var xf = (x + 0.5) * pow;\n var yf = (y + 0.5) * pow;\n var node = this._croot;\n\n var u;\n var v;\n var index;\n var children;\n var child;\n\n // 最小レベルのノード ---> node, depth\n for ( ; depth < d_min; ++depth ) {\n u = Math.floor( xf ) % 2;\n v = Math.floor( yf ) % 2;\n index = u + 2*v;\n\n children = node.children;\n child = children[index];\n if ( child === null ) {\n child = new CacheNode();\n children[index] = child;\n }\n\n xf *= 2;\n yf *= 2;\n node = child;\n }\n\n var d_max = this._max_image_z;\n var d_lo = GeoMath.clamp( zlimit - 1, d_min, d_max );\n var d_hi = GeoMath.clamp( zlimit, d_min, d_max );\n var tex_lo = null;\n var tex_hi = null;\n\n if ( d_lo < d_hi ) {\n /* assert: (d_min < d_max) && (d_min < zlimit <= d_max) */\n\n for ( ; depth <= d_lo; ++depth ) {\n if ( node.state === NodeState.LOADED ) {\n // 候補テクスチャを更新\n tex_lo = node;\n }\n else if ( node.state === NodeState.NONE ) {\n // 新規リクエスト\n node.state = NodeState.REQUESTED;\n node.req_power = zlimit - depth;\n this._new_requesteds.push( [node, depth, Math.floor( 0.5 * xf ), Math.floor( 0.5 * yf )] );\n }\n else if ( node.state === NodeState.REQUESTED ) {\n // 要求度を更新\n node.updateRequestPower( zlimit - depth );\n }\n\n u = Math.floor( xf ) % 2;\n v = Math.floor( yf ) % 2;\n index = u + 2*v;\n\n children = node.children;\n child = children[index];\n if ( child === null ) {\n child = new CacheNode();\n children[index] = child;\n }\n\n xf *= 2;\n yf *= 2;\n node = child;\n }\n\n tex_hi = tex_lo;\n\n if ( node.state === NodeState.LOADED ) {\n // 候補テクスチャを更新\n tex_hi = node;\n }\n else if ( node.state === NodeState.NONE ) {\n // 新規リクエスト\n node.state = NodeState.REQUESTED;\n node.req_power = zlimit - depth;\n this._new_requesteds.push( [node, depth, Math.floor( 0.5 * xf ), Math.floor( 0.5 * yf )] );\n }\n else if ( node.state === NodeState.REQUESTED ) {\n // 要求度を更新\n node.updateRequestPower( zlimit - depth );\n }\n }\n else { // if d_lo == d_hi\n /* assert: (d_min == d_max) || (zlimit <= d_min) || (zlimit > d_max) */\n\n for ( ;; ++depth ) {\n if ( node.state === NodeState.LOADED ) {\n // 候補テクスチャを更新\n tex_lo = node;\n }\n else if ( node.state === NodeState.NONE ) {\n // 新規リクエスト\n node.state = NodeState.REQUESTED;\n node.req_power = zlimit - depth;\n this._new_requesteds.push( [node, depth, Math.floor( 0.5 * xf ), Math.floor( 0.5 * yf )] );\n }\n else if ( node.state === NodeState.REQUESTED ) {\n // 要求度を更新\n node.updateRequestPower( zlimit - depth );\n }\n\n if ( depth == d_lo ) {\n tex_hi = tex_lo;\n break;\n }\n\n u = Math.floor( xf ) % 2;\n v = Math.floor( yf ) % 2;\n index = u + 2*v;\n\n children = node.children;\n child = children[index];\n if ( child === null ) {\n child = new CacheNode();\n children[index] = child;\n }\n\n xf *= 2;\n yf *= 2;\n node = child;\n }\n\n // assert: tex_hi === tex_lo\n }\n\n node.touch();\n\n var result = TileTextureCache._findNearestAncestors_result;\n result[0] = (tex_hi !== null) ? tex_hi.data : null;\n result[1] = (tex_lo !== null) ? tex_lo.data : null;\n return result;\n }\n\n\n /**\n * @summary フレームの最後の処理\n */\n endFrame()\n {\n this._performNewRequests();\n\n var counter = new NodeCounter( this._croot, this._frame_counter );\n this._max_accesses = Math.max( counter.num_accesses, this._max_accesses );\n\n if ( counter.num_loadeds > this._upper_bound * this._max_accesses ) {\n var num_nodes = Math.floor( this._lower_bound * this._max_accesses );\n this._reduceCache( num_nodes );\n }\n\n ++this._frame_counter;\n }\n\n\n /**\n * @summary 新規リクエストを実行\n * @private\n */\n _performNewRequests()\n {\n // リクエスト数\n var num_requests = Math.min( this._max_requesteds - this._num_requesteds, this._new_requesteds.length );\n\n // 基準に基づき、新規リクエストを前半 (num_requests 個) と後半に分割\n this._new_requesteds.sort( function( a, b ) {\n var anode = a[0];\n var bnode = b[0];\n return bnode.req_power - anode.req_power;\n } );\n\n // リクエストを実行\n var self = this;\n this._new_requesteds.slice( 0, num_requests ).forEach( function( req ) {\n var node = req[0];\n var z = req[1];\n var x = req[2];\n var y = req[3];\n self._requestTileTexture( z, x, y, node );\n } );\n\n // リクエストしなかったノードを空に戻す\n this._new_requesteds.slice( num_requests ).forEach( function( req ) {\n var node = req[0];\n node.state = NodeState.NONE;\n // assert: node.data === null\n } );\n\n // 新規リクエストのリストをクリア\n this._new_requesteds.length = 0;\n }\n\n\n /**\n * @summary タイルテクスチャを要求\n * @param {number} z 地図ズームレベル\n * @param {number} x X タイル座標\n * @param {number} y Y タイル座標\n * @param {mapray.TileTextureCache.CacheNode} node 対象ノード\n * @private\n */\n _requestTileTexture( z, x, y, node )\n {\n node.data = this._provider.requestTile( z, x, y, image => {\n\n if ( node.state !== NodeState.REQUESTED ) {\n // キャンセルされているので無視\n return;\n }\n\n if ( image ) {\n node.data = new TileTexture( z, x, y, this._createTexture( image ) );\n node.state = NodeState.LOADED;\n }\n else {\n node.data = null;\n node.state = NodeState.FAILED;\n }\n --this._num_requesteds;\n\n } );\n\n ++this._num_requesteds;\n }\n\n\n /**\n * @summary テクスチャを生成\n * @desc\n *

GL ステートの変更

\n *
    \n *
  • TEXTURE_2D_BINDING: null
  • \n *
  • UNPACK_FLIP_Y_WEBGL: false
  • \n *
\n * @param {Image} image 元画像\n * @return {WebGLTexture} 生成されたテクスチャ\n * @private\n */\n _createTexture( image )\n {\n var gl = this._glenv.context;\n var aniso_ext = this._aniso_ext;\n\n var target = gl.TEXTURE_2D;\n var texture = gl.createTexture();\n\n gl.bindTexture( target, texture );\n\n gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, true );\n gl.texImage2D( target, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image );\n gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, false );\n\n if ( this._use_mipmap ) {\n gl.generateMipmap( target );\n }\n\n gl.texParameteri( target, gl.TEXTURE_MAG_FILTER, gl.LINEAR );\n gl.texParameteri( target, gl.TEXTURE_MIN_FILTER, this._use_mipmap ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR );\n gl.texParameteri( target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n gl.texParameteri( target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\n if ( aniso_ext ) {\n gl.texParameterf( gl.TEXTURE_2D, aniso_ext.TEXTURE_MAX_ANISOTROPY_EXT, this._max_aniso );\n }\n\n gl.bindTexture( target, null );\n\n return texture;\n }\n\n\n /**\n * @summary キャッシュを削減\n * @param {number} num_cnodes 目標ノード数\n * @private\n */\n _reduceCache( num_nodes )\n {\n var collector = new NodeCollector( this._croot );\n\n // 基準に基づき、ノードを前半 (num_cnodes 個) と後半に分割\n collector.nodes.sort( function( a, b ) {\n var aframe = b.aframe - a.aframe;\n if ( aframe == 0 ) {\n if ( (a.state === NodeState.LOADED) && (b.state === NodeState.LOADED) ) {\n return a.data.z - b.data.z;\n }\n }\n return aframe;\n } );\n\n\n // 後半のノードを削除\n var gl = this._glenv.context;\n collector.nodes.slice( num_nodes ).forEach( function( node ) {\n if ( node.state === NodeState.LOADED ) {\n node.data.dispose( gl );\n }\n node.state = NodeState.NONE;\n node.data = null;\n } );\n\n // NodeState.NONE の葉ノードを消去\n collector.clean();\n }\n\n}\n\n\n// クラス定数を定義\nTileTextureCache._findNearestAncestors_result = new Array( 2 );\n\n\n/**\n * @summary キャッシュノード\n *\n * @memberof mapray.TileTextureCache\n * @private\n */\nclass CacheNode {\n\n constructor()\n {\n this.children = [null, null, null, null];\n this.state = NodeState.NONE;\n this.data = null; // TileTexture オブジェクト、または取り消しオブジェクト\n this.req_power = -1; // 要求度\n this.aframe = -1; // 最終アクセスフレーム\n }\n\n /**\n * 要求度を更新\n */\n updateRequestPower( req_power )\n {\n if ( req_power > this.req_power ) {\n this.req_power = req_power;\n }\n }\n\n /**\n * このタイルにアクセスしたことにする\n */\n touch()\n {\n this.aframe = true;\n }\n\n}\n\n\n/**\n * @summary ノード数の計上\n *\n * this.num_loadeds: ロードされているタイル数\n * this.num_accesses: ロードされているタイルのうち、アクセスされたタイル数\n *\n * アクセスがあったノードに対して aframe を更新する。\n *\n * @memberof mapray.TileTextureCache\n * @private\n */\nclass NodeCounter {\n\n /**\n * @param {mapray.TileTextureCache.CacheNode} root 最上位ノード\n * @param {number} frame 現在のフレーム\n */\n constructor( root, frame )\n {\n this.num_loadeds = 0;\n this.num_accesses = 0;\n this._frame = frame;\n this._traverse( root );\n }\n\n /**\n * @private\n */\n _traverse( node )\n {\n var children = node.children;\n var isAccessed = (node.aframe === true);\n\n for ( var i = 0; i < 4; ++i ) {\n var child = children[i];\n if ( child !== null ) {\n isAccessed = this._traverse( child ) || isAccessed;\n }\n }\n\n if ( node.state === NodeState.LOADED ) {\n ++this.num_loadeds;\n if ( isAccessed ) {\n ++this.num_accesses;\n }\n }\n\n if ( isAccessed ) {\n // アクセスフレームを更新\n node.aframe = this._frame;\n }\n\n return isAccessed;\n }\n\n}\n\n\n/**\n * @summary ノード収集\n * @desc\n *

NodeState.LOADED または NodeState.FAILED のノードを this.nodes に収集する。

\n *\n * @memberof mapray.TileTextureCache\n * @private\n */\nclass NodeCollector {\n\n /**\n * @param {mapray.TileTextureCache.CacheNode} root 最上位ノード\n */\n constructor( root )\n {\n this._root = root;\n this.nodes = [];\n this._traverse( root );\n }\n\n /**\n * @private\n */\n _traverse( node )\n {\n var state = node.state;\n if ( state === NodeState.LOADED || state === NodeState.FAILED ) {\n // LOADED または FAILED なら追加\n this.nodes.push( node );\n }\n\n var children = node.children;\n for ( var i = 0; i < 4; ++i ) {\n var child = children[i];\n if ( child !== null ) {\n this._traverse( child );\n }\n }\n }\n\n /**\n * @summary NodeState.NONE の葉ノードを消去\n */\n clean()\n {\n this._clean_recur( this._root );\n }\n\n /**\n * @return 自己と子孫がすべて NodeState.NONE のとき true, それいがいのとき false\n * @private\n */\n _clean_recur( node )\n {\n var isNodeNone = (node.state === NodeState.NONE);\n\n var children = node.children;\n for ( var i = 0; i < 4; ++i ) {\n var child = children[i];\n if ( child !== null ) {\n var isChildNone = this._clean_recur( child );\n if ( isChildNone === true ) {\n children[i] = null;\n }\n isNodeNone = isChildNone && isNodeNone;\n }\n }\n\n return isNodeNone;\n }\n\n}\n\n\n/**\n * @summary すべてのリクエストを取り消す\n * @memberof mapray.TileTextureCache\n * @private\n */\nclass NodeCanceller {\n\n /**\n * @param {mapray.TileTextureCache} owner 最上位ノード\n * @param {mapray.TileTextureCache.CacheNode} root 最上位ノード\n */\n constructor( owner, root )\n {\n this._owner = owner;\n this._traverse( root );\n }\n\n /**\n * @private\n */\n _traverse( node )\n {\n var children = node.children;\n for ( var i = 0; i < 4; ++i ) {\n var child = children[i];\n if ( child !== null ) {\n this._traverse( child );\n }\n }\n if ( node.state === NodeState.REQUESTED ) {\n var owner = this._owner;\n node.state = NodeState.NONE;\n owner._provider.cancelRequest( node.data );\n --owner._num_requesteds;\n }\n }\n\n}\n\n\n/**\n * @summary ノード状態の列挙型\n * @enum {object}\n * @memberof mapray.TileTextureCache\n * @constant\n */\nvar NodeState = {\n /**\n * タイルが存在しない\n */\n NONE: { id: \"NONE\" },\n\n /**\n * タイルが存在する\n */\n LOADED: { id: \"LOADED\" },\n\n /**\n * タイルをリクエスト中\n */\n REQUESTED: { id: \"REQUESTED\" },\n\n /**\n * タイルのリクエストに失敗\n */\n FAILED: { id: \"FAILED\" }\n};\n\n\nexport default TileTextureCache;\n","import FlakeMaterial from \"./FlakeMaterial\";\nimport wireframe_vs_code from \"./shader/wireframe.vert\";\nimport wireframe_fs_code from \"./shader/wireframe.frag\";\n\n\n/**\n * @summary 地表ワイヤーフレームマテリアル\n * @memberof mapray.RenderStage\n * @extends mapray.RenderStage.FlakeMaterial\n * @private\n */\nclass WireframeMaterial extends FlakeMaterial {\n\n /**\n * @param {mapray.Viewer} viewer 所有者 Viewer\n */\n constructor( viewer )\n {\n super( viewer, wireframe_vs_code, wireframe_fs_code );\n }\n\n\n /**\n * @override\n */\n isWireframe()\n {\n return true;\n }\n\n\n /**\n * @override\n */\n setFlakeParameter( stage, rflake, mesh, index )\n {\n this.setCommonParameter( stage, mesh );\n\n return true;\n }\n\n}\n\n\nexport default WireframeMaterial;\n","import ImageProvider from \"./ImageProvider\";\nimport TileTextureCache from \"./TileTextureCache\";\nimport SurfaceMaterial from \"./SurfaceMaterial\";\nimport WireframeMaterial from \"./WireframeMaterial\";\n\n\n/**\n * @summary 地図レイヤー\n * @classdesc\n *

地図レイヤーを表現するオブジェクトである。

\n *\n * @hideconstructor\n * @memberof mapray\n * @see mapray.LayerCollection\n */\nclass Layer {\n\n /**\n * @param {mapray.LayerCollection} owner 地図レイヤー管理\n * @param {object|mapray.ImageProvider} init 初期化プロパティ\n * @param {mapray.ImageProvider} init.image_provider 画像プロバイダ\n * @param {boolean} [init.visibility] 可視性フラグ\n * @param {number} [init.opacity] 不透明度\n * @param {Layer.LayerType} [init.type] レイヤータイプ\n */\n constructor( owner, init )\n {\n this._owner = owner;\n this._glenv = owner.glenv;\n this._viewer = owner.viewer;\n\n var props = (init instanceof ImageProvider) ? { image_provider: init } : init;\n this._image_provider = props.image_provider;\n this._visibility = props.visibility || true;\n this._opacity = props.opacity || 1.0;\n this._type = props.type === Layer.LayerType.NIGHT ? Layer.LayerType.NIGHT : Layer.LayerType.NORMAL;\n this._material = null;\n\n this._tile_cache = new TileTextureCache( this._glenv, this._image_provider );\n\n const render_cache = this._viewer._render_cache || (this._viewer._render_cache = {});\n if ( this._type === Layer.LayerType.NIGHT ) {\n if ( !render_cache.surface_night_material ) {\n render_cache.surface_night_material = new SurfaceMaterial( this._viewer, { nightMaterial: true } );\n }\n this._material = render_cache.surface_night_material;\n } else {\n if ( !render_cache.surface_material ) {\n render_cache.surface_material = new SurfaceMaterial( this._viewer );\n render_cache.wireframe_material = new WireframeMaterial( this._viewer );\n }\n this._material = render_cache.surface_material;\n }\n\n // プロバイダの状態が変化したら描画レイヤーを更新\n this._image_provider.status( (status) => { owner.dirtyDrawingLayers(); } );\n }\n\n\n /**\n * @summary 画像プロバイダを取得\n * @type {mapray.ImageProvider}\n * @readonly\n */\n get image_provider() { return this._image_provider; }\n\n\n /**\n * @summary 可視性フラグを取得\n * @type {boolean}\n * @readonly\n */\n get visibility() { return this._visibility; }\n\n\n /**\n * @summary 不透明度を取得\n * @type {number}\n * @readonly\n */\n get opacity() { return this._opacity; }\n\n\n /**\n * @summary タイプを取得\n * @type {LayerType}\n * @readonly\n */\n get type() { return this._type; }\n\n\n /**\n * @summary タイルテクスチャキャッシュを取得\n * @type {mapray.TileTextureCache}\n * @readonly\n * @package\n */\n get tile_cache() { return this._tile_cache; }\n\n\n /**\n * @summary 画像プロバイダを設定\n *\n * @param {mapray.ImageProvider} provider 画像プロバイダ\n */\n setImageProvider( provider )\n {\n if ( this._image_provider !== provider ) {\n // プロバイダを変更またはプロバイダの状態が変化したら描画レイヤーを更新\n this._owner.dirtyDrawingLayers();\n provider.status( (status) => { this._owner.dirtyDrawingLayers(); } );\n }\n\n this._image_provider = provider;\n\n // タイルキャッシュを再構築\n this._tile_cache.cancel();\n this._tile_cache = new TileTextureCache( this._glenv, provider );\n }\n\n\n /**\n * @summary 可視性フラグを設定\n *\n * @param {boolean} visibility 可視性フラグ\n */\n setVisibility( visibility )\n {\n if ( this._visibility != visibility ) {\n // レイヤーの可視性が変化したら描画レイヤーを更新\n this._owner.dirtyDrawingLayers();\n }\n\n this._visibility = visibility;\n }\n\n\n /**\n * @summary 不透明度を設定\n *\n * @param {number} opacity 不透明度\n */\n setOpacity( opacity )\n {\n this._opacity = opacity;\n }\n\n\n /**\n * @summary マテリアルを取得\n *\n * @return {mapray.SurfaceMaterial} マテリアル\n * @package\n */\n getMateral()\n {\n return this._material;\n }\n}\n\n\n/**\n * @summary レイヤータイプ\n * @enum {object}\n * @memberof mapray.Layer\n * @constant\n */\nconst LayerType = {\n\n\n /**\n * 通常のレイヤー\n */\n NORMAL: { id: \"NORMAL\" },\n\n\n /**\n * 夜部分のみ描画するレイヤー\n */\n NIGHT: { id: \"NIGHT\" }\n\n};\n\nLayer.LayerType = LayerType;\n\nexport default Layer;\n","import FlakeMaterial from \"./FlakeMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport TileTextureCache from \"./TileTextureCache\";\nimport surface_vs_code from \"./shader/surface.vert\";\nimport surface_fs_code from \"./shader/surface.frag\";\nimport rid_fs_code from \"./shader/rid.frag\";\nimport { RenderTarget } from \"./RenderStage\";\nimport Layer from \"./Layer\";\n\n\n/**\n * @summary 地表面マテリアル\n * @memberof mapray.RenderStage\n * @extends mapray.RenderStage.FlakeMaterial\n * @private\n */\nclass SurfaceMaterial extends FlakeMaterial {\n\n /**\n * @param {mapray.Viewer} viewer 所有者である Viewer\n */\n constructor( viewer, options = {} )\n {\n const preamble = SurfaceMaterial._getPreamble( options );\n\n super( viewer,\n preamble + surface_vs_code,\n preamble + ( options.ridMaterial ? rid_fs_code : surface_fs_code ) );\n\n this.bindProgram();\n this.setInteger( \"u_image_hi\", SurfaceMaterial.TEXUNIT_IMAGE_HI );\n this.setInteger( \"u_image_lo\", SurfaceMaterial.TEXUNIT_IMAGE_LO );\n\n this._viewer = viewer;\n this._tile_texture_cache = viewer.tile_texture_cache;\n this._layers = viewer.layers;\n this._dummy_tile_texture = this._createDummyTileTexture( viewer.glenv );\n this._image_zbias = 0;\n\n this._identity_matrix = GeoMath.setIdentity( GeoMath.createMatrix() );\n this._flake_to_gocs = GeoMath.createMatrixf();\n }\n\n /**\n * @summary シェーダの前文を取得\n *\n * @param {object} options オプション指定\n * @param {boolean} [options.nightMaterial=false] 夜用マテリアルの場合 true\n *\n * @private\n */\n static\n _getPreamble( options )\n {\n const is_night = options.nightMaterial === true;\n\n const lines = [];\n\n // マクロの定義\n if ( is_night ) {\n lines.push( \"#define NIGHTIMAGE\" );\n }\n\n // lines を文字列にして返す\n return lines.join( \"\\n\" ) + \"\\n\\n\";\n }\n\n /**\n * @override\n */\n numDrawings()\n {\n return 1 + this._layers.numDrawingLayers();\n }\n\n\n /**\n * @override\n */\n setFlakeParameter( stage, rflake, mesh, index )\n {\n this.setCommonParameter( stage, mesh );\n\n var param = this._getMaterialParamater( rflake, index );\n\n if ( param !== null ) {\n const layer = this._layers.getDrawingLayer( index - 1 );\n\n this.setVector4( \"u_corner_lod\", param.corner_lod );\n\n this.setVector4( \"u_texcoord_rect_hi\", param.image_hi.texcoord_rect );\n this.setVector4( \"u_texcoord_rect_lo\", param.image_lo.texcoord_rect );\n\n this.setVector2( \"u_image_param\", [param.image_lo.lod,\n (param.image_hi.lod == param.image_lo.lod) ?\n 0 : 1 / (param.image_hi.lod - param.image_lo.lod)] );\n\n this.setFloat( \"u_opacity\", (index == 0) ? 1.0 : layer.opacity );\n\n if ( index > 0 && layer.type === Layer.LayerType.NIGHT ) {\n this.setVector3( \"u_sun_direction\", this._viewer.sun_direction );\n mesh.mul_flake_to_gocs( this._identity_matrix, this._flake_to_gocs );\n this.setMatrix( \"u_obj_to_gocs\", this._flake_to_gocs );\n }\n\n this.bindTexture2D( SurfaceMaterial.TEXUNIT_IMAGE_HI, param.image_hi.texture );\n this.bindTexture2D( SurfaceMaterial.TEXUNIT_IMAGE_LO, param.image_lo.texture );\n\n return true;\n }\n else {\n return false;\n }\n }\n\n\n /**\n * @summary SurfaceMaterial のパラメータを取得\n * @desc\n *
\n     * オブジェクト構造\n     * {\n     *    // 四隅の地表詳細レベル\n     *    corner_lod: [lod_00, lod_10, lod_01, lod_11],\n     *\n     *    // 高レベル画像の情報\n     *    image_hi: { lod: (number), texture: (WebGLTexture), texcoord_rect: [s, t, w, h] },\n     *\n     *    // 低レベル画像の情報\n     *    image_lo: { lod: (number), texture: (WebGLTexture), texcoord_rect: [s, t, w, h] }\n     * }\n     * 
\n * @private\n */\n _getMaterialParamater( rflake, index )\n {\n var tex_cache = (index == 0) ? this._tile_texture_cache : this._layers.getDrawingLayer( index - 1 ).tile_cache;\n this._image_zbias = tex_cache.getImageZBias();\n\n var flake = rflake.flake;\n var zg = flake.z;\n\n if ( zg < tex_cache.getImageZMin() ) {\n return null;\n }\n\n var x = flake.x;\n var y = flake.y;\n var zi = Math.ceil( rflake.lod + this._image_zbias );\n\n if ( zg < zi ) {\n return null;\n }\n\n var tiles = tex_cache.findNearestAncestors( zg, x, y, zi );\n if ( index >= 1 && tiles[0] === null ) {\n return null;\n }\n\n return {\n corner_lod: [rflake.lod_00, rflake.lod_10, rflake.lod_01, rflake.lod_11],\n image_hi: this._getImageParamater( tiles[0], zg, x, y, zi ),\n image_lo: this._getImageParamater( tiles[1], zg, x, y, zi - 1 )\n };\n }\n\n\n /**\n * @summary 画像パラメータを取得\n * @desc\n *
\n     * オブジェクト構造\n     * {\n     *    lod:           (number),\n     *    texture:       (WebGLTexture),\n     *    texcoord_rect: [s, t, w, h]\n     * }\n     * 
\n * @private\n */\n _getImageParamater( tile, zg, x, y, zi )\n {\n var pow;\n\n if ( tile !== null ) {\n pow = Math.pow( 2, tile.z - zg );\n return {\n lod: tile.z - this._image_zbias,\n texture: tile.texture,\n texcoord_rect: [x*pow - tile.x, 1 - (y + 1)*pow + tile.y, pow, pow]\n };\n }\n else {\n pow = Math.pow( 2, -zg );\n return {\n lod: -this._image_zbias,\n texture: this._dummy_tile_texture,\n texcoord_rect: [x*pow - Math.floor( pow * (x + 0.5) ), 1 - (y + 1)*pow + Math.floor( pow * (y + 0.5) ), pow, pow]\n };\n }\n }\n\n\n /**\n * @private\n */\n _createDummyTileTexture( glenv )\n {\n var gl = glenv.context;\n var target = gl.TEXTURE_2D;\n var texture = gl.createTexture();\n var pixels = [128, 128, 128, 255];\n\n gl.bindTexture( target, texture );\n gl.texImage2D( target, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array( pixels ) );\n gl.bindTexture( target, null );\n\n return texture;\n }\n\n}\n\n\nSurfaceMaterial.TEXUNIT_IMAGE_HI = 0; // 高レベル画像のテクスチャユニット\nSurfaceMaterial.TEXUNIT_IMAGE_LO = 1; // 低レベル画像のテクスチャユニット\n\n\nexport default SurfaceMaterial;\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var $ = require('../internals/export');\n\n// `Date.now` method\n// https://tc39.github.io/ecma262/#sec-date.now\n$({ target: 'Date', stat: true }, {\n now: function now() {\n return new Date().getTime();\n }\n});\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","// このようにする理由は GeoMath.js の最後を参照\nimport { GeoPoint } from \"./GeoMath\";\nexport default GeoPoint;\n","import Material from \"./Material\";\nimport GeoMath from \"./GeoMath\";\nimport PointCloud from \"./PointCloud\";\nimport point_cloud_vs_code from \"./shader/point_cloud.vert\";\nimport point_cloud_fs_code from \"./shader/point_cloud.frag\";\nimport point_cloud_debug_wire_vs_code from \"./shader/point_cloud_debug_wire.vert\";\nimport point_cloud_debug_wire_fs_code from \"./shader/point_cloud_debug_wire.frag\";\nimport point_cloud_debug_face_vs_code from \"./shader/point_cloud_debug_face.vert\";\nimport point_cloud_debug_face_fs_code from \"./shader/point_cloud_debug_face.frag\";\n\n\n\n/**\n * @summary 点群マテリアル\n * @memberof mapray.RenderStage\n * @extends mapray.RenderStage.Material\n * @private\n */\nclass PointCloudMaterial extends Material {\n\n /**\n * @param {mapray.Viewer} viewer 所有者である Viewer\n */\n constructor( viewer, options={} )\n {\n const preamble = PointCloudMaterial._getPreamble( options );\n\n super( viewer.glenv, preamble + point_cloud_vs_code, preamble + point_cloud_fs_code );\n\n this.bindProgram();\n this.setFloat( \"u_point_size\", 10 );\n this.setFloat( \"u_debug\", -1.0 );\n\n this._local_to_clip = GeoMath.createMatrixf();\n }\n\n /**\n * @summary 点の大きさを設定\n * @param {number} val 設定する値\n */\n setPointSize( val ) {\n this.setFloat( \"u_point_size\", val );\n }\n\n /**\n * @summary デバッグ値を設定\n * @param {number} val 設定する値\n */\n setDebug( val ) {\n this.setFloat( \"u_debug\", val );\n }\n\n /**\n * @summary 描画位置を設定\n * @param {number} val 設定する値\n */\n setDebugBoundsParameter( stage, center )\n {\n mul_local_to_gocs( stage._gocs_to_clip, center, this._local_to_clip );\n this.setMatrix( \"u_obj_to_clip\", this._local_to_clip );\n return true;\n }\n\n /**\n * @summary シェーダの前文を取得\n * @private\n */\n static\n _getPreamble( options )\n {\n const lines = [];\n\n const point_shape_type = options.point_shape_type || PointCloud.PointShapeType.CIRCLE;\n\n lines.push( \"#define POINT_SHAPE_TYPE \" + point_shape_type.shader_code );\n\n // lines を文字列にして返す\n return lines.join( \"\\n\" ) + \"\\n\\n\";\n }\n \n\n}\n\n\n\nconst mul_local_to_gocs = ( mat, center, dst ) => {\n const\n m00 = mat[ 0], m01 = mat[ 4], m02 = mat[ 8], m03 = mat[12],\n m10 = mat[ 1], m11 = mat[ 5], m12 = mat[ 9], m13 = mat[13],\n m20 = mat[ 2], m21 = mat[ 6], m22 = mat[10], m23 = mat[14],\n m30 = mat[ 3], m31 = mat[ 7], m32 = mat[11], m33 = mat[15];\n\n const\n t03 = center[0],\n t13 = center[1],\n t23 = center[2];\n\n dst[ 0] = m00;\n dst[ 1] = m10;\n dst[ 2] = m20;\n dst[ 3] = m30;\n\n dst[ 4] = m01;\n dst[ 5] = m11;\n dst[ 6] = m21;\n dst[ 7] = m31;\n\n dst[ 8] = m02;\n dst[ 9] = m12;\n dst[10] = m22;\n dst[11] = m32;\n\n dst[12] = m00*t03 + m01*t13 + m02*t23 + m03;\n dst[13] = m10*t03 + m11*t13 + m12*t23 + m13;\n dst[14] = m20*t03 + m21*t13 + m22*t23 + m23;\n dst[15] = m30*t03 + m31*t13 + m32*t23 + m33;\n\n return dst;\n}\n\n\n\n/**\n * @summary デバッグ用点群マテリアル(ワイヤーフレーム)\n * @memberof mapray.RenderStage\n * @extends mapray.RenderStage.Material\n * @private\n */\nclass PointCloudDebugWireMaterial extends Material {\n\n /**\n * @param {mapray.Viewer} viewer 所有者である Viewer\n */\n constructor( viewer )\n {\n super( viewer.glenv, point_cloud_debug_wire_vs_code, point_cloud_debug_wire_fs_code );\n\n this.bindProgram();\n this._color = GeoMath.createVector3([ 0.0, 0.2, 0.4 ]);\n this.setVector3( \"u_color\", this._color );\n this._local_to_clip = GeoMath.createMatrixf();\n }\n\n setDebugBoundsParameter( stage, center, color )\n {\n mul_local_to_gocs( stage._gocs_to_clip, center, this._local_to_clip );\n this.setMatrix( \"u_obj_to_clip\", this._local_to_clip );\n if ( color ) {\n this._color[0] = color[0];\n this._color[1] = color[1];\n this._color[2] = color[2];\n }\n this.setVector3( \"u_color\", this._color );\n return true;\n }\n}\n\n\n\n/**\n * @summary デバッグ用点群マテリアル(サーフェス)\n * @memberof mapray.RenderStage\n * @extends mapray.RenderStage.Material\n * @private\n */\nclass PointCloudDebugFaceMaterial extends Material {\n\n /**\n * @param {mapray.Viewer} viewer 所有者である Viewer\n */\n constructor( viewer )\n {\n super( viewer.glenv, point_cloud_debug_face_vs_code, point_cloud_debug_face_fs_code );\n\n this.bindProgram();\n this._color = GeoMath.createVector4([ 0.3, 0.9, 1.0, 0.5 ]);\n this.setVector4( \"u_color\", this._color );\n this._local_to_clip = GeoMath.createMatrixf();\n }\n\n setDebugBoundsParameter( stage, center, color )\n {\n mul_local_to_gocs( stage._gocs_to_clip, center, this._local_to_clip );\n this.setMatrix( \"u_obj_to_clip\", this._local_to_clip );\n if ( color ) {\n this._color[0] = color[0];\n this._color[1] = color[1];\n this._color[2] = color[2];\n this._color[3] = color[3] || 0.0;\n }\n this.setVector4( \"u_color\", this._color );\n return true;\n }\n}\n\n\n\nexport default PointCloudMaterial;\nexport { PointCloudDebugWireMaterial, PointCloudDebugFaceMaterial };\n","import Mesh from \"./Mesh\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport PointCloudMaterial, { PointCloudDebugWireMaterial, PointCloudDebugFaceMaterial } from \"./PointCloudMaterial\";\n\n\n\n/**\n * @summary 点群データを表現するクラス\n * @example\n * インスタンスの生成は下記のように行う。\n * const provider = new {@link mapray.RawPointCloudProvider}({\n * resource: {\n * prefix: \"https://...\"\n * }\n * });\n * const point_cloud = viewer.point_cloud_collection.add( provider );\n * point_cloud.setPointShape( {@link mapray.PointCloud.PointShapeType}.GRADIENT_CIRCLE );\n *\n * @see mapray.PointCloudProvider\n * @see mapray.PointCloudCollection\n * @memberof mapray\n */\nclass PointCloud {\n\n /**\n * @param {mapray.Scene} scene 所属するシーン\n * @param {mapray.PointCloudProvider} provider プロバイダ\n */\n constructor( scene, provider )\n {\n this._glenv = scene.glenv;\n this._scene = scene;\n\n this._provider = provider;\n\n this._root = Box.createRoot( this );\n\n // properties\n this._points_per_pixel = 0.7;\n this._point_shape = PointCloud.PointShapeType.CIRCLE;\n this._point_size_type = PointCloud.PointSizeType.FLEXIBLE;\n this._point_size = 1;\n this._point_size_limit = 10;\n\n // hidden properties\n this._dispersion = true;\n this._debug_shader = false;\n\n this._debug_render_box = false;\n this._debug_render_ellipsoid = false;\n this._debug_render_axis = false;\n this._debug_render_section = false;\n\n this._checkMaterials();\n\n PointCloud._instances.push(this);\n }\n\n\n static get PointShapeType() { return PointShapeType; }\n\n\n static get PointSizeType() { return PointSizeType; }\n\n\n /**\n * @summary 初期化\n * mapray.PointCloudBoxCollectorへ追加時に自動的に呼ばれる。\n * @private\n */\n async init() {\n await this._provider.init();\n }\n\n /**\n * @summary 破棄\n * mapray.PointCloudBoxCollectorから削除時に自動的に呼ばれる。\n * @private\n */\n async destroy() {\n if (this._provider) {\n await this._provider.destroy();\n }\n if (this._root) {\n await this._root.dispose(null);\n this._root = null;\n }\n const index = PointCloud._instances.indexOf( this );\n if ( index !== -1 ) {\n PointCloud._instances.splice( index, 1 );\n }\n this._provider = null;\n }\n\n\n /**\n * @summary プロバイダ\n * @type {mapray.PointCloudProvider}\n */\n get provider() { return this._provider; }\n\n\n /**\n * @summary ルートBox\n * @type {Box}\n * @private\n */\n get root() { return this._root };\n\n\n // Properties\n\n /**\n * @summary 点群Box読み込みを行う際の解像度[points/pixel]\n * @return {number}\n */\n getPointsPerPixel() { return this._points_per_pixel; }\n\n /**\n * @summary 点群Box読み込みを行う際の解像度[points/pixel]を設定\n * @param {number} val 設定する値\n */\n setPointsPerPixel( val ) {\n console.assert( val <= 1 );\n this._points_per_pixel = val;\n }\n\n /**\n * @summary 点を描画する際の形状\n * @return {mapray.PointCloud.PointShapeType}\n */\n getPointShape() { return this._point_shape; }\n\n /**\n * @summary 点を描画する際の形状を設定\n * @param {mapray.PointCloud.PointShapeType} val 設定する値\n */\n setPointShape( val ) {\n this._point_shape = val;\n }\n\n /**\n * @summary 点を描画する際のサイズの指定方法\n * @return {mapray.PointCloud.PointSizeType}\n */\n getPointSizeType() { return this._point_size_type; }\n\n /**\n * @summary 点を描画する際のサイズの指定方法を設定\n * @param {mapray.PointCloud.PointSizeType} val 設定する値\n */\n setPointSizeType( val ) {\n this._point_size_type = val;\n }\n\n /**\n * @summary 点を描画する際のサイズ\n * point_size_typeにより単位が異なる\n * @see mapray.PointCloud#getPointSizeType\n * @return {number}\n */\n getPointSize() { return this._point_size; }\n\n /**\n * @summary 点を描画する際のサイズを設定。\n * {@link mapray.PointCloud#setPointSizeType}により指定された値によって解釈される単位が異なる。\n * @param {number} val 設定する値\n */\n setPointSize( val ) {\n console.assert( val > 0 );\n this._point_size = val;\n }\n\n /**\n * @summary 点を描画する際の最大ピクセルサイズ\n * @return {number}\n */\n getPointSizeLimit() { return this._point_size_limit; }\n\n /**\n * @summary 点を描画する際の最大ピクセルサイズを設定\n * @param {number} val 設定する値\n */\n setPointSizeLimit( val ) {\n console.assert( val > 0 );\n this._point_size_limit = val;\n }\n\n\n // hidden properties\n\n /**\n * @private\n */\n getDispersion() { return this._dispersion }\n\n /**\n * @private\n */\n setDispersion( val ) { this._dispersion = val; }\n\n /**\n * @private\n */\n getDebugShader() { return this._debug_shader; }\n\n /**\n * @private\n */\n setDebugShader( val ) { this._debug_shader = val; }\n\n /**\n * @private\n */\n setDebugRenderBox( val ) { this._debug_render_box = val; this._updateDebugMesh(); }\n\n /**\n * @private\n */\n setDebugRenderEllipsoid( val ) { this._debug_render_ellipsoid = val; this._updateDebugMesh(); }\n\n /**\n * @private\n */\n setDebugRenderAxis( val ) { this._debug_render_axis = val; this._updateDebugMesh(); }\n\n /**\n * @private\n */\n setDebugRenderSection( val ) { this._debug_render_section = val; this._updateDebugMesh(); }\n\n /**\n * @private\n */\n _updateDebugMesh() {\n if ( this._root ) {\n this._root._updateDebugMeshes();\n }\n }\n\n /**\n * @summary Traverse結果の統計情報を取得。\n * リクエストキューに登録し、{@link mapray.RenderStage}が処理を完了するのを待つ。\n * @return {Promise}\n * @private\n */\n static async requestTraverseSummary() {\n return new Promise(onSuccess => {\n const notifier = statistics => {\n onSuccess(statistics);\n const index = PointCloud.getTraverseDataRequestQueue().indexOf(notifier);\n if (index !== -1) PointCloud.getTraverseDataRequestQueue().splice(index, 1);\n };\n PointCloud.getTraverseDataRequestQueue().push( notifier );\n });\n }\n\n /**\n * @summary Traverse結果取得用のリクエストキューを取得\n * @return {Array}\n * @private\n */\n static getTraverseDataRequestQueue() {\n return PointCloud._traverseDataRequestQueue || (PointCloud._traverseDataRequestQueue=[]);\n }\n\n /**\n * @summary 指定された level, x, y, z のURLを生成します\n * @param {number} level\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @return {string}\n * @private\n */\n getURL( level, x, y, z ) {\n return this._urlGenerator( level, x, y, z );\n }\n\n\n /**\n * @private\n */\n _checkMaterials() {\n const viewer = this._scene.viewer;\n const render_cache = viewer._render_cache || (viewer._render_cache = {});\n if ( !render_cache.point_cloud_materials ) {\n render_cache.point_cloud_materials = Object.keys(PointShapeType).reduce((map, key) => {\n const point_shape_type = PointShapeType[key];\n map[point_shape_type.id] = new PointCloudMaterial( viewer, {\n point_shape_type,\n });\n return map;\n }, {});\n }\n if ( !render_cache.point_cloud_debug_wire_material ) {\n render_cache.point_cloud_debug_wire_material = new PointCloudDebugWireMaterial( viewer );\n }\n if ( !render_cache.point_cloud_debug_face_material ) {\n render_cache.point_cloud_debug_face_material = new PointCloudDebugFaceMaterial( viewer );\n }\n }\n\n\n /**\n * @private\n */\n _getMaterial( point_shape ) {\n return this._scene.viewer._render_cache.point_cloud_materials[ point_shape.id ];\n }\n\n\n /**\n * @private\n */\n static setStatisticsHandler( statistics_handler ) {\n if (statistics_handler) {\n PointCloud._statistics = {\n statistics_obj: new Statistics(),\n statistics_handler: statistics_handler,\n };\n }\n \n }\n\n /**\n * @private\n */\n static getStatistics() { return PointCloud._statistics; }\n\n /**\n * @private\n */\n static getStatisticsHandler() { return PointCloud._statistics_handler; }\n}\n\nPointCloud._instances = [];\n\n\n/**\n * @private\n */\nclass Statistics {\n\n constructor() {\n this._now = performance ? () => performance.now() : () => Date.now();\n this.clear();\n };\n\n start() {\n this._start_time = this._now();\n }\n\n doneTraverse() {\n this._done_traverse_time = this._now();\n this.traverse_time += this._done_traverse_time - this._start_time;\n }\n\n done() {\n this._done_time = this._now();\n this.render_time += this._done_time - this._done_traverse_time;\n this.total_time += this._done_time - this._start_time;\n }\n\n clear() {\n this.render_point_count = 0;\n this.total_point_count = 0;\n this.render_boxes = 0;\n this.total_boxes = 0;\n this.loading_boxes = 0;\n this.created_boxes = 0;\n this.disposed_boxes = 0;\n this.total_time = 0.0;\n this.traverse_time = 0.0;\n this.render_time = 0.0;\n }\n}\n\n\n\n\n\n/**\n * @summary 点描画の種類\n * @constant\n * @enum {object}\n * @memberof mapray.PointCloud\n */\nconst PointShapeType = {\n /**\n * 矩形\n */\n RECTANGLE: { id: \"RECTANGLE\", shader_code: 0 },\n\n /**\n * 円\n */\n CIRCLE: { id: \"CIRCLE\", shader_code: 1 },\n\n /**\n * 境界線付きの円\n */\n CIRCLE_WITH_BORDER: { id: \"CIRCLE_WITH_BORDER\", shader_code: 2 },\n\n /**\n * グラデーションで塗り潰した円\n */\n GRADIENT_CIRCLE: { id: \"GRADIENT_CIRCLE\", shader_code: 3 },\n};\n\n\n\n/**\n * @summary 点描画のサイズ指定方法の種類\n * @enum {object}\n * @constant\n * @memberof mapray.PointCloud\n */\nconst PointSizeType = {\n /**\n * setPointSize()により指定された値をピクセルとして解釈する\n */\n PIXEL: { id: \"PIXEL\" },\n\n /**\n * setPointSize()により指定された値をmmとして解釈する\n */\n MILLIMETERS: { id: \"MILLIMETERS\" },\n\n /**\n * setPointSize()により指定された値を参照せず、表示位置に応じて適切なサイズを自動的に指定する。\n */\n FLEXIBLE: { id: \"FLEXIBLE\" },\n};\n\n\n\n/**\n * @summary 点群ツリーを構成するノード。\n * ルート要素(level === 0) は、Box.createRoot()を用いて作成する。\n * @memberof mapray.PointCloud\n * @private\n */\nclass Box {\n\n /**\n * @param {Box|null} parent 親Box(level === 0の場合はnull)\n * @param {number} level レベル\n * @param {number} x x\n * @param {number} y y\n * @param {number} z z\n * @private\n */\n constructor( parent, level, x, y, z )\n {\n /**\n * @summary 親Box\n * @type {Box}\n */\n this._parent = parent;\n\n /**\n * @summary 所属するPointCloud。\n * ルート要素の場合は Box.createRoot() で設定される。\n * @type {mapray.PointCloud}\n */\n this._owner = parent ? parent._owner : null;\n\n /**\n * @summary レベル\n * @type {number}\n */\n this.level = level;\n\n /**\n * @summary x\n * @type {number}\n */\n this.x = x;\n\n /**\n * @summary y\n * @type {number}\n */\n this.y = y;\n\n /**\n * @summary z\n * @type {number}\n */\n this.z = z;\n\n\n /*\n 2次元(X,Y)までを下記に図示する。Z軸についても同様。\n ^ Y\n |\n +-------------+-------------M\n | cell (0, 1) | cell (1, 1) |\n | | | c: gocs_center [GOCS]\n | | | m: gocs_min [GOCS]\n | | | M: gocs_max [GOCS]\n | | |\n +-------------c-------------+\n | cell (0, 0) | cell (1, 0) |\n | | |\n | | |\n | | |\n | | |\n m-------------+-------------+ --> X\n |<--size[m]-->|\n */\n\n /**\n * @summary Box一辺の半分の長さ\n * @type {number}\n * @private\n */\n const size = this.size = (\n level === 0 ? 2147483648: // 2^31\n level < 31 ? 1 << (31-level):\n Math.pow(0.5, level-31)\n );\n\n /**\n * @summary 軸方向に投影した際の面積\n * @type {number}\n * @private\n */\n this.proj_area = 4.0 * this.size * this.size;\n\n /**\n * @summary GOCS座標系でのBoxの中心位置\n * @type {mapray.Vector3}\n * @private\n */\n this.gocs_center = GeoMath.createVector3([\n MIN_INT + (2 * x + 1) * size,\n MIN_INT + (2 * y + 1) * size,\n MIN_INT + (2 * z + 1) * size\n ]);\n\n /**\n * @summary GOCS座標系でのBoxの最小位置\n * @type {mapray.Vector3}\n * @private\n */\n this.gocs_min = GeoMath.createVector3([\n this.gocs_center[0] - size,\n this.gocs_center[1] - size,\n this.gocs_center[2] - size\n ]);\n\n /**\n * @summary GOCS座標系でのBoxの最大位置\n * @type {mapray.Vector3}\n * @private\n */\n this.gocs_max = GeoMath.createVector3([\n this.gocs_center[0] + size,\n this.gocs_center[1] + size,\n this.gocs_center[2] + size\n ]);\n\n /**\n * @type {Box.Status}\n * @private\n */\n this._status = Box.Status.NOT_LOADED;\n\n\n // (this._status === Box.Status.LOADED) において有効な値\n\n /**\n * @summary 子Box、セルに関する情報\n * @type {object}\n * @private\n */\n this._metaInfo = null;\n\n /**\n * @summary 子Box。\n * (u, v, w)のインデックスは (u | v << 1 | w << 2) によって算出される。\n * @type {mapray.Box[]}\n * @private\n */\n this._children = [ null, null, null, null, null, null, null, null ];\n\n /**\n * @type {mapray.Vector3}\n * @private\n */\n this.average = null;\n\n /**\n * @type {mapray.Vector3}\n * @private\n */\n this.eigenVector = null;\n\n /**\n * @type {mapray.Vector3}\n * @private\n */\n this.eigenVectorLength = null;\n\n /**\n * @private\n */\n this._vertex_buffer = null;\n\n /**\n * @private\n */\n this._vertex_length = null;\n\n /**\n * @private\n */\n this._vertex_attribs = null;\n\n /**\n * @private\n */\n this.debug1 = null;\n\n\n if ( this._owner ) {\n this._updateDebugMesh();\n }\n }\n\n /**\n * @private\n */\n _updateDebugMeshes() {\n this._updateDebugMesh();\n for (let i=0; i 20 && this.getPointsLength() > 5000 && this.eigenVectorLength[0] < this.size * 0.2 ) { // = 10% = (2 * s) / 10\n this._putSectionShapePoints(vertices, indices, tindices); // Render Cross Section\n }\n }\n if ( this._owner._debug_render_ellipsoid ) {\n this._putVariancePoints(vertices, indices, tindices); // Render Normal Ring\n }\n }\n\n const meshes = [];\n if (indices.length > 0) {\n const mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 }\n ],\n ptype: \"lines\",\n vertices: vertices,\n indices: indices\n };\n meshes.push( new Mesh( this._owner._glenv, mesh_data ) );\n }\n if (tindices.length > 0) {\n const mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 }\n ],\n ptype: \"triangles\",\n vertices: vertices,\n indices: tindices\n };\n meshes.push( new Mesh( this._owner._glenv, mesh_data ) );\n }\n\n this.debugMesh = meshes;\n }\n\n\n /**\n * @private\n */\n _putVariancePoints(vertices, indices, tindices) {\n const offset = vertices.length / 3;\n const [ e1, e2, e3 ] = this.eigenVector;\n const [ e1l, e2l, e3l ] = this.eigenVectorLength;\n const G = 6;\n const N = 12;\n const cache = PointCloud._variance_points_cache || (() => {\n const c = {\n cos_ro: [],\n sin_ro: [],\n cos_th: [],\n sin_th: [],\n };\n for ( let j=0; j<=G; ++j ) {\n const ro = Math.PI * j/G;\n c.cos_ro[j] = Math.cos(ro);\n c.sin_ro[j] = Math.sin(ro);\n }\n for ( let i=0; i<=N; ++i ) {\n const th = 2 * Math.PI * i/N;\n c.cos_th[i] = Math.cos(th);\n c.sin_th[i] = Math.sin(th);\n }\n return PointCloud._variance_points_cache = c;\n })();\n const putPoint = (ro, th, vs) => {\n const cos_ro = cache.cos_ro[ro];\n const sin_ro = cache.sin_ro[ro];\n const cos_th = cache.cos_th[th];\n const sin_th = cache.sin_th[th];\n vs.push(\n this.average[0] + sin_ro * (e2l * cos_th * e2[0] + e3l * sin_th * e3[0]) + e1l * cos_ro * e1[0],\n this.average[1] + sin_ro * (e2l * cos_th * e2[1] + e3l * sin_th * e3[1]) + e1l * cos_ro * e1[1],\n this.average[2] + sin_ro * (e2l * cos_th * e2[2] + e3l * sin_th * e3[2]) + e1l * cos_ro * e1[2]\n );\n }\n for ( let j=0; j<=G; ++j ) {\n for ( let i=0; i<=N; ++i ) {\n putPoint(j, i, vertices);\n }\n }\n for ( let j=0; j . . c c = p + alpha v\n v \\ \n \\ (a - p) ue \n |-------->| \\ alpha = ------------\n alpha v \\ v ue \n */\n const q = []\n for ( let i=0; i<2; ++i ) {\n for ( let j=0; j<2; ++j ) {\n q.push(\n { p: [i>0?s:-s, j>0?s:-s, 0], v: [0, 0, s] },\n { p: [j>0?s:-s, 0, i>0?s:-s], v: [0, s, 0] },\n { p: [ 0, i>0?s:-s, j>0?s:-s], v: [s, 0, 0] }\n )\n }\n }\n\n let n, t;\n for ( let i=0; i a[3] - b[3]);\n for ( let i=0; i 0:\n this._metaInfo.indices[ index ] > this._metaInfo.indices[ index - 1 ]\n )\n );\n }\n\n\n /**\n * @summary Boxに含まれる点の数\n * \n * @return {number}\n */\n getPointsLength() {\n return this._metaInfo ? this._metaInfo.indices[7] : 0;\n }\n\n /**\n * @summary 子Boxの番号を返します。\n * @param {Box} child 子Box\n * @return {number}\n */\n indexOf( child ) {\n return this._children.indexOf( child );\n }\n\n\n /**\n * @summary カリングするか?\n * @param {mapray.Vector4[]} clip_planes クリップ平面配列\n * @return {boolean} 見えないとき true, 見えるまたは不明のとき false\n */\n isInvisible( clip_planes ) {\n if ( this.level === 0 ) return false;\n\n const xmin = this.gocs_min[0];\n const xmax = this.gocs_max[0];\n const ymin = this.gocs_min[1];\n const ymax = this.gocs_max[1];\n const zmin = this.gocs_min[2];\n const zmax = this.gocs_max[2];\n\n for ( let i = 0; i < clip_planes.length; ++i ) {\n const p = clip_planes[i];\n const px = p[0];\n const py = p[1];\n const pz = p[2];\n const pw = p[3];\n\n // 以下がすべて成り立つとボックス全体は平面の裏側にある\n // px*xmin + py*ymin + pz*zmin + pw < 0\n // px*xmax + py*ymin + pz*zmin + pw < 0\n // px*xmin + py*ymax + pz*zmin + pw < 0\n // px*xmax + py*ymax + pz*zmin + pw < 0\n // px*xmin + py*ymin + pz*zmax + pw < 0\n // px*xmax + py*ymin + pz*zmax + pw < 0\n // px*xmin + py*ymax + pz*zmax + pw < 0\n // px*xmax + py*ymax + pz*zmax + pw < 0\n\n const c0 = px*xmin + py*ymin;\n const c1 = px*xmax + py*ymin;\n const c2 = px*xmin + py*ymax;\n const c3 = px*xmax + py*ymax;\n const c4 = -pz*zmin - pw;\n const c5 = -pz*zmax - pw;\n\n if ( c0 < c4 && c1 < c4 && c2 < c4 && c3 < c4 &&\n c0 < c5 && c1 < c5 && c2 < c5 && c3 < c5 ) {\n // ボックス全体が平面の裏側にあるので見えない\n return true;\n }\n }\n\n return false; // 見えている可能性がある\n }\n\n\n /**\n * @summary 点群の読み込み処理\n * \n * @return {Promise}\n */\n load() {\n if ( this._status !== Box.Status.NOT_LOADED ) throw new Error( \"illegal status: \" + this._status.id );\n if ( !this._owner._provider.isReady() ) return;\n this._status = Box.Status.LOADING;\n\n const task = this._owner._provider.load( this.level, this.x, this.y, this.z, true );\n this._loadId = task.id;\n return task.done.then(event => {\n this._metaInfo = {\n children: [],\n indices: event.header.indices,\n };\n\n {\n let childFlags = event.header.childFlags;\n for ( let i=7; i>=0; --i ) {\n this._metaInfo.children[i] = (childFlags & 1) ? {} : null;\n childFlags = childFlags >> 1;\n }\n }\n\n this.average = event.header.average;\n this.eigenVector = event.header.eigenVector;\n this.eigenVectorLength = event.header.eigenVectorLength;\n this.debug1 = event.header.debug1;\n\n const values = event.body;\n console.assert( values.length > 0 );\n console.assert( values.length / 6 === this._metaInfo.indices[7] );\n\n ASSERT: {\n const number_of_points = values.length / 6;\n for ( let i=0; i<8; ++i ) {\n if (this._metaInfo.indices[i] > number_of_points) {\n console.log(\"warning fix indices\");\n this._metaInfo.indices[i] = number_of_points;\n }\n }\n }\n\n const gl = this._owner._glenv.context;\n\n this._vertex_buffer = gl.createBuffer();\n\n this._vertex_length = values.length / 6;\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertex_buffer);\n gl.bufferData(gl.ARRAY_BUFFER, values, gl.STATIC_DRAW);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n\n /*\n * +------------+------------+----\n * | a_position | a_color | ...\n * +------------+------------+----\n * \n * |<--12 bit-->|<--12 bit-->|\n */\n this._vertex_attribs = {\n \"a_position\": {\n buffer: this._vertex_buffer,\n num_components: 3,\n component_type: gl.FLOAT,\n normalized: false,\n byte_stride: 24,\n byte_offset: 0\n },\n \"a_color\": {\n buffer: this._vertex_buffer,\n num_components: 3,\n component_type: gl.FLOAT,\n normalized: false,\n byte_stride: 24,\n byte_offset: 12\n }\n };\n this._status = Box.Status.LOADED;\n\n this._updateDebugMesh();\n })\n .catch(error => {\n const skip_error = (\n error.message === \"cancel\" ||\n error.message === \"not loading\" ||\n error.message === \"The user aborted a request.\" ||\n error.is_aborted\n );\n if ( !skip_error ) {\n console.log(error);\n this._status = Box.Status.DESTROYED;\n }\n });\n }\n\n\n /**\n * @summary 子Boxを生成。(すでに存在する場合は既存のBoxを返す)\n * LOADED 状態でのみ呼ぶことができる\n * \n * @param {number} index 番号\n * @param {object} [statistics] 統計情報\n * @return {Box}\n */\n newChild( index, statistics ) {\n const [ u, v, w ] = Box.CHILDREN_INDICES[ index ];\n return this.newChildAt( u, v, w, statistics );\n }\n\n\n /**\n * @summary 子Boxを生成。(すでに存在する場合は既存のBoxを返す)\n * LOADED 状態でのみ呼ぶことができる\n * \n * @param {number} u x方向-側は0、+側は1\n * @param {number} v y方向-側は0、+側は1\n * @param {number} w z方向-側は0、+側は1\n * @param {object} [statistics] 統計情報\n * @return {Box}\n */\n newChildAt( u, v, w, statistics ) {\n console.assert( this._status === Box.Status.LOADED );\n const index = u | v << 1 | w << 2;\n const child = this._children[ index ];\n if ( child ) return child;\n\n if ( !this.getChildInfo( index ) ) return null;\n\n if ( statistics ) statistics.created_boxes++;\n return this._children[ index ] = new Box( this,\n this.level + 1,\n this.x << 1 | u,\n this.y << 1 | v,\n this.z << 1 | w\n );\n }\n\n /**\n * @summary 子Boxを取得。\n * 存在しない場合は null を返却する。\n * \n * @param {number} index 番号\n * @return {Box}\n */\n getChild( index ) {\n return this._children[ index ];\n }\n\n /**\n * デバッグメッシュを描画\n * \n * @param {mapray.RenderStage} render_stage レンダリングステージ\n */\n _drawDebugMesh( render_stage ) {\n if ( !this.debugMesh ) return;\n\n const gl = render_stage._glenv.context;\n const color = Box.STATUS_COLOR_TABLE[ this._status.id ];\n\n gl.disable( gl.CULL_FACE );\n for ( let debugMesh of this.debugMesh ) {\n const debug_material = (debugMesh._draw_mode === 1 ?\n this._owner._scene.viewer._render_cache.point_cloud_debug_wire_material:\n this._owner._scene.viewer._render_cache.point_cloud_debug_face_material\n );\n debug_material.bindProgram();\n debug_material.setDebugBoundsParameter( render_stage, this.gocs_center, color );\n debugMesh.draw( debug_material );\n }\n gl.enable( gl.CULL_FACE );\n }\n\n\n /**\n * @summary Boxを描画する。\n * Box全体の描画および、Boxの8分割単位での描画に対応。\n * \n * @param {mapray.RenderStage} render_stage レンダリングステージ\n * @param {number[]|null} target_cells 描画対象の子番号の配列。ただしnullは全体を表す。\n * @param {number[]} points_per_pixels 点の解像度の配列。target_cells同じ順序であり、nullの場合は要素数1となる。\n * @param {object} statistics 統計情報\n */\n draw( render_stage, target_cells, points_per_pixels, statistics )\n {\n if ( this.debugMesh ) {\n this._drawDebugMesh( render_stage );\n }\n\n if ( this._status !== Box.Status.LOADED ) return;\n\n const gl = render_stage._glenv.context;\n\n const point_shape = this._owner._point_shape;\n const point_size_type = this._owner._point_size_type;\n const point_size = this._owner._point_size;\n const point_size_limit = this._owner._point_size_limit;\n const debug_shader = this._owner._debug_shader;\n\n if ( this._status === Box.Status.LOADED ) {\n const material = this._owner._getMaterial( point_shape );\n material.bindProgram();\n material.setDebugBoundsParameter( render_stage, this.gocs_center );\n material.bindVertexAttribs(this._vertex_attribs);\n\n const overlap_scale = 3;\n if ( target_cells === null ) {\n // draw whole points\n const ppp = points_per_pixels[ 0 ];\n material.setPointSize(\n point_size_type === PointCloud.PointSizeType.PIXEL ? point_size:\n point_size_type === PointCloud.PointSizeType.MILLIMETERS ? -0.001 * point_size / render_stage._pixel_step:\n Math.min( point_size_limit, Math.max( 1.0, overlap_scale / ppp ) )\n );\n material.setDebug( debug_shader ? 0.5 / ppp : -1.0 );\n gl.drawArrays( gl.POINTS, 0, this._vertex_length );\n }\n else {\n // draw only target regions\n for ( let i=0; i 0 ? this._metaInfo.indices[childIndex - 1] : 0;\n const length = this._metaInfo.indices[childIndex] - offset;\n if ( length > 0 ) gl.drawArrays( gl.POINTS, offset, length );\n }\n }\n\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n\n if ( statistics ) {\n statistics.render_boxes++;\n if ( target_cells && this._metaInfo.indices ) {\n for ( let childIndex of target_cells ) {\n const offset = childIndex > 0 ? this._metaInfo.indices[childIndex-1] : 0;\n const length = this._metaInfo.indices[childIndex] - offset;\n statistics.render_point_count += length;\n }\n }\n else {\n statistics.render_point_count += this._vertex_length;\n }\n }\n }\n }\n\n\n /**\n * @summary 子孫Boxを全て削除する。\n * 全ての状態でこの関数を呼ぶことができ、複数回呼ぶことができる。\n * @param {object} [statistics] 統計情報\n */\n disposeChildren( statistics ) {\n for (let i=0; i (\n text +\n (child ? \"\\n\" + child.toTreeString( indent + \" \" ) : \"\")\n ),\n indent + this.toString()\n );\n }\n\n\n /**\n * ルートBoxを生成します。\n * @param {mapray.PointCloud} owner\n * @return {Box}\n */\n static createRoot( owner ) {\n const box = new Box( null, 0, 0, 0, 0 );\n box._owner = owner;\n return box;\n }\n\n static get Status() {\n return Status;\n }\n}\n\n\nBox.CHILDREN_INDICES = [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n [1, 1, 0],\n [0, 0, 1],\n [1, 0, 1],\n [0, 1, 1],\n [1, 1, 1],\n];\n\n\n\n/**\n * @summary Boxの状態。\n *
\n *                                                                      \n *              load()                            dispose()             \n * NOT_LOADED ---------> LOADING -------> LOADED -----------> DESTROYED \n *                              \\                          /            \n *                               `------>-----------------´             \n *                                  error or dispose()                  \n * 
\n * @enum {object}\n * @memberof mapray.PointCloud.Box\n * @constant\n * @see mapray.PointCloud.Box#status\n */\nconst Status = {\n /**\n * 準備中 (初期状態)。\n * load()を呼ぶと LOADING へ遷移し読み込み処理が開始される。\n */\n NOT_LOADED: { id: \"NOT_LOADED\" },\n\n /**\n * 読み込み中。\n * 読み込み処理が終了すると、LOADED か DESTROYED のいずれかに遷移する。\n * 正常に処理が完了すると LOADED 、何らかのエラーが発生した場合は DESTROYED となる。\n * また、LOADING 中に dispose() が呼ばれた場合、即座に DESTROYED に遷移する。\n */\n LOADING: { id: \"LOADING\" },\n\n /**\n * 読み込み完了(描画可能)。\n * dispose()を呼ぶと DESTROYED に遷移する。\n */\n LOADED: { id: \"LOADED\" },\n\n /**\n * 破棄状態\n * 他の状態に遷移することはない。\n */\n DESTROYED: { id: \"DESTROYED\" }\n};\n\n\n\nBox.STATUS_COLOR_TABLE = {};\n{\n Box.STATUS_COLOR_TABLE[Box.Status.LOADED.id] = [0.0, 0.8, 1.0, 0.5];\n Box.STATUS_COLOR_TABLE[Box.Status.DESTROYED.id] = [1.0, 0.0, 0.0];\n Box.STATUS_COLOR_TABLE[Box.Status.LOADING.id] = [1.0, 1.0, 0.0];\n Box.STATUS_COLOR_TABLE[Box.Status.NOT_LOADED.id] = [0.0, 1.0, 0.0];\n};\n\n\nconst MIN_INT = 1 << 31;\n\n\n\n\nexport default PointCloud;\nexport { Box, Statistics };\n","import Primitive from \"./Primitive\";\nimport GeoMath from \"./GeoMath\";\nimport AreaUtil from \"./AreaUtil\";\n\n\n/**\n * @summary Boxをレンダリングするためのオブジェクト\n *\n * @memberof mapray\n * @private\n */\nclass PointCloudBoxRenderObject {\n\n\n /**\n * @param {mapray.PointCloud.Box} box 描画対象\n * @param {number} distance 視点からBoxまでの距離\n * @param {number} parent_points_per_pixel 親Boxの点の細かさ\n */\n constructor( box, distance, parent_points_per_pixel )\n {\n this._box = box;\n this._distance = distance;\n this._target_children = [];\n this._points_per_pixel = [];\n this._parent_points_per_pixel = parent_points_per_pixel;\n }\n\n\n /**\n * @summary 描画対象\n * @type {mapray.PointCloud.Box}\n */\n get box()\n {\n return this._box;\n }\n\n\n /**\n * @summary カメラからの距離\n * @type {number}\n */\n get distance()\n {\n return this._distance;\n }\n\n\n /**\n * @summary 親Boxの点の解像度\n * @type {number}\n */\n get parent_points_per_pixel()\n {\n return this._parent_points_per_pixel;\n }\n\n\n /**\n * @summary 描画対象領域を追加する\n * @param {number} child 領域\n * @param {number} points_per_pixel 描画する点の細かさ\n */\n pushRegion( child, points_per_pixel )\n {\n if ( this._target_children !== null ) {\n const index = this._target_children.indexOf( child );\n if ( index === -1) {\n this._target_children.push( child );\n this._points_per_pixel.push( points_per_pixel );\n }\n else {\n this._target_children[ index ] = child;\n this._points_per_pixel[ index ] = points_per_pixel;\n }\n }\n }\n\n\n /**\n * @summary 描画対象を全領域にする\n * @param {number} points_per_pixel 描画する点の細かさ\n */\n setWholeRegion( points_per_pixel )\n {\n this._target_children = null;\n this._points_per_pixel = [ points_per_pixel ];\n }\n\n\n /**\n * @summary 描画\n * @param {mapray.RenderStage} render_stage レンダリングステージ\n * @param {object} statistics 統計情報\n */\n draw( render_stage, statistics )\n {\n this._box.draw( render_stage, this._target_children, this._points_per_pixel, statistics );\n }\n}\n\n\nexport default PointCloudBoxRenderObject;\n","import GeoMath from \"./GeoMath\";\nimport RenderFlake from \"./RenderFlake\";\nimport PointCloud, { Box } from \"./PointCloud\";\nimport PointCloudBoxRenderObject from \"./PointCloudBoxRenderObject\";\n\n\n\n/**\n * @summary Boxを収集するツール\n * @memberof mapray\n * @private\n */\nclass PointCloudBoxCollector {\n\n /**\n * @param {mapray.RenderStage} stage 所有者である RenderStage\n * @param {number} load_limit 読み込みが必要なBoxリストに保持する要素数の上限\n */\n constructor( stage, load_limit=10 )\n {\n this._setupViewVectors( stage );\n this._setupClipPlanes( stage );\n\n this._point_cloud_collection = stage._point_cloud_collection;\n\n /**\n * 描画するBoxのリスト。\n * @private\n */\n this._render_boxes = [];\n\n /**\n * Box => PointCloudBoxRenderObject の辞書\n * @private\n */\n this._render_boxes_map = new Map();\n\n /**\n * 読み込みが必要なBoxリスト。常に優先度でソート済み。\n * @private\n */\n this._load_boxes = [];\n\n /**\n * 読み込みが必要なBoxリストの要素数の上限\n * @private\n */\n this._load_limit = load_limit;\n }\n\n\n /**\n * @private\n */\n _setupViewVectors( stage )\n {\n const view_to_gocs = stage._view_to_gocs;\n const pixel_step = stage._pixel_step;\n \n const view_pos_Q = GeoMath.createVector3();\n const view_dir_wU = GeoMath.createVector3();\n\n // 地表詳細レベル (LOD) 計算用の Q, w*U ベクトルを設定\n view_pos_Q[0] = view_to_gocs[12];\n view_pos_Q[1] = view_to_gocs[13];\n view_pos_Q[2] = view_to_gocs[14];\n\n view_dir_wU[0] = -view_to_gocs[ 8] * pixel_step;\n view_dir_wU[1] = -view_to_gocs[ 9] * pixel_step;\n view_dir_wU[2] = -view_to_gocs[10] * pixel_step;\n\n /**\n * @summary 位置ベクトル Q\n * @member mapray.FlakeCollector#_view_pos_Q\n * @type {mapray.Vector3}\n * @private\n * @see doc/ImageLevelCalculation.txt\n */\n this._view_pos_Q = view_pos_Q;\n\n /**\n * @summary ベクトル w * U\n * @member mapray.FlakeCollector#_view_dir_wU\n * @type {mapray.Vector3}\n * @private\n * @see doc/ImageLevelCalculation.txt\n */\n this._view_dir_wU = view_dir_wU;\n }\n\n\n /**\n * @private\n */\n _setupClipPlanes( stage )\n {\n const view_to_gocs = stage._view_to_gocs;\n const gocs_to_view = stage._gocs_to_view;\n\n this.volume_planes = stage._volume_planes;\n\n // const volume_planes = stage._volume_planes;\n const clip_planes = [];\n\n // 地表遮蔽カリング平面\n const root_flake = stage._viewer._globe.root_flake;\n const rmin = GeoMath.EARTH_RADIUS + root_flake.height_min; // 最小半径\n const rmax = GeoMath.EARTH_RADIUS + root_flake.height_max; // 最大半径\n\n // P (視点位置)\n const px = view_to_gocs[12];\n const py = view_to_gocs[13];\n const pz = view_to_gocs[14];\n\n // q = √[(P.P - rmin^2)(rmax^2 - rmin^2)] - rmin^2\n const p2 = px*px + py*py + pz*pz;\n const rmin2 = rmin*rmin;\n const rmax2 = rmax*rmax;\n const q = Math.sqrt( (p2 - rmin2) * (rmax2 - rmin2) ) - rmin2;\n\n // L = / ‖P‖\n const plane = GeoMath.createVector4();\n const recip = 1 / Math.sqrt( p2 );\n plane[0] = px * recip;\n plane[1] = py * recip;\n plane[2] = pz * recip;\n plane[3] = q * recip;\n // clip_planes.push( plane );\n\n // L を基とした遠方距離\n const far_dist = Math.sqrt( p2 + rmax2 + 2*q );\n\n // 視体積平面を取得して、地心直交座標系に変換\n // (直交変換なので x, y, z は正規化されている)\n for ( let i = 0; i < 6; ++i ) {\n let src_plane = this.volume_planes[i];\n const dst_plane = GeoMath.createVector4();\n\n if ( i == 1 && src_plane[3] > far_dist ) {\n // 遠方平面が必要以上に遠いとき far_dist に置き換える\n src_plane = GeoMath.createVector4( src_plane );\n src_plane[3] = far_dist;\n }\n\n GeoMath.transformPlane_A( gocs_to_view, src_plane, dst_plane );\n\n clip_planes.push( dst_plane );\n }\n\n this._clip_planes = clip_planes;\n }\n\n\n /**\n * @summary 点群Boxを収集する\n * @param {mapray.PointCloud} point_cloud 点群\n * @param {object} statistics 統計情報\n * @return {mapray.RenderFlake[]} 収集された点群Boxの集合\n */\n traverse( point_cloud, statistics )\n {\n this._points_per_pixel = point_cloud.getPointsPerPixel();\n this._dispersion = point_cloud.getDispersion();\n\n this._statistics = statistics;\n this._updateBox( point_cloud.root, 0 );\n return {\n visible_boxes: this._render_boxes,\n load_boxes: this._load_boxes,\n };\n }\n\n\n /**\n * @private\n */\n _updateBox( box, parent_ppp ) {\n if (this._statistics) {\n this._statistics.total_boxes++;\n if ( box.status === Box.Status.LOADING ) this._statistics.loading_boxes++;\n if ( box.getPointsLength() ) {\n this._statistics.total_point_count += box.getPointsLength();\n }\n }\n\n if ( box.isInvisible( this._clip_planes ) ) {\n box.disposeChildren( this._statistics );\n return;\n }\n\n let box_ppp, lodStatus;\n if (box.is_loaded) {\n box_ppp = this._calcPointsPerPixel( box );\n lodStatus = box_ppp < this._points_per_pixel ? LodStatus.LOAD_NEXT_LEVEL : LodStatus.UNLOAD_NEXT_LEVEL;\n }\n else {\n lodStatus = LodStatus.KEEP_STATUS;\n }\n\n if ( lodStatus === LodStatus.LOAD_NEXT_LEVEL ) { // if more detaild data is required then load nextLevel\n // 子Boxがない領域を描画する\n // [A]\n // |--a1--[B]\n // |--a2--[C]\n // `--a3-- x\n // - Aは、8分割された領域のうち、a1, a2, a3の領域に点が含まれている。\n // - このうちa1, a2については子Box(B, C)を持っており、a3は子Boxを持っていない。\n // - この場合、a3の領域についはAが描画する。(a1, a2の領域については、B, Cにより描画される)\n this._collectNextLevel( box, box_ppp );\n for ( let i=0; i<8; i++ ) {\n if ( box.cellPointsAvailable( i ) && !box.getChild( i ) ) {\n this._pushBox( box, i, box_ppp, parent_ppp );\n }\n }\n return;\n }\n\n if ( lodStatus === LodStatus.UNLOAD_NEXT_LEVEL ) { // if more detaild data is not required then dispose children\n box.disposeChildren( this._statistics );\n }\n\n if ( box.status !== Box.Status.DESTROYED ) {\n // [A]\n // |--a1--[B]\n // |--a2--[C]\n // `--a3-- x\n // - Bが読み込まれている場合はBを描画する。\n // - Bの読み込みが完了するまでは、Aがa1領域を描画する(読み込み中は枠のみ描画される場合があるため、Bも描画する)。\n this._pushBox( box, null, box_ppp, parent_ppp );\n if ( box.status === Box.Status.LOADING || box.status === Box.Status.NOT_LOADED ) {\n if ( box.level > 1 ) {\n this._pushBox( box.parent, box.parent.indexOf(box), parent_ppp, parent_ppp );\n }\n }\n }\n }\n\n\n /**\n * @スクリーン1画素あたりの点の数[points/pixel]を計算する。\n * 例えば、2画素につき1点の間隔で並んでいる場合は0.5を返す。\n * @param {mapray.PointCloud.Box} box Box\n * @private\n */\n _calcPointsPerPixel( box ) {\n const is_plane = box.eigenVectorLength[0] < box.size * 0.8;\n let points_per_pixel;\n\n if ( is_plane && this._dispersion && box.eigenVectorLength[0] > 0 ) {\n const dir = GeoMath.normalize3( this._view_dir_wU, GeoMath.createVector3f() );\n\n const [ ev1, ev2, ev3 ] = box.eigenVector;\n const [ ev1l, ev2l, ev3l ] = box.eigenVectorLength;\n const n = [\n GeoMath.dot3(ev2, dir),\n GeoMath.dot3(ev1, dir),\n GeoMath.dot3(ev3, dir)\n ];\n const s = (n[0] * n[0]) / (ev2l * ev2l) + (n[2] * n[2]) / (ev3l * ev3l);\n const nn = [\n s * ev3l * ev1l / ev2l * n[0],\n s * ev2l * ev3l / ev1l * n[1],\n s * ev1l * ev2l / ev3l * n[2]\n ];\n GeoMath.normalize3(nn, nn);\n const area_calc = (nn[0] * n[0] + nn[1] * n[1] + nn[2] * n[2]) * (\n Math.PI * ev1l * ev2l * ev3l /\n Math.sqrt(nn[0] * nn[0] * ev2l * ev2l + nn[1] * nn[1] * ev1l * ev1l + nn[2] * nn[2] * ev3l * ev3l)\n );\n const area = Math.min(Math.max(area_calc, 0.05 * box.proj_area), box.proj_area);\n points_per_pixel = Math.sqrt( box.getPointsLength() / area );\n }\n else {\n points_per_pixel = 64 / box.size; // (128 / (2*box.size)) = 1セルの大きさ(点の間隔)\n }\n\n const diff = [\n box.gocs_center[0] + box.average[0] - this._view_pos_Q[0],\n box.gocs_center[1] + box.average[1] - this._view_pos_Q[1],\n box.gocs_center[2] + box.average[2] - this._view_pos_Q[2]\n ];\n\n // ω スクリーン上の1画素の一辺の長さを、box.averageの位置に投影した長さ\n const ω = GeoMath.dot3( this._view_dir_wU, diff );\n return ω * points_per_pixel;\n }\n\n\n /**\n * @summary 描画対象を追加\n * \n * @param {mapray.PointCloud.Box} box\n * @param {number|null} targetChild cell領域を指定する場合は数字、全体を描画する場合はnullを指定する\n * @param ppp 描画時の解像度 (points per pixel)\n * @param parent_ppp 親Boxの描画時の解像度 (points per pixel)\n * @private\n */\n _pushBox( box, target_child, ppp, parent_ppp ) {\n let ro = this._render_boxes_map.get( box );\n if ( ro ) {\n if ( target_child === null ) ro.setWholeRegion( ppp );\n else ro.pushRegion( target_child, ppp );\n }\n else {\n const diff = (box.is_loaded ?\n [\n box.gocs_center[0] + box.average[0] - this._view_pos_Q[0],\n box.gocs_center[1] + box.average[1] - this._view_pos_Q[1],\n box.gocs_center[2] + box.average[2] - this._view_pos_Q[2]\n ]:\n [\n box.gocs_center[0] - this._view_pos_Q[0],\n box.gocs_center[1] - this._view_pos_Q[1],\n box.gocs_center[2] - this._view_pos_Q[2]\n ]\n );\n const distance = Math.sqrt(diff[0]*diff[0] + diff[1]*diff[1] + diff[2]*diff[2]);\n ro = new PointCloudBoxRenderObject( box, distance, parent_ppp );\n if ( target_child === null ) ro.setWholeRegion( ppp );\n else ro.pushRegion( target_child, ppp );\n this._render_boxes.push( ro );\n this._render_boxes_map.set( box, ro );\n\n if ( box.status === Box.Status.NOT_LOADED ) {\n this._pushLoadBox( ro );\n }\n }\n }\n\n\n /**\n * @summary 描画対象を追加\n * \n * @param {mapray.PointCloud.Box} box\n * @param {number|null} targetChild cell領域を指定する場合は数字、全体を描画する場合はnullを指定する\n * @param ppp 描画時の解像度 (points per pixel)\n * @param parent_ppp 親Boxの描画時の解像度 (points per pixel)\n * @private\n */\n _pushLoadBox( ro ) {\n const index = this._binarySearch( this._load_boxes, ro, (ro1, ro2) => ro1.parent_points_per_pixel < ro2.parent_points_per_pixel );\n // this._load_boxes.splice( index, 0, ro );\n if ( index === -1) this._load_boxes.push(ro);\n else this._insert_with_limit( this._load_boxes, index, ro, this._load_limit );\n }\n\n\n /**\n * @private\n */\n _insert_with_limit( list, index, item, limit ) {\n if ( limit === undefined || limit - list.length > 0) {\n list.splice( index, 0, item );\n }\n else {\n // we couldn't increase the size\n if (index === list.length) return;\n for ( let i=list.length-1; i>index; i-- ) {\n list[i] = list[i-1];\n }\n list[index] = item;\n }\n }\n\n\n /**\n * @param Array sorted_list ソート済みリスト\n * \n * @private\n */\n _binarySearch( sorted_list, value, compareFunc ) {\n if ( sorted_list.length === 0 ) return -1;\n if ( compareFunc( value, sorted_list[ 0 ] ) ) return 0;\n if ( compareFunc( sorted_list[sorted_list.length - 1], value ) ) return sorted_list.length;\n if ( sorted_list.length === 1 ) return sorted_list.length;\n return this._binarySearchInner( sorted_list, value, compareFunc, 0, sorted_list.length - 1 );\n }\n\n\n /**\n * @private\n */\n _binarySearchInner( sorted_list, value, compareFunc, min, max ) {\n if ( max - min === 1 ) return max;\n const mid = 0.5 * (min + max) | 0;\n if ( compareFunc( sorted_list[mid], value ) ) min = mid;\n else max = mid;\n return this._binarySearchInner( sorted_list, value, compareFunc, min, max );\n }\n\n\n /**\n * @private\n */\n _collectNextLevel( box, parent_ppp ) {\n let child;\n for ( let i=0; i<8; i++ ) {\n if ( child = box.newChild( i, this._statistics ) ) {\n this._updateBox( child, parent_ppp );\n }\n }\n }\n}\n\n\n\n/**\n * @summary Boxの解像度の状態を表す列挙型\n * @enum {object}\n * @memberof mapray.PointCloud.Box\n * @constant\n * @see mapray.PointCloud.Box#status\n */\nconst LodStatus = {\n /**\n * 目標解像度に達しておらず、次のレベルのBoxを読み込む必要があることを示しす。\n */\n LOAD_NEXT_LEVEL: 1,\n\n /**\n * 読み込み中などの理由で解像度が計算できないため、現状を維持することを示す。\n */\n KEEP_STATUS: 0,\n\n /**\n * 目標解像度に達しており、次のレベルのBoxが必要ないことを示す。\n */\n UNLOAD_NEXT_LEVEL: -1,\n};\n\n\n\nexport default PointCloudBoxCollector;\n","'use strict';\nvar aFunction = require('../internals/a-function');\nvar isObject = require('../internals/is-object');\n\nvar slice = [].slice;\nvar factories = {};\n\nvar construct = function (C, argsLength, args) {\n if (!(argsLength in factories)) {\n for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');\n } return factories[argsLength](C, args);\n};\n\n// `Function.prototype.bind` method implementation\n// https://tc39.github.io/ecma262/#sec-function.prototype.bind\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = slice.call(arguments, 1);\n var boundFunction = function bound(/* args... */) {\n var args = partArgs.concat(slice.call(arguments));\n return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);\n };\n if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;\n return boundFunction;\n};\n","var $ = require('../internals/export');\nvar bind = require('../internals/function-bind');\n\n// `Function.prototype.bind` method\n// https://tc39.github.io/ecma262/#sec-function.prototype.bind\n$({ target: 'Function', proto: true }, {\n bind: bind\n});\n","/**\n * @summary フレームバッファ\n *\n * @memberof mapray\n * @private\n */\nclass FrameBuffer {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {number} width 幅\n * @param {number} height 高さ\n * @param {object} options オプション\n * @param {object[]} options.color_containers テクスチャオプションの配列\n * @param {object} [options.depth_containers] 深度テクスチャオプション\n */\n constructor( glenv, width, height, options = {} ) {\n this._glenv = glenv;\n this._width = width;\n this._height = height;\n this._options = options\n const { frame_buffer, color_containers, depth_container } = this._buildBuffers( options );\n this._frame_buffer = frame_buffer;\n this._color_containers = color_containers;\n this._depth_container = depth_container;\n }\n\n /**\n * @summary バッファの生成\n * @private\n */\n _buildBuffers( options ) {\n const ret = {};\n const width = this._width;\n const height = this._height;\n const gl = this._glenv.context;\n\n const frame_buffer = ret.frame_buffer = gl.createFramebuffer();\n gl.bindFramebuffer( gl.FRAMEBUFFER, frame_buffer );\n\n ret.color_containers = options.color_containers.map((color_container, index) => {\n const type = color_container.type || FrameBuffer.ContainerType.RENDER_BUFFER;\n const c_options = color_container.options || {};\n if ( type === FrameBuffer.ContainerType.RENDER_BUFFER ) {\n const buffer = gl.createRenderbuffer();\n gl.bindRenderbuffer( gl.RENDERBUFFER, buffer );\n gl.renderbufferStorage( gl.RENDERBUFFER, c_options.internal_format, width, height );\n gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + index, gl.RENDERBUFFER, buffer );\n return buffer;\n }\n else { // type === FrameBuffer.ContainerType.TEXTURE\n const texture = gl.createTexture();\n gl.bindTexture( gl.TEXTURE_2D, texture );\n gl.texImage2D( gl.TEXTURE_2D, 0, c_options.internal_format, width, height, 0, c_options.format, c_options.type, null );\n gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );\n gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR );\n gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + index, gl.TEXTURE_2D, texture, 0 );\n return texture;\n }\n });\n\n if ( options.depth_container ) {\n const type = options.depth_container.type || FrameBuffer.ContainerType.RENDER_BUFFER;\n const d_options = options.depth_container.options || {};\n if ( type === FrameBuffer.ContainerType.RENDER_BUFFER ) {\n const buffer = ret.depth_container = gl.createRenderbuffer();\n gl.bindRenderbuffer( gl.RENDERBUFFER, buffer );\n gl.renderbufferStorage( gl.RENDERBUFFER, d_options.internal_format, width, height );\n gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, buffer );\n }\n else { // type === FrameBuffer.ContainerType.TEXTURE\n const depth_container = ret.depth_container = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, depth_container);\n gl.texImage2D(gl.TEXTURE_2D, 0, d_options.internal_format, width, height, 0, d_options.format, d_options.type, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, options.depth_container.attach_type, gl.TEXTURE_2D, depth_container, 0);\n }\n }\n\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error(\"ERROR: \" + gl.checkFramebufferStatus(gl.FRAMEBUFFER));\n }\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return ret;\n }\n\n\n /**\n * @summary リソースを破棄する\n */\n dispose() {\n const gl = this._glenv.context;\n gl.deleteFramebuffer(this._frame_buffer);\n this._frame_buffer = null\n this._color_containers.forEach(container => {\n this._delete_container(container);\n });\n this._color_containers = [];\n this._delete_container( container, this._depth_container );\n this._depth_container = null;\n }\n\n /**\n * @private\n */\n _delete_container( container ) {\n const gl = this._glenv.context;\n if ( container instanceof WebGLTexture ) {\n gl.deleteTexture( container );\n }\n else if ( container instanceof WebGLRenderbuffer ) {\n gl.deleteRenderbuffer( container );\n }\n }\n\n\n /**\n * @summary フレームバッファ\n * @type {WebGLFramebuffer}\n */\n get frame_buffer() {\n return this._frame_buffer;\n }\n\n /**\n * @summary カラーデータを取得(0番目を取得)\n * @type {WebGLTexture|WebGLRenderbuffer}\n */\n get color_container() {\n return this._color_containers[ 0 ];\n }\n\n /**\n * @summary カラーデータを取得\n * @param {number} index\n * @type {WebGLTexture|WebGLRenderbuffer}\n */\n getColorContainer( index ) {\n return this._color_containers[ index ];\n }\n\n /**\n * @summary カラーデータ数\n * @type {number}\n */\n get color_container_length() {\n return this._color_containers.length;\n }\n\n /**\n * @summary 深度データ\n * @type {WebGLTexture|WebGLRenderbuffer}\n */\n get depth_container() {\n return this._depth_container;\n }\n\n /**\n * @summary フレームバッファをバインドする。\n * 呼び出し側がバインド・アンバインドが対応するように使用する。\n */\n bind() {\n if (FrameBuffer.active_frame_buffer) {\n throw new Error(\"Invalid status: already bound\");\n }\n const gl = this._glenv.context;\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._frame_buffer);\n FrameBuffer.active_frame_buffer = this;\n }\n\n /**\n * @summary フレームバッファをアンバインドする。\n * 呼び出し側がバインド・アンバインドが対応するように使用する。\n */\n unbind() {\n if (FrameBuffer.active_frame_buffer !== this) {\n throw new Error(\"Invalid status\");\n }\n const gl = this._glenv.context;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n FrameBuffer.active_frame_buffer = null;\n }\n}\n\n\nFrameBuffer.active_frame_buffer = null;\n\n\n\n/**\n * @summary 要素型の列挙型\n * @enum {object}\n * @memberof mapray.ContainerType\n * @constant\n */\nconst ContainerType = {\n\n /**\n * Render Buffer\n */\n RENDER_BUFFER: { id: \"RENDER_BUFFER\" },\n\n /**\n * Texture\n */\n TEXTURE: { id: \"TEXTURE\" },\n};\n\n\nFrameBuffer.ContainerType = ContainerType;\n\n\nexport default FrameBuffer;\n","import FrameBuffer from \"./FrameBuffer\";\nimport Material from \"./Material\";\nimport Camera from \"./Camera\";\nimport GeoMath from \"./GeoMath\";\n\nimport depth_vs_code from \"./shader/depth.vert\";\nimport depth_fs_code from \"./shader/depth.frag\";\n\n\n/**\n * @summary マウスピック処理に関連する処理を行う\n *\n * @memberof mapray\n * @private\n */\nclass PickTool {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n */\n constructor( glenv ) {\n this._glenv = glenv;\n const gl = this._glenv.context;\n\n this._camera = new Camera({ width: 1, height: 1 });\n\n this._frame_buffer = new FrameBuffer( this._glenv, 1, 1, {\n color_containers: [{\n type: FrameBuffer.ContainerType.RENDER_BUFFER,\n options: {\n internal_format: gl.RGBA4,\n }\n }],\n depth_container: {\n type: FrameBuffer.ContainerType.TEXTURE,\n attach_type: gl.DEPTH_STENCIL_ATTACHMENT,\n options: {\n internal_format: gl.DEPTH_STENCIL,\n format: gl.DEPTH_STENCIL,\n type: glenv.WEBGL_depth_texture.UNSIGNED_INT_24_8_WEBGL,\n }\n },\n });\n\n this._depth_to_color_frame_buffer = new FrameBuffer( this._glenv, 1, 1, {\n color_containers: [{\n type: FrameBuffer.ContainerType.RENDER_BUFFER,\n options: {\n internal_format: gl.RGBA4,\n }\n }],\n });\n\n this._depth_to_color_materials = [\n new Material( this._glenv, depth_vs_code, define_PASS_BASE_0 + \"\\n\\n\" + depth_fs_code ),\n new Material( this._glenv, depth_vs_code, define_PASS_BASE_1 + \"\\n\\n\" + depth_fs_code ),\n ];\n\n {\n const vertex_buf = gl.createBuffer();\n {\n const vertices = [ -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, +1.0 ];\n gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n\n const texcoord_buf = gl.createBuffer();\n {\n const texcoord = [ 0, 1, 0, 0, 1, 0, 1, 1 ];\n gl.bindBuffer(gl.ARRAY_BUFFER, texcoord_buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texcoord), gl.STATIC_DRAW);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n\n {\n const indices = [ 0, 1, 2, 0, 2, 3 ];\n this._indices_length = indices.length;\n this._index_buf = gl.createBuffer()\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._index_buf);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n }\n\n this._vertex_attribs = {\n \"a_position\": {\n buffer: vertex_buf,\n num_components: 2,\n component_type: gl.FLOAT,\n normalized: false,\n byte_stride: 0,\n byte_offset: 0\n },\n \"a_texcoord\": {\n buffer: texcoord_buf,\n num_components: 2,\n component_type: gl.FLOAT,\n normalized: false,\n byte_stride: 0,\n byte_offset: 0\n }\n };\n }\n\n this._rid_value = new Uint8Array( 4 );\n this._depth_value = new Uint8Array( 4 );\n }\n\n /**\n * @summary ピック用カメラを返却する。同じインスタンスが返却される。\n * @param {mapray.Camera} viewer_camera Viewreのカメラ\n */\n pickCamera( viewer_camera ) {\n const cw = viewer_camera.canvas_size.width;\n const ch = viewer_camera.canvas_size.height;\n this._camera.copyViewParameters( viewer_camera );\n const hfov_rad = viewer_camera.fov * GeoMath.DEGREE / 2;\n const hfov_rad2 = Math.atan( Math.sqrt( 2 ) * Math.tan( hfov_rad ) / Math.sqrt( cw*cw + ch*ch ) );\n this._camera.fov = 2 * hfov_rad2 / GeoMath.DEGREE;\n return this._camera;\n }\n\n /**\n * @summary Scene描画処理直前に呼ばれる\n */\n beforeRender() {\n this._frame_buffer.bind();\n }\n\n /**\n * @summary Scene描画処理直後に呼ばれる\n */\n afterRender() {\n this._frame_buffer.unbind();\n }\n\n /**\n * @summary Scene描画処理がキャンセルされたときに呼ばれる\n */\n renderCanceled() {\n this._frame_buffer.unbind();\n }\n\n /**\n * @summary ridを、描画済みテクスチャから読む(1ステップ前の値が返却される)\n * @return {number}\n */\n readRid() {\n const gl = this._glenv.context;\n const startRid = Date.now();\n this._frame_buffer.bind();\n\n let startRidRead, endRidRead;\n\n startRidRead = Date.now();\n\n gl.readPixels( 0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, this._rid_value );\n endRidRead = Date.now();\n // 4bit x4 の値が 8bit x4 に格納されている。\n /*\n const rid = Math.round(\n this._rid_value[0] / 17 << 12 |\n this._rid_value[1] / 17 << 8 |\n this._rid_value[2] / 17 << 4 |\n this._rid_value[3] / 17\n );\n */\n const rid = Math.round(\n COEFFICIENTS_RID[ 0 ] * Math.round(this._rid_value[ 0 ] / 17.0) +\n COEFFICIENTS_RID[ 1 ] * Math.round(this._rid_value[ 1 ] / 17.0) +\n COEFFICIENTS_RID[ 2 ] * Math.round(this._rid_value[ 2 ] / 17.0) +\n COEFFICIENTS_RID[ 3 ] * Math.round(this._rid_value[ 3 ] / 17.0)\n );\n\n this._frame_buffer.unbind();\n\n const endRid = Date.now();\n if ( endRid - startRid > 7 ) {\n console.log(\"Render and Read Index: \" + (endRid - startRid) + \"ms gl.readPixels:\" + (endRidRead - startRidRead) + \"ms\");\n }\n\n return rid;\n }\n\n\n\n /**\n * @summary 深度値を、描画済みテクスチャから読み(1ステップ前の値が返却される)、Gocs座標系に変換する\n * @return {mapray.Matrix} view_to_clip View座標系からクリップ座標系への変換マトリックス\n * @return {mapray.Matrix} view_to_gocs View座標系からView座標系への変換マトリックス\n * @return {mapray.Vector3}\n */\n readDepth( view_to_clip, view_to_gocs ) {\n const gl = this._glenv.context;\n\n const startDepth = Date.now();\n let startDepthRead, endDepthRead;\n\n this._depth_to_color_frame_buffer.bind();\n\n let depth_clip = 0;\n gl.viewport( 0, 0, 1, 1 );\n for ( let i=0; i<2; i++ ) {\n const material = this._depth_to_color_materials[ i ];\n material.bindProgram();\n material.bindVertexAttribs(this._vertex_attribs);\n material.setInteger( \"u_sampler\", 0 );\n material.bindTexture2D( 0, this._frame_buffer.depth_container );\n gl.depthFunc( gl.ALWAYS );\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._index_buf);\n gl.drawElements(gl.TRIANGLES, this._indices_length, gl.UNSIGNED_SHORT, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n startDepthRead = Date.now();\n gl.readPixels( 0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, this._depth_value );\n endDepthRead = Date.now();\n\n // 4bit x4 の値が 8bit x4 に格納されている。 => [0.0 〜 1.0]\n /*\n depth_clip += (\n this._depth_value[ 0 ] * Math.pow(2, i==0 ? -3 : -15) / 17.0 +\n this._depth_value[ 1 ] * Math.pow(2, i==0 ? -6 : -18) / 17.0 +\n this._depth_value[ 2 ] * Math.pow(2, i==0 ? -9 : -21) / 17.0 +\n this._depth_value[ 3 ] * Math.pow(2, i==0 ? -12 : -24) / 17.0\n );\n */\n const coef = COEFFICIENTS_DEPTH[ i ];\n for ( let j=0; j<4; j++ ) {\n depth_clip += coef[ j ] * this._depth_value[ j ];\n }\n }\n this._depth_to_color_frame_buffer.unbind();\n\n depth_clip = 2.0 * depth_clip - 1.0; // [0.0 〜 1.0] => [-1.0 〜 1.0]\n\n const vtc = view_to_clip;\n\n /*\n const ctv = GeoMath.inverse(vtc, GeoMath.createMatrix());\n const v = GeoMath.mul( ctv, [ 0, 0, c ] );\n */\n const v = [\n vtc[8] / vtc[0],\n vtc[9] / vtc[5],\n -1.0,\n (depth_clip + vtc[10]) / vtc[14]\n ];\n\n // const point = GeoMath.mul_Av( view_to_gocs, v );\n const m = view_to_gocs;\n const w = m[3]*v[0] + m[7]*v[1] + m[11]*v[2] + m[15]*v[3];\n const point = GeoMath.createVector3([\n ( m[0]*v[0] + m[4]*v[1] + m[ 8]*v[2] + m[12]*v[3] ) / w,\n ( m[1]*v[0] + m[5]*v[1] + m[ 9]*v[2] + m[13]*v[3] ) / w,\n ( m[2]*v[0] + m[6]*v[1] + m[10]*v[2] + m[14]*v[3] ) / w\n ]);\n\n const endDepth = Date.now();\n if ( endDepth - startDepth > 7 ) {\n console.log(\"Render and Read Depth: \" + (endDepth - startDepth) + \"ms gl.readPixels:\" + (endDepthRead - startDepthRead) + \"ms\");\n }\n\n return point;\n }\n}\n\nconst COEFFICIENTS_RID = [];\nfor ( let i=0; i<4; i++ ) {\n COEFFICIENTS_RID[ i ] = Math.pow(16, 3 - i);\n}\n\nconst COEFFICIENTS_DEPTH = [[],[]];\nfor ( let i=0; i<4; i++ ) {\n COEFFICIENTS_DEPTH[ 0 ][ i ] = Math.pow(2, -3 * (i+1)) / 17.0;\n COEFFICIENTS_DEPTH[ 1 ][ i ] = Math.pow(2, -3 * (i+5)) / 17.0;\n}\n\n\nconst define_PASS_BASE_0 = \"#define PASS_BASE 0\";\nconst define_PASS_BASE_1 = \"#define PASS_BASE 1\";\n\n\nexport default PickTool;\n","import GeoMath from \"./GeoMath\";\nimport Globe from \"./Globe\";\nimport Entity from \"./Entity\";\nimport FlakeCollector from \"./FlakeCollector\";\nimport SurfaceMaterial from \"./SurfaceMaterial\";\nimport WireframeMaterial from \"./WireframeMaterial\";\nimport PointCloudBoxCollector from \"./PointCloudBoxCollector\";\nimport PointCloud from \"./PointCloud\";\nimport Viewer from \"./Viewer\";\nimport PickTool from \"./PickTool\";\n\n\n\n/**\n * @summary 描画対象\n * @enum {object}\n * @memberof mapray.AbstractRenderStage\n * @constant\n * @private\n */\nconst RenderTarget = {\n\n /**\n * 通常のシーン描画\n */\n SCENE: {\n id: \"SCENE\"\n },\n\n /**\n * マウスピックなど、RID取得を目的とした描画\n */\n RID: {\n id: \"RID\"\n }\n};\n\n\n\n\n/**\n * @summary 1フレーム分のレンダリングを実行\n * @desc\n * {@link mapray.Viewer} インスタンスはフレーム毎にこのクラスのインスタンスを生成してレンダリングを実行する。\n *\n * @memberof mapray\n * @private\n */\nclass AbstractRenderStage {\n\n /**\n * @param {mapray.Viewer} viewer 所有者である Viewer\n * @param {mapray.Camera} camera カメラ\n * @param {object} [renderInfo] レンダリング領域\n * @param {number} [renderInfo.sx] レンダリング領域のx位置(ビューポート中央を0, 右方向を正とする)\n * @param {number} [renderInfo.sy] レンダリング領域のy位置(ビューポート中央を0, 上方向を正とする)\n * @param {number} [renderInfo.swidth] レンダリング領域の幅\n * @param {number} [renderInfo.sheight] レンダリング領域の高さ\n */\n constructor( viewer, camera, renderInfo )\n {\n this._viewer = viewer;\n this._glenv = viewer.glenv;\n\n this._width = camera.canvas_size.width;\n this._height = camera.canvas_size.height;\n\n if ( this._width === 0 || this._height === 0 ) {\n // 画素がないのでレンダリングを省略\n this._rendering_cancel = true;\n return;\n }\n\n // _view_to_gocs, _gocs_to_view, _view_to_clip, _gocs_to_clip\n this._setupBasicMatrices( renderInfo, camera );\n\n // カメラ情報\n this._volume_planes = renderInfo.volume_planes; // 視体積の平面ベクトル配列 (視点空間)\n this._pixel_step = renderInfo.pixel_step; // 画素の変化量 (視点空間)\n\n // モデルシーン\n this._scene = viewer.scene;\n\n // リソースキャッシュ\n this._globe = viewer.globe;\n this._tile_texture_cache = viewer.tile_texture_cache;\n this._point_cloud_collection = viewer.point_cloud_collection;\n\n // 地形\n this._flake_material = null;\n this._flake_list = null;\n\n // 半透明化モード\n this._translucent_mode = false;\n\n // フレーム間のオブジェクトキャッシュ\n const render_cache = viewer._render_cache || (viewer._render_cache = {});\n if ( !render_cache.surface_material ) {\n render_cache.surface_material = new SurfaceMaterial( viewer );\n render_cache.wireframe_material = new WireframeMaterial( viewer );\n }\n if ( !render_cache.surface_pick_material ) {\n render_cache.surface_pick_material = new SurfaceMaterial( viewer, { ridMaterial: true } );\n }\n\n // デバッグ統計\n this._debug_stats = viewer.debug_stats;\n }\n\n /**\n * 半透明化モードを取得。エンティティモデルを半透明化して描画する。\n * Sceneがエンティティへ\"半透明化モード\"を伝達するのに用いる。\n * @see mapray.Entity#anchor_mode\n * @return {boolean}\n * @private\n */\n getTranslucentMode() {\n return this._translucent_mode;\n }\n\n /**\n * @summary 半透明化モードを設定。\n * @see getTranslucentMode()\n * @parm {boolean} transparent_mode\n * @private\n */\n setTranslucentMode( translucent_mode ) {\n this._translucent_mode = translucent_mode;\n }\n\n /**\n * @private\n */\n _setupBasicMatrices( renderInfo, camera )\n {\n this._view_to_gocs = camera.view_to_gocs;\n\n this._gocs_to_view = GeoMath.createMatrix();\n GeoMath.inverse_A( this._view_to_gocs, this._gocs_to_view );\n\n this._view_to_clip = renderInfo.view_to_clip;\n\n this._gocs_to_clip = GeoMath.createMatrix();\n GeoMath.mul_PzA( this._view_to_clip, this._gocs_to_view, this._gocs_to_clip );\n }\n\n /**\n * @type {RenderTarget}\n * @abstract\n */\n getRenderTarget() {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @summary Sceneがレンダリングを確定したことを通知\n * pick_objectは、primitiveがpickされたときに返却すべきオブジェクトを指定する。\n * @param {Primitive} primitive\n * @param {mapray.Entity} [pick_object]\n * @abstract\n */\n onPushPrimitive( primitive, pick_object ) {\n }\n\n /**\n * @summary 1フレームのレンダリングを実行\n * @abstract\n */\n render() {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @summary 1フレームのレンダリングを実行\n * @abstract\n * @private\n */\n _render() {\n const gl = this._glenv.context;\n\n // 描画領域全体にビューポートを設定\n gl.viewport( 0, 0, this._width, this._height );\n gl.clearColor( 0.0, 0.0, 0.0, 1.0 );\n gl.depthMask( true );\n gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );\n\n if ( this._rendering_cancel )\n return;\n\n // 地表断片データの収集\n if ( this._globe.status !== Globe.Status.READY ) {\n // まだ基底タイルデータが読み込まれていないので地表をレンダリングできない\n this._rendering_cancel = true;\n return;\n }\n\n gl.enable( gl.CULL_FACE );\n gl.enable( gl.DEPTH_TEST );\n gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE ); // FB のα値は変えない\n gl.depthFunc( gl.LEQUAL );\n\n const collector = new FlakeCollector( this );\n this._flake_list = collector.traverse();\n\n let vis_ground = this._viewer.getVisibility( Viewer.Category.GROUND );\n let vis_entity = this._viewer.getVisibility( Viewer.Category.ENTITY );\n\n // すべての地表断片を描画\n this._prepare_draw_flake();\n\n for ( let rflake of this._flake_list ) {\n let fro = rflake.getRenderObject();\n if ( vis_ground ) {\n this._draw_flake_base( rflake, fro.getBaseMesh() );\n }\n if ( vis_entity ) {\n this._draw_entities_on_flake( fro );\n }\n }\n\n this._draw_point_cloud();\n\n // モデルシーン描画\n if ( vis_entity ) {\n this._scene.draw( this );\n }\n }\n\n /**\n * @summary 地表断片を描画する前の準備\n *\n * @private\n */\n _prepare_draw_flake()\n {\n // RenderFlake#getRenderObject() の前に必要な処理\n let producers = this._scene.getFlakePrimitiveProducers();\n this._globe.putNextEntityProducers( producers );\n }\n\n\n /**\n * @summary 地表とレイヤーを描画\n *\n * @param {mapray.RenderFlake} rflake 地表断片データ\n * @param {mapray.FlakeMesh} mesh 地表断片メッシュ\n *\n * @private\n */\n _draw_flake_base( rflake, mesh )\n {\n const gl = this._glenv.context;\n let material = this._flake_material;\n\n material.bindProgram();\n\n var num_drawings = material.numDrawings();\n\n // 一番下の不透明地表\n if ( material.setFlakeParameter( this, rflake, mesh, 0 ) ) {\n gl.disable( gl.BLEND );\n gl.depthMask( true );\n mesh.draw( material );\n }\n\n // レイヤーの地表 (半透明の可能性あり)\n for ( let i = 1; i < num_drawings; ++i ) {\n const mat = this._viewer.layers.getDrawingLayer( i - 1 ).getMateral();\n if ( material !== mat ) {\n material = mat;\n material.bindProgram();\n }\n if ( material.setFlakeParameter( this, rflake, mesh, i ) ) {\n if ( this.getRenderTarget() === RenderTarget.SCENE ) {\n gl.enable( gl.BLEND );\n }\n gl.depthMask( false );\n mesh.draw( material );\n }\n }\n\n // 描画地表断頂点数を記録\n var stats = this._debug_stats;\n if ( stats !== null ) {\n stats.num_drawing_flake_vertices += mesh.num_vertices;\n }\n }\n\n\n /**\n * @summary 地表断片上のエンティティを描画\n *\n * @param {mapray.FlakeRenderObject} fro FlakeRenderObject インスタンス\n *\n * @private\n */\n _draw_entities_on_flake( fro )\n {\n let num_entities = fro.num_entities;\n\n if ( num_entities == 0 ) {\n // エンティティなし\n return;\n }\n\n let gl = this._glenv.context;\n\n gl.enable( gl.POLYGON_OFFSET_FILL );\n gl.depthMask( false ); // 地表に張り付いていることが前提なので深度は変更しない\n\n // todo: 仮のポリゴンオフセット\n // 実験で得た適切な値 (Windows, GeForce GT750)\n // Chrome+ANGLE: -8, -8\n // Chrome+EGL: -40, -40\n gl.polygonOffset( -8, -8 );\n\n // 透明色のマテリアルであっても、RID描画時は gl.BLEND を無効にする。\n let setBlend;\n if ( this.getRenderTarget() === RenderTarget.SCENE ) {\n setBlend = (enable) => {\n if (enable) gl.enable( gl.BLEND );\n else gl.disable( gl.BLEND );\n };\n }\n else {\n gl.disable( gl.BLEND );\n setBlend = () => {};\n }\n\n for ( let i = 0; i < num_entities; ++i ) {\n let { primitive, entity } = fro.getEntityPrimitive( i, this );\n\n setBlend( primitive.isTranslucent( this ) );\n\n this.onPushPrimitive( primitive, entity );\n primitive.draw( this );\n }\n\n gl.depthMask( true );\n gl.disable( gl.POLYGON_OFFSET_FILL );\n }\n\n\n _draw_point_cloud()\n {\n }\n}\n\n\n\n/**\n * @summary 1フレーム分のレンダリングを実行\n * @desc\n * {@link mapray.Viewer} インスタンスはフレーム毎にこのクラスのインスタンスを生成してレンダリングを実行する。\n *\n * @memberof mapray\n * @private\n */\nclass RenderStage extends AbstractRenderStage {\n /**\n * @param viewer {mapray.Viewer} 所有者である Viewer\n */\n constructor( viewer )\n {\n super( viewer, viewer.camera, viewer.camera.createRenderInfo() );\n\n // 地表マテリアルの選択\n this._flake_material = (\n viewer.render_mode === Viewer.RenderMode.WIREFRAME ?\n viewer._render_cache.wireframe_material :\n viewer._render_cache.surface_material\n );\n }\n\n\n /**\n * @type {RenderTarget}\n * @override\n */\n getRenderTarget() {\n return RenderTarget.SCENE;\n }\n\n\n /**\n * @summary 1フレームのレンダリングを実行\n * @override\n */\n render()\n {\n this._render();\n if ( this._rendering_cancel ) return;\n\n // 描画地表断片数を記録\n var stats = this._debug_stats;\n if ( stats !== null ) {\n stats.num_drawing_flakes = this._flake_list.length;\n }\n\n // フレーム終了処理\n this._globe.endFrame();\n this._tile_texture_cache.endFrame();\n this._viewer.layers.endFrame();\n }\n\n\n /**\n * @summary 点群を描画\n *\n * @private\n */\n _draw_point_cloud() {\n // const debug_handlers = PointCloud.getDebugHandlers() || {};\n const traverseDataRequestQueue = PointCloud.getTraverseDataRequestQueue();\n const traverseData = traverseDataRequestQueue.length === 0 ? null : [];\n const s = PointCloud.getStatistics() || {};\n // const statistics = ;\n if ( s.statistics_obj ) s.statistics_obj.clear();\n\n for ( let i=0; i 0 ) {\n const pick_object = this._rid_map[ rid ];\n if ( pick_object instanceof Entity ) {\n this._pick_result.entity = pick_object;\n }\n }\n\n this._pick_result.point = pick_tool.readDepth( this._view_to_clip, this._view_to_gocs );\n }\n\n\n /**\n * @type {mapray.Viewer.PickResult}\n */\n get pick_result() {\n return this._pick_result;\n }\n}\n\n\n\nexport default RenderStage;\nexport { PickStage, RenderTarget };\n","/**\n * @summary クレデンシャルモード\n * @desc\n *

HTTP リクエストのクレデンシャルモードを表現する型である。

\n * @enum {object}\n * @memberof mapray\n * @constant\n * @see https://developer.mozilla.org/docs/Web/API/Request/credentials\n * @see mapray.StandardDemProvider\n */\nvar CredentialMode = {\n\n /**\n * 決してクッキーを送信しない\n */\n OMIT: { id: \"OMIT\", credentials: \"omit\" },\n\n /**\n * URL が呼び出し元のスクリプトと同一オリジンだった場合のみ、クッキーを送信\n */\n SAME_ORIGIN: { id: \"SAME_ORIGIN\", credentials: \"same-origin\" },\n\n /**\n * クロスオリジンの呼び出しであっても、常にクッキーを送信\n */\n INCLUDE: { id: \"INCLUDE\", credentials: \"include\" }\n\n};\n\n\nexport default CredentialMode;\n","import ImageProvider from \"./ImageProvider\";\nimport CredentialMode from \"./CredentialMode\";\n\n\n/**\n * @summary 標準地図画像プロバイダ\n * @classdesc\n *

汎用的な地図画像プロバイダの実装である。

\n *

構築子の引数に prefix, suffix, size, zmin, zmax を与えた場合、各メソッドの動作は以下のようになる。\n * ここで c1, c2, c3 は opts.coord_order の指定に従った第1、第2、第3の座標である。

\n *
\n *   requestTile( z, x, y ) -> URL が prefix + c1 + '/' + c2 + '/' + c3 + suffix の画像を要求\n *   getImageSize()         -> size を返す\n *   getZoomLevelRange()    -> new ImageProvider.Range( zmin, zmax ) を返す\n * 
\n * @memberof mapray\n * @extends mapray.ImageProvider\n */\nclass StandardImageProvider extends ImageProvider {\n\n /**\n * @param {string} prefix URL の先頭文字列\n * @param {string} suffix URL の末尾文字列\n * @param {number} size 地図タイル画像の寸法\n * @param {number} zmin 最小ズームレベル\n * @param {number} zmax 最大ズームレベル\n * @param {object} [opts] オプション集合\n * @param {mapray.StandardImageProvider.CoordOrder} [opts.coord_order=ZXY] URL の座標順序\n * @param {mapray.StandardImageProvider.CoordSystem} [opts.coord_system=UPPER_LEFT] タイル XY 座標系\n * @param {mapray.CredentialMode} [opts.credentials=SAME_ORIGIN] クレデンシャルモード\n */\n constructor( prefix, suffix, size, zmin, zmax, opts )\n {\n super();\n this._prefix = prefix;\n this._suffix = suffix;\n this._size = size;\n this._min_level = zmin;\n this._max_level = zmax;\n\n // タイル座標を並び替える関数\n var orderCoords;\n if ( opts && opts.coord_order ) {\n if ( opts.coord_order === CoordOrder.ZYX ) {\n orderCoords = function( z, x, y ) { return z + \"/\" + y + \"/\" + x; };\n }\n else if ( opts.coord_order === CoordOrder.XYZ ) {\n orderCoords = function( z, x, y ) { return x + \"/\" + y + \"/\" + z; };\n }\n }\n if ( !orderCoords ) {\n // その他の場合は既定値 COORD_ORDER_ZXY を使う\n orderCoords = function( z, x, y ) { return z + \"/\" + x + \"/\" + y; };\n }\n\n // XY 座標を変換する関数\n var convCoords;\n if ( opts && opts.coord_system ) {\n if ( opts.coord_system === CoordSystem.LOWER_LEFT ) {\n convCoords = function( z, x, y ) {\n var size = Math.round( Math.pow( 2, z ) );\n return orderCoords( z, x, size - y - 1 );\n };\n }\n }\n if ( !convCoords ) {\n // その他の場合は既定値 UPPER_LEFT (無変換) を使う\n convCoords = orderCoords;\n }\n\n // 座標部分の URL を取得する関数\n this._coords_part = convCoords;\n\n // crossorigin 属性の値\n this._crossOrigin = \"anonymous\";\n if ( opts && opts.credentials ) {\n if ( opts.credentials === CredentialMode.OMIT ) {\n this._crossOrigin = null;\n }\n else if ( opts.credentials === CredentialMode.INCLUDE ) {\n this._crossOrigin = \"use-credentials\";\n }\n }\n }\n\n\n /**\n * @override\n */\n requestTile( z, x, y, callback )\n {\n var image = new Image();\n\n image.onload = function() { callback( image ); };\n image.onerror = function() { callback( null ); };\n\n if ( this._crossOrigin !== null ) {\n image.crossOrigin = this._crossOrigin;\n }\n\n image.src = this._makeURL( z, x, y );\n\n return image; // 要求 ID (実態は Image)\n }\n\n\n /**\n * @override\n */\n cancelRequest( id )\n {\n // TODO: Image 読み込みの取り消し方法は不明\n }\n\n\n /**\n * @override\n */\n getImageSize()\n {\n return this._size;\n }\n\n\n /**\n * @override\n */\n getZoomLevelRange()\n {\n return new ImageProvider.Range( this._min_level, this._max_level );\n }\n\n\n /**\n * URL を作成\n * @private\n */\n _makeURL( z, x, y )\n {\n return this._prefix + this._coords_part( z, x, y ) + this._suffix;\n }\n\n}\n\n\n/**\n * @summary URL 座標順序の列挙型\n * @desc\n * {@link mapray.StandardImageProvider} の構築子で opts.coord_order パラメータに指定する値の型である。\n * @enum {object}\n * @memberof mapray.StandardImageProvider\n * @constant\n */\nvar CoordOrder = {\n /**\n * 座標順序 Z/X/Y (既定値)\n */\n ZXY: { id: \"ZXY\" },\n\n /**\n * 座標順序 Z/Y/X\n */\n ZYX: { id: \"ZYX\" },\n\n /**\n * 座標順序 Z/X/Y\n */\n XYZ: { id: \"XYZ\" }\n};\n\n\n/**\n * @summary タイル XY 座標系の列挙型\n * @desc\n * {@link mapray.StandardImageProvider} の構築子で opts.coord_system パラメータに指定する値の型である。\n * @enum {object}\n * @memberof mapray.StandardImageProvider\n * @constant\n */\nvar CoordSystem = {\n /**\n * 原点:左上, X軸:右方向, Y軸:下方向 (既定値)\n */\n UPPER_LEFT: { id: \"UPPER_LEFT\" },\n\n /**\n * 原点:左下, X軸:右方向, Y軸:上方向\n */\n LOWER_LEFT: { id: \"LOWER_LEFT\" }\n};\n\n\n// クラス定数の定義\n{\nStandardImageProvider.CoordOrder = CoordOrder;\nStandardImageProvider.CoordSystem = CoordSystem;\n}\n\n\nexport default StandardImageProvider;\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","/**\n * @summary DEM データプロバイダ\n * @classdesc\n *

レンダラーに DEM データを与えるための抽象クラスである。

\n *

以下の抽象メソッドは既定の動作がないので、利用者はこれらのメソッドをオーバライドした具象クラスを使用しなければならない。

\n *
    \n *
  • [requestTile()]{@link mapray.DemProvider#requestTile}
  • \n *
  • [cancelRequest()]{@link mapray.DemProvider#cancelRequest}
  • \n *
\n *

[getResolutionPower()]{@link mapray.DemProvider#getResolutionPower} の既定の実装は 8 を返す。DEM タイルの解像度が 256 以外のときはこのメソッドをオーバーロードする必要がある。

\n * @memberof mapray\n * @abstract\n * @protected\n * @see mapray.StandardDemProvider\n * @see mapray.Viewer\n */\nclass DemProvider {\n\n /**\n * @summary DEM タイルデータを要求\n * @desc\n *

座標が (z, x, y) の DEM タイルデータを要求する。

\n *

指定したタイルデータの取得が成功または失敗したときに callback が非同期に呼び出されなければならない。

\n *

だたし [cancelRequest()]{@link mapray.DemProvider#cancelRequest} により要求が取り消されたとき、callback は呼び出しても呼び出さなくてもよい。また非同期呼び出しである必要もない。

\n * @param {number} z ズームレベル\n * @param {number} x X タイル座標\n * @param {number} y Y タイル座標\n * @param {mapray.DemProvider.RequestCallback} callback 要求コールバック関数\n * @return {object} 要求 ID ([cancelRequest()]{@link mapray.DemProvider#cancelRequest} に与えるオブジェクト)\n * @abstract\n */\n requestTile( z, x, y, callback )\n {\n throw new Error( \"mapray.DemProvider#requestTile() method has not been overridden.\" );\n }\n\n\n /**\n * @summary DEM タイルデータの要求を取り消す\n *

[requestTile()]{@link mapray.DemProvider#requestTile} による要求を可能であれば取り消す。

\n * @param {object} id 要求 ID ([requestTile()]{@link mapray.DemProvider#requestTile} から得たオブジェクト)\n * @abstract\n */\n cancelRequest( id )\n {\n throw new Error( \"mapray.DemProvider#cancelRequest() method has not been overridden.\" );\n }\n\n\n /** \n * @summary 解像度の指数を取得\n * @desc\n *

DEM タイルデータ解像度の、2 を底とする対数を取得する。DEM タイルデータの解像度は必ず 2 のべき乗である。

\n *

制限: this が同じなら常に同じ値を返さなければならない。

\n * @return {number} 解像度指数\n * @abstract\n */\n getResolutionPower()\n {\n return 8;\n }\n\n}\n\n\n/**\n * @summary DEM タイルデータ要求コールバック関数型\n * @desc\n *

DEM タイルデータの取得に成功または失敗したときに呼び出される関数の型である。

\n *

この関数は [requestTile()]{@link mapray.DemProvider#requestTile} の callback 引数に与える。

\n *

データの取得に成功したときは、data に ArrayBuffer のインスタンス、失敗したときは null を与える。

\n *

ただし [cancelRequest()]{@link mapray.DemProvider#cancelRequest} により要求が取り消されたとき、コールバック関数の呼び出しは無視されるので data は任意の値でよい。

\n * @param {ArrayBuffer} data DEM タイルデータまたは null\n * @callback RequestCallback\n * @memberof mapray.DemProvider\n */\n\n\nexport default DemProvider;\n","import DemProvider from \"./DemProvider\";\nimport CredentialMode from \"./CredentialMode\";\n\n\n/**\n * @summary 標準 DEM プロバイダ\n * @classdesc\n *

汎用的な DEM プロバイダの実装である。

\n *

構築子の引数に prefix を与えた場合、各メソッドの動作は以下のようになる。\n *

\n *   requestTile( z, x, y ) -> URL が prefix + z + '/' + x + '/' + y + suffix のデータを要求\n * 
\n * @memberof mapray\n * @extends mapray.DemProvider\n */\nclass StandardDemProvider extends DemProvider {\n\n /**\n * @param {string} prefix URL の先頭文字列\n * @param {string} suffix URL の末尾文字列\n * @param {object} [options] オプション集合\n * @param {mapray.CredentialMode} [options.credentials=OMIT] クレデンシャルモード\n * @param {object} [options.headers={}] リクエストに追加するヘッダーの辞書\n */\n constructor( prefix, suffix, options )\n {\n super();\n\n var opts = options || {};\n\n this._prefix = prefix;\n this._suffix = suffix;\n this._credentials = (opts.credentials || CredentialMode.OMIT).credentials;\n this._headers = Object.assign( {}, opts.headers );\n }\n\n\n /**\n * @override\n */\n requestTile( z, x, y, callback )\n {\n var actrl = new AbortController();\n\n fetch( this._makeURL( z, x, y ), { credentials: this._credentials,\n headers: this._headers,\n signal: actrl.signal } )\n .then( response => {\n return response.ok ?\n response.arrayBuffer() : Promise.reject( Error( response.statusText ) );\n } )\n .then( buffer => {\n // データ取得に成功\n callback( buffer );\n } )\n .catch( () => {\n // データ取得に失敗または取り消し\n callback( null );\n } );\n\n return actrl;\n }\n\n\n /**\n * @override\n */\n cancelRequest( id )\n {\n var actrl = id; // 要求 ID を AbortController に変換\n actrl.abort(); // 取り消したので要求を中止\n }\n\n\n /**\n * URL を作成\n * @private\n */\n _makeURL( z, x, y )\n {\n return this._prefix + z + '/' + x + '/' + y + this._suffix;\n }\n\n}\n\n\nexport default StandardDemProvider;\n","import Layer from \"./Layer\";\nimport ImageProvider from \"./ImageProvider\";\n\n\n/**\n * @summary 地図レイヤー管理\n * @classdesc\n *

地図レイヤーを管理するオブジェクトである。

\n *

インスタンスは {@link mapray.Viewer#layers} から得ることができる。

\n *\n * @hideconstructor\n * @memberof mapray\n * @see mapray.Layer\n */\nclass LayerCollection {\n\n /**\n * @param {mapray.Viewer} viewer Viewer\n * @param {array} layers 初期化プロパティ配列\n */\n constructor( viewer, layers )\n {\n this._viewer = viewer;\n this._glenv = viewer._glenv;\n this._layers = [];\n this._draw_layers = null;\n\n // 初期レイヤーを追加\n for ( var i = 0; i < layers.length; ++i ) {\n this.add( layers[i] );\n }\n }\n\n\n /**\n * @summary Viewerを取得\n * @type {mapray.Viewer}\n * @readonly\n * @package\n */\n get viewer() { return this._viewer; }\n\n /**\n * @summary WebGL 環境を取得\n * @type {mapray.GLEnv}\n * @readonly\n * @package\n */\n get glenv() { return this._glenv; }\n\n\n /**\n * @summary レイヤー数\n * @type {number}\n * @readonly\n */\n get num_layers() { return this._layers.length; }\n\n\n /**\n * @summary レイヤーを取得\n *\n * @param {number} index レイヤーの場所\n * @return {mapray.Layer} レイヤー\n */\n getLayer( index )\n {\n return this._layers[index];\n }\n\n\n /**\n * @summary すべてのレイヤーを削除\n */\n clear()\n {\n while ( this.num_layers() > 0 ) {\n this.remove( 0 );\n }\n }\n\n\n /**\n * @summary レイヤーを末尾に追加\n *\n * @param {object|mapray.ImageProvider} layer レイヤーのプロパティ\n * @param {mapray.ImageProvider} layer.image_provider 画像プロバイダ\n * @param {boolean} [layer.visibility] 可視性フラグ\n * @param {number} [layer.opacity] 不透明度\n */\n add( layer )\n {\n this.insert( this.num_layers, layer );\n }\n\n\n /**\n * @summary レイヤーを末尾に追加\n *\n * @param {number} index 挿入場所\n * @param {object|mapray.ImageProvider} layer レイヤーのプロパティ\n * @param {mapray.ImageProvider} layer.image_provider 画像プロバイダ\n * @param {boolean} [layer.visibility] 可視性フラグ\n * @param {number} [layer.opacity] 不透明度\n */\n insert( index, layer )\n {\n this._layers.splice( index, 0, new Layer( this, layer ) );\n this.dirtyDrawingLayers();\n }\n\n\n /**\n * @summary 特定のレイヤーを削除\n *\n * @param {number} index 削除場所\n */\n remove( index )\n {\n this._layers.splice( index, 1 );\n this.dirtyDrawingLayers();\n }\n\n\n /**\n * @summary 描画レイヤー数を取得\n *\n * @return {number} 描画レイヤー数\n * @package\n */\n numDrawingLayers()\n {\n if ( this._draw_layers === null ) {\n this._updataDrawingLayers();\n }\n return this._draw_layers.length;\n }\n\n\n /**\n * @summary 描画レイヤーを取得\n *\n * @param {number} index レイヤーの場所\n * @return {mapray.Layer} レイヤー\n * @package\n */\n getDrawingLayer( index )\n {\n if ( this._draw_layers === null ) {\n this._updataDrawingLayers();\n }\n return this._draw_layers[index];\n }\n\n\n /**\n * @summary フレームの最後の処理\n * @package\n */\n endFrame()\n {\n var layers = this._layers;\n\n for ( var i = 0; i < layers.length; ++i ) {\n layers[i].tile_cache.endFrame();\n }\n }\n\n\n /**\n * @summary 取り消し処理\n * @package\n */\n cancel()\n {\n var layers = this._layers;\n\n for ( var i = 0; i < layers.length; ++i ) {\n layers[i].tile_cache.cancel();\n }\n }\n\n\n /**\n * @summary 描画レイヤー配列を無効化\n * @package\n */\n dirtyDrawingLayers()\n {\n this._draw_layers = null;\n }\n\n\n /**\n * @summary 描画レイヤー配列を更新\n * @private\n */\n _updataDrawingLayers()\n {\n var num_layers = this.num_layers;\n\n var draw_layers = [];\n for ( var i = 0; i < num_layers; ++i ) {\n var layer = this._layers[i];\n if ( layer.image_provider.status() === ImageProvider.Status.READY && layer.visibility === true ) {\n draw_layers.push( layer );\n }\n }\n\n this._draw_layers = draw_layers;\n }\n\n}\n\n\nexport default LayerCollection;\n","import PointCloud from \"./PointCloud\";\n\n\n\n/**\n * @summary PointCloudを管理するクラス\n * @see mapray.Viewer#point_cloud_collection\n * \n * @memberof mapray\n */\nclass PointCloudCollection {\n\n /**\n * @param {mapray.Scene} scene 所属するシーン\n */\n constructor( scene ) {\n this._scene = scene;\n this._items = [];\n }\n\n\n /**\n * @summary 点群オブジェクト数\n * @type {number}\n * @readonly\n */\n get length() { return this._items.length; }\n\n\n /**\n * @summary 点群オブジェクトを取得\n *\n * @param {number} index 番号\n * @return {mapray.PointCloud} 点群\n */\n get( index ) {\n return this._items[index];\n }\n\n\n /**\n * @summary 点群オブジェクトを追加\n *\n * @param {PointCloudProvider} item 点群プロバイダ\n * @return {mapray.PointCloud} 点群\n */\n add( item ) {\n return this.insert( this.length, item );\n }\n\n\n /**\n * @summary 点群オブジェクトを指定した位置に追加\n *\n * @param {number} index 番号\n * @param {PointCloudProvider} item 点群プロバイダ\n * @return {mapray.PointCloud} 点群\n */\n insert( index, item )\n {\n const point_cloud = new PointCloud( this._scene, item );\n this._items.splice( index, 0, point_cloud );\n point_cloud.init();\n return point_cloud;\n }\n\n\n /**\n * @summary 指定した位置の点群オブジェクトを削除\n *\n * @param {number} index 番号\n * @return {mapray.PointCloud} 削除された点群\n */\n removeByIndex( index ) {\n const removedItem = this._items.splice( index, 1 )[0];\n removedItem.destroy();\n return removedItem;\n }\n\n\n /**\n * @summary 指定した点群オブジェクトを削除\n *\n * @param {mapray.PointCloud} item 削除する点群\n */\n remove( item ) {\n const index = this._items.indexOf(item);\n if (index === -1) {\n throw new Error(\"Couldn't find item: \" + item);\n }\n this.removeByIndex(index);\n }\n}\n\nexport default PointCloudCollection\n","/**\n * @summary レンダリングコールバック\n * @classdesc\n *

レンダリングループでの各箇所で呼び出されるコールバック関数を実装するための抽象クラスである。

\n *

サブクラスでは以下のメソッドをオーバーライドすることができる。オーバーライドしないメソッドは何もしない。

\n *
    \n *
  • [onStart()]{@link mapray.RenderCallback#onStart}
  • \n *
  • [onUpdateFrame()]{@link mapray.RenderCallback#onUpdateFrame}
  • \n *
  • [onStop()]{@link mapray.RenderCallback#onStop}
  • \n *
\n * @memberof mapray\n * @protected\n * @abstract\n * @see mapray.Viewer\n */\nclass RenderCallback {\n\n constructor()\n {\n this._viewer = null;\n this._is_started_ = false;\n }\n\n\n /**\n * View に取り付ける\n * @package\n */\n attach( viewer )\n {\n if ( this._viewer ) {\n throw new Error( \"RenderCallback instance is already attached\" );\n }\n\n this._viewer = viewer;\n this._is_started_ = false;\n }\n\n\n /**\n * View から切り離す\n * すでに onStart() を呼び出してい場合、onStop() を呼び出す。\n * @package\n */\n detach()\n {\n if ( this._is_started_ ) {\n this.onStop();\n this._is_started_ = false;\n }\n this._viewer = null;\n }\n\n\n /**\n * フレーム onUpdateFrame() の呼び出し\n * 取り付けてから最初のフレームのときは onStart() を呼び出す。\n * @package\n */\n onUpdateFrameInner( delta_time )\n {\n if ( !this._is_started_ ) {\n this.onStart();\n this._is_started_ = true;\n }\n this.onUpdateFrame( delta_time );\n }\n\n\n /**\n * @summary 保有者 Viewer\n * @desc\n *

この RenderCallback インスタンスが設定されている Viewer インスタンスを示す。

\n *

ただし RenderCallback インスタンスがどの Viewer インスタンスにも設定されていない状態では null となる。

\n * @type {?mapray.Viewer}\n * @readonly\n */\n get viewer() { return this._viewer; }\n\n\n /**\n * @summary レンダリングループ開始の処理\n * @abstract\n */\n onStart() {}\n\n\n /**\n * @summary フレームレンダリング前の処理\n * @param {number} delta_time 前フレームからの経過時間 (秒)\n * @abstract\n */\n onUpdateFrame( delta_time ) {}\n\n\n /**\n * @summary レンダリングループ終了の処理\n * @abstract\n */\n onStop() {}\n\n}\n\n\nexport default RenderCallback;\n","import RenderCallback from \"./RenderCallback\";\n\n\n/**\n * @summary 無機能 RenderCallback\n * @desc\n *

Viewer に RenderCallback が設定されていないときに使用する内部クラスである。

\n * @memberof mapray\n * @extends mapray.RenderCallback\n * @private\n */\nclass NullRenderCallback extends RenderCallback {\n\n constructor() { super(); }\n\n}\n\n\nexport default NullRenderCallback;\n","import EasyBindingBlock from \"./animation/EasyBindingBlock\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary モデルシーン\n *\n * @classdesc\n *

表示するエンティティを管理するクラスである。

\n *

インスタンスは {@link mapray.Viewer#scene} から得ることができる。

\n *\n * @hideconstructor\n * @memberof mapray\n * @see mapray.SceneLoader\n */\nclass Scene {\n\n /**\n * @param {mapray.Viewer} viewer Viewer インスタンス (未構築)\n * @param {mapray.GLEnv} glenv GLEnv インスタンス\n */\n constructor( viewer, glenv )\n {\n this._viewer = viewer;\n this._glenv = glenv;\n this._enode_list = []; // ENode のリスト\n this._loaders = []; // 現在読み込み中の SceneLoader (取り消し用)\n\n // animation.BindingBlock\n this._animation = new EasyBindingBlock();\n this._animation.addDescendantUnbinder( () => { this._unbindDescendantAnimations(); } );\n }\n\n\n /**\n * WebGL レンダリングコンテキスト情報\n * @type {mapray.GLEnv}\n * @readonly\n * @package\n */\n get glenv() { return this._glenv; }\n\n\n /**\n * this を保有する親オブジェクト\n * @type {mapray.Viewer}\n * @readonly\n */\n get viewer() { return this._viewer; }\n\n\n /**\n * @summary アニメーションパラメータ設定\n *\n * @type {mapray.animation.BindingBlock}\n * @readonly\n */\n get animation() { return this._animation; }\n\n\n /**\n * エンティティ数\n * @type {number}\n * @readonly\n */\n get num_entities() { return this._enode_list.length; }\n\n\n /**\n * @summary すべてのエンティティを削除\n */\n clearEntities()\n {\n this._enode_list = [];\n }\n\n\n /**\n * @summary エンティティを末尾に追加\n * @param {mapray.Entity} entity エンティティ\n */\n addEntity( entity )\n {\n if ( entity.scene !== this ) {\n throw new Error( \"invalid entity\" );\n }\n this._enode_list.push( new ENode( entity ) );\n }\n\n\n /**\n * @summary エンティティを削除\n * @param {mapray.Entity} entity エンティティ\n */\n removeEntity( entity )\n {\n var array = this._enode_list;\n\n for ( var i = 0; i < array.length; ++i ) {\n if ( array[i].entity === entity ) {\n array.splice( i, 1 );\n break;\n }\n }\n }\n\n\n /**\n * @summary エンティティを取得\n * @param {number} index インデックス\n * @return {mapray.Entity} エンティティ\n */\n getEntity( index )\n {\n return this._enode_list[index].entity;\n }\n\n\n /**\n * @summary シーンを描画\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @package\n */\n draw( stage )\n {\n this._prepare_entities();\n\n // プリミティブの配列を生成\n var op_prims = []; // 不透明プリミティブ\n var tp_prims = []; // 半透明プリミティブ\n var ac_prims = []; // アンカープリミティブ\n\n for ( let {entity} of this._enode_list ) {\n if ( !entity.visibility ) continue;\n this._add_primitives( stage, entity, op_prims, tp_prims, ac_prims );\n }\n\n // プリミティブ配列を整列してから描画\n this._draw_opaque_primitives( stage, op_prims );\n this._draw_translucent_primitives( stage, tp_prims );\n this._draw_anchor_primitives( stage, ac_prims );\n }\n\n\n /**\n * @summary 描画前のエンティティの準備\n * @private\n */\n _prepare_entities()\n {\n var dem_area_updated = this._viewer.globe.dem_area_updated;\n\n for ( let enode of this._enode_list ) {\n let producer = enode.entity.getPrimitiveProducer();\n\n if ( (producer === null) || !producer.needsElevation() ) {\n // producer が存在しないとき、または\n // producer が標高を必要としないときは何もしない\n continue;\n }\n\n if ( producer.checkToCreateRegions() || enode.regions === null ) {\n // 領域情報が分からない、または領域情報が変化した可能性があるとき\n enode.regions = producer.createRegions();\n if ( enode.regions.length > 0 ) {\n enode.regions.forEach( region => { region.compile(); } );\n producer.onChangeElevation( enode.regions );\n }\n }\n else {\n if ( dem_area_updated.isEmpty() ) {\n // 更新された DEM 領域は存在しない\n // 標高の変化はないので以下の処理を省く\n continue;\n }\n\n var regions = []; // 標高に変化があった領域\n\n enode.regions.forEach( region => {\n if ( region.intersectsWith( dem_area_updated ) ) {\n // 領域の標高に変化があった\n regions.push( region );\n }\n } );\n\n if ( regions.length > 0 ) {\n // 標高が変化した可能性がある領域を通知\n producer.onChangeElevation( regions );\n }\n }\n }\n }\n\n\n /**\n * 視体積に含まれるプリミティブを追加\n * @private\n */\n _add_primitives( stage, entity, op_prims, tp_prims, ac_prims )\n {\n let producer = entity.getPrimitiveProducer();\n if ( producer === null ) return;\n\n for ( let primitive of producer.getPrimitives( stage ) ) {\n if ( primitive.isVisible( stage ) ) {\n let dst_prims = (\n entity.anchor_mode ? ac_prims :\n primitive.isTranslucent( stage ) ? tp_prims :\n op_prims\n );\n stage.onPushPrimitive( primitive, entity );\n dst_prims.push( primitive );\n }\n }\n }\n\n\n /**\n * 不透明プリミティブを整列してから描画\n * @private\n */\n _draw_opaque_primitives( stage, primitives )\n {\n // 不透明プリミティブの整列: 近接 -> 遠方 (Z 降順)\n primitives.sort( function( a, b ) { return b.sort_z - a.sort_z; } );\n\n var gl = this._glenv.context;\n gl.disable( gl.BLEND );\n gl.depthMask( true );\n\n for ( var i = 0; i < primitives.length; ++i ) {\n primitives[i].draw( stage );\n }\n }\n\n\n /**\n * 半透明プリミティブを整列してから描画\n * @private\n */\n _draw_translucent_primitives( stage, primitives )\n {\n // 半透明プリミティブの整列: 遠方 -> 近接 (Z 昇順)\n primitives.sort( function( a, b ) { return a.sort_z - b.sort_z; } );\n\n var gl = this._glenv.context;\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n gl.enable( gl.BLEND );\n }\n else {\n gl.disable( gl.BLEND );\n }\n\n gl.depthMask( false );\n\n for ( var i = 0; i < primitives.length; ++i ) {\n primitives[i].draw( stage );\n }\n\n gl.disable( gl.BLEND );\n gl.depthMask( true );\n }\n\n\n /**\n * @summary アンカープリミティブを整列してから描画。\n *

{@link mapray.AbstractRenderStage#getRenderTarget} が {@link mapray.AbstractRenderStage.RenderTarget.SCENE} の場合は、\n * 隠面処理で隠れてえしまう部分は半透明で描画し、それ以外の部分は通常の描画を行う。結果的にアンカーオブジェクトが隠面において重なった場合は色が混ざった表示となる

\n *

{@link mapray.AbstractRenderStage#getRenderTarget} が {@link mapray.AbstractRenderStage.RenderTarget.RID} の場合は、\n * 隠面処理で隠れてえしまう部分は強制的に描画し、それ以外の部分は通常の描画を行う。結果的にアンカーオブジェクトが隠面において重なった場合はzソートした順番でRIDが上書きされる

\n * @see {@link mapray.Entity#anchor_mode}\n * @private\n */\n _draw_anchor_primitives( stage, primitives )\n {\n // 不透明プリミティブの整列: 近接 -> 遠方 (Z 降順)\n primitives.sort( function( a, b ) { return b.sort_z - a.sort_z; } );\n\n var gl = this._glenv.context;\n gl.disable( gl.DEPTH_TEST );\n gl.depthMask( false );\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n stage.setTranslucentMode( true );\n gl.enable( gl.BLEND );\n }\n else {\n gl.disable( gl.BLEND );\n }\n\n // 遠方 -> 近接 (Z 昇順)\n for ( var i = primitives.length-1; i >= 0; --i ) {\n primitives[i].draw( stage );\n }\n\n gl.depthMask( true );\n gl.enable( gl.DEPTH_TEST );\n\n stage.setTranslucentMode( false );\n // 近接 -> 遠方 (Z 降順)\n for ( var i = 0; i < primitives.length; ++i ) {\n primitives[i].draw( stage );\n }\n\n gl.disable( gl.BLEND );\n }\n\n\n /**\n * すべての SceneLoader の読み込みを取り消す\n * @package\n */\n cancelLoaders()\n {\n var loaders = this._loaders.concat(); // 複製\n\n for ( var i = 0; i < loaders.length; ++i ) {\n loaders[i].cancel();\n }\n }\n\n\n /**\n * 読み込み中の SceneLoader を登録\n * @param {mapray.SceneLoader} loader 登録するローダー\n * @package\n */\n addLoader( loader )\n {\n this._loaders.push( loader );\n }\n\n\n /**\n * 読み込み中の SceneLoader を削除\n * @param {mapray.SceneLoader} loader 削除するローダー\n * @package\n */\n removeLoader( loader )\n {\n var index = this._loaders.indexOf( loader );\n if ( index >= 0 ) {\n this._loaders.splice( index, 1 );\n }\n }\n\n\n /**\n * @summary FlakePrimitiveProducer の反復可能オブジェクトを取得\n *\n * @return {iterable.}\n *\n * @package\n */\n getFlakePrimitiveProducers()\n {\n let producers = [];\n\n for ( let {entity} of this._enode_list ) {\n if ( !entity.visibility ) continue;\n let prod = entity.getFlakePrimitiveProducer();\n if ( prod !== null ) {\n producers.push( prod );\n }\n }\n\n return producers;\n }\n\n\n /**\n * EasyBindingBlock.DescendantUnbinder 処理\n *\n * @private\n */\n _unbindDescendantAnimations()\n {\n // すべてのエンティティを解除\n for ( let {entity} of this._enode_list ) {\n entity.animation.unbindAllRecursively();\n }\n }\n\n}\n\n\n/**\n * エンティティ管理用ノード\n *\n * @memberof mapray.Scene\n * @private\n */\nclass ENode {\n\n /**\n * @param {mapray.Entity} entity 管理対象のエンティティ\n */\n constructor( entity )\n {\n /**\n * @summary 管理対象のエンティティ\n * @member mapray.Scene.ENode#entity\n * @type {mapray.Entity}\n * @readonly\n */\n this.entity = entity;\n\n this.regions = null;\n }\n\n}\n\n\nexport default Scene;\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar quot = /\"/g;\n\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\n// https://tc39.github.io/ecma262/#sec-createhtml\nmodule.exports = function (string, tag, attribute, value) {\n var S = String(requireObjectCoercible(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\n","var fails = require('../internals/fails');\n\n// check the existence of a method, lowercase\n// of a tag and escaping quotes in arguments\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n var test = ''[METHOD_NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.link` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.link\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, {\n link: function link(url) {\n return createHTML(this, 'a', 'href', url);\n }\n});\n","var $ = require('../internals/export');\nvar lastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: lastIndexOf\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","/**\n * @private\n */\nclass HTTP {\n\n static async get( url, query, option={} )\n {\n return await this.fetch( HTTP.METHOD.GET, url, query, null, option );\n }\n\n static async post( url, query, body, option={} )\n {\n return await this.fetch( HTTP.METHOD.POST, url, query, body, option );\n }\n\n static async patch( url, query, body, option={} )\n {\n return await this.fetch( HTTP.METHOD.PATCH, url, query, body, option );\n }\n\n static async put( url, query, body, option={} )\n {\n return await this.fetch( HTTP.METHOD.PUT, url, query, body, option );\n }\n\n static async delete( url, query, option={} )\n {\n return await this.fetch( HTTP.METHOD.DELETE, url, query, null, option );\n }\n\n /**\n * @summary call fetch\n *\n *
\n     * query = {\n     *     key1: value1,\n     *     key2: value2,\n     * };\n     * URL: url?key1=value1&key2=value2\n     * 
\n * window.fetch();\n *\n * @private\n * @param {string} method\n * @param {string} url\n * @param {object} query\n * @param {object|string} body\n * @param {object} [option] second argument of window.fetch(url, [init]).\n */\n static async fetch( method, url, query, body, option={} )\n {\n const queryText = !query ? \"\" : \"?\" + Object.keys( query ).map( k => k + \"=\" + query[k] ).join(\"&\");\n option.method = method;\n if (body) option.body = typeof(body) === \"object\" ? JSON.stringify(body) : body;\n\n let response;\n try {\n response = await fetch( url + queryText, option );\n }\n catch( error ) {\n throw new FetchError( \"Failed to fetch\", url, null, error );\n }\n if ( !response.ok ) {\n throw new FetchError( \"Failed to fetch: \" + response.statusText, url, response );\n }\n return response;\n }\n\n static isJson( mimeType ) {\n return (\n mimeType.startsWith( \"application/json\" ) ||\n mimeType === \"model/gltf+json\"\n );\n }\n}\n\nHTTP.METHOD = {\n GET: \"GET\",\n POST: \"POST\",\n PATCH: \"PATCH\",\n PUT: \"PUT\",\n DELETE: \"DELETE\",\n};\n\nHTTP.CONTENT_TYPE = \"Content-Type\";\n\nHTTP.RESPONSE_STATUS = {\n NO_CONTENT: 204\n};\n\n\n/**\n * @private\n */\nclass FetchError extends Error {\n constructor( message, url, response, cause )\n {\n super( message + \" \" + url );\n if ( Error.captureStackTrace ) {\n Error.captureStackTrace( this, FetchError );\n }\n this.name = \"FetchError\";\n this.url = url;\n this.response = response;\n this.cause = cause;\n let is_aborted = false;\n if ( cause ) {\n is_aborted = cause.message === \"The user aborted a request.\";\n this.stack += \"\\nCaused-By: \" + ( cause.stack || cause );\n }\n this.is_aborted = is_aborted;\n }\n}\n\nexport { FetchError };\nexport default HTTP;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.appent` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+\\-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","import CredentialMode from \"../CredentialMode\";\n\nconst DATA_URL_PATTERN = new RegExp(\"^data:\");\nconst ABSOLUTE_URL_PATTERN = new RegExp(\"^https?://\");\n\n\n/**\n * @summary Utility Class for DOM\n * @private\n * @memberof mapray\n */\nclass Dom {\n\n /**\n * @param {number} width\n * @param {number} height\n * @return {CanvasRenderingContext2D}\n */\n static createCanvasContext( width, height )\n {\n var canvas = document.createElement( \"canvas\" );\n canvas.width = width;\n canvas.height = height;\n return canvas.getContext( \"2d\" );\n }\n\n /**\n * @summary 画像を読み込みます。\n * @param {string|Blob} src\n * @Param {object} options\n * @param {mapray.CredentialMode} [options.credentials=mapray.CredentialMode.SAME_ORIGIN]\n */\n static async loadImage( src, options={} )\n {\n return await new Promise( (resolve, reject) => {\n const image = new Image();\n image.onload = event => resolve( event.target );\n image.onerror = event => reject( new Error(\"Failed to load image\") );\n if ( options.credentials !== CredentialMode.OMIT ) {\n image.crossOrigin = (\n options.credentials === CredentialMode.INCLUDE ? \"use-credentials\" : \"anonymous\"\n );\n }\n image.src = src instanceof Blob ? URL.createObjectURL( src ) : src;\n } );\n }\n\n /**\n * @summary 画像が読み込まれるまで待ちます。\n * @param {HTMLImageElement} image\n */\n static async waitForLoad( image )\n {\n if ( !image.src ) throw new Error( \"src was not set\" );\n if ( image.complete ) return image;\n\n return await new Promise( (resolve, reject) => {\n const prevOnLoad = image.onload;\n const prevOnError = image.onerror;\n image.onload = event => {\n if ( prevOnLoad ) prevOnLoad( event );\n resolve( event.target );\n };\n image.onerror = event => {\n if ( prevOnError ) prevOnError( event );\n reject( new Error(\"Failed to load image\") );\n };\n } );\n }\n\n static resolveUrl( baseUrl, url ) {\n if ( DATA_URL_PATTERN.test( url ) || ABSOLUTE_URL_PATTERN.test( url ) ) {\n // url がデータ url または絶対 url のときは\n // そのまま url をリクエスト\n return url;\n }\n else {\n // それ以外のときは url を相対 url と解釈し\n // 基底 url と結合した url をリクエスト\n return baseUrl + url;\n }\n }\n\n}\n\n\nDom.SYSTEM_FONT_FAMILY = \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'\";\n\n\nexport default Dom;\n","import HTTP from \"./HTTP\";\nimport Dom from \"./util/Dom\";\nimport CredentialMode from \"./CredentialMode\";\n\n\n\n/**\n * @classdesc リソースクラス\n * URLやDB、クラウドサービス等、各種リソースへのアクセスを同一インターフェースで提供することを目的とした抽象クラスです。\n * 基本機能:\n * ・コンストラクタ等によりあらかじめURLやデータの位置を示すプロパティを設定\n * ・load()によりリソースを読み込む\n * ・loadSubResource()によりサブリソースを読み込む\n *\n * @memberof mapray\n */\nclass Resource {\n\n /**\n * リソースを読み込みます。\n */\n async load( options={} ) {\n throw new Error( \"Not Implemented\" );\n }\n\n /**\n * @summary リソースの読み込みをキャンセルできる場合はキャンセルします。\n */\n cancel() {\n }\n\n /**\n * @summary サブリソースをサポートするかを返します。\n * @return {boolean}\n */\n loadSubResourceSupported() {\n return false;\n }\n\n /**\n * @summary サブリソースを読み込みます。\n * @param {string} url URL\n * @param {object} options\n * @param {mapray.Resource.ResourceType} [options.type] 返却するタイプを指定します。\n * @return {object} options.type に応じた型で返却されます。\n */\n async loadSubResource( url, options={} ) {\n throw new Error( \"Not Supported\" );\n }\n\n /**\n * @summary 関連リソースをサポートするかを返します。\n * @return {boolean}\n */\n resolveResourceSupported() {\n return false;\n }\n\n /**\n * @summary 関連リソースを読み込みます。\n * @return {boolean}\n */\n async resolveResource( url ) {\n throw new Error( \"Not Supported\" );\n }\n\n /**\n * @summary リソース型\n */\n static get ResourceType() { return ResourceType; }\n}\n\n\n\n/**\n * @summary リソースの種類\n * @enum {object}\n * @memberof mapray.ResourceType\n * @constant\n */\nconst ResourceType = {\n\n /**\n * JSON\n */\n JSON: { id: \"JSON\" },\n\n /**\n * バイナリ(ArrayBuffer)\n */\n BINARY: { id: \"BINARY\" },\n\n /**\n * 画像(Image)\n */\n IMAGE: { id: \"IMAGE\" }\n\n};\n\n\n\n/**\n * @classdesc URLリソースです。\n */\nclass URLResource extends Resource {\n\n /**\n * @param {string} url\n * @param {object} [options]\n * @param {mapray.Resource.ResourceType} [options.type]\n * @param {mapray.Transform} [options.transform]\n */\n constructor( url, options={} ) {\n super();\n this._url = url;\n const index = url.lastIndexOf( '/' );\n if ( index === -1 ) throw new Error( \"invalid url\" );\n this._base_url = this._url.substr( 0, index + 1 );\n this._type = options.type || \"json\";\n this._transform = options.transform || defaultTransformCallback;\n this._abort_ctrl = new AbortController();\n }\n\n /**\n * @summary リソースのurl\n * @type {string}\n */\n get url() {\n return this._url;\n }\n\n /**\n * @summary このリソースを読み込みます。\n * @param {object} [options]\n */\n async load( options={} ) {\n return await this._loadURLResource( this._url, options.type || this._type, options );\n }\n\n /**\n * @summary リソースの読み込みをキャンセルします。\n */\n cancel() {\n this._abort_ctrl.abort();\n }\n\n /**\n * @summary このクラスでのデフォルト実装では、trueを返却します。\n * @return {boolean}\n */\n loadSubResourceSupported() {\n return true;\n }\n\n /**\n * @summary サブリソースを読み込みます。\n * @param {string} subUrl URL\n * @param {object} options\n * @param {mapray.Resource.ResourceType} [options.type] 返却するタイプを指定します。\n * @return {object} options.type に応じた型で返却されます。\n */\n async loadSubResource( subUrl, options={} ) {\n return await this._loadURLResource( Dom.resolveUrl( this._base_url, subUrl ), options.type, options );\n }\n\n /**\n * @summary 関連リソースをサポートするかを返します。\n * @return {boolean}\n */\n resolveResourceSupported() {\n return true;\n }\n\n /**\n * @summary 関連リソースを読み込みます。\n * @param {string} url \n * @return {Resource}\n */\n resolveResource( sub_url ) {\n const url = Dom.resolveUrl( this._base_url, sub_url );\n return new URLResource( url, {\n transform: this._transform\n });\n }\n\n\n /**\n * @param {string} url\n * @param {mapray.Resource.ResourceType} [type]\n * @private\n */\n async _loadURLResource( url, type, options={} ) {\n const tr = this._transform( url, type );\n if ( type === ResourceType.IMAGE ) {\n return await Dom.loadImage( tr.url, tr );\n }\n const http_option = this._make_fetch_params( tr ) || {};\n if ( options.signal ) http_option.signal = options.signal;\n\n const response = await HTTP.get( tr.url, null, http_option );\n if ( !response.ok ) throw new Error( response.statusText );\n\n return (\n type === ResourceType.JSON ? await response.json():\n type === ResourceType.BINARY ? await response.arrayBuffer():\n response\n );\n }\n\n /**\n * fetch() の init 引数に与えるオブジェクトを生成\n * @private\n */\n _make_fetch_params( tr ) {\n var init = {\n signal: this._abort_ctrl.signal,\n credentials: (tr.credentials || CredentialMode.OMIT).credentials\n };\n\n if ( tr.headers ) {\n init.headers = tr.headers;\n }\n\n return init;\n }\n}\n\n\n\nfunction defaultTransformCallback( url, type ) {\n return { url: url };\n}\n\n\n\nexport { URLResource, ResourceType };\nexport default Resource;\n","import Resource, { URLResource } from \"./Resource\";\n\n\n/**\n * @summary ローダークラス\n * @memberof mapray\n */\nclass Loader {\n\n /**\n * @param {mapray.Scene} scene 読み込み先のシーン\n * @param {mapray.Resource} resource \n * @param {object} [options={}]\n * @param {object} [options.onLoad] 全ての読み込み完了時に呼ばれる\n * @param {mapray.Loader.EntityCallback} [options.onEntity] エンティティが読み込まれるたびに呼ばれる\n */\n constructor( scene, resource, options={} ) {\n this._scene = scene;\n if (!(resource instanceof Resource)) {\n throw new Error(\"Unsupported Resource Type: \" + resource);\n }\n this._resource = resource;\n this._status = Loader.Status.NOT_LOADED;\n this._onLoad = options.onLoad || defaultOnLoadCallback;\n this._onEntity = options.onEntity || defaultOnEntityCallback;\n }\n\n\n /**\n * @summary 読み込み先のシーン\n * @type {mapray.Scene}\n * @readonly\n */\n get scene() { return this._scene; }\n\n\n /**\n * @summary シーンリソース\n * @type {string}\n * @readonly\n */\n get resource() { return this._resource; }\n\n\n /**\n * ローダー読み込みの状態\n * @readonly\n */\n get status() { return this._status; }\n\n\n /**\n * @private\n */\n _setStatus( status ) {\n this._status = status;\n }\n\n\n /**\n * @summary 読み込みを実行します。\n * @returns {Promise}\n */\n load()\n {\n if ( this.status !== Loader.Status.NOT_LOADED ) {\n return Promise.reject( new Error( \"Illegal Status: \" + this.status ) );\n }\n\n return (\n Promise.resolve()\n .then( () => {\n this._setStatus( Loader.Status.LOADING );\n this.scene.addLoader( this );\n return this._load();\n } )\n .catch( error => {\n // JSON データの取得に失敗 (キャンセルによる失敗の可能性あり)\n console.log( error );\n this._scene.removeLoader( this );\n this._onLoad( this, false );\n if ( this._status !== Loader.Status.CANCELED ) {\n this._setStatus( Loader.Status.ABORTED );\n }\n throw error;\n } )\n .then( value => {\n this._scene.removeLoader( this );\n if ( this._status === Loader.Status.CANCELED ) {\n this._onLoad( this, false );\n throw new Error( \"canceled\" );\n }\n else {\n this._setStatus( Loader.Status.LOADED );\n this._onLoad( this, true );\n return value;\n }\n } )\n );\n }\n\n\n /**\n * @summary 読み込み処理の実態。継承クラスによって実装される。\n * @private\n */\n _load() {\n throw new Error( \"_load() is not implemented in \" + this.constructor.name );\n }\n\n\n /**\n * @summary 読み込みの取り消し\n * @desc\n *

終了コールバック関数は isSuccess == false で呼び出される。

\n */\n cancel()\n {\n if ( this._status === Loader.Status.LOADING || this._status === Loader.Status.LOADED ) {\n this._setStatus( Loader.Status.CANCELED );\n this._resource.cancel();\n this._cancel();\n // this._scene.removeLoader( this );\n // this._onLoad( this, false );\n }\n }\n\n\n /**\n * @summary キャンセル時に行う処理。継承クラスによって実装される。\n * @private\n */\n _cancel()\n {\n }\n\n\n /**\n * 取り消し状態のとき例外を投げる\n * @private\n */\n _check_cancel()\n {\n if ( this.status === Loader.Status.CANCELED ) {\n throw new Error( \"canceled\" );\n }\n }\n}\n\n\n/**\n * @summary Entity読み込みコールバック\n * @callback EntityCallback\n * @desc\n *

読み込み処理の中でEntityが生成される際に呼ばれる。\n * 一度の読み込み(load()呼び出し)において複数のエンティティが生成される場合は、エンティティが生成されるたびに呼ばれる。\n * この関数をLoaderに指定する場合は、callback処理の中でEntityをsceneへ追加する必要がある。\n * geojsonのように、要素ごとにプロパティを含められるような場合は、propにより値にアクセスする。\n *

\n *\n * @param {mapray.Loader} loader Loader\n * @param {mapray.Entity} entity 読み込まれたEntity\n * @param {object} prop エンティティ生成の元となるオブジェクト\n *\n * @example\n * const loader = new mapray.SceneLoader( viewer.scene, resource, {\n * onEntity: ( loader, entity, prop ) => {\n * entity.setScale( [ 2, 2, 2 ] );\n * loader.scene.addEntity( entity );\n * }\n * } );\n * loader.load();\n * \n * @memberof mapray.Loader\n */\n\n\n\nLoader.Status = {\n NOT_LOADED : \"Not Loaded\",\n LOADING : \"Loading\",\n LOADED : \"Loaded\",\n CANCELED : \"Canceled\",\n ERROR : \"ERROR\"\n};\n\nfunction defaultOnLoadCallback( loader, isSuccess )\n{\n}\n\nfunction defaultOnEntityCallback( loader, entity )\n{\n loader.scene.addEntity( entity );\n}\n\n\n/**\n * @summary リソース要求変換関数\n * @callback TransformCallback\n * @desc\n *

リソースのリクエスト時に URL などを変換する関数の型である。

\n *\n * @param {string} url 変換前のリソース URL\n * @param {mapray.Resource.ResourceType} type リソースの種類\n * @return {mapray.Loader.TransformResult} 変換結果を表すオブジェクト\n *\n * @example\n * function( url, type ) {\n * return {\n * url: url,\n * credentials: mapray.CredentialMode.SAME_ORIGIN,\n * headers: {\n * 'Header-Name': 'Header-Value'\n * }\n * };\n * }\n *\n * @memberof mapray.Loader\n */\n\n\n/**\n * @summary リソース要求変換関数の変換結果\n * @typedef {object} TransformResult\n * @desc\n *

関数型 {@link mapray.Loader.TransformCallback} の戻り値のオブジェクト構造である。

\n * @property {string} url 変換後のリソース URL\n * @property {mapray.CredentialMode} [credentials=SAME_ORIGIN] クレデンシャルモード\n * @property {object} [headers={}] リクエストに追加するヘッダーの辞書 (キーがヘッダー名、値がヘッダー値)\n * @memberof mapray.Loader\n */\n\n\nexport default Loader;\n","// このようにする理由は GeoMath.js の最後を参照\nimport { Orientation } from \"./GeoMath\";\nexport default Orientation;\n","/**\n * @summary glTF オブジェクトの共通データ\n *\n * @classdesc\n *

多くの glTF オブジェクトに共通に存在する、次のプロパティの値を取得する。

\n *

\n *   - name\n *   - extensions\n *   - extras\n * 
\n *\n * @memberof mapray.gltf\n * @private\n */\nclass CommonData {\n\n /**\n * @param {object} json JSON オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n */\n constructor( json, ctx )\n {\n // specification/2.0/schema/glTFChildOfRootProperty.schema.json\n\n this._name = json.name || null;\n this._extensions = ctx.extractUsedExtensions( json.extensions || {} );\n this._extras = json.extras || {};\n }\n\n\n /**\n * @summary オブジェクト名を取得\n *\n * @return {?string} オブジェクト名\n */\n getName()\n {\n return this._name;\n }\n\n\n /**\n * @summary 拡張機能固有オブジェクトを取得\n *\n * @param {string} id 拡張機能の識別子\n *\n * @return {?object} 拡張機能固有オブジェクト\n */\n getExtensions( id )\n {\n const extension = this._extensions[id];\n\n return (extension !== undefined) ? extension : null;\n }\n\n\n /**\n * @summary アプリケーション固有データを取得\n *\n * @param {string} id アプリケーション固有データの識別子\n *\n * @return {?object} アプリケーション固有データ\n */\n getExtras( id )\n {\n const extra = this._extras[id];\n\n return (extra !== undefined) ? extra : null;\n }\n\n}\n\n\nexport default CommonData;\n","import CommonData from \"./CommonData\";\n\n\n/**\n * 読み込んだ glTF データの内容\n *\n * @memberof mapray.gltf\n * @private\n */\nclass Content {\n\n /**\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {mapray.gltf.Scene[]} scenes シーンの配列\n * @param {number} default_scene_index 既定シーンの索引 (既定シーンがないときは -1)\n */\n constructor( ctx, scenes, default_scene_index )\n {\n this._commonData = new CommonData( ctx.gjson, ctx );\n\n this._scenes = scenes;\n this._default_scene_index = default_scene_index;\n }\n\n\n /**\n * glTF オブジェクトの共通データ\n *\n * @type {mapray.gltf.CommonData}\n * @readonly\n */\n get commonData() { return this._commonData; }\n\n\n /**\n * @summary シーンの配列\n *\n * @type {mapray.gltf.Scene[]}\n * @readonly\n */\n get scenes()\n {\n return this._scenes;\n }\n\n\n /**\n * @summary 既定シーンの索引\n *\n *

既定シーンの索引を返す。ただし既定シーンがないときは -1 を返す。

\n *\n * @type {number}\n * @readonly\n */\n get default_scene_index()\n {\n return this._default_scene_index;\n }\n\n}\n\n\nexport default Content;\n","/**\n * @summary モデルテクスチャ\n * @memberof mapray\n * @package\n */\nclass Texture {\n\n /**\n *

オプション mag_filter, min_filter, wrap_s, wrap_t は WebGL の定数と同じ値を指定する。\n * これらのうち、指定がなかったオプションは usage オプションにより決定される。

\n *\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {?(HTMLImageElement|HTMLCanvasElement)} image 元画像 (usage=COLOR のときは null)\n * @param {object} [options] オプション集合\n * @param {mapray.Texture.Usage} [options.usage=GENERAL] テクスチャ用途\n * @param {number} [options.mag_filter] 拡大フィルタ (NEAREST | LINEAR)\n * @param {number} [options.min_filter] 縮小フィルタ (NEAREST | LINEAR | NEAREST_MIPMAP_NEAREST |\n * LINEAR_MIPMAP_NEAREST | NEAREST_MIPMAP_LINEAR | LINEAR_MIPMAP_LINEAR)\n * @param {number} [options.wrap_s] S Wrap (CLAMP_TO_EDGE | MIRRORED_REPEAT | REPEAT)\n * @param {number} [options.wrap_t] T Wrap (CLAMP_TO_EDGE | MIRRORED_REPEAT | REPEAT)\n * @param {boolean} [options.flip_y=true] 画像読み込み時に上下を反転するか?\n * @param {mapray.Vector4} [options.color=[1,1,1,1]] usage=COLOR のときの色指定\n */\n constructor( glenv, image, options )\n {\n var opts = options || {};\n this._glenv = glenv;\n this._handle = this._createTexture( image, opts );\n }\n\n\n /**\n * @summary テクスチャのハンドル\n * @type {WebGLTexture}\n * @readonly\n */\n get handle() { return this._handle; }\n\n\n /**\n * @summary リソースを破棄\n */\n dispose()\n {\n var gl = this._glenv.context;\n gl.deleteTexture( this._handle );\n this._handle = null;\n }\n\n\n /**\n * WebGL テクスチャオブジェクトを生成\n *\n * @param {?(HTMLImageElement|HTMLCanvasElement)} image 元画像\n * @param {object} opts オプション集合\n * @return {WebGLTexture} WebGL テクスチャオブジェクト\n * @private\n */\n _createTexture( image, opts )\n {\n var gl = this._glenv.context;\n var target = gl.TEXTURE_2D;\n var texture = gl.createTexture();\n var params = Texture._getParameters( gl, opts );\n\n gl.bindTexture( target, texture );\n\n var flip_y = (opts.flip_y !== undefined) ? opts.flip_y : true;\n gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, flip_y );\n\n if ( opts.usage === Texture.Usage.COLOR ) {\n // 均一色テクスチャー\n gl.texImage2D( target, 0, params.format, 1, 1, 0, params.format, params.type,\n Texture._getColorArray( opts ) );\n }\n else {\n // 画像テクスチャー\n gl.texImage2D( target, 0, params.format, params.format, params.type, image );\n }\n\n if ( flip_y ) {\n gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, false );\n }\n\n if ( Texture._generateMipmapQ( gl, params ) ) {\n gl.generateMipmap( target );\n }\n\n gl.texParameteri( target, gl.TEXTURE_MAG_FILTER, params.mag_filter );\n gl.texParameteri( target, gl.TEXTURE_MIN_FILTER, params.min_filter );\n gl.texParameteri( target, gl.TEXTURE_WRAP_S, params.wrap_s );\n gl.texParameteri( target, gl.TEXTURE_WRAP_T, params.wrap_t );\n\n gl.bindTexture( target, null );\n\n return texture;\n }\n\n\n /**\n * テクスチャの生成パラメータを取得\n *\n * @param {WebGLRenderingContext} gl WebGL コンテキスト\n * @param {object} opts オプション集合\n * @return {object} 生成パラメータ\n * @private\n */\n static\n _getParameters( gl, opts )\n {\n var params = {\n format: gl.RGBA,\n type: gl.UNSIGNED_BYTE,\n mag_filter: gl.LINEAR,\n min_filter: gl.LINEAR_MIPMAP_LINEAR,\n wrap_s: gl.REPEAT,\n wrap_t: gl.REPEAT\n };\n\n if ( opts.usage === Texture.Usage.SIMPLETEXT ) {\n params.format = gl.ALPHA;\n params.min_filter = gl.LINEAR;\n params.wrap_s = gl.CLAMP_TO_EDGE;\n params.wrap_t = gl.CLAMP_TO_EDGE;\n } \n else if ( opts.usage === Texture.Usage.TEXT) {\n params.min_filter = gl.LINEAR;\n params.wrap_s = gl.CLAMP_TO_EDGE;\n params.wrap_t = gl.CLAMP_TO_EDGE;\n } \n else if ( opts.usage === Texture.Usage.COLOR ) {\n params.mag_filter = gl.NEAREST;\n params.min_filter = gl.NEAREST;\n }\n else if ( opts.usage === Texture.Usage.ICON ) {\n params.min_filter = gl.LINEAR;\n params.wrap_s = gl.CLAMP_TO_EDGE;\n params.wrap_t = gl.CLAMP_TO_EDGE;\n }\n\n // オプション指定による上書き\n if (opts.mag_filter !== undefined) {\n params.mag_filter = opts.mag_filter;\n }\n if (opts.min_filter !== undefined) {\n params.min_filter = opts.min_filter;\n }\n if (opts.wrap_s !== undefined) {\n params.wrap_s = opts.wrap_s;\n }\n if (opts.wrap_t !== undefined) {\n params.wrap_t = opts.wrap_t;\n }\n\n return params;\n }\n\n\n /**\n * テクスチャの生成パラメータを取得\n *\n * @param {object} opts オプション集合\n * @return {Uint8Array} 均一色用の画像データ\n * @private\n */\n static\n _getColorArray( opts )\n {\n var color = opts.color || [1, 1, 1, 1];\n var pixels = color.map( value => Math.round( 255*value ) );\n return new Uint8Array( pixels );\n }\n\n\n /**\n * ミップマップを生成するか?\n *\n * @param {WebGLRenderingContext} gl WebGL コンテキスト\n * @param {object} params 生成パラメータ\n * @return {boolean} ミップマップを生成するとき true, それ以外のとき false\n * @private\n */\n static\n _generateMipmapQ( gl, params )\n {\n var filter = params.min_filter;\n return (filter == gl.NEAREST_MIPMAP_NEAREST)\n || (filter == gl.LINEAR_MIPMAP_NEAREST)\n || (filter == gl.NEAREST_MIPMAP_LINEAR)\n || (filter == gl.LINEAR_MIPMAP_LINEAR);\n }\n\n}\n\n\n/**\n * @summary テクスチャの用途\n * @desc\n * {@link mapray.Texture} の構築子で opts.usage パラメータに指定する値の型である。\n * @enum {object}\n * @memberof mapray.Texture\n * @constant\n */\nvar Usage = {\n\n /**\n * 一般用途 (既定値)\n */\n GENERAL: { id: \"GENERAL\" },\n\n /**\n * 均一色\n */\n COLOR: { id: \"COLOR\" },\n\n /**\n * テキスト表示\n */\n TEXT: { id: \"TEXT\" },\n\n /**\n * シンプルテキスト表示\n */\n SIMPLETEXT: { id: \"SIMPLETEXT\" },\n\n /**\n * アイコン\n */\n ICON: { id: \"ICON\" }\n\n};\n\n\n// クラス定数の定義\n{\n Texture.Usage = Usage;\n}\n\n\nexport default Texture;\n","import Material from \"./Material\";\nimport GeoMath from \"./GeoMath\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary エンティティ・マテリアル\n * @classdesc\n * このクラスは、mapray.RenderStage.getRenderTarget()の値により異なる動作をする。\n *
    \n *
  • \n * mapray.RenderStage.RenderTarget.SCENEの場合は、通常通り描画を行う。\n * setParametersは、描画に必要な全てのパラメータを設定します。\n *
  • mapray.RenderStage.RenderTarget.RIDの場合は、\n * setParametersは、RID描画に必要なパラメータのみ設定します(一般にテクスチャや色情報は除外される)。\n * このクラスでの実装は、setParameters()により、u_ridが設定されるようになっています。\n *
\n * @memberof mapray\n * @extends mapray.Material\n * @private\n */\nclass EntityMaterial extends Material {\n\n /**\n * @param {mapray.GLEnv} glenv WebGL 環境\n * @param {string} vs_code 頂点シェーダのソースコード\n * @param {string} fs_code フラグメントシェーダのソースコード\n */\n constructor( glenv, vs_code, fs_code )\n {\n super( glenv, vs_code, fs_code );\n }\n\n\n /**\n * @summary 背景との混合が必要か?\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @param {mapray.Primitive} primitive プリミティブ\n * @return {boolean} 背景との混合が必要なとき true, それ以外のとき false\n * @default false\n * @abstract\n */\n isTranslucent( stage, primitive )\n {\n return false;\n }\n\n\n /**\n * @summary マテリアルパラメータを設定\n * @desc\n *

事前に material.bindProgram() すること。

\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @param {mapray.Primitive} primitive プリミティブ\n * @abstract\n */\n setParameters( stage, primitive )\n {\n if (stage.getRenderTarget() === RenderTarget.RID) {\n this._setRenderId( primitive.rid );\n }\n }\n\n\n /**\n * @summary u_obj_to_clip 変数を設定\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @param {mapray.Primitive} primitive プリミティブ\n * @protected\n */\n setObjToClip( stage, primitive )\n {\n var obj_to_gocs = primitive.transform;\n var obj_to_clip = EntityMaterial._obj_to_clip;\n\n // obj_to_clip = gocs_to_clip * obj_to_gocs\n GeoMath.mul_GA( stage._gocs_to_clip, obj_to_gocs, obj_to_clip );\n\n this.setMatrix( \"u_obj_to_clip\", obj_to_clip );\n }\n\n\n /**\n * @summary u_obj_to_view 変数を設定\n * @param {mapray.RenderStage} stage レンダリングステージ\n * @param {mapray.Primitive} primitive プリミティブ\n * @protected\n */\n setObjToView( stage, primitive )\n {\n var obj_to_gocs = primitive.transform;\n var obj_to_view = EntityMaterial._obj_to_view;\n\n // obj_to_view = gocs_to_view * obj_to_gocs\n GeoMath.mul_AA( stage._gocs_to_view, obj_to_gocs, obj_to_view );\n\n this.setMatrix( \"u_obj_to_view\", obj_to_view );\n }\n\n /**\n * @private\n */\n _setRenderId( id ) {\n this.setVector4( \"u_rid\", [\n (id >> 12 & 0xF) / 0xF,\n (id >> 8 & 0xF) / 0xF,\n (id >> 4 & 0xF) / 0xF,\n (id & 0xF) / 0xF\n ]);\n }\n}\n\n\n// クラス定数の定義\n{\n EntityMaterial._obj_to_clip = GeoMath.createMatrixf(); // 計算用一時領域\n EntityMaterial._obj_to_view = GeoMath.createMatrixf(); // 計算用一時領域\n}\n\n\nexport default EntityMaterial;\n","import EntityMaterial from \"./EntityMaterial\";\nimport Texture from \"./Texture\";\nimport model_vs_code from \"./shader/model.vert\";\nimport model_fs_code from \"./shader/model.frag\";\nimport rid_fs_code from \"./shader/rid.frag\";\nimport { RenderTarget } from \"./RenderStage\";\n\n/**\n * @summary 基本マテリアル\n * @memberof mapray\n * @extends mapray.EntityMaterial\n * @private\n */\nclass ModelMaterial extends EntityMaterial {\n\n /**\n * @param {mapray.GLEnv} glenv\n * @param {object} [options] オプション指定\n * @param {boolean} [options.is_unlit=false] 無照光か?\n */\n constructor( glenv, options = {} )\n {\n const preamble = ModelMaterial._getPreamble( options );\n\n super( glenv,\n preamble + model_vs_code,\n preamble + ( options.ridMaterial ? rid_fs_code : model_fs_code ) );\n\n // 均一色テクスチャ\n this._white_texture = new Texture( glenv, null, { usage: Texture.Usage.COLOR, color: [1, 1, 1, 1] } );\n\n // 不変パラメータを事前設定\n this.bindProgram();\n this.setInteger( \"u_base_image\", ModelMaterial.TEXUNIT_BASE_IMAGE );\n }\n\n\n /**\n * @override\n */\n setParameters( stage, primitive )\n {\n super.setParameters( stage, primitive );\n\n var props = primitive.properties;\n var pbrMR = props.pbrMetallicRoughness;\n\n // u_obj_to_clip, u_obj_to_view\n this.setObjToClip( stage, primitive );\n this.setObjToView( stage, primitive );\n\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n // 基本色係数\n var bcf = pbrMR[\"baseColorFactor\"];\n const u_base_color = (\n stage.getTranslucentMode() ? [ 0.5 * bcf[ 0 ], 0.5 * bcf[ 1 ], 0.5 * bcf[ 2 ], 0.5 * bcf[ 3 ] ] :\n bcf\n );\n this.setVector4( \"u_base_color\", u_base_color );\n\n // ライト逆方向 (視点座標系) と強さ\n this.setVector3( \"u_light_dir\", [0, 0, 1] );\n\n // テクスチャのバインド\n var base_image_texture = this._selectTexture( pbrMR[\"baseColorTexture\"], this._white_texture );\n this.bindTexture2D( ModelMaterial.TEXUNIT_BASE_IMAGE, base_image_texture.handle );\n }\n }\n\n\n /**\n * テクスチャを選択\n * @param {object} texinfo\n * @param {mapray.Texture} alt_texure\n * @return {mapray.Texture}\n * @private\n */\n _selectTexture( texinfo, alt_texure )\n {\n if ( texinfo !== null ) {\n return texinfo.texture;\n }\n else {\n return alt_texure;\n }\n }\n\n\n /**\n * @summary シェーダの前文を取得\n *\n * @param {object} options オプション指定\n * @param {boolean} [options.is_unlit=false] 無照光か?\n *\n * @private\n */\n static\n _getPreamble( options )\n {\n let is_unlit = (options.is_unlit !== undefined) ? options.is_unlit : false;\n\n let lines = [];\n\n // UNLIT マクロの定義\n if ( is_unlit ) {\n lines.push( \"#define UNLIT\" );\n }\n\n // lines を文字列にして返す\n return lines.join( \"\\n\" ) + \"\\n\\n\";\n }\n\n}\n\n\n// クラス定数の定義\n{\n ModelMaterial.TEXUNIT_BASE_IMAGE = 0; // 基本色画像のテクスチャユニット\n}\n\n\nexport default ModelMaterial;\n","/**\n * glTF の sampler に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Sampler {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {object} index サンプラー索引 (非数の場合は既定値サンプラー)\n */\n constructor( ctx, index )\n {\n // specification/2.0/schema/sampler.schema.json\n // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#samplers\n\n var jsampler = (typeof index == 'number') ? ctx.gjson.samplers[index] : {};\n\n this._magFilter = jsampler.magFilter; // フィルタの既定値は実装依存\n this._minFilter = jsampler.minFilter; // ↑↑↑\n this._wrapS = (jsampler.wrapS !== undefined) ? jsampler.wrapS : Sampler.WRAP_DEFAULT;\n this._wrapT = (jsampler.wrapT !== undefined) ? jsampler.wrapT : Sampler.WRAP_DEFAULT;\n }\n\n\n /**\n * 拡大フィルタ\n * @type {number|undefined}\n * @readonly\n */\n get magFilter() { return this._magFilter; }\n\n\n /**\n * 縮小フィルタ\n * @type {number|undefined}\n * @readonly\n */\n get minFilter() { return this._minFilter; }\n\n\n /**\n * S-wrap\n * @type {number}\n * @readonly\n */\n get wrapS() { return this._wrapS; }\n\n\n /**\n * T-wrap\n * @type {number}\n * @readonly\n */\n get wrapT() { return this._wrapT; }\n\n}\n\n\nSampler.WRAP_DEFAULT = 10497; // REPEAT\n\n\nexport default Sampler;\n","import Sampler from \"./Sampler\";\n\n\n/**\n * glTF の texture に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Texture {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {object} index テクスチャ索引\n */\n constructor( ctx, index )\n {\n // specification/2.0/schema/texture.schema.json\n\n var jtexture = ctx.gjson.textures[index];\n\n this._sampler = new Sampler( ctx, jtexture.sampler );\n this._source = ctx.findImage( jtexture.source );\n }\n\n\n /**\n * イメージを取得\n * @type {mapray.gltf.Image}\n * @readonly\n */\n get source() { return this._source; }\n\n\n /**\n * サンプラを取得\n * @type {mapray.gltf.Sampler}\n * @readonly\n */\n get sampler() { return this._sampler; }\n\n}\n\n\nexport default Texture;\n","import Texture from \"./Texture\";\n\n\n/**\n * glTF の textureInfo に対応\n * @memberof mapray.gltf\n * @private\n */\nclass TextureInfo {\n\n /**\n * 初期化\n * @param {object} jtexinfo テクスチャ情報\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n */\n constructor( jtexinfo, ctx )\n {\n // specification/2.0/schema/textureInfo.schema.json\n\n this._texture = new Texture( ctx, jtexinfo.index );\n this._texCoord = (jtexinfo.texCoord !== undefined) ? jtexinfo.texCoord : 0;\n }\n\n\n /**\n * 参照するテクスチャを取得\n * @type {mapray.gltf.Texture}\n */\n get texture() { return this._texture; }\n\n\n /**\n * 参照するテクスチャを設定\n * @type {mapray.gltf.Texture}\n */\n set texture( value ) { this._texture = value; }\n\n\n /**\n * テクスチャ座標のインデックス\n * @type {number}\n * @readonly\n */\n get texCoord() { return this._texCoord; }\n\n}\n\n\nexport default TextureInfo;\n","import TextureInfo from \"./TextureInfo\";\n\n\n/**\n * glTF の normalTextureInfo に対応\n * @memberof mapray.gltf\n * @private\n */\nclass NormalTextureInfo extends TextureInfo {\n\n /**\n * 初期化\n * @param {object} jtexinfo テクスチャ情報\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n */\n constructor( jtexinfo, ctx )\n {\n super( jtexinfo, ctx );\n\n // specification/2.0/schema/material.normalTextureInfo.schema.json\n this._scale = (jtexinfo.scale !== undefined) ? jtexinfo.scale : 1.0;\n }\n\n\n /**\n * 法線スケール\n * @type {number}\n * @readonly\n */\n get texCoord() { return this._scale; }\n\n}\n\n\nexport default NormalTextureInfo;\n","import TextureInfo from \"./TextureInfo\";\n\n\n/**\n * glTF の occlusionTextureInfo に対応\n * @memberof mapray.gltf\n * @private\n */\nclass OcclusionTextureInfo extends TextureInfo {\n\n /**\n * 初期化\n * @param {object} jtexinfo テクスチャ情報\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n */\n constructor( jtexinfo, ctx )\n {\n super( jtexinfo, ctx );\n\n // specification/2.0/schema/material.occlusionTextureInfo.schema.json\n this._strength = (jtexinfo.strength !== undefined) ? jtexinfo.strength : 1.0;\n }\n\n\n /**\n * 遮蔽強度\n * @type {number}\n * @readonly\n */\n get strength() { return this._strength; }\n\n}\n\n\nexport default OcclusionTextureInfo;\n","import Content from \"./gltf/Content\";\nimport GeoMath from \"./GeoMath\";\nimport Primitive from \"./Primitive\";\nimport Mesh from \"./Mesh\";\nimport MeshBuffer from \"./MeshBuffer\";\nimport Texture from \"./Texture\";\nimport ModelMaterial from \"./ModelMaterial\";\nimport NormalTextureInfo from \"./gltf/NormalTextureInfo\";\nimport OcclusionTextureInfo from \"./gltf/OcclusionTextureInfo\";\n\n\n/**\n * @summary エンティティ用のモデルデータを格納\n *\n * @classdesc\n *

エンティティが使用するモデルデータを格納するクラスである。

\n *\n * @memberof mapray\n * @private\n * @see mapray.ModelEntity\n */\nclass ModelContainer {\n\n /**\n * @param {mapray.Scene} scene エンティティが所属するシーン\n * @param {mapray.gltf.Content} content 入力モデルデータ\n */\n constructor( scene, content )\n {\n this._entries = []; // 辞書: 整数 -> Entry\n this._name_map = {}; // 辞書: 名前 -> Entry\n this._default = null; // 既定モデルの Entry\n this._offset_transform = GeoMath.setIdentity( GeoMath.createMatrix() );\n\n const share = {};\n\n for ( const gltf_scene of content.scenes ) {\n const entry = new Entry( scene, gltf_scene, share );\n\n this._entries.push( entry );\n\n if ( gltf_scene.name !== null ) {\n this._name_map[gltf_scene.name] = entry;\n }\n }\n\n if ( content.default_scene_index >= 0 ) {\n if ( content.default_scene_index < this._entries.length ) {\n this._default = this._entries[content.default_scene_index];\n }\n else {\n throw new Error( \"default_scene_index is out of range\" );\n }\n }\n else {\n if ( this._entries.length >= 1 ) {\n this._default = this._entries[0];\n }\n }\n }\n\n\n /**\n * @summary 対応可能な glTF 拡張機能の配列を取得\n *\n * @desc\n *

例えば {@link mapray.gltf.Tools.load} の supported_extensions オプションのために使用する。

\n *

glTF のコンテンツがこれらの拡張機能だけで対応できないとき、読み込みに失敗することがある。

\n *\n * @return {string[]}\n */\n static\n getSupportedExtensions_glTF()\n {\n return [\"KHR_materials_unlit\"];\n }\n\n\n /**\n * @summary オフセット用の変換行列を設定\n *\n * @param {mapray.Matrix} matrix モデルの頂点座標を変換する変換行列\n */\n setOffsetTransform( matrix )\n {\n GeoMath.copyMatrix( matrix, this._offset_transform );\n }\n\n\n /**\n * @summary モデルデータを生成\n *\n * @desc\n *

id で指定したモデルのプリミティブを生成する。ただし id を省略したときは既定のモデルが選択される。

\n *

id で指定したモデルが存在しないとき、または id を省略したがモデルがまったく存在しないとき null を返す。

\n *\n * @param {number|string} [id] モデル ID\n * @return {?mapray.Primitive[]} モデルのプリミティブ配列\n */\n createPrimitives( id, options )\n {\n const entry = this._getEntry( id );\n if ( entry === null ) return null;\n\n const primitives = [];\n\n for ( const prim of entry.getPrimitives(options) ) {\n const cloned_prim = prim.fastClone();\n GeoMath.mul_AA( this._offset_transform, cloned_prim.transform, cloned_prim.transform ); // オフセット変換行列を適用\n cloned_prim.properties = Builder.fastCloneProperties( cloned_prim.properties );\n primitives.push( cloned_prim );\n }\n\n return primitives;\n }\n\n\n /**\n * @summary エントリーを取得\n *\n * @param {number|string} [id] モデル ID\n * @return {?mapray.ModelContainer.Entry} モデルエントリー\n * @private\n */\n _getEntry( id )\n {\n if ( typeof id == 'number' ) {\n // id を整数で指定\n if ( 0 <= id && id < this._entries.length ) {\n return this._entries[id];\n }\n }\n else if ( typeof id == 'string' ) {\n // id を名前で指定\n if ( this._name_map.hasOwnProperty( id ) ) {\n return this._name_map[id];\n }\n }\n else {\n // id 指定なし\n if ( this._entries.length > 0 ) {\n return this._entries[0];\n }\n }\n\n return null;\n }\n\n}\n\n\n/**\n * @summary モデルエントリー\n *\n * @memberof mapray.ModelContainer\n * @private\n */\nclass Entry {\n\n /**\n * @param {mapray.Scene} mr_scene Mapray シーン\n * @param {mapray.gltf.Scene} gltf_scene glTF シーン\n * @param {object} share Builder インスタンス間の共有情報\n */\n constructor( mr_scene, gltf_scene, share )\n {\n this._builder = new Builder( mr_scene, gltf_scene, share );\n }\n\n\n /**\n * @summary mapray.Primitive の配列を取得\n * @desc\n *

transform プロパティはプリミティブ座標系からエンティティ座標系への変換になっている。

\n * @type {mapray.Primitive[]}\n * @readonly\n */\n getPrimitives( options ) {\n return this._builder.getPrimitives( options );\n }\n\n}\n\n\n/**\n * @summary glTF シーンから mapray.Primitive の配列を構築\n *\n * @memberof mapray.ModelContainer\n * @private\n */\nclass Builder {\n\n /**\n * @param {mapray.Scene} mr_scene Mapray シーン\n * @param {mapray.gltf.Scene} gltf_scene glTF シーン\n * @param {object} share Builder インスタンス間の共有情報\n */\n constructor( mr_scene, gltf_scene, share )\n {\n // share を初期化\n if ( !share.buffer_map ) {\n share.buffer_map = new Map(); // gltf.Buffer -> MeshBuffer\n share.texture_map = new Map(); // gltf.Texture -> Texture\n }\n\n this._mr_scene = mr_scene;\n this._glenv = mr_scene.glenv;\n this._primitives = [];\n this._pickPrimitives = [];\n\n this._buffer_map = share.buffer_map;\n this._texture_map = share.texture_map;\n\n var identity = GeoMath.setIdentity( GeoMath.createMatrix() ); // シーンからシーンへの変換 (恒等行列)\n\n for ( var node of gltf_scene.root_nodes ) {\n this._addNode( node, identity );\n }\n }\n\n\n /**\n * @summary mapray.Primitive の配列を取得\n * @desc\n *

transform プロパティはプリミティブ座標系からエンティティ座標系への変換になっている。

\n * @type {mapray.Primitive[]}\n * @readonly\n */\n getPrimitives( options={} ) {\n return options.ridMaterial ? this._pickPrimitives : this._primitives;\n }\n\n\n /**\n * ノードを追加\n *\n * @param {mapray.gltf.Node} node 追加対象のノード\n * @param {mapray.Matrix} ptos 親ノード座標系からシーン座標系への変換\n * @private\n */\n _addNode( node, ptos )\n {\n var ntos = Builder._getNodeToScene( node, ptos );\n\n if ( node.mesh !== null ) {\n for ( var primitive of node.mesh.primitives ) {\n // プリミティブを追加\n this._primitives.push( this._createPrimitive( primitive, ntos, { ridMaterial: false } ) );\n this._pickPrimitives.push( this._createPrimitive( primitive, ntos, { ridMaterial: true } ) );\n }\n }\n\n // 子孫の処理\n for ( var child of node.children ) {\n this._addNode( child, ntos );\n }\n }\n\n\n /**\n * node 座標系からシーン座標系の変換行列を取得\n *\n * @param {mapray.gltf.Node} node 追加対象のノード\n * @param {mapray.Matrix} ptos 親ノード座標系からシーン座標系への変換行列\n * @return {mapray.Matrix} node 座標系からシーン座標系の変換行列\n * @private\n */\n static\n _getNodeToScene( node, ptos )\n {\n var ntos = ptos; // node 座標系からシーン座標系の変換\n\n var ntop = node.matrix; // node 座標系から親ノード座標系の変換\n if ( ntop !== null ) {\n ntos = GeoMath.createMatrix();\n GeoMath.mul_AA( ptos, ntop, ntos );\n }\n\n return ntos;\n }\n\n\n /**\n * プリミティブを生成\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @param {mapray.Matrix} ntos ノード座標系からシーン座標系への変換\n * @return {mapray.Primitive} 出力プリミティブ\n * @private\n */\n _createPrimitive( iprim, ntos, opts={} )\n {\n var mesh = this._createMesh( iprim );\n var material = this._createMaterial( iprim, { ridMaterial: opts.ridMaterial } )\n var oprim = new Primitive( this._glenv, mesh, material, GeoMath.createMatrix( ntos ) );\n\n oprim.pivot = this._createMeshPivot( iprim );\n oprim.bbox = this._createBoundingBox( iprim );\n oprim.properties = this._createProperties( iprim );\n\n return oprim;\n }\n\n\n /**\n * メッシュを生成\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @return {mapray.Mesh} メッシュ\n * @private\n */\n _createMesh( iprim )\n {\n var init = new Mesh.Initializer( Builder._convertPrimitiveMode( iprim ), Builder._calcNumVertices( iprim ) );\n\n var attributes = iprim.attributes;\n for ( var name in attributes ) {\n this._addAttribToInit( init, name, attributes[name] );\n }\n\n var indices = iprim.indices;\n if ( indices !== null ) {\n this._addIndexToInit( init, indices );\n }\n\n return new Mesh( this._glenv, init );\n }\n\n\n /**\n * 描画モードに変換\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @return {mapray.Mesh.DrawMode} 描画モード\n * @private\n */\n static\n _convertPrimitiveMode( iprim )\n {\n return Builder._DrawMode[iprim.mode];\n }\n\n\n /**\n * 頂点数を計算\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @return {number} 頂点数\n * @private\n */\n static\n _calcNumVertices( iprim )\n {\n var attributes = iprim.attributes;\n\n var counts = [];\n\n for ( var name in attributes ) {\n var accessor = attributes[name];\n counts.push( accessor.count );\n }\n\n return Math.min.apply( null, counts );\n }\n\n\n /**\n * 頂点属性をイニシャライザに追加\n *\n * @param {mapray.Mesh.Initializer} init 追加先\n * @param {string} name 属性名\n * @param {mapray.gltf.Accessor} accessor アクセサ\n * @private\n */\n _addAttribToInit( init, name, accessor )\n {\n var buffer = this._findMeshBuffer( accessor.bufferView.buffer, MeshBuffer.Target.ATTRIBUTE );\n\n var num_components = Builder._NumComponents[accessor.type];\n var component_type = Builder._ComponentType[accessor.componentType];\n\n var options = {\n normalized: accessor.normalized,\n byte_stride: accessor.bufferView.byteStride,\n byte_offset: accessor.bufferView.byteOffset + accessor.byteOffset\n };\n\n var id = Builder._VertexAttribId[name] || name;\n\n init.addAttribute( id, buffer, num_components, component_type, options );\n }\n\n\n /**\n * インデックスをイニシャライザに追加\n *\n * @param {mapray.Mesh.Initializer} init 追加先\n * @param {mapray.gltf.Accessor} accessor アクセサ\n * @private\n */\n _addIndexToInit( init, accessor )\n {\n var buffer = this._findMeshBuffer( accessor.bufferView.buffer, MeshBuffer.Target.INDEX );\n\n var num_indices = accessor.count;\n var type = Builder._ComponentType[accessor.componentType];\n\n var options = {\n byte_offset: accessor.bufferView.byteOffset + accessor.byteOffset\n };\n\n init.addIndex( buffer, num_indices, type, options );\n }\n\n\n /**\n * MeshBuffer インスタンスを検索\n *\n * @param {mapray.gltf.Buffer} buffer 入力バッファ\n * @param {mapray.MeshBuffer.Target} target 使用目的\n * @return {mapray.MeshBuffer}\n * @private\n */\n _findMeshBuffer( buffer, target )\n {\n var meshBuffer = this._buffer_map.get( buffer );\n if ( meshBuffer === undefined ) {\n meshBuffer = new MeshBuffer( this._glenv, buffer.binary, { target: target } );\n this._buffer_map.set( buffer, meshBuffer );\n }\n\n return meshBuffer;\n }\n\n\n /**\n * マテリアルを生成\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @return {mapray.EntityMaterial} マテリアル\n * @private\n */\n _createMaterial( iprim, opts = {} )\n {\n // キャッシュの場所とオプションを決定\n let cache_suffix = \"basic\";\n let options = {};\n\n if ( iprim.material && iprim.material.commonData.getExtensions( \"KHR_materials_unlit\" ) ) {\n cache_suffix = \"unlit\";\n options.is_unlit = true;\n }\n\n if ( opts.ridMaterial ) {\n options.ridMaterial = true;\n }\n\n // マテリアルのインスタンスを取得\n const scene = this._mr_scene;\n const cache_id = \"_ModelEntity_model_material_\" + cache_suffix + (opts.ridMaterial ? \"_pick\" : \"\");\n\n if ( !scene[cache_id] ) {\n // scene にマテリアルをキャッシュ\n scene[cache_id] = new ModelMaterial( scene.glenv, options );\n }\n\n return scene[cache_id];\n }\n\n\n /**\n * メッシュ基点を生成\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @return {?mapray.Vector3} メッシュ基点\n * @private\n */\n _createMeshPivot( iprim )\n {\n var pivot = null;\n var bbox = this._createBoundingBox( iprim );\n\n if ( bbox !== null ) {\n pivot = GeoMath.createVector3();\n // 境界箱の中点\n for ( var i = 0; i < 3; ++i ) {\n pivot[i] = (bbox[0][i] + bbox[1][i]) / 2;\n }\n }\n\n return pivot;\n }\n\n\n /**\n * 境界箱を生成\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @return {?mapray.Vector3[]} 境界箱\n * @private\n */\n _createBoundingBox( iprim )\n {\n var bbox = null;\n\n var attrib = iprim.attributes['POSITION'];\n if ( attrib !== undefined ) {\n var min = attrib.min;\n var max = attrib.max;\n if ( min !== null && max !== null ) {\n bbox = [GeoMath.createVector3( min ), GeoMath.createVector3( max )];\n }\n }\n\n return bbox;\n }\n\n\n /**\n * プロパティを生成\n *\n * @param {mapray.gltf.Primitive} iprim 入力プリミティブ\n * @return {object} プロパティ\n * @private\n */\n _createProperties( iprim )\n {\n var material = iprim.material;\n\n if ( material === null ) {\n // 既定のマテリアル\n return {\n pbrMetallicRoughness: {\n baseColorFactor: GeoMath.createVector4f( [1.0, 1.0, 1.0, 1.0] ),\n baseColorTexture: null,\n metallicFactor: 1.0,\n roughnessFactor: 1.0,\n metallicRoughnessTexture: null\n },\n doubleSided: false,\n alphaMode: \"OPAQUE\",\n alphaCutoff: 0.5,\n emissiveFactor: GeoMath.createVector3f( [0.0, 0.0, 0.0] ),\n emissiveTexture: null,\n normalTexture: null,\n occlusionTexture: null\n };\n }\n else {\n const pbrMR = material.pbrMetallicRoughness;\n\n return {\n pbrMetallicRoughness: {\n baseColorFactor: GeoMath.createVector4f( pbrMR.baseColorFactor ),\n baseColorTexture: this._createTextureParam( pbrMR.baseColorTexture ),\n metallicFactor: pbrMR.metallicFactor,\n roughnessFactor: pbrMR.roughnessFactor,\n metallicRoughnessTexture: this._createTextureParam( pbrMR.metallicRoughnessTexture )\n },\n doubleSided: material.doubleSided,\n alphaMode: material.alphaMode,\n alphaCutoff: material.alphaCutoff,\n emissiveFactor: GeoMath.createVector3f( material.emissiveFactor ),\n emissiveTexture: this._createTextureParam( material.emissiveTexture ),\n normalTexture: this._createTextureParam( material.normalTexture ),\n occlusionTexture: this._createTextureParam( material.occlusionTexture )\n };\n }\n }\n\n\n /**\n * テクスチャパラメータを生成\n *\n * @param {mapray.gltf.TextureInfo} texinfo TextureInfo インスタンス\n * @return {object} テクスチャパラメータ\n * @private\n */\n _createTextureParam( texinfo )\n {\n if ( texinfo === null ) {\n return null;\n }\n\n var param = {\n texture: this._findTexture( texinfo.texture ),\n texCoord: texinfo.texCoord\n };\n\n if ( texinfo instanceof NormalTextureInfo ) {\n param.scale = texinfo.scale;\n }\n else if ( texinfo instanceof OcclusionTextureInfo ) {\n param.strength = texinfo.strength;\n }\n\n return param;\n }\n\n\n /**\n * モデル用のプロパティを複製\n *\n * @param {mapray.PropSet} props\n * @return {mapray.PropSet}\n *\n * @see _createProperties()\n */\n static\n fastCloneProperties( props )\n {\n const src_pbr = props.pbrMetallicRoughness;\n\n return {\n pbrMetallicRoughness: {\n baseColorFactor: GeoMath.createVector3f( src_pbr.baseColorFactor ),\n baseColorTexture: Builder._fastCloneTextureParam( src_pbr.baseColorTexture ),\n metallicFactor: src_pbr.metallicFactor,\n roughnessFactor: src_pbr.roughnessFactor,\n metallicRoughnessTexture: Builder._fastCloneTextureParam( src_pbr.metallicRoughnessTexture )\n },\n doubleSided: props.doubleSided,\n alphaMode: props.alphaMode,\n alphaCutoff: props.alphaCutoff,\n emissiveFactor: GeoMath.createVector3f( props.emissiveFactor ),\n emissiveTexture: Builder._fastCloneTextureParam( props.emissiveTexture ),\n normalTexture: Builder._fastCloneTextureParam( props.normalTexture ),\n occlusionTexture: Builder._fastCloneTextureParam( props.occlusionTexture )\n };\n }\n\n\n /**\n * テクスチャパラメータを複製\n *\n * @param {object} param\n * @return {!object}\n *\n * @private\n * @see _createTextureParam()\n */\n static\n _fastCloneTextureParam( iparam )\n {\n if ( iparam === null ) return null;\n\n var oparam = {\n texture: iparam.texture,\n texCoord: iparam.texCoord\n };\n\n if ( 'scale' in iparam ) {\n oparam.scale = iparam.scale;\n }\n else if ( 'strength' in iparam ) {\n oparam.strength = iparam.strength;\n }\n\n return oparam;\n }\n\n\n /**\n * テクスチャパラメータを生成\n *\n * @param {mapray.gltf.Texture} itexture glTF テクスチャ\n * @return {mapray.Texture} テクスチャ\n * @private\n */\n _findTexture( itexture )\n {\n var otexture = this._texture_map.get( itexture );\n\n if ( otexture === undefined ) {\n var sampler = itexture.sampler;\n var gl = this._glenv.context;\n var tex_opts = {\n mag_filter: (sampler.magFilter !== undefined) ? sampler.magFilter : gl.LINEAR,\n min_filter: (sampler.minFilter !== undefined) ? sampler.minFilter : gl.LINEAR_MIPMAP_LINEAR,\n wrap_s: sampler.wrapS,\n wrap_t: sampler.wrapT,\n flip_y: false // glTF のテクスチャ座標は左上が原点なので画像を反転しない\n };\n otexture = new Texture( this._glenv, itexture.source.image, tex_opts );\n this._texture_map.set( itexture, otexture );\n }\n\n return otexture;\n }\n\n}\n\n\n// gltf.Primitive.mode -> mapray.Mesh.DrawMode\nBuilder._DrawMode = {\n 0: Mesh.DrawMode.POINTS,\n 1: Mesh.DrawMode.LINES,\n 2: Mesh.DrawMode.LINE_LOOP,\n 3: Mesh.DrawMode.LINE_STRIP,\n 4: Mesh.DrawMode.TRIANGLES,\n 5: Mesh.DrawMode.TRIANGLE_STRIP,\n 6: Mesh.DrawMode.TRIANGLE_FAN\n};\n\n\n// gltf.Accessor.type -> 要素数\nBuilder._NumComponents = {\n 'SCALAR': 1,\n 'VEC2': 2,\n 'VEC3': 3,\n 'VEC4': 4\n};\n\n\n// gltf.Accessor.componentType -> mapray.Mesh.ComponentType\nBuilder._ComponentType = {\n 5120: Mesh.ComponentType.BYTE,\n 5121: Mesh.ComponentType.UNSIGNED_BYTE,\n 5122: Mesh.ComponentType.SHORT,\n 5123: Mesh.ComponentType.UNSIGNED_SHORT,\n 5125: Mesh.ComponentType.UNSIGNED_INT,\n 5126: Mesh.ComponentType.FLOAT\n};\n\n\n// gltf.Primitive.attributes のキー -> 頂点属性 ID\nBuilder._VertexAttribId = {\n 'POSITION': \"a_position\",\n 'NORMAL': \"a_normal\",\n 'TANGENT': \"a_tangent\",\n 'TEXCOORD_0': \"a_texcoord\",\n 'TEXCOORD_1': \"a_texcoord1\",\n 'COLOR_0': \"a_color\"\n};\n\n\nexport default ModelContainer;\n","import EntityMaterial from \"./EntityMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport line_vs_code from \"./shader/line.vert\";\nimport line_fs_code from \"./shader/line.frag\";\nimport AbstractLineEntity from \"./AbstractLineEntity\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary 太さ付き線分専用マテリアル\n * @memberof mapray\n * @extends mapray.EntityMaterial\n * @private\n */\nclass LineMaterial extends EntityMaterial {\n /**\n * @param {mapray.GLEnv} glenv\n */\n constructor( glenv, line_type, options = {} )\n {\n const preamble = LineMaterial._getPreamble( line_type, options );\n super( glenv, preamble + line_vs_code, preamble + line_fs_code );\n\n this._line_type = line_type;\n }\n\n\n /**\n * @override\n */\n isTranslucent( stage, primitive )\n {\n var props = primitive.properties;\n var opacity = (props.opacity !== undefined) ? props.opacity : LineMaterial.DEFAULT_OPACITY;\n return opacity < 1.0;\n }\n\n\n /**\n * @override\n */\n setParameters( stage, primitive )\n {\n super.setParameters( stage, primitive );\n\n var props = primitive.properties;\n\n // u_obj_to_clip\n this.setObjToClip( stage, primitive );\n\n // 画面パラメータ: {2/w, 2/h, h/w}\n // vec3 u_sparam\n var sparam = LineMaterial._sparam;\n sparam[0] = 2 / stage._width;\n sparam[1] = 2 / stage._height;\n sparam[2] = stage._height / stage._width;\n this.setVector3( \"u_sparam\", sparam );\n\n // 線の太さの半分: {u, v}\n // vec2 u_thickness\n var param_width = props.width || LineMaterial.DEFAULT_WIDTH;\n\n var thickness = LineMaterial._thickness;\n thickness[0] = param_width / 2;\n thickness[1] = param_width / 2;\n this.setVector2( \"u_thickness\", thickness );\n\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n // 線の基本色\n // vec4 u_color\n var param_color = (props.color !== undefined) ? props.color : LineMaterial.DEFAULT_COLOR;\n var param_opacity = (props.opacity !== undefined) ? props.opacity : LineMaterial.DEFAULT_OPACITY;\n\n var color = LineMaterial._color;\n GeoMath.copyVector3( param_color, color );\n color[3] = param_opacity;\n this.setVector4( \"u_color\", color );\n }\n\n // RID rendering also requires u_lower_length and u_upper_length.\n if ( this._line_type == AbstractLineEntity.LineType.PATH ) {\n var lower_length = props[\"lower_length\"];\n this.setFloat( \"u_lower_length\", lower_length );\n\n var upper_length = props[\"upper_length\"];\n this.setFloat( \"u_upper_length\", upper_length );\n }\n }\n\n\n /**\n * @summary シェーダの前文を取得\n *\n * @param {AbstractLineEntity.LineType} line_type\n * @param {object} options\n *\n * @private\n */\n static\n _getPreamble( line_type, options )\n {\n const lines = [];\n\n if ( line_type == AbstractLineEntity.LineType.PATH ) {\n lines.push( \"#define PATH\" );\n }\n\n if ( options.ridMaterial ) {\n lines.push( \"#define RID\" );\n }\n\n // lines を文字列にして返す\n return lines.join( \"\\n\" ) + \"\\n\\n\";\n }\n}\n\n\n// クラス定数の定義\n{\n LineMaterial.DEFAULT_WIDTH = 1.0;\n LineMaterial.DEFAULT_COLOR = GeoMath.createVector3f( [1.0, 1.0, 1.0] );\n LineMaterial.DEFAULT_OPACITY = 1.0;\n LineMaterial.DEFAULT_LOWER_LENGTH = 0.0;\n LineMaterial.DEFAULT_UPPER_LENGTH = 0.0;\n\n // 計算用一時領域\n LineMaterial._sparam = GeoMath.createVector3f();\n LineMaterial._thickness = GeoMath.createVector2f();\n LineMaterial._color = GeoMath.createVector4f();\n}\n\n\nexport default LineMaterial;\n","import GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\n\n/**\n * @summary 地理空間的Region\n *\n * @memberof mapray\n */\nclass GeoRegion {\n\n /**\n * 初期値は empty である。\n * lon は次の条件とする。\n *

条件 this._min_lon < this._max_lon

\n *

条件 this._max_lon - this._min_lon <= 360

\n */\n constructor()\n {\n this._empty = true;\n this._min_lon = 0;\n this._max_lon = 0;\n this._min_lat = 0;\n this._max_lat = 0;\n this._min_alt = 0;\n this._max_alt = 0;\n }\n\n\n /**\n * @summary 空確認\n *\n * @return {boolean} empty値\n */\n empty()\n {\n return this._empty;\n }\n\n\n /**\n * @summary Pointを追加\n *

条件 this._min_lon < this._max_lon

\n *

条件 this._max_lon - this._min_lon <= 360

\n *\n * @param {number} lon 地理空間位置 longitude\n * @param {number} lat 地理空間位置 latitude\n * @param {number} alt 地理空間位置 altitude\n * @private\n */\n _add( lon, lat, alt )\n {\n if ( this._empty ) {\n this._empty = false;\n lon = lon - 360 * Math.floor( lon/360 + 0.5 );\n this._min_lon = this._max_lon = lon;\n this._min_lat = this._max_lat = lat;\n this._min_alt = this._max_alt = alt;\n }\n else {\n const right_min_lon = this._calcRightPosition( this._min_lon, lon );\n\n if ( right_min_lon <= this._max_lon ) {\n // lon はmin,maxに内包されている\n // lon の min, max の確認は不要\n }\n else {\n const right_max_lon = this._calcRightPosition( this._max_lon, lon );\n\n const length1 = right_max_lon - this._max_lon ;\n const length2 = right_min_lon - 360 - this._min_lon;\n if ( Math.abs(length1) <= Math.abs(length2) ) {\n // expand east\n this._max_lon = this._max_lon + length1;\n }\n else {\n // expand west\n this._min_lon = this._min_lon + length2;\n }\n }\n\n if ( lat < this._min_lat ) this._min_lat = lat;\n else if ( lat > this._max_lat ) this._max_lat = lat;\n if ( alt < this._min_alt ) this._min_alt = alt;\n else if ( alt > this._max_alt ) this._max_alt = alt;\n }\n }\n\n /**\n * @summary base_lon より右となる最小の longitude を算出\n *\n * @param {number} base_lon 基準となるlongitude\n * @param {number} lon 確認したいlongitude\n * @return {number} 最小longitude\n * @private\n */\n _calcRightPosition( base_lon, lon )\n {\n let diff = lon - base_lon;\n diff = diff - 360 * Math.floor(diff / 360);\n return base_lon + diff;\n }\n\n\n /**\n * @summary GeoPointを追加\n *\n * @param {mapary.GeoPoint} point 地理空間位置\n */\n addPoint( point )\n {\n this._add( point.longitude, point.latitude, point.altitude );\n }\n\n\n /**\n * @summary GeoPointを追加\n *\n * @param {...mapary.GeoPoint} points 地理空間位置\n */\n addPoints( ...points )\n {\n points.forEach( point => {\n this._add( point.longitude, point.latitude, point.altitude );\n });\n }\n\n\n /**\n * @summary PointArrayを追加\n *\n * @param {number[]} pointsArray 地理空間位置Array\n */\n addPointsAsArray( pointsArray )\n {\n for ( let i = 0; i < pointsArray.length; i += 3 ) {\n this._add( pointsArray[i], pointsArray[i+1], pointsArray[i+2] );\n };\n }\n\n\n /**\n * @summary GeoRegionを結合\n *\n * @param {mapray.GeoRegion} region 地理空間Region\n */\n merge( region )\n {\n if( region.empty() ) { return; }\n if ( this._empty ) {\n this._min_lon = region._min_lon;\n this._max_lon = region._max_lon;\n this._min_lat = region._min_lat;\n this._max_lat = region._max_lat;\n this._min_alt = region._min_alt;\n this._max_alt = region._max_alt;\n this._empty = false;\n }\n else {\n // 内包判定\n let right_min_lon = this._calcRightPosition( this._min_lon, region._min_lon );\n const right_max_lon = this._calcRightPosition( this._min_lon, region._max_lon );\n\n if( right_min_lon > right_max_lon ) {\n right_min_lon -= 360;\n }\n\n let min_include = false;\n if ( ( right_min_lon >= this._min_lon ) && ( right_min_lon <= this._max_lon ) ) {\n min_include = true;\n }\n let max_include = false;\n if ( ( right_max_lon >= this._min_lon ) && ( right_max_lon <= this._max_lon ) ) {\n max_include = true;\n }\n\n // 1.thisがregionを内包\n if ( min_include && max_include ) {\n // 内包状態 -> 変化無し\n }\n\n // 2.westのみ内包 -> east拡大\n else if ( min_include ) {\n this._max_lon = right_max_lon;\n }\n\n // 3.eastのみ内包 -> west拡大\n else if ( max_include ) {\n this._min_lon = right_min_lon;\n }\n\n // 4.regionがthisを内包\n else if ( ( this._min_lon >= right_min_lon ) && ( this._max_lon <= right_max_lon ) )\n {\n this._min_lon = region._min_lon;\n this._max_lon = region._max_lon;\n }\n\n // 5.共有無し\n else {\n // east と west 比較\n const length1 = right_max_lon - this._max_lon ;\n const length2 = right_min_lon - 360 - this._min_lon;\n if ( Math.abs(length1) <= Math.abs(length2) ) {\n // expand east\n this._max_lon = this._max_lon + length1;\n }\n else {\n // expand west\n this._min_lon = this._min_lon + length2;\n }\n }\n\n // lat と alt\n this._min_lat = Math.min(this._min_lat, region._min_lat);\n this._max_lat = Math.max(this._max_lat, region._max_lat);\n this._min_alt = Math.min(this._min_alt, region._min_alt);\n this._max_alt = Math.max(this._max_alt, region._max_alt);\n }\n }\n\n\n /**\n * @summary Region内の任意点の取得\n * center ( 0.5, 0.5 )\n * east ( 1, 0.5 )\n * west ( 0, 0.5 )\n * north ( 0.5, 1 )\n * south ( 0.5, 0 )\n * northEast ( 1, 1 )\n * southWest ( 0, 0 )\n *\n * @param {number} lon_pos longitude位置割合\n * @param {number} lat_pos latitude位置割合\n * @param {number} [alt_pos] anlitude位置割合\n * @return {mapary.GeoPoint} GeoPoint\n */\n getPoint( lon_pos, lat_pos, alt_pos=0 )\n {\n if ( this._empty ) { return null; }\n return new GeoPoint(\n (1-lon_pos) * this._min_lon + lon_pos * this._max_lon,\n (1-lat_pos) * this._min_lat + lat_pos * this._max_lat,\n (1-alt_pos) * this._min_alt + alt_pos * this._max_alt\n );\n }\n\n\n /**\n * @summary SouthWestのGeopointを返却\n *\n * @return {mapary.GeoPoint} 南西(min)のGeoPoint\n */\n getSouthWest()\n {\n if ( this._empty ) { return null; }\n return new GeoPoint( this._min_lon, this._min_lat, this._min_alt );\n }\n\n\n /**\n * @summary NorthEastのGeopointを返却\n *\n * @return {mapary.GeoPoint} 北東(max)のGeoPoint\n */\n getNorthEast()\n {\n if ( this._empty ) { return null; }\n return new GeoPoint( this._max_lon, this._max_lat, this._max_alt );\n }\n\n\n /**\n * @summary 中心位置のGeopointを返却\n *\n * @return {mapary.GeoPoint} 中心(center)のGeoPoint\n */\n getCenter()\n {\n if ( this._empty ) { return null; }\n return this.getPoint( 0.5, 0.5, 0.5 );\n }\n\n\n /**\n * @summary RegionのLongitude方向 の地表面距離を算出\n *\n * @return {number} Longitude方向の地表面距離\n */\n getLongitudeDistance()\n {\n if ( this._empty ) { return null; }\n return this.getPoint( 0, 0.5 ).getGeographicalDistance( this.getPoint( 1, 0.5 ) );\n }\n\n\n /**\n * @summary RegionのLatitude方向 の地表面距離を算出\n *\n * @return {number} Latitude方向の地表面距離\n */\n getLatitudeDistance()\n {\n if ( this._empty ) { return null; }\n return this.getPoint( 0.5, 0 ).getGeographicalDistance( this.getPoint( 0.5, 1 ) );\n }\n}\n\n\nexport default GeoRegion;\n","import GeoMath from \"./GeoMath\";\n\n\n/**\n * @summary エンティティ領域\n *\n * @classdesc\n *

標高の変化に伴い、エンティティの更新を行うためのクラスである。

\n *\n * @memberof mapray\n * @private\n * @see mapray.UpdatedTileArea\n */\nclass EntityRegion {\n\n /**\n */\n constructor()\n {\n this._is_compiled = false;\n\n this._point_array = new Float64Array( 0 );\n this._num_points = 0;\n\n this._node_array = new Uint32Array( 0 );\n this._next_node = 0;\n }\n\n\n /**\n * @summary 位置を追加\n *\n * @desc\n *

point.altitude は無視される。

\n *\n * @param {mapray.GeoPoint} point 位置\n */\n addPoint( point )\n {\n this._checkNotCompiled();\n this._ensurePointArrayCapacity( 2 );\n\n var index = 2 * this._num_points;\n\n this._point_array[index] = point.longitude;\n this._point_array[index + 1] = point.latitude;\n\n this._num_points += 1;\n }\n\n\n /**\n * @summary 複数の位置を追加\n *\n * @param {number[]} points 頂点配列 (経度, 緯度, ...)\n * @param {number} offset 先頭インデックス\n * @param {number} stride ストライド\n * @param {number} num_points 頂点数\n */\n addPoints( points, offset, stride, num_points )\n {\n this._checkNotCompiled();\n this._ensurePointArrayCapacity( 2 * num_points );\n\n var src_index = offset;\n var dst_index = 2 * this._num_points;\n var dst_array = this._point_array;\n\n for ( var i = 0; i < num_points; ++i ) {\n dst_array[dst_index] = points[src_index];\n dst_array[dst_index + 1] = points[src_index + 1];\n src_index += stride;\n dst_index += 2;\n }\n\n this._num_points += num_points;\n }\n\n\n /**\n * @summary 比較処理用に翻訳\n *\n * @package\n */\n compile()\n {\n if ( this._is_compiled ) {\n // すでに翻訳済み\n return;\n }\n\n this._buildCollisionQuadTree();\n\n // this._node_array から使っていない最後の領域を削除\n if ( this._node_array.length > this._next_node ) {\n this._node_array = new Uint32Array( this._node_array.slice( 0, this._next_node ) );\n }\n\n this._point_array = null; // 翻訳後は使わないので捨てる\n this._is_compiled = true; // 翻訳済みにする\n }\n\n\n /**\n * @summary this と area は交差するか?\n *\n * @param {mapray.UpdatedTileArea} area 判定する領域\n *\n * @return {boolean} 交差するとき true, それ以外のとき false\n *\n * @package\n */\n intersectsWith( area )\n {\n if ( this._node_array.length == 0 ) {\n // this は空領域\n return false;\n }\n\n var area_list = area.getFlatAreaList();\n\n for ( var i = 0; i < area_list.length; ++i ) {\n if ( this._intersectsWith( area_list[i] ) ) {\n // ある領域が交差した\n return true;\n }\n }\n\n // すべての領域が交差しなかった\n return false;\n }\n\n\n /**\n * @summary this と area は交差するか? (単一領域)\n *\n * @param {Uint8Array} area 判定する領域\n *\n * @return {boolean} 交差するとき true, それ以外のとき false\n *\n * @private\n */\n _intersectsWith( area )\n {\n // assert this._node_array.length > 0\n\n var node = 0;\n var node_array = this._node_array;\n\n for ( var i = 0; i < area.length; ++i ) {\n node = node_array[node + area[i]];\n\n if ( node == FULL_INDEX ) {\n // 交差する (area は全域ノードの内側)\n return true;\n }\n else if ( node == EMPTY_INDEX ) {\n // 交差しない (area は空ノードの内側)\n return false;\n }\n }\n\n // 交差する\n // area.length == 0 (全球領域) または area の最後が this 階層の途中\n return true;\n }\n\n\n /**\n * @summary すでに翻訳されてるときエラー\n *\n * @private\n */\n _checkNotCompiled()\n {\n if ( this._is_compiled ) {\n throw new Error( \"EitityRegion is already compiled.\" );\n }\n }\n\n\n /**\n * @summary this._point_array の容量を十分にする\n *\n * @param {number} added_size 追加サイズ\n *\n * @private\n */\n _ensurePointArrayCapacity( added_size )\n {\n var old_size = 2 * this._num_points;\n var needed_capacity = old_size + added_size;\n var old_capacity = this._point_array.length;\n\n if ( needed_capacity > old_capacity ) {\n // 配列を拡張する\n var new_capacity = Math.max( needed_capacity, Math.floor( 1.5 * old_capacity ) );\n var new_point_array = new Float64Array( new_capacity );\n new_point_array.set( this._point_array.slice( 0, old_size ) );\n this._point_array = new_point_array;\n }\n }\n\n\n /**\n * @summary 領域判定四分木を構築\n *\n * @private\n */\n _buildCollisionQuadTree()\n {\n var dPI = 2 * Math.PI;\n\n var point_array = this._point_array;\n var num_floats = 2 * this._num_points;\n\n for ( var i = 0; i < num_floats; ) {\n // 経緯度 (Degrees)\n var lon = point_array[i++];\n var lat = point_array[i++];\n\n // 正規化経緯度 (Degrees)\n var _lon = lon + 180 * Math.floor( (90 - lat) / 360 + Math.floor( (90 + lat) / 360 ) );\n var nlon = _lon - 360 - 360 * Math.floor( (_lon - 180) / 360 ); // 正規化経度 [-180,180)\n var nlat = 90 - Math.abs( 90 - lat + 360 * Math.floor( (90 + lat) / 360 ) ); // 正規化緯度 [-90,90]\n\n // 単位球メルカトル座標\n var xm = nlon * GeoMath.DEGREE;\n var ym = GeoMath.invGudermannian( nlat * GeoMath.DEGREE );\n\n // 基底タイル座標 (左上(0, 0)、右下(1, 1))\n var xt = xm / dPI + 0.5;\n var yt = 0.5 - ym / dPI;\n\n // ノードを追加\n this._addCollisionQuadTreeNode( xt, yt );\n }\n\n // 全域ノードを設定\n if ( this._next_node > 0 ) {\n this._setFullNodeRecur( 0 );\n this._reduceNodeRecur( 0 );\n }\n }\n\n\n /**\n * @summary 領域判定四分木のノードを追加\n *\n * @param {number} xt 基底タイル座標 X\n * @param {number} yt 基底タイル座標 Y\n *\n * @private\n */\n _addCollisionQuadTreeNode( xt, yt )\n {\n if ( yt < 0 || yt > 1 ) {\n // 緯度が範囲外 (極に近い)\n return;\n }\n\n var size = 1 << MAX_LEVEL;\n var ubits = GeoMath.clamp( Math.floor( xt * size ), 0, size - 1 );\n var vbits = Math.min( Math.floor( yt * size ), size - 1 ); // >= 0\n var node = this._findRootNode();\n\n for ( var mask = size >> 1; mask != 0; mask >>= 1 ) {\n var u = ((ubits & mask) == 0) ? 0 : 1;\n var v = ((vbits & mask) == 0) ? 0 : 2;\n node = this._findChildNode( node, u + v );\n }\n }\n\n\n /**\n * @summary 最上位ノードを検索\n *\n * @return {number} 最上位ノード\n *\n * @private\n */\n _findRootNode()\n {\n if ( this._next_node == 0 ) {\n // まだ最上位ノードが存在しない\n // 最上位ノードを生成する\n this._ensureNodeArrayCapacity();\n\n for ( var i = 0; i < 4; ++i ) {\n this._node_array[i] = EMPTY_INDEX;\n }\n this._next_node = 4;\n }\n\n return 0;\n }\n\n\n /**\n * @summary 子ノードを検索\n *\n * @param {number} parent 親ノード\n * @param {number} ichild 子ノード序列 (0-3)\n * @return {number} 子ノード\n *\n * @private\n */\n _findChildNode( parent, ichild )\n {\n var child = this._node_array[parent + ichild];\n\n if ( child == 0 ) {\n // まだ子ノードが存在しない\n // 子ノードを生成する\n this._ensureNodeArrayCapacity();\n\n child = this._next_node;\n for ( var i = 0; i < 4; ++i ) {\n this._node_array[child + i] = EMPTY_INDEX;\n }\n this._next_node += 4;\n\n // 親ノードに生成した子ノードを取り付ける\n this._node_array[parent + ichild] = child;\n }\n\n return child;\n }\n\n\n /**\n * @summary 全域ノードを再帰的に設定\n *\n * @desc\n *

末端ノードの子ノードを FULL_INDEX に設定する。

\n *\n * @param {number} node ノードの索引\n *\n * @private\n */\n _setFullNodeRecur( node )\n {\n var node_array = this._node_array;\n var is_leaf = true;\n\n for ( var i = 0; i < 4; ++i ) {\n var child = node_array[node + i];\n if ( child != EMPTY_INDEX ) {\n this._setFullNodeRecur( child );\n is_leaf = false;\n }\n }\n\n // 末端なら子ノードを FULL_INDEX\n if ( is_leaf ) {\n for ( i = 0; i < 4; ++i ) {\n node_array[node + i] = FULL_INDEX;\n }\n }\n }\n\n\n /**\n * @summary 全域ノードを再帰的に設定\n *\n * @param {number} node ノードの索引\n * @return {boolean} 全域ノードなら true, その他なら false\n *\n * @private\n */\n _reduceNodeRecur( node )\n {\n var node_array = this._node_array;\n var num_fulls = 0;\n\n for ( var i = 0; i < 4; ++i ) {\n var child = node_array[node + i];\n if ( child == FULL_INDEX ) {\n ++num_fulls;\n }\n else if ( child != EMPTY_INDEX ) {\n if ( this._reduceNodeRecur( child ) ) {\n node_array[node + i] = FULL_INDEX;\n ++num_fulls;\n }\n }\n }\n\n return (num_fulls == 4);\n }\n\n\n /**\n * @summary this._node_array の容量を十分にする\n *\n * @private\n */\n _ensureNodeArrayCapacity()\n {\n var old_size = this._next_node;\n var needed_capacity = old_size + 4;\n var old_capacity = this._node_array.length;\n\n if ( needed_capacity > old_capacity ) {\n // 配列を拡張する\n var new_capacity = Math.max( needed_capacity, Math.floor( 1.5 * old_capacity ) );\n var new_node_array = new Uint32Array( new_capacity );\n new_node_array.set( this._node_array.slice( 0, old_size ) );\n this._node_array = new_node_array;\n }\n }\n\n}\n\n\nvar MAX_LEVEL = 20; // 整数: 0~30\nvar EMPTY_INDEX = 0; // 空ノードの索引\nvar FULL_INDEX = 4294967295; // 全域ノードの索引 = 2^32 - 1\n\n\nexport default EntityRegion;\n","import Entity from \"./Entity\";\n\n\n/**\n * @summary 4分木ベースの領域管理\n *\n *

Entity.FlakePrimitiveProducer の getAreaStatus() と createMesh()\n * メソッドを補助するためのクラスである。

\n *\n * @memberof mapray\n * @private\n * @see mapray.Entity.FlakePrimitiveProducer\n */\nclass QAreaManager {\n\n /**\n */\n constructor()\n {\n this._tree_root = null; // QAreaNode | AreaStatus.EMPTY | AreaStatus.FULL\n }\n\n\n /**\n * @summary 領域状態を取得\n *\n * @desc\n *

area が示す領域の状態を取得する。

\n *\n * @param {mapray.Area} area 確認する領域\n *\n * @return {mapray.Entity.AreaStatus} 領域の状態\n */\n getAreaStatus( area )\n {\n let node = this._get_area_node( area );\n\n if ( node === Entity.AreaStatus.EMPTY || node === Entity.AreaStatus.FULL ) {\n // Entity.AreaStatus のとき\n return node;\n }\n else {\n // QAreaNode のとき\n return Entity.AreaStatus.PARTIAL;\n }\n }\n\n\n /**\n * @summary 内容データを取得\n *\n * @param {mapray.Area} area 対象領域\n *\n * @return {object|mapray.Entity.AreaStatus} area に対応する内容データ | AreaStatus.EMPTY | AreaStatus.FULL\n */\n getAreaContent( area )\n {\n let node = this._get_area_node( area );\n\n if ( node === Entity.AreaStatus.EMPTY || node === Entity.AreaStatus.FULL ) {\n // Entity.AreaStatus のとき\n return node;\n }\n else {\n // QAreaNode のとき\n return node.content;\n }\n }\n\n\n /**\n * @summary 初めの内容データを取得\n *\n * @desc\n *

最上位領域の内容データを生成するための内容データを取得する。

\n *

FlakePrimitiveProducer の実装者がこのメソッドを実装する。

\n *\n * @return {object} 内容データ\n *\n * @abstract\n */\n getInitialContent()\n {\n return null;\n }\n\n\n /**\n * @summary 領域の内容データを生成\n *\n * @desc\n *

領域と parent_content から内容データを生成する。

\n *

パラメータの座標系は正規化メルカトル座標系である。

\n *

FlakePrimitiveProducer の実装者がこのメソッドを実装する。

\n *\n * @param {number} min_x 領域の最小 x 座標\n * @param {number} min_y 領域の最小 y 座標\n * @param {number} msize 領域の寸法\n * @param {object} parent_content 親領域の内容データ\n *\n * @return {object|mapray.Entity.AreaStatus} 内容データ | AreaStatus.EMPTY | AreaStatus.FULL\n *\n * @abstract\n */\n createAreaContent( min_x, min_y, msize, parent_content )\n {\n return Entity.AreaStatus.EMPTY;\n }\n\n\n /**\n * @summary 内容データが更新されたこと通知\n *\n * @desc\n *

内容データが更新されときに FlakePrimitiveProducer の実装者がこのメソッドを呼び出す。

\n */\n notifyForUpdateContent()\n {\n this._tree_root = null;\n }\n\n\n /**\n * @summary 領域のノードを生成\n *\n * @param {number} min_x 領域の最小 x 座標\n * @param {number} max_y 領域の最大 y 座標\n * @param {number} msize 領域の寸法\n * @param {object} parent_content 親領域の内容データ\n *\n * @return {QAreaNode|mapray.Entity.AreaStatus} ノード | AreaStatus.EMPTY | AreaStatus.FULL\n *\n * @private\n */\n _create_area_node( min_x, max_y, msize, parent_content )\n {\n let content = this.createAreaContent( min_x, max_y - msize, msize, parent_content );\n\n if ( content === Entity.AreaStatus.EMPTY || content === Entity.AreaStatus.FULL ) {\n return content;\n }\n else {\n return new QAreaNode( content );\n }\n }\n\n\n /**\n * @summary 領域のノードを取得\n *\n * @desc\n *

area に対応するノードを取得する。

\n *\n * @param {mapray.Area} area 領域\n *\n * @return {QAreaNode|mapray.Entity.AreaStatus} area に対応するノード | AreaStatus.EMPTY | AreaStatus.FULL\n *\n * @private\n */\n _get_area_node( area )\n {\n let msize = 2;\n let min_x = -1;\n let max_y = 1;\n\n if ( this._tree_root === null ) {\n let content = this.getInitialContent();\n this._tree_root = this._create_area_node( min_x, max_y, msize, content );\n }\n\n let node = this._tree_root;\n\n let tsize = Math.round( Math.pow( 2, area.z ) ); // 現行レベルでの縦横タイル数\n let rx = area.x; // 現行レベルでのタイル x 座標\n let ry = area.y; // 現行レベルでのタイル y 座標\n\n while ( tsize != 1 && node !== Entity.AreaStatus.EMPTY && node !== Entity.AreaStatus.FULL ) {\n\n tsize /= 2;\n\n let u = (rx >= tsize) ? 1 : 0;\n let v = (ry >= tsize) ? 1 : 0;\n\n msize /= 2;\n min_x += u * msize;\n max_y -= v * msize;\n\n let index = u + 2*v;\n let child = node.children[index];\n\n if ( child === null ) {\n // 子ノードを生成して node に設定\n child = this._create_area_node( min_x, max_y, msize, node.content );\n node.children[index] = child;\n }\n\n rx -= u * tsize;\n ry -= v * tsize;\n node = child;\n }\n\n return node;\n }\n\n}\n\n\n/**\n * @summary QAreaManager が管理するノード\n *\n * @memberof mapray.QAreaManager\n * @private\n */\nclass QAreaNode {\n\n /**\n * @param {object} content 内容データ\n */\n constructor( content )\n {\n this.children = [null, null, null, null]; // QAreaNode | AreaStatus.EMPTY | AreaStatus.FULL\n this.content = content;\n }\n\n}\n\n\nexport default QAreaManager;\n","import Entity from \"./Entity\";\nimport Primitive from \"./Primitive\";\nimport Mesh from \"./Mesh\";\nimport LineMaterial from \"./LineMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport GeoRegion from \"./GeoRegion\";\nimport AltitudeMode from \"./AltitudeMode\";\nimport EntityRegion from \"./EntityRegion\";\nimport AreaUtil from \"./AreaUtil\";\nimport QAreaManager from \"./QAreaManager\";\nimport Type from \"./animation/Type\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary 線エンティティ\n *\n * @classdesc\n *

{@link mapray.MarkerLineEntity} と {@link mapray.PathEntity} の共通機能を\n * 提供するクラスである。

\n *\n * @memberof mapray\n * @extends mapray.Entity\n * @abstract\n * @protected\n */\nclass AbstractLineEntity extends Entity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {mapray.AbstractLineEntity.LineType} line_type クラス種別\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, line_type, opts )\n {\n super( scene, opts );\n \n this._line_type = line_type;\n\n if ( this.altitude_mode === AltitudeMode.CLAMP ) {\n this._producer = new FlakePrimitiveProducer( this );\n this._is_flake_mode = true;\n }\n else {\n this._producer = new PrimitiveProducer( this );\n this._is_flake_mode = false;\n }\n }\n\n\n /**\n * @override\n */\n getPrimitiveProducer()\n {\n return (!this._is_flake_mode) ? this._producer : null;\n }\n\n\n /**\n * @override\n */\n getFlakePrimitiveProducer()\n {\n return (this._is_flake_mode) ? this._producer : null;\n }\n\n\n /**\n * @override\n */\n onChangeAltitudeMode( prev_mode )\n {\n if ( this.altitude_mode === AltitudeMode.CLAMP ) {\n this._producer = new FlakePrimitiveProducer( this );\n this._is_flake_mode = true;\n }\n else {\n this._producer = new PrimitiveProducer( this );\n this._is_flake_mode = false;\n }\n }\n\n\n /**\n * @summary 線の太さを設定\n *\n * @param {number} width 線の太さ (画素単位)\n */\n setLineWidth( width )\n {\n if ( this._width !== width ) {\n this._width = width;\n this._producer.onChangeProperty();\n }\n }\n\n\n /**\n * @summary 基本色を設定\n *\n * @param {mapray.Vector3} color 基本色\n */\n setColor( color )\n {\n if ( this._color[0] !== color[0] ||\n this._color[1] !== color[1] ||\n this._color[2] !== color[2] ) {\n // 位置が変更された\n GeoMath.copyVector3( color, this._color );\n this._producer.onChangeProperty();\n }\n }\n\n\n /**\n * @summary 不透明度を設定\n *\n * @param {number} opacity 不透明度\n */\n setOpacity( opacity )\n {\n if ( this._opacity !== opacity ) {\n this._opacity = opacity;\n this._producer.onChangeProperty();\n }\n }\n\n\n /**\n * @summary すべての頂点のバウンディングを算出\n *\n * @override\n * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion\n */\n getBounds()\n {\n const region = new GeoRegion();\n region.addPointsAsArray( this._point_array );\n return region;\n }\n\n\n /**\n * @summary 専用マテリアルを取得\n * @private\n */\n _getLineMaterial( render_target )\n {\n const scene = this.scene;\n const cache_id = (\n \"_AbstractLineEntity_material\" +\n (this._line_type === LineType.PATH ? \"_path\" : \"_markerline\") +\n (render_target === RenderTarget.RID ? \"_pick\" : \"\")\n );\n\n if ( !scene[cache_id] ) {\n // scene にマテリアルをキャッシュ\n const opt = { ridMaterial: render_target === RenderTarget.RID };\n scene[cache_id] = new LineMaterial( scene.glenv, this._line_type, opt );\n }\n\n return scene[cache_id];\n }\n}\n\n\n/**\n * @summary MarkerLineEntity の PrimitiveProducer\n *\n * @private\n */\nclass PrimitiveProducer extends Entity.PrimitiveProducer {\n\n /**\n * @param {mapray.MarkerLineEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n // プリミティブの要素\n this._transform = GeoMath.setIdentity( GeoMath.createMatrix() );\n this._pivot = GeoMath.createVector3();\n this._bbox = [GeoMath.createVector3(),\n GeoMath.createVector3()];\n\n this._properties = {\n width: 1.0,\n color: GeoMath.createVector3f(),\n opacity: 1.0\n };\n \n if ( entity._line_type == LineType.PATH ) {\n this._properties[\"lower_length\"] = 0.0;\n this._properties[\"upper_length\"] = 0.0;\n }\n\n // プリミティブ\n const material = entity._getLineMaterial( RenderTarget.SCENE );\n const primitive = new Primitive( entity.scene.glenv, null, material, this._transform );\n primitive.pivot = this._pivot;\n primitive.bbox = this._bbox;\n primitive.properties = this._properties;\n this._primitive = primitive;\n\n const pick_material = entity._getLineMaterial( RenderTarget.RID );\n const pickPrimitive = new Primitive( entity.scene.glenv, null, pick_material, this._transform );\n pickPrimitive.pivot = this._pivot;\n pickPrimitive.bbox = this._bbox;\n pickPrimitive.properties = this._properties;\n this._pickPrimitive = pickPrimitive;\n\n // プリミティブ配列\n this._primitives = [primitive];\n this._pickPrimitives = [pickPrimitive];\n\n this._geom_dirty = true;\n }\n\n\n /**\n * @override\n */\n createRegions()\n {\n let region = new EntityRegion();\n\n region.addPoints( this.entity._point_array, 0, 3, this._numPoints() );\n\n return [region];\n }\n\n\n /**\n * @override\n */\n onChangeElevation( regions )\n {\n this._geom_dirty = true;\n }\n\n\n /**\n * @override\n */\n getPrimitives( stage )\n {\n if ( this._num_floats < 6 ) {\n // 2頂点未満は表示しない\n return [];\n }\n else {\n this._updatePrimitive();\n return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives;\n }\n }\n\n\n /**\n * @summary 頂点が変更されたことを通知\n */\n onChangePoints()\n {\n this.needToCreateRegions();\n this._geom_dirty = true;\n }\n\n\n /**\n * @summary プロパティが変更されたことを通知\n */\n onChangeProperty()\n {\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n *
\n     * 条件: this._num_floats >= 6\n     * 入力:\n     *   this._geom_dirty\n     *   this.entity._point_array\n     *   this.entity._num_floats\n     *   this.entity._width\n     *   this.entity._color\n     *   this.entity._opacity\n     *   this.entity._length_array\n     * 出力:\n     *   this._transform\n     *   this._pivot\n     *   this._bbox\n     *   this._properties\n     *   this._primitive.mesh\n     *   this._geom_dirty\n     * 
\n *\n * @private\n */\n _updatePrimitive()\n {\n this._updateProperties();\n\n if ( !this._geom_dirty ) {\n // メッシュは更新する必要がない\n return;\n }\n\n let entity = this.entity;\n\n // GeoPoint 平坦化配列を GOCS 平坦化配列に変換\n var num_points = this._numPoints();\n var gocs_buffer = GeoPoint.toGocsArray( this._getFlatGeoPoints_with_Absolute(), num_points,\n new Float64Array( entity._num_floats ) );\n\n // プリミティブの更新\n // primitive.transform\n // primitive.pivot\n // primitive.bbox\n this._updateTransformPivotBBox( gocs_buffer, num_points );\n\n let add_length = (entity._line_type === LineType.PATH);\n let length_array = add_length ? entity._length_array : undefined;\n\n // メッシュ生成\n var mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 },\n { name: \"a_direction\", size: 3 },\n { name: \"a_where\", size: 2 }\n ],\n vertices: this._createVertices( gocs_buffer, num_points, length_array ),\n indices: this._createIndices()\n };\n\n if ( add_length ) {\n mesh_data.vtype.push( { name: \"a_length\", size: 1 } );\n }\n\n var mesh = new Mesh( entity.scene.glenv, mesh_data );\n\n // メッシュ設定\n // primitive.mesh\n var primitive = this._primitive;\n if ( primitive.mesh ) {\n primitive.mesh.dispose();\n }\n primitive.mesh = mesh;\n\n var pickPrimitive = this._pickPrimitive;\n if ( pickPrimitive.mesh ) {\n pickPrimitive.mesh.dispose();\n }\n pickPrimitive.mesh = mesh;\n\n // 更新終了\n this._geom_dirty = false;\n }\n\n\n /**\n * @summary プロパティを更新\n *\n * @desc\n *
\n     * 入力:\n     *   this.entity._width\n     *   this.entity._color\n     *   this.entity._opacity\n     *   this.entity._lower_length\n     *   this.entity._upper_length\n     * 出力:\n     *   this._properties\n     * 
\n *\n * @private\n */\n _updateProperties()\n {\n let entity = this.entity;\n let props = this._properties;\n\n props.width = entity._width;\n GeoMath.copyVector3( entity._color, props.color );\n props.opacity = entity._opacity;\n props.lower_length = entity._lower_length;\n props.upper_length = entity._upper_length;\n }\n\n\n /**\n * @summary GeoPoint 平坦化配列を取得 (絶対高度)\n *\n * @return {number[]} GeoPoint 平坦化配列\n * @private\n */\n _getFlatGeoPoints_with_Absolute()\n {\n let entity = this.entity;\n let point_array = entity._point_array;\n let num_floats = entity._num_floats;\n\n var abs_buffer = null;\n\n switch ( entity.altitude_mode ) {\n case AltitudeMode.RELATIVE:\n var num_points = this._numPoints();\n abs_buffer = new Float64Array( num_floats );\n // abs_buffer[] の高度要素に現在の標高を設定\n entity.scene.viewer.getExistingElevations( num_points, point_array, 0, 3, abs_buffer, 2, 3 );\n // abs_buffer[] に経度要素と緯度要素を設定し、高度要素に絶対高度を設定\n for ( var i = 0; i < num_floats; i += 3 ) {\n abs_buffer[i ] = point_array[i ]; // 経度\n abs_buffer[i + 1] = point_array[i + 1]; // 緯度\n abs_buffer[i + 2] += point_array[i + 2]; // 絶対高度\n }\n break;\n\n default: // AltitudeMode.ABSOLUTE\n abs_buffer = point_array;\n break;\n }\n\n return abs_buffer;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n *
\n     * 出力:\n     *   this._transform\n     *   this._pivot\n     *   this._bbox\n     * 
\n *\n * @param {Float64Array} gocs_buffer 入力頂点配列 (GOCS)\n * @param {number} num_points 入力頂点数\n * @private\n */\n _updateTransformPivotBBox( gocs_buffer, num_points )\n {\n // モデル座標系の原点 (GOCS)\n var ox = gocs_buffer[0];\n var oy = gocs_buffer[1];\n var oz = gocs_buffer[2];\n\n // 変換行列の更新\n var transform = this._transform;\n transform[12] = ox;\n transform[13] = oy;\n transform[14] = oz;\n\n // 統計\n var xsum = 0;\n var ysum = 0;\n var zsum = 0;\n\n var xmin = Number.MAX_VALUE;\n var ymin = Number.MAX_VALUE;\n var zmin = Number.MAX_VALUE;\n\n var xmax = -Number.MAX_VALUE;\n var ymax = -Number.MAX_VALUE;\n var zmax = -Number.MAX_VALUE;\n\n for ( var i = 0; i < num_points; ++i ) {\n var b = 3 * i;\n var x = gocs_buffer[b] - ox;\n var y = gocs_buffer[b + 1] - oy;\n var z = gocs_buffer[b + 2] - oz;\n\n xsum += x;\n ysum += y;\n zsum += z;\n\n if ( x < xmin ) { xmin = x; }\n if ( y < ymin ) { ymin = y; }\n if ( z < zmin ) { zmin = z; }\n\n if ( x > xmax ) { xmax = x; }\n if ( y > ymax ) { ymax = y; }\n if ( z > zmax ) { zmax = z; }\n }\n\n // 中心点\n var pivot = this._pivot;\n pivot[0] = xsum / num_points;\n pivot[1] = ysum / num_points;\n pivot[2] = zsum / num_points;\n\n // 境界箱\n var bbox = this._bbox;\n var bmin = bbox[0];\n var bmax = bbox[1];\n bmin[0] = xmin;\n bmin[1] = ymin;\n bmin[2] = zmin;\n bmax[0] = xmax;\n bmax[1] = ymax;\n bmax[2] = zmax;\n }\n\n\n /**\n * @summary 頂点配列の生成\n *\n * @param {Float64Array} gocs_buffer 入力頂点配列 (GOCS)\n * @param {number} num_points 入力頂点数\n * @return {Float32Array} Mesh 用の頂点配列\n *\n * @private\n */\n _createVertices( gocs_buffer, num_points, length_array = undefined )\n {\n // 頂点の距離を追加するか\n var add_length = (length_array !== undefined);\n\n // モデル座標系の原点 (GOCS)\n var ox = gocs_buffer[0];\n var oy = gocs_buffer[1];\n var oz = gocs_buffer[2];\n\n var num_segments = num_points - 1;\n var num_vertices = 4 * num_segments;\n var vertices = new Float32Array( (add_length ? 9 : 8) * num_vertices );\n\n for ( var i = 0; i < num_segments; ++i ) {\n var b = 3 * i;\n var sx = gocs_buffer[b] - ox;\n var sy = gocs_buffer[b + 1] - oy;\n var sz = gocs_buffer[b + 2] - oz;\n var ex = gocs_buffer[b + 3] - ox;\n var ey = gocs_buffer[b + 4] - oy;\n var ez = gocs_buffer[b + 5] - oz;\n var dx = gocs_buffer[b + 3] - gocs_buffer[b];\n var dy = gocs_buffer[b + 4] - gocs_buffer[b + 1];\n var dz = gocs_buffer[b + 5] - gocs_buffer[b + 2];\n var v = (add_length ? 36 : 32) * i;\n\n // 始左、始右、終左、終右のループ\n for ( var j = 0; j < 4; ++j ) {\n var start = j < 2;\n var id = v + j * ( add_length ? 9 : 8 );\n\n vertices[id] = start ? sx : ex; // a_position.x\n vertices[id + 1] = start ? sy : ey; // a_position.y\n vertices[id + 2] = start ? sz : ez; // a_position.z\n vertices[id + 3] = dx; // a_direction.x\n vertices[id + 4] = dy; // a_direction.y\n vertices[id + 5] = dz; // a_direction.z\n\n switch ( j ) {\n case 0:\n vertices[id + 6] = -1; // a_where.x\n vertices[id + 7] = 1; // a_where.y\n break;\n case 1:\n vertices[id + 6] = -1; // a_where.x\n vertices[id + 7] = -1; // a_where.y\n break;\n case 2:\n vertices[id + 6] = 1; // a_where.x\n vertices[id + 7] = 1; // a_where.y\n break;\n case 3:\n vertices[id + 6] = 1; // a_where.x\n vertices[id + 7] = -1; // a_where.y\n break;\n }\n\n if ( add_length ) {\n vertices[id + 8] = length_array[start ? i : i + 1];\n }\n }\n }\n\n return vertices;\n }\n\n\n /**\n * @summary 頂点インデックスの生成\n *\n * @desc\n *
\n     * 条件: this.entity._num_floats >= 6\n     * 入力: this.entity._num_floats\n     * 
\n *\n * @return {Uint32Array} インデックス配列\n *\n * @private\n */\n _createIndices()\n {\n var num_points = this._numPoints();\n var num_segments = num_points - 1;\n var num_indices = 6 * num_segments;\n var indices = new Uint32Array( num_indices );\n\n for ( var i = 0; i < num_segments; ++i ) {\n var base_d = 6 * i;\n var base_s = 4 * i;\n indices[base_d] = base_s;\n indices[base_d + 1] = base_s + 1;\n indices[base_d + 2] = base_s + 2;\n indices[base_d + 3] = base_s + 2;\n indices[base_d + 4] = base_s + 1;\n indices[base_d + 5] = base_s + 3;\n }\n\n return indices;\n }\n\n\n /**\n * @summary 頂点数を取得\n *\n * @return {number} 頂点数\n *\n * @private\n */\n _numPoints()\n {\n return Math.floor( this.entity._num_floats / 3 );\n }\n\n}\n\n\n/**\n * @summary MarkerLineEntity の FlakePrimitiveProducer\n *\n * @private\n */\nclass FlakePrimitiveProducer extends Entity.FlakePrimitiveProducer {\n\n /**\n * @param {mapray.MarkerLineEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n this._material_map = Object.keys(RenderTarget).reduce((map, key) => {\n const render_target = RenderTarget[key];\n map.set( render_target, entity._getLineMaterial( render_target ) );\n return map;\n }, new Map());\n this._properties = null;\n this._area_manager = new LineAreaManager( entity );\n }\n\n\n /**\n * @override\n */\n getAreaStatus( area )\n {\n return this._area_manager.getAreaStatus( area );\n }\n\n\n /**\n * @override\n */\n createMesh( area, dpows, dem )\n {\n let segments = this._divideXY( area, dpows );\n if ( segments.length == 0 ) {\n return null;\n }\n\n let add_length = (this.entity._line_type === LineType.PATH);\n\n // メッシュ生成\n let mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 },\n { name: \"a_direction\", size: 3 },\n { name: \"a_where\", size: 2 }\n ],\n vertices: this._createVertices( area, dem, segments, add_length ),\n indices: this._createIndices( segments.length )\n };\n\n if ( add_length ) {\n mesh_data.vtype.push( { name: \"a_length\", size: 1 } );\n }\n\n return new Mesh( this.entity.scene.glenv, mesh_data );\n }\n\n\n /**\n * @override\n */\n getMaterialAndProperties( stage )\n {\n if ( this._properties === null ) {\n let entity = this.entity;\n this._properties = {\n width: entity._width,\n color: GeoMath.createVector3f( entity._color ),\n opacity: entity._opacity\n };\n\n if ( entity._line_type == LineType.PATH ) {\n this._properties[\"lower_length\"] = entity._lower_length;\n this._properties[\"upper_length\"] = entity._upper_length;\n }\n }\n\n return {\n material: this._material_map.get( stage.getRenderTarget() ),\n properties: this._properties\n };\n }\n\n\n /**\n * @summary 頂点が変更されたことを通知\n */\n onChangePoints()\n {\n this._area_manager.notifyForUpdateContent();\n this.notifyForUpdate();\n }\n\n\n /**\n * @summary プロパティが変更されたことを通知\n */\n onChangeProperty()\n {\n this._properties = null;\n }\n\n\n /**\n * @summary すべての線分を垂直グリッドで分割\n *\n * @param {mapray.Area} area 地表断片の領域\n * @param {number} msize area 寸法 ÷ π (厳密値)\n * @param {number} dpow area の x 分割指数\n *\n * @private\n */\n _divideXOnly( area, msize, dpow )\n {\n let x_min = Math.PI * (area.x * msize - 1);\n let x_max = Math.PI * ((area.x + 1) * msize - 1);\n\n let div_x = 1 << dpow; // 横分割数: 2^dpow\n let step_x = (x_max - x_min) / div_x; // 横分割間隔\n\n let segments = [];\n\n // 垂直グリッド線で分割\n for ( let [px, py, pl, qx, qy, ql] of this._area_manager.getAreaContent( area ) ) {\n\n let [x0, y0, l0, x1, y1, l1] = (px <= qx) ? [px, py, pl, qx, qy, ql] : [qx, qy, ql, px, py, pl];\n // assert: x0 <= x1\n\n if ( x1 < x_min || x0 >= x_max ) {\n // 線分の x 座標が area の範囲外\n continue;\n }\n\n if ( x0 == x1 ) {\n // 垂直線分なので、垂直グリッド線で分割しない\n segments.push( [x0, y0, l0, x1, y1, l1] );\n continue;\n }\n\n // 左端でトリミング\n let tx0 = x0;\n let ty0 = y0;\n let tl0 = l0;\n if ( x0 < x_min ) {\n let mu1 = (x_min - x0) / (x1 - x0);\n let mu0 = 1 - mu1;\n tx0 = x_min;\n ty0 = mu0*y0 + mu1*y1; // 左端線と線分の交点の y 座標\n tl0 = mu0*l0 + mu1*l1;\n }\n\n // 右端でトリミング\n let tx1 = x1;\n let ty1 = y1;\n let tl1 = l1;\n if ( x1 > x_max ) {\n let mu1 = (x_max - x0) / (x1 - x0);\n let mu0 = 1 - mu1;\n tx1 = x_max;\n ty1 = mu0*y0 + mu1*y1; // 右端線と線分の交点の y 座標\n tl1 = mu0*l0 + mu1*l1;\n }\n\n // グリッド線の範囲\n let i_min = Math.max( Math.ceil( (x0 - x_min) / step_x ), 1 );\n let i_max = Math.min( Math.floor( (x1 - x_min) / step_x ), div_x - 1 );\n\n let prev_x = tx0;\n let prev_y = ty0;\n let prev_l = tl0;\n\n for ( let i = i_min; i <= i_max; ++i ) {\n let next_x = x_min + step_x * i; // 垂直グリッド線の x 座標\n\n let mu1 = (next_x - x0) / (x1 - x0);\n let mu0 = 1 - mu1;\n\n let next_y = mu0*y0 + mu1*y1; // 垂直グリッド線と線分の交点の y 座標\n let next_l = mu0*l0 + mu1*l1;\n\n if ( prev_x != next_x || prev_y != next_y ) {\n segments.push( [prev_x, prev_y, prev_l, next_x, next_y, next_l] );\n }\n\n prev_x = next_x;\n prev_y = next_y;\n prev_l = next_l;\n }\n\n if ( prev_x != tx1 || prev_y != ty1 ) {\n segments.push( [prev_x, prev_y, prev_l, tx1, ty1, tl1] );\n }\n }\n\n return segments;\n }\n\n\n /**\n * @summary すべての線分をグリッドで分割\n *\n * @param {mapray.Area} area 地表断片の領域\n * @param {number[]} dpows area の xy 分割指数\n *\n * @private\n */\n _divideXY( area, dpows )\n {\n // area 寸法 ÷ π (厳密値)\n // 線分の場合、領域の端によるクリッピングがシビアなので厳密値 (2^整数) を使う\n let msize = 2 / Math.round( Math.pow( 2, area.z ) );\n\n // area の y 座標の範囲\n let y_min = Math.PI * (1 - (area.y + 1) * msize);\n let y_max = Math.PI * (1 - area.y * msize);\n\n let div_y = 1 << dpows[1]; // 縦分割数: 2^dpow\n let step_y = (y_max - y_min) / div_y; // 縦分割間隔\n\n let segments = [];\n\n // 水平グリッド線で分割\n for ( let [px, py, pl, qx, qy, ql] of this._divideXOnly( area, msize, dpows[0] ) ) {\n\n let [x0, y0, l0, x1, y1, l1] = (py <= qy) ? [px, py, pl, qx, qy, ql] : [qx, qy, ql, px, py, pl];\n // assert: y0 <= y1\n\n if ( y1 < y_min || y0 >= y_max ) {\n // 線分の y 座標が area の範囲外\n continue;\n }\n\n if ( y0 == y1 ) {\n // 水平線分なので、水平グリッド線で分割しない\n segments.push( [x0, y0, l0, x1, y1, l1] );\n continue;\n }\n\n // 下端でトリミング\n let tx0 = x0;\n let ty0 = y0;\n let tl0 = l0;\n if ( y0 < y_min ) {\n let mu1 = (y_min - y0) / (y1 - y0);\n let mu0 = 1 - mu1;\n tx0 = mu0*x0 + mu1*x1; // 下端線と線分の交点の x 座標\n ty0 = y_min;\n tl0 = mu0*l0 + mu1*l1;\n }\n\n // 上端でトリミング\n let tx1 = x1;\n let ty1 = y1;\n let tl1 = l1;\n if ( y1 > y_max ) {\n let mu1 = (y_max - y0) / (y1 - y0);\n let mu0 = 1 - mu1;\n tx1 = mu0*x0 + mu1*x1; // 上端線と線分の交点の x 座標\n ty1 = y_max;\n tl1 = mu0*l0 + mu1*l1;\n }\n\n // グリッド線の範囲\n let i_min = Math.max( Math.ceil( (y0 - y_min) / step_y ), 1 );\n let i_max = Math.min( Math.floor( (y1 - y_min) / step_y ), div_y - 1 );\n\n let prev_x = tx0;\n let prev_y = ty0;\n let prev_l = tl0;\n\n for ( let i = i_min; i <= i_max; ++i ) {\n let next_y = y_min + step_y * i; // 水平グリッド線の y 座標\n\n let mu1 = (next_y - y0) / (y1 - y0);\n let mu0 = 1 - mu1;\n\n let next_x = mu0*x0 + mu1*x1; // 水平グリッド線と線分の交点の x 座標\n let next_l = mu0*l0 + mu1*l1;\n\n if ( prev_x != next_x || prev_y != next_y ) {\n segments.push( [prev_x, prev_y, prev_l, next_x, next_y, next_l] );\n }\n\n prev_x = next_x;\n prev_y = next_y;\n prev_l = next_l;\n }\n\n if ( prev_x != tx1 || prev_y != ty1 ) {\n segments.push( [prev_x, prev_y, prev_l, tx1, ty1, tl1] );\n }\n }\n\n return segments;\n }\n\n\n /**\n * @summary 頂点配列の生成\n *\n * @param {mapray.Area} area 地表断片の領域\n * @param {mapray.DemBinary} dem DEM バイナリ\n *\n * @return {Float32Array} Mesh 用の頂点配列\n *\n * @private\n */\n _createVertices( area, dem, segments, add_length = false )\n {\n let sampler = dem.newLinearSampler();\n let [ox, oy, oz] = AreaUtil.getCenter( area, GeoMath.createVector3() );\n\n let num_segments = segments.length;\n let num_vertices = 4 * num_segments;\n let vertices = new Float32Array( (add_length ? 9 : 8) * num_vertices );\n\n for ( let i = 0; i < num_segments; ++i ) {\n let [smx, smy, prev_length, emx, emy, next_length] = segments[i];\n\n let [sgx, sgy, sgz] = toGocs( smx, smy, sampler );\n let [egx, egy, egz] = toGocs( emx, emy, sampler );\n\n let sx = sgx - ox;\n let sy = sgy - oy;\n let sz = sgz - oz;\n\n let ex = egx - ox;\n let ey = egy - oy;\n let ez = egz - oz;\n\n let dx = egx - sgx;\n let dy = egy - sgy;\n let dz = egz - sgz;\n\n let v = (add_length ? 36 : 32) * i;\n\n // 始左、始右、終左、終右のループ\n for ( var j = 0; j < 4; ++j ) {\n var start = j < 2;\n var id = v + j * ( add_length ? 9 : 8 );\n\n vertices[id] = start ? sx : ex; // a_position.x\n vertices[id + 1] = start ? sy : ey; // a_position.y\n vertices[id + 2] = start ? sz : ez; // a_position.z\n vertices[id + 3] = dx; // a_direction.x\n vertices[id + 4] = dy; // a_direction.y\n vertices[id + 5] = dz; // a_direction.z\n \n switch ( j ) {\n case 0:\n vertices[id + 6] = -1; // a_where.x\n vertices[id + 7] = 1; // a_where.y\n break;\n case 1:\n vertices[id + 6] = -1; // a_where.x\n vertices[id + 7] = -1; // a_where.y\n break;\n case 2:\n vertices[id + 6] = 1; // a_where.x\n vertices[id + 7] = 1; // a_where.y\n break;\n case 3:\n vertices[id + 6] = 1; // a_where.x\n vertices[id + 7] = -1; // a_where.y\n break;\n }\n\n if ( add_length ) {\n vertices[id + 8] = start ? prev_length : next_length;\n }\n }\n }\n\n return vertices;\n }\n\n\n /**\n * @summary @summary 頂点インデックスの生成\n *\n * @param {number} num_segments 線分の数\n *\n * @return {Uint32Array} Mesh 用の頂点インデックス\n *\n * @private\n */\n _createIndices( num_segments )\n {\n let num_indices = 6 * num_segments;\n let indices = new Uint32Array( num_indices );\n\n for ( let i = 0; i < num_segments; ++i ) {\n let base_d = 6 * i;\n let base_s = 4 * i;\n indices[base_d ] = base_s;\n indices[base_d + 1] = base_s + 1;\n indices[base_d + 2] = base_s + 2;\n indices[base_d + 3] = base_s + 2;\n indices[base_d + 4] = base_s + 1;\n indices[base_d + 5] = base_s + 3;\n }\n\n return indices;\n }\n\n}\n\n\n/**\n * @private\n */\nfunction\ntoGocs( x, y, sampler )\n{\n let λ = x;\n let φ = GeoMath.gudermannian( y );\n let r = GeoMath.EARTH_RADIUS + sampler.sample( x, y );\n\n let cosφ = Math.cos( φ );\n\n return [r * cosφ * Math.cos( λ ),\n r * cosφ * Math.sin( λ ),\n r * Math.sin( φ )];\n}\n\n\n/**\n * @summary 線分の領域管理\n *\n * @private\n */\nclass LineAreaManager extends QAreaManager {\n\n /**\n * @param {mapray.MarkerLineEntity} entity 管理対象のエンティティ\n */\n constructor( entity )\n {\n super();\n\n this._entity = entity;\n }\n\n\n /**\n * @override\n */\n getInitialContent()\n {\n const Degree = GeoMath.DEGREE;\n const RAngle = Math.PI / 2; // 直角\n const TwoPI = 2 * Math.PI; // 2π\n\n let segments = [];\n\n // 頂点データ\n let points = this._entity._point_array;\n let end_point = this._entity._num_floats;\n\n if ( end_point < 6 ) {\n // 線分なし\n return segments;\n }\n\n let is_path = (this._entity._line_type === LineType.PATH);\n let length_array = is_path ? this._entity._length_array : null;\n\n // 線分の始点 (ラジアン)\n let lon0 = points[0] * Degree;\n let lat0 = points[1] * Degree;\n let length0 = (is_path ? length_array[0] : 0);\n let lon1;\n let lat1;\n let length1;\n\n for ( let i = 3; i < end_point; i += 3, lon0 = lon1, lat0 = lat1, length0 = length1 ) {\n // 線分の終点 (ラジアン)\n lon1 = points[i ] * Degree;\n lat1 = points[i + 1] * Degree;\n length1 = (is_path ? length_array[i / 3] : 0);\n\n if ( lat0 <= -RAngle || lat0 >= RAngle ||\n lat1 <= -RAngle || lat1 >= RAngle ) {\n // 端点の緯度の絶対値が RAngle 以上の線分は除外\n // ※ まだ検討していないので、とりあえずの処置\n continue;\n }\n\n // 単位球メルカトル座標系に変換\n let x0 = lon0;\n let y0 = GeoMath.invGudermannian( lat0 );\n let l0 = length0;\n let x1 = lon1;\n let y1 = GeoMath.invGudermannian( lat1 );\n let l1 = length1;\n\n // 左端点と右端点\n let [xL, yL, lL, xR, yR, lR] = (x0 < x1) ? [x0, y0, l0, x1, y1, l1] : [x1, y1, l1, x0, y0, l0];\n\n // -π <= xL < π になるように xL を正規化\n if ( xL < -Math.PI || xL >= Math.PI ) {\n let dx = xR - xL;\n xL -= TwoPI * (Math.floor( (xL - Math.PI) / TwoPI ) + 1);\n if ( xL < -Math.PI || xL >= Math.PI ) {\n // 誤差対策\n xL = -Math.PI;\n }\n xR = xL + dx;\n }\n\n if ( xL == xR && yL == yR ) {\n // 長さ 0 の線分は除外\n continue;\n }\n\n // 線分を追加\n segments.push( [xL, yL, lL, xR, yR, lR] );\n\n if ( xR > Math.PI ) {\n // 線分が 180 度子午線をまたぐとき\n // こちらは多少厳密さを無視する\n segments.push( [xL - TwoPI, yL, lL, xR - TwoPI, yR, lR] );\n }\n }\n\n return segments;\n }\n\n\n /**\n * @override\n */\n createAreaContent( min_x, min_y, msize, parent_content )\n {\n // 単位球メルカトルでの領域に変換\n const x_area_min = Math.PI * min_x;\n const x_area_max = Math.PI * (min_x + msize);\n const y_area_min = Math.PI * min_y;\n const y_area_max = Math.PI * (min_y + msize);\n\n let segments = [];\n\n for ( let segment of parent_content ) {\n let [xP, yP, /*lP*/, xQ, yQ, /*lQ*/] = segment;\n if ( this._intersect( x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ ) ) {\n segments.push( segment );\n }\n }\n\n return (segments.length > 0) ? segments : Entity.AreaStatus.EMPTY;\n }\n\n\n /**\n * @summary 矩形と線分の交差判定\n *\n * @desc\n *

矩形領域と線分が交差するかどうかを返す。

\n *

矩形領域には x 座標が x_area_max の点と、y 座標が y_area_max の点は含まれないものとする。

\n *\n *
\n     * 事前条件:\n     *   x_area_min < x_area_max\n     *   y_area_min < y_area_max\n     * 
\n *\n * @param {number} x_area_min 矩形領域の最小 x 座標\n * @param {number} x_area_max 矩形領域の最大 x 座標\n * @param {number} y_area_min 矩形領域の最小 y 座標\n * @param {number} y_area_max 矩形領域の最大 y 座標\n * @param {number} xP 線分端点 P の x 座標\n * @param {number} yP 線分端点 P の y 座標\n * @param {number} xQ 線分端点 Q の x 座標\n * @param {number} yQ 線分端点 Q の y 座標\n *\n * @return {boolean} 交差するとき true, それ以外のとき false\n *\n * @private\n */\n _intersect( x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ )\n {\n if ( Math.abs( xP - xQ ) < Math.abs( yP - yQ ) ) {\n // 線分が垂直に近いとき\n return this._nhorz_intersect( x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ );\n }\n else {\n // 線分が水平に近いとき\n return this._nhorz_intersect( y_area_min, y_area_max, x_area_min, x_area_max, yP, xP, yQ, xQ );\n }\n }\n\n\n /**\n * @summary 矩形と非水平線分の交差判定\n *\n * @desc\n *

矩形領域と線分が交差するかどうかを返す。

\n *

矩形領域には x 座標が x_area_max の点と、y 座標が y_area_max の点は含まれないものとする。

\n *\n *
\n     * 事前条件:\n     *   x_area_min < x_area_max\n     *   y_area_min < y_area_max\n     *   yP != yQ\n     * 
\n *\n *

注意: |yP - yQ| が小さいと精度が悪くなる。

\n *\n * @param {number} x_area_min 矩形領域の最小 x 座標\n * @param {number} x_area_max 矩形領域の最大 x 座標\n * @param {number} y_area_min 矩形領域の最小 y 座標\n * @param {number} y_area_max 矩形領域の最大 y 座標\n * @param {number} xP 線分端点 P の x 座標\n * @param {number} yP 線分端点 P の y 座標\n * @param {number} xQ 線分端点 Q の x 座標\n * @param {number} yQ 線分端点 Q の y 座標\n *\n * @return {boolean} 交差するとき true, それ以外のとき false\n *\n * @private\n */\n _nhorz_intersect( x_area_min, x_area_max, y_area_min, y_area_max, xP, yP, xQ, yQ )\n {\n // 線分の y 座標の範囲\n let [y_line_min, y_line_max] = (yP < yQ) ? [yP, yQ] : [yQ, yP];\n\n if ( y_line_min >= y_area_max || y_line_max < y_area_min ) {\n // 線分の y 範囲が矩形領域の y 範囲の外側なので交差しない\n return false;\n }\n\n // 矩形領域と線分の y 座標が重なる範囲 (順不同)\n let y_range_0 = (y_area_min >= y_line_max) ? y_area_min : y_line_max;\n let y_range_1 = (y_area_max <= y_line_min) ? y_area_max : y_line_min;\n\n // y が {y_range_0, y_range_1} 範囲での線分の x 範囲 (順不同)\n let x_range_0 = xP + (xQ - xP) * (y_range_0 - yP) / (yQ - yP);\n let x_range_1 = xP + (xQ - xP) * (y_range_1 - yP) / (yQ - yP);\n\n // y が {y_range_0, y_range_1} 範囲での線分の x 範囲\n let [x_range_min, x_range_max] = (x_range_0 < x_range_1) ? [x_range_0, x_range_1] : [x_range_1, x_range_0];\n\n // [x_range_min, x_range_max] 範囲は矩形領域の x の範囲と重なるか?\n return (x_range_min < x_area_max) && (x_range_max >= x_area_min);\n }\n\n}\n\n\n /**\n * @summary エンティティの種類の列挙型\n * @enum {object}\n * @memberof mapray.AbstractLineEntity\n * @constant\n * @see mapray.AbstractLineEntity#line_type\n */\nvar LineType = {\n\n /**\n * MarkerLineEntity\n */\n MARKERLINE: { id: \"MARKERLINE\" },\n\n\n /**\n * PathEntity\n */\n PATH: { id: \"PATH\" }\n};\n\nAbstractLineEntity.LineType = LineType;\n\n\nexport default AbstractLineEntity;\n","import GeoMath from \"./GeoMath\";\nimport Type from \"./animation/Type\";\nimport AbstractLineEntity from \"./AbstractLineEntity\";\n\n\n/**\n * @summary 太さ付き連続線エンティティ\n * @memberof mapray\n * @extends mapray.AbstractLineEntity\n */\nclass MarkerLineEntity extends AbstractLineEntity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, opts )\n {\n super( scene, AbstractLineEntity.LineType.MARKERLINE, opts );\n\n this._point_array = new Float64Array( 0 );\n this._num_floats = 0;\n\n this._width = 1.0;\n this._color = GeoMath.createVector3( [1.0, 1.0, 1.0] );\n this._opacity = 1.0;\n\n this._setupAnimationBindingBlock();\n\n // 生成情報から設定\n if ( opts && opts.json ) {\n this._setupByJson( opts.json );\n }\n }\n\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const vector3 = Type.find( \"vector3\" );\n\n // パラメータ名: width\n // パラメータ型: number\n // 線の太さ\n block.addEntry( \"width\", [number], null, value => {\n this.setLineWidth( value );\n } );\n \n // パラメータ名: color\n // パラメータ型: vector3\n // 色\n block.addEntry( \"color\", [vector3], null, value => {\n this.setColor( value );\n } );\n \n // パラメータ名: opacity\n // パラメータ型: number\n // 不透明度\n block.addEntry( \"opacity\", [number], null, value => {\n this.setOpacity( value );\n } ); \n }\n\n\n /**\n * @summary 複数の頂点を追加\n *\n * @desc\n *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式の配列を与える。

\n *\n * @param {number[]} points 頂点の配列\n */\n addPoints( points )\n {\n var add_size = points.length;\n if ( add_size == 0 ) {\n // 追加頂点が無いので変化なし\n return;\n }\n\n // バッファを拡張\n var target_size = this._num_floats + add_size;\n var buffer_size = this._point_array.length;\n if ( target_size > buffer_size ) {\n var new_buffer = new Float64Array( Math.max( target_size, 2 * buffer_size ) );\n var old_buffer = this._point_array;\n var copy_size = this._num_floats;\n for ( var i = 0; i < copy_size; ++i ) {\n new_buffer[i] = old_buffer[i];\n }\n this._point_array = new_buffer;\n }\n\n // 頂点追加処理\n var buffer = this._point_array;\n var base = this._num_floats;\n for ( var j = 0; j < add_size; ++j ) {\n buffer[base + j] = points[j];\n }\n this._num_floats = target_size;\n\n // 形状が変化した可能性がある\n this._producer.onChangePoints();\n }\n\n\n /**\n * @private\n */\n _setupByJson( json )\n {\n // json.points\n this.addPoints( json.points );\n\n // json.line_width\n // .color\n // .opacity\n if ( json.line_width !== undefined ) this.setLineWidth( json.line_width );\n if ( json.color !== undefined ) this.setColor( json.color );\n if ( json.opacity !== undefined ) this.setOpacity( json.opacity );\n }\n\n}\n\n\nexport default MarkerLineEntity;\n","import GeoMath from \"./GeoMath\";\nimport Type from \"./animation/Type\";\nimport AbstractLineEntity from \"./AbstractLineEntity\";\n\n\n/**\n * @summary 太さ付き連続線エンティティ\n * @memberof mapray\n * @extends mapray.AbstractLineEntity\n */\nclass PathEntity extends AbstractLineEntity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, opts )\n {\n super( scene, AbstractLineEntity.LineType.PATH, opts );\n\n this._point_array = new Float64Array( 0 );\n this._num_floats = 0;\n this._length_array = new Float64Array( 0 );\n\n this._width = 1.0;\n this._color = GeoMath.createVector3( [1.0, 1.0, 1.0] );\n this._opacity = 1.0;\n this._lower_length = 0;\n this._upper_length = 0;\n\n this._setupAnimationBindingBlock();\n\n // 生成情報から設定\n if ( opts && opts.json ) {\n this._setupByJson( opts.json );\n }\n }\n\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const vector3 = Type.find( \"vector3\" );\n\n // パラメータ名: width\n // パラメータ型: number\n // 線の太さ\n block.addEntry( \"width\", [number], null, value => {\n this.setLineWidth( value );\n } );\n \n // パラメータ名: color\n // パラメータ型: vector3\n // 色\n block.addEntry( \"color\", [vector3], null, value => {\n this.setColor( value );\n } );\n \n // パラメータ名: opacity\n // パラメータ型: number\n // 不透明度\n block.addEntry( \"opacity\", [number], null, value => {\n this.setOpacity( value );\n } );\n \n // パラメータ名: lower_length\n // パラメータ型: number\n // 距離の下限値\n block.addEntry( \"lower_length\", [number], null, value => {\n this.setLowerLength( value );\n } );\n\n // パラメータ名: upper_length\n // パラメータ型: number\n // 距離の上限値\n block.addEntry( \"upper_length\", [number], null, value => {\n this.setUpperLength( value );\n } );\n }\n\n\n /**\n * @summary 距離の下限値を設定\n *\n * @param {number} lower_length 距離の下限値\n */\n setLowerLength( lower_length )\n { \n if ( this._lower_length !== lower_length ) {\n this._lower_length = lower_length;\n this._producer.onChangeProperty();\n }\n }\n\n\n /**\n * @summary 距離の上限値を設定\n *\n * @param {number} upper_length 距離の上限値\n */\n setUpperLength( upper_length )\n { \n if ( this._upper_length !== upper_length ) {\n this._upper_length = upper_length;\n this._producer.onChangeProperty();\n }\n }\n\n\n /**\n * @summary 複数の頂点を追加\n *\n * @desc\n *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式の配列を与える。

\n *\n * @param {number[]} points 頂点の配列\n * @param {number[]} length_array 始点からの距離の配列\n */\n addPoints( points, length_array )\n {\n let add_size = points.length;\n let add_length_size = length_array.length;\n if ( add_size == 0 || add_length_size == 0) {\n // 追加頂点が無いので変化なし\n return;\n }\n\n let num_length_floats = this._num_floats / 3;\n\n // バッファを拡張\n let target_size = this._num_floats + add_size;\n let buffer_size = this._point_array.length;\n if ( target_size > buffer_size ) {\n let new_buffer = new Float64Array( Math.max( target_size, 2 * buffer_size ) );\n let old_buffer = this._point_array;\n let copy_size = this._num_floats;\n for ( let i = 0; i < copy_size; ++i ) {\n new_buffer[i] = old_buffer[i];\n }\n this._point_array = new_buffer;\n }\n\n // 距離配列バッファを拡張\n let target_length_size = num_length_floats + add_length_size;\n let buffer_length_size = this._length_array.length;\n if ( target_length_size > buffer_length_size ) {\n let new_buffer = new Float64Array( Math.max( target_length_size, 2 * buffer_length_size ) );\n let old_buffer = this._length_array;\n let copy_size = num_length_floats;\n for ( let i = 0; i < copy_size; ++i ) {\n new_buffer[i] = old_buffer[i];\n }\n this._length_array = new_buffer;\n }\n\n // 頂点追加処理\n let buffer = this._point_array;\n let base = this._num_floats;\n for ( let i = 0; i < points.length; ++i ) {\n buffer[base + i] = points[i];\n }\n\n // 距離の配列を追加\n let buffer_length = this._length_array;\n let base_length = num_length_floats;\n for ( let i = 0; i < length_array.length; ++i ) {\n buffer_length[base_length + i] = length_array[i];\n }\n\n this._num_floats = target_size;\n\n // 形状が変化した可能性がある\n this._producer.onChangePoints();\n }\n\n /**\n * @private\n */\n _setupByJson( json )\n {\n // json.points\n this.addPoints( json.points.positions, json.points.lengths );\n\n // json.line_width\n // .color\n // .opacity\n // .lower_length\n // .upper_length\n if ( json.line_width !== undefined ) this.setLineWidth( json.line_width );\n if ( json.color !== undefined ) this.setColor( json.color );\n if ( json.opacity !== undefined ) this.setOpacity( json.opacity );\n if ( json.lower_length !== undefined ) this.setLowerLength( json.lower_length );\n if ( json.upper_length !== undefined ) this.setUpperLength( json.upper_length );\n }\n\n}\n\nexport default PathEntity;\n","import EntityMaterial from \"./EntityMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport text_vs_code from \"./shader/text.vert\";\nimport text_fs_code from \"./shader/text.frag\";\nimport rid_fs_code from \"./shader/rid.frag\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary テキストマテリアル\n * @memberof mapray\n * @extends mapray.EntityMaterial\n * @private\n * @see mapray.TextEntity\n */\nclass TextMaterial extends EntityMaterial {\n\n /**\n * @param {mapray.GLEnv} glenv\n */\n constructor( glenv, options = {} )\n {\n super( glenv, text_vs_code, options.ridMaterial ? rid_fs_code : text_fs_code );\n\n // 不変パラメータを事前設定\n this.bindProgram();\n this.setInteger( \"u_image\", TextMaterial.TEXUNIT_IMAGE );\n }\n\n\n /**\n * @override\n */\n isTranslucent( stage, primitive )\n {\n var props = primitive.properties;\n // If drawing background color, alpha is disable.\n return !props.enable_bg;\n }\n\n\n /**\n * @override\n */\n setParameters( stage, primitive )\n {\n super.setParameters( stage, primitive );\n\n var props = primitive.properties;\n\n // mat4 u_obj_to_clip\n this.setObjToClip( stage, primitive );\n\n // 画面パラメータ: {2/w, 2/h}\n // vec2 u_sparam\n var sparam = TextMaterial._sparam;\n sparam[0] = 2 / stage._width;\n sparam[1] = 2 / stage._height;\n this.setVector2( \"u_sparam\", sparam );\n\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n // テクスチャのバインド\n // sampler2D u_image\n var image_tex = props[\"image\"];\n this.bindTexture2D( TextMaterial.TEXUNIT_IMAGE, image_tex.handle );\n }\n }\n\n}\n\n\n// クラス定数の定義\n{\n TextMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット\n\n // 計算用一時領域\n TextMaterial._sparam = GeoMath.createVector2f();\n}\n\n\nexport default TextMaterial;\n","import EntityMaterial from \"./EntityMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport text_vs_code from \"./shader/simple_text.vert\";\nimport text_fs_code from \"./shader/simple_text.frag\";\nimport rid_fs_code from \"./shader/rid.frag\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary テキストマテリアル\n * @memberof mapray\n * @extends mapray.EntityMaterial\n * @private\n * @see mapray.TextEntity\n */\nclass SimpleTextMaterial extends EntityMaterial {\n\n /**\n * @param {mapray.GLEnv} glenv\n */\n constructor( glenv, options = {} )\n {\n super( glenv, text_vs_code, options.ridMaterial ? rid_fs_code : text_fs_code );\n\n // 不変パラメータを事前設定\n this.bindProgram();\n this.setInteger( \"u_image\", SimpleTextMaterial.TEXUNIT_IMAGE );\n }\n\n\n /**\n * @override\n */\n isTranslucent( stage, primitive )\n {\n // アンチエイリアス用のブレンドのため常に半透明\n return true;\n }\n\n\n /**\n * @override\n */\n setParameters( stage, primitive )\n {\n super.setParameters( stage, primitive );\n\n var props = primitive.properties;\n\n // mat4 u_obj_to_clip\n this.setObjToClip( stage, primitive );\n\n // 画面パラメータ: {2/w, 2/h}\n // vec2 u_sparam\n var sparam = SimpleTextMaterial._sparam;\n sparam[0] = 2 / stage._width;\n sparam[1] = 2 / stage._height;\n this.setVector2( \"u_sparam\", sparam );\n\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n // テクスチャのバインド\n // sampler2D u_image\n var image_tex = props[\"image\"];\n this.bindTexture2D( SimpleTextMaterial.TEXUNIT_IMAGE, image_tex.handle );\n }\n }\n\n}\n\n\n// クラス定数の定義\n{\n SimpleTextMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット\n\n // 計算用一時領域\n SimpleTextMaterial._sparam = GeoMath.createVector2f();\n}\n\n\nexport default SimpleTextMaterial;\n","/**\n * @summary Utility Class for Color\n * @memberof mapray\n */\nclass Color {\n /**\n * @param r {number} The red (0.0 ~ 1.0)\n * @param g {number} The green (0.0 ~ 1.0)\n * @param b {number} The blue (0.0 ~ 1.0)\n * @param a {number} The alpha (0.0 ~ 1.0)\n */\n constructor( r, g, b, a ) \n {\n this._r = r;\n this._g = g;\n this._b = b;\n this._a = a;\n }\n\n /**\n * @summary 不透明色を生成\n * @param {mapray.Vector3}\n * @return {mapray.Color}\n */\n static generateOpacityColor( rgb ) {\n return new Color(rgb[0], rgb[1], rgb[2], 1)\n }\n\n /**\n * @summary 色を代入\n * @desc\n *

src を dst に代入する。

\n * @param {mapray.Color} src 代入元\n * @param {mapray.Color} dst 代入先\n * @return {mapray.Color} dst\n */\n static copyColor( src, dst )\n {\n dst._r = src._r;\n dst._g = src._g;\n dst._b = src._b;\n dst._a = src._a;\n\n return dst;\n }\n\n /**\n * @summary 不透明色を代入\n * @desc\n *

src を dst に代入する。

\n * @param {mapray.Vector3} rgb 代入元\n * @param {mapray.Color} dst 代入先\n * @return {mapray.Color} dst\n */\n static setOpacityColor( rgb, dst )\n {\n dst._r = rgb[0];\n dst._g = rgb[1];\n dst._b = rgb[2];\n dst._a = 1;\n }\n\n /**\n * @summary 色配列に変換する\n * @desc\n *

0から255に正規化。 [R, G, B, A]の順番

\n *\n * @return {mapray.Vector4} dst\n */\n toArray()\n {\n return (this._a === 0 ? [0, 0, 0, 0] : [\n this.floatToByte(this._r) / this._a, \n this.floatToByte(this._g) / this._a, \n this.floatToByte(this._b) / this._a, \n this._a\n ]); \n }\n\n /**\n * @summary 色配列に変換する\n * @desc\n *

0から1に正規化。 [R, G, B, A]の順番

\n *\n * @return {mapray.Vector4} dst\n */\n toVector4()\n {\n return (this._a === 0 ? [0, 0, 0, 0] : [\n this._r / this._a, \n this._g / this._a, \n this._b / this._a, \n this._a\n ]);\n }\n\n /**\n * @summary RGBA文字列に変換する\n * @desc\n *

RGBA文字列に変換して文字列を返却

\n *\n * @return {mapray.string}\n */\n toRGBString()\n {\n const rgba = this.toArray();\n return `rgba(${Math.round(rgba[0])},${Math.round(rgba[1])},${Math.round(rgba[2])},${rgba[3]})`;\n }\n\n /**\n * @summary 0~1.0の色値を255までで正規化\n * @desc\n *

0から1で正規化された色値を255までに拡張する

\n *\n * @return {mapray.string}\n */\n floatToByte( value )\n {\n return value === 1.0 ? 255.0 : (value * 256.0) | 0;\n }\n\n /**\n * @summary Red\n * @type {number}\n * @readonly\n */\n get r() {\n return this._r;\n }\n\n /**\n * @summary Green\n * @type {number}\n * @readonly\n */\n get g() {\n return this._g;\n }\n\n /**\n * @summary Blue\n * @type {number}\n * @readonly\n */\n get b() {\n return this._b;\n }\n\n /**\n * @summary Alpha\n * @type {number}\n * @readonly\n */\n get a() {\n return this._a;\n }\n};\n\nexport default Color;\n","import Entity from \"./Entity\";\nimport GeoPoint from \"./GeoPoint\";\nimport GeoRegion from \"./GeoRegion\";\n\n\n/**\n * @summary 点エンティティ\n *\n * @classdesc\n *

{@link mapray.ImageIconEntity} と {@link mapray.PinEntity}\n * と {@link mapray.TextEntity} の共通機能を提供するクラスである。

\n *\n * @memberof mapray\n * @extends mapray.Entity\n * @abstract\n * @protected\n */\nclass AbstractPointEntity extends Entity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, opts )\n {\n super( scene, opts );\n\n // 要素管理\n this._entries = [];\n }\n\n\n /**\n * @summary すべてのEntryのバウンディングを算出\n *\n * @override\n * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion\n */\n getBounds()\n {\n const region = new GeoRegion();\n for ( let entry of this._entries ) {\n region.addPoint( entry._position );\n }\n return region;\n }\n\n\n}\n\n\nexport default AbstractPointEntity;\n","import Entity from \"./Entity\";\nimport Primitive from \"./Primitive\";\nimport Mesh from \"./Mesh\";\nimport Texture from \"./Texture\";\nimport TextMaterial from \"./TextMaterial\";\nimport SimpleTextMaterial from \"./SimpleTextMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport { RenderTarget } from \"./RenderStage\";\nimport AltitudeMode from \"./AltitudeMode\";\nimport EntityRegion from \"./EntityRegion\";\nimport Dom from \"./util/Dom\";\nimport Color from \"./util/Color\";\nimport EasyBindingBlock from \"./animation/EasyBindingBlock\";\nimport Type from \"./animation/Type\";\nimport AbstractPointEntity from \"./AbstractPointEntity\";\n\n/**\n * @summary テキストエンティティ\n *\n * @memberof mapray\n * @extends mapray.Entity\n */\nclass TextEntity extends AbstractPointEntity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, opts )\n {\n super( scene, opts );\n\n // テキストの親プロパティ\n this._text_parent_props = {\n font_style: \"normal\",\n font_weight: \"normal\",\n font_size: TextEntity.DEFAULT_FONT_SIZE,\n font_family: TextEntity.DEFAULT_FONT_FAMILY,\n color: Color.generateOpacityColor( TextEntity.DEFAULT_COLOR ),\n stroke_color: Color.generateOpacityColor( TextEntity.DEFAULT_STROKE_COLOR ),\n stroke_width: TextEntity.DEFAULT_STROKE_WIDTH,\n bg_color: Color.generateOpacityColor( TextEntity.DEFAULT_BG_COLOR ),\n enable_stroke: false,\n enable_bg: false\n };\n\n this._animation.addDescendantUnbinder( () => { this._unbindDescendantAnimations(); } );\n this._setupAnimationBindingBlock();\n\n // 生成情報から設定\n if ( opts && opts.json ) {\n this._setupByJson( opts.json );\n }\n }\n\n\n /**\n * @override\n */\n getPrimitiveProducer()\n {\n return this._primitive_producer;\n }\n\n\n /**\n * @override\n */\n onChangeAltitudeMode( prev_mode )\n {\n if ( this._primitive_producer ) {\n this._primitive_producer.onChangeAltitudeMode();\n }\n }\n\n\n /**\n * EasyBindingBlock.DescendantUnbinder 処理\n *\n * @private\n */\n _unbindDescendantAnimations()\n {\n // すべてのエントリーを解除\n for ( let entry of this._entries ) {\n entry.animation.unbindAllRecursively();\n }\n }\n\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const string = Type.find( \"string\" );\n const vector3 = Type.find( \"vector3\" );\n \n // パラメータ名: font_style\n // パラメータ型: string\n // フォントスタイル\n block.addEntry( \"font_style\", [string], null, value => {\n this.setFontStyle( value );\n } );\n \n // パラメータ名: font_weight\n // パラメータ型: string\n // フォントの太さ\n block.addEntry( \"font_weight\", [string], null, value => {\n this.setFontWeight( value );\n } );\n \n // パラメータ名: font_size\n // パラメータ型: number\n // フォントの大きさ\n block.addEntry( \"font_size\", [number], null, value => {\n this.setFontSize( value );\n } );\n \n // パラメータ名: color\n // パラメータ型: vector3\n // テキストの色\n block.addEntry( \"color\", [vector3], null, value => {\n this.setColor( value );\n } );\n \n // パラメータ名: stroke_color\n // パラメータ型: vector3\n // 縁の色\n block.addEntry( \"stroke_color\", [vector3], null, value => {\n this.setStrokeColor( value );\n } );\n \n // パラメータ名: stroke_width\n // パラメータ型: number\n // 縁の線幅\n block.addEntry( \"stroke_width\", [number], null, value => {\n this.setStrokeLineWidth( value );\n } );\n }\n\n\n /**\n * @summary フォントスタイルを設定\n * @param {string} style フォントスタイル (\"normal\" | \"italic\" | \"oblique\")\n */\n setFontStyle( style )\n {\n this._setValueProperty( \"font_style\", style );\n }\n\n\n /**\n * @summary フォントの太さを設定\n * @param {string} weight フォントの太さ (\"normal\" | \"bold\")\n */\n setFontWeight( weight )\n {\n this._setValueProperty( \"font_weight\", weight );\n }\n\n\n /**\n * @summary フォントの大きさを設定\n * @param {number} size フォントの大きさ (Pixels)\n */\n setFontSize( size )\n {\n this._setValueProperty( \"font_size\", size );\n }\n\n\n /**\n * @summary フォントファミリーを設定\n * @param {string} family フォントファミリー\n * @see https://developer.mozilla.org/ja/docs/Web/CSS/font-family\n */\n setFontFamily( family )\n {\n this._setValueProperty( \"font_family\", family );\n }\n\n\n /**\n * @summary テキストの色を設定\n * @param {mapray.Vector3} color テキストの色\n */\n setColor( color )\n {\n this._setColorProperty( \"color\", color );\n }\n\n /**\n * @summary テキスト縁の色を設定\n * @param {mapray.Vector3} color 縁の色\n */\n setStrokeColor( color )\n {\n this._setColorProperty( \"stroke_color\", color );\n }\n\n /**\n * @summary テキスト縁の太さを設定\n * @param {mapray.number} width 縁の線幅\n */\n setStrokeLineWidth( width )\n {\n this._setValueProperty( \"stroke_width\", width );\n }\n\n /**\n * @summary テキスト縁を有効にするかどうか\n * @param {boolean} enable trueなら有効\n */\n setEnableStroke( enable )\n {\n this._setValueProperty( \"enable_stroke\", enable );\n this._primitive_producer = new PrimitiveProducer( this );\n }\n\n /**\n * @summary テキスト背景の色を設定\n * @param {mapray.Vector3} color テキストの色\n */\n setBackgroundColor( color )\n {\n this._setColorProperty( \"bg_color\", color );\n }\n\n /**\n * @summary テキスト背景を有効にするかどうか\n * @param {boolean} enable trueなら有効\n */\n setEnableBackground( enable )\n {\n this._setValueProperty( \"enable_bg\", enable );\n this._primitive_producer = new PrimitiveProducer( this );\n }\n\n /**\n * @summary テキストを追加\n * @param {string} text テキスト\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {string} [props.font_style] フォントスタイル (\"normal\" | \"italic\" | \"oblique\")\n * @param {string} [props.font_weight] フォントの太さ (\"normal\" | \"bold\")\n * @param {number} [props.font_size] フォントの大きさ (Pixels)\n * @param {string} [props.font_family] フォントファミリー\n * @param {mapray.Color} [props.color] テキストの色\n * @param {mapray.Color} [props.stroke_color] テキスト縁の色\n * @param {number} [props.stroke_width] テキスト縁の幅\n * @param {mapray.Color} [props.bg_color] テキスト背景色\n * @param {boolean} [props.enable_stroke] テキストの縁取りを有効にするか\n * @param {string} [props.id] Entryを識別するID\n * @return {mapray.TextEntity.Entry} 追加したEntry\n */\n addText( text, position, props )\n {\n var entry = new Entry( this, text, position, props );\n this._entries.push( entry );\n this._primitive_producer = new PrimitiveProducer( this );\n this._primitive_producer.onAddTextEntry();\n return entry;\n }\n\n\n /**\n * @summary 専用マテリアルを取得\n * @private\n */\n _getTextMaterial( render_target )\n {\n var scene = this.scene;\n if ( render_target === RenderTarget.SCENE ) {\n if ( !scene._TextEntity_text_material ) {\n // scene にマテリアルをキャッシュ\n scene._TextEntity_text_material = new TextMaterial( scene.glenv );\n }\n return scene._TextEntity_text_material;\n }\n else if (render_target === RenderTarget.RID) {\n if ( !scene._TextEntity_text_material_pick ) {\n // scene にマテリアルをキャッシュ\n scene._TextEntity_text_material_pick = new TextMaterial( scene.glenv, { ridMaterial: true } );\n }\n return scene._TextEntity_text_material_pick;\n }\n }\n\n /**\n * @summary テキストだけを描画する専用マテリアルを取得\n * @private\n */\n _getSimpleTextMaterial( render_target )\n {\n var scene = this.scene;\n if ( render_target === RenderTarget.SCENE ) {\n if ( !scene._SimpleTextEntity_text_material ) {\n // scene にマテリアルをキャッシュ\n scene._SimpleTextEntity_text_material = new SimpleTextMaterial( scene.glenv );\n }\n return scene._SimpleTextEntity_text_material;\n }\n else if (render_target === RenderTarget.RID) {\n if ( !scene._SimpleTextEntity_text_material_pick ) {\n // scene にマテリアルをキャッシュ\n scene._SimpleTextEntity_text_material_pick = new SimpleTextMaterial( scene.glenv, { ridMaterial: true } );\n }\n return scene._SimpleTextEntity_text_material_pick;\n }\n }\n\n /**\n * @private\n */\n _setValueProperty( name, value )\n {\n var props = this._text_parent_props;\n if ( props[name] != value ) {\n props[name] = value;\n if ( this._primitive_producer ) {\n this._primitive_producer.onChangeParentProperty();\n }\n }\n }\n\n\n /**\n * @private\n */\n _setColorProperty( name, value )\n {\n var dst = this._text_parent_props[name];\n if ( dst.r != value[0] || dst.g != value[1] || dst.b != value[2] ) {\n Color.setOpacityColor( value, dst );\n if ( this._primitive_producer ) {\n this._primitive_producer.onChangeParentProperty();\n }\n }\n }\n\n\n /**\n * @private\n */\n _setupByJson( json )\n {\n var position = new GeoPoint();\n\n for ( let entry of json.entries ) {\n position.setFromArray( entry.position );\n this.addText( entry.text, position, entry );\n }\n\n if ( json.font_style !== undefined ) this.setFontStyle( json.font_style );\n if ( json.font_weight !== undefined ) this.setFontWeight( json.font_weight );\n if ( json.font_size !== undefined ) this.setFontSize( json.font_size );\n if ( json.font_family !== undefined ) this.setFontFamily( json.font_family );\n if ( json.color !== undefined ) this.setColor( json.color );\n if ( json.stroke_color !== undefined ) this.setStrokeColor ( json.stroke_color );\n if ( json.stroke_width !== undefined ) this.setStrokeLineWidth ( json.stroke_width );\n if ( json.enable_stroke !== undefined ) this.setEnableStroke ( json.enable_stroke );\n if ( json.bg_color !== undefined ) this.setBackgroundColor( json.bg_color );\n if ( json.enable_bg !== undefined ) this.setEnableBackground ( json.enable_bg );\n }\n\n /**\n * @private\n */\n _enableStroke( )\n {\n return this._text_parent_props[\"enable_stroke\"];\n }\n\n \n /**\n * @summary IDでEntryを取得\n * @param {string} id ID\n * @return {mapray.TextEntity.Entry} IDが一致するEntry(無ければundefined)\n */\n getEntry( id )\n {\n return this._entries.find((entry) => entry.id === id);\n }\n}\n\n\n// クラス定数の定義\n{\n TextEntity.DEFAULT_FONT_SIZE = 16;\n TextEntity.DEFAULT_FONT_FAMILY = \"sans-serif\";\n TextEntity.DEFAULT_COLOR = [1, 1, 1];\n TextEntity.DEFAULT_STROKE_COLOR = [0.0, 0.0, 0.0];\n TextEntity.DEFAULT_STROKE_WIDTH = 0.48;\n TextEntity.DEFAULT_BG_COLOR = [0.3, 0.3, 0.3];\n\n TextEntity.DEFAULT_TEXT_UPPER = 1.1;\n TextEntity.DEFAULT_TEXT_LOWER = 0.38;\n TextEntity.SAFETY_PIXEL_MARGIN = 1;\n TextEntity.MAX_IMAGE_WIDTH = 4096;\n}\n\n\n/**\n * @summary TextEntity の PrimitiveProducer\n *\n * TODO: relative で標高の変化のたびにテクスチャを生成する必要はないので\n * Layout でのテクスチャの生成とメッシュの生成を分離する\n *\n * @private\n */\nclass PrimitiveProducer extends Entity.PrimitiveProducer {\n\n /**\n * @param {mapray.TextEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n this._glenv = entity.scene.glenv;\n this._dirty = true;\n\n // プリミティブの要素\n this._transform = GeoMath.setIdentity( GeoMath.createMatrix() );\n this._properties = {\n enable_bg: false,\n image: null // テキスト画像\n };\n\n // プリミティブ\n var material = null, pickMaterial = null;\n if ( this._isSimpleText() ) {\n material = entity._getSimpleTextMaterial( RenderTarget.SCENE );\n pickMaterial = entity._getSimpleTextMaterial( RenderTarget.RID );\n } else {\n material = entity._getTextMaterial( RenderTarget.SCENE );\n pickMaterial = entity._getTextMaterial( RenderTarget.RID );\n }\n var primitive = new Primitive( this._glenv, null, material, this._transform );\n primitive.properties = this._properties;\n this._primitive = primitive;\n\n var pickPrimitive = new Primitive( this._glenv, null, pickMaterial, this._transform );\n pickPrimitive.properties = this._properties;\n this._pickPrimitive = pickPrimitive;\n\n // プリミティブ配列\n this._primitives = [];\n this._pickPrimitives = [];\n }\n\n\n /**\n * @override\n */\n createRegions()\n {\n const region = new EntityRegion();\n\n for ( let {position} of this.entity._entries ) {\n region.addPoint( position );\n }\n\n return [region];\n }\n\n\n /**\n * @override\n */\n onChangeElevation( regions )\n {\n this._dirty = true;\n }\n\n\n /**\n * @override\n */\n getPrimitives( stage )\n {\n this._updatePrimitive();\n return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives;\n }\n\n\n /**\n * @summary 親プロパティが変更されたことを通知\n */\n onChangeParentProperty()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary 子プロパティが変更されたことを通知\n */\n onChangeChildProperty()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary 高度モードが変更されたことを通知\n */\n onChangeAltitudeMode()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary テキストが追加されたことを通知\n */\n onAddTextEntry()\n {\n // 変化した可能性がある\n this.needToCreateRegions();\n this._dirty = true;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n * 入力:\n * this.entity._entries\n * this._dirty\n * 出力:\n * this._transform\n * this._properties.image\n * this._primitive.mesh\n * this._primitives\n * this._dirty\n *\n * @return {array.} this._primitives\n *\n * @private\n */\n _updatePrimitive()\n {\n if ( !this._dirty ) {\n // 更新する必要はない\n return;\n }\n this._updateProperties();\n\n if ( this.entity._entries.length == 0 ) {\n this._primitives = [];\n this._pickPrimitives = [];\n this._dirty = false;\n return;\n }\n\n // 各エントリーの GOCS 位置を生成 (平坦化配列)\n var gocs_array = this._createFlatGocsArray();\n\n // プリミティブの更新\n // primitive.transform\n this._updateTransform( gocs_array );\n\n var layout = new Layout( this, gocs_array );\n if ( !layout.isValid() ) {\n // 更新に失敗\n this._primitives = [];\n this._dirty = false;\n return this._primitives;\n }\n\n // テクスチャ設定\n var properties = this._properties;\n if ( properties.image ) {\n properties.image.dispose();\n }\n properties.image = layout.texture;\n\n // メッシュ生成\n var vtype = [];\n if ( this._isSimpleText() ) {\n vtype = [\n { name: \"a_position\", size: 3 },\n { name: \"a_offset\", size: 2 },\n { name: \"a_texcoord\", size: 2 },\n { name: \"a_color\", size: 4 }\n ];\n } else {\n vtype = [\n { name: \"a_position\", size: 3 },\n { name: \"a_offset\", size: 2 },\n { name: \"a_texcoord\", size: 2 },\n ];\n }\n var mesh_data = {\n vtype,\n vertices: layout.vertices,\n indices: layout.indices\n };\n var mesh = new Mesh( this._glenv, mesh_data );\n\n // メッシュ設定\n // primitive.mesh\n var primitive = this._primitive;\n if ( primitive.mesh ) {\n primitive.mesh.dispose();\n }\n primitive.mesh = mesh;\n\n var pickPrimitive = this._pickPrimitive;\n if ( pickPrimitive.mesh ) {\n pickPrimitive.mesh.dispose();\n }\n pickPrimitive.mesh = mesh;\n\n // 更新に成功\n this._primitives = [primitive];\n this._pickPrimitives = [pickPrimitive];\n this._dirty = false;\n }\n\n /**\n * @summary プロパティを更新\n *\n * @desc\n *
\n     * 入力:\n     *   this.entity\n     * 出力:\n     *   this._properties\n     * 
\n *\n * @private\n */\n _updateProperties()\n {\n let entity = this.entity;\n let props = this._properties;\n\n props.enable_bg = entity._text_parent_props.enable_bg;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n * 条件:\n * this.entity._entries.length > 0\n * 入力:\n * this.entity._entries.length\n * 出力:\n * this._transform\n *\n * @param {number[]} gocs_array GOCS 平坦化配列\n *\n * @private\n */\n _updateTransform( gocs_array )\n {\n var num_entries = this.entity._entries.length;\n var xsum = 0;\n var ysum = 0;\n var zsum = 0;\n\n for ( let i = 0; i < num_entries; ++i ) {\n let ibase = 3*i;\n xsum += gocs_array[ibase];\n ysum += gocs_array[ibase + 1];\n zsum += gocs_array[ibase + 2];\n }\n\n // 変換行列の更新\n var transform = this._transform;\n transform[12] = xsum / num_entries;\n transform[13] = ysum / num_entries;\n transform[14] = zsum / num_entries;\n }\n\n\n /**\n * @summary GOCS 平坦化配列を取得\n *\n * 入力: this.entity._entries\n *\n * @return {number[]} GOCS 平坦化配列\n * @private\n */\n _createFlatGocsArray()\n {\n const num_points = this.entity._entries.length;\n return GeoPoint.toGocsArray( this._getFlatGeoPoints_with_Absolute(), num_points,\n new Float64Array( 3 * num_points ) );\n }\n\n\n /**\n * @summary GeoPoint 平坦化配列を取得 (絶対高度)\n *\n * 入力: this.entity._entries\n *\n * @return {number[]} GeoPoint 平坦化配列\n * @private\n */\n _getFlatGeoPoints_with_Absolute()\n {\n const owner = this.entity;\n const entries = owner._entries;\n const num_points = entries.length;\n const flat_array = new Float64Array( 3 * num_points );\n\n // flat_array[] に経度要素と緯度要素を設定\n for ( let i = 0; i < num_points; ++i ) {\n let pos = entries[i].position;\n flat_array[3*i] = pos.longitude;\n flat_array[3*i + 1] = pos.latitude;\n }\n\n switch ( owner.altitude_mode ) {\n case AltitudeMode.RELATIVE:\n case AltitudeMode.CLAMP:\n // flat_array[] の高度要素に現在の標高を設定\n owner.scene.viewer.getExistingElevations( num_points, flat_array, 0, 3, flat_array, 2, 3 );\n\n if ( owner.altitude_mode === AltitudeMode.RELATIVE ) {\n // flat_array[] の高度要素に相対高度を加える\n for ( let i = 0; i < num_points; ++i ) {\n flat_array[3*i + 2] += entries[i].position.altitude;\n }\n }\n break;\n\n default: // AltitudeMode.ABSOLUTE\n // flat_array[] の高度要素に絶対高度を設定\n for ( let i = 0; i < num_points; ++i ) {\n flat_array[3*i + 2] = entries[i].position.altitude;\n }\n break;\n }\n\n return flat_array;\n }\n\n /**\n * @summary シンプルテキストモードかどうかを確認\n *\n *\n * @return {boolean} シンプルテキストモードならtrue.\n * @private\n */\n _isSimpleText() \n {\n let entity = this.entity;\n\n let enable = true;\n // check enable bg color or stroke;\n if ( entity._text_parent_props.enable_bg || entity._text_parent_props.enable_stroke ) {\n enable = false;\n }\n\n // check enable stroke\n let i = 0;\n while ( enable && entity._entries.length > i ) {\n let entry = entity._entries[i];\n enable = !entry.enable_stroke;\n i++;\n }\n\n return enable;\n }\n\n}\n\n\n/**\n * @summary テキスト要素\n * @hideconstructor\n * @memberof mapray.TextEntity\n * @public\n */\nclass Entry {\n\n /**\n * @param {mapray.TextEntity} owner 所有者\n * @param {string} text テキスト\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {string} [props.font_style] フォントスタイル (\"normal\" | \"italic\" | \"oblique\")\n * @param {string} [props.font_weight] フォントの太さ (\"normal\" | \"bold\")\n * @param {number} [props.font_size] フォントの大きさ (Pixels)\n * @param {string} [props.font_family] フォントファミリー\n * @param {mapray.Color} [props.color] テキストの色\n * @param {mapray.Color} [props.stroke_color] テキスト縁の色\n * @param {number} [props.stroke_width] テキスト縁の幅\n * @param {number} [props.enable_stroke] テキストの縁取りを有効にするか\n * @param {string} [props.id] Entryを識別するID\n */\n constructor( owner, text, position, props )\n {\n this._owner = owner;\n this._text = text;\n this._position = position.clone();\n\n // animation.BindingBlock\n this._animation = new EasyBindingBlock();\n \n this._setupAnimationBindingBlock();\n\n this._props = Object.assign( {}, props ); // props の複製\n this._copyColorProperty( \"color\" ); // deep copy\n this._copyColorProperty( \"stroke_color\" ); // deep copy\n this._copyColorProperty( \"bg_color\" ); // deep copy\n }\n\n \n /**\n * @summary テキスト\n * @type {string}\n * @readonly\n * @package\n */\n get text()\n {\n return this._text;\n }\n\n\n /**\n * @summary 位置\n * @type {mapray.GeoPoint}\n * @readonly\n * @package\n */\n get position()\n {\n return this._position;\n }\n\n \n /**\n * @summary ID\n * @type {string}\n * @readonly\n */\n get id()\n {\n return this._props.hasOwnProperty( \"id\" ) ? this._props.id : \"\";\n }\n \n\n /**\n * @summary フォントサイズ (Pixels)\n * @type {number}\n * @readonly\n * @package\n */\n get size()\n {\n var props = this._props;\n var parent = this._owner._text_parent_props;\n return props.font_size || parent.font_size;\n }\n\n\n /**\n * @summary テキストの色\n * @type {mapray.Vector3}\n * @readonly\n * @package\n */\n get color()\n {\n var props = this._props;\n var parent = this._owner._text_parent_props;\n return props.color || parent.color;\n }\n\n\n /**\n * @summary フォント\n * @type {string}\n * @readonly\n * @package\n * @see https://developer.mozilla.org/ja/docs/Web/CSS/font\n */\n get font()\n {\n var props = this._props;\n var parent = this._owner._text_parent_props;\n\n var style = props.font_style || parent.font_style;\n var variant = \"normal\";\n var weight = props.font_weight || parent.font_weight;\n var family = props.font_family || parent.font_family;\n\n return style + \" \" + variant + \" \" + weight + \" \" + this.size + \"px \" + family;\n }\n\n /**\n * @summary テキスト縁の色\n * @type {mapray.Color}\n * @readonly\n * @package\n */\n get stroke_color()\n {\n var props = this._props;\n var parent = this._owner._text_parent_props;\n return props.stroke_color || parent.stroke_color;\n }\n\n /**\n * @summary 縁の幅 (Pixels)\n * @type {number}\n * @readonly\n * @package\n */\n get stroke_width()\n {\n var props = this._props;\n var parent = this._owner._text_parent_props;\n return props.stroke_width || parent.stroke_width;\n }\n\n /**\n * @summary 縁を描画するか\n * @type {boolean}\n * @readonly\n * @package\n */\n get enable_stroke()\n {\n var props = this._props;\n var parent = this._owner._text_parent_props;\n return props.enable_stroke || parent.enable_stroke;\n }\n\n /**\n * @summary 背景色\n * @type {mapray.Color}\n * @readonly\n * @package\n */\n get bg_color()\n {\n var props = this._props;\n var parent = this._owner._text_parent_props;\n return props.bg_color || parent.bg_color;\n }\n\n /**\n * @summary 背景描画するか\n * @type {boolean}\n * @readonly\n * @package\n */\n get enable_background()\n {\n // Enable or Disable background can be set by parent.\n var parent = this._owner._text_parent_props;\n return parent.enable_bg;\n }\n\n \n /**\n * @summary アニメーションパラメータ設定\n *\n * @type {mapray.animation.BindingBlock}\n * @readonly\n */\n get animation() { return this._animation; }\n \n \n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const string = Type.find( \"string\" );\n const vector3 = Type.find( \"vector3\" );\n \n // パラメータ名: position\n // パラメータ型: vector3\n // ベクトルの要素が longitude, latitude, altitude 順であると解釈\n const position_temp = new GeoPoint();\n\n block.addEntry( \"position\", [vector3], null, value => {\n position_temp.setFromArray( value ); // Vector3 -> GeoPoint\n this.setPosition( position_temp );\n } );\n\n // パラメータ名: font_style\n // パラメータ型: string\n // フォントスタイル\n block.addEntry( \"font_style\", [string], null, value => {\n this.setFontStyle( value );\n } );\n \n // パラメータ名: font_weight\n // パラメータ型: string\n // フォントの太さ\n block.addEntry( \"font_weight\", [string], null, value => {\n this.setFontWeight( value );\n } );\n \n // パラメータ名: font_size\n // パラメータ型: number\n // フォントの大きさ\n block.addEntry( \"font_size\", [number], null, value => {\n this.setFontSize( value );\n } );\n \n // パラメータ名: color\n // パラメータ型: vector3\n // テキストの色\n block.addEntry( \"color\", [vector3], null, value => {\n this.setColor( value );\n } );\n \n // パラメータ名: stroke_color\n // パラメータ型: vector3\n // 縁の色\n block.addEntry( \"stroke_color\", [vector3], null, value => {\n this.setStrokeColor( value );\n } );\n \n // パラメータ名: stroke_width\n // パラメータ型: number\n // 縁の線幅\n block.addEntry( \"stroke_width\", [number], null, value => {\n this.setStrokeLineWidth( value );\n } );\n\n // パラメータ名: text\n // パラメータ型: string\n // テキスト\n block.addEntry( \"text\", [string], null, value => {\n this.setText( value );\n } ); \n }\n\n\n /**\n * @summary テキスト原点位置を設定\n *\n * @param {mapray.GeoPoint} position テキスト原点の位置\n */\n setPosition( position )\n {\n if ( this._position.longitude !== position.longitude ||\n this._position.latitude !== position.latitude ||\n this._position.altitude !== position.altitude ) {\n // 位置が変更された\n this._position.assign( position );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n\n\n /**\n * @summary フォントスタイルを設定\n * @param {string} style フォントスタイル (\"normal\" | \"italic\" | \"oblique\")\n */\n setFontStyle( style )\n {\n this._setValueProperty( \"font_style\", style );\n }\n\n\n /**\n * @summary フォントの太さを設定\n * @param {string} weight フォントの太さ (\"normal\" | \"bold\")\n */\n setFontWeight( weight )\n {\n this._setValueProperty( \"font_weight\", weight );\n }\n\n\n /**\n * @summary フォントの大きさを設定\n * @param {number} size フォントの大きさ (Pixels)\n */\n setFontSize( size )\n {\n this._setValueProperty( \"font_size\", size );\n }\n\n\n /**\n * @summary テキストの色を設定\n * @param {mapray.Vector3} color テキストの色\n */\n setColor( color )\n {\n this._setColorProperty( \"color\", color );\n }\n\n\n /**\n * @summary テキスト縁の色を設定\n * @param {mapray.Vector3} color 縁の色\n */\n setStrokeColor( color )\n {\n this._setColorProperty( \"stroke_color\", color );\n }\n\n\n /**\n * @summary テキスト縁の太さを設定\n * @param {mapray.number} width 縁の線幅\n */\n setStrokeLineWidth( width )\n {\n this._setValueProperty( \"stroke_width\", width );\n }\n\n\n /**\n * @summary テキスト縁を有効にするかどうか\n * @param {boolean} enable trueなら有効\n */\n setEnableStroke( enable )\n {\n this._setValueProperty( \"enable_stroke\", enable );\n this._owner._primitive_producer = new PrimitiveProducer( this._owner );\n }\n\n\n /**\n * @summary テキストを設定\n * @param {string} text テキスト\n */\n setText( text )\n {\n if ( this._text !== text ) {\n this._text = text;\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n \n\n /**\n * @private\n */\n _copyColorProperty( name )\n {\n var props = this._props;\n if ( props.hasOwnProperty( name ) ) {\n props[name] = Color.generateOpacityColor( props[name] );\n }\n }\n\n\n /**\n * @private\n */\n _setValueProperty( name, value )\n {\n var props = this._props;\n if ( props[name] != value ) {\n props[name] = value;\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n\n\n /**\n * @private\n */\n _setColorProperty( name, value )\n {\n var dst = this._props[name];\n if ( dst )\n {\n if ( dst.r != value[0] || dst.g != value[1] || dst.b != value[2] ) {\n Color.setOpacityColor( value, dst );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n else\n {\n this._props[name] = Color.generateOpacityColor( value );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n}\n\nTextEntity.Entry = Entry;\n\n\n/**\n * @summary テキスト画像を Canvas 上にレイアウト\n *\n * @memberof mapray.TextEntity\n * @private\n */\nclass Layout {\n\n /**\n * @desc\n * 入力:\n * owner._glenv\n * owner.entity._entries\n * owner._transform\n *\n * @param {PrimitiveProducer} owner 所有者\n * @param {number[]} gocs_array GOCS 平坦化配列\n */\n constructor( owner, gocs_array )\n {\n this._owner = owner;\n this._items = this._createItemList();\n this._is_valid = true;\n\n var row_layouts = this._createRowLayouts();\n if ( row_layouts.length == 0 ) {\n // 有効なテキストが1つも無い\n this._is_valid = false;\n return;\n }\n\n // アイテムの配置の設定とキャンバスサイズの決定\n var size = this._setupLocation( row_layouts );\n\n if ( this._isSimpleTextWithAllItems( this._items ) ) { \n this._texture = this._createTextureForSimple( size.width, size.height );\n this._vertices = this._createVerticesForSimple( size.width, size.height, gocs_array );\n } else {\n this._texture = this._createTexture( size.width, size.height );\n this._vertices = this._createVertices( size.width, size.height, gocs_array );\n }\n this._indices = this._createIndices();\n }\n\n\n /**\n * @summary 有効なオブジェクトか?\n * @desc\n *

無効のとき、他のメソッドは呼び出せない。

\n * @return {boolean} 有効のとき true, 無効のとき false\n */\n isValid()\n {\n return this._is_valid;\n }\n\n\n /**\n * @summary テクスチャ\n * @type {mapray.Texture}\n * @readonly\n */\n get texture()\n {\n return this._texture;\n }\n\n\n /**\n * @summary 頂点配列\n * @desc\n * 条件:\n * this._entries.length > 0\n * 入力:\n * this._entries\n * this._transform\n * @type {Float32Array}\n * @readonly\n */\n get vertices()\n {\n return this._vertices;\n }\n\n\n /**\n * @summary インデックス配列\n * @type {Uint32Array}\n * @readonly\n */\n get indices()\n {\n return this._indices;\n }\n\n\n /**\n * @summary レイアウトアイテムのリストを生成\n * @return {array.}\n * @private\n */\n _createItemList()\n {\n var context = Dom.createCanvasContext( 1, 1 );\n\n var items = [];\n for ( let entry of this._owner.entity._entries ) {\n items.push( new LItem( this, entry, context ) );\n }\n\n return items;\n }\n\n\n /**\n * @summary RowLayout のリストを生成\n * @return {array.}\n * @private\n */\n _createRowLayouts()\n {\n // アイテムリストの複製\n var items = [].concat( this._items );\n\n // RowLayout 内であまり高さに差が出ないように、アイテムリストを高さで整列\n items.sort( function( a, b ) { return a.height_pixel - b.height_pixel; } );\n\n // リストを生成\n var row_layouts = [];\n while ( items.length > 0 ) {\n var row_layout = new RowLayout( items );\n if ( row_layout.isValid() ) {\n row_layouts.push( row_layout );\n }\n }\n\n return row_layouts;\n }\n\n\n /**\n * @summary テクスチャを生成\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @return {mapray.Texture} テキストテクスチャ\n * @private\n */\n _createTexture( width, height )\n {\n var context = Dom.createCanvasContext( width, height );\n\n context.textAlign = \"left\";\n context.textBaseline = \"alphabetic\";\n context.fillStyle = \"rgba( 255, 255, 255, 1.0 )\";\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n if ( item._entry.enable_background ) {\n item.drawRect( context );\n }\n if ( item._entry.enable_stroke ) {\n item.drawStrokeText( context );\n }\n item.drawText( context );\n }\n\n var glenv = this._owner._glenv;\n var opts = {\n usage: Texture.Usage.TEXT\n };\n return new Texture( glenv, context.canvas, opts );\n }\n\n\n /**\n * @summary 頂点配列を生成\n *\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @param {number[]} gocs_array GOCS 平坦化配列\n * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...]\n *\n * @private\n */\n _createVertices( width, height, gocs_array )\n {\n var vertices = [];\n\n // テキスト集合の原点 (GOCS)\n var transform = this._owner._transform;\n var xo = transform[12];\n var yo = transform[13];\n var zo = transform[14];\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n // テキストの位置 (モデル座標系)\n var ibase = 3 * i;\n var xm = gocs_array[ibase] - xo;\n var ym = gocs_array[ibase + 1] - yo;\n var zm = gocs_array[ibase + 2] - zo;\n\n // ベースライン左端 (キャンバス座標系)\n var xc = item.pos_x;\n var yc = item.pos_y;\n\n var upper = item.upper;\n var lower = item.lower;\n var xsize = item.width;\n\n var xn = 1 / width;\n var yn = 1 / height;\n\n // 左下\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -xsize / 2, -lower ); // a_offset\n vertices.push( xc * xn, 1 - (yc + lower) * yn ); // a_texcoord\n\n // 右下\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( xsize / 2, -lower ); // a_offset\n vertices.push( (xc + xsize) * xn, 1 - (yc + lower) * yn ); // a_texcoord\n\n // 左上\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -xsize / 2, upper ); // a_offset\n vertices.push( xc * xn, 1 - (yc - upper) * yn ); // a_texcoord\n\n // 右上\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( xsize / 2, upper ); // a_offset\n vertices.push( (xc + xsize) * xn, 1 - (yc - upper) * yn ); // a_texcoord\n }\n\n return vertices;\n }\n\n\n /**\n * @summary 単純テキスト用テクスチャを生成\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @return {mapray.Texture} テキストテクスチャ\n * @private\n */\n _createTextureForSimple( width, height )\n {\n var context = Dom.createCanvasContext( width, height );\n\n context.textAlign = \"left\";\n context.textBaseline = \"alphabetic\";\n context.fillStyle = \"rgba( 255, 255, 255, 1.0 )\";\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n item.drawText( context );\n }\n\n var glenv = this._owner._glenv;\n var opts = {\n usage: Texture.Usage.SIMPLETEXT\n };\n return new Texture( glenv, context.canvas, opts );\n }\n\n\n /**\n * @summary 単純テキスト用頂点配列を生成\n *\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @param {number[]} gocs_array GOCS 平坦化配列\n * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...]\n *\n * @private\n */\n _createVerticesForSimple( width, height, gocs_array )\n {\n var vertices = [];\n\n // テキスト集合の原点 (GOCS)\n var transform = this._owner._transform;\n var xo = transform[12];\n var yo = transform[13];\n var zo = transform[14];\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n\n var entry = item.entry;\n\n // テキストの色\n var color = entry.color.toVector4();\n\n // テキストの位置 (モデル座標系)\n var ibase = 3 * i;\n var xm = gocs_array[ibase] - xo;\n var ym = gocs_array[ibase + 1] - yo;\n var zm = gocs_array[ibase + 2] - zo;\n\n // ベースライン左端 (キャンバス座標系)\n var xc = item.pos_x;\n var yc = item.pos_y;\n\n var upper = item.upper;\n var lower = item.lower;\n var xsize = item.width;\n\n var xn = 1 / width;\n var yn = 1 / height;\n\n // 左下\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -xsize / 2, -lower ); // a_offset\n vertices.push( xc * xn, 1 - (yc + lower) * yn ); // a_texcoord\n vertices.push( color[0], color[1], color[2], 1 ); // a_color\n\n // 右下\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( xsize / 2, -lower ); // a_offset\n vertices.push( (xc + xsize) * xn, 1 - (yc + lower) * yn ); // a_texcoord\n vertices.push( color[0], color[1], color[2], 1 ); // a_color\n\n // 左上\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -xsize / 2, upper ); // a_offset\n vertices.push( xc * xn, 1 - (yc - upper) * yn ); // a_texcoord\n vertices.push( color[0], color[1], color[2], 1 ); // a_color\n\n // 右上\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( xsize / 2, upper ); // a_offset\n vertices.push( (xc + xsize) * xn, 1 - (yc - upper) * yn ); // a_texcoord\n vertices.push( color[0], color[1], color[2], 1 ); // a_color\n }\n\n return vertices;\n }\n \n\n /**\n * @summary インデックス配列を生成\n * @return {array.} インデックス配列 []\n * @private\n */\n _createIndices()\n {\n var indices = [];\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n\n var b = 4 * i;\n indices.push( b, b + 1, b + 2, b + 2, b + 1 , b + 3 );\n }\n\n return indices;\n }\n\n\n /**\n * @summary アイテムの配置を設定\n * @param {array.} row_layouts\n * @return {object} キャンバスサイズ\n * @private\n */\n _setupLocation( row_layouts )\n {\n var width = 0;\n var height = 0;\n\n height += TextEntity.SAFETY_PIXEL_MARGIN;\n\n for ( var i = 0; i < row_layouts.length; ++i ) {\n var row_layout = row_layouts[i];\n row_layout.locate( height );\n width = Math.max( row_layout.width_assumed, width );\n height += row_layout.height_pixel + TextEntity.SAFETY_PIXEL_MARGIN;\n }\n\n return {\n width: width,\n height: height\n };\n }\n\n /**\n * @summary シンプルテキストモードかどうか\n * @param {mapray.TextEntity.LItem} item\n * @return {boolean} シンプルテキストモードならtrue\n * @private\n */\n _isSimpleText( item ) \n {\n if ( item._entry.enable_background || item._entry.enable_stroke ) {\n return false;\n }\n return true;\n } \n\n /**\n * @summary シンプルテキストモードかどうか\n * @param {array.} items\n * @return {boolean} シンプルテキストモードならtrue\n * @private\n */\n _isSimpleTextWithAllItems( items ) \n {\n let enable = true;\n let i = 0;\n while( enable && items.length > i) \n {\n let item = items[i];\n enable = this._isSimpleText( item );\n i++;\n }\n return enable;\n } \n\n}\n\n\n/**\n * @summary レイアウト対象\n * @memberof mapray.TextEntity\n * @private\n */\nclass LItem {\n\n /**\n * @param {mapray.TextEntity.Layout} layout 所有者\n * @param {mapray.TextEntity.Entry} entry TextEntity エントリ\n * @param {CanvasRenderingContext2D} context 測定用コンテキスト\n */\n constructor( layout, entry, context )\n {\n this._entry = entry;\n\n // テキストの基点\n this._pos_x = 0; // 左端\n this._pos_y = 0; // ベースライン位置\n\n // テキストの横幅\n context.font = entry.font;\n this._width = context.measureText( entry.text ).width;\n\n // テキストの上下範囲\n this._upper = entry.size * TextEntity.DEFAULT_TEXT_UPPER;\n this._lower = entry.size * TextEntity.DEFAULT_TEXT_LOWER;\n\n this._is_canceled = false;\n }\n\n\n /**\n * @type {mapray.TextEntity.Entry}\n * @readonly\n */\n get entry()\n {\n return this._entry;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get pos_x()\n {\n return this._pos_x;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get pos_y()\n {\n return this._pos_y;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get width()\n {\n return this._width;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get upper()\n {\n return this._upper;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get lower()\n {\n return this._lower;\n }\n\n\n /**\n * キャンバス上でのテキストの横画素数\n * @type {number}\n * @readonly\n */\n get width_pixel()\n {\n return Math.ceil( this._width );\n }\n\n\n /**\n * キャンバス上でのテキストの縦画素数\n * @type {number}\n * @readonly\n */\n get height_pixel()\n {\n return Math.ceil( this._upper ) + Math.ceil( this._lower );\n }\n\n\n /**\n * 取り消し状態か?\n * @type {boolean}\n * @readonly\n */\n get is_canceled()\n {\n return this._is_canceled;\n }\n\n\n /**\n * @summary 取り消し状態に移行\n */\n cancel()\n {\n this._is_canceled = true;\n }\n\n\n /**\n * @summary 配置を決定\n * @param {number} x テキスト矩形左辺の X 座標 (キャンバス座標系)\n * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系)\n */\n locate( x, y )\n {\n this._pos_x = x;\n this._pos_y = y + Math.ceil( this._upper );\n }\n\n\n /**\n * @summary テキストだけを描画 (stokeやfillRectとは組み合わせ不可)\n * @desc\n *

context は以下のように設定していること。

\n *
\n     *   context.textAlign    = \"left\";\n     *   context.textBaseline = \"alphabetic\";\n     *   context.fillStyle    = \"rgba( 255, 255, 255, 1.0 )\";\n     * 
\n * @param {CanvasRenderingContext2D} context 描画先コンテキスト\n */\n drawTextOnly( context )\n {\n var entry = this._entry;\n context.font = entry.font;\n context.fillText( entry.text, this._pos_x, this._pos_y );\n }\n\n\n /**\n * @summary テキストを描画\n * @desc\n *

context は以下のように設定していること。

\n *
\n     *   context.textAlign    = \"left\";\n     *   context.textBaseline = \"alphabetic\";\n     *   context.fillStyle    = \"rgba( 255, 255, 255, 1.0 )\";\n     * 
\n * @param {CanvasRenderingContext2D} context 描画先コンテキスト\n */\n drawText( context )\n {\n var entry = this._entry;\n\n context.font = entry.font;\n context.fillStyle = entry.color.toRGBString();\n context.fillText( entry.text, this._pos_x, this._pos_y );\n }\n\n \n /**\n * @summary テキストの淵を描画\n * @desc\n *

drawTextOnlyとは組み合わせ不可

\n\n * @param {CanvasRenderingContext2D} context 描画先コンテキスト\n */\n drawStrokeText( context )\n {\n /*\n context.fillText()\n .------------. \n |',',',',',',| \n |',',',',',',| \n |',',',',',',| \n |',',',',',',| \n |',',',',',',| \n\n context.strokeText()\n .--------------------.\n |',',',',',',',',',',|\n |','.------------.,',|\n |','|',',',',',',|,',|\n |','|','.----.,',|,',|\n |','|','| |,',|,',|\n |','|','| |,',|,',|\n |<--|-->|\n a b\n b will be overwrite by fillText();\n */\n var entry = this._entry;\n\n context.font = entry.font;\n context.strokeStyle = entry.stroke_color.toRGBString();\n context.lineWidth = entry.stroke_width * 2;\n context.lineJoin = \"round\";\n context.strokeText( entry.text, this._pos_x, this._pos_y );\n }\n\n\n /**\n * @summary テキストの背景を描画\n * @desc\n *

drawTextOnlyとは組み合わせ不可

\n\n * @param {CanvasRenderingContext2D} context 描画先コンテキスト\n */\n drawRect( context )\n {\n var entry = this._entry;\n\n context.fillStyle = entry.bg_color.toRGBString();\n context.fillRect( this._pos_x - TextEntity.SAFETY_PIXEL_MARGIN, this._pos_y - this._upper - TextEntity.SAFETY_PIXEL_MARGIN, this.width_pixel + TextEntity.SAFETY_PIXEL_MARGIN, this.height_pixel + TextEntity.SAFETY_PIXEL_MARGIN );\n }\n}\n\n\n/**\n * @summary 水平レイアウト\n * @memberof mapray.TextEntity\n * @private\n */\nclass RowLayout {\n\n /**\n * @desc\n *

レイアウトされた、またはレイアウトに失敗したアイテムは src_items から削除される。

\n *

レイアウトに失敗したアイテムは取り消し (is_canceled) になる。

\n * @param {array.} src_items アイテムリスト\n */\n constructor( src_items )\n {\n var width_assumed_total = 0;\n var height_pixel_max = 0;\n var row_items = [];\n\n width_assumed_total += TextEntity.SAFETY_PIXEL_MARGIN; // 左マージン\n\n while ( src_items.length > 0 ) {\n var item = src_items.shift();\n var width_assumed = item.width_pixel + TextEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン\n\n if ( width_assumed_total + width_assumed <= TextEntity.MAX_IMAGE_WIDTH ) {\n // 行にアイテムを追加\n row_items.push( item );\n width_assumed_total += width_assumed;\n height_pixel_max = Math.max( item.height_pixel, height_pixel_max );\n }\n else {\n if ( row_items.length == 0 ) {\n // テキストが長すぎて表示できない\n item.cancel();\n }\n else {\n // 次の行になるため差し戻して終了\n src_items.unshift( item );\n break;\n }\n }\n }\n\n this._items = row_items;\n this._width_assumed = width_assumed_total;\n this._height_pixel = height_pixel_max;\n }\n\n\n /**\n * @summary 有効なオブジェクトか?\n * @desc\n *

無効のとき、他のメソッドは呼び出せない。

\n * @return {boolean} 有効のとき true, 無効のとき false\n */\n isValid()\n {\n return this._items.length > 0;\n }\n\n\n /**\n * \n * @type {array.}\n * @readonly\n */\n get items()\n {\n return this._items;\n }\n\n\n /**\n * キャンバス上での行の横占有画素数\n * @type {number}\n * @readonly\n */\n get width_assumed()\n {\n return this._width_assumed;\n }\n\n\n /**\n * キャンバス上での行の縦画素数\n * @type {number}\n * @readonly\n */\n get height_pixel()\n {\n return this._height_pixel;\n }\n\n\n /**\n * @summary レイアウトの配置を決定\n * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系)\n */\n locate( y )\n {\n var items = this._items;\n var x = 0;\n\n x += TextEntity.SAFETY_PIXEL_MARGIN; // 左マージン\n\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n item.locate( x, y );\n x += item.width_pixel + TextEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン\n }\n }\n\n}\n\n\nexport default TextEntity;\n","import Entity from \"./Entity\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport GeoRegion from \"./GeoRegion\";\nimport Orientation from \"./Orientation\";\nimport AltitudeMode from \"./AltitudeMode\";\nimport EntityRegion from \"./EntityRegion\";\nimport Type from \"./animation/Type\";\nimport AnimUtil from \"./animation/AnimUtil\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary モデルエンティティ\n * @memberof mapray\n * @extends mapray.Entity\n */\nclass ModelEntity extends Entity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n *\n * @throws Error ModelContainer からモデルが見つからなかった\n */\n constructor( scene, opts )\n {\n super( scene, opts );\n\n this._position = new GeoPoint( 0, 0, 0 );\n this._rotation = GeoMath.setIdentity( GeoMath.createMatrix() );\n this._scale = GeoMath.createVector3( [1, 1, 1] );\n\n this._primitive_producer = new PrimitiveProducer( this );\n\n this._setupAnimationBindingBlock();\n\n // アンカーモード\n this._anchor_mode = false;\n\n if ( opts && opts.json ) {\n var json = opts.json;\n var refs = opts.refs || {};\n this._setupTransform( json );\n this._setupModelObject( json, refs );\n }\n }\n\n\n /**\n * @override\n * @private\n */\n get anchor_mode() { return this._anchor_mode; }\n\n /**\n * @summary アンカーモードを設定。\n * @see {@link mapray.Entity#anchor_mode}\n * @param {boolean} anchor_mode\n * @private\n */\n setAnchorMode( anchor_mode )\n {\n this._anchor_mode = anchor_mode;\n }\n\n\n\n /**\n * @override\n */\n getPrimitiveProducer()\n {\n return this._primitive_producer;\n }\n\n\n /**\n * @override\n */\n onChangeAltitudeMode( prev_mode )\n {\n this._primitive_producer.onChangeAltitudeMode();\n }\n\n\n /**\n * @summary bboxを利用して簡易的にバウンディングを算出\n *\n * @override\n * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion\n */\n getBounds()\n {\n const bounds = this._primitive_producer.getBounds();\n const region = new GeoRegion();\n region.addPointsAsArray( bounds );\n return region;\n }\n\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const vector3 = Type.find( \"vector3\" );\n const matrix = Type.find( \"matrix\" );\n\n // パラメータ名: position\n // パラメータ型: vector3\n // ベクトルの要素が longitude, latitude, altitude 順であると解釈\n const position_temp = new GeoPoint();\n\n block.addEntry( \"position\", [vector3], null, value => {\n position_temp.setFromArray( value ); // Vector3 -> GeoPoint\n this.setPosition( position_temp );\n } );\n\n // パラメータ名: orientation\n // パラメータ型: matrix | vector3\n // 型が matrix のとき MLOCS での回転行列\n // 型が vector3 のとき、要素が heading, tilt, roll 順であると解釈\n const orientation_temp = new Orientation();\n let orientation_type;\n\n let orientation_tsolver = curve => {\n orientation_type = AnimUtil.findFirstTypeSupported( curve, [matrix, vector3] );\n return orientation_type;\n };\n\n block.addEntry( \"orientation\", [matrix, vector3], orientation_tsolver, value => {\n if ( orientation_type === matrix ) {\n this._setRotation( value );\n }\n else { // orientation_type === vector3\n orientation_temp.heading = value[0];\n orientation_temp.tilt = value[1];\n orientation_temp.roll = value[2];\n this.setOrientation( orientation_temp );\n }\n } );\n\n // パラメータ名: scale\n // パラメータ型: vector3 | number\n // 型が vector3 のときは XYZ 別の倍率\n // 型が number のときは均等倍率\n const scale_temp = GeoMath.createVector3();\n let scale_type;\n\n let scale_tsolver = curve => {\n scale_type = AnimUtil.findFirstTypeSupported( curve, [vector3, number] );\n return scale_type;\n };\n\n block.addEntry( \"scale\", [vector3, number], scale_tsolver, value => {\n if ( scale_type === vector3 ) {\n this.setScale( value );\n }\n else { // scale_type === number\n scale_temp[0] = value;\n scale_temp[1] = value;\n scale_temp[2] = value;\n this.setScale( scale_temp );\n }\n } );\n }\n\n\n /**\n * @summary position, orientation, scale を設定\n *\n * @param {object} json 生成情報\n *\n * @private\n */\n _setupTransform( json )\n {\n let tr = json.transform; // \n\n // position\n this.setPosition( new GeoPoint().setFromArray( tr.position ) );\n\n // heading, tilt, roll\n this.setOrientation( new Orientation( tr.heading, tr.tilt, tr.roll ) );\n\n // scale\n var scale = (tr.scale !== undefined) ? tr.scale : [1, 1, 1]; // \n if ( typeof scale == 'number' ) {\n // スケールをベクトルに正規化\n scale = [scale, scale, scale];\n }\n this.setScale( scale );\n }\n\n\n /**\n * @summary モデルを設定\n *\n * @param {object} json 生成情報\n * @param {object} refs 参照辞書\n *\n * @throws Error\n *\n * @private\n */\n _setupModelObject( json, refs )\n {\n let container = refs[json.ref_model];\n\n this._primitive_producer.setModelObject( container, json.index );\n }\n\n\n /**\n * @summary モデル原点位置を設定\n *\n * @param {mapray.GeoPoint} value モデル原点の位置\n */\n setPosition( value )\n {\n let op = this._position; // 変更前の位置\n\n if ( value.longitude != op.longitude ||\n value.latitude != op.latitude ||\n value.altitude != op.altitude ) {\n // 位置が変更された\n this._position.assign( value );\n this._primitive_producer.onChangePosition();\n }\n }\n\n\n /**\n * @summary モデルの向きを設定\n *\n * @param {mapray.Orientation} value モデルの向き\n */\n setOrientation( value )\n {\n value.getTransformMatrix( sameScaleVector3, this._rotation );\n }\n\n\n /**\n * @summary モデルのスケールを設定\n *\n * @param {mapray.Vector3} value モデルのスケール\n */\n setScale( value )\n {\n GeoMath.copyVector3( value, this._scale );\n }\n\n\n /**\n * @summary モデルの回転を設定\n *\n * @desc\n *

今のところアニメーション専用

\n *\n * @param {mapray.Matrix} value 回転行列\n *\n * @private\n */\n _setRotation( value )\n {\n GeoMath.copyMatrix( value, this._rotation );\n }\n\n\n /**\n * @summary モデル位置の標高を取得\n *\n * @return {number} 標高値\n *\n * @private\n */\n _getElevation()\n {\n return this.scene.viewer.getExistingElevation( this._position );\n }\n\n}\n\n\n/**\n * @summary ModelEntity の PrimitiveProducer\n *\n * @private\n */\nclass PrimitiveProducer extends Entity.PrimitiveProducer {\n\n /**\n * @param {mapray.ModelEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n this._primitives = []; // プリミティブ配列\n this._pickPrimitives = []; // プリミティブ配列\n this._ptoe_array = []; // 各プリミティブ座標系からエンティティ座標系への変換行列\n\n this._abs_position = null; // 絶対高度に変換した位置のキャッシュ (null なら無効)\n }\n\n\n /**\n * @summary モデルを設定\n *\n * @param {mapray.ModelContainer} container モデルコンテナ\n * @param {number|string} [id] モデル ID\n *\n * @throws Error\n */\n setModelObject( container, index )\n {\n let primitives = container.createPrimitives( index, { ridMaterial: false } );\n let pickPrimitives = container.createPrimitives( index, { ridMaterial: true } );\n\n if ( primitives ) {\n this._primitives = primitives;\n this._pickPrimitives = pickPrimitives;\n this._ptoe_array = primitives.map( prim => GeoMath.createMatrix( prim.transform ) );\n }\n else {\n // ModelContainer からモデルが見つからなかった\n throw new Error( \"model is not found in ModelContainer\" );\n }\n }\n\n\n /**\n * @override\n */\n createRegions()\n {\n const region = new EntityRegion();\n\n region.addPoint( this.entity._position );\n\n return [region];\n }\n\n\n /**\n * @override\n */\n onChangeElevation( regions )\n {\n this._abs_position = null; // キャッシュを無効化\n }\n\n\n /**\n * @override\n */\n getPrimitives( stage )\n {\n let entity = this.entity;\n\n // this._abs_position を更新\n this._updateAbsPosition();\n\n var mlocs_to_gocs = this._abs_position.getMlocsToGocsMatrix( GeoMath.createMatrix() );\n var entity_to_mlocs = mul_RS( entity._rotation, entity._scale, GeoMath.createMatrix() );\n var entity_to_gocs = GeoMath.mul_AA( mlocs_to_gocs, entity_to_mlocs, GeoMath.createMatrix() );\n\n // Primitive#transform を設定\n var primitives = stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives;\n var ptoe_array = this._ptoe_array;\n for ( var i = 0; i < primitives.length; ++i ) {\n var prim = primitives[i];\n var ptoe = ptoe_array[i];\n // prim.transform = entity_to_gocs * ptoe\n GeoMath.mul_AA( entity_to_gocs, ptoe, prim.transform );\n }\n return primitives;\n }\n\n\n /**\n * @summary bboxを利用して簡易的にバウンディングを算出\n *\n * @return {Float64Array} min_lon,min_lat,min_alt,max_lon,max_lat,max_alt\n */\n getBounds()\n {\n const entity = this.entity;\n\n // this._abs_position を更新\n this._updateAbsPosition();\n\n const mlocs_to_gocs = this._abs_position.getMlocsToGocsMatrix( GeoMath.createMatrix() );\n const entity_to_mlocs = mul_RS( entity._rotation, entity._scale, GeoMath.createMatrix() );\n const entity_to_gocs = GeoMath.mul_AA( mlocs_to_gocs, entity_to_mlocs, GeoMath.createMatrix() );\n\n // Primitive#transform を設定\n const primitives = this._primitives;\n const ptoe_array = this._ptoe_array;\n\n let min_lon = Number.MAX_VALUE;\n let max_lon = -Number.MAX_VALUE;\n let min_lat = Number.MAX_VALUE;\n let max_lat = -Number.MAX_VALUE;\n let min_alt = Number.MAX_VALUE;\n let max_alt = -Number.MAX_VALUE;\n\n let transform = new Float64Array( 4 * 4 );\n for ( var i = 0; i < primitives.length; ++i ) {\n const prim = primitives[i];\n const ptoe = ptoe_array[i];\n // prim.transform = entity_to_gocs * ptoe\n GeoMath.mul_AA( entity_to_gocs, ptoe, transform );\n\n const bbox = prim.bbox;\n const bbox0_x = bbox[0][0]*transform[0] + bbox[0][1]*transform[4] + bbox[0][2]*transform[8] + transform[12];\n const bbox0_y = bbox[0][0]*transform[1] + bbox[0][1]*transform[5] + bbox[0][2]*transform[9] + transform[13];\n const bbox0_z = bbox[0][0]*transform[2] + bbox[0][1]*transform[6] + bbox[0][2]*transform[10] + transform[14];\n\n const bbox1_x = bbox[1][0]*transform[0] + bbox[1][1]*transform[4] + bbox[1][2]*transform[8] + transform[12];;\n const bbox1_y = bbox[1][0]*transform[1] + bbox[1][1]*transform[5] + bbox[1][2]*transform[9] + transform[13];;\n const bbox1_z = bbox[1][0]*transform[2] + bbox[1][1]*transform[6] + bbox[1][2]*transform[10] + transform[14];;\n\n let points0 = new GeoPoint();\n points0.setFromGocs( [bbox0_x, bbox0_y, bbox0_z] );\n let points1 = new GeoPoint();\n points1.setFromGocs( [bbox1_x, bbox1_y, bbox1_z] );\n\n // bbox0\n let lon = points0.longitude;\n let lat = points0.latitude;\n let alt = points0.altitude;\n\n if ( lon < min_lon ) min_lon = lon;\n if ( lon > max_lon ) max_lon = lon;\n if ( lat < min_lat ) min_lat = lat;\n if ( lat > max_lat ) max_lat = lat;\n if ( alt < min_alt ) min_alt = alt;\n if ( alt > max_alt ) max_alt = alt;\n\n // bbox1\n lon = points1.longitude;\n lat = points1.latitude;\n alt = points1.altitude;\n\n if ( lon < min_lon ) min_lon = lon;\n if ( lon > max_lon ) max_lon = lon;\n if ( lat < min_lat ) min_lat = lat;\n if ( lat > max_lat ) max_lat = lat;\n if ( alt < min_alt ) min_alt = alt;\n if ( alt > max_alt ) max_alt = alt;\n }\n const bounds_array = new Float64Array( 3 * 2 );\n bounds_array[0] = min_lon;\n bounds_array[1] = min_lat;\n bounds_array[2] = min_alt;\n bounds_array[3] = max_lon;\n bounds_array[4] = max_lat;\n bounds_array[5] = max_alt;\n\n return bounds_array;\n }\n\n\n /**\n * @summary 高度モードが変更されたときに呼び出される\n */\n onChangeAltitudeMode()\n {\n this._abs_position = null; // キャッシュを無効化\n }\n\n\n /**\n * @summary 位置が変更されたときに呼び出される\n */\n onChangePosition()\n {\n this.needToCreateRegions();\n this._abs_position = null;\n }\n\n\n /**\n * @summary 絶対高度位置を更新\n *\n * 出力: this._abs_position\n *\n * @private\n */\n _updateAbsPosition()\n {\n if ( this._abs_position !== null ) {\n // キャッシュされている\n return;\n }\n\n let entity = this.entity;\n\n this._abs_position = entity._position.clone();\n\n switch ( entity.altitude_mode ) {\n case AltitudeMode.RELATIVE:\n this._abs_position.altitude += entity._getElevation();\n break;\n\n case AltitudeMode.CLAMP:\n this._abs_position.altitude = entity._getElevation();\n break;\n\n default: // AltitudeMode.ABSOLUTE\n break;\n }\n }\n\n}\n\n\n// 等倍を表すベクトル\nconst sameScaleVector3 = GeoMath.createVector3( [1, 1, 1] );\n\n\n/**\n * @summary 回転行列 * 倍率\n *\n * @param {mapray.Matrix} rmat 回転行列\n * @param {mapray.Vector3} svec 倍率ベクトル\n * @param {mapray.Matrix} dst 結果\n *\n * @return {mapray.Matrix} dst\n *\n * @private\n */\nfunction\nmul_RS( rmat, svec, dst )\n{\n let sx = svec[0];\n let sy = svec[1];\n let sz = svec[2];\n \n dst[ 0] = rmat[ 0] * sx;\n dst[ 1] = rmat[ 1] * sx;\n dst[ 2] = rmat[ 2] * sx;\n dst[ 3] = 0;\n\n dst[ 4] = rmat[ 4] * sy;\n dst[ 5] = rmat[ 5] * sy;\n dst[ 6] = rmat[ 6] * sy;\n dst[ 7] = 0;\n\n dst[ 8] = rmat[ 8] * sz;\n dst[ 9] = rmat[ 9] * sz;\n dst[10] = rmat[10] * sz;\n dst[11] = 0;\n\n dst[12] = 0;\n dst[13] = 0;\n dst[14] = 0;\n dst[15] = 1;\n \n return dst;\n}\n\n\nexport default ModelEntity;\n","'use strict';\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar exportTypedArrayStaticMethod = require('../internals/array-buffer-view-core').exportTypedArrayStaticMethod;\nvar typedArrayFrom = require('../internals/typed-array-from');\n\n// `%TypedArray%.from` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.from\nexportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);\n","import EntityMaterial from \"./EntityMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport polygon_vs_code from \"./shader/polygon.vert\";\nimport polygon_fs_code from \"./shader/polygon.frag\";\nimport rid_fs_code from \"./shader/rid.frag\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary 多角形分専用マテリアル\n * @memberof mapray\n * @extends mapray.EntityMaterial\n * @private\n */\nclass PolygonMaterial extends EntityMaterial {\n\n /**\n * @param {mapray.GLEnv} glenv\n */\n constructor( glenv, options = {} )\n {\n super( glenv, polygon_vs_code, options.ridMaterial ? rid_fs_code : polygon_fs_code );\n }\n\n\n /**\n * @override\n */\n isTranslucent( stage, primitive )\n {\n var props = primitive.properties;\n var opacity = (props.opacity !== undefined) ? props.opacity : PolygonMaterial.DEFAULT_OPACITY;\n return opacity < 1.0;\n }\n\n\n /**\n * @override\n */\n setParameters( stage, primitive )\n {\n super.setParameters( stage, primitive );\n\n var props = primitive.properties;\n\n // 変換行列\n // u_obj_to_clip, u_obj_to_view\n this.setObjToClip( stage, primitive );\n this.setObjToView( stage, primitive );\n\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n // 基本色\n // vec4 u_color\n var param_color = (props.color !== undefined) ? props.color : PolygonMaterial.DEFAULT_COLOR;\n var param_opacity = (props.opacity !== undefined) ? props.opacity : PolygonMaterial.DEFAULT_OPACITY;\n\n var color = PolygonMaterial._color;\n GeoMath.copyVector3( param_color, color );\n color[3] = param_opacity;\n this.setVector4( \"u_color\", color );\n\n // 照光の有無\n // bool u_lighting\n this.setBoolean( \"u_lighting\", props.lighting );\n\n // ライト逆方向 (視点座標系) と強さ\n // vec3 u_light_dir\n this.setVector3( \"u_light_dir\", [0, 0, 1] );\n }\n }\n\n}\n\n\n// クラス定数の定義\n{\n PolygonMaterial.DEFAULT_COLOR = GeoMath.createVector3f( [1.0, 1.0, 1.0] );\n PolygonMaterial.DEFAULT_OPACITY = 1.0;\n\n // 計算用一時領域\n PolygonMaterial._color = GeoMath.createVector4f();\n}\n\n\nexport default PolygonMaterial;\n","/**\n * @summary 多角形を三角形に分割\n *\n * @classdesc\n *

入力した多角形を三角形に分割して結果を返す。

\n *

構築子と addBoundary() でで多角形を入力して、run() メソッドでそれを三角形に分割して返す。

\n *\n *

実装のアルゴリズムと用語は基本的にコンピュータ・ジオメトリ (近代科学社) の第3章「多角形の三角形分割」を参考にしている。

\n *\n * @memberof mapray\n * @private\n */\nclass Triangulator {\n\n /**\n * @desc\n *

points は多角形の頂点の xy 座標の配列である。

\n *

座標系は x 軸が右方向、y 軸が上方向を想定している。

\n *\n * @param {number[]} points 頂点配列\n * @param {number} offset 最初の頂点のインデックス (>= 0)\n * @param {number} stride 頂点の間隔 (>= 2)\n * @param {number} count 頂点数\n */\n constructor( points, offset, stride, count )\n {\n this._points = new Float64Array( 2 * count );\n this._polygons = new Set();\n\n // 頂点座標を複製\n let src = offset;\n let dst = 0;\n for ( let i = 0; i < count; ++i ) {\n this._points[dst ] = points[src ];\n this._points[dst + 1] = points[src + 1];\n src += stride;\n dst += 2;\n }\n }\n\n\n /**\n * @summary 多角形の境界を追加\n *\n * @desc\n *

インデックスの順序は外側境界のときは反時計回り、内側境界のときは時計回りでなければならない。

\n *

内側境界を追加するときは、その外側の境界も追加しなければならない。追加の順序はどちらが先でも良い。

\n *

境界内または複数の境界間でエッジが交差してはならない。同じように頂点が他の頂点またはエッジの上に乗ってはならない。

\n *\n * @param {number[]} indices 多角形の境界を表す 3 個以上の頂点インデックス\n */\n addBoundary( indices )\n {\n this._polygons.add( Polygon.create( this._points, indices ) );\n }\n\n\n /**\n * @summary 多角形を三角形に分割して結果を取得\n *\n * @desc\n *

各々の三角形は 3 つの整数インデックスが反時計回りに並べて表現される。\n * すべての三角形に対して、その表現を連結した配列を出力する。

\n *

インデックスは入力頂点の最初の頂点を 0 とする。

\n *\n * @throws Error 想定外の多角形\n *\n * @return {Uint32Array} 三角形の頂点インデックスの配列\n */\n run()\n {\n // 多角形を y 単調多角形に分割\n this._makeYMonotonePolygons();\n\n let triangles = new Uint32Array( 3 * this._numTriangles() );\n let offset = 0;\n\n // 各 y 単調多角形を三角形に分割\n for ( let polygon of this._polygons ) {\n let temp = this._makeTriangleArray( polygon );\n triangles.set( temp, offset );\n offset += temp.length;\n };\n\n return triangles;\n }\n\n\n /**\n * @summary 三角形の数を取得\n *\n * @return {number} 三角形の数\n *\n * @private\n */\n _numTriangles()\n {\n let count = 0;\n\n for ( let polygon of this._polygons ) {\n count += polygon.numVertices() - 2;\n };\n\n return count;\n }\n\n\n /**\n * @summary 多角形を y 単調多角形に分割\n *\n * @desc\n *

this._polygons を y 軸単調な部分多角形に分割する。

\n *\n * @private\n */\n _makeYMonotonePolygons()\n {\n let vertices = this._getYOrderedVertices();\n let edge_mgr = new EdgeManager();\n let diag_mgr = new DiagonalManager( this._polygons );\n\n for ( let i = 0; i < vertices.length; ++i ) {\n let vertex = vertices[i];\n\n switch ( vertex.getVertexType() ) {\n case \"start\": {\n let ledge = vertex.getFrontEdge();\n edge_mgr.addEdge( ledge, vertex );\n } break;\n\n case \"end\": {\n let ledge = vertex.getBackEdge();\n let lhelp = edge_mgr.getHelper( ledge );\n if ( lhelp.getVertexType() == \"merge\" ) {\n diag_mgr.addDiagonal( vertex, lhelp );\n }\n edge_mgr.removeEdge( ledge );\n } break;\n\n case \"split\": {\n let nedge = edge_mgr.findNearestLeftEdge( vertex );\n diag_mgr.addDiagonal( vertex, edge_mgr.getHelper( nedge ) );\n edge_mgr.setHelper( nedge, vertex );\n\n let redge = vertex.getFrontEdge();\n edge_mgr.addEdge( redge, vertex );\n } break;\n\n case \"merge\": {\n let redge = vertex.getBackEdge();\n let rhelp = edge_mgr.getHelper( redge );\n if ( rhelp.getVertexType() == \"merge\" ) {\n diag_mgr.addDiagonal( vertex, rhelp );\n }\n edge_mgr.removeEdge( redge );\n\n let nedge = edge_mgr.findNearestLeftEdge( vertex );\n let nhelp = edge_mgr.getHelper( nedge );\n if ( nhelp.getVertexType() == \"merge\" ) {\n diag_mgr.addDiagonal( vertex, nhelp );\n }\n edge_mgr.setHelper( nedge, vertex );\n } break;\n\n default: { // \"regular\"\n if ( vertex.isRightInner() ) {\n // vertex の局所右は多角形の内側\n let uedge = vertex.getBackEdge();\n let uhelp = edge_mgr.getHelper( uedge );\n if ( uhelp.getVertexType() == \"merge\" ) {\n diag_mgr.addDiagonal( vertex, uhelp );\n }\n edge_mgr.removeEdge( uedge );\n\n let dedge = vertex.getFrontEdge();\n edge_mgr.addEdge( dedge, vertex );\n }\n else {\n // vertex の局所右は多角形の外側\n let nedge = edge_mgr.findNearestLeftEdge( vertex );\n let nhelp = edge_mgr.getHelper( nedge );\n if ( nhelp.getVertexType() == \"merge\" ) {\n diag_mgr.addDiagonal( vertex, nhelp );\n }\n edge_mgr.setHelper( nedge, vertex );\n }\n } break;\n }\n }\n\n // this._polygons を対角線により分割\n diag_mgr.splitPolygons();\n }\n\n\n /**\n * @summary 上から順の頂点配列を取得\n *\n * @return {Vertex[]} Y 位置降順の頂点配列\n *\n * @private\n */\n _getYOrderedVertices()\n {\n let vertices = [];\n\n for ( let polygon of this._polygons ) {\n Array.prototype.push.apply( vertices, polygon.getVertices() );\n };\n\n return vertices.sort( (a, b) => Vertex.comparePositionY( b, a ) );\n }\n\n\n /**\n * @summary 多角形を三角形に分割\n *\n * @desc\n *

y 単調多角形 polygon を 1 つ以上の三角形に分割して返す。

\n *

1 つの三角形は 3 つの整数インデックスで表現され、三角形数の3倍の長さの整数配列を返す。\n * このインデックスは入力頂点配列に対するもので、3 頂点は反時計回りで格納される。

\n *\n * @param {Polygon} polygon y 単調多角形\n *\n * @return {Uint32Array} 三角形の配列\n *\n * @private\n */\n _makeTriangleArray( polygon )\n {\n let ti = 0;\n let triangles = new Uint32Array( 3 * (polygon.numVertices() - 2) );\n\n let stack = new Stack();\n\n let vi = 0;\n let vertices = polygon.getVertices().sort( (a, b) => Vertex.comparePositionY( b, a ) );\n let is_right = (vertices[0].prev === vertices[1]); // スタックのチェインが右側か?\n\n stack.push( vertices[vi++] );\n stack.push( vertices[vi++] );\n\n while ( vi < vertices.length - 1 ) {\n let vertex = vertices[vi];\n\n let is_same_chain = is_right ? (vertex === stack.top.prev) : (vertex === stack.top.next);\n\n if ( is_same_chain ) {\n let v2 = stack.pop();\n while ( stack.size > 0 ) {\n let v3 = stack.top;\n let [a, b] = is_right ? [v2, v3] : [v3, v2];\n if ( Vertex.isCCW( vertex, a, b ) ) {\n // 対角線が多角形の内部 -> 三角形を取り出す\n triangles[ti++] = vertex.id;\n triangles[ti++] = a.id;\n triangles[ti++] = b.id;\n v2 = stack.pop();\n }\n else {\n break;\n }\n }\n stack.push( v2 ); // 最後にポップした頂点をスタックに戻す\n stack.push( vertex );\n }\n else {\n // すべての頂点をスタックからポップ\n let v2 = stack.pop();\n while ( stack.size > 0 ) {\n // 三角形を取り出す\n let v3 = stack.pop();\n let [a, b] = is_right ? [v2, v3] : [v3, v2];\n triangles[ti++] = vertex.id;\n triangles[ti++] = a.id;\n triangles[ti++] = b.id;\n v2 = v3;\n }\n stack.push( vertices[vi - 1] );\n stack.push( vertex );\n\n // スタックのチェインが左右反転\n is_right = !is_right;\n }\n\n ++vi;\n }\n\n // スタックの最初と最後の頂点を除いて、最下点から\n // スタック上のすべての頂点への対角線を加える\n let vertex = vertices[vi];\n let v2 = stack.pop();\n\n while ( stack.size > 0 ) {\n // 三角形を取り出す\n let v3 = stack.pop();\n let [a, b] = is_right ? [v2, v3] : [v3, v2];\n triangles[ti++] = vertex.id;\n triangles[ti++] = a.id;\n triangles[ti++] = b.id;\n v2 = v3;\n }\n\n return triangles;\n }\n\n}\n\n\n/**\n * @summary 多角形の頂点\n *\n * @private\n */\nclass Vertex {\n\n /**\n * @param {number} id 頂点 ID\n * @param {number} x x 座標\n * @param {number} y y 座標\n */\n constructor( id, x, y )\n {\n this.id = id;\n this.x = x;\n this.y = y;\n this.polygon = null;\n this.next = null;\n this.prev = null;\n }\n\n\n /**\n * @summary 複製\n *\n * @desc\n *

ただし this.polygon, this.next, this.prev には null が設定される。

\n *\n * @return {Vertex} this の複製\n */\n clone()\n {\n return new Vertex( this.id, this.x, this.y );\n }\n\n\n /**\n * @summary 頂点タイプを取得\n *\n * @desc\n * 以下のタイプの何れかを返す。\n *
\n     *   \"start\"    出発点 (□)\n     *   \"end\"      最終点 (■)\n     *   \"split\"    分離点 (▲)\n     *   \"merge\"    統合点 (▼)\n     *   \"regular\"  普通点 (●)\n     * 
\n *\n * @return {string} 頂点タイプ\n */\n getVertexType()\n {\n let prev = this.prev;\n let next = this.next;\n let cprev = Vertex.comparePositionY( prev, this );\n let cnext = Vertex.comparePositionY( next, this );\n\n if ( (cprev > 0 && cnext > 0) || (cprev < 0 && cnext < 0) ) {\n // 両側の点が上、または両側の点が下にある\n\n // r: (prev -> this) ベクトルに対して左 (反時計回り) に直角なベクトル\n let rx = prev.y - this.y;\n let ry = this.x - prev.x;\n\n // v: (this -> next) ベクトル\n let vx = next.x - this.x;\n let vy = next.y - this.y;\n\n // dot( r, v ): 負数なら内角が 180 度より大きい\n let dot = rx*vx + ry*vy;\n\n if ( cprev > 0 && cnext > 0 ) {\n // 両側の点が上にある\n return (dot < 0) ? \"merge\" : \"end\";\n }\n else {\n // 両側の点が下にある\n return (dot < 0) ? \"split\" : \"start\";\n }\n }\n else {\n // 片方の点が上で片方の点が下\n return \"regular\";\n }\n }\n\n\n /**\n * @summary 前方エッジ\n *\n * @return {Vertex} 前方エッジの始点\n */\n getFrontEdge()\n {\n return this;\n }\n\n\n /**\n * @summary 後方エッジ\n *\n * @return {Vertex} 後方エッジの始点\n */\n getBackEdge()\n {\n return this.prev;\n }\n\n\n /**\n * @summary 頂点の局所右は多角形の内側か?\n *\n * @desc\n *

頂点の局所的な右側は多角形の内側かどうかを返す。

\n *

this は regular タイプの頂点でなければならない。

\n *\n * @return {boolean} 内側のとき true, そうでなければ false\n */\n isRightInner()\n {\n // 次の点のほうが下のとき、vertex の右が内側\n return Vertex.comparePositionY( this.next, this ) < 0;\n }\n\n\n /**\n * @summary 点の高さを比較\n *\n * @desc\n *

v1 の点が v2 の点より低いとき -1, v1 の点が v2 の点より高いとき +1, 高さが同じとき 0 を返す。

\n *\n * @param {Vertex} v1 頂点 1\n * @param {Vertex} v2 頂点 2\n *\n * @return {number} 比較結果\n */\n static\n comparePositionY( v1, v2 )\n {\n if ( v1.y < v2.y || (v1.y == v2.y && v1.x > v2.x) ) {\n // v1 (<) v2\n return -1;\n }\n else if ( v1.y > v2.y || (v1.y == v2.y && v1.x < v2.x) ) {\n // v1 (>) v2\n return 1;\n }\n else {\n // v1 (=) v2\n return 0;\n }\n }\n\n\n /**\n * @summary 3 点は反時計回りか?\n *\n * @param {Vertex} v1 頂点 1\n * @param {Vertex} v2 頂点 2\n * @param {Vertex} v3 頂点 3\n *\n * @return {boolean} 反時計回りのとき true, そうでなければ false\n */\n static\n isCCW( v1, v2, v3 )\n {\n // a = v2 - v1\n let ax = v2.x - v1.x;\n let ay = v2.y - v1.y;\n\n // b = v3 - v1\n let bx = v3.x - v1.x;\n let by = v3.y - v1.y;\n\n // det( |a b| ) > 0\n return ax * by - ay * bx > 0;\n }\n\n}\n\n\n/**\n * @summary 多角形\n *\n * @private\n */\nclass Polygon {\n\n constructor()\n {\n this._first = null;\n }\n\n\n /**\n * @summary 多角形を生成\n *\n * @desc\n *

coords は多角形の頂点の xy 座標の配列である。

\n *

座標系は x 軸が右方向、y 軸が上方向を想定している。

\n *

indices での頂点の順序は反時計回りである。

\n *\n * @param {number[]} coords 座標配列\n * @param {number[]} indices 多角形の頂点インデックス配列 (indices.length >= 3)\n *\n * @return {Polygon} Polygon インスタンス\n */\n static\n create( coords, indices )\n {\n let poly = new Polygon();\n\n let id = indices[0];\n let base = 2*id;\n let vertex = new Vertex( id, coords[base], coords[base + 1] );\n\n poly._first = vertex;\n\n for ( let i = 1; i < indices.length; ++i ) {\n let before = vertex;\n\n id = indices[i];\n base = 2*id;\n vertex = new Vertex( id, coords[base], coords[base + 1] );\n\n before.next = vertex;\n vertex.prev = before;\n }\n\n // ここで vertex は最後の頂点\n poly._first.prev = vertex;\n vertex.next = poly._first;\n\n poly._updateVertices();\n return poly;\n }\n\n\n /**\n * @summary 多角形を生成\n *\n * @param {Vertex} first 最初の頂点\n *\n * @return {Polygon} Polygon インスタンス\n */\n static\n createByVertex( first )\n {\n let poly = new Polygon();\n\n poly._first = first;\n\n poly._updateVertices();\n return poly;\n }\n\n\n /**\n * @summary 頂点数を取得\n *\n * @return {number} 頂点数\n */\n numVertices()\n {\n let count = 0;\n\n let vertex = this._first;\n ++count;\n\n let end = this._first;\n for ( vertex = vertex.next; vertex !== end; vertex = vertex.next ) {\n ++count;\n }\n\n return count;\n }\n\n\n /**\n * @summary すべての頂点の配列を取得\n *\n * @return {Vertex[]} すべての頂点の配列\n */\n getVertices()\n {\n let array = [];\n\n let vertex = this._first;\n array.push( vertex );\n\n let end = this._first;\n for ( vertex = vertex.next; vertex !== end; vertex = vertex.next ) {\n array.push( vertex );\n }\n\n return array;\n }\n\n\n /**\n * @summary 頂点を更新\n *\n * @private\n */\n _updateVertices()\n {\n let vertex = this._first;\n vertex.polygon = this;\n\n let end = this._first;\n for ( vertex = vertex.next; vertex !== end; vertex = vertex.next ) {\n vertex.polygon = this;\n }\n }\n\n}\n\n\n/**\n * @summary 単調多角形に分割するためのエッジ管理\n *\n * @classdesc\n *

追加されるエッジの局所右は常に多角形の内側になる。

\n *\n * @private\n */\nclass EdgeManager {\n\n /**\n */\n constructor()\n {\n this._edges = new Map();\n }\n\n\n /**\n * @summary エッジを追加\n *\n * @param {Vertex} edge 追加するエッジ\n * @param {Vertex} helper 初期ヘルパー頂点\n */\n addEdge( edge, helper )\n {\n this._edges.set( edge, { helper: helper } );\n }\n\n\n /**\n * @summary エッジを削除\n *\n * @param {Vertex} edge 削除するエッジ\n */\n removeEdge( edge )\n {\n this._edges.delete( edge );\n }\n\n\n /**\n * @summary エッジにヘルパーを設定\n *\n * @param {Vertex} edge 対象エッジ\n * @param {Vertex} helper ヘルパー頂点\n */\n setHelper( edge, helper )\n {\n this._edges.get( edge ).helper = helper;\n }\n\n\n /**\n * @summary エッジのヘルパーを取得\n *\n * @param {Vertex} edge 対象エッジ\n *\n * @return {Vertex} ヘルパー頂点\n */\n getHelper( edge )\n {\n return this._edges.get( edge ).helper;\n }\n\n\n /**\n * @summary 頂点の左側で最も近いエッジを検索\n *\n * @desc\n *

vertex を左に (多角形の内側を) 移動しながら最初に突き当たるエッジを取得する。\n * そのようなエッジが常に存在することが前提になっている。

\n *\n *

vertex の局所左は常に多角形の内側になる。

\n *\n * @param {Vertex} vertex 対象頂点\n *\n * @return {Vertex} エッジ\n */\n findNearestLeftEdge( vertex )\n {\n // このメソッドが呼び出された時点での前提状態:\n // - どちらかの端点が vertex のエッジは存在しない\n // - 両端の y 座標が同じエッジは存在しない\n // - すべてのエッジは vertex を通る水平線と交差する\n\n // TODO:\n // このメソッドは多角形の頂点数 n に対して計算量は最悪 O(n), 平均は不明\n // 最悪の場合、ポリゴン分割全体の計算量が O(n^2) になってしまう\n // そのため、このめメソッド単体で最悪 O(log n) または平均 O(log n) 以下にしたい\n\n let nearest_edge;\n let min_distance = Number.MAX_VALUE;\n\n let vx = vertex.x;\n let vy = vertex.y;\n\n for ( let [edge,] of this._edges ) {\n // エッジ始点 p\n let px = edge.x;\n let py = edge.y;\n\n // エッジ終点 q\n let qx = edge.next.x;\n let qy = edge.next.y;\n\n // エッジの x 座標勾配\n let gx = (qx - px) / (qy - py);\n\n // 水平線とエッジの交点の x 座標\n let rx = px + (vy - py) * gx;\n\n // vertex と交点 r との符号付き距離 (正のとき r は vertex の左側)\n let distance = vx - rx;\n\n if ( distance > 0 ) {\n if ( distance < min_distance ) {\n // 近いエッジを更新\n min_distance = distance;\n nearest_edge = edge;\n }\n }\n }\n\n if ( nearest_edge === undefined ) {\n // 想定に反して左のエッジが見つからなかった\n throw new Error( \"Probably a degenerate polygon\" );\n }\n\n return nearest_edge;\n }\n\n}\n\n\n/**\n * @summary 対角線\n *\n * @private\n */\nclass Diagonal {\n\n /**\n * @param {Vertex} v1 対角線の端点1\n * @param {Vertex} v2 対角線の端点2\n */\n constructor( v1, v2 )\n {\n this.v1 = v1;\n this.v2 = v2;\n }\n\n}\n\n\n/**\n * @summary 対角線管理\n *\n * @private\n */\nclass DiagonalManager {\n\n /**\n * @param {Set.} polygons 多角形集合\n */\n constructor( polygons )\n {\n this._polygons = polygons;\n this._diagonals = [];\n this._dmap = new DiagonalMap();\n }\n\n\n /**\n * @brief 対角線を追加\n *\n * @param {Vertex} v1 対角線の端点1\n * @param {Vertex} v2 対角線の端点2\n */\n addDiagonal( v1, v2 )\n {\n let diagonal = new Diagonal( v1, v2 );\n\n this._diagonals.push( diagonal );\n this._dmap.addDiagonal( diagonal );\n }\n\n\n /**\n * @brief すべての多角形を対角線で分割\n */\n splitPolygons()\n {\n // 対角線の順序をランダムにして、分割方向が偏らないようにする\n // これにより頂点数 n に対して計算量 O(n log n) が期待できる\n this._shuffleArray( this._diagonals );\n\n // 個々の対角線で多角形を分割\n while ( this._diagonals.length > 0 ) {\n let diagonal = this._diagonals.pop();\n this._dmap.removeDiagonal( diagonal );\n\n let v1 = diagonal.v1;\n let v2 = diagonal.v2;\n let [v1a, v2a] = this._splitPolygonHalf( v1, v2 );\n let [v2b, v1b] = this._splitPolygonHalf( v2, v1 );\n\n let p1 = v1.polygon;\n let p2 = v2.polygon;\n\n if ( p1 === p2 ) {\n // diagonal は多角形 p1 内の対角線\n this._polygons.delete( p1 );\n this._polygons.add( Polygon.createByVertex( v1a ) );\n this._polygons.add( Polygon.createByVertex( v1b ) );\n }\n else {\n // diagonal は多角形 p1, p2 間の対角線\n this._polygons.delete( p1 );\n this._polygons.delete( p2 );\n this._polygons.add( Polygon.createByVertex( v1a ) );\n }\n\n // 対角線の端点を新しく生成された端点に置き換える\n this._replaceVertexInDiagonals( v1, v1a, v1b );\n this._replaceVertexInDiagonals( v2, v2a, v2b );\n }\n }\n\n\n /**\n * @summary 多角形分割の半分の処理\n *\n * @param {Vertex} sv 開始点\n * @param {Vertex} ev 終了点\n *\n * @return {Vertex[]} [新 sv, 新 ev]\n *\n * @private\n */\n _splitPolygonHalf( sv, ev )\n {\n let sc = sv.clone();\n let ec = ev.clone();\n\n sc.prev = sv.prev;\n sc.next = ec;\n sv.prev.next = sc;\n\n ec.prev = sc;\n ec.next = ev.next;\n ev.next.prev = ec;\n\n return [sc, ec];\n }\n\n\n /**\n * @summary 対角線の端点の置き換え\n *\n * @desc\n *

端点の1つが vo の対角線のその端点を va または vb に置き換える。

\n *

候補端点 va, vb のうち、置き換えると対角線が多角形の内側になる方を選ぶ。

\n *

一方が内側で、一方が外側になるはず。

\n *\n * @param {Vertex} vo 元の端点\n * @param {Vertex} va 候補端点 a\n * @param {Vertex} vb 候補端点 b\n *\n * @private\n */\n _replaceVertexInDiagonals( vo, va, vb )\n {\n // 一旦 this._dmap から対角線を抜き取って、端点を書き換えてから戻す\n for ( let diagonal of this._dmap.removeDiagonals( vo ) ) {\n // vo の反対側の端点\n let vo_oppo = (diagonal.v1 === vo) ? diagonal.v2 : diagonal.v1;\n // 対角線の端点の書き換え\n diagonal.v1 = this._testDiagonal( va, vo_oppo ) ? va : vb;\n diagonal.v2 = vo_oppo;\n // 対角線を戻す\n this._dmap.addDiagonal( diagonal );\n }\n }\n\n\n /**\n * @summary 対角線テスト\n *\n *

端点が v1, v2 の線分は多角形の (v1 の) 内側に入るか?

\n *\n * @param {Vertex} v1 端点1\n * @param {Vertex} v2 端点2\n *\n * @return {boolean} 内側に入るとき true, それ以外のとき false\n *\n * @private\n */\n _testDiagonal( v1, v2 )\n {\n // a: v1 から順方向のベクトル\n let ax = v1.next.x - v1.x;\n let ay = v1.next.y - v1.y;\n\n // b: v1 から逆方向のベクトル\n let bx = v1.prev.x - v1.x;\n let by = v1.prev.y - v1.y;\n\n // c: v1 から v2 のベクトル\n let cx = v2.x - v1.x;\n let cy = v2.y - v1.y;\n\n // cross(a) . c > 0\n let aflag = (ax*cy - cx*ay > 0);\n\n // cross(b) . c < 0\n let bflag = (bx*cy - cx*by < 0);\n\n // |ax bx|\n // |ay by|\n let det = ax*by - bx*ay;\n\n return (det >= 0) ? (aflag && bflag) : (aflag || bflag);\n }\n\n\n /**\n * @summary 配列の並びをランダム化\n *\n * @param {array} array 処理対象の配列\n *\n * @private\n */\n _shuffleArray( array )\n {\n // Fisher-Yates のシャッフル\n // TODO: 用途上、再現性のある乱数を使ってもよいし、そのほうが何かあった時に原因をつかみやすい\n\n for ( let i = array.length - 1; i > 0; --i ) {\n let j = Math.floor( Math.random() * (i + 1) ); // 0 <= j <= i\n\n // array[i] と array[j] を交換\n let temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n }\n\n}\n\n\n/**\n * @summary 辞書: 対角線頂点 → 対角線リスト\n *\n * @classdesc\n *

対角線の頂点から、その頂点を端点とする対角線の配列を取得する。

\n *

1 つの頂点に対して対角線は最大 3 本なので、追加、削除、検索の計算量は多角形の頂点数 n に対して O(1) である。

\n *\n * @memberof DiagonalManager\n * @private\n */\nclass DiagonalMap {\n\n constructor()\n {\n // 辞書を生成\n // key: Vertex\n // value: Diagonal[]\n this._map = new Map();\n }\n\n\n /**\n * @summary 対角線を登録\n *\n * @param {Diagonal} diagonal 追加する対角線\n */\n addDiagonal( diagonal )\n {\n this._addDiagonalByVertex( diagonal.v1, diagonal );\n this._addDiagonalByVertex( diagonal.v2, diagonal );\n }\n\n\n /**\n * @summary 対角線の登録を解除\n *\n * @param {Diagonal} diagonal 削除する対角線\n */\n removeDiagonal( diagonal )\n {\n this._removeDiagonalByVertex( diagonal.v1, diagonal );\n this._removeDiagonalByVertex( diagonal.v2, diagonal );\n }\n\n\n /**\n * @summary vertex を端点とする、すべの対角線の登録を解除\n *\n * @param {Vertex} vertex 対角線の端点\n *\n * @return {Diagonal[]} 登録を解除された対角線の配列\n */\n removeDiagonals( vertex )\n {\n let diagonals = this._map.get( vertex );\n\n if ( diagonals !== undefined ) {\n // 辞書から対角線を削除\n let cloned = diagonals.slice();\n for ( let diag of cloned ) {\n this.removeDiagonal( diag );\n }\n return cloned;\n }\n else {\n // 存在しなかった\n return [];\n }\n }\n\n\n /**\n * @summary 対角線を登録\n *\n * @param {Vertex} vertex どちらかの端点\n * @param {Diagonal} diagonal 追加する対角線\n *\n * @private\n */\n _addDiagonalByVertex( vertex, diagonal )\n {\n let array = this._map.get( vertex );\n\n if ( array === undefined ) {\n // vertex に対する最初の対角線\n this._map.set( vertex, [diagonal] );\n }\n else {\n // vertex に対する2つ目以降の対角線\n\n if ( array.indexOf( diagonal ) != -1 ) {\n // 対角線は二重登録されないはずが...\n throw new Error( \"Unexpected\" );\n }\n if ( array.length < 1 || array.length > 2 ) {\n // 同一頂点の対角線は最大3本のはずが...\n throw new Error( \"Unexpected\" );\n }\n\n array.push( diagonal );\n }\n }\n\n\n /**\n * @summary 対角線を削除\n *\n * @param {Vertex} vertex どちらかの端点\n * @param {Diagonal} diagonal 削除する対角線\n *\n * @private\n */\n _removeDiagonalByVertex( vertex, diagonal )\n {\n let array = this._map.get( vertex );\n if ( array === undefined ) {\n // 存在するはずが...\n throw new Error( \"Unexpected\" );\n }\n\n let index = array.indexOf( diagonal );\n if ( index == -1 ) {\n // 存在するはずが...\n throw new Error( \"Unexpected\" );\n }\n\n // 配列から diagonal を削除\n array.splice( index, 1 );\n\n // 配列が空になったら配列を削除\n if ( array.length == 0 ) {\n this._map.delete( vertex );\n }\n }\n\n}\n\n\n/**\n * @summary スタック\n *\n * @private\n */\nclass Stack {\n\n constructor()\n {\n this._array = new Array();\n }\n\n get size() { return this._array.length; }\n\n push( item )\n {\n this._array.push( item );\n }\n\n pop()\n {\n return this._array.pop();\n }\n\n get top()\n {\n let a = this._array;\n return (a.length > 0) ? a[a.length - 1] : null;\n }\n\n}\n\n\nexport default Triangulator;\n","var global = require('../internals/global');\n\nvar globalIsFinite = global.isFinite;\n\n// `Number.isFinite` method\n// https://tc39.github.io/ecma262/#sec-number.isfinite\nmodule.exports = Number.isFinite || function isFinite(it) {\n return typeof it == 'number' && globalIsFinite(it);\n};\n","var $ = require('../internals/export');\nvar numberIsFinite = require('../internals/number-is-finite');\n\n// `Number.isFinite` method\n// https://tc39.github.io/ecma262/#sec-number.isfinite\n$({ target: 'Number', stat: true }, { isFinite: numberIsFinite });\n","/**\n * @summary 凸多角形\n *\n * @memberof mapray\n *\n * @private\n */\nclass ConvexPolygon {\n\n /**\n *

3 点またはそれ以上の頂点座標を反時計回りで指定する。

\n *\n * @param {iterable.} coords 頂点座標の並び x0, y0, x1, y1, ...\n */\n constructor( coords )\n {\n this._vertices = Float64Array.from( coords );\n this._num_vertices = this._vertices.length / 2;\n }\n\n\n /**\n * @summary 凸多角形の頂点数\n *\n * @type {number}\n *\n * @readonly\n */\n get num_vertices()\n {\n return this._num_vertices;\n }\n\n\n /**\n * @summary 凸多角形の頂点座標配列\n *\n * @desc\n *

反時計回りで格納された頂点座標の配列 [x0, y0, x1, y1, ...] を返す。

\n *

返された配列の内容は this に対して変更操作が行われるまで有効である。

\n *\n * @type {number[]}\n *\n * @readonly\n */\n get vertices()\n {\n return this._vertices;\n }\n\n\n /**\n * @summary 矩形から凸多角形を生成\n *\n * @param {number} x_min x 座標の最小値\n * @param {number} y_min y 座標の最小値\n * @param {number} x_max x 座標の最大値\n * @param {number} y_max y 座標の最大値\n *\n * @return {mapray.ConvexPolygon} 凸多角形\n */\n static\n createByRectangle( x_min, y_min, x_max, y_max )\n {\n // 入力座標配列\n const coords = [\n x_min, y_min,\n x_max, y_min,\n x_max, y_max,\n x_min, y_max\n ];\n\n // 凸多角形を生成\n return new ConvexPolygon( coords );\n }\n\n\n /**\n * @summary 妥当性を検査\n *\n * @desc\n *

this が妥当な凸多角形かどうかを確かめる。

\n *\n * @return {boolean} this が妥当なとき true, それ以外のとき false\n */\n isValid()\n {\n if ( this._num_vertices < 3 ) {\n // 3 頂点未満の多角形は非対応\n return false;\n }\n\n // 座標が有効な数値であることをチェック\n for ( let i = 0; i < this._num_vertices; ++i ) {\n let x = this._vertices[2*i ];\n let y = this._vertices[2*i + 1];\n if ( !Number.isFinite( x ) || !Number.isFinite( y ) ) {\n // 有効な数値ではない座標が含まれる\n return false;\n }\n }\n\n // 長さ 0 の稜線が無いことをチェック\n for ( let ei = 0; ei < this._num_vertices; ++ei ) {\n let si = (ei != 0) ? ei - 1 : this._num_vertices - 1;\n\n let sx = this._vertices[2*si ];\n let sy = this._vertices[2*si + 1];\n\n let ex = this._vertices[2*ei ];\n let ey = this._vertices[2*ei + 1];\n\n if ( sx == ex && sy == ey ) {\n // 同一位置の隣接頂点が含まれる\n return false;\n }\n }\n\n // 内角が 0 でない、または 180 度より大きくないことをチェック\n for ( let oi = 0; oi < this._num_vertices; ++oi ) {\n let ox = this._vertices[2*oi ];\n let oy = this._vertices[2*oi + 1];\n\n // 前方への方向ベクトル\n let fi = (oi == this._num_vertices - 1) ? 0 : oi + 1;\n let fx = this._vertices[2*fi ] - ox;\n let fy = this._vertices[2*fi + 1] - oy;\n\n // 後方への方向ベクトル\n let bi = (oi == 0) ? this._num_vertices - 1 : oi - 1;\n let bx = this._vertices[2*bi ] - ox;\n let by = this._vertices[2*bi + 1] - oy;\n\n // 面積と内積\n let det = fx * by - bx * fy;\n let dot = fx * bx + fy * by;\n\n if ( det < 0 || (det == 0 && dot > 0) ) {\n // 内角 θ は 0 < θ <= 180 ではない\n return false;\n }\n }\n\n return true;\n }\n\n\n /**\n * @summary 交差凸多角形を取得\n *\n * @desc\n *

凸多角形 this と凸多角形 polygon が交差すれば、交差部分の凸多角形を返す。

\n *

this と polygon が交差しないときは null を返す。

\n *

this が polygon を包含するときは polygon を返す可能性がある。

\n *\n * @param {ConvexPolygon} polygon 凸多角形\n *\n * @return {?ConvexPolygon} 交差凸多角形、ただし交差しないときは null\n *\n * @throws Error 凸多角形の切り取りに失敗\n */\n getIntersection( polygon )\n {\n try {\n return this._clip_by_polygon( polygon );\n }\n catch ( e ) {\n throw new Error( \"ConvexPolygon#getIntersection failed\" );\n }\n }\n\n\n /**\n * @summary 凸多角形同士に交差があるかどうか?\n *\n * @desc\n *

凸多角形 this と凸多角形 polygon が交差するかどうかを返す。

\n *\n * @param {ConvexPolygon} polygon 凸多角形\n *\n * @return {boolean} 交差するとき true, 交差しないとき false\n *\n * @throws Error 交差の確認に失敗\n */\n hasIntersection( polygon )\n {\n try {\n return this._clip_by_polygon( polygon ) !== null;\n }\n catch ( e ) {\n throw new Error( \"ConvexPolygon#hasIntersection failed\" );\n }\n }\n\n\n /**\n * @summary 凸多角形を包含するか?\n *\n * @desc\n *

凸多角形 this は凸多角形 polygon を包含するかどうかを返す。

\n *\n * @param {ConvexPolygon} polygon 凸多角形\n *\n * @return {boolean} this が polygon を包含するとき true, それ以外は false\n */\n includes( polygon )\n {\n for ( let ei = 0; ei < this._num_vertices; ++ei ) {\n let si = (ei != 0) ? ei - 1 : this._num_vertices - 1;\n\n // 直線上の 1 点\n let px = this._vertices[2*si ];\n let py = this._vertices[2*si + 1];\n\n // 直線の内側方向\n let nx = py - this._vertices[2*ei + 1];\n let ny = this._vertices[2*ei] - px;\n\n // 判定数値\n let dval = px*nx + py*ny;\n\n // this の si-ei 稜線の\n for ( let i = 0; i < polygon._num_vertices; ++i ) {\n // polygon の 1 点\n let qx = polygon._vertices[2*i ];\n let qy = polygon._vertices[2*i + 1];\n\n if ( qx*nx + qy*ny < dval ) {\n // polygon の 1 点が this の外側\n // polygon は this の完全に内側ではない\n return false;\n }\n }\n }\n\n // polygon は this の完全に内側である\n return true;\n }\n\n\n /**\n * @summary 凸多角形により凸多角形を切り取る\n *\n * @desc\n *

凸多角形 this により凸多角形 polygon を切り取った凸多角形を返す。

\n *

this が polygon を包含するときは polygon を返す。

\n *

this と polygon が交差しないときは null を返す。

\n *\n * @param {ConvexPolygon} polygon 凸多角形\n *\n * @return {?ConvexPolygon} 凸多角形または null\n *\n * @throws Error 凸多角形の切り取りに失敗\n *\n * @private\n */\n _clip_by_polygon( polygon )\n {\n let current = polygon;\n\n for ( let ei = 0; ei < this._num_vertices; ++ei ) {\n let si = (ei != 0) ? ei - 1 : this._num_vertices - 1;\n\n // 直線上の 1 点\n let px = this._vertices[2*si ];\n let py = this._vertices[2*si + 1];\n\n // 直線の内側方向\n let nx = py - this._vertices[2*ei + 1];\n let ny = this._vertices[2*ei] - px;\n\n // 判定数値\n let dval = px*nx + py*ny;\n\n // 半空間による切り取り\n current = current._clip_by_halfspace( nx, ny, dval );\n if ( current === null ) {\n // this と polygon は交差しない\n break;\n }\n }\n\n return current;\n }\n\n\n /**\n * @summary 半空間により凸多角形を切り取る\n *\n * @desc\n *

半空間により凸多角形 this を切り取ったり、その凸多角形を返す。

\n *

半空間が this を内包するときは this を返す。

\n *

半空間と this が交差しないときは null を返す。

\n *\n * @param {number} nx 半空間の内側方向の x 座標\n * @param {number} ny 半空間の内側方向の y 座標\n * @param {number} dval 判定用数値\n *\n * @return {?ConvexPolygon} 凸多角形または null\n *\n * @throws Error 半空間による切り取りに失敗\n *\n * @private\n */\n _clip_by_halfspace( nx, ny, dval )\n {\n // 半空間の境界線からの距離範囲\n let dist_min = Number.MAX_VALUE;\n let dist_max = -Number.MAX_VALUE;\n\n for ( let i = 0; i < this._num_vertices; ++i ) {\n // 頂点座標\n let px = this._vertices[2*i ];\n let py = this._vertices[2*i + 1];\n\n // dist == 0 半空間の境界線上\n // dist > 0 半空間の内側\n // dist < 0 半空間の外側\n let dist = px*nx + py*ny - dval;\n\n // 最大最小を更新\n dist_min = Math.min( dist_min, dist );\n dist_max = Math.max( dist_max, dist );\n }\n\n if ( dist_min >= 0 ) {\n // 半空間は this を内包する\n return this;\n }\n\n if ( dist_max <= 0 ) {\n // 半空間 と this は交差しない\n return null;\n }\n\n // ここで dist_min < 0 < dist_max なので、半空間の境界線は凸多角形\n // this の内部を通過している (接していない)\n\n return this._clip_by_crossed_halfspace( nx, ny, dval );\n }\n\n\n /**\n * @summary 半空間により凸多角形を切り取る (一部交差前提)\n *\n * @desc\n *

半空間により凸多角形 this を切り取ったり、その凸多角形を返す。

\n *

このメソッドは凸多角形 this の境界線と半空間の境界線が異なる\n * 2 点で交差していることが前提になっている。

\n *\n * @param {number} nx 半空間の内側方向の x 座標\n * @param {number} ny 半空間の内側方向の y 座標\n * @param {number} dval 判定用数値\n *\n * @return {ConvexPolygon} 凸多角形\n *\n * @throws Error 半空間による切り取りに失敗\n *\n * @private\n */\n _clip_by_crossed_halfspace( nx, ny, dval )\n {\n let [ce0, ce1] = this._get_cross_edges_by_crossed_halfspace_boundary( nx, ny, dval );\n\n let polygon = [];\n\n // 最初の頂点\n polygon.push( ce0.qx );\n polygon.push( ce0.qy );\n\n // 中間頂点のインデックス\n let first_i = ce0.ei; // 最初の中間頂点\n let last_i = ce1.ei; // 最後の中間頂点の次\n\n // 中間の頂点\n for ( let i = first_i; i != last_i; i = (i + 1) % this._num_vertices ) {\n polygon.push( this._vertices[2*i ] );\n polygon.push( this._vertices[2*i + 1] );\n }\n\n // 最後の頂点\n polygon.push( ce1.qx );\n polygon.push( ce1.qy );\n\n return new ConvexPolygon( polygon );\n }\n\n\n /**\n * @summary 半空間境界線と交差する2稜線のデータを取得 (2点交差前提)\n *\n * @desc\n *

2要素の配列を返す。

\n *

最初の要素は切り取りにより前方が残される稜線のデータである。

\n *

次の要素は切り取りにより後方が残される稜線のデータである。

\n *\n *

配列の各要素のオブジェクトプロパティは次のようになる。

\n *
\n     *   ei: 境界線と交差した稜線の終点インデックス\n     *   qx: 境界線と稜線が交差した位置の x 座標\n     *   qy: 境界線と稜線が交差した位置の y 座標\n     * 
\n *\n * @param {number} nx 半空間の内側方向の x 座標\n * @param {number} ny 半空間の内側方向の y 座標\n * @param {number} dval 判定用数値\n *\n * @return {object[]} 2稜線の交差データ\n *\n * @throws Error 2点の交差が見つからなかった\n *\n * @private\n */\n _get_cross_edges_by_crossed_halfspace_boundary( nx, ny, dval )\n {\n let cross_edges = new Array( 2 );\n\n for ( let si = 0, ce_count = 0; ce_count < 2; ++si ) {\n if ( si == this._num_vertices ) {\n // 妥当でない凸多角形、数値計算誤差、非数値の混入などで\n // 2点の交差が見つからず、無限ループになる可能性がある\n // それを避けるため、すべての稜線を調べ終わったら例外で\n // 強制的に終了する\n throw new Error( \"cross edges could not be found\" );\n }\n\n let ei = (si + 1) % this._num_vertices;\n\n // 稜線の始点位置\n let sx = this._vertices[2*si ];\n let sy = this._vertices[2*si + 1];\n\n // 稜線の終点位置\n let ex = this._vertices[2*ei ];\n let ey = this._vertices[2*ei + 1];\n\n // 境界線からの距離\n let sd = sx*nx + sy*ny - dval;\n let ed = ex*nx + ey*ny - dval;\n\n // 半空間境界線と si-ei 稜線の交差があればデータを追加\n if ( (sd <= 0 && 0 < ed) || (ed <= 0 && 0 < sd) ) {\n let t = sd / (sd - ed);\n let qx = sx + (ex - sx) * t;\n let qy = sy + (ey - sy) * t;\n\n cross_edges[(sd < ed) ? 0 : 1] = { ei, qx, qy };\n\n ++ce_count;\n }\n }\n\n return cross_edges;\n }\n\n}\n\n\nexport default ConvexPolygon;\n","import Entity from \"./Entity\";\nimport Primitive from \"./Primitive\";\nimport Mesh from \"./Mesh\";\nimport PolygonMaterial from \"./PolygonMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport GeoRegion from \"./GeoRegion\";\nimport AltitudeMode from \"./AltitudeMode\";\nimport EntityRegion from \"./EntityRegion\";\nimport Triangulator from \"./Triangulator\";\nimport QAreaManager from \"./QAreaManager\";\nimport ConvexPolygon from \"./ConvexPolygon\";\nimport AreaUtil from \"./AreaUtil\";\nimport Type from \"./animation/Type\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary 多角形エンティティ\n * @memberof mapray\n * @extends mapray.Entity\n */\nclass PolygonEntity extends Entity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, opts )\n {\n super( scene, opts );\n\n this._extruded_height = 0.0;\n this._color = GeoMath.createVector3( [1, 1, 1] );\n this._opacity = 1.0;\n\n // 頂点管理\n this._boundaries = []; // Boundary のリスト\n this._position = null; // 中央付近の GeoPoint\n\n // this._producer\n // this._is_flake_mode\n if ( this.altitude_mode === AltitudeMode.CLAMP ) {\n this._producer = new FlakePrimitiveProducer( this );\n this._is_flake_mode = true;\n }\n else {\n this._producer = new PrimitiveProducer( this );\n this._is_flake_mode = false;\n }\n\n this._setupAnimationBindingBlock();\n\n // 生成情報から設定\n if ( opts && opts.json ) {\n this._setupByJson( opts.json );\n }\n }\n\n\n /**\n * @summary 押し出し量(0より大きい値)\n * @type {number}\n */\n set extruded_height( value )\n {\n var prev = this._extruded_height;\n\n if ( prev !== value ) {\n this._extruded_height = value;\n this._producer.onChangeExtruded();\n }\n }\n\n\n /**\n * @summary 押し出し量\n * @type {number}\n */\n get extruded_height() { return this._extruded_height; }\n\n\n /**\n * @override\n */\n getPrimitiveProducer()\n {\n return (!this._is_flake_mode) ? this._producer : null;\n }\n\n\n /**\n * @override\n */\n getFlakePrimitiveProducer()\n {\n return (this._is_flake_mode) ? this._producer : null;\n }\n\n\n /**\n * @override\n */\n onChangeAltitudeMode( prev_mode )\n {\n if ( this.altitude_mode === AltitudeMode.CLAMP ) {\n this._producer = new FlakePrimitiveProducer( this );\n this._is_flake_mode = true;\n }\n else {\n this._producer = new PrimitiveProducer( this );\n this._is_flake_mode = false;\n }\n }\n\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const vector3 = Type.find( \"vector3\" );\n\n // パラメータ名: color\n // パラメータ型: vector3\n // 色\n block.addEntry( \"color\", [vector3], null, value => {\n this.setColor( value );\n } );\n \n // パラメータ名: opacity\n // パラメータ型: number\n // 不透明度\n block.addEntry( \"opacity\", [number], null, value => {\n this.setOpacity( value );\n } );\n \n // パラメータ名: height\n // パラメータ型: number\n // 線の太さ\n block.addEntry( \"height\", [number], null, value => {\n this.setExtrudedHeight( value );\n } );\n }\n\n\n /**\n * @summary 基本色を設定\n * @param {mapray.Vector3} color 基本色\n */\n setColor( color )\n {\n if ( this._color[0] !== color[0] ||\n this._color[1] !== color[1] ||\n this._color[2] !== color[2] ) {\n GeoMath.copyVector3( color, this._color );\n this._producer.onChangeProperty();\n }\n }\n\n\n /**\n * @summary 不透明度を設定\n * @param {number} opacity 不透明度\n */\n setOpacity( opacity )\n {\n if ( this._opacity !== opacity ) {\n this._opacity = opacity;\n this._producer.onChangeProperty();\n }\n }\n\n\n /**\n * @summary 押し出し量を設定\n * @param {number} opacity 押し出し量\n */\n setExtrudedHeight( height )\n {\n this.extruded_height = height;\n }\n\n\n /**\n * @summary 外側境界を追加\n *\n * @desc\n *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式で配列を与える。

\n *\n * @param {number[]} points 頂点の配列\n */\n addOuterBoundary( points )\n {\n this._addBoundary( points, false );\n }\n\n\n /**\n * @summary 内側境界を追加\n *\n * @desc\n *

points は [lon_0, lat_0, alt_0, lon_1, lat_1, alt_1, ...] のような形式で配列を与える。

\n *\n * @param {number[]} points 頂点の配列\n */\n addInnerBoundary( points )\n {\n this._addBoundary( points, true );\n }\n\n\n /**\n * @summary すべての頂点のバウンディングを算出\n *\n * @override\n * @return {mapray.GeoRegion} バウンディング情報を持ったGeoRegion\n */\n getBounds()\n {\n const region = new GeoRegion();\n for ( let bo of this._boundaries ) {\n region.addPointsAsArray( bo.points );\n }\n return region;\n }\n\n /**\n * @summary 境界を追加\n *\n * @desc\n *

addOuterBoundary(), addInnerBoundary() の実装である。

\n *\n * @param {number[]} points 頂点の配列\n *\n * @private\n */\n _addBoundary( points, is_inner )\n {\n this._boundaries.push( new Boundary( points, is_inner ) );\n this._position = null;\n\n // 境界の変更を通知\n this._producer.onChangeBoundary();\n }\n\n\n /**\n * @summary 専用マテリアルを取得\n * @private\n */\n _getMaterial( render_target )\n {\n var scene = this.scene;\n if ( render_target === RenderTarget.SCENE ) {\n if ( !scene._PolygonEntity_material ) {\n // scene にマテリアルをキャッシュ\n scene._PolygonEntity_material = new PolygonMaterial( scene.glenv );\n }\n return scene._PolygonEntity_material;\n }\n else if (render_target === RenderTarget.RID) {\n if ( !scene._PolygonEntity_material_pick ) {\n // scene にマテリアルをキャッシュ\n scene._PolygonEntity_material_pick = new PolygonMaterial( scene.glenv, { ridMaterial: true } );\n }\n return scene._PolygonEntity_material_pick;\n }\n }\n\n\n /**\n * @private\n */\n _setupByJson( json )\n {\n // json.boundaries\n for ( let boundary of json.boundaries ) {\n if ( boundary.type == \"inner\" ) {\n this.addInnerBoundary( boundary.points );\n }\n else {\n this.addOuterBoundary( boundary.points );\n }\n }\n\n // json.extruded_height\n if ( json.extruded_height !== undefined ) {\n this.extruded_height = json.extruded_height;\n }\n\n // json.color\n // .opacity\n if ( json.color !== undefined ) GeoMath.copyVector3( json.color, this._color );\n if ( json.opacity !== undefined ) this._opacity = json.opacity;\n }\n\n\n /**\n * @summary 中央位置を取得\n *\n * @desc\n *

中央位置を計算して返す。多角形が存在しないときは null を返す。

\n *\n *

中央位置が変化する可能性があるときは this._position にを null を設定すること。

\n *\n *
\n     * 入力: this._boundaries\n     * 
\n *\n * @return {mapray.GeoPoint} 中央位置 (高度は 0) または null\n *\n * @private\n */\n _getPosition()\n {\n if ( this._position !== null ) {\n // キャッシュさている値を返す\n return this._position;\n }\n\n if ( this._boundaries.length == 0 ) {\n // 多角形が存在しない\n return null;\n }\n\n var min_lon = Number.MAX_VALUE;\n var max_lon = -Number.MAX_VALUE;\n var min_lat = Number.MAX_VALUE;\n var max_lat = -Number.MAX_VALUE;\n\n for ( let bo of this._boundaries ) {\n let count = bo.num_points;\n let points = bo.points;\n\n for ( let i = 0; i < count; ++i ) {\n var lon = points[3*i ];\n var lat = points[3*i + 1];\n\n if ( lon < min_lon ) min_lon = lon;\n if ( lon > max_lon ) max_lon = lon;\n if ( lat < min_lat ) min_lat = lat;\n if ( lat > max_lat ) max_lat = lat;\n }\n }\n\n this._position = new GeoPoint( (min_lon + max_lon) / 2,\n (min_lat + max_lat) / 2 );\n\n return this._position;\n }\n\n\n /**\n * @summary すべての境界の頂点数の合計を取得\n *\n * @private\n */\n _countNumPointsOnBoundaries()\n {\n let num_points = 0;\n\n for ( let bo of this._boundaries ) {\n num_points += bo.num_points;\n }\n\n return num_points;\n }\n\n\n /**\n * @summary 結合された境界点列を取得\n *\n * @return {Float64Array} 結合された境界点列\n */\n _getCombinedBoundaryPoints()\n {\n let points = new Float64Array( 3 * this._countNumPointsOnBoundaries() );\n let offset = 0;\n\n for ( let bo of this._boundaries ) {\n points.set( bo.points, offset );\n offset += 3 * bo.num_points;\n }\n\n return points;\n }\n\n\n /**\n * @summary 結合された 2D 境界点列を取得 (高度なし)\n *\n * @return {Float64Array} 結合された 2D 境界点列\n */\n _getCombinedBoundary2DPoints()\n {\n let dst_points = new Float64Array( 2 * this._countNumPointsOnBoundaries() );\n let di = 0;\n\n for ( let bo of this._boundaries ) {\n let src_size = 3 * bo.num_points;\n let src_points = bo.points;\n for ( let si = 0; si < src_size; si += 3 ) {\n dst_points[di++] = src_points[si ];\n dst_points[di++] = src_points[si + 1];\n }\n }\n\n return dst_points;\n }\n\n\n /**\n * @summary 三角形リストを生成\n *\n * @desc\n *

this.entity._boundaries を三角形に変換してリストを返す。ただし変換に失敗したときは null を返す。

\n *\n * @return {Uint32Array} 三角形リストまたは null\n *\n * @private\n */\n _createTriangles()\n {\n let src_points = this._getCombinedBoundary2DPoints();\n let num_src_points = this._countNumPointsOnBoundaries();\n\n // 境界を登録\n let triangulator = new Triangulator( src_points, 0, 2, num_src_points );\n let index = 0;\n\n for ( let bo of this._boundaries ) {\n let num_indices = bo.num_points;\n let indices = new Uint32Array( num_indices );\n for ( let i = 0; i < num_indices; ++i ) {\n indices[i] = index++;\n }\n triangulator.addBoundary( indices );\n }\n\n try {\n // 変換を実行\n return triangulator.run();\n }\n catch ( e ) {\n // 変換に失敗\n console.error( e.message );\n return null;\n }\n }\n\n}\n\n\n/**\n * @summary PolygonEntity の PrimitiveProducer\n *\n * @private\n */\nclass PrimitiveProducer extends Entity.PrimitiveProducer {\n\n\n /**\n * @param {mapray.PolygonEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n this._status = Status.INVALID;\n this._triangles = null; // 三角形リスト (Uint32Array)\n\n // プリミティブの要素\n this._transform = GeoMath.setIdentity( GeoMath.createMatrix() );\n this._pivot = GeoMath.createVector3();\n this._bbox = [GeoMath.createVector3(),\n GeoMath.createVector3()];\n this._properties = {\n color: GeoMath.createVector3f(),\n opacity: 1.0,\n lighting: false\n };\n\n // プリミティブ\n var primitive = new Primitive( entity.glenv, null, entity._getMaterial( RenderTarget.SCENE ), this._transform );\n primitive.pivot = this._pivot;\n primitive.bbox = this._bbox;\n primitive.properties = this._properties;\n\n this._primitive = primitive;\n\n var pickPrimitive = new Primitive( entity.glenv, null, entity._getMaterial( RenderTarget.RID ), this._transform );\n pickPrimitive.pivot = this._pivot;\n pickPrimitive.bbox = this._bbox;\n pickPrimitive.properties = this._properties;\n\n this._pickPrimitive = pickPrimitive;\n }\n\n\n /**\n * @override\n */\n needsElevation()\n {\n const owner = this.entity;\n return owner.altitude_mode !== AltitudeMode.ABSOLUTE;\n }\n\n\n /**\n * @override\n */\n createRegions()\n {\n let owner = this.entity;\n\n if ( this._status === Status.INVALID ) {\n // 多角形なし、または三角形に変換できなかったとき\n return [];\n }\n\n // 正常な多角形のとき\n\n var region = new EntityRegion();\n\n for ( let bo of owner._boundaries ) {\n region.addPoints( bo.points, 0, 3, bo.num_points );\n }\n\n region.addPoint( owner._getPosition() );\n\n return [region];\n }\n\n\n /**\n * @override\n */\n onChangeElevation( regions )\n {\n if ( this._status === Status.NORMAL ) {\n this._status = Status.MESH_DIRTY;\n }\n }\n\n\n /**\n * @override\n */\n getPrimitives( stage )\n {\n if ( this._status === Status.INVALID ) {\n // 多角形なし、または三角形に変換できなかったとき\n return [];\n }\n else if ( this._status === Status.TRIANGLE_DIRTY ) {\n this._triangles = this.entity._createTriangles();\n if ( this._triangles === null ) {\n // 多角形の三角形化に失敗\n this._primitive.mesh = null;\n this._pickPrimitive.mesh = null;\n this._status = Status.INVALID;\n return [];\n }\n this._updatePrimitiveMesh();\n }\n else if ( this._status === Status.MESH_DIRTY ) {\n this._updatePrimitiveMesh();\n }\n\n this._updatePrimitiveProperties();\n\n this._status = Status.NORMAL;\n return stage.getRenderTarget() === RenderTarget.SCENE ? [this._primitive] : [this._pickPrimitive];\n }\n\n\n /**\n * @summary 押し出しモードが変更されたことを通知\n */\n onChangeExtruded()\n {\n if ( this._status === Status.NORMAL ) {\n this._status = Status.MESH_DIRTY;\n }\n }\n\n\n /**\n * @summary プロパティが変更されたことを通知\n */\n onChangeProperty()\n {\n // することなし\n }\n\n\n /**\n * @summary 境界が変更されたことを通知\n */\n onChangeBoundary()\n {\n this._status = Status.TRIANGLE_DIRTY;\n this._triangles = null;\n this.needToCreateRegions();\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * 入力:\n * this.entity\n * this._triangles\n * 出力:\n * this._transform\n * this._pivot\n * this._bbox\n * this._primitive.mesh\n *\n * @private\n */\n _updatePrimitiveMesh()\n {\n var cb_data = new BoundaryConbiner( this.entity );\n\n // プリミティブの更新\n // primitive.transform\n // primitive.pivot\n // primitive.bbox\n this._updateTransformPivotBBox( cb_data );\n\n // メッシュ生成\n var mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 },\n { name: \"a_normal\", size: 3 }\n ],\n vertices: this._createVertices( cb_data ),\n indices: this._createIndices( cb_data )\n };\n var mesh = new Mesh( this.entity.scene.glenv, mesh_data );\n\n // メッシュ設定\n this._primitive.mesh = mesh;\n this._pickPrimitive.mesh = mesh;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n *
\n     * 出力:\n     *   this._transform\n     *   this._pivot\n     *   this._bbox\n     * 
\n *\n * @param {BoundaryConbiner} cb_data 入力データ\n *\n * @private\n */\n _updateTransformPivotBBox( cb_data )\n {\n // 変換行列の更新\n let transform = this._transform;\n transform[12] = cb_data.origin[0];\n transform[13] = cb_data.origin[1];\n transform[14] = cb_data.origin[2];\n\n // 統計\n let xmin = Number.MAX_VALUE;\n let ymin = Number.MAX_VALUE;\n let zmin = Number.MAX_VALUE;\n\n let xmax = -Number.MAX_VALUE;\n let ymax = -Number.MAX_VALUE;\n let zmax = -Number.MAX_VALUE;\n\n // [cb_data.upper, cb_data.lower]\n let points_array = [cb_data.upper];\n if ( cb_data.lower ) {\n points_array.push( cb_data.lower );\n }\n\n for ( let j = 0; j < points_array.length; ++j ) {\n let points = points_array[j];\n for ( let i = 0; i < cb_data.num_points; ++i ) {\n let b = 3 * i;\n let x = points[b ];\n let y = points[b + 1];\n let z = points[b + 2];\n\n if ( x < xmin ) { xmin = x; }\n if ( y < ymin ) { ymin = y; }\n if ( z < zmin ) { zmin = z; }\n\n if ( x > xmax ) { xmax = x; }\n if ( y > ymax ) { ymax = y; }\n if ( z > zmax ) { zmax = z; }\n }\n }\n\n // 中心点\n let pivot = this._pivot;\n pivot[0] = (xmin + xmax) / 2;\n pivot[1] = (ymin + ymax) / 2;\n pivot[2] = (zmin + zmax) / 2;\n\n // 境界箱\n let bbox = this._bbox;\n let bmin = bbox[0];\n let bmax = bbox[1];\n bmin[0] = xmin;\n bmin[1] = ymin;\n bmin[2] = zmin;\n bmax[0] = xmax;\n bmax[1] = ymax;\n bmax[2] = zmax;\n }\n\n\n /**\n * @summary 頂点配列の生成\n *\n * @desc\n * 生成される形式は [Px, Py, Pz, Nx, Ny, Nz, ...] のような形で、それぞれの座標はローカル座標系になる。\n * 配列の頂点データは 2 つの領域で分かれ、上面ポリゴンの頂点配列(S1) → 側面ポリゴンの頂点配列(S2) の順序で格納される。\n * ただし cb_data.lower == null のとき、配列は S1 部分しか設定されない。\n *\n * S1 は cb_data.upper に対応する頂点データが同じ順序で格納される。\n *\n * S2 は cb_data.num_points 個の四角形に対する頂点データが順番に並んでいる。\n * 各四角形の頂点データは 左下、右下、左上、右上 の順序で格納されている。\n *\n * 入力: this.entity._boundaries\n *\n * @param {BoundaryConbiner} cb_data 入力データ\n *\n * @return {Float32Array} Mesh 用の頂点配列\n *\n * @private\n */\n _createVertices( cb_data )\n {\n const fpv = 6; // 1頂点データあたりの float 数\n\n const s1_num_floats = fpv * cb_data.num_points; // 上面のデータサイズ\n const s2_num_floats = cb_data.lower ? fpv * (4*cb_data.num_points) : 0; // 側面のデータサイズ\n const s3_num_floats = cb_data.lower ? s1_num_floats : 0; // 底面のデータサイズ\n\n let vertices = new Float32Array( s1_num_floats + s2_num_floats + s3_num_floats );\n\n // 上面の法線を取得\n let unormal = GeoMath.normalize3( cb_data.origin, GeoMath.createVector3() );\n\n // 上面の頂点データ\n for ( let i = 0; i < cb_data.num_points; ++i ) {\n let b = 3 * i;\n let px = cb_data.upper[b];\n let py = cb_data.upper[b + 1];\n let pz = cb_data.upper[b + 2];\n\n let vi = fpv * i;\n vertices[vi ] = px; // a_position.x\n vertices[vi + 1] = py; // a_position.y\n vertices[vi + 2] = pz; // a_position.z\n setVec3ToArray( unormal, vertices, vi + 3 ); // a_normal\n }\n\n // 側面の頂点データ\n if ( cb_data.lower ) {\n let p00 = GeoMath.createVector3(); // 左下位置\n let p10 = GeoMath.createVector3(); // 右下位置\n let p01 = GeoMath.createVector3(); // 左上位置\n let p11 = GeoMath.createVector3(); // 右上位置\n let snormal = GeoMath.createVector3(); // 側面の法線\n\n let beg_i = 0; // bo の最初の頂点のインデックス\n\n for ( let bo of this.entity._boundaries ) {\n let end_i = beg_i + bo.num_points; // bo の最後の頂点のインデックス + 1\n\n for ( let i = beg_i; i < end_i; ++i ) {\n let i0 = i;\n let i1 = (i + 1 < end_i) ? i + 1 : beg_i;\n\n // 四隅の位置を取得\n let b0 = 3 * i0;\n let b1 = 3 * i1;\n setArrayToVec3( cb_data.lower, b0, p00 );\n setArrayToVec3( cb_data.lower, b1, p10 );\n setArrayToVec3( cb_data.upper, b0, p01 );\n setArrayToVec3( cb_data.upper, b1, p11 );\n\n // 側面の法線を取得\n setTriangleNormal( p00, p10, p01, snormal );\n\n // 四隅の頂点データを設定\n let vi = s1_num_floats + 4*fpv*i;\n setVec3ToArray( p00, vertices, vi ); // a_position\n setVec3ToArray( snormal, vertices, vi + 3 ); // a_normal\n vi += fpv;\n setVec3ToArray( p10, vertices, vi ); // a_position\n setVec3ToArray( snormal, vertices, vi + 3 ); // a_normal\n vi += fpv;\n setVec3ToArray( p01, vertices, vi ); // a_position\n setVec3ToArray( snormal, vertices, vi + 3 ); // a_normal\n vi += fpv;\n setVec3ToArray( p11, vertices, vi ); // a_position\n setVec3ToArray( snormal, vertices, vi + 3 ); // a_normal\n }\n\n beg_i = end_i;\n }\n }\n\n if ( cb_data.lower ) {\n const bnormal = GeoMath.scale3( -1.0, unormal, GeoMath.createVector3() );\n\n // 底面の頂点データ\n for ( let i = 0; i < cb_data.num_points; ++i ) {\n let b = 3 * i;\n let px = cb_data.lower[b];\n let py = cb_data.lower[b + 1];\n let pz = cb_data.lower[b + 2];\n\n let vi = s1_num_floats + s2_num_floats + fpv * i;\n vertices[vi ] = px; // a_position.x\n vertices[vi + 1] = py; // a_position.y\n vertices[vi + 2] = pz; // a_position.z\n setVec3ToArray( bnormal, vertices, vi + 3 ); // a_normal\n }\n }\n\n return vertices;\n }\n\n\n /**\n * @summary インデックス配列の生成\n *\n * 入力: this._triangles\n *\n * @param {BoundaryConbiner} cb_data 入力データ\n *\n * @return {Uint32Array} インデックス配列\n *\n * @private\n */\n _createIndices( cb_data )\n {\n // 頂点の並びは _createVertices() を参照\n\n let num_upper_triangles = this._triangles.length / 3;\n let num_side_triangles = cb_data.lower ? 2 * cb_data.num_points : 0;\n let num_bottom_triangles = cb_data.lower ? num_upper_triangles : 0;\n\n let indices = new Uint32Array( 3 * (num_upper_triangles + num_side_triangles + num_bottom_triangles) );\n\n // 前半に上面のポリゴンを設定\n indices.set( this._triangles );\n\n // 側面のポリゴンを設定\n if ( cb_data.lower ) {\n let num_quads = cb_data.num_points;\n let ioffset = 3 * num_upper_triangles; // indices 内の現在の四角形のオフセット\n let voffset = cb_data.num_points; // 頂点配列内の現在の四角形のオフセット\n\n for ( let i = 0; i < num_quads; ++i, ioffset += 6, voffset += 4 ) {\n // 左下三角形\n indices[ioffset ] = voffset;\n indices[ioffset + 1] = voffset + 1;\n indices[ioffset + 2] = voffset + 2;\n // 右上三角形\n indices[ioffset + 3] = voffset + 2;\n indices[ioffset + 4] = voffset + 1;\n indices[ioffset + 5] = voffset + 3;\n }\n }\n\n // 底面のポリゴンを設定\n if ( cb_data.lower ) {\n const len = this._triangles.length / 3;\n const voffset = cb_data.num_points + 4 * cb_data.num_points;\n for ( let i = 0; i < len; ++i ) {\n indices[ (num_upper_triangles + num_side_triangles + i) * 3 + 0 ] = this._triangles[ i * 3 + 0 ] + voffset;\n indices[ (num_upper_triangles + num_side_triangles + i) * 3 + 1 ] = this._triangles[ i * 3 + 2 ] + voffset;\n indices[ (num_upper_triangles + num_side_triangles + i) * 3 + 2 ] = this._triangles[ i * 3 + 1 ] + voffset;\n }\n }\n\n return indices;\n }\n\n\n /**\n * @summary プリミティブのプロパティを更新\n *\n * 入力: this.entity\n * 出力: this._properties\n *\n * @private\n */\n _updatePrimitiveProperties()\n {\n let owner = this.entity;\n let props = this._properties;\n\n GeoMath.copyVector3( owner._color, props.color );\n props.opacity = owner._opacity;\n props.lighting = this.extruded_height !== 0.0;\n }\n\n}\n\n\n/**\n * @summary PolygonEntity の FlakePrimitiveProducer\n *\n * @private\n */\nclass FlakePrimitiveProducer extends Entity.FlakePrimitiveProducer {\n\n /**\n * @param {mapray.PolygonEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n this._material_map = Object.keys(RenderTarget).reduce((map, key) => {\n const render_target = RenderTarget[key];\n map.set( render_target, entity._getMaterial( render_target ) );\n return map;\n }, new Map());\n this._properties = null;\n this._area_manager = new PolygonAreaManager( entity );\n }\n\n\n /**\n * @override\n */\n getAreaStatus( area )\n {\n return this._area_manager.getAreaStatus( area );\n }\n\n\n /**\n * @override\n */\n createMesh( area, dpows, dem )\n {\n // ConvexPolygon の配列、または Entity.AreaStatus.FULL\n let polygons = this._area_manager.getAreaContent( area );\n\n let msize = Math.PI * Math.pow( 2, 1 - area.z );\n let x_min = area.x * msize - Math.PI;\n let y_min = Math.PI - (area.y + 1) * msize;\n\n let div_x = 1 << dpows[0];\n let div_y = 1 << dpows[1];\n\n // サブメッシュの配列を生成\n let submeshes = this._createSubmeshes( x_min, y_min,\n x_min + msize, y_min + msize,\n div_x, div_y,\n polygons );\n\n // メッシュ生成\n let mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 },\n { name: \"a_normal\", size: 3 }\n ],\n vertices: this._createVertices( submeshes, area, dem ),\n indices: this._createIndices( submeshes )\n };\n\n return new Mesh( this.entity.scene.glenv, mesh_data );\n }\n\n\n /**\n * @override\n */\n getMaterialAndProperties( stage )\n {\n if ( this._properties === null ) {\n let entity = this.entity;\n\n this._properties = {\n color: GeoMath.createVector3f( entity._color ),\n opacity: entity._opacity,\n lighting: false\n };\n }\n\n return {\n material: this._material_map.get( stage.getRenderTarget() ),\n properties: this._properties\n };\n }\n\n\n /**\n * @summary 押し出しモードが変更されたことを通知\n */\n onChangeExtruded()\n {\n // flake_mode なので押し出しモードは関係ない\n }\n\n\n /**\n * @summary プロパティが変更されたことを通知\n */\n onChangeProperty()\n {\n this._properties = null;\n }\n\n\n /**\n * @summary 境界が変更されたことを通知\n */\n onChangeBoundary()\n {\n this._area_manager.notifyForUpdateContent();\n this.notifyForUpdate();\n }\n\n\n /**\n * @summary 頂点配列を生成\n *\n * @param {iterable.} submeshes\n * @param {mapray.Area} area\n * @param {mapray.DemBinary} dem\n *\n * @return {Float32Array}\n *\n * @private\n */\n _createVertices( submeshes, area, dem )\n {\n let origin = AreaUtil.getCenter( area, GeoMath.createVector3() );\n let sampler = dem.newSampler( area );\n\n // 頂点配列を生成\n let num_vertices = 0;\n for ( let smesh of submeshes ) {\n num_vertices += smesh.getNumVertices();\n }\n let vertices = new Float32Array( 6 * num_vertices );\n\n // 頂点配列に座標を書き込む\n let offset = 0;\n for ( let smesh of submeshes ) {\n offset = smesh.addVertices( origin, sampler, vertices, offset );\n }\n\n return vertices;\n }\n\n\n /**\n * @summary インデックス配列を生成\n *\n * @param {iterable.} submeshes\n *\n * @return {Uint32Array}\n *\n * @private\n */\n _createIndices( submeshes )\n {\n // インデックス配列を生成\n let num_triangles = 0;\n for ( let smesh of submeshes ) {\n num_triangles += smesh.getNumTriangles();\n }\n let indices = new Uint32Array( 3 * num_triangles );\n\n // インデックス配列にインデックスを書き込む\n let voffset = 0;\n let ioffset = 0;\n for ( let smesh of submeshes ) {\n ioffset = smesh.addIndices( voffset, indices, ioffset );\n voffset += smesh.getNumVertices();\n }\n\n return indices;\n }\n\n\n /**\n * @summary サブメッシュの配列を生成\n *\n *

polygons は領域と交差する ConvexPolygon の配列である。ただし領域が多角形で覆われているときは\n * Entity.AreaStatus.FULL になる場合がある。

\n *\n * @param {number} x_min 領域の最小 x 座標\n * @param {number} y_min 領域の最小 y 座標\n * @param {number} x_max 領域の最大 x 座標\n * @param {number} y_max 領域の最大 y 座標\n * @param {number} div_x 領域の x 方向の分割数\n * @param {number} div_y 領域の y 方向の分割数\n * @param {iterable.|mapray.Entity.AreaStatus} polygons\n *\n * @return {iterable.} サブメッシュの配列\n *\n * @private\n */\n _createSubmeshes( x_min, y_min, x_max, y_max, div_x, div_y, polygons )\n {\n if ( polygons === Entity.AreaStatus.FULL ) {\n // 領域内は多角形に覆われている\n return [ new RectSubmesh( x_min, y_min, x_max, y_max, div_x, div_y ) ];\n }\n else if ( polygons.length == 0 ) {\n // 領域内に多角形は無い\n return [];\n }\n else if ( div_x == 1 && div_y == 1 ) {\n // これ以上分割できないので切り取り多角形を返す\n let t1 = [x_min, y_min, x_max, y_min, x_min, y_max]; // 左下三角形\n let t2 = [x_min, y_max, x_max, y_min, x_max, y_max]; // 右上三角形\n\n let m1 = this._create_clipped_polygons_submeshes( t1, polygons );\n let m2 = this._create_clipped_polygons_submeshes( t2, polygons );\n return m1.concat( m2 );\n }\n else {\n if ( div_x >= div_y ) {\n // 左右分割\n let msize = (x_max - x_min) / 2;\n let div_w = div_x / 2;\n\n let m1 = this._create_submeshes_sp( x_min, y_min, x_min + msize, y_max, div_w, div_y, polygons );\n let m2 = this._create_submeshes_sp( x_min + msize, y_min, x_max, y_max, div_w, div_y, polygons );\n return m1.concat( m2 );\n }\n else {\n // 上下分割\n let msize = (y_max - y_min) / 2;\n let div_w = div_y / 2;\n\n let m1 = this._create_submeshes_sp( x_min, y_min, x_max, y_min + msize, div_x, div_w, polygons );\n let m2 = this._create_submeshes_sp( x_min, y_min + msize, x_max, y_max, div_x, div_w, polygons );\n return m1.concat( m2 );\n }\n }\n }\n\n\n /**\n * @summary サブメッシュの配列を生成\n *\n * @desc\n *

_createSubmeshes() との違いは polygons に Entity.AreaStatus.FULL を指定できない。\n * また、polygons には領域の外側の多角形が含まれている可能性がある。

\n *\n * @param {number} x_min 領域の最小 x 座標\n * @param {number} y_min 領域の最小 y 座標\n * @param {number} x_max 領域の最大 x 座標\n * @param {number} y_max 領域の最大 y 座標\n * @param {number} div_x 領域の x 方向の分割数\n * @param {number} div_y 領域の y 方向の分割数\n * @param {iterable.} polygons\n *\n * @return {Submesh[]} サブメッシュの配列\n *\n * @private\n */\n _create_submeshes_sp( x_min, y_min, x_max, y_max, div_x, div_y, polygons )\n {\n // 領域を凸多角形に変換\n let area_rect = ConvexPolygon.createByRectangle( x_min, y_min, x_max, y_max );\n\n let selected_polygons = [];\n\n for ( let polygon of polygons ) {\n if ( polygon.includes( area_rect ) ) {\n // polygon は area_rect を覆う\n // つまり area_rect は全体の多角形に覆われている\n selected_polygons = Entity.AreaStatus.FULL;\n break;\n }\n\n try {\n if ( area_rect.hasIntersection( polygon ) ) {\n // 領域と交差しているので polygon 追加\n selected_polygons.push( polygon );\n }\n }\n catch ( e ) {\n // polygon の交差判定に失敗したときは polygon は無いことにする\n }\n }\n\n return this._createSubmeshes( x_min, y_min, x_max, y_max, div_x, div_y, selected_polygons );\n }\n\n\n /**\n * @summary 凸多角形のサブメッシュの配列を生成\n * \n * @desc\n *

area_triangle の三角形で src_polygons の凸多角形を切り取り、それらの切り取られた凸多角形に対応する\n * PolygonsSubmesh インスタンスの配列を生成する。

\n *\n * arit = Area Right Isosceles Triangle (領域直角二等辺三角形)\n *\n * @param {number[]} arit_coords 領域の三角形座標配列 (左下または右上の三角形)\n * @param {iterable.} src_polygons 切り取り対象の凸多角形の配列\n *\n * @return {PolygonsSubmesh[]} PolygonsSubmesh の配列\n *\n * @private\n */\n _create_clipped_polygons_submeshes( arit_coords, src_polygons )\n {\n let area_polygon = new ConvexPolygon( arit_coords );\n\n let clipped_polygons = [];\n\n for ( let polygon of src_polygons ) {\n try {\n let clipped = area_polygon.getIntersection( polygon );\n if ( clipped !== null ) {\n clipped_polygons.push( clipped );\n }\n }\n catch ( e ) {\n // polygon の切り抜きに失敗したときは polygon の切り抜きは返さない\n }\n }\n\n if ( clipped_polygons.length > 0 ) {\n return [ new PolygonsSubmesh( arit_coords, clipped_polygons ) ];\n }\n else {\n return [];\n }\n }\n\n}\n\n\n/**\n * @summary 多角形の境界\n *\n * @classdesc\n *

多角形の1つの境界を表現する。

\n *

外側境界のときは反時計回り、内側境界のときは時計回りで格納される。

\n *\n * @private\n */\nclass Boundary {\n\n /**\n * @desc\n *

points は addOuterBoundary(), addInnerBoundary() と同じ形式である。

\n *\n * @param {number[]} points 境界の頂点データ\n * @param {boolean} is_inner 内側境界か?\n */\n constructor( points, is_inner )\n {\n let num_points = Math.floor( points.length / 3 );\n\n this._points = new Float64Array( 3 * num_points );\n this._num_points = num_points;\n\n let is_ccw = Boundary.isCCW( points, num_points );\n\n let si;\n let si_step;\n\n if ( (!is_inner && is_ccw) || (is_inner && !is_ccw) ) {\n // 順方向\n si = 0;\n si_step = 3;\n }\n else {\n // 逆方向\n si = 3 * (num_points - 1);\n si_step = -3;\n }\n\n // 内部の配列にコピー\n for ( let i = 0; i < num_points; ++i ) {\n this._points[3*i ] = points[si ];\n this._points[3*i + 1] = points[si + 1];\n this._points[3*i + 2] = points[si + 2];\n si += si_step;\n }\n }\n\n\n /**\n * @summary 頂点座標の配列\n * @type {number[]}\n * @readonly\n */\n get points() { return this._points; }\n\n\n /**\n * @summary 頂点数\n * @type {number}\n * @readonly\n */\n get num_points() { return this._num_points; }\n\n\n /**\n * @summary 境界は反時計回りか?\n *\n * @param {number[]} points 境界の頂点データ\n *\n * @return {boolean} 反時計回りのとき true, それ以外のとき false\n */\n static\n isCCW( points, num_points )\n {\n // 頂上の点、同じ高さなら左側優先\n let top_i;\n let top_x = -Number.MAX_VALUE;\n let top_y = -Number.MAX_VALUE;\n\n for ( let i = 0; i < num_points; ++i ) {\n let x = points[3*i ];\n let y = points[3*i + 1];\n if ( (y > top_y) || (y == top_y && x < top_x)) {\n top_i = i;\n top_x = x;\n top_y = y;\n }\n }\n\n // top の前方の点\n let next_i = (top_i == num_points - 1) ? 0 : top_i + 1;\n let next_x = points[3*next_i ];\n let next_y = points[3*next_i + 1];\n\n // top の後方の点\n let prev_i = (top_i == 0) ? num_points - 1 : top_i - 1;\n let prev_x = points[3*prev_i ];\n let prev_y = points[3*prev_i + 1];\n\n // prev と next は top より下または同じ高さだが、少なくともどちらか一方は top より下になる\n // またエッジは交差しないことが前提なので、2 つのエッジの内角は 0 度より大きく 180 度未満になる\n // したがって a, b の行列式が正のとき反時計回り、それ以外のとき時計回り\n let ax = next_x - top_x;\n let ay = next_y - top_y;\n let bx = prev_x - top_x;\n let by = prev_y - top_y;\n\n return ax*by - bx*ay > 0;\n }\n\n}\n\n\n/**\n * @summary 境界線データを結合\n *\n * @classdesc\n *

pe._bounaries に対応する上頂点と底頂点の LOCS 平坦化配列を取得する。

\n *

pe._extruded_height === 0 のときは lower に null を設定する。

\n *\n *
\n * プロパティ:\n *   origin: Vector3       // LOCS の原点位置 (GOCS)\n *   num_points: number    // upper の頂点数\n *   upper: Float64Array   // 上頂点 (LOCS, 順序は pe._bounaries.points の連結)\n *   lower: Float64Array   // 底頂点 (LOCS, 順序は upper と同じ, nullable)\n * 
\n *\n * @private\n */\nclass BoundaryConbiner {\n\n /**\n * @desc\n *
\n     * 入力:\n     *   pe.viewer\n     *   pe.altitude_mode\n     *   pe._extruded_height\n     *   pe._bounaries\n     * 
\n *\n * @param {mapray.PolygonEntity} pe 呼び出し側のポリゴンエンティティ\n */\n constructor( pe )\n {\n /*\n pe._extruded_height !== 0 == 0 \n \n --- _.-*---*._ _.-*---*._ \n upper_points *-_ _-* *-_ _-*\n --- | *----* | *----* \n | | | | \n --- | | | | \n lower_points *-_| |_-* (null) \n --- *----* \n */\n let viewer = pe.scene.viewer;\n let altitude_mode = pe.altitude_mode;\n\n let src_points = pe._getCombinedBoundaryPoints();\n let num_points = pe._countNumPointsOnBoundaries();\n\n let base_points = Float64Array.from( src_points );\n\n if ( altitude_mode === AltitudeMode.RELATIVE ) {\n let elevation = viewer.getExistingElevation( pe._getPosition() );\n for ( let i = 0; i < num_points; ++i ) {\n let ai = 3 * i + 2;\n base_points[ai] += elevation;\n }\n }\n\n let upper_points = null;\n let lower_points = null;\n if ( pe._extruded_height !== 0 ) {\n if ( altitude_mode === AltitudeMode.CLAMP ) {\n upper_points = base_points;\n lower_points = Float64Array.from( src_points );\n for ( let i = 0; i < num_points; ++i ) {\n let ai = 3 * i + 2;\n lower_points[ai] = 0;\n }\n }\n else { // altitude_mode !== AltitudeMode.ABSOLUTE || altitude_mode !== AltitudeMode.RELATIVE\n lower_points = base_points;\n upper_points = Float64Array.from( src_points );\n for ( let i = 0; i < num_points; ++i ) {\n let ai = 3 * i + 2;\n upper_points[ai] = lower_points[ai] + pe._extruded_height;\n }\n }\n }\n else {\n upper_points = base_points;\n }\n\n let origin = pe._getPosition().getAsGocs( GeoMath.createVector3() );\n\n // LOCS 平坦化配列\n let upper_ocs_points = GeoPoint.toGocsArray( upper_points, num_points,\n new Float64Array( 3 * num_points ) );\n for ( let i = 0; i < num_points; ++i ) {\n let d = 3 * i;\n upper_ocs_points[d ] -= origin[0];\n upper_ocs_points[d + 1] -= origin[1];\n upper_ocs_points[d + 2] -= origin[2];\n }\n\n let lower_ocs_points = null;\n if ( lower_points ) {\n // ASSERT: lower_points != null\n lower_ocs_points = GeoPoint.toGocsArray( lower_points, num_points,\n new Float64Array( 3 * num_points ) );\n for ( let i = 0; i < num_points; ++i ) {\n let d = 3 * i;\n lower_ocs_points[d ] -= origin[0];\n lower_ocs_points[d + 1] -= origin[1];\n lower_ocs_points[d + 2] -= origin[2];\n }\n }\n\n // プロパティを設定\n this.origin = origin;\n this.num_points = num_points;\n this.upper = upper_ocs_points;\n this.lower = lower_ocs_points;\n }\n\n}\n\n\n/**\n * @summary 多角形の領域管理\n *\n * @private\n */\nclass PolygonAreaManager extends QAreaManager {\n\n /**\n * @param {mapray.PolygonEntity} entity 管理対象のエンティティ\n */\n constructor( entity )\n {\n super();\n\n this._entity = entity;\n }\n\n\n /**\n * @override\n */\n getInitialContent()\n {\n let src_indices = this._entity._createTriangles() || [];\n let num_src_indices = src_indices.length;\n\n let src_coords = this._entity._getCombinedBoundary2DPoints();\n let content = []; // ConvexPolygon の配列\n\n for ( let si = 0; si < num_src_indices; si += 3 ) {\n let i0 = src_indices[si ];\n let i1 = src_indices[si + 1];\n let i2 = src_indices[si + 2];\n this._add_polygon_to_array( src_coords, i0, i1, i2, content );\n }\n\n return content;\n }\n\n\n /**\n * @override\n */\n createAreaContent( min_x, min_y, msize, parent_content )\n {\n // 単位球メルカトルでの領域に変換\n const x_area_min = Math.PI * min_x;\n const y_area_min = Math.PI * min_y;\n const x_area_max = Math.PI * (min_x + msize);\n const y_area_max = Math.PI * (min_y + msize);\n\n // 領域を凸多角形に変換\n const area_rect = ConvexPolygon.createByRectangle( x_area_min, y_area_min,\n x_area_max, y_area_max );\n\n let content = []; // ConvexPolygon の配列\n\n for ( let polygon of parent_content ) {\n\n if ( polygon.includes( area_rect ) ) {\n // polygon は area_rect を覆う\n // つまり area_rect は全体の多角形に覆われている\n return Entity.AreaStatus.FULL;\n }\n\n try {\n if ( area_rect.hasIntersection( polygon ) ) {\n // 領域と交差しているので polygon 追加\n content.push( polygon );\n }\n }\n catch ( e ) {\n // polygon の交差判定に失敗したときは polygon は無いことにする\n }\n }\n\n return (content.length > 0) ? content : Entity.AreaStatus.EMPTY;\n }\n\n\n /**\n * @summary 三角形を凸多角形として追加\n *\n * @param {number[]} src_coords 入力頂点の座標配列 (経緯度)\n * @param {number} si0 三角形の頂点 0\n * @param {number} si1 三角形の頂点 1\n * @param {number} si2 三角形の頂点 2\n * @param {mapray.ConvexPolygon[]} dst_polygons 出力先の ConvexPolygon 配列\n *\n * @private\n */\n _add_polygon_to_array( src_coords, si0, si1, si2, dst_polygons )\n {\n const Degree = GeoMath.DEGREE;\n const RAngle = Math.PI / 2; // 直角\n const TwoPI = 2 * Math.PI; // 2π\n\n // 三角形の頂点座標配列 (単位球メルカトル座標系) を作成\n let vertices = [];\n let mx_min_1 = Number.MAX_VALUE; // オフセット処理前の最小 mx 座標\n\n for ( let si of [si0, si1, si2] ) {\n let lon = src_coords[2*si ] * Degree;\n let lat = src_coords[2*si + 1] * Degree;\n\n if ( Math.abs( lat ) >= RAngle ) {\n // 緯度の絶対値が RAngle 以上の頂点が存在する三角形は除外\n // ※ まだ検討していないので、とりあえずの処置\n return;\n }\n\n let mx = lon;\n let my = GeoMath.invGudermannian( lat );\n\n vertices.push( mx );\n vertices.push( my );\n\n mx_min_1 = Math.min( mx, mx_min_1 );\n }\n\n // mx_min_2: mx 座標が mx_min_1 だった頂点のオフセット後の mx 座標\n let mx_min_2 = mx_min_1 - TwoPI * (Math.floor( (mx_min_1 - Math.PI) / TwoPI ) + 1);\n if ( mx_min_2 < -Math.PI || mx_min_2 >= Math.PI ) {\n // 数値計算誤差により稀に区間からはみ出る可能性があるので\n mx_min_2 = -Math.PI;\n }\n // Assert: -Math.PI <= mx_min_2 < Math.PI\n\n // mx 座標にオフセットを適用\n let mx_max_2 = -Number.MAX_VALUE; // オフセット後の最大 mx 座標\n\n for ( let i = 0; i < 3; ++i ) {\n let ix = 2 * i;\n let mx_1 = vertices[ix]; // オフセット前の mx 座標\n\n // mx_2: オフセット後の mx 座標\n let dx_1 = mx_1 - mx_min_1; // Assert: dx_1 >= 0\n let mx_2 = mx_min_2 + dx_1; // Assert: mx_2 >= mx_min_2\n // Assert: (mx_1 == mx_min_1) ⇒ (mx_2 == mx_min_2)\n\n vertices[ix] = mx_2;\n\n mx_max_2 = Math.max( mx_2, mx_max_2 );\n }\n\n // オフセットを適用した三角形を加える\n dst_polygons.push( new ConvexPolygon( vertices ) );\n\n // 三角形が 180 度子午線をまたぐとき\n // 360 度左にずらした三角形をもう1つ加える\n if ( mx_max_2 > Math.PI ) {\n for ( let i = 0; i < 3; ++i ) {\n let ix = 2 * i;\n let mx_2 = vertices[ix]; // オフセット後の mx 座標\n let mx_3 = mx_2 - TwoPI; // 360 度左にずらした mx 座標\n vertices[ix] = mx_3;\n }\n\n dst_polygons.push( new ConvexPolygon( vertices ) );\n }\n }\n\n}\n\n\n/**\n * @summary サブメッシュ\n *\n * @private\n */\nclass Submesh {\n\n /**\n */\n constructor()\n {\n }\n\n\n /**\n * @summary 頂点数を取得\n *\n * @return {number} 頂点数\n *\n * @abstract\n */\n getNumVertices()\n {\n throw \"\";\n }\n\n\n /**\n * @summary 三角形数を取得\n *\n * @return {number} 三角形数\n *\n * @abstract\n */\n getNumTriangles()\n {\n throw \"\";\n }\n\n\n /**\n * @summary 頂点配列に頂点データを書き込む\n *\n * @param {mapray.Vector3} origin 座標系の原点 (GOCS)\n * @param {mapray.Sampler} sampler DEM サンプラー\n * @param {number[]} vertices 書き込み先の配列\n * @param {number} offset 書き込み開始インデックス\n *\n * @return {number} offset + 書き込んだ要素数\n *\n * @abstract\n */\n addVertices( origin, sampler, vertices, offset )\n {\n throw \"\";\n }\n\n\n /**\n * @summary インデックス配列にインデックスを書き込む\n *\n * @param {number} voffset this 用頂点の先頭の頂点インデックス\n * @param {number[]} indices 書き込み先の配列\n * @param {number} ioffset 書き込み開始インデックス\n *\n * @return {number} ioffset + 書き込んだ要素数\n *\n * @abstract\n */\n addIndices( voffset, indices, ioffset )\n {\n throw \"\";\n }\n\n}\n\n\n/**\n * @summary 矩形サブメッシュ\n *\n * @private\n */\nclass RectSubmesh extends Submesh {\n\n /**\n * @param {number} x_min\n * @param {number} y_min\n * @param {number} x_max\n * @param {number} y_max\n * @param {number} div_x\n * @param {number} div_y\n */\n constructor( x_min, y_min, x_max, y_max, div_x, div_y )\n {\n super();\n\n this._x_min = x_min;\n this._y_min = y_min;\n this._x_max = x_max;\n this._y_max = y_max;\n this._div_x = div_x;\n this._div_y = div_y;\n }\n\n\n /**\n * @override\n */\n getNumVertices()\n {\n return (this._div_x + 1) * (this._div_y + 1);\n }\n\n\n /**\n * @override\n */\n getNumTriangles()\n {\n return 2 * this._div_x * this._div_y;\n }\n\n\n /**\n * @override\n */\n addVertices( origin, sampler, vertices, offset )\n {\n // 刻み幅\n let mx_step = (this._x_max - this._x_min) / this._div_x;\n let my_step = (this._y_max - this._y_min) / this._div_y;\n\n let end_iu = this._div_x + 1;\n let end_iv = this._div_y + 1;\n\n let index = offset;\n\n for ( let iv = 0, my = this._y_min; iv < end_iv; ++iv, my += my_step ) {\n let ey = Math.exp( my );\n let ey2 = ey * ey;\n let sinφ = (ey2 - 1) / (ey2 + 1);\n let cosφ = 2 * ey / (ey2 + 1);\n for ( let iu = 0, mx = this._x_min; iu < end_iu; ++iu, mx += mx_step ) {\n let sinλ = Math.sin( mx );\n let cosλ = Math.cos( mx );\n\n let height = sampler.sample( mx, my );\n let radius = GeoMath.EARTH_RADIUS + height;\n\n // 法線 (GOCS)\n let nx = cosφ * cosλ;\n let ny = cosφ * sinλ;\n let nz = sinφ;\n\n // 位置 (GOCS)\n let gx = radius * nx;\n let gy = radius * ny;\n let gz = radius * nz;\n\n vertices[index++] = gx - origin[0]; // x\n vertices[index++] = gy - origin[1]; // y\n vertices[index++] = gz - origin[2]; // z\n vertices[index++] = nx; // nx\n vertices[index++] = ny; // ny\n vertices[index++] = nz; // nz\n }\n }\n\n return index;\n }\n\n\n /**\n * @override\n */\n addIndices( voffset, indices, ioffset )\n {\n let div_x = this._div_x;\n let div_y = this._div_y;\n\n let index = ioffset;\n\n for ( let y = 0; y < div_y; ++y ) {\n for ( let x = 0; x < div_x; ++x ) {\n var i00 = voffset + (div_x + 1) * y + x; // 左下頂点\n var i10 = i00 + 1; // 右下頂点\n var i01 = i00 + div_x + 1; // 左上頂点\n var i11 = i01 + 1; // 右上頂点\n\n // 左下三角形\n indices[index++] = i00;\n indices[index++] = i10;\n indices[index++] = i01;\n\n // 右上三角形\n indices[index++] = i01;\n indices[index++] = i10;\n indices[index++] = i11;\n }\n }\n\n return index;\n }\n\n}\n\n\n/**\n * @summary 凸多角形集合サブメッシュ\n *\n * @private\n */\nclass PolygonsSubmesh extends Submesh {\n\n /**\n * this の生存中はパラメータのオブジェクトを変更しないこと。\n *\n * @param {number[]} arit_coords 領域の三角形座標配列 (左下または右上の三角形)\n * @param {iterable.} polygons arit_coords の上にある凸多角形集合\n */\n constructor( arit_coords, polygons )\n {\n super();\n\n this._arit_coords = arit_coords;\n this._polygons = polygons;\n\n this._num_vertices = 0;\n this._num_triangles = 0;\n\n for ( let polygon of polygons ) {\n this._num_vertices += polygon.num_vertices;\n this._num_triangles += polygon.num_vertices - 2;\n }\n }\n\n\n /**\n * @override\n */\n getNumVertices()\n {\n return this._num_vertices;\n }\n\n\n /**\n * @override\n */\n getNumTriangles()\n {\n return this._num_triangles;\n }\n\n\n /**\n * @override\n */\n addVertices( origin, sampler, vertices, offset )\n {\n let plane = this._get_elevation_plane( sampler );\n\n let index = offset;\n\n for ( let polygon of this._polygons ) {\n index = this._add_polygon_vertices( polygon, plane, origin, vertices, index );\n }\n\n return index;\n }\n\n\n /**\n * @override\n */\n addIndices( voffset, indices, ioffset )\n {\n let iofs_next = ioffset;\n let vofs_next = voffset;\n\n for ( let polygon of this._polygons ) {\n iofs_next = this._add_polygon_indices( polygon, vofs_next, indices, iofs_next );\n vofs_next += polygon.num_vertices;\n }\n\n return iofs_next;\n }\n\n\n /**\n * @summary 凸多角形の頂点を追加\n *\n * @param {mapray.ConvexPolygon} polygon 凸多角形\n * @param {number[]} plane 平面係数\n * @param {mapray.Vector3} origin 座標系の原点 (GOCS)\n * @param {number[]} vertices 書き込み先の配列\n * @param {number} offset 書き込み開始インデックス\n *\n * @return {number} offset + 書き込んだ要素数\n *\n * @private\n */\n _add_polygon_vertices( polygon, plane, origin, vertices, offset )\n {\n let index = offset;\n\n let num_vertices = polygon.num_vertices;\n let src_vertices = polygon.vertices;\n\n for ( let vi = 0; vi < num_vertices; ++vi ) {\n let mx = src_vertices[2*vi ];\n let my = src_vertices[2*vi + 1];\n\n let ey = Math.exp( my );\n let ey2 = ey * ey;\n\n let sinλ = Math.sin( mx );\n let cosλ = Math.cos( mx );\n let sinφ = (ey2 - 1) / (ey2 + 1);\n let cosφ = 2 * ey / (ey2 + 1);\n\n // mx*plane[0] + my*plane[1] + height*plane[2] + plane[3] == 0\n let height = -(mx*plane[0] + my*plane[1] + plane[3]) / plane[2];\n let radius = GeoMath.EARTH_RADIUS + height;\n\n // 法線 (GOCS)\n let nx = cosφ * cosλ;\n let ny = cosφ * sinλ;\n let nz = sinφ;\n\n // 位置 (GOCS)\n let gx = radius * nx;\n let gy = radius * ny;\n let gz = radius * nz;\n\n vertices[index++] = gx - origin[0]; // x\n vertices[index++] = gy - origin[1]; // y\n vertices[index++] = gz - origin[2]; // z\n vertices[index++] = nx; // nx\n vertices[index++] = ny; // ny\n vertices[index++] = nz; // nz\n }\n\n return index;\n }\n\n\n /**\n * @summary 凸多角形のインデックスを追加\n *\n * @param {mapray.ConvexPolygon} polygon 凸多角形\n * @param {number} voffset this 用頂点の先頭の頂点インデックス\n * @param {number[]} indices 書き込み先の配列\n * @param {number} ioffset 書き込み開始インデックス\n *\n * @return {number} ioffset + 書き込んだ要素数\n *\n * @private\n */\n _add_polygon_indices( polygon, voffset, indices, ioffset )\n {\n let index = ioffset;\n\n let num_triangles = polygon.num_vertices - 2;\n\n for ( let i = 1; i <= num_triangles; ++i ) {\n indices[index++] = voffset;\n indices[index++] = voffset + i;\n indices[index++] = voffset + i + 1;\n }\n\n return index;\n }\n\n\n /**\n * @summary 平面ベースで標高を計算するための係数を取得\n *\n * @param {mapray.Sampler} sampler\n *\n * @return {number[]} 平面係数 [x, y, z, w]\n *\n * @private\n */\n _get_elevation_plane( sampler )\n {\n let coords = this._arit_coords;\n\n // 三角形の頂点の高さを取得\n let z_coords = new Array( 3 );\n\n for ( let i = 0; i < 3; ++i ) {\n let mx = coords[2*i ];\n let my = coords[2*i + 1];\n z_coords[i] = sampler.sample( mx, my );\n }\n\n let ox = coords[0];\n let oy = coords[1];\n let oz = z_coords[0];\n\n let x1 = coords[2] - ox;\n let y1 = coords[3] - oy;\n let z1 = z_coords[1] - oz;\n\n let x2 = coords[4] - ox;\n let y2 = coords[5] - oy;\n let z2 = z_coords[2] - oz;\n\n // [nx, ny, nz] = [x1, y1, z1] x [x2, y2, z2]\n let nx = y1*z2 - z1*y2;\n let ny = z1*x2 - x1*z2;\n let nz = x1*y2 - y1*x2;\n\n return [nx, ny, nz, -ox*nx - oy*ny - oz*nz];\n }\n\n}\n\n\n/**\n * @summary 配列からベクトルを設定\n *\n * array[index] から vec に設定する。\n *\n * @private\n */\nfunction\nsetArrayToVec3( array, index, vec )\n{\n vec[0] = array[index];\n vec[1] = array[index + 1];\n vec[2] = array[index + 2];\n}\n\n\n/**\n * @summary 配列からベクトルを設定\n *\n * vec から array[index] に設定する。\n *\n * @private\n */\nfunction\nsetVec3ToArray( vec, array, index )\n{\n array[index] = vec[0];\n array[index + 1] = vec[1];\n array[index + 2] = vec[2];\n}\n\n\n/**\n * @summary 3頂点から正規化法線ベクトルを設定\n * @private\n */\nfunction\nsetTriangleNormal( p0, p1, p2, normal )\n{\n for ( let i = 0; i < 3; ++i ) {\n temp_normal_ax[i] = p1[i] - p0[i];\n temp_normal_ay[i] = p2[i] - p0[i];\n }\n\n GeoMath.cross3( temp_normal_ax, temp_normal_ay, normal );\n GeoMath.normalize3( normal, normal );\n\n return normal;\n}\n\n\nvar temp_normal_ax = GeoMath.createVector3();\nvar temp_normal_ay = GeoMath.createVector3();\n\n\n/**\n * @summary 内部ステータス\n * @enum {object}\n * @constant\n * @private\n */\nvar Status = {\n\n INVALID: { id: \"INVALID\" },\n NORMAL: { id: \"NORMAL\" },\n TRIANGLE_DIRTY: { id: \"TRIANGLE_DIRTY\" },\n MESH_DIRTY: { id: \"MESH_DIRTY\" }\n\n};\n\n\nexport default PolygonEntity;\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int8Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int8', function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","/**\n * glTF の bufferView に対応\n * @memberof mapray.gltf\n * @private\n */\nclass BufferView {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {number} index バッファビュー索引\n */\n constructor( ctx, index )\n {\n // glTF の bufferView オブジェクト (specification/2.0/schema/bufferView.schema.json)\n var jbufferView = ctx.gjson.bufferViews[index];\n\n this._buffer = ctx.findBuffer( jbufferView.buffer );\n\n this._byteLength = jbufferView.byteLength;\n this._target = jbufferView.target; // ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER\n\n this._byteOffset = (jbufferView.byteOffset !== undefined) ? jbufferView.byteOffset : 0;\n this._byteStride = (jbufferView.byteStride !== undefined) ? jbufferView.byteStride : 0;\n }\n\n\n /**\n * 参照する gltf.Buffer インスタンスを取得\n * @type {mapray.gltf.Buffer}\n * @readonly\n */\n get buffer() { return this._buffer; }\n\n\n /**\n * ファッファ先頭からのバイトオフセット\n * @type {number}\n * @readonly\n */\n get byteOffset() { return this._byteOffset; }\n\n\n /**\n * インタリーブのバイトストライド\n * @type {number}\n * @readonly\n */\n get byteStride() { return this._byteStride; }\n\n\n /**\n * バッファ分割用の再構築処理\n *\n * @param {mapray.gltf.Buffer} buffer 部分バッファ\n */\n rebuildBySplitter( buffer )\n {\n // 部分バッファ全体を参照するようにする\n this._buffer = buffer;\n this._byteLength = buffer.byteLength;\n this._byteOffset = 0;\n }\n\n}\n\n\nexport default BufferView;\n","import BufferView from \"./BufferView\";\n\n\n/**\n * glTF の accessor に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Accessor {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {number} index アクセサ索引\n */\n constructor( ctx, index )\n {\n // glTF の accessor オブジェクト (specification/2.0/schema/accessor.schema.json)\n var jaccessor = ctx.gjson.accessors[index];\n\n this._type = jaccessor.type; // 文字列: SCALAR, VEC2, VEC3, VEC4, MAT2, MAT3, MAT4\n this._componentType = jaccessor.componentType; // GL_UNSIGNED_INT ...\n this._count = jaccessor.count; // >= 1\n\n this._bufferView = new BufferView( ctx, jaccessor.bufferView );\n\n this._byteOffset = (jaccessor.byteOffset !== undefined) ? jaccessor.byteOffset : 0;\n this._normalized = jaccessor.normalized || false;\n\n this._min = jaccessor.min ? jaccessor.min.slice() : null;\n this._max = jaccessor.max ? jaccessor.max.slice() : null;\n\n this._index = index;\n }\n\n\n /**\n * 対応する glTF オブジェクトでの索引を取得\n * @type {number}\n * @readonly\n */\n get index() { return this._index; }\n\n\n /**\n * 参照する gltf.BufferView インスタンスを取得\n * @type {mapray.gltf.BufferView}\n * @readonly\n */\n get bufferView() { return this._bufferView; }\n\n\n /**\n * データの型を取得\n * @type {string}\n * @readonly\n */\n get type() { return this._type; }\n\n\n /**\n * データ要素の型を取得\n * @type {number}\n * @readonly\n */\n get componentType() { return this._componentType; }\n\n\n /**\n * データの個数を取得\n * @type {number}\n * @readonly\n */\n get count() { return this._count; }\n\n\n /**\n * バッファビュー先頭からのバイトオフセットを取得\n * @type {number}\n * @readonly\n */\n get byteOffset() { return this._byteOffset; }\n\n\n /**\n * 正規化するか?\n * @type {boolean}\n * @readonly\n */\n get normalized() { return this._normalized; }\n\n\n /**\n * 座標の最小値\n * @type {?number[]}\n * @readonly\n */\n get min() { return this._min; }\n\n\n /**\n * 座標の最大値\n * @type {?number[]}\n * @readonly\n */\n get max() { return this._max; }\n\n\n /**\n * バッファ内でのデータ範囲を取得\n *\n * @return {object} データ範囲 = { first: 先頭オフセット, last: 末尾オフセット + 1 }\n */\n getRangeInBuffer()\n {\n var view = this._bufferView;\n var compo_size = Accessor._ComponentData[this._componentType].bytes;\n\n var data_size = compo_size * Accessor._NumComponents[this._type]; // データのバイト数\n var stride = (view.byteStride == 0) ? data_size : view.byteStride; // ストライド\n\n var first_offset = this._byteOffset + view.byteOffset; // バッファ内での先頭オフセット\n return {\n first: first_offset,\n last: first_offset + stride * (this._count - 1) + data_size // バッファ内での末尾オフセット + 1\n };\n }\n\n\n /**\n * バイトオーダーを修正\n *\n * @param {mapray.BitVector} modmap 修正マップ\n */\n modifyByteOrder( modmap )\n {\n var compo_data = Accessor._ComponentData[this._componentType];\n\n var compo_bytes = compo_data.bytes;\n if ( compo_bytes == 1 ) {\n return; // 1 バイト要素はバイトオーダーがないので処理しない\n }\n\n var num_compos = Accessor._NumComponents[this._type]; // 属性の要素数\n var byte_offset = this._byteOffset + this._bufferView.byteOffset; // バッファ先頭からのバイト数\n var compo_stride = (this._bufferView.byteStride == 0) ? // 要素単位のストライド\n num_compos : this._bufferView.byteStride / compo_bytes;\n\n var arraybuffer = this._bufferView.buffer.binary;\n var dataview = new DataView( arraybuffer, byte_offset );\n var typedarray = new compo_data.typedarray( arraybuffer, byte_offset );\n var getCompo = compo_data.getcompo; // DataView データ取得関数\n\n var compo_shorts = compo_bytes / 2; // 1 要素の short 数\n var short_offset = byte_offset / 2; // バッファ先頭からの short 数\n var short_stride = compo_stride * compo_shorts; // short 単位のストライド\n\n for ( var i = 0; i < this._count; ++i ) {\n var short_base_index = short_offset + i * short_stride;\n var compo_base_index = i * compo_stride;\n for ( var c = 0; c < num_compos; ++c ) {\n var short_index = short_base_index + c * compo_shorts;\n if ( modmap.getBit( short_index ) ) {\n continue; // すでに修正済みの要素なのでスキップ\n }\n\n var compo_index = compo_base_index + c;\n // リトルエンディアン (glTF 仕様) を想定して要素を読み込む\n var value = getCompo.call( dataview, compo_index * compo_bytes, true );\n // ネイティブエンディアン (WebGL 仕様) で要素を書き戻す\n typedarray[compo_index] = value;\n\n modmap.setBit( short_index, true );\n }\n }\n }\n\n\n /**\n * 範囲チェック\n *\n * @param {number} first バッファに対する開始位置\n * @param {number} last バッファに対する終了位置 + 1\n * @return {boolean} 最初のバイトが範囲に含まれるか?\n */\n isIncluded( first, last )\n {\n var byte_offset = this._byteOffset + this._bufferView.byteOffset;\n return (first <= byte_offset) && (byte_offset < last);\n }\n\n\n /**\n * バッファ分割用の再構築処理\n *\n * @param {mapray.gltf.Buffer} buffer 部分バッファ\n * @param {number} first 元バッファに対する buffer の開始位置\n */\n rebuildBySplitter( buffer, first )\n {\n this._index = -1;\n\n // 元バッファ先頭からのデータのバイト位置\n var old_byte_offset = this._byteOffset + this._bufferView.byteOffset;\n\n // 部分バッファ先頭からのデータのバイト位置\n this._byteOffset = old_byte_offset - first;\n\n // bufferView を部分バッファと一致するように更新\n this._bufferView.rebuildBySplitter( buffer );\n }\n\n}\n\n\nAccessor._NumComponents = {\n 'SCALAR': 1,\n 'VEC2': 2,\n 'VEC3': 3,\n 'VEC4': 4,\n 'MAT2': 4,\n 'MAT3': 9,\n 'MAT4': 16\n};\n\n\nAccessor._ComponentData = {\n 5120: { bytes: 1, getcompo: DataView.prototype.getInt8, typedarray: Int8Array }, // BYTE\n 5121: { bytes: 1, getcompo: DataView.prototype.getUint8, typedarray: Uint8Array }, // UNSIGNED_BYTE\n 5122: { bytes: 2, getcompo: DataView.prototype.getInt16, typedarray: Int16Array }, // SHORT\n 5123: { bytes: 2, getcompo: DataView.prototype.getUint16, typedarray: Uint16Array }, // UNSIGNED_SHORT\n 5125: { bytes: 4, getcompo: DataView.prototype.getUint32, typedarray: Uint32Array }, // UNSIGNED_INT\n 5126: { bytes: 4, getcompo: DataView.prototype.getFloat32, typedarray: Float32Array } // FLOAT\n};\n\n\nexport default Accessor;\n","import TextureInfo from \"./TextureInfo\";\nimport NormalTextureInfo from \"./NormalTextureInfo\";\nimport OcclusionTextureInfo from \"./OcclusionTextureInfo\";\nimport CommonData from \"./CommonData\";\n\n\n/**\n * glTF の material に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Material {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {number} index マテリアル索引\n */\n constructor( ctx, index )\n {\n const jmaterial = ctx.gjson.materials[index];\n this._commonData = new CommonData( jmaterial, ctx );\n\n this._pbrMetallicRoughness = {\n baseColorFactor: [1.0, 1.0, 1.0, 1.0],\n baseColorTexture: null,\n metallicFactor: 1.0,\n roughnessFactor: 1.0,\n metallicRoughnessTexture: null\n };\n\n this._doubleSided = false;\n this._alphaMode = \"OPAQUE\";\n this._alphaCutoff = 0.5;\n this._emissiveFactor = [0.0, 0.0, 0.0];\n this._emissiveTexture = null;\n this._normalTexture = null;\n this._occlusionTexture = null;\n\n // glTF の material オブジェクト (specification/2.0/schema/material.schema.json)\n this._setupPbrMetallicRoughness( jmaterial, ctx );\n this._setupGenericParameters( jmaterial, ctx );\n }\n\n\n /**\n * glTF オブジェクトの共通データ\n *\n * @type {mapray.gltf.CommonData}\n * @readonly\n */\n get commonData() { return this._commonData; }\n\n\n /**\n * MetallicRoughness PBR パラメータ\n * @type {object}\n * @readonly\n */\n get pbrMetallicRoughness() { return this._pbrMetallicRoughness; }\n\n\n /**\n * 両面レンダリングの有無\n * @type {boolean}\n * @readonly\n */\n get doubleSided() { return this._doubleSided; }\n\n\n /**\n * αモード\n * @type {string}\n * @readonly\n */\n get alphaMode() { return this._alphaMode; }\n\n\n /**\n * αカットオフ\n * @type {number}\n * @readonly\n */\n get alphaCutoff() { return this._alphaCutoff; }\n\n\n /**\n * 自己発光係数\n * @type {mapray.Vector3}\n * @readonly\n */\n get emissiveFactor() { return this._emissiveFactor; }\n\n\n /**\n * 自己発光テクスチャ\n * @type {?mapray.gltf.TextureInfo}\n * @readonly\n */\n get emissiveTexture() { return this._emissiveTexture; }\n\n\n /**\n * 法線テクスチャ\n * @type {?mapray.gltf.NormalTextureInfo}\n * @readonly\n */\n get normalTexture() { return this._normalTexture; }\n\n\n /**\n * 遮蔽テクスチャ\n * @type {?mapray.gltf.OcclusionTextureInfo}\n * @readonly\n */\n get occlusionTexture() { return this._occlusionTexture; }\n\n\n /**\n * this._pbrMetallicRoughness を設定\n *\n * @param {object} jmaterial glTF の material オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @private\n */\n _setupPbrMetallicRoughness( jmaterial, ctx )\n {\n if ( jmaterial.pbrMetallicRoughness === undefined ) {\n return;\n }\n\n // glTF の pbrMetallicRoughness オブジェクト (specification/2.0/schema/material.pbrMetallicRoughness.schema.json)\n var src = jmaterial.pbrMetallicRoughness;\n var dst = this._pbrMetallicRoughness;\n\n if ( src.baseColorFactor !== undefined ) {\n dst.baseColorFactor = src.baseColorFactor.slice();\n }\n\n if ( src.baseColorTexture !== undefined ) {\n dst.baseColorTexture = new TextureInfo( src.baseColorTexture, ctx );\n ctx.addTextureInfo( dst.baseColorTexture );\n }\n\n if ( src.metallicFactor !== undefined ) {\n dst.metallicFactor = src.metallicFactor;\n }\n\n if ( src.roughnessFactor !== undefined ) {\n dst.roughnessFactor = src.roughnessFactor;\n }\n\n if ( src.metallicRoughnessTexture !== undefined ) {\n dst.metallicRoughnessTexture = new TextureInfo( src.metallicRoughnessTexture, ctx );\n ctx.addTextureInfo( dst.metallicRoughnessTexture );\n }\n }\n\n\n /**\n * this._doubleSided などを設定\n *\n * @param {object} jmaterial glTF の material オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @private\n */\n _setupGenericParameters( jmaterial, ctx )\n {\n if ( jmaterial.doubleSided !== undefined ) {\n this._doubleSided = jmaterial.doubleSided;\n }\n\n if ( jmaterial.alphaMode !== undefined ) {\n this._alphaMode = jmaterial.alphaMode;\n }\n\n if ( jmaterial.alphaCutoff !== undefined ) {\n this._alphaCutoff = jmaterial.alphaCutoff;\n }\n\n if ( jmaterial.emissiveFactor !== undefined ) {\n this._emissiveFactor = jmaterial.emissiveFactor.slice();\n }\n\n if ( jmaterial.emissiveTexture !== undefined ) {\n this._emissiveTexture = new TextureInfo( jmaterial.emissiveTexture, ctx );\n ctx.addTextureInfo( this._emissiveTexture );\n }\n\n if ( jmaterial.normalTexture !== undefined ) {\n this._normalTexture = new NormalTextureInfo( jmaterial.normalTexture, ctx );\n ctx.addTextureInfo( this._normalTexture );\n }\n\n if ( jmaterial.occlusionTexture !== undefined ) {\n this._occlusionTexture = new OcclusionTextureInfo( jmaterial.occlusionTexture, ctx );\n ctx.addTextureInfo( this._occlusionTexture );\n }\n }\n\n}\n\n\nexport default Material;\n","import Accessor from \"./Accessor\";\nimport Material from \"./Material\";\n\n\n/**\n * glTF の primitive に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Primitive {\n\n /**\n * 初期化\n * @param {object} jprimitive glTF の primitive オブジェクト (specification/2.0/schema/mesh.primitive.schema.json)\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n */\n constructor( jprimitive, ctx )\n {\n this._mode = (jprimitive.mode !== undefined) ? jprimitive.mode : 4;\n this._attributes = {};\n this._indices = null;\n this._material = null;\n\n this._setupAttributes( jprimitive.attributes, ctx );\n this._setupIndices( jprimitive, ctx );\n this._setupMaterial( jprimitive, ctx );\n }\n\n\n /**\n * プリミティブモード\n *\n * @type {number}\n * @readonly\n */\n get mode() { return this._mode; }\n\n\n /**\n * @summary 頂点属性の辞書\n *\n *

頂点属性名から Accessor を引く辞書

\n *\n * @type {object}\n * @readonly\n */\n get attributes() { return this._attributes; }\n\n\n /**\n * インデックス\n *\n * @type {?mapray.gltf.Accessor}\n * @readonly\n */\n get indices() { return this._indices; }\n\n\n /**\n * マテリアル\n *\n * @type {?mapray.gltf.Material}\n * @readonly\n */\n get material() { return this._material; }\n\n\n /**\n * this._attributes を設定\n *\n * @param {object} jattributes glTF の primitive/attributes オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @private\n */\n _setupAttributes( jattributes, ctx )\n {\n for ( var name in jattributes ) {\n var accessor = new Accessor( ctx, jattributes[name] );\n this._attributes[name] = accessor;\n ctx.addAccessor( accessor, \"ATTRIBUTE\" );\n }\n }\n\n\n /**\n * this._indices を設定\n *\n * @param {object} jprimitive glTF の primitive オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @private\n */\n _setupIndices( jprimitive, ctx )\n {\n if ( jprimitive.indices !== undefined ) {\n var accessor = new Accessor( ctx, jprimitive.indices );\n this._indices = accessor;\n ctx.addAccessor( accessor, \"INDEX\" );\n }\n }\n\n\n /**\n * this._material を設定\n *\n * @param {object} jprimitive glTF の primitive オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @private\n */\n _setupMaterial( jprimitive, ctx )\n {\n if ( jprimitive.material !== undefined ) {\n this._material = new Material( ctx, jprimitive.material );\n }\n }\n\n}\n\n\nexport default Primitive;\n","import Primitive from \"./Primitive\";\n\n\n/**\n * glTF の mesh に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Mesh {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {number} index メッシュ索引\n */\n constructor( ctx, index )\n {\n this._primitives = [];\n\n // glTF の mesh オブジェクト (specification/2.0/schema/mesh.schema.json)\n var jmesh = ctx.gjson.meshes[index];\n\n var jprimitives = jmesh.primitives;\n for ( var i = 0; i < jprimitives.length; ++i ) {\n // glTF の primitive オブジェクト (specification/2.0/schema/mesh.primitive.schema.json)\n var jprimitive = jprimitives[i];\n this._primitives.push( new Primitive( jprimitive, ctx ) );\n }\n }\n\n\n /**\n * プリミティブの配列を取得\n *\n * @type {mapray.gltf.Primitive[]}\n * @readonly\n */\n get primitives() { return this._primitives; }\n\n}\n\n\nexport default Mesh;\n","import GeoMath from \"../GeoMath\";\nimport Mesh from \"./Mesh\";\nimport CommonData from \"./CommonData\";\n\n\n/**\n * glTF の node に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Node {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {number} index ノード索引\n */\n constructor( ctx, index )\n {\n // glTF の node オブジェクト (specification/2.0/schema/node.schema.json)\n var jnode = ctx.gjson.nodes[index];\n\n this._commonData = new CommonData( jnode, ctx );\n\n this._children = [];\n this._matrix = null;\n this._mesh = null;\n\n this._setupChildren( jnode, ctx );\n this._setupMatrix( jnode );\n this._setupMesh( jnode, ctx );\n }\n\n\n /**\n * glTF オブジェクトの共通データ\n *\n * @type {mapray.gltf.CommonData}\n * @readonly\n */\n get commonData() { return this._commonData; }\n\n\n /**\n * 子ノードの配列を取得\n * @type {mapray.gltf.Node[]}\n * @readonly\n */\n get children() { return this._children; }\n\n\n /**\n * 変換行列を取得\n * @type {?mapray.Matrix}\n * @readonly\n */\n get matrix() { return this._matrix; }\n\n\n /**\n * メッシュを取得\n * @type {?mapray.gltf.Mesh}\n * @readonly\n */\n get mesh() { return this._mesh; }\n\n\n /**\n * this._children を設定\n *\n * @param {object} jnode glTF の node オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @private\n */\n _setupChildren( jnode, ctx )\n {\n var children = jnode.children;\n if ( children === undefined ) return;\n\n for ( var i = 0; i < children.length; ++i ) {\n var index = children[i];\n this._children.push( new Node( ctx, index ) );\n }\n }\n\n\n /**\n * this._matrix を設定\n *\n * @param {object} jnode glTF の node オブジェクト\n * @private\n */\n _setupMatrix( jnode )\n {\n if ( jnode.matrix ) {\n // 行列指定\n this._matrix = GeoMath.createMatrix( jnode.matrix );\n }\n else if ( jnode.scale || jnode.rotation || jnode.translation ) {\n // SQT 指定\n var [sx, sy, sz] = jnode.scale || [1, 1, 1];\n var [qx, qy, qz, qw] = jnode.rotation || [0, 0, 0, 1];\n var [tx, ty, tz] = jnode.translation || [0, 0, 0];\n\n // [ 1 - 2y^2 - 2z^2, 2x y - 2w z, 2x z + 2w y ]\n // rotation[x, y, z, w] = [ 2x y + 2w z, 1 - 2x^2 - 2z^2, 2y z - 2w x ]\n // [ 2x z - 2w y, 2y z + 2w x, 1 - 2x^2 - 2y^2 ]\n\n this._matrix = GeoMath.createMatrix( [\n (1 - 2*(qy*qy + qz*qz))*sx,\n 2*(qx*qy + qz*qw)*sx,\n 2*(qx*qz - qy*qw)*sx,\n 0,\n 2*(qx*qy - qz*qw)*sy,\n (1 - 2*(qx*qx + qz*qz))*sy,\n 2*(qx*qw + qy*qz)*sy,\n 0,\n 2*(qy*qw + qx*qz)*sz,\n 2*(qy*qz - qx*qw)*sz,\n (1 - 2*(qx*qx + qy*qy))*sz,\n 0,\n tx,\n ty,\n tz,\n 1\n ] );\n }\n }\n\n\n /**\n * this._mesh を設定\n *\n * @param {object} jnode glTF の node オブジェクト\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @private\n */\n _setupMesh( jnode, ctx )\n {\n var index = jnode.mesh;\n if ( index === undefined ) return; // メッシュなしのノード\n\n this._mesh = new Mesh( ctx, index );\n }\n\n}\n\n\nexport default Node;\n","import Node from \"./Node\";\nimport CommonData from \"./CommonData\";\n\n\n/**\n * @summary glTF scene\n *\n * @classdesc\n *

glTF の scene に対応するオブジェクトである。

\n *\n * @memberof mapray.gltf\n * @private\n * @see https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/schema/scene.schema.json\n */\nclass Scene {\n\n /**\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {number} index シーン索引\n */\n constructor( ctx, index )\n {\n // glTF の scene オブジェクト\n const jscene = ctx.gjson.scenes[index];\n\n this._commonData = new CommonData( jscene, ctx );\n\n this._root_nodes = [];\n\n for ( const node_index of jscene.nodes || [] ) {\n this._root_nodes.push( new Node( ctx, node_index ) );\n }\n }\n\n\n /**\n * glTF オブジェクトの共通データ\n *\n * @type {mapray.gltf.CommonData}\n * @readonly\n */\n get commonData() { return this._commonData; }\n\n\n /**\n * 最上位ノードの配列\n *\n * @type {mapray.gltf.Node[]}\n * @readonly\n */\n get root_nodes()\n {\n return this._root_nodes;\n }\n\n\n /**\n * @summary シーン名を取得\n *\n *

シーン名が存在すればシーン名の文字列を返し、存在しなければ null を返す。

\n *\n * @type {?string}\n * @readonly\n */\n get name() { return this._commonData.getName(); }\n\n}\n\n\nexport default Scene;\n","/**\n * バッファの分割を補助\n *\n * @memberof mapray.gltf\n * @private\n */\nclass BufferSplitter {\n\n /**\n */\n constructor()\n {\n // 処理しやすいように最初と最後はにダミーの断片を置く\n\n var frag0 = new Fragment( -2, -1 );\n var frag1 = new Fragment( 2**32 + 1, 2**32 + 2 );\n\n frag0.next = frag1;\n frag1.prev = frag0;\n\n this._fragments = frag0;\n }\n\n\n /**\n * 分割を更新\n *\n * @param {mapray.gltf.Accessor} accessor バッファを参照するアクセサ\n */\n update( accessor )\n {\n const range = accessor.getRangeInBuffer();\n this._updateByRange( { first: BufferSplitter._floor4( range.first ), last: range.last } );\n }\n\n\n /**\n * 分割の更新を終了\n *\n * @param {mapray.gltf.Buffer} buffer 分割されるバッファ\n */\n close( buffer )\n {\n // 先頭のダミーを削除\n this._fragments = this._fragments.next;\n\n // 部分バッファを設定\n for ( let frag = this._fragments ;; frag = frag.next ) {\n if ( frag.next === null ) {\n // 最後のダミーを削除\n frag.prev.next = null;\n break;\n }\n frag.buffer = buffer.createSubBuffer( frag.first, frag.last );\n }\n }\n\n\n /**\n * アクセサを部分バッファで再構築\n *\n * @param {mapray.gltf.Accessor} accessor 再構築するアクセサ\n */\n rebuildAccessor( accessor )\n {\n for ( let frag = this._fragments; frag !== null; frag = frag.next ) {\n if ( accessor.isIncluded( frag.first, frag.last ) ) {\n accessor.rebuildBySplitter( frag.buffer, frag.first );\n break;\n }\n }\n }\n\n\n /**\n * 分割を更新\n *\n * @param {object} range Accessor の範囲\n * @private\n */\n _updateByRange( range )\n {\n for ( let frag = this._fragments; frag.next !== null; ) {\n if ( frag.isInside( range ) ) {\n // frag 断片と frag.next 断片の間に新しい range 断片を挿入\n let frag0 = frag;\n let frag1 = frag.next;\n let fragx = new Fragment( range.first, range.last );\n frag0.next = fragx;\n frag1.prev = fragx;\n fragx.prev = frag0;\n fragx.next = frag1;\n break;\n }\n else if ( frag.isTouch( range ) ) {\n // range に frag を統合し、frag を削除し、frag.prev から始める\n let frag0 = frag.prev;\n let frag1 = frag.next;\n frag0.next = frag1;\n frag1.prev = frag0;\n\n range = frag.mergeRange( range );\n frag = frag0;\n }\n else {\n frag = frag.next;\n }\n }\n }\n\n\n /**\n * 4 の倍数に切り下げ\n *\n * @param {number} value 切り下げる値\n * @return {number} value を 4 の倍数に切り下げた整数\n * @private\n */\n static\n _floor4( value )\n {\n return 4 * Math.floor( value / 4 );\n }\n\n}\n\n\n/**\n * バッファの断片\n *\n * @memberof mapray.gltf.BufferSplitter\n * @private\n */\nclass Fragment {\n\n /**\n * @param {number} first 先頭オフセット\n * @param {number} last 末尾オフセット + 1\n */\n constructor( first, last )\n {\n this.first = first;\n this.last = last;\n this.buffer = null; // 部分バッファ\n this.prev = null;\n this.next = null;\n }\n\n\n /**\n * range は frag と frag.next の間の内側か?\n *\n * @param {object} range\n * @return {boolean}\n * @private\n */\n isInside( range )\n {\n return (this.last < range.first) && (range.last < this.next.first);\n }\n\n\n /**\n * range は frag と接触しているか?\n *\n * @param {object} range\n * @return {boolean}\n */\n isTouch( range )\n {\n return (this.last >= range.first) && (range.last >= this.first);\n }\n\n\n /**\n * this と range を結合した range を取得\n *\n * @param {object} range\n * @return {object}\n */\n mergeRange( range )\n {\n return {\n first: Math.min( this.first, range.first ),\n last: Math.max( this.last, range.last )\n };\n }\n\n}\n\n\nexport default BufferSplitter;\n","/**\n * @summary ビット配列\n *\n * @memberof mapray\n * @private\n */\nclass BitVector {\n\n /**\n * 初期値はすべてのビットが false である。\n *\n * @param {number} length ビット数\n */\n constructor( length )\n {\n this._length = length;\n this._array = new Uint32Array( Math.ceil( length / 32 ) );\n }\n\n\n /**\n * @summary ビット数\n * @type {number}\n * @readonly\n */\n get length()\n {\n return this._length;\n }\n\n\n /**\n * @summary ビットを設定\n *\n * @param {number} index インデックス\n * @param {boolean} value 値\n */\n setBit( index, value )\n {\n var uint32_index = Math.floor( index / 32 );\n var uint32_value = this._array[uint32_index];\n var uint32_mask = 1 << (index % 32);\n\n this._array[uint32_index] = value ? (uint32_value | uint32_mask) : (uint32_value & ~uint32_mask);\n }\n\n\n /**\n * @summary ビットを取得\n *\n * @param {number} index インデックス\n * @return {boolean} 値\n */\n getBit( index )\n {\n var uint32_index = Math.floor( index / 32 );\n var uint32_value = this._array[uint32_index];\n var uint32_mask = 1 << (index % 32);\n\n return (uint32_value & uint32_mask) != 0;\n }\n\n}\n\n\nexport default BitVector;\n","import BufferSplitter from \"./BufferSplitter\";\nimport BitVector from \"../BitVector\";\n\n\n/**\n * コンテキストでの Buffer 管理アイテム\n *\n * @memberof mapray.gltf\n * @private\n */\nclass BufferEntry {\n\n /**\n * @param {mapray.gltf.Buffer} buffer バッファ\n */\n constructor( buffer )\n {\n this._buffer = buffer;\n this._attrib_accessors = [];\n this._index_accessors = [];\n }\n\n\n /**\n * 管理対象のバッファを取得\n *\n * @type {mapray.gltf.Buffer}\n * @readonly\n */\n get buffer() { return this._buffer; }\n\n\n /**\n * 頂点属性で使われている Accessor インスタンスを追加\n */\n addAttributeAccessor( accessor )\n {\n this._attrib_accessors.push( accessor );\n }\n\n\n /**\n * インデックスで使われている Accessor インスタンスを追加\n */\n addIndexAccessor( accessor )\n {\n this._index_accessors.push( accessor );\n }\n\n\n /**\n * バイナリをマシンのバイトオーダーに合わせて書き換え\n */\n rewriteByteOrder()\n {\n var modmap = new BitVector( Math.ceil( this._buffer.byteLength / 2 ) );\n\n for ( const accessor of this._getUnitedOriginalAccessors() ) {\n accessor.modifyByteOrder( modmap );\n }\n }\n\n\n /**\n * バッファを分割し、Accessor を再構築\n */\n splitBufferAndRebuildAccessors()\n {\n this._splitBufferAndRebuildAccessors( this._attrib_accessors );\n this._splitBufferAndRebuildAccessors( this._index_accessors );\n }\n\n\n /**\n * バッファを分割し、Accessor を再構築\n *\n * @param {iterable.} accessors 入力 Accessor 反復子\n */\n _splitBufferAndRebuildAccessors( accessors )\n {\n var splitter = new BufferSplitter();\n\n for ( const accessor of BufferEntry._getOriginalAccessors( accessors ) ) {\n splitter.update( accessor );\n }\n\n splitter.close( this._buffer );\n\n for ( const accessor of accessors ) {\n splitter.rebuildAccessor( accessor );\n }\n }\n\n\n /**\n * バッファを参照ている原初 Accessor の反復子\n *\n * @return {iterable.} 原初 Accessor 反復子\n * @private\n */\n _getUnitedOriginalAccessors()\n {\n return BufferEntry._getOriginalAccessors( this._attrib_accessors.concat( this._index_accessors ) );\n }\n\n\n /**\n * 原初 Accessor の反復子を取得\n *\n * @param {iterable.} accessors 入力 Accessor 反復子\n * @return {iterable.} 原初 Accessor 反復子\n * @private\n */\n static\n _getOriginalAccessors( accessors )\n {\n var orig_accessors = new Map();\n\n for ( const accessor of accessors ) {\n const key = accessor.index;\n if ( !orig_accessors.has( key ) ) {\n orig_accessors.set( key, accessor );\n }\n }\n\n return orig_accessors.values();\n }\n\n}\n\n\nexport default BufferEntry;\n","/**\n * コンテキストでの Image 管理アイテム\n *\n * @memberof mapray.gltf\n * @private\n */\nclass ImageEntry {\n\n /**\n * @param {mapray.gltf.Image} image イメージ\n */\n constructor( image )\n {\n this._image = image;\n this._texinfo_objects = [];\n }\n\n\n /**\n * イメージを取得\n * @type {mapray.gltf.Texture}\n * @readonly\n */\n get image() { return this._image; }\n\n\n /**\n * TextureInfo インスタンスを追加\n *\n * @param {mapray.gltf.TextureInfo} info 追加する TextureInfo インスタンス\n */\n addTextureInfo( info )\n {\n this._texinfo_objects.push( info );\n }\n\n\n /**\n * テクスチャ情報を再構築\n */\n rebuildTextureInfo()\n {\n var texinfo_objects = this._texinfo_objects;\n\n if ( texinfo_objects.length <= 1 ) {\n // イメージが複数の TextureInfo から参照されないので\n // 何も変更しない\n return;\n }\n\n // この画像を使っている代表テクスチャ\n var representative_texture = texinfo_objects[0].texture;\n\n // この画像を使っている (テクスチャ情報内の) テクスチャを\n // 代表テクスチャに置き換える\n for ( var i = 1; i < texinfo_objects.length; ++i ) {\n texinfo_objects[i].texture = representative_texture;\n }\n }\n\n}\n\n\nexport default ImageEntry;\n","/**\n * glTF の buffer に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Buffer {\n\n /**\n * @param {mapray.gltf.Context} [ctx] 読み込みコンテキスト\n * @param {number} [index] buffers 索引\n */\n constructor( ctx, index )\n {\n if ( ctx === undefined ) {\n // 引数なし構築 (特殊インスタンス用)\n this._index = -1;\n this._byteLength = 0;\n this._uri = null;\n this._binary = null;\n }\n else {\n this._index = index;\n\n // glTF の buffer オブジェクト (specification/2.0/schema/buffer.schema.json)\n var jbuffer = ctx.gjson.buffers[index];\n\n this._byteLength = jbuffer.byteLength;\n\n if ( jbuffer.uri !== undefined ) {\n ctx.onStartLoadBuffer();\n ctx.loadBinary( jbuffer.uri )\n .then( buffer => {\n // バイナリデータの取得に成功\n this._binary = buffer;\n ctx.onFinishLoadBuffer();\n } )\n .catch( error => {\n // バイナリデータの取得に失敗\n console.error( error );\n ctx.onFinishLoadBuffer( error );\n } );\n }\n else {\n // todo: GLB-stored Buffer\n this._uri = null;\n this._binary = null;\n }\n }\n }\n\n\n /**\n * 対応する glTF オブジェクトでの索引を取得\n * @type {number}\n * @readonly\n */\n get index() { return this._index; }\n\n\n /**\n * バイナリデータ\n * @type {ArrayBuffer}\n * @readonly\n */\n get binary() { return this._binary; }\n\n\n /**\n * バイナリデータのバイト数を取得\n * @type {number}\n * @readonly\n */\n get byteLength() { return this._byteLength; }\n\n\n /**\n * 部分バッファを生成\n *\n * @param {number} first 最初のバイト位置\n * @param {number} last 最後のバイト位置 + 1\n * @return {mapray.gltf.Buffer} 部分バッファ\n */\n createSubBuffer( first, last )\n {\n var subBuffer = new Buffer();\n\n subBuffer._byteLength = last - first;\n subBuffer._binary = this._binary.slice( first, last );\n\n return subBuffer;\n }\n\n}\n\n\nexport default Buffer;\n","import BufferView from \"./BufferView\";\n\n\n/**\n * glTF の image に対応\n * @memberof mapray.gltf\n * @private\n */\nclass Image {\n\n /**\n * 初期化\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {number} index images 索引\n */\n constructor( ctx, index )\n {\n this._index = index;\n\n // glTF の image オブジェクト (specification/2.0/schema/image.schema.json)\n var jimage = ctx.gjson.images[index];\n\n if ( jimage.uri !== undefined ) {\n ctx.onStartLoadImage();\n ctx.loadImage( jimage.uri )\n .then( image => {\n this._image = image;\n ctx.onFinishLoadImage();\n } )\n .catch( error => {\n ctx.onFinishLoadImage( error );\n } );\n }\n else if ( jimage.bufferView !== undefined ) {\n this._bufferView = new BufferView( ctx, jimage.bufferView );\n }\n\n // mimeType は \"image/jpeg\" または \"image/png\" で bufferView のときは必須\n // uri のときは任意であるが mimeType が指定されているとき、タイプは mimeType と解釈する\n this._mimeType = jimage.mimeType;\n\n this._image = null;\n }\n\n\n /**\n * 対応する glTF オブジェクトでの索引を取得\n * @type {number}\n * @readonly\n */\n get index() { return this._index; }\n\n\n /**\n * 画像データ\n * @type {HTMLImageElement}\n * @readonly\n */\n get image() { return this._image; }\n\n}\n\n\nexport default Image;\n","import Content from \"./Content\";\nimport Scene from \"./Scene\";\nimport BufferEntry from \"./BufferEntry\";\nimport ImageEntry from \"./ImageEntry\";\nimport Buffer from \"./Buffer\";\nimport Image from \"./Image\";\n\n\n/**\n * glTF 読込みコンテキスト\n *\n * @memberof mapray.gltf\n * @private\n */\nclass Context {\n\n /**\n * @param {object} body Tool.load() の同名パラメータを参照\n * @param {object} [options] Tool.load() の同名パラメータを参照\n */\n constructor( body, options )\n {\n var opts = options || {};\n\n this._gjson = body;\n this._base_resource = opts.base_resource;\n this._binary_type = opts.binary_type;\n this._image_type = opts.image_type;\n this._supported_extensions = opts.supported_extensions || [];\n\n this._resolve = null; // Promise の resolve() 関数\n this._reject = null; // Promise の reject() 関数\n\n this._used_extensions = new Set(); // コンテンツが使用する拡張機能名の集合\n this._scenes = [];\n this._default_scene_index = -1;\n\n this._buffer_entries = []; // 共有用バッファの管理 (疎配列)\n this._image_entries = []; // 共有用イメージの管理 (疎配列)\n\n this._body_finished = false; // body の解析を終えたか?\n this._load_count = 0; // 現在リクエスト中のオブジェクト数\n this._load_error = null; // エラーが発生したときのエラーオブジェクト\n this._settled = false; // Promise の状態が Fulfilled または Rejected か?\n }\n\n\n /**\n * @summary glTF の読込みと解析\n *\n * @return {Promise} 読込み Promise (mapray.gltf.Content)\n */\n load()\n {\n return new Promise( (resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n\n // glTF バージョンを確認\n var version = this._loadVersion();\n if ( version.major < 2 ) {\n reject( new Error( \"glTF version error\" ) );\n return;\n }\n\n // コンテンツに必須の拡張機能をサポートしているかを確認\n const supported_ext = this._getSupportedExtensionNames();\n for ( const required_ext of this._enumRequiredExtensionNames() ) {\n if ( !supported_ext.has( required_ext ) ) {\n reject( new Error( \"glTF extension error: \" + required_ext ) );\n return;\n }\n }\n\n this._loadExtensionsUsed();\n this._loadScenes();\n this._loadDefaultSceneIndex();\n this._onFinishLoadBody();\n } );\n }\n\n\n /**\n * glTF バージョンを解析\n *\n * @return {object} { major: major_version, minor: minor_version }\n * @private\n */\n _loadVersion()\n {\n // asset.schema\n\n var asset = this._gjson.asset; // 必須\n var version = asset.version; // 必須\n\n var version_array = /^(\\d+)\\.(\\d+)/.exec( version );\n var major_version = Number( version_array[1] );\n var minor_version = Number( version_array[2] );\n\n return { major: major_version,\n minor: minor_version };\n }\n\n\n /**\n * @summary 必須の拡張機能の名前を列挙\n *\n * @desc\n *

glTF アセットから必須の拡張機能を解析して、\n * その拡張機能の名前を列挙する。

\n *\n * @return {iterable.} 拡張機能名の列挙\n *\n * @private\n */\n _enumRequiredExtensionNames()\n {\n return this._gjson.extensionsRequired || [];\n }\n\n\n /**\n * @summary 対応可能な拡張機能の名前の集合を取得\n *\n * @desc\n *

glTF のローダーとクライアントが対応できる拡張機能の\n * 名前の集合を取得する。

\n *\n * @return {Set.} 拡張機能名の集合\n *\n * @private\n */\n _getSupportedExtensionNames()\n {\n // ローダー自身が対応できる拡張機能\n // ※ 今のところサポートできる拡張機能はない\n const supported_extensions_by_loader = [];\n\n // ローダーを呼び出す側が対応できる拡張機能\n const supported_extensions_by_client = this._supported_extensions;\n\n return new Set( supported_extensions_by_loader.concat( supported_extensions_by_client ) );\n }\n\n\n /**\n * @summary コンテンツが使用する拡張機能を読み込む\n *\n * @desc\n *

extensionsUsed プロパティを読み込み this._used_extensions を設定する。

\n *\n * @private\n */\n _loadExtensionsUsed()\n {\n this._used_extensions = new Set( this._gjson.extensionsUsed || [] );\n }\n\n\n /**\n * @summary すべてのシーンを読み込む\n *\n *

シーンを読み込み、オブジェクトを this._scenes の配列に設定する。

\n *\n * @private\n */\n _loadScenes()\n {\n const num_scenes = (this._gjson.scenes || []).length;\n const scenes = [];\n\n for ( let index = 0; index < num_scenes; ++index ) {\n scenes.push( new Scene( this, index ) );\n }\n\n this._scenes = scenes;\n }\n\n\n /**\n * @summary 既定シーンの索引を読み込む\n *\n *

既定のシーン索引を解析し、this._default_scene_index に設定する。

\n *\n * @private\n */\n _loadDefaultSceneIndex()\n {\n if ( typeof this._gjson.scene == 'number' ) {\n this._default_scene_index = this._gjson.scene;\n }\n }\n\n\n /**\n * glTF 最上位オブジェクト\n * @type {object}\n * @readonly\n */\n get gjson() { return this._gjson; }\n\n\n /**\n * @summary 拡張機能の抽出\n *\n * @desc\n *

拡張機能固有オブジェクト extensions から extensionsUsed\n * に存在するものだけを抽出する。

\n *\n * @param {object} extensions\n *\n * @return {object}\n */\n extractUsedExtensions( extensions )\n {\n let dict = {};\n\n for ( let key in extensions ) {\n if ( this._used_extensions.has( key ) ) {\n dict[key] = extensions[key];\n }\n }\n\n return dict;\n }\n\n\n /**\n * バッファデータの読み込みを開始\n * @param {mapray.gltf.Context} ctx 読み込みコンテキスト\n * @param {string} url バッファデータの URL\n * @private\n */\n loadBinary( path )\n {\n return this._base_resource.loadSubResource( path, { type: this._binary_type } );\n }\n\n\n loadImage( path )\n {\n return this._base_resource.loadSubResource( path, { type: this._image_type } );\n }\n\n\n /**\n * バッファを検索\n * @param {number} index バッファ索引\n * @return {mapray.gltf.Buffer} gltf.Buffer オブジェクト\n */\n findBuffer( index )\n {\n if ( this._buffer_entries[index] === undefined ) {\n this._buffer_entries[index] = new BufferEntry( new Buffer( this, index ) );\n }\n\n return this._buffer_entries[index].buffer;\n }\n\n\n /**\n * イメージを検索\n * @param {number} index イメージ索引\n * @return {mapray.gltf.Image} gltf.Image オブジェクト\n */\n findImage( index )\n {\n if ( this._image_entries[index] === undefined ) {\n this._image_entries[index] = new ImageEntry( new Image( this, index ) );\n }\n\n return this._image_entries[index].image;\n }\n\n\n /**\n * gltf.Accessor を追加\n *\n * @param {mapray.gltf.Accessor} accessor アクセサオブジェクト\n * @param {string} usage 用途 (\"ATTRIBUTE\" | \"INDEX\")\n */\n addAccessor( accessor, usage )\n {\n var entry = this._buffer_entries[accessor.bufferView.buffer.index];\n\n switch ( usage ) {\n case \"ATTRIBUTE\":\n entry.addAttributeAccessor( accessor );\n break;\n case \"INDEX\":\n entry.addIndexAccessor( accessor );\n break;\n }\n }\n\n\n /**\n * gltf.TextureInfo を追加\n *\n * @param {mapray.gltf.TextureInfo} info テクスチャ情報\n */\n addTextureInfo( info )\n {\n var image = info.texture.source;\n var entry = this._image_entries[image.index];\n entry.addTextureInfo( info );\n }\n\n\n /**\n * バイナリを読み込み始めたときの処理\n */\n onStartLoadBuffer()\n {\n this._load_count += 1;\n }\n\n\n /**\n * バイナリを読み込み終わったときの処理\n *\n * @param {Error} [error] 失敗したときのエラーオブジェクト\n */\n onFinishLoadBuffer( error )\n {\n if ( error ) {\n this._load_error = error;\n }\n this._load_count -= 1;\n this._onFinishLoadSomething();\n }\n\n\n /**\n * 画像を読み込み始めたときの処理\n */\n onStartLoadImage()\n {\n this._load_count += 1;\n }\n\n\n /**\n * 画像を読み込み終わったときの処理\n *\n * @param {Error} [error] 失敗したときのエラーオブジェクト\n */\n onFinishLoadImage( error )\n {\n if ( error ) {\n this._load_error = error;\n }\n this._load_count -= 1;\n this._onFinishLoadSomething();\n }\n\n\n /**\n * glTF 本体を読み込み終わったときの処理\n * @private\n */\n _onFinishLoadBody()\n {\n this._body_finished = true;\n this._onFinishLoadSomething();\n }\n\n\n /**\n * 何かを読み込み終わったときの処理\n * @private\n */\n _onFinishLoadSomething()\n {\n if ( this._settled ) {\n // すでに Promise に結果を設定しているので何もしない\n }\n else if ( this._load_error !== null ) {\n // どこかで失敗した\n this._reject( this._load_error );\n this._settled = true;\n }\n else if ( this._body_finished && (this._load_count == 0) ) {\n // 外部ファイルも含めて、すべて読み込み終わった\n this._rewriteBuffersForByteOrder();\n this._splitBuffersAndRebuildAccessors();\n this._rebuildTextureInfo();\n this._resolve( new Content( this, this._scenes, this._default_scene_index ) );\n this._settled = true;\n }\n }\n\n\n /**\n * すべてのバッファのバイトオーダーを書き換える\n * @private\n */\n _rewriteBuffersForByteOrder()\n {\n for ( const entry of this._buffer_entries ) {\n if ( entry !== undefined ) {\n entry.rewriteByteOrder();\n }\n }\n }\n\n\n /**\n * バッファを分割し、Accessor を再構築\n * @private\n */\n _splitBuffersAndRebuildAccessors()\n {\n for ( const entry of this._buffer_entries ) {\n if ( entry !== undefined ) {\n entry.splitBufferAndRebuildAccessors();\n }\n }\n }\n\n\n /**\n * テクスチャ情報を再構築\n * @private\n */\n _rebuildTextureInfo()\n {\n for ( const entry of this._image_entries ) {\n if ( entry !== undefined ) {\n entry.rebuildTextureInfo();\n }\n }\n }\n\n}\n\n\n\nexport default Context;\n","import Context from \"./Context\";\n\n\n/**\n * glTF 関連のツール\n *\n * @memberof mapray.gltf\n * @private\n */\nclass Tool {\n\n /**\n * @summary glTF データを解析してオブジェクトを構築\n *\n * @param {object} body データの本体 (JSON オブジェクト)\n * @param {object} [options] オプション集合\n * @param {string} [options.base_resouece] 基底となるリソース\n * @param {any} [options.binary_type] バイナリタイプ\n * @param {any} [options.image_type] イメージタイプ\n * @param {string[]} [options.supported_extensions] ローダーを呼び出す側が対応できる glTF 拡張機能のリスト\n * @return {Promise} 読込み Promise (mapray.gltf.Content)\n */\n static\n load( body, options )\n {\n const context = new Context( body, options );\n return context.load();\n }\n\n}\n\n\nexport default Tool;\n","import Loader from \"./Loader\"\nimport GeoMath from \"./GeoMath\";\nimport Orientation from \"./Orientation\";\nimport CredentialMode from \"./CredentialMode\";\nimport ModelContainer from \"./ModelContainer\";\nimport MarkerLineEntity from \"./MarkerLineEntity\";\nimport PathEntity from \"./PathEntity\";\nimport TextEntity from \"./TextEntity\";\nimport ModelEntity from \"./ModelEntity\";\nimport PolygonEntity from \"./PolygonEntity\";\nimport GltfTool from \"./gltf/Tool\";\nimport Resource, { URLResource, ResourceType } from \"./Resource\";\n\n/**\n * @summary シーンの読み込み\n * @memberof mapray\n */\nclass SceneLoader extends Loader {\n\n /**\n * @desc\n *

url で指定したシーンデータの読み込みを開始し、scene にエンティティを構築する。

\n *

読み込みが終了したとき options.callback を呼び出す。

\n * @param {mapray.Scene} scene 読み込み先のシーン\n * @param {string} resource シーンリソース\n * @param {object} [options] オプション集合\n * @param {mapray.Loader.TransformCallback} [options.transform] リソース要求変換関数\n * @param {mapray.Loader.EntityCallback} [options.onEntity] エンティティコールバック\n * @param {mapray.SceneLoader.FinishCallback} [options.callback] 終了コールバック関数\n */\n constructor( scene, resource, options={} )\n {\n if ( resource instanceof Resource ) {\n // OK\n }\n else if ( typeof resource === \"string\" ) {\n resource = new URLResource(resource, {\n type: \"json\",\n transform: options.transform\n });\n }\n else {\n throw new Error( \"Unsupported Resource: \" + resource );\n }\n\n super( scene, resource, {\n onEntity: options.onEntity,\n onLoad: options.callback\n } );\n\n this._glenv = scene.glenv;\n this._references = {};\n this._finished = false;\n }\n\n\n\n /**\n * @summary オブジェクト参照を取得\n * @desc\n *

注意: シーンの読み込みが終了したことを確認してからこのメソッドを呼び出すこと。

\n * @param {string} id 識別子\n * @return {?(mapray.ModelContainer|mapray.Entity)} オブジェクト\n */\n getReference( id )\n {\n var ref = this._references[id];\n return (ref !== undefined) ? ref : null;\n }\n\n\n /**\n * @summary オブジェクト参照を設定\n * @desc\n *

オブジェクト item を識別子 id で参照できるように this に設定する。

\n * @param {string} id 識別子\n * @param {mapray.ModelContainer|mapray.Entity} item オブジェクト\n * @private\n */\n _setReference( id, item )\n {\n // 参照を設定\n this._references[id] = item;\n }\n\n\n /**\n * @summary 読み込み処理の実態。継承クラスによって実装される。\n * @private\n */\n _load()\n {\n return (\n this._resource.load( { type: ResourceType.JSON } )\n .then( oscene => {\n // JSON データの取得に成功\n this._check_cancel();\n return this._load_object( oscene );\n } )\n );\n }\n\n\n /**\n * JSON シーンオブジェクトを解析\n * @private\n */\n _load_object( oscene )\n {\n return (\n Promise.resolve()\n .then( () => {\n return this._load_model_register( oscene );\n } )\n .then( () => {\n return this._postload_object( oscene );\n })\n );\n }\n\n\n /**\n * 残りのオブジェクトを読み込む\n * @private\n */\n _postload_object( oscene )\n {\n if ( this.status !== Loader.Status.LOADING ) return;\n this._load_entity_list( oscene );\n }\n\n\n /**\n * @private\n */\n _load_model_register( oscene )\n {\n var model_register = oscene[\"model_register\"];\n if ( !model_register ) return;\n\n var keys = Object.keys( model_register );\n var asyncTasks = [];\n for ( var i = 0; i < keys.length; ++i ) {\n var id = keys[i];\n var model = model_register[id];\n asyncTasks.push( this._load_model_container( oscene, id, model ) );\n }\n return Promise.all( asyncTasks );\n }\n\n\n /**\n * @private\n */\n _load_model_container( oscene, id, model )\n {\n var url = model.link;\n if ( !this._resource.resolveResourceSupported() ) return Promise.reject(new Error(\"Sub Resource is not supported\"));\n const gltf_resource = this._resource.resolveResource( url );\n return (\n gltf_resource.load( { type: ResourceType.JSON } )\n .then( json => {\n // モデルデータの取得に成功\n this._check_cancel();\n // データを解析して gltf.Content を構築\n return GltfTool.load( json, {\n base_resource: gltf_resource,\n binary_type: ResourceType.BINARY,\n image_type: ResourceType.IMAGE,\n supported_extensions: ModelContainer.getSupportedExtensions_glTF()\n } );\n } )\n .then( content => {\n // モデルデータの構築に成功\n var container = new ModelContainer( this._scene, content );\n if ( model.offset_transform ) {\n var matrix = SceneLoader.parseOffsetTransform( model.offset_transform );\n container.setOffsetTransform( matrix );\n }\n this._setReference( id, container );\n } )\n );\n }\n\n\n /**\n * @private\n */\n _load_entity_list( oscene )\n {\n var entity_list = oscene[\"entity_list\"];\n if ( !entity_list ) return;\n\n var scene = this._scene;\n\n for ( var i = 0; i < entity_list.length; ++i ) {\n var item = entity_list[i];\n var type = item.type;\n var entity = null;\n\n switch ( type ) {\n case \"markerline\":\n entity = new MarkerLineEntity( scene, { json: item, refs: this._references } );\n break;\n case \"path\":\n entity = new PathEntity( scene, { json: item, refs: this._references } );\n break;\n case \"text\":\n entity = new TextEntity( scene, { json: item, refs: this._references } );\n break;\n case \"model\":\n entity = new ModelEntity( scene, { json: item, refs: this._references } );\n break;\n case \"polygon\":\n entity = new PolygonEntity( scene, { json: item, refs: this._references } );\n break;\n default:\n console.error( \"mapray: unknown entity type: \" + type );\n break;\n }\n\n if ( entity ) {\n this._onEntity( this, entity, item );\n var id = item.id;\n if ( id ) {\n this._setReference( id, entity );\n }\n }\n }\n }\n\n\n\n /**\n * スキーマ のオブジェクトを解析\n *\n * @param {object} offset_transform オブジェクト\n * @return {mapray.Matrix} オフセット変換行列\n * @package\n */\n static\n parseOffsetTransform( offset_transform )\n {\n var ot = offset_transform;\n\n // \n var translate = ot.translate || [0, 0, 0];\n var orientation = new Orientation( ot.heading, ot.tilt, ot.roll );\n var scale = (ot.scale !== undefined) ? ot.scale : [1, 1, 1]; // \n if ( typeof scale == 'number' ) {\n // スケールをベクトルに正規化\n scale = [scale, scale, scale];\n }\n\n // scale -> orientation -> translate 順の変換\n var matrix = GeoMath.createMatrix();\n\n orientation.getTransformMatrix( scale, matrix );\n matrix[12] = translate[0];\n matrix[13] = translate[1];\n matrix[14] = translate[2];\n\n return matrix;\n }\n\n}\n\n\n/**\n * @summary 終了コールバック\n * @callback FinishCallback\n * @desc\n *

シーンの読み込みが終了したときに呼び出される関数の型である。

\n * @param {mapray.SceneLoader} loader 読み込みを実行したローダー\n * @param {boolean} isSuccess 成功したとき true, 失敗したとき false\n * @memberof mapray.SceneLoader\n */\n\n\n\n\nSceneLoader._defaultHeaders = {};\n\n\n\nexport default SceneLoader;\n","/**\n * @summary 追加コンテナの表示制御\n *\n * @class ContainerController\n */\nclass ContainerController\n{\n /**\n * @summary コンストラクタ\n * @param {HTMLElement} container ルートコンテナ(Viewerクラスのcontainer_element)\n * @param {object} options 表示オプション\n * @param {boolean} options.visibility 表示・非表示\n * @param {ContainerPosition} options.position 表示位置\n * @memberof ContainerController\n */\n constructor( container, options )\n {\n this._visibility = ( options && options.visibility ) || true;\n this._position = ( options && options.position ) || ContainerPosition.TOP_LEFT;\n\n var container_element;\n if ( typeof container == \"string\" ) {\n // コンテナを ID 指定したとき\n container_element = document.getElementById( container );\n }\n else {\n // コンテナを直接要素で指定のとき\n container_element = container;\n }\n\n this._viewer_container = container_element;\n this._container = null;\n this._is_compact = false;\n\n var self = this;\n window.addEventListener(\"resize\", function() { self._sizeChanged(); }, false);\n }\n\n /**\n * @summary 表示・非表示の設定\n *\n * @param {boolean} visibility\n * @memberof ContainerController\n */\n setVisibility( visibility )\n {\n this._visibility = visibility;\n\n // 表示状態の更新\n this._setContainerVisibility();\n }\n\n /**\n * @summary 表示位置\n *\n * @param {ContainerPosition} position\n * @memberof ContainerController\n */\n setPosition( position )\n {\n this._position = position;\n\n // コンテナの再作成\n this._deleteContainer();\n this.createContainer();\n }\n\n /**\n * @summary コンテナの表示設定\n *\n * @memberof ContainerController\n */\n _setContainerVisibility()\n {\n if(this._container)\n {\n ( this._visibility ) ? this._container.style.visibility = \"visible\" : this._container.style.visibility = \"collapse\"\n }\n }\n\n /**\n * @summary インスタンスの破棄\n *\n * @memberof ContainerController\n */\n _destroy()\n {\n var self = this;\n window.removeEventListener( \"resize\", function () { self._sizeChanged(); }, false );\n\n this._deleteContainer();\n }\n\n /**\n * @summary 追加コンテナの削除\n *\n * @memberof ContainerController\n */\n _deleteContainer()\n {\n var parent_container = this._container.parentElement;\n parent_container.removeChild( this._container );\n this._container = null;\n }\n\n /**\n * @summary リサイズイベント\n *\n * @memberof ContainerController\n * @abstract\n */\n _sizeChanged()\n {\n\n }\n\n /**\n * @summary 追加コンテナの作成\n *\n * @memberof ContainerController\n * @abstract\n */\n createContainer()\n {\n }\n}\n\n/**\n * @summary ロゴ・著作権表示位置の列挙型\n * @enum {object}\n * @memberof ContainerController\n * @constant\n */\nvar ContainerPosition = {\n /** \n * 左上\n */\n TOP_LEFT: { id: \"top-left\" },\n\n /** \n * 右上 \n */\n TOP_RIGHT: { id: \"top-right\" },\n\n /**\n * 左下\n */\n BOTTOM_LEFT: { id: \"bottom-left\" },\n\n /**\n * 右下\n */\n BOTTOM_RIGHT: { id: \"bottom-right\" }\n};\n\n{\n ContainerController._compact_size = 500;\n\n ContainerController.ContainerPosition = ContainerPosition;\n}\n\nexport default ContainerController;\n","import ContainerController from \"./ContainerController\"\n\n/**\n * @summary ロゴの表示制御\n *\n * @class LogoController\n * @extends {mapray.ContainerController}\n */\nclass LogoController extends ContainerController\n{\n /**\n * @summary コンストラクタ\n * @param {HTMLElement} container ルートコンテナ(Viewerクラスのcontainer_element)\n * @param {object} options 表示オプション\n * @param {boolean} options.visibility 表示・非表示\n * @param {ContainerController.ContainerPosition} options.position 表示位置\n * @memberof LogoController\n */\n constructor( container, options )\n {\n super( container, options );\n \n this._position = ( options && options.position ) || ContainerController.ContainerPosition.BOTTOM_LEFT;\n }\n\n /**\n * @summary リサイズイベント\n *\n * @memberof LogoController\n */\n _sizeChanged()\n {\n if (this._container)\n {\n var sub_container = this._container.children[0];\n var parent_container = this._container.parentElement;\n \n if ( parent_container.parentElement.clientWidth < ContainerController._compact_size)\n {\n sub_container.classList.add( \"mapray-logo-compact\" )\n }\n else\n {\n sub_container.classList.remove( \"mapray-logo-compact\" )\n }\n }\n }\n\n /**\n * @summary 追加コンテナの作成\n *\n * @memberof LogoController\n */\n createContainer()\n {\n var name = \"control-\" + this._position.id;\n var parent_container = this._viewer_container.getElementsByClassName( name )[0];\n\n var main_container = document.createElement( \"div\" );\n main_container.className = \"control\";\n\n var sub_container = document.createElement( \"a\" );\n sub_container.className = \"mapray-logo\";\n sub_container.href = \"https://mapray.com\";\n sub_container.target = \"_blank\";\n\n main_container.appendChild( sub_container );\n this._container = main_container;\n\n parent_container.appendChild( this._container );\n\n this._sizeChanged();\n }\n \n}\n\nexport default LogoController;\n","import ContainerController from \"./ContainerController\"\n\n/**\n * @summary 著作権表示の表示制御\n *\n * @class AttributionController\n * @extends {mapray.ContainerController}\n */\nclass AttributionController extends ContainerController\n{\n /**\n * @summary コンストラクタ\n * @param {HTMLElement} container ルートコンテナ(Viewerクラスのcontainer_element)\n * @param {object} options 表示オプション\n * @param {boolean} options.isVisible 表示・非表示\n * @param {ContainerController.ContainerPosition} options.position 表示位置\n * @param {array} options.attributions 著作権リスト\n * @param {string} options.attributions.display 表示名\n * @param {string} options.attributions.link リンク\n * @memberof AttributionController\n */\n constructor( container, options )\n {\n super( container, options );\n this._position = ( options && options.position ) || ContainerController.ContainerPosition.BOTTOM_RIGHT;\n this._attributions = [];\n if ( options && options.attributions ) {\n this.copyAttributions(options.attributions);\n } else {\n this.copyAttributions(AttributionController._default_attribution);\n }\n }\n\n /**\n * @summary 著作権表示の追加\n *\n * @param {object} attribution 著作権表示オブジェクト\n * @param {string} attribution.display 表示名\n * @param {string} attribution.link リンク\n * @memberof AttributionController\n */\n addAttribution( attribution )\n {\n this._attributions.push( attribution );\n\n // コンテナの再作成\n this._deleteContainer();\n this.createContainer();\n }\n\n /**\n * @summary 著作権表示のリセット\n *\n * @memberof AttributionController\n */\n clearAttribution()\n {\n this._attributions = [];\n\n // コンテナの再作成\n this._deleteContainer();\n this.createContainer();\n }\n\n\n /**\n * @summary リサイズイベント\n *\n * @memberof AttributionController\n */\n _sizeChanged()\n {\n if ( this._container )\n {\n var parent_container = this._container.parentElement;\n\n if ( parent_container.parentElement.clientWidth < ContainerController._compact_size )\n {\n this._container.classList.add( \"mapray-attribution-compact\" )\n }\n else\n {\n this._container.classList.remove( \"mapray-attribution-compact\" )\n }\n }\n }\n\n /**\n * @summary 追加コンテナの作成\n *\n * @memberof AttributionController\n */\n createContainer()\n {\n var name = \"control-\" + this._position.id;\n var parent_container = this._viewer_container.getElementsByClassName( name )[0];\n\n var main_container = document.createElement( \"div\" );\n main_container.classList.add( \"control\" );\n main_container.classList.add( \"mapray-attribution\" );\n\n var sub_container = document.createElement( \"div\" );\n sub_container.classList.add( \"mapray-attribution-container\" );\n\n for (var attribution of this._attributions )\n {\n if ( attribution.display )\n {\n var attribution_container = document.createElement( \"a\" );\n if (attribution.link) {\n attribution_container.href = ( attribution.link );\n attribution_container.target = \"_blank\";\n }\n var text = document.createTextNode( attribution.display )\n attribution_container.appendChild( text );\n\n sub_container.appendChild( attribution_container )\n }\n }\n\n main_container.appendChild(sub_container);\n this._container = main_container;\n\n parent_container.appendChild( this._container );\n\n this._sizeChanged();\n }\n\n copyAttributions( src )\n {\n this._attributions = src.map(d => d);\n }\n}\n\n// クラス変数の定義\n{\n AttributionController._default_attribution = [\n {\n display: \"©Mapray\",\n link: \"https://mapray.com\"\n },\n {\n display: \"©JAXA\",\n link: \"http://www.jaxa.jp/\"\n },\n {\n display: \"測量法に基づく国土地理院長承認(複製)H30JHf626\",\n link: \"https://www.gsi.go.jp/kiban/index.html\"\n }\n];\n}\n\nexport default AttributionController;\n","import Camera from \"./Camera\";\nimport GLEnv from \"./GLEnv\";\nimport RenderStage, { PickStage } from \"./RenderStage\";\nimport StandardImageProvider from \"./StandardImageProvider\";\nimport StandardDemProvider from \"./StandardDemProvider\";\nimport LayerCollection from \"./LayerCollection\";\nimport Globe from \"./Globe\";\nimport PointCloudCollection from \"./PointCloudCollection\";\nimport TileTextureCache from \"./TileTextureCache\";\nimport NullRenderCallback from \"./NullRenderCallback\";\nimport GeoMath from \"./GeoMath\";\nimport Scene from \"./Scene\";\nimport SceneLoader from \"./SceneLoader\";\nimport EasyBindingBlock from \"./animation/EasyBindingBlock\";\n\n// マウス・Attribution開発\nimport LogoController from \"./LogoController\";\nimport AttributionController from \"./AttributionController\";\nimport ContainerController from \"./ContainerController\";\n\n/**\n * @summary 表示管理\n * @classdesc\n *

mapray の表示を管理するクラスである。

\n * @memberof mapray\n */\nclass Viewer {\n\n /**\n * @param {string|Element} container コンテナ (ID または要素)\n * @param {object} [options] 生成オプション\n * @param {mapray.DemProvider} [options.dem_provider] DEM プロバイダ\n * @param {mapray.ImageProvider} [options.image_provider] 画像プロバイダ\n * @param {array} [options.layers] 地図レイヤー情報の配列\n * @param {boolean} [options.ground_visibility=true] 地表の可視性\n * @param {boolean} [options.entity_visibility=true] エンティティの可視性\n * @param {mapray.RenderCallback} [options.render_callback] レンダリングコールバック\n * @param {mapray.Viewer.RenderMode} [options.render_mode] レンダリングモード\n * @param {mapray.DebugStats} [options.debug_stats] デバッグ統計オブジェクト\n * @param {mapray.LogoController} [options.logo_controller] ロゴ表示制御オブジェクト\n * @param {mapray.AttributionController} [options.attribution_controller] 著作権表示制御オブジェクト\n */\n constructor( container, options )\n {\n var container_element;\n if ( typeof container == \"string\" ) {\n // コンテナを ID 指定したとき\n container_element = document.getElementById( container );\n }\n else {\n // コンテナを直接要素で指定のとき\n container_element = container;\n }\n\n var canvas = this._createCanvas( container_element );\n\n // インスタンス変数\n this._container_element = container_element;\n this._canvas_element = canvas;\n this._glenv = new GLEnv( canvas );\n this._camera = new Camera( canvas );\n this._animation = this._createAnimationBindingBlock();\n this._dem_provider = this._createDemProvider( options );\n this._image_provider = this._createImageProvider( options );\n this._layers = this._createLayerCollection( options );\n this._globe = new Globe( this._glenv, this._dem_provider );\n this._tile_texture_cache = new TileTextureCache( this._glenv, this._image_provider );\n this._scene = new Scene( this, this._glenv );\n this._ground_visibility = Viewer._getBoolOption( options, \"ground_visibility\", true );\n this._entity_visibility = Viewer._getBoolOption( options, \"entity_visibility\", true );\n this._render_mode = (options && options.render_mode) || RenderMode.SURFACE;\n this._debug_stats = (options && options.debug_stats) || null;\n this._point_cloud_collection = this._createPointCloudCollection( options );\n this._render_callback = this._createRenderCallback( options );\n this._frame_req_id = 0;\n this._previous_time = undefined;\n this._is_destroyed = false;\n this._sun_direction = GeoMath.createVector3( [ 0, 0, 1 ] );\n\n this._postProcesses = [];\n\n // マウス・Attribution開発\n this._logo_controller = ( options && options.logo_controller ) || new LogoController( this._container_element );\n this._attribution_controller = ( options && options.attribution_controller ) || new AttributionController( this._container_element );\n\n // ロゴ・著作権表示用コンテナの作成\n this._createLogoAttributionContainer()\n\n this._logo_controller.createContainer();\n this._attribution_controller.createContainer();\n\n // 最初のフレームの準備\n this._requestNextFrame();\n this._updateCanvasSize();\n }\n\n\n /**\n * @summary インスタンスを破棄\n *\n * @desc\n *

次の順番で処理を行い、インスタンスを破棄する。

\n *\n *
    \n *
  1. アニメーションフレームを止める。(this.{@link mapray.Viewer#render_callback render_callback} の {@link mapray.RenderCallback#onUpdateFrame onUpdateFrame()} が呼び出されなくなる)
  2. \n *
  3. this.{@link mapray.Viewer#render_callback render_callback} の {@link mapray.RenderCallback#onStop onStop()} を呼び出す。({@link mapray.RenderCallback#onStart onStart()} がすでに呼び出されている場合)
  4. \n *
  5. {@link mapray.RenderCallback} インスタンスを this から切り離す。({@link mapray.RenderCallback#viewer} プロパティは null を返すようになる)
  6. \n *
  7. this.{@link mapray.Viewer#canvas_element canvas_element} を this.{@link mapray.Viewer#container_element container_element} から取り外す。(キャンバスは表示されなくなる)
  8. \n *
  9. データプロバイダのリクエスト、シーンデータのロードの取り消しを試みる。
  10. \n *
\n *\n *

このメソッドを呼び出した後は this に直接的または間接的にアクセスすることはできない。ただし {@link mapray.Viewer#destroy destroy()} の呼び出しは除く。

\n *\n *

このメソッドは {@link mapray.RenderCallback} のメソッドから呼び出してはならない。

\n */\n destroy()\n {\n if ( this._is_destroyed ) {\n // すでに this は破棄済み\n return;\n }\n\n // フレームを止める\n if ( this._frame_req_id != 0 ) {\n window.maprayCancelAnimationFrame( this._frame_req_id );\n this._frame_req_id = 0;\n }\n\n // RenderCallback の取り外し\n this._render_callback.detach();\n this._render_callback = this._createRenderCallback(); // NullRenderCallback\n\n // キャンバスをコンテナから外す\n this._container_element.removeChild( this._canvas_element );\n\n // DemProvider のリクエストを取り消す\n this._globe.cancel();\n\n // ImageProvider のリクエストを取り消す\n this._tile_texture_cache.cancel();\n\n // 各レイヤーの のリクエストを取り消す\n this._layers.cancel();\n\n // 各 SceneLoader の読み込みを取り消す\n this._scene.cancelLoaders();\n\n // マウス・Attribution開発\n this._logo_controller._destroy();\n this._attribution_controller._destroy();\n this._attribution_controller = null;\n\n // ロゴ・著作権用コンテナの削除\n this._deleteLogoAttributionContainer();\n\n // 破棄確定\n this._is_destroyed = true;\n }\n\n\n /**\n * キャンバス要素を生成\n * @param {Element} container\n * @return {HTMLCanvasElement}\n * @private\n */\n _createCanvas( container )\n {\n var canvas = document.createElement( \"canvas\" );\n canvas.className = \"mapray-canvas\";\n canvas.style.width = \"100%\";\n canvas.style.height = \"100%\";\n container.appendChild( canvas );\n return canvas;\n }\n\n\n /**\n * DemProvider を生成\n * @private\n */\n _createDemProvider( options )\n {\n if ( options && options.dem_provider )\n return options.dem_provider;\n else\n return new StandardDemProvider( \"/dem/\", \".bin\" );\n }\n\n\n /**\n * animation.BindingBlock を生成\n * @private\n */\n _createAnimationBindingBlock()\n {\n let abb = new EasyBindingBlock();\n abb.addDescendantUnbinder( () => { this._unbindDescendantAnimations(); } );\n return abb;\n }\n\n\n /**\n * ImageProvider を生成\n * @private\n */\n _createImageProvider( options )\n {\n if ( options && options.image_provider )\n return options.image_provider;\n else\n return new StandardImageProvider( \"http://cyberjapandata.gsi.go.jp/xyz/std/\", \".png\", 256, 0, 18 );\n }\n\n\n /**\n * LayerCollection を生成\n * @private\n */\n _createLayerCollection( options )\n {\n var layers = (options && options.layers) ? options.layers : {};\n return new LayerCollection( this, layers );\n }\n\n\n /**\n * PointCloudCollection を生成\n * @private\n */\n _createPointCloudCollection( options )\n {\n const point_cloud_providers = (options && options.point_cloud_providers) ? options.point_cloud_providers : {};\n return new PointCloudCollection( this._scene, point_cloud_providers );\n }\n\n /**\n * RenderCallback を生成\n * @private\n */\n _createRenderCallback( options )\n {\n var callback;\n if ( options && options.render_callback )\n callback = options.render_callback;\n else\n callback = new NullRenderCallback();\n\n callback.attach( this );\n\n return callback;\n }\n\n /**\n * @summary ロゴ・著作権表示用コンテナの作成\n *\n * @memberof Viewer\n */\n _createLogoAttributionContainer()\n {\n for ( var position of Viewer._positions )\n {\n var container = document.createElement( \"div\" );\n container.className = position\n this._container_element.appendChild( container );\n }\n }\n\n /**\n * @summary ロゴ・著作権表示用コンテナの削除\n *\n * @memberof Viewer\n */\n _deleteLogoAttributionContainer()\n {\n for ( var position of Viewer._positions )\n {\n var container = document.getElementById( position );\n\n if ( container ) { this._container_element.removeChild( position ); }\n }\n }\n\n /**\n * ブール値のオプションを取得\n * @private\n */\n static\n _getBoolOption( options, name, defaultValue )\n {\n return (options && (options[name] !== undefined)) ? options[name] : defaultValue;\n }\n\n\n /**\n * @summary コンテナ要素 (キャンバス要素を保有する)\n * @type {Element}\n * @readonly\n */\n get container_element() { return this._container_element; }\n\n\n /**\n * @summary キャンバス要素\n * @type {Element}\n * @readonly\n */\n get canvas_element() { return this._canvas_element; }\n\n\n /**\n * @summary アニメーションパラメータ設定\n * @type {mapray.animation.BindingBlock}\n * @readonly\n */\n get animation() { return this._animation; }\n\n\n /**\n * DEM データプロバイダ\n * @type {mapray.DemProvider}\n * @readonly\n */\n get dem_provider() { return this._dem_provider; }\n\n\n /**\n * @summary 画像プロバイダ\n * @type {mapray.ImageProvider}\n * @readonly\n */\n get image_provider() { return this._image_provider; }\n\n\n /**\n * @summary 地図レイヤー管理\n * @type {mapray.LayerCollection}\n * @readonly\n */\n get layers() { return this._layers; }\n\n\n /**\n * @summary 点群管理\n * @type {mapray.PointCloudCollection}\n * @readonly\n */\n get point_cloud_collection() { return this._point_cloud_collection; }\n\n\n /**\n * @summary レンダリングコールバック\n * @type {mapray.RenderCallback}\n * @readonly\n */\n get render_callback() { return this._render_callback; }\n\n\n /**\n * @summary レンダリングモード\n * @type {mapray.RenderMode}\n * @readonly\n */\n get render_mode() { return this._render_mode; }\n\n\n /**\n * @summary レンダリングモードを設定\n * @type {mapray.RenderMode}\n */\n set render_mode( val ) { this._render_mode = val; }\n\n\n /**\n * @summary デバッグ統計オブジェクト\n * @type {?mapray.DebugStats}\n * @readonly\n */\n get debug_stats() { return this._debug_stats; }\n\n\n /**\n * @summary カメラ\n * @type {mapray.Camera}\n * @readonly\n */\n get camera() { return this._camera; }\n\n\n /**\n * @summary モデルシーン\n * @type {mapray.Scene}\n * @readonly\n */\n get scene() { return this._scene; }\n\n\n /**\n * 内部的に実装で使用される WebGL レンダリングコンテキスト情報\n * @type {mapray.GLEnv}\n * @readonly\n * @package\n */\n get glenv() { return this._glenv; }\n\n\n /**\n * @type {mapray.Globe}\n * @readonly\n * @package\n */\n get globe() { return this._globe; }\n\n\n /**\n * 内部的に実装で使用される地図画像タイル管理\n * @type {mapray.TileTextureCache}\n * @readonly\n * @package\n */\n get tile_texture_cache() { return this._tile_texture_cache; }\n\n /**\n *\n * @type {mapray.LogoController}\n * @readonly\n * @memberof Viewer\n */\n get logo_controller() { return this._logo_controller; }\n\n /**\n *\n * @type {mapray.AttributionController}\n * @readonly\n * @memberof Viewer\n */\n get attribution_controller() { return this._attribution_controller; }\n\n\n /**\n * @summary 太陽ベクトル。非公開とする。APIでは、メモリー破壊が起こらない Viewer#getSunDirection を公開する。\n * @type {Vector3}\n * @private\n * @readonly\n * @memberof Viewer\n */\n get sun_direction() { return this._sun_direction; }\n\n\n /**\n * @summary 可視性を設定\n * @desc\n *

target に属するオブジェクトを表示するかどうかを指定する。

\n *

可視性は Viewer の構築子の ground_visibility と entity_visibility オプションでも指定することができる。

\n *\n * @param {mapray.Viewer.Category} target 表示対象\n * @param {boolean} visibility 表示するとき true, 表示しないとき false\n *\n * @see {@link mapray.Viewer#getVisibility}\n */\n setVisibility( target, visibility )\n {\n switch ( target ) {\n case Category.GROUND:\n this._ground_visibility = visibility;\n break;\n case Category.ENTITY:\n this._entity_visibility = visibility;\n break;\n default:\n throw new Error( \"invalid target: \" + target );\n }\n }\n\n\n /**\n * @summary 可視性を取得\n * @desc\n *

target に属するオブジェクトを表示するかどうかを取得する。

\n *\n * @param {mapray.Viewer.Category} target 表示対象\n * @return {boolean} 表示するとき true, 表示しないとき false\n *\n * @see {@link mapray.Viewer#setVisibility}\n */\n getVisibility( target, visibility )\n {\n switch ( target ) {\n case Category.GROUND:\n return this._ground_visibility;\n case Category.ENTITY:\n return this._entity_visibility;\n default:\n throw new Error( \"invalid target: \" + target );\n }\n }\n\n\n /**\n * @summary 指定位置の標高を取得\n * @desc\n *

緯度 lat, 経度 lon が示す場所の標高を返す。

\n *

現在メモリに存在する DEM データの中で最も正確度が高いデータから標高を計算する。

\n *

さらに正確度が高い DEM データがサーバーに存在すれば、それを非同期に読み込む。そのため時間を置いてこのメソッドを呼び出すと、さらに正確な値が取得できることがある。

\n * @param {number} lat 緯度 (Degrees)\n * @param {number} lon 経度 (Degrees)\n * @return {number} 標高 (Meters)\n */\n getElevation( lat, lon )\n {\n // 正規化緯経度 (Degrees)\n var _lon = lon + 180 * Math.floor( (90 - lat) / 360 + Math.floor( (90 + lat) / 360 ) );\n var nlat = 90 - Math.abs( 90 - lat + 360 * Math.floor( (90 + lat) / 360 ) ); // 正規化緯度 [-90,90]\n var nlon = _lon - 360 - 360 * Math.floor( (_lon - 180) / 360 ); // 正規化緯度 [-180,180)\n\n // 単位球メルカトル座標\n var xm = nlon * GeoMath.DEGREE;\n var ym = GeoMath.invGudermannian( nlat * GeoMath.DEGREE );\n\n // 基底タイル座標 (左上(0, 0)、右下(1, 1))\n var dPI = 2 * Math.PI;\n var xt = xm / dPI + 0.5;\n var yt = 0.5 - ym / dPI;\n\n if ( yt < 0 || yt > 1 ) {\n // 緯度が Web メルカトルの範囲外 (極に近い)\n return 0;\n }\n\n // 正確度が最も高い DEM タイルの取得\n var globe = this._globe;\n var dem = globe.findHighestAccuracy( xt, yt );\n if ( dem === null ) {\n // まだ標高を取得することができない\n return 0;\n }\n\n // 標高をサンプル\n var ρ = globe.dem_provider.getResolutionPower();\n var size = 1 << ρ; // 2^ρ\n var pow = Math.pow( 2, dem.z ); // 2^ze\n var uf = size * (pow * xt - dem.x);\n var vf = size * (pow * yt - dem.y);\n var ui = GeoMath.clamp( Math.floor( uf ), 0, size - 1 );\n var vi = GeoMath.clamp( Math.floor( vf ), 0, size - 1 );\n\n var heights = dem.getHeights( ui, vi );\n var h00 = heights[0];\n var h10 = heights[1];\n var h01 = heights[2];\n var h11 = heights[3];\n\n // 標高を補間\n var s = uf - ui;\n var t = vf - vi;\n return (h00 * (1 - s) + h10 * s) * (1 - t) + (h01 * (1 - s) + h11 * s) * t;\n }\n\n\n /**\n * @summary 現行の標高を取得\n *\n * @desc\n *

現在メモリーにある最高精度の標高値を取得する。

\n *

まだ DEM データが存在しない、または経度, 緯度が範囲外の場所は標高を 0 とする。

\n *\n *

このメソッドは DEM のリクエストは発生しない。また DEM のキャッシュには影響を与えない。

\n *\n *

一般的に画面に表示されていない場所は標高の精度が低い。

\n *\n * @param {mapray.GeoPoint} position 位置 (高度は無視される)\n * @return {number} 標高\n *\n * @see mapray.Viewer#getExistingElevations\n */\n getExistingElevation( position )\n {\n const array = [position.longitude, position.latitude, 0];\n\n this._globe.getExistingElevations( 1, array, 0, 3, array, 2, 3 );\n\n return array[2];\n }\n\n\n /**\n * @summary 現行の標高 (複数) を取得\n *\n * @desc\n *

現在メモリーにある最高精度の標高値を一括で取得する。

\n *

まだ DEM データが存在しない、または経度, 緯度が範囲外の場所は標高を 0 とする。

\n *\n *

このメソッドは DEM のリクエストは発生しない。また DEM のキャッシュには影響を与えない。

\n *\n *

一般的に画面に表示されていない場所は標高の精度が低い。

\n *\n * @param {number} num_points 入出力データ数\n * @param {number[]} src_array 入力配列 (経度, 緯度, ...)\n * @param {number} src_offset 入力データの先頭インデックス\n * @param {number} src_stride 入力データのストライド\n * @param {number[]} dst_array 出力配列 (標高, ...)\n * @param {number} dst_offset 出力データの先頭インデックス\n * @param {number} dst_stride 出力データのストライド\n * @return {number[]} dst_array\n *\n * @see mapray.Viewer#getExistingElevation\n */\n getExistingElevations( num_points, src_array, src_offset, src_stride, dst_array, dst_offset, dst_stride )\n {\n return this._globe.getExistingElevations( num_points, src_array, src_offset, src_stride, dst_array, dst_offset, dst_stride );\n }\n\n\n /**\n * @summary レイと地表の交点を取得\n * @desc\n *

ray と地表の最も近い交点を取得する。ただし交点が存在しない場合は null を返す。

\n * @param {mapray.Ray} ray レイ (GOCS)\n * @return {?mapray.Vector3} 交点または null\n */\n getRayIntersection( ray )\n {\n var globe = this._globe;\n\n if ( globe.status !== Globe.Status.READY ) {\n // Globe の準備ができていない\n return null;\n }\n\n var distance = globe.root_flake.findRayDistance( ray, Number.MAX_VALUE );\n if ( distance === Number.MAX_VALUE ) {\n // 交点が見つからなかった\n return null;\n }\n\n // P = Q + distance V\n var p = GeoMath.createVector3();\n var q = ray.position;\n var v = ray.direction;\n\n p[0] = q[0] + distance * v[0];\n p[1] = q[1] + distance * v[1];\n p[2] = q[2] + distance * v[2];\n\n return p;\n }\n\n\n /**\n * @summary Canvas画面のキャプチャ\n *\n * @param {object} options オプション\n * @return {blob} データ\n */\n async capture( options = { type: 'jpeg' } )\n {\n if ( !this._canvas_element ) {\n throw new Error('Canvas is null.');\n }\n\n const mimeType = options.type === 'png' ? 'image/png' : 'image/jpeg';\n\n return await new Promise( resolve => {\n this._postProcesses.push( () => {\n this._canvas_element.toBlob( resolve, mimeType );\n return false;\n });\n });\n }\n\n\n\n /**\n * 次のフレーム更新を要求する。\n * @private\n */\n _requestNextFrame()\n {\n this._frame_req_id = window.maprayRequestAnimationFrame( () => this._updateFrame() );\n }\n\n\n /**\n * フレーム更新のときに呼び出される。\n * @private\n * @see mapray.RenderStage\n */\n _updateFrame()\n {\n var delta_time = this._updateTime();\n this._requestNextFrame();\n\n this._updateCanvasSize();\n\n this._render_callback.onUpdateFrameInner( delta_time );\n\n if ( this._debug_stats !== null ) {\n this._debug_stats.clearStats();\n }\n\n var stage = new RenderStage( this );\n stage.render();\n\n this._postProcess();\n\n this._finishDebugStats();\n }\n\n\n /**\n * 現在のビューにおいて指定されたスクリーン位置の情報を取得します\n * @param {Vector2} screen_position スクリーン位置(キャンバス左上を原点としたピクセル座標)\n * @return {mapray.Viewer.PickResult} ピック結果\n */\n pick(screen_position) {\n const stage = new PickStage( this, screen_position );\n stage.render();\n return stage.pick_result;\n }\n\n\n /**\n * @summary 時間の更新\n * @return {number} 前フレームからの経過時間 (秒)\n * @private\n */\n _updateTime()\n {\n var now_time = window.maprayNow();\n var delta_time = (this._previous_time !== undefined) ? (now_time - this._previous_time) / 1000 : 0;\n this._previous_time = now_time;\n\n return delta_time;\n }\n\n\n /**\n * @summary Canvas サイズを更新\n * @private\n */\n _updateCanvasSize()\n {\n var canvas = this._canvas_element;\n\n // 要素のサイズとキャンバスのサイズを一致させる\n if ( canvas.width != canvas.clientWidth ) {\n canvas.width = canvas.clientWidth;\n }\n if ( canvas.height != canvas.clientHeight ) {\n canvas.height = canvas.clientHeight;\n }\n }\n\n\n /**\n * @summary ポストプロセスを実行\n * @private\n */\n _postProcess()\n {\n if ( this._postProcesses.length === 0 ) {\n return;\n }\n const nextProcesses = [];\n this._postProcesses.forEach( item => {\n if ( item() ) {\n nextProcesses.push( item );\n }\n });\n this._postProcesses = nextProcesses;\n }\n\n\n /**\n * @summary デバッグ統計の最終処理\n * @private\n */\n _finishDebugStats()\n {\n var stats = this._debug_stats;\n if ( stats === null ) {\n // 統計オブジェクトは指定されていない\n return;\n }\n\n // 統計値の取得\n stats.num_wait_reqs_dem = this._globe.getNumDemWaitingRequests();\n stats.num_wait_reqs_img = this._tile_texture_cache.getNumWaitingRequests();\n\n // 統計の更新を通知\n stats.onUpdate();\n }\n\n\n /**\n * EasyBindingBlock.DescendantUnbinder 処理\n *\n * @private\n */\n _unbindDescendantAnimations()\n {\n this._scene.animation.unbindAllRecursively();\n }\n\n\n /**\n * 太陽ベクトルの情報を設定します\n * @param {Vector3} direction 方向(GOCS 正規化されていること)\n */\n setSunDirection( direction )\n {\n GeoMath.copyVector3( direction, this._sun_direction );\n }\n\n\n /**\n * 太陽ベクトルの情報のコピーを取得します\n * @param {Vector3} dst 方向(GOCS 正規化されていること)\n * @return {Vector3} ベクトルのコピー(GOCS)\n */\n getSunDirection( dst )\n {\n return GeoMath.copyVector3( this._sun_direction, dst );\n }\n}\n\n\n/**\n * @summary ピック結果\n * @typedef {object} PickResult\n * @desc\n *

関数型 {@link mapray.Viewer.pick} の戻り値のオブジェクト構造である。

\n * @property {mapray.Vector3} [point] ピックした3次元位置\n * @property {mapray.Entity} [entity|undefined] ピックしたエンティティ(ピック位置にエンティティがない場合はundefined)\n * @memberof mapray.Viewer\n */\n\n\n/**\n * @summary 表示対象の列挙型\n * @desc\n *

{@link mapray.Viewer#setVisibility} と {@link mapray.Viewer#getVisibility} メソッドの target 引数に指定する値の型である。

\n * @enum {object}\n * @memberof mapray.Viewer\n * @constant\n */\nvar Category = {\n\n /**\n * 地表 (レイヤーも含む)\n */\n GROUND: { id: \"GROUND\" },\n\n\n /**\n * エンティティ\n */\n ENTITY: { id: \"ENTITY\" }\n\n};\n\n\n/**\n * @summary レンダリングモードの列挙型\n * @desc\n * {@link mapray.Viewer} の構築子の options.render_mode パラメータ、または {@link mapray.Viewer#render_mode} プロパティに指定する値の型である。\n * @enum {object}\n * @memberof mapray.Viewer\n * @constant\n */\nvar RenderMode = {\n\n /**\n * ポリゴン面 (既定値)\n */\n SURFACE: { id: \"SURFACE\" },\n\n\n /**\n * ワイヤーフレーム\n */\n WIREFRAME: { id: \"WIREFRAME\" }\n\n};\n\n// クラス定数の定義\n{\n Viewer.Category = Category;\n Viewer.RenderMode = RenderMode;\n\n // マウス・Attribution開発\n Viewer.ContainerPosition = ContainerController.ContainerPosition;\n\n // ロゴ・著作権表示用コンテナ名称\n Viewer._positions = [\"control-top-left\", \"control-top-right\", \"control-bottom-left\", \"control-bottom-right\"];\n}\n\n\nexport default Viewer;\n","import DemProvider from \"./DemProvider\";\n\n\n/**\n * @summary クラウド DEM プロバイダ\n * @memberof mapray\n * @extends mapray.DemProvider\n */\nclass CloudDemProvider extends DemProvider {\n\n /**\n * @param {string} api_key API キーの文字列\n */\n constructor( api_key )\n {\n super();\n\n this._headers = {\n 'X-Api-Key': api_key\n };\n }\n\n\n /**\n * @override\n */\n requestTile( z, x, y, callback )\n {\n var actrl = new AbortController();\n\n fetch( this._makeURL( z, x, y ), { headers: this._headers,\n signal: actrl.signal } )\n .then( response => {\n return response.ok ?\n response.arrayBuffer() : Promise.reject( Error( response.statusText ) );\n } )\n .then( buffer => {\n // データ取得に成功\n callback( buffer );\n } )\n .catch( () => {\n // データ取得に失敗または取り消し\n callback( null );\n } );\n\n return actrl;\n }\n\n\n /**\n * @override\n */\n cancelRequest( id )\n {\n var actrl = id; // 要求 ID を AbortController に変換\n actrl.abort(); // 取り消したので要求を中止\n }\n\n\n /**\n * URL を作成\n * @private\n */\n _makeURL( z, x, y )\n {\n return 'https://tiles.mapray.com/dem/' + z + '/' + x + '/' + y + '.bin';\n }\n\n}\n\n\nexport default CloudDemProvider;\n","import EntityMaterial from \"./EntityMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport pin_vs_code from \"./shader/pin.vert\";\nimport pin_fs_code from \"./shader/pin.frag\";\nimport rid_fs_code from \"./shader/rid.frag\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary テキストマテリアル\n * @memberof mapray\n * @extends mapray.EntityMaterial\n * @private\n * @see mapray.PinEntity\n */\nclass PinMaterial extends EntityMaterial {\n\n /**\n * @param {mapray.GLEnv} glenv\n */\n constructor( glenv, options = {} )\n {\n super( glenv, pin_vs_code, options.ridMaterial ? rid_fs_code : pin_fs_code );\n\n // 不変パラメータを事前設定\n this.bindProgram();\n this.setInteger( \"u_image\", PinMaterial.TEXUNIT_IMAGE );\n this.setInteger( \"u_image_mask\", PinMaterial.TEXUNIT_IMAGE_MASK );\n }\n\n\n /**\n * @override\n */\n isTranslucent( stage, primitive )\n {\n return false;\n }\n\n\n /**\n * @override\n */\n setParameters( stage, primitive )\n {\n super.setParameters( stage, primitive );\n\n var props = primitive.properties;\n\n // mat4 u_obj_to_clip\n this.setObjToClip( stage, primitive );\n\n // 画面パラメータ: {2/w, 2/h}\n // vec2 u_sparam\n var sparam = PinMaterial._sparam;\n sparam[0] = 2 / stage._width;\n sparam[1] = 2 / stage._height;\n this.setVector2( \"u_sparam\", sparam );\n\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n // テクスチャのバインド\n // sampler2D u_image\n var image = props[\"image\"];\n this.bindTexture2D( PinMaterial.TEXUNIT_IMAGE, image.handle );\n\n // テクスチャマスクのバインド\n // sampler2D u_image_mask\n var image_mask = props[\"image_mask\"];\n this.bindTexture2D( PinMaterial.TEXUNIT_IMAGE_MASK, image_mask.handle );\n }\n }\n\n}\n\n\n// クラス定数の定義\n{\n PinMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット\n PinMaterial.TEXUNIT_IMAGE_MASK = 1; // 画像のテクスチャユニット\n\n // 計算用一時領域\n PinMaterial._sparam = GeoMath.createVector2f();\n PinMaterial._bg_color = GeoMath.createVector3f();\n PinMaterial._fg_color = GeoMath.createVector3f();\n}\n\n\nexport default PinMaterial;\n","import Dom from \"./util/Dom\";\nimport Resource, { ResourceType } from \"./Resource\";\n\n\n/**\n * @classdesc\n * アイコン画像のローダーです。\n * 何らかのプロパティに応じて、アイコンが読み込まれます。\n * 同一リソースが要求された場合は、読み込み中または読み込み済みのアイコンを返却します。\n * 同一リソースであるかの判定には、getKey(prop)関数により返却される値を用います。\n * @private\n */\nclass IconLoader {\n\n /**\n * @summary コンストラクタ\n */\n constructor() {\n this._cache = new Map();\n }\n\n\n /**\n * @summary プロパティに応じたアイコンを返却します。\n * すでに同一リソースを生成した場合は生成済みのインスタンスを返却し、そうでない場合はdoCreate(prop)により生成します。\n * @param {any} prop\n * @return {IconLoaderItem}\n */\n create( prop ) {\n const key = this.getKey( prop );\n let value = this._cache.get(key);\n if ( !value ) this._cache.set( key, value = this.doCreate( prop ) );\n return value;\n }\n\n\n /**\n * @summary プロパティに応じたアイコンを生成します。\n * @abstract\n * @param {any} prop プロパティ\n * @return {IconLoaderItem}\n */\n doCreate( prop ) {\n }\n\n\n /**\n * @summary プロパティに応じたキーを返却します。\n * 必要に応じてオーバーライドされることを想定した関数です。\n * ディフォルトでは、プロパティ自体がキーとなるように動作します。\n * @param {any} prop プロパティ\n */\n getKey( prop ) {\n return prop;\n }\n\n\n /**\n * @summary プロパティに応じたアイコンの読み込みを開始し、インスタンスを返却します。\n * 読み込みは開始しますが読み込み完了していない可能性があります。\n * この関数はasync関数ではありません。読み込み終了を監視するには、この関数の返却値に対してonEnd(callback)を呼び出します。\n * @param {any} prop プロパティ\n * @return {IconLoaderItem}\n */\n load( prop ) {\n const icon = this.create( prop );\n icon.load();\n return icon;\n }\n\n}\n\n\n\n/**\n * @classdesc アイコン画像ローダーのアイコンです。抽象クラスです。\n * ステータスの管理、読み込み完了後の通知等を行います。\n * @private\n */\nclass IconLoaderItem {\n\n constructor() {\n this._status = IconLoaderItem.Status.NOT_LOADED;\n this._funcs = [];\n this._icon = null;\n }\n\n\n /**\n * @summary アイコンの状態\n * @type {IconLoaderItem.Status}\n * @readonly\n */\n get status() {\n return this._status;\n }\n\n\n /**\n * @summary アイコンの読み込みが完了しているか\n * @return {boolean}\n */\n isLoaded() {\n return this._status === IconLoaderItem.Status.LOADED;\n }\n\n\n /**\n * @summary アイコンの読み込みが完了した時点で呼び出されるコールバック関数を登録します。\n * この関数を呼び出した時点で読み込みが完了している場合は、即座にコールバック関数を実行します。\n * @param {function}\n */\n onEnd( func ) {\n const alreadyDone = this._status === IconLoaderItem.Status.LOADED || this._status === IconLoaderItem.Status.ABORTED;\n if ( alreadyDone ) func( this );\n else this._funcs.push( func );\n }\n\n\n /**\n * @summary アイコン読み込み関数(doLoad())を実行し、成功時、失敗時それぞれ後続処理を行います。\n */\n async load() {\n if ( this._status === IconLoaderItem.Status.NOT_LOADED ) {\n this._status = IconLoaderItem.Status.LOADING;\n try {\n this._icon = await this.doLoad();\n this._status = IconLoaderItem.Status.LOADED;\n }\n catch( error ) {\n this._status = IconLoaderItem.Status.ABORTED;\n }\n for ( var i = 0; i < this._funcs.length; i++ ) {\n this._funcs[ i ]( this );\n }\n this._funcs.length = 0;\n }\n }\n\n\n /**\n * @summary アイコンを読み込みます。この関数はオーバーライドされることを想定されています。\n * @abstract\n * @return {Image}\n */\n async doLoad() {\n throw new Error( \"doLoad() is not implemented in: \" + this.constructor.name );\n }\n\n\n /**\n * @summary アイコンを取得します。\n * アイコンが読み込まれるまではnullを返却します。\n * @return {Image|null}\n */\n get icon() {\n return this._icon;\n }\n\n /**\n * @summary アイコンの幅\n * アイコンが読み込まれるまでは-1を返却します。\n * @return {number}\n */\n get width() {\n return this._icon ? this.icon.width : -1;\n }\n\n /**\n * @summary アイコンの高さ\n * アイコンが読み込まれるまでは-1を返却します。\n * @return {number}\n */\n get height() {\n return this._icon ? this.icon.height : -1;\n }\n\n\n /**\n * @summary アイコンをキャンバスコンテキストに描画します。\n * @param {CanvasRenderingContext2D} context\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n */\n draw( context, x, y, width, height ) {\n context.drawImage( this.icon, x, y, width, height );\n }\n\n}\n\n/**\n * @private\n */\nIconLoaderItem.Status = {\n NOT_LOADED: \"not loaded\",\n LOADING: \"loading\",\n LOADED: \"loaded\",\n ABORTED: \"aborted\"\n};\n\n\n\n/**\n * @classdesc アイコン画像のURLを指定してアイコンを読み込むアイコンローダーです。\n * urlは下記のように生成します。\n * url = urlPrefix + id + urlSuffix\n * @private\n */\nclass URLTemplateIconLoader extends IconLoader {\n\n /**\n * @param {string} urlPrefix\n * @param {string} urlSuffix\n */\n constructor( urlPrefix, urlSuffix ) {\n super();\n this.urlPrefix = urlPrefix;\n this.urlSuffix = urlSuffix;\n }\n\n\n /**\n * @override\n */\n doCreate( id ) {\n return new URLIconLoaderItem( this.urlPrefix + id + this.urlSuffix );\n }\n\n}\n\n\n\n/**\n * @classdesc URLTemplateIconLoaderのアイコンです。\n *\n * @private\n */\nclass URLIconLoaderItem extends IconLoaderItem {\n\n /**\n * @param {string} url\n */\n constructor( url ) {\n super();\n this.url = url;\n }\n\n\n /**\n * @override\n */\n async doLoad() {\n return await Dom.loadImage( this.url, { crossOrigin: \"Anonymous\" } );\n }\n\n}\n\n\n\n/**\n * @classdesc テキストアイコンを生成するアイコンローダーです。\n *\n * @private\n */\nclass TextIconLoader extends IconLoader {\n\n /**\n * プロパティに応じたアイコンを生成します。\n * @param {string} prop.text プロパティ\n */\n doCreate( prop ) {\n return new TextIconLoaderItem( prop.text, prop.props );\n }\n\n\n /**\n * プロパティに応じたキーを返却します。\n * @param {string} prop.text プロパティ\n */\n getKey( prop ) {\n return prop.text;\n }\n\n}\n\n\n\n/**\n * @classdesc TextIconLoaderのアイコンです。\n *\n * @private\n */\nclass TextIconLoaderItem extends IconLoaderItem {\n\n /**\n * @param {string} text text\n * @param {mapray.Vector2} [props.size] size in pixel\n * @param {string} [props.font_family] font family\n */\n constructor( text, props = {} ) {\n super();\n this.text = text;\n this.props = props;\n }\n\n\n /**\n * @override\n */\n async doLoad() {\n var props = this.props;\n var size = props.size ? props.size[0] : 20;\n var fontFamily = props.font_family ? (\"'\" + props.font_family + \"'\") : Dom.SYSTEM_FONT_FAMILY;\n var context = Dom.createCanvasContext( size, size );\n context.textAlign = \"center\";\n context.textBaseline = \"alphabetic\";\n context.font = (size * 0.6756756757) + \"px \" + fontFamily;\n context.fillText( this.text, size * 0.5, size * 0.7432432432 );\n return context.canvas;\n }\n\n\n /**\n * @override\n */\n draw( context, x, y, width, height ) {\n context.drawImage( this.icon, x, y, width, height );\n }\n\n}\n\n\n\n/**\n * @classdesc 画像からアイコンを生成するアイコンローダーです。\n * \n * @private\n */\nclass ImageIconLoader extends IconLoader {\n\n /**\n * プロパティに応じたアイコンを生成します。\n * @param {string} prop.text プロパティ\n */\n doCreate( image_src ) {\n return new ImageIconLoaderItem( image_src );\n }\n\n}\n\n\n\n/**\n * @classdesc ImageIconLoaderのアイコンです。\n * \n * @private\n */\nclass ImageIconLoaderItem extends IconLoaderItem {\n\n /**\n * @param {string|HTMLImageElement|HTMLCanvasElement} image_src image source\n */\n constructor( image_src ) {\n super();\n this._image_src = image_src;\n }\n\n\n /**\n * @override\n */\n async doLoad() {\n const image_src = this._image_src;\n const image = (\n image_src instanceof Resource ? await image_src.load( { type: ResourceType.IMAGE } ):\n typeof( image_src ) === \"string\" ? await Dom.loadImage( image_src ):\n image_src instanceof HTMLImageElement ? await Dom.waitForLoad( image_src ):\n image_src instanceof HTMLCanvasElement ? image_src:\n null\n );\n if ( !image ) throw new Error( \"not supported: \" + image_src );\n return image;\n }\n\n}\n\n\n\nexport { URLTemplateIconLoader, TextIconLoader, ImageIconLoader };\nexport default IconLoader;\n","import Entity from \"./Entity\";\nimport Primitive from \"./Primitive\";\nimport Mesh from \"./Mesh\";\nimport Texture from \"./Texture\";\nimport PinMaterial from \"./PinMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport { RenderTarget } from \"./RenderStage\";\nimport AltitudeMode from \"./AltitudeMode\";\nimport EntityRegion from \"./EntityRegion\";\nimport IconLoader, { URLTemplateIconLoader, TextIconLoader } from \"./IconLoader\";\nimport Dom from \"./util/Dom\";\nimport EasyBindingBlock from \"./animation/EasyBindingBlock\";\nimport Type from \"./animation/Type\";\nimport AnimUtil from \"./animation/AnimUtil\";\nimport AbstractPointEntity from \"./AbstractPointEntity\";\n\n/**\n * @summary ピンエンティティ\n * @memberof mapray\n * @extends mapray.Entity\n *\n * @example\n * var pin = new mapray.PinEntity(viewer.scene);\n * pin.addTextPin( \"32\", new mapray.GeoPoint(139.768, 35.635) );\n * pin.addTextPin( \"A\", new mapray.GeoPoint(139.768, 35.636), { fg_color: [0.0, 0.0, 1.0], bg_color: [1.0, 0.0, 0.0] } );\n * pin.addTextPin( \"始\", new mapray.GeoPoint(139.768, 35.637), { size: 50 } );\n * pin.addTextPin( \"終\", new mapray.GeoPoint(139.768, 35.639), { size: 50, font_family: \"Georgia\" } );\n * pin.addPin( new mapray.GeoPoint(139.766, 35.6361) );\n * pin.addMakiIconPin( \"ferry-15\", new mapray.GeoPoint(139.764, 35.6361), { size: 150, fg_color: [0.2, 0.2, 0.2], bg_color: [1.0, 1.0, 1.0] } );\n * pin.addMakiIconPin( \"car-15\", new mapray.GeoPoint(139.762, 35.6361), { size: 60, fg_color: [1.0, 1.0, 1.0], bg_color: [0.2, 0.2, 0.2] } );\n * pin.addMakiIconPin( \"bus-15\", new mapray.GeoPoint(139.760, 35.6361), { size: 40, fg_color: [1.0, 0.3, 0.1], bg_color: [0.1, 0.3, 1.0] } );\n * pin.addMakiIconPin( \"bus-15\", new mapray.GeoPoint(139.759, 35.6361) );\n * pin.addMakiIconPin( \"car-15\", new mapray.GeoPoint(139.758, 35.6361) );\n * viewer.scene.addEntity(pin);\n *\n */\nclass PinEntity extends AbstractPointEntity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n */\n constructor( scene, opts )\n {\n super( scene, opts );\n\n // 親プロパティ\n this._parent_props = {\n fg_color: null,\n bg_color: null,\n size: null,\n font_family: null,\n };\n\n // Entity.PrimitiveProducer インスタンス\n this._primitive_producer = new PrimitiveProducer( this );\n\n this._animation.addDescendantUnbinder( () => { this._unbindDescendantAnimations(); } );\n this._setupAnimationBindingBlock();\n\n // 生成情報から設定\n if ( opts && opts.json ) {\n this._setupByJson( opts.json );\n }\n }\n\n\n /**\n * @override\n */\n getPrimitiveProducer()\n {\n return this._primitive_producer;\n }\n\n\n /**\n * @override\n */\n onChangeAltitudeMode( prev_mode )\n {\n this._primitive_producer.onChangeAltitudeMode();\n }\n\n\n /**\n * EasyBindingBlock.DescendantUnbinder 処理\n *\n * @private\n */\n _unbindDescendantAnimations()\n {\n // すべてのエントリーを解除\n for ( let entry of this._entries ) {\n entry.animation.unbindAllRecursively();\n }\n }\n\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const vector2 = Type.find( \"vector2\" );\n const vector3 = Type.find( \"vector3\" );\n\n // パラメータ名: fg_color\n // パラメータ型: vector3\n // アイコンの色\n block.addEntry( \"fg_color\", [vector3], null, value => {\n this.setFGColor( value );\n } );\n \n // パラメータ名: bg_color\n // パラメータ型: vector3\n // アイコン背景の色\n block.addEntry( \"bg_color\", [vector3], null, value => {\n this.setBGColor( value );\n } );\n\n // パラメータ名: size\n // パラメータ型: vector2 | number\n // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈\n // 型が number のとき アイコンのピクセルサイズX, Y は同値\n const size_temp = GeoMath.createVector2();\n let size_type;\n\n let size_tsolver = curve => {\n size_type = AnimUtil.findFirstTypeSupported( curve, [vector2, number] );\n return size_type;\n };\n\n block.addEntry( \"size\", [vector2, number], size_tsolver, value => {\n if ( size_type === vector2 ) {\n this.setSize( value );\n }\n else { // size_type === number\n size_temp[0] = value;\n size_temp[1] = value;\n this.setSize( size_temp );\n }\n } );\n }\n\n\n /**\n * @summary アイコンのピクセルサイズを指定\n * @param {mapray.Vector3} size アイコンのピクセルサイズ\n */\n setSize( size )\n {\n this._setVector2Property( \"size\", size );\n }\n\n\n /**\n * @summary アイコンの色を設定\n * @param {mapray.Vector3} color アイコンの色\n */\n setFGColor( color )\n {\n this._setVector3Property( \"fg_color\", color );\n }\n\n\n /**\n * @summary アイコン背景の色を設定\n * @param {mapray.Vector3} color アイコン背景の色\n */\n setBGColor( color )\n {\n this._setVector3Property( \"bg_color\", color );\n }\n\n\n /**\n * @summary テキストアイコンのフォントを設定\n * @param {string} font_family フォントファミリー\n */\n setFontFamily( font_family )\n {\n this._setValueProperty( \"font_family\", font_family );\n }\n\n\n /**\n * Add Pin\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {float} [props.size] アイコンサイズ\n * @param {mapray.Vector3} [props.fg_color] アイコン色\n * @param {mapray.Vector3} [props.bg_color] 背景色\n * @param {string} [props.id] Entryを識別するID\n * @return {mapray.PinEntity.TextPinEntry} 追加したEntry\n */\n addPin( position, props )\n {\n return this.addTextPin( \"\", position, props );\n }\n\n /**\n * Add Maki Icon Pin\n * @param {string} id   ID of Maki Icon\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {float} [props.size] アイコンサイズ\n * @param {mapray.Vector3} [props.fg_color] アイコン色\n * @param {mapray.Vector3} [props.bg_color] 背景色\n * @param {string} [props.id] Entryを識別するID\n * @return {mapray.PinEntity.MakiIconPinEntry} 追加したEntry\n */\n addMakiIconPin( id, position, props )\n {\n var entry = new MakiIconPinEntry( this, id, position, props );\n this._entries.push( entry );\n this._primitive_producer.onAddEntry();\n return entry;\n }\n\n /**\n * Add Text Pin\n * @param {string} text   ピンに表示されるテキスト\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {float} [props.size] アイコンサイズ\n * @param {mapray.Vector3} [props.fg_color] アイコン色\n * @param {mapray.Vector3} [props.bg_color] 背景色\n * @param {string} [props.font_family] フォントファミリー\n * @param {string} [props.id] Entryを識別するID\n * @return {mapray.PinEntity.TextPinEntry} 追加したEntry\n */\n addTextPin( text, position, props )\n {\n var entry = new TextPinEntry( this, text, position, props );\n this._entries.push( entry );\n this._primitive_producer.onAddEntry();\n return entry;\n }\n\n\n /**\n * @summary 専用マテリアルを取得\n * @private\n */\n _getMaterial( render_target )\n {\n var scene = this.scene;\n if ( render_target === RenderTarget.SCENE ) {\n if ( !scene._PinEntity_pin_material ) {\n // scene にマテリアルをキャッシュ\n scene._PinEntity_pin_material = new PinMaterial( scene.glenv );\n }\n return scene._PinEntity_pin_material;\n }\n else if (render_target === RenderTarget.RID) {\n if ( !scene._PinEntity_pin_material_pick ) {\n // scene にマテリアルをキャッシュ\n scene._PinEntity_pin_material_pick = new PinMaterial( scene.glenv, { ridMaterial: true } );\n }\n return scene._PinEntity_pin_material_pick;\n }\n }\n\n\n /**\n * @private\n */\n _setValueProperty( name, value )\n {\n var props = this._parent_props;\n if ( props[name] != value ) {\n props[name] = value;\n this._primitive_producer.onChangeParentProperty();\n }\n }\n\n\n /**\n * @private\n */\n _setVector3Property( name, value )\n {\n var dst = this._parent_props[name];\n if ( !dst ) {\n dst = this._parent_props[name] = GeoMath.createVector3f( value );\n this._primitive_producer.onChangeParentProperty();\n }\n else if ( dst[0] !== value[0] || dst[1] !== value[1] || dst[2] !== value[2] ) {\n GeoMath.copyVector3( value, dst );\n this._primitive_producer.onChangeParentProperty();\n }\n }\n\n\n /**\n * @private\n */\n _setVector2Property( name, value )\n {\n var dst = this._parent_props[name];\n if ( !dst ) {\n this._parent_props[name] = GeoMath.createVector2f( value );\n this._primitive_producer.onChangeParentProperty();\n }\n else if ( dst[0] !== value[0] || dst[1] !== value[1] ) {\n GeoMath.copyVector2( value, dst );\n this._primitive_producer.onChangeParentProperty();\n }\n }\n\n\n /**\n * @private\n */\n _setupByJson( json )\n {\n var position = new GeoPoint();\n\n for ( let entry of json.entries ) {\n position.setFromArray( entry.position );\n this.addPin( position, entry );\n }\n \n if ( json.size ) this.setSize( json.size );\n if ( json.fg_color ) this.setFGColor( json.fg_color );\n if ( json.bg_color ) this.setBGColor( json.bg_color );\n if ( json.font_family ) this.setBGColor( json.font_family );\n }\n\n \n /**\n * @summary IDでEntryを取得\n * @param {string} id ID\n * @return {mapray.PinEntity.MakiIconPinEntry|mapray.PinEntity.TextPinEntry} IDが一致するEntry(無ければundefined)\n */\n getEntry( id )\n {\n return this._entries.find((entry) => entry.id === id);\n }\n}\n\n\n// クラス定数の定義\n{\n PinEntity.SAFETY_PIXEL_MARGIN = 1;\n PinEntity.MAX_IMAGE_WIDTH = 4096;\n PinEntity.CIRCLE_SEP_LENGTH = 32;\n PinEntity.DEFAULT_SIZE = GeoMath.createVector2f( [30, 30] );\n PinEntity.DEFAULT_FONT_FAMILY = \"sans-serif\";\n PinEntity.DEFAULT_FG_COLOR = GeoMath.createVector3f( [1.0, 1.0, 1.0] );\n PinEntity.DEFAULT_BG_COLOR = GeoMath.createVector3f( [0.35, 0.61, 0.81] );\n\n PinEntity.SAFETY_PIXEL_MARGIN = 1;\n PinEntity.MAX_IMAGE_WIDTH = 4096;\n}\n\n\n\n/**\n * @summary PrimitiveProducer\n *\n * TODO: relative で標高の変化のたびにテクスチャを生成する必要はないので\n * Layout でのテクスチャの生成とメッシュの生成を分離する\n *\n * @private\n */\nclass PrimitiveProducer extends Entity.PrimitiveProducer {\n\n /**\n * @param {mapray.PinEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n this._glenv = entity.scene.glenv;\n this._dirty = true;\n\n // プリミティブの要素\n this._transform = GeoMath.setIdentity( GeoMath.createMatrix() );\n this._properties = {\n image: null, // 画像\n image_mask: null, // マスク画像\n };\n\n // プリミティブ\n var primitive = new Primitive( this._glenv, null, entity._getMaterial( RenderTarget.SCENE ), this._transform );\n primitive.properties = this._properties;\n this._primitive = primitive;\n\n var pickPrimitive = new Primitive( this._glenv, null, entity._getMaterial( RenderTarget.RID ), this._transform );\n pickPrimitive.properties = this._properties;\n this._pickPrimitive = pickPrimitive;\n\n // プリミティブ配列\n this._primitives = [];\n this._pickPrimitives = [];\n }\n\n\n /**\n * @override\n */\n createRegions()\n {\n const region = new EntityRegion();\n\n for ( let {position} of this.entity._entries ) {\n region.addPoint( position );\n }\n\n return [region];\n }\n\n\n /**\n * @override\n */\n onChangeElevation( regions )\n {\n this._dirty = true;\n }\n\n\n /**\n * @override\n */\n getPrimitives( stage )\n {\n this._updatePrimitive( stage );\n return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives;\n }\n\n\n /**\n * @summary 親プロパティが変更されたことを通知\n */\n onChangeParentProperty()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary 子プロパティが変更されたことを通知\n */\n onChangeChildProperty()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary 高度モードが変更されたことを通知\n */\n onChangeAltitudeMode()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary エントリが追加されたことを通知\n */\n onAddEntry()\n {\n // 変化した可能性がある\n this.needToCreateRegions();\n this._dirty = true;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n * 入力:\n * this.entity._entries\n * this._dirty\n * 出力:\n * this._transform\n * this._properties.image\n * this._primitive.mesh\n * this._primitives\n * this._dirty\n *\n * @return {array.} this._primitives\n *\n * @private\n */\n _updatePrimitive()\n {\n if ( !this._dirty ) {\n // 更新する必要はない\n return;\n }\n\n if ( this.entity._entries.length == 0 ) {\n this._primitives = [];\n this._pickPrimitives = [];\n this._dirty = false;\n return;\n }\n\n // 各エントリーの GOCS 位置を生成 (平坦化配列)\n var gocs_array = this._createFlatGocsArray();\n\n // プリミティブの更新\n // primitive.transform\n this._updateTransform( gocs_array );\n\n var layout = new Layout( this, gocs_array );\n if ( !layout.isValid() ) {\n // 更新に失敗\n this._primitives = [];\n this._pickPrimitives = [];\n this._dirty = false;\n return;\n }\n\n // テクスチャ設定\n var properties = this._properties;\n if ( properties.image ) {\n properties.image.dispose();\n }\n properties.image = layout.texture;\n\n if ( properties.image_mask ) {\n properties.image_mask.dispose();\n }\n properties.image_mask = layout.texture_mask;\n\n // メッシュ生成\n var mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 },\n { name: \"a_offset\", size: 2 },\n { name: \"a_texcoord\", size: 2 },\n { name: \"a_texmaskcoord\", size: 2 },\n { name: \"a_fg_color\", size: 3 },\n { name: \"a_bg_color\", size: 3 },\n ],\n vertices: layout.vertices,\n indices: layout.indices\n };\n var mesh = new Mesh( this._glenv, mesh_data );\n\n // メッシュ設定\n // primitive.mesh\n var primitive = this._primitive;\n if ( primitive.mesh ) {\n primitive.mesh.dispose();\n }\n var pickPrimitive = this._pickPrimitive;\n if ( pickPrimitive.mesh ) {\n pickPrimitive.mesh.dispose();\n }\n primitive.mesh = mesh;\n pickPrimitive.mesh = mesh;\n\n // 更新に成功\n this._primitives = [primitive];\n this._pickPrimitives = [pickPrimitive];\n this._dirty = false;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n * 条件:\n * this.entity._entries.length > 0\n * 入力:\n * this.entity._entries.length\n * 出力:\n * this._transform\n *\n * @param {number[]} gocs_array GOCS 平坦化配列\n *\n * @private\n */\n _updateTransform( gocs_array )\n {\n var num_entries = this.entity._entries.length;\n var xsum = 0;\n var ysum = 0;\n var zsum = 0;\n\n for ( let i = 0; i < num_entries; ++i ) {\n let ibase = 3*i;\n xsum += gocs_array[ibase];\n ysum += gocs_array[ibase + 1];\n zsum += gocs_array[ibase + 2];\n }\n\n // 変換行列の更新\n var transform = this._transform;\n transform[12] = xsum / num_entries;\n transform[13] = ysum / num_entries;\n transform[14] = zsum / num_entries;\n }\n\n\n /**\n * @summary GOCS 平坦化配列を取得\n *\n * 入力: this.entity._entries\n *\n * @return {number[]} GOCS 平坦化配列\n * @private\n */\n _createFlatGocsArray()\n {\n const num_points = this.entity._entries.length;\n return GeoPoint.toGocsArray( this._getFlatGeoPoints_with_Absolute(), num_points,\n new Float64Array( 3 * num_points ) );\n }\n\n\n /**\n * @summary GeoPoint 平坦化配列を取得 (絶対高度)\n *\n * 入力: this.entity._entries\n *\n * @return {number[]} GeoPoint 平坦化配列\n * @private\n */\n _getFlatGeoPoints_with_Absolute()\n {\n const owner = this.entity;\n const entries = owner._entries;\n const num_points = entries.length;\n const flat_array = new Float64Array( 3 * num_points );\n\n // flat_array[] に経度要素と緯度要素を設定\n for ( let i = 0; i < num_points; ++i ) {\n let pos = entries[i].position;\n flat_array[3*i] = pos.longitude;\n flat_array[3*i + 1] = pos.latitude;\n }\n\n switch ( owner.altitude_mode ) {\n case AltitudeMode.RELATIVE:\n case AltitudeMode.CLAMP:\n // flat_array[] の高度要素に現在の標高を設定\n owner.scene.viewer.getExistingElevations( num_points, flat_array, 0, 3, flat_array, 2, 3 );\n\n if ( owner.altitude_mode === AltitudeMode.RELATIVE ) {\n // flat_array[] の高度要素に絶対高度を設定\n for ( let i = 0; i < num_points; ++i ) {\n flat_array[3*i + 2] += entries[i].position.altitude;\n }\n }\n break;\n\n default: // AltitudeMode.ABSOLUTE\n // flat_array[] の高度要素に絶対高度を設定\n for ( let i = 0; i < num_points; ++i ) {\n flat_array[3*i + 2] = entries[i].position.altitude;\n }\n break;\n }\n\n return flat_array;\n }\n\n}\n\n\n\n/**\n * @summary ピン要素\n * @hideconstructor\n * @memberof mapray.PinEntity\n * @public\n * @abstract\n */\nclass AbstractPinEntry {\n\n constructor( owner, position, props ) {\n this._owner = owner;\n this._position = position.clone();\n\n // animation.BindingBlock\n this._animation = new EasyBindingBlock();\n \n this._setupAnimationBindingBlock();\n\n this._props = Object.assign( {}, props ); // props の複製\n this._copyPropertyVector3f( \"fg_color\" ); // deep copy\n this._copyPropertyVector3f( \"bg_color\" ); // deep copy\n this._copyPropertyVector2f( \"size\" ); // deep copy\n }\n\n _loadIcon() {\n throw new Error(\"loadIcon() is not implemented: \" + this.constructor.name);\n }\n\n /**\n * @summary 位置\n * @type {mapray.GeoPoint}\n * @readonly\n * @package\n */\n get position()\n {\n return this._position;\n }\n\n /**\n * @summary ID\n * @type {string}\n * @readonly\n */\n get id()\n {\n return this._props.hasOwnProperty( \"id\" ) ? this._props.id : \"\";\n }\n\n /**\n * @summary アイコンサイズ (Pixels)\n * @type {mapray.Vector2}\n * @readonly\n * @package\n */\n get size()\n {\n const props = this._props;\n const parent = this._owner._parent_props;\n return (\n props.size || parent.size ||\n (\n this.icon ? GeoMath.createVector2f( [ this.icon.width, this.icon.height ] ):\n PinEntity.DEFAULT_SIZE\n )\n );\n }\n\n /**\n * @summary アイコン色\n * @type {mapray.Vector3}\n * @readonly\n * @package\n */\n get fg_color()\n {\n const props = this._props;\n const parent = this._owner._parent_props;\n return props.fg_color || parent.fg_color || PinEntity.DEFAULT_FG_COLOR;\n }\n\n /**\n * @summary アイコン背景色\n * @type {mapray.Vector3}\n * @readonly\n * @package\n */\n get bg_color()\n {\n const props = this._props;\n const parent = this._owner._parent_props;\n return props.bg_color || parent.bg_color || PinEntity.DEFAULT_BG_COLOR;\n }\n\n /**\n * @summary アニメーションパラメータ設定\n *\n * @type {mapray.animation.BindingBlock}\n * @readonly\n */\n get animation() { return this._animation; }\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const vector2 = Type.find( \"vector2\" );\n const vector3 = Type.find( \"vector3\" );\n \n // パラメータ名: position\n // パラメータ型: vector3\n // ベクトルの要素が longitude, latitude, altitude 順であると解釈\n const position_temp = new GeoPoint();\n\n block.addEntry( \"position\", [vector3], null, value => {\n position_temp.setFromArray( value ); // Vector3 -> GeoPoint\n this.setPosition( position_temp );\n } );\n\n // パラメータ名: fg_color\n // パラメータ型: vector3\n // アイコンの色\n block.addEntry( \"fg_color\", [vector3], null, value => {\n this.setFGColor( value );\n } );\n \n // パラメータ名: bg_color\n // パラメータ型: vector3\n // アイコン背景の色\n block.addEntry( \"bg_color\", [vector3], null, value => {\n this.setBGColor( value );\n } );\n\n // パラメータ名: size\n // パラメータ型: vector2 | number\n // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈\n // 型が number のとき アイコンのピクセルサイズX, Y は同値\n const size_temp = GeoMath.createVector2();\n let size_type;\n\n let size_tsolver = curve => {\n size_type = AnimUtil.findFirstTypeSupported( curve, [vector2, number] );\n return size_type;\n };\n\n block.addEntry( \"size\", [vector2, number], size_tsolver, value => {\n if ( size_type === vector2 ) {\n this.setSize( value );\n }\n else { // size_type === number\n size_temp[0] = value;\n size_temp[1] = value;\n this.setSize( size_temp );\n }\n } );\n }\n\n /**\n * @summary モデル原点位置を設定\n *\n * @param {mapray.GeoPoint} position モデル原点の位置\n */\n setPosition( position )\n {\n if ( this._position.longitude !== position.longitude ||\n this._position.latitude !== position.latitude ||\n this._position.altitude !== position.altitude ) {\n // 位置が変更された\n this._position.assign( position );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n\n /**\n * @summary アイコンのピクセルサイズを指定\n * @param {mapray.Vector3} size アイコンのピクセルサイズ\n */\n setSize( size )\n {\n this._setVector2Property( \"size\", size );\n }\n\n\n /**\n * @summary アイコンの色を設定\n * @param {mapray.Vector3} color アイコンの色\n */\n setFGColor( color )\n {\n this._setVector3Property( \"fg_color\", color );\n }\n\n\n /**\n * @summary アイコン背景の色を設定\n * @param {mapray.Vector3} color アイコン背景の色\n */\n setBGColor( color )\n {\n this._setVector3Property( \"bg_color\", color );\n }\n\n /**\n * @private\n */\n _copyPropertyVector3f( name )\n {\n var props = this._props;\n if ( props.hasOwnProperty( name ) ) {\n props[name] = GeoMath.createVector3f( props[name] );\n }\n }\n\n /**\n * @private\n */\n _copyPropertyVector2f( name )\n {\n var props = this._props;\n if ( props.hasOwnProperty( name ) ) {\n if ( typeof( props[name] ) === 'number' ) {\n props[name] = GeoMath.createVector2f( [ props[name], props[name] ] );\n }\n else {\n props[name] = GeoMath.createVector2f( props[name] );\n }\n }\n }\n \n /**\n * @private\n */\n _setVector3Property( name, value )\n {\n var dst = this._props[name];\n if ( !dst ) {\n dst = this._props[name] = GeoMath.createVector3f( value );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n else if ( dst[0] !== value[0] || dst[1] !== value[1] || dst[2] !== value[2] ) {\n GeoMath.copyVector3( value, dst );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n\n /**\n * @private\n */\n _setVector2Property( name, value )\n {\n var dst = this._props[name];\n if ( !dst ) {\n this._props[name] = GeoMath.createVector2f( value );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n else if ( dst[0] !== value[0] || dst[1] !== value[1] ) {\n GeoMath.copyVector2( value, dst );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n\n isLoaded() {\n return this._icon.isLoaded();\n }\n\n get icon() {\n return this._icon;\n }\n\n draw( context, x, y, width, height ) {\n this._icon.draw( context, x, y, width, height );\n }\n}\n\nPinEntity.AbstractPinEntry = AbstractPinEntry;\n\n\n/**\n * @summary MakiIcon要素\n * @hideconstructor\n * @memberof mapray.PinEntity\n * @extends mapray.PinEntity.AbstractPinEntry\n * @public\n */\nclass MakiIconPinEntry extends AbstractPinEntry {\n\n /**\n * @param {mapray.PinEntity} owner 所有者\n * @param {string} id MakiアイコンのID\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {float} [props.size] アイコンサイズ\n * @param {mapray.Vector3} [props.fg_color] アイコン色\n * @param {mapray.Vector3} [props.bg_color] 背景色\n * @param {string} [props.id] Entryを識別するID\n */\n constructor( owner, id, position, props )\n {\n super( owner, position, props );\n \n this.setId( id );\n \n this._setupMakiIconPinAnimationBindingBlock();\n }\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupMakiIconPinAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const string = Type.find( \"string\" );\n\n // パラメータ名: id\n // パラメータ型: string\n // アイコンのID\n block.addEntry( \"id\", [string], null, value => {\n this.setId( value );\n } ); \n }\n\n /**\n * @summary アイコンのIDを設定\n * @param {string} maki_id アイコンのID\n */\n setId( maki_id )\n {\n if ( this._maki_id !== maki_id ) {\n // アイコンのIDが変更された\n this._maki_id = maki_id;\n this._icon = MakiIconPinEntry.makiIconLoader.load( maki_id );\n this._icon.onEnd(item => {\n this._owner.getPrimitiveProducer()._dirty = true;\n });\n }\n }\n}\n\nPinEntity.MakiIconPinEntry = MakiIconPinEntry;\n\n\n{\n MakiIconPinEntry.makiIconLoader = new URLTemplateIconLoader( \"https://resource.mapray.com/styles/v1/icons/maki/\", \".svg\" );\n}\n\n\n\n\n/**\n * @summary MakiIcon要素\n * @hideconstructor\n * @memberof mapray.PinEntity\n * @extends mapray.PinEntity.AbstractPinEntry\n * @public\n */\nclass TextPinEntry extends AbstractPinEntry {\n\n /**\n * @param {mapray.PinEntity} owner 所有者\n * @param {string} text テキスト\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {float} [props.size] アイコンピクセルサイズ\n * @param {mapray.Vector3} [props.fg_color] アイコン色\n * @param {mapray.Vector3} [props.bg_color] 背景色\n * @param {string} [props.font_family] フォントファミリー\n * @param {string} [props.id] Entryを識別するID\n */\n constructor( owner, text, position, props )\n {\n super( owner, position, props );\n \n this.setText( text );\n \n this._setupTextPinAnimationBindingBlock();\n }\n\n\n /**\n * @summary フォントファミリー\n * @type {string}\n * @readonly\n * @package\n */\n get font_family()\n {\n const props = this._props;\n const parent = this._owner._parent_props;\n return props.font_family || parent.font_family || PinEntity.DEFAULT_FONT_FAMILY;\n }\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupTextPinAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const string = Type.find( \"string\" );\n\n // パラメータ名: text\n // パラメータ型: string\n // テキスト\n block.addEntry( \"text\", [string], null, value => {\n this.setText( value );\n } ); \n }\n\n /**\n * @summary テキストを設定\n * @param {string} text テキスト\n */\n setText( text )\n {\n if ( this._text !== text ) {\n // テキストが変更された\n this._text = text;\n this._icon = TextPinEntry.textIconLoader.load( {\n text: this._text,\n props: {\n size: this.size,\n font_family: this.font_family,\n }\n } );\n this._icon.onEnd(item => {\n this._owner.getPrimitiveProducer()._dirty = true;\n });\n }\n }\n}\n\nPinEntity.TextPinEntry = TextPinEntry;\n\n\n{\n TextPinEntry.textIconLoader = new TextIconLoader();\n}\n\n\n\n\n/**\n * @summary 要素を Canvas 上にレイアウト\n *\n * @memberof mapray.PinEntity\n * @private\n */\nclass Layout {\n\n /**\n * @desc\n * 入力:\n * owner._glenv\n * owner.entity._entries\n * owner._transform\n *\n * @param {PrimitiveProducer} owner 所有者\n * @param {number[]} gocs_array GOCS 平坦化配列\n */\n constructor( owner, gocs_array )\n {\n this._owner = owner;\n this._items = this._createItemList();\n this._is_valid = true;\n\n var row_layouts = this._createRowLayouts();\n if ( row_layouts.length == 0 ) {\n // 有効なテキストが1つも無い\n this._is_valid = false;\n return;\n }\n\n // アイテムの配置の設定とキャンバスサイズの決定\n var size = this._setupLocation( row_layouts );\n\n this._texture = this._createTexture( size.width, size.height );\n this._texture_mask = this._createTextureMask();\n this._vertices = this._createVertices( size.width, size.height, gocs_array );\n this._indices = this._createIndices();\n }\n\n\n /**\n * @summary 有効なオブジェクトか?\n * @desc\n *

無効のとき、他のメソッドは呼び出せない。

\n * @return {boolean} 有効のとき true, 無効のとき false\n */\n isValid()\n {\n return this._is_valid;\n }\n\n\n /**\n * @summary テクスチャ\n * @type {mapray.Texture}\n * @readonly\n */\n get texture()\n {\n return this._texture;\n }\n\n /**\n * @summary テクスチャマスク\n * @type {mapray.Texture}\n * @readonly\n */\n get texture_mask()\n {\n return this._texture_mask;\n }\n\n\n /**\n * @summary 頂点配列\n * @desc\n * 条件:\n * this._entries.length > 0\n * 入力:\n * this._entries\n * this._transform\n * @type {Float32Array}\n * @readonly\n */\n get vertices()\n {\n return this._vertices;\n }\n\n\n /**\n * @summary インデックス配列\n * @type {Uint32Array}\n * @readonly\n */\n get indices()\n {\n return this._indices;\n }\n\n\n /**\n * @summary レイアウトアイテムのリストを生成\n * @return {array.}\n * @private\n */\n _createItemList()\n {\n const map = new Map();\n\n const items = [];\n let counter = 0;\n for ( let entry of this._owner.entity._entries ) {\n if ( entry.isLoaded() ) {\n let item = map.get( entry.icon );\n if ( !item ) {\n map.set( entry.icon, item = new LItem( this ) );\n items.push( item );\n }\n item.add( counter++, entry );\n }\n }\n\n return items;\n }\n\n /**\n * @summary RowLayout のリストを生成\n * @return {array.}\n * @private\n */\n _createRowLayouts()\n {\n // アイテムリストの複製\n var items = [].concat( this._items );\n\n // RowLayout 内であまり高さに差が出ないように、アイテムリストを高さで整列\n items.sort( function( a, b ) { return a.height_pixel - b.height_pixel; } );\n\n // リストを生成\n var row_layouts = [];\n while ( items.length > 0 ) {\n var row_layout = new RowLayout( items );\n if ( row_layout.isValid() ) {\n row_layouts.push( row_layout );\n }\n }\n\n return row_layouts;\n }\n\n\n /**\n * @summary テクスチャを生成\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @return {mapray.Texture} テキストテクスチャ\n * @private\n */\n _createTexture( width, height )\n {\n var context = Dom.createCanvasContext( width, height );\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n item.draw( context );\n }\n\n var glenv = this._owner._glenv;\n var opts = {\n usage: Texture.Usage.ICON\n };\n return new Texture( glenv, context.canvas, opts );\n }\n\n _createTextureMask()\n {\n var context = Dom.createCanvasContext( 3, 3 );\n context.fillRect( 1, 1, 1, 1 );\n var glenv = this._owner._glenv;\n var opts = {\n usage: Texture.Usage.ICON,\n mag_filter: glenv.context.NEAREST\n };\n return new Texture( glenv, context.canvas, opts );\n }\n\n /**\n * @summary 頂点配列を生成\n *\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @param {number[]} gocs_array GOCS 平坦化配列\n * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...]\n *\n * @private\n */\n _createVertices( width, height, gocs_array )\n {\n var vertices = [];\n\n // テキスト集合の原点 (GOCS)\n var transform = this._owner._transform;\n var xo = transform[12];\n var yo = transform[13];\n var zo = transform[14];\n\n /*\n || \n | | \n | |<--rx--->| \n ___-------___ ---- \n / \\ ^ \n / \\ ry \n | | | ----\n | | v ^ \n | c | ---- size.y\n | | ^ V \n | | | ----\n \\ / | \n '----_0___3_----' | \n | | | \n | | h \n | | | \n | | | \n | | | \n | | v \n 1---2 ------------ \n \n >| w |< \n */\n\n var xn = 1 / width;\n var yn = 1 / height;\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n\n for ( var ie = 0; ie < item.entries.length; ie++ ) {\n var eitem = item.entries[ie];\n var entry = eitem.entry;\n var size = entry.size;\n var rx = size[0] * 1.5 / 2;\n var ry = size[1] * 1.5 / 2;\n var h = ry * 2;\n var w = Math.max(2, rx / 10);\n\n // Relativize based on (xo, yo, zo)\n var ibase = eitem.index * 3;\n var xm = gocs_array[ibase] - xo;\n var ym = gocs_array[ibase + 1] - yo;\n var zm = gocs_array[ibase + 2] - zo;\n\n var fg_color = entry.fg_color;\n var bg_color = entry.bg_color;\n\n // Image dimensions (Image Coordinate)\n var xc = item.pos_x;\n var yc = item.pos_y;\n var xsize = item.width;\n var ysize = item.height;\n\n var vertices_push_texture = ( px, py ) => {\n vertices.push( (xc + xsize * px) * xn, 1 - (yc + ysize * py) * yn );\n };\n\n // p0\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -w / 2, h - ry ); // a_offset\n vertices_push_texture( 0.5 - (w/2/rx), 1.5/2 + 0.5 ); // a_texcoord\n vertices.push( -0.25 + 0.5, -0.25 + 0.5 ); // a_texmaskcoord\n vertices.push( ...fg_color );\n vertices.push( ...bg_color );\n\n // p1\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -w / 2, 0 ); // a_offset\n vertices_push_texture( 0.5 - (w/2/rx), 1.5/2 + 0.5 ); // a_texcoord\n vertices.push( -0.25 + 0.5, -0.25 + 0.5 ); // a_texmaskcoord\n vertices.push( ...fg_color );\n vertices.push( ...bg_color );\n\n // p2\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( w / 2, 0 ); // a_offset\n vertices_push_texture( 0.5 + (w/2/rx), 1.5/2 + 0.5 ); // a_texcoord\n vertices.push( -0.25 + 0.5, -0.25 + 0.5 ); // a_texmaskcoord\n vertices.push( ...fg_color );\n vertices.push( ...bg_color );\n\n // p3\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( w / 2, h - ry ); // a_offset\n vertices_push_texture( 0.5 + (w/2/rx), 1.5/2 + 0.5 ); // a_texcoord\n vertices.push( -0.25 + 0.5, -0.25 + 0.5 ); // a_texmaskcoord\n vertices.push( ...fg_color );\n vertices.push( ...bg_color );\n\n // c\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( 0, h ); // a_offset\n vertices_push_texture( 0.5, 0.5 ); // a_texcoord\n vertices.push( 0.5, 0.5 ); // a_texmaskcoord\n vertices.push( ...fg_color );\n vertices.push( ...bg_color );\n\n for ( var k = 1; k < PinEntity.CIRCLE_SEP_LENGTH; k++ ) {\n var th = (k / PinEntity.CIRCLE_SEP_LENGTH * 2 - 0.5) * Math.PI;\n var cos_th = Math.cos(th);\n var sin_th = Math.sin(th);\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( rx * cos_th, ry * sin_th + h ); // a_offset\n vertices_push_texture( 1.5 * cos_th / 2 + 0.5, -1.5 * sin_th / 2 + 0.5 ); // a_texcoord\n vertices.push( cos_th * 0.25 + 0.5 , sin_th * 0.25 + 0.5 ); // a_texmaskcoord\n vertices.push( ...fg_color );\n vertices.push( ...bg_color );\n }\n }\n }\n\n return vertices;\n }\n\n\n /**\n * @summary インデックス配列を生成\n * @return {array.} インデックス配列 []\n * @private\n */\n _createIndices()\n {\n var indices = [];\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n\n for ( var ie = 0; ie < item.entries.length; ie++ ) {\n var eitem = item.entries[ie];\n var base = ( 4 + 1 + PinEntity.CIRCLE_SEP_LENGTH - 1 ) * eitem.index;\n\n var p = base;\n var p0 = p;\n var p3 = p + 3;\n indices.push( p, p+1, p+2 );\n indices.push( p, p+2, p+3 );\n p += 4;\n\n var centerPos = p++;\n indices.push( centerPos, p0, p3 );\n indices.push( centerPos, p3, p );\n for ( var j = 1; j < PinEntity.CIRCLE_SEP_LENGTH - 1; j++ ) {\n indices.push( centerPos, p++, p );\n }\n indices.push( centerPos, p++, p0 );\n }\n }\n\n return indices;\n }\n\n\n /**\n * @summary アイテムの配置を設定\n * @param {array.} row_layouts\n * @return {object} キャンバスサイズ\n * @private\n */\n _setupLocation( row_layouts )\n {\n var width = 0;\n var height = 0;\n\n height += PinEntity.SAFETY_PIXEL_MARGIN;\n\n for ( var i = 0; i < row_layouts.length; ++i ) {\n var row_layout = row_layouts[i];\n row_layout.locate( height );\n width = Math.max( row_layout.width_assumed, width );\n height += row_layout.height_pixel + PinEntity.SAFETY_PIXEL_MARGIN;\n }\n\n return {\n width: width,\n height: height\n };\n }\n\n}\n\n\n\n/**\n * @summary レイアウト対象\n * @memberof mapray.PinEntity\n * @private\n */\nclass LItem {\n\n /**\n * @param {mapray.PinEntity.Layout} layout 所有者\n * @param {mapray.PinEntity.Entry} entry PinEntityのエントリ\n */\n constructor( layout )\n {\n this.entries = [];\n\n // テキストの基点\n this._pos_x = 0; // 左端\n this._pos_y = 0; // ベースライン位置\n\n this._height = this._width = null;\n\n this._is_canceled = false;\n }\n\n add( index, entry ) {\n var size = entry.size;\n if ( this._width === null || this._width < size[0] ) this._width = size[0];\n if ( this._height === null || this._height < size[1] ) this._height = size[1];\n this.entries.push( { index, entry } );\n }\n\n /**\n * @type {number}\n * @readonly\n */\n get pos_x()\n {\n return this._pos_x;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get pos_y()\n {\n return this._pos_y;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get width()\n {\n return this._width;\n }\n\n get height()\n {\n return this._height;\n }\n\n\n /**\n * キャンバス上でのテキストの横画素数\n * @type {number}\n * @readonly\n */\n get width_pixel()\n {\n return Math.ceil( this._width );\n }\n\n\n /**\n * キャンバス上でのテキストの縦画素数\n * @type {number}\n * @readonly\n */\n get height_pixel()\n {\n return Math.ceil( this._height );\n }\n\n\n /**\n * 取り消し状態か?\n * @type {boolean}\n * @readonly\n */\n get is_canceled()\n {\n return this._is_canceled;\n }\n\n\n /**\n * @summary 取り消し状態に移行\n */\n cancel()\n {\n this._is_canceled = true;\n }\n\n\n /**\n * @summary 配置を決定\n * @param {number} x テキスト矩形左辺の X 座標 (キャンバス座標系)\n * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系)\n */\n locate( x, y )\n {\n this._pos_x = x;\n this._pos_y = y;\n }\n\n draw( context ) {\n\n this.entries[0].entry.draw( context, this._pos_x, this.pos_y, this.width, this.height );\n\n var RENDER_BOUNDS = false;\n if ( RENDER_BOUNDS ) {\n context.beginPath();\n context.moveTo( this._pos_x , this._pos_y );\n context.lineTo( this._pos_x + this.width, this._pos_y );\n context.lineTo( this._pos_x + this.width, this._pos_y + this.height );\n context.lineTo( this._pos_x , this._pos_y + this.height );\n context.closePath();\n context.stroke();\n }\n }\n}\n\n\n\n/**\n * @summary 水平レイアウト\n * @memberof mapray.PinEntity\n * @private\n */\nclass RowLayout {\n\n /**\n * @desc\n *

レイアウトされた、またはレイアウトに失敗したアイテムは src_items から削除される。

\n *

レイアウトに失敗したアイテムは取り消し (is_canceled) になる。

\n * @param {array.} src_items アイテムリスト\n */\n constructor( src_items )\n {\n var width_assumed_total = 0;\n var height_pixel_max = 0;\n var row_items = [];\n\n width_assumed_total += PinEntity.SAFETY_PIXEL_MARGIN; // 左マージン\n\n while ( src_items.length > 0 ) {\n var item = src_items.shift();\n var width_assumed = item.width_pixel + PinEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン\n\n if ( width_assumed_total + width_assumed <= PinEntity.MAX_IMAGE_WIDTH ) {\n // 行にアイテムを追加\n row_items.push( item );\n width_assumed_total += width_assumed;\n height_pixel_max = Math.max( item.height_pixel, height_pixel_max );\n }\n else {\n if ( row_items.length == 0 ) {\n // テキストが長すぎて表示できない\n item.cancel();\n }\n else {\n // 次の行になるため差し戻して終了\n src_items.unshift( item );\n break;\n }\n }\n }\n\n this._items = row_items;\n this._width_assumed = width_assumed_total;\n this._height_pixel = height_pixel_max;\n }\n\n\n /**\n * @summary 有効なオブジェクトか?\n * @desc\n *

無効のとき、他のメソッドは呼び出せない。

\n * @return {boolean} 有効のとき true, 無効のとき false\n */\n isValid()\n {\n return this._items.length > 0;\n }\n\n\n /**\n * \n * @type {array.}\n * @readonly\n */\n get items()\n {\n return this._items;\n }\n\n\n /**\n * キャンバス上での行の横占有画素数\n * @type {number}\n * @readonly\n */\n get width_assumed()\n {\n return this._width_assumed;\n }\n\n\n /**\n * キャンバス上での行の縦画素数\n * @type {number}\n * @readonly\n */\n get height_pixel()\n {\n return this._height_pixel;\n }\n\n\n /**\n * @summary レイアウトの配置を決定\n * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系)\n */\n locate( y )\n {\n var items = this._items;\n var x = 0;\n\n x += PinEntity.SAFETY_PIXEL_MARGIN; // 左マージン\n\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n item.locate( x, y );\n x += item.width_pixel + PinEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン\n }\n }\n\n}\n\n\n\nexport default PinEntity;\n","import EntityMaterial from \"./EntityMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport image_icon_vs_code from \"./shader/image_icon.vert\";\nimport image_icon_fs_code from \"./shader/image_icon.frag\";\nimport rid_fs_code from \"./shader/rid.frag\";\nimport { RenderTarget } from \"./RenderStage\";\n\n\n/**\n * @summary イメージアイコンマテリアル\n * @memberof mapray\n * @extends mapray.EntityMaterial\n * @private\n * @see mapray.ImageIconEntity\n */\nclass ImageIconMaterial extends EntityMaterial {\n\n /**\n * @param {mapray.GLEnv} glenv\n */\n constructor( glenv, options = {} )\n {\n super( glenv, image_icon_vs_code, options.ridMaterial ? rid_fs_code : image_icon_fs_code );\n\n // 不変パラメータを事前設定\n this.bindProgram();\n this.setInteger( \"u_image\", ImageIconMaterial.TEXUNIT_IMAGE );\n // this.setInteger( \"u_image_mask\", ImageIconMaterial.TEXUNIT_IMAGE_MASK );\n }\n\n\n /**\n * @override\n */\n isTranslucent( stage, primitive )\n {\n // 半透明画像は非対応\n return false;\n }\n\n\n /**\n * @override\n */\n setParameters( stage, primitive )\n {\n super.setParameters( stage, primitive );\n\n var props = primitive.properties;\n\n // mat4 u_obj_to_clip\n this.setObjToClip( stage, primitive );\n\n // 画面パラメータ: {2/w, 2/h}\n // vec2 u_sparam\n var sparam = ImageIconMaterial._sparam;\n sparam[0] = 2 / stage._width;\n sparam[1] = 2 / stage._height;\n this.setVector2( \"u_sparam\", sparam );\n\n if (stage.getRenderTarget() === RenderTarget.SCENE) {\n // テクスチャのバインド\n // sampler2D u_image\n var image = props[\"image\"];\n this.bindTexture2D( ImageIconMaterial.TEXUNIT_IMAGE, image.handle );\n\n // テクスチャマスクのバインド\n // sampler2D u_image_mask\n // var image_mask = props[\"image_mask\"];\n // this.bindTexture2D( ImageIconMaterial.TEXUNIT_IMAGE_MASK, image_mask.handle );\n }\n }\n\n}\n\n\n// クラス定数の定義\n{\n ImageIconMaterial.TEXUNIT_IMAGE = 0; // 画像のテクスチャユニット\n // ImageIconMaterial.TEXUNIT_IMAGE_MASK = 1; // 画像マスクのテクスチャユニット\n\n // 計算用一時領域\n ImageIconMaterial._sparam = GeoMath.createVector2f();\n ImageIconMaterial._bg_color = GeoMath.createVector3f();\n ImageIconMaterial._fg_color = GeoMath.createVector3f();\n}\n\n\nexport default ImageIconMaterial;\n","import Entity from \"./Entity\";\nimport Primitive from \"./Primitive\";\nimport Mesh from \"./Mesh\";\nimport Texture from \"./Texture\";\nimport ImageIconMaterial from \"./ImageIconMaterial\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport { RenderTarget } from \"./RenderStage\";\nimport AltitudeMode from \"./AltitudeMode\";\nimport EntityRegion from \"./EntityRegion\";\nimport { ImageIconLoader } from \"./IconLoader\";\nimport Dom from \"./util/Dom\";\nimport EasyBindingBlock from \"./animation/EasyBindingBlock\";\nimport Type from \"./animation/Type\";\nimport AnimUtil from \"./animation/AnimUtil\";\nimport Resource, { URLResource } from \"./Resource\";\nimport AbstractPointEntity from \"./AbstractPointEntity\";\n\n\n/**\n * @summary 画像アイコンエンティティ\n * @memberof mapray\n * @extends mapray.Entity\n */\nclass ImageIconEntity extends AbstractPointEntity {\n\n /**\n * @param {mapray.Scene} scene 所属可能シーン\n * @param {object} [opts] オプション集合\n * @param {object} [opts.json] 生成情報\n * @param {object} [opts.refs] 参照辞書\n * @param {mapray.Loader.TransformCallback} [opts.transform] \n */\n constructor( scene, opts )\n {\n super( scene, opts );\n\n // 親プロパティ\n this._parent_props = {\n size: null,\n origin: null,\n };\n\n // Entity.PrimitiveProducer インスタンス\n this._primitive_producer = new PrimitiveProducer( this );\n\n this._animation.addDescendantUnbinder( () => { this._unbindDescendantAnimations(); } );\n this._setupAnimationBindingBlock();\n\n // 生成情報から設定\n if ( opts && opts.json ) {\n this._setupByJson( opts.json );\n }\n }\n\n\n /**\n * @override\n */\n getPrimitiveProducer()\n {\n return this._primitive_producer;\n }\n\n\n /**\n * EasyBindingBlock.DescendantUnbinder 処理\n *\n * @private\n */\n _unbindDescendantAnimations()\n {\n // すべてのエントリーを解除\n for ( let entry of this._entries ) {\n entry.animation.unbindAllRecursively();\n }\n }\n\n\n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const vector2 = Type.find( \"vector2\" );\n\n // パラメータ名: size\n // パラメータ型: vector2 | number\n // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈\n // 型が number のとき アイコンのピクセルサイズX, Y の値\n const size_temp = GeoMath.createVector2();\n let size_type;\n\n let size_tsolver = curve => {\n size_type = AnimUtil.findFirstTypeSupported( curve, [vector2, number] );\n return size_type;\n };\n\n block.addEntry( \"size\", [vector2, number], size_tsolver, value => {\n if ( size_type === vector2 ) {\n this.setSize( value );\n }\n else { // size_type === number\n size_temp[0] = value;\n size_temp[1] = value;\n this.setSize( size_temp );\n }\n } );\n }\n\n\n /**\n * @summary アイコンのサイズを指定\n * @param {mapray.Vector2} size アイコンのピクセルサイズ\n */\n setSize( size ) {\n this._setVector2Property( \"size\", size );\n }\n\n\n /**\n * @summary アイコンの原点位置を指定\n * @param {mapray.Vector2} origin アイコンの原点位置\n */\n setOrigin( origin ) {\n this._setVector2Property( \"origin\", origin );\n }\n\n\n /**\n * @summary Add Image Icon\n * @param {URL|HTMLImageElement|HTMLCanvasElement} image_src 画像\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {mapray.Vector2} [props.size] アイコンサイズ\n * @param {string} [props.id] Entryを識別するID\n * @param {mapray.Loader.Transform} [props.transform] URL変換関数\n * @return {mapray.ImageIconEntity.ImageEntry} 追加したEntry\n */\n addImageIcon( image_src, position, props ) \n {\n var entry = new ImageEntry( this, image_src, position, props );\n this._entries.push( entry );\n this._primitive_producer.onAddEntry();\n return entry;\n }\n\n\n /**\n * @summary 専用マテリアルを取得\n * @private\n */\n _getMaterial( render_target )\n {\n var scene = this.scene;\n if ( render_target === RenderTarget.SCENE ) {\n if ( !scene._ImageEntity_image_material ) {\n // scene にマテリアルをキャッシュ\n scene._ImageEntity_image_material = new ImageIconMaterial( scene.glenv );\n }\n return scene._ImageEntity_image_material;\n }\n else if (render_target === RenderTarget.RID) {\n if ( !scene._ImageEntity_image_material_pick ) {\n // scene にマテリアルをキャッシュ\n scene._ImageEntity_image_material_pick = new ImageIconMaterial( scene.glenv, { ridMaterial: true } );\n }\n return scene._ImageEntity_image_material_pick;\n }\n }\n\n\n /**\n * @private\n */\n _setValueProperty( name, value )\n {\n var props = this._parent_props;\n if ( props[name] != value ) {\n props[name] = value;\n this._primitive_producer.onChangeParentProperty();\n }\n }\n\n /**\n * @private\n */\n _setVector2Property( name, value )\n {\n var dst = this._parent_props[name];\n if ( !dst ) {\n this._parent_props[name] = GeoMath.createVector2f( value );\n this._primitive_producer.onChangeParentProperty();\n }\n else if ( dst[0] !== value[0] || dst[1] !== value[1] ) {\n GeoMath.copyVector2( value, dst );\n this._primitive_producer.onChangeParentProperty();\n }\n }\n\n /**\n * @private\n */\n _setupByJson( json )\n {\n var position = new GeoPoint();\n\n for ( let entry of json.entries ) {\n position.setFromArray( entry.position );\n this.addImageIcon( position, entry );\n }\n\n if ( json.size ) this.setSize( json.size );\n if ( json.origin ) this.setOrigin( json.origin );\n }\n\n \n /**\n * @summary IDでEntryを取得\n * @param {string} id ID\n * @return {mapray.ImageIconEntity.ImageEntry} IDが一致するEntry(無ければundefined)\n */\n getEntry( id )\n {\n return this._entries.find((entry) => entry.id === id);\n }\n}\n\n\n// クラス定数の定義\n{\n ImageIconEntity.DEFAULT_COLOR = GeoMath.createVector3f( [1, 1, 1] );\n ImageIconEntity.SAFETY_PIXEL_MARGIN = 1;\n ImageIconEntity.MAX_IMAGE_WIDTH = 4096;\n ImageIconEntity.CIRCLE_SEP_LENGTH = 32;\n ImageIconEntity.DEFAULT_ICON_SIZE = GeoMath.createVector2f( [30, 30] );\n ImageIconEntity.DEFAULT_ORIGIN = GeoMath.createVector2f( [ 0.5, 0.5 ] );\n\n ImageIconEntity.SAFETY_PIXEL_MARGIN = 1;\n ImageIconEntity.MAX_IMAGE_WIDTH = 4096;\n}\n\n\n\n/**\n * @summary PrimitiveProducer\n *\n * TODO: relative で標高の変化のたびにテクスチャを生成する必要はないので\n * Layout でのテクスチャの生成とメッシュの生成を分離する\n *\n * @private\n */\nclass PrimitiveProducer extends Entity.PrimitiveProducer {\n\n /**\n * @param {mapray.ImageIconEntity} entity\n */\n constructor( entity )\n {\n super( entity );\n\n this._glenv = entity.scene.glenv;\n this._dirty = true;\n\n // プリミティブの要素\n this._transform = GeoMath.setIdentity( GeoMath.createMatrix() );\n this._properties = {\n image: null, // アイコン画像\n };\n\n // プリミティブ\n var primitive = new Primitive( this._glenv, null, entity._getMaterial( RenderTarget.SCENE ), this._transform );\n primitive.properties = this._properties;\n this._primitive = primitive;\n\n var pickPrimitive = new Primitive( this._glenv, null, entity._getMaterial( RenderTarget.RID ), this._transform );\n pickPrimitive.properties = this._properties;\n this._pickPrimitive = pickPrimitive;\n\n // プリミティブ配列\n this._primitives = [];\n\n this._pickPrimitives = [];\n }\n\n\n /**\n * @override\n */\n createRegions()\n {\n const region = new EntityRegion();\n\n for ( let {position} of this.entity._entries ) {\n region.addPoint( position );\n }\n\n return [region];\n }\n\n\n /**\n * @override\n */\n onChangeElevation( regions )\n {\n this._dirty = true;\n }\n\n\n /**\n * @override\n */\n getPrimitives( stage )\n {\n this._updatePrimitive();\n return stage.getRenderTarget() === RenderTarget.SCENE ? this._primitives : this._pickPrimitives;\n }\n\n\n /**\n * @summary 親プロパティが変更されたことを通知\n */\n onChangeParentProperty()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary 子プロパティが変更されたことを通知\n */\n onChangeChildProperty()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary 高度モードが変更されたことを通知\n */\n onChangeAltitudeMode()\n {\n this._dirty = true;\n }\n\n\n /**\n * @summary エントリが追加されたことを通知\n */\n onAddEntry()\n {\n // 変化した可能性がある\n this.needToCreateRegions();\n this._dirty = true;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n * 入力:\n * this.entity._entries\n * this._dirty\n * 出力:\n * this._transform\n * this._properties.image\n * this._primitive.mesh\n * this._primitives\n * this._dirty\n *\n * @return {array.} this._primitives\n *\n * @private\n */\n _updatePrimitive()\n {\n if ( !this._dirty ) {\n // 更新する必要はない\n return;\n }\n\n if ( this.entity._entries.length == 0 ) {\n this._primitives = [];\n this._pickPrimitives = [];\n this._dirty = false;\n return;\n }\n\n // 各エントリーの GOCS 位置を生成 (平坦化配列)\n var gocs_array = this._createFlatGocsArray();\n\n // プリミティブの更新\n // primitive.transform\n this._updateTransform( gocs_array );\n\n var layout = new Layout( this, gocs_array );\n if ( !layout.isValid() ) {\n // 更新に失敗\n this._primitives = [];\n this._pickPrimitives = [];\n this._dirty = false;\n return;\n }\n\n // テクスチャ設定\n var properties = this._properties;\n if ( properties.image ) {\n properties.image.dispose();\n }\n properties.image = layout.texture;\n\n // メッシュ生成\n var mesh_data = {\n vtype: [\n { name: \"a_position\", size: 3 },\n { name: \"a_offset\", size: 2 },\n { name: \"a_texcoord\", size: 2 },\n ],\n vertices: layout.vertices,\n indices: layout.indices\n };\n var mesh = new Mesh( this._glenv, mesh_data );\n\n // メッシュ設定\n // primitive.mesh\n var primitive = this._primitive;\n if ( primitive.mesh ) {\n primitive.mesh.dispose();\n }\n primitive.mesh = mesh;\n\n var pickPrimitive = this._pickPrimitive;\n if ( pickPrimitive.mesh ) {\n pickPrimitive.mesh.dispose();\n }\n pickPrimitive.mesh = mesh;\n\n // 更新に成功\n this._primitives = [primitive];\n this._pickPrimitives = [pickPrimitive];\n this._dirty = false;\n }\n\n\n /**\n * @summary プリミティブの更新\n *\n * @desc\n * 条件:\n * this.entity._entries.length > 0\n * 入力:\n * this.entity._entries.length\n * 出力:\n * this._transform\n *\n * @param {number[]} gocs_array GOCS 平坦化配列\n *\n * @private\n */\n _updateTransform( gocs_array )\n {\n var num_entries = this.entity._entries.length;\n var xsum = 0;\n var ysum = 0;\n var zsum = 0;\n\n for ( let i = 0; i < num_entries; ++i ) {\n let ibase = 3*i;\n xsum += gocs_array[ibase];\n ysum += gocs_array[ibase + 1];\n zsum += gocs_array[ibase + 2];\n }\n\n // 変換行列の更新\n var transform = this._transform;\n transform[12] = xsum / num_entries;\n transform[13] = ysum / num_entries;\n transform[14] = zsum / num_entries;\n }\n\n\n /**\n * @summary GOCS 平坦化配列を取得\n *\n * 入力: this.entity._entries\n *\n * @return {number[]} GOCS 平坦化配列\n * @private\n */\n _createFlatGocsArray()\n {\n const num_points = this.entity._entries.length;\n return GeoPoint.toGocsArray( this._getFlatGeoPoints_with_Absolute(), num_points,\n new Float64Array( 3 * num_points ) );\n }\n\n\n /**\n * @summary GeoPoint 平坦化配列を取得 (絶対高度)\n *\n * 入力: this.entity._entries\n *\n * @return {number[]} GeoPoint 平坦化配列\n * @private\n */\n _getFlatGeoPoints_with_Absolute()\n {\n const owner = this.entity;\n const entries = owner._entries;\n const num_points = entries.length;\n const flat_array = new Float64Array( 3 * num_points );\n\n // flat_array[] に経度要素と緯度要素を設定\n for ( let i = 0; i < num_points; ++i ) {\n let pos = entries[i].position;\n flat_array[3*i] = pos.longitude;\n flat_array[3*i + 1] = pos.latitude;\n }\n\n switch ( owner.altitude_mode ) {\n case AltitudeMode.RELATIVE:\n case AltitudeMode.CLAMP:\n // flat_array[] の高度要素に現在の標高を設定\n owner.scene.viewer.getExistingElevations( num_points, flat_array, 0, 3, flat_array, 2, 3 );\n\n if ( owner.altitude_mode === AltitudeMode.RELATIVE ) {\n // flat_array[] の高度要素に絶対高度を設定\n for ( let i = 0; i < num_points; ++i ) {\n flat_array[3*i + 2] += entries[i].position.altitude;\n }\n }\n break;\n\n default: // AltitudeMode.ABSOLUTE\n // flat_array[] の高度要素に絶対高度を設定\n for ( let i = 0; i < num_points; ++i ) {\n flat_array[3*i + 2] = entries[i].position.altitude;\n }\n break;\n }\n\n return flat_array;\n }\n\n}\n\n\n\n/**\n * @summary 要素\n * @hideconstructor\n * @memberof mapray.ImageIconEntity\n * @public\n */\nclass ImageEntry {\n\n /**\n * @param {mapray.ImageIconEntity} owner 所有者\n * @param {string} image_src アイコン画像\n * @param {mapray.GeoPoint} position 位置\n * @param {object} [props] プロパティ\n * @param {mapray.Vector2} [props.size] アイコンサイズ\n * @param {string} [props.id] Entryを識別するID\n * @param {mapray.Loader.Transform} [props.transform] URL変換関数\n */\n constructor( owner, image_src, position, props )\n {\n this._owner = owner;\n this._position = position.clone();\n\n // animation.BindingBlock\n this._animation = new EasyBindingBlock();\n \n this._setupAnimationBindingBlock();\n\n this._props = Object.assign( {}, props ); // props の複製\n this._copyPropertyVector2f( \"size\" ); // deep copy\n this._copyPropertyVector2f( \"origin\" ); // deep copy\n\n this.setImage( image_src );\n }\n\n /**\n * @summary 位置\n * @type {mapray.GeoPoint}\n * @readonly\n * @package\n */\n get position()\n {\n return this._position;\n }\n\n /**\n * @summary ID\n * @type {string}\n * @readonly\n */\n get id()\n {\n return this._props.hasOwnProperty( \"id\" ) ? this._props.id : \"\";\n }\n\n /**\n * @summary アイコンサイズ (Pixels)\n * @type {mapray.Vector2}\n * @readonly\n * @package\n */\n get size()\n {\n const props = this._props;\n const parent = this._owner._parent_props;\n return (\n props.size || parent.size ||\n GeoMath.createVector2f( [ this._icon.width, this._icon.height ] )\n );\n }\n\n /**\n * @summary アイコンオリジン位置 (左上を(0, 0)、右下を(1, 1)としする数字を指定する。)\n * @type {mapray.Vector2}\n * @readonly\n * @package\n */\n get origin()\n {\n const props = this._props;\n const parent = this._owner._parent_props;\n return props.origin || parent.origin || ImageIconEntity.DEFAULT_ORIGIN;\n }\n\n /**\n * @summary アニメーションパラメータ設定\n *\n * @type {mapray.animation.BindingBlock}\n * @readonly\n */\n get animation() { return this._animation; }\n \n /**\n * アニメーションの BindingBlock を初期化\n *\n * @private\n */\n _setupAnimationBindingBlock()\n {\n const block = this.animation; // 実体は EasyBindingBlock\n\n const number = Type.find( \"number\" );\n const string = Type.find( \"string\" );\n const vector2 = Type.find( \"vector2\" );\n const vector3 = Type.find( \"vector3\" );\n \n // パラメータ名: image_src\n // パラメータ型: string\n // 画像のパス\n block.addEntry( \"image_src\", [string], null, value => {\n this.setImage( value );\n } );\n\n // パラメータ名: position\n // パラメータ型: vector3\n // ベクトルの要素が longitude, latitude, altitude 順であると解釈\n const position_temp = new GeoPoint();\n\n block.addEntry( \"position\", [vector3], null, value => {\n position_temp.setFromArray( value ); // Vector3 -> GeoPoint\n this.setPosition( position_temp );\n } );\n\n // パラメータ名: size\n // パラメータ型: vector2 | number\n // 型が vector2 のとき アイコンのピクセルサイズX, Y 順であると解釈\n // 型が number のとき アイコンのピクセルサイズX, Y は同値\n const size_temp = GeoMath.createVector2();\n let size_type;\n\n let size_tsolver = curve => {\n size_type = AnimUtil.findFirstTypeSupported( curve, [vector2, number] );\n return size_type;\n };\n\n block.addEntry( \"size\", [vector2, number], size_tsolver, value => {\n if ( size_type === vector2 ) {\n this.setSize( value );\n }\n else { // size_type === number\n size_temp[0] = value;\n size_temp[1] = value;\n this.setSize( size_temp );\n }\n } );\n }\n\n \n /**\n * @summary 画像のパスを設定\n * @param {string} image_src 画像のパス\n */\n setImage( image_src )\n {\n if ( this._image_src !== image_src ) {\n // 画像のパスが変更された\n this._image_src = image_src;\n const resource = (\n image_src instanceof Resource ? image_src:\n new URLResource( image_src, { transform: this._props.transform })\n );\n this._icon = ImageEntry.iconLoader.load( resource );\n this._icon.onEnd(item => {\n this._owner.getPrimitiveProducer()._dirty = true;\n });\n }\n }\n\n /**\n * @summary テキスト原点位置を設定\n *\n * @param {mapray.GeoPoint} position テキスト原点の位置\n */\n setPosition( position )\n {\n if ( this._position.longitude !== position.longitude ||\n this._position.latitude !== position.latitude ||\n this._position.altitude !== position.altitude ) {\n // 位置が変更された\n this._position.assign( position );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n\n /**\n * @summary アイコンのサイズを指定\n * @param {mapray.Vector2} size アイコンのピクセルサイズ\n */\n setSize( size ) {\n this._setVector2Property( \"size\", size );\n }\n\n /**\n * @private\n */\n _copyPropertyVector3f( name )\n {\n var props = this._props;\n if ( props.hasOwnProperty( name ) ) {\n props[name] = GeoMath.createVector3f( props[name] );\n }\n }\n\n /**\n * @private\n */\n _copyPropertyVector2f( name )\n {\n var props = this._props;\n if ( props.hasOwnProperty( name ) ) {\n if ( typeof( props[name] ) === 'number' ) {\n props[name] = GeoMath.createVector2f( [ props[name], props[name] ] );\n }\n else {\n props[name] = GeoMath.createVector2f( props[name] );\n }\n }\n }\n\n /**\n * @private\n */\n _setVector2Property( name, value )\n {\n var dst = this._props[name];\n if ( !dst ) {\n this._props[name] = GeoMath.createVector2f( value );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n else if ( dst[0] !== value[0] || dst[1] !== value[1] ) {\n GeoMath.copyVector2( value, dst );\n this._owner.getPrimitiveProducer().onChangeChildProperty();\n }\n }\n\n isLoaded() {\n return this._icon.isLoaded();\n }\n\n get icon() {\n return this._icon;\n }\n\n draw( context, x, y, width, height ) {\n this._icon.draw( context, x, y, width, height );\n }\n}\n\nImageIconEntity.ImageEntry = ImageEntry;\n\n\n{\n ImageEntry.iconLoader = new ImageIconLoader();\n}\n\n\n\n/**\n * @summary Pin画像を Canvas 上にレイアウト\n * @memberof mapray.ImageIconEntity\n * @private\n */\nclass Layout {\n\n /**\n * @desc\n * 入力:\n * owner._glenv\n * owner.entity._entries\n * owner._transform\n *\n * @param {PrimitiveProducer} owner 所有者\n * @param {number[]} gocs_array GOCS 平坦化配列\n */\n constructor( owner, gocs_array )\n {\n this._owner = owner;\n this._items = this._createItemList();\n this._is_valid = true;\n\n var row_layouts = this._createRowLayouts();\n if ( row_layouts.length == 0 ) {\n // 有効なテキストが1つも無い\n this._is_valid = false;\n return;\n }\n\n // アイテムの配置の設定とキャンバスサイズの決定\n var size = this._setupLocation( row_layouts );\n\n this._texture = this._createTexture( size.width, size.height );\n this._vertices = this._createVertices( size.width, size.height, gocs_array );\n this._indices = this._createIndices();\n }\n\n\n /**\n * @summary 有効なオブジェクトか?\n * @desc\n *

無効のとき、他のメソッドは呼び出せない。

\n * @return {boolean} 有効のとき true, 無効のとき false\n */\n isValid()\n {\n return this._is_valid;\n }\n\n\n /**\n * @summary テクスチャ\n * @type {mapray.Texture}\n * @readonly\n */\n get texture()\n {\n return this._texture;\n }\n\n /**\n * @summary 頂点配列\n * @desc\n * 条件:\n * this._entries.length > 0\n * 入力:\n * this._entries\n * this._transform\n * @type {Float32Array}\n * @readonly\n */\n get vertices()\n {\n return this._vertices;\n }\n\n\n /**\n * @summary インデックス配列\n * @type {Uint32Array}\n * @readonly\n */\n get indices()\n {\n return this._indices;\n }\n\n\n /**\n * @summary レイアウトアイテムのリストを生成\n * @return {array.}\n * @private\n */\n _createItemList()\n {\n const map = new Map();\n\n const items = [];\n let counter = 0;\n for ( let entry of this._owner.entity._entries ) {\n if ( entry.isLoaded() ) {\n let item = map.get( entry.icon );\n if ( !item ) {\n map.set( entry.icon, item = new LItem( this ) );\n items.push( item );\n }\n item.add( counter++, entry );\n }\n }\n\n return items;\n }\n\n /**\n * @summary RowLayout のリストを生成\n * @return {array.}\n * @private\n */\n _createRowLayouts()\n {\n // アイテムリストの複製\n var items = [].concat( this._items );\n\n // RowLayout 内であまり高さに差が出ないように、アイテムリストを高さで整列\n items.sort( function( a, b ) { return a.height_pixel - b.height_pixel; } );\n\n // リストを生成\n var row_layouts = [];\n while ( items.length > 0 ) {\n var row_layout = new RowLayout( items );\n if ( row_layout.isValid() ) {\n row_layouts.push( row_layout );\n }\n }\n\n return row_layouts;\n }\n\n\n /**\n * @summary テクスチャを生成\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @return {mapray.Texture} テキストテクスチャ\n * @private\n */\n _createTexture( width, height )\n {\n var context = Dom.createCanvasContext( width, height );\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n item.draw( context );\n }\n\n var glenv = this._owner._glenv;\n var opts = {\n usage: Texture.Usage.ICON\n };\n return new Texture( glenv, context.canvas, opts );\n }\n\n\n /**\n * @summary 頂点配列を生成\n *\n * @param {number} width 横幅\n * @param {number} height 高さ\n * @param {number[]} gocs_array GOCS 平坦化配列\n * @return {array.} 頂点配列 [左下0, 右下0, 左上0, 右上0, ...]\n *\n * @private\n */\n _createVertices( width, height, gocs_array )\n {\n var vertices = [];\n\n // テキスト集合の原点 (GOCS)\n var transform = this._owner._transform;\n var xo = transform[12];\n var yo = transform[13];\n var zo = transform[14];\n\n /*\n\n |<----size[0]px---->|\n\n 0-------------------3 ------------------\n | | ^ ^ \n | | | origin[1] | \n | | | | \n | | v | size[1]px\n | o | --- | \n | | ^ | \n | | | 1-origin[1] | \n | | v v \n 1-------------------2 ------------------\n \n | |<----->| 1 - origin[0]\n |<--------->| origin[0]\n */\n\n var xn = 1 / width;\n var yn = 1 / height;\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n\n for ( var ie = 0; ie < item.entries.length; ie++ ) {\n var eitem = item.entries[ie];\n var entry = eitem.entry;\n var size = entry.size;\n var origin = entry.origin;\n\n // Relativize based on (xo, yo, zo)\n var ibase = eitem.index * 3;\n var xm = gocs_array[ibase] - xo;\n var ym = gocs_array[ibase + 1] - yo;\n var zm = gocs_array[ibase + 2] - zo;\n\n // Image dimensions (Image Coordinate)\n var xc = item.pos_x;\n var yc = item.pos_y;\n var xsize = item.width;\n var ysize = item.height;\n\n // p0\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -origin[0]*size[0], (origin[1])*size[1] ); // a_offset\n vertices.push( xc * xn, 1.0 - yc * yn ); // a_texcoord\n\n // p1\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( -origin[0]*size[0], -(1-origin[1])*size[1] ); // a_offset\n vertices.push( xc * xn, 1 - (yc + ysize) * yn ); // a_texcoord\n\n // p2\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( (1-origin[0])*size[0], -(1-origin[1])*size[1] ); // a_offset\n vertices.push( (xc + xsize) * xn, 1 - (yc + ysize) * yn ); // a_texcoord\n\n // p3\n vertices.push( xm, ym, zm ); // a_position\n vertices.push( (1-origin[0])*size[0], origin[1]*size[1] ); // a_offset\n vertices.push( (xc + xsize) * xn, 1 - yc * yn ); // a_texcoord\n }\n }\n\n return vertices;\n }\n\n\n /**\n * @summary インデックス配列を生成\n * @return {array.} インデックス配列 []\n * @private\n */\n _createIndices()\n {\n var indices = [];\n\n var items = this._items;\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n if ( item.is_canceled ) continue;\n\n for ( var ie = 0; ie < item.entries.length; ie++ ) {\n var eitem = item.entries[ie];\n var base = 4 * eitem.index;\n\n var p = base;\n indices.push( p, p+1, p+2 );\n indices.push( p, p+2, p+3 );\n }\n }\n\n return indices;\n }\n\n\n /**\n * @summary アイテムの配置を設定\n * @param {array.} row_layouts\n * @return {object} キャンバスサイズ\n * @private\n */\n _setupLocation( row_layouts )\n {\n var width = 0;\n var height = 0;\n\n height += ImageIconEntity.SAFETY_PIXEL_MARGIN;\n\n for ( var i = 0; i < row_layouts.length; ++i ) {\n var row_layout = row_layouts[i];\n row_layout.locate( height );\n width = Math.max( row_layout.width_assumed, width );\n height += row_layout.height_pixel + ImageIconEntity.SAFETY_PIXEL_MARGIN;\n }\n\n return {\n width: width,\n height: height\n };\n }\n}\n\n\n\n/**\n * @summary レイアウト対象\n * @memberof mapray.ImageIconEntity\n * @private\n */\nclass LItem {\n\n /**\n * @param {mapray.ImageIconEntity.Layout} layout 所有者\n * @param {mapray.ImageIconEntity.Entry} entry ImageIconEntityのエントリ\n */\n constructor( layout )\n {\n this.entries = [];\n\n // テキストの基点\n this._pos_x = 0; // 左端\n this._pos_y = 0; // ベースライン位置\n\n this._height = this._width = null;\n\n this._is_canceled = false;\n }\n\n add( index, entry ) {\n var size = entry.size;\n if ( this._width === null || this._width < size[0] ) this._width = size[0];\n if ( this._height === null || this._height < size[1] ) this._height = size[1];\n this.entries.push( { index, entry } );\n }\n\n /**\n * @type {number}\n * @readonly\n */\n get pos_x()\n {\n return this._pos_x;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get pos_y()\n {\n return this._pos_y;\n }\n\n\n /**\n * @type {number}\n * @readonly\n */\n get width()\n {\n return this._width;\n }\n\n get height()\n {\n return this._height;\n }\n\n\n /**\n * キャンバス上でのテキストの横画素数\n * @type {number}\n * @readonly\n */\n get width_pixel()\n {\n return Math.ceil( this._width );\n }\n\n\n /**\n * キャンバス上でのテキストの縦画素数\n * @type {number}\n * @readonly\n */\n get height_pixel()\n {\n return Math.ceil( this._height );\n }\n\n\n /**\n * 取り消し状態か?\n * @type {boolean}\n * @readonly\n */\n get is_canceled()\n {\n return this._is_canceled;\n }\n\n\n /**\n * @summary 取り消し状態に移行\n */\n cancel()\n {\n this._is_canceled = true;\n }\n\n\n /**\n * @summary 配置を決定\n * @param {number} x テキスト矩形左辺の X 座標 (キャンバス座標系)\n * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系)\n */\n locate( x, y )\n {\n this._pos_x = x;\n this._pos_y = y;\n }\n\n draw( context ) {\n\n this.entries[0].entry.draw( context, this._pos_x, this.pos_y, this.width, this.height ); // @Todo: fix this\n\n var RENDER_BOUNDS = false;\n if ( RENDER_BOUNDS ) {\n context.beginPath();\n context.moveTo( this._pos_x , this._pos_y );\n context.lineTo( this._pos_x + this.width, this._pos_y );\n context.lineTo( this._pos_x + this.width, this._pos_y + this.height );\n context.lineTo( this._pos_x , this._pos_y + this.height );\n context.closePath();\n context.stroke();\n }\n }\n}\n\n\n\n/**\n * @summary 水平レイアウト\n * @memberof mapray.ImageIconEntity\n * @private\n */\nclass RowLayout {\n\n /**\n * @desc\n *

レイアウトされた、またはレイアウトに失敗したアイテムは src_items から削除される。

\n *

レイアウトに失敗したアイテムは取り消し (is_canceled) になる。

\n * @param {array.} src_items アイテムリスト\n */\n constructor( src_items )\n {\n var width_assumed_total = 0;\n var height_pixel_max = 0;\n var row_items = [];\n\n width_assumed_total += ImageIconEntity.SAFETY_PIXEL_MARGIN; // 左マージン\n\n while ( src_items.length > 0 ) {\n var item = src_items.shift();\n var width_assumed = item.width_pixel + ImageIconEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン\n\n if ( width_assumed_total + width_assumed <= ImageIconEntity.MAX_IMAGE_WIDTH ) {\n // 行にアイテムを追加\n row_items.push( item );\n width_assumed_total += width_assumed;\n height_pixel_max = Math.max( item.height_pixel, height_pixel_max );\n }\n else {\n if ( row_items.length == 0 ) {\n // テキストが長すぎて表示できない\n item.cancel();\n }\n else {\n // 次の行になるため差し戻して終了\n src_items.unshift( item );\n break;\n }\n }\n }\n\n this._items = row_items;\n this._width_assumed = width_assumed_total;\n this._height_pixel = height_pixel_max;\n }\n\n\n /**\n * @summary 有効なオブジェクトか?\n * @desc\n *

無効のとき、他のメソッドは呼び出せない。

\n * @return {boolean} 有効のとき true, 無効のとき false\n */\n isValid()\n {\n return this._items.length > 0;\n }\n\n\n /**\n * \n * @type {array.}\n * @readonly\n */\n get items()\n {\n return this._items;\n }\n\n\n /**\n * キャンバス上での行の横占有画素数\n * @type {number}\n * @readonly\n */\n get width_assumed()\n {\n return this._width_assumed;\n }\n\n\n /**\n * キャンバス上での行の縦画素数\n * @type {number}\n * @readonly\n */\n get height_pixel()\n {\n return this._height_pixel;\n }\n\n\n /**\n * @summary レイアウトの配置を決定\n * @param {number} y テキスト矩形上辺の Y 座標 (キャンバス座標系)\n */\n locate( y )\n {\n var items = this._items;\n var x = 0;\n\n x += ImageIconEntity.SAFETY_PIXEL_MARGIN; // 左マージン\n\n for ( var i = 0; i < items.length; ++i ) {\n var item = items[i];\n item.locate( x, y );\n x += item.width_pixel + ImageIconEntity.SAFETY_PIXEL_MARGIN; // テキスト幅 + 右マージン\n }\n }\n\n}\n\n\n\n\nexport default ImageIconEntity;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","import Loader from \"./Loader\"\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport CredentialMode from \"./CredentialMode\";\nimport MarkerLineEntity from \"./MarkerLineEntity\";\nimport PolygonEntity from \"./PolygonEntity\";\nimport PinEntity from \"./PinEntity\";\nimport Resource, { URLResource, ResourceType } from \"./Resource\";\nimport AltitudeMode from \"./AltitudeMode\";\n\n/**\n * GeoJSON形式(
rfc7946)のデータをシーンに読み込みます。\n * @memberof mapray\n */\nclass GeoJSONLoader extends Loader {\n\n /**\n * @desc\n *

url で指定したシーンデータの読み込みを開始し、scene にエンティティを構築する。

\n *

読み込みが終了したとき options.callback を呼び出す。

\n * @param {mapray.Scene} scene 読み込み先のシーン\n * @param {string} resource シーンファイルの URL\n * @param {object} [options] オプション集合\n * @param {mapray.Loader.TransformCallback} [options.transform] リソース要求変換関数\n * @param {mapray.GeoJSONLoader.FinishCallback} [options.callback] 終了コールバック関数\n * @param {mapray.Loader.EntityCallback} [options.onEntity] エンティティコールバック関数\n */\n constructor( scene, resource, options={} )\n {\n if (resource instanceof Resource) {\n // OK\n }\n else if ( typeof resource === \"string\" ) {\n resource = new URLResource(resource, {\n type: \"json\",\n transform: options.transform\n });\n }\n else {\n throw new Error( \"Unsupported Resource: \" + resource);\n }\n\n super( scene, resource, {\n onEntity: options.onEntity,\n onLoad: options.onLoad\n } );\n\n // PinEntity\n this._getPointFGColor = options.getPointFGColor || defaultGetPointFGColorCallback;\n this._getPointBGColor = options.getPointBGColor || defaultGetPointBGColorCallback;\n this._getPointSize = options.getPointSize || defaultGetPointSizeCallback;\n this._getPointIconId = options.getPointIconId || defaultGetPointIconIdCallback;\n\n // MarkerLineEntity\n this._getLineColor = options.getLineColor || defaultGetLineColorCallback;\n this._getLineWidth = options.getLineWidth || defaultGetLineWidthCallback;\n\n // PolygonEntity\n this._getFillColor = options.getFillColor || defaultGetFillColorCallback;\n this._getExtrudedHeight = options.getExtrudedHeight || defaultGetExtrudedHeightCallback;\n\n // Common\n this._getAltitudeMode = options.getAltitudeMode || defaultGetAltitudeModeCallback;\n this._getAltitude = options.getAltitude || defaultGetAltitudeCallback;\n\n this._glenv = scene.glenv;\n this._references = {};\n this._cancelled = false;\n this._finished = false;\n }\n\n\n /**\n * @summary 読み込み処理の実態。継承クラスによって実装される。\n * @private\n */\n _load()\n {\n return (\n this._resource.load( { type: ResourceType.JSON } )\n .then( geoJson => {\n // JSON データの取得に成功\n this._check_cancel();\n this._load_geojson_object( geoJson );\n } )\n );\n }\n\n\n /**\n * Load GeoJSON Object\n * @private\n */\n _load_geojson_object( geojson )\n {\n var success;\n if ( geojson.type === TYPES.FEATURE_COLLECTION ) {\n var features = geojson.features;\n success = false;\n for ( var i = 0, len = features.length; i < len; i++ ) {\n var feature = features[i];\n var s = this._load_geojson_object( feature.featureId ? feature.feature : feature ); // @ToDo: Unknown\n // var s = this._load_geojson_object( feature );\n if (s && !success) success = s;\n }\n }\n else if ( geojson.type === TYPES.FEATURE ) {\n var geometry = geojson.geometry;\n success = this._load_geometry_object( geometry, geojson );\n }\n else if ( SUPPORTED_GEOMETRY_TYPES.indexOf( geojson.type ) !== -1 ) {\n success = this._load_geometry_object( geojson, null );\n }\n else {\n throw new Error( \"Unnsupported Type: \" + geojson.type );\n }\n \n if ( this._cancelled ) return false;\n\n return success;\n }\n\n\n /**\n * Load Geometry Object\n * @private\n */\n _load_geometry_object( geometry, geojson={} ) {\n var coords = geometry.coordinates;\n\n if (!coords && !geometry) {\n return false;\n }\n \n switch ( geometry.type ) {\n case GEOMETRY_TYPES.POINT:\n case GEOMETRY_TYPES.MULTI_POINT:\n return this._loadPoint( geometry, geojson );\n\n case GEOMETRY_TYPES.LINE_STRING:\n case GEOMETRY_TYPES.MULTI_LINE_STRING:\n return this._loadLines( geometry, geojson );\n\n case GEOMETRY_TYPES.POLYGON:\n case GEOMETRY_TYPES.MULTI_POLYGON:\n return this._loadPolygons( geometry, geojson );\n\n case GEOMETRY_TYPES.GEOMETRY_COLLECTION:\n return true;\n\n default:\n throw new Error( \"Invalid GeoJSON type: \" + geometry.type );\n }\n }\n\n\n /**\n * fetch() の init 引数に与えるオブジェクトを生成\n * @private\n */\n _make_fetch_params( tr )\n {\n var init = {\n signal: this._abort_ctrl.signal,\n credentials: (tr.credentials || CredentialMode.OMIT).credentials\n };\n\n if ( tr.headers ) {\n init.headers = (tr.headers || GeoJSONLoader._defaultHeaders);\n }\n\n return init;\n }\n\n\n /**\n * @private\n */\n _loadLines( geometry, geojson ) \n {\n const color4 = this._getLineColor( geojson );\n const width = this._getLineWidth( geojson );\n const altitude = this._getAltitude( geojson );\n const altitude_mode = this._getAltitudeMode( geojson );\n \n if ( !geometry || color4.length !== 4 ) {\n return false;\n }\n var type = geometry.type;\n var coords = geometry.coordinates;\n var rgb = color4.slice(0, 3);\n var alpha = color4[3];\n\n // If multiline, split entity\n if ( type === GEOMETRY_TYPES.MULTI_LINE_STRING ) {\n coords.forEach( points => {\n if ( !this._generateLine( points, width, rgb, alpha, altitude_mode, altitude, geojson ) ) {\n return false;\n }\n });\n return true;\n }\n else { // type === GEOMETRY_TYPES.LINE_STRING\n return this._generateLine( coords, width, rgb, alpha, altitude_mode, altitude, geojson )\n }\n }\n\n\n /**\n * @private\n */\n _generateLine( points, width, color, opaticy, altitude_mode, altitude, geojson )\n {\n if ( !points ) {\n return false;\n }\n\n var entity = new MarkerLineEntity( this._scene );\n entity.altitude_mode = altitude_mode;\n var fp = this._flatten( points, altitude );\n entity.addPoints( fp );\n entity.setLineWidth( width );\n entity.setColor( color );\n entity.setOpacity( opaticy );\n this._onEntity( this, entity, geojson );\n\n return true;\n }\n\n\n /**\n * @private\n */\n _loadPoint( geometry, geojson )\n {\n const fgColor = this._getPointFGColor( geojson );\n const bgColor = this._getPointBGColor( geojson );\n const iconId = this._getPointIconId( geojson );\n const size = this._getPointSize( geojson );\n const altitude_mode = this._getAltitudeMode( geojson );\n const altitude = this._getAltitude( geojson );\n \n if ( !geometry ) {\n return false;\n }\n var type = geometry.type;\n\n\n var props = {\n \"fg_color\": fgColor.slice( 0, 3 ),\n \"bg_color\": bgColor.slice( 0, 3 ),\n size: size,\n };\n\n // If multiline, split entity\n if ( type === GEOMETRY_TYPES.POINT ) {\n var entity = new PinEntity( this._scene );\n entity.altitude_mode = altitude_mode;\n var alt = this._getActualValue( altitude, geometry.coordinates[2], GeoJSONLoader.defaultAltitude );\n var coords = new GeoPoint( geometry.coordinates[0], geometry.coordinates[1], alt );\n if ( iconId !== null ) {\n entity.addMakiIconPin( iconId, coords, props );\n }\n else {\n entity.addPin( coords, props );\n }\n this._onEntity( this, entity, geojson );\n }\n else { // type === GEOMETRY_TYPES.MULTI_POINT\n var entity = new PinEntity( this._scene );\n entity.altitude_mode = altitude_mode;\n for ( var i = 0; i < geometry.coordinates.length; i++ ) {\n var targetCoordinates = geometry.coordinates[i];\n var alt = this._getActualValue( altitude, geometry.coordinates[2], GeoJSONLoader.defaultAltitude );\n var coords = new GeoPoint( targetCoordinates[0], targetCoordinates[1], alt );\n if ( iconId !== null ) {\n entity.addMakiIconPin( iconId, coords, props );\n // entity.addPin( coords, props );\n }\n else {\n entity.addPin( coords, props );\n }\n }\n this._onEntity( this, entity, geojson );\n }\n\n return true;\n }\n\n\n /**\n * @private\n */\n _loadPolygons( geometry, geojson )\n {\n const color4 = this._getFillColor( geojson );\n const altitude_mode = this._getAltitudeMode( geojson );\n const altitude = this._getAltitude( geojson );\n const extruded_height = this._getExtrudedHeight( geojson );\n\n if ( !geometry || color4.length !== 4 ) {\n return false;\n }\n var type = geometry.type;\n var coords = geometry.coordinates;\n var rgb = color4.slice(0, 3);\n var alpha = color4[3];\n\n // If multiline, split entity\n if ( type === GEOMETRY_TYPES.MULTI_POLYGON ) {\n coords.forEach( points => {\n if ( !this._generatePolygon( points, rgb, alpha, altitude_mode, altitude, extruded_height, geojson ) ) {\n return false;\n }\n });\n return true;\n }\n else { // type === GEOMETRY_TYPES.POLYGON\n return this._generatePolygon( coords, rgb, alpha, altitude_mode, altitude, extruded_height, geojson )\n }\n }\n\n\n /**\n * @private\n */\n _generatePolygon( pointsList, color, opaticy, altitude_mode, altitude, extruded_height, geojson ) \n {\n if ( !pointsList ) {\n return false;\n }\n\n const entity = new PolygonEntity( this._scene );\n entity.altitude_mode = altitude_mode;\n entity.extruded_height = extruded_height;\n entity.setColor( color );\n entity.setOpacity( opaticy );\n for ( let i=0; i< pointsList.length; i++ ) {\n const fp = this._flatten( pointsList[ i ], altitude, pointsList[ i ].length-1 );\n if ( !fp ) return false;\n if ( i === 0 ) entity.addOuterBoundary( fp );\n else entity.addInnerBoundary( fp );\n }\n this._onEntity( this, entity, geojson );\n \n return true;\n }\n\n\n /**\n * @private\n */\n _getActualValue( valueFromCallback, valueInGeoJSON, defaultValue ) {\n return (\n valueFromCallback != null ? valueFromCallback: // value from callback is the most prioritized\n valueInGeoJSON != null ? valueInGeoJSON: // value in GeoJSON will be used if defined\n defaultValue // default value\n );\n }\n\n\n /**\n * @private\n */\n _flatten( ary, altitude, len=ary.length )\n {\n return ary.reduce( (p, c, i) => (\n i >= len ? p :\n p.concat( c.slice(0, 2), this._getActualValue( altitude, c[2], GeoJSONLoader.defaultAltitude ) )\n ), [] );\n };\n}\n\n\n\n{\n GeoJSONLoader._defaultHeaders = {};\n GeoJSONLoader.defaultLineColor = [0, 0, 0, 1];\n GeoJSONLoader.defaultFillColor = [0, 0, 0, 1];\n GeoJSONLoader.defaultLineWidth = 1;\n GeoJSONLoader.defaultPointFGColor = [1.0, 1.0, 1.0];\n GeoJSONLoader.defaultPointBGColor = [0.35, 0.61, 0.81];\n GeoJSONLoader.defaultPointSize = 30;\n GeoJSONLoader.defaultPointIconId = null;\n GeoJSONLoader.defaultAltitude = 0.0;\n GeoJSONLoader.defaultExtrudedHeight = 0.0;\n}\n\n\n\nfunction defaultGetLineColorCallback( geojson )\n{\n return GeoJSONLoader.defaultLineColor;\n}\n\nfunction defaultGetLineWidthCallback( geojson ) \n{\n return GeoJSONLoader.defaultLineWidth;\n}\n\nfunction defaultGetFillColorCallback( geojson )\n{\n return GeoJSONLoader.defaultFillColor;\n}\n\n\nfunction defaultGetPointFGColorCallback( geojson )\n{\n return GeoJSONLoader.defaultPointFGColor;\n}\n\nfunction defaultGetPointBGColorCallback( geojson )\n{\n return GeoJSONLoader.defaultPointBGColor;\n}\n\nfunction defaultGetPointSizeCallback( geojson )\n{\n return GeoJSONLoader.defaultPointSize;\n}\n\nfunction defaultGetPointIconIdCallback( geojson )\n{\n return GeoJSONLoader.defaultPointIconId;\n}\n\n\nfunction defaultGetAltitudeModeCallback( geojson )\n{\n return AltitudeMode.ABSOLUTE;\n}\nfunction defaultGetAltitudeCallback( geojson )\n{\n return null;\n}\n\nfunction defaultGetExtrudedHeightCallback( geojson )\n{\n return GeoJSONLoader.defaultExtrudedHeight;\n}\n\n\nvar TYPES = {\n FEATURE: \"Feature\",\n FEATURE_COLLECTION: \"FeatureCollection\",\n};\n\nvar GEOMETRY_TYPES = {\n POINT: \"Point\",\n MULTI_POINT: \"MultiPoint\",\n LINE_STRING: \"LineString\",\n MULTI_LINE_STRING: \"MultiLineString\",\n POLYGON: \"Polygon\",\n MULTI_POLYGON: \"MultiPolygon\",\n GEOMETRY_COLLECTION: \"GeometryCollection\",\n FEATURE: \"Feature\"\n};\n\nvar SUPPORTED_GEOMETRY_TYPES = Object.values( GEOMETRY_TYPES );\n\nexport default GeoJSONLoader;\n","/**\n * @summary デバッグ統計\n * @classdesc\n *

エンジン開発用の統計オブジェクトである。

\n *

NOTE: オブジェクトの振舞いはエンジンの実装に依存するため、一般アプリの開発では使用できない。

\n * @memberof mapray\n */\nclass DebugStats {\n\n /**\n */\n constructor()\n {\n /**\n * @summary リクエスト待ちの DEM 数\n * @member mapray.DebugStats#num_wait_reqs_dem\n * @type {number}\n */\n\n /**\n * @summary リクエスト待ちの画像数\n * @member mapray.DebugStats#num_wait_reqs_img\n * @type {number}\n */\n\n /**\n * @summary 描画地表断片数\n * @member mapray.DebugStats#num_drawing_flakes\n * @type {number}\n */\n\n /**\n * @summary 描画地表断頂点数\n * @member mapray.DebugStats#num_drawing_flake_vertices\n * @type {number}\n */\n\n /**\n * @summary 地表断片処理 A の数\n * @member mapray.DebugStats#num_procA_flakes\n * @type {number}\n */\n\n /**\n * @summary 地表断片処理 B の数\n * @member mapray.DebugStats#num_procB_flakes\n * @type {number}\n */\n\n this.clearStats();\n }\n\n\n /**\n * 統計値をクリア\n * @package\n */\n clearStats()\n {\n this.num_wait_reqs_dem = 0;\n this.num_wait_reqs_img = 0;\n this.num_drawing_flakes = 0;\n this.num_drawing_flake_vertices = 0;\n this.num_procA_flakes = 0;\n this.num_procB_flakes = 0;\n }\n\n\n /**\n * @summary 更新が完了したときに呼び出される\n * @abstract\n */\n onUpdate()\n {\n }\n\n}\n\n\nexport default DebugStats;\n","var global = require('../internals/global');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar $parseInt = global.parseInt;\nvar hex = /^[+-]?0[Xx]/;\nvar FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22;\n\n// `parseInt` method\n// https://tc39.github.io/ecma262/#sec-parseint-string-radix\nmodule.exports = FORCED ? function parseInt(string, radix) {\n var S = trim(String(string));\n return $parseInt(S, (radix >>> 0) || (hex.test(S) ? 16 : 10));\n} : $parseInt;\n","var $ = require('../internals/export');\nvar parseIntImplementation = require('../internals/number-parse-int');\n\n// `parseInt` method\n// https://tc39.github.io/ecma262/#sec-parseint-string-radix\n$({ global: true, forced: parseInt != parseIntImplementation }, {\n parseInt: parseIntImplementation\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeEndsWith = ''.endsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('endsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'endsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.endsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.endswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : min(toLength(endPosition), len);\n var search = String(searchString);\n return nativeEndsWith\n ? nativeEndsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","import GeoPoint from \"./GeoPoint\";\n\n/**\n * @summary データセットを表現する抽象クラス\n */\nexport class AbstractDataset {\n\n /**\n * @param {MaprayApi} api\n */\n constructor( api ) {\n this._aip = api;\n }\n\n /**\n * @summary データセットのidを取得\n * @return {string}\n */\n getId() {\n return this._id;\n }\n\n /**\n * @summary オーナーのidを取得\n * @return {string}\n */\n getOwnerId() {\n return this._owner_id;\n }\n\n /**\n * @summary 名前を取得\n * @return {string}\n */\n getName() {\n return this._name;\n }\n\n /**\n * @summary 説明を取得\n * @return {string}\n */\n getDescription() {\n return this._description;\n }\n\n /**\n * @summary 作成日時を取得\n * @return {Date}\n */\n getCreatedAt() {\n return this._created_at;\n }\n\n /**\n * @summary 更新日時を取得\n * @return {Date}\n */\n getUpdatedAt() {\n return this._updated_at;\n }\n\n /**\n * @private\n * @param {json} サーバから返却されたjson\n */\n _restoreFromJson( json ) {\n this._id = json.id;\n this._owner_id = json.owner_id;\n this._name = json.name;\n this._description = json.description;\n this._created_at = new Date(json.created_at);\n this._updated_at = new Date(json.updated_at);\n }\n}\n\n\n\n/**\n * @summary データセットを表現するクラス\n */\nexport class Dataset extends AbstractDataset {\n\n /**\n * @param {MaprayApi} api\n */\n constructor( api ) {\n super( api );\n }\n\n /**\n * @private\n * @param {json} サーバから返却されたjson\n */\n _restoreFromJson( json ) {\n super._restoreFromJson( json );\n }\n\n /**\n * @private\n * @param {MaprayApi} api\n * @param {json} サーバから返却されたjson\n * @return {Dataset}\n */\n static createFromJson( api, json ) {\n const dataset = new Dataset( api );\n dataset._restoreFromJson( json );\n return dataset;\n }\n}\n\n\n\n/**\n * @summary 3Dデータセットを表現するクラス\n */\nexport class Dataset3D extends AbstractDataset {\n\n /**\n * @param {MaprayApi} api\n */\n constructor( api ) {\n super( api );\n }\n\n /**\n * @summary 原点位置\n * @return {mapray.GeoPoint}\n */\n getOrigin() {\n return this._origin;\n }\n\n /**\n * @summary モデルが公開されているURL\n * @return {string}\n */\n getUrl() {\n return this._url;\n }\n\n /**\n * @summary フォーマット\n * @private\n * @return {string}\n */\n getFormat() {\n return this._format;\n }\n\n /**\n * @summary シーンID\n * @private\n * @return {string}\n */\n getSceneId() {\n return this._scene_id;\n }\n\n /**\n * @summary Path\n * @private\n * @return {string}\n */\n getPath() {\n return this._path;\n }\n\n /**\n * @summary SRID\n * @private\n * @return {string}\n */\n getSRID() {\n return this._srid;\n }\n\n /**\n * @private\n * @param {json} サーバから返却されたjson\n */\n _restoreFromJson( json ) {\n /* missing options\n \"x\": 137.715,\n \"y\": 34.71111,\n \"z\": 0,\n \"roll\": 0,\n \"tilt\": 0,\n \"heading\": 0,\n \"sx\": 1,\n \"sy\": 1,\n \"sz\": 1,\n \"offset_x\": 0,\n \"offset_y\": 0,\n \"offset_z\": 0,\n \"offset_roll\": 0,\n \"offset_tilt\": 0,\n \"offset_heading\": 0,\n \"offset_sx\": 1,\n \"offset_sy\": 1,\n \"offset_sz\": 1,\n \"altitude_mode\": \"absolute\",\n */\n super._restoreFromJson( json );\n this._url = json.url;\n this._scene_id = json.scene_id;\n this._path = json.path;\n this._format = json.format;\n this._srid = json.srid;\n this._origin = new GeoPoint(json.x, json.y, json.z);\n }\n\n /**\n * @private\n * @param {MaprayApi} api\n * @param {json} サーバから返却されたjson\n * @return {Dataset3D}\n */\n static createFromJson( api, json ) {\n const dataset = new Dataset3D( api );\n dataset._restoreFromJson( json );\n return dataset;\n }\n}\n\n\n\n/**\n * @summary 点群データセットを表現するクラス\n */\nexport class PointCloudDataset extends AbstractDataset {\n\n /**\n * @param {MaprayApi} api\n */\n constructor( api ) {\n super( api );\n }\n\n /**\n * @summary 点群ファイルが公開されているURLを取得\n */\n getUrl() {\n return this._url;\n }\n\n /**\n * @summary 点群のバウンディングボックスを取得\n */\n getBoundingBox() {\n return this._bounding_box;\n }\n\n /**\n * @summary 1レベルに1ボックスしか存在しないボックスの中で最も高いレベルのボックス。\n * (点群に含まれる全ての点を包含するボックスの中で最も高いレベルのボックス)\n * @return string\n */\n getContentRoot() {\n return this._content_root;\n }\n\n /**\n * @summary フォーマット(現在はrawのみ対応)\n * @return string\n */\n getFormat() {\n return this._format;\n }\n\n /**\n * @private\n * @param {json} サーバから返却されたjson\n */\n _restoreFromJson( json ) {\n super._restoreFromJson( json );\n // this._srid = json.srid;\n this._url = json.url;\n this._bounding_box = json.bbox;\n this._content_root = Array.isArray(json.content_root) ? json.content_root.join(\"/\") : json.content_root;\n this._format = json.format;\n }\n\n /**\n * @private\n * @param {MaprayApi} api\n * @param {json} サーバから返却されたjson\n * @return {PointCloudDataset}\n */\n static createFromJson( api, json ) {\n const dataset = new PointCloudDataset( api );\n dataset._restoreFromJson( json );\n return dataset;\n }\n}\n","import HTTP from \"./HTTP\";\nimport Dom from \"./util/Dom\";\nimport Resource, { ResourceType } from \"./Resource\";\n\n\n\n/**\n * @summary Mapray Cloudに登録されたデータにおいて、URLアクセスを要するリソースを表現する。\n *

\n *
index.htmlのように基準となるファイルを指定し、そのファイルからの相対パスでサブリソースへアクセスする。\n *
\n * コンストラクタで基準となるファイルを指定し、load()はこのファイルを読み込む。\n * loadSubResource( sub_url )は、sub_urlが相対パスの場合は基準となるファイルからの相対パスとして解釈される。\n *
ルートパスを指定し配下のリソースへアクセスする。\n *
\n * コンストラクタで基準となるURLを指定する。この時、URLは必ず/で終了する必要があり、load()は動作が定義されない。\n * loadSubResource( sub_url )は、sub_urlが相対パスの場合は基準となるURLからの相対パスとして解釈される。\n *
\n * @private\n */\nclass ApiUrlResource extends Resource {\n\n /**\n * @param {MaprayApi} api\n * @param {string} url\n */\n constructor( api, url ) {\n const index = url.lastIndexOf( \"/\" );\n if ( index === -1 ) throw new Error( \"invalid url\" );\n //super( api, url.substr( 0, index + 1 ) );\n super();\n this._api = api;\n this._url = url;\n this._base_url = url.substr( 0, index + 1 )\n }\n\n /**\n * @param {object} options\n * @override\n */\n async load( options={} ) {\n const response = await this._api.fetch( HTTP.METHOD.GET, this._url );\n return (\n options.type === ResourceType.JSON ? await response.json():\n response\n );\n }\n\n /**\n * @override\n */\n loadSubResourceSupported() {\n return true;\n }\n\n /**\n * @summary リソースにアクセスする。sub_urlは相対・絶対の両方に対応。\n * @override\n * @param {string} sub_url\n * @return {Resource}\n */\n async loadSubResource( sub_url, options={} ) {\n const url = Dom.resolveUrl( this._base_url, sub_url );\n const response = await this._api.fetch( HTTP.METHOD.GET, url );\n if ( !response.ok ) throw new Error( response.statusText );\n return (\n options.type === ResourceType.BINARY ? await response.arrayBuffer():\n options.type === ResourceType.IMAGE ? await Dom.loadImage( await response.blob() ):\n response\n );\n }\n}\n\n\n\n/**\n * Mapray Cloudに登録されたDatasetを表現するリソース。\n */\nexport class DatasetResource extends Resource {\n constructor( api, datasetId ) {\n super();\n this._api = api;\n this._datasetId = datasetId;\n }\n\n /**\n * @return {Promise(object)} データ(geojson)\n */\n async load() {\n return await this._api.getFeatures( this._datasetId );\n }\n}\n\n\n\n/**\n * Mapray Cloudに登録された3DDatasetのモデルを表現するリソース。\n */\nexport class Dataset3DSceneResource extends Resource {\n\n /**\n * @param {MaprayApi} api\n * @param {string|string[]} datasetIds データセットのid。複数指定する場合は配列を指定する。\n */\n constructor( api, datasetIds ) {\n super();\n this._api = api;\n this._datasetIds = Array.isArray( datasetIds ) ? datasetIds : [ datasetIds ];\n }\n\n /**\n * @return {Promise(object)} シーンファイル(json)\n */\n async load() {\n return await this._api.get3DDatasetScene( this._datasetIds );\n }\n\n /**\n * @protected\n */\n resolveResourceSupported() {\n return true;\n }\n\n /**\n * @summary シーンファイルに含まれるモデル及びモデルに関連づけられたリソースへアクセス際に利用されるResource。\n * @param {string} sub_url モデルURL\n * @return {Resource} \n */\n resolveResource( sub_url ) {\n return new ApiUrlResource( this._api, sub_url );\n }\n}\n\n\n\n/**\n * Mapray Cloudに登録されたPoint Cloud Datasetを表現するリソース。\n */\nexport class PointCloudDatasetResource extends Resource {\n\n /**\n * @param {MaprayApi} api\n * @param {string} datasetId データセットのid\n */\n constructor( api, datasetId ) {\n super();\n this._api = api;\n this._datasetId = datasetId;\n }\n\n /**\n * @return {Promise} 点群定義(json)\n */\n async load() {\n return await this._api.getPointCloudDataset( this._datasetId );\n }\n\n /**\n * @protected\n */\n resolveResourceSupported() {\n return true;\n }\n\n /**\n * @param {string} sub_url 点群が公開されているURLへアクセスするためのResource。\n * @return {Resource} 点群ファイルリソース\n */\n resolveResource( sub_url ) {\n return new ApiUrlResource( this._api, sub_url );\n }\n}\n","import HTTP, { FetchError } from \"./HTTP\";\nimport { Dataset, Dataset3D, PointCloudDataset } from \"./MaprayApiModel\";\nimport { DatasetResource, Dataset3DSceneResource, PointCloudDatasetResource, } from \"./MaprayApiResource\";\n\n\n\nclass MaprayApiError extends FetchError {\n constructor( code, message, url, response, cause )\n {\n super( message + \" [\" + code + \"]\", url );\n if ( Error.captureStackTrace ) {\n Error.captureStackTrace( this, MaprayApiError );\n }\n this.name = \"MaprayApiError\";\n this.code = code;\n this.resonse = response;\n this.cause = cause;\n if (cause) {\n this.stack += \"\\nCaused-By: \" + cause.stack;\n }\n }\n}\n\n\n\n/**\n * @summary Mapray Cloudへアクセスするためのクラスです。\n * @classdesc\n *

\n * このクラスを利用するには事前にMapray Cloudアカウントを作成する必要があります。\n * https://cloud.mapray.comからサインアップすることができます。\n *

\n *

\n * 事前に下記の情報を調べておきます。\n *

\n *
\n *
User ID\n *
Mapray Cloudのユーザー情報ページから確認します。\n * 右上メニューのAccountメニューからこのページを開くことができます。\n *
Token\n *
Mapray CloudのTokenページでトークンを作成します。\n * 上部のTokensタブからこのページを開くことができます。\n *
データセット等のID\n *
Mapray Cloudへデータをアップロードし、そのデータを使用するには、データセットページ\n * からGeoJsonやglTFデータをアップロードしておき、表中のIDを確認します。\n *
\n *\n * @memberof mapray\n * @example\n * const maprayApi = new mapray.MaprayApi({\n * basePath: \"https://api.mapray.com\",\n * version: \"v1\",\n * userId: \"...\",\n * token: \"...\"\n * });\n * const datasets = await maprayApi.getDatasets();\n * ...\n */\nclass MaprayApi extends HTTP {\n\n /**\n * @param {object} option\n * @param {string} [option.basePath=https://cloud.mapray.com] Mapray CloudのURLを指定します。通常は省略します。\n * @param {string} option.version Mapray Cloud の APIバージョン \"v1\" のように指定します。\n * @param {string} option.userId Mapray Cloud アカウントの User ID を指定します。\n * @param {string} option.token Mapray Cloud で生成した Token を指定します。\n */\n constructor( option = {} )\n {\n super();\n var basePath = option.basePath.endsWith(\"/\") ? option.basePath.slice(0, -1) : option.basePath;\n this._option = {\n basePath: basePath || DEFAULT_BASE_PATH,\n version: option.version,\n token: option.token,\n userId: option.userId\n };\n }\n\n\n // Dataset, 3DDataset, PointCloudDataset\n\n /**\n * @summary データセットのリストを取得します。\n * ページごとにデータセットリストを取得します。\n * @param {number} [page=1] 取得する要素のページ番号\n * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。\n * @return {Dataset[]}\n */\n async loadDatasets( page=1, limit=5 ) {\n const datasets_json = await this.getDatasets( page, limit );\n return datasets_json.map( dataset_json => Dataset.createFromJson( this, dataset_json ) );\n }\n\n /**\n * @summary 指定したIDのデータセットを取得します。\n * @param {string} datasetId データセットのID\n * @return {Dataset}\n */\n async loadDataset( datasetId ) {\n const dataset_json = await this.getDataset( datasetId );\n return Dataset.createFromJson( this, dataset_json );\n }\n\n /**\n * @summary 3Dデータセットのリストを取得します。\n * ページごとにデータセットリストを取得します。\n * @param {number} [page=1] 取得する要素のページ番号\n * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。\n * @return {Dataset3D[]}\n */\n async load3DDatasets( page=1, limit=5 ) {\n const datasets_json = await this.get3DDatasets( page, limit );\n return datasets_json.map( dataset_json => Dataset3D.createFromJson( this, dataset_json ) );\n }\n\n /**\n * @summary 指定したIDの3Dデータセットを取得します。\n * @param {string} datasetId\n * @return {Dataset3D}\n */\n async load3DDataset( datasetId ) {\n const dataset_json = await this.get3DDataset( datasetId );\n return Dataset3D.createFromJson( this, dataset_json )\n }\n\n /**\n * @summary 点群データセットのリストを取得します。\n * ページごとにデータセットリストを取得します。\n * @param {number} [page=1] 取得する要素のページ番号\n * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。\n * @return {PointCloudDataset[]}\n */\n async loadPointCloudDatasets( page=1, limit=5 ) {\n const datasets_json = await this.getPointCloudDatasets( page, limit );\n return datasets_json.map( dataset_json => PointCloudDataset.createFromJson( this, dataset_json ) );\n }\n\n /**\n * @summary 指定したIDの点群データセットを取得します。\n * @param {string} datasetId データセットID\n * @return {PointCloudDataset}\n */\n async loadPointCloudDataset( datasetId ) {\n const dataset_json = await this.getPointCloudDataset( datasetId );\n return PointCloudDataset.createFromJson( this, dataset_json );\n }\n\n\n // Resources\n\n /**\n * @summary 指定したIDのデータセットをリソースとして取得します。\n * @param {string} datasetId データセットID\n * @return {Resource}\n */\n getDatasetAsResource( datasetId ) {\n return new DatasetResource( this, datasetId );\n }\n\n /**\n * @summary 指定したIDの3Dデータセットのシーンファイルをリソースとして取得します。\n * @param {string[]} datasetId データセットIDのリスト\n * @return {Resource}\n */\n get3DDatasetAsResource( datasetIds ) {\n return new Dataset3DSceneResource( this, datasetIds );\n }\n\n /**\n * @summary 指定したIDの点群データセットの定義ファイルをリソースとして取得します。\n * @param {string} datasetId データセットID\n * @return {Resource}\n */\n getPointCloudDatasetAsResource( datasetId ) {\n return new PointCloudDatasetResource( this, datasetId );\n }\n\n\n // RestAPI\n\n /**\n * @summary データセットリストを取得します\n * @param {number} [page=1] 取得する要素のページ番号\n * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。\n * @return {object} json\n */\n async getDatasets( page=1, limit=5 )\n {\n var opt = this._option;\n return await this.get( \"datasets\", [ opt.userId ], { page, limit } );\n }\n\n /**\n * @summary get dataset\n * @param {string} datasetId\n * @return {object} json\n */\n async getDataset( datasetId )\n {\n var opt = this._option;\n return await this.get( \"datasets\", [ opt.userId, datasetId ], null );\n }\n\n /**\n * @summary データセットを作成します。\n * @param {string} name 名前\n * @param {string} description 説明\n * @return {object}\n */\n async createDataset( name, description )\n {\n var opt = this._option;\n var body = {\n name,\n description\n };\n return await this.post( \"datasets\", [ opt.userId ], null, body );\n }\n\n /**\n * @summary データセットを削除します。\n * @return {object} json\n */\n async deleteDataset( datasetId/*, option={ wait: true }*/ )\n {\n var opt = this._option;\n return await this.delete( \"datasets\", [ opt.userId, datasetId ] );\n }\n\n /**\n * @summary GeoJSONの内容を取得します。\n * @param {string} datasetId データセットID\n * @return {object} json\n */\n async getFeatures( datasetId ) {\n var opt = this._option;\n return await this.get( \"datasets\", [ opt.userId, datasetId, \"features\" ] );\n }\n\n /**\n * @summary GeoJSON要素をアップロード(挿入)します。\n * @param {string} datasetId データセットID\n * @return {object} json\n */\n async insertFeature( datasetId, feature ) {\n var opt = this._option;\n return await this.post( \"datasets\", [ opt.userId, datasetId, \"features\" ], null, feature );\n }\n\n /**\n * @summary GeoJSON要素を更新(上書き)します。\n * @param {string} datasetId データセットID\n * @param {string} featureId GeoJSON要素ID\n * @param {object} feature GeoJSON要素\n * @return {object} json\n */\n async updateFeature( datasetId, featureId, feature )\n {\n var opt = this._option;\n return await this.put( \"datasets\", [ opt.userId, \"features\", featureId ], null, feature );\n }\n\n /**\n * @summary 3Dデータセットのリストを取得します。\n * @param {number} [page=1] 取得する要素のページ番号\n * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。\n * @return {object} json\n */\n async get3DDatasets( page=1, limit=5 ) {\n const opt = this._option;\n return await this.get( \"3ddatasets\", [ opt.userId ], { page, limit } );\n }\n\n /**\n * @summary 3D datastを作成します。\n * @param {string} name 名前\n * @param {string} description 説明\n * @param {object} option\n * @param {string} option.path glTFファイルのパスを指定します(アップロードする際はディレクトリを指定するため、ディレクトリルートからのglTFファイルへのパスを指定します)\n * @param {string} option.format \"glTF\"を指定します\n * @param {string} option.srid 現在は4326(WGS 84)を指定します\n * @param {number} option.x 経度\n * @param {number} option.y 緯度\n * @param {number} option.z 高さ\n * @return {object} json\n */\n async create3DDataset( name, description, option ) {\n const opt = this._option;\n const body = {\n name,\n description,\n path: option.path,\n format: option.format,\n srid: option.srid,\n x: option.x,\n y: option.y,\n z: option.z\n };\n return await this.post( \"3ddatasets\", [ opt.userId ], null, body );\n }\n\n /**\n * @summary 3Dデータセットを更新します。\n * @param {string} datasetId データセットId\n * @param {string} name 名前\n * @param {string} description 説明\n * @param {object} option\n * @param {string} option.path glTFファイルのパスを指定します(アップロードする際はディレクトリを指定するため、ディレクトリルートからのglTFファイルへのパスを指定します)\n * @param {string} option.format \"glTF\"を指定します\n * @param {string} option.srid 現在は4326(WGS 84)を指定します\n * @param {number} option.x 経度\n * @param {number} option.y 緯度\n * @param {number} option.z 高さ\n * @return {object} json\n */\n async update3DDataset( datasetId, name, description, option ) {\n const opt = this._option;\n const body = {\n name,\n description,\n path: option.path,\n format: option.format,\n srid: option.srid,\n x: option.x,\n y: option.y,\n z: option.z\n };\n return await this.patch( \"3ddatasets\", [ opt.userId, datasetId ], null, body );\n }\n\n /**\n * @summary 3Dデータセットアップロード用URLを取得します。\n * @param {string} datasetId データセットId\n * @return {object} json\n */\n async create3DDatasetUploadUrl( datasetId ) {\n const opt = this._option;\n return await this.post( \"3ddatasets\", [ \"uploads\", opt.userId, datasetId ], null, {} );\n }\n\n /**\n * @summary 3Dデータセット情報を取得します。\n * データセットが保持するデータにアクセスするには、get3DDatasetScene()を利用します。\n * @param {string} datasetId データセットId\n * @return {object} json\n */\n async get3DDataset( datasetId ) {\n const opt = this._option;\n return await this.get( \"3ddatasets\", [ opt.userId, datasetId ], null );\n }\n\n /**\n * @summary 3Dデータセットを削除します。\n * @param {string} datasetId データセットId\n * @return {object} json\n */\n async delete3DDataset( datasetId ) {\n const opt = this._option;\n return await this.delete( \"3ddatasets\", [ opt.userId, datasetId ] );\n }\n\n /**\n * @summary 3Dデータセットに含まれる scene情報 を取得します。\n * @param {string|string[]} datasetIds\n * @return {object} シーンファイルの実体\n */\n async get3DDatasetScene( datasetIds ) {\n const opt = this._option;\n const response = await this.get( \"3ddatasets\", [ \"scene\", opt.userId ], { \"3ddatasets_ids\": Array.isArray(datasetIds) ? datasetIds.join(\",\") : datasetIds } );\n response.entity_list.forEach(entity => {\n const indexStr = entity.index;\n const index = parseInt(indexStr);\n if (index.toString() !== indexStr) {\n throw new Error(\"Internal Error: ID couldn't be convert to 'number'\");\n }\n entity.index = index;\n });\n return response;\n }\n\n /**\n * @summary 点群データセットリストを取得します。\n * @param {number} [page=1] 取得する要素のページ番号\n * @param {number} [limit=5] 1ページに含まれる要素数。最大100まで指定することができます。\n * @return {object} json\n */\n async getPointCloudDatasets( page=1, limit=5 ) {\n const opt = this._option;\n return await this.get( \"pcdatasets\", [ opt.userId ], { page, limit } );\n }\n\n /**\n * @summary 点群データセットを取得します。\n * @param {string} datasetId データセットId\n * @return {object} json\n */\n async getPointCloudDataset( datasetId ) {\n const opt = this._option;\n return await this.get( \"pcdatasets\", [ opt.userId, datasetId ] )\n }\n\n /**\n * @private\n * @return {object} json\n */\n async get( api, args, query, option={} )\n {\n return await this.fetchAPI( HTTP.METHOD.GET, api, args, query, null, option );\n }\n\n /**\n * @private\n * @return {object} json\n */\n async post( api, args, query, body, option={} )\n {\n if ( typeof( body ) !== \"string\" ) {\n body = JSON.stringify(body);\n }\n return await this.fetchAPI( HTTP.METHOD.POST, api, args, query, body, option );\n }\n\n /**\n * @private\n * @return {object} json\n */\n async patch( api, args, query, body, option={} )\n {\n if ( typeof( body ) !== \"string\" ) {\n body = JSON.stringify(body);\n }\n return await this.fetchAPI( HTTP.METHOD.PATCH, api, args, query, body, option );\n }\n\n /**\n * @private\n * @return {object} json\n */\n async put( api, args, query, body, option={} )\n {\n if ( typeof( body ) !== \"string\" ) {\n body = JSON.stringify(body);\n }\n return await this.fetchAPI( HTTP.METHOD.PUT, api, args, query, body, option );\n }\n\n /**\n * @private\n * @return {object} json\n */\n async delete( api, args, query, option={} )\n {\n return await this.fetchAPI( HTTP.METHOD.DELETE, api, args, query, null, option );\n }\n\n /**\n * @private\n * @return {object} json\n */\n async fetchAPI( method, api, args, query, body, option={} )\n {\n var opt = this._option;\n var url = opt.basePath + \"/\" + api + \"/\" + opt.version + (args.length > 0 ? \"/\" + args.join(\"/\") : \"\");\n // console.log( \"MaprayAPI: \" + method + \" \" + api + \" (\" + args.join(\"/\") + \")\" );\n const response = await this.fetch( method, url, query, body, option );\n return await response.json();\n }\n\n /**\n * @private\n */\n async fetch( method, url, query, body, option={} )\n {\n var opt = this._option;\n var headers = option.headers || (option.headers={});\n headers[\"x-api-key\"] = opt.token;\n\n let response;\n try {\n response = await HTTP.fetch( method, url, query, body, option );\n }\n catch( error ) {\n if ( error.name === \"FetchError\" && error.response ) {\n let errorResponseJson;\n try {\n errorResponseJson = await error.response.json();\n }\n catch( additionalError ) {\n // Couldn't get additional info of the error.\n // throw original error.\n throw new MaprayApiError( -1, \"Failed to fetch\", url, null, error );\n }\n throw new MaprayApiError( errorObject.code, errorObject.error, url, error.response, error );\n }\n else {\n throw new MaprayApiError( -1, \"Failed to fetch\", url, null, error );\n }\n }\n return response;\n }\n}\n\n\n\nMaprayApi.DEFAULT_BASE_PATH = \"https://cloud.mapray.com\";\n\n\n\nexport default MaprayApi;\n","/**\n * @summary 点群データプロバイダ\n *

このインスタンスには状態 ({@link mapray.PointCloudProvider.Status}型) があり、{@link mapray.PointCloudProvider.Status.INITIALIZED}以外の状態では新規に読み込み({@link mapray.PointCloudProvider#load})を行うことができない。

\n *\n *

以下の抽象メソッドは既定の動作がないので、利用者はこれらのメソッドをオーバーライドした具象クラスを使用しなければならない。

\n *
    \n *
  • {@link mapray.PointCloudProvider#doInit}
  • \n *
  • {@link mapray.PointCloudProvider#doLoad}
  • \n *
  • {@link mapray.PointCloudProvider#doDestroy}
  • \n *
\n *\n * @memberof mapray\n * @abstract\n * @protected\n */\nclass PointCloudProvider {\n\n constructor( option={} ) {\n this._status = PointCloudProvider.Status.NOT_INITIALIZED;\n }\n\n /**\n * @summary 初期化。\n * 継承クラスではdoInit()を継承する\n */\n async init() {\n if (this._status !== PointCloudProvider.Status.NOT_INITIALIZED) throw new Error(\"invalid status\");\n try {\n await this.doInit();\n this._status = PointCloudProvider.Status.INITIALIZED;\n }\n catch(e) {\n this._status = PointCloudProvider.Status.DESTROYED;\n throw e;\n }\n }\n\n /**\n * @summary リクエスト可能な状態かを返す。\n * 初期化が完了しているかだけではなく、現在処理中のリクエスト数も考慮した上でリクエスト可能な状態か判断する。\n * @return {boolean}\n * @protected\n */\n isReady() {\n return this._status == PointCloudProvider.Status.INITIALIZED && this.getNumberOfRequests() < 10;\n }\n\n /**\n * @summary 点群を読み込む\n * 継承クラスではdoLoad()を継承する\n * @param {number} level レベル\n * @param {number} x x\n * @param {number} y y\n * @param {number} z z\n * @returns {mapray.PointCloudProvider.Status.Request} request\n */\n load( level, x, y, z ) {\n if ( this._status !== PointCloudProvider.Status.INITIALIZED ) {\n return { id: -1, done: Promise.reject(new Error(\"invalid status\")) };\n }\n const id = PointCloudProvider._id_max++;\n return {\n id,\n done: this.doLoad( id, level, x, y, z ),\n }\n }\n\n flushQueue() {\n }\n\n toString() {\n return \"PointCloudProvider\";\n }\n\n /**\n * @summary 実行中のリクエストをキャンセルする\n * @param {number} id リクエストID\n */\n cancel( id ) {\n if ( this._status !== PointCloudProvider.Status.INITIALIZED ) throw new Error(\"invalid status\");\n console.log(\"cancel not implemented\");\n }\n\n /**\n * @summary 実行中のリクエスト数を返す\n * @abstract\n */\n getNumberOfRequests() {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @summary 破棄\n * 継承クラスではdoDestroy()を継承する\n */\n async destroy() {\n if ( this._status !== PointCloudProvider.Status.INITIALIZED ) throw new Error(\"invalid status\");\n try {\n await this.doDestroy();\n }\n finally {\n this._status = PointCloudProvider.Status.DESTROYED;\n }\n }\n\n /**\n * @summary 初期化を行う\n * @protected\n * @abstract\n */\n async doInit() {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @summary 読み込みを行う\n * @protected\n * @abstract\n * @param {number} id リクエストid\n * @param {number} level レベル\n * @param {number} x x\n * @param {number} y y\n * @param {number} z z\n */\n async doLoad( id, level, x, y, z ) {\n throw new Error(\"not implemented\");\n }\n\n /**\n * @summary 破棄を行う\n * @protected\n * @abstract\n */\n async doDestroy() {\n throw new Error(\"not implemented\");\n }\n\n static get Status() { return Status; }\n}\n\nPointCloudProvider._id_max = 0;\n\n\n/**\n * @typedef {Object} Request\n * @property {number} id リクエストID\n * @property {Promise} done リクエストの完了を示すプロミス\n * @memberof mapray.PointCloudProvider\n */\n\n\n/**\n * @summary 状態の列挙型\n * @enum {object}\n * @memberof mapray.PointCloudProvider\n * @constant\n * @see mapray.PointCloudProvider#status\n */\nconst Status = {\n /**\n * 初期化前 (初期状態)\n */\n NOT_INITIALIZED: { id: \"NOT_INITIALIZED\" },\n\n /**\n * 初期化済み(読み込み可能)\n */\n INITIALIZED: { id: \"INITIALIZED\" },\n\n /**\n * 破棄状態\n */\n DESTROYED: { id: \"DESTROYED\" }\n}\n\n\nexport default PointCloudProvider;\n","import PointCloudProvider from \"./PointCloudProvider\";\nimport GeoMath from \"./GeoMath\";\nimport Resource, { URLResource, ResourceType } from \"./Resource\";\n\n\nlet idMax = 1;\nconst createUniqueId = () => {\n return idMax++;\n}\n\nclass RawPointCloudProvider extends PointCloudProvider {\n\n /**\n * resource 点群定義(json)リソース。\n * @param {mapray.Resource} resource\n * @param {object} option\n */\n constructor( resource, option={} ) {\n super( option );\n this._suffix = \".xyz\";\n if ( resource instanceof Resource ) {\n this._info_resource = resource;\n }\n else if ( resource.url ) {\n this._info_resource = new URLResource( resource.url, resource.option );\n }\n else {\n throw new Error(\"unsupported resource\");\n }\n this._taskMap = new Map();\n this._requests = 0;\n }\n\n /**\n * @private\n */\n _createPath( level, x, y, z ) {\n return level + \"/\" + x + \"/\" + y + \"/\" + z + this._suffix;\n }\n\n /**\n * @override\n */\n async doInit() {\n const info = await this._info_resource.load( { type: ResourceType.JSON } );\n if ( info.url ) {\n this._resource = this._info_resource.resolveResource( info.url );\n }\n else {\n this._resource = this._info_resource;\n }\n }\n\n /**\n * @override\n */\n async doDestroy() {\n }\n\n getNumberOfRequests() {\n return this._requests;\n }\n\n /**\n * @override\n */\n async doLoad( id, level, x, y, z ) {\n this._requests++;\n try {\n const abortController = new AbortController();\n this._taskMap.set(id, { id, abortController });\n const path = this._createPath( level, x, y, z );\n const buffer = await this._resource.loadSubResource( path, {\n type: ResourceType.BINARY,\n signal: abortController.signal\n } );\n\n const header = {};\n let p = 0;\n header.childFlags = new Uint8Array (buffer, p, 1)[0]; p += 1;\n header.debug1 = new Int8Array (buffer, p, 1)[0]; p += 1;\n p += 2; // skip\n header.indices = new Int32Array (buffer, p, 8); p += 32;\n header.average = new Float32Array(buffer, p, 3); p += 12;\n header.eigenVector = [];\n header.eigenVectorLength = [];\n header.eigenVector[0] = new Float32Array(buffer, p, 3); p += 12;\n header.eigenVectorLength[0] = new Float32Array(buffer, p, 1)[0]; p += 4;\n header.eigenVector[1] = new Float32Array(buffer, p, 3); p += 12;\n header.eigenVectorLength[1] = new Float32Array(buffer, p, 1)[0]; p += 4;\n header.eigenVector[2] = new Float32Array(buffer, p, 3); p += 12;\n header.eigenVectorLength[2] = new Float32Array(buffer, p, 1)[0]; p += 4;\n\n console.assert(p == 96);\n const buf = new Float32Array(buffer, p);\n this._taskMap.delete(id);\n return {\n header: header,\n body: buf,\n };\n }\n finally {\n this._requests--;\n }\n }\n\n /**\n * @override\n */\n cancel( id ) {\n const item = this._taskMap.get(id);\n if (item) {\n item.abortController.abort();\n }\n }\n}\n\n\n\nexport default RawPointCloudProvider;\n","import animation from \"./animation/index\";\nimport Viewer from \"./Viewer\";\nimport Camera from \"./Camera\";\nimport GeoMath from \"./GeoMath\";\nimport GeoPoint from \"./GeoPoint\";\nimport GeoRegion from \"./GeoRegion\";\nimport Orientation from \"./Orientation\";\nimport Ray from \"./Ray\";\nimport AltitudeMode from \"./AltitudeMode\";\nimport CredentialMode from \"./CredentialMode\";\nimport Layer from \"./Layer\";\nimport LayerCollection from \"./LayerCollection\";\nimport DemProvider from \"./DemProvider\";\nimport StandardDemProvider from \"./StandardDemProvider\";\nimport CloudDemProvider from \"./CloudDemProvider\";\nimport ImageProvider from \"./ImageProvider\";\nimport RenderCallback from \"./RenderCallback\";\nimport StandardImageProvider from \"./StandardImageProvider\";\nimport Scene from \"./Scene\";\nimport Entity from \"./Entity\";\nimport MarkerLineEntity from \"./MarkerLineEntity\";\nimport PathEntity from \"./PathEntity\";\nimport TextEntity from \"./TextEntity\";\nimport ModelEntity from \"./ModelEntity\";\nimport PolygonEntity from \"./PolygonEntity\";\nimport PinEntity from \"./PinEntity\";\nimport ImageIconEntity from \"./ImageIconEntity\"\nimport SceneLoader from \"./SceneLoader\";\nimport GeoJSONLoader from \"./GeoJSONLoader\";\nimport DebugStats from \"./DebugStats\";\nimport MaprayApi from \"./MaprayApi\";\nimport PointCloud from \"./PointCloud\";\nimport RawPointCloudProvider from \"./RawPointCloudProvider\";\nimport Resource, { URLResource } from \"./Resource\";\n\n// マウス・Attribution開発\nimport LogoController from \"./LogoController\";\nimport AttributionController from \"./AttributionController\";\n\n/**\n * Mapray 関連の機能全体が含まれる名前空間\n * @namespace mapray\n */\nvar mapray = {\n animation,\n Viewer,\n Camera,\n GeoMath,\n GeoPoint,\n GeoRegion,\n Orientation,\n Ray,\n AltitudeMode,\n CredentialMode,\n Layer,\n LayerCollection,\n DemProvider,\n StandardDemProvider,\n CloudDemProvider,\n ImageProvider,\n RenderCallback,\n StandardImageProvider,\n Scene,\n Entity,\n MarkerLineEntity,\n PathEntity,\n TextEntity,\n ModelEntity,\n PolygonEntity,\n PinEntity,\n ImageIconEntity,\n SceneLoader,\n GeoJSONLoader,\n Resource,\n URLResource,\n MaprayApi,\n DebugStats,\n PointCloud,\n RawPointCloudProvider,\n LogoController, // マウス・Attribution開発\n AttributionController // マウス・Attribution開発\n};\n\n\n// 互換関数を登録\n{\n /* requestAnimationFrame 互換関数\n * @param {function} callback\n * @return {number} requestID\n * @see https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame\n */\n window.maprayRequestAnimationFrame =\n window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame;\n\n\n /* cancelAnimationFrame 互換関数\n * @param {number} requestID\n * @see https://developer.mozilla.org/ja/docs/Web/API/window/cancelAnimationFrame\n */\n window.maprayCancelAnimationFrame =\n window.cancelAnimationFrame ||\n window.webkitCancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n window.oCancelAnimationFrame;\n\n /* Performance.now 互換関数\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Performance/now\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now\n */\n var perf = window.performance;\n var now = perf && (perf.now || perf.mozNow || perf.msNow || perf.oNow || perf.webkitNow);\n var date = new Date();\n window.maprayNow = now ? (function () { return now.call( perf ); }) : (function () { return date.getTime(); });\n\n /* Math.log2 互換関数\n * @function Math.maprayLog2\n * @see https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/log2\n */\n Math.maprayLog2 = Math.log2 || function( x ) { return 1.4426950408889634074 * Math.log( x ); };\n}\n\n\nexport default mapray;\n"],"names":["check","it","Math","globalThis","window","self","global","Function","exec","error","fails","Object","defineProperty","get","document","EXISTS","isObject","createElement","DESCRIPTORS","a","TypeError","String","input","PREFERRED_STRING","fn","val","toString","call","valueOf","nativeDefineProperty","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","value","bitmap","enumerable","configurable","writable","object","key","definePropertyModule","f","createPropertyDescriptor","hasOwnProperty","createNonEnumerableProperty","SHARED","store","setGlobal","functionToString","inspectSource","WeakMap","test","module","undefined","push","version","mode","IS_PURE","copyright","id","postfix","random","keys","shared","uid","set","has","enforce","getterFor","TYPE","state","type","NATIVE_WEAK_MAP","wmget","wmhas","wmset","metadata","STATE","sharedKey","hiddenKeys","objectHas","getInternalState","InternalStateModule","enforceInternalState","TEMPLATE","split","options","unsafe","simple","noTargetGet","source","join","prototype","DatePrototype","Date","INVALID_DATE","TO_STRING","nativeDateToString","getTime","NaN","redefine","nativePropertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","NASHORN_BUG","V","descriptor","slice","classof","IndexedObject","requireObjectCoercible","nativeGetOwnPropertyDescriptor","toIndexedObject","propertyIsEnumerableModule","aFunction","variable","namespace","method","arguments","length","path","ceil","floor","argument","isNaN","min","toInteger","max","index","integer","createMethod","IS_INCLUDES","$this","el","fromIndex","toLength","toAbsoluteIndex","includes","indexOf","require$$0","names","i","result","enumBugKeys","concat","getOwnPropertyNames","internalObjectKeys","getOwnPropertySymbols","getBuiltIn","ownKeys","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","target","getOwnPropertyDescriptorModule","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","replace","toLowerCase","TARGET","GLOBAL","STATIC","stat","FORCED","targetProperty","sourceProperty","forced","copyConstructorProperties","sham","log","LN2","$","log2","x","FunctionPrototype","FunctionPrototypeToString","nameRE","NAME","match","AnimationError","message","name","Error","setPrototypeOf","CORRECT_SETTER","setter","Array","proto","aPossiblePrototype","__proto__","dummy","Wrapper","NewTarget","NewTargetPrototype","constructor","defineProperties","Properties","objectKeys","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","NullProtoObjectViaActiveX","activeXDocument","write","close","temp","parentWindow","NullProtoObjectViaIFrame","iframe","documentCreateElement","JS","iframeDocument","style","display","html","appendChild","src","contentWindow","open","F","NullProtoObject","domain","ActiveXObject","create","whitespace","whitespaces","ltrim","RegExp","rtrim","start","end","trim","require$$1","require$$2","require$$3","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","toNumber","first","third","radix","maxCode","digits","code","charCodeAt","parseInt","NumberWrapper","Number","inheritIfRequired","j","Time","ntime","_ntime","rhs","TIME_MIN_TIME","TIME_MAX_TIME","TIME_MIN_NTIME","TIME_MAX_NTIME","MAX_VALUE","fromNumber","Interval","lower","upper","l_open","u_open","_lower","_upper","_l_open","_u_open","lessThan","equals","isEmpty","ut1","uo1","lt2","lo2","lt1","lo1","inc_l","ut2","uo2","inc_u","getIntersection","INTERVAL_UNIVERSAL","MIN_TIME","MAX_TIME","cross","_getIntersectionByLower","_getIntersectionByUpper","i1","i2","getUnion","getDifference","bound","Symbol","NATIVE_SYMBOL","iterator","isArray","arg","nativeGetOwnPropertyNames","windowNames","getWindowNames","WellKnownSymbolsStore","createWellKnownSymbol","USE_SYMBOL_AS_UID","withoutSetter","wellKnownSymbol","wrappedWellKnownSymbolModule","TO_STRING_TAG","TAG","that","b","c","apply","SPECIES","originalArray","C","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","specificCreate","toObject","boundFunction","bind","arraySpeciesCreate","forEach","map","filter","some","every","find","findIndex","$forEach","HIDDEN","SYMBOL","TO_PRIMITIVE","setInternalState","ObjectPrototype","$Symbol","$stringify","getOwnPropertyNamesExternal","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","findChild","setSymbolDescriptor","nativeObjectCreate","ObjectPrototypeDescriptor","wrap","tag","description","symbol","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$create","$getOwnPropertyDescriptor","$getOwnPropertyNames","IS_OBJECT_PROTOTYPE","defineWellKnownSymbol","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","stringify","replacer","space","args","$replacer","setToStringTag","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","symbolToString","native","regexp","desc","UNSCOPABLES","ArrayPrototype","cache","thrower","METHOD_NAME","ACCESSORS","argument0","argument1","$includes","USES_TO_LENGTH","arrayMethodUsesToLength","addToUnscopables","getPrototypeOf","CORRECT_PROTOTYPE_GETTER","ITERATOR","BUGGY_SAFARI_ITERATORS","returnThis","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","IteratorConstructor","next","Iterators","IteratorsCore","KEYS","VALUES","ENTRIES","Iterable","DEFAULT","IS_SET","createIteratorConstructor","getIterationMethod","KIND","defaultIterator","IterablePrototype","values","entries","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","CurrentIteratorPrototype","methods","KEY","ARRAY_ITERATOR","defineIterator","iterated","kind","done","Arguments","CORRECT_ARGUMENTS","classofRaw","tryGet","TO_STRING_TAG_SUPPORT","callee","MATCH","isRegExp","e","correctIsRegExpLogic","searchString","notARegExp","CONVERT_TO_STRING","pos","S","position","size","second","charAt","codeAt","STRING_ITERATOR","point","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","ArrayValues","ArrayIteratorMethods","COLLECTION_NAME","DOMIterables","Collection","CollectionPrototype","T_nil","OrderedMap","compare","_compare","_root","_size","cloned","_clone","_findMinimum","_findMaximum","_findLowerBound","_findUpperBound","_findEqual","trail","parent","comp","_child_L","_child_R","_value","item","Item","_is_red","_insert_fixup","_parent","uncle","_rotate_L","_rotate_R","last","_remove","succ","findSuccessor","orgY_is_red","x_item","_replace","_remove_fixup","sibling","dst","dp","pivot","_key","bkey","found","imin","imax","Invariance","_imap","createEmptyMap","clone","interval","remove","_insert","fit","findUpper","findLower","pfit","findPredecessor","findLast","_chopItem","it2","it1","lit","narrow","invr","lo0","hasIntersection","insert","array","findFirst","subinvr","ita","itb","ai","bi","it0","getFollowings","UNIVERSAL","getPrecedings","diffs","di","isProper","merged_imap","mergeIntervalInvariance","invariances","_merge_from_invariance","tgtIv","src_imap","srcIv","isExtensible","preventExtensions","METADATA","setMetadata","objectID","weakData","fastKey","getWeakData","onFreeze","FREEZING","meta","REQUIRED","returnMethod","Result","stopped","iterate","iterable","AS_ENTRIES","IS_ITERATOR","iterFn","step","getIteratorMethod","isArrayIteratorMethod","callWithSafeIterationClosing","stop","Constructor","SAFE_CLOSING","called","iteratorWithReturn","from","SKIP_CLOSING","ITERATION_SUPPORT","CONSTRUCTOR_NAME","wrapper","common","IS_WEAK","ADDER","NativeConstructor","NativePrototype","exported","fixMethod","nativeMethod","add","getConstructor","InternalMetadataModule","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","checkCorrectnessOfIteration","BUGGY_ZERO","$instance","anInstance","clear","setStrong","internalStateGetterFor","define","entry","getEntry","previous","removed","redefineAll","prev","ITERATOR_NAME","getInternalCollectionState","getInternalIteratorState","setSpecies","collection","init","Map","collectionStrong","Type","_name","_override_error","func_name","type_register_map","AlreadyRegisteredError","NotRegisteredError","$find","FIND","SKIPS_HOLES","Set","ArrayBuffer","DataView","number","RangeError","Infinity","abs","pow","pack","mantissaLength","bytes","buffer","exponentLength","eMax","eBias","rt","sign","exponent","mantissa","unpack","nBits","fill","argumentsLength","endPos","ARRAY_BUFFER","DATA_VIEW","WRONG_LENGTH","WRONG_INDEX","NativeArrayBuffer","$ArrayBuffer","$DataView","$DataViewPrototype","packIEEE754","IEEE754","unpackIEEE754","packInt8","packInt16","packInt32","unpackInt32","packFloat32","packFloat64","addGetter","view","count","isLittleEndian","intIndex","toIndex","byteLength","byteOffset","reverse","conversion","NATIVE_ARRAY_BUFFER","arrayFill","bufferLength","offset","getInt8","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt8","setUint8","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","ArrayBufferPrototype","testView","nativeSetInt8","defaultConstructor","ArrayBufferModule","nativeArrayBufferSlice","INCORRECT_SLICE","fin","speciesConstructor","viewSource","viewTarget","Int8Array","Int8ArrayPrototype","Uint8ClampedArray","Uint8ClampedArrayPrototype","TypedArray","TypedArrayPrototype","isPrototypeOf","TYPED_ARRAY_TAG","NATIVE_ARRAY_BUFFER_VIEWS","opera","TYPED_ARRAY_TAG_REQIRED","TypedArrayConstructorsList","Uint8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","isView","klass","isTypedArray","aTypedArray","aTypedArrayConstructor","ARRAY","TypedArrayConstructor","exportTypedArrayMethod","property","exportTypedArrayStaticMethod","BYTES","toPositiveInteger","mapfn","mapping","iteratorMethod","round","ArrayBufferViewCore","BYTES_PER_ELEMENT","fromList","list","isArrayBuffer","isTypedArrayIndex","wrappedGetOwnPropertyDescriptor","wrappedDefineProperty","CLAMPED","GETTER","SETTER","NativeTypedArrayConstructor","TypedArrayConstructorPrototype","getter","addElement","$length","toOffset","$len","typedArrayFrom","TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS","typedArrayOffset","createTypedArrayConstructor","copyWithin","len","to","inc","$copyWithin","$every","$fill","$filter","predicate","$findIndex","searchElement","$indexOf","arrayValues","ArrayIterators","arrayKeys","arrayEntries","nativeTypedArrayIterator","CORRECT_ITER_NAME","typedArrayValues","$join","separator","nativeLastIndexOf","lastIndexOf","NEGATIVE_ZERO","STRICT_METHOD","arrayMethodIsStrict","$lastIndexOf","$map","IS_RIGHT","memo","left","right","$reduce","reduce","$reduceRight","reduceRight","middle","arrayLike","$slice","$some","$sort","sort","comparefn","subarray","begin","beginIndex","$toLocaleString","toLocaleString","TO_LOCALE_STRING_BUG","Uint8ArrayPrototype","arrayToString","arrayJoin","IS_NOT_ARRAY_METHOD","GeoMath","mat","vec","y","z","ilen","sqrt","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","b00","b01","b02","b03","b10","b11","b12","b13","b20","b21","b22","b23","a30","a31","a32","a33","b30","b31","b32","idet","plane","m","w","λ","longitude","DEGREE","φ","latitude","sinλ","sin","cosλ","cos","sinφ","cosφ","r","EARTH_RADIUS","height","x2","y2","z2","atan","atan2","bottom","top","nearVal","farVal","eye","center","up","xaxis","_xaxis","yaxis","_yaxis","zaxis","_zaxis","normalize3","cross3","axis","angle","θ","sinθ","cosθ","ax","ay","az","heading","tilt","roll","scale","h","t","sinH","cosH","sinT","cosT","sinR","cosR","sx","sy","sz","exp","PI","tan","LOG2PI","createVector3","GeoPoint","altitude","from_vec","getAsGocs","to_vec","dot3","points","num_points","degree","radius","Orientation","BooleanType","_number_type","_convertibles","NumberType","_boolean_type","StringType","Vector2Type","createVector2","Vector3Type","Vector4Type","createVector4","MatrixType","setIdentity","createMatrix","registerPredefinedTypes","type_classes","type_instances","type_class","register","_postinit","Curve","_value_change_listeners","time","vcl","propertyKey","createProperty","INCORRECT_ITERATION","Updater","_prev_time","_track_binders","_dirty_binders","_vary_curves","VaryCurves","_update_dirty_binders","vary_curves","getVaryCurves","curve","tracked","updateBinders","_flush_dirty_binders","binder","_$curve","unregister","_$update","Tracked","updater","init_binder","_updater","_curve","_binders","_invariance","getInvariance","_listener","_onValueChange","addValueChangeListener","addCurve","removeCurve","removeValueChangeListener","chg_ival","includesTime","_move_to_dirty_binders","modifyCurve","_$modify","_continuous","createTimeMap","_oneshot","_oneshot_L","_oneshot_R","invariance","invr_ivals","getNarrowed","_$getArray","_addToGeneric","lastIndex","invr_ival","vary_ival","isSameInterval_L","_hasContiguous_L","_addToOneshotGroup","isSameInterval_R","_hasContiguous_R","pred","pred_ival","curves","succ_ival","_removeForGeneric","_removeForOneshotGroup","sub_invr","old_invr","aligned","_$expandIntervalByAlignment","prev_time","_collectCurves","_addToContinuous","isSingle","pname","findEqual","A_ival","A_curve","_removeFirstCrossInContinuous","T_ival","cc","T_curves","A_x_T","$A_x_T","A_x_$T","_addForContinuous","A$_x_T","A_x_T$","t1","t0","dst_set","ContCurves","_removeForContinuous","t2","_collectContinuousCurves","_collectOneshotCurves","it_A","it_Pred","it_Last","it_Z","Z_ival","closed1","closed2","TypeMismatchError","Binder","isTypeSupported","_type","_setter","_$register","_$unregister","getValue","process","versions","v8","userAgent","V8_VERSION","foo","Boolean","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","arrayMethodHasSpeciesSupport","isConcatSpreadable","spreadable","A","n","k","E","BindingBlock","Parameter","types","_id","_types","EasyBindingBlock","_entries","_bounds","_descendant_unbinders","type_solver","Entry","unbind","unbinder","parameters","enrty","unbindAll","ConstantCurve","_constant_type","_constant_value","getDefaultValue","setConstantValue","getCloneValue","notifyValueChange","from_type","isConvertible","from_value","convertValue","AnimUtil","key_times","l_idx","u_idx","m_idx","m_time","l_time","KFLinearCurve","keyframes","dimension","getDimension","_value_type","_dimension","_num_keyframes","_key_times","_key_values","setKeyFrames","dv","ti","vi","_getInterpolatedValue","first_time","last_time","ival_inner","invr_full","findKeyFrameIndex","_createKeyFrameValue","_createValueBy2Keys","key_values","i0","x0","x1","r1","r0","vi0","vi1","KFStepCurve","lastL","lastU","HAS_SPECIES_SUPPORT","ComboVectorCurve","children","_vector_type","_children","_listeners","_setupInitialChildren","setChildren","_setChildCommon","_getCompoundValue","child","merge","init_child","vec_compo_type","listener","old_child","old_listener","animation","Promise","location","setImmediate","clearImmediate","MessageChannel","Dispatch","counter","queue","ONREADYSTATECHANGE","defer","channel","port","run","runner","event","post","postMessage","protocol","host","nextTick","now","IS_IOS","port2","port1","onmessage","addEventListener","importScripts","removeChild","setTimeout","macrotask","MutationObserver","WebKitMutationObserver","IS_NODE","queueMicrotaskDescriptor","queueMicrotask","flush","head","notify","toggle","node","promise","then","exit","enter","createTextNode","observe","characterData","resolve","task","PromiseCapability","reject","$$resolve","$$reject","promiseCapability","newPromiseCapability","console","PROMISE","getInternalPromiseState","PromiseConstructor","NativePromise","$fetch","newPromiseCapabilityModule","newGenericPromiseCapability","DISPATCH_EVENT","createEvent","dispatchEvent","UNHANDLED_REJECTION","REJECTION_HANDLED","PENDING","FULFILLED","REJECTED","HANDLED","UNHANDLED","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","GLOBAL_CORE_JS_PROMISE","PromiseRejectionEvent","FakePromise","all","isThenable","isReject","notified","chain","reactions","microtask","ok","reaction","handler","fail","exited","rejection","onHandleUnhandled","onUnhandled","reason","initEvent","hostReportErrors","IS_UNHANDLED","isUnhandled","perform","emit","unwrap","internalReject","internalResolve","executor","onFulfilled","onRejected","fetch","promiseResolve","capability","$promiseResolve","remaining","alreadyCalled","race","runtime","exports","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","obj","err","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","makeInvokeMethod","tryCatch","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","getProto","NativeIteratorPrototype","Gp","displayName","defineIteratorMethods","isGeneratorFunction","genFun","ctor","mark","awrap","__await","AsyncIterator","PromiseImpl","invoke","record","unwrapped","previousPromise","enqueue","callInvokeWithMethodAndArg","async","iter","doneResult","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","info","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","pop","skipTempReset","rootEntry","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","Ray","dir","direction","Camera","canvas_size","_canvas_size","fov","near","far","view_to_gocs","camera","copyMatrix","omat","width","hfov","aspect","gx","gy","nMat","getCanvasToView","n00","n11","n32","n03","n13","n33","mMat","m00","m10","m20","m01","m11","m21","m02","m12","m22","m03","m13","m23","cpos","oray","mr","getCanvasToGocs","_temp_mat","qx","qy","qz","qw","mg","swidth","sheight","RenderInfo","_view_to_clip","_volume_planes","_pixel_step","_setup_view_to_clip","_setup_volume_planes","_setup_pixel_step","cx","cy","dx","dy","unit","frustum_matrix","matrix","_add_matrix_rows","_sub_matrix_rows","p","m32","m33","SQRT1_2","row1","row2","GLEnv","canvas","ctx_attribs","depth","antialias","_getContextWebGL","_canvas","_context","_setupExtensions","contextTypes","getContext","gl","OES_element_index_uint","getExtension","EXT_texture_filter_anisotropic","WEBGL_depth_texture","nativeSlice","nativeSort","FAILS_ON_UNDEFINED","FAILS_ON_NULL","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","splice","deleteCount","actualStart","insertCount","actualDeleteCount","nativeExpm1","expm1","nativeCosh","cosh","ignoreCase","multiline","dotAll","unicode","sticky","RE","s","re","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","UNSUPPORTED_Y","stickyHelpers","BROKEN_CARET","NPCG_INCLUDED","PATCH","str","reCopy","flags","regexpFlags","charsAdded","strCopy","REPLACE_SUPPORTS_NAMED_GROUPS","groups","REPLACE_KEEPS_$0","REPLACE","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","arg2","forceStringMethod","regexpExec","stringMethod","regexMethod","R","fixRegExpWellKnownSymbolLogic","nativeMatch","maybeCallNative","matcher","res","rx","regExpExec","fullUnicode","matchStr","advanceStringIndex","DemSampler","area","ρ","body","FLT_BYTES","_sx","_sy","_ox","_oy","_body","_pitch","_max","DemSamplerLinear","u","u0","u1","v","v0","v1","h00","_sampleInt","h10","h01","h11","fu","fv","cu","clamp","cv","DemSamplerNearest","AvgHeightMaps","_ρ","_maps","first_map","_create_first_map","src_map","lv","next_map","_create_next_map","src_pitch","dst_pitch","src_index","dst_index","h20","h21","h02","h12","h22","zg","xg","yg","DemBinary","_z","_x","_y","header","_qlevels","OFFSET_QLEVEL_00","OFFSET_QLEVEL_10","OFFSET_QLEVEL_01","OFFSET_QLEVEL_11","_hmin","OFFSET_HMIN","_hmax","OFFSET_HMAX","_ω","_createωArray","HEADER_BYTES","getQuadLevel","q","xt","yt","origin","pitch","_getHeights_result","flake_area","lod","ze","ω","_getComplexity","_getDivisionPowers_result","samplerClass","ωs","down","OFFSET_ω","d","dmax","smax","ω_limit","AreaUtil","getCenter_0","getCenter_1","getCenter_N","pi","msize","mx_min","mx_max","my_min","my_max","λmin","λmax","emin","emax","e2min","e2max","rh","cosφmin","cosφmax","FlakeMesh","glenv","dpows","dem","_center","_createCenter","_vertices","_num_vertices","_vertex_attribs","_num_quads_x","_num_quads_y","_createVertices","_setupVertexAttribs","_index_type","UNSIGNED_SHORT","UNSIGNED_INT","_indices","_num_indices","_wire_indices","_num_wire_indices","_gl","getCenter","vbo","createBuffer","_createVerticesData","bindBuffer","bufferData","STATIC_DRAW","num_vertices","num_quads_x","num_quads_y","u_count","v_count","u_step","v_step","mx_step","my_step","demSampler","newSampler","VERTEX_SIZE","iv","my","ey","ey2","iu","mx","sample","nx","ny","nz","gz","FLOAT","stride","VERTEX_BYTES","num_components","component_type","normalized","byte_stride","byte_offset","OFFSET_P","OFFSET_N","OFFSET_UV","num_quads","num_indices","typedArray","i00","i10","i01","i11","ELEMENT_ARRAY_BUFFER","j00","j01","deleteBuffer","m30","m31","t03","t13","t23","material","isWire","isWireframe","bindVertexAttribs","indices","wire_indices","LINES","TRIANGLES","num_wire_indices","drawElements","_createIndices","_createWireIndices","Primitive","mesh","transform","_glenv","bbox","sort_z","stage","_obj_to_view","mul_AA","_gocs_to_view","_transformBBox","planes","_isBBoxBackSide","isTranslucent","bindProgram","setParameters","draw","iz","zm","iy","ym","ix","xm","bbox_point","_bbox_points","bbox_points","dist","FlakeRenderObject","base_mesh","_base_mesh","_edata_list","_transform","producer","edata","getMaterialAndProperties","primitive","entity","UpdatedTileArea","_area_list","_flat_area_list","_createFlatAreaList","root_node","Node","addDescendant","reduceTree","collectFlatAreas","present","olist","arrayBufferModule","MeshBuffer","opts","_getBindingPoint","_handle","Target","ATTRIBUTE","INDEX","Mesh","_draw_mode","_attrib_data","_index_data","Initializer","_initByInitializer","BinaryInit","initializer","JsonInit","_convertDrawMode","draw_mode","src_attrib_data","attribute_data","sad","mesh_buffer","_convertComponentType","index_data","src_index_data","DrawMode","POINTS","LINE_LOOP","LINE_STRIP","TRIANGLE_STRIP","TRIANGLE_FAN","ComponentType","BYTE","UNSIGNED_BYTE","SHORT","drawArrays","vinfo","InitHelper","createVertexInfo","vtype","num_vcompos","numVertexComponents","vertices","_initializer","_toDrawMode","_addIndex","toTypedArray","byteStride","num_compos","addAttribute","addIndex","ptype","OFFSET_VTYPE","itype","OFFSET_ITYPE","OFFSET_PTYPE","OFFSET_NUM_VERTICES","OFFSET_NUM_INDICES","_createIndexArray","_createVertexArray","src_buffer","vertices_bytes","src_view","OFFSET_BODY","dst_array","index_bytes","ENUM_ITYPE_UINT16","ENUM_ITYPE_UINT32","num_elements","_indexTypeToComponentType","ENUM_PTYPE_TRIANGLES","ENUM_PTYPE_LINES","ENUM_VTYPE_P","ANAME_P","FSIZE_P","ENUM_VTYPE_PN","ANAME_N","FSIZE_N","ENUM_VTYPE_PT","ANAME_T","FSIZE_T","ENUM_VTYPE_PNT","AltitudeMode","ABSOLUTE","RELATIVE","CLAMP","Entity","scene","_altitude_mode","_need_to_create_regions","_animation","_visibility","json","_setupEntityByJson","visibility","prev_mode","altitude_mode","setVisibility","onChangeAltitudeMode","PrimitiveProducer","_entity","regions","FlakePrimitiveProducer","_updated","AreaStatus","EMPTY","updated","FULL","PARTIAL","Globe","dem_provider","_dem_provider","_status","Status","NOT_READY","_dem_area_updated","_prev_producers","getResolutionPower","_dem_zbias","_hist_stats","HistStats","_flake_reduce_thresh","_flake_reduce_factor","_num_cache_flakes","_num_touch_flakes","_mesh_reduce_lower","_mesh_reduce_thresh","_mesh_reduce_factor","_num_cache_meshes","_num_touch_meshes","_max_dem_requesteds","_num_dem_requesteds","_frame_counter","_root_flake","_avg_height","_root_cancel_id","_requestRoot","READY","dispose","cancelRequest","producers","next_producers","added_producers","updated_producers","prod","checkForUpdate","removed_producers","removeEntityProducer","addEntityProducer","updateEntityProducer","flake","xf","yf","dem_flake","touch","_dem_state","DemState","LOADED","_requestHighestAccuracy","_dem_data","src_array","src_offset","src_stride","dst_offset","dst_stride","dPI","demSize","lon","lat","_lon","nlon","nlat","invGudermannian","_findHighestAccuracy2","uf","vf","ui","heights","getHeights","max_touch_flakes","getMaxValue","_reduceFlakes","_reduceMeshes","requestTile","newAvgHeightMaps","Flake","setupRoot","addTileArea","FAILED","flat_flakes","flattenFlakes","compareForReduce","num_cache_flakes","flat_meshes","flattenMeshes","num_cache_meshes","mnode","_globe","NONE","_entity_map","_meshes","_prev_Za_dem","_prev_Zr_dem","_base_height","_height_min","_height_max","_dem_zlimit","_gocs_x_min","_gocs_x_max","_gocs_y_min","_gocs_y_max","_gocs_z_min","_gocs_z_max","_aframe","globe","_estimate","clip_planes","_isInvisible_0","_isInvisible_N","η","ε","maprayLog2","acos","_getCosφ","_getMeshNode","getRenderObject","entity_map","_getEntityMap","getAreaStatus","_addEntityFullProducer","_removeEntityMeshes","ray","limit","_findQuadRayDistance","_cullForRayDistance","dmin","newChild","findRayDistance","meshes","pchildren","REQUESTED","_flattenFlakes","_flattenMeshes","other","aframe","_getMeshDemBinary","getDivisionPowers","MeshNode","unshift","zDesired","_findNearestDemTile","qlevel","_requestAncestorDemTile","zlimit","provider","xmin","xmax","ymin","ymax","zmin","zmax","px","py","pz","pw","c0","c1","c2","c3","c4","c5","y0","y1","zr_dem","_estimate_low","za_dem","isLeaf","_estimate_leaf","_estimate_high","_updataBoundingBox_0","_updataBoundingBox_1","_updataBoundingBox_N","α","_calcAlpha","Fm","height_min","Fp","height_max","xe","ye","smin","tmin","tmax","h0","h1","h2","h3","πr","rmin","rmax","getQuadLevelDirect","pts","_getQuadPositions","_temp_positions","_findTriRayDistance","positions","mx0","my0","vx","vy","vz","removeEntityMesh","parent_map","isfull","p0","p1","p2","p1_p0","_temp_ray_1","p2_p0","_temp_ray_2","_temp_ray_3","nv","p0_q","_temp_ray_4","_temp_ray_5","p0_p","_temp_ray_6","p1_p","_temp_ray_7","p2_p","_temp_ray_8","_temp_ray_9","_temp_ray_10","_temp_ray_11","_history","_max_value","_hsize","history","old_max","shift","_find_max","max_value","_flake","_dem","_dpows","_entity_meshes","fro","getEntityProducers","_getEntityMesh","CACHED_EMPTY_MESH","createMesh","_setEntityMesh","addEntityData","RenderFlake","FlakeCollector","_setupViewVectors","_setupClipPlanes","viewer","_viewer","tile_texture_cache","_min_image_z","getImageZMin","dem_zbias","_max_zbias","getImageZBias","_rflake_list","_debug_stats","debug_stats","_num_procA_flakes","_num_procB_flakes","_view_dir_N","_view_dir_V","_view_to_gocs","pixel_step","view_pos_Q","view_dir_wU","_view_pos_Q","_view_dir_wU","gocs_to_view","volume_planes","root_flake","rmin2","rmax2","recip","far_dist","src_plane","dst_plane","transformPlane_A","_clip_planes","_collectFlakes","num_procA_flakes","num_procB_flakes","isInvisible","_collectNextLevelFlakes","range","_getLevelOfDetailRange","zt","mid","MAX_LOD_INTERVAL","_addRenderFlake","max_mstep","mcount","mstep","base_height","Q","wU","N","dMin","dMax","denom","wUV","deriv","lodMin","lodMax","inv_d","rflake","lod_00","_calcLOD","lod_10","lod_01","lod_11","_setCornerLODs","nativeJoin","ES3_STRINGS","Shader","vs_code","fs_code","vs_object","_compile_shader","fs_object","deleteShader","shader","createShader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","Material","_program","_link_shaders","_create_vertex_attribs","_uniform_location","_create_uniform_location","vs","fs","program","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","detachShader","deleteProgram","attribs","num_items","ACTIVE_ATTRIBUTES","getActiveAttrib","attrib","getAttribLocation","ACTIVE_UNIFORMS","getActiveUniform","getUniformLocation","useProgram","uniform1i","uniform1f","uniform2fv","uniform3fv","uniform4fv","uniformMatrix4fv","mesh_attribs","mtl_attribs","num_attribs","mtl_attrib","mesh_attrib","enableVertexAttribArray","vertexAttribPointer","disableVertexAttribArray","texture","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","FlakeMaterial","_flake_to_clip","createMatrixf","mul_flake_to_gocs","_gocs_to_clip","setMatrix","ImageProvider","callback","Range","_min","EmptyImageProvider","TileTexture","deleteTexture","TileTextureCache","_provider","_max_image_z","_image_zbias","status_callback","status","_flush","_resetImageProvider","_croot","CacheNode","_max_accesses","_lower_bound","_upper_bound","_num_requesteds","_max_requesteds","_new_requesteds","aniso_ext","_aniso_ext","_max_aniso","getParameter","MAX_TEXTURE_MAX_ANISOTROPY_EXT","_use_mipmap","renge","getZoomLevelRange","getImageSize","NodeCanceller","d_min","d_max","d_lo","d_hi","tex_lo","tex_hi","NodeState","req_power","updateRequestPower","_findNearestAncestors_result","_performNewRequests","NodeCounter","num_accesses","num_loadeds","num_nodes","_reduceCache","num_requests","anode","bnode","req","_requestTileTexture","image","_createTexture","createTexture","pixelStorei","UNPACK_FLIP_Y_WEBGL","texImage2D","RGBA","generateMipmap","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","collector","NodeCollector","nodes","clean","root","frame","_frame","_traverse","isAccessed","_clean_recur","isNodeNone","isChildNone","owner","_owner","WireframeMaterial","wireframe_vs_code","wireframe_fs_code","setCommonParameter","Layer","props","image_provider","_image_provider","_opacity","opacity","LayerType","NIGHT","NORMAL","_material","_tile_cache","render_cache","_render_cache","surface_night_material","SurfaceMaterial","nightMaterial","surface_material","wireframe_material","dirtyDrawingLayers","cancel","preamble","_getPreamble","surface_vs_code","ridMaterial","rid_fs_code","surface_fs_code","setInteger","TEXUNIT_IMAGE_HI","TEXUNIT_IMAGE_LO","_tile_texture_cache","_layers","layers","_dummy_tile_texture","_createDummyTileTexture","_identity_matrix","_flake_to_gocs","numDrawingLayers","param","_getMaterialParamater","layer","getDrawingLayer","setVector4","corner_lod","image_hi","texcoord_rect","image_lo","setVector2","setFloat","setVector3","sun_direction","bindTexture2D","tex_cache","tile_cache","zi","tiles","findNearestAncestors","_getImageParamater","tile","pixels","is_night","lines","nativeIndexOf","FAILS_ON_PRIMITIVES","nativeKeys","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","rf","PointCloudMaterial","point_cloud_vs_code","point_cloud_fs_code","_local_to_clip","mul_local_to_gocs","point_shape_type","PointCloud","PointShapeType","CIRCLE","shader_code","PointCloudDebugWireMaterial","point_cloud_debug_wire_vs_code","point_cloud_debug_wire_fs_code","_color","color","PointCloudDebugFaceMaterial","point_cloud_debug_face_vs_code","point_cloud_debug_face_fs_code","_scene","Box","createRoot","_points_per_pixel","_point_shape","_point_size_type","PointSizeType","FLEXIBLE","_point_size","_point_size_limit","_dispersion","_debug_shader","_debug_render_box","_debug_render_ellipsoid","_debug_render_axis","_debug_render_section","_checkMaterials","_instances","destroy","assert","_updateDebugMesh","_updateDebugMeshes","level","_urlGenerator","point_cloud_materials","point_cloud_debug_wire_material","point_cloud_debug_face_material","point_shape","onSuccess","notifier","statistics","getTraverseDataRequestQueue","_traverseDataRequestQueue","statistics_handler","_statistics","statistics_obj","Statistics","_statistics_handler","_now","performance","_start_time","_done_traverse_time","traverse_time","_done_time","render_time","total_time","render_point_count","total_point_count","render_boxes","total_boxes","loading_boxes","created_boxes","disposed_boxes","RECTANGLE","CIRCLE_WITH_BORDER","GRADIENT_CIRCLE","PIXEL","MILLIMETERS","proj_area","gocs_center","MIN_INT","gocs_min","gocs_max","NOT_LOADED","_metaInfo","average","eigenVector","eigenVectorLength","_vertex_buffer","_vertex_length","debug1","tindices","CHILDREN_INDICES","ev","getPointsLength","_putSectionShapePoints","_putVariancePoints","mesh_data","debugMesh","e1","e2","e3","e1l","e2l","e3l","G","_variance_points_cache","cos_ro","sin_ro","cos_th","sin_th","ro","th","putPoint","l","ue","ps","alpha","lp","isReady","LOADING","load","_loadId","childFlags","ASSERT","number_of_points","skip_error","is_aborted","DESTROYED","newChildAt","getChildInfo","render_stage","STATUS_COLOR_TABLE","disable","CULL_FACE","debug_material","setDebugBoundsParameter","enable","target_cells","points_per_pixels","_drawDebugMesh","point_size_type","point_size","point_size_limit","debug_shader","_getMaterial","overlap_scale","ppp","setPointSize","setDebug","childIndex","_abort_controller","abort","disposeChildren","indent","text","toTreeString","box","PointCloudBoxRenderObject","distance","parent_points_per_pixel","_box","_distance","_target_children","_parent_points_per_pixel","points_per_pixel","PointCloudBoxCollector","load_limit","_point_cloud_collection","_render_boxes","_render_boxes_map","_load_boxes","_load_limit","point_cloud","getPointsPerPixel","getDispersion","_updateBox","visible_boxes","load_boxes","parent_ppp","box_ppp","lodStatus","is_loaded","_calcPointsPerPixel","LodStatus","LOAD_NEXT_LEVEL","UNLOAD_NEXT_LEVEL","KEEP_STATUS","_collectNextLevel","cellPointsAvailable","getChild","_pushBox","is_plane","createVector3f","ev1","ev2","ev3","ev1l","ev2l","ev3l","nn","area_calc","diff","target_child","setWholeRegion","pushRegion","_pushLoadBox","_binarySearch","ro1","ro2","_insert_with_limit","sorted_list","compareFunc","_binarySearchInner","factories","construct","argsLength","partArgs","FrameBuffer","_width","_height","_options","_buildBuffers","frame_buffer","color_containers","depth_container","_frame_buffer","_color_containers","_depth_container","ret","createFramebuffer","bindFramebuffer","FRAMEBUFFER","color_container","ContainerType","RENDER_BUFFER","c_options","createRenderbuffer","bindRenderbuffer","RENDERBUFFER","renderbufferStorage","internal_format","framebufferRenderbuffer","COLOR_ATTACHMENT0","format","framebufferTexture2D","d_options","DEPTH_ATTACHMENT","NEAREST","attach_type","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","deleteFramebuffer","container","_delete_container","WebGLTexture","WebGLRenderbuffer","deleteRenderbuffer","active_frame_buffer","TEXTURE","PickTool","_camera","RGBA4","DEPTH_STENCIL_ATTACHMENT","DEPTH_STENCIL","UNSIGNED_INT_24_8_WEBGL","_depth_to_color_frame_buffer","_depth_to_color_materials","depth_vs_code","define_PASS_BASE_0","depth_fs_code","define_PASS_BASE_1","vertex_buf","texcoord_buf","texcoord","_indices_length","_index_buf","_rid_value","_depth_value","viewer_camera","cw","ch","copyViewParameters","hfov_rad","hfov_rad2","startRid","startRidRead","endRidRead","readPixels","rid","COEFFICIENTS_RID","endRid","view_to_clip","startDepth","startDepthRead","endDepthRead","depth_clip","viewport","depthFunc","ALWAYS","coef","COEFFICIENTS_DEPTH","vtc","endDepth","RenderTarget","SCENE","RID","AbstractRenderStage","renderInfo","_rendering_cancel","_setupBasicMatrices","point_cloud_collection","_flake_material","_flake_list","_translucent_mode","surface_pick_material","translucent_mode","inverse_A","mul_PzA","pick_object","clearColor","depthMask","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","DEPTH_TEST","blendFuncSeparate","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","ZERO","ONE","LEQUAL","traverse","vis_ground","getVisibility","Viewer","Category","GROUND","vis_entity","ENTITY","_prepare_draw_flake","_draw_flake_base","getBaseMesh","_draw_entities_on_flake","_draw_point_cloud","getFlakePrimitiveProducers","putNextEntityProducers","num_drawings","numDrawings","setFlakeParameter","BLEND","getMateral","getRenderTarget","stats","num_drawing_flake_vertices","num_entities","POLYGON_OFFSET_FILL","polygonOffset","setBlend","getEntityPrimitive","onPushPrimitive","RenderStage","createRenderInfo","render_mode","RenderMode","WIREFRAME","_render","num_drawing_flakes","endFrame","traverseDataRequestQueue","traverseData","getStatistics","getNumberOfRequests","pcb_collector","traverse_result","doneTraverse","flushQueue","pcb_collection","PickStage","screen_pos","pick_tool","pick_tool_cache","pickCamera","_pick_tool","_rid_map","_pick_result","beforeRender","DITHER","renderCanceled","afterRender","readRid","readDepth","CredentialMode","OMIT","credentials","SAME_ORIGIN","INCLUDE","StandardImageProvider","prefix","suffix","_prefix","_suffix","_min_level","_max_level","orderCoords","coord_order","CoordOrder","ZYX","XYZ","convCoords","coord_system","CoordSystem","LOWER_LEFT","_coords_part","_crossOrigin","Image","onload","onerror","crossOrigin","_makeURL","ZXY","UPPER_LEFT","nativeAssign","assign","B","alphabet","chr","T","DemProvider","StandardDemProvider","_credentials","_headers","headers","actrl","AbortController","signal","response","arrayBuffer","statusText","LayerCollection","_draw_layers","num_layers","_updataDrawingLayers","draw_layers","PointCloudCollection","_items","removedItem","removeByIndex","RenderCallback","_is_started_","onStop","delta_time","onStart","onUpdateFrame","NullRenderCallback","Scene","_enode_list","_loaders","addDescendantUnbinder","_unbindDescendantAnimations","ENode","_prepare_entities","op_prims","tp_prims","ac_prims","_add_primitives","_draw_opaque_primitives","_draw_translucent_primitives","_draw_anchor_primitives","dem_area_updated","enode","getPrimitiveProducer","needsElevation","checkToCreateRegions","createRegions","region","compile","onChangeElevation","intersectsWith","getPrimitives","isVisible","dst_prims","anchor_mode","primitives","setTranslucentMode","loaders","loader","getFlakePrimitiveProducer","unbindAllRecursively","quot","attribute","forcedStringHTMLMethod","link","url","createHTML","nativeStartsWith","startsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","search","HTTP","query","option","METHOD","GET","POST","PUT","DELETE","queryText","JSON","FetchError","mimeType","CONTENT_TYPE","RESPONSE_STATUS","NO_CONTENT","cause","captureStackTrace","stack","NativeRegExp","CORRECT_NEW","RegExpWrapper","pattern","thisIsRegExp","patternIsRegExp","flagsAreUndefined","getFlags","proxy","URL","searchParams","pathname","toJSON","href","URLSearchParams","username","hash","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexNonASCII","regexSeparators","OVERFLOW_ERROR","baseMinusTMin","stringFromCharCode","fromCharCode","ucs2decode","output","extra","digitToBasic","digit","adapt","delta","numPoints","firstTime","encode","inputLength","bias","currentValue","basicLength","handledCPCount","handledCPCountPlusOne","qMinusT","baseMinusT","encoded","labels","label","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","plus","sequences","percentSequence","percentDecode","sequence","decodeURIComponent","deserialize","serialize","encodeURIComponent","parseSearchParams","attributes","updateSearchParams","validateArgumentsLength","passed","required","URLSearchParamsIterator","Iterator","params","getIterator","URLSearchParamsConstructor","entryIterator","entryNext","updateURL","URLSearchParamsPrototype","append","getAll","entriesIndex","sliceIndex","USE_NATIVE_URL","getState","NativeURL","URLSearchParamsModule","getInternalSearchParamsState","getInternalURLState","INVALID_AUTHORITY","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","EOF","parseHost","codePoints","parseIPv6","isSpecial","arrayFrom","percentEncode","C0ControlPercentEncodeSet","toASCII","parseIPv4","parts","partsLength","numbers","part","ipv4","address","pieceIndex","compress","pointer","numbersSeen","ipv4Piece","swaps","swap","char","findLongestZeroSequence","ipv6","maxIndex","maxLength","currStart","currLength","serializeHost","ignore0","fragmentPercentEncodeSet","pathPercentEncodeSet","userinfoPercentEncodeSet","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","startsWithWindowsDriveLetter","shortenURLsPath","pathSize","isSingleDot","segment","isDoubleDot","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","seenAt","seenBracket","seenPasswordToken","bufferCodePoints","failure","fragment","codePoint","encodedCodePoints","URLConstructor","urlString","baseState","searchParamsState","serializeURL","getOrigin","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","getSearch","getSearchParams","getHash","URLPrototype","accessorDescriptor","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","DATA_URL_PATTERN","ABSOLUTE_URL_PATTERN","Dom","Blob","prevOnLoad","prevOnError","baseUrl","SYSTEM_FONT_FAMILY","Resource","ResourceType","BINARY","IMAGE","URLResource","_url","_base_url","substr","defaultTransformCallback","_abort_ctrl","_loadURLResource","subUrl","resolveUrl","sub_url","tr","loadImage","http_option","_make_fetch_params","Loader","resource","_resource","_onLoad","onLoad","defaultOnLoadCallback","_onEntity","onEntity","defaultOnEntityCallback","_setStatus","addLoader","_load","removeLoader","CANCELED","ABORTED","_cancel","ERROR","isSuccess","addEntity","CommonData","ctx","_extensions","extractUsedExtensions","extensions","_extras","extras","extension","Content","scenes","default_scene_index","_commonData","gjson","_scenes","_default_scene_index","Texture","_getParameters","flip_y","usage","Usage","COLOR","_getColorArray","_generateMipmapQ","mag_filter","min_filter","wrap_s","wrap_t","REPEAT","SIMPLETEXT","TEXT","ICON","NEAREST_MIPMAP_NEAREST","LINEAR_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","GENERAL","EntityMaterial","_setRenderId","obj_to_gocs","obj_to_clip","_obj_to_clip","mul_GA","obj_to_view","ModelMaterial","model_vs_code","model_fs_code","_white_texture","TEXUNIT_BASE_IMAGE","pbrMR","pbrMetallicRoughness","setObjToClip","setObjToView","bcf","u_base_color","getTranslucentMode","base_image_texture","_selectTexture","texinfo","alt_texure","is_unlit","Sampler","jsampler","samplers","_magFilter","magFilter","_minFilter","minFilter","_wrapS","wrapS","WRAP_DEFAULT","_wrapT","wrapT","jtexture","textures","_sampler","sampler","_source","findImage","TextureInfo","jtexinfo","_texture","_texCoord","texCoord","NormalTextureInfo","_scale","OcclusionTextureInfo","_strength","strength","ModelContainer","_name_map","_default","_offset_transform","share","gltf_scene","_getEntry","prim","cloned_prim","fastClone","Builder","fastCloneProperties","mr_scene","_builder","buffer_map","texture_map","_mr_scene","_primitives","_pickPrimitives","_buffer_map","_texture_map","identity","root_nodes","_addNode","ptos","ntos","_getNodeToScene","_createPrimitive","iprim","_createMesh","_createMaterial","oprim","_createMeshPivot","_createBoundingBox","_createProperties","_convertPrimitiveMode","_calcNumVertices","_addAttribToInit","_addIndexToInit","accessor","_findMeshBuffer","bufferView","_NumComponents","_ComponentType","componentType","_VertexAttribId","meshBuffer","binary","cache_suffix","commonData","getExtensions","cache_id","baseColorFactor","createVector4f","baseColorTexture","metallicFactor","roughnessFactor","metallicRoughnessTexture","doubleSided","alphaMode","alphaCutoff","emissiveFactor","emissiveTexture","normalTexture","occlusionTexture","_createTextureParam","_findTexture","itexture","otexture","tex_opts","ntop","_DrawMode","counts","src_pbr","_fastCloneTextureParam","iparam","oparam","LineMaterial","line_type","line_vs_code","line_fs_code","_line_type","DEFAULT_OPACITY","sparam","_sparam","param_width","DEFAULT_WIDTH","thickness","_thickness","param_color","DEFAULT_COLOR","param_opacity","copyVector3","AbstractLineEntity","LineType","lower_length","upper_length","DEFAULT_LOWER_LENGTH","DEFAULT_UPPER_LENGTH","createVector2f","GeoRegion","_empty","_min_lon","_max_lon","_min_lat","_max_lat","_min_alt","_max_alt","alt","right_min_lon","_calcRightPosition","right_max_lon","length1","length2","base_lon","_add","pointsArray","empty","min_include","max_include","lon_pos","lat_pos","alt_pos","getPoint","getGeographicalDistance","EntityRegion","_is_compiled","_point_array","_num_points","_node_array","_next_node","_checkNotCompiled","_ensurePointArrayCapacity","_buildCollisionQuadTree","area_list","getFlatAreaList","_intersectsWith","node_array","FULL_INDEX","EMPTY_INDEX","added_size","old_size","needed_capacity","old_capacity","new_capacity","new_point_array","point_array","num_floats","_addCollisionQuadTreeNode","_setFullNodeRecur","_reduceNodeRecur","MAX_LEVEL","ubits","vbits","_findRootNode","mask","_findChildNode","_ensureNodeArrayCapacity","ichild","is_leaf","num_fulls","new_node_array","QAreaManager","_tree_root","_get_area_node","min_x","min_y","parent_content","max_y","createAreaContent","QAreaNode","getInitialContent","_create_area_node","tsize","ry","_producer","_is_flake_mode","onChangeProperty","addPointsAsArray","render_target","opt","_pivot","_bbox","_properties","_getLineMaterial","_primitive","pick_material","pickPrimitive","_pickPrimitive","_geom_dirty","addPoints","_numPoints","_num_floats","_updatePrimitive","needToCreateRegions","_updateProperties","gocs_buffer","toGocsArray","_getFlatGeoPoints_with_Absolute","_updateTransformPivotBBox","add_length","length_array","_length_array","_lower_length","_upper_length","abs_buffer","getExistingElevations","ox","oy","oz","xsum","ysum","zsum","bmin","bmax","num_segments","ex","ez","dz","base_d","base_s","_material_map","_area_manager","LineAreaManager","segments","_divideXY","notifyForUpdateContent","notifyForUpdate","dpow","x_min","x_max","div_x","step_x","getAreaContent","pl","ql","l0","l1","tx0","ty0","tl0","mu1","mu0","tx1","ty1","tl1","i_min","i_max","prev_x","prev_y","prev_l","next_x","next_y","next_l","y_min","y_max","div_y","step_y","_divideXOnly","newLinearSampler","smx","smy","prev_length","emx","emy","next_length","toGocs","sgx","sgy","sgz","egx","egy","egz","gudermannian","Degree","RAngle","TwoPI","end_point","is_path","lon0","lat0","length0","lon1","lat1","xL","yL","lL","xR","yR","lR","x_area_min","x_area_max","y_area_min","y_area_max","xP","yP","xQ","yQ","_intersect","_nhorz_intersect","y_line_min","y_line_max","y_range_0","y_range_1","x_range_0","x_range_1","x_range_min","x_range_max","MARKERLINE","MarkerLineEntity","_setupAnimationBindingBlock","_setupByJson","block","vector3","addEntry","setLineWidth","setColor","setOpacity","add_size","target_size","buffer_size","new_buffer","old_buffer","copy_size","onChangePoints","line_width","PathEntity","setLowerLength","setUpperLength","add_length_size","num_length_floats","target_length_size","buffer_length_size","buffer_length","base_length","lengths","TextMaterial","text_vs_code","text_fs_code","TEXUNIT_IMAGE","enable_bg","image_tex","SimpleTextMaterial","Color","g","_r","_g","_b","_a","floatToByte","rgba","toArray","rgb","AbstractPointEntity","addPoint","_position","TextEntity","_text_parent_props","font_style","font_weight","font_size","DEFAULT_FONT_SIZE","font_family","DEFAULT_FONT_FAMILY","generateOpacityColor","stroke_color","DEFAULT_STROKE_COLOR","stroke_width","DEFAULT_STROKE_WIDTH","bg_color","DEFAULT_BG_COLOR","enable_stroke","_primitive_producer","setFontStyle","setFontWeight","setFontSize","setStrokeColor","setStrokeLineWidth","_setValueProperty","weight","family","_setColorProperty","onAddTextEntry","_TextEntity_text_material","_TextEntity_text_material_pick","_SimpleTextEntity_text_material","_SimpleTextEntity_text_material_pick","onChangeParentProperty","setOpacityColor","setFromArray","addText","setFontFamily","setEnableStroke","setBackgroundColor","setEnableBackground","DEFAULT_TEXT_UPPER","DEFAULT_TEXT_LOWER","SAFETY_PIXEL_MARGIN","MAX_IMAGE_WIDTH","_dirty","pickMaterial","_isSimpleText","_getSimpleTextMaterial","_getTextMaterial","gocs_array","_createFlatGocsArray","_updateTransform","layout","Layout","isValid","num_entries","ibase","flat_array","_text","_props","_copyColorProperty","position_temp","setPosition","setText","onChangeChildProperty","variant","_createItemList","_is_valid","row_layouts","_createRowLayouts","_setupLocation","_isSimpleTextWithAllItems","_createTextureForSimple","_createVerticesForSimple","createCanvasContext","items","LItem","height_pixel","row_layout","RowLayout","textAlign","textBaseline","fillStyle","is_canceled","_entry","enable_background","drawRect","drawStrokeText","drawText","xo","yo","zo","xc","pos_x","yc","pos_y","xsize","xn","yn","toVector4","locate","width_assumed","_pos_x","_pos_y","font","measureText","_is_canceled","fillText","toRGBString","strokeStyle","lineWidth","lineJoin","strokeText","fillRect","width_pixel","src_items","width_assumed_total","height_pixel_max","row_items","_width_assumed","_height_pixel","ModelEntity","_rotation","_anchor_mode","refs","_setupTransform","_setupModelObject","bounds","getBounds","orientation_temp","orientation_type","orientation_tsolver","findFirstTypeSupported","_setRotation","setOrientation","scale_temp","scale_type","scale_tsolver","setScale","ref_model","setModelObject","op","onChangePosition","getTransformMatrix","sameScaleVector3","getExistingElevation","_ptoe_array","_abs_position","createPrimitives","pickPrimitives","_updateAbsPosition","mlocs_to_gocs","getMlocsToGocsMatrix","entity_to_mlocs","mul_RS","entity_to_gocs","ptoe_array","ptoe","min_lon","max_lon","min_lat","max_lat","min_alt","max_alt","bbox0_x","bbox0_y","bbox0_z","bbox1_x","bbox1_y","bbox1_z","points0","setFromGocs","points1","bounds_array","_getElevation","rmat","svec","PolygonMaterial","polygon_vs_code","polygon_fs_code","setBoolean","lighting","Triangulator","_points","_polygons","Polygon","_makeYMonotonePolygons","triangles","_numTriangles","polygon","_makeTriangleArray","numVertices","_getYOrderedVertices","edge_mgr","EdgeManager","diag_mgr","DiagonalManager","vertex","getVertexType","ledge","getFrontEdge","addEdge","getBackEdge","lhelp","getHelper","addDiagonal","removeEdge","nedge","findNearestLeftEdge","setHelper","redge","rhelp","nhelp","isRightInner","uedge","uhelp","dedge","splitPolygons","getVertices","Vertex","comparePositionY","Stack","is_right","is_same_chain","v2","v3","isCCW","cprev","cnext","dot","bx","by","_first","coords","poly","before","_updateVertices","_edges","edge","helper","nearest_edge","min_distance","Diagonal","polygons","_diagonals","_dmap","DiagonalMap","diagonal","_shuffleArray","removeDiagonal","_splitPolygonHalf","v1a","v2a","v2b","v1b","createByVertex","_replaceVertexInDiagonals","sv","sc","ec","vo","va","vb","removeDiagonals","vo_oppo","_testDiagonal","aflag","bflag","det","_map","_addDiagonalByVertex","_removeDiagonalByVertex","diagonals","diag","_array","globalIsFinite","isFinite","numberIsFinite","ConvexPolygon","ei","si","oi","fi","fx","fy","_clip_by_polygon","dval","current","_clip_by_halfspace","dist_min","dist_max","_clip_by_crossed_halfspace","_get_cross_edges_by_crossed_halfspace_boundary","ce0","ce1","first_i","last_i","cross_edges","ce_count","sd","ed","PolygonEntity","_extruded_height","_boundaries","setExtrudedHeight","extruded_height","_addBoundary","bo","is_inner","Boundary","onChangeBoundary","_PolygonEntity_material","_PolygonEntity_material_pick","boundaries","boundary","addInnerBoundary","addOuterBoundary","_countNumPointsOnBoundaries","dst_points","src_size","src_points","_getCombinedBoundary2DPoints","num_src_points","triangulator","addBoundary","onChangeExtruded","INVALID","_triangles","_getPosition","MESH_DIRTY","TRIANGLE_DIRTY","_createTriangles","_updatePrimitiveMesh","_updatePrimitiveProperties","cb_data","BoundaryConbiner","points_array","fpv","s1_num_floats","s2_num_floats","s3_num_floats","unormal","setVec3ToArray","p00","p10","p01","p11","snormal","beg_i","end_i","b0","b1","setArrayToVec3","setTriangleNormal","bnormal","scale3","num_upper_triangles","num_side_triangles","num_bottom_triangles","ioffset","voffset","PolygonAreaManager","submeshes","_createSubmeshes","smesh","getNumVertices","addVertices","num_triangles","getNumTriangles","addIndices","RectSubmesh","m1","_create_clipped_polygons_submeshes","m2","div_w","_create_submeshes_sp","area_rect","createByRectangle","selected_polygons","arit_coords","src_polygons","area_polygon","clipped_polygons","clipped","PolygonsSubmesh","is_ccw","si_step","top_i","top_x","top_y","next_i","prev_i","pe","_getCombinedBoundaryPoints","base_points","elevation","upper_points","lower_points","upper_ocs_points","lower_ocs_points","src_indices","num_src_indices","src_coords","_add_polygon_to_array","si0","si1","si2","dst_polygons","mx_min_1","mx_min_2","mx_max_2","mx_1","dx_1","mx_2","mx_3","Submesh","_x_min","_y_min","_x_max","_y_max","_div_x","_div_y","end_iu","end_iv","_arit_coords","_num_triangles","_get_elevation_plane","_add_polygon_vertices","iofs_next","vofs_next","_add_polygon_indices","src_vertices","z_coords","z1","normal","temp_normal_ax","temp_normal_ay","BufferView","jbufferView","bufferViews","_buffer","findBuffer","_byteLength","_target","_byteOffset","_byteStride","Accessor","jaccessor","accessors","_componentType","_count","_bufferView","_normalized","_index","compo_size","_ComponentData","data_size","first_offset","modmap","compo_data","compo_bytes","compo_stride","arraybuffer","dataview","typedarray","getCompo","getcompo","compo_shorts","short_offset","short_stride","short_base_index","compo_base_index","short_index","getBit","compo_index","setBit","old_byte_offset","rebuildBySplitter","jmaterial","materials","_pbrMetallicRoughness","_doubleSided","_alphaMode","_alphaCutoff","_emissiveFactor","_emissiveTexture","_normalTexture","_occlusionTexture","_setupPbrMetallicRoughness","_setupGenericParameters","addTextureInfo","jprimitive","_mode","_attributes","_setupAttributes","_setupIndices","_setupMaterial","jattributes","addAccessor","jmesh","jprimitives","jnode","_matrix","_mesh","_setupChildren","_setupMatrix","_setupMesh","rotation","translation","tx","ty","tz","jscene","_root_nodes","node_index","getName","BufferSplitter","frag0","Fragment","frag1","_fragments","getRangeInBuffer","_updateByRange","_floor4","frag","createSubBuffer","isIncluded","isInside","fragx","isTouch","mergeRange","BitVector","_length","uint32_index","uint32_value","uint32_mask","BufferEntry","_attrib_accessors","_index_accessors","_getUnitedOriginalAccessors","modifyByteOrder","_splitBufferAndRebuildAccessors","splitter","_getOriginalAccessors","update","rebuildAccessor","orig_accessors","ImageEntry","_image","_texinfo_objects","texinfo_objects","representative_texture","Buffer","_uri","_binary","jbuffer","buffers","uri","onStartLoadBuffer","loadBinary","onFinishLoadBuffer","subBuffer","jimage","images","onStartLoadImage","onFinishLoadImage","_mimeType","_gjson","_base_resource","base_resource","_binary_type","binary_type","_image_type","image_type","_supported_extensions","supported_extensions","_resolve","_reject","_used_extensions","_buffer_entries","_image_entries","_body_finished","_load_count","_load_error","_settled","_loadVersion","major","supported_ext","_getSupportedExtensionNames","_enumRequiredExtensionNames","required_ext","_loadExtensionsUsed","_loadScenes","_loadDefaultSceneIndex","_onFinishLoadBody","asset","version_array","major_version","minor_version","minor","extensionsRequired","supported_extensions_by_loader","supported_extensions_by_client","extensionsUsed","num_scenes","dict","loadSubResource","addAttributeAccessor","addIndexAccessor","_onFinishLoadSomething","_rewriteBuffersForByteOrder","_splitBuffersAndRebuildAccessors","_rebuildTextureInfo","rewriteByteOrder","splitBufferAndRebuildAccessors","rebuildTextureInfo","Tool","SceneLoader","_references","_finished","ref","oscene","_check_cancel","_load_object","_load_model_register","_postload_object","_load_entity_list","model_register","asyncTasks","model","_load_model_container","resolveResourceSupported","gltf_resource","resolveResource","GltfTool","getSupportedExtensions_glTF","offset_transform","parseOffsetTransform","setOffsetTransform","_setReference","entity_list","ot","translate","orientation","_defaultHeaders","ContainerController","ContainerPosition","TOP_LEFT","container_element","getElementById","_viewer_container","_container","_is_compact","_sizeChanged","_setContainerVisibility","_deleteContainer","createContainer","removeEventListener","parent_container","parentElement","TOP_RIGHT","BOTTOM_LEFT","BOTTOM_RIGHT","_compact_size","LogoController","sub_container","clientWidth","classList","getElementsByClassName","main_container","className","AttributionController","_attributions","attributions","copyAttributions","_default_attribution","attribution","attribution_container","_createCanvas","_container_element","_canvas_element","_createAnimationBindingBlock","_createDemProvider","_createImageProvider","_createLayerCollection","_ground_visibility","_getBoolOption","_entity_visibility","_render_mode","SURFACE","_createPointCloudCollection","_render_callback","_createRenderCallback","_frame_req_id","_previous_time","_is_destroyed","_sun_direction","_postProcesses","_logo_controller","logo_controller","_attribution_controller","attribution_controller","_createLogoAttributionContainer","_requestNextFrame","_updateCanvasSize","maprayCancelAnimationFrame","detach","cancelLoaders","_destroy","_deleteLogoAttributionContainer","abb","point_cloud_providers","render_callback","attach","_positions","findHighestAccuracy","toBlob","maprayRequestAnimationFrame","_updateFrame","_updateTime","onUpdateFrameInner","clearStats","render","_postProcess","_finishDebugStats","screen_position","pick_result","now_time","maprayNow","clientHeight","nextProcesses","num_wait_reqs_dem","getNumDemWaitingRequests","num_wait_reqs_img","getNumWaitingRequests","onUpdate","defaultValue","CloudDemProvider","api_key","PinMaterial","pin_vs_code","pin_fs_code","TEXUNIT_IMAGE_MASK","image_mask","_bg_color","_fg_color","IconLoader","_cache","prop","getKey","doCreate","icon","IconLoaderItem","_funcs","_icon","func","alreadyDone","doLoad","drawImage","URLTemplateIconLoader","urlPrefix","urlSuffix","URLIconLoaderItem","TextIconLoader","TextIconLoaderItem","fontFamily","ImageIconLoader","image_src","ImageIconLoaderItem","_image_src","HTMLImageElement","waitForLoad","HTMLCanvasElement","PinEntity","_parent_props","fg_color","vector2","setFGColor","setBGColor","size_temp","size_type","size_tsolver","setSize","_setVector2Property","_setVector3Property","addTextPin","MakiIconPinEntry","onAddEntry","TextPinEntry","_PinEntity_pin_material","_PinEntity_pin_material_pick","copyVector2","addPin","CIRCLE_SEP_LENGTH","DEFAULT_SIZE","DEFAULT_FG_COLOR","texture_mask","AbstractPinEntry","_copyPropertyVector3f","_copyPropertyVector2f","isLoaded","setId","_setupMakiIconPinAnimationBindingBlock","maki_id","_maki_id","makiIconLoader","onEnd","_setupTextPinAnimationBindingBlock","textIconLoader","_texture_mask","_createTextureMask","ie","eitem","ysize","vertices_push_texture","p3","centerPos","ImageIconMaterial","image_icon_vs_code","image_icon_fs_code","ImageIconEntity","_ImageEntity_image_material","_ImageEntity_image_material_pick","addImageIcon","setOrigin","DEFAULT_ICON_SIZE","DEFAULT_ORIGIN","setImage","iconLoader","TO_ENTRIES","$values","GeoJSONLoader","_getPointFGColor","getPointFGColor","defaultGetPointFGColorCallback","_getPointBGColor","getPointBGColor","defaultGetPointBGColorCallback","_getPointSize","getPointSize","defaultGetPointSizeCallback","_getPointIconId","getPointIconId","defaultGetPointIconIdCallback","_getLineColor","getLineColor","defaultGetLineColorCallback","_getLineWidth","getLineWidth","defaultGetLineWidthCallback","_getFillColor","getFillColor","defaultGetFillColorCallback","_getExtrudedHeight","getExtrudedHeight","defaultGetExtrudedHeightCallback","_getAltitudeMode","getAltitudeMode","defaultGetAltitudeModeCallback","_getAltitude","getAltitude","defaultGetAltitudeCallback","_cancelled","geoJson","_load_geojson_object","geojson","success","TYPES","FEATURE_COLLECTION","features","featureId","FEATURE","geometry","_load_geometry_object","SUPPORTED_GEOMETRY_TYPES","coordinates","GEOMETRY_TYPES","POINT","MULTI_POINT","_loadPoint","LINE_STRING","MULTI_LINE_STRING","_loadLines","POLYGON","MULTI_POLYGON","_loadPolygons","GEOMETRY_COLLECTION","color4","_generateLine","opaticy","fp","_flatten","fgColor","bgColor","iconId","_getActualValue","defaultAltitude","addMakiIconPin","targetCoordinates","_generatePolygon","pointsList","valueFromCallback","valueInGeoJSON","ary","defaultLineColor","defaultFillColor","defaultLineWidth","defaultPointFGColor","defaultPointBGColor","defaultPointSize","defaultPointIconId","defaultExtrudedHeight","DebugStats","$parseInt","hex","parseIntImplementation","nativeEndsWith","endsWith","endPosition","AbstractDataset","api","_aip","_owner_id","_description","_created_at","_updated_at","owner_id","created_at","updated_at","Dataset","dataset","_restoreFromJson","Dataset3D","_origin","_format","_scene_id","_path","_srid","scene_id","srid","PointCloudDataset","_bounding_box","_content_root","content_root","ApiUrlResource","_api","DatasetResource","datasetId","_datasetId","getFeatures","Dataset3DSceneResource","datasetIds","_datasetIds","get3DDatasetScene","PointCloudDatasetResource","getPointCloudDataset","MaprayApiError","resonse","MaprayApi","basePath","_option","DEFAULT_BASE_PATH","token","userId","page","getDatasets","datasets_json","dataset_json","createFromJson","getDataset","get3DDatasets","get3DDataset","getPointCloudDatasets","put","patch","indexStr","fetchAPI","errorResponseJson","errorObject","PointCloudProvider","NOT_INITIALIZED","doInit","INITIALIZED","_id_max","doDestroy","RawPointCloudProvider","_info_resource","_taskMap","_requests","abortController","_createPath","buf","mapray","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","oCancelAnimationFrame","perf","mozNow","msNow","oNow","webkitNow","date"],"mappings":"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"} \ No newline at end of file diff --git a/_deploy/public/mapray-js/v0.8.6/mapray.min.js b/_deploy/public/mapray-js/v0.8.6/mapray.min.js new file mode 100644 index 00000000..536dc9d3 --- /dev/null +++ b/_deploy/public/mapray-js/v0.8.6/mapray.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).mapray=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var r=function(e){return e&&e.Math==Math&&e},n=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof e&&e)||Function("return this")(),i=function(e){try{return!!e()}catch(e){return!0}},a=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),o=function(e){return"object"==typeof e?null!==e:"function"==typeof e},s=n.document,u=o(s)&&o(s.createElement),_=function(e){return u?s.createElement(e):{}},l=!a&&!i((function(){return 7!=Object.defineProperty(_("div"),"a",{get:function(){return 7}}).a})),c=function(e){if(!o(e))throw TypeError(String(e)+" is not an object");return e},h=function(e,t){if(!o(e))return e;var r,n;if(t&&"function"==typeof(r=e.toString)&&!o(n=r.call(e)))return n;if("function"==typeof(r=e.valueOf)&&!o(n=r.call(e)))return n;if(!t&&"function"==typeof(r=e.toString)&&!o(n=r.call(e)))return n;throw TypeError("Can't convert object to primitive value")},f=Object.defineProperty,d={f:a?f:function(e,t,r){if(c(e),t=h(t,!0),c(r),l)try{return f(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},v=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},p=a?function(e,t,r){return d.f(e,t,v(1,r))}:function(e,t,r){return e[t]=r,e},y={}.hasOwnProperty,m=function(e,t){return y.call(e,t)},g=function(e,t){try{p(n,e,t)}catch(r){n[e]=t}return t},k=n["__core-js_shared__"]||g("__core-js_shared__",{}),E=Function.toString;"function"!=typeof k.inspectSource&&(k.inspectSource=function(e){return E.call(e)});var w,b,x,T=k.inspectSource,A=n.WeakMap,R="function"==typeof A&&/native code/.test(T(A)),I=t((function(e){(e.exports=function(e,t){return k[e]||(k[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.4",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),P=0,M=Math.random(),S=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++P+M).toString(36)},L=I("keys"),D=function(e){return L[e]||(L[e]=S(e))},C={},F=n.WeakMap;if(R){var N=new F,O=N.get,U=N.has,V=N.set;w=function(e,t){return V.call(N,e,t),t},b=function(e){return O.call(N,e)||{}},x=function(e){return U.call(N,e)}}else{var B=D("state");C[B]=!0,w=function(e,t){return p(e,B,t),t},b=function(e){return m(e,B)?e[B]:{}},x=function(e){return m(e,B)}}var z={set:w,get:b,has:x,enforce:function(e){return x(e)?b(e):w(e,{})},getterFor:function(e){return function(t){var r;if(!o(t)||(r=b(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return r}}},G=t((function(e){var t=z.get,r=z.enforce,i=String(String).split("String");(e.exports=function(e,t,a,o){var s=!!o&&!!o.unsafe,u=!!o&&!!o.enumerable,_=!!o&&!!o.noTargetGet;"function"==typeof a&&("string"!=typeof t||m(a,"name")||p(a,"name",t),r(a).source=i.join("string"==typeof t?t:"")),e!==n?(s?!_&&e[t]&&(u=!0):delete e[t],u?e[t]=a:p(e,t,a)):u?e[t]=a:g(t,a)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||T(this)}))})),j=Date.prototype,q=j.toString,Y=j.getTime;new Date(NaN)+""!="Invalid Date"&&G(j,"toString",(function(){var e=Y.call(this);return e==e?q.call(this):"Invalid Date"}));var H={}.propertyIsEnumerable,X=Object.getOwnPropertyDescriptor,W={f:X&&!H.call({1:2},1)?function(e){var t=X(this,e);return!!t&&t.enumerable}:H},Q={}.toString,Z=function(e){return Q.call(e).slice(8,-1)},J="".split,K=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==Z(e)?J.call(e,""):Object(e)}:Object,$=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},ee=function(e){return K($(e))},te=Object.getOwnPropertyDescriptor,re={f:a?te:function(e,t){if(e=ee(e),t=h(t,!0),l)try{return te(e,t)}catch(e){}if(m(e,t))return v(!W.f.call(e,t),e[t])}},ne=n,ie=function(e){return"function"==typeof e?e:void 0},ae=function(e,t){return arguments.length<2?ie(ne[e])||ie(n[e]):ne[e]&&ne[e][t]||n[e]&&n[e][t]},oe=Math.ceil,se=Math.floor,ue=function(e){return isNaN(e=+e)?0:(e>0?se:oe)(e)},_e=Math.min,le=function(e){return e>0?_e(ue(e),9007199254740991):0},ce=Math.max,he=Math.min,fe=function(e,t){var r=ue(e);return r<0?ce(r+t,0):he(r,t)},de=function(e){return function(t,r,n){var i,a=ee(t),o=le(a.length),s=fe(n,o);if(e&&r!=r){for(;o>s;)if((i=a[s++])!=i)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===r)return e||s||0;return!e&&-1}},ve={includes:de(!0),indexOf:de(!1)},pe=ve.indexOf,ye=function(e,t){var r,n=ee(e),i=0,a=[];for(r in n)!m(C,r)&&m(n,r)&&a.push(r);for(;t.length>i;)m(n,r=t[i++])&&(~pe(a,r)||a.push(r));return a},me=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ge=me.concat("length","prototype"),ke={f:Object.getOwnPropertyNames||function(e){return ye(e,ge)}},Ee={f:Object.getOwnPropertySymbols},we=ae("Reflect","ownKeys")||function(e){var t=ke.f(c(e)),r=Ee.f;return r?t.concat(r(e)):t},be=function(e,t){for(var r=we(t),n=d.f,i=re.f,a=0;aa;)d.f(e,r=n[a++],t[r]);return e},ut=ae("document","documentElement"),_t=D("IE_PROTO"),lt=function(){},ct=function(e){return"