1 line
10 KiB
Plaintext
1 line
10 KiB
Plaintext
{"version":3,"file":"GlBackBufferSystem.mjs","sources":["../../../../src/rendering/renderers/gl/GlBackBufferSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { warn } from '../../../utils/logging/warn';\nimport { Geometry } from '../shared/geometry/Geometry';\nimport { Shader } from '../shared/shader/Shader';\nimport { State } from '../shared/state/State';\nimport { TextureSource } from '../shared/texture/sources/TextureSource';\nimport { Texture } from '../shared/texture/Texture';\nimport { GlProgram } from './shader/GlProgram';\n\nimport type { RenderOptions } from '../shared/system/AbstractRenderer';\nimport type { System } from '../shared/system/System';\nimport type { WebGLRenderer } from './WebGLRenderer';\n\nconst bigTriangleGeometry = new Geometry({\n attributes: {\n aPosition: [\n -1.0, -1.0, // Bottom left corner\n 3.0, -1.0, // Bottom right corner, extending beyond right edge\n -1.0, 3.0 // Top left corner, extending beyond top edge\n ],\n },\n});\n\n/**\n * The options for the back buffer system.\n * @memberof rendering\n * @property {boolean} [useBackBuffer=false] - if true will use the back buffer where required\n * @property {boolean} [antialias=false] - if true will ensure the texture is antialiased\n */\nexport interface GlBackBufferOptions\n{\n /**\n * if true will use the back buffer where required\n * @default false\n * @memberof rendering.WebGLOptions\n */\n useBackBuffer?: boolean;\n /** if true will ensure the texture is antialiased */\n antialias?: boolean;\n}\n\n/**\n * For blend modes you need to know what pixels you are actually drawing to. For this to be possible in WebGL\n * we need to render to a texture and then present that texture to the screen. This system manages that process.\n *\n * As the main scene is rendered to a texture, it means we can sample it and copy its pixels,\n * something not possible on the main canvas.\n *\n * If antialiasing is set to to true and useBackBuffer is set to true, then the back buffer will be antialiased.\n * and the main gl context will not.\n *\n * You only need to activate this back buffer if you are using a blend mode that requires it.\n *\n * to activate is simple, you pass `useBackBuffer:true` to your render options\n * @memberof rendering\n */\nexport class GlBackBufferSystem implements System<GlBackBufferOptions>\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLSystem,\n ],\n name: 'backBuffer',\n priority: 1\n } as const;\n\n /** default options for the back buffer system */\n public static defaultOptions: GlBackBufferOptions = {\n /** if true will use the back buffer where required */\n useBackBuffer: false,\n };\n\n /** if true, the back buffer is used */\n public useBackBuffer = false;\n\n private _backBufferTexture: Texture;\n private readonly _renderer: WebGLRenderer;\n private _targetTexture: TextureSource;\n private _useBackBufferThisRender = false;\n private _antialias: boolean;\n private _state: State;\n private _bigTriangleShader: Shader;\n\n constructor(renderer: WebGLRenderer)\n {\n this._renderer = renderer;\n }\n\n public init(options: GlBackBufferOptions = {})\n {\n const { useBackBuffer, antialias } = { ...GlBackBufferSystem.defaultOptions, ...options };\n\n this.useBackBuffer = useBackBuffer;\n\n this._antialias = antialias;\n\n if (!this._renderer.context.supports.msaa)\n {\n warn('antialiasing, is not supported on when using the back buffer');\n\n this._antialias = false;\n }\n\n this._state = State.for2d();\n\n const bigTriangleProgram = new GlProgram({\n vertex: `\n attribute vec2 aPosition;\n out vec2 vUv;\n\n void main() {\n gl_Position = vec4(aPosition, 0.0, 1.0);\n\n vUv = (aPosition + 1.0) / 2.0;\n\n // flip dem UVs\n vUv.y = 1.0 - vUv.y;\n }`,\n fragment: `\n in vec2 vUv;\n out vec4 finalColor;\n\n uniform sampler2D uTexture;\n\n void main() {\n finalColor = texture(uTexture, vUv);\n }`,\n name: 'big-triangle',\n });\n\n this._bigTriangleShader = new Shader({\n glProgram: bigTriangleProgram,\n resources: {\n uTexture: Texture.WHITE.source,\n },\n });\n }\n\n /**\n * This is called before the RenderTargetSystem is started. This is where\n * we replace the target with the back buffer if required.\n * @param options - The options for this render.\n */\n protected renderStart(options: RenderOptions)\n {\n const renderTarget = this._renderer.renderTarget.getRenderTarget(options.target);\n\n this._useBackBufferThisRender = this.useBackBuffer && !!renderTarget.isRoot;\n\n if (this._useBackBufferThisRender)\n {\n const renderTarget = this._renderer.renderTarget.getRenderTarget(options.target);\n\n this._targetTexture = renderTarget.colorTexture;\n\n options.target = this._getBackBufferTexture(renderTarget.colorTexture);\n }\n }\n\n protected renderEnd()\n {\n this._presentBackBuffer();\n }\n\n private _presentBackBuffer()\n {\n const renderer = this._renderer;\n\n renderer.renderTarget.finishRenderPass();\n\n if (!this._useBackBufferThisRender) return;\n\n renderer.renderTarget.bind(this._targetTexture, false);\n\n this._bigTriangleShader.resources.uTexture = this._backBufferTexture.source;\n\n renderer.encoder.draw({\n geometry: bigTriangleGeometry,\n shader: this._bigTriangleShader,\n state: this._state,\n });\n }\n\n private _getBackBufferTexture(targetSourceTexture: TextureSource)\n {\n this._backBufferTexture = this._backBufferTexture || new Texture({\n source: new TextureSource({\n width: targetSourceTexture.width,\n height: targetSourceTexture.height,\n resolution: targetSourceTexture._resolution,\n antialias: this._antialias,\n }),\n });\n\n // this will not resize if its the same size already! No extra check required\n this._backBufferTexture.source.resize(\n targetSourceTexture.width,\n targetSourceTexture.height,\n targetSourceTexture._resolution,\n );\n\n return this._backBufferTexture;\n }\n\n /** destroys the back buffer */\n public destroy()\n {\n if (this._backBufferTexture)\n {\n this._backBufferTexture.destroy();\n this._backBufferTexture = null;\n }\n }\n}\n"],"names":["renderTarget"],"mappings":"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"} |