@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":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst INSTANCE_BYTES = 4 * 4;\r\n/** Number of placement cells along each axis of a grass tile */\r\nconst TILE_CELLS = 64;\r\n/** Default number of placement cells per density map texel along each axis */\r\nconst DEFAULT_CELLS_PER_TEXEL = 2;\r\nconst MAX_CELLS_PER_TEXEL = 8;\r\n\r\n/**\r\n * Deterministic 2D integer hash, returns a value in [0, 1).\r\n * Grass placement derives everything (jitter, survival threshold, rotation)\r\n * from this hash so that blade positions are stable across edits and reloads.\r\n */\r\nfunction hashCell(x: number, z: number, seed: number): number {\r\n let h = (Math.imul(x, 0x27d4eb2d) ^ Math.imul(z, 0x165667b1) ^ Math.imul(seed, 0x9e3779b9)) | 0;\r\n h = Math.imul(h ^ (h >>> 15), 0x85ebca6b);\r\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35);\r\n h ^= h >>> 16;\r\n return (h >>> 0) / 4294967296;\r\n}\r\n\r\n/**\r\n * Grass blade instance buffer for a single tile\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private _numInstances: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._numInstances = 0;\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._numInstances;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n /**\r\n * Sets the packed instance data (x, y, sin, cos per instance)\r\n */\r\n setData(data: Float32Array<ArrayBuffer>, count: number) {\r\n this._numInstances = count;\r\n if (count === 0) {\r\n return;\r\n }\r\n const device = getDevice();\r\n const bytesRequired = count * INSTANCE_BYTES;\r\n let buffer = this._instanceBuffer.get();\r\n if (!buffer || buffer.byteLength < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n buffer.bufferSubData(0, data.subarray(0, count * 4));\r\n }\r\n draw() {\r\n if (this._numInstances > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._numInstances);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n *\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private static readonly _cullAABB = new AABB();\r\n private static readonly _visibleTiles: GrassInstances[] = [];\r\n private static readonly _instanceData = new Float32Array(TILE_CELLS * TILE_CELLS * 4);\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _seed: number;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private _densityWidth: number;\r\n private _densityHeight: number;\r\n private _cellsPerTexel: number;\r\n private _densityMap: Uint8Array;\r\n private readonly _tiles: Map<number, GrassInstances>;\r\n private _tilesX: number;\r\n private _tilesZ: number;\r\n private _numBlades: number;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param seed - Seed for deterministic blade placement, usually the layer index\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(\r\n terrain: ClipmapTerrain,\r\n seed: number,\r\n bladeWidth: number,\r\n bladeHeight: number,\r\n albedoMap?: Texture2D\r\n ) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._seed = seed;\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._densityWidth = Math.max(1, terrain.sizeX);\r\n this._densityHeight = Math.max(1, terrain.sizeZ);\r\n this._cellsPerTexel = DEFAULT_CELLS_PER_TEXEL;\r\n this._densityMap = new Uint8Array(this._densityWidth * this._densityHeight);\r\n this._tiles = new Map();\r\n this._tilesX = 0;\r\n this._tilesZ = 0;\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /** How many grass blades are currently generated in this layer */\r\n get numBlades() {\r\n return this._numBlades;\r\n }\r\n /**\r\n * Density map of this layer, one byte per texel (0 = no grass, 255 = full density).\r\n * Texel (x, z) covers the normalized terrain region [x/w..(x+1)/w, z/h..(z+1)/h].\r\n * After modifying the data, call {@link GrassLayer.updateDensityRegion} to\r\n * regenerate the affected blade instances.\r\n */\r\n get densityMap() {\r\n return this._densityMap;\r\n }\r\n /** Width of the density map in texels */\r\n get densityMapWidth() {\r\n return this._densityWidth;\r\n }\r\n /** Height of the density map in texels */\r\n get densityMapHeight() {\r\n return this._densityHeight;\r\n }\r\n /**\r\n * Number of placement cells per density map texel along each axis.\r\n * The maximum blade count per texel is the square of this value.\r\n */\r\n get cellsPerTexel() {\r\n return this._cellsPerTexel;\r\n }\r\n set cellsPerTexel(val: number) {\r\n val = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, val | 0));\r\n if (val !== this._cellsPerTexel) {\r\n this._cellsPerTexel = val;\r\n this.rebuild();\r\n }\r\n }\r\n /**\r\n * Replaces the density map and regenerates all blade instances\r\n * @param width - Density map width in texels\r\n * @param height - Density map height in texels\r\n * @param cellsPerTexel - Placement cells per texel along each axis\r\n * @param data - Density data, one byte per texel\r\n */\r\n setDensityData(width: number, height: number, cellsPerTexel: number, data: Uint8Array) {\r\n if (width < 1 || height < 1 || width * height !== data.length) {\r\n console.error('Invalid grass density data');\r\n return;\r\n }\r\n this._densityWidth = width;\r\n this._densityHeight = height;\r\n this._cellsPerTexel = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, cellsPerTexel | 0));\r\n this._densityMap = data;\r\n this.rebuild();\r\n }\r\n /**\r\n * Regenerates blade instances for all tiles overlapping a density map region\r\n * @param minTexelX - Minimum x texel of the region (inclusive)\r\n * @param minTexelZ - Minimum z texel of the region (inclusive)\r\n * @param maxTexelX - Maximum x texel of the region (exclusive)\r\n * @param maxTexelZ - Maximum z texel of the region (exclusive)\r\n */\r\n updateDensityRegion(minTexelX: number, minTexelZ: number, maxTexelX: number, maxTexelZ: number) {\r\n const k = this._cellsPerTexel;\r\n // expand by one texel to cover the bilinear sampling footprint\r\n const cx0 = Math.max(0, (minTexelX - 1) * k);\r\n const cz0 = Math.max(0, (minTexelZ - 1) * k);\r\n const cx1 = Math.min(this._densityWidth * k, (maxTexelX + 1) * k);\r\n const cz1 = Math.min(this._densityHeight * k, (maxTexelZ + 1) * k);\r\n if (cx1 <= cx0 || cz1 <= cz0) {\r\n return;\r\n }\r\n const tx0 = Math.floor(cx0 / TILE_CELLS);\r\n const tz0 = Math.floor(cz0 / TILE_CELLS);\r\n const tx1 = Math.min(this._tilesX, Math.ceil(cx1 / TILE_CELLS));\r\n const tz1 = Math.min(this._tilesZ, Math.ceil(cz1 / TILE_CELLS));\r\n for (let tz = tz0; tz < tz1; tz++) {\r\n for (let tx = tx0; tx < tx1; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /**\r\n * Regenerates blade instances for the entire layer\r\n */\r\n rebuild() {\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n for (let tz = 0; tz < this._tilesZ; tz++) {\r\n for (let tx = 0; tx < this._tilesX; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n for (const tile of this._tiles.values()) {\r\n tile.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private updateTileGrid() {\r\n this._tilesX = Math.ceil((this._densityWidth * this._cellsPerTexel) / TILE_CELLS);\r\n this._tilesZ = Math.ceil((this._densityHeight * this._cellsPerTexel) / TILE_CELLS);\r\n }\r\n /** @internal */\r\n private sampleDensity(u: number, v: number): number {\r\n const w = this._densityWidth;\r\n const h = this._densityHeight;\r\n const x = u * w - 0.5;\r\n const z = v * h - 0.5;\r\n const ix = Math.floor(x);\r\n const iz = Math.floor(z);\r\n const fx = x - ix;\r\n const fz = z - iz;\r\n const x0 = Math.min(Math.max(ix, 0), w - 1);\r\n const x1 = Math.min(Math.max(ix + 1, 0), w - 1);\r\n const z0 = Math.min(Math.max(iz, 0), h - 1);\r\n const z1 = Math.min(Math.max(iz + 1, 0), h - 1);\r\n const d = this._densityMap;\r\n const a = d[z0 * w + x0] + (d[z0 * w + x1] - d[z0 * w + x0]) * fx;\r\n const b = d[z1 * w + x0] + (d[z1 * w + x1] - d[z1 * w + x0]) * fx;\r\n return (a + (b - a) * fz) * (1 / 255);\r\n }\r\n /** @internal */\r\n private regionIsEmpty(cx0: number, cz0: number, cx1: number, cz1: number): boolean {\r\n const k = this._cellsPerTexel;\r\n const x0 = Math.max(0, Math.floor(cx0 / k) - 1);\r\n const z0 = Math.max(0, Math.floor(cz0 / k) - 1);\r\n const x1 = Math.min(this._densityWidth, Math.ceil(cx1 / k) + 1);\r\n const z1 = Math.min(this._densityHeight, Math.ceil(cz1 / k) + 1);\r\n for (let z = z0; z < z1; z++) {\r\n const rowBase = z * this._densityWidth;\r\n for (let x = x0; x < x1; x++) {\r\n if (this._densityMap[rowBase + x] !== 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /** @internal */\r\n private generateTile(tx: number, tz: number) {\r\n const k = this._cellsPerTexel;\r\n const cw = this._densityWidth * k;\r\n const ch = this._densityHeight * k;\r\n const cx0 = tx * TILE_CELLS;\r\n const cz0 = tz * TILE_CELLS;\r\n const cx1 = Math.min(cx0 + TILE_CELLS, cw);\r\n const cz1 = Math.min(cz0 + TILE_CELLS, ch);\r\n const key = tz * this._tilesX + tx;\r\n let tile = this._tiles.get(key);\r\n // fast path: nothing to generate if there is no tile yet and no density\r\n if (!tile && this.regionIsEmpty(cx0, cz0, cx1, cz1)) {\r\n return;\r\n }\r\n const data = GrassLayer._instanceData;\r\n const seed = this._seed * 4;\r\n let count = 0;\r\n for (let cz = cz0; cz < cz1; cz++) {\r\n for (let cx = cx0; cx < cx1; cx++) {\r\n const u = (cx + hashCell(cx, cz, seed)) / cw;\r\n const v = (cz + hashCell(cx, cz, seed + 1)) / ch;\r\n if (this.sampleDensity(u, v) > hashCell(cx, cz, seed + 2)) {\r\n const angle = hashCell(cx, cz, seed + 3) * Math.PI * 2;\r\n data[count * 4 + 0] = u;\r\n data[count * 4 + 1] = v;\r\n data[count * 4 + 2] = Math.sin(angle);\r\n data[count * 4 + 3] = Math.cos(angle);\r\n count++;\r\n }\r\n }\r\n }\r\n this._numBlades += count - (tile?.numInstances ?? 0);\r\n if (count === 0) {\r\n if (tile) {\r\n tile.dispose();\r\n this._tiles.delete(key);\r\n }\r\n } else {\r\n if (!tile) {\r\n tile = new GrassInstances(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!);\r\n this._tiles.set(key, tile);\r\n }\r\n tile.setData(data, count);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n const visible = GrassLayer._visibleTiles;\r\n visible.length = 0;\r\n const camera = ctx.camera;\r\n const cullAABB = GrassLayer._cullAABB;\r\n const cellsW = this._densityWidth * this._cellsPerTexel;\r\n const cellsH = this._densityHeight * this._cellsPerTexel;\r\n const rx = region.x;\r\n const rz = region.y;\r\n const rw = region.z - region.x;\r\n const rh = region.w - region.y;\r\n for (const [key, tile] of this._tiles) {\r\n const tx = key % this._tilesX;\r\n const tz = (key - tx) / this._tilesX;\r\n const u0 = (tx * TILE_CELLS) / cellsW;\r\n const v0 = (tz * TILE_CELLS) / cellsH;\r\n const u1 = Math.min(1, ((tx + 1) * TILE_CELLS) / cellsW);\r\n const v1 = Math.min(1, ((tz + 1) * TILE_CELLS) / cellsH);\r\n cullAABB.minPoint.setXYZ(rx + u0 * rw, minY, rz + v0 * rh);\r\n cullAABB.maxPoint.setXYZ(rx + u1 * rw, maxY, rz + v1 * rh);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n visible.push(tile);\r\n }\r\n }\r\n if (visible.length === 0) {\r\n return;\r\n }\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n for (const tile of visible) {\r\n tile.draw();\r\n }\r\n }\r\n visible.length = 0;\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._layers.reduce((sum, layer) => sum + layer.numBlades, 0);\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(\r\n this._terrain.get()!,\r\n this._layers.length,\r\n bladeWidth,\r\n bladeHeight,\r\n albedoMap\r\n );\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n"],"names":["INSTANCE_BYTES","TILE_CELLS","DEFAULT_CELLS_PER_TEXEL","MAX_CELLS_PER_TEXEL","hashCell","x","z","seed","h","Math","imul","GrassInstances","Disposable","_numInstances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","setBaseVertexBuffer","get","set","dispose","setData","data","count","device","getDevice","bytesRequired","buffer","byteLength","createVertexBuffer","Uint8Array","nextPowerOf2","bufferSubData","subarray","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","length","drawInstanced","onDispose","GrassLayer","_cullAABB","AABB","_visibleTiles","_instanceData","Float32Array","_material","_seed","_bladeWidth","_bladeHeight","_densityWidth","_densityHeight","_cellsPerTexel","_densityMap","_tiles","_tilesX","_tilesZ","_numBlades","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","max","sizeX","sizeZ","Map","updateTileGrid","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","numBlades","densityMap","densityMapWidth","densityMapHeight","cellsPerTexel","val","min","rebuild","setDensityData","console","error","updateDensityRegion","minTexelX","minTexelZ","maxTexelX","maxTexelZ","k","cx0","cz0","cx1","cz1","tx0","floor","tz0","tx1","ceil","tz1","tz","tx","generateTile","tile","values","clear","setBladeSize","sampleDensity","u","v","w","ix","iz","fx","fz","x0","x1","z0","z1","d","a","b","regionIsEmpty","rowBase","cw","ch","key","cz","cx","angle","PI","sin","cos","delete","_getIndexBuffer","createIndexBuffer","Uint16Array","r","t","c","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","visible","camera","cullAABB","cellsW","cellsH","rx","rz","y","rw","rh","u0","v0","u1","v1","minPoint","setXYZ","maxPoint","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","push","apply","pass","numPasses","bind","GrassRenderer","_terrain","_layers","DWeakRef","layer","numGrassBlades","reduce","sum","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","worldRegion"],"mappings":"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"}
1
+ {"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst INSTANCE_BYTES = 4 * 4;\r\n/** Number of placement cells along each axis of a grass tile */\r\nconst TILE_CELLS = 64;\r\n/** Default number of placement cells per density map texel along each axis */\r\nconst DEFAULT_CELLS_PER_TEXEL = 2;\r\nconst MAX_CELLS_PER_TEXEL = 8;\r\n\r\n/**\r\n * Deterministic 2D integer hash, returns a value in [0, 1).\r\n * Grass placement derives everything (jitter, survival threshold, rotation)\r\n * from this hash so that blade positions are stable across edits and reloads.\r\n */\r\nfunction hashCell(x: number, z: number, seed: number): number {\r\n let h = (Math.imul(x, 0x27d4eb2d) ^ Math.imul(z, 0x165667b1) ^ Math.imul(seed, 0x9e3779b9)) | 0;\r\n h = Math.imul(h ^ (h >>> 15), 0x85ebca6b);\r\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35);\r\n h ^= h >>> 16;\r\n return (h >>> 0) / 4294967296;\r\n}\r\n\r\n/**\r\n * Grass blade instance buffer for a single tile\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private _numInstances: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._numInstances = 0;\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._numInstances;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n /**\r\n * Sets the packed instance data (x, y, sin, cos per instance)\r\n */\r\n setData(data: Float32Array<ArrayBuffer>, count: number) {\r\n this._numInstances = count;\r\n if (count === 0) {\r\n return;\r\n }\r\n const device = getDevice();\r\n const bytesRequired = count * INSTANCE_BYTES;\r\n let buffer = this._instanceBuffer.get();\r\n if (!buffer || buffer.byteLength < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n buffer.bufferSubData(0, data.subarray(0, count * 4));\r\n }\r\n draw() {\r\n if (this._numInstances > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._numInstances);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n *\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private static readonly _cullAABB = new AABB();\r\n private static readonly _visibleTiles: GrassInstances[] = [];\r\n private static readonly _instanceData = new Float32Array(TILE_CELLS * TILE_CELLS * 4);\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _seed: number;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private _densityWidth: number;\r\n private _densityHeight: number;\r\n private _cellsPerTexel: number;\r\n private _densityMap: Uint8Array;\r\n private readonly _tiles: Map<number, GrassInstances>;\r\n private _tilesX: number;\r\n private _tilesZ: number;\r\n private _numBlades: number;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param seed - Seed for deterministic blade placement, usually the layer index\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(\r\n terrain: ClipmapTerrain,\r\n seed: number,\r\n bladeWidth: number,\r\n bladeHeight: number,\r\n albedoMap?: Texture2D\r\n ) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._seed = seed;\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._densityWidth = Math.max(1, terrain.sizeX);\r\n this._densityHeight = Math.max(1, terrain.sizeZ);\r\n this._cellsPerTexel = DEFAULT_CELLS_PER_TEXEL;\r\n this._densityMap = new Uint8Array(this._densityWidth * this._densityHeight);\r\n this._tiles = new Map();\r\n this._tilesX = 0;\r\n this._tilesZ = 0;\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /** How many grass blades are currently generated in this layer */\r\n get numBlades() {\r\n return this._numBlades;\r\n }\r\n /**\r\n * Density map of this layer, one byte per texel (0 = no grass, 255 = full density).\r\n * Texel (x, z) covers the normalized terrain region [x/w..(x+1)/w, z/h..(z+1)/h].\r\n * After modifying the data, call {@link GrassLayer.updateDensityRegion} to\r\n * regenerate the affected blade instances.\r\n */\r\n get densityMap() {\r\n return this._densityMap;\r\n }\r\n /** Width of the density map in texels */\r\n get densityMapWidth() {\r\n return this._densityWidth;\r\n }\r\n /** Height of the density map in texels */\r\n get densityMapHeight() {\r\n return this._densityHeight;\r\n }\r\n /**\r\n * Number of placement cells per density map texel along each axis.\r\n * The maximum blade count per texel is the square of this value.\r\n */\r\n get cellsPerTexel() {\r\n return this._cellsPerTexel;\r\n }\r\n set cellsPerTexel(val: number) {\r\n val = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, val | 0));\r\n if (val !== this._cellsPerTexel) {\r\n this._cellsPerTexel = val;\r\n this.rebuild();\r\n }\r\n }\r\n /**\r\n * Replaces the density map and regenerates all blade instances\r\n * @param width - Density map width in texels\r\n * @param height - Density map height in texels\r\n * @param cellsPerTexel - Placement cells per texel along each axis\r\n * @param data - Density data, one byte per texel\r\n */\r\n setDensityData(width: number, height: number, cellsPerTexel: number, data: Uint8Array) {\r\n if (width < 1 || height < 1 || width * height !== data.length) {\r\n console.error('Invalid grass density data');\r\n return;\r\n }\r\n this._densityWidth = width;\r\n this._densityHeight = height;\r\n this._cellsPerTexel = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, cellsPerTexel | 0));\r\n this._densityMap = data;\r\n this.rebuild();\r\n }\r\n /**\r\n * Regenerates blade instances for all tiles overlapping a density map region\r\n * @param minTexelX - Minimum x texel of the region (inclusive)\r\n * @param minTexelZ - Minimum z texel of the region (inclusive)\r\n * @param maxTexelX - Maximum x texel of the region (exclusive)\r\n * @param maxTexelZ - Maximum z texel of the region (exclusive)\r\n */\r\n updateDensityRegion(minTexelX: number, minTexelZ: number, maxTexelX: number, maxTexelZ: number) {\r\n const k = this._cellsPerTexel;\r\n // expand by one texel to cover the bilinear sampling footprint\r\n const cx0 = Math.max(0, (minTexelX - 1) * k);\r\n const cz0 = Math.max(0, (minTexelZ - 1) * k);\r\n const cx1 = Math.min(this._densityWidth * k, (maxTexelX + 1) * k);\r\n const cz1 = Math.min(this._densityHeight * k, (maxTexelZ + 1) * k);\r\n if (cx1 <= cx0 || cz1 <= cz0) {\r\n return;\r\n }\r\n const tx0 = Math.floor(cx0 / TILE_CELLS);\r\n const tz0 = Math.floor(cz0 / TILE_CELLS);\r\n const tx1 = Math.min(this._tilesX, Math.ceil(cx1 / TILE_CELLS));\r\n const tz1 = Math.min(this._tilesZ, Math.ceil(cz1 / TILE_CELLS));\r\n for (let tz = tz0; tz < tz1; tz++) {\r\n for (let tx = tx0; tx < tx1; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /**\r\n * Regenerates blade instances for the entire layer\r\n */\r\n rebuild() {\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n for (let tz = 0; tz < this._tilesZ; tz++) {\r\n for (let tx = 0; tx < this._tilesX; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n for (const tile of this._tiles.values()) {\r\n tile.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private updateTileGrid() {\r\n this._tilesX = Math.ceil((this._densityWidth * this._cellsPerTexel) / TILE_CELLS);\r\n this._tilesZ = Math.ceil((this._densityHeight * this._cellsPerTexel) / TILE_CELLS);\r\n }\r\n /** @internal */\r\n private sampleDensity(u: number, v: number): number {\r\n const w = this._densityWidth;\r\n const h = this._densityHeight;\r\n const x = u * w - 0.5;\r\n const z = v * h - 0.5;\r\n const ix = Math.floor(x);\r\n const iz = Math.floor(z);\r\n const fx = x - ix;\r\n const fz = z - iz;\r\n const x0 = Math.min(Math.max(ix, 0), w - 1);\r\n const x1 = Math.min(Math.max(ix + 1, 0), w - 1);\r\n const z0 = Math.min(Math.max(iz, 0), h - 1);\r\n const z1 = Math.min(Math.max(iz + 1, 0), h - 1);\r\n const d = this._densityMap;\r\n const a = d[z0 * w + x0] + (d[z0 * w + x1] - d[z0 * w + x0]) * fx;\r\n const b = d[z1 * w + x0] + (d[z1 * w + x1] - d[z1 * w + x0]) * fx;\r\n return (a + (b - a) * fz) * (1 / 255);\r\n }\r\n /** @internal */\r\n private regionIsEmpty(cx0: number, cz0: number, cx1: number, cz1: number): boolean {\r\n const k = this._cellsPerTexel;\r\n const x0 = Math.max(0, Math.floor(cx0 / k) - 1);\r\n const z0 = Math.max(0, Math.floor(cz0 / k) - 1);\r\n const x1 = Math.min(this._densityWidth, Math.ceil(cx1 / k) + 1);\r\n const z1 = Math.min(this._densityHeight, Math.ceil(cz1 / k) + 1);\r\n for (let z = z0; z < z1; z++) {\r\n const rowBase = z * this._densityWidth;\r\n for (let x = x0; x < x1; x++) {\r\n if (this._densityMap[rowBase + x] !== 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /** @internal */\r\n private generateTile(tx: number, tz: number) {\r\n const k = this._cellsPerTexel;\r\n const cw = this._densityWidth * k;\r\n const ch = this._densityHeight * k;\r\n const cx0 = tx * TILE_CELLS;\r\n const cz0 = tz * TILE_CELLS;\r\n const cx1 = Math.min(cx0 + TILE_CELLS, cw);\r\n const cz1 = Math.min(cz0 + TILE_CELLS, ch);\r\n const key = tz * this._tilesX + tx;\r\n let tile = this._tiles.get(key);\r\n // fast path: nothing to generate if there is no tile yet and no density\r\n if (!tile && this.regionIsEmpty(cx0, cz0, cx1, cz1)) {\r\n return;\r\n }\r\n const data = GrassLayer._instanceData;\r\n const seed = this._seed * 4;\r\n let count = 0;\r\n for (let cz = cz0; cz < cz1; cz++) {\r\n for (let cx = cx0; cx < cx1; cx++) {\r\n const u = (cx + hashCell(cx, cz, seed)) / cw;\r\n const v = (cz + hashCell(cx, cz, seed + 1)) / ch;\r\n if (this.sampleDensity(u, v) > hashCell(cx, cz, seed + 2)) {\r\n const angle = hashCell(cx, cz, seed + 3) * Math.PI * 2;\r\n data[count * 4 + 0] = u;\r\n data[count * 4 + 1] = v;\r\n data[count * 4 + 2] = Math.sin(angle);\r\n data[count * 4 + 3] = Math.cos(angle);\r\n count++;\r\n }\r\n }\r\n }\r\n this._numBlades += count - (tile?.numInstances ?? 0);\r\n if (count === 0) {\r\n if (tile) {\r\n tile.dispose();\r\n this._tiles.delete(key);\r\n }\r\n } else {\r\n if (!tile) {\r\n tile = new GrassInstances(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!);\r\n this._tiles.set(key, tile);\r\n }\r\n tile.setData(data, count);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n const visible = GrassLayer._visibleTiles;\r\n visible.length = 0;\r\n const camera = ctx.camera;\r\n const cullAABB = GrassLayer._cullAABB;\r\n const cellsW = this._densityWidth * this._cellsPerTexel;\r\n const cellsH = this._densityHeight * this._cellsPerTexel;\r\n const rx = region.x;\r\n const rz = region.y;\r\n const rw = region.z - region.x;\r\n const rh = region.w - region.y;\r\n for (const [key, tile] of this._tiles) {\r\n const tx = key % this._tilesX;\r\n const tz = (key - tx) / this._tilesX;\r\n const u0 = (tx * TILE_CELLS) / cellsW;\r\n const v0 = (tz * TILE_CELLS) / cellsH;\r\n const u1 = Math.min(1, ((tx + 1) * TILE_CELLS) / cellsW);\r\n const v1 = Math.min(1, ((tz + 1) * TILE_CELLS) / cellsH);\r\n cullAABB.minPoint.setXYZ(rx + u0 * rw, minY, rz + v0 * rh);\r\n cullAABB.maxPoint.setXYZ(rx + u1 * rw, maxY, rz + v1 * rh);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n visible.push(tile);\r\n }\r\n }\r\n if (visible.length === 0) {\r\n return;\r\n }\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n for (const tile of visible) {\r\n tile.draw();\r\n }\r\n }\r\n visible.length = 0;\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._layers.reduce((sum, layer) => sum + layer.numBlades, 0);\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(\r\n this._terrain.get()!,\r\n this._layers.length,\r\n bladeWidth,\r\n bladeHeight,\r\n albedoMap\r\n );\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n"],"names":["INSTANCE_BYTES","TILE_CELLS","DEFAULT_CELLS_PER_TEXEL","MAX_CELLS_PER_TEXEL","hashCell","x","z","seed","h","Math","imul","GrassInstances","Disposable","_numInstances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","setBaseVertexBuffer","get","set","dispose","setData","data","count","device","getDevice","bytesRequired","buffer","byteLength","createVertexBuffer","Uint8Array","nextPowerOf2","bufferSubData","subarray","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","length","drawInstanced","onDispose","GrassLayer","_cullAABB","AABB","_visibleTiles","_instanceData","Float32Array","_material","_seed","_bladeWidth","_bladeHeight","_densityWidth","_densityHeight","_cellsPerTexel","_densityMap","_tiles","_tilesX","_tilesZ","_numBlades","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","max","sizeX","sizeZ","Map","updateTileGrid","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","numBlades","densityMap","densityMapWidth","densityMapHeight","cellsPerTexel","val","min","rebuild","setDensityData","console","error","updateDensityRegion","minTexelX","minTexelZ","maxTexelX","maxTexelZ","k","cx0","cz0","cx1","cz1","tx0","floor","tz0","tx1","ceil","tz1","tz","tx","generateTile","tile","values","clear","setBladeSize","sampleDensity","u","v","w","ix","iz","fx","fz","x0","x1","z0","z1","d","a","b","regionIsEmpty","rowBase","cw","ch","key","cz","cx","angle","PI","sin","cos","delete","_getIndexBuffer","createIndexBuffer","Uint16Array","r","t","c","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","visible","camera","cullAABB","cellsW","cellsH","rx","rz","y","rw","rh","u0","v0","u1","v1","minPoint","setXYZ","maxPoint","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","push","apply","pass","numPasses","bind","GrassRenderer","_terrain","_layers","DWeakRef","layer","numGrassBlades","reduce","sum","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","worldRegion"],"mappings":"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"}
@@ -6,9 +6,12 @@ import '../../material/unlit.js';
6
6
  import '../../material/particle.js';
7
7
  import '../../material/subsurfaceprofile.js';
8
8
  import '../../material/skin.js';
9
+ import '../../material/eye.js';
9
10
  import '@zephyr3d/device';
10
11
  import { RENDER_PASS_TYPE_LIGHT } from '../../values.js';
11
12
  import { applyMaterialMixins, MeshMaterial } from '../../material/meshmaterial.js';
13
+ import '../../material/hair.js';
14
+ import '../../material/hairstrand.js';
12
15
  import '../../material/grassmaterial.js';
13
16
  import '../../material/terrain-cm.js';
14
17
  import '../../material/pbrmr.js';
@@ -1 +1 @@
1
- {"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
1
+ {"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
@@ -14,7 +14,10 @@ import '../../material/unlit.js';
14
14
  import '../../material/particle.js';
15
15
  import '../../material/subsurfaceprofile.js';
16
16
  import '../../material/skin.js';
17
+ import '../../material/eye.js';
17
18
  import '../../material/meshmaterial.js';
19
+ import '../../material/hair.js';
20
+ import '../../material/hairstrand.js';
18
21
  import '../../material/grassmaterial.js';
19
22
  import { ClipmapTerrainMaterial } from '../../material/terrain-cm.js';
20
23
  import '../../material/pbrmr.js';
@@ -261,6 +264,9 @@ class HeightBoundingGenerator extends RenderMipmap {
261
264
  */ getMorphData() {
262
265
  return null;
263
266
  }
267
+ getSkinInfluenceData() {
268
+ return null;
269
+ }
264
270
  /**
265
271
  * {@inheritDoc Drawable.getMorphInfo}
266
272
  */ getMorphInfo() {
@@ -1 +1 @@
1
- {"version":3,"file":"terrain-cm.js","sources":["../../../src/scene/terrain-cm/terrain-cm.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector4, applyMixins, Vector3, DRef, randomUUID } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\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 { Clipmap } from '../../render';\r\nimport { ClipmapTerrainMaterial } from '../../material/terrain-cm';\r\nimport { BoundingBox } from '../../utility/bounding_volume';\r\nimport {\r\n MAX_TERRAIN_MIPMAP_LEVELS,\r\n QUEUE_OPAQUE,\r\n RENDER_PASS_TYPE_OBJECT_COLOR,\r\n RENDER_PASS_TYPE_SHADOWMAP\r\n} from '../../values';\r\nimport type { BlitType } from '../../blitter';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { RenderMipmap } from '../../utility/rendermipmap';\r\nimport { GrassRenderer } from './grass';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nclass HeightMinMaxBlitter extends CopyBlitter {\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n return this.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType).xxxx as PBShaderExp;\r\n }\r\n}\r\n\r\nclass HeightBoundingGenerator extends RenderMipmap {\r\n renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n scope.$l.maxHeight = pb.max(pb.max(leftTop.r, rightTop.r), pb.max(leftBottom.r, rightBottom.r));\r\n scope.$l.minHeight = pb.min(pb.min(leftTop.g, rightTop.g), pb.min(leftBottom.g, rightBottom.g));\r\n return pb.vec4(scope.maxHeight, scope.minHeight, leftTop.r, 1);\r\n }\r\n}\r\n\r\n/**\r\n * ClipmapTerrain implements an efficient terrain rendering system using clipmaps.\r\n *\r\n * Clipmaps provide level-of-detail (LOD) rendering for large terrains by using\r\n * multiple nested grids at different resolutions. The terrain automatically\r\n * adjusts detail levels based on camera distance, providing high detail near\r\n * the camera and lower detail in the distance.\r\n *\r\n * Key features:\r\n * - Automatic LOD management based on camera position\r\n * - Support for height maps, splat maps, and detail textures\r\n * - Integrated grass rendering system\r\n *\r\n * @public\r\n */\r\nexport class ClipmapTerrain extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly _heightBoundingGenerator = new HeightBoundingGenerator();\r\n private static readonly _copyBlitter = new HeightMinMaxBlitter();\r\n private static readonly _tmpBuffer = new Float32Array(MAX_TERRAIN_MIPMAP_LEVELS * 2 * 4);\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 _material: DRef<ClipmapTerrainMaterial>;\r\n private _grassRenderer: DRef<GrassRenderer>;\r\n private _castShadow: boolean;\r\n private _sizeX: number;\r\n private _sizeZ: number;\r\n private _heightMapAssetId: string;\r\n private _splatMapAssetId: string;\r\n private _grassAssetId: string;\r\n private _minHeight: number;\r\n private _maxHeight: number;\r\n private _tmpTexture: DRef<Texture2D>;\r\n /**\r\n * Creates a new clipmap terrain instance.\r\n *\r\n * @param scene - Scene to add the terrain to\r\n * @param sizeX - Terrain width in world units (default: 256)\r\n * @param sizeZ - Terrain depth in world units (default: 256)\r\n * @param clipMapTileSize - Size of each clipmap tile in vertices (default: 64)\r\n * Larger values use more memory but reduce draw calls\r\n *\r\n */\r\n constructor(scene: Scene, sizeX = 256, sizeZ = 256, clipMapTileSize = 64) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(clipMapTileSize, ['tex1_f32'], MAX_TERRAIN_MIPMAP_LEVELS);\r\n this._renderData = null;\r\n this._grassRenderer = new DRef(new GrassRenderer(this));\r\n this._gridScale = 1;\r\n this._castShadow = true;\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this._heightMapAssetId = `assets/.embedded.dir/${this.persistentId}-heightmap.bin`;\r\n this._grassAssetId = `assets/.embedded.dir/${this.persistentId}-grass.bin`;\r\n this._splatMapAssetId = `assets/.embedded.dir/${this.persistentId}-splatmap.bin`;\r\n this._minHeight = 0;\r\n this._maxHeight = 0;\r\n this._material = new DRef(\r\n new ClipmapTerrainMaterial(this.createHeightMapTexture(this._sizeX, this._sizeZ))\r\n );\r\n this._tmpTexture = new DRef();\r\n this.updateRegion();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Gets the integrated grass renderer for this terrain.\r\n * The grass renderer handles vegetation rendering on the terrain surface.\r\n *\r\n * @returns The grass renderer instance\r\n */\r\n get grassRenderer() {\r\n return this._grassRenderer.get()!;\r\n }\r\n /**\r\n * Gets the maximum number of detail maps supported by the terrain material.\r\n * Detail maps provide surface texturing (grass, rock, sand, etc.).\r\n *\r\n * @returns Maximum number of detail maps\r\n */\r\n get MAX_DETAIL_MAP_COUNT() {\r\n return ClipmapTerrainMaterial.MAX_DETAIL_MAP_COUNT;\r\n }\r\n /**\r\n * Gets the asset ID for the height map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Height map asset ID\r\n * @internal\r\n */\r\n get heightMapAssetId() {\r\n if (!this._heightMapAssetId) {\r\n this._heightMapAssetId = randomUUID();\r\n }\r\n return this._heightMapAssetId;\r\n }\r\n /** @internal */\r\n set heightMapAssetId(val: string) {\r\n this._heightMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for the splat map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Splat map asset ID\r\n * @internal\r\n */\r\n get splatMapAssetId() {\r\n if (!this._splatMapAssetId) {\r\n this._splatMapAssetId = randomUUID();\r\n }\r\n return this._splatMapAssetId;\r\n }\r\n /** @internal */\r\n set splatMapAssetId(val: string) {\r\n this._splatMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for grass configuration.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Grass asset ID\r\n * @internal\r\n */\r\n get grassAssetId() {\r\n if (!this._grassAssetId) {\r\n this._grassAssetId = randomUUID();\r\n }\r\n return this._grassAssetId;\r\n }\r\n /** @internal */\r\n set grassAssetId(val: string) {\r\n this._grassAssetId = val;\r\n }\r\n /**\r\n * The current number of active detail maps.\r\n * Detail maps define different surface materials (grass, rock, etc.).\r\n *\r\n * @returns Number of active detail maps\r\n */\r\n get numDetailMaps() {\r\n return this.material?.numDetailMaps ?? 0;\r\n }\r\n set numDetailMaps(val) {\r\n if (this.material) {\r\n this.material.numDetailMaps = val;\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.clone} */\r\n async clone(): Promise<this> {\r\n throw new Error('Cloning clipmap terrain not implemented');\r\n }\r\n /**\r\n * Sets the terrain size.\r\n * Triggers height map resize if dimensions change.\r\n *\r\n * @param sizeX - New width\r\n * @param sizeZ - New depth\r\n */\r\n setSize(sizeX: number, sizeZ: number) {\r\n if (sizeX !== this._sizeX || sizeZ !== this._sizeZ) {\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val) {\r\n this._castShadow = !!val;\r\n }\r\n /** The terrain width. */\r\n get sizeX() {\r\n return this._sizeX;\r\n }\r\n set sizeX(val) {\r\n if (val !== this._sizeX) {\r\n this._sizeX = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The terrain depth. */\r\n get sizeZ() {\r\n return this._sizeZ;\r\n }\r\n set sizeZ(val) {\r\n if (val !== this._sizeZ) {\r\n this._sizeZ = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The current height map texture. */\r\n get heightMap() {\r\n return this.material?.heightMap ?? null;\r\n }\r\n set heightMap(val) {\r\n if (this.material && val) {\r\n this.material.heightMap = val;\r\n this.updateRegion();\r\n }\r\n }\r\n /** The splat map texture */\r\n get splatMap() {\r\n return this.material?.getSplatMap() ?? null;\r\n }\r\n /** Material instance of the terrain */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n /** whether wireframe rendering is enabled */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val) {\r\n this._clipmap.wireframe = val;\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?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return this.material ? !this.material.supportLighting() : false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.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.isClipmapTerrain}\r\n */\r\n isClipmapTerrain(): this is ClipmapTerrain {\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 if (this.material) {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const minHeight = this._minHeight * this.scale.y;\r\n const maxHeight = this._maxHeight * this.scale.y;\r\n return new BoundingBox(\r\n new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y),\r\n new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w)\r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * the actual world-space region covered by this terrain (After applying world transform).\r\n */\r\n get worldRegion(): Immutable<Vector4> {\r\n return this.material?.region ?? Vector4.zero();\r\n }\r\n /**\r\n * Calculates the local transformation matrix.\r\n * For terrains, this only includes translation.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n /**\r\n * Calculates the world transformation matrix.\r\n * Terrains inherit only translation from parent nodes.\r\n *\r\n * @param outMatrix - Output matrix to store the result\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 /**\r\n * Updates the terrain's bounding box by analyzing the height map.\r\n * This is an asynchronous operation that reads back GPU data.\r\n *\r\n * @param tmpTexture - Optional temporary texture to reuse (optimization)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Update bounding box after changing height map\r\n * terrain.heightMap = newHeightMap;\r\n * terrain.updateBoundingBox();\r\n * ```\r\n */\r\n updateBoundingBox() {\r\n const heightMap = this.heightMap;\r\n if (!heightMap) {\r\n return;\r\n }\r\n const device = getDevice();\r\n let tmp = this._tmpTexture.get();\r\n if (tmp && (tmp.width !== heightMap.width || tmp.height !== heightMap.height)) {\r\n this._tmpTexture.dispose();\r\n }\r\n if (!this._tmpTexture.get()) {\r\n tmp = getDevice().createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rg32f',\r\n heightMap.width,\r\n heightMap.height\r\n )!;\r\n tmp.name = 'TerrainBoundingBoxTexture';\r\n this._tmpTexture.set(tmp);\r\n }\r\n const tmpFB = device.createFrameBuffer([tmp!], null);\r\n ClipmapTerrain._copyBlitter.blit(heightMap, tmpFB, fetchSampler('clamp_nearest_nomip'));\r\n tmpFB.dispose();\r\n ClipmapTerrain._heightBoundingGenerator.render(tmp!);\r\n const data = new Float32Array(4);\r\n tmp!\r\n .readPixels(0, 0, 1, 1, 0, tmp!.mipLevelCount - 1, data)\r\n .then(() => {\r\n this._minHeight = data[0];\r\n this._maxHeight = data[1];\r\n this.invalidateWorldBoundingVolume(false);\r\n })\r\n .catch((_err) => {\r\n console.error('Read pixels failed');\r\n });\r\n }\r\n /** @internal */\r\n createHeightMapTexture(width: number, height: number) {\r\n return getDevice().createTexture2D(getDevice().type === 'webgl' ? 'rgba16f' : 'r16f', width, height)!;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.updateRegion();\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 return;\r\n }\r\n const that = this;\r\n const bv = this.getWorldBoundingVolume()!.toAABB();\r\n this._renderData = this._clipmap.gather({\r\n camera: camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: this._gridScale,\r\n userData: this,\r\n frustumCulling: !this.castShadow,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n outAABB.minPoint.setXYZ(minX, bv ? bv.minPoint.y : p.y - 9999, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, bv ? bv.maxPoint.y : p.y + 9999, maxZ);\r\n }\r\n });\r\n let maxMipLevel = 0;\r\n for (const info of this._renderData) {\r\n const buffer = info.primitive.getVertexBuffer('texCoord1')!;\r\n buffer.bufferSubData(0, info.mipLevels, 0, info.numInstances);\r\n if (info.maxMiplevel > maxMipLevel) {\r\n maxMipLevel = info.maxMiplevel;\r\n }\r\n }\r\n const levelAABB = this._clipmap.calcLevelAABB(camera, mat.region, this._gridScale);\r\n const cameraPos = camera.getWorldPosition();\r\n const tmpBuffer = ClipmapTerrain._tmpBuffer;\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n if (i === 0) {\r\n tmpBuffer[i * 8 + 0] = cameraPos.x;\r\n tmpBuffer[i * 8 + 1] = cameraPos.z;\r\n tmpBuffer[i * 8 + 2] = cameraPos.x;\r\n tmpBuffer[i * 8 + 3] = cameraPos.z;\r\n } else {\r\n const prevAABB = levelAABB[i - 1];\r\n tmpBuffer[i * 8 + 0] = prevAABB.minPoint.x;\r\n tmpBuffer[i * 8 + 1] = prevAABB.minPoint.z;\r\n tmpBuffer[i * 8 + 2] = prevAABB.maxPoint.x;\r\n tmpBuffer[i * 8 + 3] = prevAABB.maxPoint.z;\r\n }\r\n const currentAABB = levelAABB[i];\r\n tmpBuffer[i * 8 + 4] = 1 / (currentAABB.minPoint.x - tmpBuffer[i * 8 + 0]);\r\n tmpBuffer[i * 8 + 5] = 1 / (currentAABB.minPoint.z - tmpBuffer[i * 8 + 1]);\r\n tmpBuffer[i * 8 + 6] = 1 / (currentAABB.maxPoint.x - tmpBuffer[i * 8 + 2]);\r\n tmpBuffer[i * 8 + 7] = 1 / (currentAABB.maxPoint.z - tmpBuffer[i * 8 + 3]);\r\n }\r\n mat.setLevelData(tmpBuffer, 8 * (maxMipLevel + 1));\r\n\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Updates the terrain material region based on current position and scale.\r\n * Should be called after changing position, scale, or height map.\r\n */\r\n updateRegion() {\r\n if (this.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 + (this.parent?.worldMatrix.m03 ?? 0);\r\n const pz = this.position.z + (this.parent?.worldMatrix.m23 ?? 0);\r\n this._gridScale = Math.max(\r\n (x * this._sizeX) / this.material.heightMap.width,\r\n (z * this._sizeZ) / this.material.heightMap.height\r\n );\r\n this.material.update(new Vector4(px, pz, px + x * this._sizeX, pz + z * this._sizeZ), this.scale);\r\n this.grassRenderer.updateMaterial();\r\n }\r\n }\r\n /** {@inheritDoc Drawable.draw} */\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 if (\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_OBJECT_COLOR &&\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_SHADOWMAP\r\n ) {\r\n this.grassRenderer.draw(ctx);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private resizeHeightMap(sizeX: number, sizeZ: number) {\r\n if (this.material) {\r\n const oldHeightMap = this.material.heightMap;\r\n const device = getDevice();\r\n const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;\r\n sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;\r\n sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;\r\n if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {\r\n const newHeightMap = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n sizeX,\r\n sizeZ\r\n )!;\r\n const fb = device.createFrameBuffer([newHeightMap], null);\r\n ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));\r\n fb.dispose();\r\n this.heightMap = newHeightMap;\r\n this.updateBoundingBox();\r\n }\r\n }\r\n }\r\n /*\r\n private calcNormalHeightMap(): Texture2D {\r\n const device = getDevice();\r\n if (!ClipmapTerrain._normalHeightMapProgram) {\r\n ClipmapTerrain._normalHeightMapProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.texelSize = pb.vec2().uniform(0);\r\n this.terrainScale = pb.vec3().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('calcNormal', [pb.vec2('texCoord')], function () {\r\n this.$l.t = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.l = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.r = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.b = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.tx = pb.vec3(this.terrainScale.x, pb.mul(pb.sub(this.r, this.l), this.terrainScale.y), 0);\r\n this.$l.tz = pb.vec3(0, pb.mul(pb.sub(this.b, this.t), this.terrainScale.y), this.terrainScale.z);\r\n this.$l.normal = pb.normalize(pb.cross(this.tz, this.tx));\r\n this.$return(this.normal);\r\n });\r\n pb.main(function () {\r\n this.$l.normal = this.calcNormal(this.$inputs.uv);\r\n this.$outputs.outColor = pb.vec4(pb.add(pb.mul(this.normal, 0.5), pb.vec3(0.5)), 1);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n */\r\n /**\r\n * Disposes of all resources used by this terrain.\r\n * Should be called when the terrain is no longer needed.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap?.dispose();\r\n this._material?.dispose();\r\n this._grassRenderer?.dispose();\r\n }\r\n}\r\n"],"names":["HeightMinMaxBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","readTexel","xxxx","HeightBoundingGenerator","RenderMipmap","renderPixel","leftTop","rightTop","leftBottom","rightBottom","pb","$builder","$l","maxHeight","max","r","minHeight","min","g","vec4","ClipmapTerrain","applyMixins","GraphNode","mixinDrawable","_heightBoundingGenerator","_copyBlitter","_tmpBuffer","Float32Array","MAX_TERRAIN_MIPMAP_LEVELS","_pickTarget","_clipmap","_renderData","_gridScale","_material","_grassRenderer","_castShadow","_sizeX","_sizeZ","_heightMapAssetId","_splatMapAssetId","_grassAssetId","_minHeight","_maxHeight","_tmpTexture","scene","sizeX","sizeZ","clipMapTileSize","node","Clipmap","DRef","GrassRenderer","persistentId","ClipmapTerrainMaterial","createHeightMapTexture","updateRegion","queuePerCameraUpdateNode","grassRenderer","get","MAX_DETAIL_MAP_COUNT","heightMapAssetId","randomUUID","val","splatMapAssetId","grassAssetId","numDetailMaps","material","clone","Error","setSize","resizeHeightMap","castShadow","heightMap","splatMap","getSplatMap","wireframe","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isClipmapTerrain","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scale","y","BoundingBox","region","x","Math","z","w","worldRegion","Vector4","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","updateBoundingBox","device","getDevice","tmp","width","height","dispose","createTexture2D","name","tmpFB","createFrameBuffer","blit","fetchSampler","render","data","readPixels","mipLevelCount","then","invalidateWorldBoundingVolume","catch","_err","console","error","_onTransformChanged","invalidateLocal","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","bv","getWorldBoundingVolume","toAABB","gather","minMaxWorldPos","gridScale","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","minPoint","setXYZ","maxPoint","maxMipLevel","info","buffer","primitive","getVertexBuffer","bufferSubData","mipLevels","numInstances","maxMiplevel","levelAABB","calcLevelAABB","cameraPos","getWorldPosition","tmpBuffer","i","prevAABB","currentAABB","setLevelData","abs","px","position","pz","update","updateMaterial","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","renderPass","RENDER_PASS_TYPE_OBJECT_COLOR","RENDER_PASS_TYPE_SHADOWMAP","oldHeightMap","maxTextureSize","getDeviceCaps","textureCaps","newHeightMap","fb","onDispose"],"mappings":"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"}
1
+ {"version":3,"file":"terrain-cm.js","sources":["../../../src/scene/terrain-cm/terrain-cm.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector4, applyMixins, Vector3, DRef, randomUUID } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\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 { Clipmap } from '../../render';\r\nimport { ClipmapTerrainMaterial } from '../../material/terrain-cm';\r\nimport { BoundingBox } from '../../utility/bounding_volume';\r\nimport {\r\n MAX_TERRAIN_MIPMAP_LEVELS,\r\n QUEUE_OPAQUE,\r\n RENDER_PASS_TYPE_OBJECT_COLOR,\r\n RENDER_PASS_TYPE_SHADOWMAP\r\n} from '../../values';\r\nimport type { BlitType } from '../../blitter';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { RenderMipmap } from '../../utility/rendermipmap';\r\nimport { GrassRenderer } from './grass';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nclass HeightMinMaxBlitter extends CopyBlitter {\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n return this.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType).xxxx as PBShaderExp;\r\n }\r\n}\r\n\r\nclass HeightBoundingGenerator extends RenderMipmap {\r\n renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n scope.$l.maxHeight = pb.max(pb.max(leftTop.r, rightTop.r), pb.max(leftBottom.r, rightBottom.r));\r\n scope.$l.minHeight = pb.min(pb.min(leftTop.g, rightTop.g), pb.min(leftBottom.g, rightBottom.g));\r\n return pb.vec4(scope.maxHeight, scope.minHeight, leftTop.r, 1);\r\n }\r\n}\r\n\r\n/**\r\n * ClipmapTerrain implements an efficient terrain rendering system using clipmaps.\r\n *\r\n * Clipmaps provide level-of-detail (LOD) rendering for large terrains by using\r\n * multiple nested grids at different resolutions. The terrain automatically\r\n * adjusts detail levels based on camera distance, providing high detail near\r\n * the camera and lower detail in the distance.\r\n *\r\n * Key features:\r\n * - Automatic LOD management based on camera position\r\n * - Support for height maps, splat maps, and detail textures\r\n * - Integrated grass rendering system\r\n *\r\n * @public\r\n */\r\nexport class ClipmapTerrain extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly _heightBoundingGenerator = new HeightBoundingGenerator();\r\n private static readonly _copyBlitter = new HeightMinMaxBlitter();\r\n private static readonly _tmpBuffer = new Float32Array(MAX_TERRAIN_MIPMAP_LEVELS * 2 * 4);\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 _material: DRef<ClipmapTerrainMaterial>;\r\n private _grassRenderer: DRef<GrassRenderer>;\r\n private _castShadow: boolean;\r\n private _sizeX: number;\r\n private _sizeZ: number;\r\n private _heightMapAssetId: string;\r\n private _splatMapAssetId: string;\r\n private _grassAssetId: string;\r\n private _minHeight: number;\r\n private _maxHeight: number;\r\n private _tmpTexture: DRef<Texture2D>;\r\n /**\r\n * Creates a new clipmap terrain instance.\r\n *\r\n * @param scene - Scene to add the terrain to\r\n * @param sizeX - Terrain width in world units (default: 256)\r\n * @param sizeZ - Terrain depth in world units (default: 256)\r\n * @param clipMapTileSize - Size of each clipmap tile in vertices (default: 64)\r\n * Larger values use more memory but reduce draw calls\r\n *\r\n */\r\n constructor(scene: Scene, sizeX = 256, sizeZ = 256, clipMapTileSize = 64) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(clipMapTileSize, ['tex1_f32'], MAX_TERRAIN_MIPMAP_LEVELS);\r\n this._renderData = null;\r\n this._grassRenderer = new DRef(new GrassRenderer(this));\r\n this._gridScale = 1;\r\n this._castShadow = true;\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this._heightMapAssetId = `assets/.embedded.dir/${this.persistentId}-heightmap.bin`;\r\n this._grassAssetId = `assets/.embedded.dir/${this.persistentId}-grass.bin`;\r\n this._splatMapAssetId = `assets/.embedded.dir/${this.persistentId}-splatmap.bin`;\r\n this._minHeight = 0;\r\n this._maxHeight = 0;\r\n this._material = new DRef(\r\n new ClipmapTerrainMaterial(this.createHeightMapTexture(this._sizeX, this._sizeZ))\r\n );\r\n this._tmpTexture = new DRef();\r\n this.updateRegion();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Gets the integrated grass renderer for this terrain.\r\n * The grass renderer handles vegetation rendering on the terrain surface.\r\n *\r\n * @returns The grass renderer instance\r\n */\r\n get grassRenderer() {\r\n return this._grassRenderer.get()!;\r\n }\r\n /**\r\n * Gets the maximum number of detail maps supported by the terrain material.\r\n * Detail maps provide surface texturing (grass, rock, sand, etc.).\r\n *\r\n * @returns Maximum number of detail maps\r\n */\r\n get MAX_DETAIL_MAP_COUNT() {\r\n return ClipmapTerrainMaterial.MAX_DETAIL_MAP_COUNT;\r\n }\r\n /**\r\n * Gets the asset ID for the height map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Height map asset ID\r\n * @internal\r\n */\r\n get heightMapAssetId() {\r\n if (!this._heightMapAssetId) {\r\n this._heightMapAssetId = randomUUID();\r\n }\r\n return this._heightMapAssetId;\r\n }\r\n /** @internal */\r\n set heightMapAssetId(val: string) {\r\n this._heightMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for the splat map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Splat map asset ID\r\n * @internal\r\n */\r\n get splatMapAssetId() {\r\n if (!this._splatMapAssetId) {\r\n this._splatMapAssetId = randomUUID();\r\n }\r\n return this._splatMapAssetId;\r\n }\r\n /** @internal */\r\n set splatMapAssetId(val: string) {\r\n this._splatMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for grass configuration.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Grass asset ID\r\n * @internal\r\n */\r\n get grassAssetId() {\r\n if (!this._grassAssetId) {\r\n this._grassAssetId = randomUUID();\r\n }\r\n return this._grassAssetId;\r\n }\r\n /** @internal */\r\n set grassAssetId(val: string) {\r\n this._grassAssetId = val;\r\n }\r\n /**\r\n * The current number of active detail maps.\r\n * Detail maps define different surface materials (grass, rock, etc.).\r\n *\r\n * @returns Number of active detail maps\r\n */\r\n get numDetailMaps() {\r\n return this.material?.numDetailMaps ?? 0;\r\n }\r\n set numDetailMaps(val) {\r\n if (this.material) {\r\n this.material.numDetailMaps = val;\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.clone} */\r\n async clone(): Promise<this> {\r\n throw new Error('Cloning clipmap terrain not implemented');\r\n }\r\n /**\r\n * Sets the terrain size.\r\n * Triggers height map resize if dimensions change.\r\n *\r\n * @param sizeX - New width\r\n * @param sizeZ - New depth\r\n */\r\n setSize(sizeX: number, sizeZ: number) {\r\n if (sizeX !== this._sizeX || sizeZ !== this._sizeZ) {\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val) {\r\n this._castShadow = !!val;\r\n }\r\n /** The terrain width. */\r\n get sizeX() {\r\n return this._sizeX;\r\n }\r\n set sizeX(val) {\r\n if (val !== this._sizeX) {\r\n this._sizeX = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The terrain depth. */\r\n get sizeZ() {\r\n return this._sizeZ;\r\n }\r\n set sizeZ(val) {\r\n if (val !== this._sizeZ) {\r\n this._sizeZ = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The current height map texture. */\r\n get heightMap() {\r\n return this.material?.heightMap ?? null;\r\n }\r\n set heightMap(val) {\r\n if (this.material && val) {\r\n this.material.heightMap = val;\r\n this.updateRegion();\r\n }\r\n }\r\n /** The splat map texture */\r\n get splatMap() {\r\n return this.material?.getSplatMap() ?? null;\r\n }\r\n /** Material instance of the terrain */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n /** whether wireframe rendering is enabled */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val) {\r\n this._clipmap.wireframe = val;\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?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return this.material ? !this.material.supportLighting() : false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.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.isClipmapTerrain}\r\n */\r\n isClipmapTerrain(): this is ClipmapTerrain {\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 if (this.material) {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const minHeight = this._minHeight * this.scale.y;\r\n const maxHeight = this._maxHeight * this.scale.y;\r\n return new BoundingBox(\r\n new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y),\r\n new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w)\r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * the actual world-space region covered by this terrain (After applying world transform).\r\n */\r\n get worldRegion(): Immutable<Vector4> {\r\n return this.material?.region ?? Vector4.zero();\r\n }\r\n /**\r\n * Calculates the local transformation matrix.\r\n * For terrains, this only includes translation.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n /**\r\n * Calculates the world transformation matrix.\r\n * Terrains inherit only translation from parent nodes.\r\n *\r\n * @param outMatrix - Output matrix to store the result\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 /**\r\n * Updates the terrain's bounding box by analyzing the height map.\r\n * This is an asynchronous operation that reads back GPU data.\r\n *\r\n * @param tmpTexture - Optional temporary texture to reuse (optimization)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Update bounding box after changing height map\r\n * terrain.heightMap = newHeightMap;\r\n * terrain.updateBoundingBox();\r\n * ```\r\n */\r\n updateBoundingBox() {\r\n const heightMap = this.heightMap;\r\n if (!heightMap) {\r\n return;\r\n }\r\n const device = getDevice();\r\n let tmp = this._tmpTexture.get();\r\n if (tmp && (tmp.width !== heightMap.width || tmp.height !== heightMap.height)) {\r\n this._tmpTexture.dispose();\r\n }\r\n if (!this._tmpTexture.get()) {\r\n tmp = getDevice().createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rg32f',\r\n heightMap.width,\r\n heightMap.height\r\n )!;\r\n tmp.name = 'TerrainBoundingBoxTexture';\r\n this._tmpTexture.set(tmp);\r\n }\r\n const tmpFB = device.createFrameBuffer([tmp!], null);\r\n ClipmapTerrain._copyBlitter.blit(heightMap, tmpFB, fetchSampler('clamp_nearest_nomip'));\r\n tmpFB.dispose();\r\n ClipmapTerrain._heightBoundingGenerator.render(tmp!);\r\n const data = new Float32Array(4);\r\n tmp!\r\n .readPixels(0, 0, 1, 1, 0, tmp!.mipLevelCount - 1, data)\r\n .then(() => {\r\n this._minHeight = data[0];\r\n this._maxHeight = data[1];\r\n this.invalidateWorldBoundingVolume(false);\r\n })\r\n .catch((_err) => {\r\n console.error('Read pixels failed');\r\n });\r\n }\r\n /** @internal */\r\n createHeightMapTexture(width: number, height: number) {\r\n return getDevice().createTexture2D(getDevice().type === 'webgl' ? 'rgba16f' : 'r16f', width, height)!;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.updateRegion();\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 return;\r\n }\r\n const that = this;\r\n const bv = this.getWorldBoundingVolume()!.toAABB();\r\n this._renderData = this._clipmap.gather({\r\n camera: camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: this._gridScale,\r\n userData: this,\r\n frustumCulling: !this.castShadow,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n outAABB.minPoint.setXYZ(minX, bv ? bv.minPoint.y : p.y - 9999, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, bv ? bv.maxPoint.y : p.y + 9999, maxZ);\r\n }\r\n });\r\n let maxMipLevel = 0;\r\n for (const info of this._renderData) {\r\n const buffer = info.primitive.getVertexBuffer('texCoord1')!;\r\n buffer.bufferSubData(0, info.mipLevels, 0, info.numInstances);\r\n if (info.maxMiplevel > maxMipLevel) {\r\n maxMipLevel = info.maxMiplevel;\r\n }\r\n }\r\n const levelAABB = this._clipmap.calcLevelAABB(camera, mat.region, this._gridScale);\r\n const cameraPos = camera.getWorldPosition();\r\n const tmpBuffer = ClipmapTerrain._tmpBuffer;\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n if (i === 0) {\r\n tmpBuffer[i * 8 + 0] = cameraPos.x;\r\n tmpBuffer[i * 8 + 1] = cameraPos.z;\r\n tmpBuffer[i * 8 + 2] = cameraPos.x;\r\n tmpBuffer[i * 8 + 3] = cameraPos.z;\r\n } else {\r\n const prevAABB = levelAABB[i - 1];\r\n tmpBuffer[i * 8 + 0] = prevAABB.minPoint.x;\r\n tmpBuffer[i * 8 + 1] = prevAABB.minPoint.z;\r\n tmpBuffer[i * 8 + 2] = prevAABB.maxPoint.x;\r\n tmpBuffer[i * 8 + 3] = prevAABB.maxPoint.z;\r\n }\r\n const currentAABB = levelAABB[i];\r\n tmpBuffer[i * 8 + 4] = 1 / (currentAABB.minPoint.x - tmpBuffer[i * 8 + 0]);\r\n tmpBuffer[i * 8 + 5] = 1 / (currentAABB.minPoint.z - tmpBuffer[i * 8 + 1]);\r\n tmpBuffer[i * 8 + 6] = 1 / (currentAABB.maxPoint.x - tmpBuffer[i * 8 + 2]);\r\n tmpBuffer[i * 8 + 7] = 1 / (currentAABB.maxPoint.z - tmpBuffer[i * 8 + 3]);\r\n }\r\n mat.setLevelData(tmpBuffer, 8 * (maxMipLevel + 1));\r\n\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Updates the terrain material region based on current position and scale.\r\n * Should be called after changing position, scale, or height map.\r\n */\r\n updateRegion() {\r\n if (this.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 + (this.parent?.worldMatrix.m03 ?? 0);\r\n const pz = this.position.z + (this.parent?.worldMatrix.m23 ?? 0);\r\n this._gridScale = Math.max(\r\n (x * this._sizeX) / this.material.heightMap.width,\r\n (z * this._sizeZ) / this.material.heightMap.height\r\n );\r\n this.material.update(new Vector4(px, pz, px + x * this._sizeX, pz + z * this._sizeZ), this.scale);\r\n this.grassRenderer.updateMaterial();\r\n }\r\n }\r\n /** {@inheritDoc Drawable.draw} */\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 if (\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_OBJECT_COLOR &&\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_SHADOWMAP\r\n ) {\r\n this.grassRenderer.draw(ctx);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private resizeHeightMap(sizeX: number, sizeZ: number) {\r\n if (this.material) {\r\n const oldHeightMap = this.material.heightMap;\r\n const device = getDevice();\r\n const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;\r\n sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;\r\n sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;\r\n if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {\r\n const newHeightMap = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n sizeX,\r\n sizeZ\r\n )!;\r\n const fb = device.createFrameBuffer([newHeightMap], null);\r\n ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));\r\n fb.dispose();\r\n this.heightMap = newHeightMap;\r\n this.updateBoundingBox();\r\n }\r\n }\r\n }\r\n /*\r\n private calcNormalHeightMap(): Texture2D {\r\n const device = getDevice();\r\n if (!ClipmapTerrain._normalHeightMapProgram) {\r\n ClipmapTerrain._normalHeightMapProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.texelSize = pb.vec2().uniform(0);\r\n this.terrainScale = pb.vec3().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('calcNormal', [pb.vec2('texCoord')], function () {\r\n this.$l.t = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.l = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.r = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.b = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.tx = pb.vec3(this.terrainScale.x, pb.mul(pb.sub(this.r, this.l), this.terrainScale.y), 0);\r\n this.$l.tz = pb.vec3(0, pb.mul(pb.sub(this.b, this.t), this.terrainScale.y), this.terrainScale.z);\r\n this.$l.normal = pb.normalize(pb.cross(this.tz, this.tx));\r\n this.$return(this.normal);\r\n });\r\n pb.main(function () {\r\n this.$l.normal = this.calcNormal(this.$inputs.uv);\r\n this.$outputs.outColor = pb.vec4(pb.add(pb.mul(this.normal, 0.5), pb.vec3(0.5)), 1);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n */\r\n /**\r\n * Disposes of all resources used by this terrain.\r\n * Should be called when the terrain is no longer needed.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap?.dispose();\r\n this._material?.dispose();\r\n this._grassRenderer?.dispose();\r\n }\r\n}\r\n"],"names":["HeightMinMaxBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","readTexel","xxxx","HeightBoundingGenerator","RenderMipmap","renderPixel","leftTop","rightTop","leftBottom","rightBottom","pb","$builder","$l","maxHeight","max","r","minHeight","min","g","vec4","ClipmapTerrain","applyMixins","GraphNode","mixinDrawable","_heightBoundingGenerator","_copyBlitter","_tmpBuffer","Float32Array","MAX_TERRAIN_MIPMAP_LEVELS","_pickTarget","_clipmap","_renderData","_gridScale","_material","_grassRenderer","_castShadow","_sizeX","_sizeZ","_heightMapAssetId","_splatMapAssetId","_grassAssetId","_minHeight","_maxHeight","_tmpTexture","scene","sizeX","sizeZ","clipMapTileSize","node","Clipmap","DRef","GrassRenderer","persistentId","ClipmapTerrainMaterial","createHeightMapTexture","updateRegion","queuePerCameraUpdateNode","grassRenderer","get","MAX_DETAIL_MAP_COUNT","heightMapAssetId","randomUUID","val","splatMapAssetId","grassAssetId","numDetailMaps","material","clone","Error","setSize","resizeHeightMap","castShadow","heightMap","splatMap","getSplatMap","wireframe","getPickTarget","getMorphData","getSkinInfluenceData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isClipmapTerrain","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scale","y","BoundingBox","region","x","Math","z","w","worldRegion","Vector4","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","updateBoundingBox","device","getDevice","tmp","width","height","dispose","createTexture2D","name","tmpFB","createFrameBuffer","blit","fetchSampler","render","data","readPixels","mipLevelCount","then","invalidateWorldBoundingVolume","catch","_err","console","error","_onTransformChanged","invalidateLocal","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","bv","getWorldBoundingVolume","toAABB","gather","minMaxWorldPos","gridScale","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","minPoint","setXYZ","maxPoint","maxMipLevel","info","buffer","primitive","getVertexBuffer","bufferSubData","mipLevels","numInstances","maxMiplevel","levelAABB","calcLevelAABB","cameraPos","getWorldPosition","tmpBuffer","i","prevAABB","currentAABB","setLevelData","abs","px","position","pz","update","updateMaterial","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","renderPass","RENDER_PASS_TYPE_OBJECT_COLOR","RENDER_PASS_TYPE_SHADOWMAP","oldHeightMap","maxTextureSize","getDeviceCaps","textureCaps","newHeightMap","fb","onDispose"],"mappings":"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"}