@babylonjs/core 7.52.2 → 7.52.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/AudioV2/abstractAudio/abstractAudioBus.d.ts +11 -0
  2. package/AudioV2/abstractAudio/abstractAudioBus.js +10 -0
  3. package/AudioV2/abstractAudio/abstractAudioBus.js.map +1 -1
  4. package/AudioV2/abstractAudio/abstractSound.d.ts +10 -3
  5. package/AudioV2/abstractAudio/abstractSound.js +10 -0
  6. package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
  7. package/AudioV2/abstractAudio/audioBus.d.ts +4 -4
  8. package/AudioV2/abstractAudio/audioBus.js.map +1 -1
  9. package/AudioV2/abstractAudio/mainAudioBus.d.ts +2 -2
  10. package/AudioV2/abstractAudio/mainAudioBus.js.map +1 -1
  11. package/AudioV2/abstractAudio/staticSound.d.ts +5 -5
  12. package/AudioV2/abstractAudio/staticSound.js +3 -3
  13. package/AudioV2/abstractAudio/staticSound.js.map +1 -1
  14. package/AudioV2/abstractAudio/streamingSound.d.ts +1 -1
  15. package/AudioV2/abstractAudio/streamingSound.js +1 -1
  16. package/AudioV2/abstractAudio/streamingSound.js.map +1 -1
  17. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.d.ts +30 -6
  18. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js +44 -21
  19. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js.map +1 -1
  20. package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.d.ts +24 -0
  21. package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.js +30 -0
  22. package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.js.map +1 -0
  23. package/AudioV2/abstractAudio/subNodes/audioSubNode.d.ts +1 -0
  24. package/AudioV2/abstractAudio/subNodes/audioSubNode.js +1 -0
  25. package/AudioV2/abstractAudio/subNodes/audioSubNode.js.map +1 -1
  26. package/AudioV2/abstractAudio/subNodes/stereoAudioSubNode.js.map +1 -1
  27. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.d.ts +86 -0
  28. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js +29 -0
  29. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js.map +1 -0
  30. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.d.ts +35 -0
  31. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +96 -0
  32. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -0
  33. package/AudioV2/abstractAudio/subProperties/index.d.ts +1 -0
  34. package/AudioV2/abstractAudio/subProperties/index.js +1 -0
  35. package/AudioV2/abstractAudio/subProperties/index.js.map +1 -1
  36. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.d.ts +37 -0
  37. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js +85 -0
  38. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js.map +1 -0
  39. package/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.d.ts +5 -3
  40. package/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.js +25 -2
  41. package/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.js.map +1 -1
  42. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.d.ts +2 -1
  43. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +32 -17
  44. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -1
  45. package/Engines/WebGPU/webgpuTextureManager.d.ts +0 -1
  46. package/Engines/WebGPU/webgpuTextureManager.js +2 -57
  47. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  48. package/Engines/abstractEngine.d.ts +6 -0
  49. package/Engines/abstractEngine.js +3 -3
  50. package/Engines/abstractEngine.js.map +1 -1
  51. package/Engines/engine.common.js +4 -0
  52. package/Engines/engine.common.js.map +1 -1
  53. package/Engines/nativeEngine.d.ts +1 -0
  54. package/Engines/nativeEngine.js +3 -0
  55. package/Engines/nativeEngine.js.map +1 -1
  56. package/Engines/nullEngine.d.ts +1 -0
  57. package/Engines/nullEngine.js +1 -0
  58. package/Engines/nullEngine.js.map +1 -1
  59. package/Engines/thinEngine.d.ts +1 -0
  60. package/Engines/thinEngine.js +7 -4
  61. package/Engines/thinEngine.js.map +1 -1
  62. package/Engines/webgpuEngine.d.ts +2 -1
  63. package/Engines/webgpuEngine.js +12 -9
  64. package/Engines/webgpuEngine.js.map +1 -1
  65. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.d.ts +48 -0
  66. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +54 -0
  67. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -0
  68. package/FlowGraph/Blocks/Data/index.d.ts +1 -0
  69. package/FlowGraph/Blocks/Data/index.js +1 -0
  70. package/FlowGraph/Blocks/Data/index.js.map +1 -1
  71. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.d.ts +1 -0
  72. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js +19 -13
  73. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js.map +1 -1
  74. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.js +3 -5
  75. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.js.map +1 -1
  76. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.js +1 -1
  77. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.js.map +1 -1
  78. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.js +2 -4
  79. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.js.map +1 -1
  80. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.js +1 -1
  81. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.js.map +1 -1
  82. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js +1 -2
  83. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js.map +1 -1
  84. package/FlowGraph/Blocks/flowGraphBlockFactory.js +2 -0
  85. package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
  86. package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +2 -1
  87. package/FlowGraph/Blocks/flowGraphBlockNames.js +1 -0
  88. package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
  89. package/FlowGraph/CustomTypes/flowGraphInteger.d.ts +1 -0
  90. package/FlowGraph/CustomTypes/flowGraphInteger.js +3 -0
  91. package/FlowGraph/CustomTypes/flowGraphInteger.js.map +1 -1
  92. package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +2 -0
  93. package/FlowGraph/CustomTypes/flowGraphMatrix.js +6 -0
  94. package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
  95. package/FlowGraph/flowGraphExecutionBlock.d.ts +1 -0
  96. package/FlowGraph/flowGraphExecutionBlock.js +4 -0
  97. package/FlowGraph/flowGraphExecutionBlock.js.map +1 -1
  98. package/FlowGraph/utils.d.ts +2 -1
  99. package/FlowGraph/utils.js +7 -2
  100. package/FlowGraph/utils.js.map +1 -1
  101. package/FrameGraph/Node/Blocks/PostProcesses/bloomPostProcessBlock.js +2 -2
  102. package/FrameGraph/Node/Blocks/PostProcesses/bloomPostProcessBlock.js.map +1 -1
  103. package/FrameGraph/Node/Blocks/PostProcesses/depthOfFieldPostProcessBlock.js +2 -2
  104. package/FrameGraph/Node/Blocks/PostProcesses/depthOfFieldPostProcessBlock.js.map +1 -1
  105. package/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.d.ts +126 -0
  106. package/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.js +497 -0
  107. package/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.js.map +1 -0
  108. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.d.ts +6 -0
  109. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +30 -4
  110. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
  111. package/FrameGraph/Node/Blocks/index.d.ts +1 -0
  112. package/FrameGraph/Node/Blocks/index.js +1 -0
  113. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  114. package/FrameGraph/Node/nodeRenderGraph.js +1 -1
  115. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  116. package/FrameGraph/Tasks/PostProcesses/bloomTask.d.ts +2 -3
  117. package/FrameGraph/Tasks/PostProcesses/bloomTask.js +3 -4
  118. package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
  119. package/FrameGraph/Tasks/PostProcesses/blurTask.js +2 -2
  120. package/FrameGraph/Tasks/PostProcesses/blurTask.js.map +1 -1
  121. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.d.ts +2 -3
  122. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +4 -5
  123. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
  124. package/FrameGraph/Tasks/PostProcesses/postProcessTask.d.ts +6 -0
  125. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +14 -0
  126. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  127. package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.d.ts +11 -0
  128. package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js +18 -0
  129. package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js.map +1 -0
  130. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.d.ts +76 -0
  131. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +170 -0
  132. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -0
  133. package/FrameGraph/Tasks/PostProcesses/ssrTask.d.ts +16 -0
  134. package/FrameGraph/Tasks/PostProcesses/ssrTask.js +45 -0
  135. package/FrameGraph/Tasks/PostProcesses/ssrTask.js.map +1 -0
  136. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +10 -0
  137. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +29 -0
  138. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  139. package/FrameGraph/frameGraph.d.ts +7 -3
  140. package/FrameGraph/frameGraph.js +10 -4
  141. package/FrameGraph/frameGraph.js.map +1 -1
  142. package/FrameGraph/frameGraphTextureManager.d.ts +2 -1
  143. package/FrameGraph/frameGraphTextureManager.js +4 -3
  144. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  145. package/FrameGraph/index.d.ts +1 -0
  146. package/FrameGraph/index.js +1 -0
  147. package/FrameGraph/index.js.map +1 -1
  148. package/Materials/PBR/pbrBaseMaterial.js +1 -1
  149. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  150. package/Materials/effectRenderer.js +1 -1
  151. package/Materials/effectRenderer.js.map +1 -1
  152. package/Materials/material.js +5 -3
  153. package/Materials/material.js.map +1 -1
  154. package/Materials/materialHelper.geometryrendering.d.ts +7 -5
  155. package/Materials/materialHelper.geometryrendering.js +8 -3
  156. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  157. package/Materials/standardMaterial.js +1 -1
  158. package/Materials/standardMaterial.js.map +1 -1
  159. package/Meshes/geometry.js +4 -0
  160. package/Meshes/geometry.js.map +1 -1
  161. package/Particles/particleSystemComponent.d.ts +2 -1
  162. package/Particles/particleSystemComponent.js +2 -2
  163. package/Particles/particleSystemComponent.js.map +1 -1
  164. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +23 -30
  165. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +226 -411
  166. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  167. package/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline.d.ts +222 -0
  168. package/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline.js +373 -0
  169. package/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline.js.map +1 -0
  170. package/PostProcesses/thinDepthOfFieldEffect.d.ts +4 -4
  171. package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
  172. package/PostProcesses/thinSSRBlurCombinerPostProcess.d.ts +41 -0
  173. package/PostProcesses/thinSSRBlurCombinerPostProcess.js +185 -0
  174. package/PostProcesses/thinSSRBlurCombinerPostProcess.js.map +1 -0
  175. package/PostProcesses/thinSSRBlurPostProcess.d.ts +18 -0
  176. package/PostProcesses/thinSSRBlurPostProcess.js +47 -0
  177. package/PostProcesses/thinSSRBlurPostProcess.js.map +1 -0
  178. package/PostProcesses/thinSSRPostProcess.d.ts +94 -0
  179. package/PostProcesses/thinSSRPostProcess.js +416 -0
  180. package/PostProcesses/thinSSRPostProcess.js.map +1 -0
  181. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +2 -0
  182. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +2 -0
  183. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  184. package/Rendering/iblCdfGenerator.js +1 -1
  185. package/Rendering/iblCdfGenerator.js.map +1 -1
  186. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js +13 -2
  187. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js.map +1 -1
  188. package/ShadersWGSL/geometry.fragment.js +1 -1
  189. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  190. package/ShadersWGSL/screenSpaceReflection2BlurCombiner.fragment.js +13 -2
  191. package/ShadersWGSL/screenSpaceReflection2BlurCombiner.fragment.js.map +1 -1
  192. package/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ import { _AudioAnalyzerSubNode } from "../../abstractAudio/subNodes/audioAnalyzerSubNode.js";
2
+ import { _GetEmptyByteFrequencyData, _GetEmptyFloatFrequencyData } from "../../abstractAudio/subProperties/audioAnalyzer.js";
3
+ /** @internal */
4
+ export async function _CreateAudioAnalyzerSubNodeAsync(engine) {
5
+ return new _WebAudioAnalyzerSubNode(engine);
6
+ }
7
+ /** @internal */
8
+ export class _WebAudioAnalyzerSubNode extends _AudioAnalyzerSubNode {
9
+ /** @internal */
10
+ constructor(engine) {
11
+ super(engine);
12
+ this._byteFrequencyData = null;
13
+ this._floatFrequencyData = null;
14
+ this._analyzerNode = new AnalyserNode(engine.audioContext);
15
+ }
16
+ /** @internal */
17
+ get fftSize() {
18
+ return this._analyzerNode.fftSize;
19
+ }
20
+ set fftSize(value) {
21
+ if (value === this._analyzerNode.fftSize) {
22
+ return;
23
+ }
24
+ this._analyzerNode.fftSize = value;
25
+ this._clearArrays();
26
+ }
27
+ /** @internal */
28
+ get inNode() {
29
+ return this._analyzerNode;
30
+ }
31
+ /** @internal */
32
+ get minDecibels() {
33
+ return this._analyzerNode.minDecibels;
34
+ }
35
+ set minDecibels(value) {
36
+ this._analyzerNode.minDecibels = value;
37
+ }
38
+ /** @internal */
39
+ get maxDecibels() {
40
+ return this._analyzerNode.maxDecibels;
41
+ }
42
+ set maxDecibels(value) {
43
+ this._analyzerNode.maxDecibels = value;
44
+ }
45
+ /** @internal */
46
+ get smoothing() {
47
+ return this._analyzerNode.smoothingTimeConstant;
48
+ }
49
+ set smoothing(value) {
50
+ this._analyzerNode.smoothingTimeConstant = value;
51
+ }
52
+ /** @internal */
53
+ dispose() {
54
+ super.dispose();
55
+ this._clearArrays();
56
+ this._byteFrequencyData = null;
57
+ this._floatFrequencyData = null;
58
+ this._analyzerNode.disconnect();
59
+ }
60
+ /** @internal */
61
+ getClassName() {
62
+ return "_WebAudioAnalyzerSubNode";
63
+ }
64
+ /** @internal */
65
+ getByteFrequencyData() {
66
+ if (!this._byteFrequencyData || this._byteFrequencyData.length === 0) {
67
+ this._byteFrequencyData = new Uint8Array(this._analyzerNode.frequencyBinCount);
68
+ }
69
+ this._analyzerNode.getByteFrequencyData(this._byteFrequencyData);
70
+ return this._byteFrequencyData;
71
+ }
72
+ /** @internal */
73
+ getFloatFrequencyData() {
74
+ if (!this._floatFrequencyData || this._floatFrequencyData.length === 0) {
75
+ this._floatFrequencyData = new Float32Array(this._analyzerNode.frequencyBinCount);
76
+ }
77
+ this._analyzerNode.getFloatFrequencyData(this._floatFrequencyData);
78
+ return this._floatFrequencyData;
79
+ }
80
+ _clearArrays() {
81
+ this._byteFrequencyData?.set(_GetEmptyByteFrequencyData());
82
+ this._floatFrequencyData?.set(_GetEmptyFloatFrequencyData());
83
+ }
84
+ }
85
+ //# sourceMappingURL=webAudioAnalyzerSubNode.js.map
@@ -0,0 +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 */\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> = null;\n private _floatFrequencyData: Nullable<Float32Array> = 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,13 +1,14 @@
1
- import type { Nullable } from "../../../types.js";
1
+ import type { Nullable } from "../../../types";
2
2
  import type { AbstractAudioNode } from "../../abstractAudio/abstractAudioNode";
3
3
  import { _AbstractAudioSubGraph } from "../../abstractAudio/subNodes/abstractAudioSubGraph";
4
4
  import type { _AbstractAudioSubNode } from "../../abstractAudio/subNodes/abstractAudioSubNode";
5
5
  import type { IVolumeAudioOptions } from "../../abstractAudio/subNodes/volumeAudioSubNode";
6
+ import type { IAudioAnalyzerOptions } from "../../abstractAudio/subProperties/abstractAudioAnalyzer";
6
7
  import type { IWebAudioSuperNode } from "../webAudioNode";
7
8
  /**
8
9
  * Options for creating a WebAudioBaseSubGraph.
9
10
  */
10
- export interface IWebAudioBaseSubGraphOptions extends IVolumeAudioOptions {
11
+ export interface IWebAudioBaseSubGraphOptions extends IAudioAnalyzerOptions, IVolumeAudioOptions {
11
12
  }
12
13
  /** @internal */
13
14
  export declare abstract class _WebAudioBaseSubGraph extends _AbstractAudioSubGraph {
@@ -22,5 +23,6 @@ export declare abstract class _WebAudioBaseSubGraph extends _AbstractAudioSubGra
22
23
  get inNode(): Nullable<AudioNode>;
23
24
  /** @internal */
24
25
  get outNode(): Nullable<AudioNode>;
25
- protected _createSubNode(name: string): Nullable<Promise<_AbstractAudioSubNode>>;
26
+ protected _createSubNode(name: string): Promise<_AbstractAudioSubNode>;
27
+ protected _onSubNodesChanged(): void;
26
28
  }
@@ -1,6 +1,9 @@
1
1
  import { _AbstractAudioSubGraph } from "../../abstractAudio/subNodes/abstractAudioSubGraph.js";
2
+ import { _GetAudioAnalyzerSubNode } from "../../abstractAudio/subNodes/audioAnalyzerSubNode.js";
2
3
  import { _GetVolumeAudioSubNode } from "../../abstractAudio/subNodes/volumeAudioSubNode.js";
4
+ import { _HasAudioAnalyzerOptions } from "../../abstractAudio/subProperties/abstractAudioAnalyzer.js";
3
5
  import { _CreateVolumeAudioSubNodeAsync } from "./volumeWebAudioSubNode.js";
6
+ import { _CreateAudioAnalyzerSubNodeAsync } from "./webAudioAnalyzerSubNode.js";
4
7
  /** @internal */
5
8
  export class _WebAudioBaseSubGraph extends _AbstractAudioSubGraph {
6
9
  /** @internal */
@@ -11,8 +14,19 @@ export class _WebAudioBaseSubGraph extends _AbstractAudioSubGraph {
11
14
  }
12
15
  /** @internal */
13
16
  async init(options) {
14
- this._createAndAddSubNode("Volume" /* AudioSubNode.VOLUME */);
17
+ const hasAnalyzerOptions = _HasAudioAnalyzerOptions(options);
18
+ if (hasAnalyzerOptions) {
19
+ this.createAndAddSubNode("Analyzer" /* AudioSubNode.ANALYZER */);
20
+ }
21
+ this.createAndAddSubNode("Volume" /* AudioSubNode.VOLUME */);
15
22
  await this._createSubNodePromisesResolved();
23
+ if (hasAnalyzerOptions) {
24
+ const analyzerNode = _GetAudioAnalyzerSubNode(this);
25
+ if (!analyzerNode) {
26
+ throw new Error("No analyzer subnode.");
27
+ }
28
+ analyzerNode.setOptions(options);
29
+ }
16
30
  const volumeNode = _GetVolumeAudioSubNode(this);
17
31
  if (!volumeNode) {
18
32
  throw new Error("No volume subnode.");
@@ -44,10 +58,19 @@ export class _WebAudioBaseSubGraph extends _AbstractAudioSubGraph {
44
58
  }
45
59
  _createSubNode(name) {
46
60
  switch (name) {
61
+ case "Analyzer" /* AudioSubNode.ANALYZER */:
62
+ return _CreateAudioAnalyzerSubNodeAsync(this._owner.engine);
47
63
  case "Volume" /* AudioSubNode.VOLUME */:
48
64
  return _CreateVolumeAudioSubNodeAsync(this._owner.engine);
49
65
  default:
50
- return null;
66
+ throw new Error(`Unknown subnode name: ${name}`);
67
+ }
68
+ }
69
+ _onSubNodesChanged() {
70
+ const analyzerNode = _GetAudioAnalyzerSubNode(this);
71
+ const volumeNode = _GetVolumeAudioSubNode(this);
72
+ if (analyzerNode && volumeNode) {
73
+ volumeNode.connect(analyzerNode);
51
74
  }
52
75
  }
53
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webAudioBaseSubGraph.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAI5F,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AAGzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAOzE,gBAAgB;AAChB,MAAM,OAAgB,qBAAsB,SAAQ,sBAAsB;IAItE,gBAAgB;IAChB,YAAmB,KAAyB;QACxC,KAAK,EAAE,CAAC;QAJF,aAAQ,GAAwB,IAAI,CAAC;QAM3C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,IAAI,CAAC,OAA8C;QAC5D,IAAI,CAAC,oBAAoB,oCAAqB,CAAC;QAC/C,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QAE5C,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1C,CAAC;QAED,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE/B,IAAI,UAAU,CAAC,YAAY,EAAE,KAAK,wBAAwB,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,QAAQ,GAAI,UAAqC,CAAC,IAAI,CAAC;QAE5D,kFAAkF;QAClF,gDAAgD;QAChD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC1C,KAAK,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtD,MAAM,MAAM,GAAI,IAAI,CAAC,KAAyB,CAAC,MAAM,CAAC;gBACtD,IAAI,MAAM,EAAE,CAAC;oBACT,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAID,gBAAgB;IAChB,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAES,cAAc,CAAC,IAAY;QACjC,QAAQ,IAAI,EAAE,CAAC;YACX;gBACI,OAAO,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9D;gBACI,OAAO,IAAI,CAAC;QACpB,CAAC;IACL,CAAC;CACJ","sourcesContent":["import type { Nullable } from \"core/types\";\nimport type { AbstractAudioNode } from \"../../abstractAudio/abstractAudioNode\";\nimport { _AbstractAudioSubGraph } from \"../../abstractAudio/subNodes/abstractAudioSubGraph\";\nimport type { _AbstractAudioSubNode } from \"../../abstractAudio/subNodes/abstractAudioSubNode\";\nimport { AudioSubNode } from \"../../abstractAudio/subNodes/audioSubNode\";\nimport type { IVolumeAudioOptions } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport { _GetVolumeAudioSubNode } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport type { IWebAudioInNode, IWebAudioSuperNode } from \"../webAudioNode\";\nimport type { _VolumeWebAudioSubNode } from \"./volumeWebAudioSubNode\";\nimport { _CreateVolumeAudioSubNodeAsync } from \"./volumeWebAudioSubNode\";\n\n/**\n * Options for creating a WebAudioBaseSubGraph.\n */\nexport interface IWebAudioBaseSubGraphOptions extends IVolumeAudioOptions {}\n\n/** @internal */\nexport abstract class _WebAudioBaseSubGraph extends _AbstractAudioSubGraph {\n protected _owner: IWebAudioSuperNode;\n protected _outNode: Nullable<AudioNode> = null;\n\n /** @internal */\n public constructor(owner: IWebAudioSuperNode) {\n super();\n\n this._owner = owner;\n }\n\n /** @internal */\n public async init(options: Partial<IWebAudioBaseSubGraphOptions>): Promise<void> {\n this._createAndAddSubNode(AudioSubNode.VOLUME);\n await this._createSubNodePromisesResolved();\n\n const volumeNode = _GetVolumeAudioSubNode(this);\n if (!volumeNode) {\n throw new Error(\"No volume subnode.\");\n }\n\n volumeNode.setOptions(options);\n\n if (volumeNode.getClassName() !== \"_VolumeWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n\n this._outNode = (volumeNode as _VolumeWebAudioSubNode).node;\n\n // Connect the new wrapped WebAudio node to the wrapped downstream WebAudio nodes.\n // The wrapper nodes are unaware of this change.\n if (this._outNode && this._downstreamNodes) {\n const it = this._downstreamNodes.values();\n for (let next = it.next(); !next.done; next = it.next()) {\n const inNode = (next.value as IWebAudioInNode).inNode;\n if (inNode) {\n this._outNode.connect(inNode);\n }\n }\n }\n }\n\n protected abstract readonly _downstreamNodes: Nullable<Set<AbstractAudioNode>>;\n\n /** @internal */\n public get inNode(): Nullable<AudioNode> {\n return this._outNode;\n }\n\n /** @internal */\n public get outNode(): Nullable<AudioNode> {\n return this._outNode;\n }\n\n protected _createSubNode(name: string): Nullable<Promise<_AbstractAudioSubNode>> {\n switch (name) {\n case AudioSubNode.VOLUME:\n return _CreateVolumeAudioSubNodeAsync(this._owner.engine);\n default:\n return null;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"webAudioBaseSubGraph.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../../types\";\nimport type { AbstractAudioNode } from \"../../abstractAudio/abstractAudioNode\";\nimport { _AbstractAudioSubGraph } from \"../../abstractAudio/subNodes/abstractAudioSubGraph\";\nimport type { _AbstractAudioSubNode } from \"../../abstractAudio/subNodes/abstractAudioSubNode\";\nimport { _GetAudioAnalyzerSubNode } from \"../../abstractAudio/subNodes/audioAnalyzerSubNode\";\nimport { AudioSubNode } from \"../../abstractAudio/subNodes/audioSubNode\";\nimport type { IVolumeAudioOptions } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport { _GetVolumeAudioSubNode } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport type { IAudioAnalyzerOptions } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport { _HasAudioAnalyzerOptions } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport type { IWebAudioInNode, IWebAudioSuperNode } from \"../webAudioNode\";\nimport type { _VolumeWebAudioSubNode } from \"./volumeWebAudioSubNode\";\nimport { _CreateVolumeAudioSubNodeAsync } from \"./volumeWebAudioSubNode\";\nimport { _CreateAudioAnalyzerSubNodeAsync } from \"./webAudioAnalyzerSubNode\";\n\n/**\n * Options for creating a WebAudioBaseSubGraph.\n */\nexport interface IWebAudioBaseSubGraphOptions extends IAudioAnalyzerOptions, IVolumeAudioOptions {}\n\n/** @internal */\nexport abstract class _WebAudioBaseSubGraph extends _AbstractAudioSubGraph {\n protected _owner: IWebAudioSuperNode;\n protected _outNode: Nullable<AudioNode> = null;\n\n /** @internal */\n public constructor(owner: IWebAudioSuperNode) {\n super();\n\n this._owner = owner;\n }\n\n /** @internal */\n public async init(options: Partial<IWebAudioBaseSubGraphOptions>): Promise<void> {\n const hasAnalyzerOptions = _HasAudioAnalyzerOptions(options);\n\n if (hasAnalyzerOptions) {\n this.createAndAddSubNode(AudioSubNode.ANALYZER);\n }\n\n this.createAndAddSubNode(AudioSubNode.VOLUME);\n\n await this._createSubNodePromisesResolved();\n\n if (hasAnalyzerOptions) {\n const analyzerNode = _GetAudioAnalyzerSubNode(this);\n if (!analyzerNode) {\n throw new Error(\"No analyzer subnode.\");\n }\n\n analyzerNode.setOptions(options);\n }\n\n const volumeNode = _GetVolumeAudioSubNode(this);\n if (!volumeNode) {\n throw new Error(\"No volume subnode.\");\n }\n\n volumeNode.setOptions(options);\n\n if (volumeNode.getClassName() !== \"_VolumeWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n\n this._outNode = (volumeNode as _VolumeWebAudioSubNode).node;\n\n // Connect the new wrapped WebAudio node to the wrapped downstream WebAudio nodes.\n // The wrapper nodes are unaware of this change.\n if (this._outNode && this._downstreamNodes) {\n const it = this._downstreamNodes.values();\n for (let next = it.next(); !next.done; next = it.next()) {\n const inNode = (next.value as IWebAudioInNode).inNode;\n if (inNode) {\n this._outNode.connect(inNode);\n }\n }\n }\n }\n\n protected abstract readonly _downstreamNodes: Nullable<Set<AbstractAudioNode>>;\n\n /** @internal */\n public get inNode(): Nullable<AudioNode> {\n return this._outNode;\n }\n\n /** @internal */\n public get outNode(): Nullable<AudioNode> {\n return this._outNode;\n }\n\n protected _createSubNode(name: string): Promise<_AbstractAudioSubNode> {\n switch (name) {\n case AudioSubNode.ANALYZER:\n return _CreateAudioAnalyzerSubNodeAsync(this._owner.engine);\n case AudioSubNode.VOLUME:\n return _CreateVolumeAudioSubNodeAsync(this._owner.engine);\n default:\n throw new Error(`Unknown subnode name: ${name}`);\n }\n }\n\n protected _onSubNodesChanged(): void {\n const analyzerNode = _GetAudioAnalyzerSubNode(this);\n const volumeNode = _GetVolumeAudioSubNode(this);\n\n if (analyzerNode && volumeNode) {\n volumeNode.connect(analyzerNode);\n }\n }\n}\n"]}
@@ -10,12 +10,13 @@ export interface IWebAudioBusAndSoundSubGraphOptions extends ISpatialAudioOption
10
10
  }
11
11
  /** @internal */
12
12
  export declare abstract class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {
13
+ private _rootNode;
13
14
  protected abstract readonly _upstreamNodes: Nullable<Set<AbstractAudioNode>>;
14
15
  protected _inNode: Nullable<AudioNode>;
15
16
  /** @internal */
16
17
  init(options: Partial<IWebAudioBusAndSoundSubGraphOptions>): Promise<void>;
17
18
  /** @internal */
18
19
  get inNode(): Nullable<AudioNode>;
19
- protected _createSubNode(name: string): Nullable<Promise<_AbstractAudioSubNode>>;
20
+ protected _createSubNode(name: string): Promise<_AbstractAudioSubNode>;
20
21
  protected _onSubNodesChanged(): void;
21
22
  }
@@ -10,6 +10,7 @@ import { _WebAudioBaseSubGraph } from "./webAudioBaseSubGraph.js";
10
10
  export class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {
11
11
  constructor() {
12
12
  super(...arguments);
13
+ this._rootNode = null;
13
14
  this._inNode = null;
14
15
  }
15
16
  /** @internal */
@@ -18,10 +19,10 @@ export class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {
18
19
  let hasSpatialOptions = false;
19
20
  let hasStereoOptions = false;
20
21
  if ((hasSpatialOptions = _HasSpatialAudioOptions(options))) {
21
- this._createAndAddSubNode("Spatial" /* AudioSubNode.SPATIAL */);
22
+ this.createAndAddSubNode("Spatial" /* AudioSubNode.SPATIAL */);
22
23
  }
23
24
  if ((hasStereoOptions = _HasStereoAudioOptions(options))) {
24
- this._createAndAddSubNode("Stereo" /* AudioSubNode.STEREO */);
25
+ this.createAndAddSubNode("Stereo" /* AudioSubNode.STEREO */);
25
26
  }
26
27
  await this._createSubNodePromisesResolved();
27
28
  if (hasSpatialOptions) {
@@ -36,20 +37,22 @@ export class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {
36
37
  return this._inNode;
37
38
  }
38
39
  _createSubNode(name) {
39
- const node = super._createSubNode(name);
40
- if (node) {
40
+ try {
41
+ const node = super._createSubNode(name);
41
42
  return node;
42
43
  }
44
+ catch (e) { }
43
45
  switch (name) {
44
46
  case "Spatial" /* AudioSubNode.SPATIAL */:
45
47
  return _CreateSpatialAudioSubNodeAsync(this._owner.engine);
46
48
  case "Stereo" /* AudioSubNode.STEREO */:
47
49
  return _CreateStereoAudioSubNodeAsync(this._owner.engine);
48
50
  default:
49
- return null;
51
+ throw new Error(`Unknown subnode name: ${name}`);
50
52
  }
51
53
  }
52
54
  _onSubNodesChanged() {
55
+ super._onSubNodesChanged();
53
56
  const spatialNode = _GetSpatialAudioSubNode(this);
54
57
  const stereoNode = _GetStereoAudioSubNode(this);
55
58
  const volumeNode = _GetVolumeAudioSubNode(this);
@@ -64,10 +67,7 @@ export class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {
64
67
  }
65
68
  if (spatialNode) {
66
69
  spatialNode.disconnectAll();
67
- if (stereoNode) {
68
- spatialNode.connect(stereoNode);
69
- }
70
- else if (volumeNode) {
70
+ if (volumeNode) {
71
71
  spatialNode.connect(volumeNode);
72
72
  }
73
73
  }
@@ -77,17 +77,32 @@ export class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {
77
77
  stereoNode.connect(volumeNode);
78
78
  }
79
79
  }
80
- let inSubNode = null;
81
- if (spatialNode) {
82
- inSubNode = spatialNode;
80
+ if (spatialNode && stereoNode) {
81
+ this._rootNode = new GainNode(this._owner.engine.audioContext);
82
+ this._rootNode.connect(spatialNode.outNode);
83
+ this._rootNode.connect(stereoNode.outNode);
83
84
  }
84
- else if (stereoNode) {
85
- inSubNode = stereoNode;
85
+ else {
86
+ this._rootNode?.disconnect();
87
+ this._rootNode = null;
86
88
  }
87
- else if (volumeNode) {
88
- inSubNode = volumeNode;
89
+ let inSubNode = null;
90
+ let inNode = null;
91
+ if (this._rootNode) {
92
+ inNode = this._rootNode;
93
+ }
94
+ else {
95
+ if (spatialNode) {
96
+ inSubNode = spatialNode;
97
+ }
98
+ else if (stereoNode) {
99
+ inSubNode = stereoNode;
100
+ }
101
+ else if (volumeNode) {
102
+ inSubNode = volumeNode;
103
+ }
104
+ inNode = inSubNode?.node ?? null;
89
105
  }
90
- const inNode = inSubNode?.node ?? null;
91
106
  if (this._inNode !== inNode) {
92
107
  // Disconnect the wrapped upstream WebAudio nodes from the old wrapped WebAudio node.
93
108
  // The wrapper nodes are unaware of this change.
@@ -1 +1 @@
1
- {"version":3,"file":"webAudioBusAndSoundSubGraph.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../../types\";\nimport type { AbstractAudioNode } from \"../../abstractAudio/abstractAudioNode\";\nimport type { _AbstractAudioSubNode } from \"../../abstractAudio/subNodes/abstractAudioSubNode\";\nimport { AudioSubNode } from \"../../abstractAudio/subNodes/audioSubNode\";\nimport { _GetSpatialAudioSubNode } from \"../../abstractAudio/subNodes/spatialAudioSubNode\";\nimport { _GetStereoAudioSubNode } from \"../../abstractAudio/subNodes/stereoAudioSubNode\";\nimport type { IVolumeAudioOptions } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport { _GetVolumeAudioSubNode } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport type { ISpatialAudioOptions } from \"../../abstractAudio/subProperties/abstractSpatialAudio\";\nimport { _HasSpatialAudioOptions } from \"../../abstractAudio/subProperties/abstractSpatialAudio\";\nimport type { IStereoAudioOptions } from \"../../abstractAudio/subProperties/abstractStereoAudio\";\nimport { _HasStereoAudioOptions } from \"../../abstractAudio/subProperties/abstractStereoAudio\";\nimport type { IWebAudioOutNode, IWebAudioSubNode } from \"../webAudioNode\";\nimport type { _SpatialWebAudioSubNode } from \"./spatialWebAudioSubNode\";\nimport { _CreateSpatialAudioSubNodeAsync } from \"./spatialWebAudioSubNode\";\nimport type { _StereoWebAudioSubNode } from \"./stereoWebAudioSubNode\";\nimport { _CreateStereoAudioSubNodeAsync } from \"./stereoWebAudioSubNode\";\nimport type { _VolumeWebAudioSubNode } from \"./volumeWebAudioSubNode\";\nimport { _WebAudioBaseSubGraph } from \"./webAudioBaseSubGraph\";\n\n/** @internal */\nexport interface IWebAudioBusAndSoundSubGraphOptions extends ISpatialAudioOptions, IStereoAudioOptions, IVolumeAudioOptions {}\n\n/** @internal */\nexport abstract class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {\n protected abstract readonly _upstreamNodes: Nullable<Set<AbstractAudioNode>>;\n\n protected _inNode: Nullable<AudioNode> = null;\n\n /** @internal */\n public override async init(options: Partial<IWebAudioBusAndSoundSubGraphOptions>): Promise<void> {\n super.init(options);\n\n let hasSpatialOptions = false;\n let hasStereoOptions = false;\n\n if ((hasSpatialOptions = _HasSpatialAudioOptions(options))) {\n this._createAndAddSubNode(AudioSubNode.SPATIAL);\n }\n if ((hasStereoOptions = _HasStereoAudioOptions(options))) {\n this._createAndAddSubNode(AudioSubNode.STEREO);\n }\n\n await this._createSubNodePromisesResolved();\n\n if (hasSpatialOptions) {\n _GetSpatialAudioSubNode(this)?.setOptions(options);\n }\n if (hasStereoOptions) {\n _GetStereoAudioSubNode(this)?.setOptions(options);\n }\n }\n\n /** @internal */\n public override get inNode(): Nullable<AudioNode> {\n return this._inNode;\n }\n\n protected override _createSubNode(name: string): Nullable<Promise<_AbstractAudioSubNode>> {\n const node = super._createSubNode(name);\n\n if (node) {\n return node;\n }\n\n switch (name) {\n case AudioSubNode.SPATIAL:\n return _CreateSpatialAudioSubNodeAsync(this._owner.engine);\n case AudioSubNode.STEREO:\n return _CreateStereoAudioSubNodeAsync(this._owner.engine);\n default:\n return null;\n }\n }\n\n protected override _onSubNodesChanged(): void {\n const spatialNode = _GetSpatialAudioSubNode(this);\n const stereoNode = _GetStereoAudioSubNode(this);\n const volumeNode = _GetVolumeAudioSubNode(this);\n\n if (spatialNode && spatialNode.getClassName() !== \"_SpatialWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n if (stereoNode && stereoNode.getClassName() !== \"_StereoWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n if (volumeNode && volumeNode.getClassName() !== \"_VolumeWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n\n if (spatialNode) {\n spatialNode.disconnectAll();\n\n if (stereoNode) {\n spatialNode.connect(stereoNode);\n } else if (volumeNode) {\n spatialNode.connect(volumeNode);\n }\n }\n\n if (stereoNode) {\n stereoNode.disconnectAll();\n\n if (volumeNode) {\n stereoNode.connect(volumeNode);\n }\n }\n\n let inSubNode: Nullable<IWebAudioSubNode> = null;\n\n if (spatialNode) {\n inSubNode = spatialNode as _SpatialWebAudioSubNode;\n } else if (stereoNode) {\n inSubNode = stereoNode as _StereoWebAudioSubNode;\n } else if (volumeNode) {\n inSubNode = volumeNode as _VolumeWebAudioSubNode;\n }\n\n const inNode = inSubNode?.node ?? null;\n\n if (this._inNode !== inNode) {\n // Disconnect the wrapped upstream WebAudio nodes from the old wrapped WebAudio node.\n // The wrapper nodes are unaware of this change.\n if (this._inNode && this._upstreamNodes) {\n const it = this._upstreamNodes.values();\n for (let next = it.next(); !next.done; next = it.next()) {\n (next.value as IWebAudioOutNode).outNode?.disconnect(this._inNode);\n }\n }\n\n this._inNode = inNode;\n\n // Connect the wrapped upstream WebAudio nodes to the new wrapped WebAudio node.\n // The wrapper nodes are unaware of this change.\n if (inNode && this._upstreamNodes) {\n const it = this._upstreamNodes.values();\n for (let next = it.next(); !next.done; next = it.next()) {\n (next.value as IWebAudioOutNode).outNode?.connect(inNode);\n }\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"webAudioBusAndSoundSubGraph.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../../types\";\nimport type { AbstractAudioNode } from \"../../abstractAudio/abstractAudioNode\";\nimport type { _AbstractAudioSubNode } from \"../../abstractAudio/subNodes/abstractAudioSubNode\";\nimport { AudioSubNode } from \"../../abstractAudio/subNodes/audioSubNode\";\nimport { _GetSpatialAudioSubNode } from \"../../abstractAudio/subNodes/spatialAudioSubNode\";\nimport { _GetStereoAudioSubNode } from \"../../abstractAudio/subNodes/stereoAudioSubNode\";\nimport type { IVolumeAudioOptions } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport { _GetVolumeAudioSubNode } from \"../../abstractAudio/subNodes/volumeAudioSubNode\";\nimport type { ISpatialAudioOptions } from \"../../abstractAudio/subProperties/abstractSpatialAudio\";\nimport { _HasSpatialAudioOptions } from \"../../abstractAudio/subProperties/abstractSpatialAudio\";\nimport type { IStereoAudioOptions } from \"../../abstractAudio/subProperties/abstractStereoAudio\";\nimport { _HasStereoAudioOptions } from \"../../abstractAudio/subProperties/abstractStereoAudio\";\nimport type { IWebAudioOutNode, IWebAudioSubNode } from \"../webAudioNode\";\nimport type { _SpatialWebAudioSubNode } from \"./spatialWebAudioSubNode\";\nimport { _CreateSpatialAudioSubNodeAsync } from \"./spatialWebAudioSubNode\";\nimport type { _StereoWebAudioSubNode } from \"./stereoWebAudioSubNode\";\nimport { _CreateStereoAudioSubNodeAsync } from \"./stereoWebAudioSubNode\";\nimport type { _VolumeWebAudioSubNode } from \"./volumeWebAudioSubNode\";\nimport { _WebAudioBaseSubGraph } from \"./webAudioBaseSubGraph\";\n\n/** @internal */\nexport interface IWebAudioBusAndSoundSubGraphOptions extends ISpatialAudioOptions, IStereoAudioOptions, IVolumeAudioOptions {}\n\n/** @internal */\nexport abstract class _WebAudioBusAndSoundSubGraph extends _WebAudioBaseSubGraph {\n private _rootNode: Nullable<GainNode> = null;\n protected abstract readonly _upstreamNodes: Nullable<Set<AbstractAudioNode>>;\n\n protected _inNode: Nullable<AudioNode> = null;\n\n /** @internal */\n public override async init(options: Partial<IWebAudioBusAndSoundSubGraphOptions>): Promise<void> {\n super.init(options);\n\n let hasSpatialOptions = false;\n let hasStereoOptions = false;\n\n if ((hasSpatialOptions = _HasSpatialAudioOptions(options))) {\n this.createAndAddSubNode(AudioSubNode.SPATIAL);\n }\n if ((hasStereoOptions = _HasStereoAudioOptions(options))) {\n this.createAndAddSubNode(AudioSubNode.STEREO);\n }\n\n await this._createSubNodePromisesResolved();\n\n if (hasSpatialOptions) {\n _GetSpatialAudioSubNode(this)?.setOptions(options);\n }\n if (hasStereoOptions) {\n _GetStereoAudioSubNode(this)?.setOptions(options);\n }\n }\n\n /** @internal */\n public override get inNode(): Nullable<AudioNode> {\n return this._inNode;\n }\n\n protected override _createSubNode(name: string): Promise<_AbstractAudioSubNode> {\n try {\n const node = super._createSubNode(name);\n return node;\n } catch (e) {}\n\n switch (name) {\n case AudioSubNode.SPATIAL:\n return _CreateSpatialAudioSubNodeAsync(this._owner.engine);\n case AudioSubNode.STEREO:\n return _CreateStereoAudioSubNodeAsync(this._owner.engine);\n default:\n throw new Error(`Unknown subnode name: ${name}`);\n }\n }\n\n protected override _onSubNodesChanged(): void {\n super._onSubNodesChanged();\n\n const spatialNode = _GetSpatialAudioSubNode(this);\n const stereoNode = _GetStereoAudioSubNode(this);\n const volumeNode = _GetVolumeAudioSubNode(this);\n\n if (spatialNode && spatialNode.getClassName() !== \"_SpatialWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n if (stereoNode && stereoNode.getClassName() !== \"_StereoWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n if (volumeNode && volumeNode.getClassName() !== \"_VolumeWebAudioSubNode\") {\n throw new Error(\"Not a WebAudio subnode.\");\n }\n\n if (spatialNode) {\n spatialNode.disconnectAll();\n\n if (volumeNode) {\n spatialNode.connect(volumeNode);\n }\n }\n\n if (stereoNode) {\n stereoNode.disconnectAll();\n\n if (volumeNode) {\n stereoNode.connect(volumeNode);\n }\n }\n\n if (spatialNode && stereoNode) {\n this._rootNode = new GainNode(this._owner.engine.audioContext);\n this._rootNode.connect((spatialNode as _SpatialWebAudioSubNode).outNode);\n this._rootNode.connect((stereoNode as _StereoWebAudioSubNode).outNode);\n } else {\n this._rootNode?.disconnect();\n this._rootNode = null;\n }\n\n let inSubNode: Nullable<IWebAudioSubNode> = null;\n\n let inNode: Nullable<AudioNode> = null;\n\n if (this._rootNode) {\n inNode = this._rootNode;\n } else {\n if (spatialNode) {\n inSubNode = spatialNode as _SpatialWebAudioSubNode;\n } else if (stereoNode) {\n inSubNode = stereoNode as _StereoWebAudioSubNode;\n } else if (volumeNode) {\n inSubNode = volumeNode as _VolumeWebAudioSubNode;\n }\n\n inNode = inSubNode?.node ?? null;\n }\n\n if (this._inNode !== inNode) {\n // Disconnect the wrapped upstream WebAudio nodes from the old wrapped WebAudio node.\n // The wrapper nodes are unaware of this change.\n if (this._inNode && this._upstreamNodes) {\n const it = this._upstreamNodes.values();\n for (let next = it.next(); !next.done; next = it.next()) {\n (next.value as IWebAudioOutNode).outNode?.disconnect(this._inNode);\n }\n }\n\n this._inNode = inNode;\n\n // Connect the wrapped upstream WebAudio nodes to the new wrapped WebAudio node.\n // The wrapper nodes are unaware of this change.\n if (inNode && this._upstreamNodes) {\n const it = this._upstreamNodes.values();\n for (let next = it.next(); !next.done; next = it.next()) {\n (next.value as IWebAudioOutNode).outNode?.connect(inNode);\n }\n }\n }\n }\n}\n"]}
@@ -31,7 +31,6 @@ export declare class WebGPUTextureManager {
31
31
  setCommandEncoder(encoder: GPUCommandEncoder): void;
32
32
  copyVideoToTexture(video: ExternalTexture, texture: InternalTexture, format: GPUTextureFormat, invertY?: boolean, commandEncoder?: GPUCommandEncoder): void;
33
33
  invertYPreMultiplyAlpha(gpuOrHdwTexture: GPUTexture | WebGPUHardwareTexture, width: number, height: number, format: GPUTextureFormat, invertY?: boolean, premultiplyAlpha?: boolean, faceIndex?: number, mipLevel?: number, layers?: number, ofstX?: number, ofstY?: number, rectWidth?: number, rectHeight?: number, commandEncoder?: GPUCommandEncoder, allowGPUOptimization?: boolean): void;
34
- copyWithInvertY(srcTextureView: GPUTextureView, format: GPUTextureFormat, renderPassDescriptor: GPURenderPassDescriptor, commandEncoder?: GPUCommandEncoder): void;
35
34
  createTexture(imageBitmap: ImageBitmap | {
36
35
  width: number;
37
36
  height: number;
@@ -82,7 +82,7 @@ const invertYPreMultiplyAlphaFragmentSource = `
82
82
  var color: vec4f = textureLoad(img, vec2i(input.position.xy), 0);
83
83
  #endif
84
84
  #ifdef PREMULTIPLYALPHA
85
- fragmentOutputs.color = vec4f(color.rgb * color.a, color.a);
85
+ color = vec4f(color.rgb * color.a, color.a);
86
86
  #endif
87
87
  fragmentOutputs.color = color;
88
88
  }
@@ -592,33 +592,6 @@ export class WebGPUTextureManager {
592
592
  commandEncoder = null;
593
593
  }
594
594
  }
595
- copyWithInvertY(srcTextureView, format, renderPassDescriptor, commandEncoder) {
596
- const useOwnCommandEncoder = commandEncoder === undefined;
597
- const [pipeline, bindGroupLayout] = this._getPipeline(format, PipelineType.InvertYPremultiplyAlpha, { invertY: true, premultiplyAlpha: false });
598
- if (useOwnCommandEncoder) {
599
- commandEncoder = this._device.createCommandEncoder({});
600
- }
601
- commandEncoder.pushDebugGroup?.(`internal copy texture with invertY`);
602
- const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
603
- const bindGroup = this._device.createBindGroup({
604
- layout: bindGroupLayout,
605
- entries: [
606
- {
607
- binding: 0,
608
- resource: srcTextureView,
609
- },
610
- ],
611
- });
612
- passEncoder.setPipeline(pipeline);
613
- passEncoder.setBindGroup(0, bindGroup);
614
- passEncoder.draw(4, 1, 0, 0);
615
- passEncoder.end();
616
- commandEncoder.popDebugGroup?.();
617
- if (useOwnCommandEncoder) {
618
- this._device.queue.submit([commandEncoder.finish()]);
619
- commandEncoder = null;
620
- }
621
- }
622
595
  //------------------------------------------------------------------------------
623
596
  // Creation
624
597
  //------------------------------------------------------------------------------
@@ -949,35 +922,7 @@ export class WebGPUTextureManager {
949
922
  }
950
923
  else {
951
924
  imageBitmap = imageBitmap;
952
- if (invertY) {
953
- textureCopyView.premultipliedAlpha = false; // we are going to handle premultiplyAlpha ourselves
954
- // we must preprocess the image
955
- if (WebGPUTextureHelper.IsInternalTexture(texture) && offsetX === 0 && offsetY === 0 && width === texture.width && height === texture.height) {
956
- // optimization when the source image is the same size than the destination texture and offsets X/Y == 0:
957
- // we simply copy the source to the destination and we apply the preprocessing on the destination
958
- this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, textureCopyView, textureExtent);
959
- this.invertYPreMultiplyAlpha(gpuOrHdwTexture, width, height, format, invertY, premultiplyAlpha, faceIndex, mipLevel, layers || 1, 0, 0, 0, 0, undefined, allowGPUOptimization);
960
- }
961
- else {
962
- // we must apply the preprocessing on the source image before copying it into the destination texture
963
- const commandEncoder = this._device.createCommandEncoder({});
964
- // create a temp texture and copy the image to it
965
- const srcTexture = this.createTexture({ width, height, layers: 1 }, false, false, false, false, false, format, 1, commandEncoder, 1 /* WebGPUConstants.TextureUsage.CopySrc */ | 4 /* WebGPUConstants.TextureUsage.TextureBinding */, undefined, "TempTextureForUpdateTexture");
966
- this._deferredReleaseTextures.push([srcTexture, null]);
967
- textureExtent.depthOrArrayLayers = 1;
968
- this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, { texture: srcTexture }, textureExtent);
969
- textureExtent.depthOrArrayLayers = layers || 1;
970
- // apply the preprocessing to this temp texture
971
- this.invertYPreMultiplyAlpha(srcTexture, width, height, format, invertY, premultiplyAlpha, 0, 0, 1, 0, 0, 0, 0, commandEncoder, allowGPUOptimization);
972
- // copy the temp texture to the destination texture
973
- commandEncoder.copyTextureToTexture({ texture: srcTexture }, textureCopyView, textureExtent);
974
- this._device.queue.submit([commandEncoder.finish()]);
975
- }
976
- }
977
- else {
978
- // no preprocessing: direct copy to destination texture
979
- this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, textureCopyView, textureExtent);
980
- }
925
+ this._device.queue.copyExternalImageToTexture({ source: imageBitmap, flipY: invertY }, textureCopyView, textureExtent);
981
926
  }
982
927
  }
983
928
  readPixels(texture, x, y, width, height, format, faceIndex = 0, mipLevel = 0, buffer = null, noDataConversion = false) {