@babylonjs/core 7.35.1 → 7.36.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 (180) hide show
  1. package/Engines/Extensions/engine.multiRender.d.ts +11 -0
  2. package/Engines/Extensions/engine.multiRender.js +71 -32
  3. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  4. package/Engines/Extensions/engine.prefilteredCubeTexture.js +3 -2
  5. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
  6. package/Engines/Extensions/engine.renderTarget.js +1 -13
  7. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  8. package/Engines/WebGL/webGLRenderTargetWrapper.d.ts +2 -0
  9. package/Engines/WebGL/webGLRenderTargetWrapper.js +37 -7
  10. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  11. package/Engines/WebGPU/Extensions/engine.multiRender.d.ts +11 -0
  12. package/Engines/WebGPU/Extensions/engine.multiRender.js +30 -11
  13. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  14. package/Engines/WebGPU/Extensions/engine.renderTarget.js +2 -5
  15. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  16. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +3 -2
  17. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  18. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +3 -1
  19. package/Engines/WebGPU/webgpuHardwareTexture.js +5 -4
  20. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  21. package/Engines/WebGPU/webgpuTextureManager.js +2 -2
  22. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  23. package/Engines/abstractEngine.d.ts +11 -0
  24. package/Engines/abstractEngine.js +2 -2
  25. package/Engines/abstractEngine.js.map +1 -1
  26. package/Engines/renderTargetWrapper.d.ts +33 -1
  27. package/Engines/renderTargetWrapper.js +64 -4
  28. package/Engines/renderTargetWrapper.js.map +1 -1
  29. package/Engines/thinEngine.d.ts +13 -1
  30. package/Engines/thinEngine.js +115 -24
  31. package/Engines/thinEngine.js.map +1 -1
  32. package/Engines/thinWebGPUEngine.d.ts +2 -0
  33. package/Engines/thinWebGPUEngine.js +7 -0
  34. package/Engines/thinWebGPUEngine.js.map +1 -1
  35. package/Engines/webgpuEngine.d.ts +12 -3
  36. package/Engines/webgpuEngine.js +39 -9
  37. package/Engines/webgpuEngine.js.map +1 -1
  38. package/FrameGraph/Node/Blocks/Textures/clearBlock.d.ts +8 -0
  39. package/FrameGraph/Node/Blocks/Textures/clearBlock.js +22 -1
  40. package/FrameGraph/Node/Blocks/Textures/clearBlock.js.map +1 -1
  41. package/FrameGraph/Node/Blocks/inputBlock.d.ts +4 -9
  42. package/FrameGraph/Node/Blocks/inputBlock.js +15 -25
  43. package/FrameGraph/Node/Blocks/inputBlock.js.map +1 -1
  44. package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.js +10 -2
  45. package/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint.js.map +1 -1
  46. package/FrameGraph/Passes/renderPass.d.ts +10 -10
  47. package/FrameGraph/Passes/renderPass.js +10 -10
  48. package/FrameGraph/Passes/renderPass.js.map +1 -1
  49. package/FrameGraph/Tasks/PostProcesses/bloomTask.d.ts +10 -5
  50. package/FrameGraph/Tasks/PostProcesses/bloomTask.js +29 -14
  51. package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
  52. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -0
  53. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  54. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.d.ts +11 -6
  55. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +30 -13
  56. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
  57. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +4 -6
  58. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  59. package/FrameGraph/Tasks/Rendering/cullObjectsTask.d.ts +1 -1
  60. package/FrameGraph/Tasks/Rendering/cullObjectsTask.js.map +1 -1
  61. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +3 -3
  62. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +33 -32
  63. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  64. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +4 -2
  65. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +8 -12
  66. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  67. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +13 -18
  68. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
  69. package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +15 -2
  70. package/FrameGraph/Tasks/Texture/clearTextureTask.js +17 -4
  71. package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
  72. package/FrameGraph/Tasks/Texture/copyToTextureTask.js +2 -2
  73. package/FrameGraph/Tasks/Texture/copyToTextureTask.js.map +1 -1
  74. package/FrameGraph/Tasks/Texture/generateMipMapsTask.js +3 -3
  75. package/FrameGraph/Tasks/Texture/generateMipMapsTask.js.map +1 -1
  76. package/FrameGraph/frameGraph.d.ts +11 -74
  77. package/FrameGraph/frameGraph.js +12 -126
  78. package/FrameGraph/frameGraph.js.map +1 -1
  79. package/FrameGraph/frameGraphRenderContext.d.ts +17 -8
  80. package/FrameGraph/frameGraphRenderContext.js +55 -43
  81. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  82. package/FrameGraph/frameGraphRenderTarget.d.ts +16 -0
  83. package/FrameGraph/frameGraphRenderTarget.js +67 -0
  84. package/FrameGraph/frameGraphRenderTarget.js.map +1 -0
  85. package/FrameGraph/frameGraphTask.d.ts +4 -3
  86. package/FrameGraph/frameGraphTask.js +41 -8
  87. package/FrameGraph/frameGraphTask.js.map +1 -1
  88. package/FrameGraph/frameGraphTextureManager.d.ts +130 -22
  89. package/FrameGraph/frameGraphTextureManager.js +312 -130
  90. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  91. package/FrameGraph/frameGraphTypes.d.ts +28 -13
  92. package/FrameGraph/frameGraphTypes.js.map +1 -1
  93. package/FrameGraph/index.d.ts +1 -0
  94. package/FrameGraph/index.js +1 -0
  95. package/FrameGraph/index.js.map +1 -1
  96. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +3 -2
  97. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  98. package/Materials/Node/Blocks/conditionalBlock.d.ts +2 -0
  99. package/Materials/Node/Blocks/conditionalBlock.js +13 -0
  100. package/Materials/Node/Blocks/conditionalBlock.js.map +1 -1
  101. package/Materials/Node/nodeMaterialBlock.js +4 -1
  102. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  103. package/Materials/Node/nodeMaterialBlockConnectionPoint.js +12 -4
  104. package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
  105. package/Materials/Textures/equiRectangularCubeTexture.js +14 -4
  106. package/Materials/Textures/equiRectangularCubeTexture.js.map +1 -1
  107. package/Materials/Textures/internalTexture.d.ts +20 -0
  108. package/Materials/Textures/internalTexture.js +48 -0
  109. package/Materials/Textures/internalTexture.js.map +1 -1
  110. package/Materials/Textures/multiRenderTarget.d.ts +5 -0
  111. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  112. package/Materials/Textures/textureCreationOptions.d.ts +6 -6
  113. package/Materials/Textures/textureCreationOptions.js.map +1 -1
  114. package/Materials/drawWrapper.js +4 -0
  115. package/Materials/drawWrapper.js.map +1 -1
  116. package/Materials/effect.js +2 -2
  117. package/Materials/effect.js.map +1 -1
  118. package/Materials/material.d.ts +2 -2
  119. package/Materials/material.js +5 -5
  120. package/Materials/material.js.map +1 -1
  121. package/Maths/math.color.d.ts +16 -0
  122. package/Maths/math.color.js +16 -0
  123. package/Maths/math.color.js.map +1 -1
  124. package/Maths/math.vector.d.ts +32 -0
  125. package/Maths/math.vector.js +32 -0
  126. package/Maths/math.vector.js.map +1 -1
  127. package/Meshes/Compression/dracoCompression.d.ts +3 -1
  128. package/Meshes/Compression/dracoCompression.js +5 -2
  129. package/Meshes/Compression/dracoCompression.js.map +1 -1
  130. package/Meshes/Node/Blocks/Matrices/rotationXBlock.d.ts +0 -1
  131. package/Meshes/Node/Blocks/Matrices/rotationXBlock.js +1 -9
  132. package/Meshes/Node/Blocks/Matrices/rotationXBlock.js.map +1 -1
  133. package/Meshes/Node/Blocks/Matrices/rotationYBlock.d.ts +0 -1
  134. package/Meshes/Node/Blocks/Matrices/rotationYBlock.js +1 -9
  135. package/Meshes/Node/Blocks/Matrices/rotationYBlock.js.map +1 -1
  136. package/Meshes/Node/Blocks/Matrices/rotationZBlock.d.ts +0 -1
  137. package/Meshes/Node/Blocks/Matrices/rotationZBlock.js +1 -9
  138. package/Meshes/Node/Blocks/Matrices/rotationZBlock.js.map +1 -1
  139. package/Meshes/Node/Blocks/Set/latticeBlock.js +3 -1
  140. package/Meshes/Node/Blocks/Set/latticeBlock.js.map +1 -1
  141. package/Meshes/Node/Blocks/conditionBlock.d.ts +2 -0
  142. package/Meshes/Node/Blocks/conditionBlock.js +15 -0
  143. package/Meshes/Node/Blocks/conditionBlock.js.map +1 -1
  144. package/Meshes/Node/Blocks/geometryClampBlock.d.ts +4 -4
  145. package/Meshes/Node/Blocks/geometryClampBlock.js +16 -25
  146. package/Meshes/Node/Blocks/geometryClampBlock.js.map +1 -1
  147. package/Meshes/Node/Blocks/geometryLerpBlock.js +2 -2
  148. package/Meshes/Node/Blocks/geometryLerpBlock.js.map +1 -1
  149. package/Meshes/Node/Blocks/geometryNLerpBlock.js +2 -2
  150. package/Meshes/Node/Blocks/geometryNLerpBlock.js.map +1 -1
  151. package/Meshes/Node/Blocks/geometryReplaceColorBlock.js +2 -2
  152. package/Meshes/Node/Blocks/geometryReplaceColorBlock.js.map +1 -1
  153. package/Meshes/Node/Blocks/geometryRotate2dBlock.js +2 -2
  154. package/Meshes/Node/Blocks/geometryRotate2dBlock.js.map +1 -1
  155. package/Meshes/Node/Blocks/geometrySmoothStepBlock.js +3 -3
  156. package/Meshes/Node/Blocks/geometrySmoothStepBlock.js.map +1 -1
  157. package/Meshes/Node/Blocks/geometryStepBlock.js +2 -2
  158. package/Meshes/Node/Blocks/geometryStepBlock.js.map +1 -1
  159. package/Meshes/Node/nodeGeometry.js +1 -1
  160. package/Meshes/Node/nodeGeometry.js.map +1 -1
  161. package/Meshes/Node/nodeGeometryBlock.d.ts +3 -1
  162. package/Meshes/Node/nodeGeometryBlock.js +2 -1
  163. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  164. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +10 -2
  165. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
  166. package/Meshes/abstractMesh.js +1 -1
  167. package/Meshes/abstractMesh.js.map +1 -1
  168. package/Meshes/lattice.material.d.ts +1 -1
  169. package/Meshes/lattice.material.js +3 -3
  170. package/Meshes/lattice.material.js.map +1 -1
  171. package/Misc/observable.d.ts +3 -1
  172. package/Misc/observable.js +7 -2
  173. package/Misc/observable.js.map +1 -1
  174. package/ShadersWGSL/glowMapGeneration.fragment.js +4 -3
  175. package/ShadersWGSL/glowMapGeneration.fragment.js.map +1 -1
  176. package/ShadersWGSL/pbr.fragment.js +4 -3
  177. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  178. package/package.json +1 -1
  179. package/scene.js +6 -6
  180. package/scene.js.map +1 -1
@@ -1,7 +1,9 @@
1
- import { getDimensionsFromTextureSize } from "../Materials/Textures/textureCreationOptions.js";
1
+ import { getDimensionsFromTextureSize, textureSizeIsObject } from "../Materials/Textures/textureCreationOptions.js";
2
2
  import { Texture } from "../Materials/Textures/texture.js";
3
3
  import { backbufferColorTextureHandle, backbufferDepthStencilTextureHandle } from "./frameGraphTypes.js";
4
4
 
5
+ import { GetTypeForDepthTexture, IsDepthTexture, HasStencilAspect } from "../Materials/Textures/internalTexture.js";
6
+ import { FrameGraphRenderTarget } from "./frameGraphRenderTarget.js";
5
7
  var FrameGraphTextureNamespace;
6
8
  (function (FrameGraphTextureNamespace) {
7
9
  FrameGraphTextureNamespace[FrameGraphTextureNamespace["Task"] = 0] = "Task";
@@ -9,18 +11,33 @@ var FrameGraphTextureNamespace;
9
11
  FrameGraphTextureNamespace[FrameGraphTextureNamespace["External"] = 2] = "External";
10
12
  })(FrameGraphTextureNamespace || (FrameGraphTextureNamespace = {}));
11
13
  /**
14
+ * Manages the textures used by a frame graph
12
15
  * @experimental
13
- * @internal
14
16
  */
15
17
  export class FrameGraphTextureManager {
16
- constructor(_engine, _debugTextures = false, _scene) {
17
- this._engine = _engine;
18
+ /**
19
+ * Constructs a new instance of the texture manager
20
+ * @param engine The engine to use
21
+ * @param _debugTextures If true, debug textures will be created so that they are visible in the inspector
22
+ * @param _scene The scene the manager belongs to
23
+ */
24
+ constructor(engine, _debugTextures = false, _scene) {
25
+ this.engine = engine;
18
26
  this._debugTextures = _debugTextures;
19
27
  this._scene = _scene;
28
+ /** @internal */
20
29
  this._textures = new Map();
30
+ /** @internal */
21
31
  this._historyTextures = new Map();
32
+ /** @internal */
33
+ this._isRecordingTask = false;
22
34
  this._addSystemTextures();
23
35
  }
36
+ /**
37
+ * Checks if a handle is a backbuffer handle (color or depth/stencil)
38
+ * @param handle The handle to check
39
+ * @returns True if the handle is a backbuffer handle
40
+ */
24
41
  isBackbuffer(handle) {
25
42
  if (handle === backbufferColorTextureHandle || handle === backbufferDepthStencilTextureHandle) {
26
43
  return true;
@@ -31,6 +48,11 @@ export class FrameGraphTextureManager {
31
48
  }
32
49
  return textureEntry.refHandle === backbufferColorTextureHandle || textureEntry.refHandle === backbufferDepthStencilTextureHandle;
33
50
  }
51
+ /**
52
+ * Checks if a handle is a backbuffer color handle
53
+ * @param handle The handle to check
54
+ * @returns True if the handle is a backbuffer color handle
55
+ */
34
56
  isBackbufferColor(handle) {
35
57
  if (handle === backbufferColorTextureHandle) {
36
58
  return true;
@@ -41,6 +63,11 @@ export class FrameGraphTextureManager {
41
63
  }
42
64
  return textureEntry.refHandle === backbufferColorTextureHandle;
43
65
  }
66
+ /**
67
+ * Checks if a handle is a backbuffer depth/stencil handle
68
+ * @param handle The handle to check
69
+ * @returns True if the handle is a backbuffer depth/stencil handle
70
+ */
44
71
  isBackbufferDepthStencil(handle) {
45
72
  if (handle === backbufferDepthStencilTextureHandle) {
46
73
  return true;
@@ -51,80 +78,217 @@ export class FrameGraphTextureManager {
51
78
  }
52
79
  return textureEntry.refHandle === backbufferDepthStencilTextureHandle;
53
80
  }
81
+ /**
82
+ * Checks if a handle is a history texture (or points to a history texture, for a dangling handle)
83
+ * @param handle The handle to check
84
+ * @returns True if the handle is a history texture, otherwise false
85
+ */
86
+ isHistoryTexture(handle) {
87
+ const entry = this._textures.get(handle);
88
+ if (!entry) {
89
+ return false;
90
+ }
91
+ handle = entry.refHandle ?? handle;
92
+ return this._historyTextures.has(handle);
93
+ }
94
+ /**
95
+ * Gets the creation options of a texture
96
+ * @param handle Handle of the texture
97
+ * @returns The creation options of the texture
98
+ */
54
99
  getTextureCreationOptions(handle) {
55
- return this._textures.get(handle).creationOptions;
100
+ const entry = this._textures.get(handle);
101
+ const creationOptions = entry.creationOptions;
102
+ return {
103
+ size: textureSizeIsObject(creationOptions.size) ? { ...creationOptions.size } : creationOptions.size,
104
+ sizeIsPercentage: creationOptions.sizeIsPercentage,
105
+ options: this._cloneTextureOptions(creationOptions.options, entry.textureIndex),
106
+ isHistoryTexture: creationOptions.isHistoryTexture,
107
+ };
56
108
  }
109
+ /**
110
+ * Gets the description of a texture
111
+ * @param handle Handle of the texture
112
+ * @returns The description of the texture
113
+ */
114
+ getTextureDescription(handle) {
115
+ const creationOptions = this.getTextureCreationOptions(handle);
116
+ const size = !creationOptions.sizeIsPercentage
117
+ ? textureSizeIsObject(creationOptions.size)
118
+ ? creationOptions.size
119
+ : { width: creationOptions.size, height: creationOptions.size }
120
+ : this.getAbsoluteDimensions(creationOptions.size);
121
+ return {
122
+ size,
123
+ options: creationOptions.options,
124
+ };
125
+ }
126
+ /**
127
+ * Gets a texture handle or creates a new texture if the handle is not provided.
128
+ * If handle is not provided, newTextureName and creationOptions must be provided.
129
+ * @param handle If provided, will simply return the handle
130
+ * @param newTextureName Name of the new texture to create
131
+ * @param creationOptions Options to use when creating the new texture
132
+ * @returns The handle to the texture.
133
+ */
134
+ getTextureHandleOrCreateTexture(handle, newTextureName, creationOptions) {
135
+ if (handle === undefined) {
136
+ if (newTextureName === undefined || creationOptions === undefined) {
137
+ throw new Error("getTextureHandleOrCreateTexture: Either handle or newTextureName and creationOptions must be provided.");
138
+ }
139
+ return this.createRenderTargetTexture(newTextureName, creationOptions);
140
+ }
141
+ return handle;
142
+ }
143
+ /**
144
+ * Gets a texture from a handle.
145
+ * Note that if the texture is a history texture, the read texture for the current frame will be returned.
146
+ * @param handle The handle of the texture
147
+ * @returns The texture or null if not found
148
+ */
57
149
  getTextureFromHandle(handle) {
58
150
  const historyEntry = this._historyTextures.get(handle);
59
151
  if (historyEntry) {
60
- return historyEntry.textures[historyEntry.index ^ 1]; // get the read texture
152
+ return historyEntry.textures[historyEntry.index ^ 1]; // gets the read texture
61
153
  }
62
154
  return this._textures.get(handle).texture;
63
155
  }
156
+ /**
157
+ * Imports a texture into the texture manager
158
+ * @param name Name of the texture
159
+ * @param texture Texture to import
160
+ * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.
161
+ * @returns The handle to the texture
162
+ */
64
163
  importTexture(name, texture, handle) {
65
- const internalTexture = texture.texture;
66
- if (!internalTexture) {
67
- throw new Error("importTexture: Texture must have an internal texture to be imported");
68
- }
69
164
  if (handle !== undefined) {
70
165
  this._freeEntry(handle);
71
166
  }
72
167
  const creationOptions = {
73
168
  size: { width: texture.width, height: texture.height },
169
+ sizeIsPercentage: false,
170
+ isHistoryTexture: false,
74
171
  options: {
75
- generateMipMaps: internalTexture.generateMipMaps,
76
- generateDepthBuffer: texture._generateDepthBuffer,
77
- generateStencilBuffer: texture._generateStencilBuffer,
78
- samples: internalTexture.samples,
79
- label: internalTexture.label,
80
- types: [internalTexture.type],
81
- samplingModes: [internalTexture.samplingMode],
82
- formats: [internalTexture.format],
83
- targetTypes: [
84
- internalTexture.isCube
85
- ? 34067
86
- : internalTexture.is3D
87
- ? 32879
88
- : internalTexture.is2DArray
89
- ? 35866
90
- : 3553,
91
- ],
92
- useSRGBBuffers: [internalTexture._useSRGBBuffer],
93
- labels: internalTexture.label ? [internalTexture.label] : undefined,
172
+ createMipMaps: texture.generateMipMaps,
173
+ samples: texture.samples,
174
+ types: [texture.type],
175
+ formats: [texture.format],
176
+ useSRGBBuffers: [texture._useSRGBBuffer],
177
+ creationFlags: [texture._creationFlags],
178
+ labels: texture.label ? [texture.label] : ["imported"],
94
179
  },
95
- sizeIsPercentage: false,
96
180
  };
97
- return this._createHandleForTexture(name, texture, creationOptions, FrameGraphTextureNamespace.External, false, handle);
181
+ return this._createHandleForTexture(name, texture, creationOptions, FrameGraphTextureNamespace.External, handle);
182
+ }
183
+ /**
184
+ * Creates a new render target texture
185
+ * If multiple textures are described in FrameGraphTextureCreationOptions, the handle of the first texture is returned, handle+1 is the handle of the second texture, etc.
186
+ * @param name Name of the texture
187
+ * @param creationOptions Options to use when creating the texture
188
+ * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.
189
+ * @returns The handle to the texture
190
+ */
191
+ createRenderTargetTexture(name, creationOptions, handle) {
192
+ return this._createHandleForTexture(name, null, {
193
+ size: textureSizeIsObject(creationOptions.size) ? { ...creationOptions.size } : creationOptions.size,
194
+ sizeIsPercentage: creationOptions.sizeIsPercentage,
195
+ isHistoryTexture: creationOptions.isHistoryTexture,
196
+ options: this._cloneTextureOptions(creationOptions.options),
197
+ }, this._isRecordingTask ? FrameGraphTextureNamespace.Task : FrameGraphTextureNamespace.Graph, handle);
98
198
  }
99
- createRenderTargetTexture(name, taskNamespace, creationOptions, multiTargetMode = false, handle) {
100
- return this._createHandleForTexture(name, null, creationOptions, taskNamespace ? FrameGraphTextureNamespace.Task : FrameGraphTextureNamespace.Graph, multiTargetMode, handle);
199
+ /**
200
+ * Creates a (frame graph) render target wrapper
201
+ * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!
202
+ * @param name Name of the render target wrapper
203
+ * @param renderTargets Render target handles (textures) to use
204
+ * @param renderTargetDepth Render target depth handle (texture) to use
205
+ * @returns The created render target wrapper
206
+ */
207
+ createRenderTarget(name, renderTargets, renderTargetDepth) {
208
+ const renderTarget = new FrameGraphRenderTarget(name, this, renderTargets, renderTargetDepth);
209
+ const rtw = renderTarget.renderTargetWrapper;
210
+ if (rtw !== undefined && renderTargets) {
211
+ const handles = Array.isArray(renderTargets) ? renderTargets : [renderTargets];
212
+ for (let i = 0; i < handles.length; i++) {
213
+ let handle = handles[i];
214
+ handle = this._textures.get(handle)?.refHandle ?? handle;
215
+ const historyEntry = this._historyTextures.get(handle);
216
+ if (historyEntry) {
217
+ historyEntry.references.push({ renderTargetWrapper: rtw, textureIndex: i });
218
+ rtw.setTexture(historyEntry.textures[historyEntry.index], i, false);
219
+ }
220
+ }
221
+ }
222
+ return renderTarget;
223
+ }
224
+ /**
225
+ * Creates a handle which is not associated with any texture.
226
+ * Call resolveDanglingHandle to associate the handle with a valid texture handle.
227
+ * @returns The dangling handle
228
+ */
229
+ createDanglingHandle() {
230
+ return FrameGraphTextureManager._Counter++;
231
+ }
232
+ /**
233
+ * Associates a texture with a dangling handle
234
+ * @param danglingHandle The dangling handle
235
+ * @param handle The handle to associate with the dangling handle (if not provided, a new texture handle will be created, using the newTextureName and creationOptions parameters)
236
+ * @param newTextureName The name of the new texture to create (if handle is not provided)
237
+ * @param creationOptions The options to use when creating the new texture (if handle is not provided)
238
+ */
239
+ resolveDanglingHandle(danglingHandle, handle, newTextureName, creationOptions) {
240
+ if (handle === undefined) {
241
+ if (newTextureName === undefined || creationOptions === undefined) {
242
+ throw new Error("resolveDanglingHandle: Either handle or newTextureName and creationOptions must be provided.");
243
+ }
244
+ this.createRenderTargetTexture(newTextureName, creationOptions, danglingHandle);
245
+ return;
246
+ }
247
+ const textureEntry = this._textures.get(handle);
248
+ if (textureEntry === undefined) {
249
+ throw new Error(`resolveDanglingHandle: Handle ${handle} does not exist!`);
250
+ }
251
+ this._textures.set(danglingHandle, {
252
+ texture: textureEntry.texture,
253
+ refHandle: handle,
254
+ name: textureEntry.name,
255
+ creationOptions: {
256
+ size: { ...textureEntry.creationOptions.size },
257
+ options: this._cloneTextureOptions(textureEntry.creationOptions.options),
258
+ sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,
259
+ isHistoryTexture: false,
260
+ },
261
+ namespace: textureEntry.namespace,
262
+ textureIndex: textureEntry.textureIndex,
263
+ });
101
264
  }
102
- getAbsoluteDimensions(size, screenWidth = this._engine.getRenderWidth(true), screenHeight = this._engine.getRenderHeight(true)) {
265
+ /**
266
+ * Gets the absolute dimensions of a texture.
267
+ * @param size The size of the texture. Width and height must be expressed as a percentage of the screen size (100=100%)!
268
+ * @param screenWidth The width of the screen (default: the width of the rendering canvas)
269
+ * @param screenHeight The height of the screen (default: the height of the rendering canvas)
270
+ * @returns The absolute dimensions of the texture
271
+ */
272
+ getAbsoluteDimensions(size, screenWidth = this.engine.getRenderWidth(true), screenHeight = this.engine.getRenderHeight(true)) {
103
273
  const { width, height } = getDimensionsFromTextureSize(size);
104
274
  return {
105
275
  width: Math.floor((width * screenWidth) / 100),
106
276
  height: Math.floor((height * screenHeight) / 100),
107
277
  };
108
278
  }
109
- updateHistoryTextures() {
110
- this._historyTextures.forEach((entry) => {
111
- entry.index = entry.index ^ 1;
112
- for (const refHandle of entry.refHandles) {
113
- const textureEntry = this._textures.get(refHandle);
114
- textureEntry.texture = entry.textures[entry.index];
115
- }
116
- });
279
+ /** @internal */
280
+ _dispose() {
281
+ this._releaseTextures();
117
282
  }
118
- dispose() {
119
- this.releaseTextures();
120
- }
121
- allocateTextures() {
283
+ /** @internal */
284
+ _allocateTextures() {
122
285
  this._textures.forEach((entry) => {
123
286
  if (!entry.texture) {
124
287
  if (entry.refHandle !== undefined) {
288
+ // entry is a dangling handle which has been resolved to point to refHandle
289
+ // We simply update the texture to point to the refHandle texture
125
290
  const refEntry = this._textures.get(entry.refHandle);
126
291
  entry.texture = refEntry.texture;
127
- entry.texture?.texture?.incrementReferences();
128
292
  if (refEntry.refHandle === backbufferColorTextureHandle) {
129
293
  entry.refHandle = backbufferColorTextureHandle;
130
294
  }
@@ -133,31 +297,32 @@ export class FrameGraphTextureManager {
133
297
  }
134
298
  }
135
299
  else if (entry.namespace !== FrameGraphTextureNamespace.External) {
136
- if (entry.parentHandle !== undefined) {
137
- const creationOptions = entry.creationOptions;
138
- const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;
139
- const parentEntry = this._textures.get(entry.parentHandle);
140
- const parentInternalTexture = parentEntry.texture.textures[entry.parentTextureIndex];
141
- const creationOptionsForTexture = {
142
- createMipMaps: creationOptions.options.createMipMaps,
143
- generateMipMaps: creationOptions.options.generateMipMaps,
144
- generateDepthBuffer: creationOptions.options.generateDepthBuffer,
145
- generateStencilBuffer: creationOptions.options.generateStencilBuffer,
146
- samples: creationOptions.options.samples,
147
- type: creationOptions.options.types[0],
148
- format: creationOptions.options.formats[0],
149
- useSRGBBuffer: creationOptions.options.useSRGBBuffers[0],
150
- colorAttachment: parentInternalTexture,
151
- label: creationOptions.options.label,
152
- };
153
- entry.texture = this._engine.createRenderTargetTexture(size, creationOptionsForTexture);
154
- parentInternalTexture.incrementReferences();
155
- }
156
- else {
157
- const creationOptions = entry.creationOptions;
158
- const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;
159
- entry.texture = this._engine.createMultipleRenderTarget(size, creationOptions.options, false);
300
+ const creationOptions = entry.creationOptions;
301
+ const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;
302
+ const textureIndex = entry.textureIndex || 0;
303
+ const internalTextureCreationOptions = {
304
+ createMipMaps: creationOptions.options.createMipMaps,
305
+ samples: creationOptions.options.samples,
306
+ type: creationOptions.options.types?.[textureIndex],
307
+ format: creationOptions.options.formats?.[textureIndex],
308
+ useSRGBBuffer: creationOptions.options.useSRGBBuffers?.[textureIndex],
309
+ creationFlags: creationOptions.options.creationFlags?.[textureIndex],
310
+ label: creationOptions.options.labels?.[textureIndex] ?? `${entry.name}${textureIndex > 0 ? "#" + textureIndex : ""}`,
311
+ samplingMode: 1,
312
+ createMSAATexture: creationOptions.options.samples > 1,
313
+ };
314
+ const isDepthTexture = IsDepthTexture(internalTextureCreationOptions.format);
315
+ const hasStencil = HasStencilAspect(internalTextureCreationOptions.format);
316
+ const source = isDepthTexture && hasStencil
317
+ ? 12 /* InternalTextureSource.DepthStencil */
318
+ : isDepthTexture || hasStencil
319
+ ? 14 /* InternalTextureSource.Depth */
320
+ : 5 /* InternalTextureSource.RenderTarget */;
321
+ const internalTexture = this.engine._createInternalTexture(size, internalTextureCreationOptions, false, source);
322
+ if (isDepthTexture) {
323
+ internalTexture.type = GetTypeForDepthTexture(internalTexture.format);
160
324
  }
325
+ entry.texture = internalTexture;
161
326
  }
162
327
  }
163
328
  if (entry.texture && entry.refHandle === undefined) {
@@ -171,34 +336,8 @@ export class FrameGraphTextureManager {
171
336
  }
172
337
  });
173
338
  }
174
- createDanglingHandle() {
175
- return FrameGraphTextureManager._Counter++;
176
- }
177
- resolveDanglingHandle(danglingHandle, handle) {
178
- const textureEntry = this._textures.get(handle);
179
- if (textureEntry === undefined) {
180
- throw new Error(`resolveDanglingHandle: Handle ${handle} does not exist!`);
181
- }
182
- this._textures.set(danglingHandle, {
183
- texture: textureEntry.texture,
184
- refHandle: handle,
185
- name: textureEntry.name,
186
- creationOptions: {
187
- size: { ...textureEntry.creationOptions.size },
188
- options: { ...textureEntry.creationOptions.options, label: textureEntry.name },
189
- sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,
190
- isHistoryTexture: false,
191
- },
192
- namespace: textureEntry.namespace,
193
- parentHandle: textureEntry.parentHandle,
194
- parentTextureIndex: textureEntry.parentTextureIndex,
195
- });
196
- const historyEntry = this._historyTextures.get(handle);
197
- if (historyEntry) {
198
- historyEntry.refHandles.push(danglingHandle);
199
- }
200
- }
201
- releaseTextures(releaseAll = true) {
339
+ /** @internal */
340
+ _releaseTextures(releaseAll = true) {
202
341
  this._textures.forEach((entry, handle) => {
203
342
  if (releaseAll || entry.namespace !== FrameGraphTextureNamespace.External) {
204
343
  entry.debug?.dispose();
@@ -224,14 +363,34 @@ export class FrameGraphTextureManager {
224
363
  this._addSystemTextures();
225
364
  }
226
365
  }
366
+ /** @internal */
367
+ _updateHistoryTextures() {
368
+ this._historyTextures.forEach((entry) => {
369
+ entry.index = entry.index ^ 1;
370
+ const currentTexture = entry.textures[entry.index];
371
+ if (currentTexture) {
372
+ for (const { renderTargetWrapper, textureIndex } of entry.references) {
373
+ renderTargetWrapper.setTexture(currentTexture, textureIndex, false);
374
+ }
375
+ }
376
+ });
377
+ }
227
378
  _addSystemTextures() {
228
- const size = { width: this._engine.getRenderWidth(true), height: this._engine.getRenderHeight(true) };
379
+ const size = { width: this.engine.getRenderWidth(true), height: this.engine.getRenderHeight(true) };
229
380
  this._textures.set(backbufferColorTextureHandle, {
230
381
  name: "backbuffer color",
231
382
  texture: null,
232
383
  creationOptions: {
233
384
  size,
234
- options: {},
385
+ options: {
386
+ createMipMaps: false,
387
+ samples: this.engine.getCreationOptions().antialias ? 4 : 1,
388
+ types: [0], // todo? get from engine
389
+ formats: [5], // todo? get from engine
390
+ useSRGBBuffers: [false],
391
+ creationFlags: [0],
392
+ labels: ["backbuffer color"],
393
+ },
235
394
  sizeIsPercentage: false,
236
395
  },
237
396
  namespace: FrameGraphTextureNamespace.External,
@@ -241,19 +400,27 @@ export class FrameGraphTextureManager {
241
400
  texture: null,
242
401
  creationOptions: {
243
402
  size,
244
- options: {},
403
+ options: {
404
+ createMipMaps: false,
405
+ samples: this.engine.getCreationOptions().antialias ? 4 : 1,
406
+ types: [0], // todo? get from engine
407
+ formats: [16], // todo? get from engine
408
+ useSRGBBuffers: [false],
409
+ creationFlags: [0],
410
+ labels: ["backbuffer depth/stencil"],
411
+ },
245
412
  sizeIsPercentage: false,
246
413
  },
247
414
  namespace: FrameGraphTextureNamespace.External,
248
415
  });
249
416
  }
250
417
  _createDebugTexture(name, texture) {
251
- if (!this._debugTextures || !this._scene) {
418
+ if (!this._debugTextures) {
252
419
  return;
253
420
  }
254
421
  const textureDebug = new Texture(null, this._scene);
255
422
  textureDebug.name = name;
256
- textureDebug._texture = texture.texture || texture._depthStencilTexture;
423
+ textureDebug._texture = texture;
257
424
  textureDebug._texture.incrementReferences();
258
425
  return textureDebug;
259
426
  }
@@ -264,21 +431,22 @@ export class FrameGraphTextureManager {
264
431
  this._textures.delete(handle);
265
432
  }
266
433
  }
267
- _createHandleForTexture(name, texture, creationOptions, namespace, multiTargetMode = false, handle, parentHandle, parentTextureIndex) {
434
+ _createHandleForTexture(name, texture, creationOptions, namespace, handle, textureIndex) {
268
435
  handle = handle ?? FrameGraphTextureManager._Counter++;
269
- const textureName = creationOptions.isHistoryTexture ? `${name} - ping` : name;
436
+ textureIndex = textureIndex || 0;
437
+ const textureName = creationOptions.isHistoryTexture ? `${name} ping` : name;
438
+ const label = creationOptions.options.labels?.[textureIndex] ?? "";
270
439
  const textureEntry = {
271
440
  texture,
272
- name: textureName,
441
+ name: `${textureName}${label ? " " + label : ""}`,
273
442
  creationOptions: {
274
- size: getDimensionsFromTextureSize(creationOptions.size),
275
- options: { ...creationOptions.options, label: textureName },
443
+ size: textureSizeIsObject(creationOptions.size) ? creationOptions.size : { width: creationOptions.size, height: creationOptions.size },
444
+ options: creationOptions.options,
276
445
  sizeIsPercentage: creationOptions.sizeIsPercentage,
277
446
  isHistoryTexture: creationOptions.isHistoryTexture,
278
447
  },
279
448
  namespace,
280
- parentHandle,
281
- parentTextureIndex,
449
+ textureIndex,
282
450
  };
283
451
  this._textures.set(handle, textureEntry);
284
452
  if (namespace === FrameGraphTextureNamespace.External) {
@@ -291,31 +459,45 @@ export class FrameGraphTextureManager {
291
459
  sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,
292
460
  isHistoryTexture: false,
293
461
  };
294
- const pongTexture = this._createHandleForTexture(`${name} - pong`, null, pongCreationOptions, namespace, false);
295
- this._historyTextures.set(handle, { textures: [null, null], handles: [handle, pongTexture], index: 0, refHandles: [] });
462
+ const pongTexture = this._createHandleForTexture(`${name} pong`, null, pongCreationOptions, namespace);
463
+ this._historyTextures.set(handle, { textures: [null, null], handles: [handle, pongTexture], index: 0, references: [] });
296
464
  return handle;
297
465
  }
298
- if (multiTargetMode) {
299
- const textureCount = creationOptions.options.textureCount ?? 1;
300
- for (let i = 0; i < textureCount; i++) {
301
- const label = creationOptions.options.labels?.[i] ?? `${i}`;
302
- const textureName = `${name} - ${label}`;
303
- const creationOptionsForTexture = {
304
- size: getDimensionsFromTextureSize(creationOptions.size),
305
- options: {
306
- ...creationOptions.options,
307
- formats: [creationOptions.options.formats[i]],
308
- types: [creationOptions.options.types[i]],
309
- textureCount: 1,
310
- },
311
- sizeIsPercentage: creationOptions.sizeIsPercentage,
312
- };
313
- this._createHandleForTexture(textureName, null, creationOptionsForTexture, namespace, false, handle + i + 1, handle, i);
466
+ if (creationOptions.options.types && creationOptions.options.types.length > 1 && textureIndex === 0) {
467
+ const textureCount = creationOptions.options.types.length;
468
+ const creationOptionsForTexture = {
469
+ size: textureSizeIsObject(creationOptions.size) ? creationOptions.size : { width: creationOptions.size, height: creationOptions.size },
470
+ options: creationOptions.options,
471
+ sizeIsPercentage: creationOptions.sizeIsPercentage,
472
+ };
473
+ for (let i = 1; i < textureCount; i++) {
474
+ this._createHandleForTexture(textureName, null, creationOptionsForTexture, namespace, handle + i, i);
314
475
  }
315
- FrameGraphTextureManager._Counter += textureCount;
476
+ FrameGraphTextureManager._Counter += textureCount - 1;
316
477
  }
317
478
  return handle;
318
479
  }
480
+ _cloneTextureOptions(options, textureIndex) {
481
+ return textureIndex !== undefined
482
+ ? {
483
+ createMipMaps: options.createMipMaps,
484
+ samples: options.samples,
485
+ types: options.types ? [options.types[textureIndex]] : undefined,
486
+ formats: options.formats ? [options.formats[textureIndex]] : undefined,
487
+ useSRGBBuffers: options.useSRGBBuffers ? [options.useSRGBBuffers[textureIndex]] : undefined,
488
+ creationFlags: options.creationFlags ? [options.creationFlags[textureIndex]] : undefined,
489
+ labels: options.labels ? [options.labels[textureIndex]] : undefined,
490
+ }
491
+ : {
492
+ createMipMaps: options.createMipMaps,
493
+ samples: options.samples,
494
+ types: options.types ? [...options.types] : undefined,
495
+ formats: options.formats ? [...options.formats] : undefined,
496
+ useSRGBBuffers: options.useSRGBBuffers ? [...options.useSRGBBuffers] : undefined,
497
+ creationFlags: options.creationFlags ? [...options.creationFlags] : undefined,
498
+ labels: options.labels ? [...options.labels] : undefined,
499
+ };
500
+ }
319
501
  }
320
502
  FrameGraphTextureManager._Counter = 2; // 0 and 1 are reserved for backbuffer textures
321
503
  //# sourceMappingURL=frameGraphTextureManager.js.map