@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
@@ -0,0 +1,60 @@
1
+ import { Fn, float, positionView, viewportDepthTexture, perspectiveDepthToViewZ, cameraNear, cameraFar } from '@gnsx/three/tsl';
2
+
3
+ /**
4
+ * @module SoftParticles
5
+ * @three_import import { softParticles } from 'three/addons/tsl/utils/SoftParticles.js';
6
+ */
7
+
8
+ /**
9
+ * A symmetric contrast curve, as described in the "Soft Particles" white paper
10
+ * (NVIDIA, Tristan Lorach).
11
+ *
12
+ * @tsl
13
+ * @function
14
+ * @private
15
+ * @param {Node<float>} input - The value to remap, expected in the `[0, 1]` range.
16
+ * @param {Node<float>} power - The contrast power. `1` is linear, higher values sharpen the transition.
17
+ * @return {Node<float>} The remapped value.
18
+ */
19
+ const contrastCurve = /*@__PURE__*/ Fn( ( [ input, power ] ) => {
20
+
21
+ const aboveHalf = input.greaterThan( 0.5 ).toConst();
22
+ const folded = aboveHalf.select( input.oneMinus(), input ).toConst();
23
+ const output = folded.mul( 2 ).saturate().pow( power ).mul( 0.5 ).toConst();
24
+
25
+ return aboveHalf.select( output.oneMinus(), output );
26
+
27
+ } ).setLayout( {
28
+ name: 'contrastCurve',
29
+ type: 'float',
30
+ inputs: [
31
+ { name: 'input', type: 'float' },
32
+ { name: 'power', type: 'float' }
33
+ ]
34
+ } );
35
+
36
+ /**
37
+ * Computes an opacity node for soft particles, based on the "Soft Particles" white
38
+ * paper (NVIDIA, Tristan Lorach).
39
+ *
40
+ * @tsl
41
+ * @function
42
+ * @param {Object} [parameters={}] - The configuration parameters.
43
+ * @param {Node<float>} [parameters.opacity=float(1)] - The sprite's base opacity, which the soft fade is multiplied with.
44
+ * @param {Node<float>|number} [parameters.distance=1] - The world-space distance over which the sprite fades out against the scene.
45
+ * @param {Node<float>|number} [parameters.contrast=2] - The contrast power of the fade curve. `1` is linear, higher values sharpen the transition.
46
+ * @param {Node<float>} [parameters.viewportDepth=viewportDepthTexture()] - The opaque scene depth the particles fade against.
47
+ * @return {Node<float>} The opacity node to assign to `material.opacityNode`.
48
+ */
49
+ export function softParticles( { opacity = float( 1 ), distance = 1, contrast = 2, viewportDepth = viewportDepthTexture() } = {} ) {
50
+
51
+ // Read the opaque scene depth captured before the particle pass and convert both
52
+ // the scene depth and the particle's depth to view space, so the gap between them
53
+ // can be measured in world units.
54
+ const sceneViewZ = perspectiveDepthToViewZ( viewportDepth, cameraNear, cameraFar ).toConst();
55
+ const depthDelta = positionView.z.sub( sceneViewZ ).div( distance ).saturate();
56
+
57
+ // Fade out as the particle approaches the scene; stay opaque when well in front of it.
58
+ return opacity.mul( contrastCurve( depthDelta, contrast ) );
59
+
60
+ }
@@ -0,0 +1,195 @@
1
+ import { add, float, Fn, If, luminance, max, struct, vec2, vec4, getViewPosition, logarithmicDepthToViewZ, viewZToOrthographicDepth, viewZToPerspectiveDepth } from '@gnsx/three/tsl';
2
+
3
+ /**
4
+ * Optimized version of AABB clipping.
5
+ *
6
+ * Reference: {@link https://github.com/playdeadgames/temporal}
7
+ *
8
+ * @tsl
9
+ * @private
10
+ * @function
11
+ * @param {Node<vec4>} currentColor - The current color.
12
+ * @param {Node<vec4>} historyColor - The history color.
13
+ * @param {Node<vec4>} minColor - The minimum color of the AABB.
14
+ * @param {Node<vec4>} maxColor - The maximum color of the AABB.
15
+ * @return {Node<vec4>} The clipped history color.
16
+ */
17
+ export const clipAABB = Fn( ( [ currentColor, historyColor, minColor, maxColor ] ) => {
18
+
19
+ const pClip = maxColor.rgb.add( minColor.rgb ).mul( 0.5 ).toConst();
20
+ const eClip = maxColor.rgb.sub( minColor.rgb ).mul( 0.5 ).add( 1e-7 ).toConst();
21
+ const vClip = historyColor.sub( vec4( pClip, currentColor.a ) ).toConst();
22
+ const vUnit = vClip.xyz.div( eClip ).toConst();
23
+ const absUnit = vUnit.abs().toConst();
24
+ const maxUnit = max( absUnit.x, absUnit.y, absUnit.z ).toConst();
25
+ return maxUnit.greaterThan( 1 ).select(
26
+ vec4( pClip, currentColor.a ).add( vClip.div( maxUnit ) ),
27
+ historyColor
28
+ );
29
+
30
+ } ).setLayout( {
31
+ name: 'clipAABB',
32
+ type: 'vec4',
33
+ inputs: [
34
+ { name: 'currentColor', type: 'vec4' },
35
+ { name: 'historyColor', type: 'vec4' },
36
+ { name: 'minColor', type: 'vec4' },
37
+ { name: 'maxColor', type: 'vec4' }
38
+ ]
39
+ } );
40
+
41
+ /**
42
+ * Blends the current and history color with a flicker reduction based on luminance weighing.
43
+ *
44
+ * @tsl
45
+ * @private
46
+ * @function
47
+ * @param {Node<vec4>} currentColor - The current color.
48
+ * @param {Node<vec4>} historyColor - The history color.
49
+ * @param {Node<float>} currentWeight - The weight of the current color.
50
+ * @return {Node<vec4>} The blended color.
51
+ */
52
+ export const flickerReduction = Fn( ( [ currentColor, historyColor, currentWeight ] ) => {
53
+
54
+ const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( currentColor.r, currentColor.g, currentColor.b ).add( 1 ) ) ) ).toConst();
55
+ const compressedHistory = historyColor.mul( float( 1 ).div( ( max( historyColor.r, historyColor.g, historyColor.b ).add( 1 ) ) ) ).toConst();
56
+
57
+ const luminanceCurrent = luminance( compressedCurrent.rgb ).toConst();
58
+ const luminanceHistory = luminance( compressedHistory.rgb ).toConst();
59
+
60
+ const weightCurrent = currentWeight.div( luminanceCurrent.add( 1 ) ).toConst();
61
+ const weightHistory = currentWeight.oneMinus().div( luminanceHistory.add( 1 ) ).toConst();
62
+
63
+ return add( currentColor.mul( weightCurrent ), historyColor.mul( weightHistory ) ).div( max( weightCurrent.add( weightHistory ), 0.00001 ) );
64
+
65
+ } ).setLayout( {
66
+ name: 'flickerReduction',
67
+ type: 'vec4',
68
+ inputs: [
69
+ { name: 'currentColor', type: 'vec4' },
70
+ { name: 'historyColor', type: 'vec4' },
71
+ { name: 'currentWeight', type: 'float' }
72
+ ]
73
+ } );
74
+
75
+ /**
76
+ * Samples the 3×3 neighborhood of the given texel position in the depth buffer and returns
77
+ * the closest depth, its texel position and the farthest depth. Reversed and logarithmic depth
78
+ * values are converted to perspective depth.
79
+ *
80
+ * @tsl
81
+ * @private
82
+ * @function
83
+ * @param {TextureNode} depthNode - The depth buffer.
84
+ * @param {Node<vec2>} positionTexel - The texel position.
85
+ * @param {Node<vec2>} cameraNearFar - The camera's near and far.
86
+ * @return {Node<struct>} A struct with the members `closestDepth`, `closestPositionTexel` and `farthestDepth`.
87
+ */
88
+ export const sampleCurrentDepth = Fn( ( [ depthNode, positionTexel, cameraNearFar ], builder ) => {
89
+
90
+ const closestDepth = float( 2 ).toVar();
91
+ const closestPositionTexel = vec2( 0 ).toVar();
92
+ const farthestDepth = float( - 1 ).toVar();
93
+
94
+ for ( let x = - 1; x <= 1; ++ x ) {
95
+
96
+ for ( let y = - 1; y <= 1; ++ y ) {
97
+
98
+ const neighbor = positionTexel.add( vec2( x, y ) ).toVar();
99
+ let depth = depthNode.load( neighbor ).r;
100
+ if ( builder.renderer.reversedDepthBuffer ) depth = depth.oneMinus();
101
+ if ( builder.renderer.logarithmicDepthBuffer ) depth = logarithmicToPerspectiveDepth( depth, cameraNearFar );
102
+ depth = depth.toVar();
103
+
104
+ If( depth.lessThan( closestDepth ), () => {
105
+
106
+ closestDepth.assign( depth );
107
+ closestPositionTexel.assign( neighbor );
108
+
109
+ } );
110
+
111
+ If( depth.greaterThan( farthestDepth ), () => {
112
+
113
+ farthestDepth.assign( depth );
114
+
115
+ } );
116
+
117
+ }
118
+
119
+ }
120
+
121
+ return currentDepthStruct( closestDepth, closestPositionTexel, farthestDepth );
122
+
123
+ } );
124
+
125
+ /**
126
+ * Samples the previous depth buffer and reprojects the depth into the current view.
127
+ *
128
+ * @tsl
129
+ * @private
130
+ * @function
131
+ * @param {TextureNode} previousDepthNode - The previous depth buffer.
132
+ * @param {Node<vec2>} uv - The uv coordinates.
133
+ * @param {Node<mat4>} previousCameraProjectionMatrixInverse - The previous camera projection matrix inverse.
134
+ * @param {Node<mat4>} previousCameraWorldMatrix - The previous camera world matrix.
135
+ * @param {Node<mat4>} cameraWorldMatrixInverse - The current camera world matrix inverse.
136
+ * @param {Node<vec2>} cameraNearFar - The camera's near and far.
137
+ * @param {Camera} camera - The camera.
138
+ * @return {Node<float>} The reprojected depth.
139
+ */
140
+ export const samplePreviousDepth = Fn( ( [ previousDepthNode, uv, previousCameraProjectionMatrixInverse, previousCameraWorldMatrix, cameraWorldMatrixInverse, cameraNearFar, camera ], builder ) => {
141
+
142
+ let depth = previousDepthNode.sample( uv ).r;
143
+ if ( builder.renderer.logarithmicDepthBuffer ) depth = logarithmicToPerspectiveDepth( depth, cameraNearFar );
144
+ const positionView = getViewPosition( uv, depth, previousCameraProjectionMatrixInverse );
145
+ const positionWorld = previousCameraWorldMatrix.mul( vec4( positionView, 1 ) ).xyz;
146
+ const viewZ = cameraWorldMatrixInverse.mul( vec4( positionWorld, 1 ) ).z;
147
+ return camera.isOrthographicCamera
148
+ ? viewZToOrthographicDepth( viewZ, cameraNearFar.x, cameraNearFar.y )
149
+ : viewZToPerspectiveDepth( viewZ, cameraNearFar.x, cameraNearFar.y );
150
+
151
+ } );
152
+
153
+ /**
154
+ * Computes a sequence of Halton(2, 3) jitter offsets in the range [0, 1].
155
+ *
156
+ * @private
157
+ * @function
158
+ * @param {number} length - The number of offsets.
159
+ * @return {Array<Array<number>>} The jitter offsets.
160
+ */
161
+ export function computeHaltonOffsets( length ) {
162
+
163
+ return Array.from( { length }, ( _, index ) => [ halton( index + 1, 2 ), halton( index + 1, 3 ) ] );
164
+
165
+ }
166
+
167
+ const currentDepthStruct = struct( {
168
+ closestDepth: 'float',
169
+ closestPositionTexel: 'vec2',
170
+ farthestDepth: 'float'
171
+ } );
172
+
173
+ const logarithmicToPerspectiveDepth = ( depth, cameraNearFar ) => {
174
+
175
+ const { x: near, y: far } = cameraNearFar;
176
+ const viewZ = logarithmicDepthToViewZ( depth, near, far );
177
+ return viewZToPerspectiveDepth( viewZ, near, far );
178
+
179
+ };
180
+
181
+ function halton( index, base ) {
182
+
183
+ let fraction = 1;
184
+ let result = 0;
185
+ while ( index > 0 ) {
186
+
187
+ fraction /= base;
188
+ result += fraction * ( index % base );
189
+ index = Math.floor( index / base );
190
+
191
+ }
192
+
193
+ return result;
194
+
195
+ }
@@ -709,8 +709,8 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
709
709
 
710
710
  for ( let k = 0; k < itemSize; k ++ ) {
711
711
 
712
- // double tilde truncates the decimal value
713
- hash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;
712
+ // Math.trunc() preserves the full Number range, ~~ would wrap to int32
713
+ hash += `${ Math.trunc( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;
714
714
 
715
715
  }
716
716
 
@@ -799,12 +799,13 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
799
799
  }
800
800
 
801
801
  /**
802
- * Returns a new indexed geometry based on `TrianglesDrawMode` draw mode.
803
- * This mode corresponds to the `gl.TRIANGLES` primitive in WebGL.
802
+ * Converts the given geometry to the `TrianglesDrawMode` draw mode, which
803
+ * corresponds to the `gl.TRIANGLES` primitive in WebGL. The conversion only
804
+ * rewrites the index, so the geometry is modified in place and returned.
804
805
  *
805
806
  * @param {BufferGeometry} geometry - The geometry to convert.
806
807
  * @param {number} drawMode - The current draw mode.
807
- * @return {BufferGeometry} The new geometry using `TrianglesDrawMode`.
808
+ * @return {BufferGeometry} The converted geometry using `TrianglesDrawMode`.
808
809
  */
809
810
  function toTrianglesDrawMode( geometry, drawMode ) {
810
811
 
@@ -894,13 +895,12 @@ function toTrianglesDrawMode( geometry, drawMode ) {
894
895
 
895
896
  }
896
897
 
897
- // build final geometry
898
+ // updated indices
898
899
 
899
- const newGeometry = geometry.clone();
900
- newGeometry.setIndex( newIndices );
901
- newGeometry.clearGroups();
900
+ geometry.setIndex( newIndices );
901
+ geometry.clearGroups();
902
902
 
903
- return newGeometry;
903
+ return geometry;
904
904
 
905
905
  } else {
906
906
 
@@ -1371,7 +1371,7 @@ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */
1371
1371
  // assign an id to each vertex, sharing the id between vertices with the same
1372
1372
  // quantized position via an open-addressed hash table (slots hold id + 1, 0 means empty)
1373
1373
  const vertexIds = new Int32Array( vertexCount );
1374
- const quantized = new Int32Array( vertexCount * 3 );
1374
+ const quantized = new Float64Array( vertexCount * 3 );
1375
1375
 
1376
1376
  let tableSize = 1;
1377
1377
  while ( tableSize < vertexCount * 2 ) tableSize <<= 1;
@@ -1382,9 +1382,9 @@ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */
1382
1382
  for ( let i = 0; i < vertexCount; i ++ ) {
1383
1383
 
1384
1384
  const i3 = 3 * i;
1385
- const qx = ~ ~ ( positions[ i3 + 0 ] * hashMultiplier );
1386
- const qy = ~ ~ ( positions[ i3 + 1 ] * hashMultiplier );
1387
- const qz = ~ ~ ( positions[ i3 + 2 ] * hashMultiplier );
1385
+ const qx = Math.trunc( positions[ i3 + 0 ] * hashMultiplier );
1386
+ const qy = Math.trunc( positions[ i3 + 1 ] * hashMultiplier );
1387
+ const qz = Math.trunc( positions[ i3 + 2 ] * hashMultiplier );
1388
1388
 
1389
1389
  let slot = ( Math.imul( qx, 73856093 ) ^ Math.imul( qy, 19349663 ) ^ Math.imul( qz, 83492791 ) ) & tableMask;
1390
1390
 
@@ -0,0 +1,229 @@
1
+ import {
2
+ BufferAttribute,
3
+ BufferGeometry,
4
+ Matrix3,
5
+ Matrix4,
6
+ Quaternion,
7
+ Vector3
8
+ } from '@gnsx/three';
9
+
10
+ const SH_C0 = 0.2820947917738781;
11
+ const SH_BAND_COMPONENTS = [ 0, 9, 15, 21 ];
12
+ // GPU upload packs four clamped-byte coefficients per uint32 word.
13
+ const SH_BAND_WORDS = [ 0, 3, 4, 6 ];
14
+
15
+ const _covarianceMatrix = new Matrix3();
16
+ const _covarianceMatrixTranspose = new Matrix3();
17
+ const _rotationScaleMatrix = new Matrix4();
18
+ const _quaternion = new Quaternion();
19
+ const _scale = new Vector3();
20
+ const _zero = new Vector3();
21
+
22
+ function sigmoid( value ) {
23
+
24
+ return 1 / ( 1 + Math.exp( - value ) );
25
+
26
+ }
27
+
28
+ // The target is expected to be a Uint8ClampedArray, which clamps and rounds
29
+ // assigned values natively.
30
+ function writeColorBytes( target, offset, r, g, b, a ) {
31
+
32
+ target[ offset ] = r;
33
+ target[ offset + 1 ] = g;
34
+ target[ offset + 2 ] = b;
35
+ target[ offset + 3 ] = a;
36
+
37
+ }
38
+
39
+ function sh0ToLinear( coefficient ) {
40
+
41
+ return coefficient * SH_C0 + 0.5;
42
+
43
+ }
44
+
45
+ function linearToSH0( color ) {
46
+
47
+ return ( color - 0.5 ) / SH_C0;
48
+
49
+ }
50
+
51
+ function writeColorBytesFromSH0( target, offset, r, g, b, a ) {
52
+
53
+ writeColorBytes(
54
+ target,
55
+ offset,
56
+ sh0ToLinear( r ) * 255,
57
+ sh0ToLinear( g ) * 255,
58
+ sh0ToLinear( b ) * 255,
59
+ a * 255
60
+ );
61
+
62
+ }
63
+
64
+ function writeCovariance( target, offset, sx, sy, sz, qx, qy, qz, qw ) {
65
+
66
+ _quaternion.set( qx, qy, qz, qw ).normalize();
67
+ _scale.set( sx, sy, sz );
68
+ _rotationScaleMatrix.compose( _zero, _quaternion, _scale );
69
+
70
+ _covarianceMatrix.setFromMatrix4( _rotationScaleMatrix );
71
+ _covarianceMatrixTranspose.copy( _covarianceMatrix ).transpose();
72
+ _covarianceMatrix.multiply( _covarianceMatrixTranspose );
73
+
74
+ const elements = _covarianceMatrix.elements;
75
+
76
+ target[ offset ] = elements[ 0 ];
77
+ target[ offset + 1 ] = elements[ 3 ];
78
+ target[ offset + 2 ] = elements[ 6 ];
79
+ target[ offset + 3 ] = elements[ 4 ];
80
+ target[ offset + 4 ] = elements[ 7 ];
81
+ target[ offset + 5 ] = elements[ 8 ];
82
+
83
+ }
84
+
85
+ function createPackedSphericalHarmonicsBand( count, degree ) {
86
+
87
+ const packed = new Uint32Array( count * SH_BAND_WORDS[ degree ] );
88
+ packed.fill( 0x80808080 );
89
+
90
+ return {
91
+ packed,
92
+ bytes: new Uint8ClampedArray( packed.buffer )
93
+ };
94
+
95
+ }
96
+
97
+ function createSphericalHarmonicsAttribute( values, count, degree ) {
98
+
99
+ const words = SH_BAND_WORDS[ degree ];
100
+
101
+ if ( values instanceof Uint32Array === false ) {
102
+
103
+ throw new Error( `THREE.createGaussianSplatGeometry: sphericalHarmonics${ degree } must use packed uint32 words.` );
104
+
105
+ }
106
+
107
+ if ( values.length !== count * words ) {
108
+
109
+ throw new Error( `THREE.createGaussianSplatGeometry: Invalid sphericalHarmonics${ degree } packed length.` );
110
+
111
+ }
112
+
113
+ return new BufferAttribute( values, words );
114
+
115
+ }
116
+
117
+ function getSphericalHarmonicsDegree( geometry ) {
118
+
119
+ if ( geometry === undefined || geometry.isBufferGeometry !== true ) return 0;
120
+
121
+ let degree = 0;
122
+
123
+ for ( let i = 1; i <= 3; i ++ ) {
124
+
125
+ const attribute = geometry.getAttribute( `sphericalHarmonics${ i }` );
126
+
127
+ if ( attribute === undefined ) break;
128
+
129
+ if ( attribute.itemSize !== SH_BAND_WORDS[ i ] ) {
130
+
131
+ throw new Error( `THREE.getSphericalHarmonicsDegree: Invalid sphericalHarmonics${ i } itemSize.` );
132
+
133
+ }
134
+
135
+ if ( attribute.array instanceof Uint32Array === false ) {
136
+
137
+ throw new Error( `THREE.getSphericalHarmonicsDegree: sphericalHarmonics${ i } must use packed uint32 words.` );
138
+
139
+ }
140
+
141
+ degree = i;
142
+
143
+ }
144
+
145
+ for ( let i = degree + 1; i <= 3; i ++ ) {
146
+
147
+ if ( geometry.getAttribute( `sphericalHarmonics${ i }` ) !== undefined ) {
148
+
149
+ throw new Error( 'THREE.getSphericalHarmonicsDegree: Spherical harmonics attributes must be contiguous.' );
150
+
151
+ }
152
+
153
+ }
154
+
155
+ const position = geometry.getAttribute( 'position' );
156
+
157
+ if ( position !== undefined ) {
158
+
159
+ for ( let i = 1; i <= degree; i ++ ) {
160
+
161
+ if ( geometry.getAttribute( `sphericalHarmonics${ i }` ).count !== position.count ) {
162
+
163
+ throw new Error( 'THREE.getSphericalHarmonicsDegree: Spherical harmonics attribute counts must match position.' );
164
+
165
+ }
166
+
167
+ }
168
+
169
+ }
170
+
171
+ return degree;
172
+
173
+ }
174
+
175
+ /**
176
+ * Creates Gaussian splat geometry from packed attribute arrays. Higher-order
177
+ * spherical harmonics must be supplied as packed `Uint32Array` words
178
+ * (`SH_BAND_WORDS[ degree ]` words per splat, four clamped-byte coefficients
179
+ * per word using `( value - 128 ) / 128`).
180
+ *
181
+ * @param {Float32Array} centers - Splat centers.
182
+ * @param {Float32Array} covariances - Splat covariance matrices.
183
+ * @param {Uint8Array|Uint8ClampedArray} colors - RGBA colors.
184
+ * @param {Object} [sphericalHarmonics={}] - Optional packed SH band arrays.
185
+ * @return {BufferGeometry} The Gaussian splat geometry.
186
+ */
187
+ function createGaussianSplatGeometry( centers, covariances, colors, sphericalHarmonics = {} ) {
188
+
189
+ const geometry = new BufferGeometry();
190
+ geometry.setAttribute( 'position', new BufferAttribute( centers, 3 ) );
191
+ geometry.setAttribute( 'covariance', new BufferAttribute( covariances, 6 ) );
192
+ geometry.setAttribute( 'color', new BufferAttribute( colors, 4, true ) );
193
+
194
+ const count = centers.length / 3;
195
+
196
+ for ( let i = 1; i <= 3; i ++ ) {
197
+
198
+ const values = sphericalHarmonics[ `sh${ i }` ] || sphericalHarmonics[ `sphericalHarmonics${ i }` ];
199
+
200
+ if ( values !== undefined ) {
201
+
202
+ geometry.setAttribute( `sphericalHarmonics${ i }`, createSphericalHarmonicsAttribute( values, count, i ) );
203
+
204
+ }
205
+
206
+ }
207
+
208
+ getSphericalHarmonicsDegree( geometry );
209
+ geometry.computeBoundingBox();
210
+ geometry.computeBoundingSphere();
211
+
212
+ return geometry;
213
+
214
+ }
215
+
216
+ export {
217
+ SH_BAND_COMPONENTS,
218
+ SH_BAND_WORDS,
219
+ SH_C0,
220
+ createGaussianSplatGeometry,
221
+ createPackedSphericalHarmonicsBand,
222
+ getSphericalHarmonicsDegree,
223
+ linearToSH0,
224
+ sh0ToLinear,
225
+ sigmoid,
226
+ writeColorBytes,
227
+ writeColorBytesFromSH0,
228
+ writeCovariance
229
+ };
@@ -24,7 +24,7 @@ let fullscreenQuad;
24
24
  * Returns an uncompressed version of the given compressed texture.
25
25
  *
26
26
  * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},
27
- * import the function from {@link WebGPUTextureUtils}.
27
+ * import the function from {@link module:WebGPUTextureUtils}.
28
28
  *
29
29
  * @param {CompressedTexture} texture - The compressed texture.
30
30
  * @param {number} [maxTextureSize=Infinity] - The maximum size of the uncompressed texture.
@@ -18,7 +18,7 @@ const _quadMesh = /*@__PURE__*/ new QuadMesh();
18
18
  * Returns an uncompressed version of the given compressed texture.
19
19
  *
20
20
  * This module can only be used with {@link WebGPURenderer}. When using {@link WebGLRenderer},
21
- * import the function from {@link WebGLTextureUtils}.
21
+ * import the function from {@link module:WebGLTextureUtils}.
22
22
  *
23
23
  * @async
24
24
  * @param {CompressedTexture} blitTexture - The compressed texture.
@@ -26,27 +26,13 @@ function setupWebGLXRFallback( renderer, createFallbackRenderer, onFallback = ()
26
26
 
27
27
  }
28
28
 
29
- if ( session !== null && renderer.backend.isWebGPUBackend === true && session.enabledFeatures.includes( 'webgpu' ) === false ) {
29
+ if ( session !== null && renderer.backend.isWebGPUBackend === true && typeof globalThis.XRGPUBinding === 'undefined' ) {
30
30
 
31
31
  return switchToFallbackRenderer( session, renderer );
32
32
 
33
33
  }
34
34
 
35
- try {
36
-
37
- return await setSession( session );
38
-
39
- } catch ( error ) {
40
-
41
- if ( session === null || renderer.backend.isWebGPUBackend !== true ) {
42
-
43
- throw error;
44
-
45
- }
46
-
47
- return switchToFallbackRenderer( session, renderer );
48
-
49
- }
35
+ return setSession( session );
50
36
 
51
37
  };
52
38
 
@@ -325,6 +325,7 @@ class XRControllerModelFactory {
325
325
 
326
326
  const controllerModel = new XRControllerModel();
327
327
  let scene = null;
328
+ let connectionId = 0; // used to invalidate async operations of previous connections, see #34264
328
329
 
329
330
  controller.addEventListener( 'connected', ( event ) => {
330
331
 
@@ -332,15 +333,22 @@ class XRControllerModelFactory {
332
333
 
333
334
  if ( xrInputSource.targetRayMode !== 'tracked-pointer' || ! xrInputSource.gamepad || xrInputSource.hand ) return;
334
335
 
336
+ const id = ++ connectionId;
337
+
335
338
  fetchProfile( xrInputSource, this.path, DEFAULT_PROFILE ).then( ( { profile, assetPath } ) => {
336
339
 
340
+ if ( id !== connectionId ) return;
341
+
337
342
  controllerModel.motionController = new MotionController(
338
343
  xrInputSource,
339
344
  profile,
340
345
  assetPath
341
346
  );
342
347
 
343
- const cachedAsset = this._assetCache[ controllerModel.motionController.assetUrl ];
348
+ const assetUrl = controllerModel.motionController.assetUrl;
349
+
350
+ const cachedAsset = this._assetCache[ assetUrl ];
351
+
344
352
  if ( cachedAsset ) {
345
353
 
346
354
  scene = cachedAsset.scene.clone();
@@ -358,9 +366,11 @@ class XRControllerModelFactory {
358
366
  }
359
367
 
360
368
  this.gltfLoader.setPath( '' );
361
- this.gltfLoader.load( controllerModel.motionController.assetUrl, ( asset ) => {
369
+ this.gltfLoader.load( assetUrl, ( asset ) => {
370
+
371
+ this._assetCache[ assetUrl ] = asset;
362
372
 
363
- this._assetCache[ controllerModel.motionController.assetUrl ] = asset;
373
+ if ( id !== connectionId ) return;
364
374
 
365
375
  scene = asset.scene.clone();
366
376
 
@@ -372,7 +382,7 @@ class XRControllerModelFactory {
372
382
  null,
373
383
  () => {
374
384
 
375
- throw new Error( `THREE.XRControllerModelFactory: Asset ${controllerModel.motionController.assetUrl} missing or malformed.` );
385
+ throw new Error( `THREE.XRControllerModelFactory: Asset ${assetUrl} missing or malformed.` );
376
386
 
377
387
  } );
378
388
 
@@ -388,6 +398,8 @@ class XRControllerModelFactory {
388
398
 
389
399
  controller.addEventListener( 'disconnected', () => {
390
400
 
401
+ connectionId ++;
402
+
391
403
  controllerModel.motionController = null;
392
404
  controllerModel.remove( scene );
393
405
  scene = null;