@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":"eye.js","sources":["../../src/material/eye.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport type { Clonable, Immutable } from '@zephyr3d/base';\r\nimport { Quaternion, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport { mixinLight } from './mixins/lit';\r\nimport { mixinPBRBRDF } from './mixins/pbr/brdf';\r\nimport { mixinTextureProps } from './mixins/texture';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport { SSR_interleavedGradientNoise } from '../shaders/ssr';\r\nimport type { DrawContext } from '../render';\r\nimport { LIGHT_TYPE_POINT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\n\r\n/** Taps in the contact-occlusion disc. 16 rather than 8: close-ups need the density. */\r\nconst CONTACT_AO_SAMPLES = 16;\r\n/**\r\n * Cap on the on-screen radius of the contact-occlusion disc, in pixels.\r\n * Keeps the sample density usable in close-up, where the projected radius\r\n * would otherwise reach hundreds of pixels and read as grain.\r\n */\r\nconst CONTACT_AO_MAX_PIXEL_RADIUS = 48;\r\n/** Golden angle, in radians. Spreads the disc taps without any table. */\r\nconst GOLDEN_ANGLE = 2.399963229728653;\r\n\r\n/**\r\n * Realtime eye material for realistic and semi-realistic characters.\r\n *\r\n * @remarks\r\n * Shades the whole eyeball - sclera, limbus and iris - from a single mesh and a\r\n * single material. There is no separate cornea layer: the corneal bulge is\r\n * simulated by refracting the view ray and offsetting the iris lookup, so no\r\n * transparent second surface, OIT or depth sorting is involved.\r\n *\r\n * The refraction works in tangent space (per-fragment TBN) rather than object\r\n * space, because the shader cannot reconstruct a fixed object-space gaze axis\r\n * after skinning. The residual error over the sphere's curvature is small at\r\n * the depths an iris actually sits.\r\n *\r\n * Regions are derived analytically from the UV distance to the iris centre, so\r\n * no mask texture is required - which is why the asset must place the iris at a\r\n * known UV location; see {@link EyeMaterial.irisCenter}.\r\n *\r\n * Expected asset setup:\r\n * - A single eyeball mesh (sphere or front dome) carrying normals *and*\r\n * tangents; without tangents there is no TBN and refraction degrades to a\r\n * flat iris.\r\n * - UVs that place the pupil centre at {@link EyeMaterial.irisCenter}, with the\r\n * iris occupying a disc of {@link EyeMaterial.irisRadius} around it.\r\n * - An iris texture with the pupil at its centre. The sclera texture is\r\n * optional; without one the sclera is shaded from {@link EyeMaterial.scleraColor}.\r\n *\r\n * @public\r\n */\r\nexport class EyeMaterial\r\n extends applyMaterialMixins(\r\n MeshMaterial,\r\n mixinLight,\r\n mixinPBRBRDF,\r\n mixinTextureProps('iris'),\r\n mixinTextureProps('sclera')\r\n )\r\n implements Clonable<EyeMaterial>\r\n{\r\n private static readonly FEATURE_VERTEX_NORMAL = this.defineFeature();\r\n private static readonly FEATURE_VERTEX_TANGENT = this.defineFeature();\r\n private static readonly FEATURE_SOCKET_OCCLUSION = this.defineFeature();\r\n private static readonly FEATURE_CONTACT_AO = this.defineFeature();\r\n private static readonly FEATURE_CONTACT_AO_JITTER = this.defineFeature();\r\n\r\n private readonly _irisCenter: Vector4;\r\n private _irisRadius: number;\r\n private _irisDepth: number;\r\n private _ior: number;\r\n private _pupilRadius: number;\r\n private _pupilDilation: number;\r\n private readonly _irisColor: Vector4;\r\n private _irisBrightness: number;\r\n private _limbalRingWidth: number;\r\n private _limbalRingStrength: number;\r\n private readonly _scleraColor: Vector4;\r\n private _scleraWrap: number;\r\n private readonly _scleraEdgeTint: Vector4;\r\n private _corneaSpecularStrength: number;\r\n private _corneaRoughness: number;\r\n private readonly _socketRotation: Vector4;\r\n private _upperLidAngle: number;\r\n private _lowerLidAngle: number;\r\n private _socketOcclusionSoftness: number;\r\n private _socketOcclusionStrength: number;\r\n private _contactAORadius: number;\r\n private _contactAOMinDistance: number;\r\n private _contactAOMaxDistance: number;\r\n private _contactAOStrength: number;\r\n // Derived from _socketRotation; never serialized or exposed.\r\n private readonly _socketUp: Vector4;\r\n private readonly _socketForward: Vector4;\r\n private readonly _socketCos: Vector4;\r\n // Derived from the contact AO distances; never serialized or exposed.\r\n private readonly _contactAORange: Vector4;\r\n\r\n constructor() {\r\n super();\r\n this._irisCenter = new Vector4(0.5, 0.5, 0, 0);\r\n this._irisRadius = 0.22;\r\n this._irisDepth = 0.06;\r\n this._ior = 1.376;\r\n this._pupilRadius = 0.35;\r\n this._pupilDilation = 0;\r\n this._irisColor = new Vector4(1, 1, 1, 1);\r\n this._irisBrightness = 0.15;\r\n this._limbalRingWidth = 0.15;\r\n this._limbalRingStrength = 0.7;\r\n this._scleraColor = new Vector4(0.9, 0.88, 0.86, 1);\r\n this._scleraWrap = 0.35;\r\n this._scleraEdgeTint = new Vector4(0.55, 0.22, 0.18, 1);\r\n this._corneaSpecularStrength = 1;\r\n this._corneaRoughness = 0.05;\r\n this._socketRotation = new Vector4(0, 0, 0, 0);\r\n this._upperLidAngle = 50;\r\n this._lowerLidAngle = 65;\r\n this._socketOcclusionSoftness = 15;\r\n this._socketOcclusionStrength = 0.65;\r\n // Metric defaults for a ~12mm-radius eyeball in a one-unit-per-metre\r\n // scene. Assets authored at a different world scale must scale all three.\r\n this._contactAORadius = 0.006;\r\n this._contactAOMinDistance = 0.0004;\r\n this._contactAOMaxDistance = 0.006;\r\n this._contactAOStrength = 0.7;\r\n this._socketUp = new Vector4(0, 1, 0, 0);\r\n this._socketForward = new Vector4(0, 0, 1, 0);\r\n this._socketCos = new Vector4();\r\n this._contactAORange = new Vector4();\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_NORMAL, true);\r\n // Initialised explicitly: featureUsed() returns undefined for a feature\r\n // never touched, which would disagree with the serialization descriptor's\r\n // declared default and silently change assets on load.\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_TANGENT, false);\r\n this.useFeature(EyeMaterial.FEATURE_SOCKET_OCCLUSION, false);\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO, false);\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO_JITTER, false);\r\n }\r\n\r\n clone() {\r\n const other = new EyeMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.vertexNormal = other.vertexNormal;\r\n this.vertexTangent = other.vertexTangent;\r\n this.irisCenter = other.irisCenter;\r\n this.irisRadius = other.irisRadius;\r\n this.irisDepth = other.irisDepth;\r\n this.ior = other.ior;\r\n this.pupilRadius = other.pupilRadius;\r\n this.pupilDilation = other.pupilDilation;\r\n this.irisColor = other.irisColor;\r\n this.irisBrightness = other.irisBrightness;\r\n this.limbalRingWidth = other.limbalRingWidth;\r\n this.limbalRingStrength = other.limbalRingStrength;\r\n this.scleraColor = other.scleraColor;\r\n this.scleraWrap = other.scleraWrap;\r\n this.scleraEdgeTint = other.scleraEdgeTint;\r\n this.corneaSpecularStrength = other.corneaSpecularStrength;\r\n this.corneaRoughness = other.corneaRoughness;\r\n this.socketOcclusion = other.socketOcclusion;\r\n this.socketRotation = other.socketRotation;\r\n this.upperLidAngle = other.upperLidAngle;\r\n this.lowerLidAngle = other.lowerLidAngle;\r\n this.socketOcclusionSoftness = other.socketOcclusionSoftness;\r\n this.socketOcclusionStrength = other.socketOcclusionStrength;\r\n this.contactAO = other.contactAO;\r\n this.contactAORadius = other.contactAORadius;\r\n this.contactAOMinDistance = other.contactAOMinDistance;\r\n this.contactAOMaxDistance = other.contactAOMaxDistance;\r\n this.contactAOStrength = other.contactAOStrength;\r\n this.contactAOTemporalJitter = other.contactAOTemporalJitter;\r\n }\r\n\r\n /** true if vertex normal attribute presents */\r\n get vertexNormal() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_VERTEX_NORMAL);\r\n }\r\n set vertexNormal(val) {\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_NORMAL, !!val);\r\n }\r\n\r\n /**\r\n * true if vertex tangent attribute presents. Refraction needs a tangent\r\n * frame; without one the iris renders flat, with no parallax.\r\n */\r\n get vertexTangent() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_VERTEX_TANGENT);\r\n }\r\n set vertexTangent(val) {\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_TANGENT, !!val);\r\n }\r\n\r\n /** UV coordinate of the pupil centre. Only xy is used. */\r\n get irisCenter(): Immutable<Vector4> {\r\n return this._irisCenter;\r\n }\r\n set irisCenter(val: Immutable<Vector4>) {\r\n if (val && !this._irisCenter.equalsTo(val)) {\r\n this._irisCenter.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Iris disc radius, in UV units. */\r\n get irisRadius() {\r\n return this._irisRadius;\r\n }\r\n set irisRadius(val) {\r\n const next = Math.max(0.001, val ?? 0.001);\r\n if (next !== this._irisRadius) {\r\n this._irisRadius = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Depth of the iris plane below the corneal surface, in UV units - the\r\n * parallax strength. 0 is flat; 0.05-0.08 reads as a real anterior chamber.\r\n */\r\n get irisDepth() {\r\n return this._irisDepth;\r\n }\r\n set irisDepth(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._irisDepth) {\r\n this._irisDepth = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Index of refraction of the cornea. 1.376 is the physical value. */\r\n get ior() {\r\n return this._ior;\r\n }\r\n set ior(val) {\r\n const next = Math.max(1, val ?? 1);\r\n if (next !== this._ior) {\r\n this._ior = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Pupil radius as a fraction of the iris radius, at zero dilation. */\r\n get pupilRadius() {\r\n return this._pupilRadius;\r\n }\r\n set pupilRadius(val) {\r\n const next = Math.min(0.95, Math.max(0.01, val ?? 0.01));\r\n if (next !== this._pupilRadius) {\r\n this._pupilRadius = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Pupil dilation, -1 (fully constricted) to 1 (fully dilated). Animatable. */\r\n get pupilDilation() {\r\n return this._pupilDilation;\r\n }\r\n set pupilDilation(val) {\r\n const next = Math.min(1, Math.max(-1, val ?? 0));\r\n if (next !== this._pupilDilation) {\r\n this._pupilDilation = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Tint multiplied over the iris texture. */\r\n get irisColor(): Immutable<Vector4> {\r\n return this._irisColor;\r\n }\r\n set irisColor(val: Immutable<Vector4>) {\r\n if (val && !this._irisColor.equalsTo(val)) {\r\n this._irisColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Fake internal scattering that keeps the iris from going black in shadow. */\r\n get irisBrightness() {\r\n return this._irisBrightness;\r\n }\r\n set irisBrightness(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._irisBrightness) {\r\n this._irisBrightness = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Width of the dark ring at the iris edge, as a fraction of\r\n * {@link EyeMaterial.irisRadius} - relative, so resizing the iris keeps the\r\n * ring in proportion.\r\n */\r\n get limbalRingWidth() {\r\n return this._limbalRingWidth;\r\n }\r\n set limbalRingWidth(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._limbalRingWidth) {\r\n this._limbalRingWidth = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** How dark the limbal ring gets. 0 disables it. */\r\n get limbalRingStrength() {\r\n return this._limbalRingStrength;\r\n }\r\n set limbalRingStrength(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._limbalRingStrength) {\r\n this._limbalRingStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Base sclera colour. Pure white reads as plastic; keep it slightly warm. */\r\n get scleraColor(): Immutable<Vector4> {\r\n return this._scleraColor;\r\n }\r\n set scleraColor(val: Immutable<Vector4>) {\r\n if (val && !this._scleraColor.equalsTo(val)) {\r\n this._scleraColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Diffuse wrap for the sclera, standing in for its subsurface softness. */\r\n get scleraWrap() {\r\n return this._scleraWrap;\r\n }\r\n set scleraWrap(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._scleraWrap) {\r\n this._scleraWrap = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Colour bled into the sclera away from the iris, standing in for vasculature. */\r\n get scleraEdgeTint(): Immutable<Vector4> {\r\n return this._scleraEdgeTint;\r\n }\r\n set scleraEdgeTint(val: Immutable<Vector4>) {\r\n if (val && !this._scleraEdgeTint.equalsTo(val)) {\r\n this._scleraEdgeTint.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Strength of the corneal highlight - the main cue that an eye is wet. */\r\n get corneaSpecularStrength() {\r\n return this._corneaSpecularStrength;\r\n }\r\n set corneaSpecularStrength(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._corneaSpecularStrength) {\r\n this._corneaSpecularStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Corneal roughness. Keep it very low; the cornea is close to a mirror. */\r\n get corneaRoughness() {\r\n return this._corneaRoughness;\r\n }\r\n set corneaRoughness(val) {\r\n const next = Math.min(1, Math.max(0.001, val ?? 0.001));\r\n if (next !== this._corneaRoughness) {\r\n this._corneaRoughness = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Enables eye-socket occlusion - the soft shadowing of the eyeball by the\r\n * eyelids and socket.\r\n *\r\n * @remarks\r\n * Analytic: an asymmetric aperture defined by\r\n * {@link EyeMaterial.upperLidAngle} and {@link EyeMaterial.lowerLidAngle}\r\n * around an axis fixed in the eyeball mesh's object space (rotatable via\r\n * {@link EyeMaterial.socketRotation}). Darkens ambient diffuse, ambient\r\n * specular and direct lights outside the aperture; no mask texture, extra\r\n * pass or per-frame scripting. Object space means the frame follows skinning\r\n * and node motion automatically, and vertical gaze drags the occlusion with\r\n * the eye - approximating how real upper lids follow it.\r\n */\r\n get socketOcclusion() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_SOCKET_OCCLUSION);\r\n }\r\n set socketOcclusion(val) {\r\n this.useFeature(EyeMaterial.FEATURE_SOCKET_OCCLUSION, !!val);\r\n }\r\n\r\n /**\r\n * Euler rotation (degrees, xyz) applied to the canonical socket frame.\r\n * At (0, 0, 0) the frame matches the documented asset convention: +Y towards\r\n * the upper lid, +Z along the gaze. Angles rather than unit vectors because\r\n * angles are the inspector-editable form.\r\n */\r\n get socketRotation(): Immutable<Vector4> {\r\n return this._socketRotation;\r\n }\r\n set socketRotation(val: Immutable<Vector4>) {\r\n if (val && !this._socketRotation.equalsTo(val)) {\r\n this._socketRotation.set(val);\r\n this.updateSocketFrame();\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Aperture half-angle towards the upper lid, in degrees from the socket up axis. */\r\n get upperLidAngle() {\r\n return this._upperLidAngle;\r\n }\r\n set upperLidAngle(val) {\r\n const next = Math.min(90, Math.max(5, val ?? 5));\r\n if (next !== this._upperLidAngle) {\r\n this._upperLidAngle = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Aperture half-angle towards the lower lid, in degrees. Defaults wider than\r\n * {@link EyeMaterial.upperLidAngle}; that asymmetry is what makes the\r\n * occlusion read as an eye socket.\r\n */\r\n get lowerLidAngle() {\r\n return this._lowerLidAngle;\r\n }\r\n set lowerLidAngle(val) {\r\n const next = Math.min(90, Math.max(5, val ?? 5));\r\n if (next !== this._lowerLidAngle) {\r\n this._lowerLidAngle = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Width of the lit-to-shadowed transition, in degrees. */\r\n get socketOcclusionSoftness() {\r\n return this._socketOcclusionSoftness;\r\n }\r\n set socketOcclusionSoftness(val) {\r\n const next = Math.min(45, Math.max(1, val ?? 1));\r\n if (next !== this._socketOcclusionSoftness) {\r\n this._socketOcclusionSoftness = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Overall socket occlusion strength, 0 to 1. */\r\n get socketOcclusionStrength() {\r\n return this._socketOcclusionStrength;\r\n }\r\n set socketOcclusionStrength(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._socketOcclusionStrength) {\r\n this._socketOcclusionStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Enables screen-space contact occlusion of the eyeball by whatever sits in\r\n * front of it - in practice the eyelid margin and the lashes.\r\n *\r\n * @remarks\r\n * Complements {@link EyeMaterial.socketOcclusion}: the socket aperture is an\r\n * analytic model of the lids, while this term reads the depth prepass and so\r\n * follows the real lid mesh - blinks, asymmetry and all. Dims the ambient\r\n * terms and the diffuse response of direct lights (whose shadow maps cannot\r\n * resolve the millimetre lid gap); direct specular is left untouched so the\r\n * corneal highlight survives.\r\n *\r\n * Requires a depth prepass. Forward+ always runs one; where none is bound the\r\n * term silently resolves to no occlusion.\r\n */\r\n get contactAO() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_CONTACT_AO);\r\n }\r\n set contactAO(val) {\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO, !!val);\r\n }\r\n\r\n /**\r\n * Radius of the contact occlusion disc, in world units - how far from the\r\n * lid the darkening reaches. Rescale for assets not authored at one unit per\r\n * metre; roughly half the eyeball radius is a good starting point.\r\n */\r\n get contactAORadius() {\r\n return this._contactAORadius;\r\n }\r\n set contactAORadius(val) {\r\n const next = Math.max(1e-6, val ?? 1e-6);\r\n if (next !== this._contactAORadius) {\r\n this._contactAORadius = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Smallest depth step that counts as an occluder, in world units. Raise it\r\n * until the eyeball stops shading itself. Compared against the eyeball's own\r\n * tangent plane rather than raw depth, so only residual curvature - not\r\n * view-dependent slope - has to clear it.\r\n */\r\n get contactAOMinDistance() {\r\n return this._contactAOMinDistance;\r\n }\r\n set contactAOMinDistance(val) {\r\n const next = Math.max(1e-6, val ?? 1e-6);\r\n if (next !== this._contactAOMinDistance) {\r\n this._contactAOMinDistance = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Largest depth step that counts as an occluder, in world units. Anything\r\n * further in front is unrelated geometry overlapping the eye on screen and\r\n * must not paint a shadow onto it - keep it at the order of the lid gap.\r\n * Forced to at least 4x {@link EyeMaterial.contactAOMinDistance} on upload\r\n * so the two smoothstep ramps cannot cross.\r\n */\r\n get contactAOMaxDistance() {\r\n return this._contactAOMaxDistance;\r\n }\r\n set contactAOMaxDistance(val) {\r\n const next = Math.max(1e-6, val ?? 1e-6);\r\n if (next !== this._contactAOMaxDistance) {\r\n this._contactAOMaxDistance = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Overall contact occlusion strength, 0 to 1. Calibrated so that 1 drives\r\n * the ambient terms to zero right at the contact line.\r\n */\r\n get contactAOStrength() {\r\n return this._contactAOStrength;\r\n }\r\n set contactAOStrength(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._contactAOStrength) {\r\n this._contactAOStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Advances the contact-occlusion noise pattern every frame so TAA can\r\n * integrate the grain away. Opt-in: without a temporal accumulator the\r\n * advancing pattern reads as flicker, worse than the static grain it\r\n * replaces. Enable it if and only if the pipeline resolves temporally.\r\n */\r\n get contactAOTemporalJitter() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_CONTACT_AO_JITTER);\r\n }\r\n set contactAOTemporalJitter(val) {\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO_JITTER, !!val);\r\n }\r\n\r\n /**\r\n * Recomputes the object-space socket up/forward vectors from\r\n * {@link EyeMaterial.socketRotation}.\r\n *\r\n * @internal\r\n */\r\n private updateSocketFrame() {\r\n const d2r = Math.PI / 180;\r\n const rot = Quaternion.fromEulerAngle(\r\n this._socketRotation.x * d2r,\r\n this._socketRotation.y * d2r,\r\n this._socketRotation.z * d2r\r\n ).toMatrix3x3();\r\n const up = rot.transformVector(new Vector3(0, 1, 0));\r\n const forward = rot.transformVector(new Vector3(0, 0, 1));\r\n this._socketUp.setXYZW(up.x, up.y, up.z, 0);\r\n this._socketForward.setXYZW(forward.x, forward.y, forward.z, 0);\r\n }\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 if (this.socketOcclusion && this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n // The socket axes take the same transform chain as the normal\r\n // attribute - skin matrix, then normal matrix - so the occlusion stays\r\n // attached to the eye through node motion and skeletal animation.\r\n scope.zEyeSocketUp = pb.vec4().uniform(2);\r\n scope.zEyeSocketForward = pb.vec4().uniform(2);\r\n const skinMatrix = ShaderHelper.getSkinMatrix(scope);\r\n scope.$l.oSocketUp = skinMatrix\r\n ? pb.mul(skinMatrix, pb.vec4(scope.zEyeSocketUp.xyz, 0)).xyz\r\n : scope.zEyeSocketUp.xyz;\r\n scope.$l.oSocketForward = skinMatrix\r\n ? pb.mul(skinMatrix, pb.vec4(scope.zEyeSocketForward.xyz, 0)).xyz\r\n : scope.zEyeSocketForward.xyz;\r\n scope.$outputs.wSocketUp = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oSocketUp, 0)\r\n ).xyz;\r\n scope.$outputs.wSocketForward = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oSocketForward, 0)\r\n ).xyz;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Fractional visibility of a world-space direction through the socket\r\n * aperture: 1 fully visible, approaching 0 towards the lids. Evaluated on\r\n * the surface normal, the reflection vector and light directions so all\r\n * lighting terms agree on where the lids are. The rear-hemisphere falloff\r\n * (`forLight`) applies to light directions only - applying it to surface\r\n * normals would paint the whole rear of a bare eyeball dark.\r\n *\r\n * @internal\r\n */\r\n private socketAperture(scope: PBInsideFunctionScope, dir: PBShaderExp, forLight: boolean) {\r\n const pb = scope.$builder;\r\n const funcName = forLight ? 'Z_eyeSocketApertureLight' : 'Z_eyeSocketApertureSurface';\r\n pb.func(funcName, [pb.vec3('dir'), pb.vec4('lidCos'), pb.float('strength')], function () {\r\n this.$l.up = pb.normalize(this.$inputs.wSocketUp);\r\n this.$l.lat = pb.dot(this.dir, this.up);\r\n // lidCos packs cos(angle +/- softness) per lid, precomputed on the CPU:\r\n // (upper outer, upper inner, lower outer, lower inner).\r\n this.$l.occUpper = pb.smoothStep(this.lidCos.x, this.lidCos.y, this.lat);\r\n this.$l.occLower = pb.smoothStep(this.lidCos.z, this.lidCos.w, pb.neg(this.lat));\r\n this.$l.visibility = pb.sub(1, pb.max(this.occUpper, this.occLower));\r\n if (forLight) {\r\n // Light from behind the eye's equator is blocked by the head itself;\r\n // the ramp straddles zero so the dimming eases in early.\r\n this.$l.forward = pb.normalize(this.$inputs.wSocketForward);\r\n this.visibility = pb.mul(this.visibility, pb.smoothStep(-0.4, 0.25, pb.dot(this.dir, this.forward)));\r\n }\r\n this.$return(pb.mix(pb.float(1), this.visibility, this.strength));\r\n });\r\n return pb.getGlobalScope()[funcName](dir, scope.zEyeSocketCos, scope.zEyeSocketStrength) as PBShaderExp;\r\n }\r\n\r\n /**\r\n * Fraction of the ambient hemisphere still reaching this fragment once the\r\n * geometry standing in front of the eyeball is accounted for: 1 open, 0 fully\r\n * buried under the lid.\r\n *\r\n * @remarks\r\n * Samples the depth prepass in a disc around the fragment and counts the taps\r\n * in front of the eyeball's own local tangent plane. Comparing against that\r\n * plane rather than raw depth cancels the surface's slope and foreshortening,\r\n * which is what lets the min/max thresholds be plain world-space distances.\r\n *\r\n * Must be called from uniform control flow - it takes screen-space\r\n * derivatives, which WGSL only permits there.\r\n *\r\n * @internal\r\n */\r\n private contactAOTerm(scope: PBInsideFunctionScope) {\r\n const pb = scope.$builder;\r\n if (!ShaderHelper.getLinearDepthTexture(scope)) {\r\n // No depth prepass bound for this pass. Forward+ always runs one, but a\r\n // material must not assume the pipeline it is drawn by.\r\n return pb.float(1);\r\n }\r\n const funcName = 'Z_eyeContactAO';\r\n const temporalJitter = !!this.contactAOTemporalJitter;\r\n pb.func(\r\n funcName,\r\n [pb.vec3('worldPos'), pb.vec4('range'), pb.float('radius'), pb.float('strength')],\r\n function () {\r\n this.$l.renderSize = ShaderHelper.getRenderSize(this);\r\n this.$l.viewPos = pb.mul(ShaderHelper.getViewMatrix(this), pb.vec4(this.worldPos, 1)).xyz;\r\n // Distance along the view axis, which is what the depth prepass writes\r\n // once scaled back up by the far plane.\r\n this.$l.centerZ = pb.neg(this.viewPos.z);\r\n // Derivatives first: the fade below returns early, and everything after\r\n // that early return is non-uniform control flow.\r\n this.$l.dzdx = pb.dpdx(this.centerZ);\r\n this.$l.dzdy = pb.dpdy(this.centerZ);\r\n // Project the world-space radius rather than reading the projection\r\n // matrix diagonal, so off-centre/oblique projections stay correct.\r\n this.$l.projMatrix = ShaderHelper.getProjectionMatrix(this);\r\n this.$l.h0 = pb.mul(this.projMatrix, pb.vec4(this.viewPos, 1));\r\n this.$l.h1 = pb.mul(this.projMatrix, pb.vec4(pb.add(this.viewPos, pb.vec3(this.radius, 0, 0)), 1));\r\n this.$l.pixelRadius = pb.min(\r\n pb.length(\r\n pb.mul(pb.sub(pb.div(this.h1.xy, this.h1.w), pb.div(this.h0.xy, this.h0.w)), 0.5, this.renderSize)\r\n ),\r\n CONTACT_AO_MAX_PIXEL_RADIUS\r\n );\r\n // A disc of only a couple of pixels is pure noise; fade it out rather\r\n // than sample it.\r\n this.$l.fade = pb.smoothStep(1.5, 4, this.pixelRadius);\r\n this.$if(pb.lessThanEqual(this.fade, 0), function () {\r\n this.$return(pb.float(1));\r\n });\r\n this.$l.screenUV = pb.div(this.$builtins.fragCoord.xy, this.renderSize);\r\n this.$l.far = ShaderHelper.getCameraParams(this).y;\r\n // Per-pixel rotation of the spiral breaks up banding. Static unless\r\n // temporal jitter is opted in (see contactAOTemporalJitter); the\r\n // framestamp is wrapped to keep the IGN math inside float precision.\r\n this.$l.frameId = temporalJitter\r\n ? pb.mod(pb.float(ShaderHelper.getFramestamp(this)), 64)\r\n : pb.float(0);\r\n this.$l.rotation = pb.mul(\r\n SSR_interleavedGradientNoise(this, this.$builtins.fragCoord.xy, this.frameId),\r\n Math.PI * 2\r\n );\r\n this.$l.occlusion = pb.float(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$for(pb.int('i'), 0, CONTACT_AO_SAMPLES, function () {\r\n this.$l.t = pb.div(pb.add(pb.float(this.i), 0.5), CONTACT_AO_SAMPLES);\r\n this.$l.angle = pb.add(this.rotation, pb.mul(pb.float(this.i), GOLDEN_ANGLE));\r\n // sqrt spreads the taps evenly over the disc. Without it they pile up\r\n // at the centre and the outer half of the radius goes unsampled.\r\n this.$l.offset = pb.mul(\r\n pb.vec2(pb.cos(this.angle), pb.sin(this.angle)),\r\n pb.mul(pb.sqrt(this.t), this.pixelRadius)\r\n );\r\n this.$l.sampleZ = pb.mul(\r\n ShaderHelper.sampleLinearDepth(\r\n this,\r\n ShaderHelper.getLinearDepthTexture(this),\r\n pb.add(this.screenUV, pb.div(this.offset, this.renderSize)),\r\n 0\r\n ),\r\n this.far\r\n );\r\n // Where the eyeball itself would be at this tap.\r\n this.$l.predicted = pb.add(\r\n this.centerZ,\r\n pb.mul(this.dzdx, this.offset.x),\r\n pb.mul(this.dzdy, this.offset.y)\r\n );\r\n this.$l.delta = pb.sub(this.predicted, this.sampleZ);\r\n // range packs (min in, min out, max in, max out), ordered on the CPU.\r\n // Under the near pair the step is the eyeball shading itself; over\r\n // the far pair it is unrelated geometry overlapping the eye on\r\n // screen, which must not paint a shadow onto it.\r\n this.$l.accept = pb.mul(\r\n pb.smoothStep(this.range.x, this.range.y, this.delta),\r\n pb.sub(1, pb.smoothStep(this.range.z, this.range.w, this.delta))\r\n );\r\n // Nearer taps occlude more, turning the lid edge into a gradient.\r\n // The slope is gentle on purpose: the lid signal lives on the outer\r\n // rim of the disc, which a steep falloff would discount.\r\n this.$l.falloff = pb.sub(1, pb.mul(this.t, 0.75));\r\n this.occlusion = pb.add(this.occlusion, pb.mul(this.accept, this.falloff));\r\n this.weightSum = pb.add(this.weightSum, this.falloff);\r\n });\r\n // Semi-disc calibration: a lid edge at the fragment covers at most half\r\n // the disc (the other half is the eyeball itself), so raw coverage tops\r\n // out near 0.5. Doubling maps that to full occlusion; the smoothstep's\r\n // low edge discards lone-stray-tap grain.\r\n this.$l.coverage = pb.smoothStep(\r\n 0.1,\r\n 0.9,\r\n pb.mul(pb.div(this.occlusion, pb.max(this.weightSum, 1e-4)), 2)\r\n );\r\n this.$l.ao = pb.sub(1, pb.mul(this.coverage, this.strength));\r\n this.$return(pb.mix(pb.float(1), this.ao, this.fade));\r\n }\r\n );\r\n const globalScope = pb.getGlobalScope();\r\n return globalScope[funcName](\r\n scope.$inputs.worldPos,\r\n scope.zEyeContactAORange,\r\n scope.zEyeContactAORadius,\r\n scope.zEyeContactAOStrength\r\n ) as PBShaderExp;\r\n }\r\n\r\n /**\r\n * Offsets the iris lookup to account for refraction through the cornea:\r\n * refracts the view direction in tangent space and walks the refracted ray\r\n * down to the iris plane. Falls back to the unmodified UV when there is no\r\n * tangent frame to refract in.\r\n *\r\n * @internal\r\n */\r\n private refractIrisUV(scope: PBInsideFunctionScope, uv: PBShaderExp, viewVec: PBShaderExp) {\r\n const pb = scope.$builder;\r\n if (!this.vertexTangent) {\r\n return uv;\r\n }\r\n const that = this;\r\n const funcName = 'Z_eyeRefractIrisUV';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('uv'), pb.vec3('viewVec'), pb.vec3('worldPos'), pb.float('depth'), pb.float('ior')],\r\n function () {\r\n this.$l.TBN = that.calculateTBN(\r\n this,\r\n this.worldPos,\r\n this.$inputs.wNorm,\r\n this.$inputs.wTangent,\r\n this.$inputs.wBinormal\r\n );\r\n // World -> tangent is the transpose of the (orthonormal) TBN.\r\n this.$l.vTangent = pb.normalize(\r\n pb.vec3(\r\n pb.dot(this.viewVec, this.TBN[0]),\r\n pb.dot(this.viewVec, this.TBN[1]),\r\n pb.dot(this.viewVec, this.TBN[2])\r\n )\r\n );\r\n // Incident direction points into the surface, hence the negation.\r\n this.$l.refracted = pb.refract(pb.neg(this.vTangent), pb.vec3(0, 0, 1), pb.div(1, this.ior));\r\n // Total internal reflection returns a zero vector; leave the UV alone.\r\n this.$if(pb.lessThan(pb.dot(this.refracted, this.refracted), 0.0001), function () {\r\n this.$return(this.uv);\r\n });\r\n // March to the iris plane. The guard keeps grazing angles, where the\r\n // ray runs nearly parallel to the plane, from exploding the offset.\r\n this.$l.travel = pb.div(this.depth, pb.max(pb.abs(this.refracted.z), 0.15));\r\n this.$return(pb.add(this.uv, pb.mul(this.refracted.xy, this.travel)));\r\n }\r\n );\r\n return pb\r\n .getGlobalScope()\r\n [funcName](uv, viewVec, scope.$inputs.worldPos, scope.zEyeIrisDepth, scope.zEyeIOR) as PBShaderExp;\r\n }\r\n\r\n /**\r\n * Rescales the iris radially so the pupil can open and close: a power curve\r\n * pinned at the iris edge moves the pupil boundary while the limbus stays\r\n * put, matching how a real iris deforms.\r\n *\r\n * @internal\r\n */\r\n private applyPupilDilation(scope: PBInsideFunctionScope, irisUV: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_eyeApplyPupilDilation';\r\n pb.func(funcName, [pb.vec2('irisUV'), pb.float('dilation')], function () {\r\n // Operates in iris-texture space, where the pupil sits at (0.5, 0.5) and\r\n // the iris rim is at radius 0.5.\r\n this.$l.delta = pb.sub(this.irisUV, pb.vec2(0.5));\r\n this.$l.dist = pb.length(this.delta);\r\n this.$if(pb.lessThan(this.dist, 0.00001), function () {\r\n this.$return(this.irisUV);\r\n });\r\n this.$l.norm = pb.clamp(pb.div(this.dist, 0.5), 0, 1);\r\n // Maps a display radius to the texture radius it samples: an exponent\r\n // above 1 samples further in, dilating the pupil. Pinned at norm = 1\r\n // either way, so dilation never disturbs the limbus.\r\n this.$l.exponent = pb.exp(pb.mul(this.dilation, 0.9));\r\n this.$l.remapped = pb.mul(pb.pow(this.norm, this.exponent), 0.5);\r\n this.$return(pb.add(pb.vec2(0.5), pb.mul(pb.div(this.delta, this.dist), this.remapped)));\r\n });\r\n return pb.getGlobalScope()[funcName](irisUV, scope.zEyePupilDilation) as PBShaderExp;\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 const litPass = this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT;\r\n if (litPass) {\r\n scope.zEyeIrisCenter = pb.vec4().uniform(2);\r\n scope.zEyeIrisRadius = pb.float().uniform(2);\r\n scope.zEyeIrisDepth = pb.float().uniform(2);\r\n scope.zEyeIOR = pb.float().uniform(2);\r\n scope.zEyePupilRadius = pb.float().uniform(2);\r\n scope.zEyePupilDilation = pb.float().uniform(2);\r\n scope.zEyeIrisColor = pb.vec4().uniform(2);\r\n scope.zEyeIrisBrightness = pb.float().uniform(2);\r\n scope.zEyeLimbalRingWidth = pb.float().uniform(2);\r\n scope.zEyeLimbalRingStrength = pb.float().uniform(2);\r\n scope.zEyeScleraColor = pb.vec4().uniform(2);\r\n scope.zEyeScleraWrap = pb.float().uniform(2);\r\n scope.zEyeScleraEdgeTint = pb.vec4().uniform(2);\r\n scope.zEyeCorneaSpecularStrength = pb.float().uniform(2);\r\n scope.zEyeCorneaRoughness = pb.float().uniform(2);\r\n if (this.socketOcclusion && this.vertexNormal) {\r\n scope.zEyeSocketCos = pb.vec4().uniform(2);\r\n scope.zEyeSocketStrength = pb.float().uniform(2);\r\n }\r\n if (this.contactAO) {\r\n scope.zEyeContactAORange = pb.vec4().uniform(2);\r\n scope.zEyeContactAORadius = pb.float().uniform(2);\r\n scope.zEyeContactAOStrength = pb.float().uniform(2);\r\n }\r\n }\r\n if (!litPass) {\r\n // Depth/shadow style passes only need coverage, not shading.\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(1));\r\n return;\r\n }\r\n\r\n // TBN[2] is the pre-normal-map geometric normal, needed for shadow normal\r\n // 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 scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.NoV = pb.clamp(pb.dot(scope.normal, scope.viewVec), 0.001, 1);\r\n\r\n // Surface UV drives the region split; the iris lookup is refracted from it.\r\n scope.$l.surfaceUV = this.hasIrisTexture()\r\n ? this.getIrisTexCoord(scope)\r\n : this.hasScleraTexture()\r\n ? this.getScleraTexCoord(scope)\r\n : pb.vec2(0.5);\r\n scope.$l.surfaceOffset = pb.sub(scope.surfaceUV, scope.zEyeIrisCenter.xy);\r\n scope.$l.surfaceDist = pb.length(scope.surfaceOffset);\r\n\r\n // Refract on the surface UV, then remap the iris disc onto the full iris\r\n // texture, which is authored as one iris filling the frame.\r\n scope.$l.refractedUV = this.refractIrisUV(scope, scope.surfaceUV, scope.viewVec);\r\n scope.$l.irisUV = pb.add(\r\n pb.vec2(0.5),\r\n pb.div(pb.sub(scope.refractedUV, scope.zEyeIrisCenter.xy), pb.mul(scope.zEyeIrisRadius, 2))\r\n );\r\n scope.irisUV = this.applyPupilDilation(scope, scope.irisUV);\r\n\r\n // Sclera.\r\n scope.$l.scleraAlbedo = scope.zEyeScleraColor.rgb;\r\n if (this.hasScleraTexture()) {\r\n scope.scleraAlbedo = pb.mul(scope.scleraAlbedo, this.sampleScleraTexture(scope, scope.surfaceUV).rgb);\r\n }\r\n // Vasculature reads strongest away from the iris.\r\n scope.$l.edgeAmount = pb.smoothStep(\r\n scope.zEyeIrisRadius,\r\n pb.add(scope.zEyeIrisRadius, 0.35),\r\n scope.surfaceDist\r\n );\r\n scope.scleraAlbedo = pb.mix(\r\n scope.scleraAlbedo,\r\n pb.mul(scope.scleraAlbedo, scope.zEyeScleraEdgeTint.rgb),\r\n pb.mul(scope.edgeAmount, scope.zEyeScleraEdgeTint.a)\r\n );\r\n\r\n // Iris.\r\n scope.$l.irisAlbedo = scope.zEyeIrisColor.rgb;\r\n if (this.hasIrisTexture()) {\r\n scope.irisAlbedo = pb.mul(scope.irisAlbedo, this.sampleIrisTexture(scope, scope.irisUV).rgb);\r\n }\r\n // Limbal ring, keyed off the surface radius so refraction cannot smear it.\r\n scope.$l.limbalWidth = pb.mul(scope.zEyeIrisRadius, scope.zEyeLimbalRingWidth);\r\n scope.$l.limbal = pb.smoothStep(\r\n pb.sub(scope.zEyeIrisRadius, scope.limbalWidth),\r\n scope.zEyeIrisRadius,\r\n scope.surfaceDist\r\n );\r\n scope.irisAlbedo = pb.mul(\r\n scope.irisAlbedo,\r\n pb.sub(1, pb.mul(scope.limbal, scope.zEyeLimbalRingStrength))\r\n );\r\n\r\n // Region blend. The transition is a fraction of the iris radius so it\r\n // scales with the eye instead of being a fixed UV distance.\r\n scope.$l.irisMask = pb.sub(\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(scope.zEyeIrisRadius, 0.97),\r\n pb.mul(scope.zEyeIrisRadius, 1.03),\r\n scope.surfaceDist\r\n )\r\n );\r\n scope.$l.albedo = pb.mix(scope.scleraAlbedo, scope.irisAlbedo, scope.irisMask);\r\n\r\n scope.$l.diffuseLighting = pb.vec3(0);\r\n scope.$l.specularLighting = pb.vec3(0);\r\n scope.$l.alphaRoughness = pb.mul(scope.zEyeCorneaRoughness, scope.zEyeCorneaRoughness);\r\n // Water/cornea reflectance at normal incidence.\r\n scope.$l.F0 = pb.vec3(0.04);\r\n scope.$l.F90 = pb.vec3(1);\r\n\r\n const socketOcc = !!this.socketOcclusion && !!this.vertexNormal;\r\n const baseLightPass = !this.drawContext.lightBlending;\r\n // Evaluated once at function scope: it takes screen-space derivatives\r\n // (uniform control flow only) and is view- but not light-dependent. Also\r\n // needed in additive light passes, since it dims direct diffuse too.\r\n scope.$l.contactAO = this.contactAO ? this.contactAOTerm(scope) : pb.float(1);\r\n if (this.needCalculateEnvLight() && baseLightPass) {\r\n // Socket occlusion: irradiance keyed off the surface normal, radiance\r\n // off the reflection vector, so a reflection ray aimed at the eyelid\r\n // dims even where the surface itself is open.\r\n scope.$l.envIrradiance = this.getEnvLightIrradiance(scope, scope.normal);\r\n if (socketOcc) {\r\n scope.envIrradiance = pb.mul(scope.envIrradiance, this.socketAperture(scope, scope.normal, false));\r\n }\r\n scope.envIrradiance = pb.mul(scope.envIrradiance, scope.contactAO);\r\n scope.diffuseLighting = pb.add(scope.diffuseLighting, scope.envIrradiance);\r\n scope.$l.reflectVec = this.calculateReflectionVector(scope, scope.normal, scope.viewVec);\r\n scope.$l.envFresnel = this.fresnelSchlick(scope, scope.NoV, scope.F0, scope.F90);\r\n scope.$l.envRadiance = pb.mul(\r\n this.getEnvLightRadiance(scope, scope.reflectVec, scope.zEyeCorneaRoughness),\r\n scope.envFresnel,\r\n scope.zEyeCorneaSpecularStrength\r\n );\r\n if (socketOcc) {\r\n scope.envRadiance = pb.mul(scope.envRadiance, this.socketAperture(scope, scope.reflectVec, false));\r\n }\r\n // The lid occludes the sky the cornea mirrors just as much as the sky\r\n // it diffuses.\r\n scope.envRadiance = pb.mul(scope.envRadiance, scope.contactAO);\r\n scope.specularLighting = pb.add(scope.specularLighting, scope.envRadiance);\r\n }\r\n\r\n this.forEachLight(scope, 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.$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 this.$inputs.worldPos,\r\n posRange,\r\n dirCutoff\r\n );\r\n this.$l.rawNoL = pb.dot(this.normal, this.lightDir);\r\n this.$l.NoL = pb.clamp(this.rawNoL, 0, 1);\r\n // calculateShadow() samples with implicit derivatives, which WGSL only\r\n // permits in uniform control flow - so this must never sit inside a\r\n // dynamic branch.\r\n this.$l.shadowTerm = shadow\r\n ? that.calculateShadow(this, this.$inputs.worldPos, scope.normalInfo.TBN[2], pb.max(this.NoL, 1e-5))\r\n : pb.float(1);\r\n this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten, this.shadowTerm);\r\n if (socketOcc) {\r\n // A light arriving from outside the lid aperture is blocked before\r\n // it reaches the eyeball - a shadow map cannot resolve this, since\r\n // the lid sits inside any workable depth bias.\r\n this.lightColor = pb.mul(this.lightColor, that.socketAperture(this, this.lightDir, true));\r\n }\r\n // Wrapped diffuse only for the sclera; the iris is lit through the\r\n // cornea and stays comparatively crisp.\r\n this.$l.NoLWrap = pb.clamp(\r\n pb.div(pb.add(this.rawNoL, this.zEyeScleraWrap), pb.add(1, this.zEyeScleraWrap)),\r\n 0,\r\n 1\r\n );\r\n this.$l.diffuseTerm = pb.mix(this.NoLWrap, this.NoL, this.irisMask);\r\n // The contact term dims direct diffuse too, or the contact shadow\r\n // vanishes under direct lighting. Direct specular is left out: if the\r\n // light is visible from the fragment, its highlight should be as well.\r\n this.diffuseLighting = pb.add(\r\n this.diffuseLighting,\r\n pb.mul(this.lightColor, this.diffuseTerm, this.diffuseScale, this.contactAO)\r\n );\r\n\r\n this.$l.halfVec = pb.normalize(pb.add(this.lightDir, this.viewVec));\r\n this.$l.NoH = pb.clamp(pb.dot(this.normal, this.halfVec), 0, 1);\r\n this.$l.VoH = pb.clamp(pb.dot(this.viewVec, this.halfVec), 0, 1);\r\n this.$l.D = that.distributionGGX(this, this.NoH, this.alphaRoughness);\r\n this.$l.Vis = that.visGGX(this, this.NoV, this.NoL, this.alphaRoughness);\r\n this.$l.F = that.fresnelSchlick(this, this.VoH, this.F0, this.F90);\r\n this.specularLighting = pb.add(\r\n this.specularLighting,\r\n pb.mul(\r\n this.lightColor,\r\n this.F,\r\n pb.mul(this.D, this.Vis, this.NoL),\r\n this.zEyeCorneaSpecularStrength,\r\n this.specularScale\r\n )\r\n );\r\n });\r\n\r\n // Light that has entered the iris and bounced around inside it - without\r\n // this the iris crushes to black in shadow. Fed by environment\r\n // irradiance (already carrying the occlusion terms), scaled by\r\n // irisBrightness.\r\n scope.$l.irisEnvLight =\r\n baseLightPass && this.needCalculateEnvLight() ? scope.envIrradiance : pb.vec3(0);\r\n scope.$l.internal = pb.mul(scope.albedo, scope.irisEnvLight, scope.zEyeIrisBrightness, scope.irisMask);\r\n scope.$l.litColor = pb.add(\r\n pb.mul(scope.albedo, scope.diffuseLighting),\r\n scope.internal,\r\n scope.specularLighting\r\n );\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, 1));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (this.needFragmentColor(ctx) && ctx.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n bindGroup.setValue('zEyeIrisCenter', this._irisCenter);\r\n bindGroup.setValue('zEyeIrisRadius', this._irisRadius);\r\n bindGroup.setValue('zEyeIrisDepth', this._irisDepth);\r\n bindGroup.setValue('zEyeIOR', this._ior);\r\n bindGroup.setValue('zEyePupilRadius', this._pupilRadius);\r\n bindGroup.setValue('zEyePupilDilation', this._pupilDilation);\r\n bindGroup.setValue('zEyeIrisColor', this._irisColor);\r\n bindGroup.setValue('zEyeIrisBrightness', this._irisBrightness);\r\n bindGroup.setValue('zEyeLimbalRingWidth', this._limbalRingWidth);\r\n bindGroup.setValue('zEyeLimbalRingStrength', this._limbalRingStrength);\r\n bindGroup.setValue('zEyeScleraColor', this._scleraColor);\r\n bindGroup.setValue('zEyeScleraWrap', this._scleraWrap);\r\n bindGroup.setValue('zEyeScleraEdgeTint', this._scleraEdgeTint);\r\n bindGroup.setValue('zEyeCorneaSpecularStrength', this._corneaSpecularStrength);\r\n bindGroup.setValue('zEyeCorneaRoughness', this._corneaRoughness);\r\n if (this.socketOcclusion && this.vertexNormal) {\r\n const d2r = Math.PI / 180;\r\n const softness = this._socketOcclusionSoftness;\r\n // (upper outer, upper inner, lower outer, lower inner) - see\r\n // socketAperture. Clamped so the smoothstep edges never coincide.\r\n this._socketCos.setXYZW(\r\n Math.cos(Math.min(this._upperLidAngle + softness, 179) * d2r),\r\n Math.cos(Math.max(this._upperLidAngle - softness, 1) * d2r),\r\n Math.cos(Math.min(this._lowerLidAngle + softness, 179) * d2r),\r\n Math.cos(Math.max(this._lowerLidAngle - softness, 1) * d2r)\r\n );\r\n bindGroup.setValue('zEyeSocketUp', this._socketUp);\r\n bindGroup.setValue('zEyeSocketForward', this._socketForward);\r\n bindGroup.setValue('zEyeSocketCos', this._socketCos);\r\n bindGroup.setValue('zEyeSocketStrength', this._socketOcclusionStrength);\r\n }\r\n if (this.contactAO) {\r\n const minD = this._contactAOMinDistance;\r\n // The near pair ramps a tap in as an occluder, the far pair ramps it\r\n // back out as unrelated geometry. Widen the outer distance (never\r\n // clamp the inner one) to keep the two ramps from crossing.\r\n const maxD = Math.max(this._contactAOMaxDistance, minD * 4);\r\n // The far ramp starts at 0.75x rather than halfway: ramping out\r\n // earlier discounts the thicker parts of the lid margin.\r\n this._contactAORange.setXYZW(minD, minD * 2, maxD * 0.75, maxD);\r\n bindGroup.setValue('zEyeContactAORange', this._contactAORange);\r\n bindGroup.setValue('zEyeContactAORadius', this._contactAORadius);\r\n bindGroup.setValue('zEyeContactAOStrength', this._contactAOStrength);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["CONTACT_AO_SAMPLES","CONTACT_AO_MAX_PIXEL_RADIUS","GOLDEN_ANGLE","EyeMaterial","applyMaterialMixins","MeshMaterial","mixinLight","mixinPBRBRDF","mixinTextureProps","FEATURE_VERTEX_NORMAL","defineFeature","FEATURE_VERTEX_TANGENT","FEATURE_SOCKET_OCCLUSION","FEATURE_CONTACT_AO","FEATURE_CONTACT_AO_JITTER","_irisCenter","_irisRadius","_irisDepth","_ior","_pupilRadius","_pupilDilation","_irisColor","_irisBrightness","_limbalRingWidth","_limbalRingStrength","_scleraColor","_scleraWrap","_scleraEdgeTint","_corneaSpecularStrength","_corneaRoughness","_socketRotation","_upperLidAngle","_lowerLidAngle","_socketOcclusionSoftness","_socketOcclusionStrength","_contactAORadius","_contactAOMinDistance","_contactAOMaxDistance","_contactAOStrength","_socketUp","_socketForward","_socketCos","_contactAORange","Vector4","useFeature","clone","other","copyFrom","vertexNormal","vertexTangent","irisCenter","irisRadius","irisDepth","ior","pupilRadius","pupilDilation","irisColor","irisBrightness","limbalRingWidth","limbalRingStrength","scleraColor","scleraWrap","scleraEdgeTint","corneaSpecularStrength","corneaRoughness","socketOcclusion","socketRotation","upperLidAngle","lowerLidAngle","socketOcclusionSoftness","socketOcclusionStrength","contactAO","contactAORadius","contactAOMinDistance","contactAOMaxDistance","contactAOStrength","contactAOTemporalJitter","featureUsed","val","equalsTo","set","uniformChanged","next","Math","max","min","updateSocketFrame","d2r","PI","rot","Quaternion","fromEulerAngle","x","y","z","toMatrix3x3","up","transformVector","Vector3","forward","setXYZW","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","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","zEyeSocketUp","uniform","zEyeSocketForward","skinMatrix","getSkinMatrix","oSocketUp","oSocketForward","wSocketUp","wSocketForward","dir","forLight","funcName","func","vec3","float","normalize","$inputs","lat","dot","occUpper","smoothStep","lidCos","occLower","neg","visibility","sub","$return","mix","strength","getGlobalScope","zEyeSocketCos","zEyeSocketStrength","contactAOTerm","getLinearDepthTexture","temporalJitter","renderSize","getRenderSize","viewPos","getViewMatrix","centerZ","dzdx","dpdx","dzdy","dpdy","projMatrix","getProjectionMatrix","h0","h1","add","radius","pixelRadius","length","div","xy","fade","$if","lessThanEqual","screenUV","$builtins","fragCoord","far","getCameraParams","frameId","mod","getFramestamp","rotation","SSR_interleavedGradientNoise","occlusion","weightSum","$for","int","t","i","angle","offset","vec2","cos","sin","sqrt","sampleZ","sampleLinearDepth","predicted","delta","accept","range","falloff","coverage","ao","globalScope","zEyeContactAORange","zEyeContactAORadius","zEyeContactAOStrength","uv","viewVec","that","TBN","calculateTBN","vTangent","refracted","refract","lessThan","travel","depth","abs","zEyeIrisDepth","zEyeIOR","applyPupilDilation","irisUV","dist","norm","clamp","exponent","exp","dilation","remapped","pow","zEyePupilDilation","fragmentShader","needFragmentColorInput","litPass","zEyeIrisCenter","zEyeIrisRadius","zEyePupilRadius","zEyeIrisColor","zEyeIrisBrightness","zEyeLimbalRingWidth","zEyeLimbalRingStrength","zEyeScleraColor","zEyeScleraWrap","zEyeScleraEdgeTint","zEyeCorneaSpecularStrength","zEyeCorneaRoughness","outputFragmentColor","normalInfo","calculateNormalAndTBN","normal","calculateViewVector","NoV","surfaceUV","hasIrisTexture","getIrisTexCoord","hasScleraTexture","getScleraTexCoord","surfaceOffset","surfaceDist","refractedUV","refractIrisUV","scleraAlbedo","rgb","sampleScleraTexture","edgeAmount","a","irisAlbedo","sampleIrisTexture","limbalWidth","limbal","irisMask","albedo","diffuseLighting","specularLighting","alphaRoughness","F0","F90","socketOcc","baseLightPass","lightBlending","needCalculateEnvLight","envIrradiance","getEnvLightIrradiance","socketAperture","reflectVec","calculateReflectionVector","envFresnel","fresnelSchlick","envRadiance","getEnvLightRadiance","forEachLight","posRange","dirCutoff","colorIntensity","extra","shadow","diffuseScale","specularScale","equal","LIGHT_TYPE_POINT","lightAtten","calculateLightAttenuation","lightDir","calculateLightDirection","rawNoL","NoL","shadowTerm","calculateShadow","lightColor","NoLWrap","diffuseTerm","halfVec","NoH","VoH","D","distributionGGX","Vis","visGGX","F","irisEnvLight","internal","litColor","applyUniformValues","bindGroup","ctx","pass","needFragmentColor","setValue","softness","minD","maxD"],"mappings":"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"}
1
+ {"version":3,"file":"eye.js","sources":["../../src/material/eye.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport type { Clonable, Immutable } from '@zephyr3d/base';\r\nimport { Quaternion, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport { mixinLight } from './mixins/lit';\r\nimport { mixinPBRBRDF } from './mixins/pbr/brdf';\r\nimport { mixinTextureProps } from './mixins/texture';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport { SSR_interleavedGradientNoise } from '../shaders/ssr';\r\nimport type { DrawContext } from '../render';\r\nimport { LIGHT_TYPE_POINT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\n\r\n/** Taps in the contact-occlusion disc. 16 rather than 8: close-ups need the density. */\r\nconst CONTACT_AO_SAMPLES = 16;\r\n/**\r\n * Cap on the on-screen radius of the contact-occlusion disc, in pixels.\r\n * Keeps the sample density usable in close-up, where the projected radius\r\n * would otherwise reach hundreds of pixels and read as grain.\r\n */\r\nconst CONTACT_AO_MAX_PIXEL_RADIUS = 48;\r\n/** Golden angle, in radians. Spreads the disc taps without any table. */\r\nconst GOLDEN_ANGLE = 2.399963229728653;\r\n\r\n/**\r\n * Realtime eye material for realistic and semi-realistic characters.\r\n *\r\n * @remarks\r\n * Shades the whole eyeball - sclera, limbus and iris - from a single mesh and a\r\n * single material. There is no separate cornea layer: the corneal bulge is\r\n * simulated by refracting the view ray and offsetting the iris lookup, so no\r\n * transparent second surface, OIT or depth sorting is involved.\r\n *\r\n * The refraction works in tangent space (per-fragment TBN) rather than object\r\n * space, because the shader cannot reconstruct a fixed object-space gaze axis\r\n * after skinning. The residual error over the sphere's curvature is small at\r\n * the depths an iris actually sits.\r\n *\r\n * Regions are derived analytically from the UV distance to the iris centre, so\r\n * no mask texture is required - which is why the asset must place the iris at a\r\n * known UV location; see {@link EyeMaterial.irisCenter}.\r\n *\r\n * Expected asset setup:\r\n * - A single eyeball mesh (sphere or front dome) carrying normals *and*\r\n * tangents; without tangents there is no TBN and refraction degrades to a\r\n * flat iris.\r\n * - UVs that place the pupil centre at {@link EyeMaterial.irisCenter}, with the\r\n * iris occupying a disc of {@link EyeMaterial.irisRadius} around it.\r\n * - An iris texture with the pupil at its centre. The sclera texture is\r\n * optional; without one the sclera is shaded from {@link EyeMaterial.scleraColor}.\r\n *\r\n * @public\r\n */\r\nexport class EyeMaterial\r\n extends applyMaterialMixins(\r\n MeshMaterial,\r\n mixinLight,\r\n mixinPBRBRDF,\r\n mixinTextureProps('iris'),\r\n mixinTextureProps('sclera')\r\n )\r\n implements Clonable<EyeMaterial>\r\n{\r\n private static readonly FEATURE_VERTEX_NORMAL = this.defineFeature();\r\n private static readonly FEATURE_VERTEX_TANGENT = this.defineFeature();\r\n private static readonly FEATURE_SOCKET_OCCLUSION = this.defineFeature();\r\n private static readonly FEATURE_CONTACT_AO = this.defineFeature();\r\n private static readonly FEATURE_CONTACT_AO_JITTER = this.defineFeature();\r\n\r\n private readonly _irisCenter: Vector4;\r\n private _irisRadius: number;\r\n private _irisDepth: number;\r\n private _ior: number;\r\n private _pupilRadius: number;\r\n private _pupilDilation: number;\r\n private readonly _irisColor: Vector4;\r\n private _irisBrightness: number;\r\n private _limbalRingWidth: number;\r\n private _limbalRingStrength: number;\r\n private readonly _scleraColor: Vector4;\r\n private _scleraWrap: number;\r\n private readonly _scleraEdgeTint: Vector4;\r\n private _corneaSpecularStrength: number;\r\n private _corneaRoughness: number;\r\n private readonly _socketRotation: Vector4;\r\n private _upperLidAngle: number;\r\n private _lowerLidAngle: number;\r\n private _socketOcclusionSoftness: number;\r\n private _socketOcclusionStrength: number;\r\n private _contactAORadius: number;\r\n private _contactAOMinDistance: number;\r\n private _contactAOMaxDistance: number;\r\n private _contactAOStrength: number;\r\n // Derived from _socketRotation; never serialized or exposed.\r\n private readonly _socketUp: Vector4;\r\n private readonly _socketForward: Vector4;\r\n private readonly _socketCos: Vector4;\r\n // Derived from the contact AO distances; never serialized or exposed.\r\n private readonly _contactAORange: Vector4;\r\n\r\n constructor() {\r\n super();\r\n this._irisCenter = new Vector4(0.5, 0.5, 0, 0);\r\n this._irisRadius = 0.22;\r\n this._irisDepth = 0.06;\r\n this._ior = 1.376;\r\n this._pupilRadius = 0.35;\r\n this._pupilDilation = 0;\r\n this._irisColor = new Vector4(1, 1, 1, 1);\r\n this._irisBrightness = 0.15;\r\n this._limbalRingWidth = 0.15;\r\n this._limbalRingStrength = 0.7;\r\n this._scleraColor = new Vector4(0.9, 0.88, 0.86, 1);\r\n this._scleraWrap = 0.35;\r\n this._scleraEdgeTint = new Vector4(0.55, 0.22, 0.18, 1);\r\n this._corneaSpecularStrength = 1;\r\n this._corneaRoughness = 0.05;\r\n this._socketRotation = new Vector4(0, 0, 0, 0);\r\n this._upperLidAngle = 50;\r\n this._lowerLidAngle = 65;\r\n this._socketOcclusionSoftness = 15;\r\n this._socketOcclusionStrength = 0.65;\r\n // Metric defaults for a ~12mm-radius eyeball in a one-unit-per-metre\r\n // scene. Assets authored at a different world scale must scale all three.\r\n this._contactAORadius = 0.006;\r\n this._contactAOMinDistance = 0.0004;\r\n this._contactAOMaxDistance = 0.006;\r\n this._contactAOStrength = 0.7;\r\n this._socketUp = new Vector4(0, 1, 0, 0);\r\n this._socketForward = new Vector4(0, 0, 1, 0);\r\n this._socketCos = new Vector4();\r\n this._contactAORange = new Vector4();\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_NORMAL, true);\r\n // Initialised explicitly: featureUsed() returns undefined for a feature\r\n // never touched, which would disagree with the serialization descriptor's\r\n // declared default and silently change assets on load.\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_TANGENT, false);\r\n this.useFeature(EyeMaterial.FEATURE_SOCKET_OCCLUSION, false);\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO, false);\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO_JITTER, false);\r\n }\r\n\r\n clone() {\r\n const other = new EyeMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.vertexNormal = other.vertexNormal;\r\n this.vertexTangent = other.vertexTangent;\r\n this.irisCenter = other.irisCenter;\r\n this.irisRadius = other.irisRadius;\r\n this.irisDepth = other.irisDepth;\r\n this.ior = other.ior;\r\n this.pupilRadius = other.pupilRadius;\r\n this.pupilDilation = other.pupilDilation;\r\n this.irisColor = other.irisColor;\r\n this.irisBrightness = other.irisBrightness;\r\n this.limbalRingWidth = other.limbalRingWidth;\r\n this.limbalRingStrength = other.limbalRingStrength;\r\n this.scleraColor = other.scleraColor;\r\n this.scleraWrap = other.scleraWrap;\r\n this.scleraEdgeTint = other.scleraEdgeTint;\r\n this.corneaSpecularStrength = other.corneaSpecularStrength;\r\n this.corneaRoughness = other.corneaRoughness;\r\n this.socketOcclusion = other.socketOcclusion;\r\n this.socketRotation = other.socketRotation;\r\n this.upperLidAngle = other.upperLidAngle;\r\n this.lowerLidAngle = other.lowerLidAngle;\r\n this.socketOcclusionSoftness = other.socketOcclusionSoftness;\r\n this.socketOcclusionStrength = other.socketOcclusionStrength;\r\n this.contactAO = other.contactAO;\r\n this.contactAORadius = other.contactAORadius;\r\n this.contactAOMinDistance = other.contactAOMinDistance;\r\n this.contactAOMaxDistance = other.contactAOMaxDistance;\r\n this.contactAOStrength = other.contactAOStrength;\r\n this.contactAOTemporalJitter = other.contactAOTemporalJitter;\r\n }\r\n\r\n /** true if vertex normal attribute presents */\r\n get vertexNormal() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_VERTEX_NORMAL);\r\n }\r\n set vertexNormal(val) {\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_NORMAL, !!val);\r\n }\r\n\r\n /**\r\n * true if vertex tangent attribute presents. Refraction needs a tangent\r\n * frame; without one the iris renders flat, with no parallax.\r\n */\r\n get vertexTangent() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_VERTEX_TANGENT);\r\n }\r\n set vertexTangent(val) {\r\n this.useFeature(EyeMaterial.FEATURE_VERTEX_TANGENT, !!val);\r\n }\r\n\r\n /** UV coordinate of the pupil centre. Only xy is used. */\r\n get irisCenter(): Immutable<Vector4> {\r\n return this._irisCenter;\r\n }\r\n set irisCenter(val: Immutable<Vector4>) {\r\n if (val && !this._irisCenter.equalsTo(val)) {\r\n this._irisCenter.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Iris disc radius, in UV units. */\r\n get irisRadius() {\r\n return this._irisRadius;\r\n }\r\n set irisRadius(val) {\r\n const next = Math.max(0.001, val ?? 0.001);\r\n if (next !== this._irisRadius) {\r\n this._irisRadius = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Depth of the iris plane below the corneal surface, in UV units - the\r\n * parallax strength. 0 is flat; 0.05-0.08 reads as a real anterior chamber.\r\n */\r\n get irisDepth() {\r\n return this._irisDepth;\r\n }\r\n set irisDepth(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._irisDepth) {\r\n this._irisDepth = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Index of refraction of the cornea. 1.376 is the physical value. */\r\n get ior() {\r\n return this._ior;\r\n }\r\n set ior(val) {\r\n const next = Math.max(1, val ?? 1);\r\n if (next !== this._ior) {\r\n this._ior = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Pupil radius as a fraction of the iris radius, at zero dilation. */\r\n get pupilRadius() {\r\n return this._pupilRadius;\r\n }\r\n set pupilRadius(val) {\r\n const next = Math.min(0.95, Math.max(0.01, val ?? 0.01));\r\n if (next !== this._pupilRadius) {\r\n this._pupilRadius = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Pupil dilation, -1 (fully constricted) to 1 (fully dilated). Animatable. */\r\n get pupilDilation() {\r\n return this._pupilDilation;\r\n }\r\n set pupilDilation(val) {\r\n const next = Math.min(1, Math.max(-1, val ?? 0));\r\n if (next !== this._pupilDilation) {\r\n this._pupilDilation = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Tint multiplied over the iris texture. */\r\n get irisColor(): Immutable<Vector4> {\r\n return this._irisColor;\r\n }\r\n set irisColor(val: Immutable<Vector4>) {\r\n if (val && !this._irisColor.equalsTo(val)) {\r\n this._irisColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Fake internal scattering that keeps the iris from going black in shadow. */\r\n get irisBrightness() {\r\n return this._irisBrightness;\r\n }\r\n set irisBrightness(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._irisBrightness) {\r\n this._irisBrightness = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Width of the dark ring at the iris edge, as a fraction of\r\n * {@link EyeMaterial.irisRadius} - relative, so resizing the iris keeps the\r\n * ring in proportion.\r\n */\r\n get limbalRingWidth() {\r\n return this._limbalRingWidth;\r\n }\r\n set limbalRingWidth(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._limbalRingWidth) {\r\n this._limbalRingWidth = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** How dark the limbal ring gets. 0 disables it. */\r\n get limbalRingStrength() {\r\n return this._limbalRingStrength;\r\n }\r\n set limbalRingStrength(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._limbalRingStrength) {\r\n this._limbalRingStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Base sclera colour. Pure white reads as plastic; keep it slightly warm. */\r\n get scleraColor(): Immutable<Vector4> {\r\n return this._scleraColor;\r\n }\r\n set scleraColor(val: Immutable<Vector4>) {\r\n if (val && !this._scleraColor.equalsTo(val)) {\r\n this._scleraColor.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Diffuse wrap for the sclera, standing in for its subsurface softness. */\r\n get scleraWrap() {\r\n return this._scleraWrap;\r\n }\r\n set scleraWrap(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._scleraWrap) {\r\n this._scleraWrap = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Colour bled into the sclera away from the iris, standing in for vasculature. */\r\n get scleraEdgeTint(): Immutable<Vector4> {\r\n return this._scleraEdgeTint;\r\n }\r\n set scleraEdgeTint(val: Immutable<Vector4>) {\r\n if (val && !this._scleraEdgeTint.equalsTo(val)) {\r\n this._scleraEdgeTint.set(val);\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Strength of the corneal highlight - the main cue that an eye is wet. */\r\n get corneaSpecularStrength() {\r\n return this._corneaSpecularStrength;\r\n }\r\n set corneaSpecularStrength(val) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._corneaSpecularStrength) {\r\n this._corneaSpecularStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Corneal roughness. Keep it very low; the cornea is close to a mirror. */\r\n get corneaRoughness() {\r\n return this._corneaRoughness;\r\n }\r\n set corneaRoughness(val) {\r\n const next = Math.min(1, Math.max(0.001, val ?? 0.001));\r\n if (next !== this._corneaRoughness) {\r\n this._corneaRoughness = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Enables eye-socket occlusion - the soft shadowing of the eyeball by the\r\n * eyelids and socket.\r\n *\r\n * @remarks\r\n * Analytic: an asymmetric aperture defined by\r\n * {@link EyeMaterial.upperLidAngle} and {@link EyeMaterial.lowerLidAngle}\r\n * around an axis fixed in the eyeball mesh's object space (rotatable via\r\n * {@link EyeMaterial.socketRotation}). Darkens ambient diffuse, ambient\r\n * specular and direct lights outside the aperture; no mask texture, extra\r\n * pass or per-frame scripting. Object space means the frame follows skinning\r\n * and node motion automatically, and vertical gaze drags the occlusion with\r\n * the eye - approximating how real upper lids follow it.\r\n */\r\n get socketOcclusion() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_SOCKET_OCCLUSION);\r\n }\r\n set socketOcclusion(val) {\r\n this.useFeature(EyeMaterial.FEATURE_SOCKET_OCCLUSION, !!val);\r\n }\r\n\r\n /**\r\n * Euler rotation (degrees, xyz) applied to the canonical socket frame.\r\n * At (0, 0, 0) the frame matches the documented asset convention: +Y towards\r\n * the upper lid, +Z along the gaze. Angles rather than unit vectors because\r\n * angles are the inspector-editable form.\r\n */\r\n get socketRotation(): Immutable<Vector4> {\r\n return this._socketRotation;\r\n }\r\n set socketRotation(val: Immutable<Vector4>) {\r\n if (val && !this._socketRotation.equalsTo(val)) {\r\n this._socketRotation.set(val);\r\n this.updateSocketFrame();\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Aperture half-angle towards the upper lid, in degrees from the socket up axis. */\r\n get upperLidAngle() {\r\n return this._upperLidAngle;\r\n }\r\n set upperLidAngle(val) {\r\n const next = Math.min(90, Math.max(5, val ?? 5));\r\n if (next !== this._upperLidAngle) {\r\n this._upperLidAngle = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Aperture half-angle towards the lower lid, in degrees. Defaults wider than\r\n * {@link EyeMaterial.upperLidAngle}; that asymmetry is what makes the\r\n * occlusion read as an eye socket.\r\n */\r\n get lowerLidAngle() {\r\n return this._lowerLidAngle;\r\n }\r\n set lowerLidAngle(val) {\r\n const next = Math.min(90, Math.max(5, val ?? 5));\r\n if (next !== this._lowerLidAngle) {\r\n this._lowerLidAngle = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Width of the lit-to-shadowed transition, in degrees. */\r\n get socketOcclusionSoftness() {\r\n return this._socketOcclusionSoftness;\r\n }\r\n set socketOcclusionSoftness(val) {\r\n const next = Math.min(45, Math.max(1, val ?? 1));\r\n if (next !== this._socketOcclusionSoftness) {\r\n this._socketOcclusionSoftness = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /** Overall socket occlusion strength, 0 to 1. */\r\n get socketOcclusionStrength() {\r\n return this._socketOcclusionStrength;\r\n }\r\n set socketOcclusionStrength(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._socketOcclusionStrength) {\r\n this._socketOcclusionStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Enables screen-space contact occlusion of the eyeball by whatever sits in\r\n * front of it - in practice the eyelid margin and the lashes.\r\n *\r\n * @remarks\r\n * Complements {@link EyeMaterial.socketOcclusion}: the socket aperture is an\r\n * analytic model of the lids, while this term reads the depth prepass and so\r\n * follows the real lid mesh - blinks, asymmetry and all. Dims the ambient\r\n * terms and the diffuse response of direct lights (whose shadow maps cannot\r\n * resolve the millimetre lid gap); direct specular is left untouched so the\r\n * corneal highlight survives.\r\n *\r\n * Requires a depth prepass. Forward+ always runs one; where none is bound the\r\n * term silently resolves to no occlusion.\r\n */\r\n get contactAO() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_CONTACT_AO);\r\n }\r\n set contactAO(val) {\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO, !!val);\r\n }\r\n\r\n /**\r\n * Radius of the contact occlusion disc, in world units - how far from the\r\n * lid the darkening reaches. Rescale for assets not authored at one unit per\r\n * metre; roughly half the eyeball radius is a good starting point.\r\n */\r\n get contactAORadius() {\r\n return this._contactAORadius;\r\n }\r\n set contactAORadius(val) {\r\n const next = Math.max(1e-6, val ?? 1e-6);\r\n if (next !== this._contactAORadius) {\r\n this._contactAORadius = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Smallest depth step that counts as an occluder, in world units. Raise it\r\n * until the eyeball stops shading itself. Compared against the eyeball's own\r\n * tangent plane rather than raw depth, so only residual curvature - not\r\n * view-dependent slope - has to clear it.\r\n */\r\n get contactAOMinDistance() {\r\n return this._contactAOMinDistance;\r\n }\r\n set contactAOMinDistance(val) {\r\n const next = Math.max(1e-6, val ?? 1e-6);\r\n if (next !== this._contactAOMinDistance) {\r\n this._contactAOMinDistance = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Largest depth step that counts as an occluder, in world units. Anything\r\n * further in front is unrelated geometry overlapping the eye on screen and\r\n * must not paint a shadow onto it - keep it at the order of the lid gap.\r\n * Forced to at least 4x {@link EyeMaterial.contactAOMinDistance} on upload\r\n * so the two smoothstep ramps cannot cross.\r\n */\r\n get contactAOMaxDistance() {\r\n return this._contactAOMaxDistance;\r\n }\r\n set contactAOMaxDistance(val) {\r\n const next = Math.max(1e-6, val ?? 1e-6);\r\n if (next !== this._contactAOMaxDistance) {\r\n this._contactAOMaxDistance = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Overall contact occlusion strength, 0 to 1. Calibrated so that 1 drives\r\n * the ambient terms to zero right at the contact line.\r\n */\r\n get contactAOStrength() {\r\n return this._contactAOStrength;\r\n }\r\n set contactAOStrength(val) {\r\n const next = Math.min(1, Math.max(0, val ?? 0));\r\n if (next !== this._contactAOStrength) {\r\n this._contactAOStrength = next;\r\n this.uniformChanged();\r\n }\r\n }\r\n\r\n /**\r\n * Advances the contact-occlusion noise pattern every frame so TAA can\r\n * integrate the grain away. Opt-in: without a temporal accumulator the\r\n * advancing pattern reads as flicker, worse than the static grain it\r\n * replaces. Enable it if and only if the pipeline resolves temporally.\r\n */\r\n get contactAOTemporalJitter() {\r\n return this.featureUsed<boolean>(EyeMaterial.FEATURE_CONTACT_AO_JITTER);\r\n }\r\n set contactAOTemporalJitter(val) {\r\n this.useFeature(EyeMaterial.FEATURE_CONTACT_AO_JITTER, !!val);\r\n }\r\n\r\n /**\r\n * Recomputes the object-space socket up/forward vectors from\r\n * {@link EyeMaterial.socketRotation}.\r\n *\r\n * @internal\r\n */\r\n private updateSocketFrame() {\r\n const d2r = Math.PI / 180;\r\n const rot = Quaternion.fromEulerAngle(\r\n this._socketRotation.x * d2r,\r\n this._socketRotation.y * d2r,\r\n this._socketRotation.z * d2r\r\n ).toMatrix3x3();\r\n const up = rot.transformVector(new Vector3(0, 1, 0));\r\n const forward = rot.transformVector(new Vector3(0, 0, 1));\r\n this._socketUp.setXYZW(up.x, up.y, up.z, 0);\r\n this._socketForward.setXYZW(forward.x, forward.y, forward.z, 0);\r\n }\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 if (this.socketOcclusion && this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n // The socket axes take the same transform chain as the normal\r\n // attribute - skin matrix, then normal matrix - so the occlusion stays\r\n // attached to the eye through node motion and skeletal animation.\r\n scope.zEyeSocketUp = pb.vec4().uniform(2);\r\n scope.zEyeSocketForward = pb.vec4().uniform(2);\r\n const skinMatrix = ShaderHelper.getSkinMatrix(scope);\r\n scope.$l.oSocketUp = skinMatrix\r\n ? pb.mul(skinMatrix, pb.vec4(scope.zEyeSocketUp.xyz, 0)).xyz\r\n : scope.zEyeSocketUp.xyz;\r\n scope.$l.oSocketForward = skinMatrix\r\n ? pb.mul(skinMatrix, pb.vec4(scope.zEyeSocketForward.xyz, 0)).xyz\r\n : scope.zEyeSocketForward.xyz;\r\n scope.$outputs.wSocketUp = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oSocketUp, 0)\r\n ).xyz;\r\n scope.$outputs.wSocketForward = pb.mul(\r\n ShaderHelper.getNormalMatrix(scope),\r\n pb.vec4(scope.oSocketForward, 0)\r\n ).xyz;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Fractional visibility of a world-space direction through the socket\r\n * aperture: 1 fully visible, approaching 0 towards the lids. Evaluated on\r\n * the surface normal, the reflection vector and light directions so all\r\n * lighting terms agree on where the lids are. The rear-hemisphere falloff\r\n * (`forLight`) applies to light directions only - applying it to surface\r\n * normals would paint the whole rear of a bare eyeball dark.\r\n *\r\n * @internal\r\n */\r\n private socketAperture(scope: PBInsideFunctionScope, dir: PBShaderExp, forLight: boolean) {\r\n const pb = scope.$builder;\r\n const funcName = forLight ? 'Z_eyeSocketApertureLight' : 'Z_eyeSocketApertureSurface';\r\n pb.func(funcName, [pb.vec3('dir'), pb.vec4('lidCos'), pb.float('strength')], function () {\r\n this.$l.up = pb.normalize(this.$inputs.wSocketUp);\r\n this.$l.lat = pb.dot(this.dir, this.up);\r\n // lidCos packs cos(angle +/- softness) per lid, precomputed on the CPU:\r\n // (upper outer, upper inner, lower outer, lower inner).\r\n this.$l.occUpper = pb.smoothStep(this.lidCos.x, this.lidCos.y, this.lat);\r\n this.$l.occLower = pb.smoothStep(this.lidCos.z, this.lidCos.w, pb.neg(this.lat));\r\n this.$l.visibility = pb.sub(1, pb.max(this.occUpper, this.occLower));\r\n if (forLight) {\r\n // Light from behind the eye's equator is blocked by the head itself;\r\n // the ramp straddles zero so the dimming eases in early.\r\n this.$l.forward = pb.normalize(this.$inputs.wSocketForward);\r\n this.visibility = pb.mul(this.visibility, pb.smoothStep(-0.4, 0.25, pb.dot(this.dir, this.forward)));\r\n }\r\n this.$return(pb.mix(pb.float(1), this.visibility, this.strength));\r\n });\r\n return pb.getGlobalScope()[funcName](dir, scope.zEyeSocketCos, scope.zEyeSocketStrength) as PBShaderExp;\r\n }\r\n\r\n /**\r\n * Fraction of the ambient hemisphere still reaching this fragment once the\r\n * geometry standing in front of the eyeball is accounted for: 1 open, 0 fully\r\n * buried under the lid.\r\n *\r\n * @remarks\r\n * Samples the depth prepass in a disc around the fragment and counts the taps\r\n * in front of the eyeball's own local tangent plane. Comparing against that\r\n * plane rather than raw depth cancels the surface's slope and foreshortening,\r\n * which is what lets the min/max thresholds be plain world-space distances.\r\n *\r\n * Must be called from uniform control flow - it takes screen-space\r\n * derivatives, which WGSL only permits there.\r\n *\r\n * @internal\r\n */\r\n private contactAOTerm(scope: PBInsideFunctionScope) {\r\n const pb = scope.$builder;\r\n if (!ShaderHelper.getLinearDepthTexture(scope)) {\r\n // No depth prepass bound for this pass. Forward+ always runs one, but a\r\n // material must not assume the pipeline it is drawn by.\r\n return pb.float(1);\r\n }\r\n const funcName = 'Z_eyeContactAO';\r\n const temporalJitter = !!this.contactAOTemporalJitter;\r\n pb.func(\r\n funcName,\r\n [pb.vec3('worldPos'), pb.vec4('range'), pb.float('radius'), pb.float('strength')],\r\n function () {\r\n this.$l.renderSize = ShaderHelper.getRenderSize(this);\r\n this.$l.viewPos = pb.mul(ShaderHelper.getViewMatrix(this), pb.vec4(this.worldPos, 1)).xyz;\r\n // Distance along the view axis, which is what the depth prepass writes\r\n // once scaled back up by the far plane.\r\n this.$l.centerZ = pb.neg(this.viewPos.z);\r\n // Derivatives first: the fade below returns early, and everything after\r\n // that early return is non-uniform control flow.\r\n this.$l.dzdx = pb.dpdx(this.centerZ);\r\n this.$l.dzdy = pb.dpdy(this.centerZ);\r\n // Project the world-space radius rather than reading the projection\r\n // matrix diagonal, so off-centre/oblique projections stay correct.\r\n this.$l.projMatrix = ShaderHelper.getProjectionMatrix(this);\r\n this.$l.h0 = pb.mul(this.projMatrix, pb.vec4(this.viewPos, 1));\r\n this.$l.h1 = pb.mul(this.projMatrix, pb.vec4(pb.add(this.viewPos, pb.vec3(this.radius, 0, 0)), 1));\r\n this.$l.pixelRadius = pb.min(\r\n pb.length(\r\n pb.mul(pb.sub(pb.div(this.h1.xy, this.h1.w), pb.div(this.h0.xy, this.h0.w)), 0.5, this.renderSize)\r\n ),\r\n CONTACT_AO_MAX_PIXEL_RADIUS\r\n );\r\n // A disc of only a couple of pixels is pure noise; fade it out rather\r\n // than sample it.\r\n this.$l.fade = pb.smoothStep(1.5, 4, this.pixelRadius);\r\n this.$if(pb.lessThanEqual(this.fade, 0), function () {\r\n this.$return(pb.float(1));\r\n });\r\n this.$l.screenUV = pb.div(this.$builtins.fragCoord.xy, this.renderSize);\r\n this.$l.far = ShaderHelper.getCameraParams(this).y;\r\n // Per-pixel rotation of the spiral breaks up banding. Static unless\r\n // temporal jitter is opted in (see contactAOTemporalJitter); the\r\n // framestamp is wrapped to keep the IGN math inside float precision.\r\n this.$l.frameId = temporalJitter\r\n ? pb.mod(pb.float(ShaderHelper.getFramestamp(this)), 64)\r\n : pb.float(0);\r\n this.$l.rotation = pb.mul(\r\n SSR_interleavedGradientNoise(this, this.$builtins.fragCoord.xy, this.frameId),\r\n Math.PI * 2\r\n );\r\n this.$l.occlusion = pb.float(0);\r\n this.$l.weightSum = pb.float(0);\r\n this.$for(pb.int('i'), 0, CONTACT_AO_SAMPLES, function () {\r\n this.$l.t = pb.div(pb.add(pb.float(this.i), 0.5), CONTACT_AO_SAMPLES);\r\n this.$l.angle = pb.add(this.rotation, pb.mul(pb.float(this.i), GOLDEN_ANGLE));\r\n // sqrt spreads the taps evenly over the disc. Without it they pile up\r\n // at the centre and the outer half of the radius goes unsampled.\r\n this.$l.offset = pb.mul(\r\n pb.vec2(pb.cos(this.angle), pb.sin(this.angle)),\r\n pb.mul(pb.sqrt(this.t), this.pixelRadius)\r\n );\r\n this.$l.sampleZ = pb.mul(\r\n ShaderHelper.sampleLinearDepth(\r\n this,\r\n ShaderHelper.getLinearDepthTexture(this),\r\n pb.add(this.screenUV, pb.div(this.offset, this.renderSize)),\r\n 0\r\n ),\r\n this.far\r\n );\r\n // Where the eyeball itself would be at this tap.\r\n this.$l.predicted = pb.add(\r\n this.centerZ,\r\n pb.mul(this.dzdx, this.offset.x),\r\n pb.mul(this.dzdy, this.offset.y)\r\n );\r\n this.$l.delta = pb.sub(this.predicted, this.sampleZ);\r\n // range packs (min in, min out, max in, max out), ordered on the CPU.\r\n // Under the near pair the step is the eyeball shading itself; over\r\n // the far pair it is unrelated geometry overlapping the eye on\r\n // screen, which must not paint a shadow onto it.\r\n this.$l.accept = pb.mul(\r\n pb.smoothStep(this.range.x, this.range.y, this.delta),\r\n pb.sub(1, pb.smoothStep(this.range.z, this.range.w, this.delta))\r\n );\r\n // Nearer taps occlude more, turning the lid edge into a gradient.\r\n // The slope is gentle on purpose: the lid signal lives on the outer\r\n // rim of the disc, which a steep falloff would discount.\r\n this.$l.falloff = pb.sub(1, pb.mul(this.t, 0.75));\r\n this.occlusion = pb.add(this.occlusion, pb.mul(this.accept, this.falloff));\r\n this.weightSum = pb.add(this.weightSum, this.falloff);\r\n });\r\n // Semi-disc calibration: a lid edge at the fragment covers at most half\r\n // the disc (the other half is the eyeball itself), so raw coverage tops\r\n // out near 0.5. Doubling maps that to full occlusion; the smoothstep's\r\n // low edge discards lone-stray-tap grain.\r\n this.$l.coverage = pb.smoothStep(\r\n 0.1,\r\n 0.9,\r\n pb.mul(pb.div(this.occlusion, pb.max(this.weightSum, 1e-4)), 2)\r\n );\r\n this.$l.ao = pb.sub(1, pb.mul(this.coverage, this.strength));\r\n this.$return(pb.mix(pb.float(1), this.ao, this.fade));\r\n }\r\n );\r\n const globalScope = pb.getGlobalScope();\r\n return globalScope[funcName](\r\n scope.$inputs.worldPos,\r\n scope.zEyeContactAORange,\r\n scope.zEyeContactAORadius,\r\n scope.zEyeContactAOStrength\r\n ) as PBShaderExp;\r\n }\r\n\r\n /**\r\n * Offsets the iris lookup to account for refraction through the cornea:\r\n * refracts the view direction in tangent space and walks the refracted ray\r\n * down to the iris plane. Falls back to the unmodified UV when there is no\r\n * tangent frame to refract in.\r\n *\r\n * @internal\r\n */\r\n private refractIrisUV(scope: PBInsideFunctionScope, uv: PBShaderExp, viewVec: PBShaderExp) {\r\n const pb = scope.$builder;\r\n if (!this.vertexTangent) {\r\n return uv;\r\n }\r\n const that = this;\r\n const funcName = 'Z_eyeRefractIrisUV';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('uv'), pb.vec3('viewVec'), pb.vec3('worldPos'), pb.float('depth'), pb.float('ior')],\r\n function () {\r\n this.$l.TBN = that.calculateTBN(\r\n this,\r\n this.worldPos,\r\n this.$inputs.wNorm,\r\n this.$inputs.wTangent,\r\n this.$inputs.wBinormal\r\n );\r\n // World -> tangent is the transpose of the (orthonormal) TBN.\r\n this.$l.vTangent = pb.normalize(\r\n pb.vec3(\r\n pb.dot(this.viewVec, this.TBN[0]),\r\n pb.dot(this.viewVec, this.TBN[1]),\r\n pb.dot(this.viewVec, this.TBN[2])\r\n )\r\n );\r\n // Incident direction points into the surface, hence the negation.\r\n this.$l.refracted = pb.refract(pb.neg(this.vTangent), pb.vec3(0, 0, 1), pb.div(1, this.ior));\r\n // Total internal reflection returns a zero vector; leave the UV alone.\r\n this.$if(pb.lessThan(pb.dot(this.refracted, this.refracted), 0.0001), function () {\r\n this.$return(this.uv);\r\n });\r\n // March to the iris plane. The guard keeps grazing angles, where the\r\n // ray runs nearly parallel to the plane, from exploding the offset.\r\n this.$l.travel = pb.div(this.depth, pb.max(pb.abs(this.refracted.z), 0.15));\r\n this.$return(pb.add(this.uv, pb.mul(this.refracted.xy, this.travel)));\r\n }\r\n );\r\n return pb\r\n .getGlobalScope()\r\n [funcName](uv, viewVec, scope.$inputs.worldPos, scope.zEyeIrisDepth, scope.zEyeIOR) as PBShaderExp;\r\n }\r\n\r\n /**\r\n * Rescales the iris radially so the pupil can open and close: a power curve\r\n * pinned at the iris edge moves the pupil boundary while the limbus stays\r\n * put, matching how a real iris deforms.\r\n *\r\n * @internal\r\n */\r\n private applyPupilDilation(scope: PBInsideFunctionScope, irisUV: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_eyeApplyPupilDilation';\r\n pb.func(funcName, [pb.vec2('irisUV'), pb.float('dilation')], function () {\r\n // Operates in iris-texture space, where the pupil sits at (0.5, 0.5) and\r\n // the iris rim is at radius 0.5.\r\n this.$l.delta = pb.sub(this.irisUV, pb.vec2(0.5));\r\n this.$l.dist = pb.length(this.delta);\r\n this.$if(pb.lessThan(this.dist, 0.00001), function () {\r\n this.$return(this.irisUV);\r\n });\r\n this.$l.norm = pb.clamp(pb.div(this.dist, 0.5), 0, 1);\r\n // Maps a display radius to the texture radius it samples: an exponent\r\n // above 1 samples further in, dilating the pupil. Pinned at norm = 1\r\n // either way, so dilation never disturbs the limbus.\r\n this.$l.exponent = pb.exp(pb.mul(this.dilation, 0.9));\r\n this.$l.remapped = pb.mul(pb.pow(this.norm, this.exponent), 0.5);\r\n this.$return(pb.add(pb.vec2(0.5), pb.mul(pb.div(this.delta, this.dist), this.remapped)));\r\n });\r\n return pb.getGlobalScope()[funcName](irisUV, scope.zEyePupilDilation) as PBShaderExp;\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 const litPass = this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT;\r\n if (litPass) {\r\n scope.zEyeIrisCenter = pb.vec4().uniform(2);\r\n scope.zEyeIrisRadius = pb.float().uniform(2);\r\n scope.zEyeIrisDepth = pb.float().uniform(2);\r\n scope.zEyeIOR = pb.float().uniform(2);\r\n scope.zEyePupilRadius = pb.float().uniform(2);\r\n scope.zEyePupilDilation = pb.float().uniform(2);\r\n scope.zEyeIrisColor = pb.vec4().uniform(2);\r\n scope.zEyeIrisBrightness = pb.float().uniform(2);\r\n scope.zEyeLimbalRingWidth = pb.float().uniform(2);\r\n scope.zEyeLimbalRingStrength = pb.float().uniform(2);\r\n scope.zEyeScleraColor = pb.vec4().uniform(2);\r\n scope.zEyeScleraWrap = pb.float().uniform(2);\r\n scope.zEyeScleraEdgeTint = pb.vec4().uniform(2);\r\n scope.zEyeCorneaSpecularStrength = pb.float().uniform(2);\r\n scope.zEyeCorneaRoughness = pb.float().uniform(2);\r\n if (this.socketOcclusion && this.vertexNormal) {\r\n scope.zEyeSocketCos = pb.vec4().uniform(2);\r\n scope.zEyeSocketStrength = pb.float().uniform(2);\r\n }\r\n if (this.contactAO) {\r\n scope.zEyeContactAORange = pb.vec4().uniform(2);\r\n scope.zEyeContactAORadius = pb.float().uniform(2);\r\n scope.zEyeContactAOStrength = pb.float().uniform(2);\r\n }\r\n }\r\n if (!litPass) {\r\n // Depth/shadow style passes only need coverage, not shading.\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(1));\r\n return;\r\n }\r\n\r\n // TBN[2] is the pre-normal-map geometric normal, needed for shadow normal\r\n // 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 scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.NoV = pb.clamp(pb.dot(scope.normal, scope.viewVec), 0.001, 1);\r\n\r\n // Surface UV drives the region split; the iris lookup is refracted from it.\r\n scope.$l.surfaceUV = this.hasIrisTexture()\r\n ? this.getIrisTexCoord(scope)\r\n : this.hasScleraTexture()\r\n ? this.getScleraTexCoord(scope)\r\n : pb.vec2(0.5);\r\n scope.$l.surfaceOffset = pb.sub(scope.surfaceUV, scope.zEyeIrisCenter.xy);\r\n scope.$l.surfaceDist = pb.length(scope.surfaceOffset);\r\n\r\n // Refract on the surface UV, then remap the iris disc onto the full iris\r\n // texture, which is authored as one iris filling the frame.\r\n scope.$l.refractedUV = this.refractIrisUV(scope, scope.surfaceUV, scope.viewVec);\r\n scope.$l.irisUV = pb.add(\r\n pb.vec2(0.5),\r\n pb.div(pb.sub(scope.refractedUV, scope.zEyeIrisCenter.xy), pb.mul(scope.zEyeIrisRadius, 2))\r\n );\r\n scope.irisUV = this.applyPupilDilation(scope, scope.irisUV);\r\n\r\n // Sclera.\r\n scope.$l.scleraAlbedo = scope.zEyeScleraColor.rgb;\r\n if (this.hasScleraTexture()) {\r\n scope.scleraAlbedo = pb.mul(scope.scleraAlbedo, this.sampleScleraTexture(scope, scope.surfaceUV).rgb);\r\n }\r\n // Vasculature reads strongest away from the iris.\r\n scope.$l.edgeAmount = pb.smoothStep(\r\n scope.zEyeIrisRadius,\r\n pb.add(scope.zEyeIrisRadius, 0.35),\r\n scope.surfaceDist\r\n );\r\n scope.scleraAlbedo = pb.mix(\r\n scope.scleraAlbedo,\r\n pb.mul(scope.scleraAlbedo, scope.zEyeScleraEdgeTint.rgb),\r\n pb.mul(scope.edgeAmount, scope.zEyeScleraEdgeTint.a)\r\n );\r\n\r\n // Iris.\r\n scope.$l.irisAlbedo = scope.zEyeIrisColor.rgb;\r\n if (this.hasIrisTexture()) {\r\n scope.irisAlbedo = pb.mul(scope.irisAlbedo, this.sampleIrisTexture(scope, scope.irisUV).rgb);\r\n }\r\n // Limbal ring, keyed off the surface radius so refraction cannot smear it.\r\n scope.$l.limbalWidth = pb.mul(scope.zEyeIrisRadius, scope.zEyeLimbalRingWidth);\r\n scope.$l.limbal = pb.smoothStep(\r\n pb.sub(scope.zEyeIrisRadius, scope.limbalWidth),\r\n scope.zEyeIrisRadius,\r\n scope.surfaceDist\r\n );\r\n scope.irisAlbedo = pb.mul(\r\n scope.irisAlbedo,\r\n pb.sub(1, pb.mul(scope.limbal, scope.zEyeLimbalRingStrength))\r\n );\r\n\r\n // Region blend. The transition is a fraction of the iris radius so it\r\n // scales with the eye instead of being a fixed UV distance.\r\n scope.$l.irisMask = pb.sub(\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(scope.zEyeIrisRadius, 0.97),\r\n pb.mul(scope.zEyeIrisRadius, 1.03),\r\n scope.surfaceDist\r\n )\r\n );\r\n scope.$l.albedo = pb.mix(scope.scleraAlbedo, scope.irisAlbedo, scope.irisMask);\r\n\r\n scope.$l.diffuseLighting = pb.vec3(0);\r\n scope.$l.specularLighting = pb.vec3(0);\r\n scope.$l.alphaRoughness = pb.mul(scope.zEyeCorneaRoughness, scope.zEyeCorneaRoughness);\r\n // Water/cornea reflectance at normal incidence.\r\n scope.$l.F0 = pb.vec3(0.04);\r\n scope.$l.F90 = pb.vec3(1);\r\n\r\n const socketOcc = !!this.socketOcclusion && !!this.vertexNormal;\r\n const baseLightPass = !this.drawContext.lightBlending;\r\n // Evaluated once at function scope: it takes screen-space derivatives\r\n // (uniform control flow only) and is view- but not light-dependent. Also\r\n // needed in additive light passes, since it dims direct diffuse too.\r\n scope.$l.contactAO = this.contactAO ? this.contactAOTerm(scope) : pb.float(1);\r\n if (this.needCalculateEnvLight() && baseLightPass) {\r\n // Socket occlusion: irradiance keyed off the surface normal, radiance\r\n // off the reflection vector, so a reflection ray aimed at the eyelid\r\n // dims even where the surface itself is open.\r\n scope.$l.envIrradiance = this.getEnvLightIrradiance(scope, scope.normal);\r\n if (socketOcc) {\r\n scope.envIrradiance = pb.mul(scope.envIrradiance, this.socketAperture(scope, scope.normal, false));\r\n }\r\n scope.envIrradiance = pb.mul(scope.envIrradiance, scope.contactAO);\r\n scope.diffuseLighting = pb.add(scope.diffuseLighting, scope.envIrradiance);\r\n scope.$l.reflectVec = this.calculateReflectionVector(scope, scope.normal, scope.viewVec);\r\n scope.$l.envFresnel = this.fresnelSchlick(scope, scope.NoV, scope.F0, scope.F90);\r\n scope.$l.envRadiance = pb.mul(\r\n this.getEnvLightRadiance(scope, scope.reflectVec, scope.zEyeCorneaRoughness),\r\n scope.envFresnel,\r\n scope.zEyeCorneaSpecularStrength\r\n );\r\n if (socketOcc) {\r\n scope.envRadiance = pb.mul(scope.envRadiance, this.socketAperture(scope, scope.reflectVec, false));\r\n }\r\n // The lid occludes the sky the cornea mirrors just as much as the sky\r\n // it diffuses.\r\n scope.envRadiance = pb.mul(scope.envRadiance, scope.contactAO);\r\n scope.specularLighting = pb.add(scope.specularLighting, scope.envRadiance);\r\n }\r\n\r\n this.forEachLight(scope, 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.$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 this.$inputs.worldPos,\r\n posRange,\r\n dirCutoff,\r\n extra\r\n );\r\n this.$l.rawNoL = pb.dot(this.normal, this.lightDir);\r\n this.$l.NoL = pb.clamp(this.rawNoL, 0, 1);\r\n // calculateShadow() samples with implicit derivatives, which WGSL only\r\n // permits in uniform control flow - so this must never sit inside a\r\n // dynamic branch.\r\n this.$l.shadowTerm = shadow\r\n ? that.calculateShadow(this, this.$inputs.worldPos, scope.normalInfo.TBN[2], pb.max(this.NoL, 1e-5))\r\n : pb.float(1);\r\n this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten, this.shadowTerm);\r\n if (socketOcc) {\r\n // A light arriving from outside the lid aperture is blocked before\r\n // it reaches the eyeball - a shadow map cannot resolve this, since\r\n // the lid sits inside any workable depth bias.\r\n this.lightColor = pb.mul(this.lightColor, that.socketAperture(this, this.lightDir, true));\r\n }\r\n // Wrapped diffuse only for the sclera; the iris is lit through the\r\n // cornea and stays comparatively crisp.\r\n this.$l.NoLWrap = pb.clamp(\r\n pb.div(pb.add(this.rawNoL, this.zEyeScleraWrap), pb.add(1, this.zEyeScleraWrap)),\r\n 0,\r\n 1\r\n );\r\n this.$l.diffuseTerm = pb.mix(this.NoLWrap, this.NoL, this.irisMask);\r\n // The contact term dims direct diffuse too, or the contact shadow\r\n // vanishes under direct lighting. Direct specular is left out: if the\r\n // light is visible from the fragment, its highlight should be as well.\r\n this.diffuseLighting = pb.add(\r\n this.diffuseLighting,\r\n pb.mul(this.lightColor, this.diffuseTerm, this.diffuseScale, this.contactAO)\r\n );\r\n\r\n this.$l.halfVec = pb.normalize(pb.add(this.lightDir, this.viewVec));\r\n this.$l.NoH = pb.clamp(pb.dot(this.normal, this.halfVec), 0, 1);\r\n this.$l.VoH = pb.clamp(pb.dot(this.viewVec, this.halfVec), 0, 1);\r\n this.$l.D = that.distributionGGX(this, this.NoH, this.alphaRoughness);\r\n this.$l.Vis = that.visGGX(this, this.NoV, this.NoL, this.alphaRoughness);\r\n this.$l.F = that.fresnelSchlick(this, this.VoH, this.F0, this.F90);\r\n this.specularLighting = pb.add(\r\n this.specularLighting,\r\n pb.mul(\r\n this.lightColor,\r\n this.F,\r\n pb.mul(this.D, this.Vis, this.NoL),\r\n this.zEyeCorneaSpecularStrength,\r\n this.specularScale\r\n )\r\n );\r\n });\r\n\r\n // Light that has entered the iris and bounced around inside it - without\r\n // this the iris crushes to black in shadow. Fed by environment\r\n // irradiance (already carrying the occlusion terms), scaled by\r\n // irisBrightness.\r\n scope.$l.irisEnvLight =\r\n baseLightPass && this.needCalculateEnvLight() ? scope.envIrradiance : pb.vec3(0);\r\n scope.$l.internal = pb.mul(scope.albedo, scope.irisEnvLight, scope.zEyeIrisBrightness, scope.irisMask);\r\n scope.$l.litColor = pb.add(\r\n pb.mul(scope.albedo, scope.diffuseLighting),\r\n scope.internal,\r\n scope.specularLighting\r\n );\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, 1));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (this.needFragmentColor(ctx) && ctx.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n bindGroup.setValue('zEyeIrisCenter', this._irisCenter);\r\n bindGroup.setValue('zEyeIrisRadius', this._irisRadius);\r\n bindGroup.setValue('zEyeIrisDepth', this._irisDepth);\r\n bindGroup.setValue('zEyeIOR', this._ior);\r\n bindGroup.setValue('zEyePupilRadius', this._pupilRadius);\r\n bindGroup.setValue('zEyePupilDilation', this._pupilDilation);\r\n bindGroup.setValue('zEyeIrisColor', this._irisColor);\r\n bindGroup.setValue('zEyeIrisBrightness', this._irisBrightness);\r\n bindGroup.setValue('zEyeLimbalRingWidth', this._limbalRingWidth);\r\n bindGroup.setValue('zEyeLimbalRingStrength', this._limbalRingStrength);\r\n bindGroup.setValue('zEyeScleraColor', this._scleraColor);\r\n bindGroup.setValue('zEyeScleraWrap', this._scleraWrap);\r\n bindGroup.setValue('zEyeScleraEdgeTint', this._scleraEdgeTint);\r\n bindGroup.setValue('zEyeCorneaSpecularStrength', this._corneaSpecularStrength);\r\n bindGroup.setValue('zEyeCorneaRoughness', this._corneaRoughness);\r\n if (this.socketOcclusion && this.vertexNormal) {\r\n const d2r = Math.PI / 180;\r\n const softness = this._socketOcclusionSoftness;\r\n // (upper outer, upper inner, lower outer, lower inner) - see\r\n // socketAperture. Clamped so the smoothstep edges never coincide.\r\n this._socketCos.setXYZW(\r\n Math.cos(Math.min(this._upperLidAngle + softness, 179) * d2r),\r\n Math.cos(Math.max(this._upperLidAngle - softness, 1) * d2r),\r\n Math.cos(Math.min(this._lowerLidAngle + softness, 179) * d2r),\r\n Math.cos(Math.max(this._lowerLidAngle - softness, 1) * d2r)\r\n );\r\n bindGroup.setValue('zEyeSocketUp', this._socketUp);\r\n bindGroup.setValue('zEyeSocketForward', this._socketForward);\r\n bindGroup.setValue('zEyeSocketCos', this._socketCos);\r\n bindGroup.setValue('zEyeSocketStrength', this._socketOcclusionStrength);\r\n }\r\n if (this.contactAO) {\r\n const minD = this._contactAOMinDistance;\r\n // The near pair ramps a tap in as an occluder, the far pair ramps it\r\n // back out as unrelated geometry. Widen the outer distance (never\r\n // clamp the inner one) to keep the two ramps from crossing.\r\n const maxD = Math.max(this._contactAOMaxDistance, minD * 4);\r\n // The far ramp starts at 0.75x rather than halfway: ramping out\r\n // earlier discounts the thicker parts of the lid margin.\r\n this._contactAORange.setXYZW(minD, minD * 2, maxD * 0.75, maxD);\r\n bindGroup.setValue('zEyeContactAORange', this._contactAORange);\r\n bindGroup.setValue('zEyeContactAORadius', this._contactAORadius);\r\n bindGroup.setValue('zEyeContactAOStrength', this._contactAOStrength);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["CONTACT_AO_SAMPLES","CONTACT_AO_MAX_PIXEL_RADIUS","GOLDEN_ANGLE","EyeMaterial","applyMaterialMixins","MeshMaterial","mixinLight","mixinPBRBRDF","mixinTextureProps","FEATURE_VERTEX_NORMAL","defineFeature","FEATURE_VERTEX_TANGENT","FEATURE_SOCKET_OCCLUSION","FEATURE_CONTACT_AO","FEATURE_CONTACT_AO_JITTER","_irisCenter","_irisRadius","_irisDepth","_ior","_pupilRadius","_pupilDilation","_irisColor","_irisBrightness","_limbalRingWidth","_limbalRingStrength","_scleraColor","_scleraWrap","_scleraEdgeTint","_corneaSpecularStrength","_corneaRoughness","_socketRotation","_upperLidAngle","_lowerLidAngle","_socketOcclusionSoftness","_socketOcclusionStrength","_contactAORadius","_contactAOMinDistance","_contactAOMaxDistance","_contactAOStrength","_socketUp","_socketForward","_socketCos","_contactAORange","Vector4","useFeature","clone","other","copyFrom","vertexNormal","vertexTangent","irisCenter","irisRadius","irisDepth","ior","pupilRadius","pupilDilation","irisColor","irisBrightness","limbalRingWidth","limbalRingStrength","scleraColor","scleraWrap","scleraEdgeTint","corneaSpecularStrength","corneaRoughness","socketOcclusion","socketRotation","upperLidAngle","lowerLidAngle","socketOcclusionSoftness","socketOcclusionStrength","contactAO","contactAORadius","contactAOMinDistance","contactAOMaxDistance","contactAOStrength","contactAOTemporalJitter","featureUsed","val","equalsTo","set","uniformChanged","next","Math","max","min","updateSocketFrame","d2r","PI","rot","Quaternion","fromEulerAngle","x","y","z","toMatrix3x3","up","transformVector","Vector3","forward","setXYZW","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","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","zEyeSocketUp","uniform","zEyeSocketForward","skinMatrix","getSkinMatrix","oSocketUp","oSocketForward","wSocketUp","wSocketForward","dir","forLight","funcName","func","vec3","float","normalize","$inputs","lat","dot","occUpper","smoothStep","lidCos","occLower","neg","visibility","sub","$return","mix","strength","getGlobalScope","zEyeSocketCos","zEyeSocketStrength","contactAOTerm","getLinearDepthTexture","temporalJitter","renderSize","getRenderSize","viewPos","getViewMatrix","centerZ","dzdx","dpdx","dzdy","dpdy","projMatrix","getProjectionMatrix","h0","h1","add","radius","pixelRadius","length","div","xy","fade","$if","lessThanEqual","screenUV","$builtins","fragCoord","far","getCameraParams","frameId","mod","getFramestamp","rotation","SSR_interleavedGradientNoise","occlusion","weightSum","$for","int","t","i","angle","offset","vec2","cos","sin","sqrt","sampleZ","sampleLinearDepth","predicted","delta","accept","range","falloff","coverage","ao","globalScope","zEyeContactAORange","zEyeContactAORadius","zEyeContactAOStrength","uv","viewVec","that","TBN","calculateTBN","vTangent","refracted","refract","lessThan","travel","depth","abs","zEyeIrisDepth","zEyeIOR","applyPupilDilation","irisUV","dist","norm","clamp","exponent","exp","dilation","remapped","pow","zEyePupilDilation","fragmentShader","needFragmentColorInput","litPass","zEyeIrisCenter","zEyeIrisRadius","zEyePupilRadius","zEyeIrisColor","zEyeIrisBrightness","zEyeLimbalRingWidth","zEyeLimbalRingStrength","zEyeScleraColor","zEyeScleraWrap","zEyeScleraEdgeTint","zEyeCorneaSpecularStrength","zEyeCorneaRoughness","outputFragmentColor","normalInfo","calculateNormalAndTBN","normal","calculateViewVector","NoV","surfaceUV","hasIrisTexture","getIrisTexCoord","hasScleraTexture","getScleraTexCoord","surfaceOffset","surfaceDist","refractedUV","refractIrisUV","scleraAlbedo","rgb","sampleScleraTexture","edgeAmount","a","irisAlbedo","sampleIrisTexture","limbalWidth","limbal","irisMask","albedo","diffuseLighting","specularLighting","alphaRoughness","F0","F90","socketOcc","baseLightPass","lightBlending","needCalculateEnvLight","envIrradiance","getEnvLightIrradiance","socketAperture","reflectVec","calculateReflectionVector","envFresnel","fresnelSchlick","envRadiance","getEnvLightRadiance","forEachLight","posRange","dirCutoff","colorIntensity","extra","shadow","diffuseScale","specularScale","equal","LIGHT_TYPE_POINT","lightAtten","calculateLightAttenuation","lightDir","calculateLightDirection","rawNoL","NoL","shadowTerm","calculateShadow","lightColor","NoLWrap","diffuseTerm","halfVec","NoH","VoH","D","distributionGGX","Vis","visGGX","F","irisEnvLight","internal","litColor","applyUniformValues","bindGroup","ctx","pass","needFragmentColor","setValue","softness","minD","maxD"],"mappings":"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"}
@@ -647,8 +647,7 @@ import { Vector3, Vector4 } from '@zephyr3d/base';
647
647
  *
648
648
  * @remarks
649
649
  * Stands in for the exact longitudinal term, which involves a Bessel function
650
- * and, in the energy-conserving formulation, `cosh` - and `cosh` is not
651
- * available on WebGL1 in this shader builder. The Gaussian is the
650
+ * and, in the energy-conserving formulation, `cosh`. The Gaussian is the
652
651
  * approximation Marschner's own paper offers and is what real-time
653
652
  * implementations use.
654
653
  * @internal
@@ -856,7 +855,7 @@ import { Vector3, Vector4 } from '@zephyr3d/base';
856
855
  this.specularScale = extra.y;
857
856
  });
858
857
  this.$l.lightAtten = that.calculateLightAttenuation(this, type, this.worldPos, posRange, dirCutoff, extra);
859
- this.$l.lightDir = that.calculateLightDirection(this, type, this.worldPos, posRange, dirCutoff);
858
+ this.$l.lightDir = that.calculateLightDirection(this, type, this.worldPos, posRange, dirCutoff, extra);
860
859
  this.$l.NoL = pb.dot(this.normal, this.lightDir);
861
860
  this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten);
862
861
  // Wrap diffuse softens the terminator across thin cards.