@luma.gl/webgl 9.0.0-alpha.42 → 9.0.0-alpha.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +10 -1
- package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +9 -3
- package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
- package/dist/dist.dev.js +46 -2
- package/dist/index.cjs +13 -2
- package/dist.min.js +22 -22
- package/package.json +5 -5
- package/src/adapter/resources/webgl-render-pass.ts +6 -0
- package/src/adapter/resources/webgl-render-pipeline.ts +17 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pass.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pass.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAK,YAAY,EAAC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"webgl-render-pass.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pass.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAK,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAYpD,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,8DAA8D;IAC9D,YAAY,EAAE,YAAY,CAAC;gBAEf,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe;IAYvD,GAAG,IAAI,IAAI;IAQX,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IACxC,aAAa,IAAI,IAAI;IACrB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAS5C;;OAEG;IACH,aAAa,CAAC,UAAU,GAAE,oBAAyB,GAAG,IAAI;IAiD1D;;OAEG;IACH,SAAS,CAAC,KAAK,IAAI,IAAI;IA+BvB;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,UAAU,GAAE,MAAU,EAAE,KAAK,GAAE,WAA0B;CAwCrF"}
|
|
@@ -2,6 +2,7 @@ import { RenderPass } from '@luma.gl/core';
|
|
|
2
2
|
import { GL } from '@luma.gl/constants';
|
|
3
3
|
import { withGLParameters } from "../../context/state-tracker/with-parameters.js";
|
|
4
4
|
import { setGLParameters } from "../../context/parameters/unified-parameter-api.js";
|
|
5
|
+
import { pushContextState, popContextState } from "../../context/state-tracker/track-context-state.js";
|
|
5
6
|
const GL_DEPTH_BUFFER_BIT = 0x00000100;
|
|
6
7
|
const GL_STENCIL_BUFFER_BIT = 0x00000400;
|
|
7
8
|
const GL_COLOR_BUFFER_BIT = 0x00004000;
|
|
@@ -12,10 +13,18 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
12
13
|
this.device = void 0;
|
|
13
14
|
this.glParameters = void 0;
|
|
14
15
|
this.device = device;
|
|
16
|
+
pushContextState(this.device.gl);
|
|
15
17
|
this.setParameters(this.props.parameters);
|
|
16
18
|
this.clear();
|
|
17
19
|
}
|
|
18
|
-
end() {
|
|
20
|
+
end() {
|
|
21
|
+
popContextState(this.device.gl);
|
|
22
|
+
if (this.props.framebuffer) {
|
|
23
|
+
setGLParameters(this.device, {
|
|
24
|
+
framebuffer: null
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
19
28
|
pushDebugGroup(groupLabel) {}
|
|
20
29
|
popDebugGroup() {}
|
|
21
30
|
insertDebugMarker(markerLabel) {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pass.js","names":["RenderPass","GL","withGLParameters","setGLParameters","GL_DEPTH_BUFFER_BIT","GL_STENCIL_BUFFER_BIT","GL_COLOR_BUFFER_BIT","GL_COLOR","WEBGLRenderPass","constructor","device","props","glParameters","setParameters","parameters","clear","end","pushDebugGroup","groupLabel","popDebugGroup","insertDebugMarker","markerLabel","arguments","length","undefined","framebuffer","depthReadOnly","depthMask","stencilMask","stencilReadOnly","RASTERIZER_DISCARD","discard","viewport","slice","depthRange","scissorTest","Boolean","scissorRect","scissor","blendConstant","blendColor","stencilReference","console","warn","STENCIL_REF","clearMask","clearColor","clearDepth","clearStencil","gl","clearColorBuffer","drawBuffer","value","gl2","Int32Array","clearBufferiv","Uint32Array","clearBufferuiv","Float32Array","clearBufferfv"],"sources":["../../../src/adapter/resources/webgl-render-pass.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {RenderPass, RenderPassProps, NumberArray, RenderPassParameters} from '@luma.gl/core';\nimport {WebGLDevice} from '../webgl-device';\nimport {GL, GLParameters} from '@luma.gl/constants';\nimport {withGLParameters} from '../../context/state-tracker/with-parameters';\nimport {setGLParameters} from '../../context/parameters/unified-parameter-api';\n\n// Should collapse during minification\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\n\nconst GL_COLOR = 0x1800;\n\nexport class WEBGLRenderPass extends RenderPass {\n readonly device: WebGLDevice;\n\n /** Parameters that should be applied before each draw call */\n glParameters: GLParameters;\n\n constructor(device: WebGLDevice, props: RenderPassProps) {\n super(device, props);\n this.device = device;\n\n // TODO - do parameters (scissorRect) affect the clear operation?\n this.setParameters(this.props.parameters);\n\n // Hack - for now WebGL draws in \"immediate mode\" (instead of queueing the operations)...\n this.clear();\n }\n\n end(): void {\n // should add commands to CommandEncoder.\n }\n\n pushDebugGroup(groupLabel: string): void {}\n popDebugGroup(): void {}\n insertDebugMarker(markerLabel: string): void {}\n\n // writeTimestamp(querySet: GPUQuerySet, queryIndex: number): void;\n\n // beginOcclusionQuery(queryIndex: number): void;\n // endOcclusionQuery(): void;\n\n // executeBundles(bundles: Iterable<GPURenderBundle>): void;\n\n /**\n * Maps RenderPass parameters to GL parameters\n */\n setParameters(parameters: RenderPassParameters = {}): void {\n const glParameters: GLParameters = {};\n\n // Framebuffers are specified using parameters in WebGL\n if (this.props.framebuffer) {\n glParameters.framebuffer = this.props.framebuffer;\n }\n\n if (this.props.depthReadOnly) {\n glParameters.depthMask = !this.props.depthReadOnly;\n }\n\n glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;\n\n glParameters[GL.RASTERIZER_DISCARD] = this.props.discard;\n\n // Map the four renderpass parameters to WebGL parameters\n if (parameters.viewport) {\n // WebGPU viewports are 6 coordinates (X, Y, Z)\n if (parameters.viewport.length >= 6) {\n glParameters.viewport = parameters.viewport.slice(0, 4);\n glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];\n } else {\n // WebGL viewports are 4 coordinates (X, Y)\n glParameters.viewport = parameters.viewport;\n }\n }\n glParameters.scissorTest = Boolean(parameters.scissorRect);\n if (parameters.scissorRect) {\n glParameters.scissor = parameters.scissorRect;\n }\n if (parameters.blendConstant) {\n glParameters.blendColor = parameters.blendConstant;\n }\n if (parameters.stencilReference) {\n // eslint-disable-next-line no-console\n console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');\n // parameters.stencilFunc = [func, ref, mask];\n // Does this work?\n parameters[GL.STENCIL_REF] = parameters.stencilReference;\n }\n\n this.glParameters = glParameters;\n\n setGLParameters(this.device, glParameters);\n }\n\n // Internal\n\n /**\n * Optionally clears depth, color and stencil buffers based on parameters\n */\n protected clear(): void {\n const glParameters: GLParameters = {...this.glParameters};\n\n let clearMask = 0;\n\n if (this.props.clearColor !== false) {\n clearMask |= GL_COLOR_BUFFER_BIT;\n glParameters.clearColor = this.props.clearColor;\n }\n if (this.props.clearDepth !== false) {\n clearMask |= GL_DEPTH_BUFFER_BIT;\n glParameters.clearDepth = this.props.clearDepth;\n }\n if (this.props.clearStencil !== false) {\n clearMask |= GL_STENCIL_BUFFER_BIT;\n glParameters.clearStencil = this.props.clearStencil;\n }\n\n if (clearMask !== 0) {\n // Temporarily set any clear \"colors\" and call clear\n withGLParameters(this.device, glParameters, () => {\n this.device.gl.clear(clearMask);\n });\n\n // TODO - clear multiple color attachments\n // for (attachment of this.framebuffer.colorAttachments) {\n // this.clearColorBuffer \n // }\n }\n }\n\n /** \n * WebGL2 - clear a specific color buffer \n */\n protected clearColorBuffer(drawBuffer: number = 0, value: NumberArray = [0, 0, 0, 0]) {\n withGLParameters(this.device.gl2, {framebuffer: this.props.framebuffer}, () => {\n // Method selection per OpenGL ES 3 docs\n switch (value.constructor) {\n case Int32Array:\n this.device.gl2.clearBufferiv(GL_COLOR, drawBuffer, value);\n break;\n case Uint32Array:\n this.device.gl2.clearBufferuiv(GL_COLOR, drawBuffer, value);\n break;\n case Float32Array:\n default:\n this.device.gl2.clearBufferfv(GL_COLOR, drawBuffer, value);\n break;\n }\n });\n }\n\n // clearDepthStencil() {\n // const GL_DEPTH = 0x1801;\n // const GL_STENCIL = 0x1802;\n // const GL_DEPTH_STENCIL = 0x84f9;\n\n // case GL_DEPTH:\n // this.device.gl2.clearBufferfv(GL_DEPTH, 0, [value]);\n // break;\n\n // case GL_STENCIL:\n // this.device.gl2.clearBufferiv(GL_STENCIL, 0, [value]);\n // break;\n\n // case GL_DEPTH_STENCIL:\n // const [depth, stencil] = value;\n // this.device.gl2.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);\n // break;\n\n // default:\n // assert(false, ERR_ARGUMENTS);\n // }\n // });\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl-render-pass.js","names":["RenderPass","GL","withGLParameters","setGLParameters","pushContextState","popContextState","GL_DEPTH_BUFFER_BIT","GL_STENCIL_BUFFER_BIT","GL_COLOR_BUFFER_BIT","GL_COLOR","WEBGLRenderPass","constructor","device","props","glParameters","gl","setParameters","parameters","clear","end","framebuffer","pushDebugGroup","groupLabel","popDebugGroup","insertDebugMarker","markerLabel","arguments","length","undefined","depthReadOnly","depthMask","stencilMask","stencilReadOnly","RASTERIZER_DISCARD","discard","viewport","slice","depthRange","scissorTest","Boolean","scissorRect","scissor","blendConstant","blendColor","stencilReference","console","warn","STENCIL_REF","clearMask","clearColor","clearDepth","clearStencil","clearColorBuffer","drawBuffer","value","gl2","Int32Array","clearBufferiv","Uint32Array","clearBufferuiv","Float32Array","clearBufferfv"],"sources":["../../../src/adapter/resources/webgl-render-pass.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {RenderPass, RenderPassProps, NumberArray, RenderPassParameters} from '@luma.gl/core';\nimport {WebGLDevice} from '../webgl-device';\nimport {GL, GLParameters} from '@luma.gl/constants';\nimport {withGLParameters} from '../../context/state-tracker/with-parameters';\nimport {setGLParameters} from '../../context/parameters/unified-parameter-api';\nimport {pushContextState, popContextState} from '../../context/state-tracker/track-context-state';\n\n// Should collapse during minification\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\n\nconst GL_COLOR = 0x1800;\n\nexport class WEBGLRenderPass extends RenderPass {\n readonly device: WebGLDevice;\n\n /** Parameters that should be applied before each draw call */\n glParameters: GLParameters;\n\n constructor(device: WebGLDevice, props: RenderPassProps) {\n super(device, props);\n this.device = device;\n\n // TODO - do parameters (scissorRect) affect the clear operation?\n pushContextState(this.device.gl);\n this.setParameters(this.props.parameters);\n\n // Hack - for now WebGL draws in \"immediate mode\" (instead of queueing the operations)...\n this.clear();\n }\n\n end(): void {\n popContextState(this.device.gl);\n if (this.props.framebuffer) {\n setGLParameters(this.device, {framebuffer: null});\n }\n // should add commands to CommandEncoder.\n }\n\n pushDebugGroup(groupLabel: string): void {}\n popDebugGroup(): void {}\n insertDebugMarker(markerLabel: string): void {}\n\n // writeTimestamp(querySet: GPUQuerySet, queryIndex: number): void;\n\n // beginOcclusionQuery(queryIndex: number): void;\n // endOcclusionQuery(): void;\n\n // executeBundles(bundles: Iterable<GPURenderBundle>): void;\n\n /**\n * Maps RenderPass parameters to GL parameters\n */\n setParameters(parameters: RenderPassParameters = {}): void {\n const glParameters: GLParameters = {};\n\n // Framebuffers are specified using parameters in WebGL\n if (this.props.framebuffer) {\n glParameters.framebuffer = this.props.framebuffer;\n }\n\n if (this.props.depthReadOnly) {\n glParameters.depthMask = !this.props.depthReadOnly;\n }\n\n glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;\n\n glParameters[GL.RASTERIZER_DISCARD] = this.props.discard;\n\n // Map the four renderpass parameters to WebGL parameters\n if (parameters.viewport) {\n // WebGPU viewports are 6 coordinates (X, Y, Z)\n if (parameters.viewport.length >= 6) {\n glParameters.viewport = parameters.viewport.slice(0, 4);\n glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];\n } else {\n // WebGL viewports are 4 coordinates (X, Y)\n glParameters.viewport = parameters.viewport;\n }\n }\n glParameters.scissorTest = Boolean(parameters.scissorRect);\n if (parameters.scissorRect) {\n glParameters.scissor = parameters.scissorRect;\n }\n if (parameters.blendConstant) {\n glParameters.blendColor = parameters.blendConstant;\n }\n if (parameters.stencilReference) {\n // eslint-disable-next-line no-console\n console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');\n // parameters.stencilFunc = [func, ref, mask];\n // Does this work?\n parameters[GL.STENCIL_REF] = parameters.stencilReference;\n }\n\n this.glParameters = glParameters;\n\n setGLParameters(this.device, glParameters);\n }\n\n // Internal\n\n /**\n * Optionally clears depth, color and stencil buffers based on parameters\n */\n protected clear(): void {\n const glParameters: GLParameters = {...this.glParameters};\n\n let clearMask = 0;\n\n if (this.props.clearColor !== false) {\n clearMask |= GL_COLOR_BUFFER_BIT;\n glParameters.clearColor = this.props.clearColor;\n }\n if (this.props.clearDepth !== false) {\n clearMask |= GL_DEPTH_BUFFER_BIT;\n glParameters.clearDepth = this.props.clearDepth;\n }\n if (this.props.clearStencil !== false) {\n clearMask |= GL_STENCIL_BUFFER_BIT;\n glParameters.clearStencil = this.props.clearStencil;\n }\n\n if (clearMask !== 0) {\n // Temporarily set any clear \"colors\" and call clear\n withGLParameters(this.device, glParameters, () => {\n this.device.gl.clear(clearMask);\n });\n\n // TODO - clear multiple color attachments\n // for (attachment of this.framebuffer.colorAttachments) {\n // this.clearColorBuffer \n // }\n }\n }\n\n /** \n * WebGL2 - clear a specific color buffer \n */\n protected clearColorBuffer(drawBuffer: number = 0, value: NumberArray = [0, 0, 0, 0]) {\n withGLParameters(this.device.gl2, {framebuffer: this.props.framebuffer}, () => {\n // Method selection per OpenGL ES 3 docs\n switch (value.constructor) {\n case Int32Array:\n this.device.gl2.clearBufferiv(GL_COLOR, drawBuffer, value);\n break;\n case Uint32Array:\n this.device.gl2.clearBufferuiv(GL_COLOR, drawBuffer, value);\n break;\n case Float32Array:\n default:\n this.device.gl2.clearBufferfv(GL_COLOR, drawBuffer, value);\n break;\n }\n });\n }\n\n // clearDepthStencil() {\n // const GL_DEPTH = 0x1801;\n // const GL_STENCIL = 0x1802;\n // const GL_DEPTH_STENCIL = 0x84f9;\n\n // case GL_DEPTH:\n // this.device.gl2.clearBufferfv(GL_DEPTH, 0, [value]);\n // break;\n\n // case GL_STENCIL:\n // this.device.gl2.clearBufferiv(GL_STENCIL, 0, [value]);\n // break;\n\n // case GL_DEPTH_STENCIL:\n // const [depth, stencil] = value;\n // this.device.gl2.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);\n // break;\n\n // default:\n // assert(false, ERR_ARGUMENTS);\n // }\n // });\n}\n\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pipeline.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAC,YAAY,EAAoB,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAC,UAAU,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAC,cAAc,
|
|
1
|
+
{"version":3,"file":"webgl-render-pipeline.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAC,YAAY,EAAoB,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAC,UAAU,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAC,cAAc,EAAsC,MAAM,eAAe,CAAC;AAUlF,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAQ3C,oCAAoC;AACpC,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,yDAAyD;IACzD,MAAM,EAAE,WAAW,CAAC;IACpB,yCAAyC;IACzC,MAAM,EAAE,YAAY,CAAC;IACrB,oBAAoB;IACpB,EAAE,EAAE,WAAW,CAAC;IAChB,sBAAsB;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,mEAAmE;IACnE,kBAAkB,EAAE,YAAY,CAAC;IAEjC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM;IAC5C,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACvC,qBAAqB;IACrB,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEjC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;IAC3C,oBAAoB,EAAE,MAAM,CAAK;IACjC,aAAa,EAAE,MAAM,CAAK;IAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAM;gBAEnC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB;IA+BlD,OAAO,IAAI,IAAI;IAyCxB;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAiDpD,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAWlD;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE;QACZ,UAAU,EAAE,UAAU,CAAC;QACvB,wBAAwB;QACxB,WAAW,EAAE,WAAW,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO;IAgHX,SAAS,CAAC,eAAe;IA4BzB;;;;OAIG;IACH,sBAAsB;IAoBtB;;;;;;;;;;;;;;;;;;;;MAoBE;IAEF,iDAAiD;IACjD,cAAc;IA+Ed;;;OAGG;IACH,cAAc;CASf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RenderPipeline, cast, log } from '@luma.gl/core';
|
|
1
|
+
import { RenderPipeline, cast, splitUniformsAndBindings, log } from '@luma.gl/core';
|
|
2
2
|
import { mergeShaderLayout } from '@luma.gl/core';
|
|
3
3
|
import { GL } from '@luma.gl/constants';
|
|
4
4
|
import { getShaderLayout } from "../helpers/get-shader-layout.js";
|
|
@@ -52,7 +52,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
52
52
|
}
|
|
53
53
|
setBindings(bindings) {
|
|
54
54
|
for (const [name, value] of Object.entries(bindings)) {
|
|
55
|
-
const binding = this.shaderLayout.bindings.find(binding => binding.name === name);
|
|
55
|
+
const binding = this.shaderLayout.bindings.find(binding => binding.name === name) || this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);
|
|
56
56
|
if (!binding) {
|
|
57
57
|
const validBindings = this.shaderLayout.bindings.map(binding => `"${binding.name}"`).join(', ');
|
|
58
58
|
log.warn(`Unknown binding "${name}" in render pipeline "${this.id}", expected one of ${validBindings}`)();
|
|
@@ -82,6 +82,12 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
setUniforms(uniforms) {
|
|
85
|
+
const {
|
|
86
|
+
bindings
|
|
87
|
+
} = splitUniformsAndBindings(uniforms);
|
|
88
|
+
Object.keys(bindings).forEach(name => {
|
|
89
|
+
log.warn(`Unsupported value "${bindings[name]}" used in setUniforms() for key ${name}. Use setBindings() instead?`)();
|
|
90
|
+
});
|
|
85
91
|
Object.assign(this.uniforms, uniforms);
|
|
86
92
|
}
|
|
87
93
|
draw(options) {
|
|
@@ -173,7 +179,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
173
179
|
let textureUnit = 0;
|
|
174
180
|
let uniformBufferIndex = 0;
|
|
175
181
|
for (const binding of this.shaderLayout.bindings) {
|
|
176
|
-
const value = this.bindings[binding.name];
|
|
182
|
+
const value = this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];
|
|
177
183
|
if (!value) {
|
|
178
184
|
throw new Error(`No value for binding ${binding.name} in ${this.id}`);
|
|
179
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","log","mergeShaderLayout","GL","getShaderLayout","withDeviceAndGLParameters","setUniform","WEBGLBuffer","WEBGLFramebuffer","WEBGLTexture","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","uniforms","bindings","varyings","_textureUniforms","_textureIndexCounter","_uniformCount","_uniformSetters","gl","createProgram","setSpectorMetadata","id","bufferMode","SEPARATE_ATTRIBS","length","_this$device$gl","assertWebGL2","gl2","transformFeedbackVaryings","_compileAndLink","shaderLayout","destroy","deleteProgram","destroyed","setBindings","name","value","Object","entries","binding","find","validBindings","map","join","warn","type","buffer","Error","setUniforms","assign","draw","options","_vertexArray$indexBuf","renderPass","vertexArray","vertexCount","instanceCount","firstVertex","glDrawMode","getGLDrawMode","topology","isIndexed","Boolean","indexBuffer","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bindBeforeRender","primitiveMode","getGLPrimitive","transformFeedback","begin","_applyBindings","_applyUniforms","webglRenderPass","parameters","glParameters","_this$device$gl2","drawElementsInstanced","drawElements","_this$device$gl3","drawArraysInstanced","drawArrays","end","unbindAfterRender","attachShader","time","linkProgram","timeEnd","debug","level","linked","getProgramParameter","LINK_STATUS","getProgramInfoLog","validateProgram","validated","VALIDATE_STATUS","texturesRenderable","texture","update","loaded","undefined","textureUnit","uniformBufferIndex","location","getUniformBlockIndex","INVALID_INDEX","uniformBlockBinding","bindBufferBase","UNIFORM_BUFFER","bindBufferRange","offset","size","byteLength","colorAttachments","activeTexture","TEXTURE0","bindTexture","target","uniformLayout","_this$uniforms$name","POINTS","LINES","LINE_STRIP","LINE_LOOP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';\nimport type {ShaderLayout, PrimitiveTopology} from '@luma.gl/core';\nimport type {RenderPass, VertexArray} from '@luma.gl/core';\nimport {RenderPipeline, cast, log} from '@luma.gl/core';\nimport {mergeShaderLayout} from '@luma.gl/core';\n// import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getShaderLayout} from '../helpers/get-shader-layout';\nimport {withDeviceAndGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\n// import {copyUniform, checkUniformValues} from '../../classes/uniforms';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLShader} from './webgl-shader';\nimport {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {WEBGLTexture} from './webgl-texture';\n// import {WEBGLVertexArray} from './webgl-vertex-array';\nimport {WEBGLRenderPass} from './webgl-render-pass';\n\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device: WebGLDevice;\n /** Handle to underlying WebGL program */\n handle: WebGLProgram;\n /** vertex shader */\n vs: WEBGLShader;\n /** fragment shader */\n fs: WEBGLShader;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout: ShaderLayout;\n\n /** Uniforms set on this model */\n uniforms: Record<string, UniformValue> = {};\n /** Bindings set on this model */\n bindings: Record<string, Binding> = {};\n /** WebGL varyings */\n varyings: string[] | null = null;\n\n _textureUniforms: Record<string, any> = {};\n _textureIndexCounter: number = 0;\n _uniformCount: number = 0;\n _uniformSetters: Record<string, Function> = {}; // TODO are these used?\n\n constructor(device: WebGLDevice, props: RenderPipelineProps) {\n super(device, props);\n this.device = device;\n this.handle = this.props.handle || this.device.gl.createProgram();\n this.device.setSpectorMetadata(this.handle, {id: this.props.id});\n\n // Create shaders if needed\n this.vs = cast<WEBGLShader>(props.vs);\n this.fs = cast<WEBGLShader>(props.fs);\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;\n if (varyings && varyings.length > 0) {\n this.device.assertWebGL2();\n this.varyings = varyings;\n this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._compileAndLink();\n\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n // Merge layout with any buffer map overrides\n // this.bufferLayout = props.bufferLayout || [];\n // this.shaderLayout = mergeBufferMap(this.shaderLayout, this.bufferLayout);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n // setIndexBuffer(indexBuffer: Buffer): void {\n // const webglBuffer = cast<WEBGLBuffer>(indexBuffer);\n // this.vertexArrayObject.setElementBuffer(webglBuffer);\n // this._indexBuffer = indexBuffer;\n // }\n\n // /** @todo needed for portable model */\n // setAttributes(attributes: Record<string, Buffer>): void {\n // for (const [name, buffer] of Object.entries(attributes)) {\n // const webglBuffer = cast<WEBGLBuffer>(buffer);\n // const attribute = getAttributeLayout(this.layout, name);\n // if (!attribute) {\n // log.warn(\n // `Ignoring buffer supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\" (buffer \"${buffer.id}\")`\n // )();\n // continue;\n // }\n // const decoded = decodeVertexFormat(attribute.format);\n // const {type: typeString, components: size, byteLength: stride, normalized, integer} = decoded;\n // const divisor = attribute.stepMode === 'instance' ? 1 : 0;\n // const type = getWebGLDataType(typeString);\n // this.vertexArrayObject.setBuffer(attribute.location, webglBuffer, {\n // size,\n // type,\n // stride,\n // offset: 0,\n // normalized,\n // integer,\n // divisor\n // });\n // }\n // }\n\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>): void {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\n // }\n\n for (const [name, value] of Object.entries(bindings)) {\n const binding = this.shaderLayout.bindings.find(binding => binding.name === name);\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n log.warn(\n `Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`\n )();\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding \"${name}\" in render pipeline \"${this.id}\"`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n\n this.bindings[name] = value;\n }\n }\n\n setUniforms(uniforms: Record<string, UniformValue>) {\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n\n /** @todo needed for portable model\n * @note The WebGL API is offers many ways to draw things\n * This function unifies those ways into a single call using common parameters with sane defaults\n */\n draw(options: {\n renderPass: RenderPass;\n /** vertex attributes */\n vertexArray: VertexArray;\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n }): boolean {\n const {\n renderPass,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0\n // firstIndex,\n // firstInstance,\n // baseVertex\n } = options;\n\n const glDrawMode = getGLDrawMode(this.props.topology);\n const isIndexed: boolean = Boolean(vertexArray.indexBuffer);\n const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;\n const isInstanced: boolean = Number(instanceCount) > 0;\n\n // Avoid WebGL draw call when not rendering any data or values are incomplete\n // Note: async textures set as uniforms might still be loading.\n // Now that all uniforms have been updated, check if any texture\n // in the uniforms is not yet initialized, then we don't draw\n if (!this._areTexturesRenderable() || vertexCount === 0) {\n // (isInstanced && instanceCount === 0)\n return false;\n }\n\n this.device.gl.useProgram(this.handle);\n\n // Note: Rebinds constant attributes before each draw call\n vertexArray.bindBeforeRender(renderPass);\n\n const primitiveMode = getGLPrimitive(this.props.topology);\n const transformFeedback: any = null;\n if (transformFeedback) {\n transformFeedback.begin(primitiveMode);\n }\n\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n\n const webglRenderPass = renderPass as WEBGLRenderPass;\n // // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension\n // if (isIndexed && isInstanced) {\n // // ANGLE_instanced_arrays extension\n // this.device.gl2?.drawElementsInstanced(\n // drawMode,\n // vertexCount || 0, // indexCount?\n // indexType,\n // firstVertex,\n // instanceCount || 0\n // );\n // // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n // } else if (isIndexed) {\n // this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?\n // } else if (isInstanced) {\n // this.device.gl2?.drawArraysInstanced(\n // drawMode,\n // firstVertex,\n // vertexCount || 0,\n // instanceCount || 0\n // );\n // } else {\n // this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);\n // }\n // });\n\n withDeviceAndGLParameters(\n this.device,\n this.props.parameters,\n webglRenderPass.glParameters,\n () => {\n if (isIndexed && isInstanced) {\n // ANGLE_instanced_arrays extension\n this.device.gl2?.drawElementsInstanced(\n glDrawMode,\n vertexCount || 0, // indexCount?\n glIndexType,\n firstVertex,\n instanceCount || 0\n );\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gl2.drawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);\n } else if (isIndexed) {\n this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?\n } else if (isInstanced) {\n this.device.gl2?.drawArraysInstanced(\n glDrawMode,\n firstVertex,\n vertexCount || 0,\n instanceCount || 0\n );\n } else {\n this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);\n }\n\n if (transformFeedback) {\n transformFeedback.end();\n }\n }\n );\n\n vertexArray.unbindAfterRender(renderPass);\n\n return true;\n }\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected _compileAndLink() {\n const {gl} = this.device;\n gl.attachShader(this.handle, this.vs.handle);\n gl.attachShader(this.handle, this.fs.handle);\n log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n gl.linkProgram(this.handle);\n log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n\n // Avoid checking program linking error in production\n // @ts-expect-error\n if (!gl.debug && log.level === 0) {\n // return;\n }\n\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);\n }\n }\n\n // PRIVATE METHODS\n\n /**\n * Checks if all texture-values uniforms are renderable (i.e. loaded)\n * Update a texture if needed (e.g. from video)\n * Note: This is currently done before every draw call\n */\n _areTexturesRenderable() {\n let texturesRenderable = true;\n\n for (const [, texture] of Object.entries(this._textureUniforms)) {\n texture.update();\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n\n for (const [, texture] of Object.entries(this.bindings)) {\n // texture.update();\n // @ts-expect-error\n if (texture.loaded !== undefined) {\n // @ts-expect-error\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n }\n\n return texturesRenderable;\n }\n\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n *\n _applyConstantAttributes(vertexArray: WEBGLVertexArray): void {\n const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);\n for (const [name, value] of Object.entries(this.)) {\n const attributeInfo = attributeInfos[name];\n if (!attributeInfo) {\n log.warn(\n `Ignoring constant value supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n )();\n continue; // eslint-disable-line no-continue\n }\n vertexArray.setConstant(attributeInfo.location, value);\n vertexArray.enable(attributeInfo.location, false);\n }\n }\n */\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n this.device.gl.useProgram(this.handle);\n\n const {gl2} = this.device;\n if (!gl2) {\n throw new Error('bindings');\n }\n\n let textureUnit = 0;\n let uniformBufferIndex = 0;\n for (const binding of this.shaderLayout.bindings) {\n const value = this.bindings[binding.name];\n if (!value) {\n throw new Error(`No value for binding ${binding.name} in ${this.id}`);\n }\n switch (binding.type) {\n case 'uniform':\n // Set buffer\n const {name} = binding;\n const location = gl2.getUniformBlockIndex(this.handle, name);\n if (location === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl2.bindBufferRange(\n GL.UNIFORM_BUFFER,\n uniformBufferIndex,\n // @ts-expect-error\n value.buffer.handle,\n // @ts-expect-error\n value.offset || 0,\n // @ts-expect-error\n value.size || value.buffer.byteLength - value.offset\n );\n }\n uniformBufferIndex += 1;\n break;\n\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTexture\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0];\n } else {\n throw new Error('No texture');\n }\n\n gl2.activeTexture(GL.TEXTURE0 + textureUnit);\n gl2.bindTexture(texture.target, texture.handle);\n // gl2.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n\n case 'sampler':\n // ignore\n break;\n\n case 'storage':\n case 'read-only-storage':\n throw new Error(`binding type '${binding.type}' not supported in WebGL`);\n }\n }\n }\n\n /**\n * Due to program sharing, uniforms need to be reset before every draw call\n * (though caching will avoid redundant WebGL calls)\n */\n _applyUniforms() {\n for (const uniformLayout of this.shaderLayout.uniforms || []) {\n const {name, location, type, textureUnit} = uniformLayout;\n const value = this.uniforms[name] ?? textureUnit;\n if (value !== undefined) {\n setUniform(this.device.gl, location, type, value);\n }\n }\n }\n}\n\n/** Get the primitive type for draw */\nfunction getGLDrawMode(\n topology: PrimitiveTopology\n):\n | GL.POINTS\n | GL.LINES\n | GL.LINE_STRIP\n | GL.LINE_LOOP\n | GL.TRIANGLES\n | GL.TRIANGLE_STRIP\n | GL.TRIANGLE_FAN {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINE_STRIP;\n case 'line-loop-webgl': return GL.LINE_LOOP;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLE_STRIP;\n case 'triangle-fan-webgl': return GL.TRIANGLE_FAN;\n default: throw new Error(topology);\n }\n}\n\n/** Get the primitive type for transform feedback */\nfunction getGLPrimitive(topology: PrimitiveTopology): GL.POINTS | GL.LINES | GL.TRIANGLES {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINES;\n case 'line-loop-webgl': return GL.LINES;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLES;\n case 'triangle-fan-webgl': return GL.TRIANGLES;\n default: throw new Error(topology);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","splitUniformsAndBindings","log","mergeShaderLayout","GL","getShaderLayout","withDeviceAndGLParameters","setUniform","WEBGLBuffer","WEBGLFramebuffer","WEBGLTexture","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","uniforms","bindings","varyings","_textureUniforms","_textureIndexCounter","_uniformCount","_uniformSetters","gl","createProgram","setSpectorMetadata","id","bufferMode","SEPARATE_ATTRIBS","length","_this$device$gl","assertWebGL2","gl2","transformFeedbackVaryings","_compileAndLink","shaderLayout","destroy","deleteProgram","destroyed","setBindings","name","value","Object","entries","binding","find","validBindings","map","join","warn","type","buffer","Error","setUniforms","keys","forEach","assign","draw","options","_vertexArray$indexBuf","renderPass","vertexArray","vertexCount","instanceCount","firstVertex","glDrawMode","getGLDrawMode","topology","isIndexed","Boolean","indexBuffer","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bindBeforeRender","primitiveMode","getGLPrimitive","transformFeedback","begin","_applyBindings","_applyUniforms","webglRenderPass","parameters","glParameters","_this$device$gl2","drawElementsInstanced","drawElements","_this$device$gl3","drawArraysInstanced","drawArrays","end","unbindAfterRender","attachShader","time","linkProgram","timeEnd","debug","level","linked","getProgramParameter","LINK_STATUS","getProgramInfoLog","validateProgram","validated","VALIDATE_STATUS","texturesRenderable","texture","update","loaded","undefined","textureUnit","uniformBufferIndex","replace","location","getUniformBlockIndex","INVALID_INDEX","uniformBlockBinding","bindBufferBase","UNIFORM_BUFFER","bindBufferRange","offset","size","byteLength","colorAttachments","activeTexture","TEXTURE0","bindTexture","target","uniformLayout","_this$uniforms$name","POINTS","LINES","LINE_STRIP","LINE_LOOP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';\nimport type {ShaderLayout, PrimitiveTopology} from '@luma.gl/core';\nimport type {RenderPass, VertexArray} from '@luma.gl/core';\nimport {RenderPipeline, cast, splitUniformsAndBindings, log} from '@luma.gl/core';\nimport {mergeShaderLayout} from '@luma.gl/core';\n// import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getShaderLayout} from '../helpers/get-shader-layout';\nimport {withDeviceAndGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\n// import {copyUniform, checkUniformValues} from '../../classes/uniforms';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLShader} from './webgl-shader';\nimport {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {WEBGLTexture} from './webgl-texture';\n// import {WEBGLVertexArray} from './webgl-vertex-array';\nimport {WEBGLRenderPass} from './webgl-render-pass';\n\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device: WebGLDevice;\n /** Handle to underlying WebGL program */\n handle: WebGLProgram;\n /** vertex shader */\n vs: WEBGLShader;\n /** fragment shader */\n fs: WEBGLShader;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout: ShaderLayout;\n\n /** Uniforms set on this model */\n uniforms: Record<string, UniformValue> = {};\n /** Bindings set on this model */\n bindings: Record<string, Binding> = {};\n /** WebGL varyings */\n varyings: string[] | null = null;\n\n _textureUniforms: Record<string, any> = {};\n _textureIndexCounter: number = 0;\n _uniformCount: number = 0;\n _uniformSetters: Record<string, Function> = {}; // TODO are these used?\n\n constructor(device: WebGLDevice, props: RenderPipelineProps) {\n super(device, props);\n this.device = device;\n this.handle = this.props.handle || this.device.gl.createProgram();\n this.device.setSpectorMetadata(this.handle, {id: this.props.id});\n\n // Create shaders if needed\n this.vs = cast<WEBGLShader>(props.vs);\n this.fs = cast<WEBGLShader>(props.fs);\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;\n if (varyings && varyings.length > 0) {\n this.device.assertWebGL2();\n this.varyings = varyings;\n this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._compileAndLink();\n\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n // Merge layout with any buffer map overrides\n // this.bufferLayout = props.bufferLayout || [];\n // this.shaderLayout = mergeBufferMap(this.shaderLayout, this.bufferLayout);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n // setIndexBuffer(indexBuffer: Buffer): void {\n // const webglBuffer = cast<WEBGLBuffer>(indexBuffer);\n // this.vertexArrayObject.setElementBuffer(webglBuffer);\n // this._indexBuffer = indexBuffer;\n // }\n\n // /** @todo needed for portable model */\n // setAttributes(attributes: Record<string, Buffer>): void {\n // for (const [name, buffer] of Object.entries(attributes)) {\n // const webglBuffer = cast<WEBGLBuffer>(buffer);\n // const attribute = getAttributeLayout(this.layout, name);\n // if (!attribute) {\n // log.warn(\n // `Ignoring buffer supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\" (buffer \"${buffer.id}\")`\n // )();\n // continue;\n // }\n // const decoded = decodeVertexFormat(attribute.format);\n // const {type: typeString, components: size, byteLength: stride, normalized, integer} = decoded;\n // const divisor = attribute.stepMode === 'instance' ? 1 : 0;\n // const type = getWebGLDataType(typeString);\n // this.vertexArrayObject.setBuffer(attribute.location, webglBuffer, {\n // size,\n // type,\n // stride,\n // offset: 0,\n // normalized,\n // integer,\n // divisor\n // });\n // }\n // }\n\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>): void {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\n // }\n\n for (const [name, value] of Object.entries(bindings)) {\n // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n // This convention allows shaders to name uniform blocks as `uniform appUniforms {} app;`\n // and reference them as `app` from both GLSL and JS.\n // TODO - this is rather hacky - we could also remap the name directly in the shader layout.\n const binding = \n this.shaderLayout.bindings.find(binding => binding.name === name) ||\n this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);\n\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n log.warn(\n `Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`\n )();\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding \"${name}\" in render pipeline \"${this.id}\"`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n\n this.bindings[name] = value;\n }\n }\n\n setUniforms(uniforms: Record<string, UniformValue>) {\n const {bindings} = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(\n `Unsupported value \"${bindings[name]}\" used in setUniforms() for key ${name}. Use setBindings() instead?`\n )();\n });\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n\n /** @todo needed for portable model\n * @note The WebGL API is offers many ways to draw things\n * This function unifies those ways into a single call using common parameters with sane defaults\n */\n draw(options: {\n renderPass: RenderPass;\n /** vertex attributes */\n vertexArray: VertexArray;\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n }): boolean {\n const {\n renderPass,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0\n // firstIndex,\n // firstInstance,\n // baseVertex\n } = options;\n\n const glDrawMode = getGLDrawMode(this.props.topology);\n const isIndexed: boolean = Boolean(vertexArray.indexBuffer);\n const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;\n const isInstanced: boolean = Number(instanceCount) > 0;\n\n // Avoid WebGL draw call when not rendering any data or values are incomplete\n // Note: async textures set as uniforms might still be loading.\n // Now that all uniforms have been updated, check if any texture\n // in the uniforms is not yet initialized, then we don't draw\n if (!this._areTexturesRenderable() || vertexCount === 0) {\n // (isInstanced && instanceCount === 0)\n return false;\n }\n\n this.device.gl.useProgram(this.handle);\n\n // Note: Rebinds constant attributes before each draw call\n vertexArray.bindBeforeRender(renderPass);\n\n const primitiveMode = getGLPrimitive(this.props.topology);\n const transformFeedback: any = null;\n if (transformFeedback) {\n transformFeedback.begin(primitiveMode);\n }\n\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n\n const webglRenderPass = renderPass as WEBGLRenderPass;\n // // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension\n // if (isIndexed && isInstanced) {\n // // ANGLE_instanced_arrays extension\n // this.device.gl2?.drawElementsInstanced(\n // drawMode,\n // vertexCount || 0, // indexCount?\n // indexType,\n // firstVertex,\n // instanceCount || 0\n // );\n // // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n // } else if (isIndexed) {\n // this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?\n // } else if (isInstanced) {\n // this.device.gl2?.drawArraysInstanced(\n // drawMode,\n // firstVertex,\n // vertexCount || 0,\n // instanceCount || 0\n // );\n // } else {\n // this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);\n // }\n // });\n\n withDeviceAndGLParameters(\n this.device,\n this.props.parameters,\n webglRenderPass.glParameters,\n () => {\n if (isIndexed && isInstanced) {\n // ANGLE_instanced_arrays extension\n this.device.gl2?.drawElementsInstanced(\n glDrawMode,\n vertexCount || 0, // indexCount?\n glIndexType,\n firstVertex,\n instanceCount || 0\n );\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gl2.drawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);\n } else if (isIndexed) {\n this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?\n } else if (isInstanced) {\n this.device.gl2?.drawArraysInstanced(\n glDrawMode,\n firstVertex,\n vertexCount || 0,\n instanceCount || 0\n );\n } else {\n this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);\n }\n\n if (transformFeedback) {\n transformFeedback.end();\n }\n }\n );\n\n vertexArray.unbindAfterRender(renderPass);\n\n return true;\n }\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected _compileAndLink() {\n const {gl} = this.device;\n gl.attachShader(this.handle, this.vs.handle);\n gl.attachShader(this.handle, this.fs.handle);\n log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n gl.linkProgram(this.handle);\n log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n\n // Avoid checking program linking error in production\n // @ts-expect-error\n if (!gl.debug && log.level === 0) {\n // return;\n }\n\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);\n }\n }\n\n // PRIVATE METHODS\n\n /**\n * Checks if all texture-values uniforms are renderable (i.e. loaded)\n * Update a texture if needed (e.g. from video)\n * Note: This is currently done before every draw call\n */\n _areTexturesRenderable() {\n let texturesRenderable = true;\n\n for (const [, texture] of Object.entries(this._textureUniforms)) {\n texture.update();\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n\n for (const [, texture] of Object.entries(this.bindings)) {\n // texture.update();\n // @ts-expect-error\n if (texture.loaded !== undefined) {\n // @ts-expect-error\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n }\n\n return texturesRenderable;\n }\n\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n *\n _applyConstantAttributes(vertexArray: WEBGLVertexArray): void {\n const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);\n for (const [name, value] of Object.entries(this.)) {\n const attributeInfo = attributeInfos[name];\n if (!attributeInfo) {\n log.warn(\n `Ignoring constant value supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n )();\n continue; // eslint-disable-line no-continue\n }\n vertexArray.setConstant(attributeInfo.location, value);\n vertexArray.enable(attributeInfo.location, false);\n }\n }\n */\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n this.device.gl.useProgram(this.handle);\n\n const {gl2} = this.device;\n if (!gl2) {\n throw new Error('bindings');\n }\n\n let textureUnit = 0;\n let uniformBufferIndex = 0;\n for (const binding of this.shaderLayout.bindings) {\n // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n const value = this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];\n if (!value) {\n throw new Error(`No value for binding ${binding.name} in ${this.id}`);\n }\n switch (binding.type) {\n case 'uniform':\n // Set buffer\n const {name} = binding;\n const location = gl2.getUniformBlockIndex(this.handle, name);\n if (location === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl2.bindBufferRange(\n GL.UNIFORM_BUFFER,\n uniformBufferIndex,\n // @ts-expect-error\n value.buffer.handle,\n // @ts-expect-error\n value.offset || 0,\n // @ts-expect-error\n value.size || value.buffer.byteLength - value.offset\n );\n }\n uniformBufferIndex += 1;\n break;\n\n case 'texture':\n if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTexture\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0];\n } else {\n throw new Error('No texture');\n }\n\n gl2.activeTexture(GL.TEXTURE0 + textureUnit);\n gl2.bindTexture(texture.target, texture.handle);\n // gl2.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n\n case 'sampler':\n // ignore\n break;\n\n case 'storage':\n case 'read-only-storage':\n throw new Error(`binding type '${binding.type}' not supported in WebGL`);\n }\n }\n }\n\n /**\n * Due to program sharing, uniforms need to be reset before every draw call\n * (though caching will avoid redundant WebGL calls)\n */\n _applyUniforms() {\n for (const uniformLayout of this.shaderLayout.uniforms || []) {\n const {name, location, type, textureUnit} = uniformLayout;\n const value = this.uniforms[name] ?? textureUnit;\n if (value !== undefined) {\n setUniform(this.device.gl, location, type, value);\n }\n }\n }\n}\n\n/** Get the primitive type for draw */\nfunction getGLDrawMode(\n topology: PrimitiveTopology\n):\n | GL.POINTS\n | GL.LINES\n | GL.LINE_STRIP\n | GL.LINE_LOOP\n | GL.TRIANGLES\n | GL.TRIANGLE_STRIP\n | GL.TRIANGLE_FAN {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINE_STRIP;\n case 'line-loop-webgl': return GL.LINE_LOOP;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLE_STRIP;\n case 'triangle-fan-webgl': return GL.TRIANGLE_FAN;\n default: throw new Error(topology);\n }\n}\n\n/** Get the primitive type for transform feedback */\nfunction getGLPrimitive(topology: PrimitiveTopology): GL.POINTS | GL.LINES | GL.TRIANGLES {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINES;\n case 'line-loop-webgl': return GL.LINES;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLES;\n case 'triangle-fan-webgl': return GL.TRIANGLES;\n default: throw new Error(topology);\n }\n}\n"],"mappings":"AAMA,SAAQA,cAAc,EAAEC,IAAI,EAAEC,wBAAwB,EAAEC,GAAG,QAAO,eAAe;AACjF,SAAQC,iBAAiB,QAAO,eAAe;AAE/C,SAAQC,EAAE,QAAO,oBAAoB;AAAC,SAE9BC,eAAe;AAAA,SACfC,yBAAyB;AAAA,SACzBC,UAAU;AAAA,SAIVC,WAAW;AAAA,SAEXC,gBAAgB;AAAA,SAChBC,YAAY;AAIpB,MAAMC,yBAAyB,GAAG,CAAC;AAGnC,OAAO,MAAMC,mBAAmB,SAASb,cAAc,CAAC;EAwBtDc,WAAWA,CAACC,MAAmB,EAAEC,KAA0B,EAAE;IAC3D,KAAK,CAACD,MAAM,EAAEC,KAAK,CAAC;IAAC,KAvBvBD,MAAM;IAAA,KAENE,MAAM;IAAA,KAENC,EAAE;IAAA,KAEFC,EAAE;IAAA,KAEFC,kBAAkB;IAAA,KAGlBC,QAAQ,GAAiC,CAAC,CAAC;IAAA,KAE3CC,QAAQ,GAA4B,CAAC,CAAC;IAAA,KAEtCC,QAAQ,GAAoB,IAAI;IAAA,KAEhCC,gBAAgB,GAAwB,CAAC,CAAC;IAAA,KAC1CC,oBAAoB,GAAW,CAAC;IAAA,KAChCC,aAAa,GAAW,CAAC;IAAA,KACzBC,eAAe,GAA6B,CAAC,CAAC;IAI5C,IAAI,CAACZ,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,MAAM,GAAG,IAAI,CAACD,KAAK,CAACC,MAAM,IAAI,IAAI,CAACF,MAAM,CAACa,EAAE,CAACC,aAAa,CAAC,CAAC;IACjE,IAAI,CAACd,MAAM,CAACe,kBAAkB,CAAC,IAAI,CAACb,MAAM,EAAE;MAACc,EAAE,EAAE,IAAI,CAACf,KAAK,CAACe;IAAE,CAAC,CAAC;IAGhE,IAAI,CAACb,EAAE,GAAGjB,IAAI,CAAce,KAAK,CAACE,EAAE,CAAC;IACrC,IAAI,CAACC,EAAE,GAAGlB,IAAI,CAAce,KAAK,CAACG,EAAE,CAAC;IAMrC,MAAM;MAACI,QAAQ;MAAES,UAAU,GAAG3B,EAAE,CAAC4B;IAAgB,CAAC,GAAGjB,KAAK;IAC1D,IAAIO,QAAQ,IAAIA,QAAQ,CAACW,MAAM,GAAG,CAAC,EAAE;MAAA,IAAAC,eAAA;MACnC,IAAI,CAACpB,MAAM,CAACqB,YAAY,CAAC,CAAC;MAC1B,IAAI,CAACb,QAAQ,GAAGA,QAAQ;MACxB,CAAAY,eAAA,OAAI,CAACpB,MAAM,CAACsB,GAAG,cAAAF,eAAA,uBAAfA,eAAA,CAAiBG,yBAAyB,CAAC,IAAI,CAACrB,MAAM,EAAEM,QAAQ,EAAES,UAAU,CAAC;IAC/E;IAEA,IAAI,CAACO,eAAe,CAAC,CAAC;IAEtB,IAAI,CAACnB,kBAAkB,GAAGd,eAAe,CAAC,IAAI,CAACS,MAAM,CAACa,EAAE,EAAE,IAAI,CAACX,MAAM,CAAC;IAEtE,IAAI,CAACuB,YAAY,GAAGpC,iBAAiB,CAAC,IAAI,CAACgB,kBAAkB,EAAEJ,KAAK,CAACwB,YAAY,CAAC;EAIpF;EAESC,OAAOA,CAAA,EAAS;IACvB,IAAI,IAAI,CAACxB,MAAM,EAAE;MACf,IAAI,CAACF,MAAM,CAACa,EAAE,CAACc,aAAa,CAAC,IAAI,CAACzB,MAAM,CAAC;MAEzC,IAAI,CAAC0B,SAAS,GAAG,IAAI;IACvB;EACF;EAuCAC,WAAWA,CAACtB,QAAiC,EAAQ;IAKnD,KAAK,MAAM,CAACuB,IAAI,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAAC1B,QAAQ,CAAC,EAAE;MAKpD,MAAM2B,OAAO,GACX,IAAI,CAACT,YAAY,CAAClB,QAAQ,CAAC4B,IAAI,CAACD,OAAO,IAAIA,OAAO,CAACJ,IAAI,KAAKA,IAAI,CAAC,IACjE,IAAI,CAACL,YAAY,CAAClB,QAAQ,CAAC4B,IAAI,CAACD,OAAO,IAAIA,OAAO,CAACJ,IAAI,KAAM,GAAEA,IAAK,UAAS,CAAC;MAEhF,IAAI,CAACI,OAAO,EAAE;QACZ,MAAME,aAAa,GAAG,IAAI,CAACX,YAAY,CAAClB,QAAQ,CAC7C8B,GAAG,CAACH,OAAO,IAAK,IAAGA,OAAO,CAACJ,IAAK,GAAE,CAAC,CACnCQ,IAAI,CAAC,IAAI,CAAC;QACblD,GAAG,CAACmD,IAAI,CACL,oBAAmBT,IAAK,yBAAwB,IAAI,CAACd,EAAG,sBAAqBoB,aAAc,EAC9F,CAAC,CAAC,CAAC;QACH;MACF;MACA,IAAI,CAACL,KAAK,EAAE;QACV3C,GAAG,CAACmD,IAAI,CAAE,sBAAqBT,IAAK,yBAAwB,IAAI,CAACd,EAAG,GAAE,CAAC,CAAC,CAAC;MAC3E;MACA,QAAQkB,OAAO,CAACM,IAAI;QAClB,KAAK,SAAS;UAEZ,IAAI,EAAET,KAAK,YAAYrC,WAAW,CAAC,IAAI,EAAEqC,KAAK,CAACU,MAAM,YAAY/C,WAAW,CAAC,EAAE;YAC7E,MAAM,IAAIgD,KAAK,CAAC,cAAc,CAAC;UACjC;UACA;QACF,KAAK,SAAS;UACZ,IAAI,EAAEX,KAAK,YAAYnC,YAAY,IAAImC,KAAK,YAAYpC,gBAAgB,CAAC,EAAE;YACzE,MAAM,IAAI+C,KAAK,CAAC,eAAe,CAAC;UAClC;UACA;QACF,KAAK,SAAS;UACZtD,GAAG,CAACmD,IAAI,CAAE,oBAAmBT,IAAK,EAAC,CAAC,CAAC,CAAC;UACtC;QACF;UACE,MAAM,IAAIY,KAAK,CAACR,OAAO,CAACM,IAAI,CAAC;MACjC;MAEA,IAAI,CAACjC,QAAQ,CAACuB,IAAI,CAAC,GAAGC,KAAK;IAC7B;EACF;EAEAY,WAAWA,CAACrC,QAAsC,EAAE;IAClD,MAAM;MAACC;IAAQ,CAAC,GAAGpB,wBAAwB,CAACmB,QAAQ,CAAC;IACrD0B,MAAM,CAACY,IAAI,CAACrC,QAAQ,CAAC,CAACsC,OAAO,CAACf,IAAI,IAAI;MACpC1C,GAAG,CAACmD,IAAI,CACL,sBAAqBhC,QAAQ,CAACuB,IAAI,CAAE,mCAAkCA,IAAK,8BAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEFE,MAAM,CAACc,MAAM,CAAC,IAAI,CAACxC,QAAQ,EAAEA,QAAQ,CAAC;EACxC;EAMAyC,IAAIA,CAACC,OAWJ,EAAW;IAAA,IAAAC,qBAAA;IACV,MAAM;MACJC,UAAU;MACVC,WAAW;MACXC,WAAW;MAEXC,aAAa;MACbC,WAAW,GAAG;IAIhB,CAAC,GAAGN,OAAO;IAEX,MAAMO,UAAU,GAAGC,aAAa,CAAC,IAAI,CAACvD,KAAK,CAACwD,QAAQ,CAAC;IACrD,MAAMC,SAAkB,GAAGC,OAAO,CAACR,WAAW,CAACS,WAAW,CAAC;IAC3D,MAAMC,WAAW,IAAAZ,qBAAA,GAAIE,WAAW,CAACS,WAAW,cAAAX,qBAAA,uBAAxBA,qBAAA,CAA0CY,WAAW;IACzE,MAAMC,WAAoB,GAAGC,MAAM,CAACV,aAAa,CAAC,GAAG,CAAC;IAMtD,IAAI,CAAC,IAAI,CAACW,sBAAsB,CAAC,CAAC,IAAIZ,WAAW,KAAK,CAAC,EAAE;MAEvD,OAAO,KAAK;IACd;IAEA,IAAI,CAACpD,MAAM,CAACa,EAAE,CAACoD,UAAU,CAAC,IAAI,CAAC/D,MAAM,CAAC;IAGtCiD,WAAW,CAACe,gBAAgB,CAAChB,UAAU,CAAC;IAExC,MAAMiB,aAAa,GAAGC,cAAc,CAAC,IAAI,CAACnE,KAAK,CAACwD,QAAQ,CAAC;IACzD,MAAMY,iBAAsB,GAAG,IAAI;IACnC,IAAIA,iBAAiB,EAAE;MACrBA,iBAAiB,CAACC,KAAK,CAACH,aAAa,CAAC;IACxC;IAGA,IAAI,CAACI,cAAc,CAAC,CAAC;IACrB,IAAI,CAACC,cAAc,CAAC,CAAC;IAErB,MAAMC,eAAe,GAAGvB,UAA6B;IA2BrD1D,yBAAyB,CACvB,IAAI,CAACQ,MAAM,EACX,IAAI,CAACC,KAAK,CAACyE,UAAU,EACrBD,eAAe,CAACE,YAAY,EAC5B,MAAM;MACJ,IAAIjB,SAAS,IAAII,WAAW,EAAE;QAAA,IAAAc,gBAAA;QAE5B,CAAAA,gBAAA,OAAI,CAAC5E,MAAM,CAACsB,GAAG,cAAAsD,gBAAA,uBAAfA,gBAAA,CAAiBC,qBAAqB,CACpCtB,UAAU,EACVH,WAAW,IAAI,CAAC,EAChBS,WAAW,EACXP,WAAW,EACXD,aAAa,IAAI,CACnB,CAAC;MAGH,CAAC,MAAM,IAAIK,SAAS,EAAE;QACpB,IAAI,CAAC1D,MAAM,CAACa,EAAE,CAACiE,YAAY,CAACvB,UAAU,EAAEH,WAAW,IAAI,CAAC,EAAES,WAAW,EAAEP,WAAW,CAAC;MACrF,CAAC,MAAM,IAAIQ,WAAW,EAAE;QAAA,IAAAiB,gBAAA;QACtB,CAAAA,gBAAA,OAAI,CAAC/E,MAAM,CAACsB,GAAG,cAAAyD,gBAAA,uBAAfA,gBAAA,CAAiBC,mBAAmB,CAClCzB,UAAU,EACVD,WAAW,EACXF,WAAW,IAAI,CAAC,EAChBC,aAAa,IAAI,CACnB,CAAC;MACH,CAAC,MAAM;QACL,IAAI,CAACrD,MAAM,CAACa,EAAE,CAACoE,UAAU,CAAC1B,UAAU,EAAED,WAAW,EAAEF,WAAW,IAAI,CAAC,CAAC;MACtE;MAEA,IAAIiB,iBAAiB,EAAE;QACrBA,iBAAiB,CAACa,GAAG,CAAC,CAAC;MACzB;IACF,CACF,CAAC;IAED/B,WAAW,CAACgC,iBAAiB,CAACjC,UAAU,CAAC;IAEzC,OAAO,IAAI;EACb;EAKU1B,eAAeA,CAAA,EAAG;IAC1B,MAAM;MAACX;IAAE,CAAC,GAAG,IAAI,CAACb,MAAM;IACxBa,EAAE,CAACuE,YAAY,CAAC,IAAI,CAAClF,MAAM,EAAE,IAAI,CAACC,EAAE,CAACD,MAAM,CAAC;IAC5CW,EAAE,CAACuE,YAAY,CAAC,IAAI,CAAClF,MAAM,EAAE,IAAI,CAACE,EAAE,CAACF,MAAM,CAAC;IAC5Cd,GAAG,CAACiG,IAAI,CAACxF,yBAAyB,EAAG,mBAAkB,IAAI,CAACmB,EAAG,EAAC,CAAC,CAAC,CAAC;IACnEH,EAAE,CAACyE,WAAW,CAAC,IAAI,CAACpF,MAAM,CAAC;IAC3Bd,GAAG,CAACmG,OAAO,CAAC1F,yBAAyB,EAAG,mBAAkB,IAAI,CAACmB,EAAG,EAAC,CAAC,CAAC,CAAC;IAItE,IAAI,CAACH,EAAE,CAAC2E,KAAK,IAAIpG,GAAG,CAACqG,KAAK,KAAK,CAAC,EAAE,CAElC;IAEA,MAAMC,MAAM,GAAG7E,EAAE,CAAC8E,mBAAmB,CAAC,IAAI,CAACzF,MAAM,EAAEW,EAAE,CAAC+E,WAAW,CAAC;IAClE,IAAI,CAACF,MAAM,EAAE;MACX,MAAM,IAAIhD,KAAK,CAAE,kBAAiB7B,EAAE,CAACgF,iBAAiB,CAAC,IAAI,CAAC3F,MAAM,CAAE,EAAC,CAAC;IACxE;IAEAW,EAAE,CAACiF,eAAe,CAAC,IAAI,CAAC5F,MAAM,CAAC;IAC/B,MAAM6F,SAAS,GAAGlF,EAAE,CAAC8E,mBAAmB,CAAC,IAAI,CAACzF,MAAM,EAAEW,EAAE,CAACmF,eAAe,CAAC;IACzE,IAAI,CAACD,SAAS,EAAE;MACd,MAAM,IAAIrD,KAAK,CAAE,qBAAoB7B,EAAE,CAACgF,iBAAiB,CAAC,IAAI,CAAC3F,MAAM,CAAE,EAAC,CAAC;IAC3E;EACF;EASA8D,sBAAsBA,CAAA,EAAG;IACvB,IAAIiC,kBAAkB,GAAG,IAAI;IAE7B,KAAK,MAAM,GAAGC,OAAO,CAAC,IAAIlE,MAAM,CAACC,OAAO,CAAC,IAAI,CAACxB,gBAAgB,CAAC,EAAE;MAC/DyF,OAAO,CAACC,MAAM,CAAC,CAAC;MAChBF,kBAAkB,GAAGA,kBAAkB,IAAIC,OAAO,CAACE,MAAM;IAC3D;IAEA,KAAK,MAAM,GAAGF,OAAO,CAAC,IAAIlE,MAAM,CAACC,OAAO,CAAC,IAAI,CAAC1B,QAAQ,CAAC,EAAE;MAGvD,IAAI2F,OAAO,CAACE,MAAM,KAAKC,SAAS,EAAE;QAEhCJ,kBAAkB,GAAGA,kBAAkB,IAAIC,OAAO,CAACE,MAAM;MAC3D;IACF;IAEA,OAAOH,kBAAkB;EAC3B;EAyBA1B,cAAcA,CAAA,EAAG;IACf,IAAI,CAACvE,MAAM,CAACa,EAAE,CAACoD,UAAU,CAAC,IAAI,CAAC/D,MAAM,CAAC;IAEtC,MAAM;MAACoB;IAAG,CAAC,GAAG,IAAI,CAACtB,MAAM;IACzB,IAAI,CAACsB,GAAG,EAAE;MACR,MAAM,IAAIoB,KAAK,CAAC,UAAU,CAAC;IAC7B;IAEA,IAAI4D,WAAW,GAAG,CAAC;IACnB,IAAIC,kBAAkB,GAAG,CAAC;IAC1B,KAAK,MAAMrE,OAAO,IAAI,IAAI,CAACT,YAAY,CAAClB,QAAQ,EAAE;MAEhD,MAAMwB,KAAK,GAAG,IAAI,CAACxB,QAAQ,CAAC2B,OAAO,CAACJ,IAAI,CAAC,IAAI,IAAI,CAACvB,QAAQ,CAAC2B,OAAO,CAACJ,IAAI,CAAC0E,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;MACjG,IAAI,CAACzE,KAAK,EAAE;QACV,MAAM,IAAIW,KAAK,CAAE,wBAAuBR,OAAO,CAACJ,IAAK,OAAM,IAAI,CAACd,EAAG,EAAC,CAAC;MACvE;MACA,QAAQkB,OAAO,CAACM,IAAI;QAClB,KAAK,SAAS;UAEZ,MAAM;YAACV;UAAI,CAAC,GAAGI,OAAO;UACtB,MAAMuE,QAAQ,GAAGnF,GAAG,CAACoF,oBAAoB,CAAC,IAAI,CAACxG,MAAM,EAAE4B,IAAI,CAAC;UAC5D,IAAI2E,QAAQ,KAAKnH,EAAE,CAACqH,aAAa,EAAE;YACjC,MAAM,IAAIjE,KAAK,CAAE,8BAA6BZ,IAAK,EAAC,CAAC;UACvD;UACAR,GAAG,CAACsF,mBAAmB,CAAC,IAAI,CAAC1G,MAAM,EAAEqG,kBAAkB,EAAEE,QAAQ,CAAC;UAElE,IAAI1E,KAAK,YAAYrC,WAAW,EAAE;YAChC4B,GAAG,CAACuF,cAAc,CAACvH,EAAE,CAACwH,cAAc,EAAEP,kBAAkB,EAAExE,KAAK,CAAC7B,MAAM,CAAC;UACzE,CAAC,MAAM;YACLoB,GAAG,CAACyF,eAAe,CACjBzH,EAAE,CAACwH,cAAc,EACjBP,kBAAkB,EAElBxE,KAAK,CAACU,MAAM,CAACvC,MAAM,EAEnB6B,KAAK,CAACiF,MAAM,IAAI,CAAC,EAEjBjF,KAAK,CAACkF,IAAI,IAAIlF,KAAK,CAACU,MAAM,CAACyE,UAAU,GAAGnF,KAAK,CAACiF,MAChD,CAAC;UACH;UACAT,kBAAkB,IAAI,CAAC;UACvB;QAEF,KAAK,SAAS;UACZ,IAAI,EAAExE,KAAK,YAAYnC,YAAY,IAAImC,KAAK,YAAYpC,gBAAgB,CAAC,EAAE;YACzE,MAAM,IAAI+C,KAAK,CAAC,SAAS,CAAC;UAC5B;UACA,IAAIwD,OAAqB;UACzB,IAAInE,KAAK,YAAYnC,YAAY,EAAE;YACjCsG,OAAO,GAAGnE,KAAK;UACjB,CAAC,MAAM,IACLA,KAAK,YAAYpC,gBAAgB,IACjCoC,KAAK,CAACoF,gBAAgB,CAAC,CAAC,CAAC,YAAYvH,YAAY,EACjD;YACAR,GAAG,CAACmD,IAAI,CACN,+FACF,CAAC,CAAC,CAAC;YACH2D,OAAO,GAAGnE,KAAK,CAACoF,gBAAgB,CAAC,CAAC,CAAC;UACrC,CAAC,MAAM;YACL,MAAM,IAAIzE,KAAK,CAAC,YAAY,CAAC;UAC/B;UAEApB,GAAG,CAAC8F,aAAa,CAAC9H,EAAE,CAAC+H,QAAQ,GAAGf,WAAW,CAAC;UAC5ChF,GAAG,CAACgG,WAAW,CAACpB,OAAO,CAACqB,MAAM,EAAErB,OAAO,CAAChG,MAAM,CAAC;UAE/CoG,WAAW,IAAI,CAAC;UAChB;QAEF,KAAK,SAAS;UAEZ;QAEF,KAAK,SAAS;QACd,KAAK,mBAAmB;UACtB,MAAM,IAAI5D,KAAK,CAAE,iBAAgBR,OAAO,CAACM,IAAK,0BAAyB,CAAC;MAC5E;IACF;EACF;EAMAgC,cAAcA,CAAA,EAAG;IACf,KAAK,MAAMgD,aAAa,IAAI,IAAI,CAAC/F,YAAY,CAACnB,QAAQ,IAAI,EAAE,EAAE;MAAA,IAAAmH,mBAAA;MAC5D,MAAM;QAAC3F,IAAI;QAAE2E,QAAQ;QAAEjE,IAAI;QAAE8D;MAAW,CAAC,GAAGkB,aAAa;MACzD,MAAMzF,KAAK,IAAA0F,mBAAA,GAAG,IAAI,CAACnH,QAAQ,CAACwB,IAAI,CAAC,cAAA2F,mBAAA,cAAAA,mBAAA,GAAInB,WAAW;MAChD,IAAIvE,KAAK,KAAKsE,SAAS,EAAE;QACvB5G,UAAU,CAAC,IAAI,CAACO,MAAM,CAACa,EAAE,EAAE4F,QAAQ,EAAEjE,IAAI,EAAET,KAAK,CAAC;MACnD;IACF;EACF;AACF;AAGA,SAASyB,aAAaA,CACpBC,QAA2B,EAQT;EAElB,QAAQA,QAAQ;IACd,KAAK,YAAY;MAAE,OAAOnE,EAAE,CAACoI,MAAM;IACnC,KAAK,WAAW;MAAE,OAAOpI,EAAE,CAACqI,KAAK;IACjC,KAAK,YAAY;MAAE,OAAOrI,EAAE,CAACsI,UAAU;IACvC,KAAK,iBAAiB;MAAE,OAAOtI,EAAE,CAACuI,SAAS;IAC3C,KAAK,eAAe;MAAE,OAAOvI,EAAE,CAACwI,SAAS;IACzC,KAAK,gBAAgB;MAAE,OAAOxI,EAAE,CAACyI,cAAc;IAC/C,KAAK,oBAAoB;MAAE,OAAOzI,EAAE,CAAC0I,YAAY;IACjD;MAAS,MAAM,IAAItF,KAAK,CAACe,QAAQ,CAAC;EACpC;AACF;AAGA,SAASW,cAAcA,CAACX,QAA2B,EAAuC;EAExF,QAAQA,QAAQ;IACd,KAAK,YAAY;MAAE,OAAOnE,EAAE,CAACoI,MAAM;IACnC,KAAK,WAAW;MAAE,OAAOpI,EAAE,CAACqI,KAAK;IACjC,KAAK,YAAY;MAAE,OAAOrI,EAAE,CAACqI,KAAK;IAClC,KAAK,iBAAiB;MAAE,OAAOrI,EAAE,CAACqI,KAAK;IACvC,KAAK,eAAe;MAAE,OAAOrI,EAAE,CAACwI,SAAS;IACzC,KAAK,gBAAgB;MAAE,OAAOxI,EAAE,CAACwI,SAAS;IAC1C,KAAK,oBAAoB;MAAE,OAAOxI,EAAE,CAACwI,SAAS;IAC9C;MAAS,MAAM,IAAIpF,KAAK,CAACe,QAAQ,CAAC;EACpC;AACF"}
|
package/dist/dist.dev.js
CHANGED
|
@@ -908,6 +908,17 @@ var __exports__ = (() => {
|
|
|
908
908
|
}
|
|
909
909
|
var VERSION2 = initializeLuma();
|
|
910
910
|
|
|
911
|
+
// ../core/src/lib/utils/is-array.ts
|
|
912
|
+
function isTypedArray(value) {
|
|
913
|
+
return ArrayBuffer.isView(value) && !(value instanceof DataView) ? value : null;
|
|
914
|
+
}
|
|
915
|
+
function isNumberArray(value) {
|
|
916
|
+
if (Array.isArray(value)) {
|
|
917
|
+
return value.length === 0 || typeof value[0] === "number" ? value : null;
|
|
918
|
+
}
|
|
919
|
+
return isTypedArray(value);
|
|
920
|
+
}
|
|
921
|
+
|
|
911
922
|
// ../core/src/lib/utils/utils.ts
|
|
912
923
|
var uidCounters = {};
|
|
913
924
|
function uid(id = "id") {
|
|
@@ -2468,6 +2479,26 @@ var __exports__ = (() => {
|
|
|
2468
2479
|
return value;
|
|
2469
2480
|
}
|
|
2470
2481
|
|
|
2482
|
+
// ../core/src/lib/utils/uniform.ts
|
|
2483
|
+
function isUniformValue(value) {
|
|
2484
|
+
return isNumberArray(value) !== null || typeof value === "number" || typeof value === "boolean";
|
|
2485
|
+
}
|
|
2486
|
+
function splitUniformsAndBindings(uniforms) {
|
|
2487
|
+
const result = {
|
|
2488
|
+
bindings: {},
|
|
2489
|
+
uniforms: {}
|
|
2490
|
+
};
|
|
2491
|
+
Object.keys(uniforms).forEach((name2) => {
|
|
2492
|
+
const uniform = uniforms[name2];
|
|
2493
|
+
if (isUniformValue(uniform)) {
|
|
2494
|
+
result.uniforms[name2] = uniform;
|
|
2495
|
+
} else {
|
|
2496
|
+
result.bindings[name2] = uniform;
|
|
2497
|
+
}
|
|
2498
|
+
});
|
|
2499
|
+
return result;
|
|
2500
|
+
}
|
|
2501
|
+
|
|
2471
2502
|
// ../core/src/lib/utils/stub-methods.ts
|
|
2472
2503
|
function stubRemovedMethods(instance, className, version, methodNames) {
|
|
2473
2504
|
const upgradeMessage = `See luma.gl ${version} Upgrade Guide at https://luma.gl/docs/upgrade-guide`;
|
|
@@ -8375,10 +8406,17 @@ ${formattedLog}`)();
|
|
|
8375
8406
|
constructor(device, props) {
|
|
8376
8407
|
super(device, props);
|
|
8377
8408
|
this.device = device;
|
|
8409
|
+
pushContextState(this.device.gl);
|
|
8378
8410
|
this.setParameters(this.props.parameters);
|
|
8379
8411
|
this.clear();
|
|
8380
8412
|
}
|
|
8381
8413
|
end() {
|
|
8414
|
+
popContextState(this.device.gl);
|
|
8415
|
+
if (this.props.framebuffer) {
|
|
8416
|
+
setGLParameters(this.device, {
|
|
8417
|
+
framebuffer: null
|
|
8418
|
+
});
|
|
8419
|
+
}
|
|
8382
8420
|
}
|
|
8383
8421
|
pushDebugGroup(groupLabel) {
|
|
8384
8422
|
}
|
|
@@ -8983,7 +9021,7 @@ ${formattedLog}`)();
|
|
|
8983
9021
|
*/
|
|
8984
9022
|
setBindings(bindings) {
|
|
8985
9023
|
for (const [name2, value] of Object.entries(bindings)) {
|
|
8986
|
-
const binding = this.shaderLayout.bindings.find((binding2) => binding2.name === name2);
|
|
9024
|
+
const binding = this.shaderLayout.bindings.find((binding2) => binding2.name === name2) || this.shaderLayout.bindings.find((binding2) => binding2.name === `${name2}Uniforms`);
|
|
8987
9025
|
if (!binding) {
|
|
8988
9026
|
const validBindings = this.shaderLayout.bindings.map((binding2) => `"${binding2.name}"`).join(", ");
|
|
8989
9027
|
log.warn(`Unknown binding "${name2}" in render pipeline "${this.id}", expected one of ${validBindings}`)();
|
|
@@ -9013,6 +9051,12 @@ ${formattedLog}`)();
|
|
|
9013
9051
|
}
|
|
9014
9052
|
}
|
|
9015
9053
|
setUniforms(uniforms) {
|
|
9054
|
+
const {
|
|
9055
|
+
bindings
|
|
9056
|
+
} = splitUniformsAndBindings(uniforms);
|
|
9057
|
+
Object.keys(bindings).forEach((name2) => {
|
|
9058
|
+
log.warn(`Unsupported value "${bindings[name2]}" used in setUniforms() for key ${name2}. Use setBindings() instead?`)();
|
|
9059
|
+
});
|
|
9016
9060
|
Object.assign(this.uniforms, uniforms);
|
|
9017
9061
|
}
|
|
9018
9062
|
/** @todo needed for portable model
|
|
@@ -9147,7 +9191,7 @@ ${formattedLog}`)();
|
|
|
9147
9191
|
let textureUnit = 0;
|
|
9148
9192
|
let uniformBufferIndex = 0;
|
|
9149
9193
|
for (const binding of this.shaderLayout.bindings) {
|
|
9150
|
-
const value = this.bindings[binding.name];
|
|
9194
|
+
const value = this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, "")];
|
|
9151
9195
|
if (!value) {
|
|
9152
9196
|
throw new Error(`No value for binding ${binding.name} in ${this.id}`);
|
|
9153
9197
|
}
|
package/dist/index.cjs
CHANGED
|
@@ -4697,10 +4697,15 @@ var WEBGLRenderPass = class extends import_core21.RenderPass {
|
|
|
4697
4697
|
constructor(device, props) {
|
|
4698
4698
|
super(device, props);
|
|
4699
4699
|
this.device = device;
|
|
4700
|
+
pushContextState(this.device.gl);
|
|
4700
4701
|
this.setParameters(this.props.parameters);
|
|
4701
4702
|
this.clear();
|
|
4702
4703
|
}
|
|
4703
4704
|
end() {
|
|
4705
|
+
popContextState(this.device.gl);
|
|
4706
|
+
if (this.props.framebuffer) {
|
|
4707
|
+
setGLParameters(this.device, { framebuffer: null });
|
|
4708
|
+
}
|
|
4704
4709
|
}
|
|
4705
4710
|
pushDebugGroup(groupLabel) {
|
|
4706
4711
|
}
|
|
@@ -5280,7 +5285,7 @@ var WEBGLRenderPipeline = class extends import_core22.RenderPipeline {
|
|
|
5280
5285
|
*/
|
|
5281
5286
|
setBindings(bindings) {
|
|
5282
5287
|
for (const [name, value] of Object.entries(bindings)) {
|
|
5283
|
-
const binding = this.shaderLayout.bindings.find((binding2) => binding2.name === name);
|
|
5288
|
+
const binding = this.shaderLayout.bindings.find((binding2) => binding2.name === name) || this.shaderLayout.bindings.find((binding2) => binding2.name === `${name}Uniforms`);
|
|
5284
5289
|
if (!binding) {
|
|
5285
5290
|
const validBindings = this.shaderLayout.bindings.map((binding2) => `"${binding2.name}"`).join(", ");
|
|
5286
5291
|
import_core22.log.warn(
|
|
@@ -5312,6 +5317,12 @@ var WEBGLRenderPipeline = class extends import_core22.RenderPipeline {
|
|
|
5312
5317
|
}
|
|
5313
5318
|
}
|
|
5314
5319
|
setUniforms(uniforms) {
|
|
5320
|
+
const { bindings } = (0, import_core22.splitUniformsAndBindings)(uniforms);
|
|
5321
|
+
Object.keys(bindings).forEach((name) => {
|
|
5322
|
+
import_core22.log.warn(
|
|
5323
|
+
`Unsupported value "${bindings[name]}" used in setUniforms() for key ${name}. Use setBindings() instead?`
|
|
5324
|
+
)();
|
|
5325
|
+
});
|
|
5315
5326
|
Object.assign(this.uniforms, uniforms);
|
|
5316
5327
|
}
|
|
5317
5328
|
/** @todo needed for portable model
|
|
@@ -5454,7 +5465,7 @@ var WEBGLRenderPipeline = class extends import_core22.RenderPipeline {
|
|
|
5454
5465
|
let textureUnit = 0;
|
|
5455
5466
|
let uniformBufferIndex = 0;
|
|
5456
5467
|
for (const binding of this.shaderLayout.bindings) {
|
|
5457
|
-
const value = this.bindings[binding.name];
|
|
5468
|
+
const value = this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, "")];
|
|
5458
5469
|
if (!value) {
|
|
5459
5470
|
throw new Error(`No value for binding ${binding.name} in ${this.id}`);
|
|
5460
5471
|
}
|