UNPKG

10.5 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports.WebGLEngine = void 0;
8var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12var _gWebgpuCore = require("@antv/g-webgpu-core");
13var _regl = _interopRequireDefault(require("regl"));
14var _ReglAttribute = _interopRequireDefault(require("./ReglAttribute"));
15var _ReglBuffer = _interopRequireDefault(require("./ReglBuffer"));
16var _ReglComputeModel = _interopRequireDefault(require("./ReglComputeModel"));
17var _ReglElements = _interopRequireDefault(require("./ReglElements"));
18var _ReglFramebuffer = _interopRequireDefault(require("./ReglFramebuffer"));
19var _ReglModel = _interopRequireDefault(require("./ReglModel"));
20var _ReglTexture2D = _interopRequireDefault(require("./ReglTexture2D"));
21/**
22 * render w/ regl
23 * @see https://github.com/regl-project/regl/blob/gh-pages/API.md
24 */
25/**
26 * regl renderer
27 */
28var WebGLEngine = /*#__PURE__*/function () {
29 function WebGLEngine() {
30 var _this = this;
31 (0, _classCallCheck2.default)(this, WebGLEngine);
32 this.supportWebGPU = false;
33 this.useWGSL = false;
34 this.$canvas = void 0;
35 this.gl = void 0;
36 this.inited = void 0;
37 this.createModel = /*#__PURE__*/function () {
38 var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(options) {
39 return _regenerator.default.wrap(function _callee2$(_context2) {
40 while (1) {
41 switch (_context2.prev = _context2.next) {
42 case 0:
43 if (!options.uniforms) {
44 _context2.next = 3;
45 break;
46 }
47 _context2.next = 3;
48 return Promise.all(Object.keys(options.uniforms).map( /*#__PURE__*/function () {
49 var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(name) {
50 var texture;
51 return _regenerator.default.wrap(function _callee$(_context) {
52 while (1) {
53 switch (_context.prev = _context.next) {
54 case 0:
55 if (!(options.uniforms[name] &&
56 // @ts-ignore
57 options.uniforms[name].load !== undefined)) {
58 _context.next = 5;
59 break;
60 }
61 _context.next = 3;
62 return options.uniforms[name].load();
63 case 3:
64 texture = _context.sent;
65 // @ts-ignore
66 options.uniforms[name] = texture;
67 case 5:
68 case "end":
69 return _context.stop();
70 }
71 }
72 }, _callee);
73 }));
74 return function (_x2) {
75 return _ref2.apply(this, arguments);
76 };
77 }()));
78 case 3:
79 return _context2.abrupt("return", new _ReglModel.default(_this.gl, options));
80 case 4:
81 case "end":
82 return _context2.stop();
83 }
84 }
85 }, _callee2);
86 }));
87 return function (_x) {
88 return _ref.apply(this, arguments);
89 };
90 }();
91 this.createAttribute = function (options) {
92 return new _ReglAttribute.default(_this.gl, options);
93 };
94 this.createBuffer = function (options) {
95 return new _ReglBuffer.default(_this.gl, options);
96 };
97 this.createElements = function (options) {
98 return new _ReglElements.default(_this.gl, options);
99 };
100 this.createTexture2D = function (options) {
101 return new _ReglTexture2D.default(_this.gl, options);
102 };
103 this.createFramebuffer = function (options) {
104 return new _ReglFramebuffer.default(_this.gl, options);
105 };
106 this.useFramebuffer = function (framebuffer, drawCommands) {
107 _this.gl({
108 framebuffer: framebuffer ? framebuffer.get() : null
109 })(drawCommands);
110 };
111 this.createComputeModel = /*#__PURE__*/function () {
112 var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(context) {
113 return _regenerator.default.wrap(function _callee3$(_context3) {
114 while (1) {
115 switch (_context3.prev = _context3.next) {
116 case 0:
117 return _context3.abrupt("return", new _ReglComputeModel.default(_this.gl, context));
118 case 1:
119 case "end":
120 return _context3.stop();
121 }
122 }
123 }, _callee3);
124 }));
125 return function (_x3) {
126 return _ref3.apply(this, arguments);
127 };
128 }();
129 this.clear = function (options) {
130 // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clear-the-draw-buffer
131 var color = options.color,
132 depth = options.depth,
133 stencil = options.stencil,
134 _options$framebuffer = options.framebuffer,
135 framebuffer = _options$framebuffer === void 0 ? null : _options$framebuffer;
136 var reglClearOptions = {
137 color: color,
138 depth: depth,
139 stencil: stencil
140 };
141 reglClearOptions.framebuffer = framebuffer === null ? framebuffer : framebuffer.get();
142 _this.gl.clear(reglClearOptions);
143 };
144 this.setScissor = function (scissor) {
145 if (_this.gl && _this.gl._gl) {
146 // https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/scissor
147 if (scissor.enable && scissor.box) {
148 // console.log(scissor.box);
149 _this.gl._gl.enable(_gWebgpuCore.gl.SCISSOR_TEST);
150 _this.gl._gl.scissor(scissor.box.x, scissor.box.y, scissor.box.width, scissor.box.height);
151 } else {
152 _this.gl._gl.disable(_gWebgpuCore.gl.SCISSOR_TEST);
153 }
154 _this.gl._refresh();
155 }
156 };
157 this.viewport = function (_ref4) {
158 var x = _ref4.x,
159 y = _ref4.y,
160 width = _ref4.width,
161 height = _ref4.height;
162 if (_this.gl && _this.gl._gl) {
163 // use WebGL context directly
164 // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#unsafe-escape-hatch
165 _this.gl._gl.viewport(x, y, width, height);
166 _this.gl._refresh();
167 }
168 };
169 this.readPixels = function (options) {
170 var framebuffer = options.framebuffer,
171 x = options.x,
172 y = options.y,
173 width = options.width,
174 height = options.height;
175 var readPixelsOptions = {
176 x: x,
177 y: y,
178 width: width,
179 height: height
180 };
181 if (framebuffer) {
182 readPixelsOptions.framebuffer = framebuffer.get();
183 }
184 return _this.gl.read(readPixelsOptions);
185 };
186 this.getCanvas = function () {
187 return _this.$canvas;
188 };
189 this.getGLContext = function () {
190 return _this.gl._gl;
191 };
192 this.destroy = function () {
193 if (_this.gl) {
194 // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clean-up
195 _this.gl.destroy();
196 _this.inited = false;
197 }
198 };
199 }
200 (0, _createClass2.default)(WebGLEngine, [{
201 key: "init",
202 value: function () {
203 var _init = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(cfg) {
204 return _regenerator.default.wrap(function _callee4$(_context4) {
205 while (1) {
206 switch (_context4.prev = _context4.next) {
207 case 0:
208 if (!this.inited) {
209 _context4.next = 2;
210 break;
211 }
212 return _context4.abrupt("return");
213 case 2:
214 this.$canvas = cfg.canvas;
215 // tslint:disable-next-line:typedef
216 _context4.next = 5;
217 return new Promise(function (resolve, reject) {
218 (0, _regl.default)({
219 canvas: cfg.canvas,
220 attributes: {
221 alpha: true,
222 // use TAA instead of MSAA
223 // @see https://www.khronos.org/registry/webgl/specs/1.0/#5.2.1
224 antialias: cfg.antialias,
225 premultipliedAlpha: true
226 // preserveDrawingBuffer: false,
227 },
228
229 pixelRatio: 1,
230 // TODO: use extensions
231 extensions: ['OES_element_index_uint', 'OES_texture_float', 'OES_standard_derivatives',
232 // wireframe
233 'angle_instanced_arrays' // VSM shadow map
234 ],
235
236 optionalExtensions: ['EXT_texture_filter_anisotropic', 'EXT_blend_minmax', 'WEBGL_depth_texture'],
237 profile: true,
238 onDone: function onDone(err, r) {
239 if (err || !r) {
240 reject(err);
241 }
242 // @ts-ignore
243 resolve(r);
244 }
245 });
246 });
247 case 5:
248 this.gl = _context4.sent;
249 this.inited = true;
250 case 7:
251 case "end":
252 return _context4.stop();
253 }
254 }
255 }, _callee4, this);
256 }));
257 function init(_x4) {
258 return _init.apply(this, arguments);
259 }
260 return init;
261 }()
262 }, {
263 key: "isFloatSupported",
264 value: function isFloatSupported() {
265 // @see https://github.com/antvis/GWebGPUEngine/issues/26
266 // @ts-ignore
267 return this.gl.limits.readFloat;
268 }
269 }, {
270 key: "beginFrame",
271 value: function beginFrame() {
272 //
273 }
274 }, {
275 key: "endFrame",
276 value: function endFrame() {
277 //
278 }
279 }]);
280 return WebGLEngine;
281}();
282exports.WebGLEngine = WebGLEngine;
283//# sourceMappingURL=index.js.map
\No newline at end of file