@zephyr3d/scene 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/dist/animation/animation.js +4 -33
  2. package/dist/animation/animation.js.map +1 -1
  3. package/dist/animation/animationset.js +24 -11
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js +1 -0
  6. package/dist/animation/animationtrack.js.map +1 -1
  7. package/dist/animation/eulerrotationtrack.js +0 -1
  8. package/dist/animation/eulerrotationtrack.js.map +1 -1
  9. package/dist/animation/ik/ccd_solver.js +372 -0
  10. package/dist/animation/ik/ccd_solver.js.map +1 -0
  11. package/dist/animation/ik/fabrik_solver.js +399 -0
  12. package/dist/animation/ik/fabrik_solver.js.map +1 -0
  13. package/dist/animation/ik/ik_angle_constraint.js +181 -0
  14. package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
  15. package/dist/animation/ik/ik_chain.js +163 -0
  16. package/dist/animation/ik/ik_chain.js.map +1 -0
  17. package/dist/animation/ik/ik_chain_builder.js +68 -0
  18. package/dist/animation/ik/ik_chain_builder.js.map +1 -0
  19. package/dist/animation/ik/ik_constraint.js +25 -0
  20. package/dist/animation/ik/ik_constraint.js.map +1 -0
  21. package/dist/animation/ik/ik_pole_constraint.js +123 -0
  22. package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
  23. package/dist/animation/ik/ik_solver.js +48 -0
  24. package/dist/animation/ik/ik_solver.js.map +1 -0
  25. package/dist/animation/ik/ik_track.js +96 -0
  26. package/dist/animation/ik/ik_track.js.map +1 -0
  27. package/dist/animation/ik/ik_utils.js +270 -0
  28. package/dist/animation/ik/ik_utils.js.map +1 -0
  29. package/dist/animation/ik/two_bone_ik_solver.js +332 -0
  30. package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
  31. package/dist/animation/ik_modifier.js +61 -0
  32. package/dist/animation/ik_modifier.js.map +1 -0
  33. package/dist/animation/ik_postprocessor.js +71 -0
  34. package/dist/animation/ik_postprocessor.js.map +1 -0
  35. package/dist/animation/manual_transform_processor.js +156 -0
  36. package/dist/animation/manual_transform_processor.js.map +1 -0
  37. package/dist/animation/morphtarget.js +7 -1
  38. package/dist/animation/morphtarget.js.map +1 -1
  39. package/dist/animation/morphtrack.js +3 -3
  40. package/dist/animation/morphtrack.js.map +1 -1
  41. package/dist/animation/proptrack.js +37 -41
  42. package/dist/animation/proptrack.js.map +1 -1
  43. package/dist/animation/rotationtrack.js +0 -1
  44. package/dist/animation/rotationtrack.js.map +1 -1
  45. package/dist/animation/scaletrack.js +0 -1
  46. package/dist/animation/scaletrack.js.map +1 -1
  47. package/dist/animation/skeleton.js +57 -60
  48. package/dist/animation/skeleton.js.map +1 -1
  49. package/dist/animation/skeleton_modifier.js +38 -0
  50. package/dist/animation/skeleton_modifier.js.map +1 -0
  51. package/dist/animation/skeleton_postprocessor.js +50 -0
  52. package/dist/animation/skeleton_postprocessor.js.map +1 -0
  53. package/dist/animation/spring/multi_chain_spring_system.js +503 -0
  54. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
  55. package/dist/animation/spring/spring_chain.js +103 -0
  56. package/dist/animation/spring/spring_chain.js.map +1 -0
  57. package/dist/animation/spring/spring_collider.js +247 -0
  58. package/dist/animation/spring/spring_collider.js.map +1 -0
  59. package/dist/animation/spring/spring_constraint.js +21 -0
  60. package/dist/animation/spring/spring_constraint.js.map +1 -0
  61. package/dist/animation/spring/spring_particle.js +20 -0
  62. package/dist/animation/spring/spring_particle.js.map +1 -0
  63. package/dist/animation/spring/spring_system.js +526 -0
  64. package/dist/animation/spring/spring_system.js.map +1 -0
  65. package/dist/animation/spring_modifier.js +45 -0
  66. package/dist/animation/spring_modifier.js.map +1 -0
  67. package/dist/animation/spring_postprocessor.js +54 -0
  68. package/dist/animation/spring_postprocessor.js.map +1 -0
  69. package/dist/animation/translationtrack.js +0 -1
  70. package/dist/animation/translationtrack.js.map +1 -1
  71. package/dist/app/api.js +13 -4
  72. package/dist/app/api.js.map +1 -1
  73. package/dist/app/app.js +13 -1
  74. package/dist/app/app.js.map +1 -1
  75. package/dist/app/engine.js +33 -45
  76. package/dist/app/engine.js.map +1 -1
  77. package/dist/app/inputmgr.js.map +1 -1
  78. package/dist/app/runtimescript.js.map +1 -1
  79. package/dist/app/screen.js +318 -0
  80. package/dist/app/screen.js.map +1 -0
  81. package/dist/app/scriptingsystem.js +10 -6
  82. package/dist/app/scriptingsystem.js.map +1 -1
  83. package/dist/app/scriptregistry.js +11 -22
  84. package/dist/app/scriptregistry.js.map +1 -1
  85. package/dist/asset/assetmanager.js +79 -58
  86. package/dist/asset/assetmanager.js.map +1 -1
  87. package/dist/asset/builtin.js +5 -5
  88. package/dist/asset/builtin.js.map +1 -1
  89. package/dist/asset/loaders/dds/dds.js +6 -2
  90. package/dist/asset/loaders/dds/dds.js.map +1 -1
  91. package/dist/asset/loaders/dds/dds_loader.js +1 -1
  92. package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
  93. package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
  94. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  95. package/dist/asset/loaders/gltf/helpers.js +6 -2
  96. package/dist/asset/loaders/gltf/helpers.js.map +1 -1
  97. package/dist/asset/loaders/hdr/hdr.js +22 -15
  98. package/dist/asset/loaders/hdr/hdr.js.map +1 -1
  99. package/dist/asset/loaders/image/tga_Loader.js +2 -1
  100. package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
  101. package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
  102. package/dist/asset/loaders/loader.js +2 -2
  103. package/dist/asset/loaders/loader.js.map +1 -1
  104. package/dist/asset/model.js +9 -5
  105. package/dist/asset/model.js.map +1 -1
  106. package/dist/blitter/bilateralblur.js.map +1 -1
  107. package/dist/blitter/blitter.js +9 -11
  108. package/dist/blitter/blitter.js.map +1 -1
  109. package/dist/blitter/box.js +0 -1
  110. package/dist/blitter/box.js.map +1 -1
  111. package/dist/blitter/copy.js.map +1 -1
  112. package/dist/blitter/gaussianblur.js.map +1 -1
  113. package/dist/camera/base.js +1 -3
  114. package/dist/camera/base.js.map +1 -1
  115. package/dist/camera/camera.js +121 -37
  116. package/dist/camera/camera.js.map +1 -1
  117. package/dist/camera/fps.js +19 -17
  118. package/dist/camera/fps.js.map +1 -1
  119. package/dist/camera/orbit.js +45 -43
  120. package/dist/camera/orbit.js.map +1 -1
  121. package/dist/camera/orthocamera.js +27 -21
  122. package/dist/camera/orthocamera.js.map +1 -1
  123. package/dist/camera/perspectivecamera.js +28 -19
  124. package/dist/camera/perspectivecamera.js.map +1 -1
  125. package/dist/index.d.ts +15802 -15577
  126. package/dist/index.js +33 -11
  127. package/dist/index.js.map +1 -1
  128. package/dist/material/blinn.js.map +1 -1
  129. package/dist/material/grassmaterial.js.map +1 -1
  130. package/dist/material/lambert.js.map +1 -1
  131. package/dist/material/material.js +11 -5
  132. package/dist/material/material.js.map +1 -1
  133. package/dist/material/meshmaterial.js +10 -9
  134. package/dist/material/meshmaterial.js.map +1 -1
  135. package/dist/material/mixins/albedocolor.js.map +1 -1
  136. package/dist/material/mixins/foliage.js.map +1 -1
  137. package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
  138. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  139. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  140. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
  141. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  142. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  143. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  144. package/dist/material/mixins/lit.js +3 -3
  145. package/dist/material/mixins/lit.js.map +1 -1
  146. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  147. package/dist/material/mixins/pbr/common.js.map +1 -1
  148. package/dist/material/mixins/texture.js +3 -0
  149. package/dist/material/mixins/texture.js.map +1 -1
  150. package/dist/material/mixins/vertexcolor.js.map +1 -1
  151. package/dist/material/particle.js.map +1 -1
  152. package/dist/material/pbrblueprint.js +180 -22
  153. package/dist/material/pbrblueprint.js.map +1 -1
  154. package/dist/material/pbrmr.js.map +1 -1
  155. package/dist/material/pbrsg.js.map +1 -1
  156. package/dist/material/shader/helper.js +41 -56
  157. package/dist/material/shader/helper.js.map +1 -1
  158. package/dist/material/sprite.js +301 -0
  159. package/dist/material/sprite.js.map +1 -0
  160. package/dist/material/sprite3d.js +301 -0
  161. package/dist/material/sprite3d.js.map +1 -0
  162. package/dist/material/sprite3d_std.js +116 -0
  163. package/dist/material/sprite3d_std.js.map +1 -0
  164. package/dist/material/sprite3dblueprint.js +235 -0
  165. package/dist/material/sprite3dblueprint.js.map +1 -0
  166. package/dist/material/sprite_std.js +116 -0
  167. package/dist/material/sprite_std.js.map +1 -0
  168. package/dist/material/spriteblueprint.js +235 -0
  169. package/dist/material/spriteblueprint.js.map +1 -0
  170. package/dist/material/terrain-cm.js +0 -1
  171. package/dist/material/terrain-cm.js.map +1 -1
  172. package/dist/material/unlit.js.map +1 -1
  173. package/dist/material/water.js.map +1 -1
  174. package/dist/posteffect/bloom.js.map +1 -1
  175. package/dist/posteffect/compositor.js.map +1 -1
  176. package/dist/posteffect/fxaa.js.map +1 -1
  177. package/dist/posteffect/grayscale.js.map +1 -1
  178. package/dist/posteffect/motionblur.js.map +1 -1
  179. package/dist/posteffect/posteffect.js.map +1 -1
  180. package/dist/posteffect/sao.js.map +1 -1
  181. package/dist/posteffect/ssr.js +7 -5
  182. package/dist/posteffect/ssr.js.map +1 -1
  183. package/dist/posteffect/taa.js.map +1 -1
  184. package/dist/posteffect/tonemap.js.map +1 -1
  185. package/dist/render/abuffer_oit.js +8 -6
  186. package/dist/render/abuffer_oit.js.map +1 -1
  187. package/dist/render/clipmap.js +0 -10
  188. package/dist/render/clipmap.js.map +1 -1
  189. package/dist/render/cluster_light.js +4 -4
  190. package/dist/render/cluster_light.js.map +1 -1
  191. package/dist/render/cull_visitor.js +15 -17
  192. package/dist/render/cull_visitor.js.map +1 -1
  193. package/dist/render/depthpass.js +3 -4
  194. package/dist/render/depthpass.js.map +1 -1
  195. package/dist/render/drawable.js +15 -0
  196. package/dist/render/drawable.js.map +1 -0
  197. package/dist/render/drawable_mixin.js +8 -4
  198. package/dist/render/drawable_mixin.js.map +1 -1
  199. package/dist/render/envlight.js.map +1 -1
  200. package/dist/render/fbm_wavegenerator.js +3 -1
  201. package/dist/render/fbm_wavegenerator.js.map +1 -1
  202. package/dist/render/fft_wavegenerator.js +67 -64
  203. package/dist/render/fft_wavegenerator.js.map +1 -1
  204. package/dist/render/fullscreenquad.js.map +1 -1
  205. package/dist/render/gerstner_wavegenerator.js +3 -1
  206. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  207. package/dist/render/globalbindgroup_allocator.js +3 -1
  208. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  209. package/dist/render/hzb.js +1 -2
  210. package/dist/render/hzb.js.map +1 -1
  211. package/dist/render/lightpass.js +13 -13
  212. package/dist/render/lightpass.js.map +1 -1
  213. package/dist/render/objectcolorpass.js +4 -7
  214. package/dist/render/objectcolorpass.js.map +1 -1
  215. package/dist/render/primitive.js +4 -5
  216. package/dist/render/primitive.js.map +1 -1
  217. package/dist/render/render_queue.js +10 -5
  218. package/dist/render/render_queue.js.map +1 -1
  219. package/dist/render/renderer.js +16 -22
  220. package/dist/render/renderer.js.map +1 -1
  221. package/dist/render/renderpass.js +27 -52
  222. package/dist/render/renderpass.js.map +1 -1
  223. package/dist/render/rendertarget.js +5 -0
  224. package/dist/render/rendertarget.js.map +1 -0
  225. package/dist/render/screenrendertarget.js +56 -0
  226. package/dist/render/screenrendertarget.js.map +1 -0
  227. package/dist/render/shadowmap_pass.js +4 -5
  228. package/dist/render/shadowmap_pass.js.map +1 -1
  229. package/dist/render/sky.js +16 -14
  230. package/dist/render/sky.js.map +1 -1
  231. package/dist/render/weightedblended_oit.js.map +1 -1
  232. package/dist/scene/basesprite.js +296 -0
  233. package/dist/scene/basesprite.js.map +1 -0
  234. package/dist/scene/batchgroup.js +4 -2
  235. package/dist/scene/batchgroup.js.map +1 -1
  236. package/dist/scene/environment.js +9 -10
  237. package/dist/scene/environment.js.map +1 -1
  238. package/dist/scene/graph_node.js.map +1 -1
  239. package/dist/scene/light.js +22 -4
  240. package/dist/scene/light.js.map +1 -1
  241. package/dist/scene/mesh.js +96 -26
  242. package/dist/scene/mesh.js.map +1 -1
  243. package/dist/scene/octree.js.map +1 -1
  244. package/dist/scene/particlesys.js +25 -22
  245. package/dist/scene/particlesys.js.map +1 -1
  246. package/dist/scene/raycast_visitor.js +0 -16
  247. package/dist/scene/raycast_visitor.js.map +1 -1
  248. package/dist/scene/scene.js +7 -4
  249. package/dist/scene/scene.js.map +1 -1
  250. package/dist/scene/scene_node.js +20 -35
  251. package/dist/scene/scene_node.js.map +1 -1
  252. package/dist/scene/sprite.js +18 -0
  253. package/dist/scene/sprite.js.map +1 -0
  254. package/dist/scene/sprite3d.js +18 -0
  255. package/dist/scene/sprite3d.js.map +1 -0
  256. package/dist/scene/terrain-cm/grass.js +5 -4
  257. package/dist/scene/terrain-cm/grass.js.map +1 -1
  258. package/dist/scene/terrain-cm/grassmaterial.js +3 -1
  259. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  260. package/dist/scene/terrain-cm/terrain-cm.js +65 -48
  261. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  262. package/dist/scene/water.js +35 -30
  263. package/dist/scene/water.js.map +1 -1
  264. package/dist/shaders/atmosphere.js +17 -29
  265. package/dist/shaders/atmosphere.js.map +1 -1
  266. package/dist/shaders/fog.js.map +1 -1
  267. package/dist/shaders/misc.js.map +1 -1
  268. package/dist/shaders/noise.js.map +1 -1
  269. package/dist/shaders/pbr.js.map +1 -1
  270. package/dist/shaders/shadow.js.map +1 -1
  271. package/dist/shaders/ssr.js.map +1 -1
  272. package/dist/shaders/temporal.js.map +1 -1
  273. package/dist/shaders/water.js.map +1 -1
  274. package/dist/shadow/esm.js +1 -1
  275. package/dist/shadow/esm.js.map +1 -1
  276. package/dist/shadow/pcf_opt.js.map +1 -1
  277. package/dist/shadow/pcf_pd.js.map +1 -1
  278. package/dist/shadow/shader.js +3 -1
  279. package/dist/shadow/shader.js.map +1 -1
  280. package/dist/shadow/shadow_impl.js.map +1 -1
  281. package/dist/shadow/shadowmapper.js +6 -18
  282. package/dist/shadow/shadowmapper.js.map +1 -1
  283. package/dist/shadow/ssm.js.map +1 -1
  284. package/dist/shadow/vsm.js.map +1 -1
  285. package/dist/shapes/box.js +9 -3
  286. package/dist/shapes/box.js.map +1 -1
  287. package/dist/shapes/cylinder.js +2 -2
  288. package/dist/shapes/cylinder.js.map +1 -1
  289. package/dist/shapes/plane.js +2 -2
  290. package/dist/shapes/plane.js.map +1 -1
  291. package/dist/shapes/shape.js +2 -1
  292. package/dist/shapes/shape.js.map +1 -1
  293. package/dist/shapes/sphere.js +2 -2
  294. package/dist/shapes/sphere.js.map +1 -1
  295. package/dist/shapes/tetrahedron.js +5 -6
  296. package/dist/shapes/tetrahedron.js.map +1 -1
  297. package/dist/shapes/torus.js +2 -2
  298. package/dist/shapes/torus.js.map +1 -1
  299. package/dist/utility/aabbtree.js +1 -1
  300. package/dist/utility/aabbtree.js.map +1 -1
  301. package/dist/utility/blueprint/common/constants.js +578 -104
  302. package/dist/utility/blueprint/common/constants.js.map +1 -1
  303. package/dist/utility/blueprint/common/math.js +471 -9
  304. package/dist/utility/blueprint/common/math.js.map +1 -1
  305. package/dist/utility/blueprint/common.js +1 -1
  306. package/dist/utility/blueprint/common.js.map +1 -1
  307. package/dist/utility/blueprint/material/func.js +9 -5
  308. package/dist/utility/blueprint/material/func.js.map +1 -1
  309. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  310. package/dist/utility/blueprint/material/ir.js +288 -80
  311. package/dist/utility/blueprint/material/ir.js.map +1 -1
  312. package/dist/utility/blueprint/material/pbr.js +92 -4
  313. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  314. package/dist/utility/blueprint/material/texture.js +62 -45
  315. package/dist/utility/blueprint/material/texture.js.map +1 -1
  316. package/dist/utility/blueprint/node.js +28 -1
  317. package/dist/utility/blueprint/node.js.map +1 -1
  318. package/dist/utility/bounding_volume.js.map +1 -1
  319. package/dist/utility/debug.js.map +1 -1
  320. package/dist/utility/draco/decoder.js.map +1 -1
  321. package/dist/utility/misc.js +1 -1
  322. package/dist/utility/misc.js.map +1 -1
  323. package/dist/utility/panorama.js.map +1 -1
  324. package/dist/utility/pmrem.js.map +1 -1
  325. package/dist/utility/rendermipmap.js.map +1 -1
  326. package/dist/utility/serialization/json.js +19 -15
  327. package/dist/utility/serialization/json.js.map +1 -1
  328. package/dist/utility/serialization/manager.js +89 -22
  329. package/dist/utility/serialization/manager.js.map +1 -1
  330. package/dist/utility/serialization/scene/animation.js +44 -41
  331. package/dist/utility/serialization/scene/animation.js.map +1 -1
  332. package/dist/utility/serialization/scene/batch.js +4 -3
  333. package/dist/utility/serialization/scene/batch.js.map +1 -1
  334. package/dist/utility/serialization/scene/camera.js +97 -9
  335. package/dist/utility/serialization/scene/camera.js.map +1 -1
  336. package/dist/utility/serialization/scene/common.js +102 -28
  337. package/dist/utility/serialization/scene/common.js.map +1 -1
  338. package/dist/utility/serialization/scene/light.js +14 -12
  339. package/dist/utility/serialization/scene/light.js.map +1 -1
  340. package/dist/utility/serialization/scene/material.js +216 -26
  341. package/dist/utility/serialization/scene/material.js.map +1 -1
  342. package/dist/utility/serialization/scene/mesh.js +71 -100
  343. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  344. package/dist/utility/serialization/scene/misc.js +3 -2
  345. package/dist/utility/serialization/scene/misc.js.map +1 -1
  346. package/dist/utility/serialization/scene/node.js +42 -9
  347. package/dist/utility/serialization/scene/node.js.map +1 -1
  348. package/dist/utility/serialization/scene/particle.js +7 -5
  349. package/dist/utility/serialization/scene/particle.js.map +1 -1
  350. package/dist/utility/serialization/scene/primitive.js +18 -15
  351. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  352. package/dist/utility/serialization/scene/scene.js +3 -2
  353. package/dist/utility/serialization/scene/scene.js.map +1 -1
  354. package/dist/utility/serialization/scene/sprite.js +164 -0
  355. package/dist/utility/serialization/scene/sprite.js.map +1 -0
  356. package/dist/utility/serialization/scene/terrain.js +8 -6
  357. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  358. package/dist/utility/serialization/scene/water.js +11 -9
  359. package/dist/utility/serialization/scene/water.js.map +1 -1
  360. package/dist/utility/serialization/types.js +6 -0
  361. package/dist/utility/serialization/types.js.map +1 -0
  362. package/dist/utility/shprojector.js.map +1 -1
  363. package/dist/utility/textures/ggxlut.js.map +1 -1
  364. package/dist/utility/textures/gradientnoise.js.map +1 -1
  365. package/dist/utility/textures/randomnoise.js.map +1 -1
  366. package/dist/values.js +14 -14
  367. package/dist/values.js.map +1 -1
  368. package/package.json +80 -80
@@ -8,11 +8,13 @@ import '@zephyr3d/device';
8
8
  import { RENDER_PASS_TYPE_LIGHT } from '../../values.js';
9
9
  import { applyMaterialMixins, MeshMaterial } from '../../material/meshmaterial.js';
10
10
  import '../../material/grassmaterial.js';
11
- import '../../material/terrainmaterial.js';
12
11
  import '../../material/terrain-cm.js';
13
12
  import '../../material/pbrmr.js';
14
13
  import '../../material/pbrsg.js';
15
14
  import '../../material/pbrblueprint.js';
15
+ import '../../material/sprite.js';
16
+ import '../../material/sprite_std.js';
17
+ import '../../utility/blueprint/material/texture.js';
16
18
  import { mixinPBRMetallicRoughness } from '../../material/mixins/lightmodel/pbrmetallicroughness.js';
17
19
  import { mixinFoliage } from '../../material/mixins/foliage.js';
18
20
  import { fetchSampler } from '../../utility/misc.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(): ClipmapGrassMaterial {\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): void {\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): boolean {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting(): boolean {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing(): boolean {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number): void {\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): void {\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): void {\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): boolean {\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): void {\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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"}
@@ -1,21 +1,23 @@
1
1
  import { applyMixins, DRef, randomUUID, Vector3, Vector4 } from '@zephyr3d/base';
2
2
  import { GraphNode } from '../graph_node.js';
3
3
  import { mixinDrawable } from '../../render/drawable_mixin.js';
4
- import { MAX_TERRAIN_MIPMAP_LEVELS, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../../values.js';
4
+ import { getDevice } from '../../app/api.js';
5
+ import { MAX_TERRAIN_MIPMAP_LEVELS, QUEUE_OPAQUE, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../../values.js';
5
6
  import '@zephyr3d/device';
6
7
  import '../../material/shader/helper.js';
7
8
  import '../../material/lambert.js';
8
9
  import '../../material/blinn.js';
9
10
  import '../../material/unlit.js';
10
11
  import '../../material/particle.js';
11
- import { getDevice } from '../../app/api.js';
12
12
  import '../../material/meshmaterial.js';
13
13
  import '../../material/grassmaterial.js';
14
- import '../../material/terrainmaterial.js';
15
14
  import { ClipmapTerrainMaterial } from '../../material/terrain-cm.js';
16
15
  import '../../material/pbrmr.js';
17
16
  import '../../material/pbrsg.js';
18
17
  import '../../material/pbrblueprint.js';
18
+ import '../../material/sprite.js';
19
+ import '../../material/sprite_std.js';
20
+ import '../../utility/blueprint/material/texture.js';
19
21
  import '../../render/renderer.js';
20
22
  import { fetchSampler } from '../../utility/misc.js';
21
23
  import '../../render/sky.js';
@@ -173,14 +175,15 @@ class HeightBoundingGenerator extends RenderMipmap {
173
175
  *
174
176
  * @returns Number of active detail maps
175
177
  */ get numDetailMaps() {
176
- return this.material.numDetailMaps;
178
+ return this.material?.numDetailMaps ?? 0;
177
179
  }
178
180
  set numDetailMaps(val) {
179
- this.material.numDetailMaps = val;
181
+ if (this.material) {
182
+ this.material.numDetailMaps = val;
183
+ }
180
184
  }
181
185
  /** {@inheritDoc SceneNode.clone} */ async clone() {
182
- console.error('Cloning clipmap terrain not implemented');
183
- return null;
186
+ throw new Error('Cloning clipmap terrain not implemented');
184
187
  }
185
188
  /**
186
189
  * Sets the terrain size.
@@ -220,16 +223,16 @@ class HeightBoundingGenerator extends RenderMipmap {
220
223
  }
221
224
  }
222
225
  /** The current height map texture. */ get heightMap() {
223
- return this.material.heightMap;
226
+ return this.material?.heightMap ?? null;
224
227
  }
225
228
  set heightMap(val) {
226
- if (val) {
229
+ if (this.material && val) {
227
230
  this.material.heightMap = val;
228
231
  this.updateRegion();
229
232
  }
230
233
  }
231
234
  /** The splat map texture */ get splatMap() {
232
- return this.material.getSplatMap();
235
+ return this.material?.getSplatMap() ?? null;
233
236
  }
234
237
  /** Material instance of the terrain */ get material() {
235
238
  return this._material?.get() ?? null;
@@ -258,22 +261,22 @@ class HeightBoundingGenerator extends RenderMipmap {
258
261
  /**
259
262
  * {@inheritDoc Drawable.getQueueType}
260
263
  */ getQueueType() {
261
- return this.material.getQueueType();
264
+ return this.material?.getQueueType() ?? QUEUE_OPAQUE;
262
265
  }
263
266
  /**
264
267
  * {@inheritDoc Drawable.isUnlit}
265
268
  */ isUnlit() {
266
- return !this.material.supportLighting();
269
+ return this.material ? !this.material.supportLighting() : false;
267
270
  }
268
271
  /**
269
272
  * {@inheritDoc Drawable.needSceneColor}
270
273
  */ needSceneColor() {
271
- return this.material.needSceneColor();
274
+ return this.material?.needSceneColor() ?? false;
272
275
  }
273
276
  /**
274
277
  * {@inheritDoc Drawable.needSceneDepth}
275
278
  */ needSceneDepth() {
276
- return this.material.needSceneDepth();
279
+ return this.material?.needSceneDepth() ?? false;
277
280
  }
278
281
  /**
279
282
  * {@inheritDoc Drawable.getMaterial}
@@ -298,15 +301,19 @@ class HeightBoundingGenerator extends RenderMipmap {
298
301
  /**
299
302
  * {@inheritDoc SceneNode.computeWorldBoundingVolume}
300
303
  */ computeWorldBoundingVolume() {
301
- const p = this.worldMatrix.transformPointAffine(Vector3.zero());
302
- const minHeight = this._minHeight * this.scale.y;
303
- const maxHeight = this._maxHeight * this.scale.y;
304
- return new BoundingBox(new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y), new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w));
304
+ if (this.material) {
305
+ const p = this.worldMatrix.transformPointAffine(Vector3.zero());
306
+ const minHeight = this._minHeight * this.scale.y;
307
+ const maxHeight = this._maxHeight * this.scale.y;
308
+ return new BoundingBox(new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y), new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w));
309
+ } else {
310
+ return null;
311
+ }
305
312
  }
306
313
  /**
307
314
  * the actual world-space region covered by this terrain (After applying world transform).
308
315
  */ get worldRegion() {
309
- return this.material.region;
316
+ return this.material?.region ?? Vector4.zero();
310
317
  }
311
318
  /**
312
319
  * Calculates the local transformation matrix.
@@ -343,6 +350,9 @@ class HeightBoundingGenerator extends RenderMipmap {
343
350
  * ```
344
351
  */ updateBoundingBox() {
345
352
  const heightMap = this.heightMap;
353
+ if (!heightMap) {
354
+ return;
355
+ }
346
356
  const device = getDevice();
347
357
  let tmp = this._tmpTexture.get();
348
358
  if (tmp && (tmp.width !== heightMap.width || tmp.height !== heightMap.height)) {
@@ -377,6 +387,9 @@ class HeightBoundingGenerator extends RenderMipmap {
377
387
  }
378
388
  /** {@inheritDoc SceneNode.updatePerCamera} */ updatePerCamera(camera, _elapsedInSeconds, _deltaInSeconds) {
379
389
  const mat = this._material.get();
390
+ if (!mat) {
391
+ return;
392
+ }
380
393
  const that = this;
381
394
  const bv = this.getWorldBoundingVolume().toAABB();
382
395
  this._renderData = this._clipmap.gather({
@@ -422,9 +435,12 @@ class HeightBoundingGenerator extends RenderMipmap {
422
435
  tmpBuffer[i * 8 + 7] = 1 / (currentAABB.maxPoint.z - tmpBuffer[i * 8 + 3]);
423
436
  }
424
437
  mat.setLevelData(tmpBuffer, 8 * (maxMipLevel + 1));
425
- this.scene.queuePerCameraUpdateNode(this);
438
+ this.scene?.queuePerCameraUpdateNode(this);
426
439
  }
427
- /** @internal */ updateRegion() {
440
+ /**
441
+ * Updates the terrain material region based on current position and scale.
442
+ * Should be called after changing position, scale, or height map.
443
+ */ updateRegion() {
428
444
  if (this.material) {
429
445
  const x = Math.abs(this.scale.x);
430
446
  const z = Math.abs(this.scale.z);
@@ -432,36 +448,40 @@ class HeightBoundingGenerator extends RenderMipmap {
432
448
  const pz = this.position.z + (this.parent?.worldMatrix.m23 ?? 0);
433
449
  this._gridScale = Math.max(x * this._sizeX / this.material.heightMap.width, z * this._sizeZ / this.material.heightMap.height);
434
450
  this.material.update(new Vector4(px, pz, px + x * this._sizeX, pz + z * this._sizeZ), this.scale);
451
+ this.grassRenderer.updateMaterial();
435
452
  }
436
- this._grassRenderer?.get().updateMaterial();
437
453
  }
438
- /** {@inheritDoc Drawable.draw} */ draw(ctx) {
454
+ /** {@inheritDoc Drawable.draw} */ draw(ctx, renderQueue) {
439
455
  const mat = this._material?.get();
440
- this.bind(ctx);
441
- mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);
442
- mat.apply(ctx);
443
- for (const info of this._renderData){
444
- mat.draw(info.primitive, ctx, info.numInstances);
445
- }
446
- if (ctx.renderPass.type !== RENDER_PASS_TYPE_OBJECT_COLOR && ctx.renderPass.type !== RENDER_PASS_TYPE_SHADOWMAP) {
447
- this._grassRenderer.get().draw(ctx);
456
+ if (mat) {
457
+ this.bind(ctx, renderQueue);
458
+ mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);
459
+ mat.apply(ctx);
460
+ for (const info of this._renderData){
461
+ mat.draw(info.primitive, ctx, info.numInstances);
462
+ }
463
+ if (ctx.renderPass.type !== RENDER_PASS_TYPE_OBJECT_COLOR && ctx.renderPass.type !== RENDER_PASS_TYPE_SHADOWMAP) {
464
+ this.grassRenderer.draw(ctx);
465
+ }
448
466
  }
449
467
  }
450
468
  /** @internal */ resizeHeightMap(sizeX, sizeZ) {
451
- const oldHeightMap = this.material.heightMap;
452
- const device = getDevice();
453
- const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;
454
- sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;
455
- sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;
456
- if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {
457
- const newHeightMap = device.createTexture2D(device.type === 'webgl' ? 'rgba16f' : 'r16f', sizeX, sizeZ);
458
- const fb = device.createFrameBuffer([
459
- newHeightMap
460
- ], null);
461
- ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));
462
- fb.dispose();
463
- this.heightMap = newHeightMap;
464
- this.updateBoundingBox();
469
+ if (this.material) {
470
+ const oldHeightMap = this.material.heightMap;
471
+ const device = getDevice();
472
+ const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;
473
+ sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;
474
+ sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;
475
+ if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {
476
+ const newHeightMap = device.createTexture2D(device.type === 'webgl' ? 'rgba16f' : 'r16f', sizeX, sizeZ);
477
+ const fb = device.createFrameBuffer([
478
+ newHeightMap
479
+ ], null);
480
+ ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));
481
+ fb.dispose();
482
+ this.heightMap = newHeightMap;
483
+ this.updateBoundingBox();
484
+ }
465
485
  }
466
486
  }
467
487
  /*
@@ -521,11 +541,8 @@ class HeightBoundingGenerator extends RenderMipmap {
521
541
  */ onDispose() {
522
542
  super.onDispose();
523
543
  this._clipmap?.dispose();
524
- this._clipmap = null;
525
544
  this._material?.dispose();
526
- this._material = null;
527
545
  this._grassRenderer?.dispose();
528
- this._grassRenderer = null;
529
546
  }
530
547
  }
531
548
 
@@ -1 +1 @@
1
- {"version":3,"file":"terrain-cm.js","sources":["../../../src/scene/terrain-cm/terrain-cm.ts"],"sourcesContent":["import type { Matrix4x4 } from '@zephyr3d/base';\r\nimport { Vector4, applyMixins, Vector3, DRef, randomUUID } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, Texture2D, Texture2DArray } 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 {\r\n Drawable,\r\n DrawContext,\r\n MorphData,\r\n MorphInfo,\r\n PickTarget,\r\n Primitive,\r\n PrimitiveInstanceInfo\r\n} from '../../render';\r\nimport { Clipmap } from '../../render';\r\nimport { ClipmapTerrainMaterial } from '../../material/terrain-cm';\r\nimport type { MeshMaterial } from '../../material';\r\nimport type { BoundingVolume } from '../../utility/bounding_volume';\r\nimport { BoundingBox } from '../../utility/bounding_volume';\r\nimport {\r\n MAX_TERRAIN_MIPMAP_LEVELS,\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 ): PBShaderExp {\r\n return this.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType).xxxx;\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 ): PBShaderExp {\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: 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 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 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 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(): number {\r\n return this.material.numDetailMaps;\r\n }\r\n set numDetailMaps(val: number) {\r\n this.material.numDetailMaps = val;\r\n }\r\n /** {@inheritDoc SceneNode.clone} */\r\n async clone(): Promise<this> {\r\n console.error('Cloning clipmap terrain not implemented');\r\n return null;\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(): boolean {\r\n return this._castShadow;\r\n }\r\n set castShadow(val: boolean) {\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: number) {\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: number) {\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(): Texture2D {\r\n return this.material.heightMap;\r\n }\r\n set heightMap(val: Texture2D) {\r\n if (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(): Texture2DArray | Texture2D {\r\n return this.material.getSplatMap();\r\n }\r\n /** Material instance of the terrain */\r\n get material(): ClipmapTerrainMaterial {\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: boolean) {\r\n this._clipmap.wireframe = val;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget(): PickTarget {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData(): MorphData {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo(): MorphInfo {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType(): number {\r\n return this.material.getQueueType();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit(): boolean {\r\n return !this.material.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor(): boolean {\r\n return this.material.needSceneColor();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth(): boolean {\r\n return this.material.needSceneDepth();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial(): MeshMaterial {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive(): Primitive {\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(): BoundingVolume {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume(): BoundingVolume {\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 }\r\n /**\r\n * the actual world-space region covered by this terrain (After applying world transform).\r\n */\r\n get worldRegion(): Vector4 {\r\n return this.material.region;\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): void {\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): void {\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 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): void {\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): void {\r\n const mat = this._material.get();\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 /** @internal */\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 }\r\n this._grassRenderer?.get().updateMaterial();\r\n }\r\n /** {@inheritDoc Drawable.draw} */\r\n draw(ctx: DrawContext) {\r\n const mat = this._material?.get();\r\n this.bind(ctx);\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.get().draw(ctx);\r\n }\r\n }\r\n /** @internal */\r\n private resizeHeightMap(sizeX: number, sizeZ: number) {\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(device.type === 'webgl' ? 'rgba16f' : 'r16f', sizeX, sizeZ);\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 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(): void {\r\n super.onDispose();\r\n this._clipmap?.dispose();\r\n this._clipmap = null;\r\n this._material?.dispose();\r\n this._material = null;\r\n this._grassRenderer?.dispose();\r\n this._grassRenderer = null;\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","console","error","setSize","resizeHeightMap","castShadow","heightMap","splatMap","getSplatMap","wireframe","getPickTarget","getMorphData","getMorphInfo","getQueueType","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isClipmapTerrain","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scale","y","BoundingBox","region","x","Math","z","w","worldRegion","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","_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","Vector4","updateMaterial","draw","ctx","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 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 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 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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"}