@luma.gl/engine 9.0.0-alpha.53 → 9.0.0-alpha.54

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
@@ -1133,14 +1133,20 @@ var __exports__ = (() => {
1133
1133
  this.usage = props.usage || 0;
1134
1134
  this.indexType = deducedProps.indexType;
1135
1135
  }
1136
- write(data, byteOffset) {
1136
+ readSyncWebGL2(byteOffset, byteLength) {
1137
1137
  throw new Error("not implemented");
1138
1138
  }
1139
- readAsync(byteOffset, byteLength) {
1140
- throw new Error("not implemented");
1141
- }
1142
- getData() {
1143
- throw new Error("not implemented");
1139
+ debugData = new ArrayBuffer(0);
1140
+ _setDebugData(data, byteOffset, byteLength) {
1141
+ const buffer = ArrayBuffer.isView(data) ? data.buffer : data;
1142
+ const debugDataLength = Math.min(data ? data.byteLength : byteLength, _Buffer.DEBUG_DATA_MAX_LENGTH);
1143
+ if (data === null) {
1144
+ this.debugData = new ArrayBuffer(debugDataLength);
1145
+ } else if (byteOffset === 0 && byteLength === data.byteLength) {
1146
+ this.debugData = buffer.slice(0, debugDataLength);
1147
+ } else {
1148
+ this.debugData = buffer.slice(byteOffset, byteOffset + debugDataLength);
1149
+ }
1144
1150
  }
1145
1151
  };
1146
1152
  var Buffer2 = _Buffer;
@@ -1163,6 +1169,7 @@ var __exports__ = (() => {
1163
1169
  __publicField(Buffer2, "STORAGE", 128);
1164
1170
  __publicField(Buffer2, "INDIRECT", 256);
1165
1171
  __publicField(Buffer2, "QUERY_RESOLVE", 512);
1172
+ __publicField(Buffer2, "DEBUG_DATA_MAX_LENGTH", 32);
1166
1173
 
1167
1174
  // ../core/src/adapter/device.ts
1168
1175
  var _Device = class {
@@ -1930,6 +1937,30 @@ var __exports__ = (() => {
1930
1937
  throw new Error(type.constructor.name);
1931
1938
  }
1932
1939
  }
1940
+ function getTypedArrayFromDataType(dataType) {
1941
+ switch (dataType) {
1942
+ case "float32":
1943
+ return Float32Array;
1944
+ case "uint32":
1945
+ return Uint32Array;
1946
+ case "sint32":
1947
+ return Int32Array;
1948
+ case "uint16":
1949
+ case "unorm16":
1950
+ return Uint16Array;
1951
+ case "sint16":
1952
+ case "snorm16":
1953
+ return Int16Array;
1954
+ case "uint8":
1955
+ case "unorm8":
1956
+ return Uint8Array;
1957
+ case "sint8":
1958
+ case "snorm8":
1959
+ return Int8Array;
1960
+ default:
1961
+ throw new Error(dataType);
1962
+ }
1963
+ }
1933
1964
  function getVertexFormatFromAttribute(typedArray, size, normalized) {
1934
1965
  if (!size || size > 4) {
1935
1966
  throw new Error(`size ${size}`);
@@ -5817,12 +5848,12 @@ void main() {
5817
5848
  log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)();
5818
5849
  }
5819
5850
  for (const [bufferName, buffer] of Object.entries(buffers)) {
5820
- const bufferLayout = this.bufferLayout.find((layout) => layout.name === bufferName);
5851
+ const bufferLayout = this.bufferLayout.find((layout) => getAttributeNames(layout).includes(bufferName));
5821
5852
  if (!bufferLayout) {
5822
5853
  log.warn(`Model(${this.id}): Missing layout for buffer "${bufferName}".`)();
5823
5854
  continue;
5824
5855
  }
5825
- const attributeNames = bufferLayout.attributes ? bufferLayout.attributes?.map((layout) => layout.attribute) : [bufferLayout.name];
5856
+ const attributeNames = getAttributeNames(bufferLayout);
5826
5857
  let set = false;
5827
5858
  for (const attributeName of attributeNames) {
5828
5859
  const attributeInfo = this._attributeInfos[attributeName];
@@ -5899,10 +5930,40 @@ void main() {
5899
5930
  };
5900
5931
  }
5901
5932
  log.table(LOG_DRAW_PRIORITY, uniformTable)();
5933
+ const attributeTable = this._getAttributeDebugTable();
5934
+ log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();
5935
+ log.table(LOG_DRAW_PRIORITY, attributeTable)();
5902
5936
  log.groupEnd(LOG_DRAW_PRIORITY)();
5903
5937
  this._logOpen = false;
5904
5938
  }
5905
5939
  }
5940
+ _getAttributeDebugTable() {
5941
+ const table = {};
5942
+ for (const [name2, attributeInfo] of Object.entries(this._attributeInfos)) {
5943
+ table[attributeInfo.location] = {
5944
+ name: name2,
5945
+ type: attributeInfo.shaderType,
5946
+ values: this._getBufferOrConstantValues(this.vertexArray.attributes[attributeInfo.location], attributeInfo.bufferDataType)
5947
+ };
5948
+ }
5949
+ if (this.vertexArray.indexBuffer) {
5950
+ const {
5951
+ indexBuffer
5952
+ } = this.vertexArray;
5953
+ const values = indexBuffer.indexType === "uint32" ? new Uint32Array(indexBuffer.debugData) : new Uint16Array(indexBuffer.debugData);
5954
+ table.indices = {
5955
+ name: "indices",
5956
+ type: indexBuffer.indexType,
5957
+ values: values.toString()
5958
+ };
5959
+ }
5960
+ return table;
5961
+ }
5962
+ _getBufferOrConstantValues(attribute, dataType) {
5963
+ const TypedArrayConstructor = getTypedArrayFromDataType(dataType);
5964
+ const typedArray = attribute instanceof Buffer2 ? new TypedArrayConstructor(attribute.debugData) : attribute;
5965
+ return typedArray.toString();
5966
+ }
5906
5967
  };
5907
5968
  var Model = _Model;
5908
5969
  __publicField(Model, "defaultProps", {
@@ -5946,6 +6007,9 @@ void main() {
5946
6007
  features: device.features
5947
6008
  };
5948
6009
  }
6010
+ function getAttributeNames(bufferLayout) {
6011
+ return bufferLayout.attributes ? bufferLayout.attributes?.map((layout) => layout.attribute) : [bufferLayout.name];
6012
+ }
5949
6013
 
5950
6014
  // src/transform/buffer-transform.ts
5951
6015
  var BufferTransform = class {
package/dist/index.cjs CHANGED
@@ -959,11 +959,17 @@ var _Model = class {
959
959
  this.id = props.id || (0, import_core8.uid)("model");
960
960
  this.device = device;
961
961
  Object.assign(this.userData, props.userData);
962
- const moduleMap = Object.fromEntries(((_a = this.props.modules) == null ? void 0 : _a.map((module2) => [module2.name, module2])) || []);
962
+ const moduleMap = Object.fromEntries(
963
+ ((_a = this.props.modules) == null ? void 0 : _a.map((module2) => [module2.name, module2])) || []
964
+ );
963
965
  this.setShaderInputs(props.shaderInputs || new ShaderInputs(moduleMap));
964
966
  const platformInfo = getPlatformInfo(device);
965
967
  const modules = (((_b = this.props.modules) == null ? void 0 : _b.length) > 0 ? this.props.modules : (_c = this.shaderInputs) == null ? void 0 : _c.getModules()) || [];
966
- const { vs, fs, getUniforms } = this.props.shaderAssembler.assembleShaders({ platformInfo, ...this.props, modules });
968
+ const { vs, fs, getUniforms } = this.props.shaderAssembler.assembleShaders({
969
+ platformInfo,
970
+ ...this.props,
971
+ modules
972
+ });
967
973
  this.vs = vs;
968
974
  this.fs = fs;
969
975
  this._getModuleUniforms = getUniforms;
@@ -1122,10 +1128,7 @@ var _Model = class {
1122
1128
  this.shaderInputs = shaderInputs;
1123
1129
  this._uniformStore = new import_core7.UniformStore(this.shaderInputs.modules);
1124
1130
  for (const moduleName of Object.keys(this.shaderInputs.modules)) {
1125
- const uniformBuffer = this._uniformStore.getManagedUniformBuffer(
1126
- this.device,
1127
- moduleName
1128
- );
1131
+ const uniformBuffer = this._uniformStore.getManagedUniformBuffer(this.device, moduleName);
1129
1132
  this.bindings[`${moduleName}Uniforms`] = uniformBuffer;
1130
1133
  }
1131
1134
  }
@@ -1175,19 +1178,18 @@ var _Model = class {
1175
1178
  * @note Overrides any attributes previously set with the same name
1176
1179
  */
1177
1180
  setAttributes(buffers, _option) {
1178
- var _a;
1179
1181
  if (buffers.indices) {
1180
1182
  import_core8.log.warn(
1181
1183
  `Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`
1182
1184
  )();
1183
1185
  }
1184
1186
  for (const [bufferName, buffer] of Object.entries(buffers)) {
1185
- const bufferLayout = this.bufferLayout.find((layout) => layout.name === bufferName);
1187
+ const bufferLayout = this.bufferLayout.find((layout) => getAttributeNames(layout).includes(bufferName));
1186
1188
  if (!bufferLayout) {
1187
1189
  import_core8.log.warn(`Model(${this.id}): Missing layout for buffer "${bufferName}".`)();
1188
1190
  continue;
1189
1191
  }
1190
- const attributeNames = bufferLayout.attributes ? (_a = bufferLayout.attributes) == null ? void 0 : _a.map((layout) => layout.attribute) : [bufferLayout.name];
1192
+ const attributeNames = getAttributeNames(bufferLayout);
1191
1193
  let set = false;
1192
1194
  for (const attributeName of attributeNames) {
1193
1195
  const attributeInfo = this._attributeInfos[attributeName];
@@ -1275,10 +1277,42 @@ var _Model = class {
1275
1277
  uniformTable[name] = { value };
1276
1278
  }
1277
1279
  import_core8.log.table(LOG_DRAW_PRIORITY, uniformTable)();
1280
+ const attributeTable = this._getAttributeDebugTable();
1281
+ import_core8.log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();
1282
+ import_core8.log.table(LOG_DRAW_PRIORITY, attributeTable)();
1278
1283
  import_core8.log.groupEnd(LOG_DRAW_PRIORITY)();
1279
1284
  this._logOpen = false;
1280
1285
  }
1281
1286
  }
1287
+ _getAttributeDebugTable() {
1288
+ const table = {};
1289
+ for (const [name, attributeInfo] of Object.entries(this._attributeInfos)) {
1290
+ table[attributeInfo.location] = {
1291
+ name,
1292
+ type: attributeInfo.shaderType,
1293
+ values: this._getBufferOrConstantValues(
1294
+ this.vertexArray.attributes[attributeInfo.location],
1295
+ attributeInfo.bufferDataType
1296
+ )
1297
+ };
1298
+ }
1299
+ if (this.vertexArray.indexBuffer) {
1300
+ const { indexBuffer } = this.vertexArray;
1301
+ const values = indexBuffer.indexType === "uint32" ? new Uint32Array(indexBuffer.debugData) : new Uint16Array(indexBuffer.debugData);
1302
+ table.indices = {
1303
+ name: "indices",
1304
+ type: indexBuffer.indexType,
1305
+ values: values.toString()
1306
+ };
1307
+ }
1308
+ return table;
1309
+ }
1310
+ // TODO - fix typing of luma data types
1311
+ _getBufferOrConstantValues(attribute, dataType) {
1312
+ const TypedArrayConstructor = (0, import_core7.getTypedArrayFromDataType)(dataType);
1313
+ const typedArray = attribute instanceof import_core7.Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;
1314
+ return typedArray.toString();
1315
+ }
1282
1316
  };
1283
1317
  var Model = _Model;
1284
1318
  __publicField(Model, "defaultProps", {
@@ -1322,6 +1356,10 @@ function getPlatformInfo(device) {
1322
1356
  features: device.features
1323
1357
  };
1324
1358
  }
1359
+ function getAttributeNames(bufferLayout) {
1360
+ var _a;
1361
+ return bufferLayout.attributes ? (_a = bufferLayout.attributes) == null ? void 0 : _a.map((layout) => layout.attribute) : [bufferLayout.name];
1362
+ }
1325
1363
 
1326
1364
  // src/transform/buffer-transform.ts
1327
1365
  var import_core10 = require("@luma.gl/core");
@@ -191,6 +191,8 @@ export declare class Model {
191
191
  _logOpen: boolean;
192
192
  _logDrawCallStart(): void;
193
193
  _logDrawCallEnd(): void;
194
+ _getAttributeDebugTable(): Record<string, Record<string, unknown>>;
195
+ _getBufferOrConstantValues(attribute: Buffer | TypedArray, dataType: any): string;
194
196
  }
195
197
  /** Create a shadertools platform info from the Device */
196
198
  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,4 +1,4 @@
1
- import { RenderPipeline, UniformStore } from '@luma.gl/core';
1
+ import { Buffer, RenderPipeline, UniformStore, getTypedArrayFromDataType } from '@luma.gl/core';
2
2
  import { log, uid, deepEqual, splitUniformsAndBindings } from '@luma.gl/core';
3
3
  import { getAttributeInfosFromLayouts } from '@luma.gl/core';
4
4
  import { ShaderAssembler } from '@luma.gl/shadertools';
@@ -218,13 +218,12 @@ export class Model {
218
218
  log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)();
219
219
  }
220
220
  for (const [bufferName, buffer] of Object.entries(buffers)) {
221
- var _bufferLayout$attribu;
222
- const bufferLayout = this.bufferLayout.find(layout => layout.name === bufferName);
221
+ const bufferLayout = this.bufferLayout.find(layout => getAttributeNames(layout).includes(bufferName));
223
222
  if (!bufferLayout) {
224
223
  log.warn(`Model(${this.id}): Missing layout for buffer "${bufferName}".`)();
225
224
  continue;
226
225
  }
227
- const attributeNames = bufferLayout.attributes ? (_bufferLayout$attribu = bufferLayout.attributes) === null || _bufferLayout$attribu === void 0 ? void 0 : _bufferLayout$attribu.map(layout => layout.attribute) : [bufferLayout.name];
226
+ const attributeNames = getAttributeNames(bufferLayout);
228
227
  let set = false;
229
228
  for (const attributeName of attributeNames) {
230
229
  const attributeInfo = this._attributeInfos[attributeName];
@@ -299,10 +298,40 @@ export class Model {
299
298
  };
300
299
  }
301
300
  log.table(LOG_DRAW_PRIORITY, uniformTable)();
301
+ const attributeTable = this._getAttributeDebugTable();
302
+ log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();
303
+ log.table(LOG_DRAW_PRIORITY, attributeTable)();
302
304
  log.groupEnd(LOG_DRAW_PRIORITY)();
303
305
  this._logOpen = false;
304
306
  }
305
307
  }
308
+ _getAttributeDebugTable() {
309
+ const table = {};
310
+ for (const [name, attributeInfo] of Object.entries(this._attributeInfos)) {
311
+ table[attributeInfo.location] = {
312
+ name,
313
+ type: attributeInfo.shaderType,
314
+ values: this._getBufferOrConstantValues(this.vertexArray.attributes[attributeInfo.location], attributeInfo.bufferDataType)
315
+ };
316
+ }
317
+ if (this.vertexArray.indexBuffer) {
318
+ const {
319
+ indexBuffer
320
+ } = this.vertexArray;
321
+ const values = indexBuffer.indexType === 'uint32' ? new Uint32Array(indexBuffer.debugData) : new Uint16Array(indexBuffer.debugData);
322
+ table.indices = {
323
+ name: 'indices',
324
+ type: indexBuffer.indexType,
325
+ values: values.toString()
326
+ };
327
+ }
328
+ return table;
329
+ }
330
+ _getBufferOrConstantValues(attribute, dataType) {
331
+ const TypedArrayConstructor = getTypedArrayFromDataType(dataType);
332
+ const typedArray = attribute instanceof Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;
333
+ return typedArray.toString();
334
+ }
306
335
  }
307
336
  Model.defaultProps = {
308
337
  ...RenderPipeline.defaultProps,
@@ -345,4 +374,8 @@ export function getPlatformInfo(device) {
345
374
  features: device.features
346
375
  };
347
376
  }
377
+ function getAttributeNames(bufferLayout) {
378
+ var _bufferLayout$attribu;
379
+ return bufferLayout.attributes ? (_bufferLayout$attribu = bufferLayout.attributes) === null || _bufferLayout$attribu === void 0 ? void 0 : _bufferLayout$attribu.map(layout => layout.attribute) : [bufferLayout.name];
380
+ }
348
381
  //# sourceMappingURL=model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["RenderPipeline","UniformStore","log","uid","deepEqual","splitUniformsAndBindings","getAttributeInfosFromLayouts","ShaderAssembler","ShaderInputs","makeGPUGeometry","PipelineFactory","getDebugTableForShaderLayout","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","warn","updateModuleSettings","seal","destroy","release","predraw","updateShaderInputs","draw","renderPass","_logDrawCallStart","_logDrawCallEnd","gpuGeometry","setTopology","mergeBufferLayouts","_setPipelineNeedsUpdate","setBufferLayout","setParameters","moduleName","keys","uniformBuffer","getManagedUniformBuffer","getUniformValues","setTransformFeedback","buffers","_option","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","uniformTable","getDebugTable","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} 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';\nimport {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\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 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 }\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, 'ignore-unknown');\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 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 => 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 && _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 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 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 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
+ {"version":3,"file":"model.js","names":["Buffer","RenderPipeline","UniformStore","getTypedArrayFromDataType","log","uid","deepEqual","splitUniformsAndBindings","getAttributeInfosFromLayouts","ShaderAssembler","ShaderInputs","makeGPUGeometry","PipelineFactory","getDebugTableForShaderLayout","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","warn","updateModuleSettings","seal","destroy","release","predraw","updateShaderInputs","draw","renderPass","_logDrawCallStart","_logDrawCallEnd","gpuGeometry","setTopology","mergeBufferLayouts","_setPipelineNeedsUpdate","setBufferLayout","setParameters","moduleName","keys","uniformBuffer","getManagedUniformBuffer","getUniformValues","setTransformFeedback","buffers","_option","bufferName","buffer","entries","find","layout","getAttributeNames","includes","attributeNames","set","attributeName","attributeInfo","setBuffer","location","value","setConstant","reason","createRenderPipeline","createShader","stage","source","shaderLayout","logDrawTimeout","level","Date","now","undefined","group","collapsed","shaderLayoutTable","table","uniformTable","getDebugTable","attributeTable","_getAttributeDebugTable","groupEnd","type","shaderType","values","_getBufferOrConstantValues","bufferDataType","indexType","Uint32Array","debugData","Uint16Array","toString","attribute","dataType","TypedArrayConstructor","typedArray","handle","defines","varyings","getDefaultShaderAssembler","layouts1","layouts2","layouts","index","findIndex","attribute2","push","info","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 {\n TypedArray,\n RenderPipelineProps,\n RenderPipelineParameters\n} 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} 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';\nimport {getDebugTableForShaderLayout} from '../debug/debug-shader-layout';\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(\n this.props.modules?.map(module => [module.name, module]) || []\n );\n this.setShaderInputs(props.shaderInputs || new ShaderInputs(moduleMap));\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 }\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, 'ignore-unknown');\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(this.device, moduleName);\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 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 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 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 _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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"}