@gnsx/three 0.185.16 → 0.186.1

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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -229,7 +229,7 @@ class Matrix4 {
229
229
  }
230
230
 
231
231
  /**
232
- * Extracts the basis of this matrix into the three axis vectors provided.
232
+ * Extracts the basis vectors of this matrix into the three vectors provided.
233
233
  *
234
234
  * @param {Vector3} xAxis - The basis's x axis.
235
235
  * @param {Vector3} yAxis - The basis's y axis.
@@ -621,8 +621,6 @@ class Matrix4 {
621
621
  /**
622
622
  * Computes and returns the determinant of this matrix.
623
623
  *
624
- * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).
625
- *
626
624
  * @return {number} The determinant.
627
625
  */
628
626
  determinant() {
@@ -788,7 +786,7 @@ class Matrix4 {
788
786
  }
789
787
 
790
788
  /**
791
- * Multiplies the columns of this matrix by the given vector.
789
+ * Scales each of the first three columns of this matrix by the corresponding component of the given vector.
792
790
  *
793
791
  * @param {Vector3} v - The scale vector.
794
792
  * @return {Matrix4} A reference to this matrix.
@@ -938,17 +936,12 @@ class Matrix4 {
938
936
  * Sets this matrix as a rotational transformation around the given axis by
939
937
  * the given angle.
940
938
  *
941
- * This is a somewhat controversial but mathematically sound alternative to
942
- * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).
943
- *
944
939
  * @param {Vector3} axis - The normalized rotation axis.
945
940
  * @param {number} angle - The rotation in radians.
946
941
  * @return {Matrix4} A reference to this matrix.
947
942
  */
948
943
  makeRotationAxis( axis, angle ) {
949
944
 
950
- // Based on http://www.gamedev.net/reference/articles/article1199.asp
951
-
952
945
  const c = Math.cos( angle );
953
946
  const s = Math.sin( angle );
954
947
  const t = 1 - c;
package/src/math/Plane.js CHANGED
@@ -7,7 +7,7 @@ const _normalMatrix = /*@__PURE__*/ new Matrix3();
7
7
 
8
8
  /**
9
9
  * A two dimensional surface that extends infinitely in 3D space, represented
10
- * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)
10
+ * in [Hessian normal form](https://mathworld.wolfram.com/HessianNormalForm.html)
11
11
  * by a unit length normal vector and a constant.
12
12
  */
13
13
  class Plane {
@@ -363,6 +363,35 @@ class Plane {
363
363
 
364
364
  }
365
365
 
366
+ /**
367
+ * Returns a serialized structure of the plane.
368
+ *
369
+ * @return {Object} Serialized structure with fields representing the object state.
370
+ */
371
+ toJSON() {
372
+
373
+ return {
374
+ normal: this.normal.toArray(),
375
+ constant: this.constant
376
+ };
377
+
378
+ }
379
+
380
+ /**
381
+ * Sets the plane properties from the given JSON.
382
+ *
383
+ * @param {Object} json - The serialized json to set the plane from.
384
+ * @return {Plane} A reference to this plane.
385
+ */
386
+ fromJSON( json ) {
387
+
388
+ this.normal.fromArray( json.normal );
389
+ this.constant = json.constant;
390
+
391
+ return this;
392
+
393
+ }
394
+
366
395
  }
367
396
 
368
397
  export { Plane };
@@ -302,10 +302,6 @@ class Quaternion {
302
302
 
303
303
  const x = euler._x, y = euler._y, z = euler._z, order = euler._order;
304
304
 
305
- // http://www.mathworks.com/matlabcentral/fileexchange/
306
- // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
307
- // content/SpinCalc.m
308
-
309
305
  const cos = Math.cos;
310
306
  const sin = Math.sin;
311
307
 
@@ -381,8 +377,6 @@ class Quaternion {
381
377
  */
382
378
  setFromAxisAngle( axis, angle ) {
383
379
 
384
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
385
-
386
380
  const halfAngle = angle / 2, s = Math.sin( halfAngle );
387
381
 
388
382
  this._x = axis.x * s;
@@ -404,8 +398,6 @@ class Quaternion {
404
398
  */
405
399
  setFromRotationMatrix( m ) {
406
400
 
407
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
408
-
409
401
  // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
410
402
 
411
403
  const te = m.elements,
@@ -693,8 +685,6 @@ class Quaternion {
693
685
  */
694
686
  multiplyQuaternions( a, b ) {
695
687
 
696
- // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
697
-
698
688
  const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
699
689
  const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
700
690
 
package/src/math/Ray.js CHANGED
@@ -5,10 +5,6 @@ const _segCenter = /*@__PURE__*/ new Vector3();
5
5
  const _segDir = /*@__PURE__*/ new Vector3();
6
6
  const _diff = /*@__PURE__*/ new Vector3();
7
7
 
8
- const _edge1 = /*@__PURE__*/ new Vector3();
9
- const _edge2 = /*@__PURE__*/ new Vector3();
10
- const _normal = /*@__PURE__*/ new Vector3();
11
-
12
8
  /**
13
9
  * A ray that emits from an origin in a certain direction. The class is used by
14
10
  * {@link Raycaster} to assist with raycasting. Raycasting is used for
@@ -310,6 +306,8 @@ class Ray {
310
306
  */
311
307
  intersectSphere( sphere, target ) {
312
308
 
309
+ if ( sphere.radius < 0 ) return null; // handle empty spheres, see #31187
310
+
313
311
  _vector.subVectors( sphere.center, this.origin );
314
312
  const tca = _vector.dot( this.direction );
315
313
  const d2 = _vector.dot( _vector ) - tca * tca;
@@ -539,76 +537,128 @@ class Ray {
539
537
  */
540
538
  intersectTriangle( a, b, c, backfaceCulling, target ) {
541
539
 
542
- // Compute the offset origin, edges, and normal.
540
+ // Watertight ray/triangle intersection. Reference: Woop, Benthin, Wald,
541
+ // "Watertight Ray/Triangle Intersection", JCGT vol. 2 no. 1 (2013), Appendix A.
542
+ // https://jcgt.org/published/0002/01/05/
543
+
544
+ const origin = this.origin;
545
+ const direction = this.direction;
546
+
547
+ const dx = direction.x;
548
+ const dy = direction.y;
549
+ const dz = direction.z;
550
+
551
+ // triangle vertices relative to the ray origin
543
552
 
544
- // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
553
+ const aox = a.x - origin.x, aoy = a.y - origin.y, aoz = a.z - origin.z;
554
+ const box = b.x - origin.x, boy = b.y - origin.y, boz = b.z - origin.z;
555
+ const cox = c.x - origin.x, coy = c.y - origin.y, coz = c.z - origin.z;
545
556
 
546
- _edge1.subVectors( b, a );
547
- _edge2.subVectors( c, a );
548
- _normal.crossVectors( _edge1, _edge2 );
557
+ // Use the dimension where the ray direction is maximal as the projection
558
+ // axis (kz) and read every component already permuted into (kx, ky, kz).
559
+ // kx and ky are swapped when the direction's kz component is negative, to
560
+ // preserve the winding order of triangles.
549
561
 
550
- // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
551
- // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
552
- // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
553
- // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
554
- // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
555
- let DdN = this.direction.dot( _normal );
556
- let sign;
562
+ const adx = Math.abs( dx ), ady = Math.abs( dy ), adz = Math.abs( dz );
557
563
 
558
- if ( DdN > 0 ) {
564
+ let dkx, dky, dkz;
565
+ let akx, aky, akz, bkx, bky, bkz, ckx, cky, ckz;
559
566
 
560
- if ( backfaceCulling ) return null;
561
- sign = 1;
567
+ if ( adx >= ady && adx >= adz ) {
568
+
569
+ dkz = dx; akz = aox; bkz = box; ckz = cox;
570
+
571
+ if ( dx >= 0 ) {
572
+
573
+ dkx = dy; dky = dz;
574
+ akx = aoy; aky = aoz; bkx = boy; bky = boz; ckx = coy; cky = coz;
575
+
576
+ } else {
562
577
 
563
- } else if ( DdN < 0 ) {
578
+ dkx = dz; dky = dy;
579
+ akx = aoz; aky = aoy; bkx = boz; bky = boy; ckx = coz; cky = coy;
564
580
 
565
- sign = - 1;
566
- DdN = - DdN;
581
+ }
582
+
583
+ } else if ( ady >= adz ) {
584
+
585
+ dkz = dy; akz = aoy; bkz = boy; ckz = coy;
586
+
587
+ if ( dy >= 0 ) {
588
+
589
+ dkx = dz; dky = dx;
590
+ akx = aoz; aky = aox; bkx = boz; bky = box; ckx = coz; cky = cox;
591
+
592
+ } else {
593
+
594
+ dkx = dx; dky = dz;
595
+ akx = aox; aky = aoz; bkx = box; bky = boz; ckx = cox; cky = coz;
596
+
597
+ }
567
598
 
568
599
  } else {
569
600
 
570
- return null;
601
+ dkz = dz; akz = aoz; bkz = boz; ckz = coz;
571
602
 
572
- }
603
+ if ( dz >= 0 ) {
573
604
 
574
- _diff.subVectors( this.origin, a );
575
- const DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );
605
+ dkx = dx; dky = dy;
606
+ akx = aox; aky = aoy; bkx = box; bky = boy; ckx = cox; cky = coy;
576
607
 
577
- // b1 < 0, no intersection
578
- if ( DdQxE2 < 0 ) {
608
+ } else {
579
609
 
580
- return null;
610
+ dkx = dy; dky = dx;
611
+ akx = aoy; aky = aox; bkx = boy; bky = box; ckx = coy; cky = cox;
612
+
613
+ }
581
614
 
582
615
  }
583
616
 
584
- const DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );
617
+ // a zero direction has no maximal axis and cannot intersect
585
618
 
586
- // b2 < 0, no intersection
587
- if ( DdE1xQ < 0 ) {
619
+ if ( dkz === 0 ) return null;
588
620
 
589
- return null;
621
+ // shear constants that align the ray with the +kz axis
590
622
 
591
- }
623
+ const sx = dkx / dkz, sy = dky / dkz, sz = 1 / dkz;
592
624
 
593
- // b1+b2 > 1, no intersection
594
- if ( DdQxE2 + DdE1xQ > DdN ) {
625
+ // sheared and scaled vertices
595
626
 
596
- return null;
627
+ const ax = akx - sx * akz, ay = aky - sy * akz;
628
+ const bx = bkx - sx * bkz, by = bky - sy * bkz;
629
+ const cx = ckx - sx * ckz, cy = cky - sy * ckz;
597
630
 
598
- }
631
+ // scaled barycentric coordinates (signed edge functions); the shear makes a
632
+ // shared edge evaluate identically for both adjacent triangles, so the ray
633
+ // can never fall between them
599
634
 
600
- // Line intersects triangle, check if ray does.
601
- const QdN = - sign * _diff.dot( _normal );
635
+ const u = cx * by - cy * bx;
636
+ const v = ax * cy - ay * cx;
637
+ const w = bx * ay - by * ax;
602
638
 
603
- // t < 0, no intersection
604
- if ( QdN < 0 ) {
639
+ if ( backfaceCulling ) {
605
640
 
606
- return null;
641
+ if ( u < 0 || v < 0 || w < 0 ) return null;
642
+
643
+ } else {
644
+
645
+ if ( ( u < 0 || v < 0 || w < 0 ) && ( u > 0 || v > 0 || w > 0 ) ) return null;
607
646
 
608
647
  }
609
648
 
610
- // Ray intersects triangle.
611
- return this.at( QdN / DdN, target );
649
+ const det = u + v + w;
650
+
651
+ // ray is co-planar with the triangle
652
+
653
+ if ( det === 0 ) return null;
654
+
655
+ // scaled hit distance; t = tScaled / det must lie in front of the origin
656
+
657
+ const tScaled = sz * ( u * akz + v * bkz + w * ckz );
658
+
659
+ if ( det > 0 ? tScaled < 0 : tScaled > 0 ) return null;
660
+
661
+ return this.at( tScaled / det, target );
612
662
 
613
663
  }
614
664
 
@@ -93,8 +93,6 @@ class Triangle {
93
93
  */
94
94
  static getBarycoord( point, a, b, c, target ) {
95
95
 
96
- // based on: http://www.blackpawn.com/texts/pointinpoly/default.html
97
-
98
96
  _v0.subVectors( c, a );
99
97
  _v1.subVectors( b, a );
100
98
  _v2.subVectors( point, a );
@@ -516,8 +516,8 @@ class Vector3 {
516
516
  }
517
517
 
518
518
  /**
519
- * Transforms the direction of this vector by a matrix (the upper left 3 x 3
520
- * subset of the given 4x4 matrix and then normalizes the result.
519
+ * Transforms this vector by the upper left 3x3 sub-matrix of the given 4x4 matrix,
520
+ * and normalizes the result.
521
521
  *
522
522
  * @param {Matrix4} m - The matrix.
523
523
  * @return {Vector3} A reference to this vector.
@@ -493,8 +493,6 @@ class Vector4 {
493
493
  */
494
494
  setAxisAngleFromQuaternion( q ) {
495
495
 
496
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
497
-
498
496
  // q is assumed to be normalized
499
497
 
500
498
  this.w = 2 * Math.acos( q.w );
@@ -528,8 +526,6 @@ class Vector4 {
528
526
  */
529
527
  setAxisAngleFromRotationMatrix( m ) {
530
528
 
531
- // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
532
-
533
529
  // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
534
530
 
535
531
  let angle, x, y, z; // variables for result
@@ -65,42 +65,55 @@ class BezierInterpolant extends Interpolant {
65
65
  const c1x = inTangents[ inTangentOffset ];
66
66
  const c1y = inTangents[ inTangentOffset + 1 ];
67
67
 
68
- // Solve for Bezier parameter s where Bx(s) = t using Newton-Raphson
69
- let s = ( t - t0 ) / ( t1 - t0 );
70
- let s2, s3, oneMinusS, oneMinusS2, oneMinusS3;
68
+ // Find the curve parameter s where the Bezier X(s) matches t, then evaluate Y(s)
69
+ const s = solveBezierParameter( t, t0, c0x, c1x, t1 );
71
70
 
72
- for ( let iter = 0; iter < 8; iter ++ ) {
71
+ result[ i ] = cubicBezier( s, v0, c0y, c1y, v1 );
73
72
 
74
- s2 = s * s;
75
- s3 = s2 * s;
76
- oneMinusS = 1 - s;
77
- oneMinusS2 = oneMinusS * oneMinusS;
78
- oneMinusS3 = oneMinusS2 * oneMinusS;
73
+ }
79
74
 
80
- // Bezier X(s) = (1-s)³·t0 + 3(1-s)²s·c0x + 3(1-s)s²·c1x + s³·t1
81
- const bx = oneMinusS3 * t0 + 3 * oneMinusS2 * s * c0x + 3 * oneMinusS * s2 * c1x + s3 * t1;
75
+ return result;
82
76
 
83
- const error = bx - t;
84
- if ( Math.abs( error ) < 1e-10 ) break;
77
+ }
85
78
 
86
- // Derivative dX/ds
87
- const dbx = 3 * oneMinusS2 * ( c0x - t0 ) + 6 * oneMinusS * s * ( c1x - c0x ) + 3 * s2 * ( t1 - c1x );
88
- if ( Math.abs( dbx ) < 1e-10 ) break;
79
+ }
89
80
 
90
- s = s - error / dbx;
91
- s = Math.max( 0, Math.min( 1, s ) );
81
+ function cubicBezier( s, p0, p1, p2, p3 ) {
92
82
 
93
- }
83
+ const k = 1 - s;
94
84
 
95
- // Evaluate Bezier Y(s)
96
- result[ i ] = oneMinusS3 * v0 + 3 * oneMinusS2 * s * c0y + 3 * oneMinusS * s2 * c1y + s3 * v1;
85
+ return k * k * k * p0 + 3 * k * k * s * p1 + 3 * k * s * s * p2 + s * s * s * p3;
97
86
 
98
- }
87
+ }
99
88
 
100
- return result;
89
+ function cubicBezierSlope( s, p0, p1, p2, p3 ) {
90
+
91
+ const k = 1 - s;
92
+
93
+ return 3 * k * k * ( p1 - p0 ) + 6 * k * s * ( p2 - p1 ) + 3 * s * s * ( p3 - p2 );
94
+
95
+ }
96
+
97
+ // Solves cubicBezier( s, x0, x1, x2, x3 ) = x for s in [0,1] using Newton-Raphson
98
+
99
+ function solveBezierParameter( x, x0, x1, x2, x3 ) {
100
+
101
+ let s = ( x - x0 ) / ( x3 - x0 );
102
+
103
+ for ( let i = 0; i < 8; i ++ ) {
104
+
105
+ const error = cubicBezier( s, x0, x1, x2, x3 ) - x;
106
+ if ( Math.abs( error ) < 1e-10 ) break;
107
+
108
+ const slope = cubicBezierSlope( s, x0, x1, x2, x3 );
109
+ if ( Math.abs( slope ) < 1e-10 ) break;
110
+
111
+ s = Math.max( 0, Math.min( 1, s - error / slope ) );
101
112
 
102
113
  }
103
114
 
115
+ return s;
116
+
104
117
  }
105
118
 
106
119
  export { BezierInterpolant };
@@ -55,6 +55,7 @@ export { default as ModelNode } from './accessors/ModelNode.js';
55
55
  export { default as Object3DNode } from './accessors/Object3DNode.js';
56
56
  export { default as PointUVNode } from './accessors/PointUVNode.js';
57
57
  export { default as ReferenceBaseNode } from './accessors/ReferenceBaseNode.js';
58
+ export { default as ReferenceElementNode } from './accessors/ReferenceElementNode.js';
58
59
  export { default as ReferenceNode } from './accessors/ReferenceNode.js';
59
60
  export { default as RendererReferenceNode } from './accessors/RendererReferenceNode.js';
60
61
  export { default as StorageBufferNode } from './accessors/StorageBufferNode.js';
@@ -136,6 +137,7 @@ export { default as ConditionalNode } from './math/ConditionalNode.js';
136
137
  export { default as MathNode } from './math/MathNode.js';
137
138
  export { default as OperatorNode } from './math/OperatorNode.js';
138
139
  export { default as PackFloatNode } from './math/PackFloatNode.js';
140
+ export { default as Packed4x8IntegerNode } from './math/Packed4x8IntegerNode.js';
139
141
  export { default as UnpackFloatNode } from './math/UnpackFloatNode.js';
140
142
 
141
143
  // parsers
package/src/nodes/TSL.js CHANGED
@@ -25,6 +25,7 @@ export * from './math/BitcountNode.js';
25
25
  export * from './math/Hash.js';
26
26
  export * from './math/MathUtils.js';
27
27
  export * from './math/PackFloatNode.js';
28
+ export * from './math/Packed4x8IntegerNode.js';
28
29
  export * from './math/UnpackFloatNode.js';
29
30
  export * from './math/TriNoise3D.js';
30
31
 
@@ -49,6 +50,7 @@ export * from './utils/RTTNode.js';
49
50
  export * from './utils/PostProcessingUtils.js';
50
51
  export * from './utils/SampleNode.js';
51
52
  export * from './utils/EventNode.js';
53
+ export * from './utils/StorageArrayElementNode.js';
52
54
 
53
55
  // three.js shading language
54
56
  export * from './tsl/TSLBase.js';
@@ -58,6 +60,8 @@ export * from './accessors/AccessorsUtils.js';
58
60
  export * from './accessors/Arrays.js';
59
61
  export * from './accessors/UniformArrayNode.js';
60
62
  export * from './accessors/Bitangent.js';
63
+ export * from './accessors/ClippingNode.js';
64
+ export * from './accessors/TangentUtils.js';
61
65
  export * from './accessors/BufferAttributeNode.js';
62
66
  export * from './accessors/BufferNode.js';
63
67
  export * from './accessors/BuiltinNode.js';
@@ -140,14 +144,13 @@ export * from './accessors/Lights.js';
140
144
  export * from './lighting/LightsNode.js';
141
145
  export * from './lighting/LightingContextNode.js';
142
146
  export * from './lighting/ShadowBaseNode.js';
143
- export * from './lighting/ShadowNode.js';
144
- export * from './lighting/ShadowFilterNode.js';
147
+ export { shadow } from './lighting/ShadowNode.js';
148
+ export { BasicShadowFilter, PCFShadowFilter, VSMShadowFilter } from './lighting/ShadowFilterNode.js';
145
149
  export * from './lighting/PointShadowNode.js';
146
150
  export * from './lighting/PointLightNode.js';
147
151
 
148
152
  // pmrem
149
153
  export * from './pmrem/PMREMNode.js';
150
- export * from './pmrem/PMREMUtils.js';
151
154
 
152
155
  // procedural
153
156
  export * from './procedural/Checker.js';
@@ -161,11 +164,16 @@ export * from './materialx/MaterialXNodes.js';
161
164
  // functions
162
165
  export { default as BRDF_GGX } from './functions/BSDF/BRDF_GGX.js';
163
166
  export { default as BRDF_Lambert } from './functions/BSDF/BRDF_Lambert.js';
167
+ export { default as BRDF_Sheen } from './functions/BSDF/BRDF_Sheen.js';
164
168
  export { default as D_GGX } from './functions/BSDF/D_GGX.js';
169
+ export { default as D_GGX_Anisotropic } from './functions/BSDF/D_GGX_Anisotropic.js';
165
170
  export { default as DFGLUT } from './functions/BSDF/DFGLUT.js';
171
+ export { default as EnvironmentBRDF } from './functions/BSDF/EnvironmentBRDF.js';
166
172
  export { default as F_Schlick } from './functions/BSDF/F_Schlick.js';
167
173
  export { default as Schlick_to_F0 } from './functions/BSDF/Schlick_to_F0.js';
168
174
  export { default as V_GGX_SmithCorrelated } from './functions/BSDF/V_GGX_SmithCorrelated.js';
175
+ export { default as V_GGX_SmithCorrelated_Anisotropic } from './functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js';
176
+ export { LTC_Evaluate, LTC_Evaluate_Volume, LTC_Uv } from './functions/BSDF/LTC.js';
169
177
 
170
178
  export * from './lighting/LightUtils.js';
171
179
 
@@ -1,12 +1,16 @@
1
1
 
2
2
  import { normalLocal } from './Normal.js';
3
- import { positionLocal } from './Position.js';
3
+ import { positionLocal, positionPrevious } from './Position.js';
4
4
  import { vec3, mat3, mat4, int, ivec2, float, Fn } from '../tsl/TSLBase.js';
5
5
  import { textureLoad } from './TextureNode.js';
6
6
  import { textureSize } from './TextureSizeNode.js';
7
7
  import { tangentLocal } from './Tangent.js';
8
8
  import { instanceIndex, drawIndex } from '../core/IndexNode.js';
9
9
  import { varyingProperty } from '../core/PropertyNode.js';
10
+ import { OnAfterObjectUpdate } from '../utils/EventNode.js';
11
+ import { DataTexture } from '../../textures/DataTexture.js';
12
+
13
+ const _previousBatchingMatrices = /*@__PURE__*/ new WeakMap();
10
14
 
11
15
  /**
12
16
  * TSL function that retrieves the batching color for a given instance ID from a colors texture.
@@ -41,6 +45,61 @@ const getIndirectIndex = /*@__PURE__*/ Fn( ( [ indirectTexture, id ] ) => {
41
45
 
42
46
  } );
43
47
 
48
+ /**
49
+ * Creates the node that reads a batching matrix from the given matrices texture.
50
+ *
51
+ * @param {Texture} matricesTexture - The matrices texture.
52
+ * @param {Node<uint>} id - The indirect instance ID.
53
+ * @returns {Node<mat4>} The matrix node.
54
+ */
55
+ function createBatchingMatrixNode( matricesTexture, id ) {
56
+
57
+ const size = int( textureSize( textureLoad( matricesTexture ), 0 ).x ).toConst();
58
+ const j = float( id ).mul( 4 ).toInt().toConst();
59
+
60
+ const x = j.mod( size ).toConst();
61
+ const y = j.div( size ).toConst();
62
+
63
+ return mat4(
64
+ textureLoad( matricesTexture, ivec2( x, y ) ),
65
+ textureLoad( matricesTexture, ivec2( x.add( 1 ), y ) ),
66
+ textureLoad( matricesTexture, ivec2( x.add( 2 ), y ) ),
67
+ textureLoad( matricesTexture, ivec2( x.add( 3 ), y ) )
68
+ );
69
+
70
+ }
71
+
72
+ /**
73
+ * Retrieves or initializes the previous frame batching matrix node for motion vectors.
74
+ * Uses a WeakMap to cache previous frame matrices textures and their TSL nodes.
75
+ *
76
+ * @param {BatchedMesh} batchMesh - The batched mesh.
77
+ * @param {Node<uint>} id - The indirect instance ID.
78
+ * @returns {Node<mat4>} The previous frame batching matrix node.
79
+ */
80
+ function getPreviousNode( batchMesh, id ) {
81
+
82
+ let data = _previousBatchingMatrices.get( batchMesh );
83
+
84
+ if ( data === undefined ) {
85
+
86
+ const { image, format, type } = batchMesh._matricesTexture;
87
+
88
+ const previousMatricesTexture = new DataTexture( image.data.slice(), image.width, image.height, format, type );
89
+
90
+ data = {
91
+ previousMatricesTexture,
92
+ node: createBatchingMatrixNode( previousMatricesTexture, id )
93
+ };
94
+
95
+ _previousBatchingMatrices.set( batchMesh, data );
96
+
97
+ }
98
+
99
+ return data.node;
100
+
101
+ }
102
+
44
103
  /**
45
104
  * TSL object representing a varying property for the batching color vector.
46
105
  *
@@ -48,6 +107,13 @@ const getIndirectIndex = /*@__PURE__*/ Fn( ( [ indirectTexture, id ] ) => {
48
107
  */
49
108
  export const batchColor = /*@__PURE__*/ varyingProperty( 'vec4', 'vBatchColor' );
50
109
 
110
+ /**
111
+ * TSL object representing a varying property for the batch indirect index (instance ID).
112
+ *
113
+ * @type {VaryingNode<uint>}
114
+ */
115
+ export const batchIndirectIndex = /*@__PURE__*/ varyingProperty( 'uint', 'vBatchIndirectId' );
116
+
51
117
  /**
52
118
  * TSL function representing the vertex shader batching setup.
53
119
  * Applies the batch transformation matrix to positionLocal, normalLocal, and tangentLocal.
@@ -63,19 +129,9 @@ export const batch = /*@__PURE__*/ Fn( ( [ batchMesh ], builder ) => {
63
129
 
64
130
  const indirectId = getIndirectIndex( batchMesh._indirectTexture, int( batchingIdNode ) );
65
131
 
66
- const matricesTexture = batchMesh._matricesTexture;
67
-
68
- const size = int( textureSize( textureLoad( matricesTexture ), 0 ).x ).toConst();
69
- const j = float( indirectId ).mul( 4 ).toInt().toConst();
132
+ batchIndirectIndex.assign( indirectId );
70
133
 
71
- const x = j.mod( size ).toConst();
72
- const y = j.div( size ).toConst();
73
- const batchingMatrix = mat4(
74
- textureLoad( matricesTexture, ivec2( x, y ) ),
75
- textureLoad( matricesTexture, ivec2( x.add( 1 ), y ) ),
76
- textureLoad( matricesTexture, ivec2( x.add( 2 ), y ) ),
77
- textureLoad( matricesTexture, ivec2( x.add( 3 ), y ) )
78
- );
134
+ const batchingMatrix = createBatchingMatrixNode( batchMesh._matricesTexture, indirectId );
79
135
 
80
136
  const colorsTexture = batchMesh._colorsTexture;
81
137
 
@@ -91,6 +147,22 @@ export const batch = /*@__PURE__*/ Fn( ( [ batchMesh ], builder ) => {
91
147
 
92
148
  positionLocal.assign( batchingMatrix.mul( positionLocal ) );
93
149
 
150
+ if ( builder.needsPreviousData() ) {
151
+
152
+ OnAfterObjectUpdate( ( { object } ) => {
153
+
154
+ const previousBatchData = _previousBatchingMatrices.get( object );
155
+
156
+ previousBatchData.previousMatricesTexture.image.data.set( object._matricesTexture.image.data );
157
+ previousBatchData.previousMatricesTexture.needsUpdate = true;
158
+
159
+ } );
160
+
161
+ const previousBatchingMatrixNode = getPreviousNode( batchMesh, indirectId );
162
+ positionPrevious.assign( previousBatchingMatrixNode.mul( positionPrevious ).xyz );
163
+
164
+ }
165
+
94
166
  const transformedNormal = normalLocal.div( vec3( bm[ 0 ].dot( bm[ 0 ] ), bm[ 1 ].dot( bm[ 1 ] ), bm[ 2 ].dot( bm[ 2 ] ) ) );
95
167
 
96
168
  const batchingNormal = bm.mul( transformedNormal ).xyz;
@@ -440,4 +440,4 @@ export const instancedBufferAttribute = ( array, type = null, stride = 0, offset
440
440
  */
441
441
  export const instancedDynamicBufferAttribute = ( array, type = null, stride = 0, offset = 0 ) => createBufferAttribute( array, type, stride, offset, DynamicDrawUsage, true );
442
442
 
443
- addMethodChaining( 'toAttribute', ( bufferNode ) => bufferAttribute( bufferNode.value ) );
443
+ addMethodChaining( 'toAttribute', ( bufferNode ) => bufferAttribute( bufferNode.value, bufferNode.bufferType ) );
@@ -60,4 +60,4 @@ export default BuiltinNode;
60
60
  * @param {string} name - The name of the built-in shader variable.
61
61
  * @returns {BuiltinNode}
62
62
  */
63
- export const builtin = nodeProxy( BuiltinNode ).setParameterLength( 1 );
63
+ export const builtin = /*@__PURE__*/ nodeProxy( BuiltinNode ).setParameterLength( 1 );