@zephyr3d/scene 0.9.2 → 0.9.4

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 (513) hide show
  1. package/dist/animation/animationset.js +135 -135
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/ik/ik_chain_builder.js +68 -0
  4. package/dist/animation/ik/ik_chain_builder.js.map +1 -0
  5. package/dist/animation/ik/ik_pole_constraint.js +2 -7
  6. package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
  7. package/dist/animation/joint_dynamics/controller.js +146 -146
  8. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  9. package/dist/animation/joint_dynamics/math.js +16 -0
  10. package/dist/animation/joint_dynamics/math.js.map +1 -0
  11. package/dist/animation/spring/spring_system.js +75 -75
  12. package/dist/animation/spring/spring_system.js.map +1 -1
  13. package/dist/animation/spring2/constraints.js.map +1 -1
  14. package/dist/animation/spring2/controller.js +64 -64
  15. package/dist/animation/spring2/controller.js.map +1 -1
  16. package/dist/animation/spring2/math.js.map +1 -1
  17. package/dist/animation/spring2/spring_system.js +8 -8
  18. package/dist/animation/spring2/spring_system.js.map +1 -1
  19. package/dist/app/engine.js +119 -71
  20. package/dist/app/engine.js.map +1 -1
  21. package/dist/asset/assetmanager.js +296 -244
  22. package/dist/asset/assetmanager.js.map +1 -1
  23. package/dist/asset/loaders/gltf/gltf_loader.js +1 -0
  24. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  25. package/dist/camera/camera.js +184 -184
  26. package/dist/camera/camera.js.map +1 -1
  27. package/dist/index.d.ts +685 -38
  28. package/dist/index.js +11 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/material/material.js +290 -290
  31. package/dist/material/material.js.map +1 -1
  32. package/dist/material/msdf_text.js +180 -0
  33. package/dist/material/msdf_text.js.map +1 -0
  34. package/dist/material/msdf_text_sprite.js +64 -0
  35. package/dist/material/msdf_text_sprite.js.map +1 -0
  36. package/dist/material/pbrblueprint.js +123 -108
  37. package/dist/material/pbrblueprint.js.map +1 -1
  38. package/dist/material/shader/helper.js +6 -3
  39. package/dist/material/shader/helper.js.map +1 -1
  40. package/dist/material/sprite_sdf.js +106 -0
  41. package/dist/material/sprite_sdf.js.map +1 -0
  42. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +38 -0
  43. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +1 -0
  44. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +10 -0
  45. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +1 -0
  46. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +127 -0
  47. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +1 -0
  48. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +263 -0
  49. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +1 -0
  50. package/dist/posteffect/ssr.js +1 -0
  51. package/dist/posteffect/ssr.js.map +1 -1
  52. package/dist/render/abuffer_oit.js +1 -0
  53. package/dist/render/abuffer_oit.js.map +1 -1
  54. package/dist/render/cluster_light.js +3 -4
  55. package/dist/render/cluster_light.js.map +1 -1
  56. package/dist/render/cull_visitor.js +28 -0
  57. package/dist/render/cull_visitor.js.map +1 -1
  58. package/dist/render/drawable.js.map +1 -1
  59. package/dist/render/drawable_mixin.js +1 -0
  60. package/dist/render/drawable_mixin.js.map +1 -1
  61. package/dist/render/fbm_wavegenerator.js +1 -0
  62. package/dist/render/fbm_wavegenerator.js.map +1 -1
  63. package/dist/render/gerstner_wavegenerator.js +1 -0
  64. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  65. package/dist/render/globalbindgroup_allocator.js +1 -0
  66. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  67. package/dist/render/render_queue.js +1 -0
  68. package/dist/render/render_queue.js.map +1 -1
  69. package/dist/render/rendergraph/history_resource_manager.js +93 -93
  70. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  71. package/dist/render/rendergraph/history_resources.js +3 -3
  72. package/dist/render/rendergraph/history_resources.js.map +1 -1
  73. package/dist/render/rendergraph/types.js +22 -22
  74. package/dist/render/rendergraph/types.js.map +1 -1
  75. package/dist/scene/basesprite.js +1 -5
  76. package/dist/scene/basesprite.js.map +1 -1
  77. package/dist/scene/batchgroup.js +29 -17
  78. package/dist/scene/batchgroup.js.map +1 -1
  79. package/dist/scene/environment.js +1 -0
  80. package/dist/scene/environment.js.map +1 -1
  81. package/dist/scene/mesh.js +8 -9
  82. package/dist/scene/mesh.js.map +1 -1
  83. package/dist/scene/meshdrawable.js +96 -0
  84. package/dist/scene/meshdrawable.js.map +1 -0
  85. package/dist/scene/msdftext.js +341 -0
  86. package/dist/scene/msdftext.js.map +1 -0
  87. package/dist/scene/msdftextsprite.js +349 -0
  88. package/dist/scene/msdftextsprite.js.map +1 -0
  89. package/dist/scene/particlesys.js +1 -0
  90. package/dist/scene/particlesys.js.map +1 -1
  91. package/dist/scene/scene.js +1 -0
  92. package/dist/scene/scene.js.map +1 -1
  93. package/dist/scene/scene_node.js +6 -0
  94. package/dist/scene/scene_node.js.map +1 -1
  95. package/dist/scene/sdftextsprite.js +322 -0
  96. package/dist/scene/sdftextsprite.js.map +1 -0
  97. package/dist/scene/terrain-cm/grass.js +1 -0
  98. package/dist/scene/terrain-cm/grass.js.map +1 -1
  99. package/dist/scene/terrain-cm/grassmaterial.js +1 -0
  100. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  101. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  102. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  103. package/dist/scene/textsprite.js +120 -0
  104. package/dist/scene/textsprite.js.map +1 -0
  105. package/dist/scene/water.js +1 -0
  106. package/dist/scene/water.js.map +1 -1
  107. package/dist/shadow/shader.js +1 -0
  108. package/dist/shadow/shader.js.map +1 -1
  109. package/dist/shapes/torus.js +90 -59
  110. package/dist/shapes/torus.js.map +1 -1
  111. package/dist/src/animation/animation.js +127 -0
  112. package/dist/src/animation/animation.js.map +1 -0
  113. package/dist/src/animation/animationset.js +255 -0
  114. package/dist/src/animation/animationset.js.map +1 -0
  115. package/dist/src/animation/animationtrack.js +34 -0
  116. package/dist/src/animation/animationtrack.js.map +1 -0
  117. package/dist/src/animation/eulerrotationtrack.js +52 -0
  118. package/dist/src/animation/eulerrotationtrack.js.map +1 -0
  119. package/dist/src/animation/morphtarget.js +93 -0
  120. package/dist/src/animation/morphtarget.js.map +1 -0
  121. package/dist/src/animation/morphtrack.js +70 -0
  122. package/dist/src/animation/morphtrack.js.map +1 -0
  123. package/dist/src/animation/proptrack.js +161 -0
  124. package/dist/src/animation/proptrack.js.map +1 -0
  125. package/dist/src/animation/rotationtrack.js +51 -0
  126. package/dist/src/animation/rotationtrack.js.map +1 -0
  127. package/dist/src/animation/scaletrack.js +50 -0
  128. package/dist/src/animation/scaletrack.js.map +1 -0
  129. package/dist/src/animation/skeleton.js +204 -0
  130. package/dist/src/animation/skeleton.js.map +1 -0
  131. package/dist/src/animation/translationtrack.js +50 -0
  132. package/dist/src/animation/translationtrack.js.map +1 -0
  133. package/dist/src/app/app.js +129 -0
  134. package/dist/src/app/app.js.map +1 -0
  135. package/dist/src/app/inputmgr.js +267 -0
  136. package/dist/src/app/inputmgr.js.map +1 -0
  137. package/dist/src/asset/assetmanager.js +404 -0
  138. package/dist/src/asset/assetmanager.js.map +1 -0
  139. package/dist/src/asset/builtin.js +337 -0
  140. package/dist/src/asset/builtin.js.map +1 -0
  141. package/dist/src/asset/loaders/dds/dds.js +470 -0
  142. package/dist/src/asset/loaders/dds/dds.js.map +1 -0
  143. package/dist/src/asset/loaders/dds/dds_loader.js +28 -0
  144. package/dist/src/asset/loaders/dds/dds_loader.js.map +1 -0
  145. package/dist/src/asset/loaders/gltf/gltf_loader.js +1265 -0
  146. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +1 -0
  147. package/dist/src/asset/loaders/gltf/helpers.js +327 -0
  148. package/dist/src/asset/loaders/gltf/helpers.js.map +1 -0
  149. package/dist/src/asset/loaders/hdr/hdr.js +180 -0
  150. package/dist/src/asset/loaders/hdr/hdr.js.map +1 -0
  151. package/dist/src/asset/loaders/image/tga_Loader.js +116 -0
  152. package/dist/src/asset/loaders/image/tga_Loader.js.map +1 -0
  153. package/dist/src/asset/loaders/image/webimage_loader.js +63 -0
  154. package/dist/src/asset/loaders/image/webimage_loader.js.map +1 -0
  155. package/dist/src/asset/loaders/loader.js +45 -0
  156. package/dist/src/asset/loaders/loader.js.map +1 -0
  157. package/dist/src/asset/model.js +414 -0
  158. package/dist/src/asset/model.js.map +1 -0
  159. package/dist/src/blitter/bilateralblur.js +221 -0
  160. package/dist/src/blitter/bilateralblur.js.map +1 -0
  161. package/dist/src/blitter/blitter.js +390 -0
  162. package/dist/src/blitter/blitter.js.map +1 -0
  163. package/dist/src/blitter/box.js +118 -0
  164. package/dist/src/blitter/box.js.map +1 -0
  165. package/dist/src/blitter/copy.js +22 -0
  166. package/dist/src/blitter/copy.js.map +1 -0
  167. package/dist/src/blitter/gaussianblur.js +228 -0
  168. package/dist/src/blitter/gaussianblur.js.map +1 -0
  169. package/dist/src/camera/base.js +92 -0
  170. package/dist/src/camera/base.js.map +1 -0
  171. package/dist/src/camera/camera.js +1005 -0
  172. package/dist/src/camera/camera.js.map +1 -0
  173. package/dist/src/camera/fps.js +238 -0
  174. package/dist/src/camera/fps.js.map +1 -0
  175. package/dist/src/camera/orbit.js +245 -0
  176. package/dist/src/camera/orbit.js.map +1 -0
  177. package/dist/src/camera/orthocamera.js +167 -0
  178. package/dist/src/camera/orthocamera.js.map +1 -0
  179. package/dist/src/camera/perspectivecamera.js +141 -0
  180. package/dist/src/camera/perspectivecamera.js.map +1 -0
  181. package/dist/src/index.js +120 -0
  182. package/dist/src/index.js.map +1 -0
  183. package/dist/src/material/blinn.js +81 -0
  184. package/dist/src/material/blinn.js.map +1 -0
  185. package/dist/src/material/grassmaterial.js +113 -0
  186. package/dist/src/material/grassmaterial.js.map +1 -0
  187. package/dist/src/material/lambert.js +92 -0
  188. package/dist/src/material/lambert.js.map +1 -0
  189. package/dist/src/material/material.js +301 -0
  190. package/dist/src/material/material.js.map +1 -0
  191. package/dist/src/material/meshmaterial.js +704 -0
  192. package/dist/src/material/meshmaterial.js.map +1 -0
  193. package/dist/src/material/mixins/albedocolor.js +76 -0
  194. package/dist/src/material/mixins/albedocolor.js.map +1 -0
  195. package/dist/src/material/mixins/foliage.js +47 -0
  196. package/dist/src/material/mixins/foliage.js.map +1 -0
  197. package/dist/src/material/mixins/lightmodel/blinnphong.js +112 -0
  198. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +1 -0
  199. package/dist/src/material/mixins/lightmodel/lambert.js +58 -0
  200. package/dist/src/material/mixins/lightmodel/lambert.js.map +1 -0
  201. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +178 -0
  202. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -0
  203. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +139 -0
  204. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -0
  205. package/dist/src/material/mixins/lit.js +476 -0
  206. package/dist/src/material/mixins/lit.js.map +1 -0
  207. package/dist/src/material/mixins/pbr/common.js +918 -0
  208. package/dist/src/material/mixins/pbr/common.js.map +1 -0
  209. package/dist/src/material/mixins/texture.js +172 -0
  210. package/dist/src/material/mixins/texture.js.map +1 -0
  211. package/dist/src/material/mixins/vertexcolor.js +56 -0
  212. package/dist/src/material/mixins/vertexcolor.js.map +1 -0
  213. package/dist/src/material/particle.js +178 -0
  214. package/dist/src/material/particle.js.map +1 -0
  215. package/dist/src/material/pbrmr.js +97 -0
  216. package/dist/src/material/pbrmr.js.map +1 -0
  217. package/dist/src/material/pbrsg.js +97 -0
  218. package/dist/src/material/pbrsg.js.map +1 -0
  219. package/dist/src/material/shader/helper.js +1209 -0
  220. package/dist/src/material/shader/helper.js.map +1 -0
  221. package/dist/src/material/terrain-cm.js +606 -0
  222. package/dist/src/material/terrain-cm.js.map +1 -0
  223. package/dist/src/material/terrainmaterial.js +375 -0
  224. package/dist/src/material/terrainmaterial.js.map +1 -0
  225. package/dist/src/material/unlit.js +41 -0
  226. package/dist/src/material/unlit.js.map +1 -0
  227. package/dist/src/material/water.js +417 -0
  228. package/dist/src/material/water.js.map +1 -0
  229. package/dist/src/posteffect/bloom.js +361 -0
  230. package/dist/src/posteffect/bloom.js.map +1 -0
  231. package/dist/src/posteffect/compositor.js +226 -0
  232. package/dist/src/posteffect/compositor.js.map +1 -0
  233. package/dist/src/posteffect/fxaa.js +273 -0
  234. package/dist/src/posteffect/fxaa.js.map +1 -0
  235. package/dist/src/posteffect/grayscale.js +69 -0
  236. package/dist/src/posteffect/grayscale.js.map +1 -0
  237. package/dist/src/posteffect/motionblur.js +96 -0
  238. package/dist/src/posteffect/motionblur.js.map +1 -0
  239. package/dist/src/posteffect/posteffect.js +126 -0
  240. package/dist/src/posteffect/posteffect.js.map +1 -0
  241. package/dist/src/posteffect/sao.js +324 -0
  242. package/dist/src/posteffect/sao.js.map +1 -0
  243. package/dist/src/posteffect/ssr.js +489 -0
  244. package/dist/src/posteffect/ssr.js.map +1 -0
  245. package/dist/src/posteffect/taa.js +172 -0
  246. package/dist/src/posteffect/taa.js.map +1 -0
  247. package/dist/src/posteffect/tonemap.js +94 -0
  248. package/dist/src/posteffect/tonemap.js.map +1 -0
  249. package/dist/src/render/abuffer_oit.js +361 -0
  250. package/dist/src/render/abuffer_oit.js.map +1 -0
  251. package/dist/src/render/clipmap.js +851 -0
  252. package/dist/src/render/clipmap.js.map +1 -0
  253. package/dist/src/render/cluster_light.js +333 -0
  254. package/dist/src/render/cluster_light.js.map +1 -0
  255. package/dist/src/render/cull_visitor.js +187 -0
  256. package/dist/src/render/cull_visitor.js.map +1 -0
  257. package/dist/src/render/depthpass.js +68 -0
  258. package/dist/src/render/depthpass.js.map +1 -0
  259. package/dist/src/render/drawable_mixin.js +227 -0
  260. package/dist/src/render/drawable_mixin.js.map +1 -0
  261. package/dist/src/render/envlight.js +463 -0
  262. package/dist/src/render/envlight.js.map +1 -0
  263. package/dist/src/render/fbm_wavegenerator.js +251 -0
  264. package/dist/src/render/fbm_wavegenerator.js.map +1 -0
  265. package/dist/src/render/fft_wavegenerator.js +1006 -0
  266. package/dist/src/render/fft_wavegenerator.js.map +1 -0
  267. package/dist/src/render/fullscreenquad.js +38 -0
  268. package/dist/src/render/fullscreenquad.js.map +1 -0
  269. package/dist/src/render/gerstner_wavegenerator.js +314 -0
  270. package/dist/src/render/gerstner_wavegenerator.js.map +1 -0
  271. package/dist/src/render/globalbindgroup_allocator.js +60 -0
  272. package/dist/src/render/globalbindgroup_allocator.js.map +1 -0
  273. package/dist/src/render/hzb.js +273 -0
  274. package/dist/src/render/hzb.js.map +1 -0
  275. package/dist/src/render/lightpass.js +172 -0
  276. package/dist/src/render/lightpass.js.map +1 -0
  277. package/dist/src/render/objectcolorpass.js +51 -0
  278. package/dist/src/render/objectcolorpass.js.map +1 -0
  279. package/dist/src/render/primitive.js +364 -0
  280. package/dist/src/render/primitive.js.map +1 -0
  281. package/dist/src/render/render_queue.js +467 -0
  282. package/dist/src/render/render_queue.js.map +1 -0
  283. package/dist/src/render/renderbundle_wrapper.js +152 -0
  284. package/dist/src/render/renderbundle_wrapper.js.map +1 -0
  285. package/dist/src/render/renderer.js +455 -0
  286. package/dist/src/render/renderer.js.map +1 -0
  287. package/dist/src/render/renderpass.js +200 -0
  288. package/dist/src/render/renderpass.js.map +1 -0
  289. package/dist/src/render/shadowmap_pass.js +56 -0
  290. package/dist/src/render/shadowmap_pass.js.map +1 -0
  291. package/dist/src/render/sky.js +1103 -0
  292. package/dist/src/render/sky.js.map +1 -0
  293. package/dist/src/render/weightedblended_oit.js +168 -0
  294. package/dist/src/render/weightedblended_oit.js.map +1 -0
  295. package/dist/src/scene/batchgroup.js +162 -0
  296. package/dist/src/scene/batchgroup.js.map +1 -0
  297. package/dist/src/scene/environment.js +209 -0
  298. package/dist/src/scene/environment.js.map +1 -0
  299. package/dist/src/scene/graph_node.js +72 -0
  300. package/dist/src/scene/graph_node.js.map +1 -0
  301. package/dist/src/scene/light.js +416 -0
  302. package/dist/src/scene/light.js.map +1 -0
  303. package/dist/src/scene/mesh.js +341 -0
  304. package/dist/src/scene/mesh.js.map +1 -0
  305. package/dist/src/scene/octree.js +649 -0
  306. package/dist/src/scene/octree.js.map +1 -0
  307. package/dist/src/scene/particlesys.js +738 -0
  308. package/dist/src/scene/particlesys.js.map +1 -0
  309. package/dist/src/scene/raycast_visitor.js +103 -0
  310. package/dist/src/scene/raycast_visitor.js.map +1 -0
  311. package/dist/src/scene/scene.js +284 -0
  312. package/dist/src/scene/scene.js.map +1 -0
  313. package/dist/src/scene/scene_node.js +732 -0
  314. package/dist/src/scene/scene_node.js.map +1 -0
  315. package/dist/src/scene/terrain/grass.js +278 -0
  316. package/dist/src/scene/terrain/grass.js.map +1 -0
  317. package/dist/src/scene/terrain/heightfield.js +475 -0
  318. package/dist/src/scene/terrain/heightfield.js.map +1 -0
  319. package/dist/src/scene/terrain/patch.js +530 -0
  320. package/dist/src/scene/terrain/patch.js.map +1 -0
  321. package/dist/src/scene/terrain/quadtree.js +461 -0
  322. package/dist/src/scene/terrain/quadtree.js.map +1 -0
  323. package/dist/src/scene/terrain/terrain.js +246 -0
  324. package/dist/src/scene/terrain/terrain.js.map +1 -0
  325. package/dist/src/scene/terrain-cm/grass.js +594 -0
  326. package/dist/src/scene/terrain-cm/grass.js.map +1 -0
  327. package/dist/src/scene/terrain-cm/grassmaterial.js +159 -0
  328. package/dist/src/scene/terrain-cm/grassmaterial.js.map +1 -0
  329. package/dist/src/scene/terrain-cm/terrain-cm.js +538 -0
  330. package/dist/src/scene/terrain-cm/terrain-cm.js.map +1 -0
  331. package/dist/src/scene/water.js +374 -0
  332. package/dist/src/scene/water.js.map +1 -0
  333. package/dist/src/shaders/atmosphere.js +957 -0
  334. package/dist/src/shaders/atmosphere.js.map +1 -0
  335. package/dist/src/shaders/fog.js +112 -0
  336. package/dist/src/shaders/fog.js.map +1 -0
  337. package/dist/src/shaders/misc.js +266 -0
  338. package/dist/src/shaders/misc.js.map +1 -0
  339. package/dist/src/shaders/noise.js +222 -0
  340. package/dist/src/shaders/noise.js.map +1 -0
  341. package/dist/src/shaders/pbr.js +51 -0
  342. package/dist/src/shaders/pbr.js.map +1 -0
  343. package/dist/src/shaders/shadow.js +636 -0
  344. package/dist/src/shaders/shadow.js.map +1 -0
  345. package/dist/src/shaders/ssr.js +490 -0
  346. package/dist/src/shaders/ssr.js.map +1 -0
  347. package/dist/src/shaders/temporal.js +215 -0
  348. package/dist/src/shaders/temporal.js.map +1 -0
  349. package/dist/src/shaders/water.js +756 -0
  350. package/dist/src/shaders/water.js.map +1 -0
  351. package/dist/src/shadow/esm.js +237 -0
  352. package/dist/src/shadow/esm.js.map +1 -0
  353. package/dist/src/shadow/pcf_opt.js +181 -0
  354. package/dist/src/shadow/pcf_opt.js.map +1 -0
  355. package/dist/src/shadow/pcf_pd.js +189 -0
  356. package/dist/src/shadow/pcf_pd.js.map +1 -0
  357. package/dist/src/shadow/shader.js +37 -0
  358. package/dist/src/shadow/shader.js.map +1 -0
  359. package/dist/src/shadow/shadow_impl.js +15 -0
  360. package/dist/src/shadow/shadow_impl.js.map +1 -0
  361. package/dist/src/shadow/shadowmapper.js +790 -0
  362. package/dist/src/shadow/shadowmapper.js.map +1 -0
  363. package/dist/src/shadow/ssm.js +159 -0
  364. package/dist/src/shadow/ssm.js.map +1 -0
  365. package/dist/src/shadow/vsm.js +297 -0
  366. package/dist/src/shadow/vsm.js.map +1 -0
  367. package/dist/src/shapes/box.js +386 -0
  368. package/dist/src/shapes/box.js.map +1 -0
  369. package/dist/src/shapes/cylinder.js +125 -0
  370. package/dist/src/shapes/cylinder.js.map +1 -0
  371. package/dist/src/shapes/plane.js +88 -0
  372. package/dist/src/shapes/plane.js.map +1 -0
  373. package/dist/src/shapes/shape.js +87 -0
  374. package/dist/src/shapes/shape.js.map +1 -0
  375. package/dist/src/shapes/sphere.js +114 -0
  376. package/dist/src/shapes/sphere.js.map +1 -0
  377. package/dist/src/shapes/tetrahedron.js +188 -0
  378. package/dist/src/shapes/tetrahedron.js.map +1 -0
  379. package/dist/src/shapes/torus.js +111 -0
  380. package/dist/src/shapes/torus.js.map +1 -0
  381. package/dist/src/utility/aabbtree.js +400 -0
  382. package/dist/src/utility/aabbtree.js.map +1 -0
  383. package/dist/src/utility/bounding_volume.js +29 -0
  384. package/dist/src/utility/bounding_volume.js.map +1 -0
  385. package/dist/src/utility/debug.js +28 -0
  386. package/dist/src/utility/debug.js.map +1 -0
  387. package/dist/src/utility/draco/decoder.js +116 -0
  388. package/dist/src/utility/draco/decoder.js.map +1 -0
  389. package/dist/src/utility/misc.js +105 -0
  390. package/dist/src/utility/misc.js.map +1 -0
  391. package/dist/src/utility/panorama.js +163 -0
  392. package/dist/src/utility/panorama.js.map +1 -0
  393. package/dist/src/utility/pmrem.js +354 -0
  394. package/dist/src/utility/pmrem.js.map +1 -0
  395. package/dist/src/utility/rendermipmap.js +115 -0
  396. package/dist/src/utility/rendermipmap.js.map +1 -0
  397. package/dist/src/utility/serialization/json.js +402 -0
  398. package/dist/src/utility/serialization/json.js.map +1 -0
  399. package/dist/src/utility/serialization/manager.js +623 -0
  400. package/dist/src/utility/serialization/manager.js.map +1 -0
  401. package/dist/src/utility/serialization/scene/animation.js +248 -0
  402. package/dist/src/utility/serialization/scene/animation.js.map +1 -0
  403. package/dist/src/utility/serialization/scene/batch.js +59 -0
  404. package/dist/src/utility/serialization/scene/batch.js.map +1 -0
  405. package/dist/src/utility/serialization/scene/camera.js +790 -0
  406. package/dist/src/utility/serialization/scene/camera.js.map +1 -0
  407. package/dist/src/utility/serialization/scene/common.js +222 -0
  408. package/dist/src/utility/serialization/scene/common.js.map +1 -0
  409. package/dist/src/utility/serialization/scene/light.js +575 -0
  410. package/dist/src/utility/serialization/scene/light.js.map +1 -0
  411. package/dist/src/utility/serialization/scene/material.js +1111 -0
  412. package/dist/src/utility/serialization/scene/material.js.map +1 -0
  413. package/dist/src/utility/serialization/scene/mesh.js +148 -0
  414. package/dist/src/utility/serialization/scene/mesh.js.map +1 -0
  415. package/dist/src/utility/serialization/scene/misc.js +39 -0
  416. package/dist/src/utility/serialization/scene/misc.js.map +1 -0
  417. package/dist/src/utility/serialization/scene/node.js +451 -0
  418. package/dist/src/utility/serialization/scene/node.js.map +1 -0
  419. package/dist/src/utility/serialization/scene/particle.js +425 -0
  420. package/dist/src/utility/serialization/scene/particle.js.map +1 -0
  421. package/dist/src/utility/serialization/scene/primitive.js +692 -0
  422. package/dist/src/utility/serialization/scene/primitive.js.map +1 -0
  423. package/dist/src/utility/serialization/scene/scene.js +704 -0
  424. package/dist/src/utility/serialization/scene/scene.js.map +1 -0
  425. package/dist/src/utility/serialization/scene/terrain.js +488 -0
  426. package/dist/src/utility/serialization/scene/terrain.js.map +1 -0
  427. package/dist/src/utility/serialization/scene/water.js +465 -0
  428. package/dist/src/utility/serialization/scene/water.js.map +1 -0
  429. package/dist/src/utility/shprojector.js +297 -0
  430. package/dist/src/utility/shprojector.js.map +1 -0
  431. package/dist/src/utility/textures/ggxlut.js +213 -0
  432. package/dist/src/utility/textures/ggxlut.js.map +1 -0
  433. package/dist/src/utility/textures/gradientnoise.js +62 -0
  434. package/dist/src/utility/textures/gradientnoise.js.map +1 -0
  435. package/dist/src/utility/textures/randomnoise.js +41 -0
  436. package/dist/src/utility/textures/randomnoise.js.map +1 -0
  437. package/dist/src/values.js +162 -0
  438. package/dist/src/values.js.map +1 -0
  439. package/dist/text/font/font_asset.js +884 -0
  440. package/dist/text/font/font_asset.js.map +1 -0
  441. package/dist/text/font/sfnt_reader.js +43 -0
  442. package/dist/text/font/sfnt_reader.js.map +1 -0
  443. package/dist/text/msdf/generator.js +417 -0
  444. package/dist/text/msdf/generator.js.map +1 -0
  445. package/dist/text/msdf/shape.js +143 -0
  446. package/dist/text/msdf/shape.js.map +1 -0
  447. package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
  448. package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
  449. package/dist/text/runtime/msdf_text_atlas_manager.js +47 -0
  450. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
  451. package/dist/text/runtime/text_layout.js +96 -0
  452. package/dist/text/runtime/text_layout.js.map +1 -0
  453. package/dist/utility/blueprint/material/common.js +7 -0
  454. package/dist/utility/blueprint/material/common.js.map +1 -0
  455. package/dist/utility/blueprint/material/inputs.js +1275 -1091
  456. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  457. package/dist/utility/blueprint/material/ir.js +505 -490
  458. package/dist/utility/blueprint/material/ir.js.map +1 -1
  459. package/dist/utility/blueprint/material/pbr.js +32 -0
  460. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  461. package/dist/utility/serialization/blueprint/constants.js +255 -0
  462. package/dist/utility/serialization/blueprint/constants.js.map +1 -0
  463. package/dist/utility/serialization/blueprint/material/constants.js +203 -0
  464. package/dist/utility/serialization/blueprint/material/constants.js.map +1 -0
  465. package/dist/utility/serialization/blueprint/material/texture.js +165 -0
  466. package/dist/utility/serialization/blueprint/material/texture.js.map +1 -0
  467. package/dist/utility/serialization/manager.js +55 -11
  468. package/dist/utility/serialization/manager.js.map +1 -1
  469. package/dist/utility/serialization/scene/animation.js +2 -0
  470. package/dist/utility/serialization/scene/animation.js.map +1 -1
  471. package/dist/utility/serialization/scene/batch.js +2 -0
  472. package/dist/utility/serialization/scene/batch.js.map +1 -1
  473. package/dist/utility/serialization/scene/camera.js +2 -0
  474. package/dist/utility/serialization/scene/camera.js.map +1 -1
  475. package/dist/utility/serialization/scene/common.js.map +1 -1
  476. package/dist/utility/serialization/scene/light.js +2 -0
  477. package/dist/utility/serialization/scene/light.js.map +1 -1
  478. package/dist/utility/serialization/scene/material.js +1 -0
  479. package/dist/utility/serialization/scene/material.js.map +1 -1
  480. package/dist/utility/serialization/scene/mesh.js +2 -0
  481. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  482. package/dist/utility/serialization/scene/node.js +2 -0
  483. package/dist/utility/serialization/scene/node.js.map +1 -1
  484. package/dist/utility/serialization/scene/particle.js +2 -0
  485. package/dist/utility/serialization/scene/particle.js.map +1 -1
  486. package/dist/utility/serialization/scene/primitive.js +1 -0
  487. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  488. package/dist/utility/serialization/scene/scene.js.map +1 -1
  489. package/dist/utility/serialization/scene/sprite.js +2 -0
  490. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  491. package/dist/utility/serialization/scene/terrain.js +2 -0
  492. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  493. package/dist/utility/serialization/scene/text.js +516 -0
  494. package/dist/utility/serialization/scene/text.js.map +1 -0
  495. package/dist/utility/serialization/scene/water.js +2 -0
  496. package/dist/utility/serialization/scene/water.js.map +1 -1
  497. package/dist/utility/serialization/types.js +4 -4
  498. package/dist/utility/serialization/types.js.map +1 -1
  499. package/dist/values.js +1 -5
  500. package/dist/values.js.map +1 -1
  501. package/package.json +3 -3
  502. package/dist/animation/joint_dynamics/vrm_spring_bone.js +0 -46
  503. package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +0 -1
  504. package/dist/animation/spring/spring_bone.js +0 -240
  505. package/dist/animation/spring/spring_bone.js.map +0 -1
  506. package/dist/animation/spring/spring_bone_collider.js +0 -198
  507. package/dist/animation/spring/spring_bone_collider.js.map +0 -1
  508. package/dist/animation/spring/spring_bone_constraint.js +0 -170
  509. package/dist/animation/spring/spring_bone_constraint.js.map +0 -1
  510. package/dist/animation/spring/spring_bone_system.js +0 -328
  511. package/dist/animation/spring/spring_bone_system.js.map +0 -1
  512. package/dist/render/sky_motion_vector.js +0 -85
  513. package/dist/render/sky_motion_vector.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain-cm.js","sources":["../../../src/material/terrain-cm.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n GPUDataBuffer,\r\n PBFunctionScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D,\r\n Texture2DArray\r\n} from '@zephyr3d/device';\r\nimport { applyMaterialMixins, MeshMaterial } from './meshmaterial';\r\nimport type { DrawContext } from '../render';\r\nimport { MaterialVaryingFlags, MAX_TERRAIN_MIPMAP_LEVELS } from '../values';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport { DRef, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport { mixinLight } from './mixins/lit';\r\nimport { Application } from '../app';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { mixinPBRMetallicRoughness } from './mixins/lightmodel/pbrmetallicroughness';\r\nimport { CopyBlitter } from '../blitter';\r\n\r\ntype ClipmapTerrainDetailMapInfo = {\r\n detailMap: DRef<Texture2DArray>;\r\n detailNormalMap?: DRef<Texture2DArray>;\r\n detailMapList: DRef<Texture2D>[];\r\n detailNormalMapList: DRef<Texture2D>[];\r\n splatMap: DRef<Texture2DArray | Texture2D>;\r\n detailMapParams: Float32Array<ArrayBuffer>;\r\n numDetailMaps: number;\r\n};\r\n\r\nconst MAX_DETAIL_MAPS = 8;\r\n\r\n/**\r\n * Terrain debug rendering mode\r\n * @public\r\n */\r\nexport type TerrainDebugMode =\r\n | 'none'\r\n | 'vertex_normal'\r\n | 'detail_normal'\r\n | 'tangent'\r\n | 'uv'\r\n | 'bitangent'\r\n | 'albedo';\r\n\r\n/**\r\n * Default material type of clipmap terrain\r\n * @public\r\n */\r\nexport class ClipmapTerrainMaterial extends applyMaterialMixins(\r\n MeshMaterial,\r\n mixinLight,\r\n mixinPBRMetallicRoughness\r\n) {\r\n private static readonly FEATURE_DETAIL_MAP = this.defineFeature();\r\n private static readonly FEATURE_DEBUG_MODE = this.defineFeature();\r\n private static readonly _defaultDetailMap: DRef<Texture2D> = new DRef();\r\n private static readonly _defaultNormalMap: DRef<Texture2D> = new DRef();\r\n private readonly _region: Vector4;\r\n private readonly _clipmapGridInfo: Vector4;\r\n private readonly _heightMap: DRef<Texture2D>;\r\n private readonly _terrainScale: Vector3;\r\n private _detailMapInfo: ClipmapTerrainDetailMapInfo;\r\n private readonly _detailMapSize: number;\r\n private readonly _splatMapSize: number;\r\n private readonly _heightMapSize: Vector4;\r\n private readonly _levelDataBuffer: DRef<GPUDataBuffer>;\r\n constructor(heightMap: Texture2D) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.albedoTexCoordIndex = -1;\r\n this.normalTexCoordIndex = -1;\r\n this._region = new Vector4(-99999, -99999, 99999, 99999);\r\n this._clipmapGridInfo = new Vector4();\r\n this._heightMap = new DRef(heightMap);\r\n this._detailMapSize = 256;\r\n this._splatMapSize = 512;\r\n this._levelDataBuffer = new DRef(\r\n Application.instance.device.createBuffer(MAX_TERRAIN_MIPMAP_LEVELS * 4 * 2 * 4, { usage: 'uniform' })\r\n );\r\n this._detailMapInfo = this.createDetailMapInfo();\r\n this._terrainScale = Vector3.one();\r\n this._heightMapSize = new Vector4(\r\n this.heightMap.width,\r\n this.heightMap.height,\r\n 1 / this.heightMap.width,\r\n 1 / this.heightMap.height\r\n );\r\n this.useFeature(ClipmapTerrainMaterial.FEATURE_DETAIL_MAP, 0);\r\n this.useFeature(ClipmapTerrainMaterial.FEATURE_DEBUG_MODE, 'none');\r\n }\r\n static get MAX_DETAIL_MAP_COUNT() {\r\n return MAX_DETAIL_MAPS;\r\n }\r\n get debugMode(): TerrainDebugMode {\r\n return this.featureUsed<TerrainDebugMode>(ClipmapTerrainMaterial.FEATURE_DEBUG_MODE);\r\n }\r\n set debugMode(mode: TerrainDebugMode) {\r\n this.useFeature(ClipmapTerrainMaterial.FEATURE_DEBUG_MODE, mode);\r\n }\r\n /** @internal */\r\n setLevelData(data: Float32Array<ArrayBuffer>, length: number) {\r\n this._levelDataBuffer.get().bufferSubData(0, data, 0, length);\r\n }\r\n /** @internal */\r\n get region() {\r\n return this._region;\r\n }\r\n set region(val: Vector4) {\r\n if (!val.equalsTo(this._region)) {\r\n this._region.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n setClipmapGridInfo(gridScale: number, gridOffsetX: number, gridOffsetY: number) {\r\n if (\r\n this._clipmapGridInfo.x !== gridScale ||\r\n this._clipmapGridInfo.y !== gridOffsetX ||\r\n this._clipmapGridInfo.z !== gridOffsetY\r\n ) {\r\n this._clipmapGridInfo.setXYZW(gridScale, gridOffsetX, gridOffsetY, 0);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** @internal */\r\n get terrainScale() {\r\n return this._terrainScale;\r\n }\r\n set terrainScale(val: Vector3) {\r\n if (!this._terrainScale.equalsTo(val)) {\r\n this._terrainScale.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n get numDetailMaps() {\r\n return this._detailMapInfo.numDetailMaps;\r\n }\r\n set numDetailMaps(val: number) {\r\n if (val > MAX_DETAIL_MAPS || val < 0 || !Number.isInteger(val)) {\r\n console.error('Invalid number of detail maps');\r\n return;\r\n }\r\n if (Application.instance.device.type === 'webgl' && val > 4) {\r\n console.error('Only 4 detail map layers is supported for WebGL1');\r\n return;\r\n }\r\n const n = this._detailMapInfo.numDetailMaps;\r\n const defaultDetailMap = ClipmapTerrainMaterial.getDefaultDetailMap();\r\n const defaultNormalMap = ClipmapTerrainMaterial.getDefaultNormalMap();\r\n if (val > n) {\r\n this._detailMapInfo.numDetailMaps = val;\r\n for (let i = n; i < val; i++) {\r\n this.setDetailMap(i, defaultDetailMap);\r\n this.setDetailNormalMap(i, defaultNormalMap);\r\n this.setDetailMapUVScale(i, 80);\r\n this.setDetailMapRoughness(i, 1);\r\n this._detailMapInfo.detailMapList[i].dispose();\r\n this._detailMapInfo.detailNormalMapList[i].dispose();\r\n }\r\n } else if (val < n) {\r\n for (let i = val; i < n; i++) {\r\n this.setDetailMap(i, defaultDetailMap);\r\n this.setDetailNormalMap(i, defaultNormalMap);\r\n this.setDetailMapUVScale(i, 80);\r\n this.setDetailMapRoughness(i, 1);\r\n this._detailMapInfo.detailMapList[i].dispose();\r\n this._detailMapInfo.detailNormalMapList[i].dispose();\r\n }\r\n this._detailMapInfo.numDetailMaps = val;\r\n }\r\n this.useFeature(ClipmapTerrainMaterial.FEATURE_DETAIL_MAP, this._detailMapInfo.numDetailMaps);\r\n }\r\n getSplatMap() {\r\n return this._detailMapInfo.splatMap?.get() ?? null;\r\n }\r\n setSplatMap(tex: Texture2DArray) {\r\n if (tex !== this._detailMapInfo.splatMap.get()) {\r\n if (!tex || tex.depth !== MAX_DETAIL_MAPS >> 2) {\r\n console.error('Invalid splat map');\r\n return;\r\n }\r\n this._detailMapInfo.splatMap.set(tex);\r\n this.uniformChanged();\r\n }\r\n }\r\n getDetailMapUVScale(index: number): number {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return 0;\r\n }\r\n return this._detailMapInfo.detailMapParams[index * 4];\r\n }\r\n setDetailMapUVScale(index: number, scale: number) {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return;\r\n }\r\n if (this._detailMapInfo.detailMapParams[index * 4] !== scale) {\r\n this._detailMapInfo.detailMapParams[index * 4] = scale;\r\n this.uniformChanged();\r\n }\r\n }\r\n getDetailMapRoughness(index: number): number {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return 0;\r\n }\r\n return this._detailMapInfo.detailMapParams[index * 4 + 1];\r\n }\r\n setDetailMapRoughness(index: number, val: number) {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return;\r\n }\r\n if (this._detailMapInfo.detailMapParams[index * 4 + 1] !== val) {\r\n this._detailMapInfo.detailMapParams[index * 4 + 1] = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n getDetailMap(index: number): Texture2D {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return null;\r\n }\r\n return this._detailMapInfo.detailMapList[index].get();\r\n }\r\n setDetailMap(index: number, albedoMap: Texture2D) {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return;\r\n }\r\n albedoMap = albedoMap ?? ClipmapTerrainMaterial.getDefaultDetailMap();\r\n if (!this._detailMapInfo.detailMapList[index]) {\r\n this._detailMapInfo.detailMapList[index] = new DRef();\r\n }\r\n this._detailMapInfo.detailMapList[index].set(\r\n albedoMap === ClipmapTerrainMaterial.getDefaultDetailMap() ? null : albedoMap\r\n );\r\n if (Application.instance.device.type !== 'webgl') {\r\n const blitter = new CopyBlitter();\r\n const fb = Application.instance.device.createFrameBuffer([this._detailMapInfo.detailMap.get()], null);\r\n blitter.blit(\r\n albedoMap,\r\n fb,\r\n index,\r\n albedoMap.width === this._detailMapSize && albedoMap.height === this._detailMapSize\r\n ? fetchSampler('clamp_nearest_nomip')\r\n : fetchSampler('clamp_linear_nomip')\r\n );\r\n fb.dispose();\r\n }\r\n }\r\n getDetailNormalMap(index: number): Texture2D {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return null;\r\n }\r\n return this._detailMapInfo.detailNormalMapList[index].get();\r\n }\r\n setDetailNormalMap(index: number, normalMap: Texture2D) {\r\n if (index >= this._detailMapInfo.numDetailMaps || index < 0 || !Number.isInteger(index)) {\r\n console.error('Invalid detail map index');\r\n return;\r\n }\r\n normalMap = normalMap ?? ClipmapTerrainMaterial.getDefaultNormalMap();\r\n if (!this._detailMapInfo.detailNormalMapList[index]) {\r\n this._detailMapInfo.detailNormalMapList[index] = new DRef();\r\n }\r\n this._detailMapInfo.detailNormalMapList[index].set(\r\n normalMap === ClipmapTerrainMaterial.getDefaultNormalMap() ? null : normalMap\r\n );\r\n if (Application.instance.device.type !== 'webgl') {\r\n const blitter = new CopyBlitter();\r\n const fb = Application.instance.device.createFrameBuffer(\r\n [this._detailMapInfo.detailNormalMap.get()],\r\n null\r\n );\r\n blitter.blit(\r\n normalMap,\r\n fb,\r\n index,\r\n normalMap.width === this._detailMapSize && normalMap.height === this._detailMapSize\r\n ? fetchSampler('clamp_nearest_nomip')\r\n : fetchSampler('clamp_linear_nomip')\r\n );\r\n fb.dispose();\r\n }\r\n }\r\n /** @internal */\r\n update(region: Vector4, terrainScale: Vector3) {\r\n if (!region.equalsTo(this._region) || !terrainScale.equalsTo(this._terrainScale)) {\r\n this._region.set(region);\r\n this._terrainScale.set(terrainScale);\r\n this.uniformChanged();\r\n }\r\n }\r\n get heightMap() {\r\n return this._heightMap.get();\r\n }\r\n set heightMap(val: Texture2D) {\r\n if (val !== this._heightMap.get()) {\r\n this._heightMap.set(val);\r\n this._heightMapSize.setXYZW(\r\n this.heightMap.width,\r\n this.heightMap.height,\r\n 1 / this.heightMap.width,\r\n 1 / this.heightMap.height\r\n );\r\n this.uniformChanged();\r\n }\r\n }\r\n needSceneColor(): boolean {\r\n return false;\r\n }\r\n needSceneDepth(): boolean {\r\n return false;\r\n }\r\n supportInstancing(): boolean {\r\n return false;\r\n }\r\n supportLighting(): boolean {\r\n return true;\r\n }\r\n getMetallicRoughnessTexCoord: (scope: PBInsideFunctionScope) => PBShaderExp = function (scope) {\r\n return scope.$inputs.uv;\r\n };\r\n sampleDetailNormalMap(scope: PBInsideFunctionScope, index: number, texCoord: PBShaderExp): PBShaderExp {\r\n const pb = scope.$builder;\r\n const sample =\r\n this.drawContext.device.type === 'webgl'\r\n ? pb.textureSample(scope[`detailNormalMap${index}`], texCoord).rgb\r\n : pb.textureArraySample(scope.detailNormalMap, texCoord, index).rgb;\r\n const normal = pb.sub(pb.mul(sample, 2), pb.vec3(1));\r\n return pb.normalize(normal);\r\n }\r\n calculateDetailNormal(scope: PBInsideFunctionScope, TBN: PBShaderExp) {\r\n const that = this;\r\n const pb = scope.$builder;\r\n const funcName = 'getTerrainNormal';\r\n pb.func(funcName, [pb.mat3('TBN')], function () {\r\n const numDetailMaps = that.featureUsed<number>(ClipmapTerrainMaterial.FEATURE_DETAIL_MAP);\r\n this.$l.detailNormal = pb.vec3(0);\r\n for (let i = 0; i < (numDetailMaps + 3) >> 2; i++) {\r\n this.$l[`mask${i}`] =\r\n that.drawContext.device.type === 'webgl'\r\n ? pb.textureSample(this.splatMap, this.$inputs.uv)\r\n : pb.textureArraySample(this.splatMap, this.$inputs.uv, i);\r\n }\r\n for (let i = 0; i < numDetailMaps; i++) {\r\n const uv = pb.mul(this.$inputs.uv, this.detailParams[i].x);\r\n this.detailNormal = pb.add(\r\n this.detailNormal,\r\n pb.mul(that.sampleDetailNormalMap(this, i, uv), this[`mask${i >> 2}`][i & 3])\r\n );\r\n }\r\n this.$return(pb.normalize(pb.mul(this.TBN, this.detailNormal)));\r\n });\r\n return pb.getGlobalScope()[funcName](TBN);\r\n }\r\n getNormalTexCoord: (scope: PBInsideFunctionScope) => PBShaderExp = function (scope) {\r\n return scope.$inputs.uv;\r\n };\r\n calculateAlbedoColor(scope: PBInsideFunctionScope): PBShaderExp {\r\n const that = this;\r\n const pb = scope.$builder;\r\n const funcName = 'getTerrainAlbedo';\r\n pb.func(funcName, [], function () {\r\n const numDetailMaps = that.featureUsed<number>(ClipmapTerrainMaterial.FEATURE_DETAIL_MAP);\r\n if (numDetailMaps === 0) {\r\n this.$l.checkerPos = pb.mul(this.$inputs.uv, pb.sub(this.region.zw, this.region.xy));\r\n this.$l.ddx = pb.dpdx(this.checkerPos);\r\n this.$l.ddy = pb.dpdy(this.checkerPos);\r\n this.$l.w = pb.add(pb.max(pb.abs(this.ddx), pb.abs(this.ddy)), 0.01);\r\n this.$l.i = pb.div(\r\n pb.mul(\r\n 2,\r\n pb.sub(\r\n pb.abs(pb.sub(pb.fract(pb.mul(pb.sub(this.checkerPos, pb.mul(this.w, 0.5)), 0.5)), 0.5)),\r\n pb.abs(pb.sub(pb.fract(pb.mul(pb.add(this.checkerPos, pb.mul(this.w, 0.5)), 0.5)), 0.5))\r\n )\r\n ),\r\n this.w\r\n );\r\n this.$l.changeRate = pb.add(pb.length(this.ddx), pb.length(this.ddy));\r\n this.$l.fadeStart = pb.float(0);\r\n this.$l.fadeEnd = pb.float(10);\r\n this.$l.fadeFactor = pb.sub(1, pb.smoothStep(this.fadeStart, this.fadeEnd, this.changeRate));\r\n this.$l.checker = pb.mix(0.5, pb.sub(0.5, pb.mul(0.5, this.i.x, this.i.y)), this.fadeFactor);\r\n this.$l.checkerColor = pb.mix(pb.vec3(0.4), pb.vec3(1), pb.vec3(this.checker));\r\n this.$return(pb.vec4(this.checkerColor, 1));\r\n } else {\r\n this.$l.color = pb.vec3(0);\r\n for (let i = 0; i < (numDetailMaps + 3) >> 2; i++) {\r\n this.$l[`mask${i}`] =\r\n that.drawContext.device.type === 'webgl'\r\n ? pb.textureSample(this.splatMap, this.$inputs.uv)\r\n : pb.textureArraySample(this.splatMap, this.$inputs.uv, i);\r\n }\r\n for (let i = 0; i < numDetailMaps; i++) {\r\n const uv = pb.mul(this.$inputs.uv, this.detailParams[i].x);\r\n const sample =\r\n that.drawContext.device.type === 'webgl'\r\n ? pb.textureSample(this[`detailAlbedoMap${i}`], uv).rgb\r\n : pb.textureArraySample(this.detailAlbedoMap, uv, i).rgb;\r\n this.color = pb.add(this.color, pb.mul(sample, this[`mask${i >> 2}`][i & 3]));\r\n }\r\n this.$return(pb.vec4(this.color, 1));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcName]();\r\n }\r\n sampleHeightMap(\r\n scope: PBInsideFunctionScope,\r\n uv: PBShaderExp,\r\n pos: PBShaderExp,\r\n levelStart: PBShaderExp,\r\n levelDiff: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const morphRange = 0.5;\r\n pb.func(\r\n 'sampleHeightMap',\r\n [pb.vec2('uv'), pb.vec2('pos'), pb.vec4('levelStart'), pb.vec4('levelDiff')],\r\n function () {\r\n this.$l.h1 = pb.textureSampleLevel(this.heightMap, this.uv, this.$inputs.miplevel).r;\r\n this.$l.ratio = pb.mul(pb.sub(this.pos.xyxy, this.levelStart), this.levelDiff);\r\n this.$l.maxVal = pb.clamp(\r\n pb.max(pb.max(this.ratio.x, this.ratio.y), pb.max(this.ratio.z, this.ratio.w)),\r\n 0,\r\n 1\r\n );\r\n this.$l.morphFactor = pb.float(0);\r\n this.$if(pb.greaterThan(this.maxVal, 1 - morphRange), function () {\r\n this.$l.h2 = pb.textureSampleLevel(this.heightMap, this.uv, pb.add(this.$inputs.miplevel, 1)).r;\r\n this.morphFactor = pb.div(pb.sub(this.maxVal, 1 - morphRange), morphRange * 2);\r\n this.h1 = pb.mix(this.h1, this.h2, this.morphFactor);\r\n });\r\n this.$if(pb.lessThan(this.maxVal, morphRange), function () {\r\n this.$l.h2 = pb.textureSampleLevel(\r\n this.heightMap,\r\n this.uv,\r\n pb.max(pb.sub(this.$inputs.miplevel, 1), 0)\r\n ).r;\r\n this.morphFactor = pb.mul(pb.add(pb.div(this.maxVal, morphRange), 1), 0.5);\r\n this.h1 = pb.mix(this.h1, this.h2, this.morphFactor);\r\n });\r\n this.$return(this.h1);\r\n }\r\n );\r\n return scope.sampleHeightMap(uv, pos, levelStart, levelDiff);\r\n }\r\n calculateTerrainTBN(\r\n scope: PBInsideFunctionScope,\r\n clipmapPos: PBShaderExp,\r\n uv: PBShaderExp,\r\n texSize: PBShaderExp,\r\n scale: PBShaderExp,\r\n levelStart: PBShaderExp,\r\n levelDiff: PBShaderExp,\r\n tangent: PBShaderExp,\r\n bitangent: PBShaderExp,\r\n normal: PBShaderExp\r\n ): PBShaderExp {\r\n const that = this;\r\n const pb = scope.$builder;\r\n pb.func(\r\n 'calcTerrainTBN',\r\n [\r\n pb.vec2('clipmapPos'),\r\n pb.vec2('uv'),\r\n pb.vec4('texSize'),\r\n pb.vec3('scale'),\r\n pb.vec4('levelStart'),\r\n pb.vec4('levelDiff'),\r\n pb.vec3('t').out(),\r\n pb.vec3('b').out(),\r\n pb.vec3('n').out()\r\n ],\r\n function () {\r\n this.$l.texelSize = pb.mul(this.texSize.zw, pb.exp2(this.$inputs.miplevel));\r\n this.$l.delta = pb.exp2(pb.add(this.$inputs.miplevel, 1));\r\n this.$l.hL = that.sampleHeightMap(\r\n this,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n this.clipmapPos,\r\n this.levelStart,\r\n this.levelDiff\r\n );\r\n this.$l.hR = that.sampleHeightMap(\r\n this,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n this.clipmapPos,\r\n this.levelStart,\r\n this.levelDiff\r\n );\r\n this.$l.hD = that.sampleHeightMap(\r\n this,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n this.clipmapPos,\r\n this.levelStart,\r\n this.levelDiff\r\n );\r\n this.$l.hU = that.sampleHeightMap(\r\n this,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n this.clipmapPos,\r\n this.levelStart,\r\n this.levelDiff\r\n );\r\n this.$l.dHdU = pb.div(\r\n pb.mul(pb.sub(this.hR, this.hL), this.scale.y),\r\n pb.mul(this.scale.x, this.delta)\r\n );\r\n this.$l.dHdV = pb.div(\r\n pb.mul(pb.sub(this.hD, this.hU), this.scale.y),\r\n pb.mul(this.scale.z, this.delta)\r\n );\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.n = pb.normalize(pb.cross(this.b, this.t));\r\n }\r\n );\r\n return scope.calcTerrainTBN(\r\n clipmapPos,\r\n uv,\r\n texSize,\r\n scale,\r\n levelStart,\r\n levelDiff,\r\n tangent,\r\n bitangent,\r\n normal\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.position = pb.vec3().attrib('position');\r\n scope.$inputs.clipmapInfo = pb.vec4().attrib('texCoord0');\r\n scope.$inputs.miplevel = pb.float().attrib('texCoord1');\r\n scope.clipmapGridInfo = pb.vec4().uniform(2);\r\n scope.levelData = pb.vec4[MAX_TERRAIN_MIPMAP_LEVELS * 2]().uniformBuffer(2);\r\n scope.heightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec4().uniform(2);\r\n scope.region = pb.vec4().uniform(2);\r\n scope.terrainScale = pb.vec3().uniform(2);\r\n\r\n scope.$l.s = pb.sin(scope.$inputs.clipmapInfo.x);\r\n scope.$l.c = pb.cos(scope.$inputs.clipmapInfo.x);\r\n scope.$l.scale2 = pb.mul(scope.$inputs.clipmapInfo.y, scope.clipmapGridInfo.x);\r\n scope.$l.clipmapMatrix = pb.mat4(\r\n pb.mul(scope.c, scope.scale2),\r\n pb.mul(scope.s, scope.scale2),\r\n 0,\r\n 0,\r\n pb.neg(pb.mul(scope.s, scope.scale2)),\r\n pb.mul(scope.c, scope.scale2),\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n 0,\r\n pb.sub(pb.mul(scope.$inputs.clipmapInfo.z, scope.clipmapGridInfo.x), scope.clipmapGridInfo.y),\r\n pb.sub(pb.mul(scope.$inputs.clipmapInfo.w, scope.clipmapGridInfo.x), scope.clipmapGridInfo.z),\r\n 0,\r\n 1\r\n );\r\n\r\n scope.$l.clipmapPos = pb.mul(scope.clipmapMatrix, pb.vec4(scope.$inputs.position, 1)).xy;\r\n\r\n scope.$l.clipmapWorldPos = pb.mul(\r\n ShaderHelper.getWorldMatrix(scope),\r\n pb.vec4(scope.clipmapPos.x, 0, scope.clipmapPos.y, 1)\r\n ).xyz;\r\n scope.$outputs.uv = pb.div(\r\n pb.sub(scope.clipmapWorldPos.xz, scope.region.xy),\r\n pb.sub(scope.region.zw, scope.region.xy)\r\n );\r\n\r\n if (this.drawContext.device.type === 'webgl') {\r\n scope.$l.levelStart = pb.vec4();\r\n scope.$l.levelDiff = pb.vec4();\r\n scope.$l.index = pb.mul(pb.int(scope.$inputs.miplevel), 2);\r\n scope.$for(pb.int('i'), 0, 32, function () {\r\n this.$if(pb.equal(this.i, this.index), function () {\r\n this.levelStart = this.levelData.at(this.i);\r\n this.levelDiff = this.levelData.at(pb.add(this.i, 1));\r\n this.$break();\r\n });\r\n });\r\n } else {\r\n scope.$l.levelStart = scope.levelData.at(pb.mul(pb.int(scope.$inputs.miplevel), 2));\r\n scope.$l.levelDiff = scope.levelData.at(pb.add(pb.mul(pb.int(scope.$inputs.miplevel), 2), 1));\r\n }\r\n\r\n scope.$l.height = this.sampleHeightMap(\r\n scope,\r\n scope.$outputs.uv,\r\n scope.clipmapWorldPos.xz,\r\n scope.levelStart,\r\n scope.levelDiff\r\n );\r\n scope.$outputs.worldPos = pb.add(\r\n scope.clipmapWorldPos,\r\n pb.vec3(0, pb.mul(scope.height, scope.terrainScale.y), 0)\r\n );\r\n scope.$l.t = pb.vec3();\r\n scope.$l.b = pb.vec3();\r\n scope.$l.n = pb.vec3();\r\n this.calculateTerrainTBN(\r\n scope,\r\n scope.clipmapWorldPos.xz,\r\n scope.$outputs.uv,\r\n scope.heightMapSize,\r\n scope.terrainScale,\r\n scope.levelStart,\r\n scope.levelDiff,\r\n scope.t,\r\n scope.b,\r\n scope.n\r\n );\r\n scope.$outputs.clipmapPos = scope.clipmapWorldPos;\r\n scope.$outputs.worldTangent = scope.t;\r\n scope.$outputs.worldBinormal = scope.b;\r\n scope.$outputs.worldNormal = scope.n;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\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 scope.region = pb.vec4().uniform(2);\r\n scope.$l.discardable = pb.or(\r\n pb.any(pb.lessThan(scope.$inputs.uv, pb.vec2(0))),\r\n pb.any(pb.greaterThan(scope.$inputs.uv, pb.vec2(1)))\r\n );\r\n scope.$if(scope.discardable, function () {\r\n pb.discard();\r\n });\r\n if (this.needFragmentColor()) {\r\n scope.heightMap = pb.tex2D().uniform(2);\r\n const numDetailMaps = this.featureUsed<number>(ClipmapTerrainMaterial.FEATURE_DETAIL_MAP);\r\n if (numDetailMaps > 0) {\r\n scope.detailParams = pb.vec4[numDetailMaps]().uniform(2);\r\n if (this.drawContext.device.type === 'webgl') {\r\n scope.splatMap = pb.tex2D().uniform(2);\r\n for (let i = 0; i < numDetailMaps; i++) {\r\n scope[`detailAlbedoMap${i}`] = pb.tex2D().uniform(2);\r\n scope[`detailNormalMap${i}`] = pb.tex2D().uniform(2);\r\n }\r\n } else {\r\n scope.splatMap = pb.tex2DArray().uniform(2);\r\n scope.detailAlbedoMap = pb.tex2DArray().uniform(2);\r\n scope.detailNormalMap = pb.tex2DArray().uniform(2);\r\n }\r\n }\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.$l.worldNormal = pb.normalize(scope.$inputs.worldNormal);\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNormal,\r\n scope.$inputs.worldTangent,\r\n scope.$inputs.worldBinormal\r\n );\r\n if (this.featureUsed<number>(ClipmapTerrainMaterial.FEATURE_DETAIL_MAP) > 0) {\r\n scope.normalInfo.normal = this.calculateDetailNormal(scope, scope.normalInfo.TBN);\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 switch (this.featureUsed<TerrainDebugMode>(ClipmapTerrainMaterial.FEATURE_DEBUG_MODE)) {\r\n case 'albedo':\r\n scope.$l.outColor = scope.albedo;\r\n break;\r\n case 'vertex_normal':\r\n scope.$l.outColor = pb.vec4(pb.add(pb.mul(scope.normalInfo.TBN[2], 0.5), pb.vec3(0.5)), 1);\r\n break;\r\n case 'detail_normal':\r\n scope.$l.outColor = pb.vec4(pb.add(pb.mul(scope.normalInfo.normal, 0.5), pb.vec3(0.5)), 1);\r\n break;\r\n case 'tangent':\r\n scope.$l.outColor = pb.vec4(pb.add(pb.mul(scope.normalInfo.TBN[0], 0.5), pb.vec3(0.5)), 1);\r\n break;\r\n case 'bitangent':\r\n scope.$l.outColor = pb.vec4(pb.add(pb.mul(scope.normalInfo.TBN[1], 0.5), pb.vec3(0.5)), 1);\r\n break;\r\n case 'uv':\r\n scope.$l.outColor = pb.vec4(scope.$inputs.uv, 0, 1);\r\n break;\r\n default:\r\n scope.$l.outColor = pb.vec4(scope.litColor, 1);\r\n break;\r\n }\r\n //scope.$l.outColor = pb.vec4(scope.litColor, 1);\r\n if (this.drawContext.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {\r\n scope.$l.outRoughness = pb.vec4(0, 0, 0, 0);\r\n this.outputFragmentColor(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.outColor,\r\n scope.outRoughness,\r\n scope.outColor\r\n );\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.outColor);\r\n }\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number): void {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n bindGroup.setValue('clipmapGridInfo', this._clipmapGridInfo);\r\n bindGroup.setValue('region', this._region);\r\n bindGroup.setValue('terrainScale', this._terrainScale);\r\n bindGroup.setTexture('heightMap', this._heightMap.get(), fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setBuffer('levelData', this._levelDataBuffer.get());\r\n if (this.needFragmentColor(ctx)) {\r\n if (this._detailMapInfo.numDetailMaps > 0) {\r\n bindGroup.setTexture('splatMap', this._detailMapInfo.splatMap.get());\r\n if (ctx.device.type === 'webgl') {\r\n for (let i = 0; i < this._detailMapInfo.numDetailMaps; i++) {\r\n bindGroup.setTexture(\r\n `detailAlbedoMap${i}`,\r\n this._detailMapInfo.detailMapList[i]?.get() ?? ClipmapTerrainMaterial.getDefaultDetailMap(),\r\n fetchSampler('repeat_linear')\r\n );\r\n bindGroup.setTexture(\r\n `detailNormalMap${i}`,\r\n this._detailMapInfo.detailNormalMapList[i]?.get() ??\r\n ClipmapTerrainMaterial.getDefaultNormalMap(),\r\n fetchSampler('repeat_linear')\r\n );\r\n }\r\n } else {\r\n bindGroup.setTexture(\r\n 'detailAlbedoMap',\r\n this._detailMapInfo.detailMap.get(),\r\n fetchSampler('repeat_linear')\r\n );\r\n bindGroup.setTexture(\r\n 'detailNormalMap',\r\n this._detailMapInfo.detailNormalMap.get(),\r\n fetchSampler('repeat_linear')\r\n );\r\n }\r\n bindGroup.setValue('detailParams', this._detailMapInfo.detailMapParams);\r\n }\r\n }\r\n }\r\n private createDetailMapInfo(): ClipmapTerrainDetailMapInfo {\r\n const device = Application.instance.device;\r\n const isWebGL1 = device.type === 'webgl';\r\n const detailMap = isWebGL1\r\n ? null\r\n : device.createTexture2DArray('rgba8unorm', this._detailMapSize, this._detailMapSize, MAX_DETAIL_MAPS);\r\n const detailNormalMap = isWebGL1\r\n ? null\r\n : device.createTexture2DArray('rgba8unorm', this._detailMapSize, this._detailMapSize, MAX_DETAIL_MAPS);\r\n const splatMap = isWebGL1\r\n ? device.createTexture2D('rgba8unorm', this._splatMapSize, this._splatMapSize)\r\n : device.createTexture2DArray(\r\n 'rgba8unorm',\r\n this._splatMapSize,\r\n this._splatMapSize,\r\n MAX_DETAIL_MAPS >> 2\r\n );\r\n device.pushDeviceStates();\r\n if (!isWebGL1) {\r\n const fbDetail = device.createFrameBuffer([detailMap], null);\r\n device.setFramebuffer(fbDetail);\r\n for (let i = 0; i < detailMap.depth; i++) {\r\n fbDetail.setColorAttachmentLayer(0, i);\r\n device.clearFrameBuffer(Vector4.zero(), 1, 0);\r\n }\r\n fbDetail.dispose();\r\n const fbNormal = device.createFrameBuffer([detailNormalMap], null);\r\n device.setFramebuffer(fbNormal);\r\n for (let i = 0; i < detailNormalMap.depth; i++) {\r\n fbNormal.setColorAttachmentLayer(0, i);\r\n device.clearFrameBuffer(new Vector4(0.5, 0.5, 1, 1), 1, 0);\r\n }\r\n fbNormal.dispose();\r\n }\r\n const fbSplat = device.createFrameBuffer([splatMap], null);\r\n device.setFramebuffer(fbSplat);\r\n for (let i = 0; i < splatMap.depth; i++) {\r\n fbSplat.setColorAttachmentLayer(0, i);\r\n device.clearFrameBuffer(i === 0 ? new Vector4(1, 0, 0, 0) : Vector4.zero(), 1, 0);\r\n }\r\n device.popDeviceStates();\r\n fbSplat.dispose();\r\n return {\r\n detailMap: new DRef(detailMap),\r\n detailNormalMap: new DRef(detailNormalMap),\r\n detailMapList: [],\r\n detailNormalMapList: [],\r\n splatMap: new DRef(splatMap),\r\n detailMapParams: new Float32Array(MAX_DETAIL_MAPS * 4),\r\n numDetailMaps: 0\r\n };\r\n }\r\n\r\n dispose(): void {\r\n super.dispose();\r\n this._heightMap.dispose();\r\n this._levelDataBuffer.dispose();\r\n if (this._detailMapInfo) {\r\n this._detailMapInfo.detailMap?.dispose();\r\n this._detailMapInfo.detailNormalMap?.dispose();\r\n this._detailMapInfo.splatMap?.dispose();\r\n for (const tex of this._detailMapInfo.detailMapList) {\r\n tex.dispose();\r\n }\r\n for (const tex of this._detailMapInfo.detailNormalMapList) {\r\n tex.dispose();\r\n }\r\n this._detailMapInfo = null;\r\n }\r\n }\r\n static getDefaultDetailMap() {\r\n if (!ClipmapTerrainMaterial._defaultDetailMap.get()) {\r\n const device = Application.instance.device;\r\n const tex = device.createTexture2D('rgba8unorm', 1, 1);\r\n tex.update(new Uint8Array([0, 0, 0, 255]), 0, 0, 1, 1);\r\n ClipmapTerrainMaterial._defaultDetailMap.set(tex);\r\n }\r\n return ClipmapTerrainMaterial._defaultDetailMap.get();\r\n }\r\n static getDefaultNormalMap() {\r\n if (!ClipmapTerrainMaterial._defaultNormalMap.get()) {\r\n const device = Application.instance.device;\r\n const tex = device.createTexture2D('rgba8unorm', 1, 1);\r\n tex.update(new Uint8Array([128, 128, 255, 255]), 0, 0, 1, 1);\r\n ClipmapTerrainMaterial._defaultNormalMap.set(tex);\r\n }\r\n return ClipmapTerrainMaterial._defaultNormalMap.get();\r\n }\r\n}\r\n"],"names":["MAX_DETAIL_MAPS","ClipmapTerrainMaterial","applyMaterialMixins","MeshMaterial","mixinLight","mixinPBRMetallicRoughness","FEATURE_DETAIL_MAP","defineFeature","FEATURE_DEBUG_MODE","_defaultDetailMap","DRef","_defaultNormalMap","_region","_clipmapGridInfo","_heightMap","_terrainScale","_detailMapInfo","_detailMapSize","_splatMapSize","_heightMapSize","_levelDataBuffer","heightMap","metallic","roughness","albedoTexCoordIndex","normalTexCoordIndex","Vector4","Application","instance","device","createBuffer","MAX_TERRAIN_MIPMAP_LEVELS","usage","createDetailMapInfo","Vector3","one","width","height","useFeature","MAX_DETAIL_MAP_COUNT","debugMode","featureUsed","mode","setLevelData","data","length","get","bufferSubData","region","val","equalsTo","set","uniformChanged","setClipmapGridInfo","gridScale","gridOffsetX","gridOffsetY","x","y","z","setXYZW","terrainScale","numDetailMaps","Number","isInteger","console","error","type","n","defaultDetailMap","getDefaultDetailMap","defaultNormalMap","getDefaultNormalMap","i","setDetailMap","setDetailNormalMap","setDetailMapUVScale","setDetailMapRoughness","detailMapList","dispose","detailNormalMapList","getSplatMap","splatMap","setSplatMap","tex","depth","getDetailMapUVScale","index","detailMapParams","scale","getDetailMapRoughness","getDetailMap","albedoMap","blitter","CopyBlitter","fb","createFrameBuffer","detailMap","blit","fetchSampler","getDetailNormalMap","normalMap","detailNormalMap","update","needSceneColor","needSceneDepth","supportInstancing","supportLighting","getMetallicRoughnessTexCoord","scope","$inputs","uv","sampleDetailNormalMap","texCoord","pb","$builder","sample","drawContext","textureSample","rgb","textureArraySample","normal","sub","mul","vec3","normalize","calculateDetailNormal","TBN","that","funcName","func","mat3","$l","detailNormal","detailParams","add","$return","getGlobalScope","getNormalTexCoord","calculateAlbedoColor","checkerPos","zw","xy","ddx","dpdx","ddy","dpdy","w","max","abs","div","fract","changeRate","fadeStart","float","fadeEnd","fadeFactor","smoothStep","checker","mix","checkerColor","vec4","color","detailAlbedoMap","sampleHeightMap","pos","levelStart","levelDiff","morphRange","vec2","h1","textureSampleLevel","miplevel","r","ratio","xyxy","maxVal","clamp","morphFactor","$if","greaterThan","h2","lessThan","calculateTerrainTBN","clipmapPos","texSize","tangent","bitangent","out","texelSize","exp2","delta","hL","hR","hD","hU","dHdU","dHdV","t","b","cross","calcTerrainTBN","vertexShader","position","attrib","clipmapInfo","clipmapGridInfo","uniform","levelData","uniformBuffer","tex2D","heightMapSize","s","sin","c","cos","scale2","clipmapMatrix","mat4","neg","clipmapWorldPos","ShaderHelper","getWorldMatrix","xyz","$outputs","xz","int","$for","equal","at","$break","worldPos","worldTangent","worldBinormal","worldNormal","setClipSpacePosition","getViewProjectionMatrix","resolveMotionVector","fragmentShader","discardable","or","any","discard","needFragmentColor","tex2DArray","albedo","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","litColor","PBRLight","outColor","materialFlags","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","outRoughness","outputFragmentColor","applyUniformValues","bindGroup","ctx","pass","setValue","setTexture","setBuffer","isWebGL1","createTexture2DArray","createTexture2D","pushDeviceStates","fbDetail","setFramebuffer","setColorAttachmentLayer","clearFrameBuffer","zero","fbNormal","fbSplat","popDeviceStates","Float32Array","Uint8Array"],"mappings":"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"}
@@ -0,0 +1,375 @@
1
+ import { applyMaterialMixins, MeshMaterial } from './meshmaterial.js';
2
+ import { mixinPBRMetallicRoughness } from './mixins/lightmodel/pbrmetallicroughness.js';
3
+ import { mixinLight } from './mixins/lit.js';
4
+ import { Application } from '../app/app.js';
5
+ import { retainObject, Vector4 } from '@zephyr3d/base';
6
+ import { drawFullscreenQuad } from '../render/fullscreenquad.js';
7
+ import { ShaderHelper } from './shader/helper.js';
8
+ import { RENDER_PASS_TYPE_SHADOWMAP } from '../values.js';
9
+
10
+ /**
11
+ * Terrain material class
12
+ * @public
13
+ */ class TerrainMaterial extends applyMaterialMixins(MeshMaterial, mixinLight, mixinPBRMetallicRoughness) {
14
+ static _metallicRoughnessGenerationProgram = null;
15
+ static _metallicRoughnessGenerationBindGroup = null;
16
+ _options;
17
+ _uvScales;
18
+ _numDetailMaps;
19
+ _terrainInfo;
20
+ constructor(options){
21
+ super();
22
+ this.normalMapMode = 'object-space';
23
+ this._options = null;
24
+ this._numDetailMaps = 0;
25
+ this._uvScales = null;
26
+ this._terrainInfo = null;
27
+ if (options && options.splatMap && options.detailMaps && options.detailMaps.albedoTextures) {
28
+ this._options = Object.assign({}, options);
29
+ retainObject(this._options.splatMap);
30
+ const albedoTextures = this._options.detailMaps.albedoTextures;
31
+ if (Array.isArray(albedoTextures)) {
32
+ for (const tex of albedoTextures){
33
+ if (!tex) {
34
+ throw new Error(`TerrainMaterial(): Invalid detail albedo texture`);
35
+ }
36
+ retainObject(tex);
37
+ tex.samplerOptions = {
38
+ addressU: 'repeat',
39
+ addressV: 'repeat'
40
+ };
41
+ }
42
+ this._numDetailMaps = albedoTextures.length;
43
+ } else {
44
+ albedoTextures.samplerOptions = {
45
+ addressU: 'repeat',
46
+ addressV: 'repeat'
47
+ };
48
+ retainObject(albedoTextures);
49
+ this._numDetailMaps = albedoTextures.depth;
50
+ }
51
+ if (!this._numDetailMaps) {
52
+ throw new Error(`TerrainMaterial(): Invalid detail textures`);
53
+ }
54
+ if (this._numDetailMaps > 4) {
55
+ throw new Error(`TerrainMaterial(): The maximum detail levels is 4`);
56
+ }
57
+ if (!this._options.detailMaps.uvScale || this._options.detailMaps.uvScale.length !== this._numDetailMaps) {
58
+ throw new Error(`TerrainMaterial(): Invalid uv scale`);
59
+ }
60
+ this._uvScales = new Float32Array(this._numDetailMaps * 4);
61
+ for(let i = 0; i < this._numDetailMaps; i++){
62
+ this._uvScales[i * 4] = this._options.detailMaps.uvScale[i];
63
+ this._uvScales[i * 4 + 1] = 1;
64
+ this._uvScales[i * 4 + 2] = 0.01;
65
+ this._uvScales[i * 4 + 3] = 0.99;
66
+ }
67
+ if (this._options.detailMaps.metallic) {
68
+ if (this._options.detailMaps.metallic.length !== this._numDetailMaps) {
69
+ throw new Error(`TerrainMaterial(): Invalid metallic values`);
70
+ }
71
+ for(let i = 0; i < this._numDetailMaps; i++){
72
+ this._uvScales[i * 4 + 2] = this._options.detailMaps.metallic[i];
73
+ }
74
+ }
75
+ if (this._options.detailMaps.roughness) {
76
+ if (this._options.detailMaps.roughness.length !== this._numDetailMaps) {
77
+ throw new Error(`TerrainMaterial(): Invalid roughness values`);
78
+ }
79
+ for(let i = 0; i < this._numDetailMaps; i++){
80
+ this._uvScales[i * 4 + 3] = this._options.detailMaps.roughness[i];
81
+ }
82
+ }
83
+ const normalTextures = options.detailMaps.normalTextures;
84
+ if (normalTextures) {
85
+ let m;
86
+ if (Array.isArray(normalTextures)) {
87
+ for (const tex of normalTextures){
88
+ if (!tex) {
89
+ throw new Error(`TerrainMaterial(): Invalid detail normal texture`);
90
+ }
91
+ retainObject(tex);
92
+ tex.samplerOptions = {
93
+ addressU: 'repeat',
94
+ addressV: 'repeat'
95
+ };
96
+ }
97
+ m = normalTextures.length;
98
+ } else {
99
+ normalTextures.samplerOptions = {
100
+ addressU: 'repeat',
101
+ addressV: 'repeat'
102
+ };
103
+ retainObject(normalTextures);
104
+ m = normalTextures.depth;
105
+ }
106
+ if (m !== this._numDetailMaps) {
107
+ throw new Error(`TerrainMaterial(): The number of normal textures not match the number of albedo textures`);
108
+ }
109
+ if (options.detailMaps.normalScale) {
110
+ if (options.detailMaps.normalScale.length !== this._numDetailMaps) {
111
+ throw new Error(`TerrainMaterial(): Invalid normal scale`);
112
+ }
113
+ for(let i = 0; i < this._numDetailMaps; i++){
114
+ this._uvScales[i * 4 + 1] = options.detailMaps.normalScale[i];
115
+ }
116
+ }
117
+ }
118
+ }
119
+ this.metallicRoughnessTexture = this.generateMetallicRoughnessMap();
120
+ this.metallicRoughnessTexCoordIndex = -1;
121
+ this.albedoTexCoordIndex = -1;
122
+ this.normalTexCoordIndex = -1;
123
+ }
124
+ clone() {
125
+ const other = new TerrainMaterial(this._options);
126
+ other.copyFrom(this);
127
+ return other;
128
+ }
129
+ get terrainInfo() {
130
+ return this._terrainInfo;
131
+ }
132
+ set terrainInfo(val) {
133
+ this._terrainInfo = val;
134
+ this.uniformChanged();
135
+ }
136
+ /**
137
+ * {@inheritDoc MeshMaterial.isTransparentPass}
138
+ * @override
139
+ */ isTransparentPass(_pass) {
140
+ return false;
141
+ }
142
+ /**
143
+ * {@inheritDoc Material.supportLighting}
144
+ * @override
145
+ */ supportLighting() {
146
+ return true;
147
+ }
148
+ /**
149
+ * {@inheritDoc Material.supportInstancing}
150
+ * @override
151
+ */ supportInstancing() {
152
+ return false;
153
+ }
154
+ /**
155
+ * {@inheritDoc Material.isBatchable}
156
+ * @override
157
+ */ isBatchable() {
158
+ return false;
159
+ }
160
+ applyUniformValues(bindGroup, ctx, pass) {
161
+ super.applyUniformValues(bindGroup, ctx, pass);
162
+ if (this.needFragmentColor(ctx)) {
163
+ bindGroup.setValue('terrainInfo', this._terrainInfo);
164
+ if (this._options) {
165
+ bindGroup.setValue('detailScales', this._uvScales);
166
+ bindGroup.setTexture('splatMap', this._options.splatMap);
167
+ if (Array.isArray(this._options.detailMaps.albedoTextures)) {
168
+ for(let i = 0; i < this._numDetailMaps; i++){
169
+ bindGroup.setTexture(`detailAlbedoMap${i}`, this._options.detailMaps.albedoTextures[i]);
170
+ }
171
+ } else {
172
+ bindGroup.setTexture('detailAlbedoMap', this._options.detailMaps.albedoTextures);
173
+ }
174
+ if (Array.isArray(this._options.detailMaps.normalTextures)) {
175
+ for(let i = 0; i < this._numDetailMaps; i++){
176
+ bindGroup.setTexture(`detailNormalMap${i}`, this._options.detailMaps.normalTextures[i]);
177
+ }
178
+ } else {
179
+ bindGroup.setTexture('detailNormalMap', this._options.detailMaps.normalTextures);
180
+ }
181
+ }
182
+ }
183
+ }
184
+ getMetallicRoughnessTexCoord = function(scope) {
185
+ return scope.$inputs.mapUV;
186
+ };
187
+ getNormalTexCoord = function(scope) {
188
+ return scope.$inputs.mapUV;
189
+ };
190
+ getAlbedoTexCoord = function(scope) {
191
+ return scope.$inputs.mapUV;
192
+ };
193
+ calculateAlbedoColor(scope) {
194
+ if (!this._options) {
195
+ return super.calculateAlbedoColor(scope);
196
+ }
197
+ const that = this;
198
+ const pb = scope.$builder;
199
+ const funcName = 'getTerrainAlbedo';
200
+ pb.func(funcName, [], function() {
201
+ this.$l.mask = pb.textureSample(this.splatMap, this.$inputs.mapUV);
202
+ this.$l.color = pb.vec3(0);
203
+ const useTextureArray = !Array.isArray(that._options.detailMaps.albedoTextures);
204
+ for(let i = 0; i < that._numDetailMaps; i++){
205
+ const uv = pb.mul(this.$inputs.mapUV, this.detailScales.at(i).x);
206
+ const sample = useTextureArray ? pb.textureArraySample(this.detailAlbedoMap, uv, i).rgb : pb.textureSample(this[`detailAlbedoMap${i}`], uv).rgb;
207
+ this.color = pb.add(this.color, pb.mul(sample, this.mask[i]));
208
+ }
209
+ this.$return(pb.vec4(this.color, 1));
210
+ });
211
+ return pb.getGlobalScope()[funcName]();
212
+ }
213
+ sampleDetailNormalMap(scope, tex, texCoord, normalScale, TBN) {
214
+ const pb = scope.$builder;
215
+ const pixel = pb.sub(pb.mul(pb.textureSample(tex, texCoord).rgb, 2), pb.vec3(1));
216
+ const normalTex = pb.mul(pixel, pb.vec3(pb.vec3(normalScale).xx, 1));
217
+ return pb.normalize(pb.mul(TBN, normalTex));
218
+ }
219
+ vertexShader(scope) {
220
+ super.vertexShader(scope);
221
+ const pb = scope.$builder;
222
+ scope.$l.oPos = ShaderHelper.resolveVertexPosition(scope);
223
+ scope.$outputs.worldPos = pb.mul(ShaderHelper.getWorldMatrix(scope), pb.vec4(scope.oPos, 1)).xyz;
224
+ ShaderHelper.setClipSpacePosition(scope, pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1)));
225
+ if (this.needFragmentColor()) {
226
+ scope.terrainInfo = pb.vec4().uniform(2);
227
+ scope.$l.oNorm = ShaderHelper.resolveVertexNormal(scope);
228
+ scope.$outputs.worldNorm = pb.mul(ShaderHelper.getNormalMatrix(scope), pb.vec4(scope.oNorm, 0)).xyz;
229
+ scope.$outputs.mapUV = pb.div(scope.oPos.xz, scope.terrainInfo.xy);
230
+ }
231
+ }
232
+ fragmentShader(scope) {
233
+ super.fragmentShader(scope);
234
+ const pb = scope.$builder;
235
+ const that = this;
236
+ if (this.needFragmentColor()) {
237
+ if (this._options) {
238
+ scope.detailScales = pb.vec4[this._numDetailMaps]().uniform(2);
239
+ scope.splatMap = pb.tex2D().uniform(2);
240
+ const useAlbedoTextureArray = !Array.isArray(that._options.detailMaps.albedoTextures);
241
+ if (useAlbedoTextureArray) {
242
+ scope.detailAlbedoMap = pb.tex2DArray().uniform(2);
243
+ } else {
244
+ for(let i = 0; i < that._numDetailMaps; i++){
245
+ scope[`detailAlbedoMap${i}`] = pb.tex2D().uniform(2);
246
+ }
247
+ }
248
+ const useNormalTextureArray = !Array.isArray(that._options.detailMaps.normalTextures);
249
+ if (useNormalTextureArray) {
250
+ scope.detailNormalMap = pb.tex2DArray().uniform(2);
251
+ } else {
252
+ for(let i = 0; i < that._numDetailMaps; i++){
253
+ scope[`detailNormalMap${i}`] = pb.tex2D().uniform(2);
254
+ }
255
+ }
256
+ }
257
+ scope.$l.albedo = this.calculateAlbedoColor(scope);
258
+ scope.$l.normalInfo = this.calculateNormalAndTBN(scope, scope.$inputs.worldPos, scope.$inputs.worldNorm);
259
+ let calcNormal = false;
260
+ if (this._options && this._options.detailMaps.normalTextures) {
261
+ scope.$l.detailMask = pb.textureSample(scope.splatMap, scope.$inputs.mapUV);
262
+ if (Array.isArray(this._options.detailMaps.normalTextures)) {
263
+ for(let i = 0; i < this._options.detailMaps.normalTextures.length; i++){
264
+ const tex = scope[`detailNormalMap${i}`];
265
+ const scale = scope.detailScales.at(i).y;
266
+ const texCoord = pb.mul(scope.$inputs.mapUV, scope.detailScales.at(i).x);
267
+ scope.normalInfo.normal = pb.add(scope.normalInfo.normal, pb.mul(this.sampleDetailNormalMap(scope, tex, texCoord, scale, scope.normalInfo.TBN), scope.detailMask[i]));
268
+ calcNormal = true;
269
+ }
270
+ } else {
271
+ const tex = scope.detailNormalMap;
272
+ for(let i = 0; i < this._numDetailMaps; i++){
273
+ const scale = scope.detailScales.at(i).y;
274
+ const texCoord = pb.mul(scope.$inputs.mapUV, scope.detailScales.at(i).x);
275
+ const pixel = pb.sub(pb.mul(pb.textureArraySample(tex, texCoord, i).rgb, 2), pb.vec3(1));
276
+ const normalTex = pb.mul(pixel, pb.vec3(pb.vec3(scale).xx, 1));
277
+ const detailNormal = pb.normalize(pb.mul(scope.normalInfo.TBN, normalTex));
278
+ scope.normalInfo.normal = pb.add(scope.normalInfo.normal, pb.mul(detailNormal, scope.detailMask[i]));
279
+ calcNormal = true;
280
+ }
281
+ }
282
+ }
283
+ if (calcNormal) {
284
+ scope.normalInfo.normal = pb.normalize(scope.normalInfo.normal);
285
+ }
286
+ scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);
287
+ scope.$l.litColor = this.PBRLight(scope, scope.$inputs.worldPos, scope.normalInfo.normal, scope.viewVec, scope.albedo, scope.normalInfo.TBN);
288
+ this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));
289
+ } else {
290
+ this.outputFragmentColor(scope, scope.$inputs.worldPos, null);
291
+ }
292
+ }
293
+ generateMetallicRoughnessMap() {
294
+ const device = Application.instance.device;
295
+ if (!this._options) {
296
+ const tex = device.createTexture2D('rgba8unorm', 1, 1, {
297
+ samplerOptions: {
298
+ mipFilter: 'none'
299
+ }
300
+ });
301
+ tex.update(new Uint8Array([
302
+ 0,
303
+ 1,
304
+ 0,
305
+ 0
306
+ ]), 0, 0, 1, 1);
307
+ tex.name = 'TerrainMetallicRoughnessMap';
308
+ return tex;
309
+ }
310
+ if (!TerrainMaterial._metallicRoughnessGenerationProgram) {
311
+ TerrainMaterial._metallicRoughnessGenerationProgram = device.buildRenderProgram({
312
+ vertex (pb) {
313
+ this.$inputs.pos = pb.vec2().attrib('position');
314
+ this.$outputs.uv = pb.vec2();
315
+ pb.main(function() {
316
+ this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);
317
+ this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
318
+ if (device.type === 'webgpu') {
319
+ this.$builtins.position.y = pb.neg(this.$builtins.position.y);
320
+ }
321
+ });
322
+ },
323
+ fragment (pb) {
324
+ this.$outputs.outColor = pb.vec4();
325
+ this.roughness = pb.vec4().uniform(0);
326
+ this.metallic = pb.vec4().uniform(0);
327
+ this.splatMap = pb.tex2D().uniform(0);
328
+ pb.main(function() {
329
+ this.weights = pb.textureSample(this.splatMap, this.$inputs.uv);
330
+ this.roughnessValue = pb.dot(this.weights, this.roughness);
331
+ this.metallicValue = pb.dot(this.weights, this.metallic);
332
+ this.$outputs.outColor = pb.vec4(0, this.roughnessValue, this.metallicValue, 1);
333
+ });
334
+ }
335
+ });
336
+ TerrainMaterial._metallicRoughnessGenerationBindGroup = device.createBindGroup(TerrainMaterial._metallicRoughnessGenerationProgram.bindGroupLayouts[0]);
337
+ }
338
+ const roughnessValues = Vector4.one();
339
+ const metallicValues = Vector4.zero();
340
+ for(let i = 0; i < this._numDetailMaps; i++){
341
+ metallicValues[i] = this._uvScales[i * 4 + 2];
342
+ roughnessValues[i] = this._uvScales[i * 4 + 3];
343
+ }
344
+ const tex = device.createTexture2D('rgba8unorm', this._options.splatMap.width, this._options.splatMap.height);
345
+ tex.name = 'TerrainMetallicRoughnessMap';
346
+ const program = TerrainMaterial._metallicRoughnessGenerationProgram;
347
+ const bindgroup = TerrainMaterial._metallicRoughnessGenerationBindGroup;
348
+ bindgroup.setValue('roughness', roughnessValues);
349
+ bindgroup.setValue('metallic', metallicValues);
350
+ bindgroup.setTexture('splatMap', this._options.splatMap);
351
+ const fb = device.createFrameBuffer([
352
+ tex
353
+ ], null);
354
+ device.pushDeviceStates();
355
+ device.setFramebuffer(fb);
356
+ device.setProgram(program);
357
+ device.setBindGroup(0, bindgroup);
358
+ drawFullscreenQuad();
359
+ device.popDeviceStates();
360
+ fb.dispose();
361
+ return tex;
362
+ }
363
+ updateRenderStates(pass, stateSet, ctx) {
364
+ super.updateRenderStates(pass, stateSet, ctx);
365
+ const isShadowMapPass = ctx.renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;
366
+ if (isShadowMapPass) {
367
+ stateSet.useRasterizerState().setCullMode('front');
368
+ } else {
369
+ stateSet.defaultRasterizerState();
370
+ }
371
+ }
372
+ }
373
+
374
+ export { TerrainMaterial };
375
+ //# sourceMappingURL=terrainmaterial.js.map