@gnsx/three 0.185.16 → 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 (418) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1309 -807
  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/src/utils.js +6 -79
  411. package/build/three.core.min.js +0 -6
  412. package/build/three.module.min.js +0 -6
  413. package/build/three.tsl.min.js +0 -6
  414. package/build/three.webgpu.min.js +0 -6
  415. package/build/three.webgpu.nodes.min.js +0 -6
  416. package/examples/jsm/libs/ecsy.module.js +0 -1792
  417. package/examples/jsm/loaders/LottieLoader.js +0 -130
  418. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -0,0 +1,463 @@
1
+ import {
2
+ DataUtils,
3
+ FileLoader,
4
+ Loader
5
+ } from '@gnsx/three';
6
+
7
+ import { SH_BAND_COMPONENTS, SH_BAND_WORDS, createGaussianSplatGeometry, createPackedSphericalHarmonicsBand, writeColorBytes, writeCovariance } from '../utils/GaussianSplatUtils.js';
8
+
9
+ const HEADER_SIZE_BYTES = 4096;
10
+ const SECTION_HEADER_SIZE_BYTES = 1024;
11
+ const CURRENT_VERSION_MAJOR = 0;
12
+ const CURRENT_VERSION_MINOR = 1;
13
+ const MAX_SPLATS = 10000000;
14
+ const SH_DEGREE_TO_COMPONENTS = [ 0, 9, 24, 45 ];
15
+ const SH_BAND_INDEX = [
16
+ null,
17
+ [ 0, 3, 6, 1, 4, 7, 2, 5, 8 ],
18
+ [ 9, 14, 19, 10, 15, 20, 11, 16, 21, 12, 17, 22, 13, 18, 23 ],
19
+ [ 24, 31, 38, 25, 32, 39, 26, 33, 40, 27, 34, 41, 28, 35, 42, 29, 36, 43, 30, 37, 44 ]
20
+ ];
21
+ const COMPRESSION_LEVELS = {
22
+ 0: {
23
+ bytesPerCenter: 12,
24
+ bytesPerScale: 12,
25
+ bytesPerRotation: 16,
26
+ bytesPerColor: 4,
27
+ bytesPerSphericalHarmonicsComponent: 4,
28
+ scaleOffsetBytes: 12,
29
+ rotationOffsetBytes: 24,
30
+ colorOffsetBytes: 40,
31
+ scaleRange: 1
32
+ },
33
+ 1: {
34
+ bytesPerCenter: 6,
35
+ bytesPerScale: 6,
36
+ bytesPerRotation: 8,
37
+ bytesPerColor: 4,
38
+ bytesPerSphericalHarmonicsComponent: 2,
39
+ scaleOffsetBytes: 6,
40
+ rotationOffsetBytes: 12,
41
+ colorOffsetBytes: 20,
42
+ scaleRange: 32767
43
+ },
44
+ 2: {
45
+ bytesPerCenter: 6,
46
+ bytesPerScale: 6,
47
+ bytesPerRotation: 8,
48
+ bytesPerColor: 4,
49
+ bytesPerSphericalHarmonicsComponent: 1,
50
+ scaleOffsetBytes: 6,
51
+ rotationOffsetBytes: 12,
52
+ colorOffsetBytes: 20,
53
+ scaleRange: 32767
54
+ }
55
+ };
56
+
57
+ /**
58
+ * A loader for GaussianSplats3D `.ksplat` files.
59
+ *
60
+ * This loader decodes the format into `BufferGeometry` for use with
61
+ * `GaussianSplat`. Higher-order spherical harmonics are exposed as optional
62
+ * `sphericalHarmonics1` through `sphericalHarmonics3` packed uint32 geometry
63
+ * attributes (`SH_BAND_WORDS[ degree ]` words per splat). Coefficients use the
64
+ * clamped-byte encoding `( value - 128 ) / 128`, four bytes per word.
65
+ *
66
+ * ```js
67
+ * const loader = new KSPLATLoader();
68
+ * const data = await loader.loadAsync( './models/gsplat/example.ksplat' );
69
+ * scene.add( new GaussianSplat( data ) );
70
+ * ```
71
+ *
72
+ * @augments Loader
73
+ * @three_import import { KSPLATLoader } from 'three/addons/loaders/KSPLATLoader.js';
74
+ */
75
+ class KSPLATLoader extends Loader {
76
+
77
+ /**
78
+ * Constructs a new Gaussian splat KSPLAT loader.
79
+ *
80
+ * @param {LoadingManager} [manager] - The loading manager.
81
+ */
82
+ constructor( manager ) {
83
+
84
+ super( manager );
85
+
86
+ }
87
+
88
+ /**
89
+ * Starts loading from the given URL and passes the loaded splat data to
90
+ * the `onLoad()` callback.
91
+ *
92
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
93
+ * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
94
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
95
+ * @param {onErrorCallback} onError - Executed when errors occur.
96
+ */
97
+ load( url, onLoad, onProgress, onError ) {
98
+
99
+ const scope = this;
100
+
101
+ const loader = new FileLoader( this.manager );
102
+ loader.setPath( this.path );
103
+ loader.setResponseType( 'arraybuffer' );
104
+ loader.setRequestHeader( this.requestHeader );
105
+ loader.setWithCredentials( this.withCredentials );
106
+ loader.load( url, function ( buffer ) {
107
+
108
+ try {
109
+
110
+ onLoad( scope.parse( buffer ) );
111
+
112
+ } catch ( e ) {
113
+
114
+ if ( onError ) {
115
+
116
+ onError( e );
117
+
118
+ } else {
119
+
120
+ console.error( e );
121
+
122
+ }
123
+
124
+ scope.manager.itemError( url );
125
+
126
+ }
127
+
128
+ }, onProgress, onError );
129
+
130
+ }
131
+
132
+ /**
133
+ * Parses the given `.ksplat` data.
134
+ *
135
+ * @param {ArrayBuffer} buffer - The raw KSPLAT file as an array buffer.
136
+ * @return {BufferGeometry} The parsed splat geometry.
137
+ */
138
+ parse( buffer ) {
139
+
140
+ if ( buffer.byteLength < HEADER_SIZE_BYTES ) {
141
+
142
+ throw new Error( 'THREE.KSPLATLoader: Invalid KSPLAT header.' );
143
+
144
+ }
145
+
146
+ const bytes = new Uint8Array( buffer );
147
+ const view = new DataView( buffer );
148
+ const header = parseHeader( view );
149
+
150
+ if ( header.versionMajor !== CURRENT_VERSION_MAJOR || header.versionMinor < CURRENT_VERSION_MINOR ) {
151
+
152
+ throw new Error( `THREE.KSPLATLoader: Unsupported KSPLAT version ${ header.versionMajor }.${ header.versionMinor }.` );
153
+
154
+ }
155
+
156
+ if ( header.compressionLevel < 0 || header.compressionLevel > 2 ) {
157
+
158
+ throw new Error( `THREE.KSPLATLoader: Unsupported KSPLAT compression level ${ header.compressionLevel }.` );
159
+
160
+ }
161
+
162
+ if ( header.splatCount > MAX_SPLATS ) {
163
+
164
+ throw new Error( `THREE.KSPLATLoader: KSPLAT file contains too many splats (${ header.splatCount }).` );
165
+
166
+ }
167
+
168
+ const sectionHeadersOffset = HEADER_SIZE_BYTES;
169
+ const sectionDataOffset = HEADER_SIZE_BYTES + header.maxSectionCount * SECTION_HEADER_SIZE_BYTES;
170
+
171
+ if ( bytes.byteLength < sectionDataOffset ) {
172
+
173
+ throw new Error( 'THREE.KSPLATLoader: Invalid KSPLAT section headers.' );
174
+
175
+ }
176
+
177
+ const compression = COMPRESSION_LEVELS[ header.compressionLevel ];
178
+ const centers = new Float32Array( header.splatCount * 3 );
179
+ const covariances = new Float32Array( header.splatCount * 6 );
180
+ const colors = new Uint8ClampedArray( header.splatCount * 4 );
181
+ const sphericalHarmonics = {};
182
+ const sphericalHarmonicsBytes = {};
183
+ let splatOffset = 0;
184
+ let sectionBase = sectionDataOffset;
185
+
186
+ for ( let sectionIndex = 0; sectionIndex < header.maxSectionCount; sectionIndex ++ ) {
187
+
188
+ const sectionHeaderOffset = sectionHeadersOffset + sectionIndex * SECTION_HEADER_SIZE_BYTES;
189
+ const section = parseSectionHeader( view, sectionHeaderOffset, compression );
190
+ const shComponents = SH_DEGREE_TO_COMPONENTS[ section.sphericalHarmonicsDegree ];
191
+
192
+ if ( shComponents === undefined ) {
193
+
194
+ throw new Error( `THREE.KSPLATLoader: Unsupported KSPLAT spherical harmonics degree ${ section.sphericalHarmonicsDegree }.` );
195
+
196
+ }
197
+
198
+ const bytesPerSplat = compression.bytesPerCenter + compression.bytesPerScale + compression.bytesPerRotation + compression.bytesPerColor +
199
+ shComponents * compression.bytesPerSphericalHarmonicsComponent;
200
+ const bucketsMetaDataSizeBytes = section.partiallyFilledBucketCount * 4;
201
+ const bucketsStorageSizeBytes = section.bucketStorageSizeBytes * section.bucketCount + bucketsMetaDataSizeBytes;
202
+ const splatDataStorageSizeBytes = bytesPerSplat * section.maxSplatCount;
203
+ const storageSizeBytes = bucketsStorageSizeBytes + splatDataStorageSizeBytes;
204
+
205
+ if ( sectionBase + storageSizeBytes > bytes.byteLength ) {
206
+
207
+ throw new Error( 'THREE.KSPLATLoader: Invalid KSPLAT byte length.' );
208
+
209
+ }
210
+
211
+ if ( section.splatCount > 0 ) {
212
+
213
+ readSection(
214
+ view,
215
+ bytes,
216
+ section,
217
+ compression,
218
+ sectionBase,
219
+ bucketsMetaDataSizeBytes,
220
+ bucketsStorageSizeBytes,
221
+ bytesPerSplat,
222
+ splatOffset,
223
+ centers,
224
+ covariances,
225
+ colors,
226
+ sphericalHarmonics,
227
+ sphericalHarmonicsBytes,
228
+ header
229
+ );
230
+
231
+ splatOffset += section.splatCount;
232
+
233
+ }
234
+
235
+ sectionBase += storageSizeBytes;
236
+
237
+ }
238
+
239
+ if ( splatOffset !== header.splatCount ) {
240
+
241
+ throw new Error( 'THREE.KSPLATLoader: KSPLAT splat count mismatch.' );
242
+
243
+ }
244
+
245
+ return createGaussianSplatGeometry( centers, covariances, colors, sphericalHarmonics );
246
+
247
+ }
248
+
249
+ }
250
+
251
+ function parseHeader( view ) {
252
+
253
+ return {
254
+ versionMajor: view.getUint8( 0 ),
255
+ versionMinor: view.getUint8( 1 ),
256
+ maxSectionCount: view.getUint32( 4, true ),
257
+ sectionCount: view.getUint32( 8, true ),
258
+ maxSplatCount: view.getUint32( 12, true ),
259
+ splatCount: view.getUint32( 16, true ),
260
+ compressionLevel: view.getUint16( 20, true ),
261
+ minSphericalHarmonicsCoeff: view.getFloat32( 36, true ) || - 1.5,
262
+ maxSphericalHarmonicsCoeff: view.getFloat32( 40, true ) || 1.5
263
+ };
264
+
265
+ }
266
+
267
+ function parseSectionHeader( view, offset, compression ) {
268
+
269
+ return {
270
+ splatCount: view.getUint32( offset, true ),
271
+ maxSplatCount: view.getUint32( offset + 4, true ),
272
+ bucketSize: view.getUint32( offset + 8, true ),
273
+ bucketCount: view.getUint32( offset + 12, true ),
274
+ bucketBlockSize: view.getFloat32( offset + 16, true ),
275
+ bucketStorageSizeBytes: view.getUint16( offset + 20, true ),
276
+ compressionScaleRange: view.getUint32( offset + 24, true ) || compression.scaleRange,
277
+ fullBucketCount: view.getUint32( offset + 32, true ),
278
+ partiallyFilledBucketCount: view.getUint32( offset + 36, true ),
279
+ sphericalHarmonicsDegree: view.getUint16( offset + 40, true )
280
+ };
281
+
282
+ }
283
+
284
+ function readSection( view, bytes, section, compression, sectionBase, bucketsMetaDataSizeBytes, bucketsStorageSizeBytes, bytesPerSplat, splatOffset, centers, covariances, colors, sphericalHarmonics, sphericalHarmonicsBytes, header ) {
285
+
286
+ const bucketsBase = sectionBase + bucketsMetaDataSizeBytes;
287
+ const dataBase = sectionBase + bucketsStorageSizeBytes;
288
+ const fullBucketSplats = section.fullBucketCount * section.bucketSize;
289
+ const compressionScaleFactor = section.bucketBlockSize / 2 / section.compressionScaleRange;
290
+ const sphericalHarmonicsOffset = compression.colorOffsetBytes + compression.bytesPerColor;
291
+ let partialBucketIndex = section.fullBucketCount;
292
+ let partialBucketBase = fullBucketSplats;
293
+
294
+ ensureSphericalHarmonics( sphericalHarmonics, sphericalHarmonicsBytes, header.splatCount, section.sphericalHarmonicsDegree );
295
+
296
+ for ( let i = 0; i < section.splatCount; i ++ ) {
297
+
298
+ const bucketIndex = getBucketIndex( view, section, sectionBase, i, fullBucketSplats, partialBucketIndex, partialBucketBase );
299
+
300
+ if ( bucketIndex.partialBucketIndex !== undefined ) {
301
+
302
+ partialBucketIndex = bucketIndex.partialBucketIndex;
303
+ partialBucketBase = bucketIndex.partialBucketBase;
304
+
305
+ }
306
+
307
+ const rowOffset = dataBase + i * bytesPerSplat;
308
+ const outIndex = splatOffset + i;
309
+ const i3 = outIndex * 3;
310
+
311
+ if ( compression.bytesPerCenter === 12 ) {
312
+
313
+ centers[ i3 ] = view.getFloat32( rowOffset, true );
314
+ centers[ i3 + 1 ] = view.getFloat32( rowOffset + 4, true );
315
+ centers[ i3 + 2 ] = view.getFloat32( rowOffset + 8, true );
316
+
317
+ } else {
318
+
319
+ const bucketBase = bucketsBase + bucketIndex.value * section.bucketStorageSizeBytes;
320
+ centers[ i3 ] = ( view.getUint16( rowOffset, true ) - section.compressionScaleRange ) * compressionScaleFactor + view.getFloat32( bucketBase, true );
321
+ centers[ i3 + 1 ] = ( view.getUint16( rowOffset + 2, true ) - section.compressionScaleRange ) * compressionScaleFactor + view.getFloat32( bucketBase + 4, true );
322
+ centers[ i3 + 2 ] = ( view.getUint16( rowOffset + 4, true ) - section.compressionScaleRange ) * compressionScaleFactor + view.getFloat32( bucketBase + 8, true );
323
+
324
+ }
325
+
326
+ const sx = readCompressedFloat( view, rowOffset + compression.scaleOffsetBytes, compression.bytesPerScale );
327
+ const sy = readCompressedFloat( view, rowOffset + compression.scaleOffsetBytes + compression.bytesPerScale / 3, compression.bytesPerScale );
328
+ const sz = readCompressedFloat( view, rowOffset + compression.scaleOffsetBytes + compression.bytesPerScale / 3 * 2, compression.bytesPerScale );
329
+ const qw = readCompressedFloat( view, rowOffset + compression.rotationOffsetBytes, compression.bytesPerRotation );
330
+ const qx = readCompressedFloat( view, rowOffset + compression.rotationOffsetBytes + compression.bytesPerRotation / 4, compression.bytesPerRotation );
331
+ const qy = readCompressedFloat( view, rowOffset + compression.rotationOffsetBytes + compression.bytesPerRotation / 4 * 2, compression.bytesPerRotation );
332
+ const qz = readCompressedFloat( view, rowOffset + compression.rotationOffsetBytes + compression.bytesPerRotation / 4 * 3, compression.bytesPerRotation );
333
+
334
+ writeCovariance( covariances, outIndex * 6, sx, sy, sz, qx, qy, qz, qw );
335
+ writeColorBytes(
336
+ colors,
337
+ outIndex * 4,
338
+ bytes[ rowOffset + compression.colorOffsetBytes ],
339
+ bytes[ rowOffset + compression.colorOffsetBytes + 1 ],
340
+ bytes[ rowOffset + compression.colorOffsetBytes + 2 ],
341
+ bytes[ rowOffset + compression.colorOffsetBytes + 3 ]
342
+ );
343
+
344
+ for ( let degree = 1; degree <= section.sphericalHarmonicsDegree; degree ++ ) {
345
+
346
+ writeKSPLATSphericalHarmonicsBand(
347
+ sphericalHarmonicsBytes[ `sh${ degree }` ],
348
+ outIndex,
349
+ SH_BAND_COMPONENTS[ degree ],
350
+ SH_BAND_WORDS[ degree ] * 4,
351
+ SH_BAND_INDEX[ degree ],
352
+ view,
353
+ rowOffset + sphericalHarmonicsOffset,
354
+ compression.bytesPerSphericalHarmonicsComponent,
355
+ header
356
+ );
357
+
358
+ }
359
+
360
+ }
361
+
362
+ }
363
+
364
+ function ensureSphericalHarmonics( sphericalHarmonics, sphericalHarmonicsBytes, count, degree ) {
365
+
366
+ for ( let i = 1; i <= degree; i ++ ) {
367
+
368
+ if ( sphericalHarmonics[ `sh${ i }` ] === undefined ) {
369
+
370
+ const band = createPackedSphericalHarmonicsBand( count, i );
371
+ sphericalHarmonics[ `sh${ i }` ] = band.packed;
372
+ sphericalHarmonicsBytes[ `sh${ i }` ] = band.bytes;
373
+
374
+ }
375
+
376
+ }
377
+
378
+ }
379
+
380
+ function writeKSPLATSphericalHarmonicsBand( target, index, bandComponents, byteStride, componentIndexes, view, rowOffset, bytesPerComponent, header ) {
381
+
382
+ const targetOffset = index * byteStride;
383
+
384
+ for ( let i = 0; i < bandComponents; i ++ ) {
385
+
386
+ target[ targetOffset + i ] = readCompressedSphericalHarmonic(
387
+ view,
388
+ rowOffset + componentIndexes[ i ] * bytesPerComponent,
389
+ bytesPerComponent,
390
+ header
391
+ ) * 128 + 128;
392
+
393
+ }
394
+
395
+ }
396
+
397
+ function getBucketIndex( view, section, sectionBase, splatIndex, fullBucketSplats, partialBucketIndex, partialBucketBase ) {
398
+
399
+ if ( section.bucketCount === 0 ) {
400
+
401
+ return { value: 0 };
402
+
403
+ }
404
+
405
+ if ( splatIndex < fullBucketSplats ) {
406
+
407
+ return { value: Math.floor( splatIndex / section.bucketSize ) };
408
+
409
+ }
410
+
411
+ while ( partialBucketIndex < section.bucketCount ) {
412
+
413
+ const partialIndex = partialBucketIndex - section.fullBucketCount;
414
+ const bucketLength = view.getUint32( sectionBase + partialIndex * 4, true );
415
+
416
+ if ( splatIndex < partialBucketBase + bucketLength ) {
417
+
418
+ return { value: partialBucketIndex, partialBucketIndex, partialBucketBase };
419
+
420
+ }
421
+
422
+ partialBucketIndex ++;
423
+ partialBucketBase += bucketLength;
424
+
425
+ }
426
+
427
+ throw new Error( 'THREE.KSPLATLoader: Invalid KSPLAT bucket data.' );
428
+
429
+ }
430
+
431
+ function readCompressedFloat( view, offset, bytesPerVector ) {
432
+
433
+ if ( bytesPerVector === 12 || bytesPerVector === 16 ) {
434
+
435
+ return view.getFloat32( offset, true );
436
+
437
+ }
438
+
439
+ return DataUtils.fromHalfFloat( view.getUint16( offset, true ) );
440
+
441
+ }
442
+
443
+ function readCompressedSphericalHarmonic( view, offset, bytesPerComponent, header ) {
444
+
445
+ if ( bytesPerComponent === 4 ) {
446
+
447
+ return view.getFloat32( offset, true );
448
+
449
+ }
450
+
451
+ if ( bytesPerComponent === 2 ) {
452
+
453
+ return DataUtils.fromHalfFloat( view.getUint16( offset, true ) );
454
+
455
+ }
456
+
457
+ const t = view.getUint8( offset ) / 255;
458
+
459
+ return header.minSphericalHarmonicsCoeff + t * ( header.maxSphericalHarmonicsCoeff - header.minSphericalHarmonicsCoeff );
460
+
461
+ }
462
+
463
+ export { KSPLATLoader };