three-stdlib 2.35.5 → 2.35.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (514) hide show
  1. package/_polyfill/CapsuleGeometry.cjs +20 -17
  2. package/_polyfill/CapsuleGeometry.cjs.map +1 -1
  3. package/_polyfill/CapsuleGeometry.js +20 -17
  4. package/_polyfill/CapsuleGeometry.js.map +1 -1
  5. package/_polyfill/constants.cjs +1 -1
  6. package/_polyfill/constants.cjs.map +1 -1
  7. package/_polyfill/constants.js +1 -1
  8. package/_polyfill/constants.js.map +1 -1
  9. package/animation/AnimationClipCreator.cjs +13 -13
  10. package/animation/AnimationClipCreator.cjs.map +1 -1
  11. package/animation/AnimationClipCreator.js +13 -13
  12. package/animation/AnimationClipCreator.js.map +1 -1
  13. package/animation/CCDIKSolver.cjs +11 -11
  14. package/animation/CCDIKSolver.cjs.map +1 -1
  15. package/animation/CCDIKSolver.js +12 -12
  16. package/animation/CCDIKSolver.js.map +1 -1
  17. package/animation/MMDAnimationHelper.cjs +1 -1
  18. package/animation/MMDAnimationHelper.cjs.map +1 -1
  19. package/animation/MMDAnimationHelper.js +1 -1
  20. package/animation/MMDAnimationHelper.js.map +1 -1
  21. package/animation/MMDPhysics.cjs +4 -4
  22. package/animation/MMDPhysics.cjs.map +1 -1
  23. package/animation/MMDPhysics.js +4 -4
  24. package/animation/MMDPhysics.js.map +1 -1
  25. package/controls/ArcballControls.cjs +2 -2
  26. package/controls/ArcballControls.cjs.map +1 -1
  27. package/controls/ArcballControls.js +3 -3
  28. package/controls/ArcballControls.js.map +1 -1
  29. package/controls/FirstPersonControls.cjs +1 -1
  30. package/controls/FirstPersonControls.cjs.map +1 -1
  31. package/controls/FirstPersonControls.js +1 -1
  32. package/controls/FirstPersonControls.js.map +1 -1
  33. package/controls/OrbitControls.cjs +2 -2
  34. package/controls/OrbitControls.cjs.map +1 -1
  35. package/controls/OrbitControls.js +3 -3
  36. package/controls/OrbitControls.js.map +1 -1
  37. package/controls/PointerLockControls.cjs +2 -2
  38. package/controls/PointerLockControls.cjs.map +1 -1
  39. package/controls/PointerLockControls.js +3 -3
  40. package/controls/PointerLockControls.js.map +1 -1
  41. package/csm/CSM.cjs +4 -4
  42. package/csm/CSM.cjs.map +1 -1
  43. package/csm/CSM.js +5 -5
  44. package/csm/CSM.js.map +1 -1
  45. package/csm/CSMFrustum.cjs +1 -1
  46. package/csm/CSMFrustum.cjs.map +1 -1
  47. package/csm/CSMFrustum.js +2 -2
  48. package/csm/CSMFrustum.js.map +1 -1
  49. package/deprecated/Geometry.cjs +722 -715
  50. package/deprecated/Geometry.cjs.map +1 -1
  51. package/deprecated/Geometry.js +723 -716
  52. package/deprecated/Geometry.js.map +1 -1
  53. package/effects/AnaglyphEffect.cjs +2 -1
  54. package/effects/AnaglyphEffect.cjs.map +1 -1
  55. package/effects/AnaglyphEffect.js +3 -2
  56. package/effects/AnaglyphEffect.js.map +1 -1
  57. package/effects/OutlineEffect.cjs +2 -1
  58. package/effects/OutlineEffect.cjs.map +1 -1
  59. package/effects/OutlineEffect.js +3 -2
  60. package/effects/OutlineEffect.js.map +1 -1
  61. package/effects/ParallaxBarrierEffect.cjs +2 -1
  62. package/effects/ParallaxBarrierEffect.cjs.map +1 -1
  63. package/effects/ParallaxBarrierEffect.js +3 -2
  64. package/effects/ParallaxBarrierEffect.js.map +1 -1
  65. package/exporters/DRACOExporter.cjs +133 -122
  66. package/exporters/DRACOExporter.cjs.map +1 -1
  67. package/exporters/DRACOExporter.d.ts +34 -21
  68. package/exporters/DRACOExporter.js +133 -122
  69. package/exporters/DRACOExporter.js.map +1 -1
  70. package/exporters/GLTFExporter.cjs +170 -167
  71. package/exporters/GLTFExporter.cjs.map +1 -1
  72. package/exporters/GLTFExporter.js +170 -167
  73. package/exporters/GLTFExporter.js.map +1 -1
  74. package/geometries/LightningStrike.cjs +524 -515
  75. package/geometries/LightningStrike.cjs.map +1 -1
  76. package/geometries/LightningStrike.js +524 -515
  77. package/geometries/LightningStrike.js.map +1 -1
  78. package/geometries/RoundedBoxGeometry.cjs +1 -1
  79. package/geometries/RoundedBoxGeometry.cjs.map +1 -1
  80. package/geometries/RoundedBoxGeometry.js +2 -2
  81. package/geometries/RoundedBoxGeometry.js.map +1 -1
  82. package/helpers/RaycasterHelper.cjs +2 -2
  83. package/helpers/RaycasterHelper.cjs.map +1 -1
  84. package/helpers/RaycasterHelper.js +3 -3
  85. package/helpers/RaycasterHelper.js.map +1 -1
  86. package/helpers/VertexNormalsHelper.cjs +3 -3
  87. package/helpers/VertexNormalsHelper.cjs.map +1 -1
  88. package/helpers/VertexNormalsHelper.js +4 -4
  89. package/helpers/VertexNormalsHelper.js.map +1 -1
  90. package/helpers/VertexTangentsHelper.cjs +2 -2
  91. package/helpers/VertexTangentsHelper.cjs.map +1 -1
  92. package/helpers/VertexTangentsHelper.js +3 -3
  93. package/helpers/VertexTangentsHelper.js.map +1 -1
  94. package/interactive/InteractiveGroup.cjs +1 -1
  95. package/interactive/InteractiveGroup.cjs.map +1 -1
  96. package/interactive/InteractiveGroup.js +2 -2
  97. package/interactive/InteractiveGroup.js.map +1 -1
  98. package/interactive/SelectionBox.cjs +15 -15
  99. package/interactive/SelectionBox.cjs.map +1 -1
  100. package/interactive/SelectionBox.js +16 -16
  101. package/interactive/SelectionBox.js.map +1 -1
  102. package/libs/chevrotain.cjs +1 -1
  103. package/libs/chevrotain.cjs.map +1 -1
  104. package/libs/chevrotain.js +1 -1
  105. package/libs/chevrotain.js.map +1 -1
  106. package/libs/lottie.cjs +1 -1
  107. package/libs/lottie.cjs.map +1 -1
  108. package/libs/lottie.js +1 -1
  109. package/libs/lottie.js.map +1 -1
  110. package/libs/opentype.cjs +1 -1
  111. package/libs/opentype.cjs.map +1 -1
  112. package/libs/opentype.js +1 -1
  113. package/libs/opentype.js.map +1 -1
  114. package/lights/LightProbeGenerator.cjs +5 -5
  115. package/lights/LightProbeGenerator.cjs.map +1 -1
  116. package/lights/LightProbeGenerator.js +5 -5
  117. package/lights/LightProbeGenerator.js.map +1 -1
  118. package/lights/RectAreaLightUniformsLib.cjs +3 -3
  119. package/lights/RectAreaLightUniformsLib.cjs.map +1 -1
  120. package/lights/RectAreaLightUniformsLib.js +3 -3
  121. package/lights/RectAreaLightUniformsLib.js.map +1 -1
  122. package/lines/LineMaterial.cjs +2 -1
  123. package/lines/LineMaterial.cjs.map +1 -1
  124. package/lines/LineMaterial.js +3 -2
  125. package/lines/LineMaterial.js.map +1 -1
  126. package/lines/LineSegments2.cjs +13 -13
  127. package/lines/LineSegments2.cjs.map +1 -1
  128. package/lines/LineSegments2.js +14 -14
  129. package/lines/LineSegments2.js.map +1 -1
  130. package/lines/LineSegmentsGeometry.cjs +2 -2
  131. package/lines/LineSegmentsGeometry.cjs.map +1 -1
  132. package/lines/LineSegmentsGeometry.js +3 -3
  133. package/lines/LineSegmentsGeometry.js.map +1 -1
  134. package/lines/Wireframe.cjs +3 -3
  135. package/lines/Wireframe.cjs.map +1 -1
  136. package/lines/Wireframe.js +4 -4
  137. package/lines/Wireframe.js.map +1 -1
  138. package/loaders/BasisTextureLoader.cjs +441 -435
  139. package/loaders/BasisTextureLoader.cjs.map +1 -1
  140. package/loaders/BasisTextureLoader.js +441 -435
  141. package/loaders/BasisTextureLoader.js.map +1 -1
  142. package/loaders/EXRLoader.cjs +2 -1
  143. package/loaders/EXRLoader.cjs.map +1 -1
  144. package/loaders/EXRLoader.js +3 -2
  145. package/loaders/EXRLoader.js.map +1 -1
  146. package/loaders/FBXLoader.cjs +2 -2
  147. package/loaders/FBXLoader.cjs.map +1 -1
  148. package/loaders/FBXLoader.js +2 -2
  149. package/loaders/FBXLoader.js.map +1 -1
  150. package/loaders/FontLoader.cjs +2 -2
  151. package/loaders/FontLoader.cjs.map +1 -1
  152. package/loaders/FontLoader.d.ts +2 -2
  153. package/loaders/FontLoader.js +2 -2
  154. package/loaders/FontLoader.js.map +1 -1
  155. package/loaders/GLTFLoader.cjs +2 -2
  156. package/loaders/GLTFLoader.cjs.map +1 -1
  157. package/loaders/GLTFLoader.js +2 -2
  158. package/loaders/GLTFLoader.js.map +1 -1
  159. package/loaders/KTX2Loader.cjs +377 -374
  160. package/loaders/KTX2Loader.cjs.map +1 -1
  161. package/loaders/KTX2Loader.js +377 -374
  162. package/loaders/KTX2Loader.js.map +1 -1
  163. package/loaders/LDrawLoader.cjs +5 -4
  164. package/loaders/LDrawLoader.cjs.map +1 -1
  165. package/loaders/LDrawLoader.js +6 -5
  166. package/loaders/LDrawLoader.js.map +1 -1
  167. package/loaders/OBJLoader.cjs +5 -5
  168. package/loaders/OBJLoader.cjs.map +1 -1
  169. package/loaders/OBJLoader.js +6 -6
  170. package/loaders/OBJLoader.js.map +1 -1
  171. package/loaders/PRWMLoader.cjs +46 -43
  172. package/loaders/PRWMLoader.cjs.map +1 -1
  173. package/loaders/PRWMLoader.js +46 -43
  174. package/loaders/PRWMLoader.js.map +1 -1
  175. package/loaders/SVGLoader.cjs +1694 -1688
  176. package/loaders/SVGLoader.cjs.map +1 -1
  177. package/loaders/SVGLoader.js +1694 -1688
  178. package/loaders/SVGLoader.js.map +1 -1
  179. package/loaders/XLoader.cjs +1 -1
  180. package/loaders/XLoader.cjs.map +1 -1
  181. package/loaders/XLoader.js +1 -1
  182. package/loaders/XLoader.js.map +1 -1
  183. package/math/Capsule.cjs +3 -3
  184. package/math/Capsule.cjs.map +1 -1
  185. package/math/Capsule.js +3 -3
  186. package/math/Capsule.js.map +1 -1
  187. package/math/ColorConverter.cjs +9 -9
  188. package/math/ColorConverter.cjs.map +1 -1
  189. package/math/ColorConverter.js +9 -9
  190. package/math/ColorConverter.js.map +1 -1
  191. package/math/ConvexHull.cjs +53 -50
  192. package/math/ConvexHull.cjs.map +1 -1
  193. package/math/ConvexHull.js +53 -50
  194. package/math/ConvexHull.js.map +1 -1
  195. package/math/ImprovedNoise.cjs +1 -1
  196. package/math/ImprovedNoise.cjs.map +1 -1
  197. package/math/ImprovedNoise.js +1 -1
  198. package/math/ImprovedNoise.js.map +1 -1
  199. package/math/MeshSurfaceSampler.cjs +2 -2
  200. package/math/MeshSurfaceSampler.cjs.map +1 -1
  201. package/math/MeshSurfaceSampler.js +2 -2
  202. package/math/MeshSurfaceSampler.js.map +1 -1
  203. package/math/OBB.cjs +14 -14
  204. package/math/OBB.cjs.map +1 -1
  205. package/math/OBB.js +15 -15
  206. package/math/OBB.js.map +1 -1
  207. package/math/Octree.cjs +7 -7
  208. package/math/Octree.cjs.map +1 -1
  209. package/math/Octree.js +8 -8
  210. package/math/Octree.js.map +1 -1
  211. package/misc/ConvexObjectBreaker.cjs +271 -268
  212. package/misc/ConvexObjectBreaker.cjs.map +1 -1
  213. package/misc/ConvexObjectBreaker.js +272 -269
  214. package/misc/ConvexObjectBreaker.js.map +1 -1
  215. package/misc/Gyroscope.cjs +6 -6
  216. package/misc/Gyroscope.cjs.map +1 -1
  217. package/misc/Gyroscope.js +7 -7
  218. package/misc/Gyroscope.js.map +1 -1
  219. package/modifiers/CurveModifier.cjs +1 -1
  220. package/modifiers/CurveModifier.cjs.map +1 -1
  221. package/modifiers/CurveModifier.js +2 -2
  222. package/modifiers/CurveModifier.js.map +1 -1
  223. package/modifiers/SimplifyModifier.cjs +2 -2
  224. package/modifiers/SimplifyModifier.cjs.map +1 -1
  225. package/modifiers/SimplifyModifier.js +2 -2
  226. package/modifiers/SimplifyModifier.js.map +1 -1
  227. package/objects/BatchedMesh.cjs +2 -2
  228. package/objects/BatchedMesh.cjs.map +1 -1
  229. package/objects/BatchedMesh.js +3 -3
  230. package/objects/BatchedMesh.js.map +1 -1
  231. package/objects/GroundProjectedEnv.cjs +2 -1
  232. package/objects/GroundProjectedEnv.cjs.map +1 -1
  233. package/objects/GroundProjectedEnv.js +3 -2
  234. package/objects/GroundProjectedEnv.js.map +1 -1
  235. package/objects/Lensflare.cjs +211 -206
  236. package/objects/Lensflare.cjs.map +1 -1
  237. package/objects/Lensflare.js +212 -207
  238. package/objects/Lensflare.js.map +1 -1
  239. package/objects/Reflector.cjs +154 -146
  240. package/objects/Reflector.cjs.map +1 -1
  241. package/objects/Reflector.js +154 -146
  242. package/objects/Reflector.js.map +1 -1
  243. package/objects/ReflectorForSSRPass.cjs +183 -180
  244. package/objects/ReflectorForSSRPass.cjs.map +1 -1
  245. package/objects/ReflectorForSSRPass.js +183 -180
  246. package/objects/ReflectorForSSRPass.js.map +1 -1
  247. package/objects/Refractor.cjs +164 -161
  248. package/objects/Refractor.cjs.map +1 -1
  249. package/objects/Refractor.js +164 -161
  250. package/objects/Refractor.js.map +1 -1
  251. package/objects/ShadowMesh.cjs +1 -1
  252. package/objects/ShadowMesh.cjs.map +1 -1
  253. package/objects/ShadowMesh.js +2 -2
  254. package/objects/ShadowMesh.js.map +1 -1
  255. package/objects/Sky.cjs +35 -32
  256. package/objects/Sky.cjs.map +1 -1
  257. package/objects/Sky.d.ts +17 -42
  258. package/objects/Sky.js +35 -32
  259. package/objects/Sky.js.map +1 -1
  260. package/objects/Water.cjs +2 -1
  261. package/objects/Water.cjs.map +1 -1
  262. package/objects/Water.js +3 -2
  263. package/objects/Water.js.map +1 -1
  264. package/objects/Water2.cjs +143 -140
  265. package/objects/Water2.cjs.map +1 -1
  266. package/objects/Water2.js +143 -140
  267. package/objects/Water2.js.map +1 -1
  268. package/package.json +1 -1
  269. package/postprocessing/SAOPass.cjs +267 -264
  270. package/postprocessing/SAOPass.cjs.map +1 -1
  271. package/postprocessing/SAOPass.js +267 -264
  272. package/postprocessing/SAOPass.js.map +1 -1
  273. package/postprocessing/SSAOPass.cjs +253 -250
  274. package/postprocessing/SSAOPass.cjs.map +1 -1
  275. package/postprocessing/SSAOPass.js +253 -250
  276. package/postprocessing/SSAOPass.js.map +1 -1
  277. package/postprocessing/SSRPass.cjs +379 -376
  278. package/postprocessing/SSRPass.cjs.map +1 -1
  279. package/postprocessing/SSRPass.js +379 -376
  280. package/postprocessing/SSRPass.js.map +1 -1
  281. package/postprocessing/UnrealBloomPass.cjs +205 -202
  282. package/postprocessing/UnrealBloomPass.cjs.map +1 -1
  283. package/postprocessing/UnrealBloomPass.js +205 -202
  284. package/postprocessing/UnrealBloomPass.js.map +1 -1
  285. package/renderers/CSS2DRenderer.cjs +5 -5
  286. package/renderers/CSS2DRenderer.cjs.map +1 -1
  287. package/renderers/CSS2DRenderer.js +5 -5
  288. package/renderers/CSS2DRenderer.js.map +1 -1
  289. package/renderers/CSS3DRenderer.cjs +5 -5
  290. package/renderers/CSS3DRenderer.cjs.map +1 -1
  291. package/renderers/CSS3DRenderer.js +6 -6
  292. package/renderers/CSS3DRenderer.js.map +1 -1
  293. package/shaders/ACESFilmicToneMappingShader.cjs +71 -46
  294. package/shaders/ACESFilmicToneMappingShader.cjs.map +1 -1
  295. package/shaders/ACESFilmicToneMappingShader.js +71 -46
  296. package/shaders/ACESFilmicToneMappingShader.js.map +1 -1
  297. package/shaders/AfterimageShader.cjs +41 -22
  298. package/shaders/AfterimageShader.cjs.map +1 -1
  299. package/shaders/AfterimageShader.js +41 -22
  300. package/shaders/AfterimageShader.js.map +1 -1
  301. package/shaders/BasicShader.cjs +20 -6
  302. package/shaders/BasicShader.cjs.map +1 -1
  303. package/shaders/BasicShader.js +20 -6
  304. package/shaders/BasicShader.js.map +1 -1
  305. package/shaders/BleachBypassShader.cjs +46 -26
  306. package/shaders/BleachBypassShader.cjs.map +1 -1
  307. package/shaders/BleachBypassShader.js +46 -26
  308. package/shaders/BleachBypassShader.js.map +1 -1
  309. package/shaders/BlendShader.cjs +33 -19
  310. package/shaders/BlendShader.cjs.map +1 -1
  311. package/shaders/BlendShader.js +33 -19
  312. package/shaders/BlendShader.js.map +1 -1
  313. package/shaders/BokehShader.cjs +117 -90
  314. package/shaders/BokehShader.cjs.map +1 -1
  315. package/shaders/BokehShader.js +117 -90
  316. package/shaders/BokehShader.js.map +1 -1
  317. package/shaders/BokehShader2.cjs +333 -232
  318. package/shaders/BokehShader2.cjs.map +1 -1
  319. package/shaders/BokehShader2.js +333 -232
  320. package/shaders/BokehShader2.js.map +1 -1
  321. package/shaders/BrightnessContrastShader.cjs +38 -22
  322. package/shaders/BrightnessContrastShader.cjs.map +1 -1
  323. package/shaders/BrightnessContrastShader.js +38 -22
  324. package/shaders/BrightnessContrastShader.js.map +1 -1
  325. package/shaders/ColorCorrectionShader.cjs +35 -21
  326. package/shaders/ColorCorrectionShader.cjs.map +1 -1
  327. package/shaders/ColorCorrectionShader.js +35 -21
  328. package/shaders/ColorCorrectionShader.js.map +1 -1
  329. package/shaders/ColorifyShader.cjs +34 -19
  330. package/shaders/ColorifyShader.cjs.map +1 -1
  331. package/shaders/ColorifyShader.js +34 -19
  332. package/shaders/ColorifyShader.js.map +1 -1
  333. package/shaders/ConvolutionShader.cjs +43 -24
  334. package/shaders/ConvolutionShader.cjs.map +1 -1
  335. package/shaders/ConvolutionShader.js +43 -24
  336. package/shaders/ConvolutionShader.js.map +1 -1
  337. package/shaders/CopyShader.cjs +30 -16
  338. package/shaders/CopyShader.cjs.map +1 -1
  339. package/shaders/CopyShader.js +30 -16
  340. package/shaders/CopyShader.js.map +1 -1
  341. package/shaders/DOFMipMapShader.cjs +38 -21
  342. package/shaders/DOFMipMapShader.cjs.map +1 -1
  343. package/shaders/DOFMipMapShader.js +38 -21
  344. package/shaders/DOFMipMapShader.js.map +1 -1
  345. package/shaders/DepthLimitedBlurShader.cjs +98 -69
  346. package/shaders/DepthLimitedBlurShader.cjs.map +1 -1
  347. package/shaders/DepthLimitedBlurShader.js +98 -69
  348. package/shaders/DepthLimitedBlurShader.js.map +1 -1
  349. package/shaders/DigitalGlitch.cjs +70 -59
  350. package/shaders/DigitalGlitch.cjs.map +1 -1
  351. package/shaders/DigitalGlitch.js +70 -59
  352. package/shaders/DigitalGlitch.js.map +1 -1
  353. package/shaders/DotScreenShader.cjs +49 -28
  354. package/shaders/DotScreenShader.cjs.map +1 -1
  355. package/shaders/DotScreenShader.js +49 -28
  356. package/shaders/DotScreenShader.js.map +1 -1
  357. package/shaders/FXAAShader.cjs +1098 -1089
  358. package/shaders/FXAAShader.cjs.map +1 -1
  359. package/shaders/FXAAShader.js +1098 -1089
  360. package/shaders/FXAAShader.js.map +1 -1
  361. package/shaders/FilmShader.cjs +57 -29
  362. package/shaders/FilmShader.cjs.map +1 -1
  363. package/shaders/FilmShader.js +57 -29
  364. package/shaders/FilmShader.js.map +1 -1
  365. package/shaders/FocusShader.cjs +70 -43
  366. package/shaders/FocusShader.cjs.map +1 -1
  367. package/shaders/FocusShader.js +70 -43
  368. package/shaders/FocusShader.js.map +1 -1
  369. package/shaders/FreiChenShader.cjs +74 -53
  370. package/shaders/FreiChenShader.cjs.map +1 -1
  371. package/shaders/FreiChenShader.js +74 -53
  372. package/shaders/FreiChenShader.js.map +1 -1
  373. package/shaders/FresnelShader.cjs +55 -35
  374. package/shaders/FresnelShader.cjs.map +1 -1
  375. package/shaders/FresnelShader.js +55 -35
  376. package/shaders/FresnelShader.js.map +1 -1
  377. package/shaders/GammaCorrectionShader.cjs +33 -19
  378. package/shaders/GammaCorrectionShader.cjs.map +1 -1
  379. package/shaders/GammaCorrectionShader.js +33 -19
  380. package/shaders/GammaCorrectionShader.js.map +1 -1
  381. package/shaders/GodRaysShader.cjs +193 -116
  382. package/shaders/GodRaysShader.cjs.map +1 -1
  383. package/shaders/GodRaysShader.js +193 -116
  384. package/shaders/GodRaysShader.js.map +1 -1
  385. package/shaders/HalftoneShader.cjs +270 -192
  386. package/shaders/HalftoneShader.cjs.map +1 -1
  387. package/shaders/HalftoneShader.js +270 -192
  388. package/shaders/HalftoneShader.js.map +1 -1
  389. package/shaders/HorizontalTiltShiftShader.cjs +43 -27
  390. package/shaders/HorizontalTiltShiftShader.cjs.map +1 -1
  391. package/shaders/HorizontalTiltShiftShader.js +43 -27
  392. package/shaders/HorizontalTiltShiftShader.js.map +1 -1
  393. package/shaders/HueSaturationShader.cjs +47 -31
  394. package/shaders/HueSaturationShader.cjs.map +1 -1
  395. package/shaders/HueSaturationShader.js +47 -31
  396. package/shaders/HueSaturationShader.js.map +1 -1
  397. package/shaders/KaleidoShader.cjs +37 -24
  398. package/shaders/KaleidoShader.cjs.map +1 -1
  399. package/shaders/KaleidoShader.js +37 -24
  400. package/shaders/KaleidoShader.js.map +1 -1
  401. package/shaders/LuminosityHighPassShader.cjs +43 -24
  402. package/shaders/LuminosityHighPassShader.cjs.map +1 -1
  403. package/shaders/LuminosityHighPassShader.js +43 -24
  404. package/shaders/LuminosityHighPassShader.js.map +1 -1
  405. package/shaders/LuminosityShader.cjs +34 -17
  406. package/shaders/LuminosityShader.cjs.map +1 -1
  407. package/shaders/LuminosityShader.js +34 -17
  408. package/shaders/LuminosityShader.js.map +1 -1
  409. package/shaders/MirrorShader.cjs +39 -26
  410. package/shaders/MirrorShader.cjs.map +1 -1
  411. package/shaders/MirrorShader.js +39 -26
  412. package/shaders/MirrorShader.js.map +1 -1
  413. package/shaders/NormalMapShader.cjs +36 -21
  414. package/shaders/NormalMapShader.cjs.map +1 -1
  415. package/shaders/NormalMapShader.js +36 -21
  416. package/shaders/NormalMapShader.js.map +1 -1
  417. package/shaders/ParallaxShader.cjs +147 -97
  418. package/shaders/ParallaxShader.cjs.map +1 -1
  419. package/shaders/ParallaxShader.js +147 -97
  420. package/shaders/ParallaxShader.js.map +1 -1
  421. package/shaders/PixelShader.cjs +31 -18
  422. package/shaders/PixelShader.cjs.map +1 -1
  423. package/shaders/PixelShader.js +31 -18
  424. package/shaders/PixelShader.js.map +1 -1
  425. package/shaders/RGBShiftShader.cjs +33 -20
  426. package/shaders/RGBShiftShader.cjs.map +1 -1
  427. package/shaders/RGBShiftShader.js +33 -20
  428. package/shaders/RGBShiftShader.js.map +1 -1
  429. package/shaders/SAOShader.cjs +154 -117
  430. package/shaders/SAOShader.cjs.map +1 -1
  431. package/shaders/SAOShader.js +154 -117
  432. package/shaders/SAOShader.js.map +1 -1
  433. package/shaders/SMAAShader.cjs +358 -270
  434. package/shaders/SMAAShader.cjs.map +1 -1
  435. package/shaders/SMAAShader.js +358 -270
  436. package/shaders/SMAAShader.js.map +1 -1
  437. package/shaders/SSAOShader.cjs +236 -142
  438. package/shaders/SSAOShader.cjs.map +1 -1
  439. package/shaders/SSAOShader.js +236 -142
  440. package/shaders/SSAOShader.js.map +1 -1
  441. package/shaders/SSRShader.cjs +4 -4
  442. package/shaders/SSRShader.cjs.map +1 -1
  443. package/shaders/SSRShader.js +4 -4
  444. package/shaders/SSRShader.js.map +1 -1
  445. package/shaders/SepiaShader.cjs +36 -20
  446. package/shaders/SepiaShader.cjs.map +1 -1
  447. package/shaders/SepiaShader.js +36 -20
  448. package/shaders/SepiaShader.js.map +1 -1
  449. package/shaders/SobelOperatorShader.cjs +64 -37
  450. package/shaders/SobelOperatorShader.cjs.map +1 -1
  451. package/shaders/SobelOperatorShader.js +64 -37
  452. package/shaders/SobelOperatorShader.js.map +1 -1
  453. package/shaders/TechnicolorShader.cjs +29 -16
  454. package/shaders/TechnicolorShader.cjs.map +1 -1
  455. package/shaders/TechnicolorShader.js +29 -16
  456. package/shaders/TechnicolorShader.js.map +1 -1
  457. package/shaders/ToneMapShader.cjs +55 -35
  458. package/shaders/ToneMapShader.cjs.map +1 -1
  459. package/shaders/ToneMapShader.js +55 -35
  460. package/shaders/ToneMapShader.js.map +1 -1
  461. package/shaders/ToonShader.cjs +275 -165
  462. package/shaders/ToonShader.cjs.map +1 -1
  463. package/shaders/ToonShader.js +275 -165
  464. package/shaders/ToonShader.js.map +1 -1
  465. package/shaders/TriangleBlurShader.cjs +50 -27
  466. package/shaders/TriangleBlurShader.cjs.map +1 -1
  467. package/shaders/TriangleBlurShader.js +50 -27
  468. package/shaders/TriangleBlurShader.js.map +1 -1
  469. package/shaders/UnpackDepthRGBAShader.cjs +32 -17
  470. package/shaders/UnpackDepthRGBAShader.cjs.map +1 -1
  471. package/shaders/UnpackDepthRGBAShader.js +32 -17
  472. package/shaders/UnpackDepthRGBAShader.js.map +1 -1
  473. package/shaders/VerticalTiltShiftShader.cjs +43 -27
  474. package/shaders/VerticalTiltShiftShader.cjs.map +1 -1
  475. package/shaders/VerticalTiltShiftShader.js +43 -27
  476. package/shaders/VerticalTiltShiftShader.js.map +1 -1
  477. package/shaders/VignetteShader.cjs +43 -27
  478. package/shaders/VignetteShader.cjs.map +1 -1
  479. package/shaders/VignetteShader.js +43 -27
  480. package/shaders/VignetteShader.js.map +1 -1
  481. package/shaders/VolumeShader.cjs +264 -213
  482. package/shaders/VolumeShader.cjs.map +1 -1
  483. package/shaders/VolumeShader.js +264 -213
  484. package/shaders/VolumeShader.js.map +1 -1
  485. package/shaders/WaterRefractionShader.cjs +63 -35
  486. package/shaders/WaterRefractionShader.cjs.map +1 -1
  487. package/shaders/WaterRefractionShader.js +63 -35
  488. package/shaders/WaterRefractionShader.js.map +1 -1
  489. package/utils/GeometryCompressionUtils.cjs +2 -1
  490. package/utils/GeometryCompressionUtils.cjs.map +1 -1
  491. package/utils/GeometryCompressionUtils.js +3 -2
  492. package/utils/GeometryCompressionUtils.js.map +1 -1
  493. package/utils/RoughnessMipmapper.cjs +3 -3
  494. package/utils/RoughnessMipmapper.cjs.map +1 -1
  495. package/utils/RoughnessMipmapper.js +4 -4
  496. package/utils/RoughnessMipmapper.js.map +1 -1
  497. package/webxr/ARButton.cjs +3 -3
  498. package/webxr/ARButton.cjs.map +1 -1
  499. package/webxr/ARButton.d.ts +3 -3
  500. package/webxr/ARButton.js +3 -3
  501. package/webxr/ARButton.js.map +1 -1
  502. package/webxr/OculusHandPointerModel.cjs +2 -2
  503. package/webxr/OculusHandPointerModel.cjs.map +1 -1
  504. package/webxr/OculusHandPointerModel.js +2 -2
  505. package/webxr/OculusHandPointerModel.js.map +1 -1
  506. package/webxr/VRButton.cjs +98 -95
  507. package/webxr/VRButton.cjs.map +1 -1
  508. package/webxr/VRButton.d.ts +9 -6
  509. package/webxr/VRButton.js +98 -95
  510. package/webxr/VRButton.js.map +1 -1
  511. package/webxr/XRHandPrimitiveModel.cjs +2 -2
  512. package/webxr/XRHandPrimitiveModel.cjs.map +1 -1
  513. package/webxr/XRHandPrimitiveModel.js +3 -3
  514. package/webxr/XRHandPrimitiveModel.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"GeometryCompressionUtils.js","sources":["../../src/utils/GeometryCompressionUtils.js"],"sourcesContent":["/**\n * Octahedron and Quantization encodings based on work by:\n *\n * @link https://github.com/tsherif/mesh-quantization-example\n *\n */\n\nimport {\n BufferAttribute,\n Matrix3,\n Matrix4,\n MeshPhongMaterial,\n ShaderChunk,\n ShaderLib,\n UniformsUtils,\n Vector3,\n REVISION,\n} from 'three'\n\nvar GeometryCompressionUtils = {\n /**\n * Make the input mesh.geometry's normal attribute encoded and compressed by 3 different methods.\n * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the normal data.\n *\n * @param {THREE.Mesh} mesh\n * @param {String} encodeMethod\t\t\"DEFAULT\" || \"OCT1Byte\" || \"OCT2Byte\" || \"ANGLES\"\n *\n */\n compressNormals: function (mesh, encodeMethod) {\n if (!mesh.geometry) {\n console.error('Mesh must contain geometry. ')\n }\n\n const normal = mesh.geometry.attributes.normal\n\n if (!normal) {\n console.error('Geometry must contain normal attribute. ')\n }\n\n if (normal.isPacked) return\n\n if (normal.itemSize != 3) {\n console.error('normal.itemSize is not 3, which cannot be encoded. ')\n }\n\n const array = normal.array\n const count = normal.count\n\n let result\n if (encodeMethod == 'DEFAULT') {\n // TODO: Add 1 byte to the result, making the encoded length to be 4 bytes.\n result = new Uint8Array(count * 3)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.defaultEncode(array[idx], array[idx + 1], array[idx + 2], 1)\n\n result[idx + 0] = encoded[0]\n result[idx + 1] = encoded[1]\n result[idx + 2] = encoded[2]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 3, true))\n mesh.geometry.attributes.normal.bytes = result.length * 1\n } else if (encodeMethod == 'OCT1Byte') {\n /**\n * It is not recommended to use 1-byte octahedron normals encoding unless you want to extremely reduce the memory usage\n * As it makes vertex data not aligned to a 4 byte boundary which may harm some WebGL implementations and sometimes the normal distortion is visible\n * Please refer to @zeux 's comments in https://github.com/mrdoob/three.js/pull/18208\n */\n\n result = new Int8Array(count * 2)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.octEncodeBest(array[idx], array[idx + 1], array[idx + 2], 1)\n\n result[(idx / 3) * 2 + 0] = encoded[0]\n result[(idx / 3) * 2 + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.normal.bytes = result.length * 1\n } else if (encodeMethod == 'OCT2Byte') {\n result = new Int16Array(count * 2)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.octEncodeBest(array[idx], array[idx + 1], array[idx + 2], 2)\n\n result[(idx / 3) * 2 + 0] = encoded[0]\n result[(idx / 3) * 2 + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.normal.bytes = result.length * 2\n } else if (encodeMethod == 'ANGLES') {\n result = new Uint16Array(count * 2)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.anglesEncode(array[idx], array[idx + 1], array[idx + 2])\n\n result[(idx / 3) * 2 + 0] = encoded[0]\n result[(idx / 3) * 2 + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.normal.bytes = result.length * 2\n } else {\n console.error('Unrecognized encoding method, should be `DEFAULT` or `ANGLES` or `OCT`. ')\n }\n\n mesh.geometry.attributes.normal.needsUpdate = true\n mesh.geometry.attributes.normal.isPacked = true\n mesh.geometry.attributes.normal.packingMethod = encodeMethod\n\n // modify material\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n if (encodeMethod == 'ANGLES') {\n mesh.material.defines.USE_PACKED_NORMAL = 0\n }\n\n if (encodeMethod == 'OCT1Byte') {\n mesh.material.defines.USE_PACKED_NORMAL = 1\n }\n\n if (encodeMethod == 'OCT2Byte') {\n mesh.material.defines.USE_PACKED_NORMAL = 1\n }\n\n if (encodeMethod == 'DEFAULT') {\n mesh.material.defines.USE_PACKED_NORMAL = 2\n }\n },\n\n /**\n * Make the input mesh.geometry's position attribute encoded and compressed.\n * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the position data.\n *\n * @param {THREE.Mesh} mesh\n *\n */\n compressPositions: function (mesh) {\n if (!mesh.geometry) {\n console.error('Mesh must contain geometry. ')\n }\n\n const position = mesh.geometry.attributes.position\n\n if (!position) {\n console.error('Geometry must contain position attribute. ')\n }\n\n if (position.isPacked) return\n\n if (position.itemSize != 3) {\n console.error('position.itemSize is not 3, which cannot be packed. ')\n }\n\n const array = position.array\n const encodingBytes = 2\n\n const result = this.EncodingFuncs.quantizedEncode(array, encodingBytes)\n\n const quantized = result.quantized\n const decodeMat = result.decodeMat\n\n // IMPORTANT: calculate original geometry bounding info first, before updating packed positions\n if (mesh.geometry.boundingBox == null) mesh.geometry.computeBoundingBox()\n if (mesh.geometry.boundingSphere == null) mesh.geometry.computeBoundingSphere()\n\n mesh.geometry.setAttribute('position', new BufferAttribute(quantized, 3))\n mesh.geometry.attributes.position.isPacked = true\n mesh.geometry.attributes.position.needsUpdate = true\n mesh.geometry.attributes.position.bytes = quantized.length * encodingBytes\n\n // modify material\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n mesh.material.defines.USE_PACKED_POSITION = 0\n\n mesh.material.uniforms.quantizeMatPos.value = decodeMat\n mesh.material.uniforms.quantizeMatPos.needsUpdate = true\n },\n\n /**\n * Make the input mesh.geometry's uv attribute encoded and compressed.\n * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the uv data.\n *\n * @param {THREE.Mesh} mesh\n *\n */\n compressUvs: function (mesh) {\n if (!mesh.geometry) {\n console.error('Mesh must contain geometry property. ')\n }\n\n const uvs = mesh.geometry.attributes.uv\n\n if (!uvs) {\n console.error('Geometry must contain uv attribute. ')\n }\n\n if (uvs.isPacked) return\n\n const range = { min: Infinity, max: -Infinity }\n\n const array = uvs.array\n\n for (let i = 0; i < array.length; i++) {\n range.min = Math.min(range.min, array[i])\n range.max = Math.max(range.max, array[i])\n }\n\n let result\n\n if (range.min >= -1.0 && range.max <= 1.0) {\n // use default encoding method\n result = new Uint16Array(array.length)\n\n for (let i = 0; i < array.length; i += 2) {\n const encoded = this.EncodingFuncs.defaultEncode(array[i], array[i + 1], 0, 2)\n\n result[i] = encoded[0]\n result[i + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('uv', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.uv.isPacked = true\n mesh.geometry.attributes.uv.needsUpdate = true\n mesh.geometry.attributes.uv.bytes = result.length * 2\n\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n mesh.material.defines.USE_PACKED_UV = 0\n } else {\n // use quantized encoding method\n result = this.EncodingFuncs.quantizedEncodeUV(array, 2)\n\n mesh.geometry.setAttribute('uv', new BufferAttribute(result.quantized, 2))\n mesh.geometry.attributes.uv.isPacked = true\n mesh.geometry.attributes.uv.needsUpdate = true\n mesh.geometry.attributes.uv.bytes = result.quantized.length * 2\n\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n mesh.material.defines.USE_PACKED_UV = 1\n\n mesh.material.uniforms.quantizeMatUV.value = result.decodeMat\n mesh.material.uniforms.quantizeMatUV.needsUpdate = true\n }\n },\n\n EncodingFuncs: {\n defaultEncode: function (x, y, z, bytes) {\n if (bytes == 1) {\n const tmpx = Math.round((x + 1) * 0.5 * 255)\n const tmpy = Math.round((y + 1) * 0.5 * 255)\n const tmpz = Math.round((z + 1) * 0.5 * 255)\n return new Uint8Array([tmpx, tmpy, tmpz])\n } else if (bytes == 2) {\n const tmpx = Math.round((x + 1) * 0.5 * 65535)\n const tmpy = Math.round((y + 1) * 0.5 * 65535)\n const tmpz = Math.round((z + 1) * 0.5 * 65535)\n return new Uint16Array([tmpx, tmpy, tmpz])\n } else {\n console.error('number of bytes must be 1 or 2')\n }\n },\n\n defaultDecode: function (array, bytes) {\n if (bytes == 1) {\n return [(array[0] / 255) * 2.0 - 1.0, (array[1] / 255) * 2.0 - 1.0, (array[2] / 255) * 2.0 - 1.0]\n } else if (bytes == 2) {\n return [(array[0] / 65535) * 2.0 - 1.0, (array[1] / 65535) * 2.0 - 1.0, (array[2] / 65535) * 2.0 - 1.0]\n } else {\n console.error('number of bytes must be 1 or 2')\n }\n },\n\n // for `Angles` encoding\n anglesEncode: function (x, y, z) {\n const normal0 = parseInt(0.5 * (1.0 + Math.atan2(y, x) / Math.PI) * 65535)\n const normal1 = parseInt(0.5 * (1.0 + z) * 65535)\n return new Uint16Array([normal0, normal1])\n },\n\n // for `Octahedron` encoding\n octEncodeBest: function (x, y, z, bytes) {\n var oct, dec, best, currentCos, bestCos\n\n // Test various combinations of ceil and floor\n // to minimize rounding errors\n best = oct = octEncodeVec3(x, y, z, 'floor', 'floor')\n dec = octDecodeVec2(oct)\n bestCos = dot(x, y, z, dec)\n\n oct = octEncodeVec3(x, y, z, 'ceil', 'floor')\n dec = octDecodeVec2(oct)\n currentCos = dot(x, y, z, dec)\n\n if (currentCos > bestCos) {\n best = oct\n bestCos = currentCos\n }\n\n oct = octEncodeVec3(x, y, z, 'floor', 'ceil')\n dec = octDecodeVec2(oct)\n currentCos = dot(x, y, z, dec)\n\n if (currentCos > bestCos) {\n best = oct\n bestCos = currentCos\n }\n\n oct = octEncodeVec3(x, y, z, 'ceil', 'ceil')\n dec = octDecodeVec2(oct)\n currentCos = dot(x, y, z, dec)\n\n if (currentCos > bestCos) {\n best = oct\n }\n\n return best\n\n function octEncodeVec3(x0, y0, z0, xfunc, yfunc) {\n var x = x0 / (Math.abs(x0) + Math.abs(y0) + Math.abs(z0))\n var y = y0 / (Math.abs(x0) + Math.abs(y0) + Math.abs(z0))\n\n if (z < 0) {\n var tempx = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1)\n var tempy = (1 - Math.abs(x)) * (y >= 0 ? 1 : -1)\n\n x = tempx\n y = tempy\n\n var diff = 1 - Math.abs(x) - Math.abs(y)\n if (diff > 0) {\n diff += 0.001\n x += x > 0 ? diff / 2 : -diff / 2\n y += y > 0 ? diff / 2 : -diff / 2\n }\n }\n\n if (bytes == 1) {\n return new Int8Array([Math[xfunc](x * 127.5 + (x < 0 ? 1 : 0)), Math[yfunc](y * 127.5 + (y < 0 ? 1 : 0))])\n }\n\n if (bytes == 2) {\n return new Int16Array([\n Math[xfunc](x * 32767.5 + (x < 0 ? 1 : 0)),\n Math[yfunc](y * 32767.5 + (y < 0 ? 1 : 0)),\n ])\n }\n }\n\n function octDecodeVec2(oct) {\n var x = oct[0]\n var y = oct[1]\n\n if (bytes == 1) {\n x /= x < 0 ? 127 : 128\n y /= y < 0 ? 127 : 128\n } else if (bytes == 2) {\n x /= x < 0 ? 32767 : 32768\n y /= y < 0 ? 32767 : 32768\n }\n\n var z = 1 - Math.abs(x) - Math.abs(y)\n\n if (z < 0) {\n var tmpx = x\n x = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1)\n y = (1 - Math.abs(tmpx)) * (y >= 0 ? 1 : -1)\n }\n\n var length = Math.sqrt(x * x + y * y + z * z)\n\n return [x / length, y / length, z / length]\n }\n\n function dot(x, y, z, vec3) {\n return x * vec3[0] + y * vec3[1] + z * vec3[2]\n }\n },\n\n quantizedEncode: function (array, bytes) {\n let quantized, segments\n\n if (bytes == 1) {\n quantized = new Uint8Array(array.length)\n segments = 255\n } else if (bytes == 2) {\n quantized = new Uint16Array(array.length)\n segments = 65535\n } else {\n console.error('number of bytes error! ')\n }\n\n const decodeMat = new Matrix4()\n\n const min = new Float32Array(3)\n const max = new Float32Array(3)\n\n min[0] = min[1] = min[2] = Number.MAX_VALUE\n max[0] = max[1] = max[2] = -Number.MAX_VALUE\n\n for (let i = 0; i < array.length; i += 3) {\n min[0] = Math.min(min[0], array[i + 0])\n min[1] = Math.min(min[1], array[i + 1])\n min[2] = Math.min(min[2], array[i + 2])\n max[0] = Math.max(max[0], array[i + 0])\n max[1] = Math.max(max[1], array[i + 1])\n max[2] = Math.max(max[2], array[i + 2])\n }\n\n decodeMat.scale(\n new Vector3((max[0] - min[0]) / segments, (max[1] - min[1]) / segments, (max[2] - min[2]) / segments),\n )\n\n decodeMat.elements[12] = min[0]\n decodeMat.elements[13] = min[1]\n decodeMat.elements[14] = min[2]\n\n decodeMat.transpose()\n\n const multiplier = new Float32Array([\n max[0] !== min[0] ? segments / (max[0] - min[0]) : 0,\n max[1] !== min[1] ? segments / (max[1] - min[1]) : 0,\n max[2] !== min[2] ? segments / (max[2] - min[2]) : 0,\n ])\n\n for (let i = 0; i < array.length; i += 3) {\n quantized[i + 0] = Math.floor((array[i + 0] - min[0]) * multiplier[0])\n quantized[i + 1] = Math.floor((array[i + 1] - min[1]) * multiplier[1])\n quantized[i + 2] = Math.floor((array[i + 2] - min[2]) * multiplier[2])\n }\n\n return {\n quantized: quantized,\n decodeMat: decodeMat,\n }\n },\n\n quantizedEncodeUV: function (array, bytes) {\n let quantized, segments\n\n if (bytes == 1) {\n quantized = new Uint8Array(array.length)\n segments = 255\n } else if (bytes == 2) {\n quantized = new Uint16Array(array.length)\n segments = 65535\n } else {\n console.error('number of bytes error! ')\n }\n\n const decodeMat = new Matrix3()\n\n const min = new Float32Array(2)\n const max = new Float32Array(2)\n\n min[0] = min[1] = Number.MAX_VALUE\n max[0] = max[1] = -Number.MAX_VALUE\n\n for (let i = 0; i < array.length; i += 2) {\n min[0] = Math.min(min[0], array[i + 0])\n min[1] = Math.min(min[1], array[i + 1])\n max[0] = Math.max(max[0], array[i + 0])\n max[1] = Math.max(max[1], array[i + 1])\n }\n\n decodeMat.scale((max[0] - min[0]) / segments, (max[1] - min[1]) / segments)\n\n decodeMat.elements[6] = min[0]\n decodeMat.elements[7] = min[1]\n\n decodeMat.transpose()\n\n const multiplier = new Float32Array([\n max[0] !== min[0] ? segments / (max[0] - min[0]) : 0,\n max[1] !== min[1] ? segments / (max[1] - min[1]) : 0,\n ])\n\n for (let i = 0; i < array.length; i += 2) {\n quantized[i + 0] = Math.floor((array[i + 0] - min[0]) * multiplier[0])\n quantized[i + 1] = Math.floor((array[i + 1] - min[1]) * multiplier[1])\n }\n\n return {\n quantized: quantized,\n decodeMat: decodeMat,\n }\n },\n },\n}\n\n/**\n * `PackedPhongMaterial` inherited from THREE.MeshPhongMaterial\n *\n * @param {Object} parameters\n */\nclass PackedPhongMaterial extends MeshPhongMaterial {\n constructor(parameters) {\n super()\n\n this.defines = {}\n this.type = 'PackedPhongMaterial'\n this.uniforms = UniformsUtils.merge([\n ShaderLib.phong.uniforms,\n\n {\n quantizeMatPos: { value: null },\n quantizeMatUV: { value: null },\n },\n ])\n\n this.vertexShader = [\n '#define PHONG',\n\n 'varying vec3 vViewPosition;',\n\n '#ifndef FLAT_SHADED',\n 'varying vec3 vNormal;',\n '#endif',\n\n ShaderChunk.common,\n ShaderChunk.uv_pars_vertex,\n ShaderChunk.uv2_pars_vertex,\n ShaderChunk.displacementmap_pars_vertex,\n ShaderChunk.envmap_pars_vertex,\n ShaderChunk.color_pars_vertex,\n ShaderChunk.fog_pars_vertex,\n ShaderChunk.morphtarget_pars_vertex,\n ShaderChunk.skinning_pars_vertex,\n ShaderChunk.shadowmap_pars_vertex,\n ShaderChunk.logdepthbuf_pars_vertex,\n ShaderChunk.clipping_planes_pars_vertex,\n\n `#ifdef USE_PACKED_NORMAL\n\t\t\t\t\t#if USE_PACKED_NORMAL == 0\n\t\t\t\t\t\tvec3 decodeNormal(vec3 packedNormal)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfloat x = packedNormal.x * 2.0 - 1.0;\n\t\t\t\t\t\t\tfloat y = packedNormal.y * 2.0 - 1.0;\n\t\t\t\t\t\t\tvec2 scth = vec2(sin(x * PI), cos(x * PI));\n\t\t\t\t\t\t\tvec2 scphi = vec2(sqrt(1.0 - y * y), y);\n\t\t\t\t\t\t\treturn normalize( vec3(scth.y * scphi.x, scth.x * scphi.x, scphi.y) );\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#if USE_PACKED_NORMAL == 1\n\t\t\t\t\t\tvec3 decodeNormal(vec3 packedNormal)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec3 v = vec3(packedNormal.xy, 1.0 - abs(packedNormal.x) - abs(packedNormal.y));\n\t\t\t\t\t\t\tif (v.z < 0.0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tv.xy = (1.0 - abs(v.yx)) * vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn normalize(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#if USE_PACKED_NORMAL == 2\n\t\t\t\t\t\tvec3 decodeNormal(vec3 packedNormal)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec3 v = (packedNormal * 2.0) - 1.0;\n\t\t\t\t\t\t\treturn normalize(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n `#ifdef USE_PACKED_POSITION\n\t\t\t\t\t#if USE_PACKED_POSITION == 0\n\t\t\t\t\t\tuniform mat4 quantizeMatPos;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n `#ifdef USE_PACKED_UV\n\t\t\t\t\t#if USE_PACKED_UV == 1\n\t\t\t\t\t\tuniform mat3 quantizeMatUV;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n `#ifdef USE_PACKED_UV\n\t\t\t\t\t#if USE_PACKED_UV == 0\n\t\t\t\t\t\tvec2 decodeUV(vec2 packedUV)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec2 uv = (packedUV * 2.0) - 1.0;\n\t\t\t\t\t\t\treturn uv;\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#if USE_PACKED_UV == 1\n\t\t\t\t\t\tvec2 decodeUV(vec2 packedUV)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec2 uv = ( vec3(packedUV, 1.0) * quantizeMatUV ).xy;\n\t\t\t\t\t\t\treturn uv;\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n 'void main() {',\n\n ShaderChunk.uv_vertex,\n\n `#ifdef USE_UV\n\t\t\t\t\t#ifdef USE_PACKED_UV\n\t\t\t\t\t\tvUv = decodeUV(vUv);\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n ShaderChunk.uv2_vertex,\n ShaderChunk.color_vertex,\n ShaderChunk.beginnormal_vertex,\n\n `#ifdef USE_PACKED_NORMAL\n\t\t\t\t\tobjectNormal = decodeNormal(objectNormal);\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef USE_TANGENT\n\t\t\t\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t\t\t#endif\n\t\t\t\t`,\n\n ShaderChunk.morphnormal_vertex,\n ShaderChunk.skinbase_vertex,\n ShaderChunk.skinnormal_vertex,\n ShaderChunk.defaultnormal_vertex,\n\n '#ifndef FLAT_SHADED',\n '\tvNormal = normalize( transformedNormal );',\n '#endif',\n\n ShaderChunk.begin_vertex,\n\n `#ifdef USE_PACKED_POSITION\n\t\t\t\t\t#if USE_PACKED_POSITION == 0\n\t\t\t\t\t\ttransformed = ( vec4(transformed, 1.0) * quantizeMatPos ).xyz;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n ShaderChunk.morphtarget_vertex,\n ShaderChunk.skinning_vertex,\n ShaderChunk.displacementmap_vertex,\n ShaderChunk.project_vertex,\n ShaderChunk.logdepthbuf_vertex,\n ShaderChunk.clipping_planes_vertex,\n\n 'vViewPosition = - mvPosition.xyz;',\n\n ShaderChunk.worldpos_vertex,\n ShaderChunk.envmap_vertex,\n ShaderChunk.shadowmap_vertex,\n ShaderChunk.fog_vertex,\n\n '}',\n ].join('\\n')\n\n // Use the original MeshPhongMaterial's fragmentShader.\n this.fragmentShader = [\n '#define PHONG',\n\n 'uniform vec3 diffuse;',\n 'uniform vec3 emissive;',\n 'uniform vec3 specular;',\n 'uniform float shininess;',\n 'uniform float opacity;',\n\n ShaderChunk.common,\n ShaderChunk.packing,\n ShaderChunk.dithering_pars_fragment,\n ShaderChunk.color_pars_fragment,\n ShaderChunk.uv_pars_fragment,\n ShaderChunk.uv2_pars_fragment,\n ShaderChunk.map_pars_fragment,\n ShaderChunk.alphamap_pars_fragment,\n ShaderChunk.aomap_pars_fragment,\n ShaderChunk.lightmap_pars_fragment,\n ShaderChunk.emissivemap_pars_fragment,\n ShaderChunk.envmap_common_pars_fragment,\n ShaderChunk.envmap_pars_fragment,\n ShaderChunk.cube_uv_reflection_fragment,\n ShaderChunk.fog_pars_fragment,\n ShaderChunk.bsdfs,\n ShaderChunk.lights_pars_begin,\n ShaderChunk.lights_phong_pars_fragment,\n ShaderChunk.shadowmap_pars_fragment,\n ShaderChunk.bumpmap_pars_fragment,\n ShaderChunk.normalmap_pars_fragment,\n ShaderChunk.specularmap_pars_fragment,\n ShaderChunk.logdepthbuf_pars_fragment,\n ShaderChunk.clipping_planes_pars_fragment,\n\n 'void main() {',\n\n ShaderChunk.clipping_planes_fragment,\n\n 'vec4 diffuseColor = vec4( diffuse, opacity );',\n 'ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );',\n 'vec3 totalEmissiveRadiance = emissive;',\n\n ShaderChunk.logdepthbuf_fragment,\n ShaderChunk.map_fragment,\n ShaderChunk.color_fragment,\n ShaderChunk.alphamap_fragment,\n ShaderChunk.alphatest_fragment,\n ShaderChunk.specularmap_fragment,\n ShaderChunk.normal_fragment_begin,\n ShaderChunk.normal_fragment_maps,\n ShaderChunk.emissivemap_fragment,\n\n // accumulation\n ShaderChunk.lights_phong_fragment,\n ShaderChunk.lights_fragment_begin,\n ShaderChunk.lights_fragment_maps,\n ShaderChunk.lights_fragment_end,\n\n // modulation\n ShaderChunk.aomap_fragment,\n\n 'vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;',\n\n ShaderChunk.envmap_fragment,\n\n 'gl_FragColor = vec4( outgoingLight, diffuseColor.a );',\n\n ShaderChunk.tonemapping_fragment,\n parseInt(REVISION.replace(/\\D+/g, '')) >= 154 ? ShaderChunk.colorspace_fragment : ShaderChunk.encodings_fragment,\n ShaderChunk.fog_fragment,\n ShaderChunk.premultiplied_alpha_fragment,\n ShaderChunk.dithering_fragment,\n '}',\n ].join('\\n')\n\n this.setValues(parameters)\n }\n}\n\nexport { GeometryCompressionUtils, PackedPhongMaterial }\n"],"names":["x","y","oct","z"],"mappings":"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"}
1
+ {"version":3,"file":"GeometryCompressionUtils.js","sources":["../../src/utils/GeometryCompressionUtils.js"],"sourcesContent":["/**\n * Octahedron and Quantization encodings based on work by:\n *\n * @link https://github.com/tsherif/mesh-quantization-example\n *\n */\n\nimport {\n BufferAttribute,\n Matrix3,\n Matrix4,\n MeshPhongMaterial,\n ShaderChunk,\n ShaderLib,\n UniformsUtils,\n Vector3,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nvar GeometryCompressionUtils = {\n /**\n * Make the input mesh.geometry's normal attribute encoded and compressed by 3 different methods.\n * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the normal data.\n *\n * @param {THREE.Mesh} mesh\n * @param {String} encodeMethod\t\t\"DEFAULT\" || \"OCT1Byte\" || \"OCT2Byte\" || \"ANGLES\"\n *\n */\n compressNormals: function (mesh, encodeMethod) {\n if (!mesh.geometry) {\n console.error('Mesh must contain geometry. ')\n }\n\n const normal = mesh.geometry.attributes.normal\n\n if (!normal) {\n console.error('Geometry must contain normal attribute. ')\n }\n\n if (normal.isPacked) return\n\n if (normal.itemSize != 3) {\n console.error('normal.itemSize is not 3, which cannot be encoded. ')\n }\n\n const array = normal.array\n const count = normal.count\n\n let result\n if (encodeMethod == 'DEFAULT') {\n // TODO: Add 1 byte to the result, making the encoded length to be 4 bytes.\n result = new Uint8Array(count * 3)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.defaultEncode(array[idx], array[idx + 1], array[idx + 2], 1)\n\n result[idx + 0] = encoded[0]\n result[idx + 1] = encoded[1]\n result[idx + 2] = encoded[2]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 3, true))\n mesh.geometry.attributes.normal.bytes = result.length * 1\n } else if (encodeMethod == 'OCT1Byte') {\n /**\n * It is not recommended to use 1-byte octahedron normals encoding unless you want to extremely reduce the memory usage\n * As it makes vertex data not aligned to a 4 byte boundary which may harm some WebGL implementations and sometimes the normal distortion is visible\n * Please refer to @zeux 's comments in https://github.com/mrdoob/three.js/pull/18208\n */\n\n result = new Int8Array(count * 2)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.octEncodeBest(array[idx], array[idx + 1], array[idx + 2], 1)\n\n result[(idx / 3) * 2 + 0] = encoded[0]\n result[(idx / 3) * 2 + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.normal.bytes = result.length * 1\n } else if (encodeMethod == 'OCT2Byte') {\n result = new Int16Array(count * 2)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.octEncodeBest(array[idx], array[idx + 1], array[idx + 2], 2)\n\n result[(idx / 3) * 2 + 0] = encoded[0]\n result[(idx / 3) * 2 + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.normal.bytes = result.length * 2\n } else if (encodeMethod == 'ANGLES') {\n result = new Uint16Array(count * 2)\n\n for (let idx = 0; idx < array.length; idx += 3) {\n const encoded = this.EncodingFuncs.anglesEncode(array[idx], array[idx + 1], array[idx + 2])\n\n result[(idx / 3) * 2 + 0] = encoded[0]\n result[(idx / 3) * 2 + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('normal', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.normal.bytes = result.length * 2\n } else {\n console.error('Unrecognized encoding method, should be `DEFAULT` or `ANGLES` or `OCT`. ')\n }\n\n mesh.geometry.attributes.normal.needsUpdate = true\n mesh.geometry.attributes.normal.isPacked = true\n mesh.geometry.attributes.normal.packingMethod = encodeMethod\n\n // modify material\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n if (encodeMethod == 'ANGLES') {\n mesh.material.defines.USE_PACKED_NORMAL = 0\n }\n\n if (encodeMethod == 'OCT1Byte') {\n mesh.material.defines.USE_PACKED_NORMAL = 1\n }\n\n if (encodeMethod == 'OCT2Byte') {\n mesh.material.defines.USE_PACKED_NORMAL = 1\n }\n\n if (encodeMethod == 'DEFAULT') {\n mesh.material.defines.USE_PACKED_NORMAL = 2\n }\n },\n\n /**\n * Make the input mesh.geometry's position attribute encoded and compressed.\n * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the position data.\n *\n * @param {THREE.Mesh} mesh\n *\n */\n compressPositions: function (mesh) {\n if (!mesh.geometry) {\n console.error('Mesh must contain geometry. ')\n }\n\n const position = mesh.geometry.attributes.position\n\n if (!position) {\n console.error('Geometry must contain position attribute. ')\n }\n\n if (position.isPacked) return\n\n if (position.itemSize != 3) {\n console.error('position.itemSize is not 3, which cannot be packed. ')\n }\n\n const array = position.array\n const encodingBytes = 2\n\n const result = this.EncodingFuncs.quantizedEncode(array, encodingBytes)\n\n const quantized = result.quantized\n const decodeMat = result.decodeMat\n\n // IMPORTANT: calculate original geometry bounding info first, before updating packed positions\n if (mesh.geometry.boundingBox == null) mesh.geometry.computeBoundingBox()\n if (mesh.geometry.boundingSphere == null) mesh.geometry.computeBoundingSphere()\n\n mesh.geometry.setAttribute('position', new BufferAttribute(quantized, 3))\n mesh.geometry.attributes.position.isPacked = true\n mesh.geometry.attributes.position.needsUpdate = true\n mesh.geometry.attributes.position.bytes = quantized.length * encodingBytes\n\n // modify material\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n mesh.material.defines.USE_PACKED_POSITION = 0\n\n mesh.material.uniforms.quantizeMatPos.value = decodeMat\n mesh.material.uniforms.quantizeMatPos.needsUpdate = true\n },\n\n /**\n * Make the input mesh.geometry's uv attribute encoded and compressed.\n * Also will change the mesh.material to `PackedPhongMaterial` which let the vertex shader program decode the uv data.\n *\n * @param {THREE.Mesh} mesh\n *\n */\n compressUvs: function (mesh) {\n if (!mesh.geometry) {\n console.error('Mesh must contain geometry property. ')\n }\n\n const uvs = mesh.geometry.attributes.uv\n\n if (!uvs) {\n console.error('Geometry must contain uv attribute. ')\n }\n\n if (uvs.isPacked) return\n\n const range = { min: Infinity, max: -Infinity }\n\n const array = uvs.array\n\n for (let i = 0; i < array.length; i++) {\n range.min = Math.min(range.min, array[i])\n range.max = Math.max(range.max, array[i])\n }\n\n let result\n\n if (range.min >= -1.0 && range.max <= 1.0) {\n // use default encoding method\n result = new Uint16Array(array.length)\n\n for (let i = 0; i < array.length; i += 2) {\n const encoded = this.EncodingFuncs.defaultEncode(array[i], array[i + 1], 0, 2)\n\n result[i] = encoded[0]\n result[i + 1] = encoded[1]\n }\n\n mesh.geometry.setAttribute('uv', new BufferAttribute(result, 2, true))\n mesh.geometry.attributes.uv.isPacked = true\n mesh.geometry.attributes.uv.needsUpdate = true\n mesh.geometry.attributes.uv.bytes = result.length * 2\n\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n mesh.material.defines.USE_PACKED_UV = 0\n } else {\n // use quantized encoding method\n result = this.EncodingFuncs.quantizedEncodeUV(array, 2)\n\n mesh.geometry.setAttribute('uv', new BufferAttribute(result.quantized, 2))\n mesh.geometry.attributes.uv.isPacked = true\n mesh.geometry.attributes.uv.needsUpdate = true\n mesh.geometry.attributes.uv.bytes = result.quantized.length * 2\n\n if (!(mesh.material instanceof PackedPhongMaterial)) {\n mesh.material = new PackedPhongMaterial().copy(mesh.material)\n }\n\n mesh.material.defines.USE_PACKED_UV = 1\n\n mesh.material.uniforms.quantizeMatUV.value = result.decodeMat\n mesh.material.uniforms.quantizeMatUV.needsUpdate = true\n }\n },\n\n EncodingFuncs: {\n defaultEncode: function (x, y, z, bytes) {\n if (bytes == 1) {\n const tmpx = Math.round((x + 1) * 0.5 * 255)\n const tmpy = Math.round((y + 1) * 0.5 * 255)\n const tmpz = Math.round((z + 1) * 0.5 * 255)\n return new Uint8Array([tmpx, tmpy, tmpz])\n } else if (bytes == 2) {\n const tmpx = Math.round((x + 1) * 0.5 * 65535)\n const tmpy = Math.round((y + 1) * 0.5 * 65535)\n const tmpz = Math.round((z + 1) * 0.5 * 65535)\n return new Uint16Array([tmpx, tmpy, tmpz])\n } else {\n console.error('number of bytes must be 1 or 2')\n }\n },\n\n defaultDecode: function (array, bytes) {\n if (bytes == 1) {\n return [(array[0] / 255) * 2.0 - 1.0, (array[1] / 255) * 2.0 - 1.0, (array[2] / 255) * 2.0 - 1.0]\n } else if (bytes == 2) {\n return [(array[0] / 65535) * 2.0 - 1.0, (array[1] / 65535) * 2.0 - 1.0, (array[2] / 65535) * 2.0 - 1.0]\n } else {\n console.error('number of bytes must be 1 or 2')\n }\n },\n\n // for `Angles` encoding\n anglesEncode: function (x, y, z) {\n const normal0 = parseInt(0.5 * (1.0 + Math.atan2(y, x) / Math.PI) * 65535)\n const normal1 = parseInt(0.5 * (1.0 + z) * 65535)\n return new Uint16Array([normal0, normal1])\n },\n\n // for `Octahedron` encoding\n octEncodeBest: function (x, y, z, bytes) {\n var oct, dec, best, currentCos, bestCos\n\n // Test various combinations of ceil and floor\n // to minimize rounding errors\n best = oct = octEncodeVec3(x, y, z, 'floor', 'floor')\n dec = octDecodeVec2(oct)\n bestCos = dot(x, y, z, dec)\n\n oct = octEncodeVec3(x, y, z, 'ceil', 'floor')\n dec = octDecodeVec2(oct)\n currentCos = dot(x, y, z, dec)\n\n if (currentCos > bestCos) {\n best = oct\n bestCos = currentCos\n }\n\n oct = octEncodeVec3(x, y, z, 'floor', 'ceil')\n dec = octDecodeVec2(oct)\n currentCos = dot(x, y, z, dec)\n\n if (currentCos > bestCos) {\n best = oct\n bestCos = currentCos\n }\n\n oct = octEncodeVec3(x, y, z, 'ceil', 'ceil')\n dec = octDecodeVec2(oct)\n currentCos = dot(x, y, z, dec)\n\n if (currentCos > bestCos) {\n best = oct\n }\n\n return best\n\n function octEncodeVec3(x0, y0, z0, xfunc, yfunc) {\n var x = x0 / (Math.abs(x0) + Math.abs(y0) + Math.abs(z0))\n var y = y0 / (Math.abs(x0) + Math.abs(y0) + Math.abs(z0))\n\n if (z < 0) {\n var tempx = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1)\n var tempy = (1 - Math.abs(x)) * (y >= 0 ? 1 : -1)\n\n x = tempx\n y = tempy\n\n var diff = 1 - Math.abs(x) - Math.abs(y)\n if (diff > 0) {\n diff += 0.001\n x += x > 0 ? diff / 2 : -diff / 2\n y += y > 0 ? diff / 2 : -diff / 2\n }\n }\n\n if (bytes == 1) {\n return new Int8Array([Math[xfunc](x * 127.5 + (x < 0 ? 1 : 0)), Math[yfunc](y * 127.5 + (y < 0 ? 1 : 0))])\n }\n\n if (bytes == 2) {\n return new Int16Array([\n Math[xfunc](x * 32767.5 + (x < 0 ? 1 : 0)),\n Math[yfunc](y * 32767.5 + (y < 0 ? 1 : 0)),\n ])\n }\n }\n\n function octDecodeVec2(oct) {\n var x = oct[0]\n var y = oct[1]\n\n if (bytes == 1) {\n x /= x < 0 ? 127 : 128\n y /= y < 0 ? 127 : 128\n } else if (bytes == 2) {\n x /= x < 0 ? 32767 : 32768\n y /= y < 0 ? 32767 : 32768\n }\n\n var z = 1 - Math.abs(x) - Math.abs(y)\n\n if (z < 0) {\n var tmpx = x\n x = (1 - Math.abs(y)) * (x >= 0 ? 1 : -1)\n y = (1 - Math.abs(tmpx)) * (y >= 0 ? 1 : -1)\n }\n\n var length = Math.sqrt(x * x + y * y + z * z)\n\n return [x / length, y / length, z / length]\n }\n\n function dot(x, y, z, vec3) {\n return x * vec3[0] + y * vec3[1] + z * vec3[2]\n }\n },\n\n quantizedEncode: function (array, bytes) {\n let quantized, segments\n\n if (bytes == 1) {\n quantized = new Uint8Array(array.length)\n segments = 255\n } else if (bytes == 2) {\n quantized = new Uint16Array(array.length)\n segments = 65535\n } else {\n console.error('number of bytes error! ')\n }\n\n const decodeMat = new Matrix4()\n\n const min = new Float32Array(3)\n const max = new Float32Array(3)\n\n min[0] = min[1] = min[2] = Number.MAX_VALUE\n max[0] = max[1] = max[2] = -Number.MAX_VALUE\n\n for (let i = 0; i < array.length; i += 3) {\n min[0] = Math.min(min[0], array[i + 0])\n min[1] = Math.min(min[1], array[i + 1])\n min[2] = Math.min(min[2], array[i + 2])\n max[0] = Math.max(max[0], array[i + 0])\n max[1] = Math.max(max[1], array[i + 1])\n max[2] = Math.max(max[2], array[i + 2])\n }\n\n decodeMat.scale(\n new Vector3((max[0] - min[0]) / segments, (max[1] - min[1]) / segments, (max[2] - min[2]) / segments),\n )\n\n decodeMat.elements[12] = min[0]\n decodeMat.elements[13] = min[1]\n decodeMat.elements[14] = min[2]\n\n decodeMat.transpose()\n\n const multiplier = new Float32Array([\n max[0] !== min[0] ? segments / (max[0] - min[0]) : 0,\n max[1] !== min[1] ? segments / (max[1] - min[1]) : 0,\n max[2] !== min[2] ? segments / (max[2] - min[2]) : 0,\n ])\n\n for (let i = 0; i < array.length; i += 3) {\n quantized[i + 0] = Math.floor((array[i + 0] - min[0]) * multiplier[0])\n quantized[i + 1] = Math.floor((array[i + 1] - min[1]) * multiplier[1])\n quantized[i + 2] = Math.floor((array[i + 2] - min[2]) * multiplier[2])\n }\n\n return {\n quantized: quantized,\n decodeMat: decodeMat,\n }\n },\n\n quantizedEncodeUV: function (array, bytes) {\n let quantized, segments\n\n if (bytes == 1) {\n quantized = new Uint8Array(array.length)\n segments = 255\n } else if (bytes == 2) {\n quantized = new Uint16Array(array.length)\n segments = 65535\n } else {\n console.error('number of bytes error! ')\n }\n\n const decodeMat = new Matrix3()\n\n const min = new Float32Array(2)\n const max = new Float32Array(2)\n\n min[0] = min[1] = Number.MAX_VALUE\n max[0] = max[1] = -Number.MAX_VALUE\n\n for (let i = 0; i < array.length; i += 2) {\n min[0] = Math.min(min[0], array[i + 0])\n min[1] = Math.min(min[1], array[i + 1])\n max[0] = Math.max(max[0], array[i + 0])\n max[1] = Math.max(max[1], array[i + 1])\n }\n\n decodeMat.scale((max[0] - min[0]) / segments, (max[1] - min[1]) / segments)\n\n decodeMat.elements[6] = min[0]\n decodeMat.elements[7] = min[1]\n\n decodeMat.transpose()\n\n const multiplier = new Float32Array([\n max[0] !== min[0] ? segments / (max[0] - min[0]) : 0,\n max[1] !== min[1] ? segments / (max[1] - min[1]) : 0,\n ])\n\n for (let i = 0; i < array.length; i += 2) {\n quantized[i + 0] = Math.floor((array[i + 0] - min[0]) * multiplier[0])\n quantized[i + 1] = Math.floor((array[i + 1] - min[1]) * multiplier[1])\n }\n\n return {\n quantized: quantized,\n decodeMat: decodeMat,\n }\n },\n },\n}\n\n/**\n * `PackedPhongMaterial` inherited from THREE.MeshPhongMaterial\n *\n * @param {Object} parameters\n */\nclass PackedPhongMaterial extends MeshPhongMaterial {\n constructor(parameters) {\n super()\n\n this.defines = {}\n this.type = 'PackedPhongMaterial'\n this.uniforms = UniformsUtils.merge([\n ShaderLib.phong.uniforms,\n\n {\n quantizeMatPos: { value: null },\n quantizeMatUV: { value: null },\n },\n ])\n\n this.vertexShader = [\n '#define PHONG',\n\n 'varying vec3 vViewPosition;',\n\n '#ifndef FLAT_SHADED',\n 'varying vec3 vNormal;',\n '#endif',\n\n ShaderChunk.common,\n ShaderChunk.uv_pars_vertex,\n ShaderChunk.uv2_pars_vertex,\n ShaderChunk.displacementmap_pars_vertex,\n ShaderChunk.envmap_pars_vertex,\n ShaderChunk.color_pars_vertex,\n ShaderChunk.fog_pars_vertex,\n ShaderChunk.morphtarget_pars_vertex,\n ShaderChunk.skinning_pars_vertex,\n ShaderChunk.shadowmap_pars_vertex,\n ShaderChunk.logdepthbuf_pars_vertex,\n ShaderChunk.clipping_planes_pars_vertex,\n\n `#ifdef USE_PACKED_NORMAL\n\t\t\t\t\t#if USE_PACKED_NORMAL == 0\n\t\t\t\t\t\tvec3 decodeNormal(vec3 packedNormal)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfloat x = packedNormal.x * 2.0 - 1.0;\n\t\t\t\t\t\t\tfloat y = packedNormal.y * 2.0 - 1.0;\n\t\t\t\t\t\t\tvec2 scth = vec2(sin(x * PI), cos(x * PI));\n\t\t\t\t\t\t\tvec2 scphi = vec2(sqrt(1.0 - y * y), y);\n\t\t\t\t\t\t\treturn normalize( vec3(scth.y * scphi.x, scth.x * scphi.x, scphi.y) );\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#if USE_PACKED_NORMAL == 1\n\t\t\t\t\t\tvec3 decodeNormal(vec3 packedNormal)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec3 v = vec3(packedNormal.xy, 1.0 - abs(packedNormal.x) - abs(packedNormal.y));\n\t\t\t\t\t\t\tif (v.z < 0.0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tv.xy = (1.0 - abs(v.yx)) * vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn normalize(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#if USE_PACKED_NORMAL == 2\n\t\t\t\t\t\tvec3 decodeNormal(vec3 packedNormal)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec3 v = (packedNormal * 2.0) - 1.0;\n\t\t\t\t\t\t\treturn normalize(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n `#ifdef USE_PACKED_POSITION\n\t\t\t\t\t#if USE_PACKED_POSITION == 0\n\t\t\t\t\t\tuniform mat4 quantizeMatPos;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n `#ifdef USE_PACKED_UV\n\t\t\t\t\t#if USE_PACKED_UV == 1\n\t\t\t\t\t\tuniform mat3 quantizeMatUV;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n `#ifdef USE_PACKED_UV\n\t\t\t\t\t#if USE_PACKED_UV == 0\n\t\t\t\t\t\tvec2 decodeUV(vec2 packedUV)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec2 uv = (packedUV * 2.0) - 1.0;\n\t\t\t\t\t\t\treturn uv;\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#if USE_PACKED_UV == 1\n\t\t\t\t\t\tvec2 decodeUV(vec2 packedUV)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvec2 uv = ( vec3(packedUV, 1.0) * quantizeMatUV ).xy;\n\t\t\t\t\t\t\treturn uv;\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n 'void main() {',\n\n ShaderChunk.uv_vertex,\n\n `#ifdef USE_UV\n\t\t\t\t\t#ifdef USE_PACKED_UV\n\t\t\t\t\t\tvUv = decodeUV(vUv);\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n ShaderChunk.uv2_vertex,\n ShaderChunk.color_vertex,\n ShaderChunk.beginnormal_vertex,\n\n `#ifdef USE_PACKED_NORMAL\n\t\t\t\t\tobjectNormal = decodeNormal(objectNormal);\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef USE_TANGENT\n\t\t\t\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t\t\t#endif\n\t\t\t\t`,\n\n ShaderChunk.morphnormal_vertex,\n ShaderChunk.skinbase_vertex,\n ShaderChunk.skinnormal_vertex,\n ShaderChunk.defaultnormal_vertex,\n\n '#ifndef FLAT_SHADED',\n '\tvNormal = normalize( transformedNormal );',\n '#endif',\n\n ShaderChunk.begin_vertex,\n\n `#ifdef USE_PACKED_POSITION\n\t\t\t\t\t#if USE_PACKED_POSITION == 0\n\t\t\t\t\t\ttransformed = ( vec4(transformed, 1.0) * quantizeMatPos ).xyz;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`,\n\n ShaderChunk.morphtarget_vertex,\n ShaderChunk.skinning_vertex,\n ShaderChunk.displacementmap_vertex,\n ShaderChunk.project_vertex,\n ShaderChunk.logdepthbuf_vertex,\n ShaderChunk.clipping_planes_vertex,\n\n 'vViewPosition = - mvPosition.xyz;',\n\n ShaderChunk.worldpos_vertex,\n ShaderChunk.envmap_vertex,\n ShaderChunk.shadowmap_vertex,\n ShaderChunk.fog_vertex,\n\n '}',\n ].join('\\n')\n\n // Use the original MeshPhongMaterial's fragmentShader.\n this.fragmentShader = [\n '#define PHONG',\n\n 'uniform vec3 diffuse;',\n 'uniform vec3 emissive;',\n 'uniform vec3 specular;',\n 'uniform float shininess;',\n 'uniform float opacity;',\n\n ShaderChunk.common,\n ShaderChunk.packing,\n ShaderChunk.dithering_pars_fragment,\n ShaderChunk.color_pars_fragment,\n ShaderChunk.uv_pars_fragment,\n ShaderChunk.uv2_pars_fragment,\n ShaderChunk.map_pars_fragment,\n ShaderChunk.alphamap_pars_fragment,\n ShaderChunk.aomap_pars_fragment,\n ShaderChunk.lightmap_pars_fragment,\n ShaderChunk.emissivemap_pars_fragment,\n ShaderChunk.envmap_common_pars_fragment,\n ShaderChunk.envmap_pars_fragment,\n ShaderChunk.cube_uv_reflection_fragment,\n ShaderChunk.fog_pars_fragment,\n ShaderChunk.bsdfs,\n ShaderChunk.lights_pars_begin,\n ShaderChunk.lights_phong_pars_fragment,\n ShaderChunk.shadowmap_pars_fragment,\n ShaderChunk.bumpmap_pars_fragment,\n ShaderChunk.normalmap_pars_fragment,\n ShaderChunk.specularmap_pars_fragment,\n ShaderChunk.logdepthbuf_pars_fragment,\n ShaderChunk.clipping_planes_pars_fragment,\n\n 'void main() {',\n\n ShaderChunk.clipping_planes_fragment,\n\n 'vec4 diffuseColor = vec4( diffuse, opacity );',\n 'ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );',\n 'vec3 totalEmissiveRadiance = emissive;',\n\n ShaderChunk.logdepthbuf_fragment,\n ShaderChunk.map_fragment,\n ShaderChunk.color_fragment,\n ShaderChunk.alphamap_fragment,\n ShaderChunk.alphatest_fragment,\n ShaderChunk.specularmap_fragment,\n ShaderChunk.normal_fragment_begin,\n ShaderChunk.normal_fragment_maps,\n ShaderChunk.emissivemap_fragment,\n\n // accumulation\n ShaderChunk.lights_phong_fragment,\n ShaderChunk.lights_fragment_begin,\n ShaderChunk.lights_fragment_maps,\n ShaderChunk.lights_fragment_end,\n\n // modulation\n ShaderChunk.aomap_fragment,\n\n 'vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;',\n\n ShaderChunk.envmap_fragment,\n\n 'gl_FragColor = vec4( outgoingLight, diffuseColor.a );',\n\n ShaderChunk.tonemapping_fragment,\n version >= 154 ? ShaderChunk.colorspace_fragment : ShaderChunk.encodings_fragment,\n ShaderChunk.fog_fragment,\n ShaderChunk.premultiplied_alpha_fragment,\n ShaderChunk.dithering_fragment,\n '}',\n ].join('\\n')\n\n this.setValues(parameters)\n }\n}\n\nexport { GeometryCompressionUtils, PackedPhongMaterial }\n"],"names":["x","y","oct","z"],"mappings":";;AAmBG,IAAC,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7B,iBAAiB,SAAU,MAAM,cAAc;AAC7C,QAAI,CAAC,KAAK,UAAU;AAClB,cAAQ,MAAM,8BAA8B;AAAA,IAC7C;AAED,UAAM,SAAS,KAAK,SAAS,WAAW;AAExC,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,0CAA0C;AAAA,IACzD;AAED,QAAI,OAAO;AAAU;AAErB,QAAI,OAAO,YAAY,GAAG;AACxB,cAAQ,MAAM,qDAAqD;AAAA,IACpE;AAED,UAAM,QAAQ,OAAO;AACrB,UAAM,QAAQ,OAAO;AAErB,QAAI;AACJ,QAAI,gBAAgB,WAAW;AAE7B,eAAS,IAAI,WAAW,QAAQ,CAAC;AAEjC,eAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC9C,cAAM,UAAU,KAAK,cAAc,cAAc,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;AAE9F,eAAO,MAAM,CAAC,IAAI,QAAQ,CAAC;AAC3B,eAAO,MAAM,CAAC,IAAI,QAAQ,CAAC;AAC3B,eAAO,MAAM,CAAC,IAAI,QAAQ,CAAC;AAAA,MAC5B;AAED,WAAK,SAAS,aAAa,UAAU,IAAI,gBAAgB,QAAQ,GAAG,IAAI,CAAC;AACzE,WAAK,SAAS,WAAW,OAAO,QAAQ,OAAO,SAAS;AAAA,IAC9D,WAAe,gBAAgB,YAAY;AAOrC,eAAS,IAAI,UAAU,QAAQ,CAAC;AAEhC,eAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC9C,cAAM,UAAU,KAAK,cAAc,cAAc,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;AAE9F,eAAQ,MAAM,IAAK,IAAI,CAAC,IAAI,QAAQ,CAAC;AACrC,eAAQ,MAAM,IAAK,IAAI,CAAC,IAAI,QAAQ,CAAC;AAAA,MACtC;AAED,WAAK,SAAS,aAAa,UAAU,IAAI,gBAAgB,QAAQ,GAAG,IAAI,CAAC;AACzE,WAAK,SAAS,WAAW,OAAO,QAAQ,OAAO,SAAS;AAAA,IAC9D,WAAe,gBAAgB,YAAY;AACrC,eAAS,IAAI,WAAW,QAAQ,CAAC;AAEjC,eAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC9C,cAAM,UAAU,KAAK,cAAc,cAAc,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;AAE9F,eAAQ,MAAM,IAAK,IAAI,CAAC,IAAI,QAAQ,CAAC;AACrC,eAAQ,MAAM,IAAK,IAAI,CAAC,IAAI,QAAQ,CAAC;AAAA,MACtC;AAED,WAAK,SAAS,aAAa,UAAU,IAAI,gBAAgB,QAAQ,GAAG,IAAI,CAAC;AACzE,WAAK,SAAS,WAAW,OAAO,QAAQ,OAAO,SAAS;AAAA,IAC9D,WAAe,gBAAgB,UAAU;AACnC,eAAS,IAAI,YAAY,QAAQ,CAAC;AAElC,eAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC9C,cAAM,UAAU,KAAK,cAAc,aAAa,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;AAE1F,eAAQ,MAAM,IAAK,IAAI,CAAC,IAAI,QAAQ,CAAC;AACrC,eAAQ,MAAM,IAAK,IAAI,CAAC,IAAI,QAAQ,CAAC;AAAA,MACtC;AAED,WAAK,SAAS,aAAa,UAAU,IAAI,gBAAgB,QAAQ,GAAG,IAAI,CAAC;AACzE,WAAK,SAAS,WAAW,OAAO,QAAQ,OAAO,SAAS;AAAA,IAC9D,OAAW;AACL,cAAQ,MAAM,0EAA0E;AAAA,IACzF;AAED,SAAK,SAAS,WAAW,OAAO,cAAc;AAC9C,SAAK,SAAS,WAAW,OAAO,WAAW;AAC3C,SAAK,SAAS,WAAW,OAAO,gBAAgB;AAGhD,QAAI,EAAE,KAAK,oBAAoB,sBAAsB;AACnD,WAAK,WAAW,IAAI,oBAAqB,EAAC,KAAK,KAAK,QAAQ;AAAA,IAC7D;AAED,QAAI,gBAAgB,UAAU;AAC5B,WAAK,SAAS,QAAQ,oBAAoB;AAAA,IAC3C;AAED,QAAI,gBAAgB,YAAY;AAC9B,WAAK,SAAS,QAAQ,oBAAoB;AAAA,IAC3C;AAED,QAAI,gBAAgB,YAAY;AAC9B,WAAK,SAAS,QAAQ,oBAAoB;AAAA,IAC3C;AAED,QAAI,gBAAgB,WAAW;AAC7B,WAAK,SAAS,QAAQ,oBAAoB;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASD,mBAAmB,SAAU,MAAM;AACjC,QAAI,CAAC,KAAK,UAAU;AAClB,cAAQ,MAAM,8BAA8B;AAAA,IAC7C;AAED,UAAM,WAAW,KAAK,SAAS,WAAW;AAE1C,QAAI,CAAC,UAAU;AACb,cAAQ,MAAM,4CAA4C;AAAA,IAC3D;AAED,QAAI,SAAS;AAAU;AAEvB,QAAI,SAAS,YAAY,GAAG;AAC1B,cAAQ,MAAM,sDAAsD;AAAA,IACrE;AAED,UAAM,QAAQ,SAAS;AACvB,UAAM,gBAAgB;AAEtB,UAAM,SAAS,KAAK,cAAc,gBAAgB,OAAO,aAAa;AAEtE,UAAM,YAAY,OAAO;AACzB,UAAM,YAAY,OAAO;AAGzB,QAAI,KAAK,SAAS,eAAe;AAAM,WAAK,SAAS,mBAAoB;AACzE,QAAI,KAAK,SAAS,kBAAkB;AAAM,WAAK,SAAS,sBAAuB;AAE/E,SAAK,SAAS,aAAa,YAAY,IAAI,gBAAgB,WAAW,CAAC,CAAC;AACxE,SAAK,SAAS,WAAW,SAAS,WAAW;AAC7C,SAAK,SAAS,WAAW,SAAS,cAAc;AAChD,SAAK,SAAS,WAAW,SAAS,QAAQ,UAAU,SAAS;AAG7D,QAAI,EAAE,KAAK,oBAAoB,sBAAsB;AACnD,WAAK,WAAW,IAAI,oBAAqB,EAAC,KAAK,KAAK,QAAQ;AAAA,IAC7D;AAED,SAAK,SAAS,QAAQ,sBAAsB;AAE5C,SAAK,SAAS,SAAS,eAAe,QAAQ;AAC9C,SAAK,SAAS,SAAS,eAAe,cAAc;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASD,aAAa,SAAU,MAAM;AAC3B,QAAI,CAAC,KAAK,UAAU;AAClB,cAAQ,MAAM,uCAAuC;AAAA,IACtD;AAED,UAAM,MAAM,KAAK,SAAS,WAAW;AAErC,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,sCAAsC;AAAA,IACrD;AAED,QAAI,IAAI;AAAU;AAElB,UAAM,QAAQ,EAAE,KAAK,UAAU,KAAK,UAAW;AAE/C,UAAM,QAAQ,IAAI;AAElB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,MAAM,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AACxC,YAAM,MAAM,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,IACzC;AAED,QAAI;AAEJ,QAAI,MAAM,OAAO,MAAQ,MAAM,OAAO,GAAK;AAEzC,eAAS,IAAI,YAAY,MAAM,MAAM;AAErC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,cAAM,UAAU,KAAK,cAAc,cAAc,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,GAAG,CAAC;AAE7E,eAAO,CAAC,IAAI,QAAQ,CAAC;AACrB,eAAO,IAAI,CAAC,IAAI,QAAQ,CAAC;AAAA,MAC1B;AAED,WAAK,SAAS,aAAa,MAAM,IAAI,gBAAgB,QAAQ,GAAG,IAAI,CAAC;AACrE,WAAK,SAAS,WAAW,GAAG,WAAW;AACvC,WAAK,SAAS,WAAW,GAAG,cAAc;AAC1C,WAAK,SAAS,WAAW,GAAG,QAAQ,OAAO,SAAS;AAEpD,UAAI,EAAE,KAAK,oBAAoB,sBAAsB;AACnD,aAAK,WAAW,IAAI,oBAAqB,EAAC,KAAK,KAAK,QAAQ;AAAA,MAC7D;AAED,WAAK,SAAS,QAAQ,gBAAgB;AAAA,IAC5C,OAAW;AAEL,eAAS,KAAK,cAAc,kBAAkB,OAAO,CAAC;AAEtD,WAAK,SAAS,aAAa,MAAM,IAAI,gBAAgB,OAAO,WAAW,CAAC,CAAC;AACzE,WAAK,SAAS,WAAW,GAAG,WAAW;AACvC,WAAK,SAAS,WAAW,GAAG,cAAc;AAC1C,WAAK,SAAS,WAAW,GAAG,QAAQ,OAAO,UAAU,SAAS;AAE9D,UAAI,EAAE,KAAK,oBAAoB,sBAAsB;AACnD,aAAK,WAAW,IAAI,oBAAqB,EAAC,KAAK,KAAK,QAAQ;AAAA,MAC7D;AAED,WAAK,SAAS,QAAQ,gBAAgB;AAEtC,WAAK,SAAS,SAAS,cAAc,QAAQ,OAAO;AACpD,WAAK,SAAS,SAAS,cAAc,cAAc;AAAA,IACpD;AAAA,EACF;AAAA,EAED,eAAe;AAAA,IACb,eAAe,SAAU,GAAG,GAAG,GAAG,OAAO;AACvC,UAAI,SAAS,GAAG;AACd,cAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,GAAG;AAC3C,cAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,GAAG;AAC3C,cAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,GAAG;AAC3C,eAAO,IAAI,WAAW,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,MAChD,WAAiB,SAAS,GAAG;AACrB,cAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK;AAC7C,cAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK;AAC7C,cAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK;AAC7C,eAAO,IAAI,YAAY,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,MACjD,OAAa;AACL,gBAAQ,MAAM,gCAAgC;AAAA,MAC/C;AAAA,IACF;AAAA,IAED,eAAe,SAAU,OAAO,OAAO;AACrC,UAAI,SAAS,GAAG;AACd,eAAO,CAAE,MAAM,CAAC,IAAI,MAAO,IAAM,GAAM,MAAM,CAAC,IAAI,MAAO,IAAM,GAAM,MAAM,CAAC,IAAI,MAAO,IAAM,CAAG;AAAA,MACxG,WAAiB,SAAS,GAAG;AACrB,eAAO,CAAE,MAAM,CAAC,IAAI,QAAS,IAAM,GAAM,MAAM,CAAC,IAAI,QAAS,IAAM,GAAM,MAAM,CAAC,IAAI,QAAS,IAAM,CAAG;AAAA,MAC9G,OAAa;AACL,gBAAQ,MAAM,gCAAgC;AAAA,MAC/C;AAAA,IACF;AAAA;AAAA,IAGD,cAAc,SAAU,GAAG,GAAG,GAAG;AAC/B,YAAM,UAAU,SAAS,OAAO,IAAM,KAAK,MAAM,GAAG,CAAC,IAAI,KAAK,MAAM,KAAK;AACzE,YAAM,UAAU,SAAS,OAAO,IAAM,KAAK,KAAK;AAChD,aAAO,IAAI,YAAY,CAAC,SAAS,OAAO,CAAC;AAAA,IAC1C;AAAA;AAAA,IAGD,eAAe,SAAU,GAAG,GAAG,GAAG,OAAO;AACvC,UAAI,KAAK,KAAK,MAAM,YAAY;AAIhC,aAAO,MAAM,cAAc,GAAG,GAAG,GAAG,SAAS,OAAO;AACpD,YAAM,cAAc,GAAG;AACvB,gBAAU,IAAI,GAAG,GAAG,GAAG,GAAG;AAE1B,YAAM,cAAc,GAAG,GAAG,GAAG,QAAQ,OAAO;AAC5C,YAAM,cAAc,GAAG;AACvB,mBAAa,IAAI,GAAG,GAAG,GAAG,GAAG;AAE7B,UAAI,aAAa,SAAS;AACxB,eAAO;AACP,kBAAU;AAAA,MACX;AAED,YAAM,cAAc,GAAG,GAAG,GAAG,SAAS,MAAM;AAC5C,YAAM,cAAc,GAAG;AACvB,mBAAa,IAAI,GAAG,GAAG,GAAG,GAAG;AAE7B,UAAI,aAAa,SAAS;AACxB,eAAO;AACP,kBAAU;AAAA,MACX;AAED,YAAM,cAAc,GAAG,GAAG,GAAG,QAAQ,MAAM;AAC3C,YAAM,cAAc,GAAG;AACvB,mBAAa,IAAI,GAAG,GAAG,GAAG,GAAG;AAE7B,UAAI,aAAa,SAAS;AACxB,eAAO;AAAA,MACR;AAED,aAAO;AAEP,eAAS,cAAc,IAAI,IAAI,IAAI,OAAO,OAAO;AAC/C,YAAIA,KAAI,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AACvD,YAAIC,KAAI,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAEvD,YAAI,IAAI,GAAG;AACT,cAAI,SAAS,IAAI,KAAK,IAAIA,EAAC,MAAMD,MAAK,IAAI,IAAI;AAC9C,cAAI,SAAS,IAAI,KAAK,IAAIA,EAAC,MAAMC,MAAK,IAAI,IAAI;AAE9C,UAAAD,KAAI;AACJ,UAAAC,KAAI;AAEJ,cAAI,OAAO,IAAI,KAAK,IAAID,EAAC,IAAI,KAAK,IAAIC,EAAC;AACvC,cAAI,OAAO,GAAG;AACZ,oBAAQ;AACR,YAAAD,MAAKA,KAAI,IAAI,OAAO,IAAI,CAAC,OAAO;AAChC,YAAAC,MAAKA,KAAI,IAAI,OAAO,IAAI,CAAC,OAAO;AAAA,UACjC;AAAA,QACF;AAED,YAAI,SAAS,GAAG;AACd,iBAAO,IAAI,UAAU,CAAC,KAAK,KAAK,EAAED,KAAI,SAASA,KAAI,IAAI,IAAI,EAAE,GAAG,KAAK,KAAK,EAAEC,KAAI,SAASA,KAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AAAA,QAC1G;AAED,YAAI,SAAS,GAAG;AACd,iBAAO,IAAI,WAAW;AAAA,YACpB,KAAK,KAAK,EAAED,KAAI,WAAWA,KAAI,IAAI,IAAI,EAAE;AAAA,YACzC,KAAK,KAAK,EAAEC,KAAI,WAAWA,KAAI,IAAI,IAAI,EAAE;AAAA,UACrD,CAAW;AAAA,QACF;AAAA,MACF;AAED,eAAS,cAAcC,MAAK;AAC1B,YAAIF,KAAIE,KAAI,CAAC;AACb,YAAID,KAAIC,KAAI,CAAC;AAEb,YAAI,SAAS,GAAG;AACd,UAAAF,MAAKA,KAAI,IAAI,MAAM;AACnB,UAAAC,MAAKA,KAAI,IAAI,MAAM;AAAA,QAC7B,WAAmB,SAAS,GAAG;AACrB,UAAAD,MAAKA,KAAI,IAAI,QAAQ;AACrB,UAAAC,MAAKA,KAAI,IAAI,QAAQ;AAAA,QACtB;AAED,YAAIE,KAAI,IAAI,KAAK,IAAIH,EAAC,IAAI,KAAK,IAAIC,EAAC;AAEpC,YAAIE,KAAI,GAAG;AACT,cAAI,OAAOH;AACX,UAAAA,MAAK,IAAI,KAAK,IAAIC,EAAC,MAAMD,MAAK,IAAI,IAAI;AACtC,UAAAC,MAAK,IAAI,KAAK,IAAI,IAAI,MAAMA,MAAK,IAAI,IAAI;AAAA,QAC1C;AAED,YAAI,SAAS,KAAK,KAAKD,KAAIA,KAAIC,KAAIA,KAAIE,KAAIA,EAAC;AAE5C,eAAO,CAACH,KAAI,QAAQC,KAAI,QAAQE,KAAI,MAAM;AAAA,MAC3C;AAED,eAAS,IAAIH,IAAGC,IAAGE,IAAG,MAAM;AAC1B,eAAOH,KAAI,KAAK,CAAC,IAAIC,KAAI,KAAK,CAAC,IAAIE,KAAI,KAAK,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,IAED,iBAAiB,SAAU,OAAO,OAAO;AACvC,UAAI,WAAW;AAEf,UAAI,SAAS,GAAG;AACd,oBAAY,IAAI,WAAW,MAAM,MAAM;AACvC,mBAAW;AAAA,MACnB,WAAiB,SAAS,GAAG;AACrB,oBAAY,IAAI,YAAY,MAAM,MAAM;AACxC,mBAAW;AAAA,MACnB,OAAa;AACL,gBAAQ,MAAM,yBAAyB;AAAA,MACxC;AAED,YAAM,YAAY,IAAI,QAAS;AAE/B,YAAM,MAAM,IAAI,aAAa,CAAC;AAC9B,YAAM,MAAM,IAAI,aAAa,CAAC;AAE9B,UAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO;AAClC,UAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;AAEnC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,MACvC;AAED,gBAAU;AAAA,QACR,IAAI,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,QAAQ;AAAA,MACrG;AAED,gBAAU,SAAS,EAAE,IAAI,IAAI,CAAC;AAC9B,gBAAU,SAAS,EAAE,IAAI,IAAI,CAAC;AAC9B,gBAAU,SAAS,EAAE,IAAI,IAAI,CAAC;AAE9B,gBAAU,UAAW;AAErB,YAAM,aAAa,IAAI,aAAa;AAAA,QAClC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAAA,QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAAA,QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAAA,MAC3D,CAAO;AAED,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,kBAAU,IAAI,CAAC,IAAI,KAAK,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;AACrE,kBAAU,IAAI,CAAC,IAAI,KAAK,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;AACrE,kBAAU,IAAI,CAAC,IAAI,KAAK,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;AAAA,MACtE;AAED,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACD;AAAA,IACF;AAAA,IAED,mBAAmB,SAAU,OAAO,OAAO;AACzC,UAAI,WAAW;AAEf,UAAI,SAAS,GAAG;AACd,oBAAY,IAAI,WAAW,MAAM,MAAM;AACvC,mBAAW;AAAA,MACnB,WAAiB,SAAS,GAAG;AACrB,oBAAY,IAAI,YAAY,MAAM,MAAM;AACxC,mBAAW;AAAA,MACnB,OAAa;AACL,gBAAQ,MAAM,yBAAyB;AAAA,MACxC;AAED,YAAM,YAAY,IAAI,QAAS;AAE/B,YAAM,MAAM,IAAI,aAAa,CAAC;AAC9B,YAAM,MAAM,IAAI,aAAa,CAAC;AAE9B,UAAI,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO;AACzB,UAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;AAE1B,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AACtC,YAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,MACvC;AAED,gBAAU,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,QAAQ;AAE1E,gBAAU,SAAS,CAAC,IAAI,IAAI,CAAC;AAC7B,gBAAU,SAAS,CAAC,IAAI,IAAI,CAAC;AAE7B,gBAAU,UAAW;AAErB,YAAM,aAAa,IAAI,aAAa;AAAA,QAClC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAAA,QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAAA,MAC3D,CAAO;AAED,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,kBAAU,IAAI,CAAC,IAAI,KAAK,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;AACrE,kBAAU,IAAI,CAAC,IAAI,KAAK,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;AAAA,MACtE;AAED,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACH;AAOA,MAAM,4BAA4B,kBAAkB;AAAA,EAClD,YAAY,YAAY;AACtB,UAAO;AAEP,SAAK,UAAU,CAAE;AACjB,SAAK,OAAO;AACZ,SAAK,WAAW,cAAc,MAAM;AAAA,MAClC,UAAU,MAAM;AAAA,MAEhB;AAAA,QACE,gBAAgB,EAAE,OAAO,KAAM;AAAA,QAC/B,eAAe,EAAE,OAAO,KAAM;AAAA,MAC/B;AAAA,IACP,CAAK;AAED,SAAK,eAAe;AAAA,MAClB;AAAA,MAEA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MAEZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiCA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBA;AAAA,MAEA,YAAY;AAAA,MAEZ;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MAEZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MAEZ;AAAA,MACA;AAAA,MACA;AAAA,MAEA,YAAY;AAAA,MAEZ;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MAEZ;AAAA,MAEA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MAEZ;AAAA,IACN,EAAM,KAAK,IAAI;AAGX,SAAK,iBAAiB;AAAA,MACpB;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MAEZ;AAAA,MAEA,YAAY;AAAA,MAEZ;AAAA,MACA;AAAA,MACA;AAAA,MAEA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA;AAAA,MAGZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA;AAAA,MAGZ,YAAY;AAAA,MAEZ;AAAA,MAEA,YAAY;AAAA,MAEZ;AAAA,MAEA,YAAY;AAAA,MACZ,WAAW,MAAM,YAAY,sBAAsB,YAAY;AAAA,MAC/D,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,IACN,EAAM,KAAK,IAAI;AAEX,SAAK,UAAU,UAAU;AAAA,EAC1B;AACH;"}
@@ -7,9 +7,9 @@ var __publicField = (obj, key, value) => {
7
7
  };
8
8
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
9
  const THREE = require("three");
10
- var _mipmapMaterial = _getMipmapMaterial();
11
- var _mesh = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), _mipmapMaterial);
12
- var _flatCamera = new THREE.OrthographicCamera(0, 1, 0, 1, 0, 1);
10
+ var _mipmapMaterial = /* @__PURE__ */ _getMipmapMaterial();
11
+ var _mesh = /* @__PURE__ */ new THREE.Mesh(/* @__PURE__ */ new THREE.PlaneGeometry(2, 2), _mipmapMaterial);
12
+ var _flatCamera = /* @__PURE__ */ new THREE.OrthographicCamera(0, 1, 0, 1, 0, 1);
13
13
  var _tempTarget = null;
14
14
  class RoughnessMipmapper {
15
15
  constructor(renderer) {
@@ -1 +1 @@
1
- {"version":3,"file":"RoughnessMipmapper.cjs","sources":["../../src/utils/RoughnessMipmapper.js"],"sourcesContent":["/**\n * This class generates custom mipmaps for a roughness map by encoding the lost variation in the\n * normal map mip levels as increased roughness in the corresponding roughness mip levels. This\n * helps with rendering accuracy for MeshStandardMaterial, and also helps with anti-aliasing when\n * using PMREM. If the normal map is larger than the roughness map, the roughness map will be\n * enlarged to match the dimensions of the normal map.\n */\n\nimport {\n MathUtils,\n Mesh,\n NoBlending,\n OrthographicCamera,\n PlaneGeometry,\n RawShaderMaterial,\n Vector2,\n WebGLRenderTarget,\n} from 'three'\n\nvar _mipmapMaterial = _getMipmapMaterial()\n\nvar _mesh = new Mesh(new PlaneGeometry(2, 2), _mipmapMaterial)\n\nvar _flatCamera = new OrthographicCamera(0, 1, 0, 1, 0, 1)\n\nvar _tempTarget = null\n\nclass RoughnessMipmapper {\n constructor(renderer) {\n this._renderer = renderer\n\n this._renderer.compile(_mesh, _flatCamera)\n }\n\n generateMipmaps = function (material) {\n if ('roughnessMap' in material === false) return\n\n var { roughnessMap, normalMap } = material\n\n if (\n roughnessMap === null ||\n normalMap === null ||\n !roughnessMap.generateMipmaps ||\n material.userData.roughnessUpdated\n ) {\n return\n }\n\n material.userData.roughnessUpdated = true\n\n var width = Math.max(roughnessMap.image.width, normalMap.image.width)\n\n var height = Math.max(roughnessMap.image.height, normalMap.image.height)\n\n if (!MathUtils.isPowerOfTwo(width) || !MathUtils.isPowerOfTwo(height)) return\n\n var oldTarget = this._renderer.getRenderTarget()\n\n var autoClear = this._renderer.autoClear\n\n this._renderer.autoClear = false\n\n if (_tempTarget === null || _tempTarget.width !== width || _tempTarget.height !== height) {\n if (_tempTarget !== null) _tempTarget.dispose()\n\n _tempTarget = new WebGLRenderTarget(width, height, {\n depthBuffer: false,\n })\n\n _tempTarget.scissorTest = true\n }\n\n if (width !== roughnessMap.image.width || height !== roughnessMap.image.height) {\n var params = {\n wrapS: roughnessMap.wrapS,\n wrapT: roughnessMap.wrapT,\n magFilter: roughnessMap.magFilter,\n minFilter: roughnessMap.minFilter,\n depthBuffer: false,\n }\n\n var newRoughnessTarget = new WebGLRenderTarget(width, height, params)\n\n newRoughnessTarget.texture.generateMipmaps = true\n\n // Setting the render target causes the memory to be allocated.\n\n this._renderer.setRenderTarget(newRoughnessTarget)\n\n material.roughnessMap = newRoughnessTarget.texture\n\n if (material.metalnessMap == roughnessMap) material.metalnessMap = material.roughnessMap\n\n if (material.aoMap == roughnessMap) material.aoMap = material.roughnessMap\n }\n\n _mipmapMaterial.uniforms.roughnessMap.value = roughnessMap\n\n _mipmapMaterial.uniforms.normalMap.value = normalMap\n\n var position = new Vector2(0, 0)\n\n var texelSize = _mipmapMaterial.uniforms.texelSize.value\n\n for (let mip = 0; width >= 1 && height >= 1; ++mip, width /= 2, height /= 2) {\n // Rendering to a mip level is not allowed in webGL1. Instead we must set\n // up a secondary texture to write the result to, then copy it back to the\n // proper mipmap level.\n\n texelSize.set(1.0 / width, 1.0 / height)\n\n if (mip == 0) texelSize.set(0.0, 0.0)\n\n _tempTarget.viewport.set(position.x, position.y, width, height)\n\n _tempTarget.scissor.set(position.x, position.y, width, height)\n\n this._renderer.setRenderTarget(_tempTarget)\n\n this._renderer.render(_mesh, _flatCamera)\n\n this._renderer.copyFramebufferToTexture(position, material.roughnessMap, mip)\n\n _mipmapMaterial.uniforms.roughnessMap.value = material.roughnessMap\n }\n\n if (roughnessMap !== material.roughnessMap) roughnessMap.dispose()\n\n this._renderer.setRenderTarget(oldTarget)\n\n this._renderer.autoClear = autoClear\n }\n\n dispose = function () {\n _mipmapMaterial.dispose()\n\n _mesh.geometry.dispose()\n\n if (_tempTarget != null) _tempTarget.dispose()\n }\n}\n\nfunction _getMipmapMaterial() {\n var shaderMaterial = new RawShaderMaterial({\n uniforms: {\n roughnessMap: { value: null },\n normalMap: { value: null },\n texelSize: { value: new Vector2(1, 1) },\n },\n\n vertexShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tattribute vec3 position;\n\t\t\tattribute vec2 uv;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main() {\n\n\t\t\t\tvUv = uv;\n\n\t\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n fragmentShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tuniform sampler2D roughnessMap;\n\t\t\tuniform sampler2D normalMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\n\t\t\tvec4 envMapTexelToLinear( vec4 a ) { return a; }\n\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tfloat roughnessToVariance( float roughness ) {\n\n\t\t\t\tfloat variance = 0.0;\n\n\t\t\t\tif ( roughness >= r1 ) {\n\n\t\t\t\t\tvariance = ( r0 - roughness ) * ( v1 - v0 ) / ( r0 - r1 ) + v0;\n\n\t\t\t\t} else if ( roughness >= r4 ) {\n\n\t\t\t\t\tvariance = ( r1 - roughness ) * ( v4 - v1 ) / ( r1 - r4 ) + v1;\n\n\t\t\t\t} else if ( roughness >= r5 ) {\n\n\t\t\t\t\tvariance = ( r4 - roughness ) * ( v5 - v4 ) / ( r4 - r5 ) + v4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfloat roughness2 = roughness * roughness;\n\n\t\t\t\t\tvariance = 1.79 * roughness2 * roughness2;\n\n\t\t\t\t}\n\n\t\t\t\treturn variance;\n\n\t\t\t}\n\n\t\t\tfloat varianceToRoughness( float variance ) {\n\n\t\t\t\tfloat roughness = 0.0;\n\n\t\t\t\tif ( variance >= v1 ) {\n\n\t\t\t\t\troughness = ( v0 - variance ) * ( r1 - r0 ) / ( v0 - v1 ) + r0;\n\n\t\t\t\t} else if ( variance >= v4 ) {\n\n\t\t\t\t\troughness = ( v1 - variance ) * ( r4 - r1 ) / ( v1 - v4 ) + r1;\n\n\t\t\t\t} else if ( variance >= v5 ) {\n\n\t\t\t\t\troughness = ( v4 - variance ) * ( r5 - r4 ) / ( v4 - v5 ) + r4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\troughness = pow( 0.559 * variance, 0.25 ); // 0.559 = 1.0 / 1.79\n\n\t\t\t\t}\n\n\t\t\t\treturn roughness;\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = texture2D( roughnessMap, vUv, - 1.0 );\n\n\t\t\t\tif ( texelSize.x == 0.0 ) return;\n\n\t\t\t\tfloat roughness = gl_FragColor.g;\n\n\t\t\t\tfloat variance = roughnessToVariance( roughness );\n\n\t\t\t\tvec3 avgNormal;\n\n\t\t\t\tfor ( float x = - 1.0; x < 2.0; x += 2.0 ) {\n\n\t\t\t\t\tfor ( float y = - 1.0; y < 2.0; y += 2.0 ) {\n\n\t\t\t\t\t\tvec2 uv = vUv + vec2( x, y ) * 0.25 * texelSize;\n\n\t\t\t\t\t\tavgNormal += normalize( texture2D( normalMap, uv, - 1.0 ).xyz - 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvariance += 1.0 - 0.25 * length( avgNormal );\n\n\t\t\t\tgl_FragColor.g = varianceToRoughness( variance );\n\n\t\t\t}\n\t\t`,\n\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n })\n\n shaderMaterial.type = 'RoughnessMipmapper'\n\n return shaderMaterial\n}\n\nexport { RoughnessMipmapper }\n"],"names":["Mesh","PlaneGeometry","OrthographicCamera","MathUtils","WebGLRenderTarget","Vector2","RawShaderMaterial","NoBlending"],"mappings":"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"}
1
+ {"version":3,"file":"RoughnessMipmapper.cjs","sources":["../../src/utils/RoughnessMipmapper.js"],"sourcesContent":["/**\n * This class generates custom mipmaps for a roughness map by encoding the lost variation in the\n * normal map mip levels as increased roughness in the corresponding roughness mip levels. This\n * helps with rendering accuracy for MeshStandardMaterial, and also helps with anti-aliasing when\n * using PMREM. If the normal map is larger than the roughness map, the roughness map will be\n * enlarged to match the dimensions of the normal map.\n */\n\nimport {\n MathUtils,\n Mesh,\n NoBlending,\n OrthographicCamera,\n PlaneGeometry,\n RawShaderMaterial,\n Vector2,\n WebGLRenderTarget,\n} from 'three'\n\nvar _mipmapMaterial = /* @__PURE__ */ _getMipmapMaterial()\n\nvar _mesh = /* @__PURE__ */ new Mesh(/* @__PURE__ */ new PlaneGeometry(2, 2), _mipmapMaterial)\n\nvar _flatCamera = /* @__PURE__ */ new OrthographicCamera(0, 1, 0, 1, 0, 1)\n\nvar _tempTarget = null\n\nclass RoughnessMipmapper {\n constructor(renderer) {\n this._renderer = renderer\n\n this._renderer.compile(_mesh, _flatCamera)\n }\n\n generateMipmaps = function (material) {\n if ('roughnessMap' in material === false) return\n\n var { roughnessMap, normalMap } = material\n\n if (\n roughnessMap === null ||\n normalMap === null ||\n !roughnessMap.generateMipmaps ||\n material.userData.roughnessUpdated\n ) {\n return\n }\n\n material.userData.roughnessUpdated = true\n\n var width = Math.max(roughnessMap.image.width, normalMap.image.width)\n\n var height = Math.max(roughnessMap.image.height, normalMap.image.height)\n\n if (!MathUtils.isPowerOfTwo(width) || !MathUtils.isPowerOfTwo(height)) return\n\n var oldTarget = this._renderer.getRenderTarget()\n\n var autoClear = this._renderer.autoClear\n\n this._renderer.autoClear = false\n\n if (_tempTarget === null || _tempTarget.width !== width || _tempTarget.height !== height) {\n if (_tempTarget !== null) _tempTarget.dispose()\n\n _tempTarget = new WebGLRenderTarget(width, height, {\n depthBuffer: false,\n })\n\n _tempTarget.scissorTest = true\n }\n\n if (width !== roughnessMap.image.width || height !== roughnessMap.image.height) {\n var params = {\n wrapS: roughnessMap.wrapS,\n wrapT: roughnessMap.wrapT,\n magFilter: roughnessMap.magFilter,\n minFilter: roughnessMap.minFilter,\n depthBuffer: false,\n }\n\n var newRoughnessTarget = new WebGLRenderTarget(width, height, params)\n\n newRoughnessTarget.texture.generateMipmaps = true\n\n // Setting the render target causes the memory to be allocated.\n\n this._renderer.setRenderTarget(newRoughnessTarget)\n\n material.roughnessMap = newRoughnessTarget.texture\n\n if (material.metalnessMap == roughnessMap) material.metalnessMap = material.roughnessMap\n\n if (material.aoMap == roughnessMap) material.aoMap = material.roughnessMap\n }\n\n _mipmapMaterial.uniforms.roughnessMap.value = roughnessMap\n\n _mipmapMaterial.uniforms.normalMap.value = normalMap\n\n var position = new Vector2(0, 0)\n\n var texelSize = _mipmapMaterial.uniforms.texelSize.value\n\n for (let mip = 0; width >= 1 && height >= 1; ++mip, width /= 2, height /= 2) {\n // Rendering to a mip level is not allowed in webGL1. Instead we must set\n // up a secondary texture to write the result to, then copy it back to the\n // proper mipmap level.\n\n texelSize.set(1.0 / width, 1.0 / height)\n\n if (mip == 0) texelSize.set(0.0, 0.0)\n\n _tempTarget.viewport.set(position.x, position.y, width, height)\n\n _tempTarget.scissor.set(position.x, position.y, width, height)\n\n this._renderer.setRenderTarget(_tempTarget)\n\n this._renderer.render(_mesh, _flatCamera)\n\n this._renderer.copyFramebufferToTexture(position, material.roughnessMap, mip)\n\n _mipmapMaterial.uniforms.roughnessMap.value = material.roughnessMap\n }\n\n if (roughnessMap !== material.roughnessMap) roughnessMap.dispose()\n\n this._renderer.setRenderTarget(oldTarget)\n\n this._renderer.autoClear = autoClear\n }\n\n dispose = function () {\n _mipmapMaterial.dispose()\n\n _mesh.geometry.dispose()\n\n if (_tempTarget != null) _tempTarget.dispose()\n }\n}\n\nfunction _getMipmapMaterial() {\n var shaderMaterial = new RawShaderMaterial({\n uniforms: {\n roughnessMap: { value: null },\n normalMap: { value: null },\n texelSize: { value: new Vector2(1, 1) },\n },\n\n vertexShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tattribute vec3 position;\n\t\t\tattribute vec2 uv;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main() {\n\n\t\t\t\tvUv = uv;\n\n\t\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n fragmentShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tuniform sampler2D roughnessMap;\n\t\t\tuniform sampler2D normalMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\n\t\t\tvec4 envMapTexelToLinear( vec4 a ) { return a; }\n\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tfloat roughnessToVariance( float roughness ) {\n\n\t\t\t\tfloat variance = 0.0;\n\n\t\t\t\tif ( roughness >= r1 ) {\n\n\t\t\t\t\tvariance = ( r0 - roughness ) * ( v1 - v0 ) / ( r0 - r1 ) + v0;\n\n\t\t\t\t} else if ( roughness >= r4 ) {\n\n\t\t\t\t\tvariance = ( r1 - roughness ) * ( v4 - v1 ) / ( r1 - r4 ) + v1;\n\n\t\t\t\t} else if ( roughness >= r5 ) {\n\n\t\t\t\t\tvariance = ( r4 - roughness ) * ( v5 - v4 ) / ( r4 - r5 ) + v4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfloat roughness2 = roughness * roughness;\n\n\t\t\t\t\tvariance = 1.79 * roughness2 * roughness2;\n\n\t\t\t\t}\n\n\t\t\t\treturn variance;\n\n\t\t\t}\n\n\t\t\tfloat varianceToRoughness( float variance ) {\n\n\t\t\t\tfloat roughness = 0.0;\n\n\t\t\t\tif ( variance >= v1 ) {\n\n\t\t\t\t\troughness = ( v0 - variance ) * ( r1 - r0 ) / ( v0 - v1 ) + r0;\n\n\t\t\t\t} else if ( variance >= v4 ) {\n\n\t\t\t\t\troughness = ( v1 - variance ) * ( r4 - r1 ) / ( v1 - v4 ) + r1;\n\n\t\t\t\t} else if ( variance >= v5 ) {\n\n\t\t\t\t\troughness = ( v4 - variance ) * ( r5 - r4 ) / ( v4 - v5 ) + r4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\troughness = pow( 0.559 * variance, 0.25 ); // 0.559 = 1.0 / 1.79\n\n\t\t\t\t}\n\n\t\t\t\treturn roughness;\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = texture2D( roughnessMap, vUv, - 1.0 );\n\n\t\t\t\tif ( texelSize.x == 0.0 ) return;\n\n\t\t\t\tfloat roughness = gl_FragColor.g;\n\n\t\t\t\tfloat variance = roughnessToVariance( roughness );\n\n\t\t\t\tvec3 avgNormal;\n\n\t\t\t\tfor ( float x = - 1.0; x < 2.0; x += 2.0 ) {\n\n\t\t\t\t\tfor ( float y = - 1.0; y < 2.0; y += 2.0 ) {\n\n\t\t\t\t\t\tvec2 uv = vUv + vec2( x, y ) * 0.25 * texelSize;\n\n\t\t\t\t\t\tavgNormal += normalize( texture2D( normalMap, uv, - 1.0 ).xyz - 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvariance += 1.0 - 0.25 * length( avgNormal );\n\n\t\t\t\tgl_FragColor.g = varianceToRoughness( variance );\n\n\t\t\t}\n\t\t`,\n\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n })\n\n shaderMaterial.type = 'RoughnessMipmapper'\n\n return shaderMaterial\n}\n\nexport { RoughnessMipmapper }\n"],"names":["Mesh","PlaneGeometry","OrthographicCamera","MathUtils","WebGLRenderTarget","Vector2","RawShaderMaterial","NoBlending"],"mappings":"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"}
@@ -4,10 +4,10 @@ var __publicField = (obj, key, value) => {
4
4
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  return value;
6
6
  };
7
- import { Mesh, PlaneGeometry, OrthographicCamera, MathUtils, WebGLRenderTarget, Vector2, RawShaderMaterial, NoBlending } from "three";
8
- var _mipmapMaterial = _getMipmapMaterial();
9
- var _mesh = new Mesh(new PlaneGeometry(2, 2), _mipmapMaterial);
10
- var _flatCamera = new OrthographicCamera(0, 1, 0, 1, 0, 1);
7
+ import { MathUtils, WebGLRenderTarget, Vector2, Mesh, PlaneGeometry, OrthographicCamera, RawShaderMaterial, NoBlending } from "three";
8
+ var _mipmapMaterial = /* @__PURE__ */ _getMipmapMaterial();
9
+ var _mesh = /* @__PURE__ */ new Mesh(/* @__PURE__ */ new PlaneGeometry(2, 2), _mipmapMaterial);
10
+ var _flatCamera = /* @__PURE__ */ new OrthographicCamera(0, 1, 0, 1, 0, 1);
11
11
  var _tempTarget = null;
12
12
  class RoughnessMipmapper {
13
13
  constructor(renderer) {
@@ -1 +1 @@
1
- {"version":3,"file":"RoughnessMipmapper.js","sources":["../../src/utils/RoughnessMipmapper.js"],"sourcesContent":["/**\n * This class generates custom mipmaps for a roughness map by encoding the lost variation in the\n * normal map mip levels as increased roughness in the corresponding roughness mip levels. This\n * helps with rendering accuracy for MeshStandardMaterial, and also helps with anti-aliasing when\n * using PMREM. If the normal map is larger than the roughness map, the roughness map will be\n * enlarged to match the dimensions of the normal map.\n */\n\nimport {\n MathUtils,\n Mesh,\n NoBlending,\n OrthographicCamera,\n PlaneGeometry,\n RawShaderMaterial,\n Vector2,\n WebGLRenderTarget,\n} from 'three'\n\nvar _mipmapMaterial = _getMipmapMaterial()\n\nvar _mesh = new Mesh(new PlaneGeometry(2, 2), _mipmapMaterial)\n\nvar _flatCamera = new OrthographicCamera(0, 1, 0, 1, 0, 1)\n\nvar _tempTarget = null\n\nclass RoughnessMipmapper {\n constructor(renderer) {\n this._renderer = renderer\n\n this._renderer.compile(_mesh, _flatCamera)\n }\n\n generateMipmaps = function (material) {\n if ('roughnessMap' in material === false) return\n\n var { roughnessMap, normalMap } = material\n\n if (\n roughnessMap === null ||\n normalMap === null ||\n !roughnessMap.generateMipmaps ||\n material.userData.roughnessUpdated\n ) {\n return\n }\n\n material.userData.roughnessUpdated = true\n\n var width = Math.max(roughnessMap.image.width, normalMap.image.width)\n\n var height = Math.max(roughnessMap.image.height, normalMap.image.height)\n\n if (!MathUtils.isPowerOfTwo(width) || !MathUtils.isPowerOfTwo(height)) return\n\n var oldTarget = this._renderer.getRenderTarget()\n\n var autoClear = this._renderer.autoClear\n\n this._renderer.autoClear = false\n\n if (_tempTarget === null || _tempTarget.width !== width || _tempTarget.height !== height) {\n if (_tempTarget !== null) _tempTarget.dispose()\n\n _tempTarget = new WebGLRenderTarget(width, height, {\n depthBuffer: false,\n })\n\n _tempTarget.scissorTest = true\n }\n\n if (width !== roughnessMap.image.width || height !== roughnessMap.image.height) {\n var params = {\n wrapS: roughnessMap.wrapS,\n wrapT: roughnessMap.wrapT,\n magFilter: roughnessMap.magFilter,\n minFilter: roughnessMap.minFilter,\n depthBuffer: false,\n }\n\n var newRoughnessTarget = new WebGLRenderTarget(width, height, params)\n\n newRoughnessTarget.texture.generateMipmaps = true\n\n // Setting the render target causes the memory to be allocated.\n\n this._renderer.setRenderTarget(newRoughnessTarget)\n\n material.roughnessMap = newRoughnessTarget.texture\n\n if (material.metalnessMap == roughnessMap) material.metalnessMap = material.roughnessMap\n\n if (material.aoMap == roughnessMap) material.aoMap = material.roughnessMap\n }\n\n _mipmapMaterial.uniforms.roughnessMap.value = roughnessMap\n\n _mipmapMaterial.uniforms.normalMap.value = normalMap\n\n var position = new Vector2(0, 0)\n\n var texelSize = _mipmapMaterial.uniforms.texelSize.value\n\n for (let mip = 0; width >= 1 && height >= 1; ++mip, width /= 2, height /= 2) {\n // Rendering to a mip level is not allowed in webGL1. Instead we must set\n // up a secondary texture to write the result to, then copy it back to the\n // proper mipmap level.\n\n texelSize.set(1.0 / width, 1.0 / height)\n\n if (mip == 0) texelSize.set(0.0, 0.0)\n\n _tempTarget.viewport.set(position.x, position.y, width, height)\n\n _tempTarget.scissor.set(position.x, position.y, width, height)\n\n this._renderer.setRenderTarget(_tempTarget)\n\n this._renderer.render(_mesh, _flatCamera)\n\n this._renderer.copyFramebufferToTexture(position, material.roughnessMap, mip)\n\n _mipmapMaterial.uniforms.roughnessMap.value = material.roughnessMap\n }\n\n if (roughnessMap !== material.roughnessMap) roughnessMap.dispose()\n\n this._renderer.setRenderTarget(oldTarget)\n\n this._renderer.autoClear = autoClear\n }\n\n dispose = function () {\n _mipmapMaterial.dispose()\n\n _mesh.geometry.dispose()\n\n if (_tempTarget != null) _tempTarget.dispose()\n }\n}\n\nfunction _getMipmapMaterial() {\n var shaderMaterial = new RawShaderMaterial({\n uniforms: {\n roughnessMap: { value: null },\n normalMap: { value: null },\n texelSize: { value: new Vector2(1, 1) },\n },\n\n vertexShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tattribute vec3 position;\n\t\t\tattribute vec2 uv;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main() {\n\n\t\t\t\tvUv = uv;\n\n\t\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n fragmentShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tuniform sampler2D roughnessMap;\n\t\t\tuniform sampler2D normalMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\n\t\t\tvec4 envMapTexelToLinear( vec4 a ) { return a; }\n\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tfloat roughnessToVariance( float roughness ) {\n\n\t\t\t\tfloat variance = 0.0;\n\n\t\t\t\tif ( roughness >= r1 ) {\n\n\t\t\t\t\tvariance = ( r0 - roughness ) * ( v1 - v0 ) / ( r0 - r1 ) + v0;\n\n\t\t\t\t} else if ( roughness >= r4 ) {\n\n\t\t\t\t\tvariance = ( r1 - roughness ) * ( v4 - v1 ) / ( r1 - r4 ) + v1;\n\n\t\t\t\t} else if ( roughness >= r5 ) {\n\n\t\t\t\t\tvariance = ( r4 - roughness ) * ( v5 - v4 ) / ( r4 - r5 ) + v4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfloat roughness2 = roughness * roughness;\n\n\t\t\t\t\tvariance = 1.79 * roughness2 * roughness2;\n\n\t\t\t\t}\n\n\t\t\t\treturn variance;\n\n\t\t\t}\n\n\t\t\tfloat varianceToRoughness( float variance ) {\n\n\t\t\t\tfloat roughness = 0.0;\n\n\t\t\t\tif ( variance >= v1 ) {\n\n\t\t\t\t\troughness = ( v0 - variance ) * ( r1 - r0 ) / ( v0 - v1 ) + r0;\n\n\t\t\t\t} else if ( variance >= v4 ) {\n\n\t\t\t\t\troughness = ( v1 - variance ) * ( r4 - r1 ) / ( v1 - v4 ) + r1;\n\n\t\t\t\t} else if ( variance >= v5 ) {\n\n\t\t\t\t\troughness = ( v4 - variance ) * ( r5 - r4 ) / ( v4 - v5 ) + r4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\troughness = pow( 0.559 * variance, 0.25 ); // 0.559 = 1.0 / 1.79\n\n\t\t\t\t}\n\n\t\t\t\treturn roughness;\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = texture2D( roughnessMap, vUv, - 1.0 );\n\n\t\t\t\tif ( texelSize.x == 0.0 ) return;\n\n\t\t\t\tfloat roughness = gl_FragColor.g;\n\n\t\t\t\tfloat variance = roughnessToVariance( roughness );\n\n\t\t\t\tvec3 avgNormal;\n\n\t\t\t\tfor ( float x = - 1.0; x < 2.0; x += 2.0 ) {\n\n\t\t\t\t\tfor ( float y = - 1.0; y < 2.0; y += 2.0 ) {\n\n\t\t\t\t\t\tvec2 uv = vUv + vec2( x, y ) * 0.25 * texelSize;\n\n\t\t\t\t\t\tavgNormal += normalize( texture2D( normalMap, uv, - 1.0 ).xyz - 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvariance += 1.0 - 0.25 * length( avgNormal );\n\n\t\t\t\tgl_FragColor.g = varianceToRoughness( variance );\n\n\t\t\t}\n\t\t`,\n\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n })\n\n shaderMaterial.type = 'RoughnessMipmapper'\n\n return shaderMaterial\n}\n\nexport { RoughnessMipmapper }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RoughnessMipmapper.js","sources":["../../src/utils/RoughnessMipmapper.js"],"sourcesContent":["/**\n * This class generates custom mipmaps for a roughness map by encoding the lost variation in the\n * normal map mip levels as increased roughness in the corresponding roughness mip levels. This\n * helps with rendering accuracy for MeshStandardMaterial, and also helps with anti-aliasing when\n * using PMREM. If the normal map is larger than the roughness map, the roughness map will be\n * enlarged to match the dimensions of the normal map.\n */\n\nimport {\n MathUtils,\n Mesh,\n NoBlending,\n OrthographicCamera,\n PlaneGeometry,\n RawShaderMaterial,\n Vector2,\n WebGLRenderTarget,\n} from 'three'\n\nvar _mipmapMaterial = /* @__PURE__ */ _getMipmapMaterial()\n\nvar _mesh = /* @__PURE__ */ new Mesh(/* @__PURE__ */ new PlaneGeometry(2, 2), _mipmapMaterial)\n\nvar _flatCamera = /* @__PURE__ */ new OrthographicCamera(0, 1, 0, 1, 0, 1)\n\nvar _tempTarget = null\n\nclass RoughnessMipmapper {\n constructor(renderer) {\n this._renderer = renderer\n\n this._renderer.compile(_mesh, _flatCamera)\n }\n\n generateMipmaps = function (material) {\n if ('roughnessMap' in material === false) return\n\n var { roughnessMap, normalMap } = material\n\n if (\n roughnessMap === null ||\n normalMap === null ||\n !roughnessMap.generateMipmaps ||\n material.userData.roughnessUpdated\n ) {\n return\n }\n\n material.userData.roughnessUpdated = true\n\n var width = Math.max(roughnessMap.image.width, normalMap.image.width)\n\n var height = Math.max(roughnessMap.image.height, normalMap.image.height)\n\n if (!MathUtils.isPowerOfTwo(width) || !MathUtils.isPowerOfTwo(height)) return\n\n var oldTarget = this._renderer.getRenderTarget()\n\n var autoClear = this._renderer.autoClear\n\n this._renderer.autoClear = false\n\n if (_tempTarget === null || _tempTarget.width !== width || _tempTarget.height !== height) {\n if (_tempTarget !== null) _tempTarget.dispose()\n\n _tempTarget = new WebGLRenderTarget(width, height, {\n depthBuffer: false,\n })\n\n _tempTarget.scissorTest = true\n }\n\n if (width !== roughnessMap.image.width || height !== roughnessMap.image.height) {\n var params = {\n wrapS: roughnessMap.wrapS,\n wrapT: roughnessMap.wrapT,\n magFilter: roughnessMap.magFilter,\n minFilter: roughnessMap.minFilter,\n depthBuffer: false,\n }\n\n var newRoughnessTarget = new WebGLRenderTarget(width, height, params)\n\n newRoughnessTarget.texture.generateMipmaps = true\n\n // Setting the render target causes the memory to be allocated.\n\n this._renderer.setRenderTarget(newRoughnessTarget)\n\n material.roughnessMap = newRoughnessTarget.texture\n\n if (material.metalnessMap == roughnessMap) material.metalnessMap = material.roughnessMap\n\n if (material.aoMap == roughnessMap) material.aoMap = material.roughnessMap\n }\n\n _mipmapMaterial.uniforms.roughnessMap.value = roughnessMap\n\n _mipmapMaterial.uniforms.normalMap.value = normalMap\n\n var position = new Vector2(0, 0)\n\n var texelSize = _mipmapMaterial.uniforms.texelSize.value\n\n for (let mip = 0; width >= 1 && height >= 1; ++mip, width /= 2, height /= 2) {\n // Rendering to a mip level is not allowed in webGL1. Instead we must set\n // up a secondary texture to write the result to, then copy it back to the\n // proper mipmap level.\n\n texelSize.set(1.0 / width, 1.0 / height)\n\n if (mip == 0) texelSize.set(0.0, 0.0)\n\n _tempTarget.viewport.set(position.x, position.y, width, height)\n\n _tempTarget.scissor.set(position.x, position.y, width, height)\n\n this._renderer.setRenderTarget(_tempTarget)\n\n this._renderer.render(_mesh, _flatCamera)\n\n this._renderer.copyFramebufferToTexture(position, material.roughnessMap, mip)\n\n _mipmapMaterial.uniforms.roughnessMap.value = material.roughnessMap\n }\n\n if (roughnessMap !== material.roughnessMap) roughnessMap.dispose()\n\n this._renderer.setRenderTarget(oldTarget)\n\n this._renderer.autoClear = autoClear\n }\n\n dispose = function () {\n _mipmapMaterial.dispose()\n\n _mesh.geometry.dispose()\n\n if (_tempTarget != null) _tempTarget.dispose()\n }\n}\n\nfunction _getMipmapMaterial() {\n var shaderMaterial = new RawShaderMaterial({\n uniforms: {\n roughnessMap: { value: null },\n normalMap: { value: null },\n texelSize: { value: new Vector2(1, 1) },\n },\n\n vertexShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tattribute vec3 position;\n\t\t\tattribute vec2 uv;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main() {\n\n\t\t\t\tvUv = uv;\n\n\t\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n fragmentShader: /* glsl */ `\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tuniform sampler2D roughnessMap;\n\t\t\tuniform sampler2D normalMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\n\t\t\tvec4 envMapTexelToLinear( vec4 a ) { return a; }\n\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tfloat roughnessToVariance( float roughness ) {\n\n\t\t\t\tfloat variance = 0.0;\n\n\t\t\t\tif ( roughness >= r1 ) {\n\n\t\t\t\t\tvariance = ( r0 - roughness ) * ( v1 - v0 ) / ( r0 - r1 ) + v0;\n\n\t\t\t\t} else if ( roughness >= r4 ) {\n\n\t\t\t\t\tvariance = ( r1 - roughness ) * ( v4 - v1 ) / ( r1 - r4 ) + v1;\n\n\t\t\t\t} else if ( roughness >= r5 ) {\n\n\t\t\t\t\tvariance = ( r4 - roughness ) * ( v5 - v4 ) / ( r4 - r5 ) + v4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfloat roughness2 = roughness * roughness;\n\n\t\t\t\t\tvariance = 1.79 * roughness2 * roughness2;\n\n\t\t\t\t}\n\n\t\t\t\treturn variance;\n\n\t\t\t}\n\n\t\t\tfloat varianceToRoughness( float variance ) {\n\n\t\t\t\tfloat roughness = 0.0;\n\n\t\t\t\tif ( variance >= v1 ) {\n\n\t\t\t\t\troughness = ( v0 - variance ) * ( r1 - r0 ) / ( v0 - v1 ) + r0;\n\n\t\t\t\t} else if ( variance >= v4 ) {\n\n\t\t\t\t\troughness = ( v1 - variance ) * ( r4 - r1 ) / ( v1 - v4 ) + r1;\n\n\t\t\t\t} else if ( variance >= v5 ) {\n\n\t\t\t\t\troughness = ( v4 - variance ) * ( r5 - r4 ) / ( v4 - v5 ) + r4;\n\n\t\t\t\t} else {\n\n\t\t\t\t\troughness = pow( 0.559 * variance, 0.25 ); // 0.559 = 1.0 / 1.79\n\n\t\t\t\t}\n\n\t\t\t\treturn roughness;\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = texture2D( roughnessMap, vUv, - 1.0 );\n\n\t\t\t\tif ( texelSize.x == 0.0 ) return;\n\n\t\t\t\tfloat roughness = gl_FragColor.g;\n\n\t\t\t\tfloat variance = roughnessToVariance( roughness );\n\n\t\t\t\tvec3 avgNormal;\n\n\t\t\t\tfor ( float x = - 1.0; x < 2.0; x += 2.0 ) {\n\n\t\t\t\t\tfor ( float y = - 1.0; y < 2.0; y += 2.0 ) {\n\n\t\t\t\t\t\tvec2 uv = vUv + vec2( x, y ) * 0.25 * texelSize;\n\n\t\t\t\t\t\tavgNormal += normalize( texture2D( normalMap, uv, - 1.0 ).xyz - 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvariance += 1.0 - 0.25 * length( avgNormal );\n\n\t\t\t\tgl_FragColor.g = varianceToRoughness( variance );\n\n\t\t\t}\n\t\t`,\n\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n })\n\n shaderMaterial.type = 'RoughnessMipmapper'\n\n return shaderMaterial\n}\n\nexport { RoughnessMipmapper }\n"],"names":[],"mappings":";;;;;;;AAmBA,IAAI,kBAAkC,mCAAoB;AAE1D,IAAI,QAAwB,oBAAI,KAAqB,oBAAI,cAAc,GAAG,CAAC,GAAG,eAAe;AAE7F,IAAI,cAA8B,oBAAI,mBAAmB,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEzE,IAAI,cAAc;AAElB,MAAM,mBAAmB;AAAA,EACvB,YAAY,UAAU;AAMtB,2CAAkB,SAAU,UAAU;AACpC,UAAI,kBAAkB,aAAa;AAAO;AAE1C,UAAI,EAAE,cAAc,UAAS,IAAK;AAElC,UACE,iBAAiB,QACjB,cAAc,QACd,CAAC,aAAa,mBACd,SAAS,SAAS,kBAClB;AACA;AAAA,MACD;AAED,eAAS,SAAS,mBAAmB;AAErC,UAAI,QAAQ,KAAK,IAAI,aAAa,MAAM,OAAO,UAAU,MAAM,KAAK;AAEpE,UAAI,SAAS,KAAK,IAAI,aAAa,MAAM,QAAQ,UAAU,MAAM,MAAM;AAEvE,UAAI,CAAC,UAAU,aAAa,KAAK,KAAK,CAAC,UAAU,aAAa,MAAM;AAAG;AAEvE,UAAI,YAAY,KAAK,UAAU,gBAAiB;AAEhD,UAAI,YAAY,KAAK,UAAU;AAE/B,WAAK,UAAU,YAAY;AAE3B,UAAI,gBAAgB,QAAQ,YAAY,UAAU,SAAS,YAAY,WAAW,QAAQ;AACxF,YAAI,gBAAgB;AAAM,sBAAY,QAAS;AAE/C,sBAAc,IAAI,kBAAkB,OAAO,QAAQ;AAAA,UACjD,aAAa;AAAA,QACrB,CAAO;AAED,oBAAY,cAAc;AAAA,MAC3B;AAED,UAAI,UAAU,aAAa,MAAM,SAAS,WAAW,aAAa,MAAM,QAAQ;AAC9E,YAAI,SAAS;AAAA,UACX,OAAO,aAAa;AAAA,UACpB,OAAO,aAAa;AAAA,UACpB,WAAW,aAAa;AAAA,UACxB,WAAW,aAAa;AAAA,UACxB,aAAa;AAAA,QACd;AAED,YAAI,qBAAqB,IAAI,kBAAkB,OAAO,QAAQ,MAAM;AAEpE,2BAAmB,QAAQ,kBAAkB;AAI7C,aAAK,UAAU,gBAAgB,kBAAkB;AAEjD,iBAAS,eAAe,mBAAmB;AAE3C,YAAI,SAAS,gBAAgB;AAAc,mBAAS,eAAe,SAAS;AAE5E,YAAI,SAAS,SAAS;AAAc,mBAAS,QAAQ,SAAS;AAAA,MAC/D;AAED,sBAAgB,SAAS,aAAa,QAAQ;AAE9C,sBAAgB,SAAS,UAAU,QAAQ;AAE3C,UAAI,WAAW,IAAI,QAAQ,GAAG,CAAC;AAE/B,UAAI,YAAY,gBAAgB,SAAS,UAAU;AAEnD,eAAS,MAAM,GAAG,SAAS,KAAK,UAAU,GAAG,EAAE,KAAK,SAAS,GAAG,UAAU,GAAG;AAK3E,kBAAU,IAAI,IAAM,OAAO,IAAM,MAAM;AAEvC,YAAI,OAAO;AAAG,oBAAU,IAAI,GAAK,CAAG;AAEpC,oBAAY,SAAS,IAAI,SAAS,GAAG,SAAS,GAAG,OAAO,MAAM;AAE9D,oBAAY,QAAQ,IAAI,SAAS,GAAG,SAAS,GAAG,OAAO,MAAM;AAE7D,aAAK,UAAU,gBAAgB,WAAW;AAE1C,aAAK,UAAU,OAAO,OAAO,WAAW;AAExC,aAAK,UAAU,yBAAyB,UAAU,SAAS,cAAc,GAAG;AAE5E,wBAAgB,SAAS,aAAa,QAAQ,SAAS;AAAA,MACxD;AAED,UAAI,iBAAiB,SAAS;AAAc,qBAAa,QAAS;AAElE,WAAK,UAAU,gBAAgB,SAAS;AAExC,WAAK,UAAU,YAAY;AAAA,IAC5B;AAED,mCAAU,WAAY;AACpB,sBAAgB,QAAS;AAEzB,YAAM,SAAS,QAAS;AAExB,UAAI,eAAe;AAAM,oBAAY,QAAS;AAAA,IAC/C;AA9GC,SAAK,YAAY;AAEjB,SAAK,UAAU,QAAQ,OAAO,WAAW;AAAA,EAC1C;AA4GH;AAEA,SAAS,qBAAqB;AAC5B,MAAI,iBAAiB,IAAI,kBAAkB;AAAA,IACzC,UAAU;AAAA,MACR,cAAc,EAAE,OAAO,KAAM;AAAA,MAC7B,WAAW,EAAE,OAAO,KAAM;AAAA,MAC1B,WAAW,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC,EAAG;AAAA,IACxC;AAAA,IAED;AAAA;AAAA,MAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBzB;AAAA;AAAA,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqG3B,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,EAChB,CAAG;AAED,iBAAe,OAAO;AAEtB,SAAO;AACT;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- class ARButton {
4
- static createButton(renderer, sessionInit = {}) {
3
+ const ARButton = {
4
+ createButton(renderer, sessionInit = {}) {
5
5
  const button = document.createElement("button");
6
6
  function showStartAR() {
7
7
  if (sessionInit.domOverlay === void 0) {
@@ -114,6 +114,6 @@ class ARButton {
114
114
  return message;
115
115
  }
116
116
  }
117
- }
117
+ };
118
118
  exports.ARButton = ARButton;
119
119
  //# sourceMappingURL=ARButton.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ARButton.cjs","sources":["../../src/webxr/ARButton.ts"],"sourcesContent":["import { WebGLRenderer } from 'three'\n\nclass ARButton {\n static createButton(renderer: WebGLRenderer, sessionInit: XRSessionInit = {}): HTMLButtonElement | HTMLAnchorElement {\n const button = document.createElement('button')\n\n function showStartAR(/*device*/): void {\n if ((sessionInit as any).domOverlay === undefined) {\n const overlay = document.createElement('div')\n overlay.style.display = 'none'\n document.body.appendChild(overlay)\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', '38px')\n svg.setAttribute('height', '38px')\n svg.style.position = 'absolute'\n svg.style.right = '20px'\n svg.style.top = '20px'\n svg.addEventListener('click', function () {\n currentSession?.end()\n })\n overlay.appendChild(svg)\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28')\n path.setAttribute('stroke', '#fff')\n path.setAttribute('stroke-width', '2px')\n svg.appendChild(path)\n\n if (sessionInit.optionalFeatures === undefined) {\n sessionInit.optionalFeatures = []\n }\n\n sessionInit.optionalFeatures.push('dom-overlay')\n ;(sessionInit as any).domOverlay = { root: overlay }\n }\n\n //\n\n let currentSession: XRSession | null = null\n\n async function onSessionStarted(session: XRSession): Promise<void> {\n session.addEventListener('end', onSessionEnded)\n\n renderer.xr.setReferenceSpaceType('local')\n\n await renderer.xr.setSession(session as any)\n\n button.textContent = 'STOP AR'\n ;(sessionInit as any).domOverlay!.root.style.display = ''\n\n currentSession = session\n }\n\n function onSessionEnded(/*event*/): void {\n currentSession!.removeEventListener('end', onSessionEnded)\n\n button.textContent = 'START AR'\n ;(sessionInit as any).domOverlay!.root.style.display = 'none'\n\n currentSession = null\n }\n\n //\n\n button.style.display = ''\n\n button.style.cursor = 'pointer'\n button.style.left = 'calc(50% - 50px)'\n button.style.width = '100px'\n\n button.textContent = 'START AR'\n\n button.onmouseenter = (): void => {\n button.style.opacity = '1.0'\n }\n\n button.onmouseleave = (): void => {\n button.style.opacity = '0.5'\n }\n\n button.onclick = (): void => {\n if (currentSession === null) {\n ;(navigator as Navigator).xr!.requestSession('immersive-ar', sessionInit).then(onSessionStarted)\n } else {\n currentSession.end()\n }\n }\n }\n\n function disableButton(): void {\n button.style.display = ''\n\n button.style.cursor = 'auto'\n button.style.left = 'calc(50% - 75px)'\n button.style.width = '150px'\n\n button.onmouseenter = null\n button.onmouseleave = null\n\n button.onclick = null\n }\n\n function showARNotSupported(): void {\n disableButton()\n\n button.textContent = 'AR NOT SUPPORTED'\n }\n\n function stylizeElement(element: HTMLElement): void {\n element.style.position = 'absolute'\n element.style.bottom = '20px'\n element.style.padding = '12px 6px'\n element.style.border = '1px solid #fff'\n element.style.borderRadius = '4px'\n element.style.background = 'rgba(0,0,0,0.1)'\n element.style.color = '#fff'\n element.style.font = 'normal 13px sans-serif'\n element.style.textAlign = 'center'\n element.style.opacity = '0.5'\n element.style.outline = 'none'\n element.style.zIndex = '999'\n }\n\n if ('xr' in navigator) {\n button.id = 'ARButton'\n button.style.display = 'none'\n\n stylizeElement(button)\n\n // Query for session mode\n ;(navigator as Navigator)\n .xr!.isSessionSupported('immersive-ar')\n .then(function (supported: boolean) {\n supported ? showStartAR() : showARNotSupported()\n })\n .catch(showARNotSupported)\n\n return button\n } else {\n const message = document.createElement('a')\n\n if (window.isSecureContext === false) {\n message.href = document.location.href.replace(/^http:/, 'https:')\n message.innerHTML = 'WEBXR NEEDS HTTPS' // TODO Improve message\n } else {\n message.href = 'https://immersiveweb.dev/'\n message.innerHTML = 'WEBXR NOT AVAILABLE'\n }\n\n message.style.left = 'calc(50% - 90px)'\n message.style.width = '180px'\n message.style.textDecoration = 'none'\n\n stylizeElement(message)\n\n return message\n }\n }\n}\n\nexport { ARButton }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ARButton.cjs","sources":["../../src/webxr/ARButton.ts"],"sourcesContent":["import { WebGLRenderer } from 'three'\n\nconst ARButton = {\n createButton(renderer: WebGLRenderer, sessionInit: XRSessionInit = {}): HTMLButtonElement | HTMLAnchorElement {\n const button = document.createElement('button')\n\n function showStartAR(/*device*/): void {\n if ((sessionInit as any).domOverlay === undefined) {\n const overlay = document.createElement('div')\n overlay.style.display = 'none'\n document.body.appendChild(overlay)\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', '38px')\n svg.setAttribute('height', '38px')\n svg.style.position = 'absolute'\n svg.style.right = '20px'\n svg.style.top = '20px'\n svg.addEventListener('click', function () {\n currentSession?.end()\n })\n overlay.appendChild(svg)\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28')\n path.setAttribute('stroke', '#fff')\n path.setAttribute('stroke-width', '2px')\n svg.appendChild(path)\n\n if (sessionInit.optionalFeatures === undefined) {\n sessionInit.optionalFeatures = []\n }\n\n sessionInit.optionalFeatures.push('dom-overlay')\n ;(sessionInit as any).domOverlay = { root: overlay }\n }\n\n //\n\n let currentSession: XRSession | null = null\n\n async function onSessionStarted(session: XRSession): Promise<void> {\n session.addEventListener('end', onSessionEnded)\n\n renderer.xr.setReferenceSpaceType('local')\n\n await renderer.xr.setSession(session as any)\n\n button.textContent = 'STOP AR'\n ;(sessionInit as any).domOverlay!.root.style.display = ''\n\n currentSession = session\n }\n\n function onSessionEnded(/*event*/): void {\n currentSession!.removeEventListener('end', onSessionEnded)\n\n button.textContent = 'START AR'\n ;(sessionInit as any).domOverlay!.root.style.display = 'none'\n\n currentSession = null\n }\n\n //\n\n button.style.display = ''\n\n button.style.cursor = 'pointer'\n button.style.left = 'calc(50% - 50px)'\n button.style.width = '100px'\n\n button.textContent = 'START AR'\n\n button.onmouseenter = (): void => {\n button.style.opacity = '1.0'\n }\n\n button.onmouseleave = (): void => {\n button.style.opacity = '0.5'\n }\n\n button.onclick = (): void => {\n if (currentSession === null) {\n ;(navigator as Navigator).xr!.requestSession('immersive-ar', sessionInit).then(onSessionStarted)\n } else {\n currentSession.end()\n }\n }\n }\n\n function disableButton(): void {\n button.style.display = ''\n\n button.style.cursor = 'auto'\n button.style.left = 'calc(50% - 75px)'\n button.style.width = '150px'\n\n button.onmouseenter = null\n button.onmouseleave = null\n\n button.onclick = null\n }\n\n function showARNotSupported(): void {\n disableButton()\n\n button.textContent = 'AR NOT SUPPORTED'\n }\n\n function stylizeElement(element: HTMLElement): void {\n element.style.position = 'absolute'\n element.style.bottom = '20px'\n element.style.padding = '12px 6px'\n element.style.border = '1px solid #fff'\n element.style.borderRadius = '4px'\n element.style.background = 'rgba(0,0,0,0.1)'\n element.style.color = '#fff'\n element.style.font = 'normal 13px sans-serif'\n element.style.textAlign = 'center'\n element.style.opacity = '0.5'\n element.style.outline = 'none'\n element.style.zIndex = '999'\n }\n\n if ('xr' in navigator) {\n button.id = 'ARButton'\n button.style.display = 'none'\n\n stylizeElement(button)\n\n // Query for session mode\n ;(navigator as Navigator)\n .xr!.isSessionSupported('immersive-ar')\n .then(function (supported: boolean) {\n supported ? showStartAR() : showARNotSupported()\n })\n .catch(showARNotSupported)\n\n return button\n } else {\n const message = document.createElement('a')\n\n if (window.isSecureContext === false) {\n message.href = document.location.href.replace(/^http:/, 'https:')\n message.innerHTML = 'WEBXR NEEDS HTTPS' // TODO Improve message\n } else {\n message.href = 'https://immersiveweb.dev/'\n message.innerHTML = 'WEBXR NOT AVAILABLE'\n }\n\n message.style.left = 'calc(50% - 90px)'\n message.style.width = '180px'\n message.style.textDecoration = 'none'\n\n stylizeElement(message)\n\n return message\n }\n },\n}\n\nexport { ARButton }\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="webxr" />
2
2
  import { WebGLRenderer } from 'three';
3
- declare class ARButton {
4
- static createButton(renderer: WebGLRenderer, sessionInit?: XRSessionInit): HTMLButtonElement | HTMLAnchorElement;
5
- }
3
+ declare const ARButton: {
4
+ createButton(renderer: WebGLRenderer, sessionInit?: XRSessionInit): HTMLButtonElement | HTMLAnchorElement;
5
+ };
6
6
  export { ARButton };
package/webxr/ARButton.js CHANGED
@@ -1,5 +1,5 @@
1
- class ARButton {
2
- static createButton(renderer, sessionInit = {}) {
1
+ const ARButton = {
2
+ createButton(renderer, sessionInit = {}) {
3
3
  const button = document.createElement("button");
4
4
  function showStartAR() {
5
5
  if (sessionInit.domOverlay === void 0) {
@@ -112,7 +112,7 @@ class ARButton {
112
112
  return message;
113
113
  }
114
114
  }
115
- }
115
+ };
116
116
  export {
117
117
  ARButton
118
118
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ARButton.js","sources":["../../src/webxr/ARButton.ts"],"sourcesContent":["import { WebGLRenderer } from 'three'\n\nclass ARButton {\n static createButton(renderer: WebGLRenderer, sessionInit: XRSessionInit = {}): HTMLButtonElement | HTMLAnchorElement {\n const button = document.createElement('button')\n\n function showStartAR(/*device*/): void {\n if ((sessionInit as any).domOverlay === undefined) {\n const overlay = document.createElement('div')\n overlay.style.display = 'none'\n document.body.appendChild(overlay)\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', '38px')\n svg.setAttribute('height', '38px')\n svg.style.position = 'absolute'\n svg.style.right = '20px'\n svg.style.top = '20px'\n svg.addEventListener('click', function () {\n currentSession?.end()\n })\n overlay.appendChild(svg)\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28')\n path.setAttribute('stroke', '#fff')\n path.setAttribute('stroke-width', '2px')\n svg.appendChild(path)\n\n if (sessionInit.optionalFeatures === undefined) {\n sessionInit.optionalFeatures = []\n }\n\n sessionInit.optionalFeatures.push('dom-overlay')\n ;(sessionInit as any).domOverlay = { root: overlay }\n }\n\n //\n\n let currentSession: XRSession | null = null\n\n async function onSessionStarted(session: XRSession): Promise<void> {\n session.addEventListener('end', onSessionEnded)\n\n renderer.xr.setReferenceSpaceType('local')\n\n await renderer.xr.setSession(session as any)\n\n button.textContent = 'STOP AR'\n ;(sessionInit as any).domOverlay!.root.style.display = ''\n\n currentSession = session\n }\n\n function onSessionEnded(/*event*/): void {\n currentSession!.removeEventListener('end', onSessionEnded)\n\n button.textContent = 'START AR'\n ;(sessionInit as any).domOverlay!.root.style.display = 'none'\n\n currentSession = null\n }\n\n //\n\n button.style.display = ''\n\n button.style.cursor = 'pointer'\n button.style.left = 'calc(50% - 50px)'\n button.style.width = '100px'\n\n button.textContent = 'START AR'\n\n button.onmouseenter = (): void => {\n button.style.opacity = '1.0'\n }\n\n button.onmouseleave = (): void => {\n button.style.opacity = '0.5'\n }\n\n button.onclick = (): void => {\n if (currentSession === null) {\n ;(navigator as Navigator).xr!.requestSession('immersive-ar', sessionInit).then(onSessionStarted)\n } else {\n currentSession.end()\n }\n }\n }\n\n function disableButton(): void {\n button.style.display = ''\n\n button.style.cursor = 'auto'\n button.style.left = 'calc(50% - 75px)'\n button.style.width = '150px'\n\n button.onmouseenter = null\n button.onmouseleave = null\n\n button.onclick = null\n }\n\n function showARNotSupported(): void {\n disableButton()\n\n button.textContent = 'AR NOT SUPPORTED'\n }\n\n function stylizeElement(element: HTMLElement): void {\n element.style.position = 'absolute'\n element.style.bottom = '20px'\n element.style.padding = '12px 6px'\n element.style.border = '1px solid #fff'\n element.style.borderRadius = '4px'\n element.style.background = 'rgba(0,0,0,0.1)'\n element.style.color = '#fff'\n element.style.font = 'normal 13px sans-serif'\n element.style.textAlign = 'center'\n element.style.opacity = '0.5'\n element.style.outline = 'none'\n element.style.zIndex = '999'\n }\n\n if ('xr' in navigator) {\n button.id = 'ARButton'\n button.style.display = 'none'\n\n stylizeElement(button)\n\n // Query for session mode\n ;(navigator as Navigator)\n .xr!.isSessionSupported('immersive-ar')\n .then(function (supported: boolean) {\n supported ? showStartAR() : showARNotSupported()\n })\n .catch(showARNotSupported)\n\n return button\n } else {\n const message = document.createElement('a')\n\n if (window.isSecureContext === false) {\n message.href = document.location.href.replace(/^http:/, 'https:')\n message.innerHTML = 'WEBXR NEEDS HTTPS' // TODO Improve message\n } else {\n message.href = 'https://immersiveweb.dev/'\n message.innerHTML = 'WEBXR NOT AVAILABLE'\n }\n\n message.style.left = 'calc(50% - 90px)'\n message.style.width = '180px'\n message.style.textDecoration = 'none'\n\n stylizeElement(message)\n\n return message\n }\n }\n}\n\nexport { ARButton }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ARButton.js","sources":["../../src/webxr/ARButton.ts"],"sourcesContent":["import { WebGLRenderer } from 'three'\n\nconst ARButton = {\n createButton(renderer: WebGLRenderer, sessionInit: XRSessionInit = {}): HTMLButtonElement | HTMLAnchorElement {\n const button = document.createElement('button')\n\n function showStartAR(/*device*/): void {\n if ((sessionInit as any).domOverlay === undefined) {\n const overlay = document.createElement('div')\n overlay.style.display = 'none'\n document.body.appendChild(overlay)\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', '38px')\n svg.setAttribute('height', '38px')\n svg.style.position = 'absolute'\n svg.style.right = '20px'\n svg.style.top = '20px'\n svg.addEventListener('click', function () {\n currentSession?.end()\n })\n overlay.appendChild(svg)\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28')\n path.setAttribute('stroke', '#fff')\n path.setAttribute('stroke-width', '2px')\n svg.appendChild(path)\n\n if (sessionInit.optionalFeatures === undefined) {\n sessionInit.optionalFeatures = []\n }\n\n sessionInit.optionalFeatures.push('dom-overlay')\n ;(sessionInit as any).domOverlay = { root: overlay }\n }\n\n //\n\n let currentSession: XRSession | null = null\n\n async function onSessionStarted(session: XRSession): Promise<void> {\n session.addEventListener('end', onSessionEnded)\n\n renderer.xr.setReferenceSpaceType('local')\n\n await renderer.xr.setSession(session as any)\n\n button.textContent = 'STOP AR'\n ;(sessionInit as any).domOverlay!.root.style.display = ''\n\n currentSession = session\n }\n\n function onSessionEnded(/*event*/): void {\n currentSession!.removeEventListener('end', onSessionEnded)\n\n button.textContent = 'START AR'\n ;(sessionInit as any).domOverlay!.root.style.display = 'none'\n\n currentSession = null\n }\n\n //\n\n button.style.display = ''\n\n button.style.cursor = 'pointer'\n button.style.left = 'calc(50% - 50px)'\n button.style.width = '100px'\n\n button.textContent = 'START AR'\n\n button.onmouseenter = (): void => {\n button.style.opacity = '1.0'\n }\n\n button.onmouseleave = (): void => {\n button.style.opacity = '0.5'\n }\n\n button.onclick = (): void => {\n if (currentSession === null) {\n ;(navigator as Navigator).xr!.requestSession('immersive-ar', sessionInit).then(onSessionStarted)\n } else {\n currentSession.end()\n }\n }\n }\n\n function disableButton(): void {\n button.style.display = ''\n\n button.style.cursor = 'auto'\n button.style.left = 'calc(50% - 75px)'\n button.style.width = '150px'\n\n button.onmouseenter = null\n button.onmouseleave = null\n\n button.onclick = null\n }\n\n function showARNotSupported(): void {\n disableButton()\n\n button.textContent = 'AR NOT SUPPORTED'\n }\n\n function stylizeElement(element: HTMLElement): void {\n element.style.position = 'absolute'\n element.style.bottom = '20px'\n element.style.padding = '12px 6px'\n element.style.border = '1px solid #fff'\n element.style.borderRadius = '4px'\n element.style.background = 'rgba(0,0,0,0.1)'\n element.style.color = '#fff'\n element.style.font = 'normal 13px sans-serif'\n element.style.textAlign = 'center'\n element.style.opacity = '0.5'\n element.style.outline = 'none'\n element.style.zIndex = '999'\n }\n\n if ('xr' in navigator) {\n button.id = 'ARButton'\n button.style.display = 'none'\n\n stylizeElement(button)\n\n // Query for session mode\n ;(navigator as Navigator)\n .xr!.isSessionSupported('immersive-ar')\n .then(function (supported: boolean) {\n supported ? showStartAR() : showARNotSupported()\n })\n .catch(showARNotSupported)\n\n return button\n } else {\n const message = document.createElement('a')\n\n if (window.isSecureContext === false) {\n message.href = document.location.href.replace(/^http:/, 'https:')\n message.innerHTML = 'WEBXR NEEDS HTTPS' // TODO Improve message\n } else {\n message.href = 'https://immersiveweb.dev/'\n message.innerHTML = 'WEBXR NOT AVAILABLE'\n }\n\n message.style.left = 'calc(50% - 90px)'\n message.style.width = '180px'\n message.style.textDecoration = 'none'\n\n stylizeElement(message)\n\n return message\n }\n },\n}\n\nexport { ARButton }\n"],"names":[],"mappings":"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"}
@@ -31,8 +31,8 @@ const POINTER_LENGTH = 0.035;
31
31
  const POINTER_SEGMENTS = 16;
32
32
  const POINTER_RINGS = 12;
33
33
  const POINTER_HEMISPHERE_ANGLE = 110;
34
- const YAXIS = new THREE__namespace.Vector3(0, 1, 0);
35
- const ZAXIS = new THREE__namespace.Vector3(0, 0, 1);
34
+ const YAXIS = /* @__PURE__ */ new THREE__namespace.Vector3(0, 1, 0);
35
+ const ZAXIS = /* @__PURE__ */ new THREE__namespace.Vector3(0, 0, 1);
36
36
  const CURSOR_RADIUS = 0.02;
37
37
  const CURSOR_MAX_DISTANCE = 1.5;
38
38
  class OculusHandPointerModel extends THREE__namespace.Object3D {
@@ -1 +1 @@
1
- {"version":3,"file":"OculusHandPointerModel.cjs","sources":["../../src/webxr/OculusHandPointerModel.js"],"sourcesContent":["import * as THREE from 'three'\n\nconst PINCH_MAX = 0.05\nconst PINCH_THRESHOLD = 0.02\nconst PINCH_MIN = 0.01\nconst POINTER_ADVANCE_MAX = 0.02\nconst POINTER_OPACITY_MAX = 1\nconst POINTER_OPACITY_MIN = 0.4\nconst POINTER_FRONT_RADIUS = 0.002\nconst POINTER_REAR_RADIUS = 0.01\nconst POINTER_REAR_RADIUS_MIN = 0.003\nconst POINTER_LENGTH = 0.035\nconst POINTER_SEGMENTS = 16\nconst POINTER_RINGS = 12\nconst POINTER_HEMISPHERE_ANGLE = 110\nconst YAXIS = new THREE.Vector3(0, 1, 0)\nconst ZAXIS = new THREE.Vector3(0, 0, 1)\n\nconst CURSOR_RADIUS = 0.02\nconst CURSOR_MAX_DISTANCE = 1.5\n\nclass OculusHandPointerModel extends THREE.Object3D {\n constructor(hand, controller) {\n super()\n\n this.hand = hand\n this.controller = controller\n\n // Unused\n this.motionController = null\n this.envMap = null\n this.mesh = null\n\n this.pointerGeometry = null\n this.pointerMesh = null\n this.pointerObject = null\n\n this.pinched = false\n this.attached = false\n\n this.cursorObject = null\n\n this.raycaster = null\n\n this._onConnected = this._onConnected.bind(this)\n this._onDisconnected = this._onDisconnected.bind(this)\n this.hand.addEventListener('connected', this._onConnected)\n this.hand.addEventListener('disconnected', this._onDisconnected)\n }\n\n _onConnected(event) {\n const xrInputSource = event.data\n if (xrInputSource.hand) {\n this.visible = true\n this.xrInputSource = xrInputSource\n\n this.createPointer()\n }\n }\n\n _onDisconnected() {\n this.visible = false\n this.xrInputSource = null\n\n this.pointerGeometry?.dispose()\n this.pointerMesh?.material.dispose()\n\n this.clear()\n }\n\n _drawVerticesRing(vertices, baseVector, ringIndex) {\n const segmentVector = baseVector.clone()\n for (var i = 0; i < POINTER_SEGMENTS; i++) {\n segmentVector.applyAxisAngle(ZAXIS, (Math.PI * 2) / POINTER_SEGMENTS)\n const vid = ringIndex * POINTER_SEGMENTS + i\n vertices[3 * vid] = segmentVector.x\n vertices[3 * vid + 1] = segmentVector.y\n vertices[3 * vid + 2] = segmentVector.z\n }\n }\n\n _updatePointerVertices(rearRadius) {\n const vertices = this.pointerGeometry.attributes.position.array\n // first ring for front face\n const frontFaceBase = new THREE.Vector3(POINTER_FRONT_RADIUS, 0, -1 * (POINTER_LENGTH - rearRadius))\n this._drawVerticesRing(vertices, frontFaceBase, 0)\n\n // rings for rear hemisphere\n const rearBase = new THREE.Vector3(\n Math.sin((Math.PI * POINTER_HEMISPHERE_ANGLE) / 180) * rearRadius,\n Math.cos((Math.PI * POINTER_HEMISPHERE_ANGLE) / 180) * rearRadius,\n 0,\n )\n for (var i = 0; i < POINTER_RINGS; i++) {\n this._drawVerticesRing(vertices, rearBase, i + 1)\n rearBase.applyAxisAngle(YAXIS, (Math.PI * POINTER_HEMISPHERE_ANGLE) / 180 / (POINTER_RINGS * -2))\n }\n\n // front and rear face center vertices\n const frontCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS)\n const rearCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS) + 1\n const frontCenter = new THREE.Vector3(0, 0, -1 * (POINTER_LENGTH - rearRadius))\n vertices[frontCenterIndex * 3] = frontCenter.x\n vertices[frontCenterIndex * 3 + 1] = frontCenter.y\n vertices[frontCenterIndex * 3 + 2] = frontCenter.z\n const rearCenter = new THREE.Vector3(0, 0, rearRadius)\n vertices[rearCenterIndex * 3] = rearCenter.x\n vertices[rearCenterIndex * 3 + 1] = rearCenter.y\n vertices[rearCenterIndex * 3 + 2] = rearCenter.z\n\n this.pointerGeometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\n // verticesNeedUpdate = true;\n }\n\n createPointer() {\n var i, j\n const vertices = new Array(((POINTER_RINGS + 1) * POINTER_SEGMENTS + 2) * 3).fill(0)\n // const vertices = [];\n const indices = []\n this.pointerGeometry = new THREE.BufferGeometry()\n\n this.pointerGeometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\n\n this._updatePointerVertices(POINTER_REAR_RADIUS)\n\n // construct faces to connect rings\n for (i = 0; i < POINTER_RINGS; i++) {\n for (j = 0; j < POINTER_SEGMENTS - 1; j++) {\n indices.push(i * POINTER_SEGMENTS + j, i * POINTER_SEGMENTS + j + 1, (i + 1) * POINTER_SEGMENTS + j)\n indices.push(i * POINTER_SEGMENTS + j + 1, (i + 1) * POINTER_SEGMENTS + j + 1, (i + 1) * POINTER_SEGMENTS + j)\n }\n\n indices.push((i + 1) * POINTER_SEGMENTS - 1, i * POINTER_SEGMENTS, (i + 2) * POINTER_SEGMENTS - 1)\n indices.push(i * POINTER_SEGMENTS, (i + 1) * POINTER_SEGMENTS, (i + 2) * POINTER_SEGMENTS - 1)\n }\n\n // construct front and rear face\n const frontCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS)\n const rearCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS) + 1\n\n for (i = 0; i < POINTER_SEGMENTS - 1; i++) {\n indices.push(frontCenterIndex, i + 1, i)\n indices.push(rearCenterIndex, i + POINTER_SEGMENTS * POINTER_RINGS, i + POINTER_SEGMENTS * POINTER_RINGS + 1)\n }\n\n indices.push(frontCenterIndex, 0, POINTER_SEGMENTS - 1)\n indices.push(rearCenterIndex, POINTER_SEGMENTS * (POINTER_RINGS + 1) - 1, POINTER_SEGMENTS * POINTER_RINGS)\n\n const material = new THREE.MeshBasicMaterial()\n material.transparent = true\n material.opacity = POINTER_OPACITY_MIN\n\n this.pointerGeometry.setIndex(indices)\n\n this.pointerMesh = new THREE.Mesh(this.pointerGeometry, material)\n\n this.pointerMesh.position.set(0, 0, -1 * POINTER_REAR_RADIUS)\n this.pointerObject = new THREE.Object3D()\n this.pointerObject.add(this.pointerMesh)\n\n this.raycaster = new THREE.Raycaster()\n\n // create cursor\n const cursorGeometry = new THREE.SphereGeometry(CURSOR_RADIUS, 10, 10)\n const cursorMaterial = new THREE.MeshBasicMaterial()\n cursorMaterial.transparent = true\n cursorMaterial.opacity = POINTER_OPACITY_MIN\n\n this.cursorObject = new THREE.Mesh(cursorGeometry, cursorMaterial)\n this.pointerObject.add(this.cursorObject)\n\n this.add(this.pointerObject)\n }\n\n _updateRaycaster() {\n if (this.raycaster) {\n const pointerMatrix = this.pointerObject.matrixWorld\n const tempMatrix = new THREE.Matrix4()\n tempMatrix.identity().extractRotation(pointerMatrix)\n this.raycaster.ray.origin.setFromMatrixPosition(pointerMatrix)\n this.raycaster.ray.direction.set(0, 0, -1).applyMatrix4(tempMatrix)\n }\n }\n\n _updatePointer() {\n this.pointerObject.visible = this.controller.visible\n const indexTip = this.hand.joints['index-finger-tip']\n const thumbTip = this.hand.joints['thumb-tip']\n const distance = indexTip.position.distanceTo(thumbTip.position)\n const position = indexTip.position.clone().add(thumbTip.position).multiplyScalar(0.5)\n this.pointerObject.position.copy(position)\n this.pointerObject.quaternion.copy(this.controller.quaternion)\n\n this.pinched = distance <= PINCH_THRESHOLD\n\n const pinchScale = (distance - PINCH_MIN) / (PINCH_MAX - PINCH_MIN)\n const focusScale = (distance - PINCH_MIN) / (PINCH_THRESHOLD - PINCH_MIN)\n if (pinchScale > 1) {\n this._updatePointerVertices(POINTER_REAR_RADIUS)\n this.pointerMesh.position.set(0, 0, -1 * POINTER_REAR_RADIUS)\n this.pointerMesh.material.opacity = POINTER_OPACITY_MIN\n } else if (pinchScale > 0) {\n const rearRadius = (POINTER_REAR_RADIUS - POINTER_REAR_RADIUS_MIN) * pinchScale + POINTER_REAR_RADIUS_MIN\n this._updatePointerVertices(rearRadius)\n if (focusScale < 1) {\n this.pointerMesh.position.set(0, 0, -1 * rearRadius - (1 - focusScale) * POINTER_ADVANCE_MAX)\n this.pointerMesh.material.opacity =\n POINTER_OPACITY_MIN + (1 - focusScale) * (POINTER_OPACITY_MAX - POINTER_OPACITY_MIN)\n } else {\n this.pointerMesh.position.set(0, 0, -1 * rearRadius)\n this.pointerMesh.material.opacity = POINTER_OPACITY_MIN\n }\n } else {\n this._updatePointerVertices(POINTER_REAR_RADIUS_MIN)\n this.pointerMesh.position.set(0, 0, -1 * POINTER_REAR_RADIUS_MIN - POINTER_ADVANCE_MAX)\n this.pointerMesh.material.opacity = POINTER_OPACITY_MAX\n }\n\n this.cursorObject.material.opacity = this.pointerMesh.material.opacity\n }\n\n updateMatrixWorld(force) {\n super.updateMatrixWorld(force)\n if (this.pointerGeometry) {\n this._updatePointer()\n this._updateRaycaster()\n }\n }\n\n isPinched() {\n return this.pinched\n }\n\n setAttached(attached) {\n this.attached = attached\n }\n\n isAttached() {\n return this.attached\n }\n\n intersectObject(object, recursive = true) {\n if (this.raycaster) {\n return this.raycaster.intersectObject(object, recursive)\n }\n }\n\n intersectObjects(objects, recursive = true) {\n if (this.raycaster) {\n return this.raycaster.intersectObjects(objects, recursive)\n }\n }\n\n checkIntersections(objects, recursive = false) {\n if (this.raycaster && !this.attached) {\n const intersections = this.raycaster.intersectObjects(objects, recursive)\n const direction = new THREE.Vector3(0, 0, -1)\n if (intersections.length > 0) {\n const intersection = intersections[0]\n const distance = intersection.distance\n this.cursorObject.position.copy(direction.multiplyScalar(distance))\n } else {\n this.cursorObject.position.copy(direction.multiplyScalar(CURSOR_MAX_DISTANCE))\n }\n }\n }\n\n setCursor(distance) {\n const direction = new THREE.Vector3(0, 0, -1)\n if (this.raycaster && !this.attached) {\n this.cursorObject.position.copy(direction.multiplyScalar(distance))\n }\n }\n\n dispose() {\n this._onDisconnected()\n this.hand.removeEventListener('connected', this._onConnected)\n this.hand.removeEventListener('disconnected', this._onDisconnected)\n }\n}\n\nexport { OculusHandPointerModel }\n"],"names":["THREE"],"mappings":"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"}
1
+ {"version":3,"file":"OculusHandPointerModel.cjs","sources":["../../src/webxr/OculusHandPointerModel.js"],"sourcesContent":["import * as THREE from 'three'\n\nconst PINCH_MAX = 0.05\nconst PINCH_THRESHOLD = 0.02\nconst PINCH_MIN = 0.01\nconst POINTER_ADVANCE_MAX = 0.02\nconst POINTER_OPACITY_MAX = 1\nconst POINTER_OPACITY_MIN = 0.4\nconst POINTER_FRONT_RADIUS = 0.002\nconst POINTER_REAR_RADIUS = 0.01\nconst POINTER_REAR_RADIUS_MIN = 0.003\nconst POINTER_LENGTH = 0.035\nconst POINTER_SEGMENTS = 16\nconst POINTER_RINGS = 12\nconst POINTER_HEMISPHERE_ANGLE = 110\nconst YAXIS = /* @__PURE__ */ new THREE.Vector3(0, 1, 0)\nconst ZAXIS = /* @__PURE__ */ new THREE.Vector3(0, 0, 1)\n\nconst CURSOR_RADIUS = 0.02\nconst CURSOR_MAX_DISTANCE = 1.5\n\nclass OculusHandPointerModel extends THREE.Object3D {\n constructor(hand, controller) {\n super()\n\n this.hand = hand\n this.controller = controller\n\n // Unused\n this.motionController = null\n this.envMap = null\n this.mesh = null\n\n this.pointerGeometry = null\n this.pointerMesh = null\n this.pointerObject = null\n\n this.pinched = false\n this.attached = false\n\n this.cursorObject = null\n\n this.raycaster = null\n\n this._onConnected = this._onConnected.bind(this)\n this._onDisconnected = this._onDisconnected.bind(this)\n this.hand.addEventListener('connected', this._onConnected)\n this.hand.addEventListener('disconnected', this._onDisconnected)\n }\n\n _onConnected(event) {\n const xrInputSource = event.data\n if (xrInputSource.hand) {\n this.visible = true\n this.xrInputSource = xrInputSource\n\n this.createPointer()\n }\n }\n\n _onDisconnected() {\n this.visible = false\n this.xrInputSource = null\n\n this.pointerGeometry?.dispose()\n this.pointerMesh?.material.dispose()\n\n this.clear()\n }\n\n _drawVerticesRing(vertices, baseVector, ringIndex) {\n const segmentVector = baseVector.clone()\n for (var i = 0; i < POINTER_SEGMENTS; i++) {\n segmentVector.applyAxisAngle(ZAXIS, (Math.PI * 2) / POINTER_SEGMENTS)\n const vid = ringIndex * POINTER_SEGMENTS + i\n vertices[3 * vid] = segmentVector.x\n vertices[3 * vid + 1] = segmentVector.y\n vertices[3 * vid + 2] = segmentVector.z\n }\n }\n\n _updatePointerVertices(rearRadius) {\n const vertices = this.pointerGeometry.attributes.position.array\n // first ring for front face\n const frontFaceBase = new THREE.Vector3(POINTER_FRONT_RADIUS, 0, -1 * (POINTER_LENGTH - rearRadius))\n this._drawVerticesRing(vertices, frontFaceBase, 0)\n\n // rings for rear hemisphere\n const rearBase = new THREE.Vector3(\n Math.sin((Math.PI * POINTER_HEMISPHERE_ANGLE) / 180) * rearRadius,\n Math.cos((Math.PI * POINTER_HEMISPHERE_ANGLE) / 180) * rearRadius,\n 0,\n )\n for (var i = 0; i < POINTER_RINGS; i++) {\n this._drawVerticesRing(vertices, rearBase, i + 1)\n rearBase.applyAxisAngle(YAXIS, (Math.PI * POINTER_HEMISPHERE_ANGLE) / 180 / (POINTER_RINGS * -2))\n }\n\n // front and rear face center vertices\n const frontCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS)\n const rearCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS) + 1\n const frontCenter = new THREE.Vector3(0, 0, -1 * (POINTER_LENGTH - rearRadius))\n vertices[frontCenterIndex * 3] = frontCenter.x\n vertices[frontCenterIndex * 3 + 1] = frontCenter.y\n vertices[frontCenterIndex * 3 + 2] = frontCenter.z\n const rearCenter = new THREE.Vector3(0, 0, rearRadius)\n vertices[rearCenterIndex * 3] = rearCenter.x\n vertices[rearCenterIndex * 3 + 1] = rearCenter.y\n vertices[rearCenterIndex * 3 + 2] = rearCenter.z\n\n this.pointerGeometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\n // verticesNeedUpdate = true;\n }\n\n createPointer() {\n var i, j\n const vertices = new Array(((POINTER_RINGS + 1) * POINTER_SEGMENTS + 2) * 3).fill(0)\n // const vertices = [];\n const indices = []\n this.pointerGeometry = new THREE.BufferGeometry()\n\n this.pointerGeometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\n\n this._updatePointerVertices(POINTER_REAR_RADIUS)\n\n // construct faces to connect rings\n for (i = 0; i < POINTER_RINGS; i++) {\n for (j = 0; j < POINTER_SEGMENTS - 1; j++) {\n indices.push(i * POINTER_SEGMENTS + j, i * POINTER_SEGMENTS + j + 1, (i + 1) * POINTER_SEGMENTS + j)\n indices.push(i * POINTER_SEGMENTS + j + 1, (i + 1) * POINTER_SEGMENTS + j + 1, (i + 1) * POINTER_SEGMENTS + j)\n }\n\n indices.push((i + 1) * POINTER_SEGMENTS - 1, i * POINTER_SEGMENTS, (i + 2) * POINTER_SEGMENTS - 1)\n indices.push(i * POINTER_SEGMENTS, (i + 1) * POINTER_SEGMENTS, (i + 2) * POINTER_SEGMENTS - 1)\n }\n\n // construct front and rear face\n const frontCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS)\n const rearCenterIndex = POINTER_SEGMENTS * (1 + POINTER_RINGS) + 1\n\n for (i = 0; i < POINTER_SEGMENTS - 1; i++) {\n indices.push(frontCenterIndex, i + 1, i)\n indices.push(rearCenterIndex, i + POINTER_SEGMENTS * POINTER_RINGS, i + POINTER_SEGMENTS * POINTER_RINGS + 1)\n }\n\n indices.push(frontCenterIndex, 0, POINTER_SEGMENTS - 1)\n indices.push(rearCenterIndex, POINTER_SEGMENTS * (POINTER_RINGS + 1) - 1, POINTER_SEGMENTS * POINTER_RINGS)\n\n const material = new THREE.MeshBasicMaterial()\n material.transparent = true\n material.opacity = POINTER_OPACITY_MIN\n\n this.pointerGeometry.setIndex(indices)\n\n this.pointerMesh = new THREE.Mesh(this.pointerGeometry, material)\n\n this.pointerMesh.position.set(0, 0, -1 * POINTER_REAR_RADIUS)\n this.pointerObject = new THREE.Object3D()\n this.pointerObject.add(this.pointerMesh)\n\n this.raycaster = new THREE.Raycaster()\n\n // create cursor\n const cursorGeometry = new THREE.SphereGeometry(CURSOR_RADIUS, 10, 10)\n const cursorMaterial = new THREE.MeshBasicMaterial()\n cursorMaterial.transparent = true\n cursorMaterial.opacity = POINTER_OPACITY_MIN\n\n this.cursorObject = new THREE.Mesh(cursorGeometry, cursorMaterial)\n this.pointerObject.add(this.cursorObject)\n\n this.add(this.pointerObject)\n }\n\n _updateRaycaster() {\n if (this.raycaster) {\n const pointerMatrix = this.pointerObject.matrixWorld\n const tempMatrix = new THREE.Matrix4()\n tempMatrix.identity().extractRotation(pointerMatrix)\n this.raycaster.ray.origin.setFromMatrixPosition(pointerMatrix)\n this.raycaster.ray.direction.set(0, 0, -1).applyMatrix4(tempMatrix)\n }\n }\n\n _updatePointer() {\n this.pointerObject.visible = this.controller.visible\n const indexTip = this.hand.joints['index-finger-tip']\n const thumbTip = this.hand.joints['thumb-tip']\n const distance = indexTip.position.distanceTo(thumbTip.position)\n const position = indexTip.position.clone().add(thumbTip.position).multiplyScalar(0.5)\n this.pointerObject.position.copy(position)\n this.pointerObject.quaternion.copy(this.controller.quaternion)\n\n this.pinched = distance <= PINCH_THRESHOLD\n\n const pinchScale = (distance - PINCH_MIN) / (PINCH_MAX - PINCH_MIN)\n const focusScale = (distance - PINCH_MIN) / (PINCH_THRESHOLD - PINCH_MIN)\n if (pinchScale > 1) {\n this._updatePointerVertices(POINTER_REAR_RADIUS)\n this.pointerMesh.position.set(0, 0, -1 * POINTER_REAR_RADIUS)\n this.pointerMesh.material.opacity = POINTER_OPACITY_MIN\n } else if (pinchScale > 0) {\n const rearRadius = (POINTER_REAR_RADIUS - POINTER_REAR_RADIUS_MIN) * pinchScale + POINTER_REAR_RADIUS_MIN\n this._updatePointerVertices(rearRadius)\n if (focusScale < 1) {\n this.pointerMesh.position.set(0, 0, -1 * rearRadius - (1 - focusScale) * POINTER_ADVANCE_MAX)\n this.pointerMesh.material.opacity =\n POINTER_OPACITY_MIN + (1 - focusScale) * (POINTER_OPACITY_MAX - POINTER_OPACITY_MIN)\n } else {\n this.pointerMesh.position.set(0, 0, -1 * rearRadius)\n this.pointerMesh.material.opacity = POINTER_OPACITY_MIN\n }\n } else {\n this._updatePointerVertices(POINTER_REAR_RADIUS_MIN)\n this.pointerMesh.position.set(0, 0, -1 * POINTER_REAR_RADIUS_MIN - POINTER_ADVANCE_MAX)\n this.pointerMesh.material.opacity = POINTER_OPACITY_MAX\n }\n\n this.cursorObject.material.opacity = this.pointerMesh.material.opacity\n }\n\n updateMatrixWorld(force) {\n super.updateMatrixWorld(force)\n if (this.pointerGeometry) {\n this._updatePointer()\n this._updateRaycaster()\n }\n }\n\n isPinched() {\n return this.pinched\n }\n\n setAttached(attached) {\n this.attached = attached\n }\n\n isAttached() {\n return this.attached\n }\n\n intersectObject(object, recursive = true) {\n if (this.raycaster) {\n return this.raycaster.intersectObject(object, recursive)\n }\n }\n\n intersectObjects(objects, recursive = true) {\n if (this.raycaster) {\n return this.raycaster.intersectObjects(objects, recursive)\n }\n }\n\n checkIntersections(objects, recursive = false) {\n if (this.raycaster && !this.attached) {\n const intersections = this.raycaster.intersectObjects(objects, recursive)\n const direction = new THREE.Vector3(0, 0, -1)\n if (intersections.length > 0) {\n const intersection = intersections[0]\n const distance = intersection.distance\n this.cursorObject.position.copy(direction.multiplyScalar(distance))\n } else {\n this.cursorObject.position.copy(direction.multiplyScalar(CURSOR_MAX_DISTANCE))\n }\n }\n }\n\n setCursor(distance) {\n const direction = new THREE.Vector3(0, 0, -1)\n if (this.raycaster && !this.attached) {\n this.cursorObject.position.copy(direction.multiplyScalar(distance))\n }\n }\n\n dispose() {\n this._onDisconnected()\n this.hand.removeEventListener('connected', this._onConnected)\n this.hand.removeEventListener('disconnected', this._onDisconnected)\n }\n}\n\nexport { OculusHandPointerModel }\n"],"names":["THREE"],"mappings":"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"}
@@ -12,8 +12,8 @@ const POINTER_LENGTH = 0.035;
12
12
  const POINTER_SEGMENTS = 16;
13
13
  const POINTER_RINGS = 12;
14
14
  const POINTER_HEMISPHERE_ANGLE = 110;
15
- const YAXIS = new THREE.Vector3(0, 1, 0);
16
- const ZAXIS = new THREE.Vector3(0, 0, 1);
15
+ const YAXIS = /* @__PURE__ */ new THREE.Vector3(0, 1, 0);
16
+ const ZAXIS = /* @__PURE__ */ new THREE.Vector3(0, 0, 1);
17
17
  const CURSOR_RADIUS = 0.02;
18
18
  const CURSOR_MAX_DISTANCE = 1.5;
19
19
  class OculusHandPointerModel extends THREE.Object3D {