@gnsx/three 0.185.16 → 0.186.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -269,7 +269,7 @@ class PCDLoader extends Loader {
269
269
 
270
270
  // remove comments
271
271
 
272
- PCDheader.str = PCDheader.str.replace( /#.*/gi, '' );
272
+ PCDheader.str = PCDheader.str.replace( /^#.*/gm, '' );
273
273
 
274
274
  // parse
275
275
 
@@ -0,0 +1,139 @@
1
+ import {
2
+ FileLoader,
3
+ Loader
4
+ } from '@gnsx/three';
5
+
6
+ import { createGaussianSplatGeometry, writeCovariance } from '../utils/GaussianSplatUtils.js';
7
+
8
+ const ROW_SIZE_BYTES = 32;
9
+
10
+ /**
11
+ * A loader for standard fixed-width Gaussian splat `.splat` files.
12
+ *
13
+ * This loader decodes the format into `BufferGeometry` for use with
14
+ * `GaussianSplat`. Each 32-byte row stores center, scale, color and
15
+ * rotation data for one splat.
16
+ *
17
+ * ```js
18
+ * const loader = new SPLATLoader();
19
+ * const data = await loader.loadAsync( './models/gsplat/example.splat' );
20
+ * scene.add( new GaussianSplat( data ) );
21
+ * ```
22
+ *
23
+ * @augments Loader
24
+ * @three_import import { SPLATLoader } from 'three/addons/loaders/SPLATLoader.js';
25
+ */
26
+ class SPLATLoader extends Loader {
27
+
28
+ /**
29
+ * Constructs a new Gaussian splat loader.
30
+ *
31
+ * @param {LoadingManager} [manager] - The loading manager.
32
+ */
33
+ constructor( manager ) {
34
+
35
+ super( manager );
36
+
37
+ }
38
+
39
+ /**
40
+ * Starts loading from the given URL and passes the loaded splat data to
41
+ * the `onLoad()` callback.
42
+ *
43
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
44
+ * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
45
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
46
+ * @param {onErrorCallback} onError - Executed when errors occur.
47
+ */
48
+ load( url, onLoad, onProgress, onError ) {
49
+
50
+ const scope = this;
51
+
52
+ const loader = new FileLoader( this.manager );
53
+ loader.setPath( this.path );
54
+ loader.setResponseType( 'arraybuffer' );
55
+ loader.setRequestHeader( this.requestHeader );
56
+ loader.setWithCredentials( this.withCredentials );
57
+ loader.load( url, function ( buffer ) {
58
+
59
+ try {
60
+
61
+ onLoad( scope.parse( buffer ) );
62
+
63
+ } catch ( e ) {
64
+
65
+ if ( onError ) {
66
+
67
+ onError( e );
68
+
69
+ } else {
70
+
71
+ console.error( e );
72
+
73
+ }
74
+
75
+ scope.manager.itemError( url );
76
+
77
+ }
78
+
79
+ }, onProgress, onError );
80
+
81
+ }
82
+
83
+ /**
84
+ * Parses the given fixed-width `.splat` data.
85
+ *
86
+ * @param {ArrayBuffer} buffer - The raw `.splat` file as an array buffer.
87
+ * @return {BufferGeometry} The parsed splat geometry.
88
+ */
89
+ parse( buffer ) {
90
+
91
+ if ( buffer.byteLength % ROW_SIZE_BYTES !== 0 ) {
92
+
93
+ throw new Error( 'THREE.SPLATLoader: Invalid .splat byte length.' );
94
+
95
+ }
96
+
97
+ const count = buffer.byteLength / ROW_SIZE_BYTES;
98
+ const centers = new Float32Array( count * 3 );
99
+ const covariances = new Float32Array( count * 6 );
100
+ const colors = new Uint8Array( count * 4 );
101
+ const view = new DataView( buffer );
102
+ const bytes = new Uint8Array( buffer );
103
+
104
+ for ( let i = 0; i < count; i ++ ) {
105
+
106
+ const rowOffset = i * ROW_SIZE_BYTES;
107
+ const i3 = i * 3;
108
+ const i4 = i * 4;
109
+
110
+ centers[ i3 ] = view.getFloat32( rowOffset, true );
111
+ centers[ i3 + 1 ] = view.getFloat32( rowOffset + 4, true );
112
+ centers[ i3 + 2 ] = view.getFloat32( rowOffset + 8, true );
113
+
114
+ const sx = view.getFloat32( rowOffset + 12, true );
115
+ const sy = view.getFloat32( rowOffset + 16, true );
116
+ const sz = view.getFloat32( rowOffset + 20, true );
117
+
118
+ colors[ i4 ] = bytes[ rowOffset + 24 ];
119
+ colors[ i4 + 1 ] = bytes[ rowOffset + 25 ];
120
+ colors[ i4 + 2 ] = bytes[ rowOffset + 26 ];
121
+ colors[ i4 + 3 ] = bytes[ rowOffset + 27 ];
122
+
123
+ // Standard .splat stores quaternion bytes as w, x, y, z.
124
+ const qw = ( bytes[ rowOffset + 28 ] - 128 ) / 128;
125
+ const qx = ( bytes[ rowOffset + 29 ] - 128 ) / 128;
126
+ const qy = ( bytes[ rowOffset + 30 ] - 128 ) / 128;
127
+ const qz = ( bytes[ rowOffset + 31 ] - 128 ) / 128;
128
+
129
+ writeCovariance( covariances, i * 6, sx, sy, sz, qx, qy, qz, qw );
130
+
131
+ }
132
+
133
+ return createGaussianSplatGeometry( centers, covariances, colors );
134
+
135
+ }
136
+
137
+ }
138
+
139
+ export { SPLATLoader };
@@ -0,0 +1,561 @@
1
+ import {
2
+ DataUtils,
3
+ FileLoader,
4
+ Loader
5
+ } from '@gnsx/three';
6
+
7
+ import { gunzipSync } from '../libs/fflate.module.js';
8
+ import { ZSTDDecoder } from '../libs/zstddec.module.js';
9
+ import { SH_BAND_COMPONENTS, SH_BAND_WORDS, SH_C0, createGaussianSplatGeometry, createPackedSphericalHarmonicsBand, writeCovariance } from '../utils/GaussianSplatUtils.js';
10
+
11
+ const SPZ_MAGIC = 0x5053474e;
12
+ const HEADER_SIZE_BYTES = 16;
13
+ const SPZ_COLOR_SCALE = SH_C0 / 0.15;
14
+ const FLAG_LOD = 0x80;
15
+ const FLAG_HAS_EXTENSIONS = 0x02;
16
+ const MAX_SUPPORTED_SH_DEGREE = 3;
17
+ const SH_DEGREE_TO_VECTORS = [ 0, 3, 8, 15, 24 ];
18
+
19
+ let _zstd;
20
+
21
+ // Scales and colors are stored as single bytes, so all 256 possible outputs
22
+ // of their decode functions can be precomputed once.
23
+ const SCALE_LUT = new Float32Array( 256 );
24
+ const COLOR_LUT = new Uint8ClampedArray( 256 );
25
+
26
+ for ( let i = 0; i < 256; i ++ ) {
27
+
28
+ SCALE_LUT[ i ] = Math.exp( i / 16 - 10 );
29
+ COLOR_LUT[ i ] = ( ( i / 255 - 0.5 ) * SPZ_COLOR_SCALE + 0.5 ) * 255;
30
+
31
+ }
32
+
33
+ // Quaternion components are 10-bit sign-magnitude values (bit 9 is the sign,
34
+ // bits 0-8 are the magnitude scaled to [0, 1/sqrt(2)]), so all 1024 possible
35
+ // decoded values can be precomputed, avoiding an unpredictable sign branch in
36
+ // the hot loop.
37
+ const QUAT_COMPONENT_LUT = new Float64Array( 1024 );
38
+
39
+ for ( let i = 0; i < 1024; i ++ ) {
40
+
41
+ const value = Math.SQRT1_2 * ( ( i & 511 ) / 511 );
42
+ QUAT_COMPONENT_LUT[ i ] = ( i & 512 ) !== 0 ? - value : value;
43
+
44
+ }
45
+
46
+ const _quaternion = [ 0, 0, 0, 0 ];
47
+
48
+ /**
49
+ * A loader for compressed Gaussian splat `.spz` files.
50
+ *
51
+ * This loader decodes the format into `BufferGeometry` for use with
52
+ * `GaussianSplat`. Higher-order spherical harmonics are exposed as optional
53
+ * `sphericalHarmonics1` through `sphericalHarmonics3` packed uint32 geometry
54
+ * attributes (`SH_BAND_WORDS[ degree ]` words per splat). Coefficients use the
55
+ * clamped-byte encoding `( value - 128 ) / 128`, four bytes per word.
56
+ *
57
+ * ```js
58
+ * const loader = new SPZLoader();
59
+ * const data = await loader.loadAsync( './models/gsplat/example.spz' );
60
+ * scene.add( new GaussianSplat( data ) );
61
+ * ```
62
+ *
63
+ * @augments Loader
64
+ * @three_import import { SPZLoader } from 'three/addons/loaders/SPZLoader.js';
65
+ */
66
+ class SPZLoader extends Loader {
67
+
68
+ /**
69
+ * Constructs a new Gaussian splat SPZ loader.
70
+ *
71
+ * @param {LoadingManager} [manager] - The loading manager.
72
+ */
73
+ constructor( manager ) {
74
+
75
+ super( manager );
76
+
77
+ }
78
+
79
+ /**
80
+ * Starts loading from the given URL and passes the loaded splat data to
81
+ * the `onLoad()` callback.
82
+ *
83
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
84
+ * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
85
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
86
+ * @param {onErrorCallback} onError - Executed when errors occur.
87
+ */
88
+ load( url, onLoad, onProgress, onError ) {
89
+
90
+ const scope = this;
91
+
92
+ const loader = new FileLoader( this.manager );
93
+ loader.setPath( this.path );
94
+ loader.setResponseType( 'arraybuffer' );
95
+ loader.setRequestHeader( this.requestHeader );
96
+ loader.setWithCredentials( this.withCredentials );
97
+ loader.load( url, function ( buffer ) {
98
+
99
+ scope.parse( buffer, onLoad, function ( e ) {
100
+
101
+ if ( onError ) {
102
+
103
+ onError( e );
104
+
105
+ } else {
106
+
107
+ console.error( e );
108
+
109
+ }
110
+
111
+ scope.manager.itemError( url );
112
+
113
+ } );
114
+
115
+ }, onProgress, onError );
116
+
117
+ }
118
+
119
+ /**
120
+ * Decompresses and parses the given `.spz` data.
121
+ *
122
+ * @param {ArrayBuffer} buffer - The raw SPZ file as an array buffer.
123
+ * @param {function(BufferGeometry)} [onLoad] - Executed when the parsing process has been finished.
124
+ * @param {onErrorCallback} [onError] - Executed when errors occur.
125
+ * @return {BufferGeometry|Promise<BufferGeometry>|undefined} The parsed splat geometry, or a promise for SPZ v4 data.
126
+ */
127
+ parse( buffer, onLoad, onError ) {
128
+
129
+ try {
130
+
131
+ if ( buffer.byteLength >= 8 ) {
132
+
133
+ const view = new DataView( buffer );
134
+ const magic = view.getUint32( 0, true );
135
+ const version = view.getUint32( 4, true );
136
+
137
+ if ( magic === SPZ_MAGIC ) {
138
+
139
+ if ( version !== 4 ) {
140
+
141
+ throw new Error( `THREE.SPZLoader: SPZ version ${ version } is not supported.` );
142
+
143
+ }
144
+
145
+ const promise = getZSTDDecoder()
146
+ .then( ( zstd ) => this.parseRawSPZV4( new Uint8Array( buffer ), zstd ) );
147
+
148
+ if ( onLoad !== undefined ) {
149
+
150
+ promise.then( onLoad ).catch( onError );
151
+
152
+ }
153
+
154
+ return promise;
155
+
156
+ }
157
+
158
+ }
159
+
160
+ const decompressed = gunzipSync( new Uint8Array( buffer ) );
161
+ const data = this.parseRawSPZ( decompressed );
162
+
163
+ if ( onLoad !== undefined ) onLoad( data );
164
+
165
+ return data;
166
+
167
+ } catch ( e ) {
168
+
169
+ if ( onError !== undefined ) {
170
+
171
+ onError( e );
172
+ return;
173
+
174
+ }
175
+
176
+ throw e;
177
+
178
+ }
179
+
180
+ }
181
+
182
+ /**
183
+ * Parses raw SPZ data after gzip decompression.
184
+ *
185
+ * @param {Uint8Array} bytes - The decompressed SPZ data.
186
+ * @return {BufferGeometry} The parsed splat geometry.
187
+ */
188
+ parseRawSPZ( bytes ) {
189
+
190
+ if ( bytes.byteLength < HEADER_SIZE_BYTES ) {
191
+
192
+ throw new Error( 'THREE.SPZLoader: Invalid SPZ header.' );
193
+
194
+ }
195
+
196
+ const view = new DataView( bytes.buffer, bytes.byteOffset, bytes.byteLength );
197
+ const magic = view.getUint32( 0, true );
198
+ const version = view.getUint32( 4, true );
199
+ const count = view.getUint32( 8, true );
200
+ const storedShDegree = view.getUint8( 12 );
201
+ const fractionalBits = view.getUint8( 13 );
202
+ const flags = view.getUint8( 14 );
203
+
204
+ if ( magic !== SPZ_MAGIC ) {
205
+
206
+ throw new Error( 'THREE.SPZLoader: Invalid SPZ magic.' );
207
+
208
+ }
209
+
210
+ if ( version < 1 || version > 3 ) {
211
+
212
+ throw new Error( `THREE.SPZLoader: SPZ version ${ version } is not supported.` );
213
+
214
+ }
215
+
216
+ if ( storedShDegree >= SH_DEGREE_TO_VECTORS.length ) {
217
+
218
+ throw new Error( `THREE.SPZLoader: Unsupported SPZ spherical harmonics degree ${ storedShDegree }.` );
219
+
220
+ }
221
+
222
+ // Data beyond the supported degree is still present in the file and
223
+ // accounted for below, it's just not decoded into an attribute.
224
+ const shDegree = Math.min( storedShDegree, MAX_SUPPORTED_SH_DEGREE );
225
+
226
+ const positionsSize = count * 3 * ( version === 1 ? 2 : 3 );
227
+ const rotationsSize = count * ( version === 3 ? 4 : 3 );
228
+ const shSize = count * SH_DEGREE_TO_VECTORS[ storedShDegree ] * 3;
229
+ const lodSize = ( flags & FLAG_LOD ) !== 0 ? count * 6 : 0;
230
+ const expectedSize = HEADER_SIZE_BYTES + positionsSize + count + count * 3 + count * 3 + rotationsSize + shSize + lodSize;
231
+
232
+ if ( bytes.byteLength !== expectedSize ) {
233
+
234
+ throw new Error( 'THREE.SPZLoader: Invalid SPZ byte length.' );
235
+
236
+ }
237
+
238
+ let offset = HEADER_SIZE_BYTES;
239
+ const positions = bytes.subarray( offset, offset + positionsSize );
240
+ offset += positionsSize;
241
+ const alphas = bytes.subarray( offset, offset + count );
242
+ offset += count;
243
+ const colors = bytes.subarray( offset, offset + count * 3 );
244
+ offset += count * 3;
245
+ const scales = bytes.subarray( offset, offset + count * 3 );
246
+ offset += count * 3;
247
+ const rotations = bytes.subarray( offset, offset + rotationsSize );
248
+ offset += rotationsSize;
249
+ const sphericalHarmonics = bytes.subarray( offset, offset + shSize );
250
+
251
+ return parseSPZAttributes( {
252
+ positions,
253
+ alphas,
254
+ colors,
255
+ scales,
256
+ rotations,
257
+ sphericalHarmonics,
258
+ count,
259
+ version,
260
+ fractionalBits,
261
+ shDegree,
262
+ storedShDegree
263
+ } );
264
+
265
+ }
266
+
267
+ /**
268
+ * Parses raw SPZ v4 data.
269
+ *
270
+ * @param {Uint8Array} bytes - The raw SPZ v4 data.
271
+ * @param {ZSTDDecoder} zstd - The initialized ZSTD decoder.
272
+ * @return {BufferGeometry} The parsed splat geometry.
273
+ */
274
+ parseRawSPZV4( bytes, zstd ) {
275
+
276
+ const view = new DataView( bytes.buffer, bytes.byteOffset, bytes.byteLength );
277
+ const count = view.getUint32( 8, true );
278
+ const storedShDegree = view.getUint8( 12 );
279
+ const shDegree = Math.min( storedShDegree, MAX_SUPPORTED_SH_DEGREE );
280
+ const fractionalBits = view.getUint8( 13 );
281
+ const flags = view.getUint8( 14 );
282
+ const numStreams = view.getUint8( 15 );
283
+ const tocByteOffset = view.getUint32( 16, true );
284
+
285
+ if ( ( flags & FLAG_HAS_EXTENSIONS ) !== 0 ) {
286
+
287
+ console.warn( 'THREE.SPZLoader: SPZ vendor extensions are not supported and will be skipped.' );
288
+
289
+ }
290
+
291
+ const positionsSize = count * 3 * 3;
292
+ const rotationsSize = count * 4;
293
+ const shSize = count * SH_DEGREE_TO_VECTORS[ storedShDegree ] * 3;
294
+ const streamSizes = [ positionsSize, count, count * 3, count * 3, rotationsSize, shSize ];
295
+ const toc = [];
296
+ let compressedOffset = tocByteOffset + numStreams * 16;
297
+
298
+ for ( let i = 0; i < numStreams; i ++ ) {
299
+
300
+ const entryOffset = tocByteOffset + i * 16;
301
+ const compressedSize = Number( view.getBigUint64( entryOffset, true ) );
302
+ toc.push( {
303
+ compressedOffset,
304
+ compressedSize
305
+ } );
306
+ compressedOffset += compressedSize;
307
+
308
+ }
309
+
310
+ const streams = [];
311
+ let streamIndex = 0;
312
+
313
+ for ( let i = 0; i < streamSizes.length; i ++ ) {
314
+
315
+ const streamSize = streamSizes[ i ];
316
+
317
+ if ( streamSize === 0 ) {
318
+
319
+ streams.push( new Uint8Array() );
320
+ continue;
321
+
322
+ }
323
+
324
+ const stream = toc[ streamIndex ++ ];
325
+ const compressed = bytes.subarray( stream.compressedOffset, stream.compressedOffset + stream.compressedSize );
326
+ streams.push( zstd.decode( compressed, streamSize ) );
327
+
328
+ }
329
+
330
+ return parseSPZAttributes( {
331
+ positions: streams[ 0 ],
332
+ alphas: streams[ 1 ],
333
+ colors: streams[ 2 ],
334
+ scales: streams[ 3 ],
335
+ rotations: streams[ 4 ],
336
+ sphericalHarmonics: streams[ 5 ],
337
+ count,
338
+ version: 4,
339
+ fractionalBits,
340
+ shDegree,
341
+ storedShDegree
342
+ } );
343
+
344
+ }
345
+
346
+ }
347
+
348
+ function getZSTDDecoder() {
349
+
350
+ if ( _zstd === undefined ) {
351
+
352
+ const decoder = new ZSTDDecoder();
353
+ _zstd = decoder.init().then( () => decoder ).catch( ( e ) => {
354
+
355
+ _zstd = undefined;
356
+ throw e;
357
+
358
+ } );
359
+
360
+ }
361
+
362
+ return _zstd;
363
+
364
+ }
365
+
366
+ function parseSPZAttributes( {
367
+ positions,
368
+ alphas,
369
+ colors,
370
+ scales,
371
+ rotations,
372
+ sphericalHarmonics,
373
+ count,
374
+ version,
375
+ fractionalBits,
376
+ shDegree,
377
+ storedShDegree
378
+ } ) {
379
+
380
+ const centers = new Float32Array( count * 3 );
381
+ const covariances = new Float32Array( count * 6 );
382
+ const colorBytes = new Uint8ClampedArray( count * 4 );
383
+ const sphericalHarmonicsBands = {};
384
+
385
+ readCenters( positions, centers, 0, count, version, fractionalBits );
386
+
387
+ // The hot loop below avoids per-splat DataView reads by indexing into an
388
+ // aligned Uint32Array. When the rotation section is already 4-byte aligned
389
+ // (e.g. a freshly decoded ZSTD stream) it's read in place; otherwise it's
390
+ // copied into a new, aligned buffer first.
391
+ const packedRotations = version >= 3 ?
392
+ ( rotations.byteOffset % 4 === 0 ?
393
+ new Uint32Array( rotations.buffer, rotations.byteOffset, count ) :
394
+ new Uint32Array( rotations.buffer.slice( rotations.byteOffset, rotations.byteOffset + count * 4 ) ) ) :
395
+ null;
396
+
397
+ const quaternion = _quaternion;
398
+
399
+ for ( let i = 0; i < count; i ++ ) {
400
+
401
+ const i3 = i * 3;
402
+ const i4 = i * 4;
403
+ const sx = SCALE_LUT[ scales[ i3 ] ];
404
+ const sy = SCALE_LUT[ scales[ i3 + 1 ] ];
405
+ const sz = SCALE_LUT[ scales[ i3 + 2 ] ];
406
+
407
+ if ( version >= 3 ) {
408
+
409
+ readSmallestThreeQuaternion( packedRotations[ i ], quaternion );
410
+
411
+ } else {
412
+
413
+ readXYZQuaternion( rotations, i3, quaternion );
414
+
415
+ }
416
+
417
+ writeCovariance( covariances, i * 6, sx, sy, sz, quaternion[ 0 ], quaternion[ 1 ], quaternion[ 2 ], quaternion[ 3 ] );
418
+
419
+ colorBytes[ i4 ] = COLOR_LUT[ colors[ i3 ] ];
420
+ colorBytes[ i4 + 1 ] = COLOR_LUT[ colors[ i3 + 1 ] ];
421
+ colorBytes[ i4 + 2 ] = COLOR_LUT[ colors[ i3 + 2 ] ];
422
+ colorBytes[ i4 + 3 ] = alphas[ i ];
423
+
424
+ }
425
+
426
+ readSphericalHarmonics( sphericalHarmonics, 0, count, shDegree, sphericalHarmonicsBands, storedShDegree );
427
+
428
+ return createGaussianSplatGeometry( centers, covariances, colorBytes, sphericalHarmonicsBands );
429
+
430
+ }
431
+
432
+ function readSphericalHarmonics( bytes, offset, count, degree, sphericalHarmonics, storedDegree = degree ) {
433
+
434
+ if ( degree === 0 ) return;
435
+
436
+ const bands = [];
437
+
438
+ for ( let band = 1; band <= degree; band ++ ) {
439
+
440
+ const packed = createPackedSphericalHarmonicsBand( count, band );
441
+ sphericalHarmonics[ `sh${ band }` ] = packed.packed;
442
+ bands.push( {
443
+ bytes: packed.bytes,
444
+ components: SH_BAND_COMPONENTS[ band ],
445
+ stride: SH_BAND_WORDS[ band ] * 4
446
+ } );
447
+
448
+ }
449
+
450
+ const sourceStride = SH_DEGREE_TO_VECTORS[ storedDegree ] * 3;
451
+
452
+ for ( let i = 0; i < count; i ++ ) {
453
+
454
+ const sourceOffset = offset + i * sourceStride;
455
+ let bandOffset = sourceOffset;
456
+
457
+ for ( let bandIndex = 0; bandIndex < bands.length; bandIndex ++ ) {
458
+
459
+ const band = bands[ bandIndex ];
460
+ const targetOffset = i * band.stride;
461
+
462
+ for ( let j = 0; j < band.components; j ++ ) {
463
+
464
+ band.bytes[ targetOffset + j ] = bytes[ bandOffset ++ ];
465
+
466
+ }
467
+
468
+ }
469
+
470
+ }
471
+
472
+ }
473
+
474
+ function readCenters( bytes, centers, offset, count, version, fractionalBits ) {
475
+
476
+ if ( version === 1 ) {
477
+
478
+ for ( let i = 0; i < count; i ++ ) {
479
+
480
+ const i3 = i * 3;
481
+ const rowOffset = offset + i3 * 2;
482
+
483
+ centers[ i3 ] = DataUtils.fromHalfFloat( bytes[ rowOffset ] | ( bytes[ rowOffset + 1 ] << 8 ) );
484
+ centers[ i3 + 1 ] = DataUtils.fromHalfFloat( bytes[ rowOffset + 2 ] | ( bytes[ rowOffset + 3 ] << 8 ) );
485
+ centers[ i3 + 2 ] = DataUtils.fromHalfFloat( bytes[ rowOffset + 4 ] | ( bytes[ rowOffset + 5 ] << 8 ) );
486
+
487
+ }
488
+
489
+ return;
490
+
491
+ }
492
+
493
+ const fixedScale = 1 / ( 1 << fractionalBits );
494
+
495
+ for ( let i = 0; i < count; i ++ ) {
496
+
497
+ const i3 = i * 3;
498
+ const rowOffset = offset + i * 9;
499
+
500
+ centers[ i3 ] = readInt24( bytes, rowOffset ) * fixedScale;
501
+ centers[ i3 + 1 ] = readInt24( bytes, rowOffset + 3 ) * fixedScale;
502
+ centers[ i3 + 2 ] = readInt24( bytes, rowOffset + 6 ) * fixedScale;
503
+
504
+ }
505
+
506
+ }
507
+
508
+ function readInt24( bytes, offset ) {
509
+
510
+ // The left shift by 8 followed by an arithmetic right shift sign-extends
511
+ // the 24-bit value.
512
+ return ( ( bytes[ offset ] << 8 ) | ( bytes[ offset + 1 ] << 16 ) | ( bytes[ offset + 2 ] << 24 ) ) >> 8;
513
+
514
+ }
515
+
516
+ function readXYZQuaternion( bytes, offset, target ) {
517
+
518
+ const qx = bytes[ offset ] / 127.5 - 1;
519
+ const qy = bytes[ offset + 1 ] / 127.5 - 1;
520
+ const qz = bytes[ offset + 2 ] / 127.5 - 1;
521
+
522
+ target[ 0 ] = qx;
523
+ target[ 1 ] = qy;
524
+ target[ 2 ] = qz;
525
+ target[ 3 ] = Math.sqrt( Math.max( 0, 1 - qx * qx - qy * qy - qz * qz ) );
526
+
527
+ }
528
+
529
+ function readSmallestThreeQuaternion( packed, target ) {
530
+
531
+ const largestIndex = packed >>> 30;
532
+
533
+ // The three smallest components are packed from the lowest bits upward,
534
+ // filling the non-largest indices in descending order: the low 10 bits go
535
+ // to the highest remaining index, the top 10 bits to the lowest.
536
+ const a = QUAT_COMPONENT_LUT[ packed & 1023 ];
537
+ const b = QUAT_COMPONENT_LUT[ ( packed >>> 10 ) & 1023 ];
538
+ const c = QUAT_COMPONENT_LUT[ ( packed >>> 20 ) & 1023 ];
539
+
540
+ switch ( largestIndex ) {
541
+
542
+ case 0:
543
+ target[ 1 ] = c; target[ 2 ] = b; target[ 3 ] = a;
544
+ break;
545
+ case 1:
546
+ target[ 0 ] = c; target[ 2 ] = b; target[ 3 ] = a;
547
+ break;
548
+ case 2:
549
+ target[ 0 ] = c; target[ 1 ] = b; target[ 3 ] = a;
550
+ break;
551
+ default:
552
+ target[ 0 ] = c; target[ 1 ] = b; target[ 2 ] = a;
553
+ break;
554
+
555
+ }
556
+
557
+ target[ largestIndex ] = Math.sqrt( Math.max( 0, 1 - ( a * a + b * b + c * c ) ) );
558
+
559
+ }
560
+
561
+ export { SPZLoader };