kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
97 lines (95 loc) • 16.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.Effect = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _utils = require("@kepler.gl/utils");
var _commonUtils = require("@kepler.gl/common-utils");
var _constants = require("@kepler.gl/constants");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var Effect = exports.Effect = /*#__PURE__*/function () {
function Effect() {
var _POSTPROCESSING_EFFEC;
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
(0, _classCallCheck2["default"])(this, Effect);
(0, _defineProperty2["default"])(this, "id", void 0);
(0, _defineProperty2["default"])(this, "type", void 0);
(0, _defineProperty2["default"])(this, "isEnabled", void 0);
// effect specific parameters for a deck.gl effect (uniforms)
(0, _defineProperty2["default"])(this, "parameters", void 0);
// runtime props
(0, _defineProperty2["default"])(this, "isConfigActive", void 0);
(0, _defineProperty2["default"])(this, "isJsonEditorActive", void 0);
(0, _defineProperty2["default"])(this, "deckEffect", void 0);
(0, _defineProperty2["default"])(this, "_uiConfig", void 0);
this.id = props.id || "e_".concat((0, _commonUtils.generateHashId)(6));
var _props = this.getDefaultProps(props);
this.type = _props.type;
this.isEnabled = _props.isEnabled;
this.isConfigActive = _props.isConfigActive;
this.isJsonEditorActive = _props.isJsonEditorActive;
this._uiConfig = _constants.LIGHT_AND_SHADOW_EFFECT.type === this.type ? _constants.LIGHT_AND_SHADOW_EFFECT.parameters : ((_POSTPROCESSING_EFFEC = _constants.POSTPROCESSING_EFFECTS[this.type]) === null || _POSTPROCESSING_EFFEC === void 0 ? void 0 : _POSTPROCESSING_EFFEC.parameters) || [];
this.parameters = (0, _utils.validateEffectParameters)(_props.parameters, this._uiConfig);
this.deckEffect = null;
this._initializeEffect();
}
return (0, _createClass2["default"])(Effect, [{
key: "_initializeEffect",
value: function _initializeEffect() {
// implemented in subclasses
}
}, {
key: "clone",
value: function clone() {
var props = this.getDefaultProps(this);
return new this.constructor(props);
}
}, {
key: "getDefaultProps",
value: function getDefaultProps() {
var _props$isEnabled, _props$isConfigActive, _props$isJsonEditorAc;
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return {
id: props.id || "e_".concat((0, _commonUtils.generateHashId)(6)),
type: props.type || _constants.DEFAULT_POST_PROCESSING_EFFECT_TYPE,
isEnabled: (_props$isEnabled = props.isEnabled) !== null && _props$isEnabled !== void 0 ? _props$isEnabled : true,
isConfigActive: (_props$isConfigActive = props.isConfigActive) !== null && _props$isConfigActive !== void 0 ? _props$isConfigActive : true,
isJsonEditorActive: (_props$isJsonEditorAc = props.isJsonEditorActive) !== null && _props$isJsonEditorAc !== void 0 ? _props$isJsonEditorAc : false,
parameters: _objectSpread({}, props.parameters)
};
}
}, {
key: "setProps",
value: function setProps(props) {
var _props$id, _props$type, _props$isEnabled2, _props$isConfigActive2, _props$isJsonEditorAc2;
this.id = (_props$id = props.id) !== null && _props$id !== void 0 ? _props$id : this.id;
this.type = (_props$type = props.type) !== null && _props$type !== void 0 ? _props$type : this.type;
this.isEnabled = (_props$isEnabled2 = props.isEnabled) !== null && _props$isEnabled2 !== void 0 ? _props$isEnabled2 : this.isEnabled;
this.isConfigActive = (_props$isConfigActive2 = props.isConfigActive) !== null && _props$isConfigActive2 !== void 0 ? _props$isConfigActive2 : this.isConfigActive;
this.isJsonEditorActive = (_props$isJsonEditorAc2 = props.isJsonEditorActive) !== null && _props$isJsonEditorAc2 !== void 0 ? _props$isJsonEditorAc2 : this.isJsonEditorActive;
this.parameters = _objectSpread(_objectSpread({}, this.parameters), (0, _utils.validateEffectParameters)(props.parameters, this._uiConfig));
}
}, {
key: "isValidToSave",
value: function isValidToSave() {
return Boolean(this.type && this.id && this.deckEffect);
}
/**
* Effect specific list of configurable parameters.
* @returns All parameters are in preffered order.
*/
}, {
key: "getParameterDescriptions",
value: function getParameterDescriptions() {
return this._uiConfig || [];
}
}]);
}();
var _default = exports["default"] = Effect;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiX2NvbW1vblV0aWxzIiwiX2NvbnN0YW50cyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiRWZmZWN0IiwiZXhwb3J0cyIsIl9QT1NUUFJPQ0VTU0lOR19FRkZFQyIsInByb3BzIiwidW5kZWZpbmVkIiwiX2NsYXNzQ2FsbENoZWNrMiIsImlkIiwiY29uY2F0IiwiZ2VuZXJhdGVIYXNoSWQiLCJfcHJvcHMiLCJnZXREZWZhdWx0UHJvcHMiLCJ0eXBlIiwiaXNFbmFibGVkIiwiaXNDb25maWdBY3RpdmUiLCJpc0pzb25FZGl0b3JBY3RpdmUiLCJfdWlDb25maWciLCJMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCIsInBhcmFtZXRlcnMiLCJQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTIiwidmFsaWRhdGVFZmZlY3RQYXJhbWV0ZXJzIiwiZGVja0VmZmVjdCIsIl9pbml0aWFsaXplRWZmZWN0IiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiY2xvbmUiLCJjb25zdHJ1Y3RvciIsIl9wcm9wcyRpc0VuYWJsZWQiLCJfcHJvcHMkaXNDb25maWdBY3RpdmUiLCJfcHJvcHMkaXNKc29uRWRpdG9yQWMiLCJERUZBVUxUX1BPU1RfUFJPQ0VTU0lOR19FRkZFQ1RfVFlQRSIsInNldFByb3BzIiwiX3Byb3BzJGlkIiwiX3Byb3BzJHR5cGUiLCJfcHJvcHMkaXNFbmFibGVkMiIsIl9wcm9wcyRpc0NvbmZpZ0FjdGl2ZTIiLCJfcHJvcHMkaXNKc29uRWRpdG9yQWMyIiwiaXNWYWxpZFRvU2F2ZSIsIkJvb2xlYW4iLCJnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9lZmZlY3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHt2YWxpZGF0ZUVmZmVjdFBhcmFtZXRlcnN9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtcbiAgRWZmZWN0IGFzIEVmZmVjdEludGVyZmFjZSxcbiAgRWZmZWN0UHJvcHMsXG4gIEVmZmVjdFByb3BzUGFydGlhbCxcbiAgRWZmZWN0UGFyYW1ldGVyRGVzY3JpcHRpb25cbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX1BPU1RfUFJPQ0VTU0lOR19FRkZFQ1RfVFlQRSxcbiAgUE9TVFBST0NFU1NJTkdfRUZGRUNUUyxcbiAgTElHSFRfQU5EX1NIQURPV19FRkZFQ1Rcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgRWZmZWN0IGltcGxlbWVudHMgRWZmZWN0SW50ZXJmYWNlIHtcbiAgaWQ6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gIC8vIGVmZmVjdCBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciBhIGRlY2suZ2wgZWZmZWN0ICh1bmlmb3JtcylcbiAgcGFyYW1ldGVyczoge1trZXk6IHN0cmluZ106IGFueX07XG4gIC8vIHJ1bnRpbWUgcHJvcHNcbiAgaXNDb25maWdBY3RpdmU6IGJvb2xlYW47XG4gIGlzSnNvbkVkaXRvckFjdGl2ZTogYm9vbGVhbjtcbiAgZGVja0VmZmVjdDogYW55O1xuICBfdWlDb25maWc6IEVmZmVjdFBhcmFtZXRlckRlc2NyaXB0aW9uW107XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEVmZmVjdFByb3BzUGFydGlhbCA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGBlXyR7Z2VuZXJhdGVIYXNoSWQoNil9YDtcblxuICAgIGNvbnN0IF9wcm9wcyA9IHRoaXMuZ2V0RGVmYXVsdFByb3BzKHByb3BzKTtcbiAgICB0aGlzLnR5cGUgPSBfcHJvcHMudHlwZTtcbiAgICB0aGlzLmlzRW5hYmxlZCA9IF9wcm9wcy5pc0VuYWJsZWQ7XG4gICAgdGhpcy5pc0NvbmZpZ0FjdGl2ZSA9IF9wcm9wcy5pc0NvbmZpZ0FjdGl2ZTtcbiAgICB0aGlzLmlzSnNvbkVkaXRvckFjdGl2ZSA9IF9wcm9wcy5pc0pzb25FZGl0b3JBY3RpdmU7XG5cbiAgICB0aGlzLl91aUNvbmZpZyA9XG4gICAgICBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC50eXBlID09PSB0aGlzLnR5cGVcbiAgICAgICAgPyBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC5wYXJhbWV0ZXJzXG4gICAgICAgIDogUE9TVFBST0NFU1NJTkdfRUZGRUNUU1t0aGlzLnR5cGVdPy5wYXJhbWV0ZXJzIHx8IFtdO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHZhbGlkYXRlRWZmZWN0UGFyYW1ldGVycyhfcHJvcHMucGFyYW1ldGVycywgdGhpcy5fdWlDb25maWcpO1xuXG4gICAgdGhpcy5kZWNrRWZmZWN0ID0gbnVsbDtcbiAgICB0aGlzLl9pbml0aWFsaXplRWZmZWN0KCk7XG4gIH1cblxuICBfaW5pdGlhbGl6ZUVmZmVjdCgpIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gIH1cblxuICBjbG9uZSgpOiBFZmZlY3Qge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXREZWZhdWx0UHJvcHModGhpcyk7XG4gICAgcmV0dXJuIG5ldyAodGhpcy5jb25zdHJ1Y3RvciBhcyBuZXcgKHByb3BzOiBFZmZlY3RQcm9wc1BhcnRpYWwpID0+IHRoaXMpKHByb3BzKTtcbiAgfVxuXG4gIGdldERlZmF1bHRQcm9wcyhwcm9wczogRWZmZWN0UHJvcHNQYXJ0aWFsID0ge30pOiBFZmZlY3RQcm9wcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBwcm9wcy5pZCB8fCBgZV8ke2dlbmVyYXRlSGFzaElkKDYpfWAsXG4gICAgICB0eXBlOiBwcm9wcy50eXBlIHx8IERFRkFVTFRfUE9TVF9QUk9DRVNTSU5HX0VGRkVDVF9UWVBFLFxuICAgICAgaXNFbmFibGVkOiBwcm9wcy5pc0VuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgIGlzQ29uZmlnQWN0aXZlOiBwcm9wcy5pc0NvbmZpZ0FjdGl2ZSA/PyB0cnVlLFxuICAgICAgaXNKc29uRWRpdG9yQWN0aXZlOiBwcm9wcy5pc0pzb25FZGl0b3JBY3RpdmUgPz8gZmFsc2UsXG4gICAgICBwYXJhbWV0ZXJzOiB7Li4ucHJvcHMucGFyYW1ldGVyc31cbiAgICB9O1xuICB9XG5cbiAgc2V0UHJvcHMocHJvcHM6IEVmZmVjdFByb3BzUGFydGlhbCkge1xuICAgIHRoaXMuaWQgPSBwcm9wcy5pZCA/PyB0aGlzLmlkO1xuICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGUgPz8gdGhpcy50eXBlO1xuICAgIHRoaXMuaXNFbmFibGVkID0gcHJvcHMuaXNFbmFibGVkID8/IHRoaXMuaXNFbmFibGVkO1xuICAgIHRoaXMuaXNDb25maWdBY3RpdmUgPSBwcm9wcy5pc0NvbmZpZ0FjdGl2ZSA/PyB0aGlzLmlzQ29uZmlnQWN0aXZlO1xuICAgIHRoaXMuaXNKc29uRWRpdG9yQWN0aXZlID0gcHJvcHMuaXNKc29uRWRpdG9yQWN0aXZlID8/IHRoaXMuaXNKc29uRWRpdG9yQWN0aXZlO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHtcbiAgICAgIC4uLnRoaXMucGFyYW1ldGVycyxcbiAgICAgIC4uLnZhbGlkYXRlRWZmZWN0UGFyYW1ldGVycyhwcm9wcy5wYXJhbWV0ZXJzLCB0aGlzLl91aUNvbmZpZylcbiAgICB9O1xuICB9XG5cbiAgaXNWYWxpZFRvU2F2ZSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnR5cGUgJiYgdGhpcy5pZCAmJiB0aGlzLmRlY2tFZmZlY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVmZmVjdCBzcGVjaWZpYyBsaXN0IG9mIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBbGwgcGFyYW1ldGVycyBhcmUgaW4gcHJlZmZlcmVkIG9yZGVyLlxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl91aUNvbmZpZyB8fCBbXTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZmZlY3Q7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFPQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFJOEIsU0FBQUcsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZ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