itowns
Version:
A JS/WebGL framework for 3D geospatial data visualization
143 lines (126 loc) • 4.75 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _default = {
/**
* Cleanup obj to release three.js allocated resources
* @param {Object3D} obj object to release
*/
cleanup: function cleanup(obj) {
obj.layer = null;
if (typeof obj.dispose === 'function') {
obj.dispose();
} else {
if (obj.geometry) {
obj.geometry.dispose(); // the Object Removal Helper causes inconsistencies
// when it assigns null to a geometry present in the Cache.
// Actually, the cache can provide a mesh whose geometry is null.
// see https://github.com/iTowns/itowns/issues/869
// obj.geometry = null;
}
if (obj.material) {
if (Array.isArray(obj.material)) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = obj.material[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var material = _step.value;
material.dispose();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
} else {
obj.material.dispose();
} // obj.material = null;
}
}
},
/**
* Remove obj's children belonging to a layer.
* Neither obj nor its children will be disposed!
* @param {Layer} layer The layer that objects must belong to. Other object are ignored
* @param {Object3D} obj The Object3D we want to clean
* @return {Array} an array of removed Object3D from obj (not including the recursive removals)
*/
removeChildren: function removeChildren(layer, obj) {
var toRemove = obj.children.filter(function (c) {
return c.layer === layer;
});
obj.remove.apply(obj, (0, _toConsumableArray2["default"])(toRemove));
return toRemove;
},
/**
* Remove obj's children belonging to a layer and cleanup objexts.
* obj will be disposed but its children **won't**!
* @param {Layer} layer The layer that objects must belong to. Other object are ignored
* @param {Object3D} obj The Object3D we want to clean
* @return {Array} an array of removed Object3D from obj (not including the recursive removals)
*/
removeChildrenAndCleanup: function removeChildrenAndCleanup(layer, obj) {
var toRemove = obj.children.filter(function (c) {
return c.layer === layer;
});
obj.remove.apply(obj, (0, _toConsumableArray2["default"])(toRemove));
if (obj.layer === layer) {
this.cleanup(obj);
}
return toRemove;
},
/**
* Recursively remove obj's children belonging to a layer.
* All removed obj will have their geometry/material disposed.
* @param {Layer} layer The layer that objects must belong to. Other object are ignored
* @param {Object3D} obj The Object3D we want to clean
* @return {Array} an array of removed Object3D from obj (not including the recursive removals)
*/
removeChildrenAndCleanupRecursively: function removeChildrenAndCleanupRecursively(layer, obj) {
var toRemove = obj.children.filter(function (c) {
return c.layer === layer;
});
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = toRemove[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var c = _step2.value;
this.removeChildrenAndCleanupRecursively(layer, c);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
_iterator2["return"]();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
obj.remove.apply(obj, (0, _toConsumableArray2["default"])(toRemove));
if (obj.layer === layer) {
this.cleanup(obj);
}
return toRemove;
}
};
exports["default"] = _default;
;