@babylonjs/core 9.10.0 → 9.11.0

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 (83) hide show
  1. package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.d.ts +2 -0
  2. package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.js.map +1 -1
  3. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.d.ts +13 -3
  4. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js +16 -0
  5. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js.map +1 -1
  6. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.d.ts +4 -0
  7. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +22 -0
  8. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
  9. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.d.ts +6 -0
  10. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js +22 -5
  11. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js.map +1 -1
  12. package/Compute/computeEffect.d.ts +6 -0
  13. package/Compute/computeEffect.js +3 -0
  14. package/Compute/computeEffect.js.map +1 -1
  15. package/Compute/computeShader.pure.d.ts +4 -0
  16. package/Compute/computeShader.pure.js +1 -0
  17. package/Compute/computeShader.pure.js.map +1 -1
  18. package/DeviceInput/webDeviceInputSystem.js +7 -1
  19. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  20. package/Engines/Native/nativeInterfaces.d.ts +10 -1
  21. package/Engines/Native/nativeInterfaces.js.map +1 -1
  22. package/Engines/WebGPU/Extensions/engine.computeShader.pure.js +154 -2
  23. package/Engines/WebGPU/Extensions/engine.computeShader.pure.js.map +1 -1
  24. package/Engines/abstractEngine.pure.d.ts +7 -1
  25. package/Engines/abstractEngine.pure.js +34 -4
  26. package/Engines/abstractEngine.pure.js.map +1 -1
  27. package/Engines/engine.common.js +61 -1
  28. package/Engines/engine.common.js.map +1 -1
  29. package/Engines/engine.pure.d.ts +0 -7
  30. package/Engines/engine.pure.js +0 -34
  31. package/Engines/engine.pure.js.map +1 -1
  32. package/Engines/thinNativeEngine.pure.js +15 -8
  33. package/Engines/thinNativeEngine.pure.js.map +1 -1
  34. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +1 -1
  35. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
  36. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +8 -0
  37. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +26 -0
  38. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
  39. package/Materials/PBR/pbrMaterial.pure.d.ts +6 -0
  40. package/Materials/PBR/pbrMaterial.pure.js +8 -0
  41. package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
  42. package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js +17 -5
  43. package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js.map +1 -1
  44. package/Materials/effect.pure.d.ts +2 -2
  45. package/Materials/effect.pure.js +12 -6
  46. package/Materials/effect.pure.js.map +1 -1
  47. package/Materials/meshDebugPluginMaterial.pure.js +15 -13
  48. package/Materials/meshDebugPluginMaterial.pure.js.map +1 -1
  49. package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.d.ts +2 -0
  50. package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js +17 -0
  51. package/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.js.map +1 -1
  52. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +4 -0
  53. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  54. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +6 -0
  55. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +8 -0
  56. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  57. package/Misc/tools.pure.js +11 -4
  58. package/Misc/tools.pure.js.map +1 -1
  59. package/Particles/computeShaderParticleSystem.pure.js +5 -1
  60. package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
  61. package/Particles/gpuParticleSystem.pure.d.ts +1 -0
  62. package/Particles/gpuParticleSystem.pure.js +17 -1
  63. package/Particles/gpuParticleSystem.pure.js.map +1 -1
  64. package/ShadersWGSL/gpuRenderParticles.fragment.d.ts +5 -0
  65. package/ShadersWGSL/gpuRenderParticles.fragment.js +50 -0
  66. package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -0
  67. package/ShadersWGSL/gpuRenderParticles.vertex.d.ts +5 -0
  68. package/ShadersWGSL/gpuRenderParticles.vertex.js +120 -0
  69. package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -0
  70. package/ShadersWGSL/noise.fragment.d.ts +5 -0
  71. package/ShadersWGSL/noise.fragment.js +18 -0
  72. package/ShadersWGSL/noise.fragment.js.map +1 -0
  73. package/SmartAssets/index.d.ts +1 -1
  74. package/SmartAssets/index.js +1 -1
  75. package/SmartAssets/index.js.map +1 -1
  76. package/SmartAssets/pure.d.ts +1 -0
  77. package/SmartAssets/pure.js +1 -0
  78. package/SmartAssets/pure.js.map +1 -1
  79. package/SmartAssets/{smartAssetManager.js → smartAssetManager.pure.js} +30 -17
  80. package/SmartAssets/smartAssetManager.pure.js.map +1 -0
  81. package/package.json +1 -1
  82. package/SmartAssets/smartAssetManager.js.map +0 -1
  83. /package/SmartAssets/{smartAssetManager.d.ts → smartAssetManager.pure.d.ts} +0 -0
@@ -11,7 +11,9 @@ export declare abstract class _AudioAnalyzerSubNode extends _AbstractAudioSubNod
11
11
  abstract maxDecibels: number;
12
12
  abstract smoothing: number;
13
13
  abstract getByteFrequencyData(): Uint8Array;
14
+ abstract getByteTimeDomainData(): Uint8Array;
14
15
  abstract getFloatFrequencyData(): Float32Array;
16
+ abstract getFloatTimeDomainData(): Float32Array;
15
17
  /** @internal */
16
18
  setOptions(options: Partial<IAudioAnalyzerOptions>): void;
17
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audioAnalyzerSubNode.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6D,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAE3I,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,gBAAgB;AAChB,MAAM,OAAgB,qBAAsB,SAAQ,qBAAqB;IACrE,YAAsB,MAAqB;QACvC,KAAK,yCAAwB,MAAM,CAAC,CAAC;IACzC,CAAC;IAUD,gBAAgB;IACT,UAAU,CAAC,OAAuC;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,sBAAsB,CAAC,OAAO,CAAC;QACzE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,mBAAmB,IAAI,sBAAsB,CAAC,WAAW,CAAC;QACrF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,mBAAmB,IAAI,sBAAsB,CAAC,WAAW,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,iBAAiB,IAAI,sBAAsB,CAAC,SAAS,CAAC;IACnF,CAAC;CACJ;AAED,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CAAC,QAAgC;IACrE,OAAO,QAAQ,CAAC,UAAU,wCAA8C,CAAC;AAC7E,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,yBAAyB,CAAgD,QAAgC,EAAE,QAAW,EAAE,KAA+B;IACnK,QAAQ,CAAC,aAAa,yCAA+C,CAAC,IAAI,EAAE,EAAE;QAC1E,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import { type Nullable } from \"../../../types\";\nimport { type AudioEngineV2 } from \"../audioEngineV2\";\nimport { type AudioAnalyzerFFTSizeType, type IAudioAnalyzerOptions, _AudioAnalyzerDefaults } from \"../subProperties/abstractAudioAnalyzer\";\nimport { type _AbstractAudioSubGraph } from \"./abstractAudioSubGraph\";\nimport { _AbstractAudioSubNode } from \"./abstractAudioSubNode\";\nimport { AudioSubNode } from \"./audioSubNode\";\n\n/** @internal */\nexport abstract class _AudioAnalyzerSubNode extends _AbstractAudioSubNode {\n protected constructor(engine: AudioEngineV2) {\n super(AudioSubNode.ANALYZER, engine);\n }\n\n public abstract fftSize: AudioAnalyzerFFTSizeType;\n public abstract minDecibels: number;\n public abstract maxDecibels: number;\n public abstract smoothing: number;\n\n public abstract getByteFrequencyData(): Uint8Array;\n public abstract getFloatFrequencyData(): Float32Array;\n\n /** @internal */\n public setOptions(options: Partial<IAudioAnalyzerOptions>): void {\n this.fftSize = options.analyzerFFTSize ?? _AudioAnalyzerDefaults.fftSize;\n this.minDecibels = options.analyzerMinDecibels ?? _AudioAnalyzerDefaults.minDecibels;\n this.maxDecibels = options.analyzerMaxDecibels ?? _AudioAnalyzerDefaults.maxDecibels;\n this.smoothing = options.analyzerSmoothing ?? _AudioAnalyzerDefaults.smoothing;\n }\n}\n\n/** @internal */\nexport function _GetAudioAnalyzerSubNode(subGraph: _AbstractAudioSubGraph): Nullable<_AudioAnalyzerSubNode> {\n return subGraph.getSubNode<_AudioAnalyzerSubNode>(AudioSubNode.ANALYZER);\n}\n\n/** @internal */\nexport function _SetAudioAnalyzerProperty<K extends keyof typeof _AudioAnalyzerDefaults>(subGraph: _AbstractAudioSubGraph, property: K, value: _AudioAnalyzerSubNode[K]): void {\n subGraph.callOnSubNode<_AudioAnalyzerSubNode>(AudioSubNode.ANALYZER, (node) => {\n node[property] = value;\n });\n}\n"]}
1
+ {"version":3,"file":"audioAnalyzerSubNode.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6D,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAE3I,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,gBAAgB;AAChB,MAAM,OAAgB,qBAAsB,SAAQ,qBAAqB;IACrE,YAAsB,MAAqB;QACvC,KAAK,yCAAwB,MAAM,CAAC,CAAC;IACzC,CAAC;IAYD,gBAAgB;IACT,UAAU,CAAC,OAAuC;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,sBAAsB,CAAC,OAAO,CAAC;QACzE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,mBAAmB,IAAI,sBAAsB,CAAC,WAAW,CAAC;QACrF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,mBAAmB,IAAI,sBAAsB,CAAC,WAAW,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,iBAAiB,IAAI,sBAAsB,CAAC,SAAS,CAAC;IACnF,CAAC;CACJ;AAED,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CAAC,QAAgC;IACrE,OAAO,QAAQ,CAAC,UAAU,wCAA8C,CAAC;AAC7E,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,yBAAyB,CAAgD,QAAgC,EAAE,QAAW,EAAE,KAA+B;IACnK,QAAQ,CAAC,aAAa,yCAA+C,CAAC,IAAI,EAAE,EAAE;QAC1E,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import { type Nullable } from \"../../../types\";\nimport { type AudioEngineV2 } from \"../audioEngineV2\";\nimport { type AudioAnalyzerFFTSizeType, type IAudioAnalyzerOptions, _AudioAnalyzerDefaults } from \"../subProperties/abstractAudioAnalyzer\";\nimport { type _AbstractAudioSubGraph } from \"./abstractAudioSubGraph\";\nimport { _AbstractAudioSubNode } from \"./abstractAudioSubNode\";\nimport { AudioSubNode } from \"./audioSubNode\";\n\n/** @internal */\nexport abstract class _AudioAnalyzerSubNode extends _AbstractAudioSubNode {\n protected constructor(engine: AudioEngineV2) {\n super(AudioSubNode.ANALYZER, engine);\n }\n\n public abstract fftSize: AudioAnalyzerFFTSizeType;\n public abstract minDecibels: number;\n public abstract maxDecibels: number;\n public abstract smoothing: number;\n\n public abstract getByteFrequencyData(): Uint8Array;\n public abstract getByteTimeDomainData(): Uint8Array;\n public abstract getFloatFrequencyData(): Float32Array;\n public abstract getFloatTimeDomainData(): Float32Array;\n\n /** @internal */\n public setOptions(options: Partial<IAudioAnalyzerOptions>): void {\n this.fftSize = options.analyzerFFTSize ?? _AudioAnalyzerDefaults.fftSize;\n this.minDecibels = options.analyzerMinDecibels ?? _AudioAnalyzerDefaults.minDecibels;\n this.maxDecibels = options.analyzerMaxDecibels ?? _AudioAnalyzerDefaults.maxDecibels;\n this.smoothing = options.analyzerSmoothing ?? _AudioAnalyzerDefaults.smoothing;\n }\n}\n\n/** @internal */\nexport function _GetAudioAnalyzerSubNode(subGraph: _AbstractAudioSubGraph): Nullable<_AudioAnalyzerSubNode> {\n return subGraph.getSubNode<_AudioAnalyzerSubNode>(AudioSubNode.ANALYZER);\n}\n\n/** @internal */\nexport function _SetAudioAnalyzerProperty<K extends keyof typeof _AudioAnalyzerDefaults>(subGraph: _AbstractAudioSubGraph, property: K, value: _AudioAnalyzerSubNode[K]): void {\n subGraph.callOnSubNode<_AudioAnalyzerSubNode>(AudioSubNode.ANALYZER, (node) => {\n node[property] = value;\n });\n}\n"]}
@@ -49,7 +49,7 @@ export declare abstract class AbstractAudioAnalyzer {
49
49
  get frequencyBinCount(): number;
50
50
  /**
51
51
  * Whether the analyzer is enabled or not.
52
- * - The `getByteFrequencyData` and `getFloatFrequencyData` functions return `null` if the analyzer is not enabled.
52
+ * - The data retrieval functions return an empty array if the analyzer is not enabled.
53
53
  * @see {@link enableAsync}
54
54
  */
55
55
  abstract isEnabled: boolean;
@@ -75,12 +75,22 @@ export declare abstract class AbstractAudioAnalyzer {
75
75
  abstract enableAsync(): Promise<void>;
76
76
  /**
77
77
  * Gets the current frequency data as a byte array
78
- * @returns a Uint8Array if the analyzer is enabled, otherwise `null`
78
+ * @returns a Uint8Array if the analyzer is enabled, otherwise an empty array
79
79
  */
80
80
  abstract getByteFrequencyData(): Uint8Array;
81
+ /**
82
+ * Gets the current waveform data as a byte array
83
+ * @returns a Uint8Array with length `fftSize` if the analyzer is enabled, otherwise an empty array
84
+ */
85
+ getByteTimeDomainData(): Uint8Array;
81
86
  /**
82
87
  * Gets the current frequency data as a float array
83
- * @returns a Float32Array if the analyzer is enabled, otherwise `null`
88
+ * @returns a Float32Array if the analyzer is enabled, otherwise an empty array
84
89
  */
85
90
  abstract getFloatFrequencyData(): Float32Array;
91
+ /**
92
+ * Gets the current waveform data as a float array
93
+ * @returns a Float32Array with length `fftSize` if the analyzer is enabled, otherwise an empty array
94
+ */
95
+ getFloatTimeDomainData(): Float32Array;
86
96
  }
@@ -4,6 +4,8 @@ export const _AudioAnalyzerDefaults = {
4
4
  maxDecibels: -30,
5
5
  smoothing: 0.8,
6
6
  };
7
+ let EmptyByteTimeDomainData;
8
+ let EmptyFloatTimeDomainData;
7
9
  /**
8
10
  * @param options The audio analyzer options to check.
9
11
  * @returns `true` if audio analyzer options are defined, otherwise `false`.
@@ -25,5 +27,19 @@ export class AbstractAudioAnalyzer {
25
27
  get frequencyBinCount() {
26
28
  return this.fftSize / 2;
27
29
  }
30
+ /**
31
+ * Gets the current waveform data as a byte array
32
+ * @returns a Uint8Array with length `fftSize` if the analyzer is enabled, otherwise an empty array
33
+ */
34
+ getByteTimeDomainData() {
35
+ return (EmptyByteTimeDomainData ?? (EmptyByteTimeDomainData = new Uint8Array()));
36
+ }
37
+ /**
38
+ * Gets the current waveform data as a float array
39
+ * @returns a Float32Array with length `fftSize` if the analyzer is enabled, otherwise an empty array
40
+ */
41
+ getFloatTimeDomainData() {
42
+ return (EmptyFloatTimeDomainData ?? (EmptyFloatTimeDomainData = new Float32Array()));
43
+ }
28
44
  }
29
45
  //# sourceMappingURL=abstractAudioAnalyzer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"abstractAudioAnalyzer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,OAAO,EAAE,IAAgC;IACzC,WAAW,EAAE,CAAC,GAAa;IAC3B,WAAW,EAAE,CAAC,EAAY;IAC1B,SAAS,EAAE,GAAa;CAClB,CAAC;AA+BX;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAuC;IAC5E,OAAO,CACH,OAAO,CAAC,eAAe;QACvB,OAAO,CAAC,eAAe,KAAK,SAAS;QACrC,OAAO,CAAC,mBAAmB,KAAK,SAAS;QACzC,OAAO,CAAC,mBAAmB,KAAK,SAAS;QACzC,OAAO,CAAC,iBAAiB,KAAK,SAAS,CAC1C,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,OAAgB,qBAAqB;IAMvC;;OAEG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;CA6CJ","sourcesContent":["// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type AudioAnalyzerFFTSizeType = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | 8192 | 16384 | 32768;\n\nexport const _AudioAnalyzerDefaults = {\n fftSize: 2048 as AudioAnalyzerFFTSizeType,\n minDecibels: -100 as number,\n maxDecibels: -30 as number,\n smoothing: 0.8 as number,\n} as const;\n\n/**\n * Options for the AudioAnalyzer\n */\nexport interface IAudioAnalyzerOptions {\n /**\n * Enable the audio analyzer. Defaults to false.\n */\n analyzerEnabled: boolean;\n /**\n * The size of the FFT (fast fourier transform) to use when converting time-domain data to frequency-domain data. Default is 2048.\n */\n analyzerFFTSize: AudioAnalyzerFFTSizeType;\n\n /**\n * The minimum decibel value for the range of the analyzer. Default is -100.\n */\n analyzerMinDecibels: number;\n\n /**\n * The maximum decibel value for the range of the analyzer. Default is -30.\n */\n analyzerMaxDecibels: number;\n\n /**\n * A number between 0 and 1 that determines how quickly the analyzer's value changes. Default is 0.8.\n */\n analyzerSmoothing: number;\n}\n\n/**\n * @param options The audio analyzer options to check.\n * @returns `true` if audio analyzer options are defined, otherwise `false`.\n */\nexport function _HasAudioAnalyzerOptions(options: Partial<IAudioAnalyzerOptions>): boolean {\n return (\n options.analyzerEnabled ||\n options.analyzerFFTSize !== undefined ||\n options.analyzerMinDecibels !== undefined ||\n options.analyzerMaxDecibels !== undefined ||\n options.analyzerSmoothing !== undefined\n );\n}\n\n/**\n * An AudioAnalyzer converts time-domain audio data into the frequency-domain.\n */\nexport abstract class AbstractAudioAnalyzer {\n /**\n * The size of the FFT (fast fourier transform) to use when converting time-domain data to frequency-domain data. Default is 2048.\n */\n public abstract fftSize: AudioAnalyzerFFTSizeType;\n\n /**\n * The number of data values that will be returned when calling getByteFrequencyData() or getFloatFrequencyData(). This is always half the `fftSize`.\n */\n public get frequencyBinCount(): number {\n return this.fftSize / 2;\n }\n\n /**\n * Whether the analyzer is enabled or not.\n * - The `getByteFrequencyData` and `getFloatFrequencyData` functions return `null` if the analyzer is not enabled.\n * @see {@link enableAsync}\n */\n public abstract isEnabled: boolean;\n\n /**\n * The minimum decibel value for the range of the analyzer. Default is -100.\n */\n public abstract minDecibels: number;\n\n /**\n * The maximum decibel value for the range of the analyzer. Default is -30.\n */\n public abstract maxDecibels: number;\n\n /**\n * A number between 0 and 1 that determines how quickly the analyzer's value changes. Default is 0.8.\n */\n public abstract smoothing: number;\n\n /**\n * Releases associated resources.\n */\n public abstract dispose(): void;\n\n /**\n * Enables the analyzer\n */\n public abstract enableAsync(): Promise<void>;\n\n /**\n * Gets the current frequency data as a byte array\n * @returns a Uint8Array if the analyzer is enabled, otherwise `null`\n */\n public abstract getByteFrequencyData(): Uint8Array;\n\n /**\n * Gets the current frequency data as a float array\n * @returns a Float32Array if the analyzer is enabled, otherwise `null`\n */\n public abstract getFloatFrequencyData(): Float32Array;\n}\n"]}
1
+ {"version":3,"file":"abstractAudioAnalyzer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,OAAO,EAAE,IAAgC;IACzC,WAAW,EAAE,CAAC,GAAa;IAC3B,WAAW,EAAE,CAAC,EAAY;IAC1B,SAAS,EAAE,GAAa;CAClB,CAAC;AAEX,IAAI,uBAA+C,CAAC;AACpD,IAAI,wBAAkD,CAAC;AA+BvD;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAuC;IAC5E,OAAO,CACH,OAAO,CAAC,eAAe;QACvB,OAAO,CAAC,eAAe,KAAK,SAAS;QACrC,OAAO,CAAC,mBAAmB,KAAK,SAAS;QACzC,OAAO,CAAC,mBAAmB,KAAK,SAAS;QACzC,OAAO,CAAC,iBAAiB,KAAK,SAAS,CAC1C,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,OAAgB,qBAAqB;IAMvC;;OAEG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAwCD;;;OAGG;IACI,qBAAqB;QACxB,OAAO,CAAC,uBAAuB,KAAvB,uBAAuB,GAAK,IAAI,UAAU,EAAE,EAAC,CAAC;IAC1D,CAAC;IAQD;;;OAGG;IACI,sBAAsB;QACzB,OAAO,CAAC,wBAAwB,KAAxB,wBAAwB,GAAK,IAAI,YAAY,EAAE,EAAC,CAAC;IAC7D,CAAC;CACJ","sourcesContent":["// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type AudioAnalyzerFFTSizeType = 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | 8192 | 16384 | 32768;\n\nexport const _AudioAnalyzerDefaults = {\n fftSize: 2048 as AudioAnalyzerFFTSizeType,\n minDecibels: -100 as number,\n maxDecibels: -30 as number,\n smoothing: 0.8 as number,\n} as const;\n\nlet EmptyByteTimeDomainData: Uint8Array | undefined;\nlet EmptyFloatTimeDomainData: Float32Array | undefined;\n\n/**\n * Options for the AudioAnalyzer\n */\nexport interface IAudioAnalyzerOptions {\n /**\n * Enable the audio analyzer. Defaults to false.\n */\n analyzerEnabled: boolean;\n /**\n * The size of the FFT (fast fourier transform) to use when converting time-domain data to frequency-domain data. Default is 2048.\n */\n analyzerFFTSize: AudioAnalyzerFFTSizeType;\n\n /**\n * The minimum decibel value for the range of the analyzer. Default is -100.\n */\n analyzerMinDecibels: number;\n\n /**\n * The maximum decibel value for the range of the analyzer. Default is -30.\n */\n analyzerMaxDecibels: number;\n\n /**\n * A number between 0 and 1 that determines how quickly the analyzer's value changes. Default is 0.8.\n */\n analyzerSmoothing: number;\n}\n\n/**\n * @param options The audio analyzer options to check.\n * @returns `true` if audio analyzer options are defined, otherwise `false`.\n */\nexport function _HasAudioAnalyzerOptions(options: Partial<IAudioAnalyzerOptions>): boolean {\n return (\n options.analyzerEnabled ||\n options.analyzerFFTSize !== undefined ||\n options.analyzerMinDecibels !== undefined ||\n options.analyzerMaxDecibels !== undefined ||\n options.analyzerSmoothing !== undefined\n );\n}\n\n/**\n * An AudioAnalyzer converts time-domain audio data into the frequency-domain.\n */\nexport abstract class AbstractAudioAnalyzer {\n /**\n * The size of the FFT (fast fourier transform) to use when converting time-domain data to frequency-domain data. Default is 2048.\n */\n public abstract fftSize: AudioAnalyzerFFTSizeType;\n\n /**\n * The number of data values that will be returned when calling getByteFrequencyData() or getFloatFrequencyData(). This is always half the `fftSize`.\n */\n public get frequencyBinCount(): number {\n return this.fftSize / 2;\n }\n\n /**\n * Whether the analyzer is enabled or not.\n * - The data retrieval functions return an empty array if the analyzer is not enabled.\n * @see {@link enableAsync}\n */\n public abstract isEnabled: boolean;\n\n /**\n * The minimum decibel value for the range of the analyzer. Default is -100.\n */\n public abstract minDecibels: number;\n\n /**\n * The maximum decibel value for the range of the analyzer. Default is -30.\n */\n public abstract maxDecibels: number;\n\n /**\n * A number between 0 and 1 that determines how quickly the analyzer's value changes. Default is 0.8.\n */\n public abstract smoothing: number;\n\n /**\n * Releases associated resources.\n */\n public abstract dispose(): void;\n\n /**\n * Enables the analyzer\n */\n public abstract enableAsync(): Promise<void>;\n\n /**\n * Gets the current frequency data as a byte array\n * @returns a Uint8Array if the analyzer is enabled, otherwise an empty array\n */\n public abstract getByteFrequencyData(): Uint8Array;\n\n /**\n * Gets the current waveform data as a byte array\n * @returns a Uint8Array with length `fftSize` if the analyzer is enabled, otherwise an empty array\n */\n public getByteTimeDomainData(): Uint8Array {\n return (EmptyByteTimeDomainData ??= new Uint8Array());\n }\n\n /**\n * Gets the current frequency data as a float array\n * @returns a Float32Array if the analyzer is enabled, otherwise an empty array\n */\n public abstract getFloatFrequencyData(): Float32Array;\n\n /**\n * Gets the current waveform data as a float array\n * @returns a Float32Array with length `fftSize` if the analyzer is enabled, otherwise an empty array\n */\n public getFloatTimeDomainData(): Float32Array {\n return (EmptyFloatTimeDomainData ??= new Float32Array());\n }\n}\n"]}
@@ -34,5 +34,9 @@ export declare class _AudioAnalyzer extends AbstractAudioAnalyzer {
34
34
  /** @internal */
35
35
  getByteFrequencyData(): Uint8Array;
36
36
  /** @internal */
37
+ getByteTimeDomainData(): Uint8Array;
38
+ /** @internal */
37
39
  getFloatFrequencyData(): Float32Array;
40
+ /** @internal */
41
+ getFloatTimeDomainData(): Float32Array;
38
42
  }
@@ -92,6 +92,17 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer {
92
92
  return subNode.getByteFrequencyData();
93
93
  }
94
94
  /** @internal */
95
+ getByteTimeDomainData() {
96
+ const subNode = _GetAudioAnalyzerSubNode(this._subGraph);
97
+ if (!subNode) {
98
+ Logger.Warn("AudioAnalyzer not enabled");
99
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
100
+ this.enableAsync();
101
+ return super.getByteTimeDomainData();
102
+ }
103
+ return subNode.getByteTimeDomainData();
104
+ }
105
+ /** @internal */
95
106
  getFloatFrequencyData() {
96
107
  const subNode = _GetAudioAnalyzerSubNode(this._subGraph);
97
108
  if (!subNode) {
@@ -102,5 +113,16 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer {
102
113
  }
103
114
  return subNode.getFloatFrequencyData();
104
115
  }
116
+ /** @internal */
117
+ getFloatTimeDomainData() {
118
+ const subNode = _GetAudioAnalyzerSubNode(this._subGraph);
119
+ if (!subNode) {
120
+ Logger.Warn("AudioAnalyzer not enabled");
121
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
122
+ this.enableAsync();
123
+ return super.getFloatTimeDomainData();
124
+ }
125
+ return subNode.getFloatTimeDomainData();
126
+ }
105
127
  }
106
128
  //# sourceMappingURL=audioAnalyzer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audioAnalyzer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../../Misc/logger\";\nimport { type Nullable } from \"../../../types\";\nimport { type AudioAnalyzerFFTSizeType, _AudioAnalyzerDefaults, AbstractAudioAnalyzer } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport { type _AbstractAudioSubGraph } from \"../subNodes/abstractAudioSubGraph\";\nimport { _GetAudioAnalyzerSubNode, _SetAudioAnalyzerProperty } from \"../subNodes/audioAnalyzerSubNode\";\nimport { AudioSubNode } from \"../subNodes/audioSubNode\";\n\nlet EmptyByteFrequencyData: Nullable<Uint8Array> = null;\nlet EmptyFloatFrequencyData: Nullable<Float32Array> = null;\n\n/** @internal */\nexport function _GetEmptyByteFrequencyData(): Uint8Array {\n if (!EmptyByteFrequencyData) {\n EmptyByteFrequencyData = new Uint8Array();\n }\n return EmptyByteFrequencyData;\n}\n\n/** @internal */\nexport function _GetEmptyFloatFrequencyData(): Float32Array {\n if (!EmptyFloatFrequencyData) {\n EmptyFloatFrequencyData = new Float32Array();\n }\n return EmptyFloatFrequencyData;\n}\n\n/** @internal */\nexport class _AudioAnalyzer extends AbstractAudioAnalyzer {\n private _fftSize: AudioAnalyzerFFTSizeType = _AudioAnalyzerDefaults.fftSize;\n private _maxDecibels: number = _AudioAnalyzerDefaults.maxDecibels;\n private _minDecibels: number = _AudioAnalyzerDefaults.minDecibels;\n private _smoothing: number = _AudioAnalyzerDefaults.smoothing;\n private _subGraph: _AbstractAudioSubGraph;\n\n /** @internal */\n public constructor(subGraph: _AbstractAudioSubGraph) {\n super();\n this._subGraph = subGraph;\n }\n\n /** @internal */\n public get fftSize(): AudioAnalyzerFFTSizeType {\n return this._fftSize;\n }\n\n public set fftSize(value: AudioAnalyzerFFTSizeType) {\n this._fftSize = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"fftSize\", value);\n }\n\n /** @internal */\n public get isEnabled(): boolean {\n return _GetAudioAnalyzerSubNode(this._subGraph) !== null;\n }\n\n /** @internal */\n public get minDecibels(): number {\n return this._minDecibels;\n }\n\n public set minDecibels(value: number) {\n this._minDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"minDecibels\", value);\n }\n\n /** @internal */\n public get maxDecibels(): number {\n return this._maxDecibels;\n }\n\n public set maxDecibels(value: number) {\n this._maxDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"maxDecibels\", value);\n }\n\n /** @internal */\n public get smoothing(): number {\n return this._smoothing;\n }\n\n public set smoothing(value: number) {\n this._smoothing = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"smoothing\", value);\n }\n\n /** @internal */\n public dispose(): void {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (subNode) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._subGraph.removeSubNodeAsync(subNode);\n subNode.dispose();\n }\n }\n\n /** @internal */\n public async enableAsync(): Promise<void> {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n await this._subGraph.createAndAddSubNodeAsync(AudioSubNode.ANALYZER);\n }\n }\n\n /** @internal */\n public getByteFrequencyData(): Uint8Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return _GetEmptyByteFrequencyData();\n }\n return subNode.getByteFrequencyData();\n }\n\n /** @internal */\n public getFloatFrequencyData(): Float32Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return _GetEmptyFloatFrequencyData();\n }\n return subNode.getFloatFrequencyData();\n }\n}\n"]}
1
+ {"version":3,"file":"audioAnalyzer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../../Misc/logger\";\nimport { type Nullable } from \"../../../types\";\nimport { type AudioAnalyzerFFTSizeType, _AudioAnalyzerDefaults, AbstractAudioAnalyzer } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport { type _AbstractAudioSubGraph } from \"../subNodes/abstractAudioSubGraph\";\nimport { _GetAudioAnalyzerSubNode, _SetAudioAnalyzerProperty } from \"../subNodes/audioAnalyzerSubNode\";\nimport { AudioSubNode } from \"../subNodes/audioSubNode\";\n\nlet EmptyByteFrequencyData: Nullable<Uint8Array> = null;\nlet EmptyFloatFrequencyData: Nullable<Float32Array> = null;\n\n/** @internal */\nexport function _GetEmptyByteFrequencyData(): Uint8Array {\n if (!EmptyByteFrequencyData) {\n EmptyByteFrequencyData = new Uint8Array();\n }\n return EmptyByteFrequencyData;\n}\n\n/** @internal */\nexport function _GetEmptyFloatFrequencyData(): Float32Array {\n if (!EmptyFloatFrequencyData) {\n EmptyFloatFrequencyData = new Float32Array();\n }\n return EmptyFloatFrequencyData;\n}\n\n/** @internal */\nexport class _AudioAnalyzer extends AbstractAudioAnalyzer {\n private _fftSize: AudioAnalyzerFFTSizeType = _AudioAnalyzerDefaults.fftSize;\n private _maxDecibels: number = _AudioAnalyzerDefaults.maxDecibels;\n private _minDecibels: number = _AudioAnalyzerDefaults.minDecibels;\n private _smoothing: number = _AudioAnalyzerDefaults.smoothing;\n private _subGraph: _AbstractAudioSubGraph;\n\n /** @internal */\n public constructor(subGraph: _AbstractAudioSubGraph) {\n super();\n this._subGraph = subGraph;\n }\n\n /** @internal */\n public get fftSize(): AudioAnalyzerFFTSizeType {\n return this._fftSize;\n }\n\n public set fftSize(value: AudioAnalyzerFFTSizeType) {\n this._fftSize = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"fftSize\", value);\n }\n\n /** @internal */\n public get isEnabled(): boolean {\n return _GetAudioAnalyzerSubNode(this._subGraph) !== null;\n }\n\n /** @internal */\n public get minDecibels(): number {\n return this._minDecibels;\n }\n\n public set minDecibels(value: number) {\n this._minDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"minDecibels\", value);\n }\n\n /** @internal */\n public get maxDecibels(): number {\n return this._maxDecibels;\n }\n\n public set maxDecibels(value: number) {\n this._maxDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"maxDecibels\", value);\n }\n\n /** @internal */\n public get smoothing(): number {\n return this._smoothing;\n }\n\n public set smoothing(value: number) {\n this._smoothing = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"smoothing\", value);\n }\n\n /** @internal */\n public dispose(): void {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (subNode) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._subGraph.removeSubNodeAsync(subNode);\n subNode.dispose();\n }\n }\n\n /** @internal */\n public async enableAsync(): Promise<void> {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n await this._subGraph.createAndAddSubNodeAsync(AudioSubNode.ANALYZER);\n }\n }\n\n /** @internal */\n public getByteFrequencyData(): Uint8Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return _GetEmptyByteFrequencyData();\n }\n return subNode.getByteFrequencyData();\n }\n\n /** @internal */\n public override getByteTimeDomainData(): Uint8Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return super.getByteTimeDomainData();\n }\n return subNode.getByteTimeDomainData();\n }\n\n /** @internal */\n public getFloatFrequencyData(): Float32Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return _GetEmptyFloatFrequencyData();\n }\n return subNode.getFloatFrequencyData();\n }\n\n /** @internal */\n public override getFloatTimeDomainData(): Float32Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return super.getFloatTimeDomainData();\n }\n return subNode.getFloatTimeDomainData();\n }\n}\n"]}
@@ -8,7 +8,9 @@ export declare function _CreateAudioAnalyzerSubNodeAsync(engine: _WebAudioEngine
8
8
  export declare class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode implements IWebAudioInNode {
9
9
  private readonly _analyzerNode;
10
10
  private _byteFrequencyData;
11
+ private _byteTimeDomainData;
11
12
  private _floatFrequencyData;
13
+ private _floatTimeDomainData;
12
14
  /** @internal */
13
15
  constructor(engine: _WebAudioEngine);
14
16
  /** @internal */
@@ -32,6 +34,10 @@ export declare class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode impl
32
34
  /** @internal */
33
35
  getByteFrequencyData(): Uint8Array;
34
36
  /** @internal */
37
+ getByteTimeDomainData(): Uint8Array;
38
+ /** @internal */
35
39
  getFloatFrequencyData(): Float32Array;
40
+ /** @internal */
41
+ getFloatTimeDomainData(): Float32Array;
36
42
  private _clearArrays;
37
43
  }
@@ -1,5 +1,4 @@
1
1
  import { _AudioAnalyzerSubNode } from "../../abstractAudio/subNodes/audioAnalyzerSubNode.js";
2
- import { _GetEmptyByteFrequencyData, _GetEmptyFloatFrequencyData } from "../../abstractAudio/subProperties/audioAnalyzer.js";
3
2
  /** @internal */
4
3
  // eslint-disable-next-line @typescript-eslint/require-await
5
4
  export async function _CreateAudioAnalyzerSubNodeAsync(engine) {
@@ -11,7 +10,9 @@ export class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode {
11
10
  constructor(engine) {
12
11
  super(engine);
13
12
  this._byteFrequencyData = null;
13
+ this._byteTimeDomainData = null;
14
14
  this._floatFrequencyData = null;
15
+ this._floatTimeDomainData = null;
15
16
  this._analyzerNode = new AnalyserNode(engine._audioContext);
16
17
  }
17
18
  /** @internal */
@@ -54,8 +55,6 @@ export class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode {
54
55
  dispose() {
55
56
  super.dispose();
56
57
  this._clearArrays();
57
- this._byteFrequencyData = null;
58
- this._floatFrequencyData = null;
59
58
  this._analyzerNode.disconnect();
60
59
  }
61
60
  /** @internal */
@@ -71,6 +70,14 @@ export class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode {
71
70
  return this._byteFrequencyData;
72
71
  }
73
72
  /** @internal */
73
+ getByteTimeDomainData() {
74
+ if (!this._byteTimeDomainData || this._byteTimeDomainData.length === 0) {
75
+ this._byteTimeDomainData = new Uint8Array(this._analyzerNode.fftSize);
76
+ }
77
+ this._analyzerNode.getByteTimeDomainData(this._byteTimeDomainData);
78
+ return this._byteTimeDomainData;
79
+ }
80
+ /** @internal */
74
81
  getFloatFrequencyData() {
75
82
  if (!this._floatFrequencyData || this._floatFrequencyData.length === 0) {
76
83
  this._floatFrequencyData = new Float32Array(this._analyzerNode.frequencyBinCount);
@@ -78,9 +85,19 @@ export class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode {
78
85
  this._analyzerNode.getFloatFrequencyData(this._floatFrequencyData);
79
86
  return this._floatFrequencyData;
80
87
  }
88
+ /** @internal */
89
+ getFloatTimeDomainData() {
90
+ if (!this._floatTimeDomainData || this._floatTimeDomainData.length === 0) {
91
+ this._floatTimeDomainData = new Float32Array(this._analyzerNode.fftSize);
92
+ }
93
+ this._analyzerNode.getFloatTimeDomainData(this._floatTimeDomainData);
94
+ return this._floatTimeDomainData;
95
+ }
81
96
  _clearArrays() {
82
- this._byteFrequencyData?.set(_GetEmptyByteFrequencyData());
83
- this._floatFrequencyData?.set(_GetEmptyFloatFrequencyData());
97
+ this._byteFrequencyData = null;
98
+ this._byteTimeDomainData = null;
99
+ this._floatFrequencyData = null;
100
+ this._floatTimeDomainData = null;
84
101
  }
85
102
  }
86
103
  //# sourceMappingURL=webAudioAnalyzerSubNode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webAudioAnalyzerSubNode.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../../../types\";\nimport { _AudioAnalyzerSubNode } from \"../../abstractAudio/subNodes/audioAnalyzerSubNode\";\nimport { type AudioAnalyzerFFTSizeType } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport { _GetEmptyByteFrequencyData, _GetEmptyFloatFrequencyData } from \"../../abstractAudio/subProperties/audioAnalyzer\";\nimport { type _WebAudioEngine } from \"../webAudioEngine\";\nimport { type IWebAudioInNode } from \"../webAudioNode\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function _CreateAudioAnalyzerSubNodeAsync(engine: _WebAudioEngine): Promise<_AudioAnalyzerSubNode> {\n return new _WebAudioAnalyzerSubNode(engine);\n}\n\n/** @internal */\nexport class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode implements IWebAudioInNode {\n private readonly _analyzerNode: AnalyserNode;\n private _byteFrequencyData: Nullable<Uint8Array<ArrayBuffer>> = null;\n private _floatFrequencyData: Nullable<Float32Array<ArrayBuffer>> = null;\n\n /** @internal */\n public constructor(engine: _WebAudioEngine) {\n super(engine);\n\n this._analyzerNode = new AnalyserNode(engine._audioContext);\n }\n\n /** @internal */\n public get fftSize(): AudioAnalyzerFFTSizeType {\n return this._analyzerNode.fftSize as AudioAnalyzerFFTSizeType;\n }\n\n public set fftSize(value: AudioAnalyzerFFTSizeType) {\n if (value === this._analyzerNode.fftSize) {\n return;\n }\n\n this._analyzerNode.fftSize = value;\n\n this._clearArrays();\n }\n\n /** @internal */\n public get _inNode(): AudioNode {\n return this._analyzerNode;\n }\n\n /** @internal */\n public get minDecibels(): number {\n return this._analyzerNode.minDecibels;\n }\n\n public set minDecibels(value: number) {\n this._analyzerNode.minDecibels = value;\n }\n\n /** @internal */\n public get maxDecibels(): number {\n return this._analyzerNode.maxDecibels;\n }\n\n public set maxDecibels(value: number) {\n this._analyzerNode.maxDecibels = value;\n }\n\n /** @internal */\n public get smoothing(): number {\n return this._analyzerNode.smoothingTimeConstant;\n }\n\n public set smoothing(value: number) {\n this._analyzerNode.smoothingTimeConstant = value;\n }\n\n /** @internal */\n public override dispose(): void {\n super.dispose();\n\n this._clearArrays();\n this._byteFrequencyData = null;\n this._floatFrequencyData = null;\n\n this._analyzerNode.disconnect();\n }\n\n /** @internal */\n public getClassName(): string {\n return \"_WebAudioAnalyzerSubNode\";\n }\n\n /** @internal */\n public getByteFrequencyData(): Uint8Array {\n if (!this._byteFrequencyData || this._byteFrequencyData.length === 0) {\n this._byteFrequencyData = new Uint8Array(this._analyzerNode.frequencyBinCount);\n }\n this._analyzerNode.getByteFrequencyData(this._byteFrequencyData);\n return this._byteFrequencyData;\n }\n\n /** @internal */\n public getFloatFrequencyData(): Float32Array {\n if (!this._floatFrequencyData || this._floatFrequencyData.length === 0) {\n this._floatFrequencyData = new Float32Array(this._analyzerNode.frequencyBinCount);\n }\n this._analyzerNode.getFloatFrequencyData(this._floatFrequencyData);\n return this._floatFrequencyData;\n }\n\n private _clearArrays(): void {\n this._byteFrequencyData?.set(_GetEmptyByteFrequencyData());\n this._floatFrequencyData?.set(_GetEmptyFloatFrequencyData());\n }\n}\n"]}
1
+ {"version":3,"file":"webAudioAnalyzerSubNode.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAK1F,gBAAgB;AAChB,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,MAAuB;IAC1E,OAAO,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,gBAAgB;AAChB,MAAM,OAAO,wBAAyB,SAAQ,qBAAqB;IAO/D,gBAAgB;IAChB,YAAmB,MAAuB;QACtC,KAAK,CAAC,MAAM,CAAC,CAAC;QAPV,uBAAkB,GAAsC,IAAI,CAAC;QAC7D,wBAAmB,GAAsC,IAAI,CAAC;QAC9D,wBAAmB,GAAwC,IAAI,CAAC;QAChE,yBAAoB,GAAwC,IAAI,CAAC;QAMrE,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC;IAED,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,OAAmC,CAAC;IAClE,CAAC;IAED,IAAW,OAAO,CAAC,KAA+B;QAC9C,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;QAEnC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,gBAAgB;IAChB,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IAC1C,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IAC1C,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC;IACpD,CAAC;IAED,IAAW,SAAS,CAAC,KAAa;QAC9B,IAAI,CAAC,aAAa,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrD,CAAC;IAED,gBAAgB;IACA,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,gBAAgB;IACT,YAAY;QACf,OAAO,0BAA0B,CAAC;IACtC,CAAC;IAED,gBAAgB;IACT,oBAAoB;QACvB,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,kBAAkB,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,gBAAgB;IACT,qBAAqB;QACxB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,mBAAmB,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED,gBAAgB;IACT,qBAAqB;QACxB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,mBAAmB,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED,gBAAgB;IACT,sBAAsB;QACzB,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,oBAAoB,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAEO,YAAY;QAChB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACrC,CAAC;CACJ","sourcesContent":["import { type Nullable } from \"../../../types\";\nimport { _AudioAnalyzerSubNode } from \"../../abstractAudio/subNodes/audioAnalyzerSubNode\";\nimport { type AudioAnalyzerFFTSizeType } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport { type _WebAudioEngine } from \"../webAudioEngine\";\nimport { type IWebAudioInNode } from \"../webAudioNode\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function _CreateAudioAnalyzerSubNodeAsync(engine: _WebAudioEngine): Promise<_AudioAnalyzerSubNode> {\n return new _WebAudioAnalyzerSubNode(engine);\n}\n\n/** @internal */\nexport class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode implements IWebAudioInNode {\n private readonly _analyzerNode: AnalyserNode;\n private _byteFrequencyData: Nullable<Uint8Array<ArrayBuffer>> = null;\n private _byteTimeDomainData: Nullable<Uint8Array<ArrayBuffer>> = null;\n private _floatFrequencyData: Nullable<Float32Array<ArrayBuffer>> = null;\n private _floatTimeDomainData: Nullable<Float32Array<ArrayBuffer>> = null;\n\n /** @internal */\n public constructor(engine: _WebAudioEngine) {\n super(engine);\n\n this._analyzerNode = new AnalyserNode(engine._audioContext);\n }\n\n /** @internal */\n public get fftSize(): AudioAnalyzerFFTSizeType {\n return this._analyzerNode.fftSize as AudioAnalyzerFFTSizeType;\n }\n\n public set fftSize(value: AudioAnalyzerFFTSizeType) {\n if (value === this._analyzerNode.fftSize) {\n return;\n }\n\n this._analyzerNode.fftSize = value;\n\n this._clearArrays();\n }\n\n /** @internal */\n public get _inNode(): AudioNode {\n return this._analyzerNode;\n }\n\n /** @internal */\n public get minDecibels(): number {\n return this._analyzerNode.minDecibels;\n }\n\n public set minDecibels(value: number) {\n this._analyzerNode.minDecibels = value;\n }\n\n /** @internal */\n public get maxDecibels(): number {\n return this._analyzerNode.maxDecibels;\n }\n\n public set maxDecibels(value: number) {\n this._analyzerNode.maxDecibels = value;\n }\n\n /** @internal */\n public get smoothing(): number {\n return this._analyzerNode.smoothingTimeConstant;\n }\n\n public set smoothing(value: number) {\n this._analyzerNode.smoothingTimeConstant = value;\n }\n\n /** @internal */\n public override dispose(): void {\n super.dispose();\n\n this._clearArrays();\n\n this._analyzerNode.disconnect();\n }\n\n /** @internal */\n public getClassName(): string {\n return \"_WebAudioAnalyzerSubNode\";\n }\n\n /** @internal */\n public getByteFrequencyData(): Uint8Array {\n if (!this._byteFrequencyData || this._byteFrequencyData.length === 0) {\n this._byteFrequencyData = new Uint8Array(this._analyzerNode.frequencyBinCount);\n }\n this._analyzerNode.getByteFrequencyData(this._byteFrequencyData);\n return this._byteFrequencyData;\n }\n\n /** @internal */\n public getByteTimeDomainData(): Uint8Array {\n if (!this._byteTimeDomainData || this._byteTimeDomainData.length === 0) {\n this._byteTimeDomainData = new Uint8Array(this._analyzerNode.fftSize);\n }\n this._analyzerNode.getByteTimeDomainData(this._byteTimeDomainData);\n return this._byteTimeDomainData;\n }\n\n /** @internal */\n public getFloatFrequencyData(): Float32Array {\n if (!this._floatFrequencyData || this._floatFrequencyData.length === 0) {\n this._floatFrequencyData = new Float32Array(this._analyzerNode.frequencyBinCount);\n }\n this._analyzerNode.getFloatFrequencyData(this._floatFrequencyData);\n return this._floatFrequencyData;\n }\n\n /** @internal */\n public getFloatTimeDomainData(): Float32Array {\n if (!this._floatTimeDomainData || this._floatTimeDomainData.length === 0) {\n this._floatTimeDomainData = new Float32Array(this._analyzerNode.fftSize);\n }\n this._analyzerNode.getFloatTimeDomainData(this._floatTimeDomainData);\n return this._floatTimeDomainData;\n }\n\n private _clearArrays(): void {\n this._byteFrequencyData = null;\n this._byteTimeDomainData = null;\n this._floatFrequencyData = null;\n this._floatTimeDomainData = null;\n }\n}\n"]}
@@ -48,6 +48,10 @@ export interface IComputeEffectCreationOptions {
48
48
  * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU
49
49
  */
50
50
  processFinalCode?: Nullable<(code: string) => string>;
51
+ /**
52
+ * If true, the engine should create an explicit pipeline layout for the compute effect instead of using an automatic layout.
53
+ */
54
+ useExplicitComputePipelineLayout?: boolean;
51
55
  }
52
56
  /**
53
57
  * Effect wrapping a compute shader and let execute (dispatch) the shader
@@ -106,6 +110,8 @@ export declare class ComputeEffect {
106
110
  _pipelineContext: Nullable<IComputePipelineContext>;
107
111
  /** @internal */
108
112
  _computeSourceCode: string;
113
+ /** @internal */
114
+ _useExplicitComputePipelineLayout: boolean;
109
115
  private _rawComputeSourceCode;
110
116
  private _entryPoint;
111
117
  private _shaderLanguage;
@@ -59,6 +59,8 @@ export class ComputeEffect {
59
59
  this._pipelineContext = null;
60
60
  /** @internal */
61
61
  this._computeSourceCode = "";
62
+ /** @internal */
63
+ this._useExplicitComputePipelineLayout = false;
62
64
  this._rawComputeSourceCode = "";
63
65
  this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
64
66
  this.name = baseName;
@@ -69,6 +71,7 @@ export class ComputeEffect {
69
71
  this.onError = options.onError;
70
72
  this.onCompiled = options.onCompiled;
71
73
  this._entryPoint = options.entryPoint ?? "main";
74
+ this._useExplicitComputePipelineLayout = !!options.useExplicitComputePipelineLayout;
72
75
  this._shaderStore = ShaderStore.GetShadersStore(this._shaderLanguage);
73
76
  this._shaderRepository = ShaderStore.GetShadersRepository(this._shaderLanguage);
74
77
  this._includeShaderStore = ShaderStore.GetIncludesShadersStore(this._shaderLanguage);
@@ -1 +1 @@
1
- {"version":3,"file":"computeEffect.js","sourceRoot":"","sources":["../../../../dev/core/src/Compute/computeEffect.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport { type Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { type IComputePipelineContext } from \"./IComputePipelineContext\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Finalize, Initialize, PreProcess } from \"../Engines/Processors/shaderProcessor\";\r\nimport { type _IProcessingOptions } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport { ShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { type ComputeCompilationMessages } from \"../Engines/Extensions/engine.computeShader\";\r\nimport { _RetryWithInterval } from \"core/Misc/timingTools\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ computeSource: \"compute shader code string\"}` for directly passing the shader code\r\n * * object: `{ computeElement: \"vertexShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ compute: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport type IComputeShaderPath = {\r\n /**\r\n * Directly pass the shader code\r\n */\r\n computeSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n compute?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n computeElement?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating a compute effect.\r\n */\r\nexport interface IComputeEffectCreationOptions {\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * The name of the entry point in the shader source (default: \"main\")\r\n */\r\n entryPoint?: string;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: ComputeEffect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: ComputeEffect, errors: string) => void>;\r\n /**\r\n * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<(code: string) => string>;\r\n}\r\n\r\n/**\r\n * Effect wrapping a compute shader and let execute (dispatch) the shader\r\n */\r\nexport class ComputeEffect {\r\n private static _UniqueIdSeed = 0;\r\n\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IComputeShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: ComputeEffect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: ComputeEffect, errors: string) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public onBindObservable = new Observable<ComputeEffect>();\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously ready\r\n */\r\n public _wasPreviouslyReady = false;\r\n\r\n private _engine: AbstractEngine;\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n /** @internal */\r\n public _key: string = \"\";\r\n private _computeSourceCodeOverride: string = \"\";\r\n /** @internal */\r\n public _pipelineContext: Nullable<IComputePipelineContext> = null;\r\n /** @internal */\r\n public _computeSourceCode: string = \"\";\r\n private _rawComputeSourceCode: string = \"\";\r\n private _entryPoint: string;\r\n private _shaderLanguage = ShaderLanguage.WGSL;\r\n private _shaderStore: { [key: string]: string };\r\n private _shaderRepository: string;\r\n private _includeShaderStore: { [key: string]: string };\r\n\r\n /**\r\n * Creates a compute effect that can be used to execute a compute shader\r\n * @param baseName Name of the effect\r\n * @param options Set of all options to create the effect\r\n * @param engine The engine the effect is created for\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n */\r\n constructor(baseName: IComputeShaderPath | string, options: IComputeEffectCreationOptions, engine: AbstractEngine, key = \"\") {\r\n this.name = baseName;\r\n this._key = key;\r\n\r\n this._engine = engine;\r\n this.uniqueId = ComputeEffect._UniqueIdSeed++;\r\n\r\n this.defines = options.defines ?? \"\";\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._entryPoint = options.entryPoint ?? \"main\";\r\n\r\n this._shaderStore = ShaderStore.GetShadersStore(this._shaderLanguage);\r\n this._shaderRepository = ShaderStore.GetShadersRepository(this._shaderLanguage);\r\n this._includeShaderStore = ShaderStore.GetIncludesShadersStore(this._shaderLanguage);\r\n\r\n let computeSource: IComputeShaderPath | HTMLElement | string;\r\n\r\n const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n computeSource = baseName;\r\n } else if (typeof baseName.computeSource === \"string\") {\r\n computeSource = \"source:\" + baseName.computeSource;\r\n } else if (typeof baseName.computeElement === \"string\") {\r\n computeSource = hostDocument?.getElementById(baseName.computeElement) || baseName.computeElement;\r\n } else {\r\n computeSource = baseName.compute || baseName;\r\n }\r\n\r\n const processorOptions: _IProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: undefined,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: false,\r\n processor: null,\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: this._shaderRepository,\r\n includesShadersStore: this._includeShaderStore,\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: null,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: (shaderType: string, code: string, defines?: string[]) => {\r\n if (!defines) {\r\n return code;\r\n }\r\n // We need to convert #define key value to a const\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n if (split.length === 2) {\r\n const key = split[0];\r\n const value = split[1];\r\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\r\n code = `const ${key} = ${value};\\n` + code;\r\n }\r\n }\r\n }\r\n return code;\r\n },\r\n };\r\n\r\n this._loadShader(computeSource, \"Compute\", \"\", (computeCode) => {\r\n Initialize(processorOptions);\r\n PreProcess(\r\n computeCode,\r\n processorOptions,\r\n (migratedComputeCode) => {\r\n this._rawComputeSourceCode = computeCode;\r\n if (options.processFinalCode) {\r\n migratedComputeCode = options.processFinalCode(migratedComputeCode);\r\n }\r\n const finalShaders = Finalize(migratedComputeCode, \"\", processorOptions);\r\n this._useFinalCode(finalShaders.vertexCode, baseName);\r\n },\r\n this._engine\r\n );\r\n });\r\n }\r\n\r\n private _useFinalCode(migratedCommputeCode: string, baseName: any) {\r\n if (baseName) {\r\n const compute = baseName.computeElement || baseName.compute || baseName.spectorName || baseName;\r\n\r\n this._computeSourceCode = \"//#define SHADER_NAME compute:\" + compute + \"\\n\" + migratedCommputeCode;\r\n } else {\r\n this._computeSourceCode = migratedCommputeCode;\r\n }\r\n this._prepareEffect();\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable<IComputePipelineContext> {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: ComputeEffect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n this._checkIsReady(null);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable<IComputePipelineContext>) {\r\n _RetryWithInterval(\r\n () => this._isReadyInternal(),\r\n () => {\r\n // no-op, all work is done in _isReadyInternal\r\n },\r\n (e) => {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n },\r\n undefined,\r\n undefined,\r\n false\r\n );\r\n }\r\n\r\n private _loadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void): void {\r\n if (typeof HTMLElement !== \"undefined\") {\r\n // DOM element ?\r\n if (shader instanceof HTMLElement) {\r\n const shaderCode = GetDOMTextContent(shader);\r\n callback(shaderCode);\r\n return;\r\n }\r\n }\r\n\r\n // Direct source ?\r\n if (shader.substring(0, 7) === \"source:\") {\r\n callback(shader.substring(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substring(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substring(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n // Is in local store ?\r\n if (this._shaderStore[shader + key + \"Shader\"]) {\r\n callback(this._shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && this._shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(this._shaderStore[shader + optionalKey + \"Shader\"]);\r\n return;\r\n }\r\n\r\n let shaderUrl;\r\n\r\n if (shader[0] === \".\" || shader[0] === \"/\" || shader.indexOf(\"http\") > -1) {\r\n shaderUrl = shader;\r\n } else {\r\n shaderUrl = this._shaderRepository + shader;\r\n }\r\n\r\n this._engine._loadFile(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code of this effect\r\n */\r\n public get computeSourceCode(): string {\r\n return this._computeSourceCodeOverride ? this._computeSourceCodeOverride : (this._pipelineContext?._getComputeShaderCode() ?? this._computeSourceCode);\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code before it has been processed by the preprocessor\r\n */\r\n public get rawComputeSourceCode(): string {\r\n return this._rawComputeSourceCode;\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect() {\r\n const defines = this.defines;\r\n\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const engine = this._engine;\r\n\r\n this._pipelineContext = engine.createComputePipelineContext();\r\n this._pipelineContext._name = this._key;\r\n\r\n engine._prepareComputePipelineContext(\r\n this._pipelineContext,\r\n this._computeSourceCodeOverride ? this._computeSourceCodeOverride : this._computeSourceCode,\r\n this._rawComputeSourceCode,\r\n this._computeSourceCodeOverride ? null : defines,\r\n this._entryPoint\r\n );\r\n\r\n engine._executeWhenComputeStateIsCompiled(this._pipelineContext, (messages: Nullable<ComputeCompilationMessages>) => {\r\n if (messages && messages.numErrors > 0) {\r\n this._processCompilationErrors(messages, previousPipelineContext);\r\n return;\r\n }\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n if (previousPipelineContext) {\r\n this.getEngine()._deleteComputePipelineContext(previousPipelineContext);\r\n }\r\n });\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n let err = \"\" + e;\r\n if (e instanceof Error && e.stack) {\r\n err = e.stack;\r\n }\r\n this._processCompilationErrors(err, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _processCompilationErrors(e: ComputeCompilationMessages | string, previousPipelineContext: Nullable<IComputePipelineContext> = null) {\r\n this._compilationError = \"\";\r\n\r\n Logger.Error(\"Unable to compile compute effect:\");\r\n if (this.defines) {\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n }\r\n\r\n if (ComputeEffect.LogShaderCodeOnCompilationError) {\r\n const code = this._pipelineContext?._getComputeShaderCode();\r\n if (code) {\r\n Logger.Error(\"Compute code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n\r\n if (typeof e === \"string\") {\r\n this._compilationError = e;\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n } else {\r\n for (const message of e.messages) {\r\n let msg = \"\";\r\n if (message.line !== undefined) {\r\n msg += \"Line \" + message.line + \", \";\r\n }\r\n if (message.offset !== undefined) {\r\n msg += \"Offset \" + message.offset + \", \";\r\n }\r\n if (message.length !== undefined) {\r\n msg += \"Length \" + message.length + \", \";\r\n }\r\n msg += message.type + \": \" + message.text;\r\n\r\n if (this._compilationError) {\r\n this._compilationError += \"\\n\";\r\n }\r\n this._compilationError += msg;\r\n Logger.Error(msg);\r\n }\r\n }\r\n\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n }\r\n\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n if (this._pipelineContext) {\r\n this._pipelineContext.dispose();\r\n }\r\n this._engine._releaseComputeEffect(this);\r\n }\r\n\r\n /**\r\n * This function will add a new compute shader to the shader store\r\n * @param name the name of the shader\r\n * @param computeShader compute shader content\r\n */\r\n public static RegisterShader(name: string, computeShader: string) {\r\n ShaderStore.GetShadersStore(ShaderLanguage.WGSL)[`${name}ComputeShader`] = computeShader;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"computeEffect.js","sourceRoot":"","sources":["../../../../dev/core/src/Compute/computeEffect.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport { type Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { type IComputePipelineContext } from \"./IComputePipelineContext\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Finalize, Initialize, PreProcess } from \"../Engines/Processors/shaderProcessor\";\r\nimport { type _IProcessingOptions } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport { ShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { type ComputeCompilationMessages } from \"../Engines/Extensions/engine.computeShader\";\r\nimport { _RetryWithInterval } from \"core/Misc/timingTools\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ computeSource: \"compute shader code string\"}` for directly passing the shader code\r\n * * object: `{ computeElement: \"vertexShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ compute: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport type IComputeShaderPath = {\r\n /**\r\n * Directly pass the shader code\r\n */\r\n computeSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n compute?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n computeElement?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating a compute effect.\r\n */\r\nexport interface IComputeEffectCreationOptions {\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * The name of the entry point in the shader source (default: \"main\")\r\n */\r\n entryPoint?: string;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: ComputeEffect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: ComputeEffect, errors: string) => void>;\r\n /**\r\n * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<(code: string) => string>;\r\n /**\r\n * If true, the engine should create an explicit pipeline layout for the compute effect instead of using an automatic layout.\r\n */\r\n useExplicitComputePipelineLayout?: boolean;\r\n}\r\n\r\n/**\r\n * Effect wrapping a compute shader and let execute (dispatch) the shader\r\n */\r\nexport class ComputeEffect {\r\n private static _UniqueIdSeed = 0;\r\n\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IComputeShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: ComputeEffect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: ComputeEffect, errors: string) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public onBindObservable = new Observable<ComputeEffect>();\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously ready\r\n */\r\n public _wasPreviouslyReady = false;\r\n\r\n private _engine: AbstractEngine;\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n /** @internal */\r\n public _key: string = \"\";\r\n private _computeSourceCodeOverride: string = \"\";\r\n /** @internal */\r\n public _pipelineContext: Nullable<IComputePipelineContext> = null;\r\n /** @internal */\r\n public _computeSourceCode: string = \"\";\r\n /** @internal */\r\n public _useExplicitComputePipelineLayout = false;\r\n private _rawComputeSourceCode: string = \"\";\r\n private _entryPoint: string;\r\n private _shaderLanguage = ShaderLanguage.WGSL;\r\n private _shaderStore: { [key: string]: string };\r\n private _shaderRepository: string;\r\n private _includeShaderStore: { [key: string]: string };\r\n\r\n /**\r\n * Creates a compute effect that can be used to execute a compute shader\r\n * @param baseName Name of the effect\r\n * @param options Set of all options to create the effect\r\n * @param engine The engine the effect is created for\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n */\r\n constructor(baseName: IComputeShaderPath | string, options: IComputeEffectCreationOptions, engine: AbstractEngine, key = \"\") {\r\n this.name = baseName;\r\n this._key = key;\r\n\r\n this._engine = engine;\r\n this.uniqueId = ComputeEffect._UniqueIdSeed++;\r\n\r\n this.defines = options.defines ?? \"\";\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._entryPoint = options.entryPoint ?? \"main\";\r\n this._useExplicitComputePipelineLayout = !!options.useExplicitComputePipelineLayout;\r\n\r\n this._shaderStore = ShaderStore.GetShadersStore(this._shaderLanguage);\r\n this._shaderRepository = ShaderStore.GetShadersRepository(this._shaderLanguage);\r\n this._includeShaderStore = ShaderStore.GetIncludesShadersStore(this._shaderLanguage);\r\n\r\n let computeSource: IComputeShaderPath | HTMLElement | string;\r\n\r\n const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n computeSource = baseName;\r\n } else if (typeof baseName.computeSource === \"string\") {\r\n computeSource = \"source:\" + baseName.computeSource;\r\n } else if (typeof baseName.computeElement === \"string\") {\r\n computeSource = hostDocument?.getElementById(baseName.computeElement) || baseName.computeElement;\r\n } else {\r\n computeSource = baseName.compute || baseName;\r\n }\r\n\r\n const processorOptions: _IProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: undefined,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: false,\r\n processor: null,\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: this._shaderRepository,\r\n includesShadersStore: this._includeShaderStore,\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: null,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: (shaderType: string, code: string, defines?: string[]) => {\r\n if (!defines) {\r\n return code;\r\n }\r\n // We need to convert #define key value to a const\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n if (split.length === 2) {\r\n const key = split[0];\r\n const value = split[1];\r\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\r\n code = `const ${key} = ${value};\\n` + code;\r\n }\r\n }\r\n }\r\n return code;\r\n },\r\n };\r\n\r\n this._loadShader(computeSource, \"Compute\", \"\", (computeCode) => {\r\n Initialize(processorOptions);\r\n PreProcess(\r\n computeCode,\r\n processorOptions,\r\n (migratedComputeCode) => {\r\n this._rawComputeSourceCode = computeCode;\r\n if (options.processFinalCode) {\r\n migratedComputeCode = options.processFinalCode(migratedComputeCode);\r\n }\r\n const finalShaders = Finalize(migratedComputeCode, \"\", processorOptions);\r\n this._useFinalCode(finalShaders.vertexCode, baseName);\r\n },\r\n this._engine\r\n );\r\n });\r\n }\r\n\r\n private _useFinalCode(migratedCommputeCode: string, baseName: any) {\r\n if (baseName) {\r\n const compute = baseName.computeElement || baseName.compute || baseName.spectorName || baseName;\r\n\r\n this._computeSourceCode = \"//#define SHADER_NAME compute:\" + compute + \"\\n\" + migratedCommputeCode;\r\n } else {\r\n this._computeSourceCode = migratedCommputeCode;\r\n }\r\n this._prepareEffect();\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable<IComputePipelineContext> {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: ComputeEffect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n this._checkIsReady(null);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable<IComputePipelineContext>) {\r\n _RetryWithInterval(\r\n () => this._isReadyInternal(),\r\n () => {\r\n // no-op, all work is done in _isReadyInternal\r\n },\r\n (e) => {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n },\r\n undefined,\r\n undefined,\r\n false\r\n );\r\n }\r\n\r\n private _loadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void): void {\r\n if (typeof HTMLElement !== \"undefined\") {\r\n // DOM element ?\r\n if (shader instanceof HTMLElement) {\r\n const shaderCode = GetDOMTextContent(shader);\r\n callback(shaderCode);\r\n return;\r\n }\r\n }\r\n\r\n // Direct source ?\r\n if (shader.substring(0, 7) === \"source:\") {\r\n callback(shader.substring(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substring(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substring(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n // Is in local store ?\r\n if (this._shaderStore[shader + key + \"Shader\"]) {\r\n callback(this._shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && this._shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(this._shaderStore[shader + optionalKey + \"Shader\"]);\r\n return;\r\n }\r\n\r\n let shaderUrl;\r\n\r\n if (shader[0] === \".\" || shader[0] === \"/\" || shader.indexOf(\"http\") > -1) {\r\n shaderUrl = shader;\r\n } else {\r\n shaderUrl = this._shaderRepository + shader;\r\n }\r\n\r\n this._engine._loadFile(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code of this effect\r\n */\r\n public get computeSourceCode(): string {\r\n return this._computeSourceCodeOverride ? this._computeSourceCodeOverride : (this._pipelineContext?._getComputeShaderCode() ?? this._computeSourceCode);\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code before it has been processed by the preprocessor\r\n */\r\n public get rawComputeSourceCode(): string {\r\n return this._rawComputeSourceCode;\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect() {\r\n const defines = this.defines;\r\n\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const engine = this._engine;\r\n\r\n this._pipelineContext = engine.createComputePipelineContext();\r\n this._pipelineContext._name = this._key;\r\n\r\n engine._prepareComputePipelineContext(\r\n this._pipelineContext,\r\n this._computeSourceCodeOverride ? this._computeSourceCodeOverride : this._computeSourceCode,\r\n this._rawComputeSourceCode,\r\n this._computeSourceCodeOverride ? null : defines,\r\n this._entryPoint\r\n );\r\n\r\n engine._executeWhenComputeStateIsCompiled(this._pipelineContext, (messages: Nullable<ComputeCompilationMessages>) => {\r\n if (messages && messages.numErrors > 0) {\r\n this._processCompilationErrors(messages, previousPipelineContext);\r\n return;\r\n }\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n if (previousPipelineContext) {\r\n this.getEngine()._deleteComputePipelineContext(previousPipelineContext);\r\n }\r\n });\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n let err = \"\" + e;\r\n if (e instanceof Error && e.stack) {\r\n err = e.stack;\r\n }\r\n this._processCompilationErrors(err, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _processCompilationErrors(e: ComputeCompilationMessages | string, previousPipelineContext: Nullable<IComputePipelineContext> = null) {\r\n this._compilationError = \"\";\r\n\r\n Logger.Error(\"Unable to compile compute effect:\");\r\n if (this.defines) {\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n }\r\n\r\n if (ComputeEffect.LogShaderCodeOnCompilationError) {\r\n const code = this._pipelineContext?._getComputeShaderCode();\r\n if (code) {\r\n Logger.Error(\"Compute code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n\r\n if (typeof e === \"string\") {\r\n this._compilationError = e;\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n } else {\r\n for (const message of e.messages) {\r\n let msg = \"\";\r\n if (message.line !== undefined) {\r\n msg += \"Line \" + message.line + \", \";\r\n }\r\n if (message.offset !== undefined) {\r\n msg += \"Offset \" + message.offset + \", \";\r\n }\r\n if (message.length !== undefined) {\r\n msg += \"Length \" + message.length + \", \";\r\n }\r\n msg += message.type + \": \" + message.text;\r\n\r\n if (this._compilationError) {\r\n this._compilationError += \"\\n\";\r\n }\r\n this._compilationError += msg;\r\n Logger.Error(msg);\r\n }\r\n }\r\n\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n }\r\n\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n if (this._pipelineContext) {\r\n this._pipelineContext.dispose();\r\n }\r\n this._engine._releaseComputeEffect(this);\r\n }\r\n\r\n /**\r\n * This function will add a new compute shader to the shader store\r\n * @param name the name of the shader\r\n * @param computeShader compute shader content\r\n */\r\n public static RegisterShader(name: string, computeShader: string) {\r\n ShaderStore.GetShadersStore(ShaderLanguage.WGSL)[`${name}ComputeShader`] = computeShader;\r\n }\r\n}\r\n"]}
@@ -35,6 +35,10 @@ export interface IComputeShaderOptions {
35
35
  * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU
36
36
  */
37
37
  processFinalCode?: Nullable<(code: string) => string>;
38
+ /**
39
+ * If true, the engine should create an explicit pipeline layout for this compute shader instead of using an automatic layout.
40
+ */
41
+ useExplicitComputePipelineLayout?: boolean;
38
42
  }
39
43
  /**
40
44
  * The ComputeShader object lets you execute a compute shader on your GPU (if supported by the engine)
@@ -242,6 +242,7 @@ export class ComputeShader {
242
242
  entryPoint: this._options.entryPoint,
243
243
  onCompiled: this.onCompiled,
244
244
  onError: this.onError,
245
+ useExplicitComputePipelineLayout: this._options.useExplicitComputePipelineLayout,
245
246
  });
246
247
  this._effect = effect;
247
248
  }