@luma.gl/engine 9.0.0-alpha.50 → 9.0.0-alpha.52

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/dist.dev.js CHANGED
@@ -1956,7 +1956,7 @@ var __exports__ = (() => {
1956
1956
  return `${dataType}x${components}`;
1957
1957
  }
1958
1958
 
1959
- // ../core/src/lib/utils/uniform.ts
1959
+ // ../core/src/lib/uniforms/uniform.ts
1960
1960
  function isUniformValue(value) {
1961
1961
  return isNumberArray(value) !== null || typeof value === "number" || typeof value === "boolean";
1962
1962
  }
@@ -2017,7 +2017,7 @@ var __exports__ = (() => {
2017
2017
  return false;
2018
2018
  }
2019
2019
 
2020
- // ../core/src/lib/request-animation-frame.ts
2020
+ // ../core/src/lib/utils/request-animation-frame.ts
2021
2021
  function requestAnimationFrame(callback) {
2022
2022
  return typeof window !== "undefined" && window.requestAnimationFrame ? window.requestAnimationFrame(callback) : setTimeout(callback, 1e3 / 60);
2023
2023
  }
@@ -2025,6 +2025,27 @@ var __exports__ = (() => {
2025
2025
  return typeof window !== "undefined" && window.cancelAnimationFrame ? window.cancelAnimationFrame(timerId) : clearTimeout(timerId);
2026
2026
  }
2027
2027
 
2028
+ // ../core/src/lib/debug/debug-shader-layout.ts
2029
+ function getDebugTableForShaderLayout(layout, name2 = "") {
2030
+ const table = {};
2031
+ const header = `Shader Layout for ${name2}`;
2032
+ for (const attributeDeclaration of layout.attributes) {
2033
+ if (attributeDeclaration) {
2034
+ const glslDeclaration = `${attributeDeclaration.location} ${attributeDeclaration.name}: ${attributeDeclaration.type}`;
2035
+ table[`in ${glslDeclaration}`] = {
2036
+ [header]: attributeDeclaration.stepMode || "vertex"
2037
+ };
2038
+ }
2039
+ }
2040
+ for (const varyingDeclaration of layout.varyings || []) {
2041
+ const glslDeclaration = `${varyingDeclaration.location} ${varyingDeclaration.name}`;
2042
+ table[`out ${glslDeclaration}`] = {
2043
+ [header]: JSON.stringify(varyingDeclaration.accessor)
2044
+ };
2045
+ }
2046
+ return table;
2047
+ }
2048
+
2028
2049
  // ../core/src/index.ts
2029
2050
  var glsl = (x) => `${x}`;
2030
2051
 
@@ -5361,6 +5382,10 @@ void main() {
5361
5382
  const moduleName = name2;
5362
5383
  const moduleProps = props[moduleName];
5363
5384
  const module = this.modules[moduleName];
5385
+ if (!module) {
5386
+ log.warn(`Module ${name2} not found`)();
5387
+ continue;
5388
+ }
5364
5389
  const oldUniforms = this.moduleUniforms[moduleName];
5365
5390
  const uniforms = module.getUniforms?.(moduleProps, this.moduleUniforms[moduleName]) || moduleProps;
5366
5391
  this.moduleUniforms[moduleName] = {
@@ -5579,6 +5604,8 @@ void main() {
5579
5604
  });
5580
5605
 
5581
5606
  // src/model/model.ts
5607
+ var LOG_DRAW_PRIORITY = 2;
5608
+ var LOG_DRAW_TIMEOUT = 1e4;
5582
5609
  var _Model = class {
5583
5610
  userData = {};
5584
5611
  instanceCount = 0;
@@ -5674,16 +5701,21 @@ void main() {
5674
5701
  }
5675
5702
  draw(renderPass) {
5676
5703
  this.predraw();
5677
- this.pipeline = this._updatePipeline();
5678
- this.pipeline.setBindings(this.bindings);
5679
- this.pipeline.setUniforms(this.uniforms);
5680
- this.pipeline.draw({
5681
- renderPass,
5682
- vertexArray: this.vertexArray,
5683
- vertexCount: this.vertexCount,
5684
- instanceCount: this.instanceCount,
5685
- transformFeedback: this.transformFeedback
5686
- });
5704
+ try {
5705
+ this._logDrawCallStart();
5706
+ this.pipeline = this._updatePipeline();
5707
+ this.pipeline.setBindings(this.bindings);
5708
+ this.pipeline.setUniforms(this.uniforms);
5709
+ this.pipeline.draw({
5710
+ renderPass,
5711
+ vertexArray: this.vertexArray,
5712
+ vertexCount: this.vertexCount,
5713
+ instanceCount: this.instanceCount,
5714
+ transformFeedback: this.transformFeedback
5715
+ });
5716
+ } finally {
5717
+ this._logDrawCallEnd();
5718
+ }
5687
5719
  }
5688
5720
  setGeometry(geometry) {
5689
5721
  const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);
@@ -5824,6 +5856,27 @@ void main() {
5824
5856
  }
5825
5857
  return this.pipeline;
5826
5858
  }
5859
+ _lastLogTime = 0;
5860
+ _logOpen = false;
5861
+ _logDrawCallStart() {
5862
+ const logDrawTimeout = log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;
5863
+ if (Date.now() - this._lastLogTime < logDrawTimeout) {
5864
+ return void 0;
5865
+ }
5866
+ this._lastLogTime = Date.now();
5867
+ this._logOpen = true;
5868
+ log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, {
5869
+ collapsed: log.level <= 2
5870
+ })();
5871
+ }
5872
+ _logDrawCallEnd() {
5873
+ if (this._logOpen) {
5874
+ const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.shaderLayout);
5875
+ log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();
5876
+ log.groupEnd(LOG_DRAW_PRIORITY)();
5877
+ this._logOpen = false;
5878
+ }
5879
+ }
5827
5880
  };
5828
5881
  var Model = _Model;
5829
5882
  __publicField(Model, "defaultProps", {
package/dist/index.cjs CHANGED
@@ -666,6 +666,10 @@ var ShaderInputs = class {
666
666
  const moduleName = name;
667
667
  const moduleProps = props[moduleName];
668
668
  const module2 = this.modules[moduleName];
669
+ if (!module2) {
670
+ import_core4.log.warn(`Module ${name} not found`)();
671
+ continue;
672
+ }
669
673
  const oldUniforms = this.moduleUniforms[moduleName];
670
674
  const uniforms = ((_a = module2.getUniforms) == null ? void 0 : _a.call(module2, moduleProps, this.moduleUniforms[moduleName])) || moduleProps;
671
675
  this.moduleUniforms[moduleName] = { ...oldUniforms, ...uniforms };
@@ -866,6 +870,8 @@ __publicField(PipelineFactory, "defaultProps", {
866
870
  });
867
871
 
868
872
  // src/model/model.ts
873
+ var LOG_DRAW_PRIORITY = 2;
874
+ var LOG_DRAW_TIMEOUT = 1e4;
869
875
  var _Model = class {
870
876
  device;
871
877
  id;
@@ -987,16 +993,21 @@ var _Model = class {
987
993
  }
988
994
  draw(renderPass) {
989
995
  this.predraw();
990
- this.pipeline = this._updatePipeline();
991
- this.pipeline.setBindings(this.bindings);
992
- this.pipeline.setUniforms(this.uniforms);
993
- this.pipeline.draw({
994
- renderPass,
995
- vertexArray: this.vertexArray,
996
- vertexCount: this.vertexCount,
997
- instanceCount: this.instanceCount,
998
- transformFeedback: this.transformFeedback
999
- });
996
+ try {
997
+ this._logDrawCallStart();
998
+ this.pipeline = this._updatePipeline();
999
+ this.pipeline.setBindings(this.bindings);
1000
+ this.pipeline.setUniforms(this.uniforms);
1001
+ this.pipeline.draw({
1002
+ renderPass,
1003
+ vertexArray: this.vertexArray,
1004
+ vertexCount: this.vertexCount,
1005
+ instanceCount: this.instanceCount,
1006
+ transformFeedback: this.transformFeedback
1007
+ });
1008
+ } finally {
1009
+ this._logDrawCallEnd();
1010
+ }
1000
1011
  }
1001
1012
  // Update fixed fields (can trigger pipeline rebuild)
1002
1013
  /**
@@ -1210,6 +1221,26 @@ var _Model = class {
1210
1221
  }
1211
1222
  return this.pipeline;
1212
1223
  }
1224
+ /** Throttle draw call logging */
1225
+ _lastLogTime = 0;
1226
+ _logOpen = false;
1227
+ _logDrawCallStart() {
1228
+ const logDrawTimeout = import_core8.log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;
1229
+ if (Date.now() - this._lastLogTime < logDrawTimeout) {
1230
+ return void 0;
1231
+ }
1232
+ this._lastLogTime = Date.now();
1233
+ this._logOpen = true;
1234
+ import_core8.log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, { collapsed: import_core8.log.level <= 2 })();
1235
+ }
1236
+ _logDrawCallEnd() {
1237
+ if (this._logOpen) {
1238
+ const shaderLayoutTable = (0, import_core9.getDebugTableForShaderLayout)(this.pipeline.shaderLayout);
1239
+ import_core8.log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();
1240
+ import_core8.log.groupEnd(LOG_DRAW_PRIORITY)();
1241
+ this._logOpen = false;
1242
+ }
1243
+ }
1213
1244
  };
1214
1245
  var Model = _Model;
1215
1246
  __publicField(Model, "defaultProps", {
@@ -186,6 +186,11 @@ export declare class Model {
186
186
  setConstantAttributes(attributes: Record<string, TypedArray>): void;
187
187
  _setPipelineNeedsUpdate(reason: string): void;
188
188
  _updatePipeline(): RenderPipeline;
189
+ /** Throttle draw call logging */
190
+ _lastLogTime: number;
191
+ _logOpen: boolean;
192
+ _logDrawCallStart(): void;
193
+ _logDrawCallEnd(): void;
189
194
  }
190
195
  /** Create a shadertools platform info from the Device */
191
196
  export declare function getPlatformInfo(device: Device): PlatformInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import { RenderPipeline, UniformStore } from '@luma.gl/core';
2
2
  import { log, uid, deepEqual, splitUniformsAndBindings } from '@luma.gl/core';
3
- import { getAttributeInfosFromLayouts } from '@luma.gl/core';
3
+ import { getAttributeInfosFromLayouts, getDebugTableForShaderLayout } from '@luma.gl/core';
4
4
  import { ShaderAssembler } from '@luma.gl/shadertools';
5
5
  import { ShaderInputs } from "../shader-inputs.js";
6
6
  import { makeGPUGeometry } from "../geometry/gpu-geometry.js";
7
7
  import { PipelineFactory } from "../lib/pipeline-factory.js";
8
+ const LOG_DRAW_PRIORITY = 2;
9
+ const LOG_DRAW_TIMEOUT = 10000;
8
10
  export class Model {
9
11
  constructor(device, props) {
10
12
  var _this$props$modules, _this$props$modules2, _this$shaderInputs;
@@ -34,6 +36,8 @@ export class Model {
34
36
  this._gpuGeometry = null;
35
37
  this._getModuleUniforms = void 0;
36
38
  this.props = void 0;
39
+ this._lastLogTime = 0;
40
+ this._logOpen = false;
37
41
  this.props = {
38
42
  ...Model.defaultProps,
39
43
  ...props
@@ -116,16 +120,21 @@ export class Model {
116
120
  }
117
121
  draw(renderPass) {
118
122
  this.predraw();
119
- this.pipeline = this._updatePipeline();
120
- this.pipeline.setBindings(this.bindings);
121
- this.pipeline.setUniforms(this.uniforms);
122
- this.pipeline.draw({
123
- renderPass,
124
- vertexArray: this.vertexArray,
125
- vertexCount: this.vertexCount,
126
- instanceCount: this.instanceCount,
127
- transformFeedback: this.transformFeedback
128
- });
123
+ try {
124
+ this._logDrawCallStart();
125
+ this.pipeline = this._updatePipeline();
126
+ this.pipeline.setBindings(this.bindings);
127
+ this.pipeline.setUniforms(this.uniforms);
128
+ this.pipeline.draw({
129
+ renderPass,
130
+ vertexArray: this.vertexArray,
131
+ vertexCount: this.vertexCount,
132
+ instanceCount: this.instanceCount,
133
+ transformFeedback: this.transformFeedback
134
+ });
135
+ } finally {
136
+ this._logDrawCallEnd();
137
+ }
129
138
  }
130
139
  setGeometry(geometry) {
131
140
  const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);
@@ -267,6 +276,25 @@ export class Model {
267
276
  }
268
277
  return this.pipeline;
269
278
  }
279
+ _logDrawCallStart() {
280
+ const logDrawTimeout = log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;
281
+ if (Date.now() - this._lastLogTime < logDrawTimeout) {
282
+ return undefined;
283
+ }
284
+ this._lastLogTime = Date.now();
285
+ this._logOpen = true;
286
+ log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, {
287
+ collapsed: log.level <= 2
288
+ })();
289
+ }
290
+ _logDrawCallEnd() {
291
+ if (this._logOpen) {
292
+ const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.shaderLayout);
293
+ log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();
294
+ log.groupEnd(LOG_DRAW_PRIORITY)();
295
+ this._logOpen = false;
296
+ }
297
+ }
270
298
  }
271
299
  Model.defaultProps = {
272
300
  ...RenderPipeline.defaultProps,
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["RenderPipeline","UniformStore","log","uid","deepEqual","splitUniformsAndBindings","getAttributeInfosFromLayouts","ShaderAssembler","ShaderInputs","makeGPUGeometry","PipelineFactory","Model","constructor","device","props","_this$props$modules","_this$props$modules2","_this$shaderInputs","id","vs","fs","pipelineFactory","userData","parameters","topology","bufferLayout","vertexCount","instanceCount","indexBuffer","bufferAttributes","constantAttributes","bindings","uniforms","vertexArray","transformFeedback","pipeline","shaderInputs","_uniformStore","_pipelineNeedsUpdate","_attributeInfos","_gpuGeometry","_getModuleUniforms","defaultProps","Object","assign","moduleMap","fromEntries","modules","map","module","name","setShaderInputs","platformInfo","getPlatformInfo","length","getModules","getUniforms","shaderAssembler","assembleShaders","geometry","setGeometry","getDefaultPipelineFactory","_updatePipeline","createVertexArray","renderPipeline","_setGeometryAttributes","setVertexCount","setInstanceCount","indices","Error","setIndexBuffer","attributes","setAttributes","setConstantAttributes","setBindings","setUniforms","moduleSettings","console","warn","updateModuleSettings","seal","destroy","release","predraw","updateShaderInputs","draw","renderPass","gpuGeometry","setTopology","mergeBufferLayouts","_setPipelineNeedsUpdate","setBufferLayout","setParameters","moduleName","keys","uniformBuffer","getManagedUniformBuffer","getUniformValues","setTransformFeedback","buffers","bufferName","buffer","entries","_bufferLayout$attribu","find","layout","attributeNames","attribute","set","attributeName","attributeInfo","setBuffer","location","value","setConstant","reason","createRenderPipeline","createShader","stage","source","shaderLayout","handle","undefined","defines","varyings","getDefaultShaderAssembler","layouts1","layouts2","layouts","index","findIndex","attribute2","push","type","info","shaderLanguage","shadingLanguage","shaderLanguageVersion","shadingLanguageVersion","gpu","features"],"sources":["../../src/model/model.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray, RenderPipelineProps, RenderPipelineParameters} from '@luma.gl/core';\nimport type {BufferLayout, VertexArray, TransformFeedback} from '@luma.gl/core';\nimport type {AttributeInfo, Binding, UniformValue, PrimitiveTopology} from '@luma.gl/core';\nimport {Device, Buffer, RenderPipeline, RenderPass, UniformStore} from '@luma.gl/core';\nimport {log, uid, deepEqual, splitUniformsAndBindings} from '@luma.gl/core';\nimport {getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler} from '@luma.gl/shadertools';\nimport {ShaderInputs} from '../shader-inputs';\nimport type {Geometry} from '../geometry/geometry';\nimport {GPUGeometry, makeGPUGeometry} from '../geometry/gpu-geometry';\nimport {PipelineFactory} from '../lib/pipeline-factory';\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Model also accepts a string shaders\n vs: {glsl?: string; wgsl?: string} | string | null;\n fs: {glsl?: string; wgsl?: string} | string | null;\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, string | number | boolean>;\n // TODO - injections, hooks etc?\n\n /** Shader inputs, used to generated uniform buffers and bindings */\n shaderInputs?: ShaderInputs;\n /** pipeline factory to use to create render pipelines. Defaults to default factory for the device */\n pipelineFactory?: PipelineFactory;\n /** Shader assembler. Defaults to the ShaderAssembler.getShaderAssembler() */\n shaderAssembler?: ShaderAssembler;\n\n /** Parameters that are built into the pipeline */\n parameters?: RenderPipelineParameters;\n\n /** Geometry */\n geometry?: GPUGeometry | Geometry | null;\n\n /** Vertex count */\n vertexCount?: number;\n /** instance count */\n instanceCount?: number;\n\n indexBuffer?: Buffer | null;\n /** @note this is really a map of buffers, not a map of attributes */\n attributes?: Record<string, Buffer>;\n /** */\n constantAttributes?: Record<string, TypedArray>;\n\n /** @internal For use with {@link TransformFeedback}, WebGL 2 only. */\n varyings?: string[];\n\n transformFeedback?: TransformFeedback;\n\n /** Mapped uniforms for shadertool modules */\n moduleSettings?: Record<string, Record<string, any>>;\n};\n\n/**\n * v9 Model API\n * A model\n * - automatically reuses pipelines (programs) when possible\n * - automatically rebuilds pipelines if necessary to accommodate changed settings\n * shadertools integration\n * - accepts modules and performs shader transpilation\n */\nexport class Model {\n static defaultProps: Required<ModelProps> = {\n ...RenderPipeline.defaultProps,\n vs: null,\n fs: null,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n defines: {},\n modules: [],\n moduleSettings: undefined!,\n geometry: null,\n indexBuffer: null,\n attributes: {},\n constantAttributes: {},\n varyings: [],\n\n shaderInputs: undefined!,\n pipelineFactory: undefined!,\n transformFeedback: undefined,\n shaderAssembler: ShaderAssembler.getDefaultShaderAssembler()\n };\n\n readonly device: Device;\n readonly id: string;\n readonly vs: string;\n readonly fs: string;\n readonly pipelineFactory: PipelineFactory;\n userData: {[key: string]: any} = {};\n\n // Fixed properties (change can trigger pipeline rebuild)\n\n /** The render pipeline GPU parameters, depth testing etc */\n parameters: RenderPipelineParameters;\n\n /** The primitive topology */\n topology: PrimitiveTopology;\n /** Buffer layout */\n bufferLayout: BufferLayout[];\n\n // Dynamic properties\n\n /** Vertex count */\n vertexCount: number;\n /** instance count */\n instanceCount: number = 0;\n\n /** Index buffer */\n indexBuffer: Buffer | null = null;\n /** Buffer-valued attributes */\n bufferAttributes: Record<string, Buffer> = {};\n /** Constant-valued attributes */\n constantAttributes: Record<string, TypedArray> = {};\n /** Bindings (textures, samplers, uniform buffers) */\n bindings: Record<string, Binding> = {};\n /** Sets uniforms @deprecated Use uniform buffers and setBindings() for portability*/\n uniforms: Record<string, UniformValue> = {};\n\n /**\n * VertexArray\n * @note not implemented: if bufferLayout is updated, vertex array has to be rebuilt!\n * @todo - allow application to define multiple vertex arrays?\n * */\n vertexArray: VertexArray;\n\n /** TransformFeedback, WebGL 2 only. */\n transformFeedback: TransformFeedback | null = null;\n\n /** The underlying GPU \"program\". @note May be recreated if parameters change */\n pipeline: RenderPipeline;\n\n /** ShaderInputs instance */\n shaderInputs: ShaderInputs;\n\n _uniformStore: UniformStore;\n\n _pipelineNeedsUpdate: string | false = 'newly created';\n _attributeInfos: Record<string, AttributeInfo> = {};\n _gpuGeometry: GPUGeometry | null = null;\n private _getModuleUniforms: (props?: Record<string, Record<string, any>>) => Record<string, any>;\n private props: Required<ModelProps>;\n\n constructor(device: Device, props: ModelProps) {\n this.props = {...Model.defaultProps, ...props};\n props = this.props;\n this.id = props.id || uid('model');\n this.device = device;\n\n Object.assign(this.userData, props.userData);\n\n // Setup shader module inputs\n const moduleMap = Object.fromEntries(this.props.modules?.map(module => [module.name, module]) || []);\n this.setShaderInputs(props.shaderInputs || new ShaderInputs(moduleMap));\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n const modules = (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleShaders({platformInfo, ...this.props, modules});\n\n this.vs = vs;\n this.fs = fs;\n this._getModuleUniforms = getUniforms;\n\n this.vertexCount = this.props.vertexCount;\n this.instanceCount = this.props.instanceCount;\n\n this.topology = this.props.topology;\n this.bufferLayout = this.props.bufferLayout;\n this.parameters = this.props.parameters;\n\n // Geometry, if provided, sets topology and vertex cound\n if (props.geometry) {\n this._gpuGeometry = this.setGeometry(props.geometry);\n }\n\n this.pipelineFactory =\n props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n\n // Create the pipeline\n // @note order is important\n this.pipeline = this._updatePipeline();\n\n this.vertexArray = device.createVertexArray({\n renderPipeline: this.pipeline\n });\n\n // Now we can apply geometry attributes\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n\n // Apply any dynamic settings that will not trigger pipeline change\n if (props.vertexCount) {\n this.setVertexCount(props.vertexCount);\n }\n if (props.instanceCount) {\n this.setInstanceCount(props.instanceCount);\n }\n // @ts-expect-error\n if (props.indices) {\n throw new Error('Model.props.indices removed. Use props.indexBuffer');\n }\n if (props.indexBuffer) {\n this.setIndexBuffer(props.indexBuffer);\n }\n if (props.attributes) {\n this.setAttributes(props.attributes);\n }\n if (props.constantAttributes) {\n this.setConstantAttributes(props.constantAttributes);\n }\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n if (props.uniforms) {\n this.setUniforms(props.uniforms);\n }\n if (props.moduleSettings) {\n // eslint-disable-next-line no-console\n console.warn('Model.props.moduleSettings is deprecated. Use Model.shaderInputs.setProps()');\n this.updateModuleSettings(props.moduleSettings);\n }\n if (props.transformFeedback) {\n this.transformFeedback = props.transformFeedback;\n }\n\n // WebGL1?\n // this.setUniforms(this._getModuleUniforms()); // Get all default module uniforms\n\n // Catch any access to non-standard props\n Object.seal(this);\n }\n\n destroy(): void {\n this.pipelineFactory.release(this.pipeline);\n this._uniformStore.destroy();\n }\n\n // Draw call\n\n predraw() {\n // Update uniform buffers if needed\n this.updateShaderInputs();\n }\n\n draw(renderPass: RenderPass): void {\n this.predraw();\n\n // Check if the pipeline is invalidated\n // TODO - this is likely the worst place to do this from performance perspective. Perhaps add a predraw()?\n this.pipeline = this._updatePipeline();\n\n // Set pipeline state, we may be sharing a pipeline so we need to set all state on every draw\n // Any caching needs to be done inside the pipeline functions\n this.pipeline.setBindings(this.bindings);\n this.pipeline.setUniforms(this.uniforms);\n\n this.pipeline.draw({\n renderPass,\n vertexArray: this.vertexArray,\n vertexCount: this.vertexCount,\n instanceCount: this.instanceCount,\n transformFeedback: this.transformFeedback\n });\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n /**\n * Updates the optional geometry\n * Geometry, set topology and bufferLayout\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setGeometry(geometry: GPUGeometry | Geometry): GPUGeometry {\n const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);\n this.setTopology(gpuGeometry.topology || 'triangle-list');\n this.bufferLayout = mergeBufferLayouts(this.bufferLayout, gpuGeometry.bufferLayout);\n if (this.vertexArray) {\n this._setGeometryAttributes(gpuGeometry);\n }\n return gpuGeometry;\n }\n\n /**\n * Updates the optional geometry attributes\n * Geometry, sets several attributes, indexBuffer, and also vertex count\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n _setGeometryAttributes(gpuGeometry: GPUGeometry): void {\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setAttributes(gpuGeometry.attributes);\n this.setIndexBuffer(gpuGeometry.indices);\n }\n\n /**\n * Updates the primitive topology ('triangle-list', 'triangle-strip' etc).\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setTopology(topology: PrimitiveTopology): void {\n if (topology !== this.topology) {\n this.topology = topology;\n this._setPipelineNeedsUpdate('topology');\n }\n }\n\n /**\n * Updates the buffer layout.\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setBufferLayout(bufferLayout: BufferLayout[]): void {\n this.bufferLayout = this._gpuGeometry\n ? mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout)\n : bufferLayout;\n this._setPipelineNeedsUpdate('bufferLayout');\n\n // Recreate the pipeline\n this.pipeline = this._updatePipeline();\n\n // vertex array needs to be updated if we update buffer layout,\n // but not if we update parameters\n this.vertexArray = this.device.createVertexArray({\n renderPipeline: this.pipeline\n });\n\n // Reapply geometry attributes to the new vertex array\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n }\n\n /**\n * Set GPU parameters.\n * @note Can trigger a pipeline rebuild / pipeline cache fetch.\n * @param parameters\n */\n setParameters(parameters: RenderPipelineParameters) {\n if (!deepEqual(parameters, this.parameters, 2)) {\n this.parameters = parameters;\n this._setPipelineNeedsUpdate('parameters');\n }\n }\n\n // Update dynamic fields\n\n /**\n * Updates the vertex count (used in draw calls)\n * @note Any attributes with stepMode=vertex need to be at least this big\n */\n setVertexCount(vertexCount: number): void {\n this.vertexCount = vertexCount;\n }\n\n /**\n * Updates the instance count (used in draw calls)\n * @note Any attributes with stepMode=instance need to be at least this big\n */\n setInstanceCount(instanceCount: number): void {\n this.instanceCount = instanceCount;\n }\n\n setShaderInputs(shaderInputs: ShaderInputs): void {\n this.shaderInputs = shaderInputs;\n this._uniformStore = new UniformStore(this.shaderInputs.modules);\n // Create uniform buffer bindings for all modules\n for (const moduleName of Object.keys(this.shaderInputs.modules)) {\n const uniformBuffer = this._uniformStore.getManagedUniformBuffer(\n this.device,\n moduleName\n );\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n\n updateShaderInputs(): void {\n this._uniformStore.setUniforms(this.shaderInputs.getUniformValues());\n }\n\n /**\n * @deprecated Updates shader module settings (which results in uniforms being set)\n */\n updateModuleSettings(props: Record<string, any>): void {\n // eslint-disable-next-line no-console\n console.warn('Model.updateModuleSettings is deprecated. Use Model.shaderInputs.setProps()');\n const {bindings, uniforms} = splitUniformsAndBindings(this._getModuleUniforms(props));\n Object.assign(this.bindings, bindings);\n Object.assign(this.uniforms, uniforms);\n }\n \n /**\n * Sets bindings (textures, samplers, uniform buffers)\n */\n setBindings(bindings: Record<string, Binding>): void {\n Object.assign(this.bindings, bindings);\n }\n\n /**\n * Sets individual uniforms\n * @deprecated WebGL only, use uniform buffers for portability\n * @param uniforms\n * @returns self for chaining\n */\n setUniforms(uniforms: Record<string, UniformValue>): void {\n this.pipeline.setUniforms(uniforms);\n Object.assign(this.uniforms, uniforms);\n }\n\n /**\n * Sets the index buffer\n * @todo - how to unset it if we change geometry?\n */\n setIndexBuffer(indexBuffer: Buffer | null): void {\n this.vertexArray.setIndexBuffer(indexBuffer);\n }\n\n /**\n * Updates optional transform feedback. WebGL 2 only.\n */\n setTransformFeedback(transformFeedback: TransformFeedback | null): void {\n this.transformFeedback = transformFeedback;\n }\n\n /**\n * Sets attributes (buffers)\n * @note Overrides any attributes previously set with the same name\n */\n setAttributes(buffers: Record<string, Buffer>): void {\n if (buffers.indices) {\n log.warn(\n `Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`\n );\n }\n for (const [bufferName, buffer] of Object.entries(buffers)) {\n const bufferLayout = this.bufferLayout.find(layout => layout.name === bufferName);\n if (!bufferLayout) {\n log.warn(`Model(${this.id}): Missing layout for buffer \"${bufferName}\".`)();\n continue; // eslint-disable-line no-continue\n }\n\n // For an interleaved attribute we may need to set multiple attributes\n const attributeNames = bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n let set = false;\n for (const attributeName of attributeNames) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setBuffer(attributeInfo.location, buffer);\n set = true;\n }\n }\n if (!set) {\n log.warn(\n `Model(${this.id}): Ignoring buffer \"${buffer.id}\" for unknown attribute \"${bufferName}\"`\n )();\n }\n }\n }\n\n /**\n * Sets constant attributes\n * @note Overrides any attributes previously set with the same name\n * Constant attributes are only supported in WebGL, not in WebGPU\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 * @param constantAttributes\n */\n setConstantAttributes(attributes: Record<string, TypedArray>): void {\n for (const [attributeName, value] of Object.entries(attributes)) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setConstant(attributeInfo.location, value);\n } else {\n log.warn(\n `Model \"${this.id}: Ignoring constant supplied for unknown attribute \"${attributeName}\"`\n )();\n }\n }\n }\n\n _setPipelineNeedsUpdate(reason: string): void {\n this._pipelineNeedsUpdate = this._pipelineNeedsUpdate || reason;\n }\n\n _updatePipeline(): RenderPipeline {\n if (this._pipelineNeedsUpdate) {\n if (this.pipeline) {\n log.log(\n 1,\n `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`\n )();\n }\n this._pipelineNeedsUpdate = false;\n this.pipeline = this.device.createRenderPipeline({\n ...this.props,\n bufferLayout: this.bufferLayout,\n topology: this.topology,\n parameters: this.parameters,\n vs: this.device.createShader({id: '{$this.id}-vertex', stage: 'vertex', source: this.vs}),\n fs: this.fs\n ? this.device.createShader({\n id: '{$this.id}-fragment',\n stage: 'fragment',\n source: this.fs\n })\n : null\n });\n this._attributeInfos = getAttributeInfosFromLayouts(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n }\n return this.pipeline;\n }\n}\n\n// HELPERS\n\n/** TODO - move to core, document add tests */\nfunction mergeBufferLayouts(layouts1: BufferLayout[], layouts2: BufferLayout[]): BufferLayout[] {\n const layouts = [...layouts1];\n for (const attribute of layouts2) {\n const index = layouts.findIndex(attribute2 => attribute2.name === attribute.name);\n if (index < 0) {\n layouts.push(attribute);\n } else {\n layouts[index] = attribute;\n }\n }\n return layouts;\n}\n\n/** Create a shadertools platform info from the Device */\nexport function getPlatformInfo(device: Device): PlatformInfo {\n return {\n type: device.info.type,\n shaderLanguage: device.info.shadingLanguage,\n shaderLanguageVersion: device.info.shadingLanguageVersion as 100 | 300,\n gpu: device.info.gpu,\n features: device.features\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.js","names":["RenderPipeline","UniformStore","log","uid","deepEqual","splitUniformsAndBindings","getAttributeInfosFromLayouts","getDebugTableForShaderLayout","ShaderAssembler","ShaderInputs","makeGPUGeometry","PipelineFactory","LOG_DRAW_PRIORITY","LOG_DRAW_TIMEOUT","Model","constructor","device","props","_this$props$modules","_this$props$modules2","_this$shaderInputs","id","vs","fs","pipelineFactory","userData","parameters","topology","bufferLayout","vertexCount","instanceCount","indexBuffer","bufferAttributes","constantAttributes","bindings","uniforms","vertexArray","transformFeedback","pipeline","shaderInputs","_uniformStore","_pipelineNeedsUpdate","_attributeInfos","_gpuGeometry","_getModuleUniforms","_lastLogTime","_logOpen","defaultProps","Object","assign","moduleMap","fromEntries","modules","map","module","name","setShaderInputs","platformInfo","getPlatformInfo","length","getModules","getUniforms","shaderAssembler","assembleShaders","geometry","setGeometry","getDefaultPipelineFactory","_updatePipeline","createVertexArray","renderPipeline","_setGeometryAttributes","setVertexCount","setInstanceCount","indices","Error","setIndexBuffer","attributes","setAttributes","setConstantAttributes","setBindings","setUniforms","moduleSettings","console","warn","updateModuleSettings","seal","destroy","release","predraw","updateShaderInputs","draw","renderPass","_logDrawCallStart","_logDrawCallEnd","gpuGeometry","setTopology","mergeBufferLayouts","_setPipelineNeedsUpdate","setBufferLayout","setParameters","moduleName","keys","uniformBuffer","getManagedUniformBuffer","getUniformValues","setTransformFeedback","buffers","bufferName","buffer","entries","_bufferLayout$attribu","find","layout","attributeNames","attribute","set","attributeName","attributeInfo","setBuffer","location","value","setConstant","reason","createRenderPipeline","createShader","stage","source","shaderLayout","logDrawTimeout","level","Date","now","undefined","group","collapsed","shaderLayoutTable","table","groupEnd","handle","defines","varyings","getDefaultShaderAssembler","layouts1","layouts2","layouts","index","findIndex","attribute2","push","type","info","shaderLanguage","shadingLanguage","shaderLanguageVersion","shadingLanguageVersion","gpu","features"],"sources":["../../src/model/model.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray, RenderPipelineProps, RenderPipelineParameters} from '@luma.gl/core';\nimport type {BufferLayout, VertexArray, TransformFeedback} from '@luma.gl/core';\nimport type {AttributeInfo, Binding, UniformValue, PrimitiveTopology} from '@luma.gl/core';\nimport {Device, Buffer, RenderPipeline, RenderPass, UniformStore} from '@luma.gl/core';\nimport {log, uid, deepEqual, splitUniformsAndBindings} from '@luma.gl/core';\nimport {getAttributeInfosFromLayouts, getDebugTableForShaderLayout} from '@luma.gl/core';\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler} from '@luma.gl/shadertools';\nimport {ShaderInputs} from '../shader-inputs';\nimport type {Geometry} from '../geometry/geometry';\nimport {GPUGeometry, makeGPUGeometry} from '../geometry/gpu-geometry';\nimport {PipelineFactory} from '../lib/pipeline-factory';\n\nconst LOG_DRAW_PRIORITY = 2;\nconst LOG_DRAW_TIMEOUT = 10000;\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Model also accepts a string shaders\n vs: {glsl?: string; wgsl?: string} | string | null;\n fs: {glsl?: string; wgsl?: string} | string | null;\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, string | number | boolean>;\n // TODO - injections, hooks etc?\n\n /** Shader inputs, used to generated uniform buffers and bindings */\n shaderInputs?: ShaderInputs;\n /** pipeline factory to use to create render pipelines. Defaults to default factory for the device */\n pipelineFactory?: PipelineFactory;\n /** Shader assembler. Defaults to the ShaderAssembler.getShaderAssembler() */\n shaderAssembler?: ShaderAssembler;\n\n /** Parameters that are built into the pipeline */\n parameters?: RenderPipelineParameters;\n\n /** Geometry */\n geometry?: GPUGeometry | Geometry | null;\n\n /** Vertex count */\n vertexCount?: number;\n /** instance count */\n instanceCount?: number;\n\n indexBuffer?: Buffer | null;\n /** @note this is really a map of buffers, not a map of attributes */\n attributes?: Record<string, Buffer>;\n /** */\n constantAttributes?: Record<string, TypedArray>;\n\n /** @internal For use with {@link TransformFeedback}, WebGL 2 only. */\n varyings?: string[];\n\n transformFeedback?: TransformFeedback;\n\n /** Mapped uniforms for shadertool modules */\n moduleSettings?: Record<string, Record<string, any>>;\n};\n\n/**\n * v9 Model API\n * A model\n * - automatically reuses pipelines (programs) when possible\n * - automatically rebuilds pipelines if necessary to accommodate changed settings\n * shadertools integration\n * - accepts modules and performs shader transpilation\n */\nexport class Model {\n static defaultProps: Required<ModelProps> = {\n ...RenderPipeline.defaultProps,\n vs: null,\n fs: null,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n defines: {},\n modules: [],\n moduleSettings: undefined!,\n geometry: null,\n indexBuffer: null,\n attributes: {},\n constantAttributes: {},\n varyings: [],\n\n shaderInputs: undefined!,\n pipelineFactory: undefined!,\n transformFeedback: undefined,\n shaderAssembler: ShaderAssembler.getDefaultShaderAssembler()\n };\n\n readonly device: Device;\n readonly id: string;\n readonly vs: string;\n readonly fs: string;\n readonly pipelineFactory: PipelineFactory;\n userData: {[key: string]: any} = {};\n\n // Fixed properties (change can trigger pipeline rebuild)\n\n /** The render pipeline GPU parameters, depth testing etc */\n parameters: RenderPipelineParameters;\n\n /** The primitive topology */\n topology: PrimitiveTopology;\n /** Buffer layout */\n bufferLayout: BufferLayout[];\n\n // Dynamic properties\n\n /** Vertex count */\n vertexCount: number;\n /** instance count */\n instanceCount: number = 0;\n\n /** Index buffer */\n indexBuffer: Buffer | null = null;\n /** Buffer-valued attributes */\n bufferAttributes: Record<string, Buffer> = {};\n /** Constant-valued attributes */\n constantAttributes: Record<string, TypedArray> = {};\n /** Bindings (textures, samplers, uniform buffers) */\n bindings: Record<string, Binding> = {};\n /** Sets uniforms @deprecated Use uniform buffers and setBindings() for portability*/\n uniforms: Record<string, UniformValue> = {};\n\n /**\n * VertexArray\n * @note not implemented: if bufferLayout is updated, vertex array has to be rebuilt!\n * @todo - allow application to define multiple vertex arrays?\n * */\n vertexArray: VertexArray;\n\n /** TransformFeedback, WebGL 2 only. */\n transformFeedback: TransformFeedback | null = null;\n\n /** The underlying GPU \"program\". @note May be recreated if parameters change */\n pipeline: RenderPipeline;\n\n /** ShaderInputs instance */\n shaderInputs: ShaderInputs;\n\n _uniformStore: UniformStore;\n\n _pipelineNeedsUpdate: string | false = 'newly created';\n _attributeInfos: Record<string, AttributeInfo> = {};\n _gpuGeometry: GPUGeometry | null = null;\n private _getModuleUniforms: (props?: Record<string, Record<string, any>>) => Record<string, any>;\n private props: Required<ModelProps>;\n\n constructor(device: Device, props: ModelProps) {\n this.props = {...Model.defaultProps, ...props};\n props = this.props;\n this.id = props.id || uid('model');\n this.device = device;\n\n Object.assign(this.userData, props.userData);\n\n // Setup shader module inputs\n const moduleMap = Object.fromEntries(this.props.modules?.map(module => [module.name, module]) || []);\n this.setShaderInputs(props.shaderInputs || new ShaderInputs(moduleMap));\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n const modules = (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleShaders({platformInfo, ...this.props, modules});\n\n this.vs = vs;\n this.fs = fs;\n this._getModuleUniforms = getUniforms;\n\n this.vertexCount = this.props.vertexCount;\n this.instanceCount = this.props.instanceCount;\n\n this.topology = this.props.topology;\n this.bufferLayout = this.props.bufferLayout;\n this.parameters = this.props.parameters;\n\n // Geometry, if provided, sets topology and vertex cound\n if (props.geometry) {\n this._gpuGeometry = this.setGeometry(props.geometry);\n }\n\n this.pipelineFactory =\n props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n\n // Create the pipeline\n // @note order is important\n this.pipeline = this._updatePipeline();\n\n this.vertexArray = device.createVertexArray({\n renderPipeline: this.pipeline\n });\n\n // Now we can apply geometry attributes\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n\n // Apply any dynamic settings that will not trigger pipeline change\n if (props.vertexCount) {\n this.setVertexCount(props.vertexCount);\n }\n if (props.instanceCount) {\n this.setInstanceCount(props.instanceCount);\n }\n // @ts-expect-error\n if (props.indices) {\n throw new Error('Model.props.indices removed. Use props.indexBuffer');\n }\n if (props.indexBuffer) {\n this.setIndexBuffer(props.indexBuffer);\n }\n if (props.attributes) {\n this.setAttributes(props.attributes);\n }\n if (props.constantAttributes) {\n this.setConstantAttributes(props.constantAttributes);\n }\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n if (props.uniforms) {\n this.setUniforms(props.uniforms);\n }\n if (props.moduleSettings) {\n // eslint-disable-next-line no-console\n console.warn('Model.props.moduleSettings is deprecated. Use Model.shaderInputs.setProps()');\n this.updateModuleSettings(props.moduleSettings);\n }\n if (props.transformFeedback) {\n this.transformFeedback = props.transformFeedback;\n }\n\n // WebGL1?\n // this.setUniforms(this._getModuleUniforms()); // Get all default module uniforms\n\n // Catch any access to non-standard props\n Object.seal(this);\n }\n\n destroy(): void {\n this.pipelineFactory.release(this.pipeline);\n this._uniformStore.destroy();\n }\n\n // Draw call\n\n predraw() {\n // Update uniform buffers if needed\n this.updateShaderInputs();\n }\n\n draw(renderPass: RenderPass): void {\n this.predraw();\n\n try {\n this._logDrawCallStart();\n\n // Check if the pipeline is invalidated\n // TODO - this is likely the worst place to do this from performance perspective. Perhaps add a predraw()?\n this.pipeline = this._updatePipeline();\n\n // Set pipeline state, we may be sharing a pipeline so we need to set all state on every draw\n // Any caching needs to be done inside the pipeline functions\n this.pipeline.setBindings(this.bindings);\n this.pipeline.setUniforms(this.uniforms);\n\n this.pipeline.draw({\n renderPass,\n vertexArray: this.vertexArray,\n vertexCount: this.vertexCount,\n instanceCount: this.instanceCount,\n transformFeedback: this.transformFeedback\n });\n } finally {\n this._logDrawCallEnd();\n }\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n /**\n * Updates the optional geometry\n * Geometry, set topology and bufferLayout\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setGeometry(geometry: GPUGeometry | Geometry): GPUGeometry {\n const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);\n this.setTopology(gpuGeometry.topology || 'triangle-list');\n this.bufferLayout = mergeBufferLayouts(this.bufferLayout, gpuGeometry.bufferLayout);\n if (this.vertexArray) {\n this._setGeometryAttributes(gpuGeometry);\n }\n return gpuGeometry;\n }\n\n /**\n * Updates the optional geometry attributes\n * Geometry, sets several attributes, indexBuffer, and also vertex count\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n _setGeometryAttributes(gpuGeometry: GPUGeometry): void {\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setAttributes(gpuGeometry.attributes);\n this.setIndexBuffer(gpuGeometry.indices);\n }\n\n /**\n * Updates the primitive topology ('triangle-list', 'triangle-strip' etc).\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setTopology(topology: PrimitiveTopology): void {\n if (topology !== this.topology) {\n this.topology = topology;\n this._setPipelineNeedsUpdate('topology');\n }\n }\n\n /**\n * Updates the buffer layout.\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setBufferLayout(bufferLayout: BufferLayout[]): void {\n this.bufferLayout = this._gpuGeometry\n ? mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout)\n : bufferLayout;\n this._setPipelineNeedsUpdate('bufferLayout');\n\n // Recreate the pipeline\n this.pipeline = this._updatePipeline();\n\n // vertex array needs to be updated if we update buffer layout,\n // but not if we update parameters\n this.vertexArray = this.device.createVertexArray({\n renderPipeline: this.pipeline\n });\n\n // Reapply geometry attributes to the new vertex array\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n }\n\n /**\n * Set GPU parameters.\n * @note Can trigger a pipeline rebuild / pipeline cache fetch.\n * @param parameters\n */\n setParameters(parameters: RenderPipelineParameters) {\n if (!deepEqual(parameters, this.parameters, 2)) {\n this.parameters = parameters;\n this._setPipelineNeedsUpdate('parameters');\n }\n }\n\n // Update dynamic fields\n\n /**\n * Updates the vertex count (used in draw calls)\n * @note Any attributes with stepMode=vertex need to be at least this big\n */\n setVertexCount(vertexCount: number): void {\n this.vertexCount = vertexCount;\n }\n\n /**\n * Updates the instance count (used in draw calls)\n * @note Any attributes with stepMode=instance need to be at least this big\n */\n setInstanceCount(instanceCount: number): void {\n this.instanceCount = instanceCount;\n }\n\n setShaderInputs(shaderInputs: ShaderInputs): void {\n this.shaderInputs = shaderInputs;\n this._uniformStore = new UniformStore(this.shaderInputs.modules);\n // Create uniform buffer bindings for all modules\n for (const moduleName of Object.keys(this.shaderInputs.modules)) {\n const uniformBuffer = this._uniformStore.getManagedUniformBuffer(\n this.device,\n moduleName\n );\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n\n updateShaderInputs(): void {\n this._uniformStore.setUniforms(this.shaderInputs.getUniformValues());\n }\n\n /**\n * @deprecated Updates shader module settings (which results in uniforms being set)\n */\n updateModuleSettings(props: Record<string, any>): void {\n // eslint-disable-next-line no-console\n console.warn('Model.updateModuleSettings is deprecated. Use Model.shaderInputs.setProps()');\n const {bindings, uniforms} = splitUniformsAndBindings(this._getModuleUniforms(props));\n Object.assign(this.bindings, bindings);\n Object.assign(this.uniforms, uniforms);\n }\n \n /**\n * Sets bindings (textures, samplers, uniform buffers)\n */\n setBindings(bindings: Record<string, Binding>): void {\n Object.assign(this.bindings, bindings);\n }\n\n /**\n * Sets individual uniforms\n * @deprecated WebGL only, use uniform buffers for portability\n * @param uniforms\n * @returns self for chaining\n */\n setUniforms(uniforms: Record<string, UniformValue>): void {\n this.pipeline.setUniforms(uniforms);\n Object.assign(this.uniforms, uniforms);\n }\n\n /**\n * Sets the index buffer\n * @todo - how to unset it if we change geometry?\n */\n setIndexBuffer(indexBuffer: Buffer | null): void {\n this.vertexArray.setIndexBuffer(indexBuffer);\n }\n\n /**\n * Updates optional transform feedback. WebGL 2 only.\n */\n setTransformFeedback(transformFeedback: TransformFeedback | null): void {\n this.transformFeedback = transformFeedback;\n }\n\n /**\n * Sets attributes (buffers)\n * @note Overrides any attributes previously set with the same name\n */\n setAttributes(buffers: Record<string, Buffer>): void {\n if (buffers.indices) {\n log.warn(\n `Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`\n );\n }\n for (const [bufferName, buffer] of Object.entries(buffers)) {\n const bufferLayout = this.bufferLayout.find(layout => layout.name === bufferName);\n if (!bufferLayout) {\n log.warn(`Model(${this.id}): Missing layout for buffer \"${bufferName}\".`)();\n continue; // eslint-disable-line no-continue\n }\n\n // For an interleaved attribute we may need to set multiple attributes\n const attributeNames = bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n let set = false;\n for (const attributeName of attributeNames) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setBuffer(attributeInfo.location, buffer);\n set = true;\n }\n }\n if (!set) {\n log.warn(\n `Model(${this.id}): Ignoring buffer \"${buffer.id}\" for unknown attribute \"${bufferName}\"`\n )();\n }\n }\n }\n\n /**\n * Sets constant attributes\n * @note Overrides any attributes previously set with the same name\n * Constant attributes are only supported in WebGL, not in WebGPU\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 * @param constantAttributes\n */\n setConstantAttributes(attributes: Record<string, TypedArray>): void {\n for (const [attributeName, value] of Object.entries(attributes)) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setConstant(attributeInfo.location, value);\n } else {\n log.warn(\n `Model \"${this.id}: Ignoring constant supplied for unknown attribute \"${attributeName}\"`\n )();\n }\n }\n }\n\n _setPipelineNeedsUpdate(reason: string): void {\n this._pipelineNeedsUpdate = this._pipelineNeedsUpdate || reason;\n }\n\n _updatePipeline(): RenderPipeline {\n if (this._pipelineNeedsUpdate) {\n if (this.pipeline) {\n log.log(\n 1,\n `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`\n )();\n }\n this._pipelineNeedsUpdate = false;\n this.pipeline = this.device.createRenderPipeline({\n ...this.props,\n bufferLayout: this.bufferLayout,\n topology: this.topology,\n parameters: this.parameters,\n vs: this.device.createShader({id: '{$this.id}-vertex', stage: 'vertex', source: this.vs}),\n fs: this.fs\n ? this.device.createShader({\n id: '{$this.id}-fragment',\n stage: 'fragment',\n source: this.fs\n })\n : null\n });\n this._attributeInfos = getAttributeInfosFromLayouts(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n }\n return this.pipeline;\n }\n\n /** Throttle draw call logging */\n _lastLogTime = 0;\n _logOpen = false;\n\n _logDrawCallStart(): void {\n // IF level is 4 or higher, log every frame.\n const logDrawTimeout = log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;\n if (Date.now() - this._lastLogTime < logDrawTimeout) {\n return undefined;\n }\n\n this._lastLogTime = Date.now();\n this._logOpen = true;\n\n log.group(LOG_DRAW_PRIORITY, `>>> DRAWING MODEL ${this.id}`, {collapsed: log.level <= 2})();\n }\n\n _logDrawCallEnd(): void {\n if (this._logOpen) {\n const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.shaderLayout);\n\n // log.table(logLevel, attributeTable)();\n // log.table(logLevel, uniformTable)();\n log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();\n\n log.groupEnd(LOG_DRAW_PRIORITY)();\n this._logOpen = false;\n }\n }\n}\n\n// HELPERS\n\n/** TODO - move to core, document add tests */\nfunction mergeBufferLayouts(layouts1: BufferLayout[], layouts2: BufferLayout[]): BufferLayout[] {\n const layouts = [...layouts1];\n for (const attribute of layouts2) {\n const index = layouts.findIndex(attribute2 => attribute2.name === attribute.name);\n if (index < 0) {\n layouts.push(attribute);\n } else {\n layouts[index] = attribute;\n }\n }\n return layouts;\n}\n\n/** Create a shadertools platform info from the Device */\nexport function getPlatformInfo(device: Device): PlatformInfo {\n return {\n type: device.info.type,\n shaderLanguage: device.info.shadingLanguage,\n shaderLanguageVersion: device.info.shadingLanguageVersion as 100 | 300,\n gpu: device.info.gpu,\n features: device.features\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shader-inputs.d.ts","sourceRoot":"","sources":["../src/shader-inputs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAGlE,OAAO,EAAkB,oBAAoB,EAAC,MAAM,sBAAsB,CAAA;AAG1E,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,CAC5B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7E,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IACrF;IACF,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC;IAEjF,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,SAAS,EACf;QACE,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;KAC1C,CACF,CAAC;IAEF,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,YAAY,CACvB,YAAY,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAC7E,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACxC;IAED;;;OAGG;IACH,OAAO,EAAE,QAAQ,CAAC;SAAE,CAAC,IAAI,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KAAC,CAAC,CAAC;IAEpF,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACzE,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAC9E,sCAAsC;IACtC,qBAAqB,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAElE;;;OAGG;gBACS,OAAO,EAAE;SAAE,CAAC,IAAI,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KAAC;IAoBrF,cAAc;IACd,OAAO,IAAI,IAAI;IAEf;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;SAAE,CAAC,IAAI,MAAM,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KAAC,CAAC,GAAG,IAAI;IAoBtF,oEAAoE;IAKpE;;;OAGG;IACH,UAAU,IAAI,oBAAoB,EAAE;IAIpC,6CAA6C;IAC7C,gBAAgB,IAAI,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAI5E,oEAAoE;IACpE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CAOjD"}
1
+ {"version":3,"file":"shader-inputs.d.ts","sourceRoot":"","sources":["../src/shader-inputs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAGlE,OAAO,EAAkB,oBAAoB,EAAC,MAAM,sBAAsB,CAAA;AAG1E,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,CAC5B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7E,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IACrF;IACF,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC;IAEjF,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,SAAS,EACf;QACE,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;KAC1C,CACF,CAAC;IAEF,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,YAAY,CACvB,YAAY,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAC7E,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACxC;IAED;;;OAGG;IACH,OAAO,EAAE,QAAQ,CAAC;SAAE,CAAC,IAAI,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KAAC,CAAC,CAAC;IAEpF,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACzE,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAC9E,sCAAsC;IACtC,qBAAqB,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAElE;;;OAGG;gBACS,OAAO,EAAE;SAAE,CAAC,IAAI,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KAAC;IAoBrF,cAAc;IACd,OAAO,IAAI,IAAI;IAEf;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;SAAE,CAAC,IAAI,MAAM,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KAAC,CAAC,GAAG,IAAI;IAyBtF,oEAAoE;IAKpE;;;OAGG;IACH,UAAU,IAAI,oBAAoB,EAAE;IAIpC,6CAA6C;IAC7C,gBAAgB,IAAI,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAI5E,oEAAoE;IACpE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CAOjD"}
@@ -24,6 +24,10 @@ export class ShaderInputs {
24
24
  const moduleName = name;
25
25
  const moduleProps = props[moduleName];
26
26
  const module = this.modules[moduleName];
27
+ if (!module) {
28
+ log.warn(`Module ${name} not found`)();
29
+ continue;
30
+ }
27
31
  const oldUniforms = this.moduleUniforms[moduleName];
28
32
  const uniforms = ((_module$getUniforms = module.getUniforms) === null || _module$getUniforms === void 0 ? void 0 : _module$getUniforms.call(module, moduleProps, this.moduleUniforms[moduleName])) || moduleProps;
29
33
  this.moduleUniforms[moduleName] = {
@@ -1 +1 @@
1
- {"version":3,"file":"shader-inputs.js","names":["log","_resolveModules","ShaderInputs","constructor","modules","moduleUniforms","moduleBindings","moduleUniformsChanged","allModules","Object","values","map","m","name","module","entries","moduleName","defaultUniforms","destroy","setProps","props","keys","_module$getUniforms","moduleProps","oldUniforms","uniforms","getUniforms","call","getModules","getUniformValues","getBindings","bindings","assign"],"sources":["../src/shader-inputs.ts"],"sourcesContent":["// luma.gl, MIT license\nimport type {UniformValue, Texture, Sampler} from '@luma.gl/core';\nimport {log} from '@luma.gl/core';\n// import type {ShaderUniformType, UniformValue, UniformFormat, UniformInfoDevice, Texture, Sampler} from '@luma.gl/core';\nimport {_resolveModules, ShaderModuleInstance} from '@luma.gl/shadertools'\n\n\n/** Minimal ShaderModule subset, we don't need shader code etc */\nexport type ShaderModuleInputs<\n PropsT extends Record<string, unknown> = Record<string, unknown>,\n UniformsT extends Record<string, UniformValue> = Record<string, UniformValue>,\n BindingsT extends Record<string, Texture | Sampler> = Record<string, Texture | Sampler>\n> = {\n defaultUniforms?: UniformsT;\n getUniforms?: (settings: Partial<PropsT>, prevUniforms?: UniformsT) => UniformsT;\n\n /** Not used. Used to access props type */\n props?: PropsT;\n\n bindings?: Record<\n keyof BindingsT,\n {\n location: number;\n type: 'texture' | 'sampler' | 'uniforms';\n }\n >;\n\n uniformTypes?: any;\n};\n\n/**\n * ShaderInputs holds uniform and binding values for one or more shader modules,\n * - It can generate binary data for any uniform buffer\n * - It can manage a uniform buffer for each block\n * - It can update managed uniform buffers with a single call\n * - It performs some book keeping on what has changed to minimize unnecessary writes to uniform buffers.\n */\nexport class ShaderInputs<\n ShaderPropsT extends Partial<Record<string, Record<string, unknown>>> = Partial<\n Record<string, Record<string, unknown>>\n >\n> {\n /** \n * The map of modules \n * @todo should should this include the resolved dependencies?\n */\n modules: Readonly<{[P in keyof ShaderPropsT]: ShaderModuleInputs<ShaderPropsT[P]>}>;\n\n /** Stores the uniform values for each module */\n moduleUniforms: Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n /** Stores the uniform bindings for each module */\n moduleBindings: Record<keyof ShaderPropsT, Record<string, Texture | Sampler>>;\n /** Tracks if uniforms have changed */\n moduleUniformsChanged: Record<keyof ShaderPropsT, false | string>;\n\n /**\n * Create a new UniformStore instance\n * @param modules\n */\n constructor(modules: {[P in keyof ShaderPropsT]: ShaderModuleInputs<ShaderPropsT[P]>}) {\n // TODO - get all dependencies from modules\n const allModules =_resolveModules(Object.values(modules));\n log.log(1, 'Creating ShaderInputs with modules', allModules.map(m => m.name))();\n\n // Store the module definitions and create storage for uniform values and binding values, per module\n this.modules = modules;\n this.moduleUniforms = {} as Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n this.moduleBindings = {} as Record<keyof ShaderPropsT, Record<string, Texture | Sampler>>;\n\n // Initialize the modules\n for (const [name, module] of Object.entries(modules)) {\n const moduleName = name as keyof ShaderPropsT;\n\n // Get default uniforms from module\n this.moduleUniforms[moduleName] = module.defaultUniforms || {};\n this.moduleBindings[moduleName] = {};\n }\n }\n\n /** Destroy */\n destroy(): void {}\n\n /**\n * Set module props\n */\n setProps(props: Partial<{[P in keyof ShaderPropsT]?: Partial<ShaderPropsT[P]>}>): void {\n for (const name of Object.keys(props)) {\n const moduleName = name as keyof ShaderPropsT;\n const moduleProps = props[moduleName];\n const module = this.modules[moduleName];\n\n const oldUniforms = this.moduleUniforms[moduleName]; \n const uniforms = module.getUniforms?.(moduleProps, this.moduleUniforms[moduleName]) || moduleProps as any;\n // console.error(uniforms)\n this.moduleUniforms[moduleName] = {...oldUniforms, ...uniforms};\n // this.moduleUniformsChanged ||= moduleName;\n\n // console.log(`setProps(${String(moduleName)}`, moduleName, this.moduleUniforms[moduleName])\n\n // TODO - Get Module bindings\n // const bindings = module.getBindings?.(moduleProps);\n // this.moduleUniforms[moduleName] = bindings;\n }\n }\n\n /** Merges all bindings for the shader (from the various modules) */\n // getUniformBlocks(): Record<string, Texture | Sampler> {\n // return this.moduleUniforms;\n // }\n\n /** \n * Return the map of modules \n * @todo should should this include the resolved dependencies?\n */\n getModules(): ShaderModuleInstance[] {\n return Object.values(this.modules);\n }\n\n /** Get all uniform values for all modules */\n getUniformValues(): Record<keyof ShaderPropsT, Record<string, UniformValue>> {\n return this.moduleUniforms;\n }\n\n /** Merges all bindings for the shader (from the various modules) */\n getBindings(): Record<string, Texture | Sampler> {\n const bindings = {} as Record<string, Texture | Sampler>;\n for (const moduleBindings of Object.values(this.moduleBindings)) {\n Object.assign(bindings, moduleBindings);\n }\n return bindings;\n }\n}\n"],"mappings":"AAEA,SAAQA,GAAG,QAAO,eAAe;AAEjC,SAAQC,eAAe,QAA6B,sBAAsB;AAiC1E,OAAO,MAAMC,YAAY,CAIvB;EAkBAC,WAAWA,CAACC,OAAyE,EAAE;IAAA,KAbvFA,OAAO;IAAA,KAGPC,cAAc;IAAA,KAEdC,cAAc;IAAA,KAEdC,qBAAqB;IAQnB,MAAMC,UAAU,GAAEP,eAAe,CAACQ,MAAM,CAACC,MAAM,CAACN,OAAO,CAAC,CAAC;IACzDJ,GAAG,CAACA,GAAG,CAAC,CAAC,EAAE,oCAAoC,EAAEQ,UAAU,CAACG,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC,CAAC;IAG/E,IAAI,CAACT,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,cAAc,GAAG,CAAC,CAA6D;IACpF,IAAI,CAACC,cAAc,GAAG,CAAC,CAAkE;IAGzF,KAAK,MAAM,CAACO,IAAI,EAAEC,MAAM,CAAC,IAAIL,MAAM,CAACM,OAAO,CAACX,OAAO,CAAC,EAAE;MACpD,MAAMY,UAAU,GAAGH,IAA0B;MAG7C,IAAI,CAACR,cAAc,CAACW,UAAU,CAAC,GAAGF,MAAM,CAACG,eAAe,IAAI,CAAC,CAAC;MAC9D,IAAI,CAACX,cAAc,CAACU,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC;EACF;EAGAE,OAAOA,CAAA,EAAS,CAAC;EAKjBC,QAAQA,CAACC,KAAsE,EAAQ;IACrF,KAAK,MAAMP,IAAI,IAAIJ,MAAM,CAACY,IAAI,CAACD,KAAK,CAAC,EAAE;MAAA,IAAAE,mBAAA;MACrC,MAAMN,UAAU,GAAGH,IAA0B;MAC7C,MAAMU,WAAW,GAAGH,KAAK,CAACJ,UAAU,CAAC;MACrC,MAAMF,MAAM,GAAG,IAAI,CAACV,OAAO,CAACY,UAAU,CAAC;MAEvC,MAAMQ,WAAW,GAAG,IAAI,CAACnB,cAAc,CAACW,UAAU,CAAC;MACnD,MAAMS,QAAQ,GAAG,EAAAH,mBAAA,GAAAR,MAAM,CAACY,WAAW,cAAAJ,mBAAA,uBAAlBA,mBAAA,CAAAK,IAAA,CAAAb,MAAM,EAAeS,WAAW,EAAE,IAAI,CAAClB,cAAc,CAACW,UAAU,CAAC,CAAC,KAAIO,WAAkB;MAEzG,IAAI,CAAClB,cAAc,CAACW,UAAU,CAAC,GAAG;QAAC,GAAGQ,WAAW;QAAE,GAAGC;MAAQ,CAAC;IAQjE;EACF;EAWAG,UAAUA,CAAA,EAA2B;IACnC,OAAOnB,MAAM,CAACC,MAAM,CAAC,IAAI,CAACN,OAAO,CAAC;EACpC;EAGAyB,gBAAgBA,CAAA,EAA6D;IAC3E,OAAO,IAAI,CAACxB,cAAc;EAC5B;EAGAyB,WAAWA,CAAA,EAAsC;IAC/C,MAAMC,QAAQ,GAAG,CAAC,CAAsC;IACxD,KAAK,MAAMzB,cAAc,IAAIG,MAAM,CAACC,MAAM,CAAC,IAAI,CAACJ,cAAc,CAAC,EAAE;MAC/DG,MAAM,CAACuB,MAAM,CAACD,QAAQ,EAAEzB,cAAc,CAAC;IACzC;IACA,OAAOyB,QAAQ;EACjB;AACF"}
1
+ {"version":3,"file":"shader-inputs.js","names":["log","_resolveModules","ShaderInputs","constructor","modules","moduleUniforms","moduleBindings","moduleUniformsChanged","allModules","Object","values","map","m","name","module","entries","moduleName","defaultUniforms","destroy","setProps","props","keys","_module$getUniforms","moduleProps","warn","oldUniforms","uniforms","getUniforms","call","getModules","getUniformValues","getBindings","bindings","assign"],"sources":["../src/shader-inputs.ts"],"sourcesContent":["// luma.gl, MIT license\nimport type {UniformValue, Texture, Sampler} from '@luma.gl/core';\nimport {log} from '@luma.gl/core';\n// import type {ShaderUniformType, UniformValue, UniformFormat, UniformInfoDevice, Texture, Sampler} from '@luma.gl/core';\nimport {_resolveModules, ShaderModuleInstance} from '@luma.gl/shadertools'\n\n\n/** Minimal ShaderModule subset, we don't need shader code etc */\nexport type ShaderModuleInputs<\n PropsT extends Record<string, unknown> = Record<string, unknown>,\n UniformsT extends Record<string, UniformValue> = Record<string, UniformValue>,\n BindingsT extends Record<string, Texture | Sampler> = Record<string, Texture | Sampler>\n> = {\n defaultUniforms?: UniformsT;\n getUniforms?: (settings: Partial<PropsT>, prevUniforms?: UniformsT) => UniformsT;\n\n /** Not used. Used to access props type */\n props?: PropsT;\n\n bindings?: Record<\n keyof BindingsT,\n {\n location: number;\n type: 'texture' | 'sampler' | 'uniforms';\n }\n >;\n\n uniformTypes?: any;\n};\n\n/**\n * ShaderInputs holds uniform and binding values for one or more shader modules,\n * - It can generate binary data for any uniform buffer\n * - It can manage a uniform buffer for each block\n * - It can update managed uniform buffers with a single call\n * - It performs some book keeping on what has changed to minimize unnecessary writes to uniform buffers.\n */\nexport class ShaderInputs<\n ShaderPropsT extends Partial<Record<string, Record<string, unknown>>> = Partial<\n Record<string, Record<string, unknown>>\n >\n> {\n /** \n * The map of modules \n * @todo should should this include the resolved dependencies?\n */\n modules: Readonly<{[P in keyof ShaderPropsT]: ShaderModuleInputs<ShaderPropsT[P]>}>;\n\n /** Stores the uniform values for each module */\n moduleUniforms: Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n /** Stores the uniform bindings for each module */\n moduleBindings: Record<keyof ShaderPropsT, Record<string, Texture | Sampler>>;\n /** Tracks if uniforms have changed */\n moduleUniformsChanged: Record<keyof ShaderPropsT, false | string>;\n\n /**\n * Create a new UniformStore instance\n * @param modules\n */\n constructor(modules: {[P in keyof ShaderPropsT]: ShaderModuleInputs<ShaderPropsT[P]>}) {\n // TODO - get all dependencies from modules\n const allModules =_resolveModules(Object.values(modules));\n log.log(1, 'Creating ShaderInputs with modules', allModules.map(m => m.name))();\n\n // Store the module definitions and create storage for uniform values and binding values, per module\n this.modules = modules;\n this.moduleUniforms = {} as Record<keyof ShaderPropsT, Record<string, UniformValue>>;\n this.moduleBindings = {} as Record<keyof ShaderPropsT, Record<string, Texture | Sampler>>;\n\n // Initialize the modules\n for (const [name, module] of Object.entries(modules)) {\n const moduleName = name as keyof ShaderPropsT;\n\n // Get default uniforms from module\n this.moduleUniforms[moduleName] = module.defaultUniforms || {};\n this.moduleBindings[moduleName] = {};\n }\n }\n\n /** Destroy */\n destroy(): void {}\n\n /**\n * Set module props\n */\n setProps(props: Partial<{[P in keyof ShaderPropsT]?: Partial<ShaderPropsT[P]>}>): void {\n for (const name of Object.keys(props)) {\n const moduleName = name as keyof ShaderPropsT;\n const moduleProps = props[moduleName];\n const module = this.modules[moduleName];\n if (!module) {\n // Ignore props for unregistered modules\n log.warn(`Module ${name} not found`)();\n continue;\n }\n\n const oldUniforms = this.moduleUniforms[moduleName]; \n const uniforms = module.getUniforms?.(moduleProps, this.moduleUniforms[moduleName]) || moduleProps as any;\n // console.error(uniforms)\n this.moduleUniforms[moduleName] = {...oldUniforms, ...uniforms};\n // this.moduleUniformsChanged ||= moduleName;\n\n // console.log(`setProps(${String(moduleName)}`, moduleName, this.moduleUniforms[moduleName])\n\n // TODO - Get Module bindings\n // const bindings = module.getBindings?.(moduleProps);\n // this.moduleUniforms[moduleName] = bindings;\n }\n }\n\n /** Merges all bindings for the shader (from the various modules) */\n // getUniformBlocks(): Record<string, Texture | Sampler> {\n // return this.moduleUniforms;\n // }\n\n /** \n * Return the map of modules \n * @todo should should this include the resolved dependencies?\n */\n getModules(): ShaderModuleInstance[] {\n return Object.values(this.modules);\n }\n\n /** Get all uniform values for all modules */\n getUniformValues(): Record<keyof ShaderPropsT, Record<string, UniformValue>> {\n return this.moduleUniforms;\n }\n\n /** Merges all bindings for the shader (from the various modules) */\n getBindings(): Record<string, Texture | Sampler> {\n const bindings = {} as Record<string, Texture | Sampler>;\n for (const moduleBindings of Object.values(this.moduleBindings)) {\n Object.assign(bindings, moduleBindings);\n }\n return bindings;\n }\n}\n"],"mappings":"AAEA,SAAQA,GAAG,QAAO,eAAe;AAEjC,SAAQC,eAAe,QAA6B,sBAAsB;AAiC1E,OAAO,MAAMC,YAAY,CAIvB;EAkBAC,WAAWA,CAACC,OAAyE,EAAE;IAAA,KAbvFA,OAAO;IAAA,KAGPC,cAAc;IAAA,KAEdC,cAAc;IAAA,KAEdC,qBAAqB;IAQnB,MAAMC,UAAU,GAAEP,eAAe,CAACQ,MAAM,CAACC,MAAM,CAACN,OAAO,CAAC,CAAC;IACzDJ,GAAG,CAACA,GAAG,CAAC,CAAC,EAAE,oCAAoC,EAAEQ,UAAU,CAACG,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC,CAAC;IAG/E,IAAI,CAACT,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,cAAc,GAAG,CAAC,CAA6D;IACpF,IAAI,CAACC,cAAc,GAAG,CAAC,CAAkE;IAGzF,KAAK,MAAM,CAACO,IAAI,EAAEC,MAAM,CAAC,IAAIL,MAAM,CAACM,OAAO,CAACX,OAAO,CAAC,EAAE;MACpD,MAAMY,UAAU,GAAGH,IAA0B;MAG7C,IAAI,CAACR,cAAc,CAACW,UAAU,CAAC,GAAGF,MAAM,CAACG,eAAe,IAAI,CAAC,CAAC;MAC9D,IAAI,CAACX,cAAc,CAACU,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC;EACF;EAGAE,OAAOA,CAAA,EAAS,CAAC;EAKjBC,QAAQA,CAACC,KAAsE,EAAQ;IACrF,KAAK,MAAMP,IAAI,IAAIJ,MAAM,CAACY,IAAI,CAACD,KAAK,CAAC,EAAE;MAAA,IAAAE,mBAAA;MACrC,MAAMN,UAAU,GAAGH,IAA0B;MAC7C,MAAMU,WAAW,GAAGH,KAAK,CAACJ,UAAU,CAAC;MACrC,MAAMF,MAAM,GAAG,IAAI,CAACV,OAAO,CAACY,UAAU,CAAC;MACvC,IAAI,CAACF,MAAM,EAAE;QAEXd,GAAG,CAACwB,IAAI,CAAE,UAASX,IAAK,YAAW,CAAC,CAAC,CAAC;QACtC;MACF;MAEA,MAAMY,WAAW,GAAG,IAAI,CAACpB,cAAc,CAACW,UAAU,CAAC;MACnD,MAAMU,QAAQ,GAAG,EAAAJ,mBAAA,GAAAR,MAAM,CAACa,WAAW,cAAAL,mBAAA,uBAAlBA,mBAAA,CAAAM,IAAA,CAAAd,MAAM,EAAeS,WAAW,EAAE,IAAI,CAAClB,cAAc,CAACW,UAAU,CAAC,CAAC,KAAIO,WAAkB;MAEzG,IAAI,CAAClB,cAAc,CAACW,UAAU,CAAC,GAAG;QAAC,GAAGS,WAAW;QAAE,GAAGC;MAAQ,CAAC;IAQjE;EACF;EAWAG,UAAUA,CAAA,EAA2B;IACnC,OAAOpB,MAAM,CAACC,MAAM,CAAC,IAAI,CAACN,OAAO,CAAC;EACpC;EAGA0B,gBAAgBA,CAAA,EAA6D;IAC3E,OAAO,IAAI,CAACzB,cAAc;EAC5B;EAGA0B,WAAWA,CAAA,EAAsC;IAC/C,MAAMC,QAAQ,GAAG,CAAC,CAAsC;IACxD,KAAK,MAAM1B,cAAc,IAAIG,MAAM,CAACC,MAAM,CAAC,IAAI,CAACJ,cAAc,CAAC,EAAE;MAC/DG,MAAM,CAACwB,MAAM,CAACD,QAAQ,EAAE1B,cAAc,CAAC;IACzC;IACA,OAAO0B,QAAQ;EACjB;AACF"}