@zephyr3d/scene 0.9.27 → 0.10.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 (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hair.js","sources":["../../src/material/hair.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport { mixinLight } from './mixins/lit';\r\nimport { mixinVertexColor } from './mixins/vertexcolor';\r\nimport { mixinTextureProps } from './mixins/texture';\r\nimport { mixinPBRBRDF } from './mixins/pbr/brdf';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport { LIGHT_TYPE_POINT, MaterialVaryingFlags, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { DrawContext } from '../render';\r\nimport type { Clonable, Immutable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Which TBN axis runs along the hair strands of the card atlas.\r\n *\r\n * Most hair-card atlases lay strands out along the V axis of the UV, which maps to\r\n * the binormal; use 'tangent' when strands run along U instead.\r\n * @public\r\n */\r\nexport type HairStrandDirection = 'tangent' | 'binormal';\r\n\r\n/**\r\n * Which scattering model shades the hair.\r\n *\r\n * - `kajiya-kay`: the phenomenological double lobe. Every term is an art dial,\r\n * which makes it predictable and cheap, and is usually what a stylised hair\r\n * card wants.\r\n * - `marschner`: the fibre model, splitting light into the three paths it can\r\n * take through a strand. Costs more and gives up some direct control, but the\r\n * secondary highlight takes the hair's own colour and backlit tips glow\r\n * because the model says they must, not because someone dialled it in.\r\n * @public\r\n */\r\nexport type HairShadingModel = 'kajiya-kay' | 'marschner';\r\n\r\n/**\r\n * Hair-card material using a Kajiya-Kay style double-lobe anisotropic lighting model.\r\n *\r\n * Lighting terms:\r\n * - Wrap diffuse to soften the terminator across thin cards.\r\n * - Primary specular lobe (usually near-white, sharp, shifted toward the root).\r\n * - Secondary specular lobe (tinted by hair color, broader, shifted toward the tip),\r\n * with an optional shift texture that jitters both lobes per strand to break up\r\n * the \"angel ring\" into natural streaks.\r\n * - Optional view-dependent transmission for backlit tips.\r\n * - Optional baked occlusion map (root darkening).\r\n *\r\n * Alpha handling comes from the MeshMaterial base: use `alphaCutoff` plus\r\n * `alphaDither` for TAA-converged soft edges on the opaque core, and\r\n * `blendMode='blend'` for the outer flyaway layer.\r\n * @public\r\n */\r\nexport class HairMaterial\r\n extends applyMaterialMixins(\r\n MeshMaterial,\r\n mixinLight,\r\n mixinPBRBRDF,\r\n mixinVertexColor,\r\n mixinTextureProps('specularShift'),\r\n mixinTextureProps('occlusion')\r\n )\r\n implements Clonable<HairMaterial>\r\n{\r\n /** @internal */\r\n private static readonly FEATURE_VERTEX_NORMAL = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_VERTEX_TANGENT = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_STRAND_DIRECTION = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_TRANSMISSION = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_SCATTER = this.defineFeature();\r\n /** @internal Selects the scattering model. Holds a {@link HairShadingModel}. */\r\n private static readonly FEATURE_SHADING_MODEL = this.defineFeature();\r\n /** @internal Primary lobe color (usually near-white). */\r\n private readonly _specular1Color: Vector3;\r\n /** @internal Primary lobe exponent. */\r\n private _specular1Power: number;\r\n /** @internal Primary lobe shift along the normal (negative moves toward root). */\r\n private _specular1Shift: number;\r\n /** @internal Secondary lobe color, multiplied by albedo in the shader. */\r\n private readonly _specular2Color: Vector3;\r\n /** @internal Secondary lobe exponent. */\r\n private _specular2Power: number;\r\n /** @internal Secondary lobe shift along the normal. */\r\n private _specular2Shift: number;\r\n /** @internal Scale applied to (shiftTexture.r - 0.5). */\r\n private _shiftMapScale: number;\r\n /** @internal Wrap diffuse amount in [0, 1]. */\r\n private _diffuseWrap: number;\r\n /** @internal Transmission tint color. */\r\n private readonly _transmissionColor: Vector3;\r\n /** @internal Transmission intensity, 0 disables the term. */\r\n private _transmissionIntensity: number;\r\n /** @internal Transmission view-alignment exponent. */\r\n private _transmissionPower: number;\r\n /** @internal Occlusion map strength in [0, 1]. */\r\n private _occlusionStrength: number;\r\n /** @internal Marschner longitudinal shift of the R lobe, in sine units. */\r\n private _marschnerShift: number;\r\n /** @internal Marschner longitudinal roughness. */\r\n private _marschnerRoughness: number;\r\n /** @internal Refractive index of the fibre. */\r\n private _marschnerIOR: number;\r\n /** @internal Multiplier on the Beer-Lambert path length. */\r\n private _marschnerAbsorption: number;\r\n /** @internal Per-lobe intensities: R, TT, TRT. */\r\n private readonly _marschnerLobes: Vector3;\r\n /** @internal Tint of multiply-scattered light. */\r\n private readonly _scatterColor: Vector3;\r\n /** @internal Multiple scattering intensity, 0 disables the term. */\r\n private _scatterIntensity: number;\r\n /** @internal Share of the scattering that survives where direct light does not. */\r\n private _scatterLocal: number;\r\n /** @internal Angular width of the forward-scattered lobe. */\r\n private _scatterWrap: number;\r\n /** @internal Scratch vector for packing uniform values without per-frame allocation. */\r\n private readonly _uniformScratch: Vector4;\r\n /**\r\n * Creates an instance of HairMaterial with defaults tuned for dark stylized hair.\r\n */\r\n constructor() {\r\n super();\r\n this._specular1Color = new Vector3(0.35, 0.35, 0.35);\r\n this._specular1Power = 160;\r\n this._specular1Shift = -0.15;\r\n this._specular2Color = new Vector3(0.5, 0.45, 0.4);\r\n this._specular2Power = 40;\r\n this._specular2Shift = 0.1;\r\n this._shiftMapScale = 1;\r\n this._diffuseWrap = 0.5;\r\n this._transmissionColor = new Vector3(0.9, 0.65, 0.45);\r\n this._transmissionIntensity = 0;\r\n this._transmissionPower = 6;\r\n this._occlusionStrength = 1;\r\n // Marschner defaults follow the measured fibre: the cuticle scales tilt the\r\n // surface by a few degrees, which is what separates the three lobes at all.\r\n this._marschnerShift = 0.035;\r\n this._marschnerRoughness = 0.3;\r\n this._marschnerIOR = 1.55;\r\n this._marschnerAbsorption = 1;\r\n this._marschnerLobes = new Vector3(1, 1, 1);\r\n this._scatterColor = new Vector3(1, 0.85, 0.7);\r\n this._scatterIntensity = 0;\r\n this._scatterLocal = 0.5;\r\n this._scatterWrap = 1;\r\n this._uniformScratch = new Vector4();\r\n this.useFeature(HairMaterial.FEATURE_VERTEX_NORMAL, true);\r\n this.useFeature(HairMaterial.FEATURE_STRAND_DIRECTION, 'binormal');\r\n this.useFeature(HairMaterial.FEATURE_TRANSMISSION, false);\r\n this.useFeature(HairMaterial.FEATURE_SCATTER, false);\r\n this.useFeature(HairMaterial.FEATURE_SHADING_MODEL, 'kajiya-kay');\r\n // Hair cards are visible from both sides.\r\n this.cullMode = 'none';\r\n }\r\n clone() {\r\n const other = new HairMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.specular1Color = other.specular1Color;\r\n this.specular1Power = other.specular1Power;\r\n this.specular1Shift = other.specular1Shift;\r\n this.specular2Color = other.specular2Color;\r\n this.specular2Power = other.specular2Power;\r\n this.specular2Shift = other.specular2Shift;\r\n this.shiftMapScale = other.shiftMapScale;\r\n this.diffuseWrap = other.diffuseWrap;\r\n this.transmissionColor = other.transmissionColor;\r\n this.transmissionIntensity = other.transmissionIntensity;\r\n this.transmissionPower = other.transmissionPower;\r\n this.occlusionStrength = other.occlusionStrength;\r\n this.scatterColor = other.scatterColor;\r\n this.scatterIntensity = other.scatterIntensity;\r\n this.scatterLocal = other.scatterLocal;\r\n this.scatterWrap = other.scatterWrap;\r\n this.shadingModel = other.shadingModel;\r\n this.marschnerShift = other.marschnerShift;\r\n this.marschnerRoughness = other.marschnerRoughness;\r\n this.marschnerIOR = other.marschnerIOR;\r\n this.marschnerAbsorption = other.marschnerAbsorption;\r\n this.marschnerLobes = other.marschnerLobes;\r\n }\r\n /** true if vertex normal attribute presents */\r\n get vertexNormal() {\r\n return this.featureUsed<boolean>(HairMaterial.FEATURE_VERTEX_NORMAL);\r\n }\r\n set vertexNormal(val) {\r\n this.useFeature(HairMaterial.FEATURE_VERTEX_NORMAL, !!val);\r\n }\r\n /** true if vertex tangent attribute presents */\r\n get vertexTangent() {\r\n return this.featureUsed<boolean>(HairMaterial.FEATURE_VERTEX_TANGENT);\r\n }\r\n set vertexTangent(val) {\r\n this.useFeature(HairMaterial.FEATURE_VERTEX_TANGENT, !!val);\r\n }\r\n /** Which TBN axis runs along the strands */\r\n get strandDirection() {\r\n return this.featureUsed<HairStrandDirection>(HairMaterial.FEATURE_STRAND_DIRECTION);\r\n }\r\n set strandDirection(val) {\r\n this.useFeature(HairMaterial.FEATURE_STRAND_DIRECTION, val);\r\n }\r\n /** Primary specular lobe color */\r\n get specular1Color(): Immutable<Vector3> {\r\n return this._specular1Color;\r\n }\r\n set specular1Color(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._specular1Color)) {\r\n this._specular1Color.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Primary specular lobe exponent */\r\n get specular1Power() {\r\n return this._specular1Power;\r\n }\r\n set specular1Power(val) {\r\n if (val !== this._specular1Power) {\r\n this._specular1Power = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Primary specular lobe shift along the normal */\r\n get specular1Shift() {\r\n return this._specular1Shift;\r\n }\r\n set specular1Shift(val) {\r\n if (val !== this._specular1Shift) {\r\n this._specular1Shift = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Secondary specular lobe color (multiplied by albedo) */\r\n get specular2Color(): Immutable<Vector3> {\r\n return this._specular2Color;\r\n }\r\n set specular2Color(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._specular2Color)) {\r\n this._specular2Color.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Secondary specular lobe exponent */\r\n get specular2Power() {\r\n return this._specular2Power;\r\n }\r\n set specular2Power(val) {\r\n if (val !== this._specular2Power) {\r\n this._specular2Power = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Secondary specular lobe shift along the normal */\r\n get specular2Shift() {\r\n return this._specular2Shift;\r\n }\r\n set specular2Shift(val) {\r\n if (val !== this._specular2Shift) {\r\n this._specular2Shift = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Scale applied to the shift texture */\r\n get shiftMapScale() {\r\n return this._shiftMapScale;\r\n }\r\n set shiftMapScale(val) {\r\n if (val !== this._shiftMapScale) {\r\n this._shiftMapScale = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Wrap diffuse amount in [0, 1] */\r\n get diffuseWrap() {\r\n return this._diffuseWrap;\r\n }\r\n set diffuseWrap(val) {\r\n val = val < 0 ? 0 : val > 1 ? 1 : val;\r\n if (val !== this._diffuseWrap) {\r\n this._diffuseWrap = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Transmission tint color */\r\n get transmissionColor(): Immutable<Vector3> {\r\n return this._transmissionColor;\r\n }\r\n set transmissionColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._transmissionColor)) {\r\n this._transmissionColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Transmission intensity, 0 disables the transmission term */\r\n get transmissionIntensity() {\r\n return this._transmissionIntensity;\r\n }\r\n set transmissionIntensity(val) {\r\n val = val < 0 ? 0 : val;\r\n if (val !== this._transmissionIntensity) {\r\n this._transmissionIntensity = val;\r\n this.useFeature(HairMaterial.FEATURE_TRANSMISSION, val > 0);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Transmission view-alignment exponent */\r\n get transmissionPower() {\r\n return this._transmissionPower;\r\n }\r\n set transmissionPower(val) {\r\n if (val !== this._transmissionPower) {\r\n this._transmissionPower = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Tint of multiply-scattered light.\r\n *\r\n * @remarks\r\n * Multiple scattering is strongly wavelength dependent - it is why blonde hair\r\n * glows and black hair does not - and the tint is applied on top of the hair's\r\n * own colour, which the term is already modulated by. Warm by default, since\r\n * the light that survives several bounces through keratin has lost its blue.\r\n */\r\n get scatterColor(): Immutable<Vector3> {\r\n return this._scatterColor;\r\n }\r\n set scatterColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._scatterColor)) {\r\n this._scatterColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Multiple scattering intensity. Zero disables the term, which is the default.\r\n *\r\n * @remarks\r\n * Absorption alone makes the inside of a groom black, because that is what\r\n * absorption does: past a few fibres essentially nothing of the direct beam\r\n * survives. Real hair is not black there, and the difference is light that\r\n * reached the point after bouncing off neighbouring fibres rather than\r\n * travelling straight through.\r\n *\r\n * This adds an approximation of it in two parts, following the decomposition\r\n * dual scattering makes: a global term, the light that came through the hair in\r\n * front and arrives spread over a wide angle, and a local term, the light that\r\n * did not come through but re-emerges after scattering nearby. The first fades\r\n * with depth into the groom, the second does not, and it is the second that\r\n * stops the interior going black.\r\n *\r\n * The forward transmittance both terms are built from is the shadow value, so\r\n * this is at its most meaningful under a shadow mode that grades it - a deep\r\n * opacity map. Under a binary filter the global term simply follows the shadow\r\n * and the local term fills its complement.\r\n *\r\n * Off by default: it adds light the material did not previously emit, so it\r\n * changes the look of any groom it is enabled on rather than refining it.\r\n */\r\n get scatterIntensity() {\r\n return this._scatterIntensity;\r\n }\r\n set scatterIntensity(val) {\r\n val = val < 0 ? 0 : val;\r\n if (val !== this._scatterIntensity) {\r\n this._scatterIntensity = val;\r\n this.useFeature(HairMaterial.FEATURE_SCATTER, val > 0);\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Balance between the two scattering terms, in [0, 1].\r\n *\r\n * @remarks\r\n * Zero keeps only the global term, so the scattering follows the light and\r\n * vanishes deep in the groom. One keeps only the local term, which is brightest\r\n * exactly where the direct light is blocked. The default splits them evenly;\r\n * denser and lighter hair wants more local.\r\n */\r\n get scatterLocal() {\r\n return this._scatterLocal;\r\n }\r\n set scatterLocal(val) {\r\n val = val < 0 ? 0 : val > 1 ? 1 : val;\r\n if (val !== this._scatterLocal) {\r\n this._scatterLocal = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Angular width of the forward-scattered lobe.\r\n *\r\n * @remarks\r\n * Scattering spreads light as it crosses fibres, so the global term is not a\r\n * cosine lobe but a much broader one; this is how far past the terminator it\r\n * reaches. Larger than {@link HairMaterial.diffuseWrap} on purpose - that one\r\n * softens a terminator, this one models a beam that has genuinely lost its\r\n * direction.\r\n */\r\n get scatterWrap() {\r\n return this._scatterWrap;\r\n }\r\n set scatterWrap(val) {\r\n val = val < 0 ? 0 : val;\r\n if (val !== this._scatterWrap) {\r\n this._scatterWrap = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Which scattering model shades the hair. Defaults to `kajiya-kay`.\r\n *\r\n * @remarks\r\n * Switching to `marschner` changes the look of any hair it is enabled on\r\n * rather than refining it, so it is opted into. See {@link HairShadingModel}\r\n * for what the two models are; the `marschner*` properties are inert under\r\n * `kajiya-kay` and the specular lobe properties are inert under `marschner`.\r\n *\r\n * Two existing properties overlap with it and should be left alone when it is\r\n * on: {@link HairMaterial.transmissionIntensity}, whose whole job is faking the\r\n * backlit glow that Marschner's TT path produces for real, and - on\r\n * `HairStrandMaterial` - `strandRoundness`, whose bent normal no longer reaches\r\n * the highlight, because Marschner already integrates across the fibre.\r\n */\r\n get shadingModel() {\r\n return this.featureUsed<HairShadingModel>(HairMaterial.FEATURE_SHADING_MODEL);\r\n }\r\n set shadingModel(val: HairShadingModel) {\r\n this.useFeature(HairMaterial.FEATURE_SHADING_MODEL, val);\r\n }\r\n /**\r\n * Longitudinal shift of the Marschner lobes, in sine units.\r\n *\r\n * @remarks\r\n * Hair is not a smooth cylinder: overlapping cuticle scales tilt its surface\r\n * by a few degrees toward the tip. That tilt is the only reason the three\r\n * lobes sit at different angles instead of on top of one another, so this is\r\n * what makes them read as separate highlights at all. The three shifts are\r\n * derived from it in the ratio the measurements give, R getting `-2x` and TRT\r\n * `4x`, so one dial moves the whole set consistently.\r\n *\r\n * Defaults to 0.035, roughly the measured 2 degrees.\r\n */\r\n get marschnerShift() {\r\n return this._marschnerShift;\r\n }\r\n set marschnerShift(val) {\r\n if (val !== this._marschnerShift) {\r\n this._marschnerShift = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Longitudinal roughness of the Marschner lobes, in (0, 1].\r\n *\r\n * @remarks\r\n * The angular width of the highlight bands. Per-lobe widths are derived from\r\n * it - TT half, TRT double - which is the ordering real fibres show: light\r\n * that only passes through stays tight, light that has bounced inside spreads.\r\n */\r\n get marschnerRoughness() {\r\n return this._marschnerRoughness;\r\n }\r\n set marschnerRoughness(val) {\r\n const v = val < 0.005 ? 0.005 : val > 1 ? 1 : val;\r\n if (v !== this._marschnerRoughness) {\r\n this._marschnerRoughness = v;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Refractive index of the fibre. Defaults to the measured 1.55 for keratin.\r\n *\r\n * @remarks\r\n * Sets how much light reflects at the surface rather than entering, and how\r\n * sharply it bends once inside - so it moves the balance between the white R\r\n * highlight and the two coloured paths. Rarely worth changing from the\r\n * measured value, but exposed because it is a real physical quantity.\r\n */\r\n get marschnerIOR() {\r\n return this._marschnerIOR;\r\n }\r\n set marschnerIOR(val) {\r\n const v = val < 1.01 ? 1.01 : val;\r\n if (v !== this._marschnerIOR) {\r\n this._marschnerIOR = v;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Multiplier on how far light travels through the fibre before leaving.\r\n *\r\n * @remarks\r\n * The transmitted paths are tinted by absorbing the hair's own colour over the\r\n * distance they cross, so raising this deepens the colour of TT and TRT\r\n * without touching the white surface reflection. It is the dial for \"how\r\n * strongly pigmented\", separate from which colour the pigment is.\r\n */\r\n get marschnerAbsorption() {\r\n return this._marschnerAbsorption;\r\n }\r\n set marschnerAbsorption(val) {\r\n const v = val < 0 ? 0 : val;\r\n if (v !== this._marschnerAbsorption) {\r\n this._marschnerAbsorption = v;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Per-path intensities as `(R, TT, TRT)`, all 1 by default.\r\n *\r\n * @remarks\r\n * Art override on top of the physics, and the fastest way to see what each\r\n * path contributes: zero two of them and the third is on its own. R is the\r\n * white surface highlight, TT the backlit glow, TRT the coloured secondary.\r\n */\r\n get marschnerLobes(): Immutable<Vector3> {\r\n return this._marschnerLobes;\r\n }\r\n set marschnerLobes(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._marschnerLobes)) {\r\n this._marschnerLobes.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Occlusion map strength in [0, 1] */\r\n get occlusionStrength() {\r\n return this._occlusionStrength;\r\n }\r\n set occlusionStrength(val) {\r\n val = val < 0 ? 0 : val > 1 ? 1 : val;\r\n if (val !== this._occlusionStrength) {\r\n this._occlusionStrength = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n this.vertexShaderImpl(scope);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n if (\r\n this.needFragmentColor() &&\r\n this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT &&\r\n !(this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING)\r\n ) {\r\n scope.zHairSpec1 = pb.vec4().uniform(2);\r\n scope.zHairSpec2 = pb.vec4().uniform(2);\r\n scope.zHairShift = pb.vec4().uniform(2);\r\n scope.zHairParams = pb.vec4().uniform(2);\r\n if (this.featureUsed(HairMaterial.FEATURE_TRANSMISSION)) {\r\n scope.zHairTransmission = pb.vec4().uniform(2);\r\n }\r\n if (this.featureUsed(HairMaterial.FEATURE_SCATTER)) {\r\n scope.zHairScatter = pb.vec4().uniform(2);\r\n }\r\n if (this.shadingModel === 'marschner') {\r\n scope.zHairMarschner1 = pb.vec4().uniform(2);\r\n scope.zHairMarschner2 = pb.vec4().uniform(2);\r\n }\r\n }\r\n if (this.needFragmentColorInput()) {\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n if (this.vertexColor) {\r\n scope.albedo = pb.mul(scope.albedo, this.getVertexColor(scope));\r\n }\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.wNorm,\r\n scope.$inputs.wTangent,\r\n scope.$inputs.wBinormal\r\n );\r\n scope.$l.normal = this.calculateShadingNormal(scope, scope.normalInfo);\r\n scope.$l.strandT =\r\n this.strandDirection === 'tangent' ? scope.normalInfo.TBN[0] : scope.normalInfo.TBN[1];\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n if (this.specularShiftTexture) {\r\n scope.$l.shiftVal = pb.mul(\r\n pb.sub(this.sampleSpecularShiftTexture(scope).r, 0.5),\r\n scope.zHairShift.z\r\n );\r\n } else {\r\n scope.$l.shiftVal = pb.float(0);\r\n }\r\n scope.$l.hairAO = this.calculateHairOcclusion(scope);\r\n scope.$l.hairDirectAO = this.calculateHairDirectOcclusion(scope);\r\n scope.$l.litColor = this.hairLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normal,\r\n scope.strandT,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.shiftVal,\r\n scope.hairAO,\r\n scope.hairDirectAO,\r\n scope.normalInfo.TBN[2]\r\n );\r\n if (\r\n this.drawContext.materialFlags &\r\n (MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SCENE_STORE_NORMAL)\r\n ) {\r\n // Screen-space reflections only produce noise on thin hair strands,\r\n // so write zero reflectance to keep SSR off for hair pixels.\r\n this.outputFragmentColor(\r\n scope,\r\n scope.$inputs.worldPos,\r\n pb.vec4(scope.litColor, scope.albedo.a),\r\n pb.vec4(0, 0, 0, 1),\r\n pb.vec4(pb.add(pb.mul(scope.normal, 0.5), pb.vec3(0.5)), 1)\r\n );\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n }\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.albedo);\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) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (\r\n this.needFragmentColor(ctx) &&\r\n ctx.renderPass!.type === RENDER_PASS_TYPE_LIGHT &&\r\n !(ctx.materialFlags & MaterialVaryingFlags.INSTANCING)\r\n ) {\r\n const scratch = this._uniformScratch;\r\n bindGroup.setValue(\r\n 'zHairSpec1',\r\n scratch.setXYZW(\r\n this._specular1Color.x,\r\n this._specular1Color.y,\r\n this._specular1Color.z,\r\n this._specular1Power\r\n )\r\n );\r\n bindGroup.setValue(\r\n 'zHairSpec2',\r\n scratch.setXYZW(\r\n this._specular2Color.x,\r\n this._specular2Color.y,\r\n this._specular2Color.z,\r\n this._specular2Power\r\n )\r\n );\r\n bindGroup.setValue(\r\n 'zHairShift',\r\n scratch.setXYZW(this._specular1Shift, this._specular2Shift, this._shiftMapScale, this._diffuseWrap)\r\n );\r\n bindGroup.setValue(\r\n 'zHairParams',\r\n scratch.setXYZW(\r\n this._transmissionPower,\r\n this._occlusionStrength,\r\n this._scatterLocal,\r\n this._scatterWrap\r\n )\r\n );\r\n if (this.featureUsed(HairMaterial.FEATURE_TRANSMISSION)) {\r\n bindGroup.setValue(\r\n 'zHairTransmission',\r\n scratch.setXYZW(\r\n this._transmissionColor.x,\r\n this._transmissionColor.y,\r\n this._transmissionColor.z,\r\n this._transmissionIntensity\r\n )\r\n );\r\n }\r\n if (this.featureUsed(HairMaterial.FEATURE_SCATTER)) {\r\n bindGroup.setValue(\r\n 'zHairScatter',\r\n scratch.setXYZW(\r\n this._scatterColor.x,\r\n this._scatterColor.y,\r\n this._scatterColor.z,\r\n this._scatterIntensity\r\n )\r\n );\r\n }\r\n if (this.shadingModel === 'marschner') {\r\n bindGroup.setValue(\r\n 'zHairMarschner1',\r\n scratch.setXYZW(\r\n this._marschnerShift,\r\n this._marschnerRoughness,\r\n this._marschnerIOR,\r\n this._marschnerAbsorption\r\n )\r\n );\r\n // Normal-incidence reflectance from the index, folded here because it\r\n // does not vary per fragment. 1.55 gives roughly 0.046.\r\n const f0 = (this._marschnerIOR - 1) / (this._marschnerIOR + 1);\r\n bindGroup.setValue(\r\n 'zHairMarschner2',\r\n scratch.setXYZW(this._marschnerLobes.x, this._marschnerLobes.y, this._marschnerLobes.z, f0 * f0)\r\n );\r\n }\r\n }\r\n }\r\n protected vertexShaderImpl(scope: PBFunctionScope) {\r\n const pb = scope.$builder;\r\n scope.$l.oPos = ShaderHelper.resolveVertexPosition(scope);\r\n scope.$outputs.worldPos = pb.mul(ShaderHelper.getWorldMatrix(scope), pb.vec4(scope.oPos, 1)).xyz;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n if (this.vertexNormal) {\r\n scope.$l.oNorm = ShaderHelper.resolveVertexNormal(scope);\r\n scope.$outputs.wNorm = pb.mul(ShaderHelper.getNormalMatrix(scope), pb.vec4(scope.oNorm, 0)).xyz;\r\n if (this.vertexTangent) {\r\n scope.$l.oTangent = ShaderHelper.resolveVertexTangent(scope);\r\n scope.$outputs.wTangent = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oTangent.xyz, 0)\r\n ).xyz;\r\n scope.$outputs.wBinormal = pb.mul(\r\n pb.cross(scope.$outputs.wNorm, scope.$outputs.wTangent),\r\n scope.oTangent.w\r\n );\r\n }\r\n }\r\n }\r\n /**\r\n * Shading normal for the current fragment.\r\n *\r\n * @remarks\r\n * Split out from the interpolated frame so a subclass whose polygons stand in\r\n * for a different surface can say what that surface is. A hair card really is\r\n * the flat sheet it is drawn as, so the frame's own normal is right here;\r\n * {@link HairStrandMaterial} overrides this, because its quads stand in for\r\n * round fibres and shading them flat is the difference between hair and tape.\r\n * @internal\r\n */\r\n protected calculateShadingNormal(scope: PBInsideFunctionScope, normalInfo: PBShaderExp): PBShaderExp {\r\n return normalInfo.normal;\r\n }\r\n /**\r\n * Ambient occlusion for the current fragment.\r\n *\r\n * @remarks\r\n * Applied to the light that no shadow query answers for: environment\r\n * irradiance and the multiple-scattering term. On a dense groom this is the\r\n * only thing that keeps the strands buried inside it from receiving the full\r\n * sky, which is what gives the hairstyle its volume.\r\n *\r\n * For a hair card that is the occlusion map's job, which is what this does.\r\n * {@link HairStrandMaterial} has no texture coordinates to sample one with and\r\n * overrides this with a geometric approximation instead.\r\n * @internal\r\n */\r\n protected calculateHairOcclusion(scope: PBInsideFunctionScope): PBShaderExp {\r\n return this.sampleBaseOcclusion(scope);\r\n }\r\n /**\r\n * Occlusion applied to direct (per-light) shading.\r\n *\r\n * @remarks\r\n * Direct light already carries its own occlusion answer - the shadow map, or\r\n * under DOM a graded transmittance - so an ambient term multiplied on top\r\n * counts the same blockage twice: the map says thirty percent of the beam got\r\n * through, and the AO halves it again. That is why this is a separate hook\r\n * rather than one value for everything.\r\n *\r\n * The card path deliberately keeps the occlusion map here as well: a card\r\n * groom's map is authored as the look of the whole stack and its cards rarely\r\n * self-shadow credibly, so dimming direct light is part of what the author\r\n * painted. The strand path's geometric term makes the opposite choice and\r\n * leaves direct light to the shadow map - see\r\n * {@link HairStrandMaterial.rootOcclusion}.\r\n * @internal\r\n */\r\n protected calculateHairDirectOcclusion(scope: PBInsideFunctionScope): PBShaderExp {\r\n return this.sampleBaseOcclusion(scope);\r\n }\r\n /** The occlusion map contribution both hooks share. @internal */\r\n private sampleBaseOcclusion(scope: PBInsideFunctionScope): PBShaderExp {\r\n const pb = scope.$builder;\r\n if (this.occlusionTexture) {\r\n return pb.mix(pb.float(1), this.sampleOcclusionTexture(scope).r, scope.zHairParams.y);\r\n }\r\n return pb.float(1);\r\n }\r\n /**\r\n * Approximates the light that reaches a point after bouncing off neighbouring\r\n * fibres rather than travelling straight to it.\r\n *\r\n * @remarks\r\n * Follows the split dual scattering makes, without its precomputation - the\r\n * average forward and backward attenuations that theory derives from the fibre\r\n * BCSDF are stand-in constants here, because this material's lighting is a\r\n * phenomenological double lobe rather than a BCSDF to integrate.\r\n *\r\n * - **Global**, `throughput * wrapped(NoL)`: the beam that did cross the hair in\r\n * front, arriving spread out. Scattering randomises direction as it goes, so\r\n * the lobe is far wider than a cosine and reaches well past the terminator.\r\n * - **Local**, `1 - throughput`: the beam that did not get through. Some of it\r\n * leaves the fibres it hit and re-emerges here, which is why it is brightest\r\n * exactly where the direct light is fully blocked, and why it does not fade\r\n * with depth the way the global term does.\r\n *\r\n * Both are modulated by the hair's own colour as well as the scatter tint,\r\n * because light that has bounced several times has been filtered by keratin\r\n * several times: it is the reason pale hair glows in shadow and dark hair\r\n * stays dark, and multiplying by albedo is what carries that difference.\r\n * @internal\r\n */\r\n hairScatter(\r\n scope: PBInsideFunctionScope,\r\n lightColor: PBShaderExp,\r\n albedo: PBShaderExp,\r\n NoL: PBShaderExp,\r\n throughput: PBShaderExp,\r\n ao: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairScatter';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('lightColor'), pb.vec3('albedo'), pb.float('NoL'), pb.float('throughput'), pb.float('ao')],\r\n function () {\r\n this.$l.localMix = this.zHairParams.z;\r\n this.$l.wrap = pb.max(this.zHairParams.w, 1e-4);\r\n // Wrapped well past the terminator, and never negative: a point facing\r\n // away from the light still receives scattered light, which is the whole\r\n // point of the term.\r\n this.$l.spread = pb.clamp(pb.div(pb.add(this.NoL, this.wrap), pb.add(1, this.wrap)), 0, 1);\r\n this.$l.global = pb.mul(this.throughput, this.spread);\r\n this.$l.local = pb.sub(1, this.throughput);\r\n this.$l.amount = pb.mix(this.global, this.local, this.localMix);\r\n this.$return(\r\n pb.mul(\r\n this.lightColor,\r\n this.albedo,\r\n this.zHairScatter.rgb,\r\n this.zHairScatter.a,\r\n this.amount,\r\n this.ao\r\n )\r\n );\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](lightColor, albedo, NoL, throughput, ao) as PBShaderExp;\r\n }\r\n /**\r\n * Normalised longitudinal lobe: a unit-integral Gaussian of width `width`.\r\n *\r\n * @remarks\r\n * Stands in for the exact longitudinal term, which involves a Bessel function\r\n * and, in the energy-conserving formulation, `cosh` - and `cosh` is not\r\n * available on WebGL1 in this shader builder. The Gaussian is the\r\n * approximation Marschner's own paper offers and is what real-time\r\n * implementations use.\r\n * @internal\r\n */\r\n private hairLongitudinal(scope: PBInsideFunctionScope, width: PBShaderExp, offset: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairLongitudinal';\r\n pb.func(funcName, [pb.float('width'), pb.float('offset')], function () {\r\n this.$l.b = pb.max(this.width, 0.0001);\r\n this.$l.t = pb.div(this.offset, this.b);\r\n this.$return(pb.div(pb.exp(pb.mul(this.t, this.t, -0.5)), pb.mul(this.b, Math.sqrt(2 * Math.PI))));\r\n });\r\n return pb.getGlobalScope()[funcName](width, offset) as PBShaderExp;\r\n }\r\n /**\r\n * Marschner fibre scattering: the three paths light can take through a strand.\r\n *\r\n * @remarks\r\n * Treats the strand as a translucent dielectric cylinder and adds up what\r\n * leaves it, split by how many times the light crossed a surface:\r\n *\r\n * - **R** bounces straight off the outside. It never meets the pigment, so it\r\n * is the colour of the light - the white sheen on dark hair.\r\n * - **TT** goes in one side and out the other, crossing the pigment twice. It\r\n * leaves roughly opposite where it entered, so it is what you see when the\r\n * light is behind the head, and it carries the deepest colour.\r\n * - **TRT** goes in, reflects off the far inside wall, and comes back out. It\r\n * emerges near the side it entered, so it reads as a second highlight\r\n * alongside R - but having crossed the pigment three times it is tinted,\r\n * which is why the secondary highlight of real hair is hair-coloured. The\r\n * double lobe has to be told that; here it falls out.\r\n *\r\n * Each path is a longitudinal lobe `M` in the angle up the fibre times an\r\n * azimuthal lobe `N` in the angle around it, over `cos²θd` to convert the\r\n * fibre's scattering into a BCSDF. `M` is a Gaussian, offset per path by the\r\n * tilt of the cuticle scales - which is the entire reason the three appear at\r\n * different angles rather than on top of each other.\r\n *\r\n * `N` is where the original model is expensive: solving it exactly means\r\n * finding the roots of the exit-angle equation, a cubic for TRT. These are the\r\n * published analytic fits to those solutions, which is the standard real-time\r\n * trade - it costs the sharp caustic glint that a true root solve produces,\r\n * and keeps everything else.\r\n *\r\n * Deliberately never touches the shading normal: the fibre frame is the\r\n * tangent plus the two directions, and the round cross-section is already\r\n * integrated into `N`. That makes it immune to the flat-ribbon normal problem\r\n * that `HairStrandMaterial.strandRoundness` exists to work around.\r\n * @internal\r\n */\r\n private hairMarschner(\r\n scope: PBInsideFunctionScope,\r\n strandT: PBShaderExp,\r\n lightDir: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n shiftVal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const funcName = 'Z_hairMarschner';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('T'), pb.vec3('L'), pb.vec3('V'), pb.vec3('albedo'), pb.float('shiftVal')],\r\n function () {\r\n // Longitudinal angles, measured off the plane perpendicular to the fibre.\r\n this.$l.sinThetaL = pb.clamp(pb.dot(this.T, this.L), -1, 1);\r\n this.$l.sinThetaV = pb.clamp(pb.dot(this.T, this.V), -1, 1);\r\n // The difference angle. Every path length inside the fibre scales with\r\n // it, because a ray that enters obliquely has further to travel.\r\n this.$l.thetaD = pb.mul(pb.abs(pb.sub(pb.asin(this.sinThetaV), pb.asin(this.sinThetaL))), 0.5);\r\n // Floored well above zero because the model divides by its square at the\r\n // end. The degenerate case is real: viewing straight down a fibre that is\r\n // lit straight up it puts thetaD at ninety degrees, and while the tinted\r\n // paths kill themselves there through Beer-Lambert, R does not - Fresnel\r\n // goes to one and M sits at its peak, so a 0.001 floor lets a single tip\r\n // pointing at the camera flash at a million times the light's intensity.\r\n // 0.2 keeps the gain within the range the azimuthal fits were made for.\r\n this.$l.cosThetaD = pb.max(pb.cos(this.thetaD), 0.2);\r\n // Azimuth, from the two directions projected onto the fibre's cross\r\n // section. cos(phi) alone is enough: every N below is symmetric about\r\n // the plane through the light, so the sign of phi never matters.\r\n this.$l.Lp = pb.sub(this.L, pb.mul(this.T, this.sinThetaL));\r\n this.$l.Vp = pb.sub(this.V, pb.mul(this.T, this.sinThetaV));\r\n this.$l.cosPhi = pb.clamp(\r\n pb.mul(\r\n pb.dot(this.Lp, this.Vp),\r\n pb.inverseSqrt(pb.add(pb.mul(pb.dot(this.Lp, this.Lp), pb.dot(this.Vp, this.Vp)), 1e-5))\r\n ),\r\n -1,\r\n 1\r\n );\r\n this.$l.cosHalfPhi = pb.sqrt(pb.clamp(pb.add(pb.mul(this.cosPhi, 0.5), 0.5), 0, 1));\r\n\r\n this.$l.ior = pb.max(this.zHairMarschner1.z, 1.01);\r\n // F0 is a function of the index alone, so it is folded on the CPU.\r\n this.$l.f0 = pb.vec3(this.zHairMarschner2.w);\r\n this.$l.f90 = pb.vec3(1);\r\n // Bravais' virtual index. A ray crossing the fibre at a slant refracts as\r\n // though the material had a different index; this is that index. The\r\n // widely used `1.19/cosThetaD + 0.36*cosThetaD` is a fit to this\r\n // expression for one particular value of the index, and would ignore the\r\n // index entirely - which would quietly make an exposed IOR do nothing.\r\n // The exact form costs one sqrt and keeps the parameter meaningful.\r\n this.$l.nPrime = pb.div(\r\n pb.sqrt(\r\n pb.max(pb.add(pb.mul(this.ior, this.ior), pb.mul(this.cosThetaD, this.cosThetaD), -1), 0.01)\r\n ),\r\n this.cosThetaD\r\n );\r\n\r\n // Cuticle tilt. The ratios between the three are what the measurements\r\n // give; the shift map perturbs all three together, per strand.\r\n this.$l.shift = pb.add(this.zHairMarschner1.x, this.shiftVal);\r\n this.$l.beta = pb.max(this.zHairMarschner1.y, 0.005);\r\n this.$l.width = pb.mul(this.beta, this.beta);\r\n this.$l.theta = pb.add(this.sinThetaL, this.sinThetaV);\r\n this.$l.absorb = this.zHairMarschner1.w;\r\n // Guards pow() against a zero base, which is legal but not uniformly\r\n // well behaved across drivers.\r\n this.$l.tint = pb.max(this.albedo, pb.vec3(0.0001));\r\n\r\n // --- R: off the surface, uncoloured.\r\n this.$l.mR = that.hairLongitudinal(this, this.width, pb.sub(this.theta, pb.mul(this.shift, -2)));\r\n this.$l.nR = pb.mul(this.cosHalfPhi, 0.25);\r\n this.$l.fR = that.fresnelSchlick(\r\n this,\r\n pb.sqrt(pb.clamp(pb.add(pb.mul(pb.dot(this.V, this.L), 0.5), 0.5), 0, 1)),\r\n this.f0,\r\n this.f90\r\n );\r\n this.$l.sR = pb.mul(this.fR, this.mR, this.nR, this.zHairMarschner2.x);\r\n\r\n // --- TT: in one side, out the other. Two pigment crossings.\r\n this.$l.mTT = that.hairLongitudinal(this, pb.mul(this.width, 0.5), pb.sub(this.theta, this.shift));\r\n this.$l.a = pb.div(1, this.nPrime);\r\n // Where across the fibre the ray that reaches the eye entered. The fit\r\n // stands in for inverting the refraction, and drives both how much\r\n // reflects away and how far the rest travels through the pigment.\r\n this.$l.h = pb.clamp(\r\n pb.mul(this.cosHalfPhi, pb.add(1, pb.mul(this.a, pb.sub(0.6, pb.mul(this.cosPhi, 0.8))))),\r\n -1,\r\n 1\r\n );\r\n this.$l.fTT = that.fresnelSchlick(\r\n this,\r\n pb.mul(this.cosThetaD, pb.sqrt(pb.max(pb.sub(1, pb.mul(this.h, this.h)), 0))),\r\n this.f0,\r\n this.f90\r\n );\r\n this.$l.oneMinusFTT = pb.sub(pb.vec3(1), this.fTT);\r\n this.$l.ha = pb.mul(this.h, this.a);\r\n this.$l.pathTT = pb.div(\r\n pb.mul(pb.sqrt(pb.max(pb.sub(1, pb.mul(this.ha, this.ha)), 0)), 0.5),\r\n this.cosThetaD\r\n );\r\n this.$l.tTT = pb.pow(this.tint, pb.vec3(pb.mul(this.pathTT, this.absorb)));\r\n this.$l.nTT = pb.exp(pb.sub(pb.mul(this.cosPhi, -3.65), 3.98));\r\n this.$l.sTT = pb.mul(\r\n this.oneMinusFTT,\r\n this.oneMinusFTT,\r\n this.tTT,\r\n this.mTT,\r\n this.nTT,\r\n this.zHairMarschner2.y\r\n );\r\n\r\n // --- TRT: in, off the far wall, back out. Three pigment crossings, so\r\n // this is the lobe that carries the hair's colour into the highlight.\r\n this.$l.mTRT = that.hairLongitudinal(\r\n this,\r\n pb.mul(this.width, 2),\r\n pb.sub(this.theta, pb.mul(this.shift, 4))\r\n );\r\n this.$l.fTRT = that.fresnelSchlick(this, pb.mul(this.cosThetaD, 0.5), this.f0, this.f90);\r\n this.$l.oneMinusFTRT = pb.sub(pb.vec3(1), this.fTRT);\r\n this.$l.tTRT = pb.pow(this.tint, pb.vec3(pb.mul(pb.div(0.8, this.cosThetaD), this.absorb)));\r\n this.$l.nTRT = pb.exp(pb.sub(pb.mul(this.cosPhi, 17), 16.78));\r\n this.$l.sTRT = pb.mul(\r\n this.oneMinusFTRT,\r\n this.oneMinusFTRT,\r\n this.fTRT,\r\n this.tTRT,\r\n this.mTRT,\r\n this.nTRT,\r\n this.zHairMarschner2.z\r\n );\r\n\r\n this.$return(pb.div(pb.add(this.sR, this.sTT, this.sTRT), pb.mul(this.cosThetaD, this.cosThetaD)));\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](strandT, lightDir, viewVec, albedo, shiftVal) as PBShaderExp;\r\n }\r\n /**\r\n * Scheuermann-style anisotropic strand specular: shift the strand tangent along\r\n * the normal, then raise sin(T', H) to the lobe exponent with a directional fade.\r\n * @internal\r\n */\r\n private hairStrandSpecular(\r\n scope: PBInsideFunctionScope,\r\n strandT: PBShaderExp,\r\n normal: PBShaderExp,\r\n halfVec: PBShaderExp,\r\n shift: PBShaderExp,\r\n power: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairStrandSpecular';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('strandT'), pb.vec3('normal'), pb.vec3('halfVec'), pb.float('shift'), pb.float('power')],\r\n function () {\r\n this.$l.shiftedT = pb.normalize(pb.add(this.strandT, pb.mul(this.normal, this.shift)));\r\n this.$l.TdotH = pb.dot(this.shiftedT, this.halfVec);\r\n this.$l.sinTH = pb.sqrt(pb.max(pb.sub(1, pb.mul(this.TdotH, this.TdotH)), 0));\r\n this.$l.dirAtten = pb.smoothStep(-1, 0, this.TdotH);\r\n this.$return(pb.mul(this.dirAtten, pb.pow(pb.max(this.sinTH, 0.0001), this.power)));\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](strandT, normal, halfVec, shift, power) as PBShaderExp;\r\n }\r\n /**\r\n * Computes the lit color for hair with wrap diffuse, double-lobe anisotropic\r\n * specular and optional transmission.\r\n * @internal\r\n */\r\n /**\r\n * @param ao - Ambient occlusion, applied to environment irradiance and the\r\n * scatter term - the light no shadow query answers for.\r\n * @param aoDirect - Occlusion applied to per-light shading, whose direct\r\n * blockage the shadow map already accounts for. See\r\n * {@link HairMaterial.calculateHairDirectOcclusion}.\r\n * @param geometricNormal - Interpolated vertex normal, used for shadow normal\r\n * offset bias. Defaults to `normal`.\r\n */\r\n hairLight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n strandT: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n shiftVal: PBShaderExp,\r\n ao: PBShaderExp,\r\n aoDirect: PBShaderExp,\r\n geometricNormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairLight';\r\n const that = this;\r\n const baseLightPass = !that.drawContext.lightBlending;\r\n const useTransmission = that.featureUsed<boolean>(HairMaterial.FEATURE_TRANSMISSION);\r\n const useScatter = that.featureUsed<boolean>(HairMaterial.FEATURE_SCATTER);\r\n const useMarschner = that.shadingModel === 'marschner';\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec3('worldPos'),\r\n pb.vec3('normal'),\r\n pb.vec3('strandT'),\r\n pb.vec3('viewVec'),\r\n pb.vec4('albedo'),\r\n pb.float('shiftVal'),\r\n pb.float('ao'),\r\n pb.float('aoDirect'),\r\n pb.vec3('geometricNormal')\r\n ],\r\n function () {\r\n if (!that.needFragmentColor()) {\r\n this.$return(this.albedo.rgb);\r\n } else {\r\n if (that.needCalculateEnvLight() && baseLightPass) {\r\n this.$l.diffuseColor = pb.mul(that.getEnvLightIrradiance(this, this.normal), this.ao);\r\n } else {\r\n this.$l.diffuseColor = pb.vec3(0);\r\n }\r\n this.$l.specularColor = pb.vec3(0);\r\n this.$l.transmissionColor = pb.vec3(0);\r\n this.$l.scatterColor = pb.vec3(0);\r\n that.forEachLight(this, function (type, posRange, dirCutoff, colorIntensity, extra, shadow) {\r\n this.$l.diffuseScale = pb.float(1);\r\n this.$l.specularScale = pb.float(1);\r\n this.$if(pb.equal(type, LIGHT_TYPE_POINT), function () {\r\n this.diffuseScale = extra.x;\r\n this.specularScale = extra.y;\r\n });\r\n this.$l.lightAtten = that.calculateLightAttenuation(\r\n this,\r\n type,\r\n this.worldPos,\r\n posRange,\r\n dirCutoff,\r\n extra\r\n );\r\n this.$l.lightDir = that.calculateLightDirection(this, type, this.worldPos, posRange, dirCutoff);\r\n this.$l.NoL = pb.dot(this.normal, this.lightDir);\r\n this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten);\r\n // Wrap diffuse softens the terminator across thin cards.\r\n this.$l.wrap = this.zHairShift.w;\r\n this.$l.diffFactor = pb.clamp(pb.div(pb.add(this.NoL, this.wrap), pb.add(1, this.wrap)), 0, 1);\r\n if (useMarschner) {\r\n // No half vector and no specular fade here. The fade exists to stop\r\n // the double lobe glowing where no light reaches; Marschner's TT\r\n // path is light that genuinely came through the fibre from behind,\r\n // so fading it out on the unlit side would delete the one thing the\r\n // model offers that the double lobe cannot produce at all.\r\n this.$l.specTerm = that.hairMarschner(\r\n this,\r\n this.strandT,\r\n this.lightDir,\r\n this.viewVec,\r\n this.albedo.rgb,\r\n this.shiftVal\r\n );\r\n } else {\r\n this.$l.halfVec = pb.normalize(pb.add(this.viewVec, this.lightDir));\r\n this.$l.spec1 = that.hairStrandSpecular(\r\n this,\r\n this.strandT,\r\n this.normal,\r\n this.halfVec,\r\n pb.add(this.zHairShift.x, this.shiftVal),\r\n this.zHairSpec1.w\r\n );\r\n this.$l.spec2 = that.hairStrandSpecular(\r\n this,\r\n this.strandT,\r\n this.normal,\r\n this.halfVec,\r\n pb.add(this.zHairShift.y, this.shiftVal),\r\n this.zHairSpec2.w\r\n );\r\n // Fade specular out on the fully unlit side to avoid glowing shadows.\r\n this.$l.specFade = pb.smoothStep(-0.35, 0.15, this.NoL);\r\n this.$l.specTerm = pb.mul(\r\n pb.add(\r\n pb.mul(this.zHairSpec1.rgb, this.spec1),\r\n pb.mul(this.zHairSpec2.rgb, this.albedo.rgb, this.spec2)\r\n ),\r\n this.specFade\r\n );\r\n }\r\n this.$l.diffuse = pb.mul(\r\n this.lightColor,\r\n 1 / Math.PI,\r\n this.diffFactor,\r\n this.aoDirect,\r\n this.diffuseScale\r\n );\r\n this.$l.specular = pb.mul(this.lightColor, this.specTerm, this.aoDirect, this.specularScale);\r\n if (useTransmission) {\r\n this.$l.transDir = pb.normalize(pb.add(this.lightDir, pb.mul(this.normal, 0.3)));\r\n this.$l.VoL = pb.clamp(pb.dot(this.viewVec, pb.neg(this.transDir)), 0, 1);\r\n this.$l.transFactor = pb.mul(pb.pow(this.VoL, this.zHairParams.x), this.zHairTransmission.a);\r\n this.$l.transmission = pb.mul(\r\n this.lightColor,\r\n this.zHairTransmission.rgb,\r\n this.transFactor,\r\n this.aoDirect\r\n );\r\n } else {\r\n this.$l.transmission = pb.vec3(0);\r\n }\r\n // Fraction of the beam that reached this point without being absorbed.\r\n // Under a deep opacity map this grades with how much hair the light\r\n // crossed, which is exactly what the scattering terms want; under a\r\n // binary filter it is one or zero and they degrade to following it.\r\n this.$l.throughput = pb.float(1);\r\n if (shadow) {\r\n this.$l.shadow = that.calculateShadow(\r\n this,\r\n this.worldPos,\r\n this.geometricNormal,\r\n pb.max(this.NoL, 0)\r\n );\r\n this.throughput = this.shadow;\r\n this.diffuse = pb.mul(this.diffuse, this.shadow);\r\n this.specular = pb.mul(this.specular, this.shadow);\r\n this.transmission = pb.mul(this.transmission, this.shadow);\r\n }\r\n if (useScatter) {\r\n this.scatterColor = pb.add(\r\n this.scatterColor,\r\n that.hairScatter(this, this.lightColor, this.albedo.rgb, this.NoL, this.throughput, this.ao)\r\n );\r\n }\r\n this.diffuseColor = pb.add(this.diffuseColor, this.diffuse);\r\n this.specularColor = pb.add(this.specularColor, this.specular);\r\n this.transmissionColor = pb.add(this.transmissionColor, this.transmission);\r\n });\r\n this.$return(\r\n pb.add(\r\n pb.mul(this.albedo.rgb, this.diffuseColor),\r\n this.specularColor,\r\n this.transmissionColor,\r\n this.scatterColor\r\n )\r\n );\r\n }\r\n }\r\n );\r\n return pb\r\n .getGlobalScope()\r\n [\r\n funcName\r\n ](worldPos, normal, strandT, viewVec, albedo, shiftVal, ao, aoDirect, geometricNormal ?? normal) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["HairMaterial","applyMaterialMixins","MeshMaterial","mixinLight","mixinPBRBRDF","mixinVertexColor","mixinTextureProps","FEATURE_VERTEX_NORMAL","defineFeature","FEATURE_VERTEX_TANGENT","FEATURE_STRAND_DIRECTION","FEATURE_TRANSMISSION","FEATURE_SCATTER","FEATURE_SHADING_MODEL","_specular1Color","Vector3","_specular1Power","_specular1Shift","_specular2Color","_specular2Power","_specular2Shift","_shiftMapScale","_diffuseWrap","_transmissionColor","_transmissionIntensity","_transmissionPower","_occlusionStrength","_marschnerShift","_marschnerRoughness","_marschnerIOR","_marschnerAbsorption","_marschnerLobes","_scatterColor","_scatterIntensity","_scatterLocal","_scatterWrap","_uniformScratch","Vector4","useFeature","cullMode","clone","other","copyFrom","specular1Color","specular1Power","specular1Shift","specular2Color","specular2Power","specular2Shift","shiftMapScale","diffuseWrap","transmissionColor","transmissionIntensity","transmissionPower","occlusionStrength","scatterColor","scatterIntensity","scatterLocal","scatterWrap","shadingModel","marschnerShift","marschnerRoughness","marschnerIOR","marschnerAbsorption","marschnerLobes","vertexNormal","featureUsed","val","vertexTangent","strandDirection","equalsTo","set","uniformChanged","v","vertexShader","scope","vertexShaderImpl","fragmentShader","pb","$builder","needFragmentColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","materialFlags","MaterialVaryingFlags","INSTANCING","zHairSpec1","vec4","uniform","zHairSpec2","zHairShift","zHairParams","zHairTransmission","zHairScatter","zHairMarschner1","zHairMarschner2","needFragmentColorInput","$l","albedo","calculateAlbedoColor","vertexColor","mul","getVertexColor","normalInfo","calculateNormalAndTBN","$inputs","worldPos","wNorm","wTangent","wBinormal","normal","calculateShadingNormal","strandT","TBN","viewVec","calculateViewVector","specularShiftTexture","shiftVal","sub","sampleSpecularShiftTexture","r","z","float","hairAO","calculateHairOcclusion","hairDirectAO","calculateHairDirectOcclusion","litColor","hairLight","SCENE_STORE_ROUGHNESS","SCENE_STORE_NORMAL","outputFragmentColor","a","add","vec3","applyUniformValues","bindGroup","ctx","pass","scratch","setValue","setXYZW","x","y","f0","oPos","ShaderHelper","resolveVertexPosition","$outputs","getWorldMatrix","xyz","setClipSpacePosition","getViewProjectionMatrix","oNorm","resolveVertexNormal","getNormalMatrix","oTangent","resolveVertexTangent","cross","w","sampleBaseOcclusion","occlusionTexture","mix","sampleOcclusionTexture","hairScatter","lightColor","NoL","throughput","ao","funcName","func","localMix","wrap","max","spread","clamp","div","global","local","amount","$return","rgb","getGlobalScope","width","offset","b","t","exp","Math","sqrt","PI","hairMarschner","lightDir","that","sinThetaL","dot","T","L","sinThetaV","V","thetaD","abs","asin","cosThetaD","cos","Lp","Vp","cosPhi","inverseSqrt","cosHalfPhi","ior","f90","nPrime","shift","beta","theta","absorb","tint","mR","hairLongitudinal","nR","fR","fresnelSchlick","sR","mTT","h","fTT","oneMinusFTT","ha","pathTT","tTT","pow","nTT","sTT","mTRT","fTRT","oneMinusFTRT","tTRT","nTRT","sTRT","hairStrandSpecular","halfVec","power","shiftedT","normalize","TdotH","sinTH","dirAtten","smoothStep","aoDirect","geometricNormal","baseLightPass","lightBlending","useTransmission","useScatter","useMarschner","needCalculateEnvLight","diffuseColor","getEnvLightIrradiance","specularColor","forEachLight","posRange","dirCutoff","colorIntensity","extra","shadow","diffuseScale","specularScale","$if","equal","LIGHT_TYPE_POINT","lightAtten","calculateLightAttenuation","calculateLightDirection","diffFactor","specTerm","spec1","spec2","specFade","diffuse","specular","transDir","VoL","neg","transFactor","transmission","calculateShadow"],"mappings":"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"}
1
+ {"version":3,"file":"hair.js","sources":["../../src/material/hair.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport { mixinLight } from './mixins/lit';\r\nimport { mixinVertexColor } from './mixins/vertexcolor';\r\nimport { mixinTextureProps } from './mixins/texture';\r\nimport { mixinPBRBRDF } from './mixins/pbr/brdf';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport { LIGHT_TYPE_POINT, MaterialVaryingFlags, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { DrawContext } from '../render';\r\nimport type { Clonable, Immutable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Which TBN axis runs along the hair strands of the card atlas.\r\n *\r\n * Most hair-card atlases lay strands out along the V axis of the UV, which maps to\r\n * the binormal; use 'tangent' when strands run along U instead.\r\n * @public\r\n */\r\nexport type HairStrandDirection = 'tangent' | 'binormal';\r\n\r\n/**\r\n * Which scattering model shades the hair.\r\n *\r\n * - `kajiya-kay`: the phenomenological double lobe. Every term is an art dial,\r\n * which makes it predictable and cheap, and is usually what a stylised hair\r\n * card wants.\r\n * - `marschner`: the fibre model, splitting light into the three paths it can\r\n * take through a strand. Costs more and gives up some direct control, but the\r\n * secondary highlight takes the hair's own colour and backlit tips glow\r\n * because the model says they must, not because someone dialled it in.\r\n * @public\r\n */\r\nexport type HairShadingModel = 'kajiya-kay' | 'marschner';\r\n\r\n/**\r\n * Hair-card material using a Kajiya-Kay style double-lobe anisotropic lighting model.\r\n *\r\n * Lighting terms:\r\n * - Wrap diffuse to soften the terminator across thin cards.\r\n * - Primary specular lobe (usually near-white, sharp, shifted toward the root).\r\n * - Secondary specular lobe (tinted by hair color, broader, shifted toward the tip),\r\n * with an optional shift texture that jitters both lobes per strand to break up\r\n * the \"angel ring\" into natural streaks.\r\n * - Optional view-dependent transmission for backlit tips.\r\n * - Optional baked occlusion map (root darkening).\r\n *\r\n * Alpha handling comes from the MeshMaterial base: use `alphaCutoff` plus\r\n * `alphaDither` for TAA-converged soft edges on the opaque core, and\r\n * `blendMode='blend'` for the outer flyaway layer.\r\n * @public\r\n */\r\nexport class HairMaterial\r\n extends applyMaterialMixins(\r\n MeshMaterial,\r\n mixinLight,\r\n mixinPBRBRDF,\r\n mixinVertexColor,\r\n mixinTextureProps('specularShift'),\r\n mixinTextureProps('occlusion')\r\n )\r\n implements Clonable<HairMaterial>\r\n{\r\n /** @internal */\r\n private static readonly FEATURE_VERTEX_NORMAL = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_VERTEX_TANGENT = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_STRAND_DIRECTION = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_TRANSMISSION = this.defineFeature();\r\n /** @internal */\r\n private static readonly FEATURE_SCATTER = this.defineFeature();\r\n /** @internal Selects the scattering model. Holds a {@link HairShadingModel}. */\r\n private static readonly FEATURE_SHADING_MODEL = this.defineFeature();\r\n /** @internal Primary lobe color (usually near-white). */\r\n private readonly _specular1Color: Vector3;\r\n /** @internal Primary lobe exponent. */\r\n private _specular1Power: number;\r\n /** @internal Primary lobe shift along the normal (negative moves toward root). */\r\n private _specular1Shift: number;\r\n /** @internal Secondary lobe color, multiplied by albedo in the shader. */\r\n private readonly _specular2Color: Vector3;\r\n /** @internal Secondary lobe exponent. */\r\n private _specular2Power: number;\r\n /** @internal Secondary lobe shift along the normal. */\r\n private _specular2Shift: number;\r\n /** @internal Scale applied to (shiftTexture.r - 0.5). */\r\n private _shiftMapScale: number;\r\n /** @internal Wrap diffuse amount in [0, 1]. */\r\n private _diffuseWrap: number;\r\n /** @internal Transmission tint color. */\r\n private readonly _transmissionColor: Vector3;\r\n /** @internal Transmission intensity, 0 disables the term. */\r\n private _transmissionIntensity: number;\r\n /** @internal Transmission view-alignment exponent. */\r\n private _transmissionPower: number;\r\n /** @internal Occlusion map strength in [0, 1]. */\r\n private _occlusionStrength: number;\r\n /** @internal Marschner longitudinal shift of the R lobe, in sine units. */\r\n private _marschnerShift: number;\r\n /** @internal Marschner longitudinal roughness. */\r\n private _marschnerRoughness: number;\r\n /** @internal Refractive index of the fibre. */\r\n private _marschnerIOR: number;\r\n /** @internal Multiplier on the Beer-Lambert path length. */\r\n private _marschnerAbsorption: number;\r\n /** @internal Per-lobe intensities: R, TT, TRT. */\r\n private readonly _marschnerLobes: Vector3;\r\n /** @internal Tint of multiply-scattered light. */\r\n private readonly _scatterColor: Vector3;\r\n /** @internal Multiple scattering intensity, 0 disables the term. */\r\n private _scatterIntensity: number;\r\n /** @internal Share of the scattering that survives where direct light does not. */\r\n private _scatterLocal: number;\r\n /** @internal Angular width of the forward-scattered lobe. */\r\n private _scatterWrap: number;\r\n /** @internal Scratch vector for packing uniform values without per-frame allocation. */\r\n private readonly _uniformScratch: Vector4;\r\n /**\r\n * Creates an instance of HairMaterial with defaults tuned for dark stylized hair.\r\n */\r\n constructor() {\r\n super();\r\n this._specular1Color = new Vector3(0.35, 0.35, 0.35);\r\n this._specular1Power = 160;\r\n this._specular1Shift = -0.15;\r\n this._specular2Color = new Vector3(0.5, 0.45, 0.4);\r\n this._specular2Power = 40;\r\n this._specular2Shift = 0.1;\r\n this._shiftMapScale = 1;\r\n this._diffuseWrap = 0.5;\r\n this._transmissionColor = new Vector3(0.9, 0.65, 0.45);\r\n this._transmissionIntensity = 0;\r\n this._transmissionPower = 6;\r\n this._occlusionStrength = 1;\r\n // Marschner defaults follow the measured fibre: the cuticle scales tilt the\r\n // surface by a few degrees, which is what separates the three lobes at all.\r\n this._marschnerShift = 0.035;\r\n this._marschnerRoughness = 0.3;\r\n this._marschnerIOR = 1.55;\r\n this._marschnerAbsorption = 1;\r\n this._marschnerLobes = new Vector3(1, 1, 1);\r\n this._scatterColor = new Vector3(1, 0.85, 0.7);\r\n this._scatterIntensity = 0;\r\n this._scatterLocal = 0.5;\r\n this._scatterWrap = 1;\r\n this._uniformScratch = new Vector4();\r\n this.useFeature(HairMaterial.FEATURE_VERTEX_NORMAL, true);\r\n this.useFeature(HairMaterial.FEATURE_STRAND_DIRECTION, 'binormal');\r\n this.useFeature(HairMaterial.FEATURE_TRANSMISSION, false);\r\n this.useFeature(HairMaterial.FEATURE_SCATTER, false);\r\n this.useFeature(HairMaterial.FEATURE_SHADING_MODEL, 'kajiya-kay');\r\n // Hair cards are visible from both sides.\r\n this.cullMode = 'none';\r\n }\r\n clone() {\r\n const other = new HairMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.specular1Color = other.specular1Color;\r\n this.specular1Power = other.specular1Power;\r\n this.specular1Shift = other.specular1Shift;\r\n this.specular2Color = other.specular2Color;\r\n this.specular2Power = other.specular2Power;\r\n this.specular2Shift = other.specular2Shift;\r\n this.shiftMapScale = other.shiftMapScale;\r\n this.diffuseWrap = other.diffuseWrap;\r\n this.transmissionColor = other.transmissionColor;\r\n this.transmissionIntensity = other.transmissionIntensity;\r\n this.transmissionPower = other.transmissionPower;\r\n this.occlusionStrength = other.occlusionStrength;\r\n this.scatterColor = other.scatterColor;\r\n this.scatterIntensity = other.scatterIntensity;\r\n this.scatterLocal = other.scatterLocal;\r\n this.scatterWrap = other.scatterWrap;\r\n this.shadingModel = other.shadingModel;\r\n this.marschnerShift = other.marschnerShift;\r\n this.marschnerRoughness = other.marschnerRoughness;\r\n this.marschnerIOR = other.marschnerIOR;\r\n this.marschnerAbsorption = other.marschnerAbsorption;\r\n this.marschnerLobes = other.marschnerLobes;\r\n }\r\n /** true if vertex normal attribute presents */\r\n get vertexNormal() {\r\n return this.featureUsed<boolean>(HairMaterial.FEATURE_VERTEX_NORMAL);\r\n }\r\n set vertexNormal(val) {\r\n this.useFeature(HairMaterial.FEATURE_VERTEX_NORMAL, !!val);\r\n }\r\n /** true if vertex tangent attribute presents */\r\n get vertexTangent() {\r\n return this.featureUsed<boolean>(HairMaterial.FEATURE_VERTEX_TANGENT);\r\n }\r\n set vertexTangent(val) {\r\n this.useFeature(HairMaterial.FEATURE_VERTEX_TANGENT, !!val);\r\n }\r\n /** Which TBN axis runs along the strands */\r\n get strandDirection() {\r\n return this.featureUsed<HairStrandDirection>(HairMaterial.FEATURE_STRAND_DIRECTION);\r\n }\r\n set strandDirection(val) {\r\n this.useFeature(HairMaterial.FEATURE_STRAND_DIRECTION, val);\r\n }\r\n /** Primary specular lobe color */\r\n get specular1Color(): Immutable<Vector3> {\r\n return this._specular1Color;\r\n }\r\n set specular1Color(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._specular1Color)) {\r\n this._specular1Color.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Primary specular lobe exponent */\r\n get specular1Power() {\r\n return this._specular1Power;\r\n }\r\n set specular1Power(val) {\r\n if (val !== this._specular1Power) {\r\n this._specular1Power = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Primary specular lobe shift along the normal */\r\n get specular1Shift() {\r\n return this._specular1Shift;\r\n }\r\n set specular1Shift(val) {\r\n if (val !== this._specular1Shift) {\r\n this._specular1Shift = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Secondary specular lobe color (multiplied by albedo) */\r\n get specular2Color(): Immutable<Vector3> {\r\n return this._specular2Color;\r\n }\r\n set specular2Color(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._specular2Color)) {\r\n this._specular2Color.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Secondary specular lobe exponent */\r\n get specular2Power() {\r\n return this._specular2Power;\r\n }\r\n set specular2Power(val) {\r\n if (val !== this._specular2Power) {\r\n this._specular2Power = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Secondary specular lobe shift along the normal */\r\n get specular2Shift() {\r\n return this._specular2Shift;\r\n }\r\n set specular2Shift(val) {\r\n if (val !== this._specular2Shift) {\r\n this._specular2Shift = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Scale applied to the shift texture */\r\n get shiftMapScale() {\r\n return this._shiftMapScale;\r\n }\r\n set shiftMapScale(val) {\r\n if (val !== this._shiftMapScale) {\r\n this._shiftMapScale = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Wrap diffuse amount in [0, 1] */\r\n get diffuseWrap() {\r\n return this._diffuseWrap;\r\n }\r\n set diffuseWrap(val) {\r\n val = val < 0 ? 0 : val > 1 ? 1 : val;\r\n if (val !== this._diffuseWrap) {\r\n this._diffuseWrap = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Transmission tint color */\r\n get transmissionColor(): Immutable<Vector3> {\r\n return this._transmissionColor;\r\n }\r\n set transmissionColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._transmissionColor)) {\r\n this._transmissionColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Transmission intensity, 0 disables the transmission term */\r\n get transmissionIntensity() {\r\n return this._transmissionIntensity;\r\n }\r\n set transmissionIntensity(val) {\r\n val = val < 0 ? 0 : val;\r\n if (val !== this._transmissionIntensity) {\r\n this._transmissionIntensity = val;\r\n this.useFeature(HairMaterial.FEATURE_TRANSMISSION, val > 0);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Transmission view-alignment exponent */\r\n get transmissionPower() {\r\n return this._transmissionPower;\r\n }\r\n set transmissionPower(val) {\r\n if (val !== this._transmissionPower) {\r\n this._transmissionPower = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Tint of multiply-scattered light.\r\n *\r\n * @remarks\r\n * Multiple scattering is strongly wavelength dependent - it is why blonde hair\r\n * glows and black hair does not - and the tint is applied on top of the hair's\r\n * own colour, which the term is already modulated by. Warm by default, since\r\n * the light that survives several bounces through keratin has lost its blue.\r\n */\r\n get scatterColor(): Immutable<Vector3> {\r\n return this._scatterColor;\r\n }\r\n set scatterColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._scatterColor)) {\r\n this._scatterColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Multiple scattering intensity. Zero disables the term, which is the default.\r\n *\r\n * @remarks\r\n * Absorption alone makes the inside of a groom black, because that is what\r\n * absorption does: past a few fibres essentially nothing of the direct beam\r\n * survives. Real hair is not black there, and the difference is light that\r\n * reached the point after bouncing off neighbouring fibres rather than\r\n * travelling straight through.\r\n *\r\n * This adds an approximation of it in two parts, following the decomposition\r\n * dual scattering makes: a global term, the light that came through the hair in\r\n * front and arrives spread over a wide angle, and a local term, the light that\r\n * did not come through but re-emerges after scattering nearby. The first fades\r\n * with depth into the groom, the second does not, and it is the second that\r\n * stops the interior going black.\r\n *\r\n * The forward transmittance both terms are built from is the shadow value, so\r\n * this is at its most meaningful under a shadow mode that grades it - a deep\r\n * opacity map. Under a binary filter the global term simply follows the shadow\r\n * and the local term fills its complement.\r\n *\r\n * Off by default: it adds light the material did not previously emit, so it\r\n * changes the look of any groom it is enabled on rather than refining it.\r\n */\r\n get scatterIntensity() {\r\n return this._scatterIntensity;\r\n }\r\n set scatterIntensity(val) {\r\n val = val < 0 ? 0 : val;\r\n if (val !== this._scatterIntensity) {\r\n this._scatterIntensity = val;\r\n this.useFeature(HairMaterial.FEATURE_SCATTER, val > 0);\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Balance between the two scattering terms, in [0, 1].\r\n *\r\n * @remarks\r\n * Zero keeps only the global term, so the scattering follows the light and\r\n * vanishes deep in the groom. One keeps only the local term, which is brightest\r\n * exactly where the direct light is blocked. The default splits them evenly;\r\n * denser and lighter hair wants more local.\r\n */\r\n get scatterLocal() {\r\n return this._scatterLocal;\r\n }\r\n set scatterLocal(val) {\r\n val = val < 0 ? 0 : val > 1 ? 1 : val;\r\n if (val !== this._scatterLocal) {\r\n this._scatterLocal = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Angular width of the forward-scattered lobe.\r\n *\r\n * @remarks\r\n * Scattering spreads light as it crosses fibres, so the global term is not a\r\n * cosine lobe but a much broader one; this is how far past the terminator it\r\n * reaches. Larger than {@link HairMaterial.diffuseWrap} on purpose - that one\r\n * softens a terminator, this one models a beam that has genuinely lost its\r\n * direction.\r\n */\r\n get scatterWrap() {\r\n return this._scatterWrap;\r\n }\r\n set scatterWrap(val) {\r\n val = val < 0 ? 0 : val;\r\n if (val !== this._scatterWrap) {\r\n this._scatterWrap = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Which scattering model shades the hair. Defaults to `kajiya-kay`.\r\n *\r\n * @remarks\r\n * Switching to `marschner` changes the look of any hair it is enabled on\r\n * rather than refining it, so it is opted into. See {@link HairShadingModel}\r\n * for what the two models are; the `marschner*` properties are inert under\r\n * `kajiya-kay` and the specular lobe properties are inert under `marschner`.\r\n *\r\n * Two existing properties overlap with it and should be left alone when it is\r\n * on: {@link HairMaterial.transmissionIntensity}, whose whole job is faking the\r\n * backlit glow that Marschner's TT path produces for real, and - on\r\n * `HairStrandMaterial` - `strandRoundness`, whose bent normal no longer reaches\r\n * the highlight, because Marschner already integrates across the fibre.\r\n */\r\n get shadingModel() {\r\n return this.featureUsed<HairShadingModel>(HairMaterial.FEATURE_SHADING_MODEL);\r\n }\r\n set shadingModel(val: HairShadingModel) {\r\n this.useFeature(HairMaterial.FEATURE_SHADING_MODEL, val);\r\n }\r\n /**\r\n * Longitudinal shift of the Marschner lobes, in sine units.\r\n *\r\n * @remarks\r\n * Hair is not a smooth cylinder: overlapping cuticle scales tilt its surface\r\n * by a few degrees toward the tip. That tilt is the only reason the three\r\n * lobes sit at different angles instead of on top of one another, so this is\r\n * what makes them read as separate highlights at all. The three shifts are\r\n * derived from it in the ratio the measurements give, R getting `-2x` and TRT\r\n * `4x`, so one dial moves the whole set consistently.\r\n *\r\n * Defaults to 0.035, roughly the measured 2 degrees.\r\n */\r\n get marschnerShift() {\r\n return this._marschnerShift;\r\n }\r\n set marschnerShift(val) {\r\n if (val !== this._marschnerShift) {\r\n this._marschnerShift = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Longitudinal roughness of the Marschner lobes, in (0, 1].\r\n *\r\n * @remarks\r\n * The angular width of the highlight bands. Per-lobe widths are derived from\r\n * it - TT half, TRT double - which is the ordering real fibres show: light\r\n * that only passes through stays tight, light that has bounced inside spreads.\r\n */\r\n get marschnerRoughness() {\r\n return this._marschnerRoughness;\r\n }\r\n set marschnerRoughness(val) {\r\n const v = val < 0.005 ? 0.005 : val > 1 ? 1 : val;\r\n if (v !== this._marschnerRoughness) {\r\n this._marschnerRoughness = v;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Refractive index of the fibre. Defaults to the measured 1.55 for keratin.\r\n *\r\n * @remarks\r\n * Sets how much light reflects at the surface rather than entering, and how\r\n * sharply it bends once inside - so it moves the balance between the white R\r\n * highlight and the two coloured paths. Rarely worth changing from the\r\n * measured value, but exposed because it is a real physical quantity.\r\n */\r\n get marschnerIOR() {\r\n return this._marschnerIOR;\r\n }\r\n set marschnerIOR(val) {\r\n const v = val < 1.01 ? 1.01 : val;\r\n if (v !== this._marschnerIOR) {\r\n this._marschnerIOR = v;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Multiplier on how far light travels through the fibre before leaving.\r\n *\r\n * @remarks\r\n * The transmitted paths are tinted by absorbing the hair's own colour over the\r\n * distance they cross, so raising this deepens the colour of TT and TRT\r\n * without touching the white surface reflection. It is the dial for \"how\r\n * strongly pigmented\", separate from which colour the pigment is.\r\n */\r\n get marschnerAbsorption() {\r\n return this._marschnerAbsorption;\r\n }\r\n set marschnerAbsorption(val) {\r\n const v = val < 0 ? 0 : val;\r\n if (v !== this._marschnerAbsorption) {\r\n this._marschnerAbsorption = v;\r\n this.uniformChanged();\r\n }\r\n }\r\n /**\r\n * Per-path intensities as `(R, TT, TRT)`, all 1 by default.\r\n *\r\n * @remarks\r\n * Art override on top of the physics, and the fastest way to see what each\r\n * path contributes: zero two of them and the third is on its own. R is the\r\n * white surface highlight, TT the backlit glow, TRT the coloured secondary.\r\n */\r\n get marschnerLobes(): Immutable<Vector3> {\r\n return this._marschnerLobes;\r\n }\r\n set marschnerLobes(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._marschnerLobes)) {\r\n this._marschnerLobes.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Occlusion map strength in [0, 1] */\r\n get occlusionStrength() {\r\n return this._occlusionStrength;\r\n }\r\n set occlusionStrength(val) {\r\n val = val < 0 ? 0 : val > 1 ? 1 : val;\r\n if (val !== this._occlusionStrength) {\r\n this._occlusionStrength = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n this.vertexShaderImpl(scope);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n if (\r\n this.needFragmentColor() &&\r\n this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT &&\r\n !(this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING)\r\n ) {\r\n scope.zHairSpec1 = pb.vec4().uniform(2);\r\n scope.zHairSpec2 = pb.vec4().uniform(2);\r\n scope.zHairShift = pb.vec4().uniform(2);\r\n scope.zHairParams = pb.vec4().uniform(2);\r\n if (this.featureUsed(HairMaterial.FEATURE_TRANSMISSION)) {\r\n scope.zHairTransmission = pb.vec4().uniform(2);\r\n }\r\n if (this.featureUsed(HairMaterial.FEATURE_SCATTER)) {\r\n scope.zHairScatter = pb.vec4().uniform(2);\r\n }\r\n if (this.shadingModel === 'marschner') {\r\n scope.zHairMarschner1 = pb.vec4().uniform(2);\r\n scope.zHairMarschner2 = pb.vec4().uniform(2);\r\n }\r\n }\r\n if (this.needFragmentColorInput()) {\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n if (this.vertexColor) {\r\n scope.albedo = pb.mul(scope.albedo, this.getVertexColor(scope));\r\n }\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.wNorm,\r\n scope.$inputs.wTangent,\r\n scope.$inputs.wBinormal\r\n );\r\n scope.$l.normal = this.calculateShadingNormal(scope, scope.normalInfo);\r\n scope.$l.strandT =\r\n this.strandDirection === 'tangent' ? scope.normalInfo.TBN[0] : scope.normalInfo.TBN[1];\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n if (this.specularShiftTexture) {\r\n scope.$l.shiftVal = pb.mul(\r\n pb.sub(this.sampleSpecularShiftTexture(scope).r, 0.5),\r\n scope.zHairShift.z\r\n );\r\n } else {\r\n scope.$l.shiftVal = pb.float(0);\r\n }\r\n scope.$l.hairAO = this.calculateHairOcclusion(scope);\r\n scope.$l.hairDirectAO = this.calculateHairDirectOcclusion(scope);\r\n scope.$l.litColor = this.hairLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normal,\r\n scope.strandT,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.shiftVal,\r\n scope.hairAO,\r\n scope.hairDirectAO,\r\n scope.normalInfo.TBN[2]\r\n );\r\n if (\r\n this.drawContext.materialFlags &\r\n (MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SCENE_STORE_NORMAL)\r\n ) {\r\n // Screen-space reflections only produce noise on thin hair strands,\r\n // so write zero reflectance to keep SSR off for hair pixels.\r\n this.outputFragmentColor(\r\n scope,\r\n scope.$inputs.worldPos,\r\n pb.vec4(scope.litColor, scope.albedo.a),\r\n pb.vec4(0, 0, 0, 1),\r\n pb.vec4(pb.add(pb.mul(scope.normal, 0.5), pb.vec3(0.5)), 1)\r\n );\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n }\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.albedo);\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) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (\r\n this.needFragmentColor(ctx) &&\r\n ctx.renderPass!.type === RENDER_PASS_TYPE_LIGHT &&\r\n !(ctx.materialFlags & MaterialVaryingFlags.INSTANCING)\r\n ) {\r\n const scratch = this._uniformScratch;\r\n bindGroup.setValue(\r\n 'zHairSpec1',\r\n scratch.setXYZW(\r\n this._specular1Color.x,\r\n this._specular1Color.y,\r\n this._specular1Color.z,\r\n this._specular1Power\r\n )\r\n );\r\n bindGroup.setValue(\r\n 'zHairSpec2',\r\n scratch.setXYZW(\r\n this._specular2Color.x,\r\n this._specular2Color.y,\r\n this._specular2Color.z,\r\n this._specular2Power\r\n )\r\n );\r\n bindGroup.setValue(\r\n 'zHairShift',\r\n scratch.setXYZW(this._specular1Shift, this._specular2Shift, this._shiftMapScale, this._diffuseWrap)\r\n );\r\n bindGroup.setValue(\r\n 'zHairParams',\r\n scratch.setXYZW(\r\n this._transmissionPower,\r\n this._occlusionStrength,\r\n this._scatterLocal,\r\n this._scatterWrap\r\n )\r\n );\r\n if (this.featureUsed(HairMaterial.FEATURE_TRANSMISSION)) {\r\n bindGroup.setValue(\r\n 'zHairTransmission',\r\n scratch.setXYZW(\r\n this._transmissionColor.x,\r\n this._transmissionColor.y,\r\n this._transmissionColor.z,\r\n this._transmissionIntensity\r\n )\r\n );\r\n }\r\n if (this.featureUsed(HairMaterial.FEATURE_SCATTER)) {\r\n bindGroup.setValue(\r\n 'zHairScatter',\r\n scratch.setXYZW(\r\n this._scatterColor.x,\r\n this._scatterColor.y,\r\n this._scatterColor.z,\r\n this._scatterIntensity\r\n )\r\n );\r\n }\r\n if (this.shadingModel === 'marschner') {\r\n bindGroup.setValue(\r\n 'zHairMarschner1',\r\n scratch.setXYZW(\r\n this._marschnerShift,\r\n this._marschnerRoughness,\r\n this._marschnerIOR,\r\n this._marschnerAbsorption\r\n )\r\n );\r\n // Normal-incidence reflectance from the index, folded here because it\r\n // does not vary per fragment. 1.55 gives roughly 0.046.\r\n const f0 = (this._marschnerIOR - 1) / (this._marschnerIOR + 1);\r\n bindGroup.setValue(\r\n 'zHairMarschner2',\r\n scratch.setXYZW(this._marschnerLobes.x, this._marschnerLobes.y, this._marschnerLobes.z, f0 * f0)\r\n );\r\n }\r\n }\r\n }\r\n protected vertexShaderImpl(scope: PBFunctionScope) {\r\n const pb = scope.$builder;\r\n scope.$l.oPos = ShaderHelper.resolveVertexPosition(scope);\r\n scope.$outputs.worldPos = pb.mul(ShaderHelper.getWorldMatrix(scope), pb.vec4(scope.oPos, 1)).xyz;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n if (this.vertexNormal) {\r\n scope.$l.oNorm = ShaderHelper.resolveVertexNormal(scope);\r\n scope.$outputs.wNorm = pb.mul(ShaderHelper.getNormalMatrix(scope), pb.vec4(scope.oNorm, 0)).xyz;\r\n if (this.vertexTangent) {\r\n scope.$l.oTangent = ShaderHelper.resolveVertexTangent(scope);\r\n scope.$outputs.wTangent = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oTangent.xyz, 0)\r\n ).xyz;\r\n scope.$outputs.wBinormal = pb.mul(\r\n pb.cross(scope.$outputs.wNorm, scope.$outputs.wTangent),\r\n scope.oTangent.w\r\n );\r\n }\r\n }\r\n }\r\n /**\r\n * Shading normal for the current fragment.\r\n *\r\n * @remarks\r\n * Split out from the interpolated frame so a subclass whose polygons stand in\r\n * for a different surface can say what that surface is. A hair card really is\r\n * the flat sheet it is drawn as, so the frame's own normal is right here;\r\n * {@link HairStrandMaterial} overrides this, because its quads stand in for\r\n * round fibres and shading them flat is the difference between hair and tape.\r\n * @internal\r\n */\r\n protected calculateShadingNormal(scope: PBInsideFunctionScope, normalInfo: PBShaderExp): PBShaderExp {\r\n return normalInfo.normal;\r\n }\r\n /**\r\n * Ambient occlusion for the current fragment.\r\n *\r\n * @remarks\r\n * Applied to the light that no shadow query answers for: environment\r\n * irradiance and the multiple-scattering term. On a dense groom this is the\r\n * only thing that keeps the strands buried inside it from receiving the full\r\n * sky, which is what gives the hairstyle its volume.\r\n *\r\n * For a hair card that is the occlusion map's job, which is what this does.\r\n * {@link HairStrandMaterial} has no texture coordinates to sample one with and\r\n * overrides this with a geometric approximation instead.\r\n * @internal\r\n */\r\n protected calculateHairOcclusion(scope: PBInsideFunctionScope): PBShaderExp {\r\n return this.sampleBaseOcclusion(scope);\r\n }\r\n /**\r\n * Occlusion applied to direct (per-light) shading.\r\n *\r\n * @remarks\r\n * Direct light already carries its own occlusion answer - the shadow map, or\r\n * under DOM a graded transmittance - so an ambient term multiplied on top\r\n * counts the same blockage twice: the map says thirty percent of the beam got\r\n * through, and the AO halves it again. That is why this is a separate hook\r\n * rather than one value for everything.\r\n *\r\n * The card path deliberately keeps the occlusion map here as well: a card\r\n * groom's map is authored as the look of the whole stack and its cards rarely\r\n * self-shadow credibly, so dimming direct light is part of what the author\r\n * painted. The strand path's geometric term makes the opposite choice and\r\n * leaves direct light to the shadow map - see\r\n * {@link HairStrandMaterial.rootOcclusion}.\r\n * @internal\r\n */\r\n protected calculateHairDirectOcclusion(scope: PBInsideFunctionScope): PBShaderExp {\r\n return this.sampleBaseOcclusion(scope);\r\n }\r\n /** The occlusion map contribution both hooks share. @internal */\r\n private sampleBaseOcclusion(scope: PBInsideFunctionScope): PBShaderExp {\r\n const pb = scope.$builder;\r\n if (this.occlusionTexture) {\r\n return pb.mix(pb.float(1), this.sampleOcclusionTexture(scope).r, scope.zHairParams.y);\r\n }\r\n return pb.float(1);\r\n }\r\n /**\r\n * Approximates the light that reaches a point after bouncing off neighbouring\r\n * fibres rather than travelling straight to it.\r\n *\r\n * @remarks\r\n * Follows the split dual scattering makes, without its precomputation - the\r\n * average forward and backward attenuations that theory derives from the fibre\r\n * BCSDF are stand-in constants here, because this material's lighting is a\r\n * phenomenological double lobe rather than a BCSDF to integrate.\r\n *\r\n * - **Global**, `throughput * wrapped(NoL)`: the beam that did cross the hair in\r\n * front, arriving spread out. Scattering randomises direction as it goes, so\r\n * the lobe is far wider than a cosine and reaches well past the terminator.\r\n * - **Local**, `1 - throughput`: the beam that did not get through. Some of it\r\n * leaves the fibres it hit and re-emerges here, which is why it is brightest\r\n * exactly where the direct light is fully blocked, and why it does not fade\r\n * with depth the way the global term does.\r\n *\r\n * Both are modulated by the hair's own colour as well as the scatter tint,\r\n * because light that has bounced several times has been filtered by keratin\r\n * several times: it is the reason pale hair glows in shadow and dark hair\r\n * stays dark, and multiplying by albedo is what carries that difference.\r\n * @internal\r\n */\r\n hairScatter(\r\n scope: PBInsideFunctionScope,\r\n lightColor: PBShaderExp,\r\n albedo: PBShaderExp,\r\n NoL: PBShaderExp,\r\n throughput: PBShaderExp,\r\n ao: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairScatter';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('lightColor'), pb.vec3('albedo'), pb.float('NoL'), pb.float('throughput'), pb.float('ao')],\r\n function () {\r\n this.$l.localMix = this.zHairParams.z;\r\n this.$l.wrap = pb.max(this.zHairParams.w, 1e-4);\r\n // Wrapped well past the terminator, and never negative: a point facing\r\n // away from the light still receives scattered light, which is the whole\r\n // point of the term.\r\n this.$l.spread = pb.clamp(pb.div(pb.add(this.NoL, this.wrap), pb.add(1, this.wrap)), 0, 1);\r\n this.$l.global = pb.mul(this.throughput, this.spread);\r\n this.$l.local = pb.sub(1, this.throughput);\r\n this.$l.amount = pb.mix(this.global, this.local, this.localMix);\r\n this.$return(\r\n pb.mul(\r\n this.lightColor,\r\n this.albedo,\r\n this.zHairScatter.rgb,\r\n this.zHairScatter.a,\r\n this.amount,\r\n this.ao\r\n )\r\n );\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](lightColor, albedo, NoL, throughput, ao) as PBShaderExp;\r\n }\r\n /**\r\n * Normalised longitudinal lobe: a unit-integral Gaussian of width `width`.\r\n *\r\n * @remarks\r\n * Stands in for the exact longitudinal term, which involves a Bessel function\r\n * and, in the energy-conserving formulation, `cosh`. The Gaussian is the\r\n * approximation Marschner's own paper offers and is what real-time\r\n * implementations use.\r\n * @internal\r\n */\r\n private hairLongitudinal(scope: PBInsideFunctionScope, width: PBShaderExp, offset: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairLongitudinal';\r\n pb.func(funcName, [pb.float('width'), pb.float('offset')], function () {\r\n this.$l.b = pb.max(this.width, 0.0001);\r\n this.$l.t = pb.div(this.offset, this.b);\r\n this.$return(pb.div(pb.exp(pb.mul(this.t, this.t, -0.5)), pb.mul(this.b, Math.sqrt(2 * Math.PI))));\r\n });\r\n return pb.getGlobalScope()[funcName](width, offset) as PBShaderExp;\r\n }\r\n /**\r\n * Marschner fibre scattering: the three paths light can take through a strand.\r\n *\r\n * @remarks\r\n * Treats the strand as a translucent dielectric cylinder and adds up what\r\n * leaves it, split by how many times the light crossed a surface:\r\n *\r\n * - **R** bounces straight off the outside. It never meets the pigment, so it\r\n * is the colour of the light - the white sheen on dark hair.\r\n * - **TT** goes in one side and out the other, crossing the pigment twice. It\r\n * leaves roughly opposite where it entered, so it is what you see when the\r\n * light is behind the head, and it carries the deepest colour.\r\n * - **TRT** goes in, reflects off the far inside wall, and comes back out. It\r\n * emerges near the side it entered, so it reads as a second highlight\r\n * alongside R - but having crossed the pigment three times it is tinted,\r\n * which is why the secondary highlight of real hair is hair-coloured. The\r\n * double lobe has to be told that; here it falls out.\r\n *\r\n * Each path is a longitudinal lobe `M` in the angle up the fibre times an\r\n * azimuthal lobe `N` in the angle around it, over `cos²θd` to convert the\r\n * fibre's scattering into a BCSDF. `M` is a Gaussian, offset per path by the\r\n * tilt of the cuticle scales - which is the entire reason the three appear at\r\n * different angles rather than on top of each other.\r\n *\r\n * `N` is where the original model is expensive: solving it exactly means\r\n * finding the roots of the exit-angle equation, a cubic for TRT. These are the\r\n * published analytic fits to those solutions, which is the standard real-time\r\n * trade - it costs the sharp caustic glint that a true root solve produces,\r\n * and keeps everything else.\r\n *\r\n * Deliberately never touches the shading normal: the fibre frame is the\r\n * tangent plus the two directions, and the round cross-section is already\r\n * integrated into `N`. That makes it immune to the flat-ribbon normal problem\r\n * that `HairStrandMaterial.strandRoundness` exists to work around.\r\n * @internal\r\n */\r\n private hairMarschner(\r\n scope: PBInsideFunctionScope,\r\n strandT: PBShaderExp,\r\n lightDir: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n shiftVal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const funcName = 'Z_hairMarschner';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('T'), pb.vec3('L'), pb.vec3('V'), pb.vec3('albedo'), pb.float('shiftVal')],\r\n function () {\r\n // Longitudinal angles, measured off the plane perpendicular to the fibre.\r\n this.$l.sinThetaL = pb.clamp(pb.dot(this.T, this.L), -1, 1);\r\n this.$l.sinThetaV = pb.clamp(pb.dot(this.T, this.V), -1, 1);\r\n // The difference angle. Every path length inside the fibre scales with\r\n // it, because a ray that enters obliquely has further to travel.\r\n this.$l.thetaD = pb.mul(pb.abs(pb.sub(pb.asin(this.sinThetaV), pb.asin(this.sinThetaL))), 0.5);\r\n // Floored well above zero because the model divides by its square at the\r\n // end. The degenerate case is real: viewing straight down a fibre that is\r\n // lit straight up it puts thetaD at ninety degrees, and while the tinted\r\n // paths kill themselves there through Beer-Lambert, R does not - Fresnel\r\n // goes to one and M sits at its peak, so a 0.001 floor lets a single tip\r\n // pointing at the camera flash at a million times the light's intensity.\r\n // 0.2 keeps the gain within the range the azimuthal fits were made for.\r\n this.$l.cosThetaD = pb.max(pb.cos(this.thetaD), 0.2);\r\n // Azimuth, from the two directions projected onto the fibre's cross\r\n // section. cos(phi) alone is enough: every N below is symmetric about\r\n // the plane through the light, so the sign of phi never matters.\r\n this.$l.Lp = pb.sub(this.L, pb.mul(this.T, this.sinThetaL));\r\n this.$l.Vp = pb.sub(this.V, pb.mul(this.T, this.sinThetaV));\r\n this.$l.cosPhi = pb.clamp(\r\n pb.mul(\r\n pb.dot(this.Lp, this.Vp),\r\n pb.inverseSqrt(pb.add(pb.mul(pb.dot(this.Lp, this.Lp), pb.dot(this.Vp, this.Vp)), 1e-5))\r\n ),\r\n -1,\r\n 1\r\n );\r\n this.$l.cosHalfPhi = pb.sqrt(pb.clamp(pb.add(pb.mul(this.cosPhi, 0.5), 0.5), 0, 1));\r\n\r\n this.$l.ior = pb.max(this.zHairMarschner1.z, 1.01);\r\n // F0 is a function of the index alone, so it is folded on the CPU.\r\n this.$l.f0 = pb.vec3(this.zHairMarschner2.w);\r\n this.$l.f90 = pb.vec3(1);\r\n // Bravais' virtual index. A ray crossing the fibre at a slant refracts as\r\n // though the material had a different index; this is that index. The\r\n // widely used `1.19/cosThetaD + 0.36*cosThetaD` is a fit to this\r\n // expression for one particular value of the index, and would ignore the\r\n // index entirely - which would quietly make an exposed IOR do nothing.\r\n // The exact form costs one sqrt and keeps the parameter meaningful.\r\n this.$l.nPrime = pb.div(\r\n pb.sqrt(\r\n pb.max(pb.add(pb.mul(this.ior, this.ior), pb.mul(this.cosThetaD, this.cosThetaD), -1), 0.01)\r\n ),\r\n this.cosThetaD\r\n );\r\n\r\n // Cuticle tilt. The ratios between the three are what the measurements\r\n // give; the shift map perturbs all three together, per strand.\r\n this.$l.shift = pb.add(this.zHairMarschner1.x, this.shiftVal);\r\n this.$l.beta = pb.max(this.zHairMarschner1.y, 0.005);\r\n this.$l.width = pb.mul(this.beta, this.beta);\r\n this.$l.theta = pb.add(this.sinThetaL, this.sinThetaV);\r\n this.$l.absorb = this.zHairMarschner1.w;\r\n // Guards pow() against a zero base, which is legal but not uniformly\r\n // well behaved across drivers.\r\n this.$l.tint = pb.max(this.albedo, pb.vec3(0.0001));\r\n\r\n // --- R: off the surface, uncoloured.\r\n this.$l.mR = that.hairLongitudinal(this, this.width, pb.sub(this.theta, pb.mul(this.shift, -2)));\r\n this.$l.nR = pb.mul(this.cosHalfPhi, 0.25);\r\n this.$l.fR = that.fresnelSchlick(\r\n this,\r\n pb.sqrt(pb.clamp(pb.add(pb.mul(pb.dot(this.V, this.L), 0.5), 0.5), 0, 1)),\r\n this.f0,\r\n this.f90\r\n );\r\n this.$l.sR = pb.mul(this.fR, this.mR, this.nR, this.zHairMarschner2.x);\r\n\r\n // --- TT: in one side, out the other. Two pigment crossings.\r\n this.$l.mTT = that.hairLongitudinal(this, pb.mul(this.width, 0.5), pb.sub(this.theta, this.shift));\r\n this.$l.a = pb.div(1, this.nPrime);\r\n // Where across the fibre the ray that reaches the eye entered. The fit\r\n // stands in for inverting the refraction, and drives both how much\r\n // reflects away and how far the rest travels through the pigment.\r\n this.$l.h = pb.clamp(\r\n pb.mul(this.cosHalfPhi, pb.add(1, pb.mul(this.a, pb.sub(0.6, pb.mul(this.cosPhi, 0.8))))),\r\n -1,\r\n 1\r\n );\r\n this.$l.fTT = that.fresnelSchlick(\r\n this,\r\n pb.mul(this.cosThetaD, pb.sqrt(pb.max(pb.sub(1, pb.mul(this.h, this.h)), 0))),\r\n this.f0,\r\n this.f90\r\n );\r\n this.$l.oneMinusFTT = pb.sub(pb.vec3(1), this.fTT);\r\n this.$l.ha = pb.mul(this.h, this.a);\r\n this.$l.pathTT = pb.div(\r\n pb.mul(pb.sqrt(pb.max(pb.sub(1, pb.mul(this.ha, this.ha)), 0)), 0.5),\r\n this.cosThetaD\r\n );\r\n this.$l.tTT = pb.pow(this.tint, pb.vec3(pb.mul(this.pathTT, this.absorb)));\r\n this.$l.nTT = pb.exp(pb.sub(pb.mul(this.cosPhi, -3.65), 3.98));\r\n this.$l.sTT = pb.mul(\r\n this.oneMinusFTT,\r\n this.oneMinusFTT,\r\n this.tTT,\r\n this.mTT,\r\n this.nTT,\r\n this.zHairMarschner2.y\r\n );\r\n\r\n // --- TRT: in, off the far wall, back out. Three pigment crossings, so\r\n // this is the lobe that carries the hair's colour into the highlight.\r\n this.$l.mTRT = that.hairLongitudinal(\r\n this,\r\n pb.mul(this.width, 2),\r\n pb.sub(this.theta, pb.mul(this.shift, 4))\r\n );\r\n this.$l.fTRT = that.fresnelSchlick(this, pb.mul(this.cosThetaD, 0.5), this.f0, this.f90);\r\n this.$l.oneMinusFTRT = pb.sub(pb.vec3(1), this.fTRT);\r\n this.$l.tTRT = pb.pow(this.tint, pb.vec3(pb.mul(pb.div(0.8, this.cosThetaD), this.absorb)));\r\n this.$l.nTRT = pb.exp(pb.sub(pb.mul(this.cosPhi, 17), 16.78));\r\n this.$l.sTRT = pb.mul(\r\n this.oneMinusFTRT,\r\n this.oneMinusFTRT,\r\n this.fTRT,\r\n this.tTRT,\r\n this.mTRT,\r\n this.nTRT,\r\n this.zHairMarschner2.z\r\n );\r\n\r\n this.$return(pb.div(pb.add(this.sR, this.sTT, this.sTRT), pb.mul(this.cosThetaD, this.cosThetaD)));\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](strandT, lightDir, viewVec, albedo, shiftVal) as PBShaderExp;\r\n }\r\n /**\r\n * Scheuermann-style anisotropic strand specular: shift the strand tangent along\r\n * the normal, then raise sin(T', H) to the lobe exponent with a directional fade.\r\n * @internal\r\n */\r\n private hairStrandSpecular(\r\n scope: PBInsideFunctionScope,\r\n strandT: PBShaderExp,\r\n normal: PBShaderExp,\r\n halfVec: PBShaderExp,\r\n shift: PBShaderExp,\r\n power: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairStrandSpecular';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('strandT'), pb.vec3('normal'), pb.vec3('halfVec'), pb.float('shift'), pb.float('power')],\r\n function () {\r\n this.$l.shiftedT = pb.normalize(pb.add(this.strandT, pb.mul(this.normal, this.shift)));\r\n this.$l.TdotH = pb.dot(this.shiftedT, this.halfVec);\r\n this.$l.sinTH = pb.sqrt(pb.max(pb.sub(1, pb.mul(this.TdotH, this.TdotH)), 0));\r\n this.$l.dirAtten = pb.smoothStep(-1, 0, this.TdotH);\r\n this.$return(pb.mul(this.dirAtten, pb.pow(pb.max(this.sinTH, 0.0001), this.power)));\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](strandT, normal, halfVec, shift, power) as PBShaderExp;\r\n }\r\n /**\r\n * Computes the lit color for hair with wrap diffuse, double-lobe anisotropic\r\n * specular and optional transmission.\r\n * @internal\r\n */\r\n /**\r\n * @param ao - Ambient occlusion, applied to environment irradiance and the\r\n * scatter term - the light no shadow query answers for.\r\n * @param aoDirect - Occlusion applied to per-light shading, whose direct\r\n * blockage the shadow map already accounts for. See\r\n * {@link HairMaterial.calculateHairDirectOcclusion}.\r\n * @param geometricNormal - Interpolated vertex normal, used for shadow normal\r\n * offset bias. Defaults to `normal`.\r\n */\r\n hairLight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n strandT: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n shiftVal: PBShaderExp,\r\n ao: PBShaderExp,\r\n aoDirect: PBShaderExp,\r\n geometricNormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_hairLight';\r\n const that = this;\r\n const baseLightPass = !that.drawContext.lightBlending;\r\n const useTransmission = that.featureUsed<boolean>(HairMaterial.FEATURE_TRANSMISSION);\r\n const useScatter = that.featureUsed<boolean>(HairMaterial.FEATURE_SCATTER);\r\n const useMarschner = that.shadingModel === 'marschner';\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec3('worldPos'),\r\n pb.vec3('normal'),\r\n pb.vec3('strandT'),\r\n pb.vec3('viewVec'),\r\n pb.vec4('albedo'),\r\n pb.float('shiftVal'),\r\n pb.float('ao'),\r\n pb.float('aoDirect'),\r\n pb.vec3('geometricNormal')\r\n ],\r\n function () {\r\n if (!that.needFragmentColor()) {\r\n this.$return(this.albedo.rgb);\r\n } else {\r\n if (that.needCalculateEnvLight() && baseLightPass) {\r\n this.$l.diffuseColor = pb.mul(that.getEnvLightIrradiance(this, this.normal), this.ao);\r\n } else {\r\n this.$l.diffuseColor = pb.vec3(0);\r\n }\r\n this.$l.specularColor = pb.vec3(0);\r\n this.$l.transmissionColor = pb.vec3(0);\r\n this.$l.scatterColor = pb.vec3(0);\r\n that.forEachLight(this, function (type, posRange, dirCutoff, colorIntensity, extra, shadow) {\r\n this.$l.diffuseScale = pb.float(1);\r\n this.$l.specularScale = pb.float(1);\r\n this.$if(pb.equal(type, LIGHT_TYPE_POINT), function () {\r\n this.diffuseScale = extra.x;\r\n this.specularScale = extra.y;\r\n });\r\n this.$l.lightAtten = that.calculateLightAttenuation(\r\n this,\r\n type,\r\n this.worldPos,\r\n posRange,\r\n dirCutoff,\r\n extra\r\n );\r\n this.$l.lightDir = that.calculateLightDirection(\r\n this,\r\n type,\r\n this.worldPos,\r\n posRange,\r\n dirCutoff,\r\n extra\r\n );\r\n this.$l.NoL = pb.dot(this.normal, this.lightDir);\r\n this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten);\r\n // Wrap diffuse softens the terminator across thin cards.\r\n this.$l.wrap = this.zHairShift.w;\r\n this.$l.diffFactor = pb.clamp(pb.div(pb.add(this.NoL, this.wrap), pb.add(1, this.wrap)), 0, 1);\r\n if (useMarschner) {\r\n // No half vector and no specular fade here. The fade exists to stop\r\n // the double lobe glowing where no light reaches; Marschner's TT\r\n // path is light that genuinely came through the fibre from behind,\r\n // so fading it out on the unlit side would delete the one thing the\r\n // model offers that the double lobe cannot produce at all.\r\n this.$l.specTerm = that.hairMarschner(\r\n this,\r\n this.strandT,\r\n this.lightDir,\r\n this.viewVec,\r\n this.albedo.rgb,\r\n this.shiftVal\r\n );\r\n } else {\r\n this.$l.halfVec = pb.normalize(pb.add(this.viewVec, this.lightDir));\r\n this.$l.spec1 = that.hairStrandSpecular(\r\n this,\r\n this.strandT,\r\n this.normal,\r\n this.halfVec,\r\n pb.add(this.zHairShift.x, this.shiftVal),\r\n this.zHairSpec1.w\r\n );\r\n this.$l.spec2 = that.hairStrandSpecular(\r\n this,\r\n this.strandT,\r\n this.normal,\r\n this.halfVec,\r\n pb.add(this.zHairShift.y, this.shiftVal),\r\n this.zHairSpec2.w\r\n );\r\n // Fade specular out on the fully unlit side to avoid glowing shadows.\r\n this.$l.specFade = pb.smoothStep(-0.35, 0.15, this.NoL);\r\n this.$l.specTerm = pb.mul(\r\n pb.add(\r\n pb.mul(this.zHairSpec1.rgb, this.spec1),\r\n pb.mul(this.zHairSpec2.rgb, this.albedo.rgb, this.spec2)\r\n ),\r\n this.specFade\r\n );\r\n }\r\n this.$l.diffuse = pb.mul(\r\n this.lightColor,\r\n 1 / Math.PI,\r\n this.diffFactor,\r\n this.aoDirect,\r\n this.diffuseScale\r\n );\r\n this.$l.specular = pb.mul(this.lightColor, this.specTerm, this.aoDirect, this.specularScale);\r\n if (useTransmission) {\r\n this.$l.transDir = pb.normalize(pb.add(this.lightDir, pb.mul(this.normal, 0.3)));\r\n this.$l.VoL = pb.clamp(pb.dot(this.viewVec, pb.neg(this.transDir)), 0, 1);\r\n this.$l.transFactor = pb.mul(pb.pow(this.VoL, this.zHairParams.x), this.zHairTransmission.a);\r\n this.$l.transmission = pb.mul(\r\n this.lightColor,\r\n this.zHairTransmission.rgb,\r\n this.transFactor,\r\n this.aoDirect\r\n );\r\n } else {\r\n this.$l.transmission = pb.vec3(0);\r\n }\r\n // Fraction of the beam that reached this point without being absorbed.\r\n // Under a deep opacity map this grades with how much hair the light\r\n // crossed, which is exactly what the scattering terms want; under a\r\n // binary filter it is one or zero and they degrade to following it.\r\n this.$l.throughput = pb.float(1);\r\n if (shadow) {\r\n this.$l.shadow = that.calculateShadow(\r\n this,\r\n this.worldPos,\r\n this.geometricNormal,\r\n pb.max(this.NoL, 0)\r\n );\r\n this.throughput = this.shadow;\r\n this.diffuse = pb.mul(this.diffuse, this.shadow);\r\n this.specular = pb.mul(this.specular, this.shadow);\r\n this.transmission = pb.mul(this.transmission, this.shadow);\r\n }\r\n if (useScatter) {\r\n this.scatterColor = pb.add(\r\n this.scatterColor,\r\n that.hairScatter(this, this.lightColor, this.albedo.rgb, this.NoL, this.throughput, this.ao)\r\n );\r\n }\r\n this.diffuseColor = pb.add(this.diffuseColor, this.diffuse);\r\n this.specularColor = pb.add(this.specularColor, this.specular);\r\n this.transmissionColor = pb.add(this.transmissionColor, this.transmission);\r\n });\r\n this.$return(\r\n pb.add(\r\n pb.mul(this.albedo.rgb, this.diffuseColor),\r\n this.specularColor,\r\n this.transmissionColor,\r\n this.scatterColor\r\n )\r\n );\r\n }\r\n }\r\n );\r\n return pb\r\n .getGlobalScope()\r\n [\r\n funcName\r\n ](worldPos, normal, strandT, viewVec, albedo, shiftVal, ao, aoDirect, geometricNormal ?? normal) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["HairMaterial","applyMaterialMixins","MeshMaterial","mixinLight","mixinPBRBRDF","mixinVertexColor","mixinTextureProps","FEATURE_VERTEX_NORMAL","defineFeature","FEATURE_VERTEX_TANGENT","FEATURE_STRAND_DIRECTION","FEATURE_TRANSMISSION","FEATURE_SCATTER","FEATURE_SHADING_MODEL","_specular1Color","Vector3","_specular1Power","_specular1Shift","_specular2Color","_specular2Power","_specular2Shift","_shiftMapScale","_diffuseWrap","_transmissionColor","_transmissionIntensity","_transmissionPower","_occlusionStrength","_marschnerShift","_marschnerRoughness","_marschnerIOR","_marschnerAbsorption","_marschnerLobes","_scatterColor","_scatterIntensity","_scatterLocal","_scatterWrap","_uniformScratch","Vector4","useFeature","cullMode","clone","other","copyFrom","specular1Color","specular1Power","specular1Shift","specular2Color","specular2Power","specular2Shift","shiftMapScale","diffuseWrap","transmissionColor","transmissionIntensity","transmissionPower","occlusionStrength","scatterColor","scatterIntensity","scatterLocal","scatterWrap","shadingModel","marschnerShift","marschnerRoughness","marschnerIOR","marschnerAbsorption","marschnerLobes","vertexNormal","featureUsed","val","vertexTangent","strandDirection","equalsTo","set","uniformChanged","v","vertexShader","scope","vertexShaderImpl","fragmentShader","pb","$builder","needFragmentColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","materialFlags","MaterialVaryingFlags","INSTANCING","zHairSpec1","vec4","uniform","zHairSpec2","zHairShift","zHairParams","zHairTransmission","zHairScatter","zHairMarschner1","zHairMarschner2","needFragmentColorInput","$l","albedo","calculateAlbedoColor","vertexColor","mul","getVertexColor","normalInfo","calculateNormalAndTBN","$inputs","worldPos","wNorm","wTangent","wBinormal","normal","calculateShadingNormal","strandT","TBN","viewVec","calculateViewVector","specularShiftTexture","shiftVal","sub","sampleSpecularShiftTexture","r","z","float","hairAO","calculateHairOcclusion","hairDirectAO","calculateHairDirectOcclusion","litColor","hairLight","SCENE_STORE_ROUGHNESS","SCENE_STORE_NORMAL","outputFragmentColor","a","add","vec3","applyUniformValues","bindGroup","ctx","pass","scratch","setValue","setXYZW","x","y","f0","oPos","ShaderHelper","resolveVertexPosition","$outputs","getWorldMatrix","xyz","setClipSpacePosition","getViewProjectionMatrix","oNorm","resolveVertexNormal","getNormalMatrix","oTangent","resolveVertexTangent","cross","w","sampleBaseOcclusion","occlusionTexture","mix","sampleOcclusionTexture","hairScatter","lightColor","NoL","throughput","ao","funcName","func","localMix","wrap","max","spread","clamp","div","global","local","amount","$return","rgb","getGlobalScope","width","offset","b","t","exp","Math","sqrt","PI","hairMarschner","lightDir","that","sinThetaL","dot","T","L","sinThetaV","V","thetaD","abs","asin","cosThetaD","cos","Lp","Vp","cosPhi","inverseSqrt","cosHalfPhi","ior","f90","nPrime","shift","beta","theta","absorb","tint","mR","hairLongitudinal","nR","fR","fresnelSchlick","sR","mTT","h","fTT","oneMinusFTT","ha","pathTT","tTT","pow","nTT","sTT","mTRT","fTRT","oneMinusFTRT","tTRT","nTRT","sTRT","hairStrandSpecular","halfVec","power","shiftedT","normalize","TdotH","sinTH","dirAtten","smoothStep","aoDirect","geometricNormal","baseLightPass","lightBlending","useTransmission","useScatter","useMarschner","needCalculateEnvLight","diffuseColor","getEnvLightIrradiance","specularColor","forEachLight","posRange","dirCutoff","colorIntensity","extra","shadow","diffuseScale","specularScale","$if","equal","LIGHT_TYPE_POINT","lightAtten","calculateLightAttenuation","calculateLightDirection","diffFactor","specTerm","spec1","spec2","specFade","diffuse","specular","transDir","VoL","neg","transFactor","transmission","calculateShadow"],"mappings":"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"}
@@ -19,6 +19,9 @@ import { RENDER_PASS_TYPE_LIGHT, MaterialVaryingFlags } from '../values.js';
19
19
  other.copyFrom(this);
20
20
  return other;
21
21
  }
22
+ supportsVoxelization() {
23
+ return true;
24
+ }
22
25
  /** true if vertex normal attribute presents */ get vertexNormal() {
23
26
  return this.featureUsed(LambertMaterial.FEATURE_VERTEX_NORMAL);
24
27
  }
@@ -67,7 +70,7 @@ import { RENDER_PASS_TYPE_LIGHT, MaterialVaryingFlags } from '../values.js';
67
70
  }
68
71
  this.forEachLight(scope, function(type, posRange, dirCutoff, colorIntensity, extra, shadow) {
69
72
  this.$l.lightAtten = that.calculateLightAttenuation(this, type, scope.$inputs.worldPos, posRange, dirCutoff, extra);
70
- this.$l.lightDir = that.calculateLightDirection(this, type, scope.$inputs.worldPos, posRange, dirCutoff);
73
+ this.$l.lightDir = that.calculateLightDirection(this, type, scope.$inputs.worldPos, posRange, dirCutoff, extra);
71
74
  this.$l.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);
72
75
  this.$l.lightContrib = pb.mul(colorIntensity.rgb, colorIntensity.a, this.NoL, this.lightAtten, 1 / Math.PI);
73
76
  if (shadow) {
@@ -1 +1 @@
1
- {"version":3,"file":"lambert.js","sources":["../../src/material/lambert.ts"],"sourcesContent":["import { mixinLight } from './mixins/lit';\r\nimport { mixinVertexColor } from './mixins/vertexcolor';\r\nimport { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport type { PBFunctionScope } from '@zephyr3d/device';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport { MaterialVaryingFlags, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Clonable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Lambert material\r\n * @public\r\n */\r\nexport class LambertMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinLight, mixinVertexColor)\r\n implements Clonable<LambertMaterial>\r\n{\r\n private static readonly FEATURE_VERTEX_NORMAL = this.defineFeature();\r\n private static readonly FEATURE_VERTEX_TANGENT = this.defineFeature();\r\n constructor() {\r\n super();\r\n this.useFeature(LambertMaterial.FEATURE_VERTEX_NORMAL, true);\r\n }\r\n clone() {\r\n const other = new LambertMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /** true if vertex normal attribute presents */\r\n get vertexNormal() {\r\n return this.featureUsed<boolean>(LambertMaterial.FEATURE_VERTEX_NORMAL);\r\n }\r\n set vertexNormal(val) {\r\n this.useFeature(LambertMaterial.FEATURE_VERTEX_NORMAL, !!val);\r\n }\r\n /** true if vertex normal attribute presents */\r\n get vertexTangent() {\r\n return this.featureUsed<boolean>(LambertMaterial.FEATURE_VERTEX_TANGENT);\r\n }\r\n set vertexTangent(val) {\r\n this.useFeature(LambertMaterial.FEATURE_VERTEX_TANGENT, !!val);\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$l.oPos = ShaderHelper.resolveVertexPosition(scope);\r\n scope.$outputs.worldPos = pb.mul(ShaderHelper.getWorldMatrix(scope), pb.vec4(scope.oPos, 1)).xyz;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n if (this.vertexNormal) {\r\n scope.$l.oNorm = ShaderHelper.resolveVertexNormal(scope);\r\n scope.$outputs.wNorm = pb.mul(ShaderHelper.getNormalMatrix(scope), pb.vec4(scope.oNorm, 0)).xyz;\r\n if (this.vertexTangent) {\r\n scope.$l.oTangent = ShaderHelper.resolveVertexTangent(scope);\r\n scope.$outputs.wTangent = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oTangent.xyz, 0)\r\n ).xyz;\r\n scope.$outputs.wBinormal = pb.mul(\r\n pb.cross(scope.$outputs.wNorm, scope.$outputs.wTangent),\r\n scope.oTangent.w\r\n );\r\n }\r\n }\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.needFragmentColorInput()) {\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n if (this.vertexColor) {\r\n scope.albedo = pb.mul(scope.albedo, this.getVertexColor(scope));\r\n }\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.color = pb.vec3(0);\r\n // TBN[2] is the pre-normal-map geometric normal, needed for shadow\r\n // normal offset bias.\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.wNorm,\r\n scope.$inputs.wTangent,\r\n scope.$inputs.wBinormal\r\n );\r\n scope.$l.normal = scope.normalInfo.normal;\r\n if (this.needCalculateEnvLight()) {\r\n scope.color = pb.add(scope.color, this.getEnvLightIrradiance(scope, scope.normal));\r\n }\r\n this.forEachLight(scope, function (type, posRange, dirCutoff, colorIntensity, extra, shadow) {\r\n this.$l.lightAtten = that.calculateLightAttenuation(\r\n this,\r\n type,\r\n scope.$inputs.worldPos,\r\n posRange,\r\n dirCutoff,\r\n extra\r\n );\r\n this.$l.lightDir = that.calculateLightDirection(\r\n this,\r\n type,\r\n scope.$inputs.worldPos,\r\n posRange,\r\n dirCutoff\r\n );\r\n this.$l.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);\r\n this.$l.lightContrib = pb.mul(\r\n colorIntensity.rgb,\r\n colorIntensity.a,\r\n this.NoL,\r\n this.lightAtten,\r\n 1 / Math.PI\r\n );\r\n if (shadow) {\r\n this.$l.shadow = pb.vec3(\r\n that.calculateShadow(this, scope.$inputs.worldPos, scope.normalInfo.TBN[2], this.NoL)\r\n );\r\n this.lightContrib = pb.mul(this.lightContrib, this.shadow);\r\n }\r\n this.color = pb.add(this.color, this.lightContrib);\r\n });\r\n scope.$l.litColor = pb.mul(scope.albedo, pb.vec4(scope.color, 1));\r\n if (\r\n this.drawContext.materialFlags &\r\n (MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SCENE_STORE_NORMAL)\r\n ) {\r\n this.outputFragmentColor(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.litColor,\r\n pb.vec4(0, 0, 0, 1),\r\n pb.vec4(pb.add(pb.mul(scope.normal, 0.5), pb.vec3(0.5)), 1)\r\n );\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.litColor);\r\n }\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.albedo);\r\n }\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n}\r\n"],"names":["LambertMaterial","applyMaterialMixins","MeshMaterial","mixinLight","mixinVertexColor","FEATURE_VERTEX_NORMAL","defineFeature","FEATURE_VERTEX_TANGENT","useFeature","clone","other","copyFrom","vertexNormal","featureUsed","val","vertexTangent","vertexShader","scope","pb","$builder","$l","oPos","ShaderHelper","resolveVertexPosition","$outputs","worldPos","mul","getWorldMatrix","vec4","xyz","setClipSpacePosition","getViewProjectionMatrix","oNorm","resolveVertexNormal","wNorm","getNormalMatrix","oTangent","resolveVertexTangent","wTangent","wBinormal","cross","w","fragmentShader","that","needFragmentColorInput","albedo","calculateAlbedoColor","vertexColor","getVertexColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","color","vec3","normalInfo","calculateNormalAndTBN","$inputs","normal","needCalculateEnvLight","add","getEnvLightIrradiance","forEachLight","posRange","dirCutoff","colorIntensity","extra","shadow","lightAtten","calculateLightAttenuation","lightDir","calculateLightDirection","NoL","clamp","dot","lightContrib","rgb","a","Math","PI","calculateShadow","TBN","litColor","materialFlags","MaterialVaryingFlags","SCENE_STORE_ROUGHNESS","SCENE_STORE_NORMAL","outputFragmentColor"],"mappings":"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"}
1
+ {"version":3,"file":"lambert.js","sources":["../../src/material/lambert.ts"],"sourcesContent":["import { mixinLight } from './mixins/lit';\r\nimport { mixinVertexColor } from './mixins/vertexcolor';\r\nimport { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport type { PBFunctionScope } from '@zephyr3d/device';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport { MaterialVaryingFlags, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Clonable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Lambert material\r\n * @public\r\n */\r\nexport class LambertMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinLight, mixinVertexColor)\r\n implements Clonable<LambertMaterial>\r\n{\r\n private static readonly FEATURE_VERTEX_NORMAL = this.defineFeature();\r\n private static readonly FEATURE_VERTEX_TANGENT = this.defineFeature();\r\n constructor() {\r\n super();\r\n this.useFeature(LambertMaterial.FEATURE_VERTEX_NORMAL, true);\r\n }\r\n clone() {\r\n const other = new LambertMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n supportsVoxelization() {\r\n return true;\r\n }\r\n /** true if vertex normal attribute presents */\r\n get vertexNormal() {\r\n return this.featureUsed<boolean>(LambertMaterial.FEATURE_VERTEX_NORMAL);\r\n }\r\n set vertexNormal(val) {\r\n this.useFeature(LambertMaterial.FEATURE_VERTEX_NORMAL, !!val);\r\n }\r\n /** true if vertex normal attribute presents */\r\n get vertexTangent() {\r\n return this.featureUsed<boolean>(LambertMaterial.FEATURE_VERTEX_TANGENT);\r\n }\r\n set vertexTangent(val) {\r\n this.useFeature(LambertMaterial.FEATURE_VERTEX_TANGENT, !!val);\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$l.oPos = ShaderHelper.resolveVertexPosition(scope);\r\n scope.$outputs.worldPos = pb.mul(ShaderHelper.getWorldMatrix(scope), pb.vec4(scope.oPos, 1)).xyz;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n if (this.vertexNormal) {\r\n scope.$l.oNorm = ShaderHelper.resolveVertexNormal(scope);\r\n scope.$outputs.wNorm = pb.mul(ShaderHelper.getNormalMatrix(scope), pb.vec4(scope.oNorm, 0)).xyz;\r\n if (this.vertexTangent) {\r\n scope.$l.oTangent = ShaderHelper.resolveVertexTangent(scope);\r\n scope.$outputs.wTangent = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oTangent.xyz, 0)\r\n ).xyz;\r\n scope.$outputs.wBinormal = pb.mul(\r\n pb.cross(scope.$outputs.wNorm, scope.$outputs.wTangent),\r\n scope.oTangent.w\r\n );\r\n }\r\n }\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.needFragmentColorInput()) {\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n if (this.vertexColor) {\r\n scope.albedo = pb.mul(scope.albedo, this.getVertexColor(scope));\r\n }\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.color = pb.vec3(0);\r\n // TBN[2] is the pre-normal-map geometric normal, needed for shadow\r\n // normal offset bias.\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.wNorm,\r\n scope.$inputs.wTangent,\r\n scope.$inputs.wBinormal\r\n );\r\n scope.$l.normal = scope.normalInfo.normal;\r\n if (this.needCalculateEnvLight()) {\r\n scope.color = pb.add(scope.color, this.getEnvLightIrradiance(scope, scope.normal));\r\n }\r\n this.forEachLight(scope, function (type, posRange, dirCutoff, colorIntensity, extra, shadow) {\r\n this.$l.lightAtten = that.calculateLightAttenuation(\r\n this,\r\n type,\r\n scope.$inputs.worldPos,\r\n posRange,\r\n dirCutoff,\r\n extra\r\n );\r\n this.$l.lightDir = that.calculateLightDirection(\r\n this,\r\n type,\r\n scope.$inputs.worldPos,\r\n posRange,\r\n dirCutoff,\r\n extra\r\n );\r\n this.$l.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);\r\n this.$l.lightContrib = pb.mul(\r\n colorIntensity.rgb,\r\n colorIntensity.a,\r\n this.NoL,\r\n this.lightAtten,\r\n 1 / Math.PI\r\n );\r\n if (shadow) {\r\n this.$l.shadow = pb.vec3(\r\n that.calculateShadow(this, scope.$inputs.worldPos, scope.normalInfo.TBN[2], this.NoL)\r\n );\r\n this.lightContrib = pb.mul(this.lightContrib, this.shadow);\r\n }\r\n this.color = pb.add(this.color, this.lightContrib);\r\n });\r\n scope.$l.litColor = pb.mul(scope.albedo, pb.vec4(scope.color, 1));\r\n if (\r\n this.drawContext.materialFlags &\r\n (MaterialVaryingFlags.SCENE_STORE_ROUGHNESS | MaterialVaryingFlags.SCENE_STORE_NORMAL)\r\n ) {\r\n this.outputFragmentColor(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.litColor,\r\n pb.vec4(0, 0, 0, 1),\r\n pb.vec4(pb.add(pb.mul(scope.normal, 0.5), pb.vec3(0.5)), 1)\r\n );\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.litColor);\r\n }\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.albedo);\r\n }\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n}\r\n"],"names":["LambertMaterial","applyMaterialMixins","MeshMaterial","mixinLight","mixinVertexColor","FEATURE_VERTEX_NORMAL","defineFeature","FEATURE_VERTEX_TANGENT","useFeature","clone","other","copyFrom","supportsVoxelization","vertexNormal","featureUsed","val","vertexTangent","vertexShader","scope","pb","$builder","$l","oPos","ShaderHelper","resolveVertexPosition","$outputs","worldPos","mul","getWorldMatrix","vec4","xyz","setClipSpacePosition","getViewProjectionMatrix","oNorm","resolveVertexNormal","wNorm","getNormalMatrix","oTangent","resolveVertexTangent","wTangent","wBinormal","cross","w","fragmentShader","that","needFragmentColorInput","albedo","calculateAlbedoColor","vertexColor","getVertexColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","color","vec3","normalInfo","calculateNormalAndTBN","$inputs","normal","needCalculateEnvLight","add","getEnvLightIrradiance","forEachLight","posRange","dirCutoff","colorIntensity","extra","shadow","lightAtten","calculateLightAttenuation","lightDir","calculateLightDirection","NoL","clamp","dot","lightContrib","rgb","a","Math","PI","calculateShadow","TBN","litColor","materialFlags","MaterialVaryingFlags","SCENE_STORE_ROUGHNESS","SCENE_STORE_NORMAL","outputFragmentColor"],"mappings":"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"}