@luma.gl/engine 9.0.0-beta.1 → 9.0.0-beta.3

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
@@ -1209,7 +1209,19 @@ var __exports__ = (() => {
1209
1209
  readPixelsToArrayWebGL(source, options) {
1210
1210
  throw new Error("not implemented");
1211
1211
  }
1212
- readPixelsToBufferWebGL2(source, options) {
1212
+ readPixelsToBufferWebGL(source, options) {
1213
+ throw new Error("not implemented");
1214
+ }
1215
+ setParametersWebGL(parameters) {
1216
+ throw new Error("not implemented");
1217
+ }
1218
+ getParametersWebGL(parameters) {
1219
+ throw new Error("not implemented");
1220
+ }
1221
+ withParametersWebGL(parameters, func) {
1222
+ throw new Error("not implemented");
1223
+ }
1224
+ clearWebGL(options) {
1213
1225
  throw new Error("not implemented");
1214
1226
  }
1215
1227
  _getBufferProps(props) {
@@ -1875,7 +1887,7 @@ var __exports__ = (() => {
1875
1887
  }
1876
1888
  const byteLength = this.getUniformBufferByteLength(uniformBufferName);
1877
1889
  const uniformBuffer = device.createBuffer({
1878
- usage: Buffer2.UNIFORM,
1890
+ usage: Buffer2.UNIFORM | Buffer2.COPY_DST,
1879
1891
  byteLength
1880
1892
  });
1881
1893
  const uniformBufferData = this.getUniformBufferData(uniformBufferName);
@@ -1886,7 +1898,7 @@ var __exports__ = (() => {
1886
1898
  if (!this.uniformBuffers.get(uniformBufferName)) {
1887
1899
  const byteLength = this.getUniformBufferByteLength(uniformBufferName);
1888
1900
  const uniformBuffer = device.createBuffer({
1889
- usage: Buffer2.UNIFORM,
1901
+ usage: Buffer2.UNIFORM | Buffer2.COPY_DST,
1890
1902
  byteLength
1891
1903
  });
1892
1904
  this.uniformBuffers.set(uniformBufferName, uniformBuffer);
@@ -3117,18 +3129,12 @@ precision highp float;
3117
3129
  source,
3118
3130
  stage,
3119
3131
  modules,
3120
- defines = {},
3121
3132
  hookFunctions = [],
3122
3133
  inject = {},
3123
3134
  log: log2
3124
3135
  } = options;
3125
3136
  assert3(typeof source === "string", "shader source must be a string");
3126
3137
  const coreSource = source;
3127
- const allDefines = {};
3128
- modules.forEach((module) => {
3129
- Object.assign(allDefines, module.getDefines());
3130
- });
3131
- Object.assign(allDefines, defines);
3132
3138
  let assembledSource = "";
3133
3139
  const hookFunctionMap = normalizeShaderHooks(hookFunctions);
3134
3140
  const hookInjections = {};
@@ -3156,7 +3162,8 @@ precision highp float;
3156
3162
  mainInjections[key] = [injection];
3157
3163
  }
3158
3164
  }
3159
- for (const module of modules) {
3165
+ const modulesToInject = platformInfo.type !== "webgpu" ? modules : [];
3166
+ for (const module of modulesToInject) {
3160
3167
  if (log2) {
3161
3168
  module.checkDeprecations(coreSource, log2);
3162
3169
  }
@@ -8362,23 +8369,6 @@ void main() {
8362
8369
  delete this._useCounts[hash];
8363
8370
  }
8364
8371
  }
8365
- _createRenderPipeline(props) {
8366
- if (!props.fs) {
8367
- throw new Error("fs");
8368
- }
8369
- const pipeline = this.device.createRenderPipeline({
8370
- ...props,
8371
- vs: this.device.createShader({
8372
- stage: "vertex",
8373
- source: props.vs
8374
- }),
8375
- fs: props.fs ? this.device.createShader({
8376
- stage: "fragment",
8377
- source: props.fs
8378
- }) : null
8379
- });
8380
- return pipeline;
8381
- }
8382
8372
  _hashRenderPipeline(props) {
8383
8373
  const vsHash = this._getHash(props.vs);
8384
8374
  const fsHash = props.fs ? this._getHash(props.fs) : 0;
@@ -8590,11 +8580,16 @@ void main() {
8590
8580
  this.pipeline = this._updatePipeline();
8591
8581
  this.pipeline.setBindings(this.bindings);
8592
8582
  this.pipeline.setUniforms(this.uniforms);
8583
+ const {
8584
+ indexBuffer
8585
+ } = this.vertexArray;
8586
+ const indexCount = indexBuffer ? indexBuffer.byteLength / (indexBuffer.indexType === "uint32" ? 4 : 2) : void 0;
8593
8587
  this.pipeline.draw({
8594
8588
  renderPass,
8595
8589
  vertexArray: this.vertexArray,
8596
8590
  vertexCount: this.vertexCount,
8597
8591
  instanceCount: this.instanceCount,
8592
+ indexCount,
8598
8593
  transformFeedback: this.transformFeedback
8599
8594
  });
8600
8595
  } finally {
@@ -8605,7 +8600,7 @@ void main() {
8605
8600
  setGeometry(geometry) {
8606
8601
  const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);
8607
8602
  this.setTopology(gpuGeometry.topology || "triangle-list");
8608
- this.bufferLayout = mergeBufferLayouts(this.bufferLayout, gpuGeometry.bufferLayout);
8603
+ this.bufferLayout = mergeBufferLayouts(gpuGeometry.bufferLayout, this.bufferLayout);
8609
8604
  if (this.vertexArray) {
8610
8605
  this._setGeometryAttributes(gpuGeometry);
8611
8606
  }
@@ -1 +1 @@
1
- {"version":3,"file":"geometry-utils.js","names":["unpackIndexedGeometry","geometry","indices","attributes","vertexCount","value","length","unpackedAttributes","attributeName","attribute","constant","size","unpackedValue","constructor","x","index","i","Object","assign"],"sources":["../../src/geometry/geometry-utils.ts"],"sourcesContent":["// import type {Geometry} from './geometry';\n\nexport function unpackIndexedGeometry(geometry: any) {\n const {indices, attributes} = geometry;\n if (!indices) {\n return geometry;\n }\n\n const vertexCount = indices.value.length;\n const unpackedAttributes: Record<string, any> = {};\n\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const {constant, value, size} = attribute;\n if (constant || !size) {\n continue; // eslint-disable-line\n }\n const unpackedValue = new value.constructor(vertexCount * size);\n for (let x = 0; x < vertexCount; ++x) {\n const index = indices.value[x];\n for (let i = 0; i < size; i++) {\n unpackedValue[x * size + i] = value[index * size + i];\n }\n }\n unpackedAttributes[attributeName] = {size, value: unpackedValue};\n }\n\n return {\n attributes: Object.assign({}, attributes, unpackedAttributes)\n };\n}\n"],"mappings":"AAEA,OAAO,SAASA,qBAAqBA,CAACC,QAAa,EAAE;EACnD,MAAM;IAACC,OAAO;IAAEC;EAAU,CAAC,GAAGF,QAAQ;EACtC,IAAI,CAACC,OAAO,EAAE;IACZ,OAAOD,QAAQ;EACjB;EAEA,MAAMG,WAAW,GAAGF,OAAO,CAACG,KAAK,CAACC,MAAM;EACxC,MAAMC,kBAAuC,GAAG,CAAC,CAAC;EAElD,KAAK,MAAMC,aAAa,IAAIL,UAAU,EAAE;IACtC,MAAMM,SAAS,GAAGN,UAAU,CAACK,aAAa,CAAC;IAC3C,MAAM;MAACE,QAAQ;MAAEL,KAAK;MAAEM;IAAI,CAAC,GAAGF,SAAS;IACzC,IAAIC,QAAQ,IAAI,CAACC,IAAI,EAAE;MACrB;IACF;IACA,MAAMC,aAAa,GAAG,IAAIP,KAAK,CAACQ,WAAW,CAACT,WAAW,GAAGO,IAAI,CAAC;IAC/D,KAAK,IAAIG,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGV,WAAW,EAAE,EAAEU,CAAC,EAAE;MACpC,MAAMC,KAAK,GAAGb,OAAO,CAACG,KAAK,CAACS,CAAC,CAAC;MAC9B,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,IAAI,EAAEK,CAAC,EAAE,EAAE;QAC7BJ,aAAa,CAACE,CAAC,GAAGH,IAAI,GAAGK,CAAC,CAAC,GAAGX,KAAK,CAACU,KAAK,GAAGJ,IAAI,GAAGK,CAAC,CAAC;MACvD;IACF;IACAT,kBAAkB,CAACC,aAAa,CAAC,GAAG;MAACG,IAAI;MAAEN,KAAK,EAAEO;IAAa,CAAC;EAClE;EAEA,OAAO;IACLT,UAAU,EAAEc,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEf,UAAU,EAAEI,kBAAkB;EAC9D,CAAC;AACH"}
1
+ {"version":3,"file":"geometry-utils.js","names":["unpackIndexedGeometry","geometry","indices","attributes","vertexCount","value","length","unpackedAttributes","attributeName","attribute","constant","size","unpackedValue","constructor","x","index","i","Object","assign"],"sources":["../../src/geometry/geometry-utils.ts"],"sourcesContent":["// import type {Geometry} from './geometry';\n\nexport function unpackIndexedGeometry(geometry: any) {\n const {indices, attributes} = geometry;\n if (!indices) {\n return geometry;\n }\n\n const vertexCount = indices.value.length;\n const unpackedAttributes: Record<string, any> = {};\n\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const {constant, value, size} = attribute;\n if (constant || !size) {\n continue; // eslint-disable-line\n }\n const unpackedValue = new value.constructor(vertexCount * size);\n for (let x = 0; x < vertexCount; ++x) {\n const index = indices.value[x];\n for (let i = 0; i < size; i++) {\n unpackedValue[x * size + i] = value[index * size + i];\n }\n }\n unpackedAttributes[attributeName] = {size, value: unpackedValue};\n }\n\n return {\n attributes: Object.assign({}, attributes, unpackedAttributes)\n };\n}\n\n// export function calculateVertexNormals(positions: Float32Array): Uint8Array {\n// let normals = new Uint8Array(positions.length / 3);\n\n// for (let i = 0; i < positions.length; i++) {\n// const vec1 = new Vector3(positions.subarray(i * 3, i + 0, i + 3));\n// const vec2 = new Vector3(positions.subarray(i + 3, i + 6));\n// const vec3 = new Vector3(positions.subarray(i + 6, i + 9));\n\n// const normal = new Vector3(vec1).cross(vec2).normalize();\n// normals.set(normal[0], i + 4);\n// normals.set(normal[1], i + 4 + 1);\n// normals.set(normal[2], i + 2);\n// }\n// const normal = new Vector3(vec1).cross(vec2).normalize();\n// }"],"mappings":"AAEA,OAAO,SAASA,qBAAqBA,CAACC,QAAa,EAAE;EACnD,MAAM;IAACC,OAAO;IAAEC;EAAU,CAAC,GAAGF,QAAQ;EACtC,IAAI,CAACC,OAAO,EAAE;IACZ,OAAOD,QAAQ;EACjB;EAEA,MAAMG,WAAW,GAAGF,OAAO,CAACG,KAAK,CAACC,MAAM;EACxC,MAAMC,kBAAuC,GAAG,CAAC,CAAC;EAElD,KAAK,MAAMC,aAAa,IAAIL,UAAU,EAAE;IACtC,MAAMM,SAAS,GAAGN,UAAU,CAACK,aAAa,CAAC;IAC3C,MAAM;MAACE,QAAQ;MAAEL,KAAK;MAAEM;IAAI,CAAC,GAAGF,SAAS;IACzC,IAAIC,QAAQ,IAAI,CAACC,IAAI,EAAE;MACrB;IACF;IACA,MAAMC,aAAa,GAAG,IAAIP,KAAK,CAACQ,WAAW,CAACT,WAAW,GAAGO,IAAI,CAAC;IAC/D,KAAK,IAAIG,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGV,WAAW,EAAE,EAAEU,CAAC,EAAE;MACpC,MAAMC,KAAK,GAAGb,OAAO,CAACG,KAAK,CAACS,CAAC,CAAC;MAC9B,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,IAAI,EAAEK,CAAC,EAAE,EAAE;QAC7BJ,aAAa,CAACE,CAAC,GAAGH,IAAI,GAAGK,CAAC,CAAC,GAAGX,KAAK,CAACU,KAAK,GAAGJ,IAAI,GAAGK,CAAC,CAAC;MACvD;IACF;IACAT,kBAAkB,CAACC,aAAa,CAAC,GAAG;MAACG,IAAI;MAAEN,KAAK,EAAEO;IAAa,CAAC;EAClE;EAEA,OAAO;IACLT,UAAU,EAAEc,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,EAAEf,UAAU,EAAEI,kBAAkB;EAC9D,CAAC;AACH"}
package/dist/index.cjs CHANGED
@@ -852,17 +852,6 @@ var _PipelineFactory = class {
852
852
  }
853
853
  }
854
854
  // PRIVATE
855
- _createRenderPipeline(props) {
856
- if (!props.fs) {
857
- throw new Error("fs");
858
- }
859
- const pipeline = this.device.createRenderPipeline({
860
- ...props,
861
- vs: this.device.createShader({ stage: "vertex", source: props.vs }),
862
- fs: props.fs ? this.device.createShader({ stage: "fragment", source: props.fs }) : null
863
- });
864
- return pipeline;
865
- }
866
855
  /** Calculate a hash based on all the inputs for a render pipeline */
867
856
  _hashRenderPipeline(props) {
868
857
  const vsHash = this._getHash(props.vs);
@@ -1093,11 +1082,14 @@ var _Model = class {
1093
1082
  this.pipeline = this._updatePipeline();
1094
1083
  this.pipeline.setBindings(this.bindings);
1095
1084
  this.pipeline.setUniforms(this.uniforms);
1085
+ const { indexBuffer } = this.vertexArray;
1086
+ const indexCount = indexBuffer ? indexBuffer.byteLength / (indexBuffer.indexType === "uint32" ? 4 : 2) : void 0;
1096
1087
  this.pipeline.draw({
1097
1088
  renderPass,
1098
1089
  vertexArray: this.vertexArray,
1099
1090
  vertexCount: this.vertexCount,
1100
1091
  instanceCount: this.instanceCount,
1092
+ indexCount,
1101
1093
  transformFeedback: this.transformFeedback
1102
1094
  });
1103
1095
  } finally {
@@ -1114,7 +1106,7 @@ var _Model = class {
1114
1106
  setGeometry(geometry) {
1115
1107
  const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);
1116
1108
  this.setTopology(gpuGeometry.topology || "triangle-list");
1117
- this.bufferLayout = mergeBufferLayouts(this.bufferLayout, gpuGeometry.bufferLayout);
1109
+ this.bufferLayout = mergeBufferLayouts(gpuGeometry.bufferLayout, this.bufferLayout);
1118
1110
  if (this.vertexArray) {
1119
1111
  this._setGeometryAttributes(gpuGeometry);
1120
1112
  }
@@ -19,9 +19,8 @@ export declare class PipelineFactory {
19
19
  constructor(device: Device);
20
20
  createRenderPipeline(options: PipelineFactoryProps): RenderPipeline;
21
21
  release(pipeline: RenderPipeline): void;
22
- _createRenderPipeline(props: PipelineFactoryProps): RenderPipeline;
23
22
  /** Calculate a hash based on all the inputs for a render pipeline */
24
- _hashRenderPipeline(props: PipelineFactoryProps): string;
25
- _getHash(key: string): number;
23
+ private _hashRenderPipeline;
24
+ private _getHash;
26
25
  }
27
26
  //# sourceMappingURL=pipeline-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-factory.d.ts","sourceRoot":"","sources":["../../src/lib/pipeline-factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,eAAe,CAAC;AAErD,mDAAmD;AACnD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;IAE1E,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;GAEG;AACH,qBAAa,eAAe;IAC1B,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAIlD;IAED,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;IAErE,MAAM,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;gBAKrD,MAAM,EAAE,MAAM;IAI1B,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc;IAsBnE,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAYvC,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc;IAclE,qEAAqE;IACrE,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;IAuBxD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAM9B"}
1
+ {"version":3,"file":"pipeline-factory.d.ts","sourceRoot":"","sources":["../../src/lib/pipeline-factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,eAAe,CAAC;AAErD,mDAAmD;AACnD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;IAE1E,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;GAEG;AACH,qBAAa,eAAe;IAC1B,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAIjD;IAEF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;IAErE,MAAM,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;gBAMrD,MAAM,EAAE,MAAM;IAI1B,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc;IAsBnE,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAYvC,qEAAqE;IACrE,OAAO,CAAC,mBAAmB;IAuB3B,OAAO,CAAC,QAAQ;CAMjB"}
@@ -48,23 +48,6 @@ export class PipelineFactory {
48
48
  delete this._useCounts[hash];
49
49
  }
50
50
  }
51
- _createRenderPipeline(props) {
52
- if (!props.fs) {
53
- throw new Error('fs');
54
- }
55
- const pipeline = this.device.createRenderPipeline({
56
- ...props,
57
- vs: this.device.createShader({
58
- stage: 'vertex',
59
- source: props.vs
60
- }),
61
- fs: props.fs ? this.device.createShader({
62
- stage: 'fragment',
63
- source: props.fs
64
- }) : null
65
- });
66
- return pipeline;
67
- }
68
51
  _hashRenderPipeline(props) {
69
52
  const vsHash = this._getHash(props.vs);
70
53
  const fsHash = props.fs ? this._getHash(props.fs) : 0;
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-factory.js","names":["RenderPipeline","PipelineFactory","getDefaultPipelineFactory","device","_lumaData","defaultPipelineFactory","constructor","_hashCounter","_hashes","_useCounts","_pipelineCache","createRenderPipeline","options","props","defaultProps","hash","_hashRenderPipeline","pipeline","vs","createShader","stage","source","fs","release","destroy","_createRenderPipeline","Error","vsHash","_getHash","fsHash","varyingHash","info","type","parameterHash","JSON","stringify","parameters","bufferLayoutHash","bufferLayout","topology","key","undefined"],"sources":["../../src/lib/pipeline-factory.ts"],"sourcesContent":["// luma.gl, MIT license\nimport type {RenderPipelineProps} from '@luma.gl/core';\nimport {Device, RenderPipeline} from '@luma.gl/core';\n\n/** Todo - should be same as RenderPipelineProps */\nexport type PipelineFactoryProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Only accepts string shaders\n vs: string;\n fs: string;\n};\n\n/** \n * Efficiently creates / caches pipelines\n */\nexport class PipelineFactory {\n static defaultProps: Required<PipelineFactoryProps> = {\n ...RenderPipeline.defaultProps,\n vs: undefined!,\n fs: undefined!\n }\n\n readonly device: Device;\n\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _useCounts: Record<string, number> = {};\n private readonly _pipelineCache: Record<string, RenderPipeline> = {};\n\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n device._lumaData.defaultPipelineFactory = device._lumaData.defaultPipelineFactory || new PipelineFactory(device);\n return device._lumaData.defaultPipelineFactory as PipelineFactory;\n }\n\n constructor(device: Device) {\n this.device = device;\n }\n\n createRenderPipeline(options: PipelineFactoryProps): RenderPipeline {\n const props: Required<PipelineFactoryProps> = {...PipelineFactory.defaultProps, ...options};\n\n const hash = this._hashRenderPipeline({...props});\n\n if (!this._pipelineCache[hash]) {\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: props.vs}),\n fs: props.fs ? this.device.createShader({stage: 'fragment', source: props.fs}) : null,\n });\n\n pipeline.hash = hash;\n this._pipelineCache[hash] = pipeline;\n this._useCounts[hash] = 0;\n }\n\n this._useCounts[hash]++;\n\n return this._pipelineCache[hash];\n }\n\n release(pipeline: RenderPipeline): void {\n const hash = pipeline.hash;\n this._useCounts[hash]--;\n if (this._useCounts[hash] === 0) {\n this._pipelineCache[hash].destroy();\n delete this._pipelineCache[hash];\n delete this._useCounts[hash];\n }\n }\n\n // PRIVATE\n\n _createRenderPipeline(props: PipelineFactoryProps): RenderPipeline {\n if (!props.fs) {\n throw new Error('fs');\n }\n\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: props.vs}),\n fs: props.fs ? this.device.createShader({stage: 'fragment', source: props.fs}) : null,\n });\n\n return pipeline;\n }\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n _hashRenderPipeline(props: PipelineFactoryProps): string {\n const vsHash = this._getHash(props.vs);\n const fsHash = props.fs ? this._getHash(props.fs) : 0;\n\n // WebGL specific\n // const {varyings = [], bufferMode = {}} = props;\n // const varyingHashes = varyings.map((v) => this._getHash(v));\n const varyingHash = '-'; // `${varyingHashes.join('/')}B${bufferMode}`\n\n switch (this.device.info.type) {\n case 'webgpu':\n // On WebGPU we need to rebuild the pipeline if topology, parameters or bufferLayout change\n const parameterHash = this._getHash(JSON.stringify(props.parameters));\n const bufferLayoutHash = this._getHash(JSON.stringify(props.bufferLayout));\n // TODO - Can json.stringify() generate different strings for equivalent objects if order of params is different?\n // create a deepHash() to deduplicate?\n return `${vsHash}/${fsHash}V${varyingHash}T${props.topology}P${parameterHash}BL${bufferLayoutHash}}`;\n default:\n // WebGL is more dynamic\n return `${vsHash}/${fsHash}V${varyingHash}`;\n }\n }\n\n _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-factory.js","names":["RenderPipeline","PipelineFactory","getDefaultPipelineFactory","device","_lumaData","defaultPipelineFactory","constructor","_hashCounter","_hashes","_useCounts","_pipelineCache","createRenderPipeline","options","props","defaultProps","hash","_hashRenderPipeline","pipeline","vs","createShader","stage","source","fs","release","destroy","vsHash","_getHash","fsHash","varyingHash","info","type","parameterHash","JSON","stringify","parameters","bufferLayoutHash","bufferLayout","topology","key","undefined"],"sources":["../../src/lib/pipeline-factory.ts"],"sourcesContent":["// luma.gl, MIT license\nimport type {RenderPipelineProps} from '@luma.gl/core';\nimport {Device, RenderPipeline} from '@luma.gl/core';\n\n/** Todo - should be same as RenderPipelineProps */\nexport type PipelineFactoryProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Only accepts string shaders\n vs: string;\n fs: string;\n};\n\n/**\n * Efficiently creates / caches pipelines\n */\nexport class PipelineFactory {\n static defaultProps: Required<PipelineFactoryProps> = {\n ...RenderPipeline.defaultProps,\n vs: undefined!,\n fs: undefined!\n };\n\n readonly device: Device;\n\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _useCounts: Record<string, number> = {};\n private readonly _pipelineCache: Record<string, RenderPipeline> = {};\n\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n device._lumaData.defaultPipelineFactory =\n device._lumaData.defaultPipelineFactory || new PipelineFactory(device);\n return device._lumaData.defaultPipelineFactory as PipelineFactory;\n }\n\n constructor(device: Device) {\n this.device = device;\n }\n\n createRenderPipeline(options: PipelineFactoryProps): RenderPipeline {\n const props: Required<PipelineFactoryProps> = {...PipelineFactory.defaultProps, ...options};\n\n const hash = this._hashRenderPipeline({...props});\n\n if (!this._pipelineCache[hash]) {\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: props.vs}),\n fs: props.fs ? this.device.createShader({stage: 'fragment', source: props.fs}) : null\n });\n\n pipeline.hash = hash;\n this._pipelineCache[hash] = pipeline;\n this._useCounts[hash] = 0;\n }\n\n this._useCounts[hash]++;\n\n return this._pipelineCache[hash];\n }\n\n release(pipeline: RenderPipeline): void {\n const hash = pipeline.hash;\n this._useCounts[hash]--;\n if (this._useCounts[hash] === 0) {\n this._pipelineCache[hash].destroy();\n delete this._pipelineCache[hash];\n delete this._useCounts[hash];\n }\n }\n\n // PRIVATE\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n private _hashRenderPipeline(props: PipelineFactoryProps): string {\n const vsHash = this._getHash(props.vs);\n const fsHash = props.fs ? this._getHash(props.fs) : 0;\n\n // WebGL specific\n // const {varyings = [], bufferMode = {}} = props;\n // const varyingHashes = varyings.map((v) => this._getHash(v));\n const varyingHash = '-'; // `${varyingHashes.join('/')}B${bufferMode}`\n\n switch (this.device.info.type) {\n case 'webgpu':\n // On WebGPU we need to rebuild the pipeline if topology, parameters or bufferLayout change\n const parameterHash = this._getHash(JSON.stringify(props.parameters));\n const bufferLayoutHash = this._getHash(JSON.stringify(props.bufferLayout));\n // TODO - Can json.stringify() generate different strings for equivalent objects if order of params is different?\n // create a deepHash() to deduplicate?\n return `${vsHash}/${fsHash}V${varyingHash}T${props.topology}P${parameterHash}BL${bufferLayoutHash}}`;\n default:\n // WebGL is more dynamic\n return `${vsHash}/${fsHash}V${varyingHash}`;\n }\n }\n\n private _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n}\n"],"mappings":"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"}
@@ -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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"}
@@ -141,11 +141,16 @@ export class Model {
141
141
  this.pipeline = this._updatePipeline();
142
142
  this.pipeline.setBindings(this.bindings);
143
143
  this.pipeline.setUniforms(this.uniforms);
144
+ const {
145
+ indexBuffer
146
+ } = this.vertexArray;
147
+ const indexCount = indexBuffer ? indexBuffer.byteLength / (indexBuffer.indexType === 'uint32' ? 4 : 2) : undefined;
144
148
  this.pipeline.draw({
145
149
  renderPass,
146
150
  vertexArray: this.vertexArray,
147
151
  vertexCount: this.vertexCount,
148
152
  instanceCount: this.instanceCount,
153
+ indexCount,
149
154
  transformFeedback: this.transformFeedback
150
155
  });
151
156
  } finally {
@@ -156,7 +161,7 @@ export class Model {
156
161
  setGeometry(geometry) {
157
162
  const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);
158
163
  this.setTopology(gpuGeometry.topology || 'triangle-list');
159
- this.bufferLayout = mergeBufferLayouts(this.bufferLayout, gpuGeometry.bufferLayout);
164
+ this.bufferLayout = mergeBufferLayouts(gpuGeometry.bufferLayout, this.bufferLayout);
160
165
  if (this.vertexArray) {
161
166
  this._setGeometryAttributes(gpuGeometry);
162
167
  }
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["Buffer","RenderPipeline","UniformStore","getTypedArrayFromDataType","log","uid","deepEqual","splitUniformsAndBindings","isNumberArray","getAttributeInfosFromLayouts","ShaderAssembler","getShaderLayoutFromWGSL","ShaderInputs","makeGPUGeometry","PipelineFactory","getDebugTableForShaderLayout","debugFramebuffer","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","_drawCount","defaultProps","Object","assign","moduleMap","fromEntries","modules","map","module","name","setShaderInputs","isWebGPU","info","type","source","_this$props","shaderLayout","_this$props2","wgsl","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","warn","updateModuleSettings","seal","destroy","release","predraw","updateShaderInputs","draw","renderPass","_logDrawCallStart","_logDrawCallEnd","_logFramebuffer","gpuGeometry","setTopology","mergeBufferLayouts","attributeName","entries","find","layout","_setPipelineNeedsUpdate","setBufferLayout","setParameters","moduleName","keys","uniformBuffer","getManagedUniformBuffer","setShaderModuleProps","filter","k","uniform","getUniformValues","setTransformFeedback","buffers","_option","bufferName","buffer","getAttributeNames","includes","attributeNames","set","attributeInfo","setBuffer","location","value","setConstant","reason","createShader","stage","createRenderPipeline","logDrawTimeout","level","Date","now","group","collapsed","shaderLayoutTable","table","uniformTable","getDebugTable","attributeTable","_getAttributeDebugTable","groupEnd","debugFramebuffers","get","framebuffer","minimap","shaderType","values","_getBufferOrConstantValues","bufferDataType","indexType","Uint32Array","debugData","Uint16Array","toString","attribute","dataType","TypedArrayConstructor","typedArray","handle","undefined","defines","varyings","getDefaultShaderAssembler","layouts1","layouts2","layouts","index","findIndex","attribute2","push","shaderLanguage","shadingLanguage","shaderLanguageVersion","shadingLanguageVersion","gpu","features","_bufferLayout$attribu"],"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 {\n Device,\n Buffer,\n RenderPipeline,\n RenderPass,\n UniformStore,\n getTypedArrayFromDataType\n} from '@luma.gl/core';\nimport {log, uid, deepEqual, splitUniformsAndBindings, isNumberArray} from '@luma.gl/core';\nimport {getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler, getShaderLayoutFromWGSL} 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';\nimport {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\nimport {debugFramebuffer} from '../debug/debug-framebuffer';\n\nconst LOG_DRAW_PRIORITY = 2;\nconst LOG_DRAW_TIMEOUT = 10000;\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n source?: string;\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 source: null,\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(\n this.props.modules?.map(module => [module.name, module]) || []\n );\n this.setShaderInputs(props.shaderInputs || new ShaderInputs(moduleMap));\n\n const isWebGPU = this.device.info.type === 'webgpu';\n // TODO - hack to support unified WGSL shader\n // TODO - this is wrong, compile a single shader\n if (this.props.source) {\n if (isWebGPU) {\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.props.source);\n }\n this.props.fs = this.props.source;\n this.props.vs = this.props.source;\n }\n\n // Support WGSL shader layout introspection\n if (isWebGPU && typeof this.props.vs !== 'string') {\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.props.vs.wgsl);\n }\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n const modules =\n (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleShaders({\n platformInfo,\n ...this.props,\n modules\n });\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 log.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 this._logFramebuffer(renderPass);\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 // Filter geometry attribute so that we don't issue warnings for unused attributes\n const attributes = {...gpuGeometry.attributes};\n for (const [attributeName] of Object.entries(attributes)) {\n if (\n !this.pipeline.shaderLayout.attributes.find(layout => layout.name === attributeName) &&\n attributeName !== 'positions'\n ) {\n delete attributes[attributeName];\n }\n }\n\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setIndexBuffer(gpuGeometry.indices);\n this.setAttributes(gpuGeometry.attributes, 'ignore-unknown');\n this.setAttributes(attributes);\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(this.device, moduleName);\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n\n /**\n * Updates shader module settings (which results in uniforms being set)\n */\n setShaderModuleProps(props: Record<string, any>): void {\n const uniforms = this._getModuleUniforms(props);\n\n // Extract textures & framebuffers set by the modules\n // TODO better way to extract bindings\n const keys = Object.keys(uniforms).filter(k => {\n const uniform = uniforms[k];\n return !isNumberArray(uniform) && typeof uniform !== 'number' && typeof uniform !== 'boolean';\n });\n const bindings: Record<string, Binding> = {};\n for (const k of keys) {\n bindings[k] = uniforms[k];\n delete uniforms[k];\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 log.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>, _option?: 'ignore-unknown'): 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 => getAttributeNames(layout).includes(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 = getAttributeNames(bufferLayout);\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 && _option !== 'ignore-unknown') {\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 \n this._pipelineNeedsUpdate = false;\n\n const vs = this.device.createShader({\n id: `${this.id}-vertex`,\n stage: 'vertex',\n source: this.vs\n });\n\n const 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.pipeline = this.device.createRenderPipeline({\n ...this.props,\n bufferLayout: this.bufferLayout,\n topology: this.topology,\n parameters: this.parameters,\n vs,\n fs\n });\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 (log.level < 2 || Date.now() - this._lastLogTime < logDrawTimeout) {\n return;\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, this.id);\n\n // log.table(logLevel, attributeTable)();\n // log.table(logLevel, uniformTable)();\n log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();\n\n const uniformTable = this.shaderInputs.getDebugTable();\n // Add any global uniforms\n for (const [name, value] of Object.entries(this.uniforms)) {\n uniformTable[name] = {value};\n }\n log.table(LOG_DRAW_PRIORITY, uniformTable)();\n\n const attributeTable = this._getAttributeDebugTable();\n log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();\n log.table(LOG_DRAW_PRIORITY, attributeTable)();\n\n log.groupEnd(LOG_DRAW_PRIORITY)();\n this._logOpen = false;\n }\n }\n\n protected _drawCount = 0;\n _logFramebuffer(renderPass: RenderPass): void {\n const debugFramebuffers = log.get('framebuffer');\n this._drawCount++;\n // Update first 3 frames and then every 60 frames\n if (!debugFramebuffers || ((this._drawCount++ > 3) && (this._drawCount % 60))) {\n return;\n }\n // TODO - display framebuffer output in debug window\n const framebuffer = renderPass.props.framebuffer;\n if (framebuffer) {\n debugFramebuffer(framebuffer, {id: framebuffer.id, minimap: true});\n // log.image({logLevel: LOG_DRAW_PRIORITY, message: `${framebuffer.id} %c sup?`, image})();\n }\n }\n\n _getAttributeDebugTable(): Record<string, Record<string, unknown>> {\n const table: Record<string, Record<string, unknown>> = {};\n for (const [name, attributeInfo] of Object.entries(this._attributeInfos)) {\n table[attributeInfo.location] = {\n name,\n type: attributeInfo.shaderType,\n values: this._getBufferOrConstantValues(\n this.vertexArray.attributes[attributeInfo.location],\n attributeInfo.bufferDataType\n )\n };\n }\n if (this.vertexArray.indexBuffer) {\n const {indexBuffer} = this.vertexArray;\n const values =\n indexBuffer.indexType === 'uint32'\n ? new Uint32Array(indexBuffer.debugData)\n : new Uint16Array(indexBuffer.debugData);\n table.indices = {\n name: 'indices',\n type: indexBuffer.indexType,\n values: values.toString()\n };\n }\n return table;\n }\n\n // TODO - fix typing of luma data types\n _getBufferOrConstantValues(attribute: Buffer | TypedArray, dataType: any): string {\n const TypedArrayConstructor = getTypedArrayFromDataType(dataType);\n const typedArray =\n attribute instanceof Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;\n return typedArray.toString();\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\n/** Get attribute names from a BufferLayout */\nfunction getAttributeNames(bufferLayout: BufferLayout): string[] {\n return bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.js","names":["Buffer","RenderPipeline","UniformStore","getTypedArrayFromDataType","log","uid","deepEqual","splitUniformsAndBindings","isNumberArray","getAttributeInfosFromLayouts","ShaderAssembler","getShaderLayoutFromWGSL","ShaderInputs","makeGPUGeometry","PipelineFactory","getDebugTableForShaderLayout","debugFramebuffer","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","_drawCount","defaultProps","Object","assign","moduleMap","fromEntries","modules","map","module","name","setShaderInputs","isWebGPU","info","type","source","_this$props","shaderLayout","_this$props2","wgsl","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","warn","updateModuleSettings","seal","destroy","release","predraw","updateShaderInputs","draw","renderPass","_logDrawCallStart","indexCount","byteLength","indexType","undefined","_logDrawCallEnd","_logFramebuffer","gpuGeometry","setTopology","mergeBufferLayouts","attributeName","entries","find","layout","_setPipelineNeedsUpdate","setBufferLayout","setParameters","moduleName","keys","uniformBuffer","getManagedUniformBuffer","setShaderModuleProps","filter","k","uniform","getUniformValues","setTransformFeedback","buffers","_option","bufferName","buffer","getAttributeNames","includes","attributeNames","set","attributeInfo","setBuffer","location","value","setConstant","reason","createShader","stage","createRenderPipeline","logDrawTimeout","level","Date","now","group","collapsed","shaderLayoutTable","table","uniformTable","getDebugTable","attributeTable","_getAttributeDebugTable","groupEnd","debugFramebuffers","get","framebuffer","minimap","shaderType","values","_getBufferOrConstantValues","bufferDataType","Uint32Array","debugData","Uint16Array","toString","attribute","dataType","TypedArrayConstructor","typedArray","handle","defines","varyings","getDefaultShaderAssembler","layouts1","layouts2","layouts","index","findIndex","attribute2","push","shaderLanguage","shadingLanguage","shaderLanguageVersion","shadingLanguageVersion","gpu","features","_bufferLayout$attribu"],"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 {\n Device,\n Buffer,\n RenderPipeline,\n RenderPass,\n UniformStore,\n getTypedArrayFromDataType\n} from '@luma.gl/core';\nimport {log, uid, deepEqual, splitUniformsAndBindings, isNumberArray} from '@luma.gl/core';\nimport {getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport type {ShaderModule, PlatformInfo} from '@luma.gl/shadertools';\nimport {ShaderAssembler, getShaderLayoutFromWGSL} 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';\nimport {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\nimport {debugFramebuffer} from '../debug/debug-framebuffer';\n\nconst LOG_DRAW_PRIORITY = 2;\nconst LOG_DRAW_TIMEOUT = 10000;\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n source?: string;\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 source: null,\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(\n this.props.modules?.map(module => [module.name, module]) || []\n );\n this.setShaderInputs(props.shaderInputs || new ShaderInputs(moduleMap));\n\n const isWebGPU = this.device.info.type === 'webgpu';\n // TODO - hack to support unified WGSL shader\n // TODO - this is wrong, compile a single shader\n if (this.props.source) {\n if (isWebGPU) {\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.props.source);\n }\n this.props.fs = this.props.source;\n this.props.vs = this.props.source;\n }\n\n // Support WGSL shader layout introspection\n if (isWebGPU && typeof this.props.vs !== 'string') {\n this.props.shaderLayout ||= getShaderLayoutFromWGSL(this.props.vs.wgsl);\n }\n\n // Setup shader assembler\n const platformInfo = getPlatformInfo(device);\n\n // Extract modules from shader inputs if not supplied\n const modules =\n (this.props.modules?.length > 0 ? this.props.modules : this.shaderInputs?.getModules()) || [];\n\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleShaders({\n platformInfo,\n ...this.props,\n modules\n });\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 log.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 const {indexBuffer} = this.vertexArray;\n const indexCount = indexBuffer ? indexBuffer.byteLength / (indexBuffer.indexType === 'uint32' ? 4 : 2) : undefined;\n \n this.pipeline.draw({\n renderPass,\n vertexArray: this.vertexArray,\n vertexCount: this.vertexCount,\n instanceCount: this.instanceCount,\n indexCount,\n transformFeedback: this.transformFeedback\n });\n } finally {\n this._logDrawCallEnd();\n }\n this._logFramebuffer(renderPass);\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(gpuGeometry.bufferLayout, this.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 // Filter geometry attribute so that we don't issue warnings for unused attributes\n const attributes = {...gpuGeometry.attributes};\n for (const [attributeName] of Object.entries(attributes)) {\n if (\n !this.pipeline.shaderLayout.attributes.find(layout => layout.name === attributeName) &&\n attributeName !== 'positions'\n ) {\n delete attributes[attributeName];\n }\n }\n\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setIndexBuffer(gpuGeometry.indices);\n this.setAttributes(gpuGeometry.attributes, 'ignore-unknown');\n this.setAttributes(attributes);\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(this.device, moduleName);\n this.bindings[`${moduleName}Uniforms`] = uniformBuffer;\n }\n }\n\n /**\n * Updates shader module settings (which results in uniforms being set)\n */\n setShaderModuleProps(props: Record<string, any>): void {\n const uniforms = this._getModuleUniforms(props);\n\n // Extract textures & framebuffers set by the modules\n // TODO better way to extract bindings\n const keys = Object.keys(uniforms).filter(k => {\n const uniform = uniforms[k];\n return !isNumberArray(uniform) && typeof uniform !== 'number' && typeof uniform !== 'boolean';\n });\n const bindings: Record<string, Binding> = {};\n for (const k of keys) {\n bindings[k] = uniforms[k];\n delete uniforms[k];\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 log.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>, _option?: 'ignore-unknown'): 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 => getAttributeNames(layout).includes(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 = getAttributeNames(bufferLayout);\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 && _option !== 'ignore-unknown') {\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 \n this._pipelineNeedsUpdate = false;\n\n const vs = this.device.createShader({\n id: `${this.id}-vertex`,\n stage: 'vertex',\n source: this.vs\n });\n\n const 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.pipeline = this.device.createRenderPipeline({\n ...this.props,\n bufferLayout: this.bufferLayout,\n topology: this.topology,\n parameters: this.parameters,\n vs,\n fs\n });\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 (log.level < 2 || Date.now() - this._lastLogTime < logDrawTimeout) {\n return;\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, this.id);\n\n // log.table(logLevel, attributeTable)();\n // log.table(logLevel, uniformTable)();\n log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();\n\n const uniformTable = this.shaderInputs.getDebugTable();\n // Add any global uniforms\n for (const [name, value] of Object.entries(this.uniforms)) {\n uniformTable[name] = {value};\n }\n log.table(LOG_DRAW_PRIORITY, uniformTable)();\n\n const attributeTable = this._getAttributeDebugTable();\n log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();\n log.table(LOG_DRAW_PRIORITY, attributeTable)();\n\n log.groupEnd(LOG_DRAW_PRIORITY)();\n this._logOpen = false;\n }\n }\n\n protected _drawCount = 0;\n _logFramebuffer(renderPass: RenderPass): void {\n const debugFramebuffers = log.get('framebuffer');\n this._drawCount++;\n // Update first 3 frames and then every 60 frames\n if (!debugFramebuffers || ((this._drawCount++ > 3) && (this._drawCount % 60))) {\n return;\n }\n // TODO - display framebuffer output in debug window\n const framebuffer = renderPass.props.framebuffer;\n if (framebuffer) {\n debugFramebuffer(framebuffer, {id: framebuffer.id, minimap: true});\n // log.image({logLevel: LOG_DRAW_PRIORITY, message: `${framebuffer.id} %c sup?`, image})();\n }\n }\n\n _getAttributeDebugTable(): Record<string, Record<string, unknown>> {\n const table: Record<string, Record<string, unknown>> = {};\n for (const [name, attributeInfo] of Object.entries(this._attributeInfos)) {\n table[attributeInfo.location] = {\n name,\n type: attributeInfo.shaderType,\n values: this._getBufferOrConstantValues(\n this.vertexArray.attributes[attributeInfo.location],\n attributeInfo.bufferDataType\n )\n };\n }\n if (this.vertexArray.indexBuffer) {\n const {indexBuffer} = this.vertexArray;\n const values =\n indexBuffer.indexType === 'uint32'\n ? new Uint32Array(indexBuffer.debugData)\n : new Uint16Array(indexBuffer.debugData);\n table.indices = {\n name: 'indices',\n type: indexBuffer.indexType,\n values: values.toString()\n };\n }\n return table;\n }\n\n // TODO - fix typing of luma data types\n _getBufferOrConstantValues(attribute: Buffer | TypedArray, dataType: any): string {\n const TypedArrayConstructor = getTypedArrayFromDataType(dataType);\n const typedArray =\n attribute instanceof Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;\n return typedArray.toString();\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\n/** Get attribute names from a BufferLayout */\nfunction getAttributeNames(bufferLayout: BufferLayout): string[] {\n return bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n}\n"],"mappings":"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"}