@luma.gl/engine 9.0.0-alpha.31 → 9.0.0-alpha.33

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.
Files changed (44) hide show
  1. package/dist/dist.dev.js +583 -294
  2. package/dist/geometries/truncated-cone-geometry.d.ts +0 -2
  3. package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -1
  4. package/dist/geometries/truncated-cone-geometry.js +0 -11
  5. package/dist/geometries/truncated-cone-geometry.js.map +1 -1
  6. package/dist/geometry/geometry.d.ts +25 -11
  7. package/dist/geometry/geometry.d.ts.map +1 -1
  8. package/dist/geometry/geometry.js +1 -2
  9. package/dist/geometry/geometry.js.map +1 -1
  10. package/dist/geometry/gpu-geometry.d.ts +48 -0
  11. package/dist/geometry/gpu-geometry.d.ts.map +1 -0
  12. package/dist/geometry/gpu-geometry.js +137 -0
  13. package/dist/geometry/gpu-geometry.js.map +1 -0
  14. package/dist/geometry/gpu-table.d.ts +1 -0
  15. package/dist/geometry/gpu-table.d.ts.map +1 -0
  16. package/dist/geometry/gpu-table.js +2 -0
  17. package/dist/geometry/gpu-table.js.map +1 -0
  18. package/dist/index.cjs +313 -222
  19. package/dist/lib/pipeline-factory.d.ts +11 -44
  20. package/dist/lib/pipeline-factory.d.ts.map +1 -1
  21. package/dist/lib/pipeline-factory.js +28 -119
  22. package/dist/lib/pipeline-factory.js.map +1 -1
  23. package/dist/model/model.d.ts +108 -22
  24. package/dist/model/model.d.ts.map +1 -1
  25. package/dist/model/model.js +148 -92
  26. package/dist/model/model.js.map +1 -1
  27. package/dist.min.js +67 -67
  28. package/package.json +6 -6
  29. package/src/geometries/truncated-cone-geometry.ts +0 -10
  30. package/src/geometry/geometry.ts +26 -23
  31. package/src/geometry/gpu-geometry.ts +158 -0
  32. package/src/geometry/gpu-table.ts +41 -0
  33. package/src/lib/pipeline-factory.ts +43 -164
  34. package/src/model/model.ts +276 -126
  35. package/dist/geometry/primitive-utils.d.ts +0 -1
  36. package/dist/geometry/primitive-utils.d.ts.map +0 -1
  37. package/dist/geometry/primitive-utils.js +0 -2
  38. package/dist/geometry/primitive-utils.js.map +0 -1
  39. package/dist/model/model-utils.d.ts +0 -5
  40. package/dist/model/model-utils.d.ts.map +0 -1
  41. package/dist/model/model-utils.js +0 -40
  42. package/dist/model/model-utils.js.map +0 -1
  43. package/src/geometry/primitive-utils.ts +0 -30
  44. package/src/model/model-utils.ts +0 -125
@@ -1,60 +1,27 @@
1
- import type { RenderPipelineParameters, PrimitiveTopology, ShaderLayout } from '@luma.gl/core';
1
+ import type { RenderPipelineProps } from '@luma.gl/core';
2
2
  import { Device, RenderPipeline } from '@luma.gl/core';
3
- import type { ShaderModule } from '@luma.gl/shadertools';
4
- export type GetRenderPipelineOptions = {
3
+ /** Todo - should be same as RenderPipelineProps */
4
+ export type PipelineFactoryProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {
5
5
  vs: string;
6
- fs: string | null;
7
- topology: PrimitiveTopology;
8
- shaderLayout?: ShaderLayout | null;
9
- parameters?: RenderPipelineParameters;
10
- modules?: ShaderModule[];
11
- defines?: Record<string, string | number | boolean>;
12
- inject?: Record<string, string>;
13
- transpileToGLSL100?: boolean;
14
- varyings?: string[];
15
- bufferMode?: number;
6
+ fs: string;
16
7
  };
17
- export type GetComputePipelineOptions = {
18
- cs: string;
19
- parameters?: RenderPipelineParameters;
20
- modules?: ShaderModule[];
21
- defines?: Record<string, string>;
22
- inject?: Record<string, string>;
23
- transpileToGLSL100?: boolean;
24
- varyings?: string[];
25
- bufferMode?: number;
26
- };
27
- type GetUniformsFunc = (props?: Record<string, any>) => Record<string, any>;
28
- /** Efficiently create shared pipelines with varying parameters */
8
+ /**
9
+ * Efficiently creates / caches pipelines
10
+ */
29
11
  export declare class PipelineFactory {
12
+ static defaultProps: Required<PipelineFactoryProps>;
30
13
  readonly device: Device;
31
- stateHash: number;
32
14
  private _hashCounter;
33
15
  private readonly _hashes;
34
16
  private readonly _useCounts;
35
17
  private readonly _pipelineCache;
36
- private readonly _getUniforms;
37
- private readonly _hookFunctions;
38
- private _defaultModules;
39
18
  static getDefaultPipelineFactory(device: Device): PipelineFactory;
40
19
  constructor(device: Device);
41
- addDefaultModule(module: ShaderModule): void;
42
- removeDefaultModule(module: ShaderModule): void;
43
- addShaderHook(hook: string, opts?: any): void;
44
- createRenderPipeline(options: GetRenderPipelineOptions): {
45
- pipeline: RenderPipeline;
46
- getUniforms: GetUniformsFunc;
47
- };
20
+ createRenderPipeline(options: PipelineFactoryProps): RenderPipeline;
48
21
  release(pipeline: RenderPipeline): void;
49
- getUniforms(pipeline: RenderPipeline): GetUniformsFunc;
50
- _createRenderPipeline(props: GetRenderPipelineOptions): {
51
- pipeline: RenderPipeline;
52
- getUniforms: GetUniformsFunc;
53
- };
22
+ _createRenderPipeline(props: PipelineFactoryProps): RenderPipeline;
54
23
  /** Calculate a hash based on all the inputs for a render pipeline */
55
- _hashRenderPipeline(props: GetRenderPipelineOptions): string;
24
+ _hashRenderPipeline(props: PipelineFactoryProps): string;
56
25
  _getHash(key: string): number;
57
- _getModuleList(appModules?: ShaderModule[]): ShaderModule[];
58
26
  }
59
- export {};
60
27
  //# sourceMappingURL=pipeline-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-factory.d.ts","sourceRoot":"","sources":["../../src/lib/pipeline-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-factory.d.ts","sourceRoot":"","sources":["../../src/lib/pipeline-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,eAAe,CAAC;AAErD,mDAAmD;AACnD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;IAE1E,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;GAEG;AACH,qBAAa,eAAe;IAC1B,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAIlD;IAED,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;IAErE,MAAM,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;gBAKrD,MAAM,EAAE,MAAM;IAI1B,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc;IAsBnE,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAYvC,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc;IAclE,qEAAqE;IACrE,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;IAqBxD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAM9B"}
@@ -1,83 +1,44 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import { assembleShaders } from '@luma.gl/shadertools';
3
- const DEFAULT_RENDER_PIPELINE_OPTIONS = {
4
- vs: '',
5
- fs: '',
6
- modules: [],
7
- defines: {},
8
- inject: {},
9
- transpileToGLSL100: false,
10
- shaderLayout: null,
11
- varyings: [],
12
- bufferMode: 0x8c8d,
13
- topology: 'triangle-list',
14
- parameters: {}
15
- };
2
+ import { RenderPipeline } from '@luma.gl/core';
16
3
  export class PipelineFactory {
17
4
  static getDefaultPipelineFactory(device) {
18
- device.defaultPipelineFactory = device.defaultPipelineFactory || new PipelineFactory(device);
19
- return device.defaultPipelineFactory;
5
+ device._lumaData.defaultPipelineFactory = device._lumaData.defaultPipelineFactory || new PipelineFactory(device);
6
+ return device._lumaData.defaultPipelineFactory;
20
7
  }
21
8
  constructor(device) {
22
9
  _defineProperty(this, "device", void 0);
23
- _defineProperty(this, "stateHash", 0);
24
10
  _defineProperty(this, "_hashCounter", 0);
25
11
  _defineProperty(this, "_hashes", {});
26
12
  _defineProperty(this, "_useCounts", {});
27
13
  _defineProperty(this, "_pipelineCache", {});
28
- _defineProperty(this, "_getUniforms", {});
29
- _defineProperty(this, "_hookFunctions", []);
30
- _defineProperty(this, "_defaultModules", []);
31
14
  this.device = device;
32
15
  }
33
- addDefaultModule(module) {
34
- if (!this._defaultModules.find(m => m.name === (typeof module === 'string' ? module : module.name))) {
35
- this._defaultModules.push(module);
36
- }
37
- this.stateHash++;
38
- }
39
- removeDefaultModule(module) {
40
- const moduleName = typeof module === 'string' ? module : module.name;
41
- this._defaultModules = this._defaultModules.filter(m => m.name !== moduleName);
42
- this.stateHash++;
43
- }
44
- addShaderHook(hook, opts) {
45
- if (opts) {
46
- hook = Object.assign(opts, {
47
- hook
48
- });
49
- }
50
- this._hookFunctions.push(hook);
51
- this.stateHash++;
52
- }
53
16
  createRenderPipeline(options) {
54
17
  const props = {
55
- ...DEFAULT_RENDER_PIPELINE_OPTIONS,
18
+ ...PipelineFactory.defaultProps,
56
19
  ...options
57
20
  };
58
- const modules = this._getModuleList(props.modules);
59
21
  const hash = this._hashRenderPipeline({
60
- ...props,
61
- modules
22
+ ...props
62
23
  });
63
24
  if (!this._pipelineCache[hash]) {
64
- const {
65
- pipeline,
66
- getUniforms
67
- } = this._createRenderPipeline({
25
+ const pipeline = this.device.createRenderPipeline({
68
26
  ...props,
69
- modules
27
+ vs: this.device.createShader({
28
+ stage: 'vertex',
29
+ source: props.vs
30
+ }),
31
+ fs: props.fs ? this.device.createShader({
32
+ stage: 'fragment',
33
+ source: props.fs
34
+ }) : null
70
35
  });
71
36
  pipeline.hash = hash;
72
37
  this._pipelineCache[hash] = pipeline;
73
- this._getUniforms[hash] = getUniforms || (x => ({}));
74
38
  this._useCounts[hash] = 0;
75
39
  }
76
40
  this._useCounts[hash]++;
77
- return {
78
- pipeline: this._pipelineCache[hash],
79
- getUniforms: this._getUniforms[hash]
80
- };
41
+ return this._pipelineCache[hash];
81
42
  }
82
43
  release(pipeline) {
83
44
  const hash = pipeline.hash;
@@ -85,68 +46,33 @@ export class PipelineFactory {
85
46
  if (this._useCounts[hash] === 0) {
86
47
  this._pipelineCache[hash].destroy();
87
48
  delete this._pipelineCache[hash];
88
- delete this._getUniforms[hash];
89
49
  delete this._useCounts[hash];
90
50
  }
91
51
  }
92
- getUniforms(pipeline) {
93
- return this._getUniforms[pipeline.hash] || null;
94
- }
95
52
  _createRenderPipeline(props) {
96
- const platformInfo = {
97
- gpu: this.device.info.gpu,
98
- features: this.device.features
99
- };
100
53
  if (!props.fs) {
101
54
  throw new Error('fs');
102
55
  }
103
- const assembled = assembleShaders(platformInfo, {
104
- ...props,
105
- fs: props.fs,
106
- hookFunctions: this._hookFunctions
107
- });
108
56
  const pipeline = this.device.createRenderPipeline({
109
57
  ...props,
110
58
  vs: this.device.createShader({
111
59
  stage: 'vertex',
112
- source: assembled.vs
60
+ source: props.vs
113
61
  }),
114
- fs: assembled.fs ? this.device.createShader({
62
+ fs: props.fs ? this.device.createShader({
115
63
  stage: 'fragment',
116
- source: assembled.fs
64
+ source: props.fs
117
65
  }) : null
118
66
  });
119
- return {
120
- pipeline,
121
- getUniforms: assembled.getUniforms
122
- };
67
+ return pipeline;
123
68
  }
124
69
  _hashRenderPipeline(props) {
125
- const {
126
- modules = [],
127
- varyings = [],
128
- defines = {},
129
- inject = {},
130
- parameters = {}
131
- } = props;
132
70
  const vsHash = this._getHash(props.vs);
133
71
  const fsHash = props.fs ? this._getHash(props.fs) : 0;
134
- const moduleHashes = modules.map(m => this._getHash(typeof m === 'string' ? m : m.name)).sort();
135
- const varyingHashes = varyings.map(v => this._getHash(v));
136
- const defineKeys = Object.keys(defines).sort();
137
- const injectKeys = Object.keys(inject).sort();
138
- const defineHashes = [];
139
- const injectHashes = [];
140
- for (const key of defineKeys) {
141
- defineHashes.push(this._getHash(key));
142
- defineHashes.push(this._getHash(String(defines[key])));
143
- }
144
- for (const key of injectKeys) {
145
- injectHashes.push(this._getHash(key));
146
- injectHashes.push(this._getHash(inject[key]));
147
- }
148
- const parameterHash = JSON.stringify(parameters);
149
- return "".concat(vsHash, "/").concat(fsHash, "D").concat(defineHashes.join('/'), "M").concat(moduleHashes.join('/'), "I").concat(injectHashes.join('/'), "V").concat(varyingHashes.join('/'), "H").concat(this.stateHash, "B").concat(props.bufferMode).concat(props.transpileToGLSL100 ? 'T' : '', "P").concat(parameterHash);
72
+ const parameterHash = this._getHash(JSON.stringify(props.parameters));
73
+ const bufferLayoutHash = this._getHash(JSON.stringify(props.bufferLayout));
74
+ const varyingHash = '-';
75
+ return "".concat(vsHash, "/").concat(fsHash, "V").concat(varyingHash, "T").concat(props.topology, "P").concat(parameterHash, "BL").concat(bufferLayoutHash, "}");
150
76
  }
151
77
  _getHash(key) {
152
78
  if (this._hashes[key] === undefined) {
@@ -154,27 +80,10 @@ export class PipelineFactory {
154
80
  }
155
81
  return this._hashes[key];
156
82
  }
157
- _getModuleList() {
158
- let appModules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
159
- const modules = new Array(this._defaultModules.length + appModules.length);
160
- const seen = {};
161
- let count = 0;
162
- for (let i = 0, len = this._defaultModules.length; i < len; ++i) {
163
- const module = this._defaultModules[i];
164
- const name = module.name;
165
- modules[count++] = module;
166
- seen[name] = true;
167
- }
168
- for (let i = 0, len = appModules.length; i < len; ++i) {
169
- const module = appModules[i];
170
- const name = module.name;
171
- if (!seen[name]) {
172
- modules[count++] = module;
173
- seen[name] = true;
174
- }
175
- }
176
- modules.length = count;
177
- return modules;
178
- }
179
83
  }
84
+ _defineProperty(PipelineFactory, "defaultProps", {
85
+ ...RenderPipeline.defaultProps,
86
+ vs: undefined,
87
+ fs: undefined
88
+ });
180
89
  //# sourceMappingURL=pipeline-factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-factory.js","names":["assembleShaders","DEFAULT_RENDER_PIPELINE_OPTIONS","vs","fs","modules","defines","inject","transpileToGLSL100","shaderLayout","varyings","bufferMode","topology","parameters","PipelineFactory","getDefaultPipelineFactory","device","defaultPipelineFactory","constructor","_defineProperty","addDefaultModule","module","_defaultModules","find","m","name","push","stateHash","removeDefaultModule","moduleName","filter","addShaderHook","hook","opts","Object","assign","_hookFunctions","createRenderPipeline","options","props","_getModuleList","hash","_hashRenderPipeline","_pipelineCache","pipeline","getUniforms","_createRenderPipeline","_getUniforms","x","_useCounts","release","destroy","platformInfo","gpu","info","features","Error","assembled","hookFunctions","createShader","stage","source","vsHash","_getHash","fsHash","moduleHashes","map","sort","varyingHashes","v","defineKeys","keys","injectKeys","defineHashes","injectHashes","key","String","parameterHash","JSON","stringify","concat","join","_hashes","undefined","_hashCounter","appModules","arguments","length","Array","seen","count","i","len"],"sources":["../../src/lib/pipeline-factory.ts"],"sourcesContent":["import type {RenderPipelineParameters, PrimitiveTopology, ShaderLayout} from '@luma.gl/core';\nimport {Device, RenderPipeline} from '@luma.gl/core';\nimport type { ShaderModule } from '@luma.gl/shadertools';\nimport {assembleShaders} from '@luma.gl/shadertools';\n\nexport type GetRenderPipelineOptions = {\n vs: string;\n fs: string | null;\n topology: PrimitiveTopology;\n shaderLayout?: ShaderLayout | null;\n parameters?: RenderPipelineParameters;\n\n modules?: ShaderModule[];\n defines?: Record<string, string | number | boolean>;\n inject?: Record<string, string>;\n transpileToGLSL100?: boolean;\n\n varyings?: string[];\n bufferMode?: number, \n};\n\nexport type GetComputePipelineOptions = {\n cs: string;\n\n parameters?: RenderPipelineParameters;\n\n modules?: ShaderModule[];\n defines?: Record<string, string>;\n inject?: Record<string, string>;\n transpileToGLSL100?: boolean;\n\n varyings?: string[];\n bufferMode?: number;\n};\n\nconst DEFAULT_RENDER_PIPELINE_OPTIONS: Required<GetRenderPipelineOptions> = {\n vs: '',\n fs: '',\n modules: [],\n defines: {},\n inject: {},\n transpileToGLSL100: false,\n shaderLayout: null,\n\n varyings: [],\n bufferMode: 0x8c8d, // // varyings/bufferMode for xform feedback, 0x8c8d: SEPARATE_ATTRIBS\n topology: 'triangle-list',\n parameters: {} \n};\n\ntype GetUniformsFunc = (props?: Record<string, any>) => Record<string, any>;\n\n/** Efficiently create shared pipelines with varying parameters */\nexport class PipelineFactory {\n readonly device: Device;\n\n stateHash: number = 0; // Used to change hashing if hooks are modified\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _useCounts: Record<string, number> = {};\n\n private readonly _pipelineCache: Record<string, RenderPipeline> = {};\n\n private readonly _getUniforms: Record<string, GetUniformsFunc> = {};\n private readonly _hookFunctions: any[] = [];\n private _defaultModules: any[] = [];\n // private readonly _registeredModules = {}; // TODO: Remove? This isn't used anywhere in luma.gl\n\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n // @ts-expect-error Add to device\n device.defaultPipelineFactory = device.defaultPipelineFactory || new PipelineFactory(device);\n // @ts-expect-error Add to device\n return device.defaultPipelineFactory;\n }\n\n constructor(device: Device) {\n this.device = device;\n }\n\n addDefaultModule(module: ShaderModule): void {\n if (!this._defaultModules.find((m) => m.name === (typeof module === 'string' ? module : module.name))) {\n this._defaultModules.push(module);\n }\n this.stateHash++;\n }\n\n removeDefaultModule(module: ShaderModule): void {\n const moduleName = typeof module === 'string' ? module : module.name;\n this._defaultModules = this._defaultModules.filter((m) => m.name !== moduleName);\n this.stateHash++;\n }\n\n addShaderHook(hook: string, opts?: any): void {\n if (opts) {\n hook = Object.assign(opts, {hook});\n }\n this._hookFunctions.push(hook);\n this.stateHash++;\n }\n\n createRenderPipeline(options: GetRenderPipelineOptions): {\n pipeline: RenderPipeline;\n getUniforms: GetUniformsFunc;\n } {\n const props: Required<GetRenderPipelineOptions> = {...DEFAULT_RENDER_PIPELINE_OPTIONS, ...options};\n\n const modules = this._getModuleList(props.modules); // Combine with default modules\n\n const hash = this._hashRenderPipeline({...props, modules});\n\n if (!this._pipelineCache[hash]) {\n const {pipeline, getUniforms} = this._createRenderPipeline({...props, modules});\n pipeline.hash = hash;\n this._pipelineCache[hash] = pipeline;\n this._getUniforms[hash] = getUniforms || ((x?: unknown) => ({}));\n this._useCounts[hash] = 0;\n }\n\n this._useCounts[hash]++;\n\n return {\n pipeline: this._pipelineCache[hash],\n getUniforms: this._getUniforms[hash]\n };\n }\n\n release(pipeline: RenderPipeline): void {\n const hash = pipeline.hash;\n this._useCounts[hash]--;\n if (this._useCounts[hash] === 0) {\n this._pipelineCache[hash].destroy();\n delete this._pipelineCache[hash];\n delete this._getUniforms[hash];\n delete this._useCounts[hash];\n }\n }\n\n getUniforms(pipeline: RenderPipeline) {\n return this._getUniforms[pipeline.hash] || null;\n }\n\n // PRIVATE\n\n _createRenderPipeline(props: GetRenderPipelineOptions): {\n pipeline: RenderPipeline,\n getUniforms: GetUniformsFunc\n } {\n const platformInfo = {\n gpu: this.device.info.gpu,\n features: this.device.features\n };\n\n if (!props.fs) {\n throw new Error('fs');\n }\n\n const assembled = assembleShaders(platformInfo, {...props, fs: props.fs, hookFunctions: this._hookFunctions});\n\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: assembled.vs}),\n fs: assembled.fs ? this.device.createShader({stage: 'fragment', source: assembled.fs}) : null,\n });\n\n return {pipeline, getUniforms: assembled.getUniforms};\n }\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n _hashRenderPipeline(props: GetRenderPipelineOptions): string {\n const {modules = [], varyings = [], defines = {}, inject = {}, parameters = {}} = props;\n const vsHash = this._getHash(props.vs);\n const fsHash = props.fs ? this._getHash(props.fs) : 0;\n\n const moduleHashes = modules.map((m) => this._getHash(typeof m === 'string' ? m : m.name)).sort();\n const varyingHashes = varyings.map((v) => this._getHash(v));\n\n const defineKeys = Object.keys(defines).sort();\n const injectKeys = Object.keys(inject).sort();\n const defineHashes: number[] = [];\n const injectHashes: number[] = [];\n\n for (const key of defineKeys) {\n defineHashes.push(this._getHash(key));\n defineHashes.push(this._getHash(String(defines[key])));\n }\n\n for (const key of injectKeys) {\n injectHashes.push(this._getHash(key));\n injectHashes.push(this._getHash(inject[key]));\n }\n\n // TODO - hash parameters!\n const parameterHash = JSON.stringify(parameters);\n\n return `${vsHash}/${fsHash}D${defineHashes.join('/')}M${moduleHashes.join(\n '/'\n )}I${injectHashes.join('/')}V${varyingHashes.join('/')}H${this.stateHash}B${props.bufferMode}${\n props.transpileToGLSL100 ? 'T' : ''\n }P${parameterHash}`;\n }\n\n _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n\n // Dedupe and combine with default modules\n _getModuleList(appModules: ShaderModule[] = []): ShaderModule[] {\n const modules = new Array(this._defaultModules.length + appModules.length);\n const seen: Record<string, boolean> = {};\n let count = 0;\n\n for (let i = 0, len = this._defaultModules.length; i < len; ++i) {\n const module = this._defaultModules[i];\n const name = module.name;\n modules[count++] = module;\n seen[name] = true;\n }\n\n for (let i = 0, len = appModules.length; i < len; ++i) {\n const module = appModules[i];\n const name = module.name;\n if (!seen[name]) {\n modules[count++] = module;\n seen[name] = true;\n }\n }\n\n modules.length = count;\n\n return modules;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-factory.js","names":["RenderPipeline","PipelineFactory","getDefaultPipelineFactory","device","_lumaData","defaultPipelineFactory","constructor","_defineProperty","createRenderPipeline","options","props","defaultProps","hash","_hashRenderPipeline","_pipelineCache","pipeline","vs","createShader","stage","source","fs","_useCounts","release","destroy","_createRenderPipeline","Error","vsHash","_getHash","fsHash","parameterHash","JSON","stringify","parameters","bufferLayoutHash","bufferLayout","varyingHash","concat","topology","key","_hashes","undefined","_hashCounter"],"sources":["../../src/lib/pipeline-factory.ts"],"sourcesContent":["import type {RenderPipelineProps} from '@luma.gl/core';\nimport {Device, RenderPipeline} from '@luma.gl/core';\n\n/** Todo - should be same as RenderPipelineProps */\nexport type PipelineFactoryProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Only accepts string shaders\n vs: string;\n fs: string;\n};\n\n/** \n * Efficiently creates / caches pipelines\n */\nexport class PipelineFactory {\n static defaultProps: Required<PipelineFactoryProps> = {\n ...RenderPipeline.defaultProps,\n vs: undefined!,\n fs: undefined!\n }\n\n readonly device: Device;\n\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _useCounts: Record<string, number> = {};\n private readonly _pipelineCache: Record<string, RenderPipeline> = {};\n\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n device._lumaData.defaultPipelineFactory = device._lumaData.defaultPipelineFactory || new PipelineFactory(device);\n return device._lumaData.defaultPipelineFactory as PipelineFactory;\n }\n\n constructor(device: Device) {\n this.device = device;\n }\n\n createRenderPipeline(options: PipelineFactoryProps): RenderPipeline {\n const props: Required<PipelineFactoryProps> = {...PipelineFactory.defaultProps, ...options};\n\n const hash = this._hashRenderPipeline({...props});\n\n if (!this._pipelineCache[hash]) {\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: props.vs}),\n fs: props.fs ? this.device.createShader({stage: 'fragment', source: props.fs}) : null,\n });\n\n pipeline.hash = hash;\n this._pipelineCache[hash] = pipeline;\n this._useCounts[hash] = 0;\n }\n\n this._useCounts[hash]++;\n\n return this._pipelineCache[hash];\n }\n\n release(pipeline: RenderPipeline): void {\n const hash = pipeline.hash;\n this._useCounts[hash]--;\n if (this._useCounts[hash] === 0) {\n this._pipelineCache[hash].destroy();\n delete this._pipelineCache[hash];\n delete this._useCounts[hash];\n }\n }\n\n // PRIVATE\n\n _createRenderPipeline(props: PipelineFactoryProps): RenderPipeline {\n if (!props.fs) {\n throw new Error('fs');\n }\n\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: props.vs}),\n fs: props.fs ? this.device.createShader({stage: 'fragment', source: props.fs}) : null,\n });\n\n return pipeline;\n }\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n _hashRenderPipeline(props: PipelineFactoryProps): string {\n const vsHash = this._getHash(props.vs);\n const fsHash = props.fs ? this._getHash(props.fs) : 0;\n\n // TODO - Can json.stringify() generate different strings for equivalent objects if order of params is different?\n // create a deepHash() to deduplicate?\n\n // hash parameters\n const parameterHash = this._getHash(JSON.stringify(props.parameters));\n\n // hash buffer layouts\n const bufferLayoutHash = this._getHash(JSON.stringify(props.bufferLayout));\n\n // WebGL specific\n // const {varyings = [], bufferMode = {}} = props;\n // const varyingHashes = varyings.map((v) => this._getHash(v));\n const varyingHash = '-'; // `${varyingHashes.join('/')}B${bufferMode}`\n\n return `${vsHash}/${fsHash}V${varyingHash}T${props.topology}P${parameterHash}BL${bufferLayoutHash}}`;\n }\n\n _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n}\n\n"],"mappings":"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"}
@@ -1,67 +1,153 @@
1
- import { Device, Buffer, RenderPipelineProps, RenderPass, Binding, PrimitiveTopology } from '@luma.gl/core';
2
- import { RenderPipeline } from '@luma.gl/core';
1
+ import type { TypedArray, RenderPipelineProps, RenderPipelineParameters, BufferLayout } from '@luma.gl/core';
2
+ import type { Binding, UniformValue, PrimitiveTopology } from '@luma.gl/core';
3
+ import { Device, Buffer, RenderPipeline, RenderPass } from '@luma.gl/core';
3
4
  import type { ShaderModule } from '@luma.gl/shadertools';
5
+ import { ShaderAssembler } from '@luma.gl/shadertools';
4
6
  import type { Geometry } from '../geometry/geometry';
7
+ import { GPUGeometry } from '../geometry/gpu-geometry';
5
8
  import { PipelineFactory } from '../lib/pipeline-factory';
6
- import { TypedArray } from '@math.gl/core';
7
- /** @todo import type */
8
- type UniformValue = unknown;
9
9
  export type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {
10
- vs?: {
10
+ vs: {
11
11
  glsl?: string;
12
12
  wgsl?: string;
13
13
  } | string | null;
14
- fs?: {
14
+ fs: {
15
15
  glsl?: string;
16
16
  wgsl?: string;
17
17
  } | string | null;
18
- defines?: Record<string, string | number | boolean>;
18
+ /** shadertool shader modules (added to shader code) */
19
19
  modules?: ShaderModule[];
20
- moduleSettings?: Record<string, Record<string, any>>;
21
- geometry?: Geometry | null;
22
- /** deprecated pipeline factory to use to create renderpipelines */
20
+ /** Shadertool module defines (configures shader code)*/
21
+ defines?: Record<string, string | number | boolean>;
22
+ /** pipeline factory to use to create render pipelines. Defaults to default factory for the device */
23
23
  pipelineFactory?: PipelineFactory;
24
+ /** Shader assembler. Defaults to the ShaderAssembler.getShaderAssembler() */
25
+ shaderAssembler?: ShaderAssembler;
26
+ /** Geometry */
27
+ geometry?: GPUGeometry | Geometry | null;
28
+ /** Parameters that are built into the pipeline */
29
+ parameters?: RenderPipelineParameters;
30
+ /** shadertool modules */
31
+ moduleSettings?: Record<string, Record<string, any>>;
32
+ /** Vertex count */
24
33
  vertexCount?: number;
34
+ /** instance count */
25
35
  instanceCount?: number;
26
36
  };
27
- /** v9 API */
37
+ /**
38
+ * v9 Model API
39
+ * A model
40
+ * - automatically reuses pipelines (programs) when possible
41
+ * - automatically rebuilds pipelines if necessary to accommodate changed settings
42
+ * shadertools integration
43
+ * - accepts modules and performs shader transpilation
44
+ */
28
45
  export declare class Model {
46
+ static defaultProps: Required<ModelProps>;
29
47
  readonly device: Device;
30
48
  readonly id: string;
31
49
  readonly vs: string;
32
- readonly fs: string | null;
33
- readonly topology: PrimitiveTopology;
50
+ readonly fs: string;
34
51
  readonly pipelineFactory: PipelineFactory;
35
- /** The underlying GPU "program". @note May be recreated if parameters change */
36
- pipeline: RenderPipeline;
37
52
  userData: {
38
53
  [key: string]: any;
39
54
  };
55
+ /** The render pipeline GPU parameters, depth testing etc */
56
+ parameters: RenderPipelineParameters;
57
+ /** The primitive topology */
58
+ topology: PrimitiveTopology;
59
+ /** Buffer layout */
60
+ bufferLayout: BufferLayout[];
40
61
  /** Vertex count */
41
62
  vertexCount: number;
42
63
  /** instance count */
43
64
  instanceCount: number;
65
+ /** Index buffer */
66
+ indices: Buffer | null;
44
67
  /** Buffer-valued attributes */
45
68
  bufferAttributes: Record<string, Buffer>;
46
69
  /** Constant-valued attributes */
47
70
  constantAttributes: Record<string, TypedArray>;
48
71
  /** Bindings (textures, samplers, uniform buffers) */
49
72
  bindings: Record<string, Binding>;
50
- /** Uniforms */
73
+ /** Sets uniforms @deprecated Use uniform buffers and setBindings() for portability*/
51
74
  uniforms: Record<string, UniformValue>;
75
+ /** The underlying GPU "program". @note May be recreated if parameters change */
76
+ pipeline: RenderPipeline;
77
+ _pipelineNeedsUpdate: string | false;
52
78
  private _getModuleUniforms;
79
+ private props;
53
80
  constructor(device: Device, props: ModelProps);
54
81
  destroy(): void;
55
82
  draw(renderPass: RenderPass): void;
56
- setProps(props: ModelProps): void;
83
+ /**
84
+ * Updates the optional geometry
85
+ * Geometry, sets several attributes, indices, and also vertex count and topology
86
+ * @note Can trigger a pipeline rebuild / pipeline cache fetch on WebGPU
87
+ */
88
+ setGeometry(geometry: GPUGeometry | Geometry): void;
89
+ /**
90
+ * Updates the primitive topology ('triangle-list', 'triangle-strip' etc).
91
+ * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU
92
+ */
93
+ setTopology(topology: PrimitiveTopology): void;
94
+ /**
95
+ * Updates the buffer layout.
96
+ * @note Triggers a pipeline rebuild / pipeline cache fetch on WebGPU
97
+ */
98
+ setBufferLayout(bufferLayout: BufferLayout[]): void;
99
+ /**
100
+ * Set GPU parameters.
101
+ * @note Can trigger a pipeline rebuild / pipeline cache fetch.
102
+ * @param parameters
103
+ */
104
+ setParameters(parameters: RenderPipelineParameters): void;
105
+ /**
106
+ * Updates the vertex count (used in draw calls)
107
+ * @note Any attributes with stepMode=vertex need to be at least this big
108
+ */
109
+ setVertexCount(vertexCount: number): void;
110
+ /**
111
+ * Updates the instance count (used in draw calls)
112
+ * @note Any attributes with stepMode=instance need to be at least this big
113
+ */
114
+ setInstanceCount(instanceCount: number): void;
115
+ /**
116
+ * Updates shader module settings (which results in uniforms being set)
117
+ */
118
+ setShaderModuleProps(props: Record<string, any>): void;
119
+ /**
120
+ * @deprecated Updates shader module settings (which results in uniforms being set)
121
+ */
57
122
  updateModuleSettings(props: Record<string, any>): void;
123
+ /**
124
+ * Sets the index buffer
125
+ * @todo - how to unset it if we change geometry?
126
+ */
58
127
  setIndexBuffer(indices: Buffer | null): void;
128
+ /**
129
+ * Sets attributes (buffers)
130
+ * @note Overrides any attributes previously set with the same name
131
+ */
59
132
  setAttributes(bufferAttributes: Record<string, Buffer>): void;
133
+ /**
134
+ * Sets constant attributes
135
+ * @note Overrides any attributes previously set with the same name
136
+ * @param constantAttributes
137
+ */
60
138
  setConstantAttributes(constantAttributes: Record<string, TypedArray>): void;
61
- /** Set the bindings */
139
+ /**
140
+ * Sets bindings (textures, samplers, uniform buffers)
141
+ */
62
142
  setBindings(bindings: Record<string, Binding>): void;
63
- setUniforms(uniforms: Record<string, any>): void;
64
- _setGeometry(geometry: Geometry): void;
143
+ /**
144
+ * Sets individual uniforms
145
+ * @deprecated WebGL only, use uniform buffers for portability
146
+ * @param uniforms
147
+ * @returns self for chaining
148
+ */
149
+ setUniforms(uniforms: Record<string, UniformValue>): void;
150
+ _setPipelineNeedsUpdate(reason: string): void;
151
+ _updatePipeline(): RenderPipeline;
65
152
  }
66
- export {};
67
153
  //# sourceMappingURL=model.d.ts.map
@@ -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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"}