@luma.gl/engine 9.0.0-alpha.36 → 9.0.0-alpha.38
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 +20 -8
- package/dist/index.cjs +23 -18
- package/dist/model/model.d.ts +1 -0
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +13 -8
- package/dist/model/model.js.map +1 -1
- package/dist.min.js +27 -27
- package/package.json +5 -5
- package/src/.DS_Store +0 -0
- package/src/model/model.ts +22 -10
package/dist/dist.dev.js
CHANGED
|
@@ -1317,6 +1317,13 @@ var __exports__ = (() => {
|
|
|
1317
1317
|
}
|
|
1318
1318
|
// Canvas context
|
|
1319
1319
|
/** Default / primary canvas context. Can be null as WebGPU devices can be created without a CanvasContext */
|
|
1320
|
+
/** Returns the default / primary canvas context. Throws an error if no canvas context is available (a WebGPU compute device) */
|
|
1321
|
+
getCanvasContext() {
|
|
1322
|
+
if (!this.canvasContext) {
|
|
1323
|
+
throw new Error("Device has no CanvasContext");
|
|
1324
|
+
}
|
|
1325
|
+
return this.canvasContext;
|
|
1326
|
+
}
|
|
1320
1327
|
/** Creates a new CanvasContext (WebGPU only) */
|
|
1321
1328
|
/** Call after rendering a frame (necessary e.g. on WebGL OffscreenCanvas) */
|
|
1322
1329
|
// Resource creation
|
|
@@ -5475,6 +5482,7 @@ ${stage === "fragment" ? FRAGMENT_SHADER_PROLOGUE : ""}
|
|
|
5475
5482
|
* */
|
|
5476
5483
|
_pipelineNeedsUpdate = "newly created";
|
|
5477
5484
|
_attributeInfos = {};
|
|
5485
|
+
_gpuGeometry = null;
|
|
5478
5486
|
constructor(device, props) {
|
|
5479
5487
|
this.props = {
|
|
5480
5488
|
..._Model.defaultProps,
|
|
@@ -5503,17 +5511,16 @@ ${stage === "fragment" ? FRAGMENT_SHADER_PROLOGUE : ""}
|
|
|
5503
5511
|
this.topology = this.props.topology;
|
|
5504
5512
|
this.bufferLayout = this.props.bufferLayout;
|
|
5505
5513
|
this.parameters = this.props.parameters;
|
|
5506
|
-
let gpuGeometry;
|
|
5507
5514
|
if (props.geometry) {
|
|
5508
|
-
|
|
5515
|
+
this._gpuGeometry = this.setGeometry(props.geometry);
|
|
5509
5516
|
}
|
|
5510
5517
|
this.pipelineFactory = props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);
|
|
5511
5518
|
this.pipeline = this._updatePipeline();
|
|
5512
5519
|
this.vertexArray = device.createVertexArray({
|
|
5513
5520
|
renderPipeline: this.pipeline
|
|
5514
5521
|
});
|
|
5515
|
-
if (
|
|
5516
|
-
this._setGeometryAttributes(
|
|
5522
|
+
if (this._gpuGeometry) {
|
|
5523
|
+
this._setGeometryAttributes(this._gpuGeometry);
|
|
5517
5524
|
}
|
|
5518
5525
|
if (props.vertexCount) {
|
|
5519
5526
|
this.setVertexCount(props.vertexCount);
|
|
@@ -5600,9 +5607,14 @@ ${stage === "fragment" ? FRAGMENT_SHADER_PROLOGUE : ""}
|
|
|
5600
5607
|
* @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU
|
|
5601
5608
|
*/
|
|
5602
5609
|
setBufferLayout(bufferLayout) {
|
|
5603
|
-
|
|
5604
|
-
|
|
5605
|
-
|
|
5610
|
+
this.bufferLayout = this._gpuGeometry ? mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout) : bufferLayout;
|
|
5611
|
+
this._setPipelineNeedsUpdate("bufferLayout");
|
|
5612
|
+
this.pipeline = this._updatePipeline();
|
|
5613
|
+
this.vertexArray = this.device.createVertexArray({
|
|
5614
|
+
renderPipeline: this.pipeline
|
|
5615
|
+
});
|
|
5616
|
+
if (this._gpuGeometry) {
|
|
5617
|
+
this._setGeometryAttributes(this._gpuGeometry);
|
|
5606
5618
|
}
|
|
5607
5619
|
}
|
|
5608
5620
|
/**
|
|
@@ -5708,7 +5720,7 @@ ${stage === "fragment" ? FRAGMENT_SHADER_PROLOGUE : ""}
|
|
|
5708
5720
|
if (attributeInfo) {
|
|
5709
5721
|
this.vertexArray.setConstant(attributeInfo.location, value);
|
|
5710
5722
|
} else {
|
|
5711
|
-
log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${
|
|
5723
|
+
log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${attributeName}"`)();
|
|
5712
5724
|
}
|
|
5713
5725
|
}
|
|
5714
5726
|
}
|
package/dist/index.cjs
CHANGED
|
@@ -21,8 +21,8 @@ var __spreadValues = (a, b) => {
|
|
|
21
21
|
};
|
|
22
22
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
23
23
|
var __export = (target, all) => {
|
|
24
|
-
for (var
|
|
25
|
-
__defProp(target,
|
|
24
|
+
for (var name in all)
|
|
25
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
26
26
|
};
|
|
27
27
|
var __copyProps = (to, from, except, desc) => {
|
|
28
28
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
@@ -721,20 +721,20 @@ function getAttributeBuffersFromGeometry(device, geometry) {
|
|
|
721
721
|
const bufferLayout = [];
|
|
722
722
|
const attributes = {};
|
|
723
723
|
for (const [attributeName, attribute] of Object.entries(geometry.attributes)) {
|
|
724
|
-
let
|
|
724
|
+
let name = attributeName;
|
|
725
725
|
switch (attributeName) {
|
|
726
726
|
case "POSITION":
|
|
727
|
-
|
|
727
|
+
name = "positions";
|
|
728
728
|
break;
|
|
729
729
|
case "NORMAL":
|
|
730
|
-
|
|
730
|
+
name = "normals";
|
|
731
731
|
break;
|
|
732
732
|
case "TEXCOORD_0":
|
|
733
|
-
|
|
733
|
+
name = "texCoords";
|
|
734
734
|
break;
|
|
735
735
|
}
|
|
736
|
-
attributes[
|
|
737
|
-
bufferLayout.push({ name
|
|
736
|
+
attributes[name] = device.createBuffer({ data: attribute.value, id: `${attributeName}-buffer` });
|
|
737
|
+
bufferLayout.push({ name, format: `float32x${attribute.size}` });
|
|
738
738
|
}
|
|
739
739
|
const vertexCount = geometry._calculateVertexCount(geometry.attributes, geometry.indices);
|
|
740
740
|
return { attributes, bufferLayout, vertexCount };
|
|
@@ -834,6 +834,7 @@ var _Model = class {
|
|
|
834
834
|
this.uniforms = {};
|
|
835
835
|
this._pipelineNeedsUpdate = "newly created";
|
|
836
836
|
this._attributeInfos = {};
|
|
837
|
+
this._gpuGeometry = null;
|
|
837
838
|
this.props = __spreadValues(__spreadValues({}, _Model.defaultProps), props);
|
|
838
839
|
props = this.props;
|
|
839
840
|
this.id = props.id || (0, import_core6.uid)("model");
|
|
@@ -857,17 +858,16 @@ var _Model = class {
|
|
|
857
858
|
this.topology = this.props.topology;
|
|
858
859
|
this.bufferLayout = this.props.bufferLayout;
|
|
859
860
|
this.parameters = this.props.parameters;
|
|
860
|
-
let gpuGeometry;
|
|
861
861
|
if (props.geometry) {
|
|
862
|
-
|
|
862
|
+
this._gpuGeometry = this.setGeometry(props.geometry);
|
|
863
863
|
}
|
|
864
864
|
this.pipelineFactory = props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);
|
|
865
865
|
this.pipeline = this._updatePipeline();
|
|
866
866
|
this.vertexArray = device.createVertexArray({
|
|
867
867
|
renderPipeline: this.pipeline
|
|
868
868
|
});
|
|
869
|
-
if (
|
|
870
|
-
this._setGeometryAttributes(
|
|
869
|
+
if (this._gpuGeometry) {
|
|
870
|
+
this._setGeometryAttributes(this._gpuGeometry);
|
|
871
871
|
}
|
|
872
872
|
if (props.vertexCount) {
|
|
873
873
|
this.setVertexCount(props.vertexCount);
|
|
@@ -954,9 +954,14 @@ var _Model = class {
|
|
|
954
954
|
* @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU
|
|
955
955
|
*/
|
|
956
956
|
setBufferLayout(bufferLayout) {
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
957
|
+
this.bufferLayout = this._gpuGeometry ? mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout) : bufferLayout;
|
|
958
|
+
this._setPipelineNeedsUpdate("bufferLayout");
|
|
959
|
+
this.pipeline = this._updatePipeline();
|
|
960
|
+
this.vertexArray = this.device.createVertexArray({
|
|
961
|
+
renderPipeline: this.pipeline
|
|
962
|
+
});
|
|
963
|
+
if (this._gpuGeometry) {
|
|
964
|
+
this._setGeometryAttributes(this._gpuGeometry);
|
|
960
965
|
}
|
|
961
966
|
}
|
|
962
967
|
/**
|
|
@@ -1067,7 +1072,7 @@ var _Model = class {
|
|
|
1067
1072
|
if (attributeInfo) {
|
|
1068
1073
|
this.vertexArray.setConstant(attributeInfo.location, value);
|
|
1069
1074
|
} else {
|
|
1070
|
-
import_core6.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${
|
|
1075
|
+
import_core6.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${attributeName}"`)();
|
|
1071
1076
|
}
|
|
1072
1077
|
}
|
|
1073
1078
|
}
|
|
@@ -1199,8 +1204,8 @@ var ShaderModuleUniforms = class {
|
|
|
1199
1204
|
this.shaderModule = props.shaderModule;
|
|
1200
1205
|
this.useUniformBuffers = this.device.info.type !== "webgl";
|
|
1201
1206
|
const uniformTypes = {};
|
|
1202
|
-
for (const [
|
|
1203
|
-
uniformTypes[
|
|
1207
|
+
for (const [name, { format }] of Object.entries(props.shaderModule.uniforms)) {
|
|
1208
|
+
uniformTypes[name] = format;
|
|
1204
1209
|
}
|
|
1205
1210
|
this.uniformBufferLayout = new import_core9.UniformBufferLayout(uniformTypes);
|
|
1206
1211
|
if (this.useUniformBuffers) {
|
package/dist/model/model.d.ts
CHANGED
|
@@ -87,6 +87,7 @@ export declare class Model {
|
|
|
87
87
|
vertexArray: VertexArray;
|
|
88
88
|
_pipelineNeedsUpdate: string | false;
|
|
89
89
|
_attributeInfos: Record<string, AttributeInfo>;
|
|
90
|
+
_gpuGeometry: GPUGeometry | null;
|
|
90
91
|
private _getModuleUniforms;
|
|
91
92
|
private props;
|
|
92
93
|
constructor(device: Device, props: ModelProps);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAE9F,OAAO,KAAK,EAAC,YAAY,EAAe,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAC,WAAW,EAAkB,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;IAEhE,EAAE,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACnD,EAAE,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACnD,uDAAuD;IACvD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAGpD,qGAAqG;IACrG,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,6EAA6E;IAC7E,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,kDAAkD;IAClD,UAAU,CAAC,EAAE,wBAAwB,CAAC;IAEtC,eAAe;IACf,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,IAAI,CAAC;IAEzC,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ;IACR,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEhD,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,KAAK;IAChB,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,CAiBvC;IAEF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,CAAM;IAIpC,4DAA4D;IAC5D,UAAU,EAAE,wBAAwB,CAAC;IAErC,6BAA6B;IAC7B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,oBAAoB;IACpB,YAAY,EAAE,YAAY,EAAE,CAAC;IAI7B,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAK;IAE1B,mBAAmB;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,+BAA+B;IAC/B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAC9C,iCAAiC;IACjC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAM;IACpD,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACvC,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM;IAE5C,gFAAgF;IAChF,QAAQ,EAAE,cAAc,CAAC;IAEzB;;;;SAIK;IACL,WAAW,EAAE,WAAW,CAAC;IAEzB,oBAAoB,EAAE,MAAM,GAAG,KAAK,CAAmB;IACvD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAM;IACpD,OAAO,CAAC,kBAAkB,CAAuE;IACjG,OAAO,CAAC,KAAK,CAAuB;gBAExB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"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"}
|
package/dist/model/model.js
CHANGED
|
@@ -25,6 +25,7 @@ export class Model {
|
|
|
25
25
|
this.vertexArray = void 0;
|
|
26
26
|
this._pipelineNeedsUpdate = 'newly created';
|
|
27
27
|
this._attributeInfos = {};
|
|
28
|
+
this._gpuGeometry = null;
|
|
28
29
|
this._getModuleUniforms = void 0;
|
|
29
30
|
this.props = void 0;
|
|
30
31
|
this.props = {
|
|
@@ -54,17 +55,16 @@ export class Model {
|
|
|
54
55
|
this.topology = this.props.topology;
|
|
55
56
|
this.bufferLayout = this.props.bufferLayout;
|
|
56
57
|
this.parameters = this.props.parameters;
|
|
57
|
-
let gpuGeometry;
|
|
58
58
|
if (props.geometry) {
|
|
59
|
-
|
|
59
|
+
this._gpuGeometry = this.setGeometry(props.geometry);
|
|
60
60
|
}
|
|
61
61
|
this.pipelineFactory = props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);
|
|
62
62
|
this.pipeline = this._updatePipeline();
|
|
63
63
|
this.vertexArray = device.createVertexArray({
|
|
64
64
|
renderPipeline: this.pipeline
|
|
65
65
|
});
|
|
66
|
-
if (
|
|
67
|
-
this._setGeometryAttributes(
|
|
66
|
+
if (this._gpuGeometry) {
|
|
67
|
+
this._setGeometryAttributes(this._gpuGeometry);
|
|
68
68
|
}
|
|
69
69
|
if (props.vertexCount) {
|
|
70
70
|
this.setVertexCount(props.vertexCount);
|
|
@@ -131,9 +131,14 @@ export class Model {
|
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
setBufferLayout(bufferLayout) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
this.bufferLayout = this._gpuGeometry ? mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout) : bufferLayout;
|
|
135
|
+
this._setPipelineNeedsUpdate('bufferLayout');
|
|
136
|
+
this.pipeline = this._updatePipeline();
|
|
137
|
+
this.vertexArray = this.device.createVertexArray({
|
|
138
|
+
renderPipeline: this.pipeline
|
|
139
|
+
});
|
|
140
|
+
if (this._gpuGeometry) {
|
|
141
|
+
this._setGeometryAttributes(this._gpuGeometry);
|
|
137
142
|
}
|
|
138
143
|
}
|
|
139
144
|
setParameters(parameters) {
|
|
@@ -195,7 +200,7 @@ export class Model {
|
|
|
195
200
|
if (attributeInfo) {
|
|
196
201
|
this.vertexArray.setConstant(attributeInfo.location, value);
|
|
197
202
|
} else {
|
|
198
|
-
log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${
|
|
203
|
+
log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${attributeName}"`)();
|
|
199
204
|
}
|
|
200
205
|
}
|
|
201
206
|
}
|
package/dist/model/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","names":["RenderPipeline","log","uid","deepEqual","getAttributeInfosFromLayouts","ShaderAssembler","makeGPUGeometry","PipelineFactory","Model","constructor","device","props","id","vs","fs","pipelineFactory","userData","parameters","topology","bufferLayout","vertexCount","instanceCount","indexBuffer","bufferAttributes","constantAttributes","bindings","uniforms","pipeline","vertexArray","_pipelineNeedsUpdate","_attributeInfos","_getModuleUniforms","defaultProps","Object","assign","platformInfo","type","info","shaderLanguage","shadingLanguages","gpu","features","getUniforms","shaderAssembler","assembleShaders","gpuGeometry","geometry","setGeometry","getDefaultPipelineFactory","_updatePipeline","createVertexArray","renderPipeline","_setGeometryAttributes","setVertexCount","setInstanceCount","indices","Error","setIndexBuffer","attributes","setAttributes","setConstantAttributes","setBindings","setUniforms","moduleSettings","updateModuleSettings","seal","destroy","release","draw","renderPass","setTopology","mergeBufferLayouts","_setPipelineNeedsUpdate","setBufferLayout","setParameters","setShaderModuleProps","buffers","warn","bufferName","buffer","entries","_bufferLayout$attribu","find","layout","name","attributeNames","map","attribute","set","attributeName","attributeInfo","setBuffer","location","value","setConstant","reason","createRenderPipeline","createShader","stage","source","shaderLayout","handle","undefined","defines","modules","getDefaultShaderAssembler","layouts1","layouts2","layouts","index","findIndex","attribute2","push"],"sources":["../../src/model/model.ts"],"sourcesContent":["// luma.gl, MIT license\n\nimport type {\n TypedArray,\n RenderPipelineProps,\n RenderPipelineParameters,\n BufferLayout,\n VertexArray,\n AttributeInfo\n} from '@luma.gl/core';\nimport type {Binding, UniformValue, PrimitiveTopology} from '@luma.gl/core';\nimport {Device, Buffer, RenderPipeline, RenderPass, log, uid, deepEqual} 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 type {Geometry} from '../geometry/geometry';\nimport {GPUGeometry, makeGPUGeometry} from '../geometry/gpu-geometry';\nimport {PipelineFactory} from '../lib/pipeline-factory';\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Model also accepts a string shaders\n vs: {glsl?: string; wgsl?: string} | string | null;\n fs: {glsl?: string; wgsl?: string} | string | null;\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, string | number | boolean>;\n // TODO - injections, hooks etc?\n\n /** 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 /** 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: {},\n geometry: null,\n indexBuffer: null,\n attributes: {},\n constantAttributes: {},\n\n pipelineFactory: 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 /** The underlying GPU \"program\". @note May be recreated if parameters change */\n pipeline: RenderPipeline;\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 _pipelineNeedsUpdate: string | false = 'newly created';\n _attributeInfos: Record<string, AttributeInfo> = {};\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 /** Create a shadertools platform info from the Device */\n const platformInfo: PlatformInfo = {\n type: device.info.type,\n shaderLanguage: device.info.shadingLanguages[0],\n gpu: device.info.gpu,\n features: device.features\n };\n\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleShaders(\n platformInfo,\n this.props\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 let gpuGeometry: GPUGeometry;\n // Geometry, if provided, sets topology and vertex cound\n if (props.geometry) {\n 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 // TODO - vertex array needs to be updated if we update buffer layout,\n // but not if we update parameters\n this.vertexArray = device.createVertexArray({\n renderPipeline: this.pipeline\n });\n\n // Now we can apply geometry attributes\n if (gpuGeometry) {\n this._setGeometryAttributes(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 this.updateModuleSettings(props.moduleSettings);\n }\n\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 }\n\n // Draw call\n\n draw(renderPass: RenderPass): void {\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 });\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n /**\n * Updates the optional geometry\n * Geometry, set topology and bufferLayout\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setGeometry(geometry: GPUGeometry | Geometry): GPUGeometry {\n const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);\n this.setTopology(gpuGeometry.topology || 'triangle-list');\n this.bufferLayout = mergeBufferLayouts(this.bufferLayout, gpuGeometry.bufferLayout);\n if (this.vertexArray) {\n this._setGeometryAttributes(gpuGeometry);\n }\n return gpuGeometry;\n }\n\n /**\n * Updates the optional geometry attributes\n * Geometry, sets several attributes, indexBuffer, and also vertex count\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n _setGeometryAttributes(gpuGeometry: GPUGeometry): void {\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setAttributes(gpuGeometry.attributes);\n this.setIndexBuffer(gpuGeometry.indices);\n }\n\n /**\n * Updates the primitive topology ('triangle-list', 'triangle-strip' etc).\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setTopology(topology: PrimitiveTopology): void {\n if (topology !== this.topology) {\n this.topology = topology;\n this._setPipelineNeedsUpdate('topology');\n }\n }\n\n /**\n * Updates the buffer layout.\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setBufferLayout(bufferLayout: BufferLayout[]): void {\n if (bufferLayout !== this.bufferLayout) {\n this.bufferLayout = bufferLayout;\n this._setPipelineNeedsUpdate('bufferLayout');\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 /**\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 Object.assign(this.uniforms, uniforms);\n }\n\n /**\n * @deprecated Updates shader module settings (which results in uniforms being set)\n */\n updateModuleSettings(props: Record<string, any>): void {\n this.setShaderModuleProps(props);\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 * Sets attributes (buffers)\n * @note Overrides any attributes previously set with the same name\n */\n setAttributes(buffers: Record<string, Buffer>): void {\n if (buffers.indices) {\n log.warn(\n `Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`\n );\n }\n for (const [bufferName, buffer] of Object.entries(buffers)) {\n const bufferLayout = this.bufferLayout.find(layout => layout.name === bufferName);\n if (!bufferLayout) {\n continue; // eslint-disable-line no-continue\n }\n\n // For an interleaved attribute we may need to set multiple attributes\n const attributeNames = bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n let set = false;\n for (const attributeName of attributeNames) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setBuffer(attributeInfo.location, buffer);\n set = true;\n }\n }\n if (!set) {\n log.warn(\n `Model(${this.id}): Ignoring buffer \"${buffer.id}\" for unknown attribute \"${bufferName}\"`\n )();\n }\n }\n }\n\n /**\n * Sets constant attributes\n * @note Overrides any attributes previously set with the same name\n * Constant attributes are only supported in WebGL, not in WebGPU\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @param constantAttributes\n */\n setConstantAttributes(attributes: Record<string, TypedArray>): void {\n for (const [attributeName, value] of Object.entries(attributes)) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setConstant(attributeInfo.location, value);\n } else {\n log.warn(`Model \"${this.id}: Ignoring constant supplied for unknown attribute \"${name}\"`)();\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(1, `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`)();\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 ? this.device.createShader({id: '{$this.id}-fragment', stage: 'fragment', source: this.fs}) : null\n });\n this._attributeInfos = getAttributeInfosFromLayouts(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n }\n return this.pipeline;\n }\n}\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model.js","names":["RenderPipeline","log","uid","deepEqual","getAttributeInfosFromLayouts","ShaderAssembler","makeGPUGeometry","PipelineFactory","Model","constructor","device","props","id","vs","fs","pipelineFactory","userData","parameters","topology","bufferLayout","vertexCount","instanceCount","indexBuffer","bufferAttributes","constantAttributes","bindings","uniforms","pipeline","vertexArray","_pipelineNeedsUpdate","_attributeInfos","_gpuGeometry","_getModuleUniforms","defaultProps","Object","assign","platformInfo","type","info","shaderLanguage","shadingLanguages","gpu","features","getUniforms","shaderAssembler","assembleShaders","geometry","setGeometry","getDefaultPipelineFactory","_updatePipeline","createVertexArray","renderPipeline","_setGeometryAttributes","setVertexCount","setInstanceCount","indices","Error","setIndexBuffer","attributes","setAttributes","setConstantAttributes","setBindings","setUniforms","moduleSettings","updateModuleSettings","seal","destroy","release","draw","renderPass","gpuGeometry","setTopology","mergeBufferLayouts","_setPipelineNeedsUpdate","setBufferLayout","setParameters","setShaderModuleProps","buffers","warn","bufferName","buffer","entries","_bufferLayout$attribu","find","layout","name","attributeNames","map","attribute","set","attributeName","attributeInfo","setBuffer","location","value","setConstant","reason","createRenderPipeline","createShader","stage","source","shaderLayout","handle","undefined","defines","modules","getDefaultShaderAssembler","layouts1","layouts2","layouts","index","findIndex","attribute2","push"],"sources":["../../src/model/model.ts"],"sourcesContent":["// luma.gl, MIT license\n\nimport type {\n TypedArray,\n RenderPipelineProps,\n RenderPipelineParameters,\n BufferLayout,\n VertexArray,\n AttributeInfo\n} from '@luma.gl/core';\nimport type {Binding, UniformValue, PrimitiveTopology} from '@luma.gl/core';\nimport {Device, Buffer, RenderPipeline, RenderPass, log, uid, deepEqual} 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 type {Geometry} from '../geometry/geometry';\nimport {GPUGeometry, makeGPUGeometry} from '../geometry/gpu-geometry';\nimport {PipelineFactory} from '../lib/pipeline-factory';\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Model also accepts a string shaders\n vs: {glsl?: string; wgsl?: string} | string | null;\n fs: {glsl?: string; wgsl?: string} | string | null;\n /** shadertool shader modules (added to shader code) */\n modules?: ShaderModule[];\n /** Shadertool module defines (configures shader code)*/\n defines?: Record<string, string | number | boolean>;\n // TODO - injections, hooks etc?\n\n /** 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 /** 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: {},\n geometry: null,\n indexBuffer: null,\n attributes: {},\n constantAttributes: {},\n\n pipelineFactory: 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 /** The underlying GPU \"program\". @note May be recreated if parameters change */\n pipeline: RenderPipeline;\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 _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 /** Create a shadertools platform info from the Device */\n const platformInfo: PlatformInfo = {\n type: device.info.type,\n shaderLanguage: device.info.shadingLanguages[0],\n gpu: device.info.gpu,\n features: device.features\n };\n\n const {vs, fs, getUniforms} = this.props.shaderAssembler.assembleShaders(\n platformInfo,\n this.props\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 this.updateModuleSettings(props.moduleSettings);\n }\n\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 }\n\n // Draw call\n\n draw(renderPass: RenderPass): void {\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 });\n }\n\n // Update fixed fields (can trigger pipeline rebuild)\n\n /**\n * Updates the optional geometry\n * Geometry, set topology and bufferLayout\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setGeometry(geometry: GPUGeometry | Geometry): GPUGeometry {\n const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);\n this.setTopology(gpuGeometry.topology || 'triangle-list');\n this.bufferLayout = mergeBufferLayouts(this.bufferLayout, gpuGeometry.bufferLayout);\n if (this.vertexArray) {\n this._setGeometryAttributes(gpuGeometry);\n }\n return gpuGeometry;\n }\n\n /**\n * Updates the optional geometry attributes\n * Geometry, sets several attributes, indexBuffer, and also vertex count\n * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n _setGeometryAttributes(gpuGeometry: GPUGeometry): void {\n // TODO - delete previous geometry?\n this.vertexCount = gpuGeometry.vertexCount;\n this.setAttributes(gpuGeometry.attributes);\n this.setIndexBuffer(gpuGeometry.indices);\n }\n\n /**\n * Updates the primitive topology ('triangle-list', 'triangle-strip' etc).\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setTopology(topology: PrimitiveTopology): void {\n if (topology !== this.topology) {\n this.topology = topology;\n this._setPipelineNeedsUpdate('topology');\n }\n }\n\n /**\n * Updates the buffer layout.\n * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU\n */\n setBufferLayout(bufferLayout: BufferLayout[]): void {\n this.bufferLayout = this._gpuGeometry\n ? mergeBufferLayouts(bufferLayout, this._gpuGeometry.bufferLayout)\n : bufferLayout;\n this._setPipelineNeedsUpdate('bufferLayout');\n\n // Recreate the pipeline\n this.pipeline = this._updatePipeline();\n \n // vertex array needs to be updated if we update buffer layout,\n // but not if we update parameters\n this.vertexArray = this.device.createVertexArray({\n renderPipeline: this.pipeline\n });\n\n // Reapply geometry attributes to the new vertex array\n if (this._gpuGeometry) {\n this._setGeometryAttributes(this._gpuGeometry);\n }\n }\n\n /**\n * Set GPU parameters.\n * @note Can trigger a pipeline rebuild / pipeline cache fetch.\n * @param parameters\n */\n setParameters(parameters: RenderPipelineParameters) {\n if (!deepEqual(parameters, this.parameters, 2)) {\n this.parameters = parameters;\n this._setPipelineNeedsUpdate('parameters');\n }\n }\n\n // Update dynamic fields\n\n /**\n * Updates the vertex count (used in draw calls)\n * @note Any attributes with stepMode=vertex need to be at least this big\n */\n setVertexCount(vertexCount: number): void {\n this.vertexCount = vertexCount;\n }\n\n /**\n * Updates the instance count (used in draw calls)\n * @note Any attributes with stepMode=instance need to be at least this big\n */\n setInstanceCount(instanceCount: number): void {\n this.instanceCount = instanceCount;\n }\n\n /**\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 Object.assign(this.uniforms, uniforms);\n }\n\n /**\n * @deprecated Updates shader module settings (which results in uniforms being set)\n */\n updateModuleSettings(props: Record<string, any>): void {\n this.setShaderModuleProps(props);\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 * Sets attributes (buffers)\n * @note Overrides any attributes previously set with the same name\n */\n setAttributes(buffers: Record<string, Buffer>): void {\n if (buffers.indices) {\n log.warn(\n `Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`\n );\n }\n for (const [bufferName, buffer] of Object.entries(buffers)) {\n const bufferLayout = this.bufferLayout.find(layout => layout.name === bufferName);\n if (!bufferLayout) {\n continue; // eslint-disable-line no-continue\n }\n\n // For an interleaved attribute we may need to set multiple attributes\n const attributeNames = bufferLayout.attributes\n ? bufferLayout.attributes?.map(layout => layout.attribute)\n : [bufferLayout.name];\n let set = false;\n for (const attributeName of attributeNames) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setBuffer(attributeInfo.location, buffer);\n set = true;\n }\n }\n if (!set) {\n log.warn(\n `Model(${this.id}): Ignoring buffer \"${buffer.id}\" for unknown attribute \"${bufferName}\"`\n )();\n }\n }\n }\n\n /**\n * Sets constant attributes\n * @note Overrides any attributes previously set with the same name\n * Constant attributes are only supported in WebGL, not in WebGPU\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @param constantAttributes\n */\n setConstantAttributes(attributes: Record<string, TypedArray>): void {\n for (const [attributeName, value] of Object.entries(attributes)) {\n const attributeInfo = this._attributeInfos[attributeName];\n if (attributeInfo) {\n this.vertexArray.setConstant(attributeInfo.location, value);\n } else {\n log.warn(`Model \"${this.id}: Ignoring constant supplied for unknown attribute \"${attributeName}\"`)();\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(1, `Model ${this.id}: Recreating pipeline because \"${this._pipelineNeedsUpdate}\".`)();\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 ? this.device.createShader({id: '{$this.id}-fragment', stage: 'fragment', source: this.fs}) : null\n });\n this._attributeInfos = getAttributeInfosFromLayouts(\n this.pipeline.shaderLayout,\n this.bufferLayout\n );\n }\n return this.pipeline;\n }\n}\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"],"mappings":"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"}
|