UNPKG

11.9 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Geometry = undefined;
7
8var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
9
10var _boundPoints = require('bound-points');
11
12var _boundPoints2 = _interopRequireDefault(_boundPoints);
13
14var _defined = require('defined');
15
16var _defined2 = _interopRequireDefault(_defined);
17
18var _arrayFlatten = require('array-flatten');
19
20var _arrayFlatten2 = _interopRequireDefault(_arrayFlatten);
21
22var _meshReindex = require('mesh-reindex');
23
24var _meshReindex2 = _interopRequireDefault(_meshReindex);
25
26var _unindexMesh = require('unindex-mesh');
27
28var _unindexMesh2 = _interopRequireDefault(_unindexMesh);
29
30var _normals = require('normals');
31
32var _normals2 = _interopRequireDefault(_normals);
33
34function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
36function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
37
38var Geometry = exports.Geometry = function () {
39 function Geometry() {
40 var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
41
42 _classCallCheck(this, Geometry);
43
44 var complex = {};
45 if (opts.positions) {
46 complex = opts;
47 } else {
48 complex = opts.complex;
49 }
50 var flatten = (0, _defined2.default)(opts.flatten, complex.flatten, false);
51 Object.defineProperty(this, '_complex', { enumerable: false, value: {} });
52 this.flatten = Boolean(flatten);
53 this.complex = complex || null;
54 }
55
56 _createClass(Geometry, [{
57 key: 'computeBoundingBox',
58 value: function computeBoundingBox() {
59 return (0, _boundPoints2.default)(this.positions);
60 }
61 }, {
62 key: 'complex',
63 set: function set(complex) {
64 if (complex instanceof Geometry) {
65 complex = complex.complex;
66 }
67 if (complex) {
68 if (complex.positions) {
69 ensure3D(complex.positions);
70 }
71 if (complex.normals) {
72 ensure3D(complex.normals);
73 }
74 if (this.flatten && complex.cells) {
75 var cells = complex.cells.map(function (cell) {
76 return cell.slice();
77 });
78 var flattened = (0, _meshReindex2.default)((0, _unindexMesh2.default)(complex.positions, cells));
79 try {
80 complex.normals = _normals2.default.vertexNormals(flattened.cells, flattened.positions);
81 } catch (e) {
82 console.warn("Unable to compute vertex normals.");
83 }
84 Object.assign(complex, flattened);
85 } else if (complex.positions && !complex.cells) {
86 Object.assign(complex, (0, _meshReindex2.default)((0, _arrayFlatten2.default)(complex.positions)));
87 }
88
89 if (null == complex.normals && complex.positions && complex.cells) {
90 try {
91 complex.normals = _normals2.default.vertexNormals(complex.cells, complex.positions);
92 } catch (e) {
93 console.warn("Unable to compute vertex normals.");
94 }
95 }
96 }
97
98 function ensure3D(nodes) {
99 var _iteratorNormalCompletion = true;
100 var _didIteratorError = false;
101 var _iteratorError = undefined;
102
103 try {
104 for (var _iterator = nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
105 var node = _step.value;
106
107 for (var i = 0; i < 3; ++i) {
108 if (null == node[i]) {
109 node[i] = 0;
110 }
111 }
112 }
113 } catch (err) {
114 _didIteratorError = true;
115 _iteratorError = err;
116 } finally {
117 try {
118 if (!_iteratorNormalCompletion && _iterator.return) {
119 _iterator.return();
120 }
121 } finally {
122 if (_didIteratorError) {
123 throw _iteratorError;
124 }
125 }
126 }
127 }
128
129 Object.assign(this._complex, complex);
130 return complex;
131 },
132 get: function get() {
133 return this._complex || null;
134 }
135 }, {
136 key: 'positions',
137 get: function get() {
138 return this.complex ? this.complex.positions : null;
139 }
140 }, {
141 key: 'normals',
142 get: function get() {
143 return this.complex ? this.complex.normals : null;
144 }
145 }, {
146 key: 'uvs',
147 get: function get() {
148 return this.complex ? this.complex.uvs : null;
149 }
150 }, {
151 key: 'cells',
152 get: function get() {
153 return this.complex ? this.complex.cells : null;
154 }
155 }]);
156
157 return Geometry;
158}();
159//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2dlb21ldHJ5LmpzIl0sIm5hbWVzIjpbIkdlb21ldHJ5Iiwib3B0cyIsImNvbXBsZXgiLCJwb3NpdGlvbnMiLCJmbGF0dGVuIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwidmFsdWUiLCJCb29sZWFuIiwiZW5zdXJlM0QiLCJub3JtYWxzIiwiY2VsbHMiLCJtYXAiLCJjZWxsIiwic2xpY2UiLCJmbGF0dGVuZWQiLCJ2ZXJ0ZXhOb3JtYWxzIiwiZSIsImNvbnNvbGUiLCJ3YXJuIiwiYXNzaWduIiwibm9kZXMiLCJub2RlIiwiaSIsIl9jb21wbGV4IiwidXZzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0lBRWFBLFEsV0FBQUEsUTtBQUNYLHNCQUF1QjtBQUFBLFFBQVhDLElBQVcsdUVBQUosRUFBSTs7QUFBQTs7QUFDckIsUUFBSUMsVUFBVSxFQUFkO0FBQ0EsUUFBSUQsS0FBS0UsU0FBVCxFQUFvQjtBQUFFRCxnQkFBVUQsSUFBVjtBQUFnQixLQUF0QyxNQUNLO0FBQUVDLGdCQUFVRCxLQUFLQyxPQUFmO0FBQXdCO0FBQy9CLFFBQUlFLFVBQVUsdUJBQVNILEtBQUtHLE9BQWQsRUFBdUJGLFFBQVFFLE9BQS9CLEVBQXdDLEtBQXhDLENBQWQ7QUFDQUMsV0FBT0MsY0FBUCxDQUFzQixJQUF0QixFQUE0QixVQUE1QixFQUF3QyxFQUFDQyxZQUFZLEtBQWIsRUFBb0JDLE9BQU8sRUFBM0IsRUFBeEM7QUFDQSxTQUFLSixPQUFMLEdBQWVLLFFBQVFMLE9BQVIsQ0FBZjtBQUNBLFNBQUtGLE9BQUwsR0FBZUEsV0FBVyxJQUExQjtBQUNEOzs7O3lDQTZEb0I7QUFDbkIsYUFBTywyQkFBZSxLQUFLQyxTQUFwQixDQUFQO0FBQ0Q7OztzQkE3RFdELE8sRUFBUztBQUNuQixVQUFJQSxtQkFBbUJGLFFBQXZCLEVBQWlDO0FBQUVFLGtCQUFVQSxRQUFRQSxPQUFsQjtBQUEyQjtBQUM5RCxVQUFJQSxPQUFKLEVBQWE7QUFDWCxZQUFJQSxRQUFRQyxTQUFaLEVBQXVCO0FBQUVPLG1CQUFTUixRQUFRQyxTQUFqQjtBQUE2QjtBQUN0RCxZQUFJRCxRQUFRUyxPQUFaLEVBQXFCO0FBQUVELG1CQUFTUixRQUFRUyxPQUFqQjtBQUEyQjtBQUNsRCxZQUFJLEtBQUtQLE9BQUwsSUFBZ0JGLFFBQVFVLEtBQTVCLEVBQW1DO0FBQ2pDLGNBQU1BLFFBQVFWLFFBQVFVLEtBQVIsQ0FBY0MsR0FBZCxDQUFrQixVQUFDQyxJQUFEO0FBQUEsbUJBQVVBLEtBQUtDLEtBQUwsRUFBVjtBQUFBLFdBQWxCLENBQWQ7QUFDQSxjQUFNQyxZQUFZLDJCQUFRLDJCQUFRZCxRQUFRQyxTQUFoQixFQUEyQlMsS0FBM0IsQ0FBUixDQUFsQjtBQUNBLGNBQUk7QUFDRlYsb0JBQVFTLE9BQVIsR0FBa0Isa0JBQVFNLGFBQVIsQ0FDaEJELFVBQVVKLEtBRE0sRUFFaEJJLFVBQVViLFNBRk0sQ0FBbEI7QUFHRCxXQUpELENBSUUsT0FBT2UsQ0FBUCxFQUFVO0FBQUVDLG9CQUFRQyxJQUFSLENBQWEsbUNBQWI7QUFBbUQ7QUFDakVmLGlCQUFPZ0IsTUFBUCxDQUFjbkIsT0FBZCxFQUF1QmMsU0FBdkI7QUFDRCxTQVRELE1BU08sSUFBSWQsUUFBUUMsU0FBUixJQUFxQixDQUFDRCxRQUFRVSxLQUFsQyxFQUF5QztBQUM5Q1AsaUJBQU9nQixNQUFQLENBQWNuQixPQUFkLEVBQXVCLDJCQUFRLDRCQUFRQSxRQUFRQyxTQUFoQixDQUFSLENBQXZCO0FBQ0Q7O0FBRUQsWUFBSSxRQUFRRCxRQUFRUyxPQUFoQixJQUEyQlQsUUFBUUMsU0FBbkMsSUFBZ0RELFFBQVFVLEtBQTVELEVBQW1FO0FBQ2pFLGNBQUk7QUFDRlYsb0JBQVFTLE9BQVIsR0FBa0Isa0JBQVFNLGFBQVIsQ0FDaEJmLFFBQVFVLEtBRFEsRUFFaEJWLFFBQVFDLFNBRlEsQ0FBbEI7QUFHRCxXQUpELENBSUUsT0FBT2UsQ0FBUCxFQUFVO0FBQUVDLG9CQUFRQyxJQUFSLENBQWEsbUNBQWI7QUFBbUQ7QUFDbEU7QUFDRjs7QUFFRCxlQUFTVixRQUFULENBQWtCWSxLQUFsQixFQUF5QjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUN2QiwrQkFBbUJBLEtBQW5CLDhIQUEwQjtBQUFBLGdCQUFmQyxJQUFlOztBQUN4QixpQkFBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUksQ0FBcEIsRUFBdUIsRUFBRUEsQ0FBekIsRUFBNEI7QUFDMUIsa0JBQUksUUFBUUQsS0FBS0MsQ0FBTCxDQUFaLEVBQXFCO0FBQUVELHFCQUFLQyxDQUFMLElBQVUsQ0FBVjtBQUFhO0FBQ3JDO0FBQ0Y7QUFMc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU14Qjs7QUFFRG5CLGFBQU9nQixNQUFQLENBQWMsS0FBS0ksUUFBbkIsRUFBNkJ2QixPQUE3QjtBQUNBLGFBQU9BLE9BQVA7QUFDRCxLO3dCQUVhO0FBQ1osYUFBTyxLQUFLdUIsUUFBTCxJQUFpQixJQUF4QjtBQUNEOzs7d0JBRWU7QUFDZCxhQUFPLEtBQUt2QixPQUFMLEdBQWUsS0FBS0EsT0FBTCxDQUFhQyxTQUE1QixHQUF3QyxJQUEvQztBQUNEOzs7d0JBRWE7QUFDWixhQUFPLEtBQUtELE9BQUwsR0FBZSxLQUFLQSxPQUFMLENBQWFTLE9BQTVCLEdBQXNDLElBQTdDO0FBQ0Q7Ozt3QkFFUztBQUNSLGFBQU8sS0FBS1QsT0FBTCxHQUFlLEtBQUtBLE9BQUwsQ0FBYXdCLEdBQTVCLEdBQWtDLElBQXpDO0FBQ0Q7Ozt3QkFFVztBQUNWLGFBQU8sS0FBS3hCLE9BQUwsR0FBZSxLQUFLQSxPQUFMLENBQWFVLEtBQTVCLEdBQW9DLElBQTNDO0FBQ0QiLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2V0Qm91bmRpbmdCb3ggZnJvbSAnYm91bmQtcG9pbnRzJ1xuaW1wb3J0IGNvYWxlc2NlIGZyb20gJ2RlZmluZWQnXG5pbXBvcnQgZmxhdHRlbiBmcm9tICdhcnJheS1mbGF0dGVuJ1xuaW1wb3J0IHJlaW5kZXggZnJvbSAnbWVzaC1yZWluZGV4J1xuaW1wb3J0IHVuaW5kZXggZnJvbSAndW5pbmRleC1tZXNoJ1xuaW1wb3J0IG5vcm1hbHMgZnJvbSAnbm9ybWFscydcblxuZXhwb3J0IGNsYXNzIEdlb21ldHJ5IHtcbiAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgbGV0IGNvbXBsZXggPSB7fVxuICAgIGlmIChvcHRzLnBvc2l0aW9ucykgeyBjb21wbGV4ID0gb3B0cyB9XG4gICAgZWxzZSB7IGNvbXBsZXggPSBvcHRzLmNvbXBsZXggfVxuICAgIGxldCBmbGF0dGVuID0gY29hbGVzY2Uob3B0cy5mbGF0dGVuLCBjb21wbGV4LmZsYXR0ZW4sIGZhbHNlKVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2NvbXBsZXgnLCB7ZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB7fX0pXG4gICAgdGhpcy5mbGF0dGVuID0gQm9vbGVhbihmbGF0dGVuKVxuICAgIHRoaXMuY29tcGxleCA9IGNvbXBsZXggfHwgbnVsbFxuICB9XG5cbiAgc2V0IGNvbXBsZXgoY29tcGxleCkge1xuICAgIGlmIChjb21wbGV4IGluc3RhbmNlb2YgR2VvbWV0cnkpIHsgY29tcGxleCA9IGNvbXBsZXguY29tcGxleCB9XG4gICAgaWYgKGNvbXBsZXgpIHtcbiAgICAgIGlmIChjb21wbGV4LnBvc2l0aW9ucykgeyBlbnN1cmUzRChjb21wbGV4LnBvc2l0aW9ucykgfVxuICAgICAgaWYgKGNvbXBsZXgubm9ybWFscykgeyBlbnN1cmUzRChjb21wbGV4Lm5vcm1hbHMpIH1cbiAgICAgIGlmICh0aGlzLmZsYXR0ZW4gJiYgY29tcGxleC5jZWxscykge1xuICAgICAgICBjb25zdCBjZWxscyA9IGNvbXBsZXguY2VsbHMubWFwKChjZWxsKSA9PiBjZWxsLnNsaWNlKCkpXG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IHJlaW5kZXgodW5pbmRleChjb21wbGV4LnBvc2l0aW9ucywgY2VsbHMpKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbXBsZXgubm9ybWFscyA9IG5vcm1hbHMudmVydGV4Tm9ybWFscyhcbiAgICAgICAgICAgIGZsYXR0ZW5lZC5jZWxscyxcbiAgICAgICAgICAgIGZsYXR0ZW5lZC5wb3NpdGlvbnMpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKFwiVW5hYmxlIHRvIGNvbXB1dGUgdmVydGV4IG5vcm1hbHMuXCIpIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb21wbGV4LCBmbGF0dGVuZWQpXG4gICAgICB9IGVsc2UgaWYgKGNvbXBsZXgucG9zaXRpb25zICYmICFjb21wbGV4LmNlbGxzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29tcGxleCwgcmVpbmRleChmbGF0dGVuKGNvbXBsZXgucG9zaXRpb25zKSkpXG4gICAgICB9XG5cbiAgICAgIGlmIChudWxsID09IGNvbXBsZXgubm9ybWFscyAmJiBjb21wbGV4LnBvc2l0aW9ucyAmJiBjb21wbGV4LmNlbGxzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29tcGxleC5ub3JtYWxzID0gbm9ybWFscy52ZXJ0ZXhOb3JtYWxzKFxuICAgICAgICAgICAgY29tcGxleC5jZWxscyxcbiAgICAgICAgICAgIGNvbXBsZXgucG9zaXRpb25zKVxuICAgICAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihcIlVuYWJsZSB0byBjb21wdXRlIHZlcnRleCBub3JtYWxzLlwiKSB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5zdXJlM0Qobm9kZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7ICsraSkge1xuICAgICAgICAgIGlmIChudWxsID09IG5vZGVbaV0pIHsgbm9kZVtpXSA9IDAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jb21wbGV4LCBjb21wbGV4KVxuICAgIHJldHVybiBjb21wbGV4XG4gIH1cblxuICBnZXQgY29tcGxleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGxleCB8fCBudWxsXG4gIH1cblxuICBnZXQgcG9zaXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXggPyB0aGlzLmNvbXBsZXgucG9zaXRpb25zIDogbnVsbFxuICB9XG5cbiAgZ2V0IG5vcm1hbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxleCA/IHRoaXMuY29tcGxleC5ub3JtYWxzIDogbnVsbFxuICB9XG5cbiAgZ2V0IHV2cygpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wbGV4ID8gdGhpcy5jb21wbGV4LnV2cyA6IG51bGxcbiAgfVxuXG4gIGdldCBjZWxscygpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wbGV4ID8gdGhpcy5jb21wbGV4LmNlbGxzIDogbnVsbFxuICB9XG5cbiAgY29tcHV0ZUJvdW5kaW5nQm94KCkge1xuICAgIHJldHVybiBnZXRCb3VuZGluZ0JveCh0aGlzLnBvc2l0aW9ucylcbiAgfVxufVxuIl19
\No newline at end of file