@onerjs/core 8.55.9 → 8.56.2

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 (265) hide show
  1. package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
  2. package/AudioV2/webAudio/webAudioEngine.js +6 -5
  3. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  4. package/Cameras/arcRotateCamera.pure.js +24 -0
  5. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  6. package/Culling/Helper/boundingInfoHelper.js +8 -4
  7. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  8. package/Engines/AbstractEngine/abstractEngine.textureLoaders.d.ts +5 -1
  9. package/Engines/AbstractEngine/abstractEngine.textureLoaders.js +7 -3
  10. package/Engines/AbstractEngine/abstractEngine.textureLoaders.js.map +1 -1
  11. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.d.ts +6 -0
  12. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js +16 -0
  13. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js.map +1 -0
  14. package/Engines/AbstractEngine/pure.d.ts +1 -0
  15. package/Engines/AbstractEngine/pure.js +1 -0
  16. package/Engines/AbstractEngine/pure.js.map +1 -1
  17. package/Engines/IDrawContext.d.ts +2 -0
  18. package/Engines/IDrawContext.js.map +1 -1
  19. package/Engines/WebGPU/webgpuDrawContext.d.ts +8 -0
  20. package/Engines/WebGPU/webgpuDrawContext.js +15 -0
  21. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  22. package/Engines/abstractEngine.pure.js +2 -2
  23. package/Engines/abstractEngine.pure.js.map +1 -1
  24. package/Engines/constants.d.ts +5 -0
  25. package/Engines/constants.js +5 -0
  26. package/Engines/constants.js.map +1 -1
  27. package/Engines/engine.d.ts +11 -3
  28. package/Engines/webgpuEngine.d.ts +1 -0
  29. package/Engines/webgpuEngine.js +1 -0
  30. package/Engines/webgpuEngine.js.map +1 -1
  31. package/Engines/webgpuEngine.pure.d.ts +10 -0
  32. package/Engines/webgpuEngine.pure.js +15 -1
  33. package/Engines/webgpuEngine.pure.js.map +1 -1
  34. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +4 -0
  35. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +12 -0
  36. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
  37. package/FrameGraph/Node/Blocks/inputBlock.pure.js +2 -1
  38. package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
  39. package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +2 -0
  40. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +2 -0
  41. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  42. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +21 -0
  43. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +45 -0
  44. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  45. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +2 -5
  46. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
  47. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.d.ts +1 -0
  48. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +18 -3
  49. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
  50. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js +2 -0
  51. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js.map +1 -1
  52. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +5 -21
  53. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
  54. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +1 -0
  55. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
  56. package/Materials/Node/Blocks/powBlock.pure.js +2 -1
  57. package/Materials/Node/Blocks/powBlock.pure.js.map +1 -1
  58. package/Materials/Node/Blocks/triPlanarBlock.pure.js +14 -12
  59. package/Materials/Node/Blocks/triPlanarBlock.pure.js.map +1 -1
  60. package/Materials/Node/nodeMaterial.pure.d.ts +11 -0
  61. package/Materials/Node/nodeMaterial.pure.js +11 -0
  62. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  63. package/Materials/Node/nodeMaterialBuildState.d.ts +4 -3
  64. package/Materials/Node/nodeMaterialBuildState.js +7 -1
  65. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  66. package/Materials/PBR/openpbrMaterial.pure.d.ts +4 -0
  67. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +4 -0
  68. package/Materials/Textures/index.d.ts +1 -0
  69. package/Materials/Textures/index.js +1 -0
  70. package/Materials/Textures/index.js.map +1 -1
  71. package/Materials/Textures/textureProcessor.d.ts +29 -6
  72. package/Materials/Textures/textureProcessor.js +22 -16
  73. package/Materials/Textures/textureProcessor.js.map +1 -1
  74. package/Materials/drawWrapper.js +3 -0
  75. package/Materials/drawWrapper.js.map +1 -1
  76. package/Materials/imageProcessingConfiguration.defines.d.ts +3 -0
  77. package/Materials/imageProcessingConfiguration.defines.js +2 -0
  78. package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
  79. package/Materials/imageProcessingConfiguration.functions.js +3 -0
  80. package/Materials/imageProcessingConfiguration.functions.js.map +1 -1
  81. package/Materials/imageProcessingConfiguration.pure.d.ts +58 -0
  82. package/Materials/imageProcessingConfiguration.pure.js +123 -2
  83. package/Materials/imageProcessingConfiguration.pure.js.map +1 -1
  84. package/Materials/materialHelper.geometryrendering.d.ts +19 -0
  85. package/Materials/materialHelper.geometryrendering.js +29 -1
  86. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  87. package/Materials/prepass.defines.d.ts +3 -0
  88. package/Materials/prepass.defines.js +3 -0
  89. package/Materials/prepass.defines.js.map +1 -1
  90. package/Materials/standardMaterial.pure.d.ts +4 -0
  91. package/Materials/uniformBuffer.d.ts +29 -0
  92. package/Materials/uniformBuffer.js +146 -0
  93. package/Materials/uniformBuffer.js.map +1 -1
  94. package/Maths/colorTemperature.functions.d.ts +29 -0
  95. package/Maths/colorTemperature.functions.js +196 -0
  96. package/Maths/colorTemperature.functions.js.map +1 -0
  97. package/Maths/index.d.ts +1 -0
  98. package/Maths/index.js +1 -0
  99. package/Maths/index.js.map +1 -1
  100. package/Maths/math.vector.pure.d.ts +1 -5
  101. package/Maths/math.vector.pure.js.map +1 -1
  102. package/Maths/pure.d.ts +1 -0
  103. package/Maths/pure.js +1 -0
  104. package/Maths/pure.js.map +1 -1
  105. package/Misc/filesInput.d.ts +15 -0
  106. package/Misc/filesInput.js +156 -74
  107. package/Misc/filesInput.js.map +1 -1
  108. package/Misc/observable.pure.js +1 -3
  109. package/Misc/observable.pure.js.map +1 -1
  110. package/Misc/tools.pure.js +1 -1
  111. package/Misc/tools.pure.js.map +1 -1
  112. package/PostProcesses/imageProcessingPostProcess.d.ts +41 -1
  113. package/PostProcesses/imageProcessingPostProcess.js +41 -1
  114. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  115. package/PostProcesses/thinImageProcessingPostProcess.d.ts +50 -0
  116. package/PostProcesses/thinImageProcessingPostProcess.js +65 -0
  117. package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
  118. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.d.ts +12 -0
  119. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js +22 -0
  120. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js.map +1 -0
  121. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.d.ts +1 -0
  122. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js +39 -0
  123. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js.map +1 -1
  124. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +2 -4
  125. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  126. package/Rendering/IBLShadows/pure.d.ts +1 -0
  127. package/Rendering/IBLShadows/pure.js +1 -0
  128. package/Rendering/IBLShadows/pure.js.map +1 -1
  129. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +11 -0
  130. package/Rendering/fluidRenderer/fluidRenderingObject.js +36 -14
  131. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  132. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +5 -0
  133. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +16 -3
  134. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
  135. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +5 -0
  136. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +12 -0
  137. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  138. package/Rendering/geometryBufferRenderer.pure.d.ts +30 -0
  139. package/Rendering/geometryBufferRenderer.pure.js +84 -0
  140. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  141. package/Rendering/iblCdfGenerator.js +10 -1
  142. package/Rendering/iblCdfGenerator.js.map +1 -1
  143. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
  144. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  145. package/Shaders/ShadersInclude/helperFunctions.js +2 -2
  146. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  147. package/Shaders/ShadersInclude/imageProcessingDeclaration.js +3 -0
  148. package/Shaders/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
  149. package/Shaders/ShadersInclude/imageProcessingFunctions.js +3 -0
  150. package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  151. package/Shaders/ShadersInclude/objectIdFunctions.d.ts +5 -0
  152. package/Shaders/ShadersInclude/objectIdFunctions.js +22 -0
  153. package/Shaders/ShadersInclude/objectIdFunctions.js.map +1 -0
  154. package/Shaders/ShadersInclude/openpbrBlockPrePass.js +3 -0
  155. package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  156. package/Shaders/ShadersInclude/openpbrDirectLighting.js +34 -4
  157. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  158. package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -2
  159. package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  160. package/Shaders/ShadersInclude/pbrBlockPrePass.js +3 -0
  161. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  162. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
  163. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  164. package/Shaders/ShadersInclude/prePassDeclaration.d.ts +1 -0
  165. package/Shaders/ShadersInclude/prePassDeclaration.js +5 -0
  166. package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
  167. package/Shaders/default.fragment.js +5 -1
  168. package/Shaders/default.fragment.js.map +1 -1
  169. package/Shaders/fluidRenderingParticleDepth.vertex.js +7 -1
  170. package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
  171. package/Shaders/fluidRenderingParticleDiffuse.vertex.js +7 -1
  172. package/Shaders/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  173. package/Shaders/fluidRenderingParticleThickness.vertex.js +7 -1
  174. package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
  175. package/Shaders/geometry.fragment.js +9 -1
  176. package/Shaders/geometry.fragment.js.map +1 -1
  177. package/Shaders/openpbr.fragment.js +2 -1
  178. package/Shaders/openpbr.fragment.js.map +1 -1
  179. package/Shaders/pbr.fragment.js +2 -1
  180. package/Shaders/pbr.fragment.js.map +1 -1
  181. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +3 -0
  182. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
  183. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +3 -0
  184. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  185. package/ShadersWGSL/ShadersInclude/objectIdFunctions.d.ts +5 -0
  186. package/ShadersWGSL/ShadersInclude/objectIdFunctions.js +22 -0
  187. package/ShadersWGSL/ShadersInclude/objectIdFunctions.js.map +1 -0
  188. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +3 -0
  189. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  190. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +35 -5
  191. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  192. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +1 -1
  193. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
  194. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +8 -2
  195. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  196. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +3 -0
  197. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  198. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
  199. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  200. package/ShadersWGSL/ShadersInclude/prePassDeclaration.d.ts +1 -0
  201. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +5 -0
  202. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
  203. package/ShadersWGSL/default.fragment.js +5 -1
  204. package/ShadersWGSL/default.fragment.js.map +1 -1
  205. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +16 -4
  206. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  207. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +15 -3
  208. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  209. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -3
  210. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  211. package/ShadersWGSL/geometry.fragment.js +9 -1
  212. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  213. package/ShadersWGSL/openpbr.fragment.js +2 -1
  214. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  215. package/ShadersWGSL/pbr.fragment.js +2 -1
  216. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  217. package/XR/features/Layers/WebXRCompositionLayer.d.ts +52 -0
  218. package/XR/features/Layers/WebXRCompositionLayer.js +80 -0
  219. package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -1
  220. package/XR/features/WebXRControllerPointerSelection.pure.js +2 -1
  221. package/XR/features/WebXRControllerPointerSelection.pure.js.map +1 -1
  222. package/XR/features/WebXRControllerTeleportation.pure.js +2 -1
  223. package/XR/features/WebXRControllerTeleportation.pure.js.map +1 -1
  224. package/XR/features/WebXRDepthSensing.pure.d.ts +21 -0
  225. package/XR/features/WebXRDepthSensing.pure.js +42 -0
  226. package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
  227. package/XR/features/WebXRHandTracking.pure.js +2 -0
  228. package/XR/features/WebXRHandTracking.pure.js.map +1 -1
  229. package/XR/features/WebXRLayers.pure.d.ts +12 -0
  230. package/XR/features/WebXRLayers.pure.js +31 -1
  231. package/XR/features/WebXRLayers.pure.js.map +1 -1
  232. package/XR/features/WebXRTrackedSources.d.ts +5 -0
  233. package/XR/features/WebXRTrackedSources.js +8 -0
  234. package/XR/features/WebXRTrackedSources.js.map +1 -0
  235. package/XR/features/WebXRTrackedSources.pure.d.ts +70 -0
  236. package/XR/features/WebXRTrackedSources.pure.js +153 -0
  237. package/XR/features/WebXRTrackedSources.pure.js.map +1 -0
  238. package/XR/features/index.d.ts +1 -0
  239. package/XR/features/index.js +1 -0
  240. package/XR/features/index.js.map +1 -1
  241. package/XR/features/pure.d.ts +1 -0
  242. package/XR/features/pure.js +1 -0
  243. package/XR/features/pure.js.map +1 -1
  244. package/XR/motionController/webXRAbstractMotionController.d.ts +53 -1
  245. package/XR/motionController/webXRAbstractMotionController.js +61 -0
  246. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  247. package/XR/webXRDefaultExperience.js +8 -4
  248. package/XR/webXRDefaultExperience.js.map +1 -1
  249. package/XR/webXRExperienceHelper.js +86 -44
  250. package/XR/webXRExperienceHelper.js.map +1 -1
  251. package/XR/webXRFeaturesManager.d.ts +9 -0
  252. package/XR/webXRFeaturesManager.js +4 -0
  253. package/XR/webXRFeaturesManager.js.map +1 -1
  254. package/XR/webXRGraphicsBinding.d.ts +29 -0
  255. package/XR/webXRGraphicsBinding.js +40 -0
  256. package/XR/webXRGraphicsBinding.js.map +1 -1
  257. package/XR/webXRInputSource.js +1 -1
  258. package/XR/webXRInputSource.js.map +1 -1
  259. package/XR/webXRLayerWrapper.d.ts +7 -5
  260. package/XR/webXRLayerWrapper.js +10 -7
  261. package/XR/webXRLayerWrapper.js.map +1 -1
  262. package/XR/webXRSessionManager.d.ts +45 -0
  263. package/XR/webXRSessionManager.js +174 -29
  264. package/XR/webXRSessionManager.js.map +1 -1
  265. package/package.json +1 -1
@@ -59,6 +59,7 @@ export class FluidRenderingObject {
59
59
  * @param shaderLanguage The shader language to use
60
60
  */
61
61
  constructor(scene, shaderLanguage) {
62
+ this._usesPerParticleSizeAttribute = false;
62
63
  /** Defines the priority of the object. Objects will be rendered in ascending order of priority */
63
64
  this.priority = 0;
64
65
  this._particleSize = 0.1;
@@ -76,27 +77,39 @@ export class FluidRenderingObject {
76
77
  this._thicknessEffectWrapper = null;
77
78
  this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */);
78
79
  }
80
+ /**
81
+ * Override to return false if this object's buffers have an incompatible "size" layout.
82
+ * @returns true if the per-particle size attribute is supported
83
+ */
84
+ _supportsPerParticleSizeAttribute() {
85
+ return true;
86
+ }
79
87
  _createEffects() {
80
- const uniformNames = ["view", "projection", "particleRadius", "size"];
81
- const attributeNames = ["position", "offset"];
82
- const defines = [];
88
+ // "size" is a uniform, or a per-particle attribute when UsePerParticleSizeAttribute is set (and supported).
89
+ const perParticleSize = FluidRenderingObject.UsePerParticleSizeAttribute && this._supportsPerParticleSizeAttribute();
90
+ this._usesPerParticleSizeAttribute = perParticleSize;
91
+ const baseAttributeNames = perParticleSize ? ["position", "offset", "size"] : ["position", "offset"];
92
+ const baseUniformNames = perParticleSize ? ["view", "projection", "particleRadius"] : ["view", "projection", "particleRadius", "size"];
93
+ const defines = perParticleSize ? ["#define FLUIDRENDERING_PER_PARTICLE_SIZE"] : [];
83
94
  this._effectsAreDirty = false;
95
+ const depthAttributeNames = baseAttributeNames.slice();
96
+ const depthDefines = defines.slice();
84
97
  if (this.useVelocity) {
85
- attributeNames.push("velocity");
86
- defines.push("#define FLUIDRENDERING_VELOCITY");
98
+ depthAttributeNames.push("velocity");
99
+ depthDefines.push("#define FLUIDRENDERING_VELOCITY");
87
100
  }
88
101
  if (this._scene.useRightHandedSystem) {
89
- defines.push("#define FLUIDRENDERING_RHS");
102
+ depthDefines.push("#define FLUIDRENDERING_RHS");
90
103
  }
91
104
  this._depthEffectWrapper = new EffectWrapper({
92
105
  engine: this._engine,
93
106
  useShaderStore: true,
94
107
  vertexShader: "fluidRenderingParticleDepth",
95
108
  fragmentShader: "fluidRenderingParticleDepth",
96
- attributeNames,
97
- uniformNames,
109
+ attributeNames: depthAttributeNames,
110
+ uniformNames: baseUniformNames.slice(),
98
111
  samplerNames: [],
99
- defines,
112
+ defines: depthDefines,
100
113
  shaderLanguage: this._shaderLanguage,
101
114
  extraInitializationsAsync: async () => {
102
115
  if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
@@ -107,15 +120,15 @@ export class FluidRenderingObject {
107
120
  }
108
121
  },
109
122
  });
110
- uniformNames.push("particleAlpha");
111
123
  this._thicknessEffectWrapper = new EffectWrapper({
112
124
  engine: this._engine,
113
125
  useShaderStore: true,
114
126
  vertexShader: "fluidRenderingParticleThickness",
115
127
  fragmentShader: "fluidRenderingParticleThickness",
116
- attributeNames: ["position", "offset"],
117
- uniformNames,
128
+ attributeNames: baseAttributeNames.slice(),
129
+ uniformNames: [...baseUniformNames, "particleAlpha"],
118
130
  samplerNames: [],
131
+ defines: defines.slice(),
119
132
  shaderLanguage: this._shaderLanguage,
120
133
  extraInitializationsAsync: async () => {
121
134
  if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
@@ -156,7 +169,9 @@ export class FluidRenderingObject {
156
169
  this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);
157
170
  depthEffect.setMatrix("view", this._scene.getViewMatrix());
158
171
  depthEffect.setMatrix("projection", this._scene.getProjectionMatrix());
159
- depthEffect.setFloat2("size", this._particleSize, this._particleSize);
172
+ if (!this._usesPerParticleSizeAttribute) {
173
+ depthEffect.setFloat2("size", this._particleSize, this._particleSize);
174
+ }
160
175
  depthEffect.setFloat("particleRadius", this._particleSize / 2);
161
176
  if (this.useInstancing) {
162
177
  this._engine.drawArraysType(7, 0, 4, numParticles);
@@ -182,7 +197,9 @@ export class FluidRenderingObject {
182
197
  thicknessEffect.setMatrix("view", this._scene.getViewMatrix());
183
198
  thicknessEffect.setMatrix("projection", this._scene.getProjectionMatrix());
184
199
  thicknessEffect.setFloat("particleAlpha", this.particleThicknessAlpha);
185
- thicknessEffect.setFloat2("size", this._particleSize, this._particleSize);
200
+ if (!this._usesPerParticleSizeAttribute) {
201
+ thicknessEffect.setFloat2("size", this._particleSize, this._particleSize);
202
+ }
186
203
  if (this.useInstancing) {
187
204
  this._engine.drawArraysType(7, 0, 4, numParticles);
188
205
  }
@@ -207,4 +224,9 @@ export class FluidRenderingObject {
207
224
  this.onParticleSizeChanged.clear();
208
225
  }
209
226
  }
227
+ /**
228
+ * Uses each particle's own "size" vertex attribute instead
229
+ * of a single uniform size for all particles (default: false, opt-in).
230
+ */
231
+ FluidRenderingObject.UsePerParticleSizeAttribute = false;
210
232
  //# sourceMappingURL=fluidRenderingObject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fluidRenderingObject.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObject.ts"],"names":[],"mappings":"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","sourcesContent":["import { type VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines the base object used for fluid rendering.\r\n * It is based on a list of vertices (particles)\r\n */\r\nexport abstract class FluidRenderingObject {\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n protected _effectsAreDirty: boolean;\r\n protected _depthEffectWrapper: Nullable<EffectWrapper>;\r\n protected _thicknessEffectWrapper: Nullable<EffectWrapper>;\r\n\r\n /** Defines the priority of the object. Objects will be rendered in ascending order of priority */\r\n public priority = 0;\r\n\r\n protected _particleSize = 0.1;\r\n\r\n /** Observable triggered when the size of the particle is changed */\r\n public onParticleSizeChanged = new Observable<FluidRenderingObject>();\r\n\r\n /** Gets or sets the size of the particle */\r\n public get particleSize() {\r\n return this._particleSize;\r\n }\r\n\r\n public set particleSize(size: number) {\r\n if (size === this._particleSize) {\r\n return;\r\n }\r\n\r\n this._particleSize = size;\r\n this.onParticleSizeChanged.notifyObservers(this);\r\n }\r\n\r\n /** Defines the alpha value of a particle */\r\n public particleThicknessAlpha = 0.05;\r\n\r\n /** Indicates if the object uses instancing or not */\r\n public get useInstancing() {\r\n return !this.indexBuffer;\r\n }\r\n\r\n private _useVelocity = false;\r\n\r\n /** Indicates if velocity of particles should be used when rendering the object. The vertex buffer set must contain a \"velocity\" buffer for this to work! */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use || !this._hasVelocity()) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._effectsAreDirty = true;\r\n }\r\n\r\n private _hasVelocity() {\r\n return !!this.vertexBuffers?.velocity;\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public abstract get vertexBuffers(): { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public getClassName(): string {\r\n return \"FluidRenderingObject\";\r\n }\r\n\r\n /** Shader language used by the object */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this object\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a fluid rendering object\r\n * @param scene The scene the object is part of\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, shaderLanguage?: ShaderLanguage) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._effectsAreDirty = true;\r\n this._depthEffectWrapper = null;\r\n this._thicknessEffectWrapper = null;\r\n this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL);\r\n }\r\n\r\n protected _createEffects(): void {\r\n const uniformNames = [\"view\", \"projection\", \"particleRadius\", \"size\"];\r\n const attributeNames = [\"position\", \"offset\"];\r\n const defines: string[] = [];\r\n\r\n this._effectsAreDirty = false;\r\n\r\n if (this.useVelocity) {\r\n attributeNames.push(\"velocity\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n this._depthEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDepth\",\r\n fragmentShader: \"fluidRenderingParticleDepth\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n defines,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleDepth.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleDepth.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleDepth.vertex\"), import(\"../../Shaders/fluidRenderingParticleDepth.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n uniformNames.push(\"particleAlpha\");\r\n\r\n this._thicknessEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleThickness\",\r\n fragmentShader: \"fluidRenderingParticleThickness\",\r\n attributeNames: [\"position\", \"offset\"],\r\n uniformNames,\r\n samplerNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleThickness.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleThickness.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleThickness.vertex\"), import(\"../../Shaders/fluidRenderingParticleThickness.fragment\")]);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public isReady(): boolean {\r\n if (this._effectsAreDirty) {\r\n this._createEffects();\r\n }\r\n\r\n if (!this._depthEffectWrapper || !this._thicknessEffectWrapper) {\r\n return false;\r\n }\r\n\r\n const depthEffect = this._depthEffectWrapper.drawWrapper.effect!;\r\n const thicknessEffect = this._thicknessEffectWrapper.drawWrapper.effect!;\r\n\r\n return depthEffect.isReady() && thicknessEffect.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles (vertices) of this object\r\n * @returns The number of particles\r\n */\r\n public abstract get numParticles(): number;\r\n\r\n /**\r\n * Render the depth texture for this object\r\n */\r\n public renderDepthTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._depthEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const depthDrawWrapper = this._depthEffectWrapper.drawWrapper;\r\n const depthEffect = depthDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(depthDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);\r\n\r\n depthEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n depthEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n depthEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n depthEffect.setFloat(\"particleRadius\", this._particleSize / 2);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Render the thickness texture for this object\r\n */\r\n public renderThicknessTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._thicknessEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const thicknessDrawWrapper = this._thicknessEffectWrapper.drawWrapper;\r\n const thicknessEffect = thicknessDrawWrapper.effect!;\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE);\r\n this._engine.setDepthWrite(false);\r\n\r\n this._engine.enableEffect(thicknessDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, thicknessEffect);\r\n\r\n thicknessEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n thicknessEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n thicknessEffect.setFloat(\"particleAlpha\", this.particleThicknessAlpha);\r\n thicknessEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public renderDiffuseTexture(): void {\r\n // do nothing by default\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public dispose(): void {\r\n this._depthEffectWrapper?.dispose(false);\r\n this._thicknessEffectWrapper?.dispose(false);\r\n this.onParticleSizeChanged.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"fluidRenderingObject.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObject.ts"],"names":[],"mappings":"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","sourcesContent":["import { type VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines the base object used for fluid rendering.\r\n * It is based on a list of vertices (particles)\r\n */\r\nexport abstract class FluidRenderingObject {\r\n /**\r\n * Uses each particle's own \"size\" vertex attribute instead\r\n * of a single uniform size for all particles (default: false, opt-in).\r\n */\r\n public static UsePerParticleSizeAttribute = false;\r\n protected _usesPerParticleSizeAttribute = false;\r\n\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n protected _effectsAreDirty: boolean;\r\n protected _depthEffectWrapper: Nullable<EffectWrapper>;\r\n protected _thicknessEffectWrapper: Nullable<EffectWrapper>;\r\n\r\n /** Defines the priority of the object. Objects will be rendered in ascending order of priority */\r\n public priority = 0;\r\n\r\n protected _particleSize = 0.1;\r\n\r\n /** Observable triggered when the size of the particle is changed */\r\n public onParticleSizeChanged = new Observable<FluidRenderingObject>();\r\n\r\n /** Gets or sets the size of the particle */\r\n public get particleSize() {\r\n return this._particleSize;\r\n }\r\n\r\n public set particleSize(size: number) {\r\n if (size === this._particleSize) {\r\n return;\r\n }\r\n\r\n this._particleSize = size;\r\n this.onParticleSizeChanged.notifyObservers(this);\r\n }\r\n\r\n /** Defines the alpha value of a particle */\r\n public particleThicknessAlpha = 0.05;\r\n\r\n /** Indicates if the object uses instancing or not */\r\n public get useInstancing() {\r\n return !this.indexBuffer;\r\n }\r\n\r\n private _useVelocity = false;\r\n\r\n /** Indicates if velocity of particles should be used when rendering the object. The vertex buffer set must contain a \"velocity\" buffer for this to work! */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use || !this._hasVelocity()) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._effectsAreDirty = true;\r\n }\r\n\r\n private _hasVelocity() {\r\n return !!this.vertexBuffers?.velocity;\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public abstract get vertexBuffers(): { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public getClassName(): string {\r\n return \"FluidRenderingObject\";\r\n }\r\n\r\n /** Shader language used by the object */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this object\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a fluid rendering object\r\n * @param scene The scene the object is part of\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, shaderLanguage?: ShaderLanguage) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._effectsAreDirty = true;\r\n this._depthEffectWrapper = null;\r\n this._thicknessEffectWrapper = null;\r\n this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL);\r\n }\r\n\r\n /**\r\n * Override to return false if this object's buffers have an incompatible \"size\" layout.\r\n * @returns true if the per-particle size attribute is supported\r\n */\r\n protected _supportsPerParticleSizeAttribute(): boolean {\r\n return true;\r\n }\r\n\r\n protected _createEffects(): void {\r\n // \"size\" is a uniform, or a per-particle attribute when UsePerParticleSizeAttribute is set (and supported).\r\n const perParticleSize = FluidRenderingObject.UsePerParticleSizeAttribute && this._supportsPerParticleSizeAttribute();\r\n this._usesPerParticleSizeAttribute = perParticleSize;\r\n\r\n const baseAttributeNames = perParticleSize ? [\"position\", \"offset\", \"size\"] : [\"position\", \"offset\"];\r\n const baseUniformNames = perParticleSize ? [\"view\", \"projection\", \"particleRadius\"] : [\"view\", \"projection\", \"particleRadius\", \"size\"];\r\n const defines: string[] = perParticleSize ? [\"#define FLUIDRENDERING_PER_PARTICLE_SIZE\"] : [];\r\n\r\n this._effectsAreDirty = false;\r\n\r\n const depthAttributeNames = baseAttributeNames.slice();\r\n const depthDefines = defines.slice();\r\n\r\n if (this.useVelocity) {\r\n depthAttributeNames.push(\"velocity\");\r\n depthDefines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n depthDefines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n this._depthEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDepth\",\r\n fragmentShader: \"fluidRenderingParticleDepth\",\r\n attributeNames: depthAttributeNames,\r\n uniformNames: baseUniformNames.slice(),\r\n samplerNames: [],\r\n defines: depthDefines,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleDepth.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleDepth.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleDepth.vertex\"), import(\"../../Shaders/fluidRenderingParticleDepth.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n this._thicknessEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleThickness\",\r\n fragmentShader: \"fluidRenderingParticleThickness\",\r\n attributeNames: baseAttributeNames.slice(),\r\n uniformNames: [...baseUniformNames, \"particleAlpha\"],\r\n samplerNames: [],\r\n defines: defines.slice(),\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleThickness.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleThickness.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleThickness.vertex\"), import(\"../../Shaders/fluidRenderingParticleThickness.fragment\")]);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public isReady(): boolean {\r\n if (this._effectsAreDirty) {\r\n this._createEffects();\r\n }\r\n\r\n if (!this._depthEffectWrapper || !this._thicknessEffectWrapper) {\r\n return false;\r\n }\r\n\r\n const depthEffect = this._depthEffectWrapper.drawWrapper.effect!;\r\n const thicknessEffect = this._thicknessEffectWrapper.drawWrapper.effect!;\r\n\r\n return depthEffect.isReady() && thicknessEffect.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles (vertices) of this object\r\n * @returns The number of particles\r\n */\r\n public abstract get numParticles(): number;\r\n\r\n /**\r\n * Render the depth texture for this object\r\n */\r\n public renderDepthTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._depthEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const depthDrawWrapper = this._depthEffectWrapper.drawWrapper;\r\n const depthEffect = depthDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(depthDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);\r\n\r\n depthEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n depthEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n if (!this._usesPerParticleSizeAttribute) {\r\n depthEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n depthEffect.setFloat(\"particleRadius\", this._particleSize / 2);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Render the thickness texture for this object\r\n */\r\n public renderThicknessTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._thicknessEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const thicknessDrawWrapper = this._thicknessEffectWrapper.drawWrapper;\r\n const thicknessEffect = thicknessDrawWrapper.effect!;\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE);\r\n this._engine.setDepthWrite(false);\r\n\r\n this._engine.enableEffect(thicknessDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, thicknessEffect);\r\n\r\n thicknessEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n thicknessEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n thicknessEffect.setFloat(\"particleAlpha\", this.particleThicknessAlpha);\r\n if (!this._usesPerParticleSizeAttribute) {\r\n thicknessEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public renderDiffuseTexture(): void {\r\n // do nothing by default\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public dispose(): void {\r\n this._depthEffectWrapper?.dispose(false);\r\n this._thicknessEffectWrapper?.dispose(false);\r\n this.onParticleSizeChanged.clear();\r\n }\r\n}\r\n"]}
@@ -38,6 +38,11 @@ export declare class FluidRenderingObjectCustomParticles extends FluidRenderingO
38
38
  addBuffers(buffers: {
39
39
  [key: string]: FloatArray;
40
40
  }): void;
41
+ /**
42
+ * Per-particle sizing needs an actual "size" buffer; custom buffers are optional.
43
+ * @returns true if a "size" buffer was supplied
44
+ */
45
+ protected _supportsPerParticleSizeAttribute(): boolean;
41
46
  protected _createEffects(): void;
42
47
  /**
43
48
  * Indicates if the object is ready to be rendered
@@ -45,6 +45,10 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
45
45
  case "velocity":
46
46
  stride = 3;
47
47
  break;
48
+ case "size":
49
+ stride = 2;
50
+ this._effectsAreDirty = true;
51
+ break;
48
52
  case "offset":
49
53
  instanced = false;
50
54
  break;
@@ -52,10 +56,18 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
52
56
  this._vertexBuffers[name] = new VertexBuffer(this._engine, buffers[name], name, true, false, stride, instanced);
53
57
  }
54
58
  }
59
+ /**
60
+ * Per-particle sizing needs an actual "size" buffer; custom buffers are optional.
61
+ * @returns true if a "size" buffer was supplied
62
+ */
63
+ _supportsPerParticleSizeAttribute() {
64
+ return !!this._vertexBuffers["size"];
65
+ }
55
66
  _createEffects() {
56
67
  super._createEffects();
57
- const uniformNames = ["view", "projection", "size"];
58
- const attributeNames = ["position", "offset", "color"];
68
+ const uniformNames = this._usesPerParticleSizeAttribute ? ["view", "projection"] : ["view", "projection", "size"];
69
+ const attributeNames = this._usesPerParticleSizeAttribute ? ["position", "offset", "color", "size"] : ["position", "offset", "color"];
70
+ const defines = this._usesPerParticleSizeAttribute ? ["#define FLUIDRENDERING_PER_PARTICLE_SIZE"] : [];
59
71
  this._diffuseEffectWrapper = new EffectWrapper({
60
72
  engine: this._engine,
61
73
  useShaderStore: true,
@@ -64,6 +76,7 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
64
76
  attributeNames,
65
77
  uniformNames,
66
78
  samplerNames: [],
79
+ defines,
67
80
  shaderLanguage: this._shaderLanguage,
68
81
  extraInitializationsAsync: async () => {
69
82
  if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
@@ -113,7 +126,7 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
113
126
  this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, diffuseEffect);
114
127
  diffuseEffect.setMatrix("view", this._scene.getViewMatrix());
115
128
  diffuseEffect.setMatrix("projection", this._scene.getProjectionMatrix());
116
- if (this._particleSize !== null) {
129
+ if (!this._usesPerParticleSizeAttribute) {
117
130
  diffuseEffect.setFloat2("size", this._particleSize, this._particleSize);
118
131
  }
119
132
  if (this.useInstancing) {
@@ -1 +1 @@
1
- {"version":3,"file":"fluidRenderingObjectCustomParticles.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAInE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D;;;GAGG;AACH,MAAM,OAAO,mCAAoC,SAAQ,oBAAoB;IAKzE;;OAEG;IACa,YAAY;QACxB,OAAO,qCAAqC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,YAAY,KAAY,EAAE,OAAsC,EAAE,YAAoB,EAAE,cAA+B;QACnH,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAE7B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QAEzB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAAsC;QACpD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,MAA0B,CAAC;YAC/B,IAAI,SAAS,GAAG,IAAI,CAAC;YAErB,QAAQ,IAAI,EAAE,CAAC;gBACX,KAAK,UAAU;oBACX,MAAM,GAAG,CAAC,CAAC;oBACX,MAAM;gBACV,KAAK,QAAQ;oBACT,SAAS,GAAG,KAAK,CAAC;oBAClB,MAAM;YACd,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACpH,CAAC;IACL,CAAC;IAEkB,cAAc;QAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEvD,IAAI,CAAC,qBAAqB,GAAG,IAAI,aAAa,CAAC;YAC3C,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,+BAA+B;YAC7C,cAAc,EAAE,+BAA+B;YAC/C,cAAc;YACd,YAAY;YACZ,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,IAAI,CAAC,eAAe,gCAAwB,EAAE,CAAC;oBAC/C,MAAM,MAAM,CAAC,0DAA0D,CAAC,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACJ,MAAM,MAAM,CAAC,sDAAsD,CAAC,CAAC;gBACzE,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACa,OAAO;QACnB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACxH,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAO,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,CAAC;IACvF,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,eAAe,CAAC,GAAW;QAC9B,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;IAC7B,CAAC;IAED;;OAEG;IACa,oBAAoB;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO;QACX,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC;QAClE,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAO,CAAC;QAEjD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAE9E,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC7D,aAAa,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAC9B,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,8BAA8B,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAC9F,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,yBAAyB,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED;;OAEG;IACa,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,IAAI,CAAC,qBAAqB,EAAE,OAAO,EAAE,CAAC;QAEtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC7B,CAAC;CACJ","sourcesContent":["import { VertexBuffer } from \"core/Buffers/buffer.pure\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type FloatArray, type Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a list of custom buffers\r\n * The list must contain at least a \"position\" buffer!\r\n */\r\nexport class FluidRenderingObjectCustomParticles extends FluidRenderingObject {\r\n private _numParticles: number;\r\n private _diffuseEffectWrapper: Nullable<EffectWrapper>;\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectCustomParticles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particles should be rendered into\r\n * @param buffers The list of buffers (must contain at least one \"position\" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.\r\n * @param numParticles Number of vertices to take into account from the buffers\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, buffers: { [key: string]: FloatArray }, numParticles: number, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._numParticles = numParticles;\r\n this._diffuseEffectWrapper = null;\r\n this._vertexBuffers = {};\r\n\r\n this.addBuffers(buffers);\r\n }\r\n\r\n /**\r\n * Add some new buffers\r\n * @param buffers List of buffers\r\n */\r\n public addBuffers(buffers: { [key: string]: FloatArray }) {\r\n for (const name in buffers) {\r\n let stride: number | undefined;\r\n let instanced = true;\r\n\r\n switch (name) {\r\n case \"velocity\":\r\n stride = 3;\r\n break;\r\n case \"offset\":\r\n instanced = false;\r\n break;\r\n }\r\n\r\n this._vertexBuffers[name] = new VertexBuffer(this._engine, buffers[name], name, true, false, stride, instanced);\r\n }\r\n }\r\n\r\n protected override _createEffects(): void {\r\n super._createEffects();\r\n\r\n const uniformNames = [\"view\", \"projection\", \"size\"];\r\n const attributeNames = [\"position\", \"offset\", \"color\"];\r\n\r\n this._diffuseEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDiffuse\",\r\n fragmentShader: \"fluidRenderingParticleDiffuse\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../../ShadersWGSL/fluidRenderingParticleDiffuse.fragment\");\r\n } else {\r\n await import(\"../../Shaders/fluidRenderingParticleDiffuse.fragment\");\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n if (!this._vertexBuffers[\"offset\"]) {\r\n this._vertexBuffers[\"offset\"] = new VertexBuffer(this._engine, [0, 0, 1, 0, 0, 1, 1, 1], \"offset\", false, false, 2);\r\n }\r\n\r\n return super.isReady() && (this._diffuseEffectWrapper?.effect!.isReady() ?? false);\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this object\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._numParticles;\r\n }\r\n\r\n /**\r\n * Sets the number of particles in this object\r\n * @param num The number of particles to take into account\r\n */\r\n public setNumParticles(num: number) {\r\n this._numParticles = num;\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._diffuseEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const diffuseDrawWrapper = this._diffuseEffectWrapper.drawWrapper;\r\n const diffuseEffect = diffuseDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(diffuseDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, diffuseEffect);\r\n\r\n diffuseEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n diffuseEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n if (this._particleSize !== null) {\r\n diffuseEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this._diffuseEffectWrapper?.dispose();\r\n\r\n for (const name in this._vertexBuffers) {\r\n this._vertexBuffers[name].dispose();\r\n }\r\n\r\n this._vertexBuffers = {};\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"fluidRenderingObjectCustomParticles.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"core/Buffers/buffer.pure\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type FloatArray, type Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a list of custom buffers\r\n * The list must contain at least a \"position\" buffer!\r\n */\r\nexport class FluidRenderingObjectCustomParticles extends FluidRenderingObject {\r\n private _numParticles: number;\r\n private _diffuseEffectWrapper: Nullable<EffectWrapper>;\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectCustomParticles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particles should be rendered into\r\n * @param buffers The list of buffers (must contain at least one \"position\" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.\r\n * @param numParticles Number of vertices to take into account from the buffers\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, buffers: { [key: string]: FloatArray }, numParticles: number, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._numParticles = numParticles;\r\n this._diffuseEffectWrapper = null;\r\n this._vertexBuffers = {};\r\n\r\n this.addBuffers(buffers);\r\n }\r\n\r\n /**\r\n * Add some new buffers\r\n * @param buffers List of buffers\r\n */\r\n public addBuffers(buffers: { [key: string]: FloatArray }) {\r\n for (const name in buffers) {\r\n let stride: number | undefined;\r\n let instanced = true;\r\n\r\n switch (name) {\r\n case \"velocity\":\r\n stride = 3;\r\n break;\r\n case \"size\":\r\n stride = 2;\r\n this._effectsAreDirty = true;\r\n break;\r\n case \"offset\":\r\n instanced = false;\r\n break;\r\n }\r\n\r\n this._vertexBuffers[name] = new VertexBuffer(this._engine, buffers[name], name, true, false, stride, instanced);\r\n }\r\n }\r\n\r\n /**\r\n * Per-particle sizing needs an actual \"size\" buffer; custom buffers are optional.\r\n * @returns true if a \"size\" buffer was supplied\r\n */\r\n protected override _supportsPerParticleSizeAttribute(): boolean {\r\n return !!this._vertexBuffers[\"size\"];\r\n }\r\n\r\n protected override _createEffects(): void {\r\n super._createEffects();\r\n\r\n const uniformNames = this._usesPerParticleSizeAttribute ? [\"view\", \"projection\"] : [\"view\", \"projection\", \"size\"];\r\n const attributeNames = this._usesPerParticleSizeAttribute ? [\"position\", \"offset\", \"color\", \"size\"] : [\"position\", \"offset\", \"color\"];\r\n const defines = this._usesPerParticleSizeAttribute ? [\"#define FLUIDRENDERING_PER_PARTICLE_SIZE\"] : [];\r\n\r\n this._diffuseEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDiffuse\",\r\n fragmentShader: \"fluidRenderingParticleDiffuse\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n defines,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../../ShadersWGSL/fluidRenderingParticleDiffuse.fragment\");\r\n } else {\r\n await import(\"../../Shaders/fluidRenderingParticleDiffuse.fragment\");\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n if (!this._vertexBuffers[\"offset\"]) {\r\n this._vertexBuffers[\"offset\"] = new VertexBuffer(this._engine, [0, 0, 1, 0, 0, 1, 1, 1], \"offset\", false, false, 2);\r\n }\r\n\r\n return super.isReady() && (this._diffuseEffectWrapper?.effect!.isReady() ?? false);\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this object\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._numParticles;\r\n }\r\n\r\n /**\r\n * Sets the number of particles in this object\r\n * @param num The number of particles to take into account\r\n */\r\n public setNumParticles(num: number) {\r\n this._numParticles = num;\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._diffuseEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const diffuseDrawWrapper = this._diffuseEffectWrapper.drawWrapper;\r\n const diffuseEffect = diffuseDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(diffuseDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, diffuseEffect);\r\n\r\n diffuseEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n diffuseEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n if (!this._usesPerParticleSizeAttribute) {\r\n diffuseEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this._diffuseEffectWrapper?.dispose();\r\n\r\n for (const name in this._vertexBuffers) {\r\n this._vertexBuffers[name].dispose();\r\n }\r\n\r\n this._vertexBuffers = {};\r\n }\r\n}\r\n"]}
@@ -45,6 +45,11 @@ export declare class FluidRenderingObjectParticleSystem extends FluidRenderingOb
45
45
  * @param shaderLanguage The shader language to use
46
46
  */
47
47
  constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage);
48
+ /**
49
+ * GPUParticleSystem's "size" buffer layout (baseSize, scaleX, scaleY) is incompatible with this feature.
50
+ * @returns true if the per-particle size attribute is supported
51
+ */
52
+ protected _supportsPerParticleSizeAttribute(): boolean;
48
53
  /**
49
54
  * Indicates if the object is ready to be rendered
50
55
  * @returns True if everything is ready for the object to be rendered, otherwise false
@@ -1,4 +1,5 @@
1
1
 
2
+ import { Logger } from "../../Misc/logger.js";
2
3
  import { FluidRenderingObject } from "./fluidRenderingObject.js";
3
4
  /**
4
5
  * Defines a rendering object based on a particle system
@@ -70,6 +71,17 @@ export class FluidRenderingObjectParticleSystem extends FluidRenderingObject {
70
71
  this.particleSize = (ps.minSize + ps.maxSize) / 2;
71
72
  this.useTrueRenderingForDiffuseTexture = false;
72
73
  }
74
+ /**
75
+ * GPUParticleSystem's "size" buffer layout (baseSize, scaleX, scaleY) is incompatible with this feature.
76
+ * @returns true if the per-particle size attribute is supported
77
+ */
78
+ _supportsPerParticleSizeAttribute() {
79
+ if (this._particleSystem.getClassName() === "GPUParticleSystem") {
80
+ Logger.Warn("UsePerParticleSizeAttribute is not supported with GPUParticleSystem; falling back to uniform size.");
81
+ return false;
82
+ }
83
+ return true;
84
+ }
73
85
  /**
74
86
  * Indicates if the object is ready to be rendered
75
87
  * @returns True if everything is ready for the object to be rendered, otherwise false
@@ -1 +1 @@
1
- {"version":3,"file":"fluidRenderingObjectParticleSystem.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import { type VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type Effect } from \"core/Materials/effect\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { type ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a particle system\r\n */\r\nexport class FluidRenderingObjectParticleSystem extends FluidRenderingObject {\r\n private _particleSystem: IParticleSystem;\r\n private _originalRender: () => number;\r\n private _blendMode: number;\r\n private _onBeforeDrawParticleObserver: Nullable<Observer<Nullable<Effect>>>;\r\n private _updateInAnimate: boolean;\r\n\r\n /** Gets the particle system */\r\n public get particleSystem() {\r\n return this._particleSystem;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectParticleSystem\";\r\n }\r\n\r\n private _useTrueRenderingForDiffuseTexture = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated based on the regular rendering of the particle system (default: true).\r\n * Sometimes, generating the diffuse texture this way may be sub-optimal. In that case, you can disable this property, in which case the particle system will be\r\n * rendered using a ALPHA_COMBINE mode instead of the one used by the particle system.\r\n */\r\n public get useTrueRenderingForDiffuseTexture() {\r\n return this._useTrueRenderingForDiffuseTexture;\r\n }\r\n\r\n public set useTrueRenderingForDiffuseTexture(use: boolean) {\r\n if (this._useTrueRenderingForDiffuseTexture === use) {\r\n return;\r\n }\r\n\r\n this._useTrueRenderingForDiffuseTexture = use;\r\n\r\n if (use) {\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n } else {\r\n this._particleSystem.blendMode = -1;\r\n this._onBeforeDrawParticleObserver = this._particleSystem.onBeforeDrawParticlesObservable.add(() => {\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._particleSystem.vertexBuffers as { [key: string]: VertexBuffer };\r\n }\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public override get indexBuffer(): Nullable<DataBuffer> {\r\n return this._particleSystem.indexBuffer;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particle system is part of\r\n * @param ps The particle system\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._particleSystem = ps;\r\n\r\n this._originalRender = ps.render.bind(ps);\r\n this._blendMode = ps.blendMode;\r\n this._onBeforeDrawParticleObserver = null;\r\n this._updateInAnimate = this._particleSystem.updateInAnimate;\r\n this._particleSystem.updateInAnimate = true;\r\n this._particleSystem.render = () => 0;\r\n\r\n this.particleSize = (ps.minSize + ps.maxSize) / 2;\r\n\r\n this.useTrueRenderingForDiffuseTexture = false;\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n return super.isReady() && this._particleSystem.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this particle system\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._particleSystem.getActiveCount();\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n this._originalRender();\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n this._particleSystem.render = this._originalRender;\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.updateInAnimate = this._updateInAnimate;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"fluidRenderingObjectParticleSystem.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import { type VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type Effect } from \"core/Materials/effect\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { type ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a particle system\r\n */\r\nexport class FluidRenderingObjectParticleSystem extends FluidRenderingObject {\r\n private _particleSystem: IParticleSystem;\r\n private _originalRender: () => number;\r\n private _blendMode: number;\r\n private _onBeforeDrawParticleObserver: Nullable<Observer<Nullable<Effect>>>;\r\n private _updateInAnimate: boolean;\r\n\r\n /** Gets the particle system */\r\n public get particleSystem() {\r\n return this._particleSystem;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectParticleSystem\";\r\n }\r\n\r\n private _useTrueRenderingForDiffuseTexture = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated based on the regular rendering of the particle system (default: true).\r\n * Sometimes, generating the diffuse texture this way may be sub-optimal. In that case, you can disable this property, in which case the particle system will be\r\n * rendered using a ALPHA_COMBINE mode instead of the one used by the particle system.\r\n */\r\n public get useTrueRenderingForDiffuseTexture() {\r\n return this._useTrueRenderingForDiffuseTexture;\r\n }\r\n\r\n public set useTrueRenderingForDiffuseTexture(use: boolean) {\r\n if (this._useTrueRenderingForDiffuseTexture === use) {\r\n return;\r\n }\r\n\r\n this._useTrueRenderingForDiffuseTexture = use;\r\n\r\n if (use) {\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n } else {\r\n this._particleSystem.blendMode = -1;\r\n this._onBeforeDrawParticleObserver = this._particleSystem.onBeforeDrawParticlesObservable.add(() => {\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._particleSystem.vertexBuffers as { [key: string]: VertexBuffer };\r\n }\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public override get indexBuffer(): Nullable<DataBuffer> {\r\n return this._particleSystem.indexBuffer;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particle system is part of\r\n * @param ps The particle system\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._particleSystem = ps;\r\n\r\n this._originalRender = ps.render.bind(ps);\r\n this._blendMode = ps.blendMode;\r\n this._onBeforeDrawParticleObserver = null;\r\n this._updateInAnimate = this._particleSystem.updateInAnimate;\r\n this._particleSystem.updateInAnimate = true;\r\n this._particleSystem.render = () => 0;\r\n\r\n this.particleSize = (ps.minSize + ps.maxSize) / 2;\r\n\r\n this.useTrueRenderingForDiffuseTexture = false;\r\n }\r\n\r\n /**\r\n * GPUParticleSystem's \"size\" buffer layout (baseSize, scaleX, scaleY) is incompatible with this feature.\r\n * @returns true if the per-particle size attribute is supported\r\n */\r\n protected override _supportsPerParticleSizeAttribute(): boolean {\r\n if (this._particleSystem.getClassName() === \"GPUParticleSystem\") {\r\n Logger.Warn(\"UsePerParticleSizeAttribute is not supported with GPUParticleSystem; falling back to uniform size.\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n return super.isReady() && this._particleSystem.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this particle system\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._particleSystem.getActiveCount();\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n this._originalRender();\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n this._particleSystem.render = this._originalRender;\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.updateInAnimate = this._updateInAnimate;\r\n }\r\n}\r\n"]}
@@ -8,6 +8,7 @@ import { type Scene } from "../scene.pure.js";
8
8
  import { type AbstractMesh } from "../Meshes/abstractMesh.pure.js";
9
9
  import { type Nullable } from "../types.js";
10
10
  import { ShaderLanguage } from "../Materials/shaderLanguage.js";
11
+ import { type GeometryRenderingObjectIdProvider } from "../Materials/materialHelper.geometryrendering.js";
11
12
  /** @internal */
12
13
  interface ISavedTransformationMatrix {
13
14
  world: Matrix;
@@ -76,6 +77,11 @@ export declare class GeometryBufferRenderer {
76
77
  * using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
77
78
  */
78
79
  static readonly IRRADIANCE_TEXTURE_TYPE = 7;
80
+ /**
81
+ * Constant used to retrieve the object ID texture index in the G-Buffer textures array.
82
+ * Object IDs are stored as 24-bit unsigned integers encoded in the RGB channels.
83
+ */
84
+ static readonly OBJECT_ID_TEXTURE_TYPE = 8;
79
85
  /**
80
86
  * Dictionary used to store the previous transformation matrices of each rendered mesh
81
87
  * in order to compute objects velocities when enableVelocity is set to "true"
@@ -99,6 +105,16 @@ export declare class GeometryBufferRenderer {
99
105
  excludedSkinnedMeshesFromVelocity: AbstractMesh[];
100
106
  /** Gets or sets a boolean indicating if transparent meshes should be rendered */
101
107
  renderTransparentMeshes: boolean;
108
+ /**
109
+ * Provides the object ID written for each rendered mesh.
110
+ *
111
+ * IDs must be integers between 0 and 0xFFFFFF. ID 0 is reserved for background or excluded meshes.
112
+ * Instances use the ID of their source mesh. The default is the mesh unique ID.
113
+ * Default IDs are only stable for the lifetime of the current scene and should not be persisted.
114
+ * The provider runs in the render hot path and may be called multiple times for the same mesh in a frame.
115
+ * @see https://playground.babylonjs.com/#REC26C#0
116
+ */
117
+ objectIdProvider?: GeometryRenderingObjectIdProvider;
102
118
  /**
103
119
  * Gets or sets a boolean indicating if normals should be generated in world space (default: false, meaning normals are generated in view space)
104
120
  */
@@ -121,6 +137,7 @@ export declare class GeometryBufferRenderer {
121
137
  private _enableReflectivity;
122
138
  private _enableScreenspaceDepth;
123
139
  private _enableIrradiance;
140
+ private _enableObjectId;
124
141
  private _depthFormat;
125
142
  private _clearColor;
126
143
  private _clearDepthColor;
@@ -132,6 +149,7 @@ export declare class GeometryBufferRenderer {
132
149
  private _normalIndex;
133
150
  private _screenspaceDepthIndex;
134
151
  private _irradianceIndex;
152
+ private _objectIdIndex;
135
153
  private _linkedWithPrePass;
136
154
  private _prePassRenderer;
137
155
  private _attachmentsFromPrePass;
@@ -256,6 +274,18 @@ export declare class GeometryBufferRenderer {
256
274
  * Sets whether or not objects irradiance are enabled for the G buffer.
257
275
  */
258
276
  set enableIrradiance(enable: boolean);
277
+ /**
278
+ * Gets whether object IDs are enabled for the G buffer.
279
+ */
280
+ get enableObjectId(): boolean;
281
+ /**
282
+ * Sets whether object IDs are enabled for the G buffer.
283
+ *
284
+ * Object ID rendering currently requires a single-sample G buffer.
285
+ * Object ID rendering is not supported when the G buffer is linked to the PrePassRenderer.
286
+ * @see https://playground.babylonjs.com/#REC26C#0
287
+ */
288
+ set enableObjectId(enable: boolean);
259
289
  /**
260
290
  * This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
261
291
  * scattering and should be taken into account when applying image-based lighting.
@@ -12,6 +12,7 @@ import { BindClipPlane, PrepareStringDefinesForClipPlanes, AddClipPlaneUniforms
12
12
  import { BindMorphTargetParameters, BindSceneUniformBuffer, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances, PrepareDefinesForIBL, PrepareUniformsAndSamplersForIBL, } from "../Materials/materialHelper.functions.js";
13
13
  import { RegisterGeometryBufferRendererSceneComponent } from "./geometryBufferRendererSceneComponent.pure.js";
14
14
  import { IsGaussianSplattingClassName } from "../Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js";
15
+ import { _GetGeometryRenderingObjectId } from "../Materials/materialHelper.geometryrendering.js";
15
16
  export const Samplers = [
16
17
  "diffuseSampler",
17
18
  "bumpSampler",
@@ -54,6 +55,7 @@ export const Uniforms = [
54
55
  "morphTargetTextureInfo",
55
56
  "morphTargetTextureIndices",
56
57
  "boneTextureInfo",
58
+ "objectId",
57
59
  ];
58
60
  /**
59
61
  * This renderer is helpful to fill one of the render target with a geometry buffer.
@@ -103,6 +105,7 @@ export class GeometryBufferRenderer {
103
105
  this._enableVelocityLinear = false;
104
106
  this._enableScreenspaceDepth = false;
105
107
  this._enableIrradiance = false;
108
+ this._enableObjectId = false;
106
109
  this._attachmentsFromPrePass = [];
107
110
  }
108
111
  /**
@@ -143,6 +146,10 @@ export class GeometryBufferRenderer {
143
146
  this._irradianceIndex = index;
144
147
  this._enableIrradiance = true;
145
148
  }
149
+ else if (geometryBufferType === GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE) {
150
+ this._objectIdIndex = index;
151
+ this._enableObjectId = true;
152
+ }
146
153
  }
147
154
  /**
148
155
  * @internal
@@ -202,6 +209,8 @@ export class GeometryBufferRenderer {
202
209
  return this._screenspaceDepthIndex;
203
210
  case GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE:
204
211
  return this._irradianceIndex;
212
+ case GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE:
213
+ return this._objectIdIndex;
205
214
  default:
206
215
  return -1;
207
216
  }
@@ -340,6 +349,43 @@ export class GeometryBufferRenderer {
340
349
  this._createRenderTargets();
341
350
  }
342
351
  }
352
+ /**
353
+ * Gets whether object IDs are enabled for the G buffer.
354
+ */
355
+ get enableObjectId() {
356
+ return this._enableObjectId;
357
+ }
358
+ /**
359
+ * Sets whether object IDs are enabled for the G buffer.
360
+ *
361
+ * Object ID rendering currently requires a single-sample G buffer.
362
+ * Object ID rendering is not supported when the G buffer is linked to the PrePassRenderer.
363
+ * @see https://playground.babylonjs.com/#REC26C#0
364
+ */
365
+ set enableObjectId(enable) {
366
+ if (enable && this._linkedWithPrePass) {
367
+ throw new Error("GeometryBufferRenderer: object ID textures are not supported when linked to the PrePassRenderer");
368
+ }
369
+ if (enable && this.samples !== 1) {
370
+ throw new Error("GeometryBufferRenderer: object ID textures currently require samples to be 1");
371
+ }
372
+ if (enable && !this._enableObjectId && !this._linkedWithPrePass) {
373
+ const engine = this._scene.getEngine();
374
+ const maxDrawBuffers = Math.min(engine.getCaps().maxDrawBuffers ?? 1, 8);
375
+ const attachmentCount = this._assignRenderTargetIndices()[0] + 1;
376
+ if (engine.getCaps().drawBuffersExtension && attachmentCount > maxDrawBuffers) {
377
+ throw new Error(`GeometryBufferRenderer: ${attachmentCount} color attachments were requested, but this engine supports at most ${maxDrawBuffers}`);
378
+ }
379
+ }
380
+ this._enableObjectId = enable;
381
+ if (!enable) {
382
+ this._objectIdIndex = -1;
383
+ }
384
+ if (!this._linkedWithPrePass) {
385
+ this.dispose();
386
+ this._createRenderTargets();
387
+ }
388
+ }
343
389
  /**
344
390
  * Gets the scene associated with the buffer.
345
391
  */
@@ -401,6 +447,7 @@ export class GeometryBufferRenderer {
401
447
  this._enableReflectivity = false;
402
448
  this._enableScreenspaceDepth = false;
403
449
  this._enableIrradiance = false;
450
+ this._enableObjectId = false;
404
451
  this._clearColor = new Color4(0, 0, 0, 0);
405
452
  this._clearDepthColor = new Color4(0, 0, 0, 1); // sets an invalid value by default - depth in the depth texture is view.z, so 0 is not possible because view.z can't be less than camera.minZ
406
453
  this._positionIndex = -1;
@@ -411,6 +458,7 @@ export class GeometryBufferRenderer {
411
458
  this._normalIndex = -1;
412
459
  this._screenspaceDepthIndex = -1;
413
460
  this._irradianceIndex = -1;
461
+ this._objectIdIndex = -1;
414
462
  this._linkedWithPrePass = false;
415
463
  /**
416
464
  * This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
@@ -764,6 +812,10 @@ export class GeometryBufferRenderer {
764
812
  }
765
813
  }
766
814
  }
815
+ if (this._enableObjectId) {
816
+ defines.push("#define OBJECT_ID");
817
+ defines.push("#define OBJECT_ID_INDEX " + this._objectIdIndex);
818
+ }
767
819
  if (this.generateNormalsInWorldSpace) {
768
820
  defines.push("#define NORMAL_WORLDSPACE");
769
821
  }
@@ -851,6 +903,9 @@ export class GeometryBufferRenderer {
851
903
  * Sets the number of samples used to render the buffer (anti aliasing).
852
904
  */
853
905
  set samples(value) {
906
+ if (this._enableObjectId && value !== 1) {
907
+ throw new Error("GeometryBufferRenderer: object ID textures currently require samples to be 1");
908
+ }
854
909
  this._multiRenderTarget.samples = value;
855
910
  }
856
911
  /**
@@ -919,11 +974,25 @@ export class GeometryBufferRenderer {
919
974
  textureNames.push("gBuffer_Irradiance");
920
975
  textureTypesAndFormats.push(this._textureTypesAndFormats[GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE]);
921
976
  }
977
+ if (this._enableObjectId) {
978
+ this._objectIdIndex = count;
979
+ count++;
980
+ textureNames.push("gBuffer_ObjectId");
981
+ textureTypesAndFormats.push({
982
+ textureType: 0,
983
+ textureFormat: 5,
984
+ samplingMode: 1,
985
+ });
986
+ }
922
987
  return [count, textureNames, textureTypesAndFormats];
923
988
  }
924
989
  _createRenderTargets() {
925
990
  const engine = this._scene.getEngine();
926
991
  const [count, textureNames, textureTypesAndFormat] = this._assignRenderTargetIndices();
992
+ const maxDrawBuffers = Math.min(engine.getCaps().maxDrawBuffers ?? 1, 8);
993
+ if (engine.getCaps().drawBuffersExtension && count > maxDrawBuffers) {
994
+ throw new Error(`GeometryBufferRenderer: ${count} color attachments were requested, but this engine supports at most ${maxDrawBuffers}`);
995
+ }
927
996
  let type = 0;
928
997
  if (engine._caps.textureFloat && engine._caps.textureFloatLinearFiltering) {
929
998
  type = 1;
@@ -1274,6 +1343,16 @@ export class GeometryBufferRenderer {
1274
1343
  effect.setMatrix("previousWorld", this._previousTransformationMatrices[effectiveMesh.uniqueId].world);
1275
1344
  effect.setMatrix("previousViewProjection", this._previousTransformationMatrices[effectiveMesh.uniqueId].viewProjection);
1276
1345
  }
1346
+ if (this._enableObjectId) {
1347
+ let objectId = renderingMesh.uniqueId;
1348
+ if (this.objectIdProvider) {
1349
+ objectId = _GetGeometryRenderingObjectId(renderingMesh, this.objectIdProvider);
1350
+ }
1351
+ else if (objectId > 0xffffff) {
1352
+ throw new Error(`Invalid geometry object ID ${objectId} for mesh "${renderingMesh.name}". Object IDs must be integers between 0 and 0xFFFFFF.`);
1353
+ }
1354
+ effect.setFloat("objectId", objectId);
1355
+ }
1277
1356
  if (hardwareInstancedRendering && renderingMesh.hasThinInstances) {
1278
1357
  effect.setMatrix("world", world);
1279
1358
  }
@@ -1394,6 +1473,11 @@ GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE = 6;
1394
1473
  * using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
1395
1474
  */
1396
1475
  GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE = 7;
1476
+ /**
1477
+ * Constant used to retrieve the object ID texture index in the G-Buffer textures array.
1478
+ * Object IDs are stored as 24-bit unsigned integers encoded in the RGB channels.
1479
+ */
1480
+ GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE = 8;
1397
1481
  /**
1398
1482
  * @internal
1399
1483
  */