angular-three-soba 1.14.1 → 2.0.0-beta.11

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 (426) hide show
  1. package/README.md +2 -2
  2. package/abstractions/billboard/billboard.d.ts +28 -0
  3. package/abstractions/detailed/detailed.d.ts +26 -0
  4. package/abstractions/edges/edges.d.ts +34 -0
  5. package/abstractions/grid/grid.d.ts +50 -0
  6. package/abstractions/index.d.ts +6 -11
  7. package/abstractions/text/text.d.ts +82 -0
  8. package/abstractions/text-3d/text-3d.d.ts +81 -0
  9. package/cameras/{lib/camera → camera}/camera-content.d.ts +2 -2
  10. package/cameras/camera/camera.d.ts +26 -0
  11. package/cameras/cube-camera/cube-camera.d.ts +69 -0
  12. package/cameras/index.d.ts +4 -4
  13. package/cameras/orthographic-camera/orthographic-camera.d.ts +37 -0
  14. package/cameras/{lib/perspective-camera → perspective-camera}/perspective-camera.d.ts +10 -1
  15. package/controls/index.d.ts +1 -1
  16. package/controls/orbit-controls/orbit-controls.d.ts +54 -0
  17. package/esm2022/abstractions/angular-three-soba-abstractions.mjs +1 -1
  18. package/esm2022/abstractions/billboard/billboard.mjs +74 -0
  19. package/esm2022/abstractions/detailed/detailed.mjs +64 -0
  20. package/esm2022/abstractions/edges/edges.mjs +88 -0
  21. package/esm2022/abstractions/grid/grid.mjs +180 -0
  22. package/esm2022/abstractions/index.mjs +7 -12
  23. package/esm2022/abstractions/text/text.mjs +274 -0
  24. package/esm2022/abstractions/text-3d/text-3d.mjs +165 -0
  25. package/esm2022/angular-three-soba.mjs +1 -1
  26. package/esm2022/cameras/angular-three-soba-cameras.mjs +1 -1
  27. package/esm2022/cameras/camera/camera-content.mjs +20 -0
  28. package/esm2022/cameras/camera/camera.mjs +77 -0
  29. package/esm2022/cameras/cube-camera/cube-camera.mjs +161 -0
  30. package/esm2022/cameras/index.mjs +5 -5
  31. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +102 -0
  32. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +46 -0
  33. package/esm2022/controls/angular-three-soba-controls.mjs +1 -1
  34. package/esm2022/controls/index.mjs +2 -2
  35. package/esm2022/controls/orbit-controls/orbit-controls.mjs +181 -0
  36. package/esm2022/index.mjs +1 -1
  37. package/esm2022/loaders/angular-three-soba-loaders.mjs +1 -1
  38. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +30 -0
  39. package/esm2022/loaders/index.mjs +5 -6
  40. package/esm2022/loaders/loader/loader.mjs +138 -0
  41. package/esm2022/loaders/progress/progress.mjs +45 -0
  42. package/esm2022/loaders/texture-loader/texture-loader.mjs +28 -0
  43. package/esm2022/materials/angular-three-soba-materials.mjs +1 -1
  44. package/esm2022/materials/index.mjs +7 -6
  45. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +82 -0
  46. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +367 -0
  47. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +171 -0
  48. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +278 -0
  49. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
  50. package/esm2022/materials/point-material/point-material.mjs +46 -0
  51. package/esm2022/misc/angular-three-soba-misc.mjs +1 -1
  52. package/esm2022/misc/animations/animations.mjs +59 -0
  53. package/esm2022/misc/bake-shadows/bake-shadows.mjs +24 -0
  54. package/esm2022/misc/caustics/caustics.mjs +387 -0
  55. package/esm2022/misc/decal/decal.mjs +187 -0
  56. package/esm2022/misc/depth-buffer/depth-buffer.mjs +44 -0
  57. package/esm2022/misc/example/example.mjs +160 -0
  58. package/esm2022/misc/fbo/fbo.mjs +47 -0
  59. package/esm2022/misc/html/html-wrapper.mjs +478 -0
  60. package/esm2022/misc/html/html.mjs +304 -0
  61. package/esm2022/misc/index.mjs +14 -5
  62. package/esm2022/misc/sampler/sampler.mjs +142 -0
  63. package/esm2022/misc/shadow/shadow.mjs +111 -0
  64. package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
  65. package/esm2022/misc/trail/trail.mjs +209 -0
  66. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
  67. package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
  68. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
  69. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
  70. package/esm2022/modifiers/index.mjs +2 -0
  71. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
  72. package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
  73. package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
  74. package/esm2022/performances/index.mjs +6 -0
  75. package/esm2022/performances/points/points-input.mjs +64 -0
  76. package/esm2022/performances/points/points.mjs +329 -0
  77. package/esm2022/performances/points/position-point.mjs +54 -0
  78. package/esm2022/performances/segments/segment-object.mjs +9 -0
  79. package/esm2022/performances/segments/segments.mjs +182 -0
  80. package/esm2022/shaders/angular-three-soba-shaders.mjs +1 -1
  81. package/esm2022/shaders/blur-pass/blur-pass.mjs +61 -0
  82. package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
  83. package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
  84. package/esm2022/shaders/convolution-material/convolution-material.mjs +94 -0
  85. package/esm2022/shaders/discard-material/discard-material.mjs +3 -0
  86. package/esm2022/shaders/grid-material/grid-material.mjs +77 -0
  87. package/esm2022/shaders/index.mjs +18 -15
  88. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +56 -0
  89. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +223 -0
  90. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +170 -0
  91. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
  92. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +37 -0
  93. package/esm2022/shaders/shader-material/shader-material.mjs +34 -0
  94. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +25 -0
  95. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +33 -0
  96. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +86 -0
  97. package/esm2022/shaders/star-field-material/star-field-material.mjs +33 -0
  98. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
  99. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +267 -0
  100. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +108 -0
  101. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +206 -0
  102. package/esm2022/staging/angular-three-soba-staging.mjs +1 -1
  103. package/esm2022/staging/backdrop/backdrop.mjs +77 -0
  104. package/esm2022/staging/bb-anchor/bb-anchor.mjs +69 -0
  105. package/esm2022/staging/bounds/bounds.mjs +308 -0
  106. package/esm2022/staging/camera-shake/camera-shake.mjs +123 -0
  107. package/esm2022/staging/center/center.mjs +163 -0
  108. package/esm2022/staging/cloud/cloud.mjs +158 -0
  109. package/esm2022/staging/contact-shadows/contact-shadows.mjs +246 -0
  110. package/esm2022/staging/environment/assets.mjs +13 -0
  111. package/esm2022/staging/environment/environment-cube.mjs +47 -0
  112. package/esm2022/staging/environment/environment-ground.mjs +41 -0
  113. package/esm2022/staging/environment/environment-input.mjs +119 -0
  114. package/esm2022/staging/environment/environment-map.mjs +53 -0
  115. package/esm2022/staging/environment/environment-portal.mjs +113 -0
  116. package/esm2022/staging/environment/environment.mjs +61 -0
  117. package/esm2022/staging/environment/utils.mjs +105 -0
  118. package/esm2022/staging/float/float.mjs +94 -0
  119. package/esm2022/staging/index.mjs +22 -18
  120. package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
  121. package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
  122. package/esm2022/staging/sky/sky.mjs +119 -0
  123. package/esm2022/staging/sparkles/sparkles.mjs +164 -0
  124. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
  125. package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
  126. package/esm2022/staging/spot-light/spot-light-input.mjs +84 -0
  127. package/esm2022/staging/spot-light/spot-light.mjs +81 -0
  128. package/esm2022/staging/spot-light/volumetric-mesh.mjs +98 -0
  129. package/esm2022/staging/stage/stage.mjs +388 -0
  130. package/esm2022/staging/stars/stars.mjs +147 -0
  131. package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
  132. package/esm2022/staging/wireframe/wireframe.mjs +224 -0
  133. package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
  134. package/esm2022/utils/content/content.mjs +15 -0
  135. package/esm2022/utils/index.mjs +2 -0
  136. package/fesm2022/angular-three-soba-abstractions.mjs +668 -1882
  137. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  138. package/fesm2022/angular-three-soba-cameras.mjs +279 -232
  139. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  140. package/fesm2022/angular-three-soba-controls.mjs +104 -69
  141. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  142. package/fesm2022/angular-three-soba-loaders.mjs +177 -164
  143. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  144. package/fesm2022/angular-three-soba-materials.mjs +630 -482
  145. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  146. package/fesm2022/angular-three-soba-misc.mjs +2248 -122
  147. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  148. package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
  149. package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
  150. package/fesm2022/angular-three-soba-performances.mjs +697 -0
  151. package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
  152. package/fesm2022/angular-three-soba-shaders.mjs +554 -209
  153. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  154. package/fesm2022/angular-three-soba-staging.mjs +3230 -2852
  155. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  156. package/fesm2022/angular-three-soba-utils.mjs +22 -0
  157. package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
  158. package/fesm2022/angular-three-soba.mjs.map +1 -1
  159. package/loaders/gltf-loader/gltf-loader.d.ts +10 -0
  160. package/loaders/index.d.ts +4 -5
  161. package/loaders/loader/loader.d.ts +33 -0
  162. package/loaders/progress/progress.d.ts +9 -0
  163. package/loaders/texture-loader/texture-loader.d.ts +7 -0
  164. package/materials/index.d.ts +6 -5
  165. package/materials/mesh-distort-material/mesh-distort-material.d.ts +40 -0
  166. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +99 -0
  167. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +62 -0
  168. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +107 -0
  169. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +29 -0
  170. package/materials/point-material/point-material.d.ts +24 -0
  171. package/metadata.json +1 -0
  172. package/misc/animations/animations.d.ts +15 -0
  173. package/misc/{lib/bake-shadows → bake-shadows}/bake-shadows.d.ts +2 -5
  174. package/misc/caustics/caustics.d.ts +87 -0
  175. package/misc/decal/decal.d.ts +49 -0
  176. package/misc/depth-buffer/depth-buffer.d.ts +9 -0
  177. package/misc/example/example.d.ts +81 -0
  178. package/misc/{lib/fbo → fbo}/fbo.d.ts +4 -2
  179. package/misc/html/html-wrapper.d.ts +559 -0
  180. package/misc/html/html.d.ts +214 -0
  181. package/misc/index.d.ts +13 -4
  182. package/misc/sampler/sampler.d.ts +67 -0
  183. package/misc/shadow/shadow.d.ts +37 -0
  184. package/misc/stats-gl/stats-gl.d.ts +24 -0
  185. package/misc/trail/trail.d.ts +57 -0
  186. package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
  187. package/misc/trail-texture/trail-texture.d.ts +50 -0
  188. package/modifiers/README.md +3 -0
  189. package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
  190. package/modifiers/index.d.ts +1 -0
  191. package/package.json +43 -32
  192. package/performances/README.md +3 -0
  193. package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
  194. package/{performance/lib/adaptive → performances/adaptive-events}/adaptive-events.d.ts +5 -6
  195. package/performances/index.d.ts +5 -0
  196. package/performances/points/points-input.d.ts +32 -0
  197. package/performances/points/points.d.ts +92 -0
  198. package/performances/points/position-point.d.ts +11 -0
  199. package/performances/segments/segment-object.d.ts +7 -0
  200. package/performances/segments/segments.d.ts +124 -0
  201. package/shaders/{lib/blur-pass → blur-pass}/blur-pass.d.ts +2 -2
  202. package/shaders/grid-material/grid-material.d.ts +37 -0
  203. package/shaders/index.d.ts +17 -14
  204. package/shaders/{lib/mesh-distort-material → mesh-distort-material}/mesh-distort-material.d.ts +147 -2
  205. package/shaders/{lib/mesh-transmission-material → mesh-transmission-material}/mesh-transmission-material.d.ts +1 -1
  206. package/shaders/{lib/mesh-wobble-material → mesh-wobble-material}/mesh-wobble-material.d.ts +1 -0
  207. package/shaders/{lib/shader-material → shader-material}/shader-material.d.ts +2 -2
  208. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +19 -0
  209. package/shaders/sparkles-material/sparkles-material.d.ts +17 -0
  210. package/shaders/spot-light-material/spot-light-material.d.ts +13 -0
  211. package/shaders/star-field-material/star-field-material.d.ts +13 -0
  212. package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
  213. package/staging/accumulative-shadows/accumulative-shadows.d.ts +146 -0
  214. package/staging/{lib/accumulative-shadows → accumulative-shadows}/progressive-light-map.d.ts +2 -2
  215. package/staging/accumulative-shadows/randomized-lights.d.ts +90 -0
  216. package/staging/backdrop/backdrop.d.ts +30 -0
  217. package/staging/bb-anchor/bb-anchor.d.ts +27 -0
  218. package/staging/bounds/bounds.d.ts +134 -0
  219. package/staging/camera-shake/camera-shake.d.ts +43 -0
  220. package/staging/center/center.d.ts +70 -0
  221. package/staging/cloud/cloud.d.ts +51 -0
  222. package/staging/contact-shadows/contact-shadows.d.ts +70 -0
  223. package/staging/{lib/environment → environment}/assets.d.ts +9 -9
  224. package/staging/environment/environment-cube.d.ts +15 -0
  225. package/staging/environment/environment-ground.d.ts +13 -0
  226. package/staging/environment/environment-input.d.ts +68 -0
  227. package/staging/environment/environment-map.d.ts +16 -0
  228. package/staging/environment/environment-portal.d.ts +18 -0
  229. package/staging/{lib/environment → environment}/environment.d.ts +2 -6
  230. package/staging/environment/utils.d.ts +7 -0
  231. package/staging/float/float.d.ts +31 -0
  232. package/staging/index.d.ts +21 -17
  233. package/staging/matcap-texture/matcap-texture.d.ts +13 -0
  234. package/staging/normal-texture/normal-texture.d.ts +16 -0
  235. package/staging/sky/sky.d.ts +48 -0
  236. package/staging/sparkles/sparkles.d.ts +63 -0
  237. package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
  238. package/staging/spot-light/shadow-mesh.d.ts +37 -0
  239. package/staging/spot-light/spot-light-input.d.ts +38 -0
  240. package/staging/spot-light/spot-light.d.ts +39 -0
  241. package/staging/spot-light/volumetric-mesh.d.ts +24 -0
  242. package/staging/stage/stage.d.ts +130 -0
  243. package/staging/stars/stars.d.ts +45 -0
  244. package/staging/wireframe/wireframe-input.d.ts +65 -0
  245. package/staging/wireframe/wireframe.d.ts +28 -0
  246. package/utils/README.md +3 -0
  247. package/utils/content/content.d.ts +8 -0
  248. package/utils/index.d.ts +1 -0
  249. package/web-types.json +1 -0
  250. package/abstractions/lib/billboard/billboard.d.ts +0 -14
  251. package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +0 -15
  252. package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +0 -15
  253. package/abstractions/lib/edges/edges.d.ts +0 -18
  254. package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +0 -41
  255. package/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
  256. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -16
  257. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -24
  258. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -14
  259. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -15
  260. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -28
  261. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -21
  262. package/abstractions/lib/line/line-input.d.ts +0 -19
  263. package/abstractions/lib/line/line.d.ts +0 -21
  264. package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -19
  265. package/abstractions/lib/text/text.d.ts +0 -21
  266. package/abstractions/lib/text-3d/text-3d.d.ts +0 -39
  267. package/assets/default-spot-light-shadow.glsl +0 -10
  268. package/cameras/lib/camera/camera.d.ts +0 -19
  269. package/cameras/lib/cube-camera/cube-camera.d.ts +0 -27
  270. package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +0 -17
  271. package/controls/lib/orbit-controls/orbit-controls.d.ts +0 -27
  272. package/esm2022/abstractions/lib/billboard/billboard.mjs +0 -74
  273. package/esm2022/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -120
  274. package/esm2022/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -99
  275. package/esm2022/abstractions/lib/edges/edges.mjs +0 -96
  276. package/esm2022/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -213
  277. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
  278. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -92
  279. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -184
  280. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -46
  281. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -134
  282. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -195
  283. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -267
  284. package/esm2022/abstractions/lib/line/line-input.mjs +0 -76
  285. package/esm2022/abstractions/lib/line/line.mjs +0 -133
  286. package/esm2022/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
  287. package/esm2022/abstractions/lib/text/text.mjs +0 -115
  288. package/esm2022/abstractions/lib/text-3d/text-3d.mjs +0 -145
  289. package/esm2022/cameras/lib/camera/camera-content.mjs +0 -21
  290. package/esm2022/cameras/lib/camera/camera.mjs +0 -75
  291. package/esm2022/cameras/lib/cube-camera/cube-camera.mjs +0 -131
  292. package/esm2022/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -93
  293. package/esm2022/cameras/lib/perspective-camera/perspective-camera.mjs +0 -47
  294. package/esm2022/controls/lib/orbit-controls/orbit-controls.mjs +0 -147
  295. package/esm2022/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +0 -10
  296. package/esm2022/loaders/lib/gltf-loader/gltf-loader.mjs +0 -32
  297. package/esm2022/loaders/lib/loader/loader.mjs +0 -134
  298. package/esm2022/loaders/lib/progress/progress.mjs +0 -39
  299. package/esm2022/loaders/lib/texture-loader/texture-loader.mjs +0 -19
  300. package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -75
  301. package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -328
  302. package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -158
  303. package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -238
  304. package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
  305. package/esm2022/misc/lib/animations/animations.mjs +0 -52
  306. package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +0 -26
  307. package/esm2022/misc/lib/depth-buffer/depth-buffer.mjs +0 -39
  308. package/esm2022/misc/lib/fbo/fbo.mjs +0 -39
  309. package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
  310. package/esm2022/performance/index.mjs +0 -5
  311. package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +0 -47
  312. package/esm2022/performance/lib/adaptive/adaptive-events.mjs +0 -37
  313. package/esm2022/performance/lib/detailed/detailed.mjs +0 -54
  314. package/esm2022/performance/lib/stats/stats.mjs +0 -80
  315. package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +0 -61
  316. package/esm2022/shaders/lib/caustics-material/caustics-material.mjs +0 -128
  317. package/esm2022/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -33
  318. package/esm2022/shaders/lib/convolution-material/convolution-material.mjs +0 -94
  319. package/esm2022/shaders/lib/discard-material/discard-material.mjs +0 -3
  320. package/esm2022/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -55
  321. package/esm2022/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
  322. package/esm2022/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -169
  323. package/esm2022/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
  324. package/esm2022/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
  325. package/esm2022/shaders/lib/shader-material/shader-material.mjs +0 -34
  326. package/esm2022/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -33
  327. package/esm2022/shaders/lib/spot-light-material/spot-light-material.mjs +0 -86
  328. package/esm2022/shaders/lib/star-field-material/star-field-material.mjs +0 -32
  329. package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -249
  330. package/esm2022/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -108
  331. package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -201
  332. package/esm2022/staging/lib/bounds/bounds.mjs +0 -284
  333. package/esm2022/staging/lib/camera-shake/camera-shake.mjs +0 -122
  334. package/esm2022/staging/lib/caustics/caustics.mjs +0 -364
  335. package/esm2022/staging/lib/center/center.mjs +0 -143
  336. package/esm2022/staging/lib/cloud/cloud.mjs +0 -160
  337. package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +0 -228
  338. package/esm2022/staging/lib/environment/assets.mjs +0 -13
  339. package/esm2022/staging/lib/environment/environment-cube.mjs +0 -41
  340. package/esm2022/staging/lib/environment/environment-ground.mjs +0 -67
  341. package/esm2022/staging/lib/environment/environment-inputs.mjs +0 -87
  342. package/esm2022/staging/lib/environment/environment-map.mjs +0 -39
  343. package/esm2022/staging/lib/environment/environment-portal.mjs +0 -111
  344. package/esm2022/staging/lib/environment/environment.mjs +0 -165
  345. package/esm2022/staging/lib/environment/utils.mjs +0 -70
  346. package/esm2022/staging/lib/float/float.mjs +0 -77
  347. package/esm2022/staging/lib/sky/sky.mjs +0 -109
  348. package/esm2022/staging/lib/sparkles/sparkles.mjs +0 -210
  349. package/esm2022/staging/lib/spot-light/common.mjs +0 -42
  350. package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +0 -51
  351. package/esm2022/staging/lib/spot-light/spot-light-input.mjs +0 -62
  352. package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -74
  353. package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -126
  354. package/esm2022/staging/lib/spot-light/spot-light-shadow.mjs +0 -63
  355. package/esm2022/staging/lib/spot-light/spot-light.mjs +0 -117
  356. package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +0 -86
  357. package/esm2022/staging/lib/stage/stage.mjs +0 -368
  358. package/esm2022/staging/lib/stars/stars.mjs +0 -140
  359. package/fesm2022/angular-three-soba-performance.mjs +0 -210
  360. package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
  361. package/loaders/lib/cube-texture-loader/cube-texture-loader.d.ts +0 -3
  362. package/loaders/lib/gltf-loader/gltf-loader.d.ts +0 -8
  363. package/loaders/lib/loader/loader.d.ts +0 -26
  364. package/loaders/lib/progress/progress.d.ts +0 -16
  365. package/loaders/lib/texture-loader/texture-loader.d.ts +0 -5
  366. package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +0 -24
  367. package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +0 -41
  368. package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +0 -28
  369. package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +0 -46
  370. package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +0 -14
  371. package/misc/lib/animations/animations.d.ts +0 -13
  372. package/misc/lib/depth-buffer/depth-buffer.d.ts +0 -7
  373. package/performance/README.md +0 -3
  374. package/performance/index.d.ts +0 -4
  375. package/performance/lib/adaptive/adaptive-dpr.d.ts +0 -11
  376. package/performance/lib/detailed/detailed.d.ts +0 -13
  377. package/performance/lib/stats/stats.d.ts +0 -15
  378. package/plugin/README.md +0 -11
  379. package/plugin/generators.json +0 -19
  380. package/plugin/package.json +0 -9
  381. package/plugin/src/generators/init/compat.d.ts +0 -2
  382. package/plugin/src/generators/init/compat.js +0 -6
  383. package/plugin/src/generators/init/compat.js.map +0 -1
  384. package/plugin/src/generators/init/init.d.ts +0 -4
  385. package/plugin/src/generators/init/init.js +0 -22
  386. package/plugin/src/generators/init/init.js.map +0 -1
  387. package/plugin/src/generators/init/schema.json +0 -6
  388. package/plugin/src/index.d.ts +0 -1
  389. package/plugin/src/index.js +0 -6
  390. package/plugin/src/index.js.map +0 -1
  391. package/shaders/lib/soft-shadow-material/soft-shadow-material.d.ts +0 -10
  392. package/shaders/lib/spot-light-material/spot-light-material.d.ts +0 -4
  393. package/shaders/lib/star-field-material/star-field-material.d.ts +0 -3
  394. package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +0 -58
  395. package/staging/lib/accumulative-shadows/randomized-lights.d.ts +0 -42
  396. package/staging/lib/bounds/bounds.d.ts +0 -48
  397. package/staging/lib/camera-shake/camera-shake.d.ts +0 -28
  398. package/staging/lib/caustics/caustics.d.ts +0 -47
  399. package/staging/lib/center/center.d.ts +0 -40
  400. package/staging/lib/cloud/cloud.d.ts +0 -23
  401. package/staging/lib/contact-shadows/contact-shadows.d.ts +0 -29
  402. package/staging/lib/environment/environment-cube.d.ts +0 -11
  403. package/staging/lib/environment/environment-ground.d.ts +0 -9
  404. package/staging/lib/environment/environment-inputs.d.ts +0 -28
  405. package/staging/lib/environment/environment-map.d.ts +0 -10
  406. package/staging/lib/environment/environment-portal.d.ts +0 -15
  407. package/staging/lib/environment/utils.d.ts +0 -8
  408. package/staging/lib/float/float.d.ts +0 -16
  409. package/staging/lib/sky/sky.d.ts +0 -20
  410. package/staging/lib/sparkles/sparkles.d.ts +0 -29
  411. package/staging/lib/spot-light/common.d.ts +0 -3
  412. package/staging/lib/spot-light/shadow-mesh-input.d.ts +0 -14
  413. package/staging/lib/spot-light/spot-light-input.d.ts +0 -16
  414. package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +0 -14
  415. package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +0 -25
  416. package/staging/lib/spot-light/spot-light-shadow.d.ts +0 -6
  417. package/staging/lib/spot-light/spot-light.d.ts +0 -17
  418. package/staging/lib/spot-light/volumetric-mesh.d.ts +0 -15
  419. package/staging/lib/stage/stage.d.ts +0 -87
  420. package/staging/lib/stars/stars.d.ts +0 -20
  421. /package/shaders/{lib/caustics-material → caustics}/caustics-material.d.ts +0 -0
  422. /package/shaders/{lib/caustics-projection-material → caustics}/caustics-projection-material.d.ts +0 -0
  423. /package/shaders/{lib/convolution-material → convolution-material}/convolution-material.d.ts +0 -0
  424. /package/shaders/{lib/discard-material → discard-material}/discard-material.d.ts +0 -0
  425. /package/shaders/{lib/mesh-reflector-material → mesh-reflector-material}/mesh-reflector-material.d.ts +0 -0
  426. /package/shaders/{lib/mesh-refraction-material → mesh-refraction-material}/mesh-refraction-material.d.ts +0 -0
@@ -0,0 +1,170 @@
1
+ // Author: N8Programs
2
+ // https://github.com/N8python/diamonds
3
+ import * as THREE from 'three';
4
+ // @ts-expect-error: shaderIntersectFunction is available but typescript complains
5
+ import { MeshBVHUniformStruct, shaderIntersectFunction, shaderStructs } from 'three-mesh-bvh';
6
+ import { shaderMaterial } from '../shader-material/shader-material';
7
+ export const MeshRefractionMaterial = shaderMaterial({
8
+ envMap: null,
9
+ bounces: 3,
10
+ ior: 2.4,
11
+ correctMips: true,
12
+ aberrationStrength: 0.01,
13
+ fresnel: 0,
14
+ // @ts-expect-error: typing is not matched
15
+ bvh: new MeshBVHUniformStruct(),
16
+ color: new THREE.Color('white'),
17
+ resolution: new THREE.Vector2(),
18
+ viewMatrixInverse: new THREE.Matrix4(),
19
+ projectionMatrixInverse: new THREE.Matrix4(),
20
+ },
21
+ /*glsl*/ `
22
+ uniform mat4 viewMatrixInverse;
23
+
24
+ varying vec3 vWorldPosition;
25
+ varying vec3 vNormal;
26
+ varying mat4 vModelMatrixInverse;
27
+
28
+ #ifdef USE_INSTANCING_COLOR
29
+ varying vec3 vInstanceColor;
30
+ #endif
31
+
32
+ void main() {
33
+ vec4 transformedNormal = vec4(normal, 0.0);
34
+ vec4 transformedPosition = vec4(position, 1.0);
35
+ #ifdef USE_INSTANCING
36
+ transformedNormal = instanceMatrix * transformedNormal;
37
+ transformedPosition = instanceMatrix * transformedPosition;
38
+ #endif
39
+
40
+ #ifdef USE_INSTANCING
41
+ vModelMatrixInverse = inverse(modelMatrix * instanceMatrix);
42
+ #else
43
+ vModelMatrixInverse = inverse(modelMatrix);
44
+ #endif
45
+
46
+ #ifdef USE_INSTANCING_COLOR
47
+ vInstanceColor = instanceColor.rgb;
48
+ #endif
49
+
50
+ vWorldPosition = (modelMatrix * transformedPosition).xyz;
51
+ vNormal = normalize((viewMatrixInverse * vec4(normalMatrix * transformedNormal.xyz, 0.0)).xyz);
52
+ gl_Position = projectionMatrix * viewMatrix * modelMatrix * transformedPosition;
53
+ }`,
54
+ /*glsl*/ `
55
+ #define ENVMAP_TYPE_CUBE_UV
56
+ precision highp isampler2D;
57
+ precision highp usampler2D;
58
+ varying vec3 vWorldPosition;
59
+ varying vec3 vNormal;
60
+ varying mat4 vModelMatrixInverse;
61
+
62
+ #ifdef USE_INSTANCING_COLOR
63
+ varying vec3 vInstanceColor;
64
+ #endif
65
+
66
+ #ifdef ENVMAP_TYPE_CUBEM
67
+ uniform samplerCube envMap;
68
+ #else
69
+ uniform sampler2D envMap;
70
+ #endif
71
+
72
+ uniform float bounces;
73
+ ${shaderStructs}
74
+ ${shaderIntersectFunction}
75
+ uniform BVH bvh;
76
+ uniform float ior;
77
+ uniform bool correctMips;
78
+ uniform vec2 resolution;
79
+ uniform float fresnel;
80
+ uniform mat4 modelMatrix;
81
+ uniform mat4 projectionMatrixInverse;
82
+ uniform mat4 viewMatrixInverse;
83
+ uniform float aberrationStrength;
84
+ uniform vec3 color;
85
+
86
+ float fresnelFunc(vec3 viewDirection, vec3 worldNormal) {
87
+ return pow( 1.0 + dot( viewDirection, worldNormal), 10.0 );
88
+ }
89
+
90
+ vec3 totalInternalReflection(vec3 ro, vec3 rd, vec3 normal, float ior, mat4 modelMatrixInverse) {
91
+ vec3 rayOrigin = ro;
92
+ vec3 rayDirection = rd;
93
+ rayDirection = refract(rayDirection, normal, 1.0 / ior);
94
+ rayOrigin = vWorldPosition + rayDirection * 0.001;
95
+ rayOrigin = (modelMatrixInverse * vec4(rayOrigin, 1.0)).xyz;
96
+ rayDirection = normalize((modelMatrixInverse * vec4(rayDirection, 0.0)).xyz);
97
+ for(float i = 0.0; i < bounces; i++) {
98
+ uvec4 faceIndices = uvec4( 0u );
99
+ vec3 faceNormal = vec3( 0.0, 0.0, 1.0 );
100
+ vec3 barycoord = vec3( 0.0 );
101
+ float side = 1.0;
102
+ float dist = 0.0;
103
+ bvhIntersectFirstHit( bvh, rayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist );
104
+ vec3 hitPos = rayOrigin + rayDirection * max(dist - 0.001, 0.0);
105
+ vec3 tempDir = refract(rayDirection, faceNormal, ior);
106
+ if (length(tempDir) != 0.0) {
107
+ rayDirection = tempDir;
108
+ break;
109
+ }
110
+ rayDirection = reflect(rayDirection, faceNormal);
111
+ rayOrigin = hitPos + rayDirection * 0.01;
112
+ }
113
+ rayDirection = normalize((modelMatrix * vec4(rayDirection, 0.0)).xyz);
114
+ return rayDirection;
115
+ }
116
+
117
+ #include <common>
118
+ #include <cube_uv_reflection_fragment>
119
+
120
+ #ifdef ENVMAP_TYPE_CUBEM
121
+ vec4 textureGradient(samplerCube envMap, vec3 rayDirection, vec3 directionCamPerfect) {
122
+ return textureGrad(envMap, rayDirection, dFdx(correctMips ? directionCamPerfect: rayDirection), dFdy(correctMips ? directionCamPerfect: rayDirection));
123
+ }
124
+ #else
125
+ vec4 textureGradient(sampler2D envMap, vec3 rayDirection, vec3 directionCamPerfect) {
126
+ vec2 uvv = equirectUv( rayDirection );
127
+ vec2 smoothUv = equirectUv( directionCamPerfect );
128
+ return textureGrad(envMap, uvv, dFdx(correctMips ? smoothUv : uvv), dFdy(correctMips ? smoothUv : uvv));
129
+ }
130
+ #endif
131
+
132
+ void main() {
133
+ vec2 uv = gl_FragCoord.xy / resolution;
134
+ vec3 directionCamPerfect = (projectionMatrixInverse * vec4(uv * 2.0 - 1.0, 0.0, 1.0)).xyz;
135
+ directionCamPerfect = (viewMatrixInverse * vec4(directionCamPerfect, 0.0)).xyz;
136
+ directionCamPerfect = normalize(directionCamPerfect);
137
+ vec3 normal = vNormal;
138
+ vec3 rayOrigin = cameraPosition;
139
+ vec3 rayDirection = normalize(vWorldPosition - cameraPosition);
140
+ vec3 finalColor;
141
+ #ifdef CHROMATIC_ABERRATIONS
142
+ vec3 rayDirectionG = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior, 1.0), vModelMatrixInverse);
143
+ #ifdef FAST_CHROMA
144
+ vec3 rayDirectionR = normalize(rayDirectionG + 1.0 * vec3(aberrationStrength / 2.0));
145
+ vec3 rayDirectionB = normalize(rayDirectionG - 1.0 * vec3(aberrationStrength / 2.0));
146
+ #else
147
+ vec3 rayDirectionR = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior * (1.0 - aberrationStrength), 1.0), vModelMatrixInverse);
148
+ vec3 rayDirectionB = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior * (1.0 + aberrationStrength), 1.0), vModelMatrixInverse);
149
+ #endif
150
+ float finalColorR = textureGradient(envMap, rayDirectionR, directionCamPerfect).r;
151
+ float finalColorG = textureGradient(envMap, rayDirectionG, directionCamPerfect).g;
152
+ float finalColorB = textureGradient(envMap, rayDirectionB, directionCamPerfect).b;
153
+ finalColor = vec3(finalColorR, finalColorG, finalColorB);
154
+ #else
155
+ rayDirection = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior, 1.0), vModelMatrixInverse);
156
+ finalColor = textureGradient(envMap, rayDirection, directionCamPerfect).rgb;
157
+ #endif
158
+
159
+ finalColor *= color;
160
+ #ifdef USE_INSTANCING_COLOR
161
+ finalColor *= vInstanceColor;
162
+ #endif
163
+
164
+ vec3 viewDirection = normalize(vWorldPosition - cameraPosition);
165
+ float nFresnel = fresnelFunc(viewDirection, normal) * fresnel;
166
+ gl_FragColor = vec4(mix(finalColor, vec3(1.0), nFresnel), 1.0);
167
+ #include <tonemapping_fragment>
168
+ #include <${parseInt(THREE.REVISION.replace(/\D+/g, '')) >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>
169
+ }`);
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3NoYWRlcnMvc3JjL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbC9tZXNoLXJlZnJhY3Rpb24tbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCO0FBQ3JCLHVDQUF1QztBQUV2QyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixrRkFBa0Y7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxjQUFjLENBQ25EO0lBQ0MsTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsQ0FBQztJQUNWLEdBQUcsRUFBRSxHQUFHO0lBQ1IsV0FBVyxFQUFFLElBQUk7SUFDakIsa0JBQWtCLEVBQUUsSUFBSTtJQUN4QixPQUFPLEVBQUUsQ0FBQztJQUNWLDBDQUEwQztJQUMxQyxHQUFHLEVBQUUsSUFBSSxvQkFBb0IsRUFBRTtJQUMvQixLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUMvQixVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0lBQy9CLGlCQUFpQixFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtJQUN0Qyx1QkFBdUIsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7Q0FDNUM7QUFDRCxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBZ0NOO0FBQ0gsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBbUJOLGFBQWE7SUFDYix1QkFBdUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0JBOEZYLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxvQkFBb0I7SUFDOUcsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQXV0aG9yOiBOOFByb2dyYW1zXG4vLyBodHRwczovL2dpdGh1Yi5jb20vTjhweXRob24vZGlhbW9uZHNcblxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuLy8gQHRzLWV4cGVjdC1lcnJvcjogc2hhZGVySW50ZXJzZWN0RnVuY3Rpb24gaXMgYXZhaWxhYmxlIGJ1dCB0eXBlc2NyaXB0IGNvbXBsYWluc1xuaW1wb3J0IHsgTWVzaEJWSFVuaWZvcm1TdHJ1Y3QsIHNoYWRlckludGVyc2VjdEZ1bmN0aW9uLCBzaGFkZXJTdHJ1Y3RzIH0gZnJvbSAndGhyZWUtbWVzaC1idmgnO1xuaW1wb3J0IHsgc2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi9zaGFkZXItbWF0ZXJpYWwvc2hhZGVyLW1hdGVyaWFsJztcblxuZXhwb3J0IGNvbnN0IE1lc2hSZWZyYWN0aW9uTWF0ZXJpYWwgPSBzaGFkZXJNYXRlcmlhbChcblx0e1xuXHRcdGVudk1hcDogbnVsbCxcblx0XHRib3VuY2VzOiAzLFxuXHRcdGlvcjogMi40LFxuXHRcdGNvcnJlY3RNaXBzOiB0cnVlLFxuXHRcdGFiZXJyYXRpb25TdHJlbmd0aDogMC4wMSxcblx0XHRmcmVzbmVsOiAwLFxuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3I6IHR5cGluZyBpcyBub3QgbWF0Y2hlZFxuXHRcdGJ2aDogbmV3IE1lc2hCVkhVbmlmb3JtU3RydWN0KCksXG5cdFx0Y29sb3I6IG5ldyBUSFJFRS5Db2xvcignd2hpdGUnKSxcblx0XHRyZXNvbHV0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuXHRcdHZpZXdNYXRyaXhJbnZlcnNlOiBuZXcgVEhSRUUuTWF0cml4NCgpLFxuXHRcdHByb2plY3Rpb25NYXRyaXhJbnZlcnNlOiBuZXcgVEhSRUUuTWF0cml4NCgpLFxuXHR9LFxuXHQvKmdsc2wqLyBgXG4gIHVuaWZvcm0gbWF0NCB2aWV3TWF0cml4SW52ZXJzZTtcblxuICB2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4gIHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuICB2YXJ5aW5nIG1hdDQgdk1vZGVsTWF0cml4SW52ZXJzZTtcblxuICAjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1JcbiAgICB2YXJ5aW5nIHZlYzMgdkluc3RhbmNlQ29sb3I7XG4gICNlbmRpZlxuXG4gIHZvaWQgbWFpbigpIHtcbiAgICB2ZWM0IHRyYW5zZm9ybWVkTm9ybWFsID0gdmVjNChub3JtYWwsIDAuMCk7XG4gICAgdmVjNCB0cmFuc2Zvcm1lZFBvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICAjaWZkZWYgVVNFX0lOU1RBTkNJTkdcbiAgICAgIHRyYW5zZm9ybWVkTm9ybWFsID0gaW5zdGFuY2VNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDtcbiAgICAgIHRyYW5zZm9ybWVkUG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIHRyYW5zZm9ybWVkUG9zaXRpb247XG4gICAgI2VuZGlmXG5cbiAgICAjaWZkZWYgVVNFX0lOU1RBTkNJTkdcbiAgICAgIHZNb2RlbE1hdHJpeEludmVyc2UgPSBpbnZlcnNlKG1vZGVsTWF0cml4ICogaW5zdGFuY2VNYXRyaXgpO1xuICAgICNlbHNlXG4gICAgICB2TW9kZWxNYXRyaXhJbnZlcnNlID0gaW52ZXJzZShtb2RlbE1hdHJpeCk7XG4gICAgI2VuZGlmXG5cbiAgICAjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1JcbiAgICAgIHZJbnN0YW5jZUNvbG9yID0gaW5zdGFuY2VDb2xvci5yZ2I7XG4gICAgI2VuZGlmXG5cbiAgICB2V29ybGRQb3NpdGlvbiA9IChtb2RlbE1hdHJpeCAqIHRyYW5zZm9ybWVkUG9zaXRpb24pLnh5ejtcbiAgICB2Tm9ybWFsID0gbm9ybWFsaXplKCh2aWV3TWF0cml4SW52ZXJzZSAqIHZlYzQobm9ybWFsTWF0cml4ICogdHJhbnNmb3JtZWROb3JtYWwueHl6LCAwLjApKS54eXopO1xuICAgIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiBtb2RlbE1hdHJpeCAqIHRyYW5zZm9ybWVkUG9zaXRpb247XG4gIH1gLFxuXHQvKmdsc2wqLyBgXG4gICNkZWZpbmUgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuICBwcmVjaXNpb24gaGlnaHAgaXNhbXBsZXIyRDtcbiAgcHJlY2lzaW9uIGhpZ2hwIHVzYW1wbGVyMkQ7XG4gIHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiAgdmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4gIHZhcnlpbmcgbWF0NCB2TW9kZWxNYXRyaXhJbnZlcnNlO1xuXG4gICNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUlxuICAgIHZhcnlpbmcgdmVjMyB2SW5zdGFuY2VDb2xvcjtcbiAgI2VuZGlmXG5cbiAgI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVNXG4gICAgdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG4gICNlbHNlXG4gICAgdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuICAjZW5kaWZcblxuICB1bmlmb3JtIGZsb2F0IGJvdW5jZXM7XG4gICR7c2hhZGVyU3RydWN0c31cbiAgJHtzaGFkZXJJbnRlcnNlY3RGdW5jdGlvbn1cbiAgdW5pZm9ybSBCVkggYnZoO1xuICB1bmlmb3JtIGZsb2F0IGlvcjtcbiAgdW5pZm9ybSBib29sIGNvcnJlY3RNaXBzO1xuICB1bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjtcbiAgdW5pZm9ybSBmbG9hdCBmcmVzbmVsO1xuICB1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7XG4gIHVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4SW52ZXJzZTtcbiAgdW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXhJbnZlcnNlO1xuICB1bmlmb3JtIGZsb2F0IGFiZXJyYXRpb25TdHJlbmd0aDtcbiAgdW5pZm9ybSB2ZWMzIGNvbG9yO1xuXG4gIGZsb2F0IGZyZXNuZWxGdW5jKHZlYzMgdmlld0RpcmVjdGlvbiwgdmVjMyB3b3JsZE5vcm1hbCkge1xuICAgIHJldHVybiBwb3coIDEuMCArIGRvdCggdmlld0RpcmVjdGlvbiwgd29ybGROb3JtYWwpLCAxMC4wICk7XG4gIH1cblxuICB2ZWMzIHRvdGFsSW50ZXJuYWxSZWZsZWN0aW9uKHZlYzMgcm8sIHZlYzMgcmQsIHZlYzMgbm9ybWFsLCBmbG9hdCBpb3IsIG1hdDQgbW9kZWxNYXRyaXhJbnZlcnNlKSB7XG4gICAgdmVjMyByYXlPcmlnaW4gPSBybztcbiAgICB2ZWMzIHJheURpcmVjdGlvbiA9IHJkO1xuICAgIHJheURpcmVjdGlvbiA9IHJlZnJhY3QocmF5RGlyZWN0aW9uLCBub3JtYWwsIDEuMCAvIGlvcik7XG4gICAgcmF5T3JpZ2luID0gdldvcmxkUG9zaXRpb24gKyByYXlEaXJlY3Rpb24gKiAwLjAwMTtcbiAgICByYXlPcmlnaW4gPSAobW9kZWxNYXRyaXhJbnZlcnNlICogdmVjNChyYXlPcmlnaW4sIDEuMCkpLnh5ejtcbiAgICByYXlEaXJlY3Rpb24gPSBub3JtYWxpemUoKG1vZGVsTWF0cml4SW52ZXJzZSAqIHZlYzQocmF5RGlyZWN0aW9uLCAwLjApKS54eXopO1xuICAgIGZvcihmbG9hdCBpID0gMC4wOyBpIDwgYm91bmNlczsgaSsrKSB7XG4gICAgICB1dmVjNCBmYWNlSW5kaWNlcyA9IHV2ZWM0KCAwdSApO1xuICAgICAgdmVjMyBmYWNlTm9ybWFsID0gdmVjMyggMC4wLCAwLjAsIDEuMCApO1xuICAgICAgdmVjMyBiYXJ5Y29vcmQgPSB2ZWMzKCAwLjAgKTtcbiAgICAgIGZsb2F0IHNpZGUgPSAxLjA7XG4gICAgICBmbG9hdCBkaXN0ID0gMC4wO1xuICAgICAgYnZoSW50ZXJzZWN0Rmlyc3RIaXQoIGJ2aCwgcmF5T3JpZ2luLCByYXlEaXJlY3Rpb24sIGZhY2VJbmRpY2VzLCBmYWNlTm9ybWFsLCBiYXJ5Y29vcmQsIHNpZGUsIGRpc3QgKTtcbiAgICAgIHZlYzMgaGl0UG9zID0gcmF5T3JpZ2luICsgcmF5RGlyZWN0aW9uICogbWF4KGRpc3QgLSAwLjAwMSwgMC4wKTtcbiAgICAgIHZlYzMgdGVtcERpciA9IHJlZnJhY3QocmF5RGlyZWN0aW9uLCBmYWNlTm9ybWFsLCBpb3IpO1xuICAgICAgaWYgKGxlbmd0aCh0ZW1wRGlyKSAhPSAwLjApIHtcbiAgICAgICAgcmF5RGlyZWN0aW9uID0gdGVtcERpcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByYXlEaXJlY3Rpb24gPSByZWZsZWN0KHJheURpcmVjdGlvbiwgZmFjZU5vcm1hbCk7XG4gICAgICByYXlPcmlnaW4gPSBoaXRQb3MgKyByYXlEaXJlY3Rpb24gKiAwLjAxO1xuICAgIH1cbiAgICByYXlEaXJlY3Rpb24gPSBub3JtYWxpemUoKG1vZGVsTWF0cml4ICogdmVjNChyYXlEaXJlY3Rpb24sIDAuMCkpLnh5eik7XG4gICAgcmV0dXJuIHJheURpcmVjdGlvbjtcbiAgfVxuXG4gICNpbmNsdWRlIDxjb21tb24+XG4gICNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG5cbiAgI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVNXG4gICAgdmVjNCB0ZXh0dXJlR3JhZGllbnQoc2FtcGxlckN1YmUgZW52TWFwLCB2ZWMzIHJheURpcmVjdGlvbiwgdmVjMyBkaXJlY3Rpb25DYW1QZXJmZWN0KSB7XG4gICAgICByZXR1cm4gdGV4dHVyZUdyYWQoZW52TWFwLCByYXlEaXJlY3Rpb24sIGRGZHgoY29ycmVjdE1pcHMgPyBkaXJlY3Rpb25DYW1QZXJmZWN0OiByYXlEaXJlY3Rpb24pLCBkRmR5KGNvcnJlY3RNaXBzID8gZGlyZWN0aW9uQ2FtUGVyZmVjdDogcmF5RGlyZWN0aW9uKSk7XG4gICAgfVxuICAjZWxzZVxuICAgIHZlYzQgdGV4dHVyZUdyYWRpZW50KHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgcmF5RGlyZWN0aW9uLCB2ZWMzIGRpcmVjdGlvbkNhbVBlcmZlY3QpIHtcbiAgICAgIHZlYzIgdXZ2ID0gZXF1aXJlY3RVdiggcmF5RGlyZWN0aW9uICk7XG4gICAgICB2ZWMyIHNtb290aFV2ID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uQ2FtUGVyZmVjdCApO1xuICAgICAgcmV0dXJuIHRleHR1cmVHcmFkKGVudk1hcCwgdXZ2LCBkRmR4KGNvcnJlY3RNaXBzID8gc21vb3RoVXYgOiB1dnYpLCBkRmR5KGNvcnJlY3RNaXBzID8gc21vb3RoVXYgOiB1dnYpKTtcbiAgICB9XG4gICNlbmRpZlxuXG4gIHZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gZ2xfRnJhZ0Nvb3JkLnh5IC8gcmVzb2x1dGlvbjtcbiAgICB2ZWMzIGRpcmVjdGlvbkNhbVBlcmZlY3QgPSAocHJvamVjdGlvbk1hdHJpeEludmVyc2UgKiB2ZWM0KHV2ICogMi4wIC0gMS4wLCAwLjAsIDEuMCkpLnh5ejtcbiAgICBkaXJlY3Rpb25DYW1QZXJmZWN0ID0gKHZpZXdNYXRyaXhJbnZlcnNlICogdmVjNChkaXJlY3Rpb25DYW1QZXJmZWN0LCAwLjApKS54eXo7XG4gICAgZGlyZWN0aW9uQ2FtUGVyZmVjdCA9IG5vcm1hbGl6ZShkaXJlY3Rpb25DYW1QZXJmZWN0KTtcbiAgICB2ZWMzIG5vcm1hbCA9IHZOb3JtYWw7XG4gICAgdmVjMyByYXlPcmlnaW4gPSBjYW1lcmFQb3NpdGlvbjtcbiAgICB2ZWMzIHJheURpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uKTtcbiAgICB2ZWMzIGZpbmFsQ29sb3I7XG4gICAgI2lmZGVmIENIUk9NQVRJQ19BQkVSUkFUSU9OU1xuICAgICAgdmVjMyByYXlEaXJlY3Rpb25HID0gdG90YWxJbnRlcm5hbFJlZmxlY3Rpb24ocmF5T3JpZ2luLCByYXlEaXJlY3Rpb24sIG5vcm1hbCwgbWF4KGlvciwgMS4wKSwgdk1vZGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAjaWZkZWYgRkFTVF9DSFJPTUFcbiAgICAgICAgdmVjMyByYXlEaXJlY3Rpb25SID0gbm9ybWFsaXplKHJheURpcmVjdGlvbkcgKyAxLjAgKiB2ZWMzKGFiZXJyYXRpb25TdHJlbmd0aCAvIDIuMCkpO1xuICAgICAgICB2ZWMzIHJheURpcmVjdGlvbkIgPSBub3JtYWxpemUocmF5RGlyZWN0aW9uRyAtIDEuMCAqIHZlYzMoYWJlcnJhdGlvblN0cmVuZ3RoIC8gMi4wKSk7XG4gICAgICAjZWxzZVxuICAgICAgICB2ZWMzIHJheURpcmVjdGlvblIgPSB0b3RhbEludGVybmFsUmVmbGVjdGlvbihyYXlPcmlnaW4sIHJheURpcmVjdGlvbiwgbm9ybWFsLCBtYXgoaW9yICogKDEuMCAtIGFiZXJyYXRpb25TdHJlbmd0aCksIDEuMCksIHZNb2RlbE1hdHJpeEludmVyc2UpO1xuICAgICAgICB2ZWMzIHJheURpcmVjdGlvbkIgPSB0b3RhbEludGVybmFsUmVmbGVjdGlvbihyYXlPcmlnaW4sIHJheURpcmVjdGlvbiwgbm9ybWFsLCBtYXgoaW9yICogKDEuMCArIGFiZXJyYXRpb25TdHJlbmd0aCksIDEuMCksIHZNb2RlbE1hdHJpeEludmVyc2UpO1xuICAgICAgI2VuZGlmXG4gICAgICBmbG9hdCBmaW5hbENvbG9yUiA9IHRleHR1cmVHcmFkaWVudChlbnZNYXAsIHJheURpcmVjdGlvblIsIGRpcmVjdGlvbkNhbVBlcmZlY3QpLnI7XG4gICAgICBmbG9hdCBmaW5hbENvbG9yRyA9IHRleHR1cmVHcmFkaWVudChlbnZNYXAsIHJheURpcmVjdGlvbkcsIGRpcmVjdGlvbkNhbVBlcmZlY3QpLmc7XG4gICAgICBmbG9hdCBmaW5hbENvbG9yQiA9IHRleHR1cmVHcmFkaWVudChlbnZNYXAsIHJheURpcmVjdGlvbkIsIGRpcmVjdGlvbkNhbVBlcmZlY3QpLmI7XG4gICAgICBmaW5hbENvbG9yID0gdmVjMyhmaW5hbENvbG9yUiwgZmluYWxDb2xvckcsIGZpbmFsQ29sb3JCKTtcbiAgICAjZWxzZVxuICAgICAgcmF5RGlyZWN0aW9uID0gdG90YWxJbnRlcm5hbFJlZmxlY3Rpb24ocmF5T3JpZ2luLCByYXlEaXJlY3Rpb24sIG5vcm1hbCwgbWF4KGlvciwgMS4wKSwgdk1vZGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICBmaW5hbENvbG9yID0gdGV4dHVyZUdyYWRpZW50KGVudk1hcCwgcmF5RGlyZWN0aW9uLCBkaXJlY3Rpb25DYW1QZXJmZWN0KS5yZ2I7XG4gICAgI2VuZGlmXG5cbiAgICBmaW5hbENvbG9yICo9IGNvbG9yO1xuICAgICNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUlxuICAgICAgZmluYWxDb2xvciAqPSB2SW5zdGFuY2VDb2xvcjtcbiAgICAjZW5kaWZcblxuICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uKTtcbiAgICBmbG9hdCBuRnJlc25lbCA9IGZyZXNuZWxGdW5jKHZpZXdEaXJlY3Rpb24sIG5vcm1hbCkgKiBmcmVzbmVsO1xuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobWl4KGZpbmFsQ29sb3IsIHZlYzMoMS4wKSwgbkZyZXNuZWwpLCAxLjApO1xuICAgICNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cbiAgICAjaW5jbHVkZSA8JHtwYXJzZUludChUSFJFRS5SRVZJU0lPTi5yZXBsYWNlKC9cXEQrL2csICcnKSkgPj0gMTU0ID8gJ2NvbG9yc3BhY2VfZnJhZ21lbnQnIDogJ2VuY29kaW5nc19mcmFnbWVudCd9PlxuICB9YCxcbik7XG4iXX0=
@@ -0,0 +1,268 @@
1
+ import * as THREE from 'three';
2
+ export class MeshTransmissionMaterial extends THREE.MeshPhysicalMaterial {
3
+ constructor(samples = 6, transmissionSampler = false) {
4
+ super();
5
+ this.uniforms = {
6
+ chromaticAberration: { value: 0.05 },
7
+ // Transmission must always be 0, unless transmissionSampler is being used
8
+ transmission: { value: 0 },
9
+ // Instead a workaround is used, see below for reasons why
10
+ _transmission: { value: 1 },
11
+ transmissionMap: { value: null },
12
+ // Roughness is 1 in THREE.MeshPhysicalMaterial but it makes little sense in a transmission material
13
+ roughness: { value: 0 },
14
+ thickness: { value: 0 },
15
+ thicknessMap: { value: null },
16
+ attenuationDistance: { value: Infinity },
17
+ attenuationColor: { value: new THREE.Color('white') },
18
+ anisotropicBlur: { value: 0.1 },
19
+ time: { value: 0 },
20
+ distortion: { value: 0.0 },
21
+ distortionScale: { value: 0.5 },
22
+ temporalDistortion: { value: 0.0 },
23
+ buffer: { value: null },
24
+ };
25
+ this.onBeforeCompile = (shader) => {
26
+ shader.uniforms = {
27
+ ...shader.uniforms,
28
+ ...this.uniforms,
29
+ };
30
+ // If the transmission sampler is active inject a flag
31
+ if (transmissionSampler)
32
+ shader.defines['USE_SAMPLER'] = '';
33
+ // Otherwise we do use use .transmission and must therefore force USE_TRANSMISSION
34
+ // because threejs won't inject it for us
35
+ else
36
+ shader.defines['USE_TRANSMISSION'] = '';
37
+ // Head
38
+ shader.fragmentShader =
39
+ /*glsl*/ `
40
+ uniform float chromaticAberration;
41
+ uniform float anisotropicBlur;
42
+ uniform float time;
43
+ uniform float distortion;
44
+ uniform float distortionScale;
45
+ uniform float temporalDistortion;
46
+ uniform sampler2D buffer;
47
+
48
+ vec3 random3(vec3 c) {
49
+ float j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0)));
50
+ vec3 r;
51
+ r.z = fract(512.0*j);
52
+ j *= .125;
53
+ r.x = fract(512.0*j);
54
+ j *= .125;
55
+ r.y = fract(512.0*j);
56
+ return r-0.5;
57
+ }
58
+
59
+ float seed = 0.0;
60
+ uint hash( uint x ) {
61
+ x += ( x << 10u );
62
+ x ^= ( x >> 6u );
63
+ x += ( x << 3u );
64
+ x ^= ( x >> 11u );
65
+ x += ( x << 15u );
66
+ return x;
67
+ }
68
+
69
+ // Compound versions of the hashing algorithm I whipped together.
70
+ uint hash( uvec2 v ) { return hash( v.x ^ hash(v.y) ); }
71
+ uint hash( uvec3 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ); }
72
+ uint hash( uvec4 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ^ hash(v.w) ); }
73
+
74
+ // Construct a float with half-open range [0:1] using low 23 bits.
75
+ // All zeroes yields 0.0, all ones yields the next smallest representable value below 1.0.
76
+ float floatConstruct( uint m ) {
77
+ const uint ieeeMantissa = 0x007FFFFFu; // binary32 mantissa bitmask
78
+ const uint ieeeOne = 0x3F800000u; // 1.0 in IEEE binary32
79
+ m &= ieeeMantissa; // Keep only mantissa bits (fractional part)
80
+ m |= ieeeOne; // Add fractional part to 1.0
81
+ float f = uintBitsToFloat( m ); // Range [1:2]
82
+ return f - 1.0; // Range [0:1]
83
+ }
84
+
85
+ // Pseudo-random value in half-open range [0:1].
86
+ float random( float x ) { return floatConstruct(hash(floatBitsToUint(x))); }
87
+ float random( vec2 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
88
+ float random( vec3 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
89
+ float random( vec4 v ) { return floatConstruct(hash(floatBitsToUint(v))); }
90
+
91
+ float rand() {
92
+ float result = random(vec3(gl_FragCoord.xy, seed));
93
+ seed += 1.0;
94
+ return result;
95
+ }
96
+
97
+ const float F3 = 0.3333333;
98
+ const float G3 = 0.1666667;
99
+
100
+ float snoise(vec3 p) {
101
+ vec3 s = floor(p + dot(p, vec3(F3)));
102
+ vec3 x = p - s + dot(s, vec3(G3));
103
+ vec3 e = step(vec3(0.0), x - x.yzx);
104
+ vec3 i1 = e*(1.0 - e.zxy);
105
+ vec3 i2 = 1.0 - e.zxy*(1.0 - e);
106
+ vec3 x1 = x - i1 + G3;
107
+ vec3 x2 = x - i2 + 2.0*G3;
108
+ vec3 x3 = x - 1.0 + 3.0*G3;
109
+ vec4 w, d;
110
+ w.x = dot(x, x);
111
+ w.y = dot(x1, x1);
112
+ w.z = dot(x2, x2);
113
+ w.w = dot(x3, x3);
114
+ w = max(0.6 - w, 0.0);
115
+ d.x = dot(random3(s), x);
116
+ d.y = dot(random3(s + i1), x1);
117
+ d.z = dot(random3(s + i2), x2);
118
+ d.w = dot(random3(s + 1.0), x3);
119
+ w *= w;
120
+ w *= w;
121
+ d *= w;
122
+ return dot(d, vec4(52.0));
123
+ }
124
+
125
+ float snoiseFractal(vec3 m) {
126
+ return 0.5333333* snoise(m)
127
+ +0.2666667* snoise(2.0*m)
128
+ +0.1333333* snoise(4.0*m)
129
+ +0.0666667* snoise(8.0*m);
130
+ }\n` + shader.fragmentShader;
131
+ // Remove transmission
132
+ shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_pars_fragment>',
133
+ /*glsl*/ `
134
+ #ifdef USE_TRANSMISSION
135
+ // Transmission code is based on glTF-Sampler-Viewer
136
+ // https://github.com/KhronosGroup/glTF-Sample-Viewer
137
+ uniform float _transmission;
138
+ uniform float thickness;
139
+ uniform float attenuationDistance;
140
+ uniform vec3 attenuationColor;
141
+ #ifdef USE_TRANSMISSIONMAP
142
+ uniform sampler2D transmissionMap;
143
+ #endif
144
+ #ifdef USE_THICKNESSMAP
145
+ uniform sampler2D thicknessMap;
146
+ #endif
147
+ uniform vec2 transmissionSamplerSize;
148
+ uniform sampler2D transmissionSamplerMap;
149
+ uniform mat4 modelMatrix;
150
+ uniform mat4 projectionMatrix;
151
+ varying vec3 vWorldPosition;
152
+ vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {
153
+ // Direction of refracted light.
154
+ vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );
155
+ // Compute rotation-independant scaling of the model matrix.
156
+ vec3 modelScale;
157
+ modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );
158
+ modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );
159
+ modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );
160
+ // The thickness is specified in local space.
161
+ return normalize( refractionVector ) * thickness * modelScale;
162
+ }
163
+ float applyIorToRoughness( const in float roughness, const in float ior ) {
164
+ // Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and
165
+ // an IOR of 1.5 results in the default amount of microfacet refraction.
166
+ return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );
167
+ }
168
+ vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {
169
+ float framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );
170
+ #ifdef USE_SAMPLER
171
+ #ifdef texture2DLodEXT
172
+ return texture2DLodEXT(transmissionSamplerMap, fragCoord.xy, framebufferLod);
173
+ #else
174
+ return texture2D(transmissionSamplerMap, fragCoord.xy, framebufferLod);
175
+ #endif
176
+ #else
177
+ return texture2D(buffer, fragCoord.xy);
178
+ #endif
179
+ }
180
+ vec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {
181
+ if ( isinf( attenuationDistance ) ) {
182
+ // Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all.
183
+ return radiance;
184
+ } else {
185
+ // Compute light attenuation using Beer's law.
186
+ vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;
187
+ vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); // Beer's law
188
+ return transmittance * radiance;
189
+ }
190
+ }
191
+ vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,
192
+ const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,
193
+ const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,
194
+ const in vec3 attenuationColor, const in float attenuationDistance ) {
195
+ vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );
196
+ vec3 refractedRayExit = position + transmissionRay;
197
+ // Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
198
+ vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
199
+ vec2 refractionCoords = ndcPos.xy / ndcPos.w;
200
+ refractionCoords += 1.0;
201
+ refractionCoords /= 2.0;
202
+ // Sample framebuffer to get pixel the refracted ray hits.
203
+ vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
204
+ vec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );
205
+ // Get the specular component.
206
+ vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );
207
+ return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );
208
+ }
209
+ #endif\n`);
210
+ // Add refraction
211
+ shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_fragment>',
212
+ /*glsl*/ `
213
+ // Improve the refraction to use the world pos
214
+ material.transmission = _transmission;
215
+ material.transmissionAlpha = 1.0;
216
+ material.thickness = thickness;
217
+ material.attenuationDistance = attenuationDistance;
218
+ material.attenuationColor = attenuationColor;
219
+ #ifdef USE_TRANSMISSIONMAP
220
+ material.transmission *= texture2D( transmissionMap, vUv ).r;
221
+ #endif
222
+ #ifdef USE_THICKNESSMAP
223
+ material.thickness *= texture2D( thicknessMap, vUv ).g;
224
+ #endif
225
+
226
+ vec3 pos = vWorldPosition;
227
+ vec3 v = normalize( cameraPosition - pos );
228
+ vec3 n = inverseTransformDirection( normal, viewMatrix );
229
+ vec3 transmission = vec3(0.0);
230
+ float transmissionR, transmissionB, transmissionG;
231
+ float randomCoords = rand();
232
+ float thickness_smear = thickness * max(pow(roughnessFactor, 0.33), anisotropicBlur);
233
+ vec3 distortionNormal = vec3(0.0);
234
+ vec3 temporalOffset = vec3(time, -time, -time) * temporalDistortion;
235
+ if (distortion > 0.0) {
236
+ distortionNormal = distortion * vec3(snoiseFractal(vec3((pos * distortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * distortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * distortionScale + temporalOffset)));
237
+ }
238
+ for (float i = 0.0; i < ${samples}.0; i ++) {
239
+ vec3 sampleNorm = normalize(n + roughnessFactor * roughnessFactor * 2.0 * normalize(vec3(rand() - 0.5, rand() - 0.5, rand() - 0.5)) * pow(rand(), 0.33) + distortionNormal);
240
+ transmissionR = getIBLVolumeRefraction(
241
+ sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
242
+ pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
243
+ material.attenuationColor, material.attenuationDistance
244
+ ).r;
245
+ transmissionG = getIBLVolumeRefraction(
246
+ sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
247
+ pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + chromaticAberration * (i + randomCoords) / float(${samples})) , material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
248
+ material.attenuationColor, material.attenuationDistance
249
+ ).g;
250
+ transmissionB = getIBLVolumeRefraction(
251
+ sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
252
+ pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * chromaticAberration * (i + randomCoords) / float(${samples})), material.thickness + thickness_smear * (i + randomCoords) / float(${samples}),
253
+ material.attenuationColor, material.attenuationDistance
254
+ ).b;
255
+ transmission.r += transmissionR;
256
+ transmission.g += transmissionG;
257
+ transmission.b += transmissionB;
258
+ }
259
+ transmission /= ${samples}.0;
260
+ totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n`);
261
+ };
262
+ Object.keys(this.uniforms).forEach((name) => Object.defineProperty(this, name, {
263
+ get: () => this.uniforms[name].value,
264
+ set: (v) => (this.uniforms[name].value = v),
265
+ }));
266
+ }
267
+ }
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc2hhZGVycy9zcmMvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwvbWVzaC10cmFuc21pc3Npb24tbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFNL0IsTUFBTSxPQUFPLHdCQUF5QixTQUFRLEtBQUssQ0FBQyxvQkFBb0I7SUFtQnZFLFlBQVksT0FBTyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBQ25ELEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNmLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUNwQywwRUFBMEU7WUFDMUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMxQiwwREFBMEQ7WUFDMUQsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMzQixlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ2hDLG9HQUFvRztZQUNwRyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDdkIsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUM3QixtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDeEMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3JELGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0IsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQzFCLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0Isa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7U0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxNQUE2RCxFQUFFLEVBQUU7WUFDeEYsTUFBTSxDQUFDLFFBQVEsR0FBRztnQkFDakIsR0FBRyxNQUFNLENBQUMsUUFBUTtnQkFDbEIsR0FBRyxJQUFJLENBQUMsUUFBUTthQUNoQixDQUFDO1lBRUYsc0RBQXNEO1lBQ3RELElBQUksbUJBQW1CO2dCQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVELGtGQUFrRjtZQUNsRix5Q0FBeUM7O2dCQUNwQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRTdDLE9BQU87WUFDUCxNQUFNLENBQUMsY0FBYztnQkFDcEIsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBMkZILEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztZQUVoQyxzQkFBc0I7WUFDdEIsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FDcEQsdUNBQXVDO1lBQ3ZDLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkE0RUksQ0FDYixDQUFDO1lBRUYsaUJBQWlCO1lBQ2pCLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQ3BELGtDQUFrQztZQUNsQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQTBCcUIsT0FBTzs7OzsrSUFJc0csT0FBTzs7Ozs7c0lBS2hCLE9BQU8sMEVBQTBFLE9BQU87Ozs7OzJJQUtuRixPQUFPLHlFQUF5RSxPQUFPOzs7Ozs7OzBCQU94TSxPQUFPO3VGQUNzRCxDQUNuRixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQ2pDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQWtDLENBQUMsQ0FBQyxLQUFLO1lBQ2xFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQWtDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ3pFLENBQUMsQ0FDRixDQUFDO0lBQ0gsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5pbnRlcmZhY2UgVW5pZm9ybTxUPiB7XG5cdHZhbHVlOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgTWVzaFRyYW5zbWlzc2lvbk1hdGVyaWFsIGV4dGVuZHMgVEhSRUUuTWVzaFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR1bmlmb3Jtczoge1xuXHRcdGNocm9tYXRpY0FiZXJyYXRpb246IFVuaWZvcm08bnVtYmVyPjtcblx0XHR0cmFuc21pc3Npb246IFVuaWZvcm08bnVtYmVyPjtcblx0XHR0cmFuc21pc3Npb25NYXA6IFVuaWZvcm08VEhSRUUuVGV4dHVyZSB8IG51bGw+O1xuXHRcdF90cmFuc21pc3Npb246IFVuaWZvcm08bnVtYmVyPjtcblx0XHR0aGlja25lc3M6IFVuaWZvcm08bnVtYmVyPjtcblx0XHRyb3VnaG5lc3M6IFVuaWZvcm08bnVtYmVyPjtcblx0XHR0aGlja25lc3NNYXA6IFVuaWZvcm08VEhSRUUuVGV4dHVyZSB8IG51bGw+O1xuXHRcdGF0dGVudWF0aW9uRGlzdGFuY2U6IFVuaWZvcm08bnVtYmVyPjtcblx0XHRhdHRlbnVhdGlvbkNvbG9yOiBVbmlmb3JtPFRIUkVFLkNvbG9yPjtcblx0XHRhbmlzb3Ryb3BpY0JsdXI6IFVuaWZvcm08bnVtYmVyPjtcblx0XHR0aW1lOiBVbmlmb3JtPG51bWJlcj47XG5cdFx0ZGlzdG9ydGlvbjogVW5pZm9ybTxudW1iZXI+O1xuXHRcdGRpc3RvcnRpb25TY2FsZTogVW5pZm9ybTxudW1iZXI+O1xuXHRcdHRlbXBvcmFsRGlzdG9ydGlvbjogVW5pZm9ybTxudW1iZXI+O1xuXHRcdGJ1ZmZlcjogVW5pZm9ybTxUSFJFRS5UZXh0dXJlIHwgbnVsbD47XG5cdH07XG5cblx0Y29uc3RydWN0b3Ioc2FtcGxlcyA9IDYsIHRyYW5zbWlzc2lvblNhbXBsZXIgPSBmYWxzZSkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnVuaWZvcm1zID0ge1xuXHRcdFx0Y2hyb21hdGljQWJlcnJhdGlvbjogeyB2YWx1ZTogMC4wNSB9LFxuXHRcdFx0Ly8gVHJhbnNtaXNzaW9uIG11c3QgYWx3YXlzIGJlIDAsIHVubGVzcyB0cmFuc21pc3Npb25TYW1wbGVyIGlzIGJlaW5nIHVzZWRcblx0XHRcdHRyYW5zbWlzc2lvbjogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Ly8gSW5zdGVhZCBhIHdvcmthcm91bmQgaXMgdXNlZCwgc2VlIGJlbG93IGZvciByZWFzb25zIHdoeVxuXHRcdFx0X3RyYW5zbWlzc2lvbjogeyB2YWx1ZTogMSB9LFxuXHRcdFx0dHJhbnNtaXNzaW9uTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHQvLyBSb3VnaG5lc3MgaXMgMSBpbiBUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbCBidXQgaXQgbWFrZXMgbGl0dGxlIHNlbnNlIGluIGEgdHJhbnNtaXNzaW9uIG1hdGVyaWFsXG5cdFx0XHRyb3VnaG5lc3M6IHsgdmFsdWU6IDAgfSxcblx0XHRcdHRoaWNrbmVzczogeyB2YWx1ZTogMCB9LFxuXHRcdFx0dGhpY2tuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRhdHRlbnVhdGlvbkRpc3RhbmNlOiB7IHZhbHVlOiBJbmZpbml0eSB9LFxuXHRcdFx0YXR0ZW51YXRpb25Db2xvcjogeyB2YWx1ZTogbmV3IFRIUkVFLkNvbG9yKCd3aGl0ZScpIH0sXG5cdFx0XHRhbmlzb3Ryb3BpY0JsdXI6IHsgdmFsdWU6IDAuMSB9LFxuXHRcdFx0dGltZTogeyB2YWx1ZTogMCB9LFxuXHRcdFx0ZGlzdG9ydGlvbjogeyB2YWx1ZTogMC4wIH0sXG5cdFx0XHRkaXN0b3J0aW9uU2NhbGU6IHsgdmFsdWU6IDAuNSB9LFxuXHRcdFx0dGVtcG9yYWxEaXN0b3J0aW9uOiB7IHZhbHVlOiAwLjAgfSxcblx0XHRcdGJ1ZmZlcjogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdH07XG5cblx0XHR0aGlzLm9uQmVmb3JlQ29tcGlsZSA9IChzaGFkZXI6IFRIUkVFLlNoYWRlciAmIHsgZGVmaW5lczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9KSA9PiB7XG5cdFx0XHRzaGFkZXIudW5pZm9ybXMgPSB7XG5cdFx0XHRcdC4uLnNoYWRlci51bmlmb3Jtcyxcblx0XHRcdFx0Li4udGhpcy51bmlmb3Jtcyxcblx0XHRcdH07XG5cblx0XHRcdC8vIElmIHRoZSB0cmFuc21pc3Npb24gc2FtcGxlciBpcyBhY3RpdmUgaW5qZWN0IGEgZmxhZ1xuXHRcdFx0aWYgKHRyYW5zbWlzc2lvblNhbXBsZXIpIHNoYWRlci5kZWZpbmVzWydVU0VfU0FNUExFUiddID0gJyc7XG5cdFx0XHQvLyBPdGhlcndpc2Ugd2UgZG8gdXNlIHVzZSAudHJhbnNtaXNzaW9uIGFuZCBtdXN0IHRoZXJlZm9yZSBmb3JjZSBVU0VfVFJBTlNNSVNTSU9OXG5cdFx0XHQvLyBiZWNhdXNlIHRocmVlanMgd29uJ3QgaW5qZWN0IGl0IGZvciB1c1xuXHRcdFx0ZWxzZSBzaGFkZXIuZGVmaW5lc1snVVNFX1RSQU5TTUlTU0lPTiddID0gJyc7XG5cblx0XHRcdC8vIEhlYWRcblx0XHRcdHNoYWRlci5mcmFnbWVudFNoYWRlciA9XG5cdFx0XHRcdC8qZ2xzbCovIGBcbiAgICAgIHVuaWZvcm0gZmxvYXQgY2hyb21hdGljQWJlcnJhdGlvbjtcbiAgICAgIHVuaWZvcm0gZmxvYXQgYW5pc290cm9waWNCbHVyO1xuICAgICAgdW5pZm9ybSBmbG9hdCB0aW1lO1xuICAgICAgdW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uO1xuICAgICAgdW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uU2NhbGU7XG4gICAgICB1bmlmb3JtIGZsb2F0IHRlbXBvcmFsRGlzdG9ydGlvbjtcbiAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIGJ1ZmZlcjtcblxuICAgICAgdmVjMyByYW5kb20zKHZlYzMgYykge1xuICAgICAgICBmbG9hdCBqID0gNDA5Ni4wKnNpbihkb3QoYyx2ZWMzKDE3LjAsIDU5LjQsIDE1LjApKSk7XG4gICAgICAgIHZlYzMgcjtcbiAgICAgICAgci56ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIGogKj0gLjEyNTtcbiAgICAgICAgci54ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIGogKj0gLjEyNTtcbiAgICAgICAgci55ID0gZnJhY3QoNTEyLjAqaik7XG4gICAgICAgIHJldHVybiByLTAuNTtcbiAgICAgIH1cblxuICAgICAgZmxvYXQgc2VlZCA9IDAuMDtcbiAgICAgIHVpbnQgaGFzaCggdWludCB4ICkge1xuICAgICAgICB4ICs9ICggeCA8PCAxMHUgKTtcbiAgICAgICAgeCBePSAoIHggPj4gIDZ1ICk7XG4gICAgICAgIHggKz0gKCB4IDw8ICAzdSApO1xuICAgICAgICB4IF49ICggeCA+PiAxMXUgKTtcbiAgICAgICAgeCArPSAoIHggPDwgMTV1ICk7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wb3VuZCB2ZXJzaW9ucyBvZiB0aGUgaGFzaGluZyBhbGdvcml0aG0gSSB3aGlwcGVkIHRvZ2V0aGVyLlxuICAgICAgdWludCBoYXNoKCB1dmVjMiB2ICkgeyByZXR1cm4gaGFzaCggdi54IF4gaGFzaCh2LnkpICAgICAgICAgICAgICAgICAgICAgICAgICk7IH1cbiAgICAgIHVpbnQgaGFzaCggdXZlYzMgdiApIHsgcmV0dXJuIGhhc2goIHYueCBeIGhhc2godi55KSBeIGhhc2godi56KSAgICAgICAgICAgICApOyB9XG4gICAgICB1aW50IGhhc2goIHV2ZWM0IHYgKSB7IHJldHVybiBoYXNoKCB2LnggXiBoYXNoKHYueSkgXiBoYXNoKHYueikgXiBoYXNoKHYudykgKTsgfVxuXG4gICAgICAvLyBDb25zdHJ1Y3QgYSBmbG9hdCB3aXRoIGhhbGYtb3BlbiByYW5nZSBbMDoxXSB1c2luZyBsb3cgMjMgYml0cy5cbiAgICAgIC8vIEFsbCB6ZXJvZXMgeWllbGRzIDAuMCwgYWxsIG9uZXMgeWllbGRzIHRoZSBuZXh0IHNtYWxsZXN0IHJlcHJlc2VudGFibGUgdmFsdWUgYmVsb3cgMS4wLlxuICAgICAgZmxvYXQgZmxvYXRDb25zdHJ1Y3QoIHVpbnQgbSApIHtcbiAgICAgICAgY29uc3QgdWludCBpZWVlTWFudGlzc2EgPSAweDAwN0ZGRkZGdTsgLy8gYmluYXJ5MzIgbWFudGlzc2EgYml0bWFza1xuICAgICAgICBjb25zdCB1aW50IGllZWVPbmUgICAgICA9IDB4M0Y4MDAwMDB1OyAvLyAxLjAgaW4gSUVFRSBiaW5hcnkzMlxuICAgICAgICBtICY9IGllZWVNYW50aXNzYTsgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIG9ubHkgbWFudGlzc2EgYml0cyAoZnJhY3Rpb25hbCBwYXJ0KVxuICAgICAgICBtIHw9IGllZWVPbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgZnJhY3Rpb25hbCBwYXJ0IHRvIDEuMFxuICAgICAgICBmbG9hdCAgZiA9IHVpbnRCaXRzVG9GbG9hdCggbSApOyAgICAgICAvLyBSYW5nZSBbMToyXVxuICAgICAgICByZXR1cm4gZiAtIDEuMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYW5nZSBbMDoxXVxuICAgICAgfVxuXG4gICAgICAvLyBQc2V1ZG8tcmFuZG9tIHZhbHVlIGluIGhhbGYtb3BlbiByYW5nZSBbMDoxXS5cbiAgICAgIGZsb2F0IHJhbmRvbSggZmxvYXQgeCApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHgpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjMiAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjMyAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cbiAgICAgIGZsb2F0IHJhbmRvbSggdmVjNCAgdiApIHsgcmV0dXJuIGZsb2F0Q29uc3RydWN0KGhhc2goZmxvYXRCaXRzVG9VaW50KHYpKSk7IH1cblxuICAgICAgZmxvYXQgcmFuZCgpIHtcbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gcmFuZG9tKHZlYzMoZ2xfRnJhZ0Nvb3JkLnh5LCBzZWVkKSk7XG4gICAgICAgIHNlZWQgKz0gMS4wO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmbG9hdCBGMyA9ICAwLjMzMzMzMzM7XG4gICAgICBjb25zdCBmbG9hdCBHMyA9ICAwLjE2NjY2Njc7XG5cbiAgICAgIGZsb2F0IHNub2lzZSh2ZWMzIHApIHtcbiAgICAgICAgdmVjMyBzID0gZmxvb3IocCArIGRvdChwLCB2ZWMzKEYzKSkpO1xuICAgICAgICB2ZWMzIHggPSBwIC0gcyArIGRvdChzLCB2ZWMzKEczKSk7XG4gICAgICAgIHZlYzMgZSA9IHN0ZXAodmVjMygwLjApLCB4IC0geC55engpO1xuICAgICAgICB2ZWMzIGkxID0gZSooMS4wIC0gZS56eHkpO1xuICAgICAgICB2ZWMzIGkyID0gMS4wIC0gZS56eHkqKDEuMCAtIGUpO1xuICAgICAgICB2ZWMzIHgxID0geCAtIGkxICsgRzM7XG4gICAgICAgIHZlYzMgeDIgPSB4IC0gaTIgKyAyLjAqRzM7XG4gICAgICAgIHZlYzMgeDMgPSB4IC0gMS4wICsgMy4wKkczO1xuICAgICAgICB2ZWM0IHcsIGQ7XG4gICAgICAgIHcueCA9IGRvdCh4LCB4KTtcbiAgICAgICAgdy55ID0gZG90KHgxLCB4MSk7XG4gICAgICAgIHcueiA9IGRvdCh4MiwgeDIpO1xuICAgICAgICB3LncgPSBkb3QoeDMsIHgzKTtcbiAgICAgICAgdyA9IG1heCgwLjYgLSB3LCAwLjApO1xuICAgICAgICBkLnggPSBkb3QocmFuZG9tMyhzKSwgeCk7XG4gICAgICAgIGQueSA9IGRvdChyYW5kb20zKHMgKyBpMSksIHgxKTtcbiAgICAgICAgZC56ID0gZG90KHJhbmRvbTMocyArIGkyKSwgeDIpO1xuICAgICAgICBkLncgPSBkb3QocmFuZG9tMyhzICsgMS4wKSwgeDMpO1xuICAgICAgICB3ICo9IHc7XG4gICAgICAgIHcgKj0gdztcbiAgICAgICAgZCAqPSB3O1xuICAgICAgICByZXR1cm4gZG90KGQsIHZlYzQoNTIuMCkpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBzbm9pc2VGcmFjdGFsKHZlYzMgbSkge1xuICAgICAgICByZXR1cm4gMC41MzMzMzMzKiBzbm9pc2UobSlcbiAgICAgICAgICAgICAgKzAuMjY2NjY2Nyogc25vaXNlKDIuMCptKVxuICAgICAgICAgICAgICArMC4xMzMzMzMzKiBzbm9pc2UoNC4wKm0pXG4gICAgICAgICAgICAgICswLjA2NjY2NjcqIHNub2lzZSg4LjAqbSk7XG4gICAgICB9XFxuYCArIHNoYWRlci5mcmFnbWVudFNoYWRlcjtcblxuXHRcdFx0Ly8gUmVtb3ZlIHRyYW5zbWlzc2lvblxuXHRcdFx0c2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG5cdFx0XHRcdCcjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ+Jyxcblx0XHRcdFx0LypnbHNsKi8gYFxuICAgICAgICAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuICAgICAgICAgIC8vIFRyYW5zbWlzc2lvbiBjb2RlIGlzIGJhc2VkIG9uIGdsVEYtU2FtcGxlci1WaWV3ZXJcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYtU2FtcGxlLVZpZXdlclxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgX3RyYW5zbWlzc2lvbjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IHRoaWNrbmVzcztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2U7XG4gICAgICAgICAgdW5pZm9ybSB2ZWMzIGF0dGVudWF0aW9uQ29sb3I7XG4gICAgICAgICAgI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcbiAgICAgICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvbk1hcDtcbiAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAjaWZkZWYgVVNFX1RISUNLTkVTU01BUFxuICAgICAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdGhpY2tuZXNzTWFwO1xuICAgICAgICAgICNlbmRpZlxuICAgICAgICAgIHVuaWZvcm0gdmVjMiB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTtcbiAgICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25TYW1wbGVyTWFwO1xuICAgICAgICAgIHVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDtcbiAgICAgICAgICB1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcbiAgICAgICAgICB2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4gICAgICAgICAgdmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHtcbiAgICAgICAgICAgIC8vIERpcmVjdGlvbiBvZiByZWZyYWN0ZWQgbGlnaHQuXG4gICAgICAgICAgICB2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KCAtIHYsIG5vcm1hbGl6ZSggbiApLCAxLjAgLyBpb3IgKTtcbiAgICAgICAgICAgIC8vIENvbXB1dGUgcm90YXRpb24taW5kZXBlbmRhbnQgc2NhbGluZyBvZiB0aGUgbW9kZWwgbWF0cml4LlxuICAgICAgICAgICAgdmVjMyBtb2RlbFNjYWxlO1xuICAgICAgICAgICAgbW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7XG4gICAgICAgICAgICBtb2RlbFNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueHl6ICkgKTtcbiAgICAgICAgICAgIG1vZGVsU2NhbGUueiA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDIgXS54eXogKSApO1xuICAgICAgICAgICAgLy8gVGhlIHRoaWNrbmVzcyBpcyBzcGVjaWZpZWQgaW4gbG9jYWwgc3BhY2UuXG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKCByZWZyYWN0aW9uVmVjdG9yICkgKiB0aGlja25lc3MgKiBtb2RlbFNjYWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbG9hdCBhcHBseUlvclRvUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHtcbiAgICAgICAgICAgIC8vIFNjYWxlIHJvdWdobmVzcyB3aXRoIElPUiBzbyB0aGF0IGFuIElPUiBvZiAxLjAgcmVzdWx0cyBpbiBubyBtaWNyb2ZhY2V0IHJlZnJhY3Rpb24gYW5kXG4gICAgICAgICAgICAvLyBhbiBJT1Igb2YgMS41IHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgYW1vdW50IG9mIG1pY3JvZmFjZXQgcmVmcmFjdGlvbi5cbiAgICAgICAgICAgIHJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2ZWM0IGdldFRyYW5zbWlzc2lvblNhbXBsZSggY29uc3QgaW4gdmVjMiBmcmFnQ29vcmQsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkge1xuICAgICAgICAgICAgZmxvYXQgZnJhbWVidWZmZXJMb2QgPSBsb2cyKCB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54ICkgKiBhcHBseUlvclRvUm91Z2huZXNzKCByb3VnaG5lc3MsIGlvciApO1xuICAgICAgICAgICAgI2lmZGVmIFVTRV9TQU1QTEVSXG4gICAgICAgICAgICAgICNpZmRlZiB0ZXh0dXJlMkRMb2RFWFRcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dHVyZTJETG9kRVhUKHRyYW5zbWlzc2lvblNhbXBsZXJNYXAsIGZyYWdDb29yZC54eSwgZnJhbWVidWZmZXJMb2QpO1xuICAgICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlMkQodHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBmcmFtZWJ1ZmZlckxvZCk7XG4gICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgcmV0dXJuIHRleHR1cmUyRChidWZmZXIsIGZyYWdDb29yZC54eSk7XG4gICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICB9XG4gICAgICAgICAgdmVjMyBhcHBseVZvbHVtZUF0dGVudWF0aW9uKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiBmbG9hdCB0cmFuc21pc3Npb25EaXN0YW5jZSwgY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkge1xuICAgICAgICAgICAgaWYgKCBpc2luZiggYXR0ZW51YXRpb25EaXN0YW5jZSApICkge1xuICAgICAgICAgICAgICAvLyBBdHRlbnVhdGlvbiBkaXN0YW5jZSBpcyAr4oieLCBpLmUuIHRoZSB0cmFuc21pdHRlZCBjb2xvciBpcyBub3QgYXR0ZW51YXRlZCBhdCBhbGwuXG4gICAgICAgICAgICAgIHJldHVybiByYWRpYW5jZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIENvbXB1dGUgbGlnaHQgYXR0ZW51YXRpb24gdXNpbmcgQmVlcidzIGxhdy5cbiAgICAgICAgICAgICAgdmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyggYXR0ZW51YXRpb25Db2xvciApIC8gYXR0ZW51YXRpb25EaXN0YW5jZTtcbiAgICAgICAgICAgICAgdmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKCAtIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSApOyAvLyBCZWVyJ3MgbGF3XG4gICAgICAgICAgICAgIHJldHVybiB0cmFuc21pdHRhbmNlICogcmFkaWFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsXG4gICAgICAgICAgICBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiB2ZWMzIHBvc2l0aW9uLCBjb25zdCBpbiBtYXQ0IG1vZGVsTWF0cml4LFxuICAgICAgICAgICAgY29uc3QgaW4gbWF0NCB2aWV3TWF0cml4LCBjb25zdCBpbiBtYXQ0IHByb2pNYXRyaXgsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gZmxvYXQgdGhpY2tuZXNzLFxuICAgICAgICAgICAgY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkge1xuICAgICAgICAgICAgdmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yLCBtb2RlbE1hdHJpeCApO1xuICAgICAgICAgICAgdmVjMyByZWZyYWN0ZWRSYXlFeGl0ID0gcG9zaXRpb24gKyB0cmFuc21pc3Npb25SYXk7XG4gICAgICAgICAgICAvLyBQcm9qZWN0IHJlZnJhY3RlZCB2ZWN0b3Igb24gdGhlIGZyYW1lYnVmZmVyLCB3aGlsZSBtYXBwaW5nIHRvIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzLlxuICAgICAgICAgICAgdmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApO1xuICAgICAgICAgICAgdmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7XG4gICAgICAgICAgICByZWZyYWN0aW9uQ29vcmRzICs9IDEuMDtcbiAgICAgICAgICAgIHJlZnJhY3Rpb25Db29yZHMgLz0gMi4wO1xuICAgICAgICAgICAgLy8gU2FtcGxlIGZyYW1lYnVmZmVyIHRvIGdldCBwaXhlbCB0aGUgcmVmcmFjdGVkIHJheSBoaXRzLlxuICAgICAgICAgICAgdmVjNCB0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApO1xuICAgICAgICAgICAgdmVjMyBhdHRlbnVhdGVkQ29sb3IgPSBhcHBseVZvbHVtZUF0dGVudWF0aW9uKCB0cmFuc21pdHRlZExpZ2h0LnJnYiwgbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApO1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBzcGVjdWxhciBjb21wb25lbnQuXG4gICAgICAgICAgICB2ZWMzIEYgPSBFbnZpcm9ubWVudEJSREYoIG4sIHYsIHNwZWN1bGFyQ29sb3IsIHNwZWN1bGFyRjkwLCByb3VnaG5lc3MgKTtcbiAgICAgICAgICAgIHJldHVybiB2ZWM0KCAoIDEuMCAtIEYgKSAqIGF0dGVudWF0ZWRDb2xvciAqIGRpZmZ1c2VDb2xvciwgdHJhbnNtaXR0ZWRMaWdodC5hICk7XG4gICAgICAgICAgfVxuICAgICAgICAjZW5kaWZcXG5gLFxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gQWRkIHJlZnJhY3Rpb25cblx0XHRcdHNoYWRlci5mcmFnbWVudFNoYWRlciA9IHNoYWRlci5mcmFnbWVudFNoYWRlci5yZXBsYWNlKFxuXHRcdFx0XHQnI2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9mcmFnbWVudD4nLFxuXHRcdFx0XHQvKmdsc2wqLyBgXG4gICAgICAgIC8vIEltcHJvdmUgdGhlIHJlZnJhY3Rpb24gdG8gdXNlIHRoZSB3b3JsZCBwb3NcbiAgICAgICAgbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gX3RyYW5zbWlzc2lvbjtcbiAgICAgICAgbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSAxLjA7XG4gICAgICAgIG1hdGVyaWFsLnRoaWNrbmVzcyA9IHRoaWNrbmVzcztcbiAgICAgICAgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSA9IGF0dGVudWF0aW9uRGlzdGFuY2U7XG4gICAgICAgIG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgPSBhdHRlbnVhdGlvbkNvbG9yO1xuICAgICAgICAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxuICAgICAgICAgIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiAqPSB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvbk1hcCwgdlV2ICkucjtcbiAgICAgICAgI2VuZGlmXG4gICAgICAgICNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQXG4gICAgICAgICAgbWF0ZXJpYWwudGhpY2tuZXNzICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VXYgKS5nO1xuICAgICAgICAjZW5kaWZcblxuICAgICAgICB2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uO1xuICAgICAgICB2ZWMzIHYgPSBub3JtYWxpemUoIGNhbWVyYVBvc2l0aW9uIC0gcG9zICk7XG4gICAgICAgIHZlYzMgbiA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuICAgICAgICB2ZWMzIHRyYW5zbWlzc2lvbiA9IHZlYzMoMC4wKTtcbiAgICAgICAgZmxvYXQgdHJhbnNtaXNzaW9uUiwgdHJhbnNtaXNzaW9uQiwgdHJhbnNtaXNzaW9uRztcbiAgICAgICAgZmxvYXQgcmFuZG9tQ29vcmRzID0gcmFuZCgpO1xuICAgICAgICBmbG9hdCB0aGlja25lc3Nfc21lYXIgPSB0aGlja25lc3MgKiBtYXgocG93KHJvdWdobmVzc0ZhY3RvciwgMC4zMyksIGFuaXNvdHJvcGljQmx1cik7XG4gICAgICAgIHZlYzMgZGlzdG9ydGlvbk5vcm1hbCA9IHZlYzMoMC4wKTtcbiAgICAgICAgdmVjMyB0ZW1wb3JhbE9mZnNldCA9IHZlYzModGltZSwgLXRpbWUsIC10aW1lKSAqIHRlbXBvcmFsRGlzdG9ydGlvbjtcbiAgICAgICAgaWYgKGRpc3RvcnRpb24gPiAwLjApIHtcbiAgICAgICAgICBkaXN0b3J0aW9uTm9ybWFsID0gZGlzdG9ydGlvbiAqIHZlYzMoc25vaXNlRnJhY3RhbCh2ZWMzKChwb3MgKiBkaXN0b3J0aW9uU2NhbGUgKyB0ZW1wb3JhbE9mZnNldCkpKSwgc25vaXNlRnJhY3RhbCh2ZWMzKHBvcy56eHkgKiBkaXN0b3J0aW9uU2NhbGUgLSB0ZW1wb3JhbE9mZnNldCkpLCBzbm9pc2VGcmFjdGFsKHZlYzMocG9zLnl4eiAqIGRpc3RvcnRpb25TY2FsZSArIHRlbXBvcmFsT2Zmc2V0KSkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoZmxvYXQgaSA9IDAuMDsgaSA8ICR7c2FtcGxlc30uMDsgaSArKykge1xuICAgICAgICAgIHZlYzMgc2FtcGxlTm9ybSA9IG5vcm1hbGl6ZShuICsgcm91Z2huZXNzRmFjdG9yICogcm91Z2huZXNzRmFjdG9yICogMi4wICogbm9ybWFsaXplKHZlYzMocmFuZCgpIC0gMC41LCByYW5kKCkgLSAwLjUsIHJhbmQoKSAtIDAuNSkpICogcG93KHJhbmQoKSwgMC4zMykgKyBkaXN0b3J0aW9uTm9ybWFsKTtcbiAgICAgICAgICB0cmFuc21pc3Npb25SID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbihcbiAgICAgICAgICAgIHNhbXBsZU5vcm0sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCxcbiAgICAgICAgICAgIHBvcywgbW9kZWxNYXRyaXgsIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXRyaXgsIG1hdGVyaWFsLmlvciwgbWF0ZXJpYWwudGhpY2tuZXNzICArIHRoaWNrbmVzc19zbWVhciAqIChpICsgcmFuZG9tQ29vcmRzKSAvIGZsb2F0KCR7c2FtcGxlc30pLFxuICAgICAgICAgICAgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZVxuICAgICAgICAgICkucjtcbiAgICAgICAgICB0cmFuc21pc3Npb25HID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbihcbiAgICAgICAgICAgIHNhbXBsZU5vcm0sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCxcbiAgICAgICAgICAgIHBvcywgbW9kZWxNYXRyaXgsIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXRyaXgsIG1hdGVyaWFsLmlvciAgKiAoMS4wICsgY2hyb21hdGljQWJlcnJhdGlvbiAqIChpICsgcmFuZG9tQ29vcmRzKSAvIGZsb2F0KCR7c2FtcGxlc30pKSAsIG1hdGVyaWFsLnRoaWNrbmVzcyArIHRoaWNrbmVzc19zbWVhciAqIChpICsgcmFuZG9tQ29vcmRzKSAvIGZsb2F0KCR7c2FtcGxlc30pLFxuICAgICAgICAgICAgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZVxuICAgICAgICAgICkuZztcbiAgICAgICAgICB0cmFuc21pc3Npb25CID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbihcbiAgICAgICAgICAgIHNhbXBsZU5vcm0sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCxcbiAgICAgICAgICAgIHBvcywgbW9kZWxNYXRyaXgsIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXRyaXgsIG1hdGVyaWFsLmlvciAqICgxLjAgKyAyLjAgKiBjaHJvbWF0aWNBYmVycmF0aW9uICogKGkgKyByYW5kb21Db29yZHMpIC8gZmxvYXQoJHtzYW1wbGVzfSkpLCBtYXRlcmlhbC50aGlja25lc3MgKyB0aGlja25lc3Nfc21lYXIgKiAoaSArIHJhbmRvbUNvb3JkcykgLyBmbG9hdCgke3NhbXBsZXN9KSxcbiAgICAgICAgICAgIG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IsIG1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2VcbiAgICAgICAgICApLmI7XG4gICAgICAgICAgdHJhbnNtaXNzaW9uLnIgKz0gdHJhbnNtaXNzaW9uUjtcbiAgICAgICAgICB0cmFuc21pc3Npb24uZyArPSB0cmFuc21pc3Npb25HO1xuICAgICAgICAgIHRyYW5zbWlzc2lvbi5iICs9IHRyYW5zbWlzc2lvbkI7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNtaXNzaW9uIC89ICR7c2FtcGxlc30uMDtcbiAgICAgICAgdG90YWxEaWZmdXNlID0gbWl4KCB0b3RhbERpZmZ1c2UsIHRyYW5zbWlzc2lvbi5yZ2IsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApO1xcbmAsXG5cdFx0XHQpO1xuXHRcdH07XG5cblx0XHRPYmplY3Qua2V5cyh0aGlzLnVuaWZvcm1zKS5mb3JFYWNoKChuYW1lKSA9PlxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0Z2V0OiAoKSA9PiB0aGlzLnVuaWZvcm1zW25hbWUgYXMga2V5b2YgdHlwZW9mIHRoaXMudW5pZm9ybXNdLnZhbHVlLFxuXHRcdFx0XHRzZXQ6ICh2KSA9PiAodGhpcy51bmlmb3Jtc1tuYW1lIGFzIGtleW9mIHR5cGVvZiB0aGlzLnVuaWZvcm1zXS52YWx1ZSA9IHYpLFxuXHRcdFx0fSksXG5cdFx0KTtcblx0fVxufVxuIl19
@@ -0,0 +1,37 @@
1
+ import * as THREE from 'three';
2
+ export class MeshWobbleMaterial extends THREE.MeshStandardMaterial {
3
+ constructor(parameters = {}) {
4
+ super(parameters);
5
+ this.setValues(parameters);
6
+ this._time = { value: 0 };
7
+ this._factor = { value: 1 };
8
+ }
9
+ onBeforeCompile(shader) {
10
+ shader.uniforms['time'] = this._time;
11
+ shader.uniforms['factor'] = this._factor;
12
+ shader.vertexShader = `
13
+ uniform float time;
14
+ uniform float factor;
15
+ ${shader.vertexShader}
16
+ `;
17
+ shader.vertexShader = shader.vertexShader.replace('#include <begin_vertex>', `float theta = sin( time + position.y ) / 2.0 * factor;
18
+ float c = cos( theta );
19
+ float s = sin( theta );
20
+ mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c );
21
+ vec3 transformed = vec3( position ) * m;
22
+ vNormal = vNormal * m;`);
23
+ }
24
+ get time() {
25
+ return this._time.value;
26
+ }
27
+ set time(v) {
28
+ this._time.value = v;
29
+ }
30
+ get factor() {
31
+ return this._factor.value;
32
+ }
33
+ set factor(v) {
34
+ this._factor.value = v;
35
+ }
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC13b2JibGUtbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc2hhZGVycy9zcmMvbWVzaC13b2JibGUtbWF0ZXJpYWwvbWVzaC13b2JibGUtbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFNL0IsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUssQ0FBQyxvQkFBb0I7SUFJakUsWUFBWSxhQUFtRCxFQUFFO1FBQ2hFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRVEsZUFBZSxDQUFDLE1BQW9CO1FBQzVDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFekMsTUFBTSxDQUFDLFlBQVksR0FBRzs7O1FBR2hCLE1BQU0sQ0FBQyxZQUFZO0tBQ3RCLENBQUM7UUFDSixNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUNoRCx5QkFBeUIsRUFDekI7Ozs7OytCQUs0QixDQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSTtRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLENBQUM7UUFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNULE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5pbnRlcmZhY2UgVW5pZm9ybTxUPiB7XG5cdHZhbHVlOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgTWVzaFdvYmJsZU1hdGVyaWFsIGV4dGVuZHMgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwge1xuXHRfdGltZTogVW5pZm9ybTxudW1iZXI+O1xuXHRfZmFjdG9yOiBVbmlmb3JtPG51bWJlcj47XG5cblx0Y29uc3RydWN0b3IocGFyYW1ldGVyczogVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWxQYXJhbWV0ZXJzID0ge30pIHtcblx0XHRzdXBlcihwYXJhbWV0ZXJzKTtcblx0XHR0aGlzLnNldFZhbHVlcyhwYXJhbWV0ZXJzKTtcblx0XHR0aGlzLl90aW1lID0geyB2YWx1ZTogMCB9O1xuXHRcdHRoaXMuX2ZhY3RvciA9IHsgdmFsdWU6IDEgfTtcblx0fVxuXG5cdG92ZXJyaWRlIG9uQmVmb3JlQ29tcGlsZShzaGFkZXI6IFRIUkVFLlNoYWRlcikge1xuXHRcdHNoYWRlci51bmlmb3Jtc1sndGltZSddID0gdGhpcy5fdGltZTtcblx0XHRzaGFkZXIudW5pZm9ybXNbJ2ZhY3RvciddID0gdGhpcy5fZmFjdG9yO1xuXG5cdFx0c2hhZGVyLnZlcnRleFNoYWRlciA9IGBcbiAgICAgIHVuaWZvcm0gZmxvYXQgdGltZTtcbiAgICAgIHVuaWZvcm0gZmxvYXQgZmFjdG9yO1xuICAgICAgJHtzaGFkZXIudmVydGV4U2hhZGVyfVxuICAgIGA7XG5cdFx0c2hhZGVyLnZlcnRleFNoYWRlciA9IHNoYWRlci52ZXJ0ZXhTaGFkZXIucmVwbGFjZShcblx0XHRcdCcjaW5jbHVkZSA8YmVnaW5fdmVydGV4PicsXG5cdFx0XHRgZmxvYXQgdGhldGEgPSBzaW4oIHRpbWUgKyBwb3NpdGlvbi55ICkgLyAyLjAgKiBmYWN0b3I7XG4gICAgICAgIGZsb2F0IGMgPSBjb3MoIHRoZXRhICk7XG4gICAgICAgIGZsb2F0IHMgPSBzaW4oIHRoZXRhICk7XG4gICAgICAgIG1hdDMgbSA9IG1hdDMoIGMsIDAsIHMsIDAsIDEsIDAsIC1zLCAwLCBjICk7XG4gICAgICAgIHZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApICogbTtcbiAgICAgICAgdk5vcm1hbCA9IHZOb3JtYWwgKiBtO2AsXG5cdFx0KTtcblx0fVxuXG5cdGdldCB0aW1lKCkge1xuXHRcdHJldHVybiB0aGlzLl90aW1lLnZhbHVlO1xuXHR9XG5cblx0c2V0IHRpbWUodikge1xuXHRcdHRoaXMuX3RpbWUudmFsdWUgPSB2O1xuXHR9XG5cblx0Z2V0IGZhY3RvcigpIHtcblx0XHRyZXR1cm4gdGhpcy5fZmFjdG9yLnZhbHVlO1xuXHR9XG5cblx0c2V0IGZhY3Rvcih2KSB7XG5cdFx0dGhpcy5fZmFjdG9yLnZhbHVlID0gdjtcblx0fVxuXG5cdGRlY2xhcmUgc3BlZWQ6IG51bWJlcjtcbn1cbiJdfQ==
@@ -0,0 +1,34 @@
1
+ import * as THREE from 'three';
2
+ export function shaderMaterial(uniforms, vertexShader, fragmentShader, onInit) {
3
+ const material = class extends THREE.ShaderMaterial {
4
+ constructor(parameters = {}) {
5
+ const entries = Object.entries(uniforms);
6
+ // Create unforms and shaders
7
+ super({
8
+ uniforms: entries.reduce((acc, [name, value]) => {
9
+ const uniform = THREE.UniformsUtils.clone({ [name]: { value } });
10
+ return {
11
+ ...acc,
12
+ ...uniform,
13
+ };
14
+ }, {}),
15
+ vertexShader,
16
+ fragmentShader,
17
+ });
18
+ this.key = '';
19
+ // Create getter/setters
20
+ entries.forEach(([name]) => Object.defineProperty(this, name, {
21
+ get: () => this.uniforms[name].value,
22
+ set: (v) => (this.uniforms[name].value = v),
23
+ }));
24
+ // Assign parameters, this might include uniforms
25
+ Object.assign(this, parameters);
26
+ // Call onInit
27
+ if (onInit)
28
+ onInit(this);
29
+ }
30
+ };
31
+ material.key = THREE.MathUtils.generateUUID();
32
+ return material;
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZGVyLW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3NoYWRlcnMvc3JjL3NoYWRlci1tYXRlcmlhbC9zaGFkZXItbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsTUFBTSxVQUFVLGNBQWMsQ0FvQjdCLFFBQWtCLEVBQ2xCLFlBQW9CLEVBQ3BCLGNBQXNCLEVBQ3RCLE1BQWtEO0lBRWxELE1BQU0sUUFBUSxHQUFHLEtBQU0sU0FBUSxLQUFLLENBQUMsY0FBYztRQUVsRCxZQUFZLFVBQVUsR0FBRyxFQUFFO1lBQzFCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsNkJBQTZCO1lBQzdCLEtBQUssQ0FBQztnQkFDTCxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO29CQUMvQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2pFLE9BQU87d0JBQ04sR0FBRyxHQUFHO3dCQUNOLEdBQUcsT0FBTztxQkFDVixDQUFDO2dCQUNILENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ04sWUFBWTtnQkFDWixjQUFjO2FBQ2QsQ0FBQyxDQUFDO1lBZEcsUUFBRyxHQUFXLEVBQUUsQ0FBQztZQWV2Qix3QkFBd0I7WUFDeEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUMxQixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7Z0JBQ2pDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUs7Z0JBQ3BDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDM0MsQ0FBQyxDQUNGLENBQUM7WUFFRixpREFBaUQ7WUFDakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEMsY0FBYztZQUNkLElBQUksTUFBTTtnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztLQUMyRCxDQUFDO0lBQzlELFFBQVEsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxPQUFPLFFBQVEsQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hhZGVyTWF0ZXJpYWw8XG5cdFVuaWZvcm1zIGV4dGVuZHMge1xuXHRcdFtuYW1lOiBzdHJpbmddOlxuXHRcdFx0fCBUSFJFRS5DdWJlVGV4dHVyZVxuXHRcdFx0fCBUSFJFRS5UZXh0dXJlXG5cdFx0XHR8IEludDMyQXJyYXlcblx0XHRcdHwgRmxvYXQzMkFycmF5XG5cdFx0XHR8IFRIUkVFLk1hdHJpeDRcblx0XHRcdHwgVEhSRUUuTWF0cml4M1xuXHRcdFx0fCBUSFJFRS5RdWF0ZXJuaW9uXG5cdFx0XHR8IFRIUkVFLlZlY3RvcjRcblx0XHRcdHwgVEhSRUUuVmVjdG9yM1xuXHRcdFx0fCBUSFJFRS5WZWN0b3IyXG5cdFx0XHR8IFRIUkVFLkNvbG9yXG5cdFx0XHR8IG51bWJlclxuXHRcdFx0fCBib29sZWFuXG5cdFx0XHR8IEFycmF5PGFueT5cblx0XHRcdHwgbnVsbDtcblx0fSxcbj4oXG5cdHVuaWZvcm1zOiBVbmlmb3Jtcyxcblx0dmVydGV4U2hhZGVyOiBzdHJpbmcsXG5cdGZyYWdtZW50U2hhZGVyOiBzdHJpbmcsXG5cdG9uSW5pdD86IChtYXRlcmlhbD86IFRIUkVFLlNoYWRlck1hdGVyaWFsKSA9PiB2b2lkLFxuKSB7XG5cdGNvbnN0IG1hdGVyaWFsID0gY2xhc3MgZXh0ZW5kcyBUSFJFRS5TaGFkZXJNYXRlcmlhbCB7XG5cdFx0cHVibGljIGtleTogc3RyaW5nID0gJyc7XG5cdFx0Y29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModW5pZm9ybXMpO1xuXHRcdFx0Ly8gQ3JlYXRlIHVuZm9ybXMgYW5kIHNoYWRlcnNcblx0XHRcdHN1cGVyKHtcblx0XHRcdFx0dW5pZm9ybXM6IGVudHJpZXMucmVkdWNlKChhY2MsIFtuYW1lLCB2YWx1ZV0pID0+IHtcblx0XHRcdFx0XHRjb25zdCB1bmlmb3JtID0gVEhSRUUuVW5pZm9ybXNVdGlscy5jbG9uZSh7IFtuYW1lXTogeyB2YWx1ZSB9IH0pO1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHQuLi5hY2MsXG5cdFx0XHRcdFx0XHQuLi51bmlmb3JtLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sIHt9KSxcblx0XHRcdFx0dmVydGV4U2hhZGVyLFxuXHRcdFx0XHRmcmFnbWVudFNoYWRlcixcblx0XHRcdH0pO1xuXHRcdFx0Ly8gQ3JlYXRlIGdldHRlci9zZXR0ZXJzXG5cdFx0XHRlbnRyaWVzLmZvckVhY2goKFtuYW1lXSkgPT5cblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHRoaXMudW5pZm9ybXNbbmFtZV0udmFsdWUsXG5cdFx0XHRcdFx0c2V0OiAodikgPT4gKHRoaXMudW5pZm9ybXNbbmFtZV0udmFsdWUgPSB2KSxcblx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyBBc3NpZ24gcGFyYW1ldGVycywgdGhpcyBtaWdodCBpbmNsdWRlIHVuaWZvcm1zXG5cdFx0XHRPYmplY3QuYXNzaWduKHRoaXMsIHBhcmFtZXRlcnMpO1xuXHRcdFx0Ly8gQ2FsbCBvbkluaXRcblx0XHRcdGlmIChvbkluaXQpIG9uSW5pdCh0aGlzKTtcblx0XHR9XG5cdH0gYXMgdW5rbm93biBhcyB0eXBlb2YgVEhSRUUuU2hhZGVyTWF0ZXJpYWwgJiB7IGtleTogc3RyaW5nIH07XG5cdG1hdGVyaWFsLmtleSA9IFRIUkVFLk1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblx0cmV0dXJuIG1hdGVyaWFsO1xufVxuIl19
@@ -0,0 +1,25 @@
1
+ import * as THREE from 'three';
2
+ import { shaderMaterial } from '../shader-material/shader-material';
3
+ export const SoftShadowMaterial = shaderMaterial({
4
+ color: new THREE.Color(),
5
+ blend: 2.0,
6
+ alphaTest: 0.75,
7
+ opacity: 0,
8
+ map: null,
9
+ }, `varying vec2 vUv;
10
+ void main() {
11
+ gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);
12
+ vUv = uv;
13
+ }`, `varying vec2 vUv;
14
+ uniform sampler2D map;
15
+ uniform vec3 color;
16
+ uniform float opacity;
17
+ uniform float alphaTest;
18
+ uniform float blend;
19
+ void main() {
20
+ vec4 sampledDiffuseColor = texture2D(map, vUv);
21
+ gl_FragColor = vec4(color * sampledDiffuseColor.r * blend, max(0.0, (1.0 - (sampledDiffuseColor.r + sampledDiffuseColor.g + sampledDiffuseColor.b) / alphaTest)) * opacity);
22
+ #include <tonemapping_fragment>
23
+ #include <${parseInt(THREE.REVISION.replace(/\D+/g, '')) >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>
24
+ }`);
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1zaGFkb3ctbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc2hhZGVycy9zcmMvc29mdC1zaGFkb3ctbWF0ZXJpYWwvc29mdC1zaGFkb3ctbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FDL0M7SUFDQyxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO0lBQ3hCLEtBQUssRUFBRSxHQUFHO0lBQ1YsU0FBUyxFQUFFLElBQUk7SUFDZixPQUFPLEVBQUUsQ0FBQztJQUNWLEdBQUcsRUFBRSxJQUFJO0NBQ1QsRUFDRDs7OztLQUlJLEVBQ0o7Ozs7Ozs7Ozs7aUJBVWdCLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxvQkFBb0I7S0FDOUcsQ0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOZ3RTaGFkZXJNYXRlcmlhbCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgc2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi9zaGFkZXItbWF0ZXJpYWwvc2hhZGVyLW1hdGVyaWFsJztcblxuZXhwb3J0IGNvbnN0IFNvZnRTaGFkb3dNYXRlcmlhbCA9IHNoYWRlck1hdGVyaWFsKFxuXHR7XG5cdFx0Y29sb3I6IG5ldyBUSFJFRS5Db2xvcigpLFxuXHRcdGJsZW5kOiAyLjAsXG5cdFx0YWxwaGFUZXN0OiAwLjc1LFxuXHRcdG9wYWNpdHk6IDAsXG5cdFx0bWFwOiBudWxsLFxuXHR9LFxuXHRgdmFyeWluZyB2ZWMyIHZVdjtcbiAgIHZvaWQgbWFpbigpIHtcbiAgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIG1vZGVsTWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4pO1xuICAgICB2VXYgPSB1djtcbiAgIH1gLFxuXHRgdmFyeWluZyB2ZWMyIHZVdjtcbiAgIHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiAgIHVuaWZvcm0gdmVjMyBjb2xvcjtcbiAgIHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiAgIHVuaWZvcm0gZmxvYXQgYWxwaGFUZXN0O1xuICAgdW5pZm9ybSBmbG9hdCBibGVuZDtcbiAgIHZvaWQgbWFpbigpIHtcbiAgICAgdmVjNCBzYW1wbGVkRGlmZnVzZUNvbG9yID0gdGV4dHVyZTJEKG1hcCwgdlV2KTtcbiAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciAqIHNhbXBsZWREaWZmdXNlQ29sb3IuciAqIGJsZW5kLCBtYXgoMC4wLCAoMS4wIC0gKHNhbXBsZWREaWZmdXNlQ29sb3IuciArIHNhbXBsZWREaWZmdXNlQ29sb3IuZyArIHNhbXBsZWREaWZmdXNlQ29sb3IuYikgLyBhbHBoYVRlc3QpKSAqIG9wYWNpdHkpO1xuICAgICAjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG4gICAgICNpbmNsdWRlIDwke3BhcnNlSW50KFRIUkVFLlJFVklTSU9OLnJlcGxhY2UoL1xcRCsvZywgJycpKSA+PSAxNTQgPyAnY29sb3JzcGFjZV9mcmFnbWVudCcgOiAnZW5jb2RpbmdzX2ZyYWdtZW50J30+XG4gICB9YCxcbik7XG5cbmV4cG9ydCB0eXBlIE5ndFNvZnRTaGFkb3dNYXRlcmlhbFN0YXRlID0ge1xuXHRtYXA6IFRIUkVFLlRleHR1cmU7XG5cdGNvbG9yPzogVEhSRUUuQ29sb3JSZXByZXNlbnRhdGlvbjtcblx0YWxwaGFUZXN0PzogbnVtYmVyO1xuXHRibGVuZD86IG51bWJlcjtcbn07XG5cbmRlY2xhcmUgZ2xvYmFsIHtcblx0aW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG5cdFx0LyoqXG5cdFx0ICogIEBleHRlbmRzIG5ndC1zaGFkZXItbWF0ZXJpYWxcblx0XHQgKi9cblx0XHQnbmd0LXNvZnQtc2hhZG93LW1hdGVyaWFsJzogTmd0U29mdFNoYWRvd01hdGVyaWFsU3RhdGUgJiBOZ3RTaGFkZXJNYXRlcmlhbDtcblx0fVxufVxuIl19