awv3
Version:
⚡ AWV3 embedded CAD
273 lines (206 loc) • 10.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.normalizeName = exports.buildFeaturePath = exports.createObserver = exports.arrayDiff = exports.pack = exports.ObjectPrototype = exports.Pool = undefined;
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _map = require('babel-runtime/core-js/map');
var _map2 = _interopRequireDefault(_map);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _set = require('babel-runtime/core-js/set');
var _set2 = _interopRequireDefault(_set);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _get2 = require('babel-runtime/helpers/get');
var _get3 = _interopRequireDefault(_get2);
var _three = require('three');
var THREE = _interopRequireWildcard(_three);
var _pako = require('pako');
var _pako2 = _interopRequireDefault(_pako);
var _base64Arraybuffer = require('base64-arraybuffer');
var _base64Arraybuffer2 = _interopRequireDefault(_base64Arraybuffer);
var _object = require('../three/object3');
var _object2 = _interopRequireDefault(_object);
var _easing = require('../animation/easing');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Pool = exports.Pool = function (_Object) {
(0, _inherits3.default)(Pool, _Object);
function Pool(_ref) {
var session = _ref.session;
(0, _classCallCheck3.default)(this, Pool);
var _this = (0, _possibleConstructorReturn3.default)(this, (Pool.__proto__ || (0, _getPrototypeOf2.default)(Pool)).call(this));
_this.session = session;
_this.temporary = new _object2.default();
_this.temporary.updateParentMaterials = false;
_this.temporary.measurable = false;
(0, _get3.default)(Pool.prototype.__proto__ || (0, _getPrototypeOf2.default)(Pool.prototype), 'add', _this).call(_this, _this.temporary);
return _this;
}
(0, _createClass3.default)(Pool, [{
key: 'update',
value: function update() {
// ...
}
}]);
return Pool;
}(_object2.default);
var ObjectPrototype = exports.ObjectPrototype = function (_Object2) {
(0, _inherits3.default)(ObjectPrototype, _Object2);
function ObjectPrototype(_ref2) {
var session = _ref2.session;
(0, _classCallCheck3.default)(this, ObjectPrototype);
var _this2 = (0, _possibleConstructorReturn3.default)(this, (ObjectPrototype.__proto__ || (0, _getPrototypeOf2.default)(ObjectPrototype)).call(this));
_this2.on((0, _defineProperty3.default)({}, _object2.default.Events.Lifecycle.ChildAdded, function (_ref3) {
var child = _ref3.child;
return child.updateMaterials().animate({ materials: {
meshes: [{ opacity: 1 }],
lines: [{ opacity: typeof session.options.materials.edgeOpacity !== "undefined" ? session.options.materials.edgeOpacity : 1 }]
} }).from({ materials: {
meshes: [{ opacity: 0 }],
lines: [{ opacity: 0 }]
} }).start(200).easing(_easing.exponential.in);
}));
return _this2;
}
return ObjectPrototype;
}(_object2.default);
// Packs ArrayBuffer into deflated base64 for ClassCAD stream consumption
var pack = exports.pack = function pack(buffer) {
return _base64Arraybuffer2.default.encode(_pako2.default.deflate(buffer, { raw: true }));
};
// Helps detecting changes in two array-states
var arrayDiff = exports.arrayDiff = function arrayDiff() {
var next = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var current = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var callbackNew = arguments[2];
var callbackDeleted = arguments[3];
var nextSet = new _set2.default(next);
var currentSet = new _set2.default(current);
var promises = [];
if (callbackNew) {
var newItems = next.filter(function (item) {
return !currentSet.has(item);
});
if (newItems.length) {
var results = callbackNew(newItems);
if (results) {
promises = results;
}
}
}
if (callbackDeleted) {
var deletedItems = current.filter(function (item) {
return !nextSet.has(item);
});
if (deletedItems.length) {
var _results = callbackDeleted(deletedItems);
if (_results) {
promises = [].concat((0, _toConsumableArray3.default)(promises), (0, _toConsumableArray3.default)(_results));
}
}
}
return _promise2.default.all(promises);
};
// State observe with pre-select and user-select
var createObserver = exports.createObserver = function createObserver(store) {
var preSelect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : store.getState;
return function (userSelect, onChange) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var _options$fireOnStart = options.fireOnStart,
fireOnStart = _options$fireOnStart === undefined ? false : _options$fireOnStart,
_options$unsubscribeO = options.unsubscribeOnUndefined,
unsubscribeOnUndefined = _options$unsubscribeO === undefined ? false : _options$unsubscribeO,
_options$onRemove = options.onRemove,
onRemove = _options$onRemove === undefined ? undefined : _options$onRemove,
_options$manager = options.manager,
manager = _options$manager === undefined ? undefined : _options$manager,
_options$deep = options.deep,
deep = _options$deep === undefined ? false : _options$deep;
var finish = void 0,
unsubscribed = false;
var preselect = void 0,
state = void 0;
if ((preselect = preSelect()) === undefined || (state = userSelect(preselect)) === undefined && unsubscribeOnUndefined) return function () {};
var childSubscriptions = new _map2.default();
var addChild = function addChild(id, unsub) {
return childSubscriptions.set(id, unsub);
};
var removeChild = function removeChild(state) {
childSubscriptions.delete(state.id);onRemove && onRemove(state);
};
var handleChange = function handleChange() {
if (unsubscribed) return;
// Get pre-selected state
var previousState = state;
// Unsubscribe if preselect or state is undefined
if ((preselect = preSelect()) === undefined || (state = userSelect(preselect)) === undefined && unsubscribeOnUndefined) {
// revert state so that finish calls onRemove on a good state
state = previousState;
return finish();
}
if (state === previousState) return;
// add children subscriptions
if (deep) arrayDiff((state || {}).children, (previousState || {}).children, function (newChildren) {
return newChildren.forEach(function (child) {
return addChild(child, createObserver(store, preSelect)(function (state) {
return state.tree[child];
}, onChange, (0, _extends3.default)({}, options, { unsubscribeOnUndefined: true, onRemove: removeChild, manager: undefined })));
});
});
onChange(state, previousState);
};
// Subscribe to store, fire on start, return hooked unsubscribe
if (fireOnStart || deep) {
state = undefined; // so that onChange is called with prev === undefined
handleChange();
}
var unsubscribe = store.subscribe(handleChange);
finish = function finish() {
if (unsubscribed) return;
unsubscribed = true;
unsubscribe();
onRemove && onRemove(state);
// copy to avoid mutation during iteration
var unsubs = [].concat((0, _toConsumableArray3.default)(childSubscriptions.values()));
// remove children subscriptions
unsubs.forEach(function (unsub) {
return unsub();
});
};
// Call manager, if available. This allows classes to track subscribes and clean up
// in bulk once they are destroyed.
if (manager) manager(finish);
return finish;
};
};
// Build ClassAD feature path (_O. ...)
var buildFeaturePath = exports.buildFeaturePath = function buildFeaturePath(tree, feature) {
if ((typeof feature === 'undefined' ? 'undefined' : (0, _typeof3.default)(feature)) !== 'object') feature = tree[feature];
var path = [normalizeName(feature.name)],
parent = feature;
while (parent && parent.parent > 1) {
parent = tree[parent.parent];
path.push(normalizeName(parent.name));
}
return '_O.' + path.reverse().join('.');
};
var normalizeName = exports.normalizeName = function normalizeName(name) {
return name.replace(/(\s|-|\r?\n)/g, '');
};