super-three 0.181.0 → 0.185.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (693) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +21332 -19201
  4. package/build/three.core.js +20908 -19853
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1947 -862
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +37 -16
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +33628 -25197
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +33394 -25000
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +14 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +13 -6
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +127 -86
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +102 -17
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMFrustum.js +31 -6
  26. package/examples/jsm/csm/CSMShadowNode.js +10 -3
  27. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  28. package/examples/jsm/effects/AsciiEffect.js +14 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  30. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  31. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  32. package/examples/jsm/exporters/EXRExporter.js +1 -1
  33. package/examples/jsm/exporters/GLTFExporter.js +266 -21
  34. package/examples/jsm/exporters/PLYExporter.js +286 -73
  35. package/examples/jsm/exporters/USDZExporter.js +353 -99
  36. package/examples/jsm/generators/CityGenerator.js +346 -0
  37. package/examples/jsm/generators/ForestGenerator.js +347 -0
  38. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  39. package/examples/jsm/generators/TreeGenerator.js +377 -0
  40. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  41. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  44. package/examples/jsm/geometries/TextGeometry.js +18 -0
  45. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  46. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  47. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  48. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  49. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  50. package/examples/jsm/helpers/ViewHelper.js +83 -14
  51. package/examples/jsm/inspector/Extension.js +13 -0
  52. package/examples/jsm/inspector/Inspector.js +244 -91
  53. package/examples/jsm/inspector/RendererInspector.js +165 -39
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  55. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  56. package/examples/jsm/inspector/tabs/Console.js +241 -25
  57. package/examples/jsm/inspector/tabs/Memory.js +136 -0
  58. package/examples/jsm/inspector/tabs/Parameters.js +115 -7
  59. package/examples/jsm/inspector/tabs/Performance.js +24 -9
  60. package/examples/jsm/inspector/tabs/Settings.js +306 -0
  61. package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
  62. package/examples/jsm/inspector/tabs/Viewer.js +723 -9
  63. package/examples/jsm/inspector/ui/Graph.js +162 -25
  64. package/examples/jsm/inspector/ui/Item.js +92 -13
  65. package/examples/jsm/inspector/ui/List.js +2 -2
  66. package/examples/jsm/inspector/ui/Profiler.js +1991 -44
  67. package/examples/jsm/inspector/ui/Style.js +1943 -543
  68. package/examples/jsm/inspector/ui/Tab.js +226 -5
  69. package/examples/jsm/inspector/ui/Values.js +126 -8
  70. package/examples/jsm/inspector/ui/utils.js +143 -10
  71. package/examples/jsm/interaction/InteractionManager.js +226 -0
  72. package/examples/jsm/libs/basis/README.md +0 -1
  73. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  74. package/examples/jsm/libs/draco/README.md +0 -1
  75. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  76. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  77. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  78. package/examples/jsm/libs/mikktspace.module.js +34 -9
  79. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  80. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  81. package/examples/jsm/lighting/LightProbeGrid.js +681 -0
  82. package/examples/jsm/lines/LineMaterial.js +45 -16
  83. package/examples/jsm/lines/LineSegments2.js +8 -0
  84. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  85. package/examples/jsm/loaders/3DMLoader.js +6 -5
  86. package/examples/jsm/loaders/3MFLoader.js +2 -2
  87. package/examples/jsm/loaders/AMFLoader.js +2 -2
  88. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  89. package/examples/jsm/loaders/DRACOLoader.js +51 -18
  90. package/examples/jsm/loaders/EXRLoader.js +701 -90
  91. package/examples/jsm/loaders/FBXLoader.js +235 -37
  92. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  93. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  94. package/examples/jsm/loaders/HDRLoader.js +7 -30
  95. package/examples/jsm/loaders/KMZLoader.js +5 -5
  96. package/examples/jsm/loaders/KTX2Loader.js +58 -17
  97. package/examples/jsm/loaders/LDrawLoader.js +49 -58
  98. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  99. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  100. package/examples/jsm/loaders/LWOLoader.js +11 -39
  101. package/examples/jsm/loaders/LottieLoader.js +1 -1
  102. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  103. package/examples/jsm/loaders/NRRDLoader.js +5 -5
  104. package/examples/jsm/loaders/PCDLoader.js +11 -9
  105. package/examples/jsm/loaders/PLYLoader.js +218 -55
  106. package/examples/jsm/loaders/SVGLoader.js +549 -497
  107. package/examples/jsm/loaders/TDSLoader.js +0 -2
  108. package/examples/jsm/loaders/TGALoader.js +0 -2
  109. package/examples/jsm/loaders/TTFLoader.js +1 -1
  110. package/examples/jsm/loaders/USDLoader.js +127 -43
  111. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  112. package/examples/jsm/loaders/VOXLoader.js +660 -117
  113. package/examples/jsm/loaders/VRMLLoader.js +80 -3
  114. package/examples/jsm/loaders/VTKLoader.js +42 -25
  115. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  116. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  117. package/examples/jsm/loaders/usd/USDAParser.js +504 -344
  118. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  119. package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
  120. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  121. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  122. package/examples/jsm/math/Octree.js +131 -1
  123. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  124. package/examples/jsm/misc/RollerCoaster.js +42 -4
  125. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  126. package/examples/jsm/misc/Volume.js +2 -3
  127. package/examples/jsm/misc/VolumeSlice.js +0 -1
  128. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  129. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  130. package/examples/jsm/objects/LensflareMesh.js +1 -1
  131. package/examples/jsm/objects/Reflector.js +72 -25
  132. package/examples/jsm/objects/Sky.js +90 -6
  133. package/examples/jsm/objects/SkyMesh.js +150 -16
  134. package/examples/jsm/objects/Water.js +4 -3
  135. package/examples/jsm/objects/Water2.js +5 -3
  136. package/examples/jsm/objects/Water2Mesh.js +1 -1
  137. package/examples/jsm/objects/WaterMesh.js +5 -7
  138. package/examples/jsm/physics/AmmoPhysics.js +27 -15
  139. package/examples/jsm/physics/JoltPhysics.js +10 -6
  140. package/examples/jsm/physics/RapierPhysics.js +36 -7
  141. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  142. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  143. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  144. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  145. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  146. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  147. package/examples/jsm/renderers/Projector.js +246 -28
  148. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  149. package/examples/jsm/shaders/GTAOShader.js +19 -6
  150. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  151. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  152. package/examples/jsm/shaders/SAOShader.js +17 -4
  153. package/examples/jsm/shaders/SSAOShader.js +11 -1
  154. package/examples/jsm/shaders/SSRShader.js +6 -5
  155. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  156. package/examples/jsm/shaders/VignetteShader.js +1 -1
  157. package/examples/jsm/shaders/VolumeShader.js +31 -44
  158. package/examples/jsm/transpiler/AST.js +44 -0
  159. package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
  160. package/examples/jsm/transpiler/Linker.js +1 -1
  161. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  162. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  163. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  164. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  165. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  166. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  167. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  168. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  169. package/examples/jsm/tsl/display/BloomNode.js +75 -25
  170. package/examples/jsm/tsl/display/CRT.js +150 -0
  171. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  172. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  173. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  174. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  175. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  176. package/examples/jsm/tsl/display/FXAANode.js +13 -14
  177. package/examples/jsm/tsl/display/GTAONode.js +40 -17
  178. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  179. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  180. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  181. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  182. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  183. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  184. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  185. package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
  186. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  187. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  188. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  189. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  190. package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
  191. package/examples/jsm/tsl/display/SSGINode.js +96 -62
  192. package/examples/jsm/tsl/display/SSRNode.js +831 -134
  193. package/examples/jsm/tsl/display/SSSNode.js +8 -6
  194. package/examples/jsm/tsl/display/Shape.js +29 -0
  195. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  196. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  197. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  198. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  199. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  200. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  201. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  202. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  203. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  204. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  205. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  206. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  207. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  208. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  209. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  210. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  211. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  212. package/examples/jsm/tsl/math/Bayer.js +53 -3
  213. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  214. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  215. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  216. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  217. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  218. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  219. package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
  220. package/examples/jsm/utils/ColorUtils.js +76 -0
  221. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  222. package/examples/jsm/utils/LDrawUtils.js +1 -1
  223. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  224. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  225. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  226. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  227. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  228. package/examples/jsm/webxr/ARButton.js +1 -1
  229. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  230. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  231. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  232. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  233. package/package.json +28 -34
  234. package/src/Three.Core.js +3 -1
  235. package/src/Three.TSL.js +35 -14
  236. package/src/Three.WebGPU.Nodes.js +5 -0
  237. package/src/Three.WebGPU.js +13 -0
  238. package/src/Three.js +1 -0
  239. package/src/animation/AnimationAction.js +18 -4
  240. package/src/animation/AnimationClip.js +0 -139
  241. package/src/animation/AnimationMixer.js +6 -0
  242. package/src/animation/AnimationUtils.js +1 -12
  243. package/src/animation/KeyframeTrack.js +47 -8
  244. package/src/animation/PropertyBinding.js +2 -2
  245. package/src/animation/PropertyMixer.js +4 -4
  246. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  247. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  248. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  249. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  250. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  251. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  252. package/src/audio/Audio.js +1 -1
  253. package/src/audio/AudioContext.js +2 -2
  254. package/src/audio/AudioListener.js +5 -3
  255. package/src/cameras/Camera.js +34 -4
  256. package/src/cameras/CubeCamera.js +20 -0
  257. package/src/cameras/StereoCamera.js +5 -2
  258. package/src/constants.js +90 -5
  259. package/src/core/BufferAttribute.js +13 -1
  260. package/src/core/BufferGeometry.js +43 -9
  261. package/src/core/Clock.js +7 -0
  262. package/src/core/Object3D.js +69 -11
  263. package/src/core/Raycaster.js +3 -3
  264. package/src/core/RenderTarget.js +19 -6
  265. package/src/extras/PMREMGenerator.js +13 -22
  266. package/src/extras/TextureUtils.js +6 -2
  267. package/src/extras/core/ShapePath.js +149 -160
  268. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  269. package/src/geometries/ExtrudeGeometry.js +2 -2
  270. package/src/geometries/PolyhedronGeometry.js +1 -1
  271. package/src/geometries/SphereGeometry.js +8 -3
  272. package/src/geometries/TorusGeometry.js +8 -3
  273. package/src/helpers/CameraHelper.js +3 -0
  274. package/src/helpers/DirectionalLightHelper.js +6 -1
  275. package/src/helpers/HemisphereLightHelper.js +5 -0
  276. package/src/helpers/PointLightHelper.js +3 -25
  277. package/src/helpers/SpotLightHelper.js +4 -1
  278. package/src/lights/DirectionalLight.js +13 -0
  279. package/src/lights/HemisphereLight.js +10 -0
  280. package/src/lights/Light.js +1 -11
  281. package/src/lights/LightProbe.js +0 -15
  282. package/src/lights/LightShadow.js +15 -6
  283. package/src/lights/PointLight.js +15 -0
  284. package/src/lights/PointLightShadow.js +0 -86
  285. package/src/lights/SpotLight.js +22 -1
  286. package/src/lights/webgpu/IESSpotLight.js +2 -1
  287. package/src/loaders/AudioLoader.js +11 -1
  288. package/src/loaders/Cache.js +28 -0
  289. package/src/loaders/DataTextureLoader.js +75 -42
  290. package/src/loaders/FileLoader.js +2 -3
  291. package/src/loaders/ImageBitmapLoader.js +12 -9
  292. package/src/loaders/Loader.js +6 -0
  293. package/src/loaders/LoadingManager.js +5 -0
  294. package/src/loaders/MaterialLoader.js +37 -266
  295. package/src/loaders/ObjectLoader.js +48 -6
  296. package/src/loaders/nodes/NodeLoader.js +2 -2
  297. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  298. package/src/materials/LineBasicMaterial.js +4 -0
  299. package/src/materials/Material.js +198 -1
  300. package/src/materials/MeshBasicMaterial.js +24 -0
  301. package/src/materials/MeshDepthMaterial.js +10 -0
  302. package/src/materials/MeshDistanceMaterial.js +10 -0
  303. package/src/materials/MeshLambertMaterial.js +49 -1
  304. package/src/materials/MeshMatcapMaterial.js +25 -1
  305. package/src/materials/MeshNormalMaterial.js +9 -1
  306. package/src/materials/MeshPhongMaterial.js +49 -1
  307. package/src/materials/MeshPhysicalMaterial.js +38 -0
  308. package/src/materials/MeshStandardMaterial.js +42 -1
  309. package/src/materials/MeshToonMaterial.js +35 -2
  310. package/src/materials/PointsMaterial.js +7 -0
  311. package/src/materials/ShaderMaterial.js +106 -1
  312. package/src/materials/SpriteMaterial.js +7 -0
  313. package/src/materials/nodes/Line2NodeMaterial.js +380 -297
  314. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  315. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  316. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  317. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
  318. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  319. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
  320. package/src/materials/nodes/NodeMaterial.js +153 -89
  321. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  322. package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
  323. package/src/math/Box3.js +5 -0
  324. package/src/math/FrustumArray.js +103 -133
  325. package/src/math/Interpolant.js +1 -1
  326. package/src/math/Line3.js +6 -5
  327. package/src/math/MathUtils.js +12 -12
  328. package/src/math/Matrix2.js +13 -9
  329. package/src/math/Matrix3.js +24 -9
  330. package/src/math/Matrix4.js +112 -74
  331. package/src/math/Plane.js +4 -3
  332. package/src/math/Quaternion.js +3 -29
  333. package/src/math/Sphere.js +1 -1
  334. package/src/math/Triangle.js +1 -1
  335. package/src/math/Vector2.js +13 -9
  336. package/src/math/Vector3.js +17 -15
  337. package/src/math/Vector4.js +15 -11
  338. package/src/math/interpolants/BezierInterpolant.js +106 -0
  339. package/src/nodes/Nodes.js +86 -71
  340. package/src/nodes/TSL.js +15 -13
  341. package/src/nodes/accessors/Arrays.js +5 -5
  342. package/src/nodes/accessors/Batch.js +108 -0
  343. package/src/nodes/accessors/Bitangent.js +7 -7
  344. package/src/nodes/accessors/BufferAttributeNode.js +120 -17
  345. package/src/nodes/accessors/BufferNode.js +29 -2
  346. package/src/nodes/accessors/Camera.js +149 -28
  347. package/src/nodes/accessors/ClippingNode.js +5 -5
  348. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  349. package/src/nodes/accessors/Instance.js +264 -0
  350. package/src/nodes/accessors/MaterialNode.js +27 -3
  351. package/src/nodes/accessors/MaterialProperties.js +6 -8
  352. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  353. package/src/nodes/accessors/ModelNode.js +1 -1
  354. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  355. package/src/nodes/accessors/Normal.js +24 -24
  356. package/src/nodes/accessors/Object3DNode.js +1 -1
  357. package/src/nodes/accessors/Position.js +39 -3
  358. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  359. package/src/nodes/accessors/ReferenceNode.js +9 -8
  360. package/src/nodes/accessors/ReflectVector.js +3 -3
  361. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  362. package/src/nodes/accessors/SceneProperties.js +47 -0
  363. package/src/nodes/accessors/Skinning.js +263 -0
  364. package/src/nodes/accessors/StorageBufferNode.js +16 -27
  365. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  366. package/src/nodes/accessors/StorageTextureNode.js +74 -11
  367. package/src/nodes/accessors/Tangent.js +8 -18
  368. package/src/nodes/accessors/Texture3DNode.js +32 -35
  369. package/src/nodes/accessors/TextureNode.js +124 -25
  370. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  371. package/src/nodes/accessors/UserDataNode.js +1 -2
  372. package/src/nodes/accessors/VertexColorNode.js +1 -2
  373. package/src/nodes/code/FunctionCallNode.js +1 -1
  374. package/src/nodes/code/FunctionNode.js +4 -19
  375. package/src/nodes/core/ArrayNode.js +21 -2
  376. package/src/nodes/core/AssignNode.js +3 -3
  377. package/src/nodes/core/AttributeNode.js +3 -3
  378. package/src/nodes/core/BypassNode.js +1 -1
  379. package/src/nodes/core/ContextNode.js +104 -5
  380. package/src/nodes/core/IndexNode.js +2 -1
  381. package/src/nodes/core/InputNode.js +1 -1
  382. package/src/nodes/core/InspectorNode.js +1 -1
  383. package/src/nodes/core/IsolateNode.js +1 -1
  384. package/src/nodes/core/MRTNode.js +55 -4
  385. package/src/nodes/core/Node.js +151 -17
  386. package/src/nodes/core/NodeBuilder.js +479 -101
  387. package/src/nodes/core/NodeError.js +28 -0
  388. package/src/nodes/core/NodeFrame.js +12 -4
  389. package/src/nodes/core/NodeUtils.js +20 -18
  390. package/src/nodes/core/OutputStructNode.js +13 -11
  391. package/src/nodes/core/OverrideContextNode.js +153 -0
  392. package/src/nodes/core/ParameterNode.js +4 -4
  393. package/src/nodes/core/PropertyNode.js +66 -4
  394. package/src/nodes/core/StackNode.js +91 -20
  395. package/src/nodes/core/StackTrace.js +139 -0
  396. package/src/nodes/core/StructNode.js +20 -8
  397. package/src/nodes/core/StructTypeNode.js +17 -23
  398. package/src/nodes/core/SubBuildNode.js +2 -2
  399. package/src/nodes/core/UniformGroupNode.js +36 -6
  400. package/src/nodes/core/UniformNode.js +21 -5
  401. package/src/nodes/core/VarNode.js +56 -23
  402. package/src/nodes/core/VaryingNode.js +14 -21
  403. package/src/nodes/display/BlendModes.js +1 -105
  404. package/src/nodes/display/BumpMapNode.js +6 -1
  405. package/src/nodes/display/ColorAdjustment.js +27 -9
  406. package/src/nodes/display/ColorSpaceNode.js +3 -3
  407. package/src/nodes/display/FrontFacingNode.js +38 -9
  408. package/src/nodes/display/NormalMapNode.js +41 -6
  409. package/src/nodes/display/PassNode.js +157 -56
  410. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  411. package/src/nodes/display/RenderOutputNode.js +19 -10
  412. package/src/nodes/display/ScreenNode.js +4 -2
  413. package/src/nodes/display/ToneMappingNode.js +1 -1
  414. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  415. package/src/nodes/display/ViewportDepthNode.js +52 -4
  416. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  417. package/src/nodes/display/ViewportTextureNode.js +39 -11
  418. package/src/nodes/fog/Fog.js +18 -35
  419. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  420. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  421. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  422. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  423. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  424. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  425. package/src/nodes/geometry/RangeNode.js +5 -3
  426. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  427. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  428. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  429. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  430. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  431. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
  432. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  433. package/src/nodes/lighting/EnvironmentNode.js +30 -5
  434. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  435. package/src/nodes/lighting/LightingContextNode.js +10 -2
  436. package/src/nodes/lighting/LightsNode.js +97 -65
  437. package/src/nodes/lighting/PointShadowNode.js +166 -148
  438. package/src/nodes/lighting/ShadowFilterNode.js +74 -117
  439. package/src/nodes/lighting/ShadowNode.js +149 -51
  440. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  441. package/src/nodes/math/BitcastNode.js +1 -1
  442. package/src/nodes/math/BitcountNode.js +433 -0
  443. package/src/nodes/math/ConditionalNode.js +6 -6
  444. package/src/nodes/math/MathNode.js +115 -52
  445. package/src/nodes/math/OperatorNode.js +24 -23
  446. package/src/nodes/math/PackFloatNode.js +98 -0
  447. package/src/nodes/math/UnpackFloatNode.js +96 -0
  448. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  449. package/src/nodes/pmrem/PMREMNode.js +34 -3
  450. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  451. package/src/nodes/tsl/TSLBase.js +1 -1
  452. package/src/nodes/tsl/TSLCore.js +99 -33
  453. package/src/nodes/utils/ArrayElementNode.js +14 -1
  454. package/src/nodes/utils/ConvertNode.js +1 -1
  455. package/src/nodes/utils/DebugNode.js +12 -12
  456. package/src/nodes/utils/EquirectUV.js +30 -5
  457. package/src/nodes/utils/EventNode.js +31 -2
  458. package/src/nodes/utils/FlipNode.js +1 -1
  459. package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
  460. package/src/nodes/utils/JoinNode.js +3 -3
  461. package/src/nodes/utils/LoopNode.js +1 -1
  462. package/src/nodes/utils/MemberNode.js +2 -2
  463. package/src/nodes/utils/Packing.js +48 -5
  464. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  465. package/src/nodes/utils/RTTNode.js +41 -25
  466. package/src/nodes/utils/ReflectorNode.js +4 -4
  467. package/src/nodes/utils/Remap.js +48 -0
  468. package/src/nodes/utils/RotateNode.js +1 -1
  469. package/src/nodes/utils/SampleNode.js +1 -1
  470. package/src/nodes/utils/SetNode.js +1 -1
  471. package/src/nodes/utils/SplitNode.js +1 -1
  472. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  473. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  474. package/src/nodes/utils/UVUtils.js +28 -0
  475. package/src/objects/BatchedMesh.js +66 -30
  476. package/src/objects/InstancedMesh.js +19 -3
  477. package/src/objects/Line.js +1 -1
  478. package/src/objects/Mesh.js +1 -1
  479. package/src/objects/Points.js +1 -1
  480. package/src/objects/SkinnedMesh.js +26 -9
  481. package/src/renderers/WebGLRenderer.js +344 -156
  482. package/src/renderers/common/Animation.js +3 -3
  483. package/src/renderers/common/Attributes.js +15 -1
  484. package/src/renderers/common/Backend.js +78 -13
  485. package/src/renderers/common/Background.js +26 -13
  486. package/src/renderers/common/BindGroup.js +1 -16
  487. package/src/renderers/common/Binding.js +11 -0
  488. package/src/renderers/common/Bindings.js +141 -57
  489. package/src/renderers/common/BlendMode.js +143 -0
  490. package/src/renderers/common/Buffer.js +49 -0
  491. package/src/renderers/common/BundleGroup.js +1 -1
  492. package/src/renderers/common/ChainMap.js +30 -6
  493. package/src/renderers/common/ClippingContext.js +10 -2
  494. package/src/renderers/common/ComputePipeline.js +1 -1
  495. package/src/renderers/common/CubeRenderTarget.js +51 -7
  496. package/src/renderers/common/Geometries.js +29 -3
  497. package/src/renderers/common/Info.js +374 -4
  498. package/src/renderers/common/InspectorBase.js +6 -1
  499. package/src/renderers/common/Lighting.js +51 -19
  500. package/src/renderers/common/Pipelines.js +40 -7
  501. package/src/renderers/common/PostProcessing.js +8 -206
  502. package/src/renderers/common/ReadbackBuffer.js +78 -0
  503. package/src/renderers/common/RenderBundle.js +3 -1
  504. package/src/renderers/common/RenderBundles.js +7 -3
  505. package/src/renderers/common/RenderContext.js +16 -0
  506. package/src/renderers/common/RenderContexts.js +33 -49
  507. package/src/renderers/common/RenderList.js +41 -4
  508. package/src/renderers/common/RenderLists.js +2 -1
  509. package/src/renderers/common/RenderObject.js +88 -16
  510. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  511. package/src/renderers/common/RenderObjects.js +21 -5
  512. package/src/renderers/common/RenderPipeline.js +232 -17
  513. package/src/renderers/common/Renderer.js +700 -163
  514. package/src/renderers/common/Sampler.js +16 -48
  515. package/src/renderers/common/StorageBuffer.js +13 -1
  516. package/src/renderers/common/Textures.js +121 -9
  517. package/src/renderers/common/TimestampQueryPool.js +6 -4
  518. package/src/renderers/common/Uniform.js +8 -0
  519. package/src/renderers/common/UniformsGroup.js +84 -1
  520. package/src/renderers/common/XRManager.js +377 -51
  521. package/src/renderers/common/extras/PMREMGenerator.js +40 -61
  522. package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
  523. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  524. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
  525. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  526. package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
  527. package/src/renderers/shaders/DFGLUTData.js +19 -34
  528. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  529. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  530. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  531. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  532. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  533. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  534. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  535. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  536. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
  537. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  538. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  540. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  541. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  542. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  543. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
  544. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  546. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  547. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  548. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  549. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  550. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  551. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  552. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  553. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  554. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
  555. package/src/renderers/shaders/ShaderChunk.js +5 -3
  556. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  557. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  558. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
  559. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  560. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  561. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  562. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  563. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  564. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  565. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  566. package/src/renderers/shaders/ShaderLib.js +7 -6
  567. package/src/renderers/shaders/UniformsLib.js +7 -5
  568. package/src/renderers/shaders/UniformsUtils.js +27 -5
  569. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  570. package/src/renderers/webgl/WebGLBackground.js +15 -15
  571. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  572. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  573. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  574. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  575. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  576. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  577. package/src/renderers/webgl/WebGLLights.js +18 -1
  578. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  579. package/src/renderers/webgl/WebGLObjects.js +3 -1
  580. package/src/renderers/webgl/WebGLOutput.js +271 -0
  581. package/src/renderers/webgl/WebGLProgram.js +54 -113
  582. package/src/renderers/webgl/WebGLPrograms.js +74 -55
  583. package/src/renderers/webgl/WebGLRenderLists.js +24 -1
  584. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  585. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  586. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  587. package/src/renderers/webgl/WebGLState.js +75 -37
  588. package/src/renderers/webgl/WebGLTextures.js +230 -56
  589. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  590. package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
  591. package/src/renderers/webgl/WebGLUtils.js +6 -2
  592. package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
  593. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  594. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
  595. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  596. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  597. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  598. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
  599. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  600. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
  601. package/src/renderers/webgpu/WebGPUBackend.js +733 -302
  602. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  603. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  604. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  605. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  606. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  607. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  608. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  609. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  610. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  611. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  612. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  613. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  614. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  615. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  616. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  617. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  618. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  619. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  620. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  621. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  622. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  623. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  624. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  625. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  626. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  627. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
  628. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  629. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
  630. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
  631. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  632. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  633. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
  634. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
  635. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
  636. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
  637. package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
  638. package/src/renderers/webxr/WebXRController.js +12 -0
  639. package/src/renderers/webxr/WebXRManager.js +4 -2
  640. package/src/textures/CubeDepthTexture.js +76 -0
  641. package/src/textures/DepthTexture.js +1 -1
  642. package/src/textures/ExternalTexture.js +0 -3
  643. package/src/textures/HTMLTexture.js +74 -0
  644. package/src/textures/Source.js +2 -2
  645. package/src/textures/Texture.js +16 -5
  646. package/src/utils.js +280 -3
  647. package/examples/fonts/LICENSE +0 -13
  648. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  649. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  650. package/examples/fonts/README.md +0 -11
  651. package/examples/fonts/droid/NOTICE +0 -190
  652. package/examples/fonts/droid/README.txt +0 -18
  653. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  654. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  655. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  656. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  657. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  658. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  659. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  660. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  661. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  662. package/examples/fonts/optimer_bold.typeface.json +0 -1
  663. package/examples/fonts/optimer_regular.typeface.json +0 -1
  664. package/examples/fonts/ttf/README.md +0 -9
  665. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  666. package/examples/jsm/libs/ammo.wasm.js +0 -822
  667. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  668. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  669. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  670. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  671. package/examples/jsm/libs/opentype.module.js +0 -14506
  672. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  673. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  674. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  675. package/examples/jsm/lighting/TiledLighting.js +0 -42
  676. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  677. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  678. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  679. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
  680. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  681. package/src/nodes/accessors/BatchNode.js +0 -163
  682. package/src/nodes/accessors/InstanceNode.js +0 -244
  683. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  684. package/src/nodes/accessors/SceneNode.js +0 -145
  685. package/src/nodes/accessors/SkinningNode.js +0 -327
  686. package/src/nodes/code/ScriptableNode.js +0 -726
  687. package/src/nodes/code/ScriptableValueNode.js +0 -253
  688. package/src/nodes/display/PosterizeNode.js +0 -65
  689. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  690. package/src/nodes/utils/RemapNode.js +0 -125
  691. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  692. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  693. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -0,0 +1,325 @@
1
+ import { Fn, If, PI, clamp, cos, cross, dot, equirectUV, float, log, max, mix, normalize, pow, reflect, sin, sqrt, struct, vec3 } from 'three/tsl';
2
+
3
+ /**
4
+ * Specular / microfacet BRDF helpers: VNDF sampling, GTR distribution, Smith geometry,
5
+ * Fresnel, reflection importance sampling, parallax-corrected ray-length terms, and
6
+ * equirectangular environment sampling / MIS helpers.
7
+ * Pure TSL functions of their inputs (no scene/camera state).
8
+ */
9
+
10
+ /**
11
+ * Sentinel ray length the SSR pass writes for environment misses (no screen-space hit), set far above
12
+ * any real hit distance so a single magnitude test separates misses from hits and survives `.max( 0 )`.
13
+ *
14
+ * @type {number}
15
+ */
16
+ export const ENV_RAY_LENGTH = 1e4;
17
+
18
+ /**
19
+ * Classification threshold for {@link ENV_RAY_LENGTH}: above this is an env miss, below a real hit.
20
+ * An order of magnitude under the sentinel, robust to fp16 storage and bilinear blending at borders.
21
+ *
22
+ * @type {number}
23
+ */
24
+ export const ENV_RAY_LENGTH_THRESHOLD = 1e3;
25
+
26
+ // Bounded-VNDF sampler (Eto & Tokuyoshi 2023; spherical-cap form, Dupuy & Benyoub 2023)
27
+ const SampleGGXVNDF = Fn( ( [ V, ax, ay, r1, r2 ] ) => {
28
+
29
+ // Warp the view direction to the hemisphere ("standard") configuration.
30
+ const wiStd = normalize( vec3( ax.mul( V.x ), ay.mul( V.y ), V.z ) ).toVar();
31
+
32
+ // Isotropic bound on the spherical cap (Eto & Tokuyoshi eq. 5). alpha ∈ [0,1] here,
33
+ // so the sign term in `s` is always +1 and is dropped.
34
+ const a = ax.min( ay ).toVar();
35
+ const s = float( 1.0 ).add( V.xy.length() ).toVar();
36
+ const a2 = a.mul( a ).toVar();
37
+ const s2 = s.mul( s ).toVar();
38
+ const k = a2.oneMinus().mul( s2 ).div( s2.add( a2.mul( V.z ).mul( V.z ) ) ).toVar();
39
+
40
+ // Tighten the cap with the bound (upper hemisphere; N·V ≥ 0 in our usage).
41
+ const b = wiStd.z.mul( k ).toVar();
42
+
43
+ // Sample the (bounded) spherical cap.
44
+ const phi = float( 6.283185307179586 ).mul( r1 ).toVar(); // 2*pi
45
+ const z = r2.oneMinus().mul( float( 1.0 ).add( b ) ).sub( b ).toVar();
46
+ const sinTheta = sqrt( max( float( 0.0 ), float( 1.0 ).sub( z.mul( z ) ) ) ).toVar();
47
+ const c = vec3( sinTheta.mul( cos( phi ) ), sinTheta.mul( sin( phi ) ), z ).toVar();
48
+
49
+ // Microfacet normal in the standard config, then warp back to the ellipsoid (unstretch).
50
+ const wmStd = c.add( wiStd ).toVar();
51
+ const Ne = normalize( vec3(
52
+ ax.mul( wmStd.x ),
53
+ ay.mul( wmStd.y ),
54
+ max( float( 0.0 ), wmStd.z )
55
+ ) ).toVar();
56
+
57
+ return Ne;
58
+
59
+ }, {
60
+ name: 'SampleGGXVNDF',
61
+ type: 'vec3',
62
+ inputs: [
63
+ { name: 'V', type: 'vec3' },
64
+ { name: 'ax', type: 'float' },
65
+ { name: 'ay', type: 'float' },
66
+ { name: 'r1', type: 'float' },
67
+ { name: 'r2', type: 'float' },
68
+ ]
69
+ } );
70
+
71
+ // Generalized Trowbridge-Reitz (GTR). For GGX set k=2.
72
+ // D_GTR(roughness, NoH, k) where roughness = α (not α²).
73
+ export const D_GTR = Fn( ( [ roughness, NoH, k ] ) => {
74
+
75
+ // see: Filament - Normal distribution function (specular D) - 4.4.1
76
+ const a2 = roughness.mul( roughness ).toVar(); // α²
77
+ const NoH2 = NoH.mul( NoH ).toVar();
78
+ const base = NoH2.mul( a2.sub( float( 1.0 ) ) ).add( float( 1.0 ) ).toVar();
79
+ // a² / (π * base^k)
80
+ return a2.div( PI.mul( pow( base, k ) ) ).toVar(); // float
81
+
82
+ } );
83
+
84
+ // Smith G1 (Heitz): expects alpha (not squared); it squares internally
85
+ export const SmithG = Fn( ( [ NDotX, alpha ] ) => {
86
+
87
+ // see: Filament - Geometric shadowing (specular G) - 4.4.2
88
+
89
+ const a2 = alpha.mul( alpha ).toVar(); // α²
90
+ const NDotX2 = NDotX.mul( NDotX ).toVar(); // (N·X)²
91
+ return float( 2.0 ).mul( NDotX ).div(
92
+ NDotX.add( sqrt(
93
+ a2.add( a2.oneMinus().mul( NDotX2 ) )
94
+ ) )
95
+ );
96
+
97
+ } );
98
+
99
+ // Geometry term G = G1(N·L, α_G) * G1(N·V, α_G) (α_G is NOT squared here)
100
+ export const GeometryTerm = Fn( ( [ NoL, NoV, alphaG ] ) => {
101
+
102
+ const G1v = SmithG( NoV, alphaG ).toVar();
103
+ const G1l = SmithG( NoL, alphaG ).toVar();
104
+ return G1v.mul( G1l ).toVar();
105
+
106
+ } );
107
+
108
+ // Bounded VNDF direction PDF (reflection mapping), matching SampleGGXVNDF above.
109
+ // p(L) = D_GTR(roughness, NoH, 2) / ( 2 * (k * N·V + t) ) (Eto & Tokuyoshi eq. 8)
110
+ // with the isotropic cap bound k and t = ‖(α·V.xy, V.z)‖. Here 'roughness' is α, not α².
111
+ const GGXVNDFPdf = Fn( ( [ NoH, NoV, roughness ] ) => {
112
+
113
+ const D = D_GTR( roughness, NoH, float( 2.0 ) ).toVar();
114
+ const a2 = roughness.mul( roughness ).toVar();
115
+ const sinV2 = max( float( 0.0 ), float( 1.0 ).sub( NoV.mul( NoV ) ) ).toVar(); // ‖V.xy‖²
116
+ const s = float( 1.0 ).add( sqrt( sinV2 ) ).toVar();
117
+ const s2 = s.mul( s ).toVar();
118
+ const k = float( 1.0 ).sub( a2 ).mul( s2 ).div( s2.add( a2.mul( NoV ).mul( NoV ) ) ).toVar();
119
+ const t = sqrt( a2.mul( sinV2 ).add( NoV.mul( NoV ) ) ).toVar();
120
+ return D.div( max( float( 1e-6 ), float( 2.0 ).mul( k.mul( NoV ).add( t ) ) ) ).toVar();
121
+
122
+ } );
123
+
124
+ /**
125
+ * Fresnel reflectance for the Schlick approximation.
126
+ */
127
+ export const F_Schlick = Fn( ( [ f0, theta ] ) => {
128
+
129
+ const oneMinus = float( 1.0 ).sub( theta ).toVar();
130
+ const oneMinus2 = oneMinus.mul( oneMinus ).toVar();
131
+ const oneMinus5 = oneMinus2.mul( oneMinus2 ).mul( oneMinus ).toVar();
132
+ return f0.add( vec3( 1.0 ).sub( f0 ).mul( oneMinus5 ) ).toVar(); // vec3
133
+
134
+ } );
135
+
136
+ /**
137
+ * Specular dominant factor for parallax-corrected ray length.
138
+ * From REBLUR: A Hierarchical Recurrent Denoiser (NRD).
139
+ */
140
+ export const getSpecularDominantFactor = Fn( ( [ NoV, roughness ] ) => {
141
+
142
+ const a = float( 0.298475 ).mul(
143
+ log( float( 39.4115 ).sub( float( 39.0029 ).mul( roughness ) ) )
144
+ );
145
+ const f = float( 1.0 ).sub( NoV ).pow( 10.8649 )
146
+ .mul( float( 1.0 ).sub( a ) )
147
+ .add( a );
148
+ return clamp( f );
149
+
150
+ } ).setLayout( {
151
+ name: 'getSpecularDominantFactor',
152
+ type: 'float',
153
+ inputs: [
154
+ { name: 'NoV', type: 'float' },
155
+ { name: 'roughness', type: 'float' }
156
+ ]
157
+ } );
158
+
159
+ /**
160
+ * Everything a single GGX reflection sample produces. `reflectDir` and `sampleWeight`
161
+ * drive the SSR ray-march and compositing; `pdf`, `NdotV`, `alpha` and `f0` are the GGX
162
+ * terms the env-miss MIS fallback needs so the caller never re-derives microfacet math.
163
+ */
164
+ const ggxReflectionStruct = struct( {
165
+ reflectDir: 'vec3', // view-space reflected ray direction
166
+ sampleWeight: 'vec3', // chromatic weight (incl. Fresnel tint) to multiply gathered radiance by
167
+ pdf: 'float', // VNDF direction pdf (for MIS against the env CDF)
168
+ NdotV: 'float',
169
+ alpha: 'float', // GGX alpha (roughness²), clamped
170
+ f0: 'vec3' // Fresnel reflectance at normal incidence
171
+ } );
172
+
173
+ /**
174
+ * Importance-samples the GGX/VNDF specular lobe for one pixel and returns the reflected
175
+ * ray direction plus the Monte-Carlo weight to apply to the gathered radiance, along with
176
+ * the GGX terms the SSR env-miss MIS fallback needs.
177
+ *
178
+ * @param {Node<vec3>} N - View-space shading normal (normalized).
179
+ * @param {Node<vec3>} V - View-space surface→camera direction (normalized).
180
+ * @param {Node<float>} roughness - Perceptual roughness in `[0,1]`.
181
+ * @param {Node<float>} metalness - Metalness in `[0,1]`.
182
+ * @param {Node<vec3>} albedo - Surface base color; tints the metal Fresnel reflectance (`f0`).
183
+ * @param {Node<vec4>} Xi - Per-pixel random numbers; only `.xy` are used.
184
+ * @return {ggxReflectionStruct}
185
+ */
186
+ export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, Xi ] ) => {
187
+
188
+ // GGX alpha (use r^2, clamp to avoid degenerate)
189
+ const a = roughness.mul( roughness ).max( 0.001 ).toVar();
190
+ const ax = a.toVar();
191
+ const ay = a.toVar();
192
+
193
+ // TBN from view-space normal
194
+ const up = vec3( 0, 0, 1 );
195
+ let T = cross( up, N ).toVar();
196
+ T = T.normalize().toVar();
197
+ If( T.length().lessThan( 1e-3 ), () => {
198
+
199
+ T.assign( cross( vec3( 0, 1, 0 ), N ).normalize() );
200
+
201
+ } );
202
+ const B = cross( N, T ).normalize().toVar();
203
+
204
+ // transform V to LOCAL frame (N = +Z)
205
+ const Vlocal = vec3( dot( T, V ), dot( B, V ), dot( N, V ) ).toVar();
206
+
207
+ // VNDF sample **in local frame**
208
+ const Hlocal = SampleGGXVNDF( Vlocal, ax, ay, Xi.x, Xi.y ).toVar();
209
+ If( Hlocal.z.lessThan( 0 ), () => {
210
+
211
+ Hlocal.assign( Hlocal.negate() );
212
+
213
+ } );
214
+
215
+ // transform H back to VIEW space
216
+ const h = normalize( T.mul( Hlocal.x ).add( B.mul( Hlocal.y ) ).add( N.mul( Hlocal.z ) ) ).toVar();
217
+
218
+ // reflect with V (surface->camera) and H
219
+ const viewReflectDir = reflect( V.negate(), h ).normalize().toVar();
220
+
221
+ // BRDF/PDF evaluation for the sampled direction
222
+ // V: surface -> camera, L: reflected direction, N: normal, H: half-vector
223
+ const L = viewReflectDir.toVar();
224
+ const H = normalize( V.add( L ) ).toVar(); // ~h; recomputed for robustness
225
+
226
+ const NdotV = max( float( 0.0 ), dot( N, V ) ).toVar();
227
+ const NdotL = max( float( 0.0 ), dot( N, L ) ).toVar();
228
+ const NdotH = max( float( 0.0 ), dot( N, H ) ).toVar();
229
+ const VdotH = max( float( 0.0 ), dot( V, H ) ).toVar();
230
+
231
+ const f0 = mix( vec3( 0.04 ), albedo, metalness ).toVar();
232
+ // Chromatic Fresnel reflectance: for metals f0 = albedo, so the reflection is tinted and desaturates
233
+ // toward white at grazing angles. Kept as vec3 so colored metals reflect with the correct chroma.
234
+ const fresnelWeight = F_Schlick( f0, VdotH ).toVar(); // vec3
235
+
236
+ // Bounded-VNDF direction pdf — still needed for the env-miss MIS path.
237
+ const pdf = GGXVNDFPdf( NdotH, NdotV, ax ).toVar();
238
+
239
+ // Numerically stable importance weight: brdf·NdotL/pdf ≡ fresnel·G2·(k·NdotV + t)/(2·NdotV), which
240
+ // cancels the GGX D analytically. Evaluating D explicitly is catastrophic at low roughness
241
+ // (D → 3e5 at α = 0.001 wrecks f32 precision); the cancelled form stays stable down to a mirror.
242
+ // (k·NdotV + t) is the bounded-cap normalization; k shrinks the cap to drop below-horizon samples.
243
+ const a2 = ax.mul( ax ).toVar();
244
+ const sinV2 = NdotV.mul( NdotV ).oneMinus().max( 0.0 ).toVar(); // ‖V.xy‖²
245
+ const sB = float( 1.0 ).add( sqrt( sinV2 ) ).toVar();
246
+ const s2B = sB.mul( sB ).toVar();
247
+ const kB = a2.oneMinus().mul( s2B ).div( s2B.add( a2.mul( NdotV ).mul( NdotV ) ) ).toVar();
248
+ const tB = sqrt( a2.mul( sinV2 ).add( NdotV.mul( NdotV ) ) ).toVar();
249
+ const glossyWeight = fresnelWeight
250
+ .mul( GeometryTerm( NdotL, NdotV, ax ) )
251
+ .mul( kB.mul( NdotV ).add( tB ) )
252
+ .div( float( 2.0 ).mul( NdotV ).max( 1e-4 ) ).toVar();
253
+
254
+ return ggxReflectionStruct( viewReflectDir, glossyWeight, pdf, NdotV, ax, f0 );
255
+
256
+ } );
257
+
258
+ // Equirectangular environment sampling
259
+
260
+ /**
261
+ * Equirectangular direction / UV / PDF helpers and MIS weighting shared by environment sampling code.
262
+ * Env-miss MIS integration lives in {@link ImportanceSampledEnvironment}.
263
+ *
264
+ * Equirectangular parameterization helpers used with CDF importance sampling are adapted from
265
+ * [three-gpu-pathtracer](https://github.com/gkjohnson/three-gpu-pathtracer).
266
+ *
267
+ * @see {@link https://github.com/gkjohnson/three-gpu-pathtracer}
268
+ */
269
+
270
+ // uv -> direction (equirectangular)
271
+ export const equirectUvToDir = Fn( ( [ uvIn ] ) => {
272
+
273
+ const phi = uvIn.x.mul( Math.PI * 2 ).sub( Math.PI );
274
+ const lat = uvIn.y.sub( 0.5 ).mul( Math.PI );
275
+ const cosLat = cos( lat );
276
+ return normalize( vec3(
277
+ cosLat.mul( cos( phi ) ),
278
+ sin( lat ),
279
+ cosLat.mul( sin( phi ) )
280
+ ) );
281
+
282
+ } ).setLayout( {
283
+ name: 'equirectUvToDir',
284
+ type: 'vec3',
285
+ inputs: [ { name: 'uv', type: 'vec2' } ]
286
+ } );
287
+
288
+ // Solid-angle PDF of a direction under equirectangular parameterization.
289
+ export const equirectDirPdf = Fn( ( [ direction ] ) => {
290
+
291
+ const uvDir = equirectUV( direction );
292
+ const sinTheta = sin( uvDir.y.mul( Math.PI ) );
293
+ return sinTheta.abs().lessThan( float( 1e-6 ) ).select(
294
+ float( 0 ),
295
+ float( 1 ).div( float( 2 * Math.PI * Math.PI ).mul( sinTheta ) )
296
+ );
297
+
298
+ } ).setLayout( {
299
+ name: 'equirectDirPdf',
300
+ type: 'float',
301
+ inputs: [ { name: 'direction', type: 'vec3' } ]
302
+ } );
303
+
304
+ /**
305
+ * MIS power heuristic with β = 2: `pdfA² / (pdfA² + pdfB²)`.
306
+ * Weights the contribution of the strategy that produced `pdfA` against the other strategy.
307
+ *
308
+ * @see Eric Veach, *Optimally Combining Sampling Techniques for Monte Carlo Rendering*
309
+ * @tsl
310
+ */
311
+ export const misPowerHeuristic = Fn( ( [ pdfA, pdfB ] ) => {
312
+
313
+ const pdfASq = pdfA.mul( pdfA );
314
+ const pdfBSq = pdfB.mul( pdfB );
315
+ return pdfASq.div( pdfASq.add( pdfBSq ) );
316
+
317
+ } ).setLayout( {
318
+ name: 'misPowerHeuristic',
319
+ type: 'float',
320
+ inputs: [
321
+ { name: 'pdfA', type: 'float' },
322
+ { name: 'pdfB', type: 'float' }
323
+ ]
324
+ } );
325
+
@@ -39,13 +39,13 @@ function computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {
39
39
 
40
40
  if ( ! MikkTSpace || ! MikkTSpace.isReady ) {
41
41
 
42
- throw new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );
42
+ throw new Error( 'THREE.BufferGeometryUtils: Initialized MikkTSpace library required.' );
43
43
 
44
44
  }
45
45
 
46
46
  if ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {
47
47
 
48
- throw new Error( 'BufferGeometryUtils: Tangents require "position", "normal", and "uv" attributes.' );
48
+ throw new Error( 'THREE.BufferGeometryUtils: Tangents require "position", "normal", and "uv" attributes.' );
49
49
 
50
50
  }
51
51
 
@@ -286,8 +286,7 @@ function mergeGeometries( geometries, useGroups = false ) {
286
286
  for ( const name in morphAttributes ) {
287
287
 
288
288
  const numMorphTargets = morphAttributes[ name ][ 0 ].length;
289
-
290
- if ( numMorphTargets === 0 ) break;
289
+ if ( numMorphTargets === 0 ) continue;
291
290
 
292
291
  mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};
293
292
  mergedGeometry.morphAttributes[ name ] = [];
@@ -1021,7 +1020,7 @@ function computeMorphedAttributes( object ) {
1021
1020
  const morphPosition = geometry.morphAttributes.position;
1022
1021
  const morphTargetsRelative = geometry.morphTargetsRelative;
1023
1022
  const normalAttribute = geometry.attributes.normal;
1024
- const morphNormal = geometry.morphAttributes.position;
1023
+ const morphNormal = geometry.morphAttributes.normal;
1025
1024
 
1026
1025
  const groups = geometry.groups;
1027
1026
  const drawRange = geometry.drawRange;
@@ -1315,105 +1314,172 @@ function mergeGroups( geometry ) {
1315
1314
  */
1316
1315
  function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {
1317
1316
 
1317
+ // BufferGeometry.toNonIndexed() warns if the geometry is non-indexed
1318
+ // and returns the original geometry
1319
+ const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;
1320
+ const posAttr = resultGeometry.attributes.position;
1321
+ const vertexCount = posAttr.count;
1322
+
1323
+ let positions;
1324
+
1325
+ if ( posAttr.isBufferAttribute === true && posAttr.itemSize === 3 && posAttr.normalized === false ) {
1326
+
1327
+ positions = posAttr.array;
1328
+
1329
+ } else {
1330
+
1331
+ // flatten the position buffer so the math below operates on plain numbers
1332
+ positions = new Float64Array( vertexCount * 3 );
1333
+
1334
+ for ( let i = 0; i < vertexCount; i ++ ) {
1335
+
1336
+ positions[ 3 * i + 0 ] = posAttr.getX( i );
1337
+ positions[ 3 * i + 1 ] = posAttr.getY( i );
1338
+ positions[ 3 * i + 2 ] = posAttr.getZ( i );
1339
+
1340
+ }
1341
+
1342
+ }
1343
+
1318
1344
  const creaseDot = Math.cos( creaseAngle );
1319
1345
  const hashMultiplier = ( 1 + 1e-10 ) * 1e2;
1346
+ const faceCount = vertexCount / 3;
1347
+
1348
+ // compute the normal of each face
1349
+ const faceNormals = new Float64Array( faceCount * 3 );
1350
+ for ( let f = 0; f < faceCount; f ++ ) {
1320
1351
 
1321
- // reusable vectors
1322
- const verts = [ new Vector3(), new Vector3(), new Vector3() ];
1323
- const tempVec1 = new Vector3();
1324
- const tempVec2 = new Vector3();
1325
- const tempNorm = new Vector3();
1326
- const tempNorm2 = new Vector3();
1352
+ const f9 = 9 * f;
1353
+ const ax = positions[ f9 + 0 ], ay = positions[ f9 + 1 ], az = positions[ f9 + 2 ];
1354
+ const bx = positions[ f9 + 3 ], by = positions[ f9 + 4 ], bz = positions[ f9 + 5 ];
1355
+ const cx = positions[ f9 + 6 ], cy = positions[ f9 + 7 ], cz = positions[ f9 + 8 ];
1327
1356
 
1328
- // hashes a vector
1329
- function hashVertex( v ) {
1357
+ const v1x = cx - bx, v1y = cy - by, v1z = cz - bz;
1358
+ const v2x = ax - bx, v2y = ay - by, v2z = az - bz;
1330
1359
 
1331
- const x = ~ ~ ( v.x * hashMultiplier );
1332
- const y = ~ ~ ( v.y * hashMultiplier );
1333
- const z = ~ ~ ( v.z * hashMultiplier );
1334
- return `${x},${y},${z}`;
1360
+ const nx = v1y * v2z - v1z * v2y;
1361
+ const ny = v1z * v2x - v1x * v2z;
1362
+ const nz = v1x * v2y - v1y * v2x;
1363
+
1364
+ const invLength = 1 / ( Math.sqrt( nx * nx + ny * ny + nz * nz ) || 1 );
1365
+ faceNormals[ 3 * f + 0 ] = nx * invLength;
1366
+ faceNormals[ 3 * f + 1 ] = ny * invLength;
1367
+ faceNormals[ 3 * f + 2 ] = nz * invLength;
1335
1368
 
1336
1369
  }
1337
1370
 
1338
- // BufferGeometry.toNonIndexed() warns if the geometry is non-indexed
1339
- // and returns the original geometry
1340
- const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;
1341
- const posAttr = resultGeometry.attributes.position;
1342
- const vertexMap = {};
1371
+ // assign an id to each vertex, sharing the id between vertices with the same
1372
+ // quantized position via an open-addressed hash table (slots hold id + 1, 0 means empty)
1373
+ const vertexIds = new Int32Array( vertexCount );
1374
+ const quantized = new Int32Array( vertexCount * 3 );
1343
1375
 
1344
- // find all the normals shared by commonly located vertices
1345
- for ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {
1376
+ let tableSize = 1;
1377
+ while ( tableSize < vertexCount * 2 ) tableSize <<= 1;
1378
+ const tableMask = tableSize - 1;
1379
+ const table = new Int32Array( tableSize );
1380
+
1381
+ let uniqueCount = 0;
1382
+ for ( let i = 0; i < vertexCount; i ++ ) {
1346
1383
 
1347
1384
  const i3 = 3 * i;
1348
- const a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );
1349
- const b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );
1350
- const c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );
1385
+ const qx = ~ ~ ( positions[ i3 + 0 ] * hashMultiplier );
1386
+ const qy = ~ ~ ( positions[ i3 + 1 ] * hashMultiplier );
1387
+ const qz = ~ ~ ( positions[ i3 + 2 ] * hashMultiplier );
1351
1388
 
1352
- tempVec1.subVectors( c, b );
1353
- tempVec2.subVectors( a, b );
1389
+ let slot = ( Math.imul( qx, 73856093 ) ^ Math.imul( qy, 19349663 ) ^ Math.imul( qz, 83492791 ) ) & tableMask;
1354
1390
 
1355
- // add the normal to the map for all vertices
1356
- const normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();
1357
- for ( let n = 0; n < 3; n ++ ) {
1391
+ while ( true ) {
1358
1392
 
1359
- const vert = verts[ n ];
1360
- const hash = hashVertex( vert );
1361
- if ( ! ( hash in vertexMap ) ) {
1393
+ const id = table[ slot ];
1362
1394
 
1363
- vertexMap[ hash ] = [];
1395
+ if ( id === 0 ) {
1396
+
1397
+ const q3 = 3 * uniqueCount;
1398
+ quantized[ q3 + 0 ] = qx;
1399
+ quantized[ q3 + 1 ] = qy;
1400
+ quantized[ q3 + 2 ] = qz;
1401
+
1402
+ table[ slot ] = uniqueCount + 1;
1403
+ vertexIds[ i ] = uniqueCount ++;
1404
+ break;
1364
1405
 
1365
1406
  }
1366
1407
 
1367
- vertexMap[ hash ].push( normal );
1408
+ const q3 = 3 * ( id - 1 );
1409
+
1410
+ if ( quantized[ q3 + 0 ] === qx && quantized[ q3 + 1 ] === qy && quantized[ q3 + 2 ] === qz ) {
1411
+
1412
+ vertexIds[ i ] = id - 1;
1413
+ break;
1414
+
1415
+ }
1416
+
1417
+ slot = ( slot + 1 ) & tableMask;
1368
1418
 
1369
1419
  }
1370
1420
 
1371
1421
  }
1372
1422
 
1373
- // average normals from all vertices that share a common location if they are within the
1374
- // provided crease threshold
1375
- const normalArray = new Float32Array( posAttr.count * 3 );
1376
- const normAttr = new BufferAttribute( normalArray, 3, false );
1377
- for ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {
1423
+ // bucket the faces surrounding each unique vertex position
1424
+ const bucketOffsets = new Int32Array( uniqueCount + 1 );
1425
+ for ( let i = 0; i < vertexCount; i ++ ) bucketOffsets[ vertexIds[ i ] + 1 ] ++;
1426
+ for ( let i = 0; i < uniqueCount; i ++ ) bucketOffsets[ i + 1 ] += bucketOffsets[ i ];
1378
1427
 
1379
- // get the face normal for this vertex
1380
- const i3 = 3 * i;
1381
- const a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );
1382
- const b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );
1383
- const c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );
1428
+ const bucketFaces = new Int32Array( vertexCount );
1429
+ const bucketCursors = bucketOffsets.slice( 0, uniqueCount );
1430
+ for ( let f = 0; f < faceCount; f ++ ) {
1431
+
1432
+ const f3 = 3 * f;
1433
+ bucketFaces[ bucketCursors[ vertexIds[ f3 + 0 ] ] ++ ] = f;
1434
+ bucketFaces[ bucketCursors[ vertexIds[ f3 + 1 ] ] ++ ] = f;
1435
+ bucketFaces[ bucketCursors[ vertexIds[ f3 + 2 ] ] ++ ] = f;
1384
1436
 
1385
- tempVec1.subVectors( c, b );
1386
- tempVec2.subVectors( a, b );
1437
+ }
1438
+
1439
+ // average the normals of the faces surrounding each vertex if they are within the
1440
+ // provided crease threshold
1441
+ const normalArray = new Float32Array( vertexCount * 3 );
1442
+ for ( let f = 0; f < faceCount; f ++ ) {
1387
1443
 
1388
- tempNorm.crossVectors( tempVec1, tempVec2 ).normalize();
1444
+ const f3 = 3 * f;
1445
+ const nx = faceNormals[ f3 + 0 ];
1446
+ const ny = faceNormals[ f3 + 1 ];
1447
+ const nz = faceNormals[ f3 + 2 ];
1389
1448
 
1390
- // average all normals that meet the threshold and set the normal value
1391
1449
  for ( let n = 0; n < 3; n ++ ) {
1392
1450
 
1393
- const vert = verts[ n ];
1394
- const hash = hashVertex( vert );
1395
- const otherNormals = vertexMap[ hash ];
1396
- tempNorm2.set( 0, 0, 0 );
1451
+ const i = f3 + n;
1452
+ const id = vertexIds[ i ];
1453
+
1454
+ let sumX = 0, sumY = 0, sumZ = 0;
1455
+
1456
+ for ( let k = bucketOffsets[ id ], end = bucketOffsets[ id + 1 ]; k < end; k ++ ) {
1397
1457
 
1398
- for ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {
1458
+ const o3 = 3 * bucketFaces[ k ];
1459
+ const ox = faceNormals[ o3 + 0 ];
1460
+ const oy = faceNormals[ o3 + 1 ];
1461
+ const oz = faceNormals[ o3 + 2 ];
1399
1462
 
1400
- const otherNorm = otherNormals[ k ];
1401
- if ( tempNorm.dot( otherNorm ) > creaseDot ) {
1463
+ if ( nx * ox + ny * oy + nz * oz > creaseDot ) {
1402
1464
 
1403
- tempNorm2.add( otherNorm );
1465
+ sumX += ox;
1466
+ sumY += oy;
1467
+ sumZ += oz;
1404
1468
 
1405
1469
  }
1406
1470
 
1407
1471
  }
1408
1472
 
1409
- tempNorm2.normalize();
1410
- normAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );
1473
+ const invLength = 1 / ( Math.sqrt( sumX * sumX + sumY * sumY + sumZ * sumZ ) || 1 );
1474
+ normalArray[ 3 * i + 0 ] = sumX * invLength;
1475
+ normalArray[ 3 * i + 1 ] = sumY * invLength;
1476
+ normalArray[ 3 * i + 2 ] = sumZ * invLength;
1411
1477
 
1412
1478
  }
1413
1479
 
1414
1480
  }
1415
1481
 
1416
- resultGeometry.setAttribute( 'normal', normAttr );
1482
+ resultGeometry.setAttribute( 'normal', new BufferAttribute( normalArray, 3, false ) );
1417
1483
  return resultGeometry;
1418
1484
 
1419
1485
  }
@@ -0,0 +1,76 @@
1
+ import { MathUtils, SRGBColorSpace } from 'three';
2
+
3
+ /**
4
+ * @module ColorUtils
5
+ * @three_import import * as ColorUtils from 'three/addons/utils/ColorUtils.js';
6
+ */
7
+
8
+ /**
9
+ * Sets the given color from a color temperature in Kelvin.
10
+ *
11
+ * Converts a correlated color temperature (CTT) to an approximate sRGB color
12
+ * using Tanner Helland's algorithm. Useful for physically-based lighting
13
+ * setups — e.g. candle flame (~1900K), tungsten bulb (~3200K), daylight
14
+ * (~6500K), or clear blue sky (~10000K). Values outside [1000, 40000] are
15
+ * clamped.
16
+ *
17
+ * Reference: https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html
18
+ *
19
+ * @param {Color} color - The color to set.
20
+ * @param {number} kelvin - Color temperature in Kelvin. Clamped to [1000, 40000].
21
+ * @return {Color} The updated color.
22
+ */
23
+ function setKelvin( color, kelvin ) {
24
+
25
+ // Algorithm by Tanner Helland (2012). Inputs are divided by 100.
26
+ const temp = MathUtils.clamp( kelvin, 1000, 40000 ) / 100;
27
+
28
+ let r, g, b;
29
+
30
+ // Red channel
31
+ if ( temp <= 66 ) {
32
+
33
+ r = 255;
34
+
35
+ } else {
36
+
37
+ r = 329.698727446 * Math.pow( temp - 60, - 0.1332047592 );
38
+
39
+ }
40
+
41
+ // Green channel
42
+ if ( temp <= 66 ) {
43
+
44
+ g = 99.4708025861 * Math.log( temp ) - 161.1195681661;
45
+
46
+ } else {
47
+
48
+ g = 288.1221695283 * Math.pow( temp - 60, - 0.0755148492 );
49
+
50
+ }
51
+
52
+ // Blue channel
53
+ if ( temp >= 66 ) {
54
+
55
+ b = 255;
56
+
57
+ } else if ( temp <= 19 ) {
58
+
59
+ b = 0;
60
+
61
+ } else {
62
+
63
+ b = 138.5177312231 * Math.log( temp - 10 ) - 305.0447927307;
64
+
65
+ }
66
+
67
+ return color.setRGB(
68
+ MathUtils.clamp( r, 0, 255 ) / 255,
69
+ MathUtils.clamp( g, 0, 255 ) / 255,
70
+ MathUtils.clamp( b, 0, 255 ) / 255,
71
+ SRGBColorSpace
72
+ );
73
+
74
+ }
75
+
76
+ export { setKelvin };
@@ -509,7 +509,7 @@ function quantizedEncodeUV( array, bytes ) {
509
509
 
510
510
  }
511
511
 
512
- decodeMat.scale(
512
+ decodeMat.makeScale(
513
513
  ( max[ 0 ] - min[ 0 ] ) / segments,
514
514
  ( max[ 1 ] - min[ 1 ] ) / segments
515
515
  );
@@ -119,7 +119,7 @@ class LDrawUtils {
119
119
 
120
120
  object.traverse( c => {
121
121
 
122
- if ( c.isMesh | c.isLineSegments ) {
122
+ if ( c.isMesh || c.isLineSegments ) {
123
123
 
124
124
  const elemSize = c.isMesh ? 3 : 2;
125
125