UNPKG

12.8 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.js","names":["WebGLEngine","supportWebGPU","useWGSL","$canvas","gl","inited","createModel","options","uniforms","Promise","all","Object","keys","map","name","load","undefined","texture","ReglModel","createAttribute","ReglAttribute","createBuffer","ReglBuffer","createElements","ReglElements","createTexture2D","ReglTexture2D","createFramebuffer","ReglFramebuffer","useFramebuffer","framebuffer","drawCommands","get","createComputeModel","context","ReglComputeModel","clear","color","depth","stencil","reglClearOptions","setScissor","scissor","_gl","enable","box","SCISSOR_TEST","x","y","width","height","disable","_refresh","viewport","readPixels","readPixelsOptions","read","getCanvas","getGLContext","destroy","cfg","canvas","resolve","reject","regl","attributes","alpha","antialias","premultipliedAlpha","pixelRatio","extensions","optionalExtensions","profile","onDone","err","r","limits","readFloat"],"sources":["../../src/webgl/index.ts"],"sourcesContent":["/**\n * render w/ regl\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md\n */\nimport {\n gl,\n GLSLContext,\n IAttribute,\n IAttributeInitializationOptions,\n IBuffer,\n IBufferInitializationOptions,\n IClearOptions,\n IComputeModel,\n IElements,\n IElementsInitializationOptions,\n IFramebuffer,\n IFramebufferInitializationOptions,\n IModel,\n IModelInitializationOptions,\n IReadPixelsOptions,\n IRendererConfig,\n IRendererService,\n ITexture2D,\n ITexture2DInitializationOptions,\n} from '@antv/g-webgpu-core';\nimport regl from 'regl';\nimport ReglAttribute from './ReglAttribute';\nimport ReglBuffer from './ReglBuffer';\nimport ReglComputeModel from './ReglComputeModel';\nimport ReglElements from './ReglElements';\nimport ReglFramebuffer from './ReglFramebuffer';\nimport ReglModel from './ReglModel';\nimport ReglTexture2D from './ReglTexture2D';\n\n/**\n * regl renderer\n */\nexport class WebGLEngine implements IRendererService {\n public supportWebGPU = false;\n public useWGSL = false;\n private $canvas: HTMLCanvasElement;\n private gl: regl.Regl;\n private inited: boolean;\n\n public async init(cfg: IRendererConfig): Promise<void> {\n if (this.inited) {\n return;\n }\n this.$canvas = cfg.canvas;\n // tslint:disable-next-line:typedef\n this.gl = await new Promise((resolve, reject) => {\n regl({\n canvas: cfg.canvas,\n attributes: {\n alpha: true,\n // use TAA instead of MSAA\n // @see https://www.khronos.org/registry/webgl/specs/1.0/#5.2.1\n antialias: cfg.antialias,\n premultipliedAlpha: true,\n // preserveDrawingBuffer: false,\n },\n pixelRatio: 1,\n // TODO: use extensions\n extensions: [\n 'OES_element_index_uint',\n 'OES_texture_float',\n 'OES_standard_derivatives', // wireframe\n 'angle_instanced_arrays', // VSM shadow map\n ],\n optionalExtensions: [\n 'EXT_texture_filter_anisotropic',\n 'EXT_blend_minmax',\n 'WEBGL_depth_texture',\n ],\n profile: true,\n onDone: (err: Error | null, r?: regl.Regl | undefined): void => {\n if (err || !r) {\n reject(err);\n }\n // @ts-ignore\n resolve(r);\n },\n });\n });\n this.inited = true;\n }\n\n public isFloatSupported() {\n // @see https://github.com/antvis/GWebGPUEngine/issues/26\n // @ts-ignore\n return this.gl.limits.readFloat;\n }\n\n public createModel = async (\n options: IModelInitializationOptions,\n ): Promise<IModel> => {\n if (options.uniforms) {\n await Promise.all(\n Object.keys(options.uniforms).map(async (name) => {\n if (\n options.uniforms![name] &&\n // @ts-ignore\n options.uniforms![name].load !== undefined\n ) {\n // @ts-ignore\n const texture = await options.uniforms![name].load();\n // @ts-ignore\n options.uniforms[name] = texture;\n }\n }),\n );\n }\n return new ReglModel(this.gl, options);\n };\n\n public createAttribute = (\n options: IAttributeInitializationOptions,\n ): IAttribute => new ReglAttribute(this.gl, options);\n\n public createBuffer = (options: IBufferInitializationOptions): IBuffer =>\n new ReglBuffer(this.gl, options);\n\n public createElements = (\n options: IElementsInitializationOptions,\n ): IElements => new ReglElements(this.gl, options);\n\n public createTexture2D = (\n options: ITexture2DInitializationOptions,\n ): ITexture2D => new ReglTexture2D(this.gl, options);\n\n public createFramebuffer = (options: IFramebufferInitializationOptions) =>\n new ReglFramebuffer(this.gl, options);\n\n public useFramebuffer = (\n framebuffer: IFramebuffer | null,\n drawCommands: () => void,\n ) => {\n this.gl({\n framebuffer: framebuffer ? (framebuffer as ReglFramebuffer).get() : null,\n })(drawCommands);\n };\n\n public createComputeModel = async (\n context: GLSLContext,\n ): Promise<IComputeModel> => {\n return new ReglComputeModel(this.gl, context);\n };\n\n public clear = (options: IClearOptions) => {\n // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clear-the-draw-buffer\n const { color, depth, stencil, framebuffer = null } = options;\n const reglClearOptions: regl.ClearOptions = {\n color,\n depth,\n stencil,\n };\n\n reglClearOptions.framebuffer =\n framebuffer === null\n ? framebuffer\n : (framebuffer as ReglFramebuffer).get();\n\n this.gl.clear(reglClearOptions);\n };\n\n public setScissor = (\n scissor: Partial<{\n enable: boolean;\n box: { x: number; y: number; width: number; height: number };\n }>,\n ) => {\n if (this.gl && this.gl._gl) {\n // https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/scissor\n if (scissor.enable && scissor.box) {\n // console.log(scissor.box);\n this.gl._gl.enable(gl.SCISSOR_TEST);\n this.gl._gl.scissor(\n scissor.box.x,\n scissor.box.y,\n scissor.box.width,\n scissor.box.height,\n );\n } else {\n this.gl._gl.disable(gl.SCISSOR_TEST);\n }\n this.gl._refresh();\n }\n };\n\n public viewport = ({\n x,\n y,\n width,\n height,\n }: {\n x: number;\n y: number;\n width: number;\n height: number;\n }) => {\n if (this.gl && this.gl._gl) {\n // use WebGL context directly\n // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#unsafe-escape-hatch\n this.gl._gl.viewport(x, y, width, height);\n this.gl._refresh();\n }\n };\n\n public readPixels = (options: IReadPixelsOptions) => {\n const { framebuffer, x, y, width, height } = options;\n const readPixelsOptions: regl.ReadOptions = {\n x,\n y,\n width,\n height,\n };\n if (framebuffer) {\n readPixelsOptions.framebuffer = (framebuffer as ReglFramebuffer).get();\n }\n return this.gl.read(readPixelsOptions);\n };\n\n public getCanvas = () => {\n return this.$canvas;\n };\n\n public getGLContext = () => {\n return this.gl._gl;\n };\n\n public destroy = () => {\n if (this.gl) {\n // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clean-up\n this.gl.destroy();\n this.inited = false;\n }\n };\n\n public beginFrame() {\n //\n }\n\n public endFrame() {\n //\n }\n}\n"],"mappings":"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"}
\No newline at end of file