@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,386 @@
1
+ import {
2
+ FileLoader,
3
+ Loader
4
+ } from '@gnsx/three';
5
+
6
+ import { PLYLoader } from './PLYLoader.js';
7
+ import {
8
+ SH_BAND_COMPONENTS,
9
+ SH_BAND_WORDS,
10
+ createGaussianSplatGeometry,
11
+ createPackedSphericalHarmonicsBand,
12
+ sigmoid,
13
+ writeColorBytesFromSH0,
14
+ writeCovariance
15
+ } from '../utils/GaussianSplatUtils.js';
16
+
17
+ // f_rest component count, indexed by spherical harmonics degree.
18
+ const SH_DEGREE_TO_COMPONENTS = [ 0, 9, 24, 45 ];
19
+
20
+ const GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING = {
21
+ scale: [ 'scale_0', 'scale_1', 'scale_2' ],
22
+ rotation: [ 'rot_0', 'rot_1', 'rot_2', 'rot_3' ],
23
+ f_dc: [ 'f_dc_0', 'f_dc_1', 'f_dc_2' ],
24
+ opacity: [ 'opacity' ]
25
+ };
26
+
27
+ // Property names a Gaussian splat PLY must declare in its header. Checked
28
+ // up front against the header text rather than the parsed geometry, since
29
+ // PLYLoader still creates a (garbage-filled) attribute for a custom property
30
+ // name that's missing from the file instead of omitting it.
31
+ const REQUIRED_PLY_PROPERTIES = [
32
+ 'x', 'y', 'z',
33
+ ...GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.scale,
34
+ ...GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.rotation,
35
+ ...GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.f_dc,
36
+ ...GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.opacity
37
+ ];
38
+
39
+ const _headerPattern = /^ply([\s\S]*?)end_header/;
40
+ const _propertyPattern = /^property\s+\S+\s+(\S+)\s*$/;
41
+ const _restPropertyPattern = /^f_rest_\d+$/;
42
+
43
+ /**
44
+ * A loader for Gaussian splat PLY files, e.g. as exported by the original
45
+ * GraphDECO/INRIA 3D Gaussian Splatting implementation.
46
+ *
47
+ * PLY itself is a generic format, so the caller would normally have to know
48
+ * the file's spherical harmonics (SH) degree ahead of time to configure
49
+ * `PLYLoader` with the right custom property mapping before parsing. This
50
+ * loader avoids that by scanning the plain-text PLY header for `f_rest_N`
51
+ * properties first, since SH degree maps to a fixed, closed table of
52
+ * `f_rest` counts (0/9/24/45 -> degree 0/1/2/3), and configuring an
53
+ * internal `PLYLoader` accordingly before converting the result into
54
+ * Gaussian splat geometry.
55
+ *
56
+ * ```js
57
+ * const loader = new GaussianSplatPLYLoader();
58
+ * const geometry = await loader.loadAsync( './models/gsplat/point_cloud.ply' );
59
+ * scene.add( new GaussianSplat( geometry ) );
60
+ * ```
61
+ *
62
+ * @augments Loader
63
+ * @three_import import { GaussianSplatPLYLoader } from 'three/addons/loaders/GaussianSplatPLYLoader.js';
64
+ */
65
+ class GaussianSplatPLYLoader extends Loader {
66
+
67
+ /**
68
+ * Constructs a new Gaussian splat PLY loader.
69
+ *
70
+ * @param {LoadingManager} [manager] - The loading manager.
71
+ */
72
+ constructor( manager ) {
73
+
74
+ super( manager );
75
+
76
+ }
77
+
78
+ /**
79
+ * Starts loading from the given URL and passes the loaded Gaussian splat
80
+ * geometry to the `onLoad()` callback.
81
+ *
82
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
83
+ * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
84
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
85
+ * @param {onErrorCallback} onError - Executed when errors occur.
86
+ */
87
+ load( url, onLoad, onProgress, onError ) {
88
+
89
+ const scope = this;
90
+
91
+ const loader = new FileLoader( this.manager );
92
+ loader.setPath( this.path );
93
+ loader.setResponseType( 'arraybuffer' );
94
+ loader.setRequestHeader( this.requestHeader );
95
+ loader.setWithCredentials( this.withCredentials );
96
+ loader.load( url, function ( data ) {
97
+
98
+ try {
99
+
100
+ onLoad( scope.parse( data ) );
101
+
102
+ } catch ( e ) {
103
+
104
+ if ( onError ) {
105
+
106
+ onError( e );
107
+
108
+ } else {
109
+
110
+ console.error( e );
111
+
112
+ }
113
+
114
+ scope.manager.itemError( url );
115
+
116
+ }
117
+
118
+ }, onProgress, onError );
119
+
120
+ }
121
+
122
+ /**
123
+ * Parses the given Gaussian splat PLY data and returns the resulting
124
+ * Gaussian splat geometry.
125
+ *
126
+ * This scans the PLY header for the file's spherical harmonics degree,
127
+ * so unlike a plain `PLYLoader`, no prior setup is required.
128
+ *
129
+ * @param {ArrayBuffer|string} data - The raw PLY data, as an array buffer or string.
130
+ * @return {BufferGeometry} The parsed Gaussian splat geometry.
131
+ */
132
+ parse( data ) {
133
+
134
+ const degree = detectSphericalHarmonicsDegree( data );
135
+
136
+ const plyLoader = new PLYLoader( this.manager );
137
+ plyLoader.setCustomPropertyNameMapping( getPropertyMapping( degree ) );
138
+
139
+ return convertPLYGeometry( plyLoader.parse( data ) );
140
+
141
+ }
142
+
143
+ }
144
+
145
+ // Scans the PLY header text for its vertex properties, verifying the
146
+ // required Gaussian splat properties are present and mapping the number of
147
+ // "f_rest_N" properties found to a spherical harmonics degree. PLY headers
148
+ // are always plain ASCII text that fully precedes the vertex data, so this
149
+ // can run before the file is parsed by the generic PLYLoader.
150
+ function detectSphericalHarmonicsDegree( data ) {
151
+
152
+ const headerText = typeof data === 'string' ? data : decodeHeaderText( new Uint8Array( data ) );
153
+ const headerMatch = _headerPattern.exec( headerText );
154
+
155
+ if ( headerMatch === null ) {
156
+
157
+ throw new Error( 'THREE.GaussianSplatPLYLoader: Missing PLY header.' );
158
+
159
+ }
160
+
161
+ const propertyNames = new Set();
162
+ let restComponentCount = 0;
163
+
164
+ for ( const line of headerMatch[ 1 ].split( /\r\n|\r|\n/ ) ) {
165
+
166
+ const propertyMatch = _propertyPattern.exec( line.trim() );
167
+
168
+ if ( propertyMatch === null ) continue;
169
+
170
+ propertyNames.add( propertyMatch[ 1 ] );
171
+
172
+ if ( _restPropertyPattern.test( propertyMatch[ 1 ] ) ) restComponentCount ++;
173
+
174
+ }
175
+
176
+ if ( REQUIRED_PLY_PROPERTIES.some( name => ! propertyNames.has( name ) ) ) {
177
+
178
+ throw new Error( 'THREE.GaussianSplatPLYLoader: PLY file requires position, scale, rotation, f_dc and opacity properties.' );
179
+
180
+ }
181
+
182
+ const degree = SH_DEGREE_TO_COMPONENTS.indexOf( restComponentCount );
183
+
184
+ if ( degree === - 1 ) {
185
+
186
+ throw new Error( `THREE.GaussianSplatPLYLoader: Unsupported number of f_rest spherical harmonics coefficients (${ restComponentCount }).` );
187
+
188
+ }
189
+
190
+ return degree;
191
+
192
+ }
193
+
194
+ // Decodes only the bytes up to and including "end_header" as text, falling
195
+ // back to the full buffer if that marker isn't found, so this doesn't pay
196
+ // the cost of decoding the (potentially large) binary vertex data as text.
197
+ function decodeHeaderText( bytes ) {
198
+
199
+ const marker = 'end_header';
200
+ const scanLength = Math.min( bytes.length, 1024 * 1024 );
201
+ let headerEnd = - 1;
202
+
203
+ for ( let i = 0; i <= scanLength - marker.length; i ++ ) {
204
+
205
+ let matches = true;
206
+
207
+ for ( let j = 0; j < marker.length; j ++ ) {
208
+
209
+ if ( bytes[ i + j ] !== marker.charCodeAt( j ) ) {
210
+
211
+ matches = false;
212
+ break;
213
+
214
+ }
215
+
216
+ }
217
+
218
+ if ( matches ) {
219
+
220
+ headerEnd = i + marker.length;
221
+ break;
222
+
223
+ }
224
+
225
+ }
226
+
227
+ const end = headerEnd === - 1 ? bytes.length : headerEnd;
228
+
229
+ return new TextDecoder().decode( bytes.subarray( 0, end ) );
230
+
231
+ }
232
+
233
+ // Builds the PLYLoader custom-property mapping for a given SH degree,
234
+ // grouping the raw "f_rest_N" scalar properties into one combined
235
+ // "f_rest" attribute when the degree calls for it.
236
+ function getPropertyMapping( sphericalHarmonicsDegree ) {
237
+
238
+ const restComponentCount = SH_DEGREE_TO_COMPONENTS[ sphericalHarmonicsDegree ];
239
+
240
+ const mapping = {
241
+ scale: GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.scale,
242
+ rotation: GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.rotation,
243
+ f_dc: GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.f_dc,
244
+ opacity: GAUSSIAN_SPLAT_PLY_PROPERTY_MAPPING.opacity
245
+ };
246
+
247
+ if ( restComponentCount > 0 ) {
248
+
249
+ mapping.f_rest = Array.from( { length: restComponentCount }, ( _, i ) => `f_rest_${ i }` );
250
+
251
+ }
252
+
253
+ return mapping;
254
+
255
+ }
256
+
257
+ // Converts the generic PLYLoader output - using the Gaussian splat custom
258
+ // property mapping above - into Gaussian splat geometry.
259
+ function convertPLYGeometry( geometry ) {
260
+
261
+ const position = geometry.getAttribute( 'position' );
262
+ const scale = geometry.getAttribute( 'scale' );
263
+ const rotation = geometry.getAttribute( 'rotation' );
264
+ const sh0 = geometry.getAttribute( 'f_dc' );
265
+ const shRest = geometry.getAttribute( 'f_rest' );
266
+ const opacity = geometry.getAttribute( 'opacity' );
267
+
268
+ if ( position === undefined || scale === undefined || rotation === undefined || sh0 === undefined || opacity === undefined ) {
269
+
270
+ throw new Error( 'THREE.GaussianSplatPLYLoader: PLY file requires position, scale, rotation, f_dc and opacity properties.' );
271
+
272
+ }
273
+
274
+ const count = position.count;
275
+
276
+ if ( position.itemSize !== 3 || scale.itemSize !== 3 || rotation.itemSize !== 4 || sh0.itemSize !== 3 || opacity.itemSize !== 1 ) {
277
+
278
+ throw new Error( 'THREE.GaussianSplatPLYLoader: Invalid Gaussian splat PLY property itemSize.' );
279
+
280
+ }
281
+
282
+ if ( scale.count !== count || rotation.count !== count || sh0.count !== count || opacity.count !== count ) {
283
+
284
+ throw new Error( 'THREE.GaussianSplatPLYLoader: Gaussian splat PLY property counts must match position.' );
285
+
286
+ }
287
+
288
+ const centers = new Float32Array( count * 3 );
289
+ const covariances = new Float32Array( count * 6 );
290
+ const colors = new Uint8ClampedArray( count * 4 );
291
+ const sphericalHarmonicsDegree = getRestSphericalHarmonicsDegree( shRest );
292
+ const sphericalHarmonics = {};
293
+ const sphericalHarmonicsBytes = {};
294
+
295
+ for ( let degree = 1; degree <= sphericalHarmonicsDegree; degree ++ ) {
296
+
297
+ const band = createPackedSphericalHarmonicsBand( count, degree );
298
+ sphericalHarmonics[ `sh${ degree }` ] = band.packed;
299
+ sphericalHarmonicsBytes[ `sh${ degree }` ] = band.bytes;
300
+
301
+ }
302
+
303
+ for ( let i = 0; i < count; i ++ ) {
304
+
305
+ const i3 = i * 3;
306
+ centers[ i3 ] = position.getX( i );
307
+ centers[ i3 + 1 ] = position.getY( i );
308
+ centers[ i3 + 2 ] = position.getZ( i );
309
+
310
+ const sx = Math.exp( scale.getX( i ) );
311
+ const sy = Math.exp( scale.getY( i ) );
312
+ const sz = Math.exp( scale.getZ( i ) );
313
+
314
+ // GraphDECO/INRIA PLY stores quaternions as rot_0=w, rot_1=x, rot_2=y, rot_3=z.
315
+ const qw = rotation.getX( i );
316
+ const qx = rotation.getY( i );
317
+ const qy = rotation.getZ( i );
318
+ const qz = rotation.getW( i );
319
+
320
+ writeCovariance( covariances, i * 6, sx, sy, sz, qx, qy, qz, qw );
321
+ writeColorBytesFromSH0(
322
+ colors,
323
+ i * 4,
324
+ sh0.getX( i ),
325
+ sh0.getY( i ),
326
+ sh0.getZ( i ),
327
+ sigmoid( opacity.getX( i ) )
328
+ );
329
+
330
+ if ( sphericalHarmonicsDegree > 0 ) {
331
+
332
+ writeSphericalHarmonicsFromRest( sphericalHarmonicsBytes, i, shRest );
333
+
334
+ }
335
+
336
+ }
337
+
338
+ return createGaussianSplatGeometry( centers, covariances, colors, sphericalHarmonics );
339
+
340
+ }
341
+
342
+ function getRestSphericalHarmonicsDegree( shRest ) {
343
+
344
+ if ( shRest === undefined ) return 0;
345
+
346
+ const degree = SH_DEGREE_TO_COMPONENTS.indexOf( shRest.itemSize );
347
+
348
+ if ( degree === - 1 ) {
349
+
350
+ throw new Error( 'THREE.GaussianSplatPLYLoader: Unsupported number of f_rest spherical harmonics coefficients.' );
351
+
352
+ }
353
+
354
+ return degree;
355
+
356
+ }
357
+
358
+ function writeSphericalHarmonicsFromRest( sphericalHarmonicsBytes, index, shRest ) {
359
+
360
+ const stride = shRest.itemSize / 3;
361
+ const source = shRest.array;
362
+ const sourceOffset = index * shRest.itemSize;
363
+
364
+ for ( let degree = 1; degree <= 3; degree ++ ) {
365
+
366
+ const target = sphericalHarmonicsBytes[ `sh${ degree }` ];
367
+
368
+ if ( target === undefined ) break;
369
+
370
+ const bandOffset = degree === 1 ? 0 : degree === 2 ? 3 : 8;
371
+ const byteStride = SH_BAND_WORDS[ degree ] * 4;
372
+ const targetOffset = index * byteStride;
373
+
374
+ for ( let j = 0; j < SH_BAND_COMPONENTS[ degree ]; j ++ ) {
375
+
376
+ const coefficient = Math.floor( j / 3 );
377
+ const channel = j % 3;
378
+ target[ targetOffset + j ] = source[ sourceOffset + bandOffset + coefficient + channel * stride ] * 128 + 128;
379
+
380
+ }
381
+
382
+ }
383
+
384
+ }
385
+
386
+ export { GaussianSplatPLYLoader };