super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -25,7 +25,6 @@ import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
25
25
  import { vertexColor } from '../../nodes/accessors/VertexColorNode.js';
26
26
  import { premultiplyAlpha } from '../../nodes/display/BlendModes.js';
27
27
  import { subBuild } from '../../nodes/core/SubBuildNode.js';
28
- import { warn } from '../../utils.js';
29
28
 
30
29
  /**
31
30
  * Base class for all node materials.
@@ -240,6 +239,14 @@ class NodeMaterial extends Material {
240
239
  */
241
240
  this.maskNode = null;
242
241
 
242
+ /**
243
+ * This node can be used to implement a shadow mask for the material.
244
+ *
245
+ * @type {?Node<bool>}
246
+ * @default null
247
+ */
248
+ this.maskShadowNode = null;
249
+
243
250
  /**
244
251
  * The local vertex positions are computed based on multiple factors like the
245
252
  * attribute data, morphing or skinning. This node property allows to overwrite
@@ -382,25 +389,13 @@ class NodeMaterial extends Material {
382
389
  */
383
390
  this.vertexNode = null;
384
391
 
385
- // Deprecated properties
386
-
387
- Object.defineProperty( this, 'shadowPositionNode', { // @deprecated, r176
388
-
389
- get: () => {
390
-
391
- return this.receivedShadowPositionNode;
392
-
393
- },
394
-
395
- set: ( value ) => {
396
-
397
- warn( 'NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".' );
398
-
399
- this.receivedShadowPositionNode = value;
400
-
401
- }
402
-
403
- } );
392
+ /**
393
+ * This node can be used as a global context management component for this material.
394
+ *
395
+ * @type {?ContextNode}
396
+ * @default null
397
+ */
398
+ this.contextNode = null;
404
399
 
405
400
  }
406
401
 
@@ -493,9 +488,11 @@ class NodeMaterial extends Material {
493
488
 
494
489
  builder.addStack();
495
490
 
496
- const mvp = subBuild( this.setupVertex( builder ), 'VERTEX' );
491
+ const mvp = this.setupVertex( builder );
492
+
493
+ const vertexNode = subBuild( this.vertexNode || mvp, 'VERTEX' );
497
494
 
498
- const vertexNode = this.vertexNode || mvp;
495
+ builder.context.clipSpace = vertexNode;
499
496
 
500
497
  builder.stack.outputNode = vertexNode;
501
498
 
@@ -558,6 +555,14 @@ class NodeMaterial extends Material {
558
555
 
559
556
  if ( isCustomOutput ) resultNode = this.outputNode;
560
557
 
558
+ //
559
+
560
+ if ( builder.context.getOutput ) {
561
+
562
+ resultNode = builder.context.getOutput( resultNode, builder );
563
+
564
+ }
565
+
561
566
  // MRT
562
567
 
563
568
  if ( renderTarget !== null ) {
@@ -753,7 +758,7 @@ class NodeMaterial extends Material {
753
758
 
754
759
  this.setupPosition( builder );
755
760
 
756
- builder.context.vertex = builder.removeStack();
761
+ builder.context.position = builder.removeStack();
757
762
 
758
763
  return modelViewProjection;
759
764
 
@@ -1018,9 +1023,21 @@ class NodeMaterial extends Material {
1018
1023
 
1019
1024
  }
1020
1025
 
1021
- if ( this.aoNode !== null || builder.material.aoMap ) {
1026
+ let aoNode = this.aoNode;
1022
1027
 
1023
- const aoNode = this.aoNode !== null ? this.aoNode : materialAO;
1028
+ if ( aoNode === null && builder.material.aoMap ) {
1029
+
1030
+ aoNode = materialAO;
1031
+
1032
+ }
1033
+
1034
+ if ( builder.context.getAO ) {
1035
+
1036
+ aoNode = builder.context.getAO( aoNode, builder );
1037
+
1038
+ }
1039
+
1040
+ if ( aoNode ) {
1024
1041
 
1025
1042
  materialLightsNode.push( new AONode( aoNode ) );
1026
1043
 
@@ -1285,6 +1302,7 @@ class NodeMaterial extends Material {
1285
1302
  this.backdropAlphaNode = source.backdropAlphaNode;
1286
1303
  this.alphaTestNode = source.alphaTestNode;
1287
1304
  this.maskNode = source.maskNode;
1305
+ this.maskShadowNode = source.maskShadowNode;
1288
1306
 
1289
1307
  this.positionNode = source.positionNode;
1290
1308
  this.geometryNode = source.geometryNode;
@@ -1301,6 +1319,8 @@ class NodeMaterial extends Material {
1301
1319
  this.fragmentNode = source.fragmentNode;
1302
1320
  this.vertexNode = source.vertexNode;
1303
1321
 
1322
+ this.contextNode = source.contextNode;
1323
+
1304
1324
  return super.copy( source );
1305
1325
 
1306
1326
  }
@@ -65,6 +65,22 @@ const refreshUniforms = [
65
65
  */
66
66
  const _lightsCache = new WeakMap();
67
67
 
68
+ /**
69
+ * Holds the material data for comparison.
70
+ *
71
+ * @private
72
+ * @type {WeakMap<Material,Object>}
73
+ */
74
+ const _materialCache = new WeakMap();
75
+
76
+ /**
77
+ * Holds the geometry data for comparison.
78
+ *
79
+ * @private
80
+ * @type {WeakMap<BufferGeometry,Object>}
81
+ */
82
+ const _geometryCache = new WeakMap();
83
+
68
84
  /**
69
85
  * This class is used by {@link WebGPURenderer} as management component.
70
86
  * It's primary purpose is to determine whether render objects require a
@@ -166,16 +182,10 @@ class NodeMaterialObserver {
166
182
 
167
183
  if ( data === undefined ) {
168
184
 
169
- const { geometry, material, object } = renderObject;
185
+ const { geometry, object } = renderObject;
170
186
 
171
187
  data = {
172
- material: this.getMaterialData( material ),
173
- geometry: {
174
- id: geometry.id,
175
- attributes: this.getAttributesData( geometry.attributes ),
176
- indexVersion: geometry.index ? geometry.index.version : null,
177
- drawRange: { start: geometry.drawRange.start, count: geometry.drawRange.count }
178
- },
188
+ geometryId: geometry.id,
179
189
  worldMatrix: object.matrixWorld.clone()
180
190
  };
181
191
 
@@ -197,7 +207,7 @@ class NodeMaterialObserver {
197
207
 
198
208
  }
199
209
 
200
- if ( data.material.transmission > 0 ) {
210
+ if ( renderObject.material.transmission > 0 ) {
201
211
 
202
212
  const { width, height } = renderObject.context;
203
213
 
@@ -232,7 +242,8 @@ class NodeMaterialObserver {
232
242
  const attribute = attributes[ name ];
233
243
 
234
244
  attributesData[ name ] = {
235
- version: attribute.version
245
+ id: attribute.id,
246
+ version: attribute.version,
236
247
  };
237
248
 
238
249
  }
@@ -259,13 +270,44 @@ class NodeMaterialObserver {
259
270
 
260
271
  }
261
272
 
262
- if ( builder.renderer.overrideNodes.modelViewMatrix !== null || builder.renderer.overrideNodes.modelNormalViewMatrix !== null )
273
+ if ( builder.context.modelViewMatrix || builder.context.modelNormalViewMatrix || builder.context.getAO || builder.context.getShadow )
263
274
  return true;
264
275
 
265
276
  return false;
266
277
 
267
278
  }
268
279
 
280
+ /**
281
+ * Returns a geometry data structure holding the geometry property values for
282
+ * monitoring.
283
+ *
284
+ * @param {BufferGeometry} geometry - The geometry.
285
+ * @return {Object} An object for monitoring geometry properties.
286
+ */
287
+ getGeometryData( geometry ) {
288
+
289
+ let data = _geometryCache.get( geometry );
290
+
291
+ if ( data === undefined ) {
292
+
293
+ data = {
294
+ _renderId: - 1,
295
+ _equal: false,
296
+
297
+ attributes: this.getAttributesData( geometry.attributes ),
298
+ indexId: geometry.index ? geometry.index.id : null,
299
+ indexVersion: geometry.index ? geometry.index.version : null,
300
+ drawRange: { start: geometry.drawRange.start, count: geometry.drawRange.count }
301
+ };
302
+
303
+ _geometryCache.set( geometry, data );
304
+
305
+ }
306
+
307
+ return data;
308
+
309
+ }
310
+
269
311
  /**
270
312
  * Returns a material data structure holding the material property values for
271
313
  * monitoring.
@@ -275,32 +317,40 @@ class NodeMaterialObserver {
275
317
  */
276
318
  getMaterialData( material ) {
277
319
 
278
- const data = {};
320
+ let data = _materialCache.get( material );
279
321
 
280
- for ( const property of this.refreshUniforms ) {
322
+ if ( data === undefined ) {
281
323
 
282
- const value = material[ property ];
324
+ data = { _renderId: - 1, _equal: false };
283
325
 
284
- if ( value === null || value === undefined ) continue;
326
+ for ( const property of this.refreshUniforms ) {
285
327
 
286
- if ( typeof value === 'object' && value.clone !== undefined ) {
328
+ const value = material[ property ];
287
329
 
288
- if ( value.isTexture === true ) {
330
+ if ( value === null || value === undefined ) continue;
289
331
 
290
- data[ property ] = { id: value.id, version: value.version };
332
+ if ( typeof value === 'object' && value.clone !== undefined ) {
291
333
 
292
- } else {
334
+ if ( value.isTexture === true ) {
293
335
 
294
- data[ property ] = value.clone();
336
+ data[ property ] = { id: value.id, version: value.version };
295
337
 
296
- }
338
+ } else {
297
339
 
298
- } else {
340
+ data[ property ] = value.clone();
341
+
342
+ }
343
+
344
+ } else {
299
345
 
300
- data[ property ] = value;
346
+ data[ property ] = value;
347
+
348
+ }
301
349
 
302
350
  }
303
351
 
352
+ _materialCache.set( material, data );
353
+
304
354
  }
305
355
 
306
356
  return data;
@@ -312,9 +362,10 @@ class NodeMaterialObserver {
312
362
  *
313
363
  * @param {RenderObject} renderObject - The render object.
314
364
  * @param {Array<Light>} lightsData - The current material lights.
365
+ * @param {number} renderId - The current render ID.
315
366
  * @return {boolean} Whether the given render object has changed its state or not.
316
367
  */
317
- equals( renderObject, lightsData ) {
368
+ equals( renderObject, lightsData, renderId ) {
318
369
 
319
370
  const { object, material, geometry } = renderObject;
320
371
 
@@ -332,126 +383,180 @@ class NodeMaterialObserver {
332
383
 
333
384
  // material
334
385
 
335
- const materialData = renderObjectData.material;
386
+ const materialData = this.getMaterialData( renderObject.material );
387
+
388
+ // check the material for the "equal" state just once per render for all render objects
389
+
390
+ if ( materialData._renderId !== renderId ) {
391
+
392
+ materialData._renderId = renderId;
393
+
394
+ for ( const property in materialData ) {
395
+
396
+ const value = materialData[ property ];
397
+ const mtlValue = material[ property ];
398
+
399
+ if ( property === '_renderId' ) continue;
400
+ if ( property === '_equal' ) continue;
401
+
402
+ if ( value.equals !== undefined ) {
403
+
404
+ if ( value.equals( mtlValue ) === false ) {
336
405
 
337
- for ( const property in materialData ) {
406
+ value.copy( mtlValue );
338
407
 
339
- const value = materialData[ property ];
340
- const mtlValue = material[ property ];
408
+ materialData._equal = false;
409
+ return false;
341
410
 
342
- if ( value.equals !== undefined ) {
411
+ }
343
412
 
344
- if ( value.equals( mtlValue ) === false ) {
413
+ } else if ( mtlValue.isTexture === true ) {
345
414
 
346
- value.copy( mtlValue );
415
+ if ( value.id !== mtlValue.id || value.version !== mtlValue.version ) {
347
416
 
417
+ value.id = mtlValue.id;
418
+ value.version = mtlValue.version;
419
+
420
+ materialData._equal = false;
421
+ return false;
422
+
423
+ }
424
+
425
+ } else if ( value !== mtlValue ) {
426
+
427
+ materialData[ property ] = mtlValue;
428
+
429
+ materialData._equal = false;
348
430
  return false;
349
431
 
350
432
  }
351
433
 
352
- } else if ( mtlValue.isTexture === true ) {
434
+ }
435
+
436
+ if ( materialData.transmission > 0 ) {
437
+
438
+ const { width, height } = renderObject.context;
353
439
 
354
- if ( value.id !== mtlValue.id || value.version !== mtlValue.version ) {
440
+ if ( renderObjectData.bufferWidth !== width || renderObjectData.bufferHeight !== height ) {
355
441
 
356
- value.id = mtlValue.id;
357
- value.version = mtlValue.version;
442
+ renderObjectData.bufferWidth = width;
443
+ renderObjectData.bufferHeight = height;
358
444
 
445
+ materialData._equal = false;
359
446
  return false;
360
447
 
361
448
  }
362
449
 
363
- } else if ( value !== mtlValue ) {
450
+ }
364
451
 
365
- materialData[ property ] = mtlValue;
452
+ materialData._equal = true;
366
453
 
367
- return false;
454
+ } else {
368
455
 
369
- }
456
+ if ( materialData._equal === false ) return false;
370
457
 
371
458
  }
372
459
 
373
- if ( materialData.transmission > 0 ) {
460
+ // geometry
374
461
 
375
- const { width, height } = renderObject.context;
462
+ if ( renderObjectData.geometryId !== geometry.id ) {
376
463
 
377
- if ( renderObjectData.bufferWidth !== width || renderObjectData.bufferHeight !== height ) {
464
+ renderObjectData.geometryId = geometry.id;
465
+ return false;
378
466
 
379
- renderObjectData.bufferWidth = width;
380
- renderObjectData.bufferHeight = height;
467
+ }
381
468
 
382
- return false;
469
+ const geometryData = this.getGeometryData( renderObject.geometry );
383
470
 
384
- }
471
+ // check the geoemtry for the "equal" state just once per render for all render objects
385
472
 
386
- }
473
+ if ( geometryData._renderId !== renderId ) {
387
474
 
388
- // geometry
475
+ geometryData._renderId = renderId;
389
476
 
390
- const storedGeometryData = renderObjectData.geometry;
391
- const attributes = geometry.attributes;
392
- const storedAttributes = storedGeometryData.attributes;
477
+ // attributes
393
478
 
394
- const storedAttributeNames = Object.keys( storedAttributes );
395
- const currentAttributeNames = Object.keys( attributes );
479
+ const attributes = geometry.attributes;
480
+ const storedAttributes = geometryData.attributes;
396
481
 
397
- if ( storedGeometryData.id !== geometry.id ) {
482
+ let currentAttributeCount = 0;
483
+ let storedAttributeCount = 0;
398
484
 
399
- storedGeometryData.id = geometry.id;
400
- return false;
485
+ for ( const _ in attributes ) currentAttributeCount ++; // eslint-disable-line no-unused-vars
401
486
 
402
- }
487
+ for ( const name in storedAttributes ) {
403
488
 
404
- if ( storedAttributeNames.length !== currentAttributeNames.length ) {
489
+ storedAttributeCount ++;
405
490
 
406
- renderObjectData.geometry.attributes = this.getAttributesData( attributes );
407
- return false;
491
+ const storedAttributeData = storedAttributes[ name ];
492
+ const attribute = attributes[ name ];
408
493
 
409
- }
494
+ if ( attribute === undefined ) {
410
495
 
411
- // compare each attribute
496
+ // attribute was removed
497
+ delete storedAttributes[ name ];
412
498
 
413
- for ( const name of storedAttributeNames ) {
499
+ geometryData._equal = false;
500
+ return false;
414
501
 
415
- const storedAttributeData = storedAttributes[ name ];
416
- const attribute = attributes[ name ];
502
+ }
417
503
 
418
- if ( attribute === undefined ) {
504
+ if ( storedAttributeData.id !== attribute.id || storedAttributeData.version !== attribute.version ) {
419
505
 
420
- // attribute was removed
421
- delete storedAttributes[ name ];
422
- return false;
506
+ storedAttributeData.id = attribute.id;
507
+ storedAttributeData.version = attribute.version;
508
+
509
+ geometryData._equal = false;
510
+ return false;
511
+
512
+ }
423
513
 
424
514
  }
425
515
 
426
- if ( storedAttributeData.version !== attribute.version ) {
516
+ if ( storedAttributeCount !== currentAttributeCount ) {
517
+
518
+ geometryData.attributes = this.getAttributesData( attributes );
427
519
 
428
- storedAttributeData.version = attribute.version;
520
+ geometryData._equal = false;
429
521
  return false;
430
522
 
431
523
  }
432
524
 
433
- }
525
+ // check index
434
526
 
435
- // check index
527
+ const index = geometry.index;
528
+ const storedIndexId = geometryData.indexId;
529
+ const storedIndexVersion = geometryData.indexVersion;
530
+ const currentIndexId = index ? index.id : null;
531
+ const currentIndexVersion = index ? index.version : null;
436
532
 
437
- const index = geometry.index;
438
- const storedIndexVersion = storedGeometryData.indexVersion;
439
- const currentIndexVersion = index ? index.version : null;
533
+ if ( storedIndexId !== currentIndexId || storedIndexVersion !== currentIndexVersion ) {
440
534
 
441
- if ( storedIndexVersion !== currentIndexVersion ) {
535
+ geometryData.indexId = currentIndexId;
536
+ geometryData.indexVersion = currentIndexVersion;
442
537
 
443
- storedGeometryData.indexVersion = currentIndexVersion;
444
- return false;
538
+ geometryData._equal = false;
539
+ return false;
445
540
 
446
- }
541
+ }
447
542
 
448
- // check drawRange
543
+ // check drawRange
449
544
 
450
- if ( storedGeometryData.drawRange.start !== geometry.drawRange.start || storedGeometryData.drawRange.count !== geometry.drawRange.count ) {
545
+ if ( geometryData.drawRange.start !== geometry.drawRange.start || geometryData.drawRange.count !== geometry.drawRange.count ) {
451
546
 
452
- storedGeometryData.drawRange.start = geometry.drawRange.start;
453
- storedGeometryData.drawRange.count = geometry.drawRange.count;
454
- return false;
547
+ geometryData.drawRange.start = geometry.drawRange.start;
548
+ geometryData.drawRange.count = geometry.drawRange.count;
549
+
550
+ geometryData._equal = false;
551
+ return false;
552
+
553
+ }
554
+
555
+ geometryData._equal = true;
556
+
557
+ } else {
558
+
559
+ if ( geometryData._equal === false ) return false;
455
560
 
456
561
  }
457
562
 
@@ -602,7 +707,7 @@ class NodeMaterialObserver {
602
707
  return false;
603
708
 
604
709
  const lightsData = this.getLights( renderObject.lightsNode, renderId );
605
- const notEqual = this.equals( renderObject, lightsData ) !== true;
710
+ const notEqual = this.equals( renderObject, lightsData, renderId ) !== true;
606
711
 
607
712
  return notEqual;
608
713
 
package/src/math/Line3.js CHANGED
@@ -142,6 +142,9 @@ class Line3 {
142
142
  _startEnd.subVectors( this.end, this.start );
143
143
 
144
144
  const startEnd2 = _startEnd.dot( _startEnd );
145
+
146
+ if ( startEnd2 === 0 ) return 0;
147
+
145
148
  const startEnd_startP = _startEnd.dot( _startP );
146
149
 
147
150
  let t = startEnd_startP / startEnd2;
@@ -284,12 +287,10 @@ class Line3 {
284
287
 
285
288
  }
286
289
 
287
- c1.copy( p1 ).add( _d1.multiplyScalar( s ) );
288
- c2.copy( p2 ).add( _d2.multiplyScalar( t ) );
289
-
290
- c1.sub( c2 );
290
+ c1.copy( p1 ).addScaledVector( _d1, s );
291
+ c2.copy( p2 ).addScaledVector( _d2, t );
291
292
 
292
- return c1.dot( c1 );
293
+ return c1.distanceToSquared( c2 );
293
294
 
294
295
  }
295
296
 
@@ -64,7 +64,7 @@ function euclideanModulo( n, m ) {
64
64
 
65
65
  /**
66
66
  * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`
67
- * for the given value.
67
+ * for the given value. `a2` must be greater than `a1`.
68
68
  *
69
69
  * @param {number} x - The value to be mapped.
70
70
  * @param {number} a1 - Minimum value for range A.
@@ -159,9 +159,9 @@ function pingpong( x, length = 1 ) {
159
159
  *
160
160
  * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.
161
161
  *
162
- * @param {number} x - The value to evaluate based on its position between min and max.
163
- * @param {number} min - The min value. Any x value below min will be `0`.
164
- * @param {number} max - The max value. Any x value above max will be `1`.
162
+ * @param {number} x - The value to evaluate based on its position between `min` and `max`.
163
+ * @param {number} min - The min value. Any `x` value below `min` will be `0`. `min` must be lower than `max`.
164
+ * @param {number} max - The max value. Any `x` value above `max` will be `1`. `max` must be greater than `min`.
165
165
  * @return {number} The alternated value.
166
166
  */
167
167
  function smoothstep( x, min, max ) {
@@ -177,11 +177,11 @@ function smoothstep( x, min, max ) {
177
177
 
178
178
  /**
179
179
  * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)
180
- * that has zero 1st and 2nd order derivatives at x=0 and x=1.
180
+ * that has zero 1st and 2nd order derivatives at `x=0` and `x=1`.
181
181
  *
182
- * @param {number} x - The value to evaluate based on its position between min and max.
183
- * @param {number} min - The min value. Any x value below min will be `0`.
184
- * @param {number} max - The max value. Any x value above max will be `1`.
182
+ * @param {number} x - The value to evaluate based on its position between `min` and `max`.
183
+ * @param {number} min - The min value. Any `x` value below `min` will be `0`. `min` must be lower than `max`.
184
+ * @param {number} max - The max value. Any `x` value above `max` will be `1`. `max` must be greater than `min`.
185
185
  * @return {number} The alternated value.
186
186
  */
187
187
  function smootherstep( x, min, max ) {
@@ -294,7 +294,7 @@ function isPowerOfTwo( value ) {
294
294
  /**
295
295
  * Returns the smallest power of two that is greater than or equal to the given number.
296
296
  *
297
- * @param {number} value - The value to find a POT for.
297
+ * @param {number} value - The value to find a POT for. Must be greater than `0`.
298
298
  * @return {number} The smallest power of two that is greater than or equal to the given number.
299
299
  */
300
300
  function ceilPowerOfTwo( value ) {
@@ -306,7 +306,7 @@ function ceilPowerOfTwo( value ) {
306
306
  /**
307
307
  * Returns the largest power of two that is less than or equal to the given number.
308
308
  *
309
- * @param {number} value - The value to find a POT for.
309
+ * @param {number} value - The value to find a POT for. Must be greater than `0`.
310
310
  * @return {number} The largest power of two that is less than or equal to the given number.
311
311
  */
312
312
  function floorPowerOfTwo( value ) {
@@ -26,6 +26,19 @@
26
26
  */
27
27
  export class Matrix2 {
28
28
 
29
+ static {
30
+
31
+ /**
32
+ * This flag can be used for type testing.
33
+ *
34
+ * @type {boolean}
35
+ * @readonly
36
+ * @default true
37
+ */
38
+ Matrix2.prototype.isMatrix2 = true;
39
+
40
+ }
41
+
29
42
  /**
30
43
  * Constructs a new 2x2 matrix. The arguments are supposed to be
31
44
  * in row-major order. If no arguments are provided, the constructor
@@ -38,15 +51,6 @@ export class Matrix2 {
38
51
  */
39
52
  constructor( n11, n12, n21, n22 ) {
40
53
 
41
- /**
42
- * This flag can be used for type testing.
43
- *
44
- * @type {boolean}
45
- * @readonly
46
- * @default true
47
- */
48
- Matrix2.prototype.isMatrix2 = true;
49
-
50
54
  /**
51
55
  * A column-major list of matrix values.
52
56
  *