@gnsx/three 0.185.15 → 0.186.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 (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
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { vec3, mat4, Fn } from '../tsl/TSLBase.js';
3
- import { OnFrameUpdate, OnObjectUpdate } from '../utils/EventNode.js';
3
+ import { OnAfterObjectUpdate, OnBeforeFrameUpdate } from '../utils/EventNode.js';
4
4
  import { normalLocal, transformNormal } from './Normal.js';
5
5
  import { positionLocal, positionPrevious } from './Position.js';
6
6
  import { varyingProperty } from '../core/PropertyNode.js';
@@ -172,34 +172,28 @@ export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder
172
172
 
173
173
  }
174
174
 
175
- // Synchronization of dynamic buffer updates per frame
175
+ // Synchronization of dynamic buffer updates per frame.
176
176
  if ( interleavedMatrix !== null || interleavedColor !== null ) {
177
177
 
178
- OnFrameUpdate( () => {
178
+ OnBeforeFrameUpdate( () => {
179
179
 
180
- if ( interleavedMatrix !== null ) {
180
+ if ( interleavedMatrix !== null && interleavedMatrix.version !== matrices.version ) {
181
181
 
182
182
  interleavedMatrix.clearUpdateRanges();
183
183
  interleavedMatrix.updateRanges.push( ...matrices.updateRanges );
184
+ matrices.clearUpdateRanges(); // "matrices" as the source is never uploaded directly. clear to avoid update range accumulation
184
185
 
185
- if ( matrices.version !== interleavedMatrix.version ) {
186
-
187
- interleavedMatrix.version = matrices.version;
188
-
189
- }
186
+ interleavedMatrix.version = matrices.version;
190
187
 
191
188
  }
192
189
 
193
- if ( colors && interleavedColor !== null ) {
190
+ if ( colors && interleavedColor !== null && interleavedColor.version !== colors.version ) {
194
191
 
195
192
  interleavedColor.clearUpdateRanges();
196
193
  interleavedColor.updateRanges.push( ...colors.updateRanges );
194
+ colors.clearUpdateRanges();
197
195
 
198
- if ( colors.version !== interleavedColor.version ) {
199
-
200
- interleavedColor.version = colors.version;
201
-
202
- }
196
+ interleavedColor.version = colors.version;
203
197
 
204
198
  }
205
199
 
@@ -216,11 +210,18 @@ export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder
216
210
 
217
211
  const instancedMesh = builder.object;
218
212
 
219
- OnObjectUpdate( ( { object } ) => {
213
+ OnAfterObjectUpdate( ( { object } ) => {
214
+
215
+ const { previousInstanceMatrix } = _previousInstanceMatrices.get( object );
216
+
217
+ previousInstanceMatrix.array.set( matrices.array );
218
+ previousInstanceMatrix.version = matrices.version;
219
+
220
+ // handle interleaved path
220
221
 
221
- const previousInstanceData = _previousInstanceMatrices.get( object );
222
+ const previousInterleavedMatrix = _matrixBuffers.get( previousInstanceMatrix );
222
223
 
223
- previousInstanceData.previousInstanceMatrix.array.set( matrices.array );
224
+ if ( previousInterleavedMatrix !== undefined ) previousInterleavedMatrix.version = matrices.version;
224
225
 
225
226
  } );
226
227
 
@@ -463,6 +463,7 @@ MaterialNode.LINE_WIDTH = 'linewidth';
463
463
  MaterialNode.LINE_DASH_OFFSET = 'dashOffset';
464
464
  MaterialNode.POINT_SIZE = 'size';
465
465
  MaterialNode.DISPERSION = 'dispersion';
466
+ MaterialNode.RETROREFLECTIVITY = 'retroreflectivity';
466
467
  MaterialNode.LIGHT_MAP = 'light';
467
468
  MaterialNode.AO = 'ao';
468
469
 
@@ -764,6 +765,14 @@ export const materialPointSize = /*@__PURE__*/ nodeImmutable( MaterialNode, Mate
764
765
  */
765
766
  export const materialDispersion = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.DISPERSION );
766
767
 
768
+ /**
769
+ * TSL object that represents the retroreflective strength of the current material.
770
+ *
771
+ * @tsl
772
+ * @type {Node<float>}
773
+ */
774
+ export const materialRetroreflectivity = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.RETROREFLECTIVITY );
775
+
767
776
  /**
768
777
  * TSL object that represents the light map of the current material.
769
778
  * The value is composed via `lightMapIntensity` * `lightMap.rgb`.
@@ -3,9 +3,13 @@ import { Fn, nodeImmutable } from '../tsl/TSLBase.js';
3
3
  import { uniform } from '../core/UniformNode.js';
4
4
 
5
5
  import { Matrix4 } from '../../math/Matrix4.js';
6
- import { cameraViewMatrix } from './Camera.js';
6
+ import { builtin } from './BuiltinNode.js';
7
+ import { cameraIndex, cameraViewMatrix } from './Camera.js';
8
+ import { uniformArray } from './UniformArrayNode.js';
7
9
  import { Matrix3 } from '../../math/Matrix3.js';
8
10
 
11
+ const _modelViewMatrix = /*@__PURE__*/ new Matrix4();
12
+
9
13
  /**
10
14
  * This type of node is a specialized version of `Object3DNode`
11
15
  * with larger set of model related metrics. Unlike `Object3DNode`,
@@ -150,11 +154,46 @@ export const highpModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
150
154
 
151
155
  builder.context.isHighPrecisionModelViewMatrix = true;
152
156
 
153
- return uniform( 'mat4' ).onObjectUpdate( ( { object, camera } ) => {
157
+ const camera = builder.camera;
158
+
159
+ let highpModelViewMatrix;
160
+
161
+ if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
162
+
163
+ const matrices = [];
164
+
165
+ for ( let i = 0; i < camera.cameras.length; i ++ ) {
166
+
167
+ matrices.push( new Matrix4() );
168
+
169
+ }
170
+
171
+ const modelViewMatrices = uniformArray( matrices ).onObjectUpdate( ( { object, camera }, self ) => {
172
+
173
+ const subCameras = camera.cameras;
174
+ const array = self.array;
154
175
 
155
- return object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
176
+ for ( let i = 0, l = subCameras.length; i < l; i ++ ) {
177
+
178
+ array[ i ].multiplyMatrices( subCameras[ i ].matrixWorldInverse, object.matrixWorld );
179
+
180
+ }
181
+
182
+ } );
183
+
184
+ highpModelViewMatrix = modelViewMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex );
185
+
186
+ } else {
187
+
188
+ highpModelViewMatrix = uniform( 'mat4' ).onObjectUpdate( ( { object, camera } ) => {
189
+
190
+ return object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
191
+
192
+ } );
193
+
194
+ }
156
195
 
157
- } );
196
+ return highpModelViewMatrix;
158
197
 
159
198
  } ).once() )().toVar( 'highpModelViewMatrix' );
160
199
 
@@ -169,16 +208,53 @@ export const highpModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
169
208
 
170
209
  const isHighPrecisionModelViewMatrix = builder.context.isHighPrecisionModelViewMatrix;
171
210
 
172
- return uniform( 'mat3' ).onObjectUpdate( ( { object, camera } ) => {
211
+ const camera = builder.camera;
173
212
 
174
- if ( isHighPrecisionModelViewMatrix !== true ) {
213
+ let highpModelNormalViewMatrix;
175
214
 
176
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
215
+ if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
216
+
217
+ const matrices = [];
218
+
219
+ for ( let i = 0; i < camera.cameras.length; i ++ ) {
220
+
221
+ matrices.push( new Matrix3() );
177
222
 
178
223
  }
179
224
 
180
- return object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
225
+ const normalViewMatrices = uniformArray( matrices ).onObjectUpdate( ( { object, camera }, self ) => {
226
+
227
+ const subCameras = camera.cameras;
228
+ const array = self.array;
229
+
230
+ for ( let i = 0, l = subCameras.length; i < l; i ++ ) {
231
+
232
+ _modelViewMatrix.multiplyMatrices( subCameras[ i ].matrixWorldInverse, object.matrixWorld );
233
+
234
+ array[ i ].getNormalMatrix( _modelViewMatrix );
235
+
236
+ }
237
+
238
+ } );
239
+
240
+ highpModelNormalViewMatrix = normalViewMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex );
241
+
242
+ } else {
243
+
244
+ highpModelNormalViewMatrix = uniform( 'mat3' ).onObjectUpdate( ( { object, camera } ) => {
245
+
246
+ if ( isHighPrecisionModelViewMatrix !== true ) {
247
+
248
+ object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
249
+
250
+ }
251
+
252
+ return object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
253
+
254
+ } );
255
+
256
+ }
181
257
 
182
- } );
258
+ return highpModelNormalViewMatrix;
183
259
 
184
260
  } ).once() )().toVar( 'highpModelNormalViewMatrix' );
@@ -2,79 +2,10 @@ import Node from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import { uniform } from '../core/UniformNode.js';
4
4
  import { nodeObject } from '../tsl/TSLCore.js';
5
- import ArrayElementNode from '../utils/ArrayElementNode.js';
5
+ import ReferenceElementNode from './ReferenceElementNode.js';
6
6
 
7
7
  // TODO: Avoid duplicated code and use only ReferenceBaseNode or ReferenceNode
8
8
 
9
- /**
10
- * This class is only relevant if the referenced property is array-like.
11
- * In this case, `ReferenceElementNode` allows to refer to a specific
12
- * element inside the data structure via an index.
13
- *
14
- * @augments ArrayElementNode
15
- */
16
- class ReferenceElementNode extends ArrayElementNode {
17
-
18
- static get type() {
19
-
20
- return 'ReferenceElementNode';
21
-
22
- }
23
-
24
- /**
25
- * Constructs a new reference element node.
26
- *
27
- * @param {ReferenceBaseNode} referenceNode - The reference node.
28
- * @param {Node} indexNode - The index node that defines the element access.
29
- */
30
- constructor( referenceNode, indexNode ) {
31
-
32
- super( referenceNode, indexNode );
33
-
34
- /**
35
- * Similar to {@link ReferenceBaseNode#reference}, an additional
36
- * property references to the current node.
37
- *
38
- * @type {?ReferenceBaseNode}
39
- * @default null
40
- */
41
- this.referenceNode = referenceNode;
42
-
43
- /**
44
- * This flag can be used for type testing.
45
- *
46
- * @type {boolean}
47
- * @readonly
48
- * @default true
49
- */
50
- this.isReferenceElementNode = true;
51
-
52
- }
53
-
54
- /**
55
- * This method is overwritten since the node type is inferred from
56
- * the uniform type of the reference node.
57
- *
58
- * @return {string} The node type.
59
- */
60
- generateNodeType() {
61
-
62
- return this.referenceNode.uniformType;
63
-
64
- }
65
-
66
- generate( builder ) {
67
-
68
- const snippet = super.generate( builder );
69
- const arrayType = this.referenceNode.getNodeType();
70
- const elementType = this.getNodeType();
71
-
72
- return builder.format( snippet, arrayType, elementType );
73
-
74
- }
75
-
76
- }
77
-
78
9
  /**
79
10
  * Base class for nodes which establishes a reference to a property of another object.
80
11
  * In this way, the value of the node is automatically linked to the value of
@@ -0,0 +1,72 @@
1
+ import ArrayElementNode from '../utils/ArrayElementNode.js';
2
+
3
+ /**
4
+ * This class is only relevant if the referenced property is array-like.
5
+ * In this case, `ReferenceElementNode` allows to refer to a specific
6
+ * element inside the data structure via an index.
7
+ *
8
+ * @augments ArrayElementNode
9
+ */
10
+ class ReferenceElementNode extends ArrayElementNode {
11
+
12
+ static get type() {
13
+
14
+ return 'ReferenceElementNode';
15
+
16
+ }
17
+
18
+ /**
19
+ * Constructs a new reference element node.
20
+ *
21
+ * @param {(ReferenceBaseNode|ReferenceNode)} referenceNode - The reference node.
22
+ * @param {Node} indexNode - The index node that defines the element access.
23
+ */
24
+ constructor( referenceNode, indexNode ) {
25
+
26
+ super( referenceNode, indexNode );
27
+
28
+ /**
29
+ * Similar to {@link ReferenceNode#reference}, an additional
30
+ * property references to the current node.
31
+ *
32
+ * @type {?(ReferenceBaseNode|ReferenceNode)}
33
+ * @default null
34
+ */
35
+ this.referenceNode = referenceNode;
36
+
37
+ /**
38
+ * This flag can be used for type testing.
39
+ *
40
+ * @type {boolean}
41
+ * @readonly
42
+ * @default true
43
+ */
44
+ this.isReferenceElementNode = true;
45
+
46
+ }
47
+
48
+ /**
49
+ * This method is overwritten since the node type is inferred from
50
+ * the uniform type of the reference node.
51
+ *
52
+ * @return {string} The node type.
53
+ */
54
+ generateNodeType() {
55
+
56
+ return this.referenceNode.uniformType;
57
+
58
+ }
59
+
60
+ generate( builder ) {
61
+
62
+ const snippet = super.generate( builder );
63
+ const arrayType = this.referenceNode.getNodeType( builder );
64
+ const elementType = this.getNodeType( builder );
65
+
66
+ return builder.format( snippet, arrayType, elementType );
67
+
68
+ }
69
+
70
+ }
71
+
72
+ export default ReferenceElementNode;
@@ -6,80 +6,11 @@ import { cubeTexture } from './CubeTextureNode.js';
6
6
  import { buffer } from './BufferNode.js';
7
7
  import { nodeObject } from '../tsl/TSLBase.js';
8
8
  import { uniformArray } from './UniformArrayNode.js';
9
- import ArrayElementNode from '../utils/ArrayElementNode.js';
9
+ import ReferenceElementNode from './ReferenceElementNode.js';
10
10
  import { warn } from '../../utils.js';
11
11
 
12
12
  // TODO: Avoid duplicated code and use only ReferenceBaseNode or ReferenceNode
13
13
 
14
- /**
15
- * This class is only relevant if the referenced property is array-like.
16
- * In this case, `ReferenceElementNode` allows to refer to a specific
17
- * element inside the data structure via an index.
18
- *
19
- * @augments ArrayElementNode
20
- */
21
- class ReferenceElementNode extends ArrayElementNode {
22
-
23
- static get type() {
24
-
25
- return 'ReferenceElementNode';
26
-
27
- }
28
-
29
- /**
30
- * Constructs a new reference element node.
31
- *
32
- * @param {?ReferenceNode} referenceNode - The reference node.
33
- * @param {Node} indexNode - The index node that defines the element access.
34
- */
35
- constructor( referenceNode, indexNode ) {
36
-
37
- super( referenceNode, indexNode );
38
-
39
- /**
40
- * Similar to {@link ReferenceNode#reference}, an additional
41
- * property references to the current node.
42
- *
43
- * @type {?ReferenceNode}
44
- * @default null
45
- */
46
- this.referenceNode = referenceNode;
47
-
48
- /**
49
- * This flag can be used for type testing.
50
- *
51
- * @type {boolean}
52
- * @readonly
53
- * @default true
54
- */
55
- this.isReferenceElementNode = true;
56
-
57
- }
58
-
59
- /**
60
- * This method is overwritten since the node type is inferred from
61
- * the uniform type of the reference node.
62
- *
63
- * @return {string} The node type.
64
- */
65
- generateNodeType() {
66
-
67
- return this.referenceNode.uniformType;
68
-
69
- }
70
-
71
- generate( builder ) {
72
-
73
- const snippet = super.generate( builder );
74
- const arrayType = this.referenceNode.getNodeType( builder );
75
- const elementType = this.getNodeType( builder );
76
-
77
- return builder.format( snippet, arrayType, elementType );
78
-
79
- }
80
-
81
- }
82
-
83
14
  /**
84
15
  * This type of node establishes a reference to a property of another object.
85
16
  * In this way, the value of the node is automatically linked to the value of
@@ -1,5 +1,5 @@
1
1
 
2
- import { Fn, add, uniform } from '../tsl/TSLBase.js';
2
+ import { Fn, add, uniform, int, ivec2, mat3, mat4 } from '../tsl/TSLBase.js';
3
3
  import { attribute } from '../core/AttributeNode.js';
4
4
  import { OnObjectUpdate } from '../utils/EventNode.js';
5
5
  import { normalLocal } from './Normal.js';
@@ -8,13 +8,87 @@ import { tangentLocal } from './Tangent.js';
8
8
  import { reference, referenceBuffer } from './ReferenceNode.js';
9
9
  import { buffer } from './BufferNode.js';
10
10
  import { storage } from './StorageBufferNode.js';
11
+ import { texture } from './TextureNode.js';
12
+ import { textureSize } from './TextureSizeNode.js';
11
13
  import { instanceIndex } from '../core/IndexNode.js';
12
14
 
13
15
  import { InstancedBufferAttribute } from '../../core/InstancedBufferAttribute.js';
16
+ import { DataTexture } from '../../textures/DataTexture.js';
17
+ import { RGBAFormat, FloatType } from '../../constants.js';
14
18
 
15
19
  const _skeletonsUpdated = /*@__PURE__*/ new WeakMap();
16
20
  const _previousBoneMatricesData = /*@__PURE__*/ new WeakMap();
17
21
 
22
+ /**
23
+ * Creates an accessor for bone matrices stored in a bone texture.
24
+ *
25
+ * @param {TextureNode} boneTexture - The bone texture node.
26
+ * @returns {Object} An accessor with the same `element()` interface as a buffer node.
27
+ */
28
+ function getBoneTextureMatrices( boneTexture ) {
29
+
30
+ return {
31
+ element: ( i ) => {
32
+
33
+ const size = int( textureSize( boneTexture ).x ).toConst();
34
+ const j = int( i ).mul( 4 ).toConst();
35
+ const y = j.div( size ).toConst();
36
+ const x = j.sub( y.mul( size ) ).toConst();
37
+
38
+ return mat4(
39
+ boneTexture.load( ivec2( x, y ) ),
40
+ boneTexture.load( ivec2( x.add( 1 ), y ) ),
41
+ boneTexture.load( ivec2( x.add( 2 ), y ) ),
42
+ boneTexture.load( ivec2( x.add( 3 ), y ) )
43
+ );
44
+
45
+ }
46
+ };
47
+
48
+ }
49
+
50
+ /**
51
+ * Creates the bone matrices node. Skeletons that fit within the uniform buffer limit
52
+ * use a uniform buffer, larger skeletons fall back to a bone texture.
53
+ *
54
+ * @param {NodeBuilder} builder - The current node builder.
55
+ * @param {Skeleton} skeleton - The skeleton.
56
+ * @returns {Object} The bone matrices node.
57
+ */
58
+ function getBoneMatricesNode( builder, skeleton ) {
59
+
60
+ let node;
61
+
62
+ const uniformBufferSize = skeleton.bones.length * 16 * 4;
63
+
64
+ if ( uniformBufferSize <= builder.getUniformBufferLimit() ) {
65
+
66
+ node = referenceBuffer( 'skeleton.boneMatrices', 'mat4', skeleton.bones.length );
67
+
68
+ } else {
69
+
70
+ if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
71
+
72
+ const boneTexture = texture( skeleton.boneTexture );
73
+
74
+ OnObjectUpdate( ( { object } ) => {
75
+
76
+ const skeleton = object.skeleton;
77
+
78
+ if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
79
+
80
+ boneTexture.value = skeleton.boneTexture;
81
+
82
+ } );
83
+
84
+ node = getBoneTextureMatrices( boneTexture );
85
+
86
+ }
87
+
88
+ return node;
89
+
90
+ }
91
+
18
92
  /**
19
93
  * Computes the skinned position by applying bone matrices based on weights.
20
94
  *
@@ -78,8 +152,10 @@ function getSkinnedNormalAndTangent( boneMatrices, normal, tangent, bindMatrix,
78
152
 
79
153
  skinMatrix = bindMatrixInverse.mul( skinMatrix ).mul( bindMatrix );
80
154
 
81
- const skinNormal = skinMatrix.transformDirection( normal ).xyz;
82
- const skinTangent = skinMatrix.transformDirection( tangent ).xyz;
155
+ const skinMatrix3 = mat3( skinMatrix );
156
+
157
+ const skinNormal = skinMatrix3.mul( normal );
158
+ const skinTangent = skinMatrix3.mul( tangent );
83
159
 
84
160
  return { skinNormal, skinTangent };
85
161
 
@@ -89,6 +165,7 @@ function getSkinnedNormalAndTangent( boneMatrices, normal, tangent, bindMatrix,
89
165
  * Retrieves or initializes the previous frame skinned position node for motion vectors.
90
166
  * Uses a WeakMap to cache previous frame bone matrix arrays and their TSL buffer nodes.
91
167
  *
168
+ * @param {NodeBuilder} builder - The current node builder.
92
169
  * @param {SkinnedMesh} skinnedMesh - The skinned mesh.
93
170
  * @param {Node<mat4>} bindMatrixNode - The bind matrix node.
94
171
  * @param {Node<mat4>} bindMatrixInverseNode - The inverse bind matrix node.
@@ -96,7 +173,7 @@ function getSkinnedNormalAndTangent( boneMatrices, normal, tangent, bindMatrix,
96
173
  * @param {Node<vec4>} skinWeightNode - The skin weight attribute.
97
174
  * @returns {Node<vec3>} The skinned position from the previous frame.
98
175
  */
99
- function getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode ) {
176
+ function getPreviousSkinnedPosition( builder, skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode ) {
100
177
 
101
178
  const skeleton = skinnedMesh.skeleton;
102
179
 
@@ -106,12 +183,35 @@ function getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInve
106
183
 
107
184
  skeleton.update();
108
185
 
109
- const previousBoneMatrices = new Float32Array( skeleton.boneMatrices );
186
+ const uniformBufferSize = skeleton.bones.length * 16 * 4;
187
+
188
+ if ( uniformBufferSize <= builder.getUniformBufferLimit() ) {
189
+
190
+ const previousBoneMatrices = new Float32Array( skeleton.boneMatrices );
191
+
192
+ data = {
193
+ previousBoneMatrices,
194
+ previousBoneTexture: null,
195
+ node: buffer( previousBoneMatrices, 'mat4', skeleton.bones.length )
196
+ };
110
197
 
111
- data = {
112
- previousBoneMatrices,
113
- node: buffer( previousBoneMatrices, 'mat4', skeleton.bones.length )
114
- };
198
+ } else {
199
+
200
+ if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
201
+
202
+ const { width, height } = skeleton.boneTexture.image;
203
+
204
+ const previousBoneMatrices = new Float32Array( skeleton.boneMatrices );
205
+ const previousBoneTexture = new DataTexture( previousBoneMatrices, width, height, RGBAFormat, FloatType );
206
+ previousBoneTexture.needsUpdate = true;
207
+
208
+ data = {
209
+ previousBoneMatrices,
210
+ previousBoneTexture,
211
+ node: getBoneTextureMatrices( texture( previousBoneTexture ) )
212
+ };
213
+
214
+ }
115
215
 
116
216
  _previousBoneMatricesData.set( skeleton, data );
117
217
 
@@ -135,7 +235,7 @@ export const skinning = /*@__PURE__*/ Fn( ( [ skinnedMesh ], builder ) => {
135
235
  const skinWeightNode = attribute( 'skinWeight', 'vec4' );
136
236
  const bindMatrixNode = reference( 'bindMatrix', 'mat4' );
137
237
  const bindMatrixInverseNode = reference( 'bindMatrixInverse', 'mat4' );
138
- const boneMatricesNode = referenceBuffer( 'skeleton.boneMatrices', 'mat4', skinnedMesh.skeleton.bones.length );
238
+ const boneMatricesNode = getBoneMatricesNode( builder, skinnedMesh.skeleton );
139
239
 
140
240
  OnObjectUpdate( ( { object, frameId } ) => {
141
241
 
@@ -151,6 +251,12 @@ export const skinning = /*@__PURE__*/ Fn( ( [ skinnedMesh ], builder ) => {
151
251
 
152
252
  skeletonData.previousBoneMatrices.set( skeleton.boneMatrices );
153
253
 
254
+ if ( skeletonData.previousBoneTexture !== null ) {
255
+
256
+ skeletonData.previousBoneTexture.needsUpdate = true;
257
+
258
+ }
259
+
154
260
  }
155
261
 
156
262
  skeleton.update();
@@ -161,7 +267,7 @@ export const skinning = /*@__PURE__*/ Fn( ( [ skinnedMesh ], builder ) => {
161
267
 
162
268
  if ( builder.needsPreviousData() ) {
163
269
 
164
- const previousSkinnedPosition = getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
270
+ const previousSkinnedPosition = getPreviousSkinnedPosition( builder, skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
165
271
 
166
272
  positionPrevious.assign( previousSkinnedPosition );
167
273
 
@@ -218,6 +324,12 @@ export const computeSkinning = /*@__PURE__*/ Fn( ( [ skinnedMesh, toPosition = n
218
324
 
219
325
  state.previousBoneMatrices.set( skeleton.boneMatrices );
220
326
 
327
+ if ( state.previousBoneTexture !== null ) {
328
+
329
+ state.previousBoneTexture.needsUpdate = true;
330
+
331
+ }
332
+
221
333
  }
222
334
 
223
335
  skeleton.update();
@@ -228,7 +340,7 @@ export const computeSkinning = /*@__PURE__*/ Fn( ( [ skinnedMesh, toPosition = n
228
340
 
229
341
  if ( builder.needsPreviousData() ) {
230
342
 
231
- const previousSkinnedPosition = getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
343
+ const previousSkinnedPosition = getPreviousSkinnedPosition( builder, skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
232
344
 
233
345
  positionPrevious.assign( previousSkinnedPosition );
234
346