1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.Frame = undefined;
|
7 |
|
8 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
9 |
|
10 | var _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; }; }();
|
11 |
|
12 | var _utils = require('../utils');
|
13 |
|
14 | var _scope = require('../scope');
|
15 |
|
16 | var _core = require('../core');
|
17 |
|
18 | var _context = require('./context');
|
19 |
|
20 | var _state = require('./state');
|
21 |
|
22 | var _defaults2 = require('./defaults');
|
23 |
|
24 | var _defaults = _interopRequireWildcard(_defaults2);
|
25 |
|
26 | 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; } }
|
27 |
|
28 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
29 |
|
30 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
31 |
|
32 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
33 |
|
34 | var Frame = exports.Frame = function (_Component) {
|
35 | _inherits(Frame, _Component);
|
36 |
|
37 | _createClass(Frame, null, [{
|
38 | key: 'defaults',
|
39 | value: function defaults() {
|
40 | return _extends({}, _defaults);
|
41 | }
|
42 | }]);
|
43 |
|
44 | function Frame(ctx) {
|
45 | var initialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
46 |
|
47 | _classCallCheck(this, Frame);
|
48 |
|
49 | (0, _utils.assignDefaults)(initialState, Frame.defaults());
|
50 | var _initialState$frames = initialState.frames,
|
51 | frames = _initialState$frames === undefined ? [] : _initialState$frames;
|
52 |
|
53 |
|
54 | var context = new _context.FrameContext(ctx, initialState);
|
55 | var state = new _state.FrameState(ctx, initialState);
|
56 |
|
57 | var getContext = ctx.regl({});
|
58 | var clear = function clear() {
|
59 | return getContext(function (_ref) {
|
60 | var clear = _ref.clear;
|
61 | return clear();
|
62 | });
|
63 | };
|
64 | var autoClear = _core.Component.compose(context, clear);
|
65 | var pipe = _core.Component.compose(state, context);
|
66 |
|
67 | var loop = null; // for all frames
|
68 |
|
69 | var _this = _possibleConstructorReturn(this, (Frame.__proto__ || Object.getPrototypeOf(Frame)).call(this, ctx, initialState, function (state, refresh) {
|
70 | if (null == loop) {
|
71 | createFrameLoop();
|
72 | }
|
73 | var inject = new _scope.ScopedContext(ctx, { frame: function (_frame) {
|
74 | function frame() {
|
75 | return _frame.apply(this, arguments);
|
76 | }
|
77 |
|
78 | frame.toString = function () {
|
79 | return _frame.toString();
|
80 | };
|
81 |
|
82 | return frame;
|
83 | }(function () {
|
84 | return frame;
|
85 | }), frames: frames, loop: loop });
|
86 | var update = _core.Component.compose(inject, pipe);
|
87 | var frame = createFrameRefresh(refresh, update);
|
88 | frames.push(frame);
|
89 | }));
|
90 |
|
91 | function createFrameRefresh(refresh, components) {
|
92 | var cancelled = null;
|
93 | var frame = null;
|
94 | return frame = {
|
95 | cancel: function cancel() {
|
96 | cancelled = true;
|
97 | },
|
98 | onframe: function onframe() {
|
99 | if (cancelled) {
|
100 | frames.splice(frames.indexOf(frame, 1));
|
101 | } else try {
|
102 | components(function () {
|
103 | return getContext(refresh);
|
104 | });
|
105 | } catch (err) {
|
106 | ctx.emit('error', err);
|
107 | destroyFrameLoop();
|
108 | }
|
109 | }
|
110 | };
|
111 | }
|
112 |
|
113 | function createFrameLoop() {
|
114 | var _iteratorNormalCompletion = true;
|
115 | var _didIteratorError = false;
|
116 | var _iteratorError = undefined;
|
117 |
|
118 | try {
|
119 | for (var _iterator = frames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
120 | var f = _step.value;
|
121 | f.onframe();
|
122 | }
|
123 | } catch (err) {
|
124 | _didIteratorError = true;
|
125 | _iteratorError = err;
|
126 | } finally {
|
127 | try {
|
128 | if (!_iteratorNormalCompletion && _iterator.return) {
|
129 | _iterator.return();
|
130 | }
|
131 | } finally {
|
132 | if (_didIteratorError) {
|
133 | throw _iteratorError;
|
134 | }
|
135 | }
|
136 | }
|
137 |
|
138 | loop = ctx.regl.frame(function () {
|
139 | try {
|
140 | if (true === initialState.autoClear) {
|
141 | autoClear();
|
142 | }
|
143 | var _iteratorNormalCompletion2 = true;
|
144 | var _didIteratorError2 = false;
|
145 | var _iteratorError2 = undefined;
|
146 |
|
147 | try {
|
148 | for (var _iterator2 = frames[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
149 | var f = _step2.value;
|
150 | f.onframe();
|
151 | }
|
152 | } catch (err) {
|
153 | _didIteratorError2 = true;
|
154 | _iteratorError2 = err;
|
155 | } finally {
|
156 | try {
|
157 | if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
158 | _iterator2.return();
|
159 | }
|
160 | } finally {
|
161 | if (_didIteratorError2) {
|
162 | throw _iteratorError2;
|
163 | }
|
164 | }
|
165 | }
|
166 | } catch (err) {
|
167 | try {
|
168 | var _iteratorNormalCompletion3 = true;
|
169 | var _didIteratorError3 = false;
|
170 | var _iteratorError3 = undefined;
|
171 |
|
172 | try {
|
173 | for (var _iterator3 = frames[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
174 | var _f = _step3.value;
|
175 | _f.cancel();
|
176 | }
|
177 | } catch (err) {
|
178 | _didIteratorError3 = true;
|
179 | _iteratorError3 = err;
|
180 | } finally {
|
181 | try {
|
182 | if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
183 | _iterator3.return();
|
184 | }
|
185 | } finally {
|
186 | if (_didIteratorError3) {
|
187 | throw _iteratorError3;
|
188 | }
|
189 | }
|
190 | }
|
191 | } catch (err) {
|
192 | ctx.emit('error', err);
|
193 | }
|
194 | destroyFrameLoop();
|
195 | }
|
196 | });
|
197 | }
|
198 |
|
199 | function destroyFrameLoop() {
|
200 | try {
|
201 | var _iteratorNormalCompletion4 = true;
|
202 | var _didIteratorError4 = false;
|
203 | var _iteratorError4 = undefined;
|
204 |
|
205 | try {
|
206 | for (var _iterator4 = frames[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
207 | var f = _step4.value;
|
208 | f.cancel();
|
209 | }
|
210 | } catch (err) {
|
211 | _didIteratorError4 = true;
|
212 | _iteratorError4 = err;
|
213 | } finally {
|
214 | try {
|
215 | if (!_iteratorNormalCompletion4 && _iterator4.return) {
|
216 | _iterator4.return();
|
217 | }
|
218 | } finally {
|
219 | if (_didIteratorError4) {
|
220 | throw _iteratorError4;
|
221 | }
|
222 | }
|
223 | }
|
224 | } catch (err) {
|
225 | ctx.emit('error', err);
|
226 | }
|
227 | frames.splice(0, frames.length);
|
228 | }
|
229 | return _this;
|
230 | }
|
231 |
|
232 | return Frame;
|
233 | }(_core.Component);
|
234 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mcmFtZS9mcmFtZS5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0cyIsIkZyYW1lIiwiY3R4IiwiaW5pdGlhbFN0YXRlIiwiZnJhbWVzIiwiY29udGV4dCIsInN0YXRlIiwiZ2V0Q29udGV4dCIsInJlZ2wiLCJjbGVhciIsImF1dG9DbGVhciIsImNvbXBvc2UiLCJwaXBlIiwibG9vcCIsInJlZnJlc2giLCJjcmVhdGVGcmFtZUxvb3AiLCJpbmplY3QiLCJmcmFtZSIsInVwZGF0ZSIsImNyZWF0ZUZyYW1lUmVmcmVzaCIsInB1c2giLCJjb21wb25lbnRzIiwiY2FuY2VsbGVkIiwiY2FuY2VsIiwib25mcmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJlcnIiLCJlbWl0IiwiZGVzdHJveUZyYW1lTG9vcCIsImYiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0lBQVlBLFM7Ozs7Ozs7Ozs7SUFFQ0MsSyxXQUFBQSxLOzs7OzsrQkFDTztBQUFFLDBCQUFZRCxTQUFaO0FBQXdCOzs7QUFDNUMsaUJBQVlFLEdBQVosRUFBb0M7QUFBQSxRQUFuQkMsWUFBbUIsdUVBQUosRUFBSTs7QUFBQTs7QUFDbEMsK0JBQWVBLFlBQWYsRUFBNkJGLE1BQU1ELFFBQU4sRUFBN0I7QUFEa0MsK0JBRVpHLFlBRlksQ0FFM0JDLE1BRjJCO0FBQUEsUUFFM0JBLE1BRjJCLHdDQUVsQixFQUZrQjs7O0FBSWxDLFFBQU1DLFVBQVUsMEJBQWlCSCxHQUFqQixFQUFzQkMsWUFBdEIsQ0FBaEI7QUFDQSxRQUFNRyxRQUFRLHNCQUFlSixHQUFmLEVBQW9CQyxZQUFwQixDQUFkOztBQUVBLFFBQU1JLGFBQWFMLElBQUlNLElBQUosQ0FBUyxFQUFULENBQW5CO0FBQ0EsUUFBTUMsUUFBUSxTQUFSQSxLQUFRO0FBQUEsYUFBTUYsV0FBVztBQUFBLFlBQUVFLEtBQUYsUUFBRUEsS0FBRjtBQUFBLGVBQWFBLE9B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U0EsZ0JBQVQsR0FBNEI7QUFDMUIsVUFBSTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFFLGdDQUFnQnpCLE1BQWhCLG1JQUF3QjtBQUFBLGdCQUFiMEIsQ0FBYTtBQUFFQSxjQUFFUCxNQUFGO0FBQVk7QUFBeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUEwQyxPQUE5QyxDQUNBLE9BQU9JLEdBQVAsRUFBWTtBQUFFekIsWUFBSTBCLElBQUosQ0FBUyxPQUFULEVBQWtCRCxHQUFsQjtBQUF5QjtBQUN2Q3ZCLGFBQU9xQixNQUFQLENBQWMsQ0FBZCxFQUFpQnJCLE9BQU8yQixNQUF4QjtBQUNEO0FBekRpQztBQTBEbkMiLCJmaWxlIjoiZnJhbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NpZ25EZWZhdWx0cyB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgU2NvcGVkQ29udGV4dCB9IGZyb20gJy4uL3Njb3BlJ1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZSdcblxuaW1wb3J0IHsgRnJhbWVDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0J1xuaW1wb3J0IHsgRnJhbWVTdGF0ZSB9IGZyb20gJy4vc3RhdGUnXG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRzJ1xuXG5leHBvcnQgY2xhc3MgRnJhbWUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMoKSB7IHJldHVybiB7IC4uLmRlZmF1bHRzIH0gfVxuICBjb25zdHJ1Y3RvcihjdHgsIGluaXRpYWxTdGF0ZSA9IHt9KSB7XG4gICAgYXNzaWduRGVmYXVsdHMoaW5pdGlhbFN0YXRlLCBGcmFtZS5kZWZhdWx0cygpKVxuICAgIGNvbnN0IHtmcmFtZXMgPSBbXX0gPSBpbml0aWFsU3RhdGVcblxuICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRnJhbWVDb250ZXh0KGN0eCwgaW5pdGlhbFN0YXRlKVxuICAgIGNvbnN0IHN0YXRlID0gbmV3IEZyYW1lU3RhdGUoY3R4LCBpbml0aWFsU3RhdGUpXG5cbiAgICBjb25zdCBnZXRDb250ZXh0ID0gY3R4LnJlZ2woe30pXG4gICAgY29uc3QgY2xlYXIgPSAoKSA9PiBnZXRDb250ZXh0KCh7Y2xlYXJ9KSA9PiBjbGVhcigpKVxuICAgIGNvbnN0IGF1dG9DbGVhciA9IENvbXBvbmVudC5jb21wb3NlKGNvbnRleHQsIGNsZWFyKVxuICAgIGNvbnN0IHBpcGUgPSBDb21wb25lbnQuY29tcG9zZShzdGF0ZSwgY29udGV4dClcblxuICAgIGxldCBsb29wID0gbnVsbCAvLyBmb3IgYWxsIGZyYW1lc1xuICAgIHN1cGVyKGN0eCwgaW5pdGlhbFN0YXRlLCAoc3RhdGUsIHJlZnJlc2gpID0+IHtcbiAgICAgIGlmIChudWxsID09IGxvb3ApIHsgY3JlYXRlRnJhbWVMb29wKCkgfVxuICAgICAgY29uc3QgaW5qZWN0ID0gbmV3IFNjb3BlZENvbnRleHQoY3R4LCB7ZnJhbWU6ICgpID0+IGZyYW1lLCBmcmFtZXMsIGxvb3B9KVxuICAgICAgY29uc3QgdXBkYXRlID0gQ29tcG9uZW50LmNvbXBvc2UoaW5qZWN0LCBwaXBlKVxuICAgICAgY29uc3QgZnJhbWUgPSBjcmVhdGVGcmFtZVJlZnJlc2gocmVmcmVzaCwgdXBkYXRlKVxuICAgICAgZnJhbWVzLnB1c2goZnJhbWUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyYW1lUmVmcmVzaChyZWZyZXNoLCBjb21wb25lbnRzKSB7XG4gICAgICBsZXQgY2FuY2VsbGVkID0gbnVsbFxuICAgICAgbGV0IGZyYW1lID0gbnVsbFxuICAgICAgcmV0dXJuIGZyYW1lID0ge1xuICAgICAgICBjYW5jZWwoKSB7IGNhbmNlbGxlZCA9IHRydWUgfSxcbiAgICAgICAgb25mcmFtZSgpIHtcbiAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICBmcmFtZXMuc3BsaWNlKGZyYW1lcy5pbmRleE9mKGZyYW1lLCAxKSlcbiAgICAgICAgICB9IGVsc2UgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMoKCkgPT4gZ2V0Q29udGV4dChyZWZyZXNoKSlcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGN0eC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgICAgICAgIGRlc3Ryb3lGcmFtZUxvb3AoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyYW1lTG9vcCgpIHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmcmFtZXMpIHsgZi5vbmZyYW1lKCkgfVxuICAgICAgbG9vcCA9IGN0eC5yZWdsLmZyYW1lKCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHJ1ZSA9PT0gaW5pdGlhbFN0YXRlLmF1dG9DbGVhcikgeyBhdXRvQ2xlYXIoKSB9XG4gICAgICAgICAgZm9yIChjb25zdCBmIG9mIGZyYW1lcykgeyBmLm9uZnJhbWUoKSB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRyeSB7IGZvciAoY29uc3QgZiBvZiBmcmFtZXMpIHsgZi5jYW5jZWwoKSB9IH1cbiAgICAgICAgICBjYXRjaCAoZXJyKSB7IGN0eC5lbWl0KCdlcnJvcicsIGVycik7IH1cbiAgICAgICAgICBkZXN0cm95RnJhbWVMb29wKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95RnJhbWVMb29wKCkge1xuICAgICAgdHJ5IHsgZm9yIChjb25zdCBmIG9mIGZyYW1lcykgeyBmLmNhbmNlbCgpIH0gfVxuICAgICAgY2F0Y2ggKGVycikgeyBjdHguZW1pdCgnZXJyb3InLCBlcnIpOyB9XG4gICAgICBmcmFtZXMuc3BsaWNlKDAsIGZyYW1lcy5sZW5ndGgpXG4gICAgfVxuICB9XG59XG4iXX0= |
\ | No newline at end of file |