@onerjs/core 8.42.7 → 8.42.9

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 (327) hide show
  1. package/Animations/animatable.core.js +1 -1
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animatorAvatar.js +2 -2
  4. package/Animations/animatorAvatar.js.map +1 -1
  5. package/Animations/runtimeAnimation.js +1 -1
  6. package/Animations/runtimeAnimation.js.map +1 -1
  7. package/Audio/audioSceneComponent.js +1 -2
  8. package/Audio/audioSceneComponent.js.map +1 -1
  9. package/AudioV2/audioUtils.d.ts +23 -0
  10. package/AudioV2/audioUtils.js +37 -0
  11. package/AudioV2/audioUtils.js.map +1 -1
  12. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +3 -3
  13. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -1
  14. package/AudioV2/webAudio/webAudioEngine.js +1 -1
  15. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  16. package/AudioV2/webAudio/webAudioStaticSound.js +3 -2
  17. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
  18. package/AudioV2/webAudio/webAudioStreamingSound.js +10 -3
  19. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  20. package/Behaviors/Meshes/followBehavior.js +1 -1
  21. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  22. package/Behaviors/Meshes/pointerDragBehavior.js +1 -1
  23. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  24. package/Bones/boneLookController.js +1 -1
  25. package/Bones/boneLookController.js.map +1 -1
  26. package/Buffers/buffer.js +1 -1
  27. package/Buffers/buffer.js.map +1 -1
  28. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
  29. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  30. package/Cameras/camera.js +2 -2
  31. package/Cameras/camera.js.map +1 -1
  32. package/Engines/AbstractEngine/abstractEngine.renderPass.js +1 -0
  33. package/Engines/AbstractEngine/abstractEngine.renderPass.js.map +1 -1
  34. package/Engines/Extensions/engine.query.js +1 -1
  35. package/Engines/Extensions/engine.query.js.map +1 -1
  36. package/Engines/Processors/shaderProcessor.js +2 -3
  37. package/Engines/Processors/shaderProcessor.js.map +1 -1
  38. package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
  39. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  40. package/Engines/WebGPU/Extensions/engine.debugging.d.ts +87 -0
  41. package/Engines/WebGPU/Extensions/engine.debugging.js +123 -31
  42. package/Engines/WebGPU/Extensions/engine.debugging.js.map +1 -1
  43. package/Engines/WebGPU/webgpuBufferManager.js +1 -1
  44. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  45. package/Engines/WebGPU/webgpuShaderProcessor.js +1 -1
  46. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  47. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +1 -1
  48. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  49. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +1 -1
  50. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  51. package/Engines/WebGPU/webgpuTextureManager.js +20 -6
  52. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  53. package/Engines/abstractEngine.js +2 -2
  54. package/Engines/abstractEngine.js.map +1 -1
  55. package/Engines/engine.common.js +2 -2
  56. package/Engines/engine.common.js.map +1 -1
  57. package/Engines/engine.js +0 -1
  58. package/Engines/engine.js.map +1 -1
  59. package/Engines/thinEngine.functions.js +1 -1
  60. package/Engines/thinEngine.functions.js.map +1 -1
  61. package/Engines/thinEngine.js +4 -5
  62. package/Engines/thinEngine.js.map +1 -1
  63. package/Engines/thinNativeEngine.js +2 -5
  64. package/Engines/thinNativeEngine.js.map +1 -1
  65. package/Engines/thinWebGPUEngine.d.ts +6 -4
  66. package/Engines/thinWebGPUEngine.js +49 -25
  67. package/Engines/thinWebGPUEngine.js.map +1 -1
  68. package/Engines/webgpuEngine.d.ts +2 -1
  69. package/Engines/webgpuEngine.js +18 -16
  70. package/Engines/webgpuEngine.js.map +1 -1
  71. package/FlowGraph/flowGraph.d.ts +1 -0
  72. package/FlowGraph/flowGraph.js.map +1 -1
  73. package/FlowGraph/flowGraphBlock.d.ts +1 -0
  74. package/FlowGraph/flowGraphBlock.js.map +1 -1
  75. package/FlowGraph/flowGraphContext.d.ts +1 -0
  76. package/FlowGraph/flowGraphContext.js.map +1 -1
  77. package/FlowGraph/flowGraphCoordinator.d.ts +1 -0
  78. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  79. package/FrameGraph/Node/nodeRenderGraph.d.ts +12 -1
  80. package/FrameGraph/Node/nodeRenderGraph.js +36 -2
  81. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  82. package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -1
  83. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  84. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +3 -0
  85. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -1
  86. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +3 -0
  87. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
  88. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +3 -1
  89. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +14 -0
  90. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
  91. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +2 -2
  92. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +20 -14
  93. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  94. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +3 -2
  95. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +38 -14
  96. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  97. package/Layers/glowLayer.js +1 -1
  98. package/Layers/glowLayer.js.map +1 -1
  99. package/Layers/highlightLayer.js +1 -1
  100. package/Layers/highlightLayer.js.map +1 -1
  101. package/Layers/selectionOutlineLayer.js +8 -0
  102. package/Layers/selectionOutlineLayer.js.map +1 -1
  103. package/Layers/thinSelectionOutlineLayer.js +15 -0
  104. package/Layers/thinSelectionOutlineLayer.js.map +1 -1
  105. package/Lights/Shadows/cascadedShadowGenerator.js +0 -1
  106. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  107. package/Lights/Shadows/shadowGenerator.d.ts +28 -1
  108. package/Lights/Shadows/shadowGenerator.js +77 -11
  109. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  110. package/Lights/lightingVolume.d.ts +1 -0
  111. package/Lights/lightingVolume.js +10 -2
  112. package/Lights/lightingVolume.js.map +1 -1
  113. package/Loading/sceneLoader.js +1 -1
  114. package/Loading/sceneLoader.js.map +1 -1
  115. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -1
  116. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  117. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -1
  118. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  119. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -2
  120. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  121. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  122. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  123. package/Materials/Node/Blocks/curveBlock.js +2 -3
  124. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  125. package/Materials/Node/nodeMaterial.js +1 -2
  126. package/Materials/Node/nodeMaterial.js.map +1 -1
  127. package/Materials/PBR/openpbrMaterial.js +3 -5
  128. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  129. package/Materials/PBR/pbrBaseMaterial.js +2 -3
  130. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  131. package/Materials/Textures/Procedurals/proceduralTexture.js +0 -1
  132. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  133. package/Materials/Textures/cubeTexture.js +1 -1
  134. package/Materials/Textures/cubeTexture.js.map +1 -1
  135. package/Materials/Textures/htmlElementTexture.js +2 -2
  136. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  137. package/Materials/Textures/multiRenderTarget.js +1 -1
  138. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  139. package/Materials/Textures/renderTargetTexture.js +13 -2
  140. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  141. package/Materials/effect.js +2 -1
  142. package/Materials/effect.js.map +1 -1
  143. package/Materials/materialHelper.functions.js +1 -1
  144. package/Materials/materialHelper.functions.js.map +1 -1
  145. package/Materials/multiMaterial.js +1 -1
  146. package/Materials/multiMaterial.js.map +1 -1
  147. package/Materials/standardMaterial.js +1 -2
  148. package/Materials/standardMaterial.js.map +1 -1
  149. package/Maths/math.geospatial.d.ts +17 -2
  150. package/Maths/math.geospatial.functions.d.ts +16 -2
  151. package/Maths/math.geospatial.functions.js +37 -4
  152. package/Maths/math.geospatial.functions.js.map +1 -1
  153. package/Maths/math.geospatial.js.map +1 -1
  154. package/Maths/math.path.js +1 -1
  155. package/Maths/math.path.js.map +1 -1
  156. package/Maths/math.scalar.functions.js +3 -3
  157. package/Maths/math.scalar.functions.js.map +1 -1
  158. package/Maths/math.vector.js +1 -1
  159. package/Maths/math.vector.js.map +1 -1
  160. package/Meshes/Builders/boxBuilder.js +1 -2
  161. package/Meshes/Builders/boxBuilder.js.map +1 -1
  162. package/Meshes/Builders/cylinderBuilder.js +2 -2
  163. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  164. package/Meshes/Builders/decalBuilder.js +1 -2
  165. package/Meshes/Builders/decalBuilder.js.map +1 -1
  166. package/Meshes/Builders/latheBuilder.js +2 -2
  167. package/Meshes/Builders/latheBuilder.js.map +1 -1
  168. package/Meshes/Builders/linesBuilder.js +11 -15
  169. package/Meshes/Builders/linesBuilder.js.map +1 -1
  170. package/Meshes/Builders/polygonBuilder.js +6 -6
  171. package/Meshes/Builders/polygonBuilder.js.map +1 -1
  172. package/Meshes/Builders/polyhedronBuilder.js +2 -2
  173. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  174. package/Meshes/Builders/ribbonBuilder.js +6 -6
  175. package/Meshes/Builders/ribbonBuilder.js.map +1 -1
  176. package/Meshes/Builders/shapeBuilder.js +2 -3
  177. package/Meshes/Builders/shapeBuilder.js.map +1 -1
  178. package/Meshes/Builders/tiledBoxBuilder.js +1 -1
  179. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  180. package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
  181. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  182. package/Meshes/GreasedLine/greasedLineMesh.js +1 -2
  183. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  184. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +1 -1
  185. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  186. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +1 -1
  187. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  188. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +1 -1
  189. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  190. package/Meshes/Node/Blocks/extrudeGeometryBlock.d.ts +61 -0
  191. package/Meshes/Node/Blocks/extrudeGeometryBlock.js +297 -0
  192. package/Meshes/Node/Blocks/extrudeGeometryBlock.js.map +1 -0
  193. package/Meshes/Node/Blocks/mappingBlock.js +1 -1
  194. package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
  195. package/Meshes/Node/index.d.ts +1 -0
  196. package/Meshes/Node/index.js +1 -0
  197. package/Meshes/Node/index.js.map +1 -1
  198. package/Meshes/abstractMesh.d.ts +4 -0
  199. package/Meshes/abstractMesh.js +14 -10
  200. package/Meshes/abstractMesh.js.map +1 -1
  201. package/Meshes/csg.js +1 -1
  202. package/Meshes/csg.js.map +1 -1
  203. package/Meshes/csg2.js +1 -1
  204. package/Meshes/csg2.js.map +1 -1
  205. package/Meshes/geodesicMesh.js +11 -13
  206. package/Meshes/geodesicMesh.js.map +1 -1
  207. package/Meshes/geometry.js +2 -2
  208. package/Meshes/geometry.js.map +1 -1
  209. package/Meshes/groundMesh.js +7 -7
  210. package/Meshes/groundMesh.js.map +1 -1
  211. package/Meshes/mesh.d.ts +2 -0
  212. package/Meshes/mesh.js +21 -7
  213. package/Meshes/mesh.js.map +1 -1
  214. package/Meshes/mesh.vertexData.js +22 -22
  215. package/Meshes/mesh.vertexData.js.map +1 -1
  216. package/Meshes/meshSimplification.js +1 -1
  217. package/Meshes/meshSimplification.js.map +1 -1
  218. package/Meshes/polygonMesh.js +1 -1
  219. package/Meshes/polygonMesh.js.map +1 -1
  220. package/Meshes/trailMesh.js +1 -1
  221. package/Meshes/trailMesh.js.map +1 -1
  222. package/Misc/HighDynamicRange/hdr.js +4 -6
  223. package/Misc/HighDynamicRange/hdr.js.map +1 -1
  224. package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
  225. package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
  226. package/Misc/basisWorker.js +1 -1
  227. package/Misc/basisWorker.js.map +1 -1
  228. package/Misc/environmentTextureTools.js +1 -1
  229. package/Misc/environmentTextureTools.js.map +1 -1
  230. package/Misc/meshExploder.js +1 -2
  231. package/Misc/meshExploder.js.map +1 -1
  232. package/Misc/tga.js +2 -2
  233. package/Misc/tga.js.map +1 -1
  234. package/Misc/timer.js +4 -2
  235. package/Misc/timer.js.map +1 -1
  236. package/Misc/tools.d.ts +7 -0
  237. package/Misc/tools.js +25 -7
  238. package/Misc/tools.js.map +1 -1
  239. package/Misc/webRequest.d.ts +34 -3
  240. package/Misc/webRequest.js +107 -24
  241. package/Misc/webRequest.js.map +1 -1
  242. package/Morph/morphTargetManager.js +1 -1
  243. package/Morph/morphTargetManager.js.map +1 -1
  244. package/Particles/Node/Blocks/Update/updateNoiseBlock.js +1 -1
  245. package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
  246. package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +11 -1
  247. package/Particles/Node/Blocks/particleSourceTextureBlock.js +25 -11
  248. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  249. package/Particles/Node/nodeParticleSystemSet.helper.js +3 -3
  250. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  251. package/Particles/Node/nodeParticleSystemSet.js +1 -1
  252. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  253. package/Particles/computeShaderParticleSystem.js +2 -0
  254. package/Particles/computeShaderParticleSystem.js.map +1 -1
  255. package/Particles/gpuParticleSystem.d.ts +14 -0
  256. package/Particles/gpuParticleSystem.js +94 -12
  257. package/Particles/gpuParticleSystem.js.map +1 -1
  258. package/Particles/particleSystem.js +4 -1
  259. package/Particles/particleSystem.js.map +1 -1
  260. package/Particles/pointsCloudSystem.js +46 -47
  261. package/Particles/pointsCloudSystem.js.map +1 -1
  262. package/Particles/solidParticleSystem.js +5 -6
  263. package/Particles/solidParticleSystem.js.map +1 -1
  264. package/Particles/thinParticleSystem.js +3 -4
  265. package/Particles/thinParticleSystem.js.map +1 -1
  266. package/Particles/webgl2ParticleSystem.js +2 -1
  267. package/Particles/webgl2ParticleSystem.js.map +1 -1
  268. package/Physics/v1/Plugins/ammoJSPlugin.js +0 -8
  269. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  270. package/Physics/v2/characterController.js +4 -8
  271. package/Physics/v2/characterController.js.map +1 -1
  272. package/Physics/v2/ragdoll.js +1 -2
  273. package/Physics/v2/ragdoll.js.map +1 -1
  274. package/PostProcesses/postProcess.js +3 -3
  275. package/PostProcesses/postProcess.js.map +1 -1
  276. package/PostProcesses/thinDepthOfFieldEffect.js +2 -2
  277. package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
  278. package/Probes/reflectionProbe.js +0 -1
  279. package/Probes/reflectionProbe.js.map +1 -1
  280. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +0 -5
  281. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  282. package/Rendering/depthRenderer.js +0 -11
  283. package/Rendering/depthRenderer.js.map +1 -1
  284. package/Rendering/depthRendererSceneComponent.js +1 -1
  285. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  286. package/Rendering/geometryBufferRenderer.js +0 -1
  287. package/Rendering/geometryBufferRenderer.js.map +1 -1
  288. package/Rendering/objectRenderer.js +7 -5
  289. package/Rendering/objectRenderer.js.map +1 -1
  290. package/Rendering/thinDepthPeelingRenderer.js +1 -1
  291. package/Rendering/thinDepthPeelingRenderer.js.map +1 -1
  292. package/Rendering/utilityLayerRenderer.js +1 -1
  293. package/Rendering/utilityLayerRenderer.js.map +1 -1
  294. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +18 -8
  295. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  296. package/Shaders/gpuRenderParticles.vertex.js +4 -0
  297. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  298. package/Shaders/gpuUpdateParticles.vertex.js +15 -3
  299. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  300. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js +18 -7
  301. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  302. package/ShadersWGSL/gpuUpdateParticles.compute.js +16 -1
  303. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  304. package/ShadersWGSL/lightingVolume.compute.js +1 -1
  305. package/ShadersWGSL/lightingVolume.compute.js.map +1 -1
  306. package/Sprites/spriteManager.js +4 -4
  307. package/Sprites/spriteManager.js.map +1 -1
  308. package/XR/features/WebXRAnchorSystem.js +2 -2
  309. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  310. package/XR/features/WebXRHandTracking.js +1 -1
  311. package/XR/features/WebXRHandTracking.js.map +1 -1
  312. package/XR/features/WebXRNearInteraction.js +1 -1
  313. package/XR/features/WebXRNearInteraction.js.map +1 -1
  314. package/XR/motionController/webXRMicrosoftMixedRealityController.js +1 -1
  315. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  316. package/XR/motionController/webXROculusTouchMotionController.js +1 -1
  317. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  318. package/XR/webXRFeaturesManager.js +1 -1
  319. package/XR/webXRFeaturesManager.js.map +1 -1
  320. package/assetContainer.js +1 -1
  321. package/assetContainer.js.map +1 -1
  322. package/package.json +1 -1
  323. package/scene.d.ts +16 -0
  324. package/scene.js +28 -0
  325. package/scene.js.map +1 -1
  326. package/sceneComponent.js +1 -1
  327. package/sceneComponent.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"utilityLayerRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/utilityLayerRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable } from \"../scene\";\r\nimport { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { PointerInfoPre } from \"../Events/pointerEvents\";\r\nimport { PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Renders a layer on top of an existing scene\r\n */\r\nexport class UtilityLayerRenderer implements IDisposable {\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _lastPointerEvents: { [pointerId: number]: boolean } = {};\r\n /** @internal */\r\n public static _DefaultUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n /** @internal */\r\n public static _DefaultKeepDepthUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n private _sharedGizmoLight: Nullable<HemisphericLight> = null;\r\n\r\n private _renderCamera: Nullable<Camera> = null;\r\n\r\n /**\r\n * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera)\r\n * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned\r\n * @returns the camera that is used when rendering the utility layer\r\n */\r\n public getRenderCamera(getRigParentIfPossible?: boolean) {\r\n if (this._renderCamera) {\r\n return this._renderCamera;\r\n } else {\r\n let activeCam: Camera;\r\n if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) {\r\n activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1];\r\n } else {\r\n activeCam = this.originalScene.activeCamera!;\r\n }\r\n\r\n if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) {\r\n return activeCam.rigParent!;\r\n }\r\n return activeCam;\r\n }\r\n }\r\n /**\r\n * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used)\r\n * @param cam the camera that should be used when rendering the utility layer\r\n */\r\n public setRenderCamera(cam: Nullable<Camera>) {\r\n this._renderCamera = cam;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Light which used by gizmos to get light shading\r\n */\r\n public _getSharedGizmoLight(): HemisphericLight {\r\n if (!this._sharedGizmoLight) {\r\n this._sharedGizmoLight = new HemisphericLight(\"shared gizmo light\", new Vector3(0, 1, 0), this.utilityLayerScene);\r\n this._sharedGizmoLight.intensity = 2;\r\n this._sharedGizmoLight.groundColor = Color3.Gray();\r\n }\r\n return this._sharedGizmoLight;\r\n }\r\n\r\n /**\r\n * If the picking should be done on the utility layer prior to the actual scene (Default: true)\r\n */\r\n public pickUtilitySceneFirst = true;\r\n /**\r\n * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it)\r\n */\r\n public static get DefaultUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer\r\n * @param scene associated scene\r\n * @internal\r\n */\r\n public static _CreateDefaultUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n /**\r\n * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it)\r\n */\r\n public static get DefaultKeepDepthUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultKeepUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer (Depth map of the previous scene is not cleared before drawing on top of it)\r\n * @param scene associated scene\r\n * @internal\r\n */\r\n public static _CreateDefaultKeepUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * The scene that is rendered on top of the original scene\r\n */\r\n public utilityLayerScene: Scene;\r\n\r\n /**\r\n * If the utility layer should automatically be rendered on top of existing scene\r\n */\r\n public shouldRender: boolean = true;\r\n /**\r\n * If set to true, only pointer down onPointerObservable events will be blocked when picking is occluded by original scene\r\n */\r\n public onlyCheckPointerDownEvents = true;\r\n\r\n /**\r\n * If set to false, only pointerUp, pointerDown and pointerMove will be sent to the utilityLayerScene (false by default)\r\n */\r\n public processAllEvents = false;\r\n\r\n /**\r\n * Set to false to disable picking\r\n */\r\n public pickingEnabled = true;\r\n\r\n /**\r\n * Observable raised when the pointer moves from the utility layer scene to the main scene\r\n */\r\n public onPointerOutObservable = new Observable<number>();\r\n\r\n /** Gets or sets a predicate that will be used to indicate utility meshes present in the main scene */\r\n public mainSceneTrackerPredicate: (mesh: Nullable<AbstractMesh>) => boolean;\r\n\r\n private _afterRenderObserver: Nullable<Observer<Camera>>;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _originalPointerObserver: Nullable<Observer<PointerInfoPre>>;\r\n /**\r\n * Instantiates a UtilityLayerRenderer\r\n * @param originalScene the original scene that will be rendered on top of\r\n * @param handleEvents boolean indicating if the utility layer should handle events\r\n * @param manualRender boolean indicating if the utility layer should render manually.\r\n */\r\n constructor(\r\n /** the original scene that will be rendered on top of */\r\n public originalScene: Scene,\r\n public readonly handleEvents: boolean = true,\r\n manualRender = false\r\n ) {\r\n // Create scene which will be rendered in the foreground and remove it from being referenced by engine to avoid interfering with existing app\r\n this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true, useFloatingOrigin: originalScene.floatingOriginMode });\r\n this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem;\r\n this.utilityLayerScene._allowPostProcessClearColor = false;\r\n\r\n // Deactivate post processes\r\n this.utilityLayerScene.postProcessesEnabled = false;\r\n\r\n // Detach controls on utility scene, events will be fired by logic below to handle picking priority\r\n this.utilityLayerScene.detachControl();\r\n\r\n if (handleEvents) {\r\n this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => {\r\n if (!this.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n if (!this.pickingEnabled) {\r\n return;\r\n }\r\n\r\n if (!this.processAllEvents) {\r\n if (\r\n prePointerInfo.type !== PointerEventTypes.POINTERMOVE &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERUP &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOWN &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP\r\n ) {\r\n return;\r\n }\r\n }\r\n this.utilityLayerScene.pointerX = originalScene.pointerX;\r\n this.utilityLayerScene.pointerY = originalScene.pointerY;\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n if (originalScene.isPointerCaptured(pointerEvent.pointerId)) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n return;\r\n }\r\n\r\n const getNearPickDataForScene = (scene: Scene) => {\r\n let scenePick = null;\r\n\r\n if (prePointerInfo.nearInteractionPickingInfo) {\r\n if (prePointerInfo.nearInteractionPickingInfo.pickedMesh!.getScene() == scene) {\r\n scenePick = prePointerInfo.nearInteractionPickingInfo;\r\n } else {\r\n scenePick = new PickingInfo();\r\n }\r\n } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) {\r\n scenePick = prePointerInfo.originalPickingInfo;\r\n } else {\r\n let previousActiveCamera: Nullable<Camera> = null;\r\n // If a camera is set for rendering with this layer\r\n // it will also be used for the ray computation\r\n // To preserve back compat and because scene.pick always use activeCamera\r\n // it's substituted temporarily and a new scenePick is forced.\r\n // otherwise, the ray with previously active camera is always used.\r\n // It's set back to previous activeCamera after operation.\r\n if (this._renderCamera) {\r\n previousActiveCamera = scene._activeCamera;\r\n scene._activeCamera = this._renderCamera;\r\n prePointerInfo.ray = null;\r\n }\r\n scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY);\r\n if (previousActiveCamera) {\r\n scene._activeCamera = previousActiveCamera;\r\n }\r\n }\r\n\r\n return scenePick;\r\n };\r\n\r\n const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene);\r\n\r\n if (!prePointerInfo.ray && utilityScenePick) {\r\n prePointerInfo.ray = utilityScenePick.ray;\r\n }\r\n\r\n if (prePointerInfo.originalPickingInfo?.aimTransform && utilityScenePick) {\r\n utilityScenePick.aimTransform = prePointerInfo.originalPickingInfo.aimTransform;\r\n utilityScenePick.gripTransform = prePointerInfo.originalPickingInfo.gripTransform;\r\n }\r\n\r\n // always fire the prepointer observable\r\n this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo);\r\n\r\n // allow every non pointer down event to flow to the utility layer\r\n if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n return;\r\n }\r\n\r\n if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) {\r\n // If this layer is an overlay, check if this layer was hit and if so, skip pointer events for the main scene\r\n if (utilityScenePick && utilityScenePick.hit) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n prePointerInfo.skipOnPointerObservable = true;\r\n }\r\n } else {\r\n const originalScenePick = getNearPickDataForScene(originalScene);\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n\r\n // If the layer can be occluded by the original scene, only fire pointer events to the first layer that hit they ray\r\n if (originalScenePick && utilityScenePick) {\r\n // No pick in utility scene\r\n if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) {\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n // We touched an utility mesh present in the main scene\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n this._pointerCaptures[pointerEvent.pointerId] = true;\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) {\r\n // We pick something in utility scene or the pick in utility is closer than the one in main scene\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n // If a previous utility layer set this, do not unset this\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0;\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance >= originalScenePick.distance) {\r\n // We have a pick in both scenes but main is closer than utility\r\n\r\n // We touched an utility mesh present in the main scene\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else {\r\n if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n }\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n }\r\n }\r\n\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n // As a newly added utility layer will be rendered over the screen last, it's pointer events should be processed first\r\n if (this._originalPointerObserver) {\r\n originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver);\r\n }\r\n }\r\n\r\n // Render directly on top of existing scene without clearing\r\n this.utilityLayerScene.autoClear = false;\r\n\r\n if (!manualRender) {\r\n this._afterRenderObserver = this.originalScene.onAfterRenderCameraObservable.add((camera) => {\r\n // Only render when the render camera finishes rendering\r\n if (this.shouldRender && camera == this.getRenderCamera()) {\r\n this.render();\r\n }\r\n });\r\n }\r\n\r\n this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n this._updateCamera();\r\n }\r\n\r\n private _notifyObservers(prePointerInfo: PointerInfoPre, pickInfo: PickingInfo, pointerEvent: IPointerEvent) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type);\r\n this._lastPointerEvents[pointerEvent.pointerId] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Renders the utility layers scene on top of the original scene\r\n */\r\n public render() {\r\n this._updateCamera();\r\n if (this.utilityLayerScene.activeCamera) {\r\n // Set the camera's scene to utility layers scene\r\n const oldScene = this.utilityLayerScene.activeCamera.getScene();\r\n const camera = this.utilityLayerScene.activeCamera;\r\n camera._scene = this.utilityLayerScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = this.utilityLayerScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = this.utilityLayerScene;\r\n }\r\n\r\n this.utilityLayerScene.render(false);\r\n\r\n // Reset camera's scene back to original\r\n camera._scene = oldScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = oldScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = oldScene;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the renderer\r\n */\r\n public dispose() {\r\n this.onPointerOutObservable.clear();\r\n\r\n if (this._afterRenderObserver) {\r\n this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver);\r\n }\r\n if (this._sceneDisposeObserver) {\r\n this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n }\r\n if (this._originalPointerObserver) {\r\n this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver);\r\n }\r\n this.utilityLayerScene.dispose();\r\n }\r\n\r\n private _updateCamera() {\r\n this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera();\r\n this.utilityLayerScene.activeCamera = this.getRenderCamera();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"utilityLayerRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/utilityLayerRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAW7B;;;;OAIG;IACI,eAAe,CAAC,sBAAgC;QACnD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,aAAa,CAAC;QAC9B,CAAC;aAAM,CAAC;YACJ,IAAI,SAAiB,CAAC;YACtB,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClF,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9F,CAAC;iBAAM,CAAC;gBACJ,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,YAAa,CAAC;YACjD,CAAC;YAED,IAAI,sBAAsB,IAAI,SAAS,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC/D,OAAO,SAAS,CAAC,SAAU,CAAC;YAChC,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IACD;;;OAGG;IACI,eAAe,CAAC,GAAqB;QACxC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACI,oBAAoB;QACvB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,oBAAoB,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAClH,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,iBAAiB,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAMD;;OAEG;IACI,MAAM,KAAK,mBAAmB;QACjC,IAAI,oBAAoB,CAAC,oBAAoB,IAAI,IAAI,EAAE,CAAC;YACpD,OAAO,oBAAoB,CAAC,mCAAmC,CAAC,WAAW,CAAC,gBAAiB,CAAC,CAAC;QACnG,CAAC;QAED,OAAO,oBAAoB,CAAC,oBAAoB,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,mCAAmC,CAAC,KAAY;QAC1D,oBAAoB,CAAC,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5E,oBAAoB,CAAC,oBAAoB,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE;YACrF,oBAAoB,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,OAAO,oBAAoB,CAAC,oBAAoB,CAAC;IACrD,CAAC;IACD;;OAEG;IACI,MAAM,KAAK,4BAA4B;QAC1C,IAAI,oBAAoB,CAAC,6BAA6B,IAAI,IAAI,EAAE,CAAC;YAC7D,OAAO,oBAAoB,CAAC,uCAAuC,CAAC,WAAW,CAAC,gBAAiB,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,oBAAoB,CAAC,6BAA6B,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,uCAAuC,CAAC,KAAY;QAC9D,oBAAoB,CAAC,6BAA6B,GAAG,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrF,oBAAoB,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,wBAAwB,GAAG,KAAK,CAAC;QACtG,oBAAoB,CAAC,6BAA6B,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9F,oBAAoB,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,OAAO,oBAAoB,CAAC,6BAA6B,CAAC;IAC9D,CAAC;IAqCD;;;;;OAKG;IACH;IACI,yDAAyD;IAClD,aAAoB,EACX,eAAwB,IAAI,EAC5C,YAAY,GAAG,KAAK;QAFb,kBAAa,GAAb,aAAa,CAAO;QACX,iBAAY,GAAZ,YAAY,CAAgB;QAtJxC,qBAAgB,GAAqC,EAAE,CAAC;QACxD,uBAAkB,GAAqC,EAAE,CAAC;QAK1D,sBAAiB,GAA+B,IAAI,CAAC;QAErD,kBAAa,GAAqB,IAAI,CAAC;QA6C/C;;WAEG;QACI,0BAAqB,GAAG,IAAI,CAAC;QAuDpC;;WAEG;QACI,iBAAY,GAAY,IAAI,CAAC;QACpC;;WAEG;QACI,+BAA0B,GAAG,IAAI,CAAC;QAEzC;;WAEG;QACI,qBAAgB,GAAG,KAAK,CAAC;QAEhC;;WAEG;QACI,mBAAc,GAAG,IAAI,CAAC;QAE7B;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAU,CAAC;QAoBrD,6IAA6I;QAC7I,IAAI,CAAC,iBAAiB,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,aAAa,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACtI,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,GAAG,aAAa,CAAC,oBAAoB,CAAC;QACjF,IAAI,CAAC,iBAAiB,CAAC,2BAA2B,GAAG,KAAK,CAAC;QAE3D,4BAA4B;QAC5B,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAEpD,mGAAmG;QACnG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;QAEvC,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,wBAAwB,GAAG,aAAa,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE;gBACxF,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;oBACvC,OAAO;gBACX,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO;gBACX,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACzB,IACI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,WAAW;wBACrD,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,SAAS;wBACnD,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,WAAW;wBACrD,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,gBAAgB,EAC5D,CAAC;wBACC,OAAO;oBACX,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;gBACzD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;gBACzD,MAAM,YAAY,GAAkB,cAAc,CAAC,KAAK,CAAC;gBACzD,IAAI,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;oBACtD,OAAO;gBACX,CAAC;gBAED,MAAM,uBAAuB,GAAG,CAAC,KAAY,EAAE,EAAE;oBAC7C,IAAI,SAAgC,CAAC;oBAErC,IAAI,cAAc,CAAC,0BAA0B,EAAE,CAAC;wBAC5C,IAAI,cAAc,CAAC,0BAA0B,CAAC,UAAW,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;4BAC5E,SAAS,GAAG,cAAc,CAAC,0BAA0B,CAAC;wBAC1D,CAAC;6BAAM,CAAC;4BACJ,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC;wBAClC,CAAC;oBACL,CAAC;yBAAM,IAAI,KAAK,KAAK,IAAI,CAAC,iBAAiB,IAAI,cAAc,CAAC,mBAAmB,EAAE,CAAC;wBAChF,SAAS,GAAG,cAAc,CAAC,mBAAmB,CAAC;oBACnD,CAAC;yBAAM,CAAC;wBACJ,IAAI,oBAAoB,GAAqB,IAAI,CAAC;wBAClD,mDAAmD;wBACnD,+CAA+C;wBAC/C,yEAAyE;wBACzE,8DAA8D;wBAC9D,mEAAmE;wBACnE,0DAA0D;wBAC1D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;4BACrB,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAAC;4BAC3C,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;4BACzC,cAAc,CAAC,GAAG,GAAG,IAAI,CAAC;wBAC9B,CAAC;wBACD,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;wBACpI,IAAI,oBAAoB,EAAE,CAAC;4BACvB,KAAK,CAAC,aAAa,GAAG,oBAAoB,CAAC;wBAC/C,CAAC;oBACL,CAAC;oBAED,OAAO,SAAS,CAAC;gBACrB,CAAC,CAAC;gBAEF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAEzE,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;oBAC1C,cAAc,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC;gBAC9C,CAAC;gBAED,IAAI,cAAc,CAAC,mBAAmB,EAAE,YAAY,IAAI,gBAAgB,EAAE,CAAC;oBACvE,gBAAgB,CAAC,YAAY,GAAG,cAAc,CAAC,mBAAmB,CAAC,YAAY,CAAC;oBAChF,gBAAgB,CAAC,aAAa,GAAG,cAAc,CAAC,mBAAmB,CAAC,aAAa,CAAC;gBACtF,CAAC;gBAED,wCAAwC;gBACxC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBAE9E,kEAAkE;gBAClE,IAAI,IAAI,CAAC,0BAA0B,IAAI,cAAc,CAAC,IAAI,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;oBAC1F,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAC;wBAC1C,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,eAAe,CACtD,IAAI,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAC5E,cAAc,CAAC,IAAI,CACtB,CAAC;oBACN,CAAC;oBACD,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;wBACvG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;oBAC1D,CAAC;oBACD,OAAO;gBACX,CAAC;gBAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAChF,6GAA6G;oBAC7G,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,GAAG,EAAE,CAAC;wBAC3C,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAC;4BAC1C,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,eAAe,CACtD,IAAI,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAC5E,cAAc,CAAC,IAAI,CACtB,CAAC;wBACN,CAAC;wBACD,cAAc,CAAC,uBAAuB,GAAG,IAAI,CAAC;oBAClD,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;oBACjE,MAAM,YAAY,GAAkB,cAAc,CAAC,KAAK,CAAC;oBAEzD,oHAAoH;oBACpH,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,CAAC;wBACxC,2BAA2B;wBAC3B,IAAI,gBAAgB,CAAC,QAAQ,KAAK,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,CAAC;4BAClE,IAAI,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;gCACjG,uDAAuD;gCACvD,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;gCACvE,cAAc,CAAC,uBAAuB,GAAG,IAAI,CAAC;4BAClD,CAAC;iCAAM,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,WAAW,EAAE,CAAC;gCAC/D,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;gCACrD,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;4BAC3E,CAAC;iCAAM,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,WAAW,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,SAAS,EAAE,CAAC;gCACtH,IAAI,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;oCAClD,iGAAiG;oCACjG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;oCACpE,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gCAC3D,CAAC;gCACD,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;4BAC3E,CAAC;wBACL,CAAC;6BAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;4BACxJ,iGAAiG;4BACjG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;4BACtE,0DAA0D;4BAC1D,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAC;gCAC1C,cAAc,CAAC,uBAAuB,GAAG,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC;4BAC3E,CAAC;wBACL,CAAC;6BAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,EAAE,CAAC;4BACnH,gEAAgE;4BAEhE,uDAAuD;4BACvD,IAAI,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;gCACjG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;gCACvE,cAAc,CAAC,uBAAuB,GAAG,IAAI,CAAC;4BAClD,CAAC;iCAAM,CAAC;gCACJ,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,WAAW,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,SAAS,EAAE,CAAC;oCAC/G,IAAI,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;wCAClD,iGAAiG;wCACjG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;wCACpE,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;oCAC3D,CAAC;gCACL,CAAC;gCACD,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;4BAC1E,CAAC;wBACL,CAAC;wBAED,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;4BACvG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;wBAC1D,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,sHAAsH;YACtH,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,aAAa,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAChG,CAAC;QACL,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;QAEzC,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACxF,wDAAwD;gBACxD,IAAI,IAAI,CAAC,YAAY,IAAI,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;oBACxD,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE;YACzE,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAEO,gBAAgB,CAAC,cAA8B,EAAE,QAAqB,EAAE,YAA2B;QACvG,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAC;YAC1C,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;YACtJ,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAC3D,CAAC;IACL,CAAC;IAED;;OAEG;IACI,MAAM;QACT,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;YACtC,iDAAiD;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAChE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;YACnD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACvC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACtD,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAErC,wCAAwC;YACxC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;YACzB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC;YACxC,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC;YACzC,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAEO,aAAa;QACjB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvE,IAAI,CAAC,iBAAiB,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACjE,CAAC;;AAhZD,gBAAgB;AACF,yCAAoB,GAAmC,IAAI,AAAvC,CAAwC;AAC1E,gBAAgB;AACF,kDAA6B,GAAmC,IAAI,AAAvC,CAAwC","sourcesContent":["import type { IDisposable } from \"../scene\";\r\nimport { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { PointerInfoPre } from \"../Events/pointerEvents\";\r\nimport { PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Renders a layer on top of an existing scene\r\n */\r\nexport class UtilityLayerRenderer implements IDisposable {\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _lastPointerEvents: { [pointerId: number]: boolean } = {};\r\n /** @internal */\r\n public static _DefaultUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n /** @internal */\r\n public static _DefaultKeepDepthUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n private _sharedGizmoLight: Nullable<HemisphericLight> = null;\r\n\r\n private _renderCamera: Nullable<Camera> = null;\r\n\r\n /**\r\n * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera)\r\n * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned\r\n * @returns the camera that is used when rendering the utility layer\r\n */\r\n public getRenderCamera(getRigParentIfPossible?: boolean) {\r\n if (this._renderCamera) {\r\n return this._renderCamera;\r\n } else {\r\n let activeCam: Camera;\r\n if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) {\r\n activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1];\r\n } else {\r\n activeCam = this.originalScene.activeCamera!;\r\n }\r\n\r\n if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) {\r\n return activeCam.rigParent!;\r\n }\r\n return activeCam;\r\n }\r\n }\r\n /**\r\n * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used)\r\n * @param cam the camera that should be used when rendering the utility layer\r\n */\r\n public setRenderCamera(cam: Nullable<Camera>) {\r\n this._renderCamera = cam;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Light which used by gizmos to get light shading\r\n */\r\n public _getSharedGizmoLight(): HemisphericLight {\r\n if (!this._sharedGizmoLight) {\r\n this._sharedGizmoLight = new HemisphericLight(\"shared gizmo light\", new Vector3(0, 1, 0), this.utilityLayerScene);\r\n this._sharedGizmoLight.intensity = 2;\r\n this._sharedGizmoLight.groundColor = Color3.Gray();\r\n }\r\n return this._sharedGizmoLight;\r\n }\r\n\r\n /**\r\n * If the picking should be done on the utility layer prior to the actual scene (Default: true)\r\n */\r\n public pickUtilitySceneFirst = true;\r\n /**\r\n * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it)\r\n */\r\n public static get DefaultUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer\r\n * @param scene associated scene\r\n * @internal\r\n */\r\n public static _CreateDefaultUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n /**\r\n * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it)\r\n */\r\n public static get DefaultKeepDepthUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultKeepUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer (Depth map of the previous scene is not cleared before drawing on top of it)\r\n * @param scene associated scene\r\n * @internal\r\n */\r\n public static _CreateDefaultKeepUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * The scene that is rendered on top of the original scene\r\n */\r\n public utilityLayerScene: Scene;\r\n\r\n /**\r\n * If the utility layer should automatically be rendered on top of existing scene\r\n */\r\n public shouldRender: boolean = true;\r\n /**\r\n * If set to true, only pointer down onPointerObservable events will be blocked when picking is occluded by original scene\r\n */\r\n public onlyCheckPointerDownEvents = true;\r\n\r\n /**\r\n * If set to false, only pointerUp, pointerDown and pointerMove will be sent to the utilityLayerScene (false by default)\r\n */\r\n public processAllEvents = false;\r\n\r\n /**\r\n * Set to false to disable picking\r\n */\r\n public pickingEnabled = true;\r\n\r\n /**\r\n * Observable raised when the pointer moves from the utility layer scene to the main scene\r\n */\r\n public onPointerOutObservable = new Observable<number>();\r\n\r\n /** Gets or sets a predicate that will be used to indicate utility meshes present in the main scene */\r\n public mainSceneTrackerPredicate: (mesh: Nullable<AbstractMesh>) => boolean;\r\n\r\n private _afterRenderObserver: Nullable<Observer<Camera>>;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _originalPointerObserver: Nullable<Observer<PointerInfoPre>>;\r\n /**\r\n * Instantiates a UtilityLayerRenderer\r\n * @param originalScene the original scene that will be rendered on top of\r\n * @param handleEvents boolean indicating if the utility layer should handle events\r\n * @param manualRender boolean indicating if the utility layer should render manually.\r\n */\r\n constructor(\r\n /** the original scene that will be rendered on top of */\r\n public originalScene: Scene,\r\n public readonly handleEvents: boolean = true,\r\n manualRender = false\r\n ) {\r\n // Create scene which will be rendered in the foreground and remove it from being referenced by engine to avoid interfering with existing app\r\n this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true, useFloatingOrigin: originalScene.floatingOriginMode });\r\n this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem;\r\n this.utilityLayerScene._allowPostProcessClearColor = false;\r\n\r\n // Deactivate post processes\r\n this.utilityLayerScene.postProcessesEnabled = false;\r\n\r\n // Detach controls on utility scene, events will be fired by logic below to handle picking priority\r\n this.utilityLayerScene.detachControl();\r\n\r\n if (handleEvents) {\r\n this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => {\r\n if (!this.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n if (!this.pickingEnabled) {\r\n return;\r\n }\r\n\r\n if (!this.processAllEvents) {\r\n if (\r\n prePointerInfo.type !== PointerEventTypes.POINTERMOVE &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERUP &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOWN &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP\r\n ) {\r\n return;\r\n }\r\n }\r\n this.utilityLayerScene.pointerX = originalScene.pointerX;\r\n this.utilityLayerScene.pointerY = originalScene.pointerY;\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n if (originalScene.isPointerCaptured(pointerEvent.pointerId)) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n return;\r\n }\r\n\r\n const getNearPickDataForScene = (scene: Scene) => {\r\n let scenePick: Nullable<PickingInfo>;\r\n\r\n if (prePointerInfo.nearInteractionPickingInfo) {\r\n if (prePointerInfo.nearInteractionPickingInfo.pickedMesh!.getScene() == scene) {\r\n scenePick = prePointerInfo.nearInteractionPickingInfo;\r\n } else {\r\n scenePick = new PickingInfo();\r\n }\r\n } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) {\r\n scenePick = prePointerInfo.originalPickingInfo;\r\n } else {\r\n let previousActiveCamera: Nullable<Camera> = null;\r\n // If a camera is set for rendering with this layer\r\n // it will also be used for the ray computation\r\n // To preserve back compat and because scene.pick always use activeCamera\r\n // it's substituted temporarily and a new scenePick is forced.\r\n // otherwise, the ray with previously active camera is always used.\r\n // It's set back to previous activeCamera after operation.\r\n if (this._renderCamera) {\r\n previousActiveCamera = scene._activeCamera;\r\n scene._activeCamera = this._renderCamera;\r\n prePointerInfo.ray = null;\r\n }\r\n scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY);\r\n if (previousActiveCamera) {\r\n scene._activeCamera = previousActiveCamera;\r\n }\r\n }\r\n\r\n return scenePick;\r\n };\r\n\r\n const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene);\r\n\r\n if (!prePointerInfo.ray && utilityScenePick) {\r\n prePointerInfo.ray = utilityScenePick.ray;\r\n }\r\n\r\n if (prePointerInfo.originalPickingInfo?.aimTransform && utilityScenePick) {\r\n utilityScenePick.aimTransform = prePointerInfo.originalPickingInfo.aimTransform;\r\n utilityScenePick.gripTransform = prePointerInfo.originalPickingInfo.gripTransform;\r\n }\r\n\r\n // always fire the prepointer observable\r\n this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo);\r\n\r\n // allow every non pointer down event to flow to the utility layer\r\n if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n return;\r\n }\r\n\r\n if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) {\r\n // If this layer is an overlay, check if this layer was hit and if so, skip pointer events for the main scene\r\n if (utilityScenePick && utilityScenePick.hit) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n prePointerInfo.skipOnPointerObservable = true;\r\n }\r\n } else {\r\n const originalScenePick = getNearPickDataForScene(originalScene);\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n\r\n // If the layer can be occluded by the original scene, only fire pointer events to the first layer that hit they ray\r\n if (originalScenePick && utilityScenePick) {\r\n // No pick in utility scene\r\n if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) {\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n // We touched an utility mesh present in the main scene\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n this._pointerCaptures[pointerEvent.pointerId] = true;\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) {\r\n // We pick something in utility scene or the pick in utility is closer than the one in main scene\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n // If a previous utility layer set this, do not unset this\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0;\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance >= originalScenePick.distance) {\r\n // We have a pick in both scenes but main is closer than utility\r\n\r\n // We touched an utility mesh present in the main scene\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else {\r\n if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n }\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n }\r\n }\r\n\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n // As a newly added utility layer will be rendered over the screen last, it's pointer events should be processed first\r\n if (this._originalPointerObserver) {\r\n originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver);\r\n }\r\n }\r\n\r\n // Render directly on top of existing scene without clearing\r\n this.utilityLayerScene.autoClear = false;\r\n\r\n if (!manualRender) {\r\n this._afterRenderObserver = this.originalScene.onAfterRenderCameraObservable.add((camera) => {\r\n // Only render when the render camera finishes rendering\r\n if (this.shouldRender && camera == this.getRenderCamera()) {\r\n this.render();\r\n }\r\n });\r\n }\r\n\r\n this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n this._updateCamera();\r\n }\r\n\r\n private _notifyObservers(prePointerInfo: PointerInfoPre, pickInfo: PickingInfo, pointerEvent: IPointerEvent) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type);\r\n this._lastPointerEvents[pointerEvent.pointerId] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Renders the utility layers scene on top of the original scene\r\n */\r\n public render() {\r\n this._updateCamera();\r\n if (this.utilityLayerScene.activeCamera) {\r\n // Set the camera's scene to utility layers scene\r\n const oldScene = this.utilityLayerScene.activeCamera.getScene();\r\n const camera = this.utilityLayerScene.activeCamera;\r\n camera._scene = this.utilityLayerScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = this.utilityLayerScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = this.utilityLayerScene;\r\n }\r\n\r\n this.utilityLayerScene.render(false);\r\n\r\n // Reset camera's scene back to original\r\n camera._scene = oldScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = oldScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = oldScene;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the renderer\r\n */\r\n public dispose() {\r\n this.onPointerOutObservable.clear();\r\n\r\n if (this._afterRenderObserver) {\r\n this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver);\r\n }\r\n if (this._sceneDisposeObserver) {\r\n this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n }\r\n if (this._originalPointerObserver) {\r\n this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver);\r\n }\r\n this.utilityLayerScene.dispose();\r\n }\r\n\r\n private _updateCamera() {\r\n this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera();\r\n this.utilityLayerScene.activeCamera = this.getRenderCamera();\r\n }\r\n}\r\n"]}
@@ -78,10 +78,20 @@ permute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }
78
78
  float stepDirection=sign(delta.x);float invdx=stepDirection/delta.x;vec2 dP=vec2(stepDirection,delta.y*invdx);vec3 dQ=(Q1-Q0)*invdx;float dk=(k1-k0)*invdx;float zMin=min(csEndPoint.z,csOrigin.z);float zMax=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;vec4 pqk=vec4(P0,Q0.z,k0);vec4 dPQK=vec4(dP,dQ.z,dk);startPixel=permute ? P0.yx : P0.xy;float prevZMaxEstimate=csOrigin.z;float rayZMin=prevZMaxEstimate,rayZMax=prevZMaxEstimate;float sceneZMax=rayZMax+1e4;float end=P1.x*stepDirection;bool hit=false;float stepCount;for (stepCount=0.0;stepCount<=selfCollisionNumSkip ||
79
79
  (pqk.x*stepDirection)<=end &&
80
80
  stepCount<maxSteps &&
81
- !hit &&
82
- sceneZMax != 0.0;
81
+ !hit;
83
82
  pqk+=dPQK,++stepCount)
84
- {hitPixel=permute ? pqk.yx : pqk.xy;rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;if (rayZMin>rayZMax) {
83
+ {hitPixel=permute ? pqk.yx : pqk.xy;
84
+ #ifndef SSRAYTRACE_CLIP_TO_FRUSTUM
85
+ if (hitPixel.x<0.0 || hitPixel.x>=csZBufferSize.x ||
86
+ hitPixel.y<0.0 || hitPixel.y>=csZBufferSize.y) break;
87
+ #endif
88
+ rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;
89
+ #ifdef SSRAYTRACE_RIGHT_HANDED_SCENE
90
+ if (prevZMaxEstimate<-farPlaneZ) break;
91
+ #else
92
+ if (prevZMaxEstimate>farPlaneZ) break;
93
+ #endif
94
+ if (rayZMin>rayZMax) {
85
95
  float t=rayZMin; rayZMin=rayZMax; rayZMax=t;}
86
96
  sceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;
87
97
  #ifdef SSRAYTRACE_SCREENSPACE_DEPTH
@@ -104,27 +114,27 @@ float sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r
104
114
  #ifdef SSRAYTRACE_SCREENSPACE_DEPTH
105
115
  sceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);
106
116
  #endif
107
- if (sceneBackZ==0.0) sceneBackZ=1e8;hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax) && (sceneZMax != 0.0);
117
+ if (sceneBackZ==0.0) sceneBackZ=1e8;hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax);
108
118
  #else
109
119
  hit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);
110
120
  #endif
111
121
  #endif
112
122
  }
113
- pqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps || sceneZMax==0.0) {hit=false;}
123
+ pqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps) {hit=false;}
114
124
  #ifdef SSRAYTRACE_ENABLE_REFINEMENT
115
125
  if (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;float invStride=1.0/stride;dPQK*=invStride;float refinementStepCount=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||
116
126
  (refinementStepCount<=stride*1.4) &&
117
- (rayZMax<sceneZMax) && (sceneZMax != 0.0);pqk+=dPQK,refinementStepCount+=1.0)
127
+ (rayZMax<sceneZMax);pqk+=dPQK,refinementStepCount+=1.0)
118
128
  {rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);hitPixel=permute ? pqk.yx : pqk.xy;sceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;
119
129
  #ifdef SSRAYTRACE_SCREENSPACE_DEPTH
120
130
  sceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);
121
131
  #endif
122
- }
132
+ if (sceneZMax==0.0) sceneZMax=1e8;}
123
133
  pqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}
124
134
  #endif
125
135
  Q0.xy+=dQ.xy*stepCount;Q0.z=pqk.z;csHitPoint=Q0/pqk.w;numIterations=stepCount+1.0;
126
136
  #ifdef SSRAYTRACE_DEBUG
127
- if (((pqk.x+dPQK.x)*stepDirection)>end) {debugColor=vec3(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {debugColor=vec3(1,0,0);} else if (sceneZMax==0.0) {debugColor=vec3(1,1,0);} else {debugColor=vec3(0,stepCount/maxSteps,0);}
137
+ if (((pqk.x+dPQK.x)*stepDirection)>end) {debugColor=vec3(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {debugColor=vec3(1,0,0);} else if (!hit) {debugColor=vec3(1,1,0);} else {debugColor=vec3(0,stepCount/maxSteps,0);}
128
138
  #endif
129
139
  return hit;}
130
140
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"screenSpaceRayTrace.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiJd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"screenSpaceRayTrace\";\nconst shader = `float distanceSquared(vec2 a,vec2 b) { a-=b; return dot(a,a); }\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nfloat linearizeDepth(float depth,float near,float far) {\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nreturn -(near*far)/(far-depth*(far-near));\n#else\nreturn (near*far)/(far-depth*(far-near));\n#endif\n}\n#endif\n/**\n\\param csOrigin Camera-space ray origin,which must be \nwithin the view volume and must have z>0.01 and project within the valid screen rectangle\n\\param csDirection Unit length camera-space ray direction\n\\param projectToPixelMatrix A projection matrix that maps to **pixel** coordinates \n(**not** [-1,+1] normalized device coordinates).\n\\param csZBuffer The camera-space Z buffer\n\\param csZBufferSize Dimensions of csZBuffer\n\\param csZThickness Camera space csZThickness to ascribe to each pixel in the depth buffer\n\\param nearPlaneZ Positive number. Doesn't have to be THE actual near plane,just a reasonable value\nfor clipping rays headed towards the camera\n\\param stride Step in horizontal or vertical pixels between samples. This is a float\nbecause integer math is slow on GPUs,but should be set to an integer>=1\n\\param jitterFraction Number between 0 and 1 for how far to bump the ray in stride units\nto conceal banding artifacts,plus the stride ray offset.\n\\param maxSteps Maximum number of iterations. Higher gives better images but may be slow\n\\param maxRayTraceDistance Maximum camera-space distance to trace before returning a miss\n\\param selfCollisionNumSkip Number of steps to skip at start when raytracing to avoid self collisions.\n1 is a reasonable value,depending on the scene you may need to set this value to 2\n\\param hitPixel Pixel coordinates of the first intersection with the scene\n\\param numIterations number of iterations performed\n\\param csHitPoint Camera space location of the ray hit\n*/\n#define inline\nbool traceScreenSpaceRay1(\nvec3 csOrigin,\nvec3 csDirection,\nmat4 projectToPixelMatrix,\nsampler2D csZBuffer,\nvec2 csZBufferSize,\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nsampler2D csZBackBuffer,\nfloat csZBackSizeFactor,\n#endif\nfloat csZThickness,\nfloat nearPlaneZ,\nfloat farPlaneZ,\nfloat stride,\nfloat jitterFraction,\nfloat maxSteps,\nfloat maxRayTraceDistance,\nfloat selfCollisionNumSkip,\nout vec2 startPixel,\nout vec2 hitPixel,\nout vec3 csHitPoint,\nout float numIterations\n#ifdef SSRAYTRACE_DEBUG\n,out vec3 debugColor\n#endif\n)\n{\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)>-nearPlaneZ ? (-nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#else\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)<nearPlaneZ ? (nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#endif\nvec3 csEndPoint=csOrigin+csDirection*rayLength;hitPixel=vec2(-1.0,-1.0);vec4 H0=projectToPixelMatrix*vec4(csOrigin,1.0);vec4 H1=projectToPixelMatrix*vec4(csEndPoint,1.0);float k0=1.0/H0.w;float k1=1.0/H1.w;vec3 Q0=csOrigin*k0;vec3 Q1=csEndPoint*k1;vec2 P0=H0.xy*k0;vec2 P1=H1.xy*k1;\n#ifdef SSRAYTRACE_CLIP_TO_FRUSTUM\nfloat xMax=csZBufferSize.x-0.5,xMin=0.5,yMax=csZBufferSize.y-0.5,yMin=0.5;float alpha=0.0;if ((P1.y>yMax) || (P1.y<yMin)) {alpha=(P1.y-((P1.y>yMax) ? yMax : yMin))/(P1.y-P0.y);}\nif ((P1.x>xMax) || (P1.x<xMin)) {alpha=max(alpha,(P1.x-((P1.x>xMax) ? xMax : xMin))/(P1.x-P0.x));}\nP1=mix(P1,P0,alpha); k1=mix(k1,k0,alpha); Q1=mix(Q1,Q0,alpha);\n#endif\nP1+=vec2((distanceSquared(P0,P1)<0.0001) ? 0.01 : 0.0);vec2 delta=P1-P0;bool permute=false;if (abs(delta.x)<abs(delta.y)) { \npermute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }\nfloat stepDirection=sign(delta.x);float invdx=stepDirection/delta.x;vec2 dP=vec2(stepDirection,delta.y*invdx);vec3 dQ=(Q1-Q0)*invdx;float dk=(k1-k0)*invdx;float zMin=min(csEndPoint.z,csOrigin.z);float zMax=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;vec4 pqk=vec4(P0,Q0.z,k0);vec4 dPQK=vec4(dP,dQ.z,dk);startPixel=permute ? P0.yx : P0.xy;float prevZMaxEstimate=csOrigin.z;float rayZMin=prevZMaxEstimate,rayZMax=prevZMaxEstimate;float sceneZMax=rayZMax+1e4;float end=P1.x*stepDirection;bool hit=false;float stepCount;for (stepCount=0.0;stepCount<=selfCollisionNumSkip ||\n(pqk.x*stepDirection)<=end &&\nstepCount<maxSteps &&\n!hit &&\nsceneZMax != 0.0; \npqk+=dPQK,++stepCount)\n{hitPixel=permute ? pqk.yx : pqk.xy;rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;if (rayZMin>rayZMax) { \nfloat t=rayZMin; rayZMin=rayZMax; rayZMax=t;}\nsceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneZMax==0.0) sceneZMax=1e8;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) sceneBackZ=-1e8;hit=(rayZMax>=sceneBackZ-csZThickness) && (rayZMin<=sceneZMax);\n#else\nhit=(rayZMax>=sceneZMax-csZThickness) && (rayZMin<=sceneZMax);\n#endif\n#else\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) sceneBackZ=1e8;hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax) && (sceneZMax != 0.0);\n#else\nhit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);\n#endif\n#endif\n}\npqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps || sceneZMax==0.0) {hit=false;}\n#ifdef SSRAYTRACE_ENABLE_REFINEMENT\nif (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;float invStride=1.0/stride;dPQK*=invStride;float refinementStepCount=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||\n(refinementStepCount<=stride*1.4) &&\n(rayZMax<sceneZMax) && (sceneZMax != 0.0);pqk+=dPQK,refinementStepCount+=1.0)\n{rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);hitPixel=permute ? pqk.yx : pqk.xy;sceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\n}\npqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}\n#endif\nQ0.xy+=dQ.xy*stepCount;Q0.z=pqk.z;csHitPoint=Q0/pqk.w;numIterations=stepCount+1.0;\n#ifdef SSRAYTRACE_DEBUG\nif (((pqk.x+dPQK.x)*stepDirection)>end) {debugColor=vec3(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {debugColor=vec3(1,0,0);} else if (sceneZMax==0.0) {debugColor=vec3(1,1,0);} else {debugColor=vec3(0,stepCount/maxSteps,0);}\n#endif\nreturn hit;}\n/**\ntexCoord: in the [0,1] range\ndepth: depth in view space (range [znear,zfar]])\n*/\nvec3 computeViewPosFromUVDepth(vec2 texCoord,float depth,mat4 projection,mat4 invProjectionMatrix) {vec4 ndc;ndc.xy=texCoord*2.0-1.0;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef ORTHOGRAPHIC_CAMERA\nndc.z=-projection[2].z*depth+projection[3].z;\n#else\nndc.z=-projection[2].z-projection[3].z/depth;\n#endif\n#else\n#ifdef ORTHOGRAPHIC_CAMERA\nndc.z=projection[2].z*depth+projection[3].z;\n#else\nndc.z=projection[2].z+projection[3].z/depth;\n#endif\n#endif\nndc.w=1.0;vec4 eyePos=invProjectionMatrix*ndc;eyePos.xyz/=eyePos.w;return eyePos.xyz;}\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const screenSpaceRayTrace = { name, shader };\n"]}
1
+ {"version":3,"file":"screenSpaceRayTrace.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Jd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"screenSpaceRayTrace\";\nconst shader = `float distanceSquared(vec2 a,vec2 b) { a-=b; return dot(a,a); }\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nfloat linearizeDepth(float depth,float near,float far) {\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nreturn -(near*far)/(far-depth*(far-near));\n#else\nreturn (near*far)/(far-depth*(far-near));\n#endif\n}\n#endif\n/**\n\\param csOrigin Camera-space ray origin,which must be \nwithin the view volume and must have z>0.01 and project within the valid screen rectangle\n\\param csDirection Unit length camera-space ray direction\n\\param projectToPixelMatrix A projection matrix that maps to **pixel** coordinates \n(**not** [-1,+1] normalized device coordinates).\n\\param csZBuffer The camera-space Z buffer\n\\param csZBufferSize Dimensions of csZBuffer\n\\param csZThickness Camera space csZThickness to ascribe to each pixel in the depth buffer\n\\param nearPlaneZ Positive number. Doesn't have to be THE actual near plane,just a reasonable value\nfor clipping rays headed towards the camera\n\\param stride Step in horizontal or vertical pixels between samples. This is a float\nbecause integer math is slow on GPUs,but should be set to an integer>=1\n\\param jitterFraction Number between 0 and 1 for how far to bump the ray in stride units\nto conceal banding artifacts,plus the stride ray offset.\n\\param maxSteps Maximum number of iterations. Higher gives better images but may be slow\n\\param maxRayTraceDistance Maximum camera-space distance to trace before returning a miss\n\\param selfCollisionNumSkip Number of steps to skip at start when raytracing to avoid self collisions.\n1 is a reasonable value,depending on the scene you may need to set this value to 2\n\\param hitPixel Pixel coordinates of the first intersection with the scene\n\\param numIterations number of iterations performed\n\\param csHitPoint Camera space location of the ray hit\n*/\n#define inline\nbool traceScreenSpaceRay1(\nvec3 csOrigin,\nvec3 csDirection,\nmat4 projectToPixelMatrix,\nsampler2D csZBuffer,\nvec2 csZBufferSize,\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nsampler2D csZBackBuffer,\nfloat csZBackSizeFactor,\n#endif\nfloat csZThickness,\nfloat nearPlaneZ,\nfloat farPlaneZ,\nfloat stride,\nfloat jitterFraction,\nfloat maxSteps,\nfloat maxRayTraceDistance,\nfloat selfCollisionNumSkip,\nout vec2 startPixel,\nout vec2 hitPixel,\nout vec3 csHitPoint,\nout float numIterations\n#ifdef SSRAYTRACE_DEBUG\n,out vec3 debugColor\n#endif\n)\n{\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)>-nearPlaneZ ? (-nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#else\nfloat rayLength=(csOrigin.z+csDirection.z*maxRayTraceDistance)<nearPlaneZ ? (nearPlaneZ-csOrigin.z)/csDirection.z : maxRayTraceDistance;\n#endif\nvec3 csEndPoint=csOrigin+csDirection*rayLength;hitPixel=vec2(-1.0,-1.0);vec4 H0=projectToPixelMatrix*vec4(csOrigin,1.0);vec4 H1=projectToPixelMatrix*vec4(csEndPoint,1.0);float k0=1.0/H0.w;float k1=1.0/H1.w;vec3 Q0=csOrigin*k0;vec3 Q1=csEndPoint*k1;vec2 P0=H0.xy*k0;vec2 P1=H1.xy*k1;\n#ifdef SSRAYTRACE_CLIP_TO_FRUSTUM\nfloat xMax=csZBufferSize.x-0.5,xMin=0.5,yMax=csZBufferSize.y-0.5,yMin=0.5;float alpha=0.0;if ((P1.y>yMax) || (P1.y<yMin)) {alpha=(P1.y-((P1.y>yMax) ? yMax : yMin))/(P1.y-P0.y);}\nif ((P1.x>xMax) || (P1.x<xMin)) {alpha=max(alpha,(P1.x-((P1.x>xMax) ? xMax : xMin))/(P1.x-P0.x));}\nP1=mix(P1,P0,alpha); k1=mix(k1,k0,alpha); Q1=mix(Q1,Q0,alpha);\n#endif\nP1+=vec2((distanceSquared(P0,P1)<0.0001) ? 0.01 : 0.0);vec2 delta=P1-P0;bool permute=false;if (abs(delta.x)<abs(delta.y)) { \npermute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }\nfloat stepDirection=sign(delta.x);float invdx=stepDirection/delta.x;vec2 dP=vec2(stepDirection,delta.y*invdx);vec3 dQ=(Q1-Q0)*invdx;float dk=(k1-k0)*invdx;float zMin=min(csEndPoint.z,csOrigin.z);float zMax=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;vec4 pqk=vec4(P0,Q0.z,k0);vec4 dPQK=vec4(dP,dQ.z,dk);startPixel=permute ? P0.yx : P0.xy;float prevZMaxEstimate=csOrigin.z;float rayZMin=prevZMaxEstimate,rayZMax=prevZMaxEstimate;float sceneZMax=rayZMax+1e4;float end=P1.x*stepDirection;bool hit=false;float stepCount;for (stepCount=0.0;stepCount<=selfCollisionNumSkip ||\n(pqk.x*stepDirection)<=end &&\nstepCount<maxSteps &&\n!hit; \npqk+=dPQK,++stepCount)\n{hitPixel=permute ? pqk.yx : pqk.xy;\n#ifndef SSRAYTRACE_CLIP_TO_FRUSTUM\nif (hitPixel.x<0.0 || hitPixel.x>=csZBufferSize.x ||\nhitPixel.y<0.0 || hitPixel.y>=csZBufferSize.y) break;\n#endif\nrayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nif (prevZMaxEstimate<-farPlaneZ) break;\n#else\nif (prevZMaxEstimate>farPlaneZ) break;\n#endif\nif (rayZMin>rayZMax) { \nfloat t=rayZMin; rayZMin=rayZMax; rayZMax=t;}\nsceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneZMax==0.0) sceneZMax=1e8;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) sceneBackZ=-1e8;hit=(rayZMax>=sceneBackZ-csZThickness) && (rayZMin<=sceneZMax);\n#else\nhit=(rayZMax>=sceneZMax-csZThickness) && (rayZMin<=sceneZMax);\n#endif\n#else\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nfloat sceneBackZ=texelFetch(csZBackBuffer,ivec2(hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) sceneBackZ=1e8;hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax);\n#else\nhit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);\n#endif\n#endif\n}\npqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps) {hit=false;}\n#ifdef SSRAYTRACE_ENABLE_REFINEMENT\nif (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;float invStride=1.0/stride;dPQK*=invStride;float refinementStepCount=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||\n(refinementStepCount<=stride*1.4) &&\n(rayZMax<sceneZMax);pqk+=dPQK,refinementStepCount+=1.0)\n{rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);hitPixel=permute ? pqk.yx : pqk.xy;sceneZMax=texelFetch(csZBuffer,ivec2(hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneZMax==0.0) sceneZMax=1e8;}\npqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}\n#endif\nQ0.xy+=dQ.xy*stepCount;Q0.z=pqk.z;csHitPoint=Q0/pqk.w;numIterations=stepCount+1.0;\n#ifdef SSRAYTRACE_DEBUG\nif (((pqk.x+dPQK.x)*stepDirection)>end) {debugColor=vec3(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {debugColor=vec3(1,0,0);} else if (!hit) {debugColor=vec3(1,1,0);} else {debugColor=vec3(0,stepCount/maxSteps,0);}\n#endif\nreturn hit;}\n/**\ntexCoord: in the [0,1] range\ndepth: depth in view space (range [znear,zfar]])\n*/\nvec3 computeViewPosFromUVDepth(vec2 texCoord,float depth,mat4 projection,mat4 invProjectionMatrix) {vec4 ndc;ndc.xy=texCoord*2.0-1.0;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef ORTHOGRAPHIC_CAMERA\nndc.z=-projection[2].z*depth+projection[3].z;\n#else\nndc.z=-projection[2].z-projection[3].z/depth;\n#endif\n#else\n#ifdef ORTHOGRAPHIC_CAMERA\nndc.z=projection[2].z*depth+projection[3].z;\n#else\nndc.z=projection[2].z+projection[3].z/depth;\n#endif\n#endif\nndc.w=1.0;vec4 eyePos=invProjectionMatrix*ndc;eyePos.xyz/=eyePos.w;return eyePos.xyz;}\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const screenSpaceRayTrace = { name, shader };\n"]}
@@ -57,6 +57,10 @@ return (position+worldOffset)+alignedCorner;
57
57
  }
58
58
  #endif
59
59
  void main() {
60
+ #ifdef EMITRATECTRL
61
+ if (life>0.0 && age>=life) {gl_Position=vec4(0.0,0.0,2.0,1.0);vColor=vec4(0.0);
62
+ vUV=vec2(0.0);vPositionW=vec3(0.0);return;}
63
+ #endif
60
64
  #ifdef ANIMATESHEET
61
65
  float rowOffset=floor(cellIndex/sheetInfos.z);float columnOffset=cellIndex-rowOffset*sheetInfos.z;vec2 uvScale=sheetInfos.xy;vec2 uvOffset=vec2(uv.x ,1.0-uv.y);vUV=(uvOffset+vec2(columnOffset,rowOffset))*uvScale;
62
66
  #else
@@ -1 +1 @@
1
- {"version":3,"file":"gpuRenderParticles.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gpuRenderParticles.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,8CAA8C,CAAC;AACtD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,4BAA4B,CAAC;AACpC,OAAO,iCAAiC,CAAC;AAEzC,MAAM,IAAI,GAAG,gCAAgC,CAAC;AAC9C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuFb,CAAC;AACH,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/clipPlaneVertexDeclaration2\";\nimport \"./ShadersInclude/fogVertexDeclaration\";\nimport \"./ShadersInclude/logDepthDeclaration\";\nimport \"./ShadersInclude/clipPlaneVertex\";\nimport \"./ShadersInclude/fogVertex\";\nimport \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"gpuRenderParticlesVertexShader\";\nconst shader = `precision highp float;uniform mat4 view;uniform mat4 projection;uniform vec2 translationPivot;uniform vec3 worldOffset;\n#ifdef LOCAL\nuniform mat4 emitterWM;\n#endif\nattribute vec3 position;attribute float age;attribute float life;attribute vec3 size;\n#ifndef BILLBOARD\nattribute vec3 initialDirection;\n#endif\n#ifdef BILLBOARDSTRETCHED\nattribute vec3 direction;\n#endif\nattribute float angle;\n#ifdef ANIMATESHEET\nattribute float cellIndex;\n#endif\nattribute vec2 offset;attribute vec2 uv;varying vec2 vUV;varying vec4 vColor;varying vec3 vPositionW;\n#if defined(BILLBOARD) && !defined(BILLBOARDY) && !defined(BILLBOARDSTRETCHED)\nuniform mat4 invView;\n#endif\n#include<clipPlaneVertexDeclaration2>\n#include<fogVertexDeclaration>\n#include<logDepthDeclaration>\n#ifdef COLORGRADIENTS\nuniform sampler2D colorGradientSampler;\n#else\nuniform vec4 colorDead;attribute vec4 color;\n#endif\n#ifdef ANIMATESHEET\nuniform vec3 sheetInfos;\n#endif\n#ifdef BILLBOARD\nuniform vec3 eyePosition;\n#endif\nvec3 rotate(vec3 yaxis,vec3 rotatedCorner) {vec3 xaxis=normalize(cross(vec3(0.,1.0,0.),yaxis));vec3 zaxis=normalize(cross(yaxis,xaxis));vec3 row0=vec3(xaxis.x,xaxis.y,xaxis.z);vec3 row1=vec3(yaxis.x,yaxis.y,yaxis.z);vec3 row2=vec3(zaxis.x,zaxis.y,zaxis.z);mat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;\n#ifdef LOCAL\nreturn ((emitterWM*vec4(position,1.0)).xyz+worldOffset)+alignedCorner;\n#else\nreturn (position+worldOffset)+alignedCorner;\n#endif\n}\n#ifdef BILLBOARDSTRETCHED\nvec3 rotateAlign(vec3 toCamera,vec3 rotatedCorner) {vec3 normalizedToCamera=normalize(toCamera);vec3 normalizedCrossDirToCamera=normalize(cross(normalize(direction),normalizedToCamera));vec3 crossProduct=normalize(cross(normalizedToCamera,normalizedCrossDirToCamera));vec3 row0=vec3(normalizedCrossDirToCamera.x,normalizedCrossDirToCamera.y,normalizedCrossDirToCamera.z);vec3 row1=vec3(crossProduct.x,crossProduct.y,crossProduct.z);vec3 row2=vec3(normalizedToCamera.x,normalizedToCamera.y,normalizedToCamera.z);mat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;\n#ifdef LOCAL\nreturn ((emitterWM*vec4(position,1.0)).xyz+worldOffset)+alignedCorner;\n#else\nreturn (position+worldOffset)+alignedCorner;\n#endif\n}\n#endif\nvoid main() {\n#ifdef ANIMATESHEET\nfloat rowOffset=floor(cellIndex/sheetInfos.z);float columnOffset=cellIndex-rowOffset*sheetInfos.z;vec2 uvScale=sheetInfos.xy;vec2 uvOffset=vec2(uv.x ,1.0-uv.y);vUV=(uvOffset+vec2(columnOffset,rowOffset))*uvScale;\n#else\nvUV=uv;\n#endif\nfloat ratio=min(1.0,age/life);\n#ifdef COLORGRADIENTS\nvColor=texture2D(colorGradientSampler,vec2(ratio,0));\n#else\nvColor=color*vec4(1.0-ratio)+colorDead*vec4(ratio);\n#endif\nvec2 cornerPos=(offset-translationPivot)*size.yz*size.x;\n#ifdef BILLBOARD\nvec4 rotatedCorner;rotatedCorner.w=0.;\n#ifdef BILLBOARDY\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.y=0.;rotatedCorner.xz+=translationPivot;vec3 yaxis=(position+worldOffset)-eyePosition;yaxis.y=0.;vPositionW=rotate(normalize(yaxis),rotatedCorner.xyz);vec4 viewPosition=(view*vec4(vPositionW,1.0));\n#elif defined(BILLBOARDSTRETCHED)\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;vec3 toCamera=(position+worldOffset)-eyePosition;vPositionW=rotateAlign(toCamera,rotatedCorner.xyz);vec4 viewPosition=(view*vec4(vPositionW,1.0));\n#else\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;\n#ifdef LOCAL\nvec4 viewPosition=view*vec4(((emitterWM*vec4(position,1.0)).xyz+worldOffset),1.0)+rotatedCorner;\n#else\nvec4 viewPosition=view*vec4((position+worldOffset),1.0)+rotatedCorner;\n#endif\nvPositionW=(invView*viewPosition).xyz;\n#endif\n#else\nvec3 rotatedCorner;rotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=0.;rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.xz+=translationPivot;vec3 yaxis=normalize(initialDirection);vPositionW=rotate(yaxis,rotatedCorner);vec4 viewPosition=view*vec4(vPositionW,1.0);\n#endif\ngl_Position=projection*viewPosition;\n#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) || defined(FOG)\nvec4 worldPos=vec4(vPositionW,1.0);\n#endif\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<logDepthVertex>\n}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const gpuRenderParticlesVertexShader = { name, shader };\n"]}
1
+ {"version":3,"file":"gpuRenderParticles.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gpuRenderParticles.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,8CAA8C,CAAC;AACtD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,kCAAkC,CAAC;AAC1C,OAAO,4BAA4B,CAAC;AACpC,OAAO,iCAAiC,CAAC;AAEzC,MAAM,IAAI,GAAG,gCAAgC,CAAC;AAC9C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Fb,CAAC;AACH,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/clipPlaneVertexDeclaration2\";\nimport \"./ShadersInclude/fogVertexDeclaration\";\nimport \"./ShadersInclude/logDepthDeclaration\";\nimport \"./ShadersInclude/clipPlaneVertex\";\nimport \"./ShadersInclude/fogVertex\";\nimport \"./ShadersInclude/logDepthVertex\";\n\nconst name = \"gpuRenderParticlesVertexShader\";\nconst shader = `precision highp float;uniform mat4 view;uniform mat4 projection;uniform vec2 translationPivot;uniform vec3 worldOffset;\n#ifdef LOCAL\nuniform mat4 emitterWM;\n#endif\nattribute vec3 position;attribute float age;attribute float life;attribute vec3 size;\n#ifndef BILLBOARD\nattribute vec3 initialDirection;\n#endif\n#ifdef BILLBOARDSTRETCHED\nattribute vec3 direction;\n#endif\nattribute float angle;\n#ifdef ANIMATESHEET\nattribute float cellIndex;\n#endif\nattribute vec2 offset;attribute vec2 uv;varying vec2 vUV;varying vec4 vColor;varying vec3 vPositionW;\n#if defined(BILLBOARD) && !defined(BILLBOARDY) && !defined(BILLBOARDSTRETCHED)\nuniform mat4 invView;\n#endif\n#include<clipPlaneVertexDeclaration2>\n#include<fogVertexDeclaration>\n#include<logDepthDeclaration>\n#ifdef COLORGRADIENTS\nuniform sampler2D colorGradientSampler;\n#else\nuniform vec4 colorDead;attribute vec4 color;\n#endif\n#ifdef ANIMATESHEET\nuniform vec3 sheetInfos;\n#endif\n#ifdef BILLBOARD\nuniform vec3 eyePosition;\n#endif\nvec3 rotate(vec3 yaxis,vec3 rotatedCorner) {vec3 xaxis=normalize(cross(vec3(0.,1.0,0.),yaxis));vec3 zaxis=normalize(cross(yaxis,xaxis));vec3 row0=vec3(xaxis.x,xaxis.y,xaxis.z);vec3 row1=vec3(yaxis.x,yaxis.y,yaxis.z);vec3 row2=vec3(zaxis.x,zaxis.y,zaxis.z);mat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;\n#ifdef LOCAL\nreturn ((emitterWM*vec4(position,1.0)).xyz+worldOffset)+alignedCorner;\n#else\nreturn (position+worldOffset)+alignedCorner;\n#endif\n}\n#ifdef BILLBOARDSTRETCHED\nvec3 rotateAlign(vec3 toCamera,vec3 rotatedCorner) {vec3 normalizedToCamera=normalize(toCamera);vec3 normalizedCrossDirToCamera=normalize(cross(normalize(direction),normalizedToCamera));vec3 crossProduct=normalize(cross(normalizedToCamera,normalizedCrossDirToCamera));vec3 row0=vec3(normalizedCrossDirToCamera.x,normalizedCrossDirToCamera.y,normalizedCrossDirToCamera.z);vec3 row1=vec3(crossProduct.x,crossProduct.y,crossProduct.z);vec3 row2=vec3(normalizedToCamera.x,normalizedToCamera.y,normalizedToCamera.z);mat3 rotMatrix= mat3(row0,row1,row2);vec3 alignedCorner=rotMatrix*rotatedCorner;\n#ifdef LOCAL\nreturn ((emitterWM*vec4(position,1.0)).xyz+worldOffset)+alignedCorner;\n#else\nreturn (position+worldOffset)+alignedCorner;\n#endif\n}\n#endif\nvoid main() {\n#ifdef EMITRATECTRL\nif (life>0.0 && age>=life) {gl_Position=vec4(0.0,0.0,2.0,1.0);vColor=vec4(0.0); \nvUV=vec2(0.0);vPositionW=vec3(0.0);return;}\n#endif\n#ifdef ANIMATESHEET\nfloat rowOffset=floor(cellIndex/sheetInfos.z);float columnOffset=cellIndex-rowOffset*sheetInfos.z;vec2 uvScale=sheetInfos.xy;vec2 uvOffset=vec2(uv.x ,1.0-uv.y);vUV=(uvOffset+vec2(columnOffset,rowOffset))*uvScale;\n#else\nvUV=uv;\n#endif\nfloat ratio=min(1.0,age/life);\n#ifdef COLORGRADIENTS\nvColor=texture2D(colorGradientSampler,vec2(ratio,0));\n#else\nvColor=color*vec4(1.0-ratio)+colorDead*vec4(ratio);\n#endif\nvec2 cornerPos=(offset-translationPivot)*size.yz*size.x;\n#ifdef BILLBOARD\nvec4 rotatedCorner;rotatedCorner.w=0.;\n#ifdef BILLBOARDY\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.y=0.;rotatedCorner.xz+=translationPivot;vec3 yaxis=(position+worldOffset)-eyePosition;yaxis.y=0.;vPositionW=rotate(normalize(yaxis),rotatedCorner.xyz);vec4 viewPosition=(view*vec4(vPositionW,1.0));\n#elif defined(BILLBOARDSTRETCHED)\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;vec3 toCamera=(position+worldOffset)-eyePosition;vPositionW=rotateAlign(toCamera,rotatedCorner.xyz);vec4 viewPosition=(view*vec4(vPositionW,1.0));\n#else\nrotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.z=0.;rotatedCorner.xy+=translationPivot;\n#ifdef LOCAL\nvec4 viewPosition=view*vec4(((emitterWM*vec4(position,1.0)).xyz+worldOffset),1.0)+rotatedCorner;\n#else\nvec4 viewPosition=view*vec4((position+worldOffset),1.0)+rotatedCorner;\n#endif\nvPositionW=(invView*viewPosition).xyz;\n#endif\n#else\nvec3 rotatedCorner;rotatedCorner.x=cornerPos.x*cos(angle)-cornerPos.y*sin(angle);rotatedCorner.y=0.;rotatedCorner.z=cornerPos.x*sin(angle)+cornerPos.y*cos(angle);rotatedCorner.xz+=translationPivot;vec3 yaxis=normalize(initialDirection);vPositionW=rotate(yaxis,rotatedCorner);vec4 viewPosition=view*vec4(vPositionW,1.0);\n#endif\ngl_Position=projection*viewPosition;\n#if defined(CLIPPLANE) || defined(CLIPPLANE2) || defined(CLIPPLANE3) || defined(CLIPPLANE4) || defined(CLIPPLANE5) || defined(CLIPPLANE6) || defined(FOG)\nvec4 worldPos=vec4(vPositionW,1.0);\n#endif\n#include<clipPlaneVertex>\n#include<fogVertex>\n#include<logDepthVertex>\n}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const gpuRenderParticlesVertexShader = { name, shader };\n"]}
@@ -3,7 +3,7 @@ import { ShaderStore } from "../Engines/shaderStore.js";
3
3
  const name = "gpuUpdateParticlesVertexShader";
4
4
  const shader = `#version 300 es
5
5
  #define PI 3.14159
6
- uniform float currentCount;uniform float timeDelta;uniform float stopFactor;
6
+ uniform float currentCount;uniform float timeDelta;uniform float stopFactor;uniform float emitIndex;uniform float emitCount;
7
7
  #ifndef LOCAL
8
8
  uniform mat4 emitterWM;
9
9
  #endif
@@ -123,8 +123,20 @@ uniform vec4 cellInfos;
123
123
  #endif
124
124
  vec3 getRandomVec3(float offset) {return texture(randomSampler2,vec2(float(gl_VertexID)*offset/currentCount,0)).rgb;}
125
125
  vec4 getRandomVec4(float offset) {return texture(randomSampler,vec2(float(gl_VertexID)*offset/currentCount,0));}
126
- void main() {float newAge=age+timeDelta;
127
- if (newAge>=life && stopFactor != 0.) {vec3 newPosition;vec3 newDirection;vec4 randoms=getRandomVec4(seed.x);outLife=lifeTime.x+(lifeTime.y-lifeTime.x)*randoms.r;outAge=newAge-life;outSeed=seed;
126
+ void main() {float newAge=age+timeDelta;
127
+ #ifdef EMITRATECTRL
128
+ float particleIndex=float(gl_VertexID);float offsetFromEmitIndex=particleIndex-emitIndex;if (offsetFromEmitIndex<0.0) {offsetFromEmitIndex+=currentCount; }
129
+ bool shouldEmit=offsetFromEmitIndex<emitCount && stopFactor != 0.;
130
+ #else
131
+ bool shouldEmit=newAge>=life && stopFactor != 0.;
132
+ #endif
133
+ if (shouldEmit) {vec3 newPosition;vec3 newDirection;vec4 randoms=getRandomVec4(seed.x);outLife=lifeTime.x+(lifeTime.y-lifeTime.x)*randoms.r;
134
+ #ifdef EMITRATECTRL
135
+ outAge=0.0;
136
+ #else
137
+ outAge=newAge-life;
138
+ #endif
139
+ outSeed=seed;
128
140
  #ifdef SIZEGRADIENTS
129
141
  outSize.x=texture(sizeGradientSampler,vec2(0,0)).r;
130
142
  #else
@@ -1 +1 @@
1
- {"version":3,"file":"gpuUpdateParticles.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gpuUpdateParticles.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,gCAAgC,CAAC;AAC9C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwQZ,CAAC;AACJ,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"gpuUpdateParticlesVertexShader\";\nconst shader = `#version 300 es\n#define PI 3.14159\nuniform float currentCount;uniform float timeDelta;uniform float stopFactor;\n#ifndef LOCAL\nuniform mat4 emitterWM;\n#endif\nuniform vec2 lifeTime;uniform vec2 emitPower;uniform vec2 sizeRange;uniform vec4 scaleRange;\n#ifdef FLOWMAP\nuniform mat4 flowMapProjection;uniform float flowMapStrength;uniform sampler2D flowMapSampler;\n#endif\n#ifndef COLORGRADIENTS\nuniform vec4 color1;uniform vec4 color2;\n#endif\nuniform vec3 gravity;uniform sampler2D randomSampler;uniform sampler2D randomSampler2;uniform vec4 angleRange;\n#ifdef BOXEMITTER\nuniform vec3 direction1;uniform vec3 direction2;uniform vec3 minEmitBox;uniform vec3 maxEmitBox;\n#endif\n#ifdef POINTEMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#endif\n#ifdef HEMISPHERICEMITTER\nuniform float radius;uniform float radiusRange;uniform float directionRandomizer;\n#endif\n#ifdef SPHEREEMITTER\nuniform float radius;uniform float radiusRange;\n#ifdef DIRECTEDSPHEREEMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#else\nuniform float directionRandomizer;\n#endif\n#endif\n#ifdef CYLINDEREMITTER\nuniform float radius;uniform float height;uniform float radiusRange;\n#ifdef DIRECTEDCYLINDEREMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#else\nuniform float directionRandomizer;\n#endif\n#endif\n#ifdef CONEEMITTER\nuniform vec2 radius;uniform float coneAngle;uniform vec2 height;\n#ifdef DIRECTEDCONEEMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#else\nuniform float directionRandomizer;\n#endif\n#endif\nin vec3 position;\n#ifdef CUSTOMEMITTER\nin vec3 initialPosition;\n#endif\nin float age;in float life;in vec4 seed;in vec3 size;\n#ifndef COLORGRADIENTS\nin vec4 color;\n#endif\nin vec3 direction;\n#ifndef BILLBOARD\nin vec3 initialDirection;\n#endif\n#ifdef ANGULARSPEEDGRADIENTS\nin float angle;\n#else\nin vec2 angle;\n#endif\n#ifdef ANIMATESHEET\nin float cellIndex;\n#ifdef ANIMATESHEETRANDOMSTART\nin float cellStartOffset;\n#endif\n#endif\n#ifdef NOISE\nin vec3 noiseCoordinates1;in vec3 noiseCoordinates2;\n#endif\nout vec3 outPosition;\n#ifdef CUSTOMEMITTER\nout vec3 outInitialPosition;\n#endif\nout float outAge;out float outLife;out vec4 outSeed;out vec3 outSize;\n#ifndef COLORGRADIENTS\nout vec4 outColor;\n#endif\nout vec3 outDirection;\n#ifndef BILLBOARD\nout vec3 outInitialDirection;\n#endif\n#ifdef ANGULARSPEEDGRADIENTS\nout float outAngle;\n#else\nout vec2 outAngle;\n#endif\n#ifdef ANIMATESHEET\nout float outCellIndex;\n#ifdef ANIMATESHEETRANDOMSTART\nout float outCellStartOffset;\n#endif\n#endif\n#ifdef NOISE\nout vec3 outNoiseCoordinates1;out vec3 outNoiseCoordinates2;\n#endif\n#ifdef SIZEGRADIENTS\nuniform sampler2D sizeGradientSampler;\n#endif \n#ifdef ANGULARSPEEDGRADIENTS\nuniform sampler2D angularSpeedGradientSampler;\n#endif \n#ifdef VELOCITYGRADIENTS\nuniform sampler2D velocityGradientSampler;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\nuniform sampler2D limitVelocityGradientSampler;uniform float limitVelocityDamping;\n#endif\n#ifdef DRAGGRADIENTS\nuniform sampler2D dragGradientSampler;\n#endif\n#ifdef NOISE\nuniform vec3 noiseStrength;uniform sampler2D noiseSampler;\n#endif\n#ifdef ANIMATESHEET\nuniform vec4 cellInfos;\n#endif\nvec3 getRandomVec3(float offset) {return texture(randomSampler2,vec2(float(gl_VertexID)*offset/currentCount,0)).rgb;}\nvec4 getRandomVec4(float offset) {return texture(randomSampler,vec2(float(gl_VertexID)*offset/currentCount,0));}\nvoid main() {float newAge=age+timeDelta; \nif (newAge>=life && stopFactor != 0.) {vec3 newPosition;vec3 newDirection;vec4 randoms=getRandomVec4(seed.x);outLife=lifeTime.x+(lifeTime.y-lifeTime.x)*randoms.r;outAge=newAge-life;outSeed=seed;\n#ifdef SIZEGRADIENTS \noutSize.x=texture(sizeGradientSampler,vec2(0,0)).r;\n#else\noutSize.x=sizeRange.x+(sizeRange.y-sizeRange.x)*randoms.g;\n#endif\noutSize.y=scaleRange.x+(scaleRange.y-scaleRange.x)*randoms.b;outSize.z=scaleRange.z+(scaleRange.w-scaleRange.z)*randoms.a; \n#ifndef COLORGRADIENTS\noutColor=color1+(color2-color1)*randoms.b;\n#endif\n#ifndef ANGULARSPEEDGRADIENTS \noutAngle.y=angleRange.x+(angleRange.y-angleRange.x)*randoms.a;outAngle.x=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;\n#else\noutAngle=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;\n#endif \n#ifdef POINTEMITTER\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=vec3(0,0,0);newDirection=direction1+(direction2-direction1)*randoms3;\n#elif defined(BOXEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=minEmitBox+(maxEmitBox-minEmitBox)*randoms2;newDirection=direction1+(direction2-direction1)*randoms3; \n#elif defined(HEMISPHERICEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float phi=2.0*PI*randoms2.x;float theta=acos(2.0*randoms2.y-1.0);float randX=cos(phi)*sin(theta);float randY=cos(theta);float randZ=sin(phi)*sin(theta);newPosition=(radius-(radius*radiusRange*randoms2.z))*vec3(randX,abs(randY),randZ);newDirection=newPosition+directionRandomizer*randoms3; \n#elif defined(SPHEREEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float phi=2.0*PI*randoms2.x;float theta=acos(2.0*randoms2.y-1.0);float randX=cos(phi)*sin(theta);float randY=cos(theta);float randZ=sin(phi)*sin(theta);newPosition=(radius-(radius*radiusRange*randoms2.z))*vec3(randX,randY,randZ);\n#ifdef DIRECTEDSPHEREEMITTER\nnewDirection=direction1+(direction2-direction1)*randoms3;\n#else\nnewDirection=normalize(newPosition+directionRandomizer*randoms3);\n#endif\n#elif defined(CYLINDEREMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float yPos=(randoms2.x-0.5)*height;float angle=randoms2.y*PI*2.;float inverseRadiusRangeSquared=((1.-radiusRange)*(1.-radiusRange));float positionRadius=radius*sqrt(inverseRadiusRangeSquared+(randoms2.z*(1.-inverseRadiusRangeSquared)));float xPos=positionRadius*cos(angle);float zPos=positionRadius*sin(angle);newPosition=vec3(xPos,yPos,zPos);\n#ifdef DIRECTEDCYLINDEREMITTER\nnewDirection=direction1+(direction2-direction1)*randoms3;\n#else\nangle=angle+((randoms3.x-0.5)*PI)*directionRandomizer;newDirection=vec3(cos(angle),(randoms3.y-0.5)*directionRandomizer,sin(angle));newDirection=normalize(newDirection);\n#endif\n#elif defined(CONEEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);float s=2.0*PI*randoms2.x;\n#ifdef CONEEMITTERSPAWNPOINT\nfloat h=0.0001;\n#else\nfloat h=randoms2.y*height.y;h=1.-h*h; \n#endif\nfloat lRadius=radius.x-radius.x*randoms2.z*radius.y;lRadius=lRadius*h;float randX=lRadius*sin(s);float randZ=lRadius*cos(s);float randY=h *height.x;newPosition=vec3(randX,randY,randZ); \nvec3 randoms3=getRandomVec3(seed.z);\n#ifdef DIRECTEDCONEEMITTER\nnewDirection=direction1+(direction2-direction1)*randoms3;\n#else\nif (abs(cos(coneAngle))==1.0) {newDirection=vec3(0.,1.0,0.);} else {newDirection=normalize(newPosition+directionRandomizer*randoms3); }\n#endif\n#elif defined(CUSTOMEMITTER)\nnewPosition=initialPosition;outInitialPosition=initialPosition;\n#else \nnewPosition=vec3(0.,0.,0.);newDirection=2.0*(getRandomVec3(seed.w)-vec3(0.5,0.5,0.5));\n#endif\nfloat power=emitPower.x+(emitPower.y-emitPower.x)*randoms.a;\n#ifdef LOCAL\noutPosition=newPosition;\n#else\noutPosition=(emitterWM*vec4(newPosition,1.)).xyz;\n#endif\n#ifdef CUSTOMEMITTER\noutDirection=direction;\n#ifndef BILLBOARD \noutInitialDirection=direction;\n#endif\n#else\n#ifdef LOCAL\nvec3 initial=newDirection;\n#else \nvec3 initial=(emitterWM*vec4(newDirection,0.)).xyz;\n#endif\noutDirection=initial*power;\n#ifndef BILLBOARD \noutInitialDirection=initial;\n#endif\n#endif\n#ifdef ANIMATESHEET \noutCellIndex=cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\noutCellStartOffset=randoms.a*outLife;\n#endif \n#endif\n#ifdef NOISE\noutNoiseCoordinates1=noiseCoordinates1;outNoiseCoordinates2=noiseCoordinates2;\n#endif\n} else {float directionScale=timeDelta;outAge=newAge;float ageGradient=newAge/life;\n#ifdef VELOCITYGRADIENTS\ndirectionScale*=texture(velocityGradientSampler,vec2(ageGradient,0)).r;\n#endif\n#ifdef DRAGGRADIENTS\ndirectionScale*=1.0-texture(dragGradientSampler,vec2(ageGradient,0)).r;\n#endif\n#if defined(CUSTOMEMITTER)\noutPosition=position+(direction-position)*ageGradient; \noutInitialPosition=initialPosition;\n#else\noutPosition=position+direction*directionScale;\n#endif\noutLife=life;outSeed=seed;\n#ifndef COLORGRADIENTS \noutColor=color;\n#endif\n#ifdef SIZEGRADIENTS\noutSize.x=texture(sizeGradientSampler,vec2(ageGradient,0)).r;outSize.yz=size.yz;\n#else\noutSize=size;\n#endif \n#ifndef BILLBOARD \noutInitialDirection=initialDirection;\n#endif\n#ifdef CUSTOMEMITTER\noutDirection=direction;\n#else\nvec3 updatedDirection=direction+gravity*timeDelta;\n#ifdef FLOWMAP\nvec4 clipSpace=(flowMapProjection*vec4(position,1.));vec3 ndcSpace=clipSpace.xyz/clipSpace.w;vec2 flowMapUV=ndcSpace.xy*0.5+0.5;vec4 flowMapValue=texture(flowMapSampler,flowMapUV);vec3 flowMapDirection=(flowMapValue.xyz*2.0-1.0)*flowMapValue.w;updatedDirection+=flowMapDirection*timeDelta*flowMapStrength;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\nfloat limitVelocity=texture(limitVelocityGradientSampler,vec2(ageGradient,0)).r;float currentVelocity=length(updatedDirection);if (currentVelocity>limitVelocity) {updatedDirection=updatedDirection*limitVelocityDamping;}\n#endif\noutDirection=updatedDirection;\n#ifdef NOISE\nfloat fetchedR=texture(noiseSampler,vec2(noiseCoordinates1.x,noiseCoordinates1.y)*vec2(0.5)+vec2(0.5)).r;float fetchedG=texture(noiseSampler,vec2(noiseCoordinates1.z,noiseCoordinates2.x)*vec2(0.5)+vec2(0.5)).r;float fetchedB=texture(noiseSampler,vec2(noiseCoordinates2.y,noiseCoordinates2.z)*vec2(0.5)+vec2(0.5)).r;vec3 force=vec3(2.*fetchedR-1.,2.*fetchedG-1.,2.*fetchedB-1.)*noiseStrength;outDirection=outDirection+force*timeDelta;outNoiseCoordinates1=noiseCoordinates1;outNoiseCoordinates2=noiseCoordinates2;\n#endif \n#endif \n#ifdef ANGULARSPEEDGRADIENTS\nfloat angularSpeed=texture(angularSpeedGradientSampler,vec2(ageGradient,0)).r;outAngle=angle+angularSpeed*timeDelta;\n#else\noutAngle=vec2(angle.x+angle.y*timeDelta,angle.y);\n#endif\n#ifdef ANIMATESHEET \nfloat offsetAge=outAge;float dist=cellInfos.y-cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\noutCellStartOffset=cellStartOffset;offsetAge+=cellStartOffset;\n#else\nfloat cellStartOffset=0.;\n#endif \nfloat ratio=0.;if (cellInfos.w==1.0) {ratio=clamp(mod(cellStartOffset+cellInfos.z*offsetAge,life)/life,0.,1.0);}\nelse {ratio=clamp(cellStartOffset+cellInfos.z*offsetAge/life,0.,1.0);}\noutCellIndex=float(int(cellInfos.x+ratio*dist));\n#endif\n}}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const gpuUpdateParticlesVertexShader = { name, shader };\n"]}
1
+ {"version":3,"file":"gpuUpdateParticles.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/gpuUpdateParticles.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,gCAAgC,CAAC;AAC9C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoRZ,CAAC;AACJ,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"gpuUpdateParticlesVertexShader\";\nconst shader = `#version 300 es\n#define PI 3.14159\nuniform float currentCount;uniform float timeDelta;uniform float stopFactor;uniform float emitIndex;uniform float emitCount;\n#ifndef LOCAL\nuniform mat4 emitterWM;\n#endif\nuniform vec2 lifeTime;uniform vec2 emitPower;uniform vec2 sizeRange;uniform vec4 scaleRange;\n#ifdef FLOWMAP\nuniform mat4 flowMapProjection;uniform float flowMapStrength;uniform sampler2D flowMapSampler;\n#endif\n#ifndef COLORGRADIENTS\nuniform vec4 color1;uniform vec4 color2;\n#endif\nuniform vec3 gravity;uniform sampler2D randomSampler;uniform sampler2D randomSampler2;uniform vec4 angleRange;\n#ifdef BOXEMITTER\nuniform vec3 direction1;uniform vec3 direction2;uniform vec3 minEmitBox;uniform vec3 maxEmitBox;\n#endif\n#ifdef POINTEMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#endif\n#ifdef HEMISPHERICEMITTER\nuniform float radius;uniform float radiusRange;uniform float directionRandomizer;\n#endif\n#ifdef SPHEREEMITTER\nuniform float radius;uniform float radiusRange;\n#ifdef DIRECTEDSPHEREEMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#else\nuniform float directionRandomizer;\n#endif\n#endif\n#ifdef CYLINDEREMITTER\nuniform float radius;uniform float height;uniform float radiusRange;\n#ifdef DIRECTEDCYLINDEREMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#else\nuniform float directionRandomizer;\n#endif\n#endif\n#ifdef CONEEMITTER\nuniform vec2 radius;uniform float coneAngle;uniform vec2 height;\n#ifdef DIRECTEDCONEEMITTER\nuniform vec3 direction1;uniform vec3 direction2;\n#else\nuniform float directionRandomizer;\n#endif\n#endif\nin vec3 position;\n#ifdef CUSTOMEMITTER\nin vec3 initialPosition;\n#endif\nin float age;in float life;in vec4 seed;in vec3 size;\n#ifndef COLORGRADIENTS\nin vec4 color;\n#endif\nin vec3 direction;\n#ifndef BILLBOARD\nin vec3 initialDirection;\n#endif\n#ifdef ANGULARSPEEDGRADIENTS\nin float angle;\n#else\nin vec2 angle;\n#endif\n#ifdef ANIMATESHEET\nin float cellIndex;\n#ifdef ANIMATESHEETRANDOMSTART\nin float cellStartOffset;\n#endif\n#endif\n#ifdef NOISE\nin vec3 noiseCoordinates1;in vec3 noiseCoordinates2;\n#endif\nout vec3 outPosition;\n#ifdef CUSTOMEMITTER\nout vec3 outInitialPosition;\n#endif\nout float outAge;out float outLife;out vec4 outSeed;out vec3 outSize;\n#ifndef COLORGRADIENTS\nout vec4 outColor;\n#endif\nout vec3 outDirection;\n#ifndef BILLBOARD\nout vec3 outInitialDirection;\n#endif\n#ifdef ANGULARSPEEDGRADIENTS\nout float outAngle;\n#else\nout vec2 outAngle;\n#endif\n#ifdef ANIMATESHEET\nout float outCellIndex;\n#ifdef ANIMATESHEETRANDOMSTART\nout float outCellStartOffset;\n#endif\n#endif\n#ifdef NOISE\nout vec3 outNoiseCoordinates1;out vec3 outNoiseCoordinates2;\n#endif\n#ifdef SIZEGRADIENTS\nuniform sampler2D sizeGradientSampler;\n#endif \n#ifdef ANGULARSPEEDGRADIENTS\nuniform sampler2D angularSpeedGradientSampler;\n#endif \n#ifdef VELOCITYGRADIENTS\nuniform sampler2D velocityGradientSampler;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\nuniform sampler2D limitVelocityGradientSampler;uniform float limitVelocityDamping;\n#endif\n#ifdef DRAGGRADIENTS\nuniform sampler2D dragGradientSampler;\n#endif\n#ifdef NOISE\nuniform vec3 noiseStrength;uniform sampler2D noiseSampler;\n#endif\n#ifdef ANIMATESHEET\nuniform vec4 cellInfos;\n#endif\nvec3 getRandomVec3(float offset) {return texture(randomSampler2,vec2(float(gl_VertexID)*offset/currentCount,0)).rgb;}\nvec4 getRandomVec4(float offset) {return texture(randomSampler,vec2(float(gl_VertexID)*offset/currentCount,0));}\nvoid main() {float newAge=age+timeDelta;\n#ifdef EMITRATECTRL\nfloat particleIndex=float(gl_VertexID);float offsetFromEmitIndex=particleIndex-emitIndex;if (offsetFromEmitIndex<0.0) {offsetFromEmitIndex+=currentCount; }\nbool shouldEmit=offsetFromEmitIndex<emitCount && stopFactor != 0.;\n#else\nbool shouldEmit=newAge>=life && stopFactor != 0.;\n#endif\nif (shouldEmit) {vec3 newPosition;vec3 newDirection;vec4 randoms=getRandomVec4(seed.x);outLife=lifeTime.x+(lifeTime.y-lifeTime.x)*randoms.r;\n#ifdef EMITRATECTRL\noutAge=0.0;\n#else\noutAge=newAge-life;\n#endif\noutSeed=seed;\n#ifdef SIZEGRADIENTS \noutSize.x=texture(sizeGradientSampler,vec2(0,0)).r;\n#else\noutSize.x=sizeRange.x+(sizeRange.y-sizeRange.x)*randoms.g;\n#endif\noutSize.y=scaleRange.x+(scaleRange.y-scaleRange.x)*randoms.b;outSize.z=scaleRange.z+(scaleRange.w-scaleRange.z)*randoms.a; \n#ifndef COLORGRADIENTS\noutColor=color1+(color2-color1)*randoms.b;\n#endif\n#ifndef ANGULARSPEEDGRADIENTS \noutAngle.y=angleRange.x+(angleRange.y-angleRange.x)*randoms.a;outAngle.x=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;\n#else\noutAngle=angleRange.z+(angleRange.w-angleRange.z)*randoms.r;\n#endif \n#ifdef POINTEMITTER\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=vec3(0,0,0);newDirection=direction1+(direction2-direction1)*randoms3;\n#elif defined(BOXEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);newPosition=minEmitBox+(maxEmitBox-minEmitBox)*randoms2;newDirection=direction1+(direction2-direction1)*randoms3; \n#elif defined(HEMISPHERICEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float phi=2.0*PI*randoms2.x;float theta=acos(2.0*randoms2.y-1.0);float randX=cos(phi)*sin(theta);float randY=cos(theta);float randZ=sin(phi)*sin(theta);newPosition=(radius-(radius*radiusRange*randoms2.z))*vec3(randX,abs(randY),randZ);newDirection=newPosition+directionRandomizer*randoms3; \n#elif defined(SPHEREEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float phi=2.0*PI*randoms2.x;float theta=acos(2.0*randoms2.y-1.0);float randX=cos(phi)*sin(theta);float randY=cos(theta);float randZ=sin(phi)*sin(theta);newPosition=(radius-(radius*radiusRange*randoms2.z))*vec3(randX,randY,randZ);\n#ifdef DIRECTEDSPHEREEMITTER\nnewDirection=direction1+(direction2-direction1)*randoms3;\n#else\nnewDirection=normalize(newPosition+directionRandomizer*randoms3);\n#endif\n#elif defined(CYLINDEREMITTER)\nvec3 randoms2=getRandomVec3(seed.y);vec3 randoms3=getRandomVec3(seed.z);float yPos=(randoms2.x-0.5)*height;float angle=randoms2.y*PI*2.;float inverseRadiusRangeSquared=((1.-radiusRange)*(1.-radiusRange));float positionRadius=radius*sqrt(inverseRadiusRangeSquared+(randoms2.z*(1.-inverseRadiusRangeSquared)));float xPos=positionRadius*cos(angle);float zPos=positionRadius*sin(angle);newPosition=vec3(xPos,yPos,zPos);\n#ifdef DIRECTEDCYLINDEREMITTER\nnewDirection=direction1+(direction2-direction1)*randoms3;\n#else\nangle=angle+((randoms3.x-0.5)*PI)*directionRandomizer;newDirection=vec3(cos(angle),(randoms3.y-0.5)*directionRandomizer,sin(angle));newDirection=normalize(newDirection);\n#endif\n#elif defined(CONEEMITTER)\nvec3 randoms2=getRandomVec3(seed.y);float s=2.0*PI*randoms2.x;\n#ifdef CONEEMITTERSPAWNPOINT\nfloat h=0.0001;\n#else\nfloat h=randoms2.y*height.y;h=1.-h*h; \n#endif\nfloat lRadius=radius.x-radius.x*randoms2.z*radius.y;lRadius=lRadius*h;float randX=lRadius*sin(s);float randZ=lRadius*cos(s);float randY=h *height.x;newPosition=vec3(randX,randY,randZ); \nvec3 randoms3=getRandomVec3(seed.z);\n#ifdef DIRECTEDCONEEMITTER\nnewDirection=direction1+(direction2-direction1)*randoms3;\n#else\nif (abs(cos(coneAngle))==1.0) {newDirection=vec3(0.,1.0,0.);} else {newDirection=normalize(newPosition+directionRandomizer*randoms3); }\n#endif\n#elif defined(CUSTOMEMITTER)\nnewPosition=initialPosition;outInitialPosition=initialPosition;\n#else \nnewPosition=vec3(0.,0.,0.);newDirection=2.0*(getRandomVec3(seed.w)-vec3(0.5,0.5,0.5));\n#endif\nfloat power=emitPower.x+(emitPower.y-emitPower.x)*randoms.a;\n#ifdef LOCAL\noutPosition=newPosition;\n#else\noutPosition=(emitterWM*vec4(newPosition,1.)).xyz;\n#endif\n#ifdef CUSTOMEMITTER\noutDirection=direction;\n#ifndef BILLBOARD \noutInitialDirection=direction;\n#endif\n#else\n#ifdef LOCAL\nvec3 initial=newDirection;\n#else \nvec3 initial=(emitterWM*vec4(newDirection,0.)).xyz;\n#endif\noutDirection=initial*power;\n#ifndef BILLBOARD \noutInitialDirection=initial;\n#endif\n#endif\n#ifdef ANIMATESHEET \noutCellIndex=cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\noutCellStartOffset=randoms.a*outLife;\n#endif \n#endif\n#ifdef NOISE\noutNoiseCoordinates1=noiseCoordinates1;outNoiseCoordinates2=noiseCoordinates2;\n#endif\n} else {float directionScale=timeDelta;outAge=newAge;float ageGradient=newAge/life;\n#ifdef VELOCITYGRADIENTS\ndirectionScale*=texture(velocityGradientSampler,vec2(ageGradient,0)).r;\n#endif\n#ifdef DRAGGRADIENTS\ndirectionScale*=1.0-texture(dragGradientSampler,vec2(ageGradient,0)).r;\n#endif\n#if defined(CUSTOMEMITTER)\noutPosition=position+(direction-position)*ageGradient; \noutInitialPosition=initialPosition;\n#else\noutPosition=position+direction*directionScale;\n#endif\noutLife=life;outSeed=seed;\n#ifndef COLORGRADIENTS \noutColor=color;\n#endif\n#ifdef SIZEGRADIENTS\noutSize.x=texture(sizeGradientSampler,vec2(ageGradient,0)).r;outSize.yz=size.yz;\n#else\noutSize=size;\n#endif \n#ifndef BILLBOARD \noutInitialDirection=initialDirection;\n#endif\n#ifdef CUSTOMEMITTER\noutDirection=direction;\n#else\nvec3 updatedDirection=direction+gravity*timeDelta;\n#ifdef FLOWMAP\nvec4 clipSpace=(flowMapProjection*vec4(position,1.));vec3 ndcSpace=clipSpace.xyz/clipSpace.w;vec2 flowMapUV=ndcSpace.xy*0.5+0.5;vec4 flowMapValue=texture(flowMapSampler,flowMapUV);vec3 flowMapDirection=(flowMapValue.xyz*2.0-1.0)*flowMapValue.w;updatedDirection+=flowMapDirection*timeDelta*flowMapStrength;\n#endif\n#ifdef LIMITVELOCITYGRADIENTS\nfloat limitVelocity=texture(limitVelocityGradientSampler,vec2(ageGradient,0)).r;float currentVelocity=length(updatedDirection);if (currentVelocity>limitVelocity) {updatedDirection=updatedDirection*limitVelocityDamping;}\n#endif\noutDirection=updatedDirection;\n#ifdef NOISE\nfloat fetchedR=texture(noiseSampler,vec2(noiseCoordinates1.x,noiseCoordinates1.y)*vec2(0.5)+vec2(0.5)).r;float fetchedG=texture(noiseSampler,vec2(noiseCoordinates1.z,noiseCoordinates2.x)*vec2(0.5)+vec2(0.5)).r;float fetchedB=texture(noiseSampler,vec2(noiseCoordinates2.y,noiseCoordinates2.z)*vec2(0.5)+vec2(0.5)).r;vec3 force=vec3(2.*fetchedR-1.,2.*fetchedG-1.,2.*fetchedB-1.)*noiseStrength;outDirection=outDirection+force*timeDelta;outNoiseCoordinates1=noiseCoordinates1;outNoiseCoordinates2=noiseCoordinates2;\n#endif \n#endif \n#ifdef ANGULARSPEEDGRADIENTS\nfloat angularSpeed=texture(angularSpeedGradientSampler,vec2(ageGradient,0)).r;outAngle=angle+angularSpeed*timeDelta;\n#else\noutAngle=vec2(angle.x+angle.y*timeDelta,angle.y);\n#endif\n#ifdef ANIMATESHEET \nfloat offsetAge=outAge;float dist=cellInfos.y-cellInfos.x;\n#ifdef ANIMATESHEETRANDOMSTART\noutCellStartOffset=cellStartOffset;offsetAge+=cellStartOffset;\n#else\nfloat cellStartOffset=0.;\n#endif \nfloat ratio=0.;if (cellInfos.w==1.0) {ratio=clamp(mod(cellStartOffset+cellInfos.z*offsetAge,life)/life,0.,1.0);}\nelse {ratio=clamp(cellStartOffset+cellInfos.z*offsetAge/life,0.,1.0);}\noutCellIndex=float(int(cellInfos.x+ratio*dist));\n#endif\n}}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const gpuUpdateParticlesVertexShader = { name, shader };\n"]}
@@ -79,10 +79,20 @@ permute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }
79
79
  var stepDirection: f32=sign(delta.x);var invdx: f32=stepDirection/delta.x;var dP: vec2f= vec2f(stepDirection,delta.y*invdx);var dQ: vec3f=(Q1-Q0)*invdx;var dk: f32=(k1-k0)*invdx;var zMin: f32=min(csEndPoint.z,csOrigin.z);var zMax: f32=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;var pqk: vec4f= vec4f(P0,Q0.z,k0);var dPQK: vec4f= vec4f(dP,dQ.z,dk);*startPixel=select(P0.xy,P0.yx,permute);var prevZMaxEstimate: f32=csOrigin.z;var rayZMin: f32=prevZMaxEstimate;var rayZMax=prevZMaxEstimate;var sceneZMax: f32=rayZMax+1e4;var end: f32=P1.x*stepDirection;var hit: bool=false;var stepCount: f32;for (stepCount=0.0;(stepCount<=selfCollisionNumSkip) ||
80
80
  ((pqk.x*stepDirection)<=end &&
81
81
  stepCount<maxSteps &&
82
- !hit &&
83
- sceneZMax != 0.0);pqk+=dPQK
82
+ !hit);pqk+=dPQK
84
83
  )
85
- {*hitPixel=select(pqk.xy,pqk.yx,permute);rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;if (rayZMin>rayZMax) {
84
+ {*hitPixel=select(pqk.xy,pqk.yx,permute);
85
+ #ifndef SSRAYTRACE_CLIP_TO_FRUSTUM
86
+ if ((*hitPixel).x<0.0 || (*hitPixel).x>=csZBufferSize.x ||
87
+ (*hitPixel).y<0.0 || (*hitPixel).y>=csZBufferSize.y) { break; }
88
+ #endif
89
+ rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;
90
+ #ifdef SSRAYTRACE_RIGHT_HANDED_SCENE
91
+ if (prevZMaxEstimate<-farPlaneZ) { break; }
92
+ #else
93
+ if (prevZMaxEstimate>farPlaneZ) { break; }
94
+ #endif
95
+ if (rayZMin>rayZMax) {
86
96
  var t: f32=rayZMin; rayZMin=rayZMax; rayZMax=t;}
87
97
  sceneZMax=textureLoad(csZBuffer,vec2<i32>(*hitPixel),0).r;
88
98
  #ifdef SSRAYTRACE_SCREENSPACE_DEPTH
@@ -107,27 +117,28 @@ var sceneBackZ: f32=textureLoad(csZBackBuffer,vec2<i32>(*hitPixel/csZBackSizeFac
107
117
  sceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);
108
118
  #endif
109
119
  if (sceneBackZ==0.0) { sceneBackZ=1e8; }
110
- hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax) && (sceneZMax != 0.0);
120
+ hit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax);
111
121
  #else
112
122
  hit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);
113
123
  #endif
114
124
  #endif
115
125
  stepCount+=1.0;}
116
- pqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps || sceneZMax==0.0) {hit=false;}
126
+ pqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps) {hit=false;}
117
127
  #ifdef SSRAYTRACE_ENABLE_REFINEMENT
118
128
  if (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;var invStride: f32=1.0/stride;dPQK*=invStride;var refinementStepCount: f32=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||
119
129
  ((refinementStepCount<=stride*1.4) &&
120
- (rayZMax<sceneZMax) && (sceneZMax != 0.0));pqk+=dPQK)
130
+ (rayZMax<sceneZMax));pqk+=dPQK)
121
131
  {rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);*hitPixel=select(pqk.xy,pqk.yx,permute);sceneZMax=textureLoad(csZBuffer,vec2<i32>(*hitPixel),0).r;
122
132
  #ifdef SSRAYTRACE_SCREENSPACE_DEPTH
123
133
  sceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);
124
134
  #endif
135
+ if (sceneZMax==0.0) { sceneZMax=1e8; }
125
136
  refinementStepCount+=1.0;}
126
137
  pqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}
127
138
  #endif
128
139
  Q0=vec3f(Q0.xy+dQ.xy*stepCount,pqk.z);*csHitPoint=Q0/pqk.w;*numIterations=stepCount+1.0;
129
140
  #ifdef SSRAYTRACE_DEBUG
130
- if (((pqk.x+dPQK.x)*stepDirection)>end) {*debugColor= vec3f(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {*debugColor= vec3f(1,0,0);} else if (sceneZMax==0.0) {*debugColor= vec3f(1,1,0);} else {*debugColor= vec3f(0,stepCount/maxSteps,0);}
141
+ if (((pqk.x+dPQK.x)*stepDirection)>end) {*debugColor= vec3f(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {*debugColor= vec3f(1,0,0);} else if (!hit) {*debugColor= vec3f(1,1,0);} else {*debugColor= vec3f(0,stepCount/maxSteps,0);}
131
142
  #endif
132
143
  return hit;}
133
144
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"screenSpaceRayTrace.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"screenSpaceRayTrace\";\nconst shader = `fn distanceSquared(a: vec2f,b: vec2f)->f32 { \nvar temp=a-b; \nreturn dot(temp,temp); }\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nfn linearizeDepth(depth: f32,near: f32,far: f32)->f32 {\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nreturn -(near*far)/(far-depth*(far-near));\n#else\nreturn (near*far)/(far-depth*(far-near));\n#endif\n}\n#endif\n/**\n\\param csOrigin Camera-space ray origin,which must be \nwithin the view volume and must have z>0.01 and project within the valid screen rectangle\n\\param csDirection Unit length camera-space ray direction\n\\param projectToPixelMatrix A projection matrix that maps to **pixel** coordinates \n(**not** [-1,+1] normalized device coordinates).\n\\param csZBuffer The camera-space Z buffer\n\\param csZBufferSize Dimensions of csZBuffer\n\\param csZThickness Camera space csZThickness to ascribe to each pixel in the depth buffer\n\\param nearPlaneZ Positive number. Doesn't have to be THE actual near plane,just a reasonable value\nfor clipping rays headed towards the camera. Should be the actual near plane if screen-space depth is enabled.\n\\param farPlaneZ The far plane for the camera. Used when screen-space depth is enabled.\n\\param stride Step in horizontal or vertical pixels between samples. This is a var because: f32 integer math is slow on GPUs,but should be set to an integer>=1\n\\param jitterFraction Number between 0 and 1 for how far to bump the ray in stride units\nto conceal banding artifacts,plus the stride ray offset.\n\\param maxSteps Maximum number of iterations. Higher gives better images but may be slow\n\\param maxRayTraceDistance Maximum camera-space distance to trace before returning a miss\n\\param selfCollisionNumSkip Number of steps to skip at start when raytracing to avar self: voidnull collisions.\n1 is a reasonable value,depending on the scene you may need to set this value to 2\n\\param hitPixel Pixel coordinates of the first intersection with the scene\n\\param numIterations number of iterations performed\n\\param csHitPovar Camera: i32 space location of the ray hit\n*/\nfn traceScreenSpaceRay1(\ncsOrigin: vec3f,\ncsDirection: vec3f,\nprojectToPixelMatrix: mat4x4f,\ncsZBuffer: texture_2d<f32>,\ncsZBufferSize: vec2f,\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\ncsZBackBuffer: texture_2d<f32>,\ncsZBackSizeFactor: f32,\n#endif\ncsZThickness: f32,\nnearPlaneZ: f32,\nfarPlaneZ: f32,\nstride: f32,\njitterFraction: f32,\nmaxSteps: f32,\nmaxRayTraceDistance: f32,\nselfCollisionNumSkip: f32,\nstartPixel: ptr<function,vec2f>,\nhitPixel: ptr<function,vec2f>,\ncsHitPoint: ptr<function,vec3f>,\nnumIterations: ptr<function,f32>\n#ifdef SSRAYTRACE_DEBUG\n,debugColor: ptr<function,vec3f>\n#endif\n)->bool\n{\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nvar rayLength: f32=select(maxRayTraceDistance,(-nearPlaneZ-csOrigin.z)/csDirection.z,(csOrigin.z+csDirection.z*maxRayTraceDistance)>-nearPlaneZ);\n#else\nvar rayLength: f32=select(maxRayTraceDistance,(nearPlaneZ-csOrigin.z)/csDirection.z,(csOrigin.z+csDirection.z*maxRayTraceDistance)<nearPlaneZ);\n#endif\nvar csEndPoint: vec3f=csOrigin+csDirection*rayLength;*hitPixel= vec2f(-1.0,-1.0);var H0: vec4f=projectToPixelMatrix* vec4f(csOrigin,1.0);var H1: vec4f=projectToPixelMatrix* vec4f(csEndPoint,1.0);var k0: f32=1.0/H0.w;var k1: f32=1.0/H1.w;var Q0: vec3f=csOrigin*k0;var Q1: vec3f=csEndPoint*k1;var P0: vec2f=H0.xy*k0;var P1: vec2f=H1.xy*k1;\n#ifdef SSRAYTRACE_CLIP_TO_FRUSTUM\nvar xMax: f32=csZBufferSize.x-0.5;var xMin=0.5;var yMax=csZBufferSize.y-0.5;var yMin=0.5;var alpha: f32=0.0;if ((P1.y>yMax) || (P1.y<yMin)) {alpha=(P1.y-select(yMin,yMax,(P1.y>yMax)))/(P1.y-P0.y);}\nif ((P1.x>xMax) || (P1.x<xMin)) {alpha=max(alpha,(P1.x-select(xMin,xMax,(P1.x>xMax)))/(P1.x-P0.x));}\nP1=mix(P1,P0,alpha); k1=mix(k1,k0,alpha); Q1=mix(Q1,Q0,alpha);\n#endif\nP1+= vec2f(select(0.0,0.01,distanceSquared(P0,P1)<0.0001));var delta: vec2f=P1-P0;var permute: bool=false;if (abs(delta.x)<abs(delta.y)) { \npermute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }\nvar stepDirection: f32=sign(delta.x);var invdx: f32=stepDirection/delta.x;var dP: vec2f= vec2f(stepDirection,delta.y*invdx);var dQ: vec3f=(Q1-Q0)*invdx;var dk: f32=(k1-k0)*invdx;var zMin: f32=min(csEndPoint.z,csOrigin.z);var zMax: f32=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;var pqk: vec4f= vec4f(P0,Q0.z,k0);var dPQK: vec4f= vec4f(dP,dQ.z,dk);*startPixel=select(P0.xy,P0.yx,permute);var prevZMaxEstimate: f32=csOrigin.z;var rayZMin: f32=prevZMaxEstimate;var rayZMax=prevZMaxEstimate;var sceneZMax: f32=rayZMax+1e4;var end: f32=P1.x*stepDirection;var hit: bool=false;var stepCount: f32;for (stepCount=0.0;(stepCount<=selfCollisionNumSkip) ||\n((pqk.x*stepDirection)<=end &&\nstepCount<maxSteps &&\n!hit &&\nsceneZMax != 0.0);pqk+=dPQK \n)\n{*hitPixel=select(pqk.xy,pqk.yx,permute);rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;if (rayZMin>rayZMax) { \nvar t: f32=rayZMin; rayZMin=rayZMax; rayZMax=t;}\nsceneZMax=textureLoad(csZBuffer,vec2<i32>(*hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneZMax==0.0) { sceneZMax=1e8; }\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nvar sceneBackZ: f32=textureLoad(csZBackBuffer,vec2<i32>(*hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) { sceneBackZ=-1e8; }\nhit=(rayZMax>=sceneBackZ-csZThickness) && (rayZMin<=sceneZMax);\n#else\nhit=(rayZMax>=sceneZMax-csZThickness) && (rayZMin<=sceneZMax);\n#endif\n#else\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nvar sceneBackZ: f32=textureLoad(csZBackBuffer,vec2<i32>(*hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) { sceneBackZ=1e8; }\nhit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax) && (sceneZMax != 0.0);\n#else\nhit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);\n#endif\n#endif\nstepCount+=1.0;}\npqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps || sceneZMax==0.0) {hit=false;}\n#ifdef SSRAYTRACE_ENABLE_REFINEMENT\nif (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;var invStride: f32=1.0/stride;dPQK*=invStride;var refinementStepCount: f32=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||\n((refinementStepCount<=stride*1.4) &&\n(rayZMax<sceneZMax) && (sceneZMax != 0.0));pqk+=dPQK)\n{rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);*hitPixel=select(pqk.xy,pqk.yx,permute);sceneZMax=textureLoad(csZBuffer,vec2<i32>(*hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\nrefinementStepCount+=1.0;}\npqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}\n#endif\nQ0=vec3f(Q0.xy+dQ.xy*stepCount,pqk.z);*csHitPoint=Q0/pqk.w;*numIterations=stepCount+1.0;\n#ifdef SSRAYTRACE_DEBUG\nif (((pqk.x+dPQK.x)*stepDirection)>end) {*debugColor= vec3f(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {*debugColor= vec3f(1,0,0);} else if (sceneZMax==0.0) {*debugColor= vec3f(1,1,0);} else {*debugColor= vec3f(0,stepCount/maxSteps,0);}\n#endif\nreturn hit;}\n/**\ntexCoord: in the [0,1] range\ndepth: depth in view space (range [znear,zfar]])\n*/\nfn computeViewPosFromUVDepth(texCoord: vec2f,depth: f32,projection: mat4x4f,invProjectionMatrix: mat4x4f)->vec3f {var xy=texCoord*2.0-1.0;var z: f32;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef ORTHOGRAPHIC_CAMERA\nz=-projection[2].z*depth+projection[3].z;\n#else\nz=-projection[2].z-projection[3].z/depth;\n#endif\n#else\n#ifdef ORTHOGRAPHIC_CAMERA\nz=projection[2].z*depth+projection[3].z;\n#else\nz=projection[2].z+projection[3].z/depth;\n#endif\n#endif\nvar w=1.0;var ndc=vec4f(xy,z,w);var eyePos: vec4f=invProjectionMatrix*ndc;var result=eyePos.xyz/eyePos.w;return result;}\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStoreWGSL[name]) {\n ShaderStore.IncludesShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const screenSpaceRayTraceWGSL = { name, shader };\n"]}
1
+ {"version":3,"file":"screenSpaceRayTrace.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Jd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"screenSpaceRayTrace\";\nconst shader = `fn distanceSquared(a: vec2f,b: vec2f)->f32 { \nvar temp=a-b; \nreturn dot(temp,temp); }\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nfn linearizeDepth(depth: f32,near: f32,far: f32)->f32 {\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nreturn -(near*far)/(far-depth*(far-near));\n#else\nreturn (near*far)/(far-depth*(far-near));\n#endif\n}\n#endif\n/**\n\\param csOrigin Camera-space ray origin,which must be \nwithin the view volume and must have z>0.01 and project within the valid screen rectangle\n\\param csDirection Unit length camera-space ray direction\n\\param projectToPixelMatrix A projection matrix that maps to **pixel** coordinates \n(**not** [-1,+1] normalized device coordinates).\n\\param csZBuffer The camera-space Z buffer\n\\param csZBufferSize Dimensions of csZBuffer\n\\param csZThickness Camera space csZThickness to ascribe to each pixel in the depth buffer\n\\param nearPlaneZ Positive number. Doesn't have to be THE actual near plane,just a reasonable value\nfor clipping rays headed towards the camera. Should be the actual near plane if screen-space depth is enabled.\n\\param farPlaneZ The far plane for the camera. Used when screen-space depth is enabled.\n\\param stride Step in horizontal or vertical pixels between samples. This is a var because: f32 integer math is slow on GPUs,but should be set to an integer>=1\n\\param jitterFraction Number between 0 and 1 for how far to bump the ray in stride units\nto conceal banding artifacts,plus the stride ray offset.\n\\param maxSteps Maximum number of iterations. Higher gives better images but may be slow\n\\param maxRayTraceDistance Maximum camera-space distance to trace before returning a miss\n\\param selfCollisionNumSkip Number of steps to skip at start when raytracing to avar self: voidnull collisions.\n1 is a reasonable value,depending on the scene you may need to set this value to 2\n\\param hitPixel Pixel coordinates of the first intersection with the scene\n\\param numIterations number of iterations performed\n\\param csHitPovar Camera: i32 space location of the ray hit\n*/\nfn traceScreenSpaceRay1(\ncsOrigin: vec3f,\ncsDirection: vec3f,\nprojectToPixelMatrix: mat4x4f,\ncsZBuffer: texture_2d<f32>,\ncsZBufferSize: vec2f,\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\ncsZBackBuffer: texture_2d<f32>,\ncsZBackSizeFactor: f32,\n#endif\ncsZThickness: f32,\nnearPlaneZ: f32,\nfarPlaneZ: f32,\nstride: f32,\njitterFraction: f32,\nmaxSteps: f32,\nmaxRayTraceDistance: f32,\nselfCollisionNumSkip: f32,\nstartPixel: ptr<function,vec2f>,\nhitPixel: ptr<function,vec2f>,\ncsHitPoint: ptr<function,vec3f>,\nnumIterations: ptr<function,f32>\n#ifdef SSRAYTRACE_DEBUG\n,debugColor: ptr<function,vec3f>\n#endif\n)->bool\n{\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nvar rayLength: f32=select(maxRayTraceDistance,(-nearPlaneZ-csOrigin.z)/csDirection.z,(csOrigin.z+csDirection.z*maxRayTraceDistance)>-nearPlaneZ);\n#else\nvar rayLength: f32=select(maxRayTraceDistance,(nearPlaneZ-csOrigin.z)/csDirection.z,(csOrigin.z+csDirection.z*maxRayTraceDistance)<nearPlaneZ);\n#endif\nvar csEndPoint: vec3f=csOrigin+csDirection*rayLength;*hitPixel= vec2f(-1.0,-1.0);var H0: vec4f=projectToPixelMatrix* vec4f(csOrigin,1.0);var H1: vec4f=projectToPixelMatrix* vec4f(csEndPoint,1.0);var k0: f32=1.0/H0.w;var k1: f32=1.0/H1.w;var Q0: vec3f=csOrigin*k0;var Q1: vec3f=csEndPoint*k1;var P0: vec2f=H0.xy*k0;var P1: vec2f=H1.xy*k1;\n#ifdef SSRAYTRACE_CLIP_TO_FRUSTUM\nvar xMax: f32=csZBufferSize.x-0.5;var xMin=0.5;var yMax=csZBufferSize.y-0.5;var yMin=0.5;var alpha: f32=0.0;if ((P1.y>yMax) || (P1.y<yMin)) {alpha=(P1.y-select(yMin,yMax,(P1.y>yMax)))/(P1.y-P0.y);}\nif ((P1.x>xMax) || (P1.x<xMin)) {alpha=max(alpha,(P1.x-select(xMin,xMax,(P1.x>xMax)))/(P1.x-P0.x));}\nP1=mix(P1,P0,alpha); k1=mix(k1,k0,alpha); Q1=mix(Q1,Q0,alpha);\n#endif\nP1+= vec2f(select(0.0,0.01,distanceSquared(P0,P1)<0.0001));var delta: vec2f=P1-P0;var permute: bool=false;if (abs(delta.x)<abs(delta.y)) { \npermute=true;delta=delta.yx;P0=P0.yx;P1=P1.yx; }\nvar stepDirection: f32=sign(delta.x);var invdx: f32=stepDirection/delta.x;var dP: vec2f= vec2f(stepDirection,delta.y*invdx);var dQ: vec3f=(Q1-Q0)*invdx;var dk: f32=(k1-k0)*invdx;var zMin: f32=min(csEndPoint.z,csOrigin.z);var zMax: f32=max(csEndPoint.z,csOrigin.z);dP*=stride; dQ*=stride; dk*=stride;P0+=dP*jitterFraction; Q0+=dQ*jitterFraction; k0+=dk*jitterFraction;var pqk: vec4f= vec4f(P0,Q0.z,k0);var dPQK: vec4f= vec4f(dP,dQ.z,dk);*startPixel=select(P0.xy,P0.yx,permute);var prevZMaxEstimate: f32=csOrigin.z;var rayZMin: f32=prevZMaxEstimate;var rayZMax=prevZMaxEstimate;var sceneZMax: f32=rayZMax+1e4;var end: f32=P1.x*stepDirection;var hit: bool=false;var stepCount: f32;for (stepCount=0.0;(stepCount<=selfCollisionNumSkip) ||\n((pqk.x*stepDirection)<=end &&\nstepCount<maxSteps &&\n!hit);pqk+=dPQK \n)\n{*hitPixel=select(pqk.xy,pqk.yx,permute);\n#ifndef SSRAYTRACE_CLIP_TO_FRUSTUM\nif ((*hitPixel).x<0.0 || (*hitPixel).x>=csZBufferSize.x ||\n(*hitPixel).y<0.0 || (*hitPixel).y>=csZBufferSize.y) { break; }\n#endif\nrayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\nif (prevZMaxEstimate<-farPlaneZ) { break; }\n#else\nif (prevZMaxEstimate>farPlaneZ) { break; }\n#endif\nif (rayZMin>rayZMax) { \nvar t: f32=rayZMin; rayZMin=rayZMax; rayZMax=t;}\nsceneZMax=textureLoad(csZBuffer,vec2<i32>(*hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneZMax==0.0) { sceneZMax=1e8; }\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nvar sceneBackZ: f32=textureLoad(csZBackBuffer,vec2<i32>(*hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) { sceneBackZ=-1e8; }\nhit=(rayZMax>=sceneBackZ-csZThickness) && (rayZMin<=sceneZMax);\n#else\nhit=(rayZMax>=sceneZMax-csZThickness) && (rayZMin<=sceneZMax);\n#endif\n#else\n#ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER\nvar sceneBackZ: f32=textureLoad(csZBackBuffer,vec2<i32>(*hitPixel/csZBackSizeFactor),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneBackZ=linearizeDepth(sceneBackZ,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneBackZ==0.0) { sceneBackZ=1e8; }\nhit=(rayZMin<=sceneBackZ+csZThickness) && (rayZMax>=sceneZMax);\n#else\nhit=(rayZMin<=sceneZMax+csZThickness) && (rayZMax>=sceneZMax);\n#endif\n#endif\nstepCount+=1.0;}\npqk-=dPQK;stepCount-=1.0;if (((pqk.x+dPQK.x)*stepDirection)>end || (stepCount+1.0)>=maxSteps) {hit=false;}\n#ifdef SSRAYTRACE_ENABLE_REFINEMENT\nif (stride>1.0 && hit) {pqk-=dPQK;stepCount-=1.0;var invStride: f32=1.0/stride;dPQK*=invStride;var refinementStepCount: f32=0.0;prevZMaxEstimate=pqk.z/pqk.w;rayZMax=prevZMaxEstimate;sceneZMax=rayZMax+1e7;for (;refinementStepCount<=1.0 ||\n((refinementStepCount<=stride*1.4) &&\n(rayZMax<sceneZMax));pqk+=dPQK)\n{rayZMin=prevZMaxEstimate;rayZMax=(dPQK.z*0.5+pqk.z)/(dPQK.w*0.5+pqk.w);rayZMax=clamp(rayZMax,zMin,zMax);prevZMaxEstimate=rayZMax;rayZMax=max(rayZMax,rayZMin);*hitPixel=select(pqk.xy,pqk.yx,permute);sceneZMax=textureLoad(csZBuffer,vec2<i32>(*hitPixel),0).r;\n#ifdef SSRAYTRACE_SCREENSPACE_DEPTH\nsceneZMax=linearizeDepth(sceneZMax,nearPlaneZ,farPlaneZ);\n#endif\nif (sceneZMax==0.0) { sceneZMax=1e8; }\nrefinementStepCount+=1.0;}\npqk-=dPQK;refinementStepCount-=1.0;stepCount+=refinementStepCount/stride;}\n#endif\nQ0=vec3f(Q0.xy+dQ.xy*stepCount,pqk.z);*csHitPoint=Q0/pqk.w;*numIterations=stepCount+1.0;\n#ifdef SSRAYTRACE_DEBUG\nif (((pqk.x+dPQK.x)*stepDirection)>end) {*debugColor= vec3f(0,0,1);} else if ((stepCount+1.0)>=maxSteps) {*debugColor= vec3f(1,0,0);} else if (!hit) {*debugColor= vec3f(1,1,0);} else {*debugColor= vec3f(0,stepCount/maxSteps,0);}\n#endif\nreturn hit;}\n/**\ntexCoord: in the [0,1] range\ndepth: depth in view space (range [znear,zfar]])\n*/\nfn computeViewPosFromUVDepth(texCoord: vec2f,depth: f32,projection: mat4x4f,invProjectionMatrix: mat4x4f)->vec3f {var xy=texCoord*2.0-1.0;var z: f32;\n#ifdef SSRAYTRACE_RIGHT_HANDED_SCENE\n#ifdef ORTHOGRAPHIC_CAMERA\nz=-projection[2].z*depth+projection[3].z;\n#else\nz=-projection[2].z-projection[3].z/depth;\n#endif\n#else\n#ifdef ORTHOGRAPHIC_CAMERA\nz=projection[2].z*depth+projection[3].z;\n#else\nz=projection[2].z+projection[3].z/depth;\n#endif\n#endif\nvar w=1.0;var ndc=vec4f(xy,z,w);var eyePos: vec4f=invProjectionMatrix*ndc;var result=eyePos.xyz/eyePos.w;return result;}\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStoreWGSL[name]) {\n ShaderStore.IncludesShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const screenSpaceRayTraceWGSL = { name, shader };\n"]}
@@ -42,6 +42,8 @@ stopFactor : f32,
42
42
  randomTextureSize: i32,
43
43
  lifeTime : vec2<f32>,
44
44
  emitPower : vec2<f32>,
45
+ emitIndex : f32,
46
+ emitCount : f32,
45
47
  #ifndef COLORGRADIENTS
46
48
  color1 : vec4<f32>,
47
49
  color2 : vec4<f32>,
@@ -139,7 +141,20 @@ fn getRandomVec3(offset : f32,vertexID : f32)->vec3<f32> {return textureLoad(ran
139
141
  fn getRandomVec4(offset : f32,vertexID : f32)->vec4<f32> {return textureLoad(randomTexture,vec2<i32>(i32(vertexID*offset/params.currentCount*f32(params.randomTextureSize)) % params.randomTextureSize,0),0);}
140
142
  @compute @workgroup_size(64)
141
143
  fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {let index : u32=GlobalInvocationID.x;let vertexID : f32=f32(index);if (index>=u32(params.currentCount)) {return;}
142
- let PI : f32=3.14159;let timeDelta : f32=params.timeDelta;let newAge : f32=particlesIn.particles[index].age+timeDelta;let life : f32=particlesIn.particles[index].life;let seed : vec4<f32>=particlesIn.particles[index].seed;let direction : vec3<f32>=particlesIn.particles[index].direction;if (newAge>=life && params.stopFactor != 0.) {var newPosition : vec3<f32>;var newDirection : vec3<f32>;let randoms : vec4<f32>=getRandomVec4(seed.x,vertexID);let outLife : f32=params.lifeTime.x+(params.lifeTime.y-params.lifeTime.x)*randoms.r;particlesOut.particles[index].life=outLife;particlesOut.particles[index].age=newAge-life;particlesOut.particles[index].seed=seed;var sizex : f32;
144
+ let PI : f32=3.14159;let timeDelta : f32=params.timeDelta;let newAge : f32=particlesIn.particles[index].age+timeDelta;let life : f32=particlesIn.particles[index].life;let seed : vec4<f32>=particlesIn.particles[index].seed;let direction : vec3<f32>=particlesIn.particles[index].direction;
145
+ #ifdef EMITRATECTRL
146
+ var offsetFromEmitIndex : f32=vertexID-params.emitIndex;if (offsetFromEmitIndex<0.0) {offsetFromEmitIndex+=params.currentCount; }
147
+ let shouldEmit : bool=offsetFromEmitIndex<params.emitCount && params.stopFactor != 0.;
148
+ #else
149
+ let shouldEmit : bool=newAge>=life && params.stopFactor != 0.;
150
+ #endif
151
+ if (shouldEmit) {var newPosition : vec3<f32>;var newDirection : vec3<f32>;let randoms : vec4<f32>=getRandomVec4(seed.x,vertexID);let outLife : f32=params.lifeTime.x+(params.lifeTime.y-params.lifeTime.x)*randoms.r;particlesOut.particles[index].life=outLife;
152
+ #ifdef EMITRATECTRL
153
+ particlesOut.particles[index].age=0.0;
154
+ #else
155
+ particlesOut.particles[index].age=newAge-life;
156
+ #endif
157
+ particlesOut.particles[index].seed=seed;var sizex : f32;
143
158
  #ifdef SIZEGRADIENTS
144
159
  sizex=textureSampleLevel(sizeGradientTexture,sizeGradientSampler,vec2<f32>(0.,0.),0.).r;
145
160
  #else