@zephyr3d/scene 0.9.25 → 0.9.27

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 (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"water.js","sources":["../../src/scene/water.ts"],"sourcesContent":["import { Vector4 } from '@zephyr3d/base';\r\nimport type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, Vector3, DRef } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { GraphNode } from './graph_node';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport { Clipmap, FBMWaveGenerator } from '../render';\r\nimport { WaterMaterial } from '../material/water';\r\nimport type { AbstractDevice, BindGroup, FrameBuffer, GPUProgram, RenderStateSet } from '@zephyr3d/device';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport type { Camera } from '../camera';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Water scene node\r\n * @public\r\n */\r\nexport class Water extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _animationSpeed: number;\r\n private _timeStart: number;\r\n private _feedbackProgram: DRef<GPUProgram>;\r\n private _feedbackBindGroup: DRef<BindGroup>;\r\n private _feedbackPrimitive: DRef<Primitive>;\r\n private _feedbackRenderTarget: DRef<FrameBuffer>;\r\n private _feedbackRenderStates: Nullable<RenderStateSet>;\r\n private readonly _material: DRef<WaterMaterial>;\r\n /**\r\n * Creates an instance of Water node\r\n * @param scene - Scene object\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(32, []);\r\n this._renderData = null;\r\n this._gridScale = 1;\r\n this._animationSpeed = 1;\r\n this._timeStart = 0;\r\n this._material = new DRef(new WaterMaterial());\r\n this._material.get()!.region = new Vector4(-1, -1, 1, 1);\r\n this._material.get()!.TAAStrength = 0.4;\r\n this.waveGenerator = new FBMWaveGenerator();\r\n this._feedbackProgram = new DRef();\r\n this._feedbackBindGroup = new DRef();\r\n this._feedbackPrimitive = new DRef();\r\n this._feedbackRenderTarget = new DRef();\r\n this._feedbackRenderStates = null;\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /** Disposes the water node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap.dispose();\r\n this._renderData = null;\r\n this._feedbackBindGroup.dispose();\r\n this._feedbackPrimitive.dispose();\r\n this._feedbackProgram.dispose();\r\n this._feedbackRenderStates = null;\r\n if (this._feedbackRenderTarget.get()) {\r\n this._feedbackRenderTarget.get()!.getColorAttachment(0).dispose();\r\n this._feedbackRenderTarget.get()!.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._material.dispose();\r\n }\r\n /** Whether water should be drawn with lines */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val: boolean) {\r\n this._clipmap.wireframe = !!val;\r\n }\r\n /** Material of the water */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n /** Wave generator object of the water */\r\n get waveGenerator() {\r\n return this.material.waveGenerator;\r\n }\r\n set waveGenerator(waveGenerator) {\r\n this.material.waveGenerator = waveGenerator;\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n }\r\n }\r\n /** Animation speed of the water */\r\n get animationSpeed() {\r\n return this._animationSpeed;\r\n }\r\n set animationSpeed(val) {\r\n this._animationSpeed = val;\r\n }\r\n /** TAA strength of the water */\r\n get TAAStrength() {\r\n return this.material.TAAStrength;\r\n }\r\n set TAAStrength(val) {\r\n this.material.TAAStrength = val;\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number) {\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n if (this._timeStart === 0) {\r\n this._timeStart = elapsedInSeconds;\r\n }\r\n this.material.update(frameId, (elapsedInSeconds - this._timeStart) * this._animationSpeed);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (mat) {\r\n const that = this;\r\n this._renderData = this._clipmap.gather({\r\n camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: Math.max(0.01, this._gridScale),\r\n userData: this,\r\n frustumCulling: true,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n if (that.waveGenerator) {\r\n that.waveGenerator.calcClipmapTileAABB(minX, maxX, minZ, maxZ, p.y, outAABB);\r\n } else {\r\n outAABB.minPoint.setXYZ(minX, p.y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, p.y + 1, maxZ);\r\n }\r\n }\r\n });\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isWater}\r\n */\r\n isWater(): this is Water {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n if (mat.waveGenerator) {\r\n mat.waveGenerator.calcClipmapTileAABB(\r\n mat.region.x,\r\n mat.region.z,\r\n mat.region.y,\r\n mat.region.w,\r\n p.y,\r\n boundingBox\r\n );\r\n } else {\r\n boundingBox.minPoint.setXYZ(mat.region.x, p.y, mat.region.y);\r\n boundingBox.maxPoint.setXYZ(mat.region.z, p.y + 1, mat.region.w);\r\n }\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Grid scale\r\n */\r\n get gridScale() {\r\n return this._gridScale;\r\n }\r\n set gridScale(val) {\r\n this._gridScale = val;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n const material = this._material?.get();\r\n if (material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x;\r\n const pz = this.position.z;\r\n material.region = new Vector4(px - x, pz - z, px + x, pz + z);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n }\r\n }\r\n /**\r\n * Retreive the disturbed world position and normal at water surface\r\n */\r\n async getSurfacePoint(points: Vector3[], outPos?: Vector3[], outNorm?: Vector3[]) {\r\n const device = getDevice();\r\n if (!points || points.length === 0) {\r\n return;\r\n }\r\n points = points.map((v) => v.clone());\r\n await device.runNextFrameAsync(async () => {\r\n if (!this._feedbackProgram.get()) {\r\n this._feedbackProgram.set(this._createFeedbackProgram(device));\r\n this._feedbackBindGroup.set(device.createBindGroup(this._feedbackProgram.get()!.bindGroupLayouts[0]));\r\n }\r\n if (!this._feedbackPrimitive.get()) {\r\n this._feedbackPrimitive.set(new Primitive());\r\n this._feedbackPrimitive.get()!.primitiveType = 'point-list';\r\n }\r\n if (!this._feedbackRenderStates) {\r\n this._feedbackRenderStates = device.createRenderStateSet();\r\n this._feedbackRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._feedbackRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n const primitive = this._feedbackPrimitive.get()!;\r\n const vertices = new Float32Array(points.length * 4);\r\n for (let i = 0; i < points.length; i++) {\r\n vertices[i * 4 + 0] = points[i].x;\r\n vertices[i * 4 + 1] = points[i].y;\r\n vertices[i * 4 + 2] = points[i].z;\r\n vertices[i * 4 + 3] = i;\r\n }\r\n let vb = primitive.getVertexBuffer('position');\r\n if (!vb || vb.byteLength !== vertices.byteLength) {\r\n vb = device.createVertexBuffer('position_f32x4', vertices, { dynamic: true })!;\r\n primitive.setVertexBuffer(vb);\r\n } else {\r\n vb.bufferSubData(0, vertices);\r\n }\r\n const fb = this._feedbackRenderTarget.get();\r\n if (!fb || fb.getColorAttachment(0).width < points.length) {\r\n const rt0 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n const rt1 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n if (fb) {\r\n fb.getColorAttachment(0).dispose();\r\n fb.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._feedbackRenderTarget.set(device.createFrameBuffer([rt0, rt1], null));\r\n }\r\n primitive.indexCount = points.length;\r\n const bindGroup = this._feedbackBindGroup.get()!;\r\n bindGroup.setValue('textureWidth', this._feedbackRenderTarget.get()!.getWidth());\r\n this.waveGenerator!.applyWaterBindGroup(bindGroup);\r\n device.pushDeviceStates();\r\n device.setProgram(this._feedbackProgram.get());\r\n device.setBindGroup(0, this._feedbackBindGroup.get()!);\r\n device.setFramebuffer(this._feedbackRenderTarget.get());\r\n this._feedbackPrimitive.get()!.draw();\r\n device.popDeviceStates();\r\n const pos = new Float32Array(points.length * 4);\r\n const norm = new Float32Array(points.length * 4);\r\n await Promise.all([\r\n this._feedbackRenderTarget.get()!.getColorAttachment(0).readPixels(0, 0, points.length, 1, 0, 0, pos),\r\n this._feedbackRenderTarget.get()!.getColorAttachment(1).readPixels(0, 0, points.length, 1, 0, 0, norm)\r\n ]);\r\n for (let i = 0; i < points.length; i++) {\r\n if (outPos) {\r\n outPos[i].setXYZ(pos[i * 4 + 0], pos[i * 4 + 1], pos[i * 4 + 2]);\r\n }\r\n if (outNorm) {\r\n outNorm[i].setXYZ(norm[i * 4 + 0], norm[i * 4 + 1], norm[i * 4 + 2]);\r\n }\r\n }\r\n });\r\n }\r\n /** @internal */\r\n private _createFeedbackProgram(device: AbstractDevice) {\r\n const that = this;\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.position = pb.vec4().attrib('position');\r\n this.textureWidth = pb.float().uniform(0);\r\n that.waveGenerator!.setupUniforms(this, 0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.vec3();\r\n this.$l.worldNorm = pb.vec3();\r\n that.waveGenerator!.calcVertexPositionAndNormal(\r\n this,\r\n this.$inputs.position.xyz,\r\n this.worldPos,\r\n this.worldNorm\r\n );\r\n this.$outputs.worldPos = this.worldPos;\r\n this.$outputs.worldNorm = this.worldNorm;\r\n this.$outputs.xz = this.$inputs.position.xz;\r\n this.$l.ndcX = pb.sub(\r\n pb.mul(pb.div(pb.add(this.$inputs.position.w, 0.5), this.textureWidth), 2),\r\n 1\r\n );\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$l.$builtins.position = pb.vec4(this.ndcX, 0, 0, 1);\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.worldPos = pb.vec4();\r\n this.$outputs.worldNorm = pb.vec4();\r\n that.waveGenerator!.setupUniforms(this, 0);\r\n pb.main(function () {\r\n this.$outputs.worldPos = pb.vec4(this.$inputs.worldPos, 1);\r\n this.$outputs.worldNorm = pb.vec4(\r\n that.waveGenerator!.calcFragmentNormal(this, this.$inputs.xz, this.$inputs.worldNorm),\r\n 1\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = '@Water_Feedback';\r\n return program;\r\n }\r\n}\r\n"],"names":["Water","applyMixins","GraphNode","mixinDrawable","_pickTarget","_clipmap","_renderData","_gridScale","_animationSpeed","_timeStart","_feedbackProgram","_feedbackBindGroup","_feedbackPrimitive","_feedbackRenderTarget","_feedbackRenderStates","_material","scene","node","Clipmap","DRef","WaterMaterial","get","region","Vector4","TAAStrength","waveGenerator","FBMWaveGenerator","queuePerCameraUpdateNode","onDispose","dispose","getColorAttachment","wireframe","val","material","needUpdate","queueUpdateNode","animationSpeed","update","frameId","elapsedInSeconds","invalidateWorldBoundingVolume","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","gather","minMaxWorldPos","gridScale","Math","max","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","p","worldMatrix","transformPointAffine","Vector3","zero","calcClipmapTileAABB","y","minPoint","setXYZ","maxPoint","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isWater","computeBoundingVolume","computeWorldBoundingVolume","boundingBox","BoundingBox","x","z","w","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","_onTransformChanged","invalidateLocal","abs","scale","px","position","pz","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","info","primitive","numInstances","getSurfacePoint","points","outPos","outNorm","device","getDevice","length","map","v","clone","runNextFrameAsync","_createFeedbackProgram","createBindGroup","bindGroupLayouts","Primitive","primitiveType","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","vertices","Float32Array","i","vb","getVertexBuffer","byteLength","createVertexBuffer","dynamic","setVertexBuffer","bufferSubData","fb","width","rt0","createTexture2D","mipmapping","rt1","createFrameBuffer","indexCount","bindGroup","setValue","getWidth","applyWaterBindGroup","pushDeviceStates","setProgram","setBindGroup","setFramebuffer","popDeviceStates","pos","norm","Promise","all","readPixels","program","buildRenderProgram","vertex","pb","$inputs","vec4","attrib","textureWidth","float","uniform","setupUniforms","main","$l","worldPos","vec3","worldNorm","calcVertexPositionAndNormal","xyz","$outputs","xz","ndcX","sub","mul","div","add","type","$builtins","pointSize","fragment","calcFragmentNormal","name"],"mappings":"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"}
1
+ {"version":3,"file":"water.js","sources":["../../src/scene/water.ts"],"sourcesContent":["import { Vector4 } from '@zephyr3d/base';\r\nimport type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, Vector3, DRef } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { GraphNode } from './graph_node';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport { Clipmap, FBMWaveGenerator } from '../render';\r\nimport { setWaterSubmergence } from '../render/underwater';\r\nimport { WaterMaterial } from '../material/water';\r\nimport type { WaterDebugOutput, WaterRefractionMode } from '../material/water';\r\nimport type { AbstractDevice, BindGroup, FrameBuffer, GPUProgram, RenderStateSet } from '@zephyr3d/device';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport type { Camera } from '../camera';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** Mean earth radius in meters, for the horizon distance. @internal */\r\nconst EARTH_RADIUS = 6371000;\r\n/** Floor on the eye height feeding the horizon distance, in meters. @internal */\r\nconst MIN_HORIZON_EYE_HEIGHT = 0.1;\r\n/**\r\n * How far past the tessellated surface the skirt's outer edge is placed, as a\r\n * multiple of the view distance.\r\n *\r\n * Only has to be far enough that the ring reads as a horizon line rather than a\r\n * visible band; it is depth-pinned to the far plane regardless of how far out\r\n * it actually lands.\r\n * @internal\r\n */\r\nconst SKIRT_DISTANCE_FACTOR = 10;\r\n/**\r\n * Region rectangle standing in for \"no bounds\", matching the WaterMaterial\r\n * default. @internal\r\n */\r\nconst WHOLE_DOMAIN = new Vector4(-99999, -99999, 99999, 99999);\r\n\r\n/**\r\n * Water scene node\r\n * @public\r\n */\r\nexport class Water extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _viewDistance: number;\r\n private _animationSpeed: number;\r\n private _timeStart: number;\r\n /** Wave clock, in seconds. Advanced by `animationSpeed` per frame. */\r\n private _waveTime: number;\r\n /** Elapsed time at the previous update, for the frame delta. */\r\n private _lastUpdateTime: number;\r\n private _feedbackProgram: DRef<GPUProgram>;\r\n private _feedbackBindGroup: DRef<BindGroup>;\r\n private _feedbackPrimitive: DRef<Primitive>;\r\n private _feedbackRenderTarget: DRef<FrameBuffer>;\r\n private _feedbackRenderStates: Nullable<RenderStateSet>;\r\n private readonly _material: DRef<WaterMaterial>;\r\n /**\r\n * Whether each camera was inside this body of water on its previous update.\r\n *\r\n * The submerged test has a dead band around the surface, so it needs to know\r\n * which way it is crossing; per camera, because two views of one ocean can be\r\n * on opposite sides of it.\r\n */\r\n private readonly _submerged: WeakMap<Camera, boolean>;\r\n /**\r\n * Creates an instance of Water node\r\n * @param scene - Scene object\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(32, []);\r\n this._renderData = null;\r\n this._gridScale = 1;\r\n this._viewDistance = 0;\r\n this._animationSpeed = 1;\r\n this._timeStart = 0;\r\n this._waveTime = 0;\r\n this._lastUpdateTime = 0;\r\n this._material = new DRef(new WaterMaterial());\r\n this._material.get()!.region = new Vector4(-1, -1, 1, 1);\r\n this._material.get()!.TAAStrength = 0.4;\r\n this.waveGenerator = new FBMWaveGenerator();\r\n this._feedbackProgram = new DRef();\r\n this._feedbackBindGroup = new DRef();\r\n this._feedbackPrimitive = new DRef();\r\n this._feedbackRenderTarget = new DRef();\r\n this._feedbackRenderStates = null;\r\n this._submerged = new WeakMap();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /** Disposes the water node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap.dispose();\r\n this._renderData = null;\r\n this._feedbackBindGroup.dispose();\r\n this._feedbackPrimitive.dispose();\r\n this._feedbackProgram.dispose();\r\n this._feedbackRenderStates = null;\r\n if (this._feedbackRenderTarget.get()) {\r\n this._feedbackRenderTarget.get()!.getColorAttachment(0).dispose();\r\n this._feedbackRenderTarget.get()!.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._material.dispose();\r\n }\r\n /** Whether water should be drawn with lines */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val: boolean) {\r\n this._clipmap.wireframe = !!val;\r\n }\r\n /** Material of the water */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n /** Wave generator object of the water */\r\n get waveGenerator() {\r\n return this.material.waveGenerator;\r\n }\r\n set waveGenerator(waveGenerator) {\r\n this.material.waveGenerator = waveGenerator;\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * Whether the surface reads as an unbounded ocean reaching the horizon,\r\n * rather than a body of water ending at the node's extent.\r\n *\r\n * Off by default. A pond, a lake or a pool has an edge, and the region test\r\n * that draws it is skipped entirely while this is on.\r\n *\r\n * The horizon is reached without touching the camera's far plane: the\r\n * clipmap's outermost ring is drawn as a skirt whose outer vertices are\r\n * pushed well past it with their depth pinned to the far value. A far plane\r\n * sized for the near scene therefore keeps its depth precision.\r\n */\r\n get infinite() {\r\n return this.material.infinite;\r\n }\r\n set infinite(val: boolean) {\r\n if (!!val !== this.material.infinite) {\r\n this.material.infinite = !!val;\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n /**\r\n * How far the surface is built out from the camera while {@link infinite} is\r\n * on, in meters. 0 derives it from the true horizon distance for the camera's\r\n * height above the water.\r\n *\r\n * Raising it costs clipmap levels, which are logarithmic in the distance, so\r\n * the geometry cost of a much larger value is small. What it really trades is\r\n * against the sky's {@link SkyRenderer.aerialPerspectiveDistance}: build the\r\n * water out further than the aerial perspective LUT reaches and the far water\r\n * stops converging towards the sky colour, which puts back the hard band this\r\n * setting exists to remove.\r\n */\r\n get viewDistance() {\r\n return this._viewDistance;\r\n }\r\n set viewDistance(val: number) {\r\n this._viewDistance = Math.max(0, val);\r\n }\r\n /**\r\n * Animation speed of the water. Zero freezes the surface where it is rather\r\n * than resetting it: the wave phase is accumulated, and this scales the\r\n * increment.\r\n */\r\n get animationSpeed() {\r\n return this._animationSpeed;\r\n }\r\n set animationSpeed(val) {\r\n this._animationSpeed = val;\r\n }\r\n /** TAA strength of the water */\r\n get TAAStrength() {\r\n return this.material.TAAStrength;\r\n }\r\n set TAAStrength(val) {\r\n this.material.TAAStrength = val;\r\n }\r\n /**\r\n * Whether this water projects caustics onto the geometry below it.\r\n *\r\n * Needs a shadow-casting directional light and a WebGL2/WebGPU device; the\r\n * caustics pass switches itself off when either is missing, and when the sun\r\n * drops close to the horizon.\r\n */\r\n get causticsEnabled() {\r\n return this.material.causticsEnabled;\r\n }\r\n set causticsEnabled(val: boolean) {\r\n this.material.causticsEnabled = val;\r\n }\r\n /** Strength of the caustic contrast. 0 leaves the light unmodulated. */\r\n get causticsIntensity() {\r\n return this.material.causticsIntensity;\r\n }\r\n set causticsIntensity(val: number) {\r\n this.material.causticsIntensity = val;\r\n }\r\n /** Depth in meters below the surface where the caustics are in focus. */\r\n get causticsDepth() {\r\n return this.material.causticsDepth;\r\n }\r\n set causticsDepth(val: number) {\r\n this.material.causticsDepth = val;\r\n }\r\n /**\r\n * Whether caustics land on the scene rather than on a plane at\r\n * {@link causticsDepth}. WebGL2 keeps the plane regardless.\r\n */\r\n get causticsSceneDepth() {\r\n return this.material.causticsSceneDepth;\r\n }\r\n set causticsSceneDepth(val: boolean) {\r\n this.material.causticsSceneDepth = val;\r\n }\r\n /**\r\n * Furthest distance in meters from the camera the caustic map reaches.\r\n *\r\n * A cap rather than a fixed extent: the map is fitted to the part of the water\r\n * within this distance.\r\n */\r\n get causticsRange() {\r\n return this.material.causticsRange;\r\n }\r\n set causticsRange(val: number) {\r\n this.material.causticsRange = val;\r\n }\r\n /**\r\n * Width in meters of the band the caustics fade out over at the edge of the\r\n * map, or 0 to derive it from {@link causticsRange}.\r\n */\r\n get causticsFadeDistance() {\r\n return this.material.causticsFadeDistance;\r\n }\r\n set causticsFadeDistance(val: number) {\r\n this.material.causticsFadeDistance = val;\r\n }\r\n /**\r\n * How strongly caustic map texels are concentrated near the camera, 0 to\r\n * spread them evenly. Ignored while the map already fits the water within\r\n * {@link causticsRange}.\r\n */\r\n get causticsWarp() {\r\n return this.material.causticsWarp;\r\n }\r\n set causticsWarp(val: number) {\r\n this.material.causticsWarp = val;\r\n }\r\n /**\r\n * Whether a camera inside this body of water sees the water from the inside:\r\n * the medium applied to the whole scene, the sky replaced by water, and the\r\n * surface read from below with its Snell window.\r\n *\r\n * Uses the same medium coefficients the surface does ({@link absorption},\r\n * {@link scattering} and their scales), so the volume and the surface never\r\n * disagree. Atmospheric fog is suppressed while submerged - the medium the eye\r\n * is looking through is water, not air.\r\n *\r\n * Only reaches opaque geometry, like the atmospheric fog it replaces;\r\n * transparent surfaces are not tinted by the column in front of them.\r\n */\r\n get underwaterEnabled() {\r\n return this.material.underwaterEnabled;\r\n }\r\n set underwaterEnabled(val: boolean) {\r\n this.material.underwaterEnabled = val;\r\n }\r\n /**\r\n * Scale on the downwelling sky light that fills the water column, 1 for the\r\n * value the sky implies. This is what the water fades to in the distance, so\r\n * it also sets how bright the underwater haze reads.\r\n */\r\n get underwaterAmbientIntensity() {\r\n return this.material.underwaterAmbientIntensity;\r\n }\r\n set underwaterAmbientIntensity(val: number) {\r\n this.material.underwaterAmbientIntensity = val;\r\n }\r\n /**\r\n * Whether shafts of sunlight are marched through the water column.\r\n *\r\n * Reads the caustic map as the surface's transmittance, so the shafts carry\r\n * the same pattern that lands on the sea bed. Needs {@link causticsEnabled}\r\n * and everything it needs; switches itself off wherever the map is\r\n * unavailable.\r\n */\r\n get underwaterGodRays() {\r\n return this.material.underwaterGodRays;\r\n }\r\n set underwaterGodRays(val: boolean) {\r\n this.material.underwaterGodRays = val;\r\n }\r\n /** Strength of the light shafts, 1 for the value the medium implies. */\r\n get underwaterGodRayIntensity() {\r\n return this.material.underwaterGodRayIntensity;\r\n }\r\n set underwaterGodRayIntensity(val: number) {\r\n this.material.underwaterGodRayIntensity = val;\r\n }\r\n /**\r\n * Samples taken along each view ray for the light shafts. Raise it when the\r\n * shafts read as grain rather than as beams, which is what too few samples of\r\n * a sharp caustic pattern look like.\r\n */\r\n get underwaterGodRaySteps() {\r\n return this.material.underwaterGodRaySteps;\r\n }\r\n set underwaterGodRaySteps(val: number) {\r\n this.material.underwaterGodRaySteps = val;\r\n }\r\n /**\r\n * Whether geometry standing in the water breaks the light shafts. Off by\r\n * default.\r\n *\r\n * The shafts come from the caustic map, which describes what the *surface* did\r\n * to the sunlight and knows nothing about what is under it, so without this a\r\n * shaft runs straight through a piling or a hull. Costs a shadow map lookup\r\n * per march step, roughly doubling what the shafts cost. The sea bed's own\r\n * shadows are unaffected either way.\r\n */\r\n get underwaterGodRayShadow() {\r\n return this.material.underwaterGodRayShadow;\r\n }\r\n set underwaterGodRayShadow(val: boolean) {\r\n this.material.underwaterGodRayShadow = val;\r\n }\r\n /**\r\n * Half-width in meters of the dead band around the surface the submerged test\r\n * uses, so a camera sitting at water level does not flip state every frame.\r\n * The test is against the rest plane, not the displaced surface.\r\n */\r\n get underwaterHysteresis() {\r\n return this.material.underwaterHysteresis;\r\n }\r\n set underwaterHysteresis(val: number) {\r\n this.material.underwaterHysteresis = val;\r\n }\r\n /**\r\n * Strength of the sunlight scattered out of the water column towards the eye,\r\n * 1 for the value the medium coefficients imply.\r\n *\r\n * This is what makes a shadow falling on the water darken the water itself,\r\n * and a low sun tint it. 0 leaves the body lit by the environment alone.\r\n */\r\n get sunScatteringIntensity() {\r\n return this.material.sunScatteringIntensity;\r\n }\r\n set sunScatteringIntensity(val: number) {\r\n this.material.sunScatteringIntensity = val;\r\n }\r\n /**\r\n * Coverage of the foam that collects where the water meets a surface, 0 to\r\n * disable. Off by default.\r\n *\r\n * Independent of the crest foam the wave generator produces: this one is keyed\r\n * on how far the surface is from whatever is behind it, measured to that\r\n * surface's own plane - the depth of water over a bed, the horizontal distance\r\n * to a piling or a hull - so one band covers both the shoreline and the contact\r\n * line around anything standing in the water.\r\n * {@link shoreFoamWashAmount} is what makes it run up and drain back rather\r\n * than sit there as a rim.\r\n *\r\n * Estimated from the depth buffer, so it only knows about what the camera can\r\n * see: water in front of something standing above the surface gets no foam\r\n * rather than a guess. See {@link WaterMaterial.shoreFoamAmount}.\r\n */\r\n get shoreFoamAmount() {\r\n return this.material.shoreFoamAmount;\r\n }\r\n set shoreFoamAmount(val: number) {\r\n this.material.shoreFoamAmount = val;\r\n }\r\n /**\r\n * How far, in meters, the foam band reaches from the surface behind it. A depth\r\n * of water over a bed, a horizontal distance against anything vertical. How\r\n * wide that is on screen depends on the geometry: a thin line on a steep\r\n * drop-off, a broad stretch on a flat shelf.\r\n */\r\n get shoreFoamDepth() {\r\n return this.material.shoreFoamDepth;\r\n }\r\n set shoreFoamDepth(val: number) {\r\n this.material.shoreFoamDepth = val;\r\n }\r\n /**\r\n * Falloff across the band. Above 1 pushes the coverage towards the near end and\r\n * keeps the outer edge thin and broken.\r\n */\r\n get shoreFoamFalloff() {\r\n return this.material.shoreFoamFalloff;\r\n }\r\n set shoreFoamFalloff(val: number) {\r\n this.material.shoreFoamFalloff = val;\r\n }\r\n /**\r\n * Size of the clumps the band's edge breaks into, as cycles across the band.\r\n *\r\n * Relative to {@link shoreFoamDepth} rather than in cycles per metre, so one\r\n * setting reads the same on a shoreline metres across and on a collar a\r\n * handspan wide around a piling.\r\n */\r\n get shoreFoamScale() {\r\n return this.material.shoreFoamScale;\r\n }\r\n set shoreFoamScale(val: number) {\r\n this.material.shoreFoamScale = val;\r\n }\r\n /**\r\n * How far the band's edge runs back and forth, as a fraction of\r\n * {@link shoreFoamDepth}. 0 leaves a static band.\r\n */\r\n get shoreFoamWashAmount() {\r\n return this.material.shoreFoamWashAmount;\r\n }\r\n set shoreFoamWashAmount(val: number) {\r\n this.material.shoreFoamWashAmount = val;\r\n }\r\n /** Run-up cycles per second. Swell rather than wind waves, so well under 1. */\r\n get shoreFoamWashSpeed() {\r\n return this.material.shoreFoamWashSpeed;\r\n }\r\n set shoreFoamWashSpeed(val: number) {\r\n this.material.shoreFoamWashSpeed = val;\r\n }\r\n /**\r\n * Spatial frequency of the run-up phase, in cycles per meter. At 0 the whole\r\n * waterline advances in lockstep, which reads as the water level rising and\r\n * falling; a cycle every few tens of meters breaks it into sections.\r\n */\r\n get shoreFoamWashScale() {\r\n return this.material.shoreFoamWashScale;\r\n }\r\n set shoreFoamWashScale(val: number) {\r\n this.material.shoreFoamWashScale = val;\r\n }\r\n /**\r\n * How the refracted view sample is located. Defaults to `march`.\r\n *\r\n * `offset` drops the depth-buffer search - a fixed number of texture fetches\r\n * per water pixel - and displaces the screen UV by the wave normal instead.\r\n * The water still refracts, but to the wrong point: a submerged silhouette\r\n * smears rather than holding still. Set it on hardware that cannot afford the\r\n * search.\r\n */\r\n get refractionMode() {\r\n return this.material.refractionMode;\r\n }\r\n set refractionMode(val: WaterRefractionMode) {\r\n this.material.refractionMode = val;\r\n }\r\n /**\r\n * Which intermediate shading term to display instead of the final colour.\r\n * A debugging aid; leave it at `none` in production. See\r\n * {@link WaterDebugOutput} for the available views.\r\n */\r\n get debugOutput() {\r\n return this.material.debugOutput;\r\n }\r\n set debugOutput(val: WaterDebugOutput) {\r\n this.material.debugOutput = val;\r\n }\r\n /**\r\n * Depth in meters the cheap refraction mode assumes the water is, used only\r\n * when {@link refractionMode} is `offset`.\r\n *\r\n * Sets how strong the cheap distortion looks. A constant rather than the real\r\n * distance to the bottom, because an offset scaled by that distance paints a\r\n * second copy of anything breaking the surface.\r\n */\r\n get cheapRefractionDepth() {\r\n return this.material.cheapRefractionDepth;\r\n }\r\n set cheapRefractionDepth(val: number) {\r\n this.material.cheapRefractionDepth = val;\r\n }\r\n /**\r\n * Scale on how much the medium blurs what is seen through it, 1 for the width\r\n * the scattering coefficient and the path length imply. 0 keeps the background\r\n * sharp at any depth.\r\n */\r\n get refractionBlur() {\r\n return this.material.refractionBlur;\r\n }\r\n set refractionBlur(val: number) {\r\n this.material.refractionBlur = val;\r\n }\r\n /** Absorption coefficient sigma_a in 1/m, per RGB channel. */\r\n get absorption() {\r\n return this.material.absorption;\r\n }\r\n set absorption(val: Vector3) {\r\n this.material.absorption = val;\r\n }\r\n /** Scale for the absorption coefficient. */\r\n get absorptionScale() {\r\n return this.material.absorptionScale;\r\n }\r\n set absorptionScale(val: number) {\r\n this.material.absorptionScale = val;\r\n }\r\n /** Scattering coefficient sigma_s in 1/m, per RGB channel. */\r\n get scattering() {\r\n return this.material.scattering;\r\n }\r\n set scattering(val: Vector3) {\r\n this.material.scattering = val;\r\n }\r\n /** Scale for the scattering coefficient. */\r\n get scatteringScale() {\r\n return this.material.scatteringScale;\r\n }\r\n set scatteringScale(val: number) {\r\n this.material.scatteringScale = val;\r\n }\r\n /**\r\n * Mean cosine of a single scattering event in the water, in `[0, 0.95]`.\r\n *\r\n * 0 scatters equally in all directions; higher brightens the water when\r\n * looking towards the sun through it.\r\n */\r\n get scatterAnisotropy() {\r\n return this.material.scatterAnisotropy;\r\n }\r\n set scatterAnisotropy(val: number) {\r\n this.material.scatterAnisotropy = val;\r\n }\r\n /**\r\n * Artistic scale on the refracted view offset. 1 is physical, 0 disables it.\r\n *\r\n * The offset itself is derived: the view ray is refracted at the surface by\r\n * Snell's law, walked to whatever is behind the water, and the hit point is\r\n * projected back to the screen. That already accounts for the incidence angle,\r\n * the depth of the receiver and the perspective foreshortening, so this exists\r\n * only to dial the result back for a stylised look - not to make it correct.\r\n *\r\n * Values above 1 exaggerate; the surface stays continuous, but the sample can\r\n * wander far enough from the true hit point that the medium tint stops\r\n * matching what is visible through it.\r\n */\r\n get refractionScale() {\r\n return this.material.refractionScale;\r\n }\r\n set refractionScale(val) {\r\n this.material.refractionScale = val;\r\n }\r\n /**\r\n * Scale on the Fresnel reflectance, 1 for the physical value.\r\n *\r\n * Below 1 the surface reflects less than it should and shows more of what is\r\n * beneath it. Water reflects almost everything at a grazing angle, which is\r\n * physically right but can bury a sea bed the shot is about; this is the knob\r\n * that trades that reflection away. The F0 floor is scaled with it, so 0 gives\r\n * a surface with no specular response at all.\r\n */\r\n get reflectionStrength() {\r\n return this.material.reflectionStrength;\r\n }\r\n set reflectionStrength(val) {\r\n this.material.reflectionStrength = val;\r\n }\r\n /**\r\n * How much of a folded texel reads as foam.\r\n *\r\n * The wave generator reports where the surface has folded over on itself,\r\n * which is a measure of the fold rather than of area; this scales it into a\r\n * coverage fraction. 0 disables foam.\r\n */\r\n get foamAmount() {\r\n return this.material.foamAmount;\r\n }\r\n set foamAmount(val: number) {\r\n this.material.foamAmount = val;\r\n }\r\n /**\r\n * Falloff applied to foam coverage before it is scaled.\r\n *\r\n * Above 1 this pushes light folding towards no foam at all, so only a crest\r\n * that has genuinely broken shows any - which is what keeps a windy sea from\r\n * turning uniformly white.\r\n */\r\n get foamFalloff() {\r\n return this.material.foamFalloff;\r\n }\r\n set foamFalloff(val: number) {\r\n this.material.foamFalloff = val;\r\n }\r\n /** Diffuse albedo of the foam. */\r\n get foamColor() {\r\n return this.material.foamColor;\r\n }\r\n set foamColor(val: Vector3) {\r\n this.material.foamColor = val;\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number) {\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n if (this._timeStart === 0) {\r\n this._timeStart = elapsedInSeconds;\r\n }\r\n // A running clock rather than `elapsed * speed`: scaling the absolute\r\n // elapsed time by the speed makes a speed of zero freeze the surface at\r\n // the origin of the timeline instead of where it is, so pausing snapped\r\n // the waves back to their first frame. Accumulating the delta keeps the\r\n // phase where it was, and a speed of zero simply stops advancing it.\r\n this._waveTime +=\r\n Math.max(0, elapsedInSeconds - Math.max(this._timeStart, this._lastUpdateTime)) *\r\n this._animationSpeed;\r\n this._lastUpdateTime = elapsedInSeconds;\r\n this.material.update(frameId, this._waveTime);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (mat) {\r\n const that = this;\r\n const infinite = mat.infinite;\r\n let viewDistance = 0;\r\n if (infinite) {\r\n viewDistance = this._viewDistance > 0 ? this._viewDistance : this.horizonDistance(camera);\r\n // The skirt's outer edge sits beyond where the surface is tessellated,\r\n // so the band between them is what hides the last ring of geometry.\r\n mat.setSkirtDistance(viewDistance * SKIRT_DISTANCE_FACTOR);\r\n }\r\n this._renderData = this._clipmap.gather({\r\n camera,\r\n // An unbounded surface is not clipped to the node's extent, and the\r\n // region rectangle is what the clipmap would otherwise reject tiles\r\n // against. The material's own default is already this whole-domain\r\n // value; passing it keeps the two agreeing.\r\n minMaxWorldPos: infinite ? WHOLE_DOMAIN : mat.region,\r\n gridScale: Math.max(0.01, this._gridScale),\r\n userData: this,\r\n frustumCulling: true,\r\n viewDistance: infinite ? viewDistance : undefined,\r\n skirt: infinite,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n if (that.waveGenerator) {\r\n that.waveGenerator.calcClipmapTileAABB(minX, maxX, minZ, maxZ, p.y, outAABB);\r\n } else {\r\n outAABB.minPoint.setXYZ(minX, p.y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, p.y + 1, maxZ);\r\n }\r\n }\r\n });\r\n this.updateSubmergence(camera, mat);\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * Decide whether `camera` is inside this body of water and publish the result.\r\n *\r\n * Run from `updatePerCamera`, which the node re-queues every frame regardless\r\n * of culling - the state has to survive the surface leaving the frustum, which\r\n * is exactly what a camera on the sea bed looking down does to it.\r\n *\r\n * The test is against the rest plane rather than the displaced surface. Reading\r\n * the real wave height means a GPU readback ({@link Water.getSurfacePoint}) and\r\n * the frame or two of latency that comes with it; against that, the plane is\r\n * wrong only while the eye is within a wave height of the surface, which is\r\n * also the one case this feature deliberately does not try to render.\r\n *\r\n * A dead band of {@link WaterMaterial.underwaterHysteresis} around the plane\r\n * keeps an eye parked at water level from flipping state every frame: crossing\r\n * in has to reach below the band, crossing out has to reach above it.\r\n * @internal\r\n */\r\n private updateSubmergence(camera: Camera, mat: WaterMaterial) {\r\n const surfaceY = this.worldMatrix.transformPointAffine(Vector3.zero()).y;\r\n let submerged = false;\r\n if (!this.hidden && this.attached) {\r\n const camPos = camera.getWorldPosition();\r\n const region = mat.region;\r\n // An unbounded surface has no edge to fall outside of; a bounded one is\r\n // only entered from within its own footprint, so a camera beside a pool at\r\n // the height of its water is not in it.\r\n const inside =\r\n mat.infinite ||\r\n (camPos.x >= region.x && camPos.x <= region.z && camPos.z >= region.y && camPos.z <= region.w);\r\n if (inside) {\r\n const band = mat.underwaterHysteresis;\r\n submerged = this._submerged.get(camera) ? camPos.y < surfaceY + band : camPos.y < surfaceY - band;\r\n }\r\n }\r\n this._submerged.set(camera, submerged);\r\n setWaterSubmergence(camera, this, submerged, surfaceY);\r\n }\r\n /**\r\n * Distance to the true horizon for the camera's height above this water, in\r\n * meters.\r\n *\r\n * `sqrt(2 * R * h)` for earth's radius: about 5km from an eye 2m up, 25km\r\n * from 50m. Using the real figure rather than a constant is what makes the\r\n * horizon move correctly as the camera climbs, which is most of what sells\r\n * the scale of an ocean.\r\n * @internal\r\n */\r\n private horizonDistance(camera: Camera) {\r\n const camPos = camera.getWorldPosition();\r\n const waterLevel = this.worldMatrix.transformPointAffine(Vector3.zero()).y;\r\n // A camera below the surface still needs a surface to look at; the floor\r\n // also keeps the sqrt away from zero when the eye is exactly at water level.\r\n const height = Math.max(camPos.y - waterLevel, MIN_HORIZON_EYE_HEIGHT);\r\n return Math.sqrt(2 * EARTH_RADIUS * height);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n getSkinInfluenceData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needHiZNearest}\r\n */\r\n needHiZNearest() {\r\n return this._material.get()?.needHiZNearest() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isWater}\r\n */\r\n isWater(): this is Water {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const mat = this._material?.get();\r\n if (mat) {\r\n // An unbounded surface has no box to test. Null reaches the cull visitor\r\n // as ClipState.CLIPPED, which keeps the node in the queue and defers the\r\n // decision to the clipmap's per-tile culling - the only place that can\r\n // decide it, since the surface is built around wherever the camera is.\r\n if (mat.infinite) {\r\n return null;\r\n }\r\n const boundingBox = new BoundingBox();\r\n if (mat.waveGenerator) {\r\n mat.waveGenerator.calcClipmapTileAABB(\r\n mat.region.x,\r\n mat.region.z,\r\n mat.region.y,\r\n mat.region.w,\r\n p.y,\r\n boundingBox\r\n );\r\n } else {\r\n boundingBox.minPoint.setXYZ(mat.region.x, p.y, mat.region.y);\r\n boundingBox.maxPoint.setXYZ(mat.region.z, p.y + 1, mat.region.w);\r\n }\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Grid scale\r\n */\r\n get gridScale() {\r\n return this._gridScale;\r\n }\r\n set gridScale(val) {\r\n this._gridScale = val;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n const material = this._material?.get();\r\n if (material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x;\r\n const pz = this.position.z;\r\n material.region = new Vector4(px - x, pz - z, px + x, pz + z);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n }\r\n }\r\n /**\r\n * Retreive the disturbed world position and normal at water surface\r\n */\r\n async getSurfacePoint(points: Vector3[], outPos?: Vector3[], outNorm?: Vector3[]) {\r\n const device = getDevice();\r\n if (!points || points.length === 0) {\r\n return;\r\n }\r\n points = points.map((v) => v.clone());\r\n await device.runNextFrameAsync(async () => {\r\n if (!this._feedbackProgram.get()) {\r\n this._feedbackProgram.set(this._createFeedbackProgram(device));\r\n this._feedbackBindGroup.set(device.createBindGroup(this._feedbackProgram.get()!.bindGroupLayouts[0]));\r\n }\r\n if (!this._feedbackPrimitive.get()) {\r\n this._feedbackPrimitive.set(new Primitive());\r\n this._feedbackPrimitive.get()!.primitiveType = 'point-list';\r\n }\r\n if (!this._feedbackRenderStates) {\r\n this._feedbackRenderStates = device.createRenderStateSet();\r\n this._feedbackRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._feedbackRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n const primitive = this._feedbackPrimitive.get()!;\r\n const vertices = new Float32Array(points.length * 4);\r\n for (let i = 0; i < points.length; i++) {\r\n vertices[i * 4 + 0] = points[i].x;\r\n vertices[i * 4 + 1] = points[i].y;\r\n vertices[i * 4 + 2] = points[i].z;\r\n vertices[i * 4 + 3] = i;\r\n }\r\n let vb = primitive.getVertexBuffer('position');\r\n if (!vb || vb.byteLength !== vertices.byteLength) {\r\n vb = device.createVertexBuffer('position_f32x4', vertices, { dynamic: true })!;\r\n primitive.setVertexBuffer(vb);\r\n } else {\r\n vb.bufferSubData(0, vertices);\r\n }\r\n const fb = this._feedbackRenderTarget.get();\r\n if (!fb || fb.getColorAttachment(0).width < points.length) {\r\n const rt0 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n const rt1 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n if (fb) {\r\n fb.getColorAttachment(0).dispose();\r\n fb.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._feedbackRenderTarget.set(device.createFrameBuffer([rt0, rt1], null));\r\n }\r\n primitive.indexCount = points.length;\r\n const bindGroup = this._feedbackBindGroup.get()!;\r\n bindGroup.setValue('textureWidth', this._feedbackRenderTarget.get()!.getWidth());\r\n this.waveGenerator!.applyWaterBindGroup(bindGroup);\r\n device.pushDeviceStates();\r\n device.setProgram(this._feedbackProgram.get());\r\n device.setBindGroup(0, this._feedbackBindGroup.get()!);\r\n device.setFramebuffer(this._feedbackRenderTarget.get());\r\n this._feedbackPrimitive.get()!.draw();\r\n device.popDeviceStates();\r\n const pos = new Float32Array(points.length * 4);\r\n const norm = new Float32Array(points.length * 4);\r\n await Promise.all([\r\n this._feedbackRenderTarget.get()!.getColorAttachment(0).readPixels(0, 0, points.length, 1, 0, 0, pos),\r\n this._feedbackRenderTarget.get()!.getColorAttachment(1).readPixels(0, 0, points.length, 1, 0, 0, norm)\r\n ]);\r\n for (let i = 0; i < points.length; i++) {\r\n if (outPos) {\r\n outPos[i].setXYZ(pos[i * 4 + 0], pos[i * 4 + 1], pos[i * 4 + 2]);\r\n }\r\n if (outNorm) {\r\n outNorm[i].setXYZ(norm[i * 4 + 0], norm[i * 4 + 1], norm[i * 4 + 2]);\r\n }\r\n }\r\n });\r\n }\r\n /** @internal */\r\n private _createFeedbackProgram(device: AbstractDevice) {\r\n const that = this;\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.position = pb.vec4().attrib('position');\r\n this.textureWidth = pb.float().uniform(0);\r\n that.waveGenerator!.setupUniforms(this, 0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.vec3();\r\n this.$l.worldNorm = pb.vec3();\r\n that.waveGenerator!.calcVertexPositionAndNormal(\r\n this,\r\n this.$inputs.position.xyz,\r\n this.worldPos,\r\n this.worldNorm\r\n );\r\n this.$outputs.worldPos = this.worldPos;\r\n this.$outputs.worldNorm = this.worldNorm;\r\n this.$outputs.xz = this.$inputs.position.xz;\r\n this.$l.ndcX = pb.sub(\r\n pb.mul(pb.div(pb.add(this.$inputs.position.w, 0.5), this.textureWidth), 2),\r\n 1\r\n );\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$l.$builtins.position = pb.vec4(this.ndcX, 0, 0, 1);\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.worldPos = pb.vec4();\r\n this.$outputs.worldNorm = pb.vec4();\r\n that.waveGenerator!.setupUniforms(this, 0);\r\n pb.main(function () {\r\n this.$outputs.worldPos = pb.vec4(this.$inputs.worldPos, 1);\r\n this.$outputs.worldNorm = pb.vec4(\r\n that.waveGenerator!.calcFragmentNormal(this, this.$inputs.xz, this.$inputs.worldNorm),\r\n 1\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = '@Water_Feedback';\r\n return program;\r\n }\r\n}\r\n"],"names":["EARTH_RADIUS","MIN_HORIZON_EYE_HEIGHT","SKIRT_DISTANCE_FACTOR","WHOLE_DOMAIN","Vector4","Water","applyMixins","GraphNode","mixinDrawable","_pickTarget","_clipmap","_renderData","_gridScale","_viewDistance","_animationSpeed","_timeStart","_feedbackProgram","_feedbackBindGroup","_feedbackPrimitive","_feedbackRenderTarget","_feedbackRenderStates","_material","scene","node","Clipmap","_waveTime","_lastUpdateTime","DRef","WaterMaterial","get","region","TAAStrength","waveGenerator","FBMWaveGenerator","_submerged","WeakMap","queuePerCameraUpdateNode","onDispose","dispose","getColorAttachment","wireframe","val","material","needUpdate","queueUpdateNode","infinite","invalidateWorldBoundingVolume","viewDistance","Math","max","animationSpeed","causticsEnabled","causticsIntensity","causticsDepth","causticsSceneDepth","causticsRange","causticsFadeDistance","causticsWarp","underwaterEnabled","underwaterAmbientIntensity","underwaterGodRays","underwaterGodRayIntensity","underwaterGodRaySteps","underwaterGodRayShadow","underwaterHysteresis","sunScatteringIntensity","shoreFoamAmount","shoreFoamDepth","shoreFoamFalloff","shoreFoamScale","shoreFoamWashAmount","shoreFoamWashSpeed","shoreFoamWashScale","refractionMode","debugOutput","cheapRefractionDepth","refractionBlur","absorption","absorptionScale","scattering","scatteringScale","scatterAnisotropy","refractionScale","reflectionStrength","foamAmount","foamFalloff","foamColor","update","frameId","elapsedInSeconds","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","horizonDistance","setSkirtDistance","gather","minMaxWorldPos","gridScale","userData","frustumCulling","undefined","skirt","calcAABB","minX","maxX","minZ","maxZ","outAABB","p","worldMatrix","transformPointAffine","Vector3","zero","calcClipmapTileAABB","y","minPoint","setXYZ","maxPoint","updateSubmergence","surfaceY","submerged","hidden","attached","camPos","getWorldPosition","inside","x","z","w","band","set","setWaterSubmergence","waterLevel","height","sqrt","getPickTarget","getMorphData","getSkinInfluenceData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","needHiZNearest","getMaterial","getPrimitive","isWater","computeBoundingVolume","computeWorldBoundingVolume","boundingBox","BoundingBox","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","localMatrix","parent","m03","m13","m23","_onTransformChanged","invalidateLocal","abs","scale","px","position","pz","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","info","primitive","numInstances","getSurfacePoint","points","outPos","outNorm","device","getDevice","length","map","v","clone","runNextFrameAsync","_createFeedbackProgram","createBindGroup","bindGroupLayouts","Primitive","primitiveType","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","vertices","Float32Array","i","vb","getVertexBuffer","byteLength","createVertexBuffer","dynamic","setVertexBuffer","bufferSubData","fb","width","rt0","createTexture2D","mipmapping","rt1","createFrameBuffer","indexCount","bindGroup","setValue","getWidth","applyWaterBindGroup","pushDeviceStates","setProgram","setBindGroup","setFramebuffer","popDeviceStates","pos","norm","Promise","all","readPixels","program","buildRenderProgram","vertex","pb","$inputs","vec4","attrib","textureWidth","float","uniform","setupUniforms","main","$l","worldPos","vec3","worldNorm","calcVertexPositionAndNormal","xyz","$outputs","xz","ndcX","sub","mul","div","add","type","$builtins","pointSize","fragment","calcFragmentNormal","name"],"mappings":"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"}