@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
@@ -22,18 +22,16 @@ import { Color } from '../math/Color.js';
22
22
  import { WebGLRenderTarget } from '../renderers/WebGLRenderTarget.js';
23
23
  import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';
24
24
  import { BoxGeometry } from '../geometries/BoxGeometry.js';
25
- import { error, warn } from '../utils.js';
26
25
 
27
26
  const LOD_MIN = 4;
28
27
 
29
- // The standard deviations (radians) associated with the extra mips.
28
+ // The number of extra mips.
30
29
  // Used for scene blur in fromScene() method.
31
- const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];
30
+ const EXTRA_LODS = 6;
32
31
 
33
- // The maximum length of the blur for loop. Smaller sigmas will use fewer
34
- // samples and exit early, but not recompile the shader.
32
+ // The number of spiral samples per blur pass.
35
33
  // Used for scene blur in fromScene() method.
36
- const MAX_SAMPLES = 20;
34
+ const BLUR_SAMPLES = 20;
37
35
 
38
36
  // GGX VNDF importance sampling configuration
39
37
  const GGX_SAMPLES = 256;
@@ -46,6 +44,7 @@ let _oldActiveMipmapLevel = 0;
46
44
  let _oldXrEnabled = false;
47
45
 
48
46
  const _origin = /*@__PURE__*/ new Vector3();
47
+ const _direction = /*@__PURE__*/ new Vector3();
49
48
 
50
49
  /**
51
50
  * This class generates a Prefiltered, Mipmapped Radiance Environment Map
@@ -78,7 +77,6 @@ class PMREMGenerator {
78
77
  this._lodMax = 0;
79
78
  this._cubeSize = 0;
80
79
  this._sizeLods = [];
81
- this._sigmas = [];
82
80
  this._lodMeshes = [];
83
81
 
84
82
  this._backgroundBox = null;
@@ -313,7 +311,7 @@ class PMREMGenerator {
313
311
  this._pingPongRenderTarget = _createRenderTarget( width, height, params );
314
312
 
315
313
  const { _lodMax } = this;
316
- ( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );
314
+ ( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods } = _createPlanes( _lodMax ) );
317
315
 
318
316
  this._blurMaterial = _getBlurShader( _lodMax, width, height );
319
317
  this._ggxMaterial = _getGGXShader( _lodMax, width, height );
@@ -534,7 +532,7 @@ class PMREMGenerator {
534
532
  const incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );
535
533
 
536
534
  // Apply blur strength mapping for better quality across the roughness range
537
- const blurStrength = 0.0 + targetRoughness * 1.25;
535
+ const blurStrength = targetRoughness * 1.25;
538
536
  const adjustedRoughness = incrementalRoughness * blurStrength;
539
537
 
540
538
  // Calculate viewport position based on output LOD level
@@ -564,11 +562,9 @@ class PMREMGenerator {
564
562
  }
565
563
 
566
564
  /**
567
- * This is a two-pass Gaussian blur for a cubemap. Normally this is done
568
- * vertically and horizontally, but this breaks down on a cube. Here we apply
569
- * the blur latitudinally (around the poles), and then longitudinally (towards
570
- * the poles) to approximate the orthogonally-separable blur. It is least
571
- * accurate at the poles, but still does a decent job.
565
+ * This is a two-pass Gaussian blur for a cubemap. Each pass importance-samples
566
+ * the Gaussian along a spiral kernel (Golden Angle), which distributes samples
567
+ * isotropically on the sphere (no pole artifacts).
572
568
  *
573
569
  * Used for initial scene blur in fromScene() method when sigma > 0.
574
570
  *
@@ -577,109 +573,37 @@ class PMREMGenerator {
577
573
  * @param {number} lodIn
578
574
  * @param {number} lodOut
579
575
  * @param {number} sigma
580
- * @param {Vector3} [poleAxis]
581
576
  */
582
- _blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {
577
+ _blur( cubeUVRenderTarget, lodIn, lodOut, sigma ) {
583
578
 
584
579
  const pingPongRenderTarget = this._pingPongRenderTarget;
585
580
 
586
- this._halfBlur(
587
- cubeUVRenderTarget,
588
- pingPongRenderTarget,
589
- lodIn,
590
- lodOut,
591
- sigma,
592
- 'latitudinal',
593
- poleAxis );
594
-
595
- this._halfBlur(
596
- pingPongRenderTarget,
597
- cubeUVRenderTarget,
598
- lodOut,
599
- lodOut,
600
- sigma,
601
- 'longitudinal',
602
- poleAxis );
581
+ // Two passes of sigma / sqrt( 2 ) compose to a blur of sigma while squaring
582
+ // the effective sample count. Sigmas beyond PI are visually indistinguishable
583
+ // from a uniform blur, so clamp to keep the shader math finite.
584
+ const blurSigma = Math.min( sigma, Math.PI ) / Math.SQRT2;
585
+
586
+ this._blurPass( cubeUVRenderTarget, pingPongRenderTarget, lodIn, lodOut, blurSigma );
587
+ this._blurPass( pingPongRenderTarget, cubeUVRenderTarget, lodOut, lodOut, blurSigma );
603
588
 
604
589
  }
605
590
 
606
- _halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {
591
+ _blurPass( targetIn, targetOut, lodIn, lodOut, sigmaRadians ) {
607
592
 
608
593
  const renderer = this._renderer;
609
594
  const blurMaterial = this._blurMaterial;
610
595
 
611
- if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {
612
-
613
- error(
614
- 'blur direction must be either latitudinal or longitudinal!' );
615
-
616
- }
617
-
618
- // Number of standard deviations at which to cut off the discrete approximation.
619
- const STANDARD_DEVIATIONS = 3;
620
-
621
596
  const blurMesh = this._lodMeshes[ lodOut ];
622
597
  blurMesh.material = blurMaterial;
623
598
 
624
599
  const blurUniforms = blurMaterial.uniforms;
625
600
 
626
- const pixels = this._sizeLods[ lodIn ] - 1;
627
- const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );
628
- const sigmaPixels = sigmaRadians / radiansPerPixel;
629
- const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;
630
-
631
- if ( samples > MAX_SAMPLES ) {
632
-
633
- warn( `sigmaRadians, ${
634
- sigmaRadians}, is too large and will clip, as it requested ${
635
- samples} samples when the maximum is set to ${MAX_SAMPLES}` );
636
-
637
- }
638
-
639
- const weights = [];
640
- let sum = 0;
641
-
642
- for ( let i = 0; i < MAX_SAMPLES; ++ i ) {
643
-
644
- const x = i / sigmaPixels;
645
- const weight = Math.exp( - x * x / 2 );
646
- weights.push( weight );
647
-
648
- if ( i === 0 ) {
649
-
650
- sum += weight;
651
-
652
- } else if ( i < samples ) {
653
-
654
- sum += 2 * weight;
655
-
656
- }
657
-
658
- }
659
-
660
- for ( let i = 0; i < weights.length; i ++ ) {
661
-
662
- weights[ i ] = weights[ i ] / sum;
663
-
664
- }
665
-
666
601
  blurUniforms[ 'envMap' ].value = targetIn.texture;
667
- blurUniforms[ 'samples' ].value = samples;
668
- blurUniforms[ 'weights' ].value = weights;
669
- blurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';
670
-
671
- if ( poleAxis ) {
672
-
673
- blurUniforms[ 'poleAxis' ].value = poleAxis;
674
-
675
- }
676
-
677
- const { _lodMax } = this;
678
- blurUniforms[ 'dTheta' ].value = radiansPerPixel;
679
- blurUniforms[ 'mipInt' ].value = _lodMax - lodIn;
602
+ blurUniforms[ 'sigma' ].value = sigmaRadians;
603
+ blurUniforms[ 'mipInt' ].value = this._lodMax - lodIn;
680
604
 
681
605
  const outputSize = this._sizeLods[ lodOut ];
682
- const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );
606
+ const x = 3 * outputSize * ( lodOut > this._lodMax - LOD_MIN ? lodOut - this._lodMax + LOD_MIN : 0 );
683
607
  const y = 4 * ( this._cubeSize - outputSize );
684
608
 
685
609
  _setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );
@@ -695,31 +619,18 @@ class PMREMGenerator {
695
619
  function _createPlanes( lodMax ) {
696
620
 
697
621
  const sizeLods = [];
698
- const sigmas = [];
699
622
  const lodMeshes = [];
700
623
 
701
624
  let lod = lodMax;
702
625
 
703
- const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;
626
+ const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LODS;
704
627
 
705
628
  for ( let i = 0; i < totalLods; i ++ ) {
706
629
 
707
630
  const sizeLod = Math.pow( 2, lod );
708
631
  sizeLods.push( sizeLod );
709
- let sigma = 1.0 / sizeLod;
710
-
711
- if ( i > lodMax - LOD_MIN ) {
712
-
713
- sigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];
714
-
715
- } else if ( i === 0 ) {
716
-
717
- sigma = 0;
718
-
719
- }
720
-
721
- sigmas.push( sigma );
722
632
 
633
+ // UVs overshoot the face by one texel to bake the CubeUV border into the directions.
723
634
  const texelSize = 1.0 / ( sizeLod - 2 );
724
635
  const min = - texelSize;
725
636
  const max = 1 + texelSize;
@@ -728,12 +639,9 @@ function _createPlanes( lodMax ) {
728
639
  const cubeFaces = 6;
729
640
  const vertices = 6;
730
641
  const positionSize = 3;
731
- const uvSize = 2;
732
- const faceIndexSize = 1;
733
642
 
734
643
  const position = new Float32Array( positionSize * vertices * cubeFaces );
735
- const uv = new Float32Array( uvSize * vertices * cubeFaces );
736
- const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );
644
+ const outputDirection = new Float32Array( positionSize * vertices * cubeFaces );
737
645
 
738
646
  for ( let face = 0; face < cubeFaces; face ++ ) {
739
647
 
@@ -748,16 +656,48 @@ function _createPlanes( lodMax ) {
748
656
  x, y + 1, 0
749
657
  ];
750
658
  position.set( coordinates, positionSize * vertices * face );
751
- uv.set( uv1, uvSize * vertices * face );
752
- const fill = [ face, face, face, face, face, face ];
753
- faceIndex.set( fill, faceIndexSize * vertices * face );
659
+
660
+ for ( let vertex = 0; vertex < vertices; vertex ++ ) {
661
+
662
+ const u = uv1[ vertex * 2 ] * 2 - 1;
663
+ const v = uv1[ vertex * 2 + 1 ] * 2 - 1;
664
+
665
+ // RH coordinate system; PMREM face-indexing convention
666
+ if ( face === 0 ) {
667
+
668
+ _direction.set( 1, v, u ); // pos x
669
+
670
+ } else if ( face === 1 ) {
671
+
672
+ _direction.set( - u, 1, - v ); // pos y
673
+
674
+ } else if ( face === 2 ) {
675
+
676
+ _direction.set( - u, v, 1 ); // pos z
677
+
678
+ } else if ( face === 3 ) {
679
+
680
+ _direction.set( - 1, v, - u ); // neg x
681
+
682
+ } else if ( face === 4 ) {
683
+
684
+ _direction.set( - u, - 1, v ); // neg y
685
+
686
+ } else {
687
+
688
+ _direction.set( u, v, - 1 ); // neg z
689
+
690
+ }
691
+
692
+ _direction.toArray( outputDirection, ( face * vertices + vertex ) * positionSize );
693
+
694
+ }
754
695
 
755
696
  }
756
697
 
757
698
  const planes = new BufferGeometry();
758
699
  planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );
759
- planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );
760
- planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );
700
+ planes.setAttribute( 'outputDirection', new BufferAttribute( outputDirection, positionSize ) );
761
701
  lodMeshes.push( new Mesh( planes, null ) );
762
702
 
763
703
  if ( lod > LOD_MIN ) {
@@ -768,7 +708,7 @@ function _createPlanes( lodMax ) {
768
708
 
769
709
  }
770
710
 
771
- return { lodMeshes, sizeLods, sigmas };
711
+ return { lodMeshes, sizeLods };
772
712
 
773
713
  }
774
714
 
@@ -928,14 +868,12 @@ function _getGGXShader( lodMax, width, height ) {
928
868
 
929
869
  function _getBlurShader( lodMax, width, height ) {
930
870
 
931
- const weights = new Float32Array( MAX_SAMPLES );
932
- const poleAxis = new Vector3( 0, 1, 0 );
933
871
  const shaderMaterial = new ShaderMaterial( {
934
872
 
935
873
  name: 'SphericalGaussianBlur',
936
874
 
937
875
  defines: {
938
- 'n': MAX_SAMPLES,
876
+ 'SAMPLES': BLUR_SAMPLES,
939
877
  'CUBEUV_TEXEL_WIDTH': 1.0 / width,
940
878
  'CUBEUV_TEXEL_HEIGHT': 1.0 / height,
941
879
  'CUBEUV_MAX_MIP': `${lodMax}.0`,
@@ -943,75 +881,71 @@ function _getBlurShader( lodMax, width, height ) {
943
881
 
944
882
  uniforms: {
945
883
  'envMap': { value: null },
946
- 'samples': { value: 1 },
947
- 'weights': { value: weights },
948
- 'latitudinal': { value: false },
949
- 'dTheta': { value: 0 },
884
+ 'sigma': { value: 0 },
950
885
  'mipInt': { value: 0 },
951
- 'poleAxis': { value: poleAxis }
952
886
  },
953
887
 
954
888
  vertexShader: _getCommonVertexShader(),
955
889
 
956
890
  fragmentShader: /* glsl */`
957
891
 
958
- precision mediump float;
959
- precision mediump int;
892
+ precision highp float;
893
+ precision highp int;
960
894
 
961
895
  varying vec3 vOutputDirection;
962
896
 
963
897
  uniform sampler2D envMap;
964
- uniform int samples;
965
- uniform float weights[ n ];
966
- uniform bool latitudinal;
967
- uniform float dTheta;
898
+ uniform float sigma;
968
899
  uniform float mipInt;
969
- uniform vec3 poleAxis;
970
900
 
971
901
  #define ENVMAP_TYPE_CUBE_UV
972
902
  #include <cube_uv_reflection_fragment>
973
903
 
974
- vec3 getSample( float theta, vec3 axis ) {
975
-
976
- float cosTheta = cos( theta );
977
- // Rodrigues' axis-angle rotation
978
- vec3 sampleDirection = vOutputDirection * cosTheta
979
- + cross( axis, vOutputDirection ) * sin( theta )
980
- + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );
981
-
982
- return bilinearCubeUV( envMap, sampleDirection, mipInt );
983
-
984
- }
904
+ #define PI 3.14159265359
905
+ #define GOLDEN_ANGLE 2.39996322973
985
906
 
986
907
  void main() {
987
908
 
988
- vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );
989
-
990
- if ( all( equal( axis, vec3( 0.0 ) ) ) ) {
909
+ if ( sigma == 0.0 ) {
991
910
 
992
- axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );
911
+ gl_FragColor = vec4( bilinearCubeUV( envMap, vOutputDirection, mipInt ), 1.0 );
912
+ return;
993
913
 
994
914
  }
995
915
 
996
- axis = normalize( axis );
916
+ vec3 outputDirection = normalize( vOutputDirection );
997
917
 
998
- gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );
999
- gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );
918
+ vec3 up = abs( outputDirection.z ) < 0.999 ? vec3( 0.0, 0.0, 1.0 ) : vec3( 1.0, 0.0, 0.0 );
919
+ vec3 tangent = normalize( cross( up, outputDirection ) );
920
+ vec3 bitangent = cross( outputDirection, tangent );
1000
921
 
1001
- for ( int i = 1; i < n; i++ ) {
922
+ // Truncate the kernel at three standard deviations or at the antipode.
923
+ float thetaMax = min( 3.0 * sigma, PI );
924
+ float truncation = 1.0 - exp( - 0.5 * thetaMax * thetaMax / ( sigma * sigma ) );
1002
925
 
1003
- if ( i >= samples ) {
926
+ vec3 accumColor = vec3( 0.0 );
927
+ float accumWeight = 0.0;
1004
928
 
1005
- break;
929
+ for ( int i = 0; i < SAMPLES; i ++ ) {
1006
930
 
1007
- }
931
+ // Stratified inverse-CDF sampling of the Gaussian, placed on a golden-angle spiral.
932
+ float stratum = ( float( i ) + 0.5 ) / float( SAMPLES );
933
+ float theta = sigma * sqrt( - 2.0 * log( 1.0 - stratum * truncation ) );
934
+ float phi = float( i ) * GOLDEN_ANGLE;
1008
935
 
1009
- float theta = dTheta * float( i );
1010
- gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );
1011
- gl_FragColor.rgb += weights[ i ] * getSample( theta, axis );
936
+ vec3 offset = cos( phi ) * tangent + sin( phi ) * bitangent;
937
+ vec3 sampleDirection = cos( theta ) * outputDirection + sin( theta ) * offset;
938
+
939
+ // Correct the planar sample density to solid angle.
940
+ float weight = sin( theta ) / theta;
941
+
942
+ accumColor += weight * bilinearCubeUV( envMap, sampleDirection, mipInt );
943
+ accumWeight += weight;
1012
944
 
1013
945
  }
1014
946
 
947
+ gl_FragColor = vec4( accumColor / accumWeight, 1.0 );
948
+
1015
949
  }
1016
950
  `,
1017
951
 
@@ -1112,53 +1046,13 @@ function _getCommonVertexShader() {
1112
1046
  precision mediump float;
1113
1047
  precision mediump int;
1114
1048
 
1115
- attribute float faceIndex;
1049
+ attribute vec3 outputDirection;
1116
1050
 
1117
1051
  varying vec3 vOutputDirection;
1118
1052
 
1119
- // RH coordinate system; PMREM face-indexing convention
1120
- vec3 getDirection( vec2 uv, float face ) {
1121
-
1122
- uv = 2.0 * uv - 1.0;
1123
-
1124
- vec3 direction = vec3( uv, 1.0 );
1125
-
1126
- if ( face == 0.0 ) {
1127
-
1128
- direction = direction.zyx; // ( 1, v, u ) pos x
1129
-
1130
- } else if ( face == 1.0 ) {
1131
-
1132
- direction = direction.xzy;
1133
- direction.xz *= -1.0; // ( -u, 1, -v ) pos y
1134
-
1135
- } else if ( face == 2.0 ) {
1136
-
1137
- direction.x *= -1.0; // ( -u, v, 1 ) pos z
1138
-
1139
- } else if ( face == 3.0 ) {
1140
-
1141
- direction = direction.zyx;
1142
- direction.xz *= -1.0; // ( -1, v, -u ) neg x
1143
-
1144
- } else if ( face == 4.0 ) {
1145
-
1146
- direction = direction.xzy;
1147
- direction.xy *= -1.0; // ( -u, -1, v ) neg y
1148
-
1149
- } else if ( face == 5.0 ) {
1150
-
1151
- direction.z *= -1.0; // ( u, v, -1 ) neg z
1152
-
1153
- }
1154
-
1155
- return direction;
1156
-
1157
- }
1158
-
1159
1053
  void main() {
1160
1054
 
1161
- vOutputDirection = getDirection( uv, faceIndex );
1055
+ vOutputDirection = outputDirection;
1162
1056
  gl_Position = vec4( position, 1.0 );
1163
1057
 
1164
1058
  }
@@ -152,7 +152,7 @@ class TorusGeometry extends BufferGeometry {
152
152
  */
153
153
  static fromJSON( data ) {
154
154
 
155
- return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );
155
+ return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc, data.thetaStart, data.thetaLength );
156
156
 
157
157
  }
158
158
 
@@ -159,6 +159,8 @@ class ArrowHelper extends Object3D {
159
159
  */
160
160
  dispose() {
161
161
 
162
+ super.dispose();
163
+
162
164
  this.line.geometry.dispose();
163
165
  this.line.material.dispose();
164
166
  this.cone.geometry.dispose();
@@ -85,6 +85,8 @@ class AxesHelper extends LineSegments {
85
85
  */
86
86
  dispose() {
87
87
 
88
+ super.dispose();
89
+
88
90
  this.geometry.dispose();
89
91
  this.material.dispose();
90
92
 
@@ -73,6 +73,8 @@ class Box3Helper extends LineSegments {
73
73
  */
74
74
  dispose() {
75
75
 
76
+ super.dispose();
77
+
76
78
  this.geometry.dispose();
77
79
  this.material.dispose();
78
80
 
@@ -138,6 +138,8 @@ class BoxHelper extends LineSegments {
138
138
  */
139
139
  dispose() {
140
140
 
141
+ super.dispose();
142
+
141
143
  this.geometry.dispose();
142
144
  this.material.dispose();
143
145
 
@@ -314,6 +314,8 @@ class CameraHelper extends LineSegments {
314
314
  */
315
315
  dispose() {
316
316
 
317
+ super.dispose();
318
+
317
319
  this.geometry.dispose();
318
320
  this.material.dispose();
319
321
 
@@ -103,6 +103,8 @@ class DirectionalLightHelper extends Object3D {
103
103
  */
104
104
  dispose() {
105
105
 
106
+ super.dispose();
107
+
106
108
  this.lightPlane.geometry.dispose();
107
109
  this.lightPlane.material.dispose();
108
110
  this.targetLine.geometry.dispose();
@@ -71,6 +71,8 @@ class GridHelper extends LineSegments {
71
71
  */
72
72
  dispose() {
73
73
 
74
+ super.dispose();
75
+
74
76
  this.geometry.dispose();
75
77
  this.material.dispose();
76
78
 
@@ -82,6 +82,8 @@ class HemisphereLightHelper extends Object3D {
82
82
  */
83
83
  dispose() {
84
84
 
85
+ super.dispose();
86
+
85
87
  this.children[ 0 ].geometry.dispose();
86
88
  this.children[ 0 ].material.dispose();
87
89
 
@@ -84,6 +84,8 @@ class PlaneHelper extends Line {
84
84
  */
85
85
  dispose() {
86
86
 
87
+ super.dispose();
88
+
87
89
  this.geometry.dispose();
88
90
  this.material.dispose();
89
91
  this.children[ 0 ].geometry.dispose();
@@ -65,6 +65,8 @@ class PointLightHelper extends Mesh {
65
65
  */
66
66
  dispose() {
67
67
 
68
+ super.dispose();
69
+
68
70
  this.geometry.dispose();
69
71
  this.material.dispose();
70
72
 
@@ -115,6 +115,8 @@ class PolarGridHelper extends LineSegments {
115
115
  */
116
116
  dispose() {
117
117
 
118
+ super.dispose();
119
+
118
120
  this.geometry.dispose();
119
121
  this.material.dispose();
120
122
 
@@ -162,6 +162,8 @@ class SkeletonHelper extends LineSegments {
162
162
  */
163
163
  dispose() {
164
164
 
165
+ super.dispose();
166
+
165
167
  this.geometry.dispose();
166
168
  this.material.dispose();
167
169
 
@@ -95,6 +95,8 @@ class SpotLightHelper extends Object3D {
95
95
  */
96
96
  dispose() {
97
97
 
98
+ super.dispose();
99
+
98
100
  this.cone.geometry.dispose();
99
101
  this.cone.material.dispose();
100
102
 
@@ -48,16 +48,6 @@ class Light extends Object3D {
48
48
 
49
49
  }
50
50
 
51
- /**
52
- * Frees the GPU-related resources allocated by this instance. Call this
53
- * method whenever this instance is no longer used in your app.
54
- */
55
- dispose() {
56
-
57
- this.dispatchEvent( { type: 'dispose' } );
58
-
59
- }
60
-
61
51
  copy( source, recursive ) {
62
52
 
63
53
  super.copy( source, recursive );