super-three 0.177.0 → 0.181.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 (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -1,7 +1,6 @@
1
1
  import { Material } from '../Material.js';
2
- import { NormalBlending } from '../../constants.js';
3
2
 
4
- import { getNodeChildren, getCacheKey } from '../../nodes/core/NodeUtils.js';
3
+ import { hashArray, hashString } from '../../nodes/core/NodeUtils.js';
5
4
  import { output, diffuseColor, emissive, varyingProperty } from '../../nodes/core/PropertyNode.js';
6
5
  import { materialAlphaTest, materialColor, materialOpacity, materialEmissive, materialNormal, materialLightMap, materialAO } from '../../nodes/accessors/MaterialNode.js';
7
6
  import { modelViewProjection } from '../../nodes/accessors/ModelViewProjectionNode.js';
@@ -12,8 +11,8 @@ import { materialReference } from '../../nodes/accessors/MaterialReferenceNode.j
12
11
  import { positionLocal, positionView } from '../../nodes/accessors/Position.js';
13
12
  import { skinning } from '../../nodes/accessors/SkinningNode.js';
14
13
  import { morphReference } from '../../nodes/accessors/MorphNode.js';
15
- import { mix } from '../../nodes/math/MathNode.js';
16
- import { namespace, float, vec3, vec4, bool } from '../../nodes/tsl/TSLBase.js';
14
+ import { fwidth, mix, smoothstep } from '../../nodes/math/MathNode.js';
15
+ import { float, vec3, vec4, bool } from '../../nodes/tsl/TSLBase.js';
17
16
  import AONode from '../../nodes/lighting/AONode.js';
18
17
  import { lightingContext } from '../../nodes/lighting/LightingContextNode.js';
19
18
  import IrradianceNode from '../../nodes/lighting/IrradianceNode.js';
@@ -24,6 +23,9 @@ import NodeMaterialObserver from './manager/NodeMaterialObserver.js';
24
23
  import getAlphaHashThreshold from '../../nodes/functions/material/getAlphaHashThreshold.js';
25
24
  import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
26
25
  import { vertexColor } from '../../nodes/accessors/VertexColorNode.js';
26
+ import { premultiplyAlpha } from '../../nodes/display/BlendModes.js';
27
+ import { subBuild } from '../../nodes/core/SubBuildNode.js';
28
+ import { warn } from '../../utils.js';
27
29
 
28
30
  /**
29
31
  * Base class for all node materials.
@@ -179,7 +181,7 @@ class NodeMaterial extends Material {
179
181
  * and `alphaMap` properties. This node property allows to overwrite the default
180
182
  * and define the opacity with a node instead.
181
183
  *
182
- * If you don't want to overwrite the normals but modify the existing
184
+ * If you don't want to overwrite the opacity but modify the existing
183
185
  * value instead, use {@link materialOpacity}.
184
186
  *
185
187
  * @type {?Node<float>}
@@ -392,7 +394,7 @@ class NodeMaterial extends Material {
392
394
 
393
395
  set: ( value ) => {
394
396
 
395
- console.warn( 'THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".' );
397
+ warn( 'NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".' );
396
398
 
397
399
  this.receivedShadowPositionNode = value;
398
400
 
@@ -402,6 +404,34 @@ class NodeMaterial extends Material {
402
404
 
403
405
  }
404
406
 
407
+ /**
408
+ * Returns an array of child nodes for this material.
409
+ *
410
+ * @private
411
+ * @returns {Array<{property: string, childNode: Node}>}
412
+ */
413
+ _getNodeChildren() {
414
+
415
+ const children = [];
416
+
417
+ for ( const property of Object.getOwnPropertyNames( this ) ) {
418
+
419
+ if ( property.startsWith( '_' ) === true ) continue;
420
+
421
+ const object = this[ property ];
422
+
423
+ if ( object && object.isNode === true ) {
424
+
425
+ children.push( { property, childNode: object } );
426
+
427
+ }
428
+
429
+ }
430
+
431
+ return children;
432
+
433
+ }
434
+
405
435
  /**
406
436
  * Allows to define a custom cache key that influence the material key computation
407
437
  * for render objects.
@@ -410,7 +440,15 @@ class NodeMaterial extends Material {
410
440
  */
411
441
  customProgramCacheKey() {
412
442
 
413
- return this.type + getCacheKey( this );
443
+ const values = [];
444
+
445
+ for ( const { property, childNode } of this._getNodeChildren() ) {
446
+
447
+ values.push( hashString( property.slice( 0, - 4 ) ), childNode.getCacheKey() );
448
+
449
+ }
450
+
451
+ return this.type + hashArray( values );
414
452
 
415
453
  }
416
454
 
@@ -444,7 +482,7 @@ class NodeMaterial extends Material {
444
482
  */
445
483
  setup( builder ) {
446
484
 
447
- builder.context.setupNormal = () => this.setupNormal( builder );
485
+ builder.context.setupNormal = () => subBuild( this.setupNormal( builder ), 'NORMAL', 'vec3' );
448
486
  builder.context.setupPositionView = () => this.setupPositionView( builder );
449
487
  builder.context.setupModelViewProjection = () => this.setupModelViewProjection( builder );
450
488
 
@@ -455,7 +493,7 @@ class NodeMaterial extends Material {
455
493
 
456
494
  builder.addStack();
457
495
 
458
- const mvp = this.setupVertex( builder );
496
+ const mvp = subBuild( this.setupVertex( builder ), 'VERTEX' );
459
497
 
460
498
  const vertexNode = this.vertexNode || mvp;
461
499
 
@@ -502,7 +540,7 @@ class NodeMaterial extends Material {
502
540
 
503
541
  const outgoingLightNode = this.setupLighting( builder );
504
542
 
505
- if ( clippingNode !== null ) builder.stack.add( clippingNode );
543
+ if ( clippingNode !== null ) builder.stack.addToStack( clippingNode );
506
544
 
507
545
  // force unsigned floats - useful for RenderTargets
508
546
 
@@ -587,7 +625,7 @@ class NodeMaterial extends Material {
587
625
 
588
626
  if ( unionPlanes.length > 0 || intersectionPlanes.length > 0 ) {
589
627
 
590
- const samples = builder.renderer.samples;
628
+ const samples = builder.renderer.currentSamples;
591
629
 
592
630
  if ( this.alphaToCoverage && samples > 1 ) {
593
631
 
@@ -596,7 +634,7 @@ class NodeMaterial extends Material {
596
634
 
597
635
  } else {
598
636
 
599
- builder.stack.add( clipping() );
637
+ builder.stack.addToStack( clipping() );
600
638
 
601
639
  }
602
640
 
@@ -623,7 +661,7 @@ class NodeMaterial extends Material {
623
661
 
624
662
  if ( candidateCount > 0 && candidateCount <= 8 && builder.isAvailable( 'clipDistance' ) ) {
625
663
 
626
- builder.stack.add( hardwareClipping() );
664
+ builder.stack.addToStack( hardwareClipping() );
627
665
 
628
666
  this.hardwareClipping = true;
629
667
 
@@ -767,7 +805,7 @@ class NodeMaterial extends Material {
767
805
 
768
806
  if ( this.positionNode !== null ) {
769
807
 
770
- positionLocal.assign( namespace( this.positionNode, 'POSITION' ) );
808
+ positionLocal.assign( subBuild( this.positionNode, 'POSITION', 'vec3' ) );
771
809
 
772
810
  }
773
811
 
@@ -781,7 +819,9 @@ class NodeMaterial extends Material {
781
819
  * @param {NodeBuilder} builder - The current node builder.
782
820
  * @param {BufferGeometry} geometry - The geometry.
783
821
  */
784
- setupDiffuseColor( { object, geometry } ) {
822
+ setupDiffuseColor( builder ) {
823
+
824
+ const { object, geometry } = builder;
785
825
 
786
826
  // MASK
787
827
 
@@ -840,7 +880,16 @@ class NodeMaterial extends Material {
840
880
 
841
881
  alphaTestNode = this.alphaTestNode !== null ? float( this.alphaTestNode ) : materialAlphaTest;
842
882
 
843
- diffuseColor.a.lessThanEqual( alphaTestNode ).discard();
883
+ if ( this.alphaToCoverage === true ) {
884
+
885
+ diffuseColor.a = smoothstep( alphaTestNode, alphaTestNode.add( fwidth( diffuseColor.a ) ), diffuseColor.a );
886
+ diffuseColor.a.lessThanEqual( 0 ).discard();
887
+
888
+ } else {
889
+
890
+ diffuseColor.a.lessThanEqual( alphaTestNode ).discard();
891
+
892
+ }
844
893
 
845
894
  }
846
895
 
@@ -854,16 +903,10 @@ class NodeMaterial extends Material {
854
903
 
855
904
  // OPAQUE
856
905
 
857
- const isOpaque = this.transparent === false && this.blending === NormalBlending && this.alphaToCoverage === false;
858
-
859
- if ( isOpaque ) {
906
+ if ( builder.isOpaque() ) {
860
907
 
861
908
  diffuseColor.a.assign( 1.0 );
862
909
 
863
- } else if ( alphaTestNode === null ) {
864
-
865
- diffuseColor.a.lessThanEqual( 0 ).discard();
866
-
867
910
  }
868
911
 
869
912
  }
@@ -1069,7 +1112,7 @@ class NodeMaterial extends Material {
1069
1112
 
1070
1113
  output.assign( outputNode );
1071
1114
 
1072
- outputNode = vec4( fogNode );
1115
+ outputNode = vec4( fogNode.toVar() );
1073
1116
 
1074
1117
  }
1075
1118
 
@@ -1077,6 +1120,19 @@ class NodeMaterial extends Material {
1077
1120
 
1078
1121
  }
1079
1122
 
1123
+ /**
1124
+ * Setups premultiplied alpha.
1125
+ *
1126
+ * @param {NodeBuilder} builder - The current node builder.
1127
+ * @param {Node<vec4>} outputNode - The existing output node.
1128
+ * @return {Node<vec4>} The output node.
1129
+ */
1130
+ setupPremultipliedAlpha( builder, outputNode ) {
1131
+
1132
+ return premultiplyAlpha( outputNode );
1133
+
1134
+ }
1135
+
1080
1136
  /**
1081
1137
  * Setups the output node.
1082
1138
  *
@@ -1094,6 +1150,14 @@ class NodeMaterial extends Material {
1094
1150
 
1095
1151
  }
1096
1152
 
1153
+ // PREMULTIPLIED ALPHA
1154
+
1155
+ if ( this.premultipliedAlpha === true ) {
1156
+
1157
+ outputNode = this.setupPremultipliedAlpha( builder, outputNode );
1158
+
1159
+ }
1160
+
1097
1161
  return outputNode;
1098
1162
 
1099
1163
  }
@@ -1160,11 +1224,9 @@ class NodeMaterial extends Material {
1160
1224
  }
1161
1225
 
1162
1226
  const data = Material.prototype.toJSON.call( this, meta );
1163
- const nodeChildren = getNodeChildren( this );
1164
-
1165
1227
  data.inputNodes = {};
1166
1228
 
1167
- for ( const { property, childNode } of nodeChildren ) {
1229
+ for ( const { property, childNode } of this._getNodeChildren() ) {
1168
1230
 
1169
1231
  data.inputNodes[ property ] = childNode.toJSON( meta ).uuid;
1170
1232
 
@@ -1214,6 +1276,7 @@ class NodeMaterial extends Material {
1214
1276
 
1215
1277
  this.lightsNode = source.lightsNode;
1216
1278
  this.envNode = source.envNode;
1279
+ this.aoNode = source.aoNode;
1217
1280
 
1218
1281
  this.colorNode = source.colorNode;
1219
1282
  this.normalNode = source.normalNode;
@@ -1,18 +1,36 @@
1
1
  import SpriteNodeMaterial from './SpriteNodeMaterial.js';
2
- import { viewport } from '../../nodes/display/ScreenNode.js';
2
+ import { viewportSize, screenDPR } from '../../nodes/display/ScreenNode.js';
3
3
  import { positionGeometry, positionLocal, positionView } from '../../nodes/accessors/Position.js';
4
4
  import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
5
5
  import { materialPointSize } from '../../nodes/accessors/MaterialNode.js';
6
6
  import { rotate } from '../../nodes/utils/RotateNode.js';
7
- import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
7
+ import { float, uniform, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
8
8
 
9
9
  import { PointsMaterial } from '../PointsMaterial.js';
10
+ import { Vector2 } from '../../math/Vector2.js';
10
11
 
11
12
  const _defaultValues = /*@__PURE__*/ new PointsMaterial();
13
+ const _size = /*@__PURE__*/ new Vector2();
12
14
 
13
15
  /**
14
16
  * Node material version of {@link PointsMaterial}.
15
17
  *
18
+ * This material can be used in two ways:
19
+ *
20
+ * - By rendering point primitives with {@link Points}. Since WebGPU only supports point primitives
21
+ * with a pixel size of `1`, it's not possible to define a size.
22
+ *
23
+ * ```js
24
+ * const pointCloud = new THREE.Points( geometry, new THREE.PointsNodeMaterial() );
25
+ * ```
26
+ *
27
+ * - By rendering point primitives with {@link Sprites}. In this case, size is honored,
28
+ * see {@link PointsNodeMaterial#sizeNode}.
29
+ *
30
+ * ```js
31
+ * const instancedPoints = new THREE.Sprite( new THREE.PointsNodeMaterial( { positionNode: instancedBufferAttribute( positionAttribute ) } ) );
32
+ * ```
33
+ *
16
34
  * @augments SpriteNodeMaterial
17
35
  */
18
36
  class PointsNodeMaterial extends SpriteNodeMaterial {
@@ -35,6 +53,11 @@ class PointsNodeMaterial extends SpriteNodeMaterial {
35
53
  /**
36
54
  * This node property provides an additional way to set the point size.
37
55
  *
56
+ * Note that WebGPU only supports point primitives with 1 pixel size. Consequently,
57
+ * this node has no effect when the material is used with {@link Points} and a WebGPU
58
+ * backend. If an application wants to render points with a size larger than 1 pixel,
59
+ * the material should be used with {@link Sprite} and instancing.
60
+ *
38
61
  * @type {?Node<vec2>}
39
62
  * @default null
40
63
  */
@@ -63,68 +86,95 @@ class PointsNodeMaterial extends SpriteNodeMaterial {
63
86
 
64
87
  }
65
88
 
66
- setupVertex( builder ) {
89
+ setupVertexSprite( builder ) {
90
+
91
+ const { material, camera } = builder;
92
+
93
+ const { rotationNode, scaleNode, sizeNode, sizeAttenuation } = this;
67
94
 
68
- const mvp = super.setupVertex( builder );
95
+ let mvp = super.setupVertex( builder );
69
96
 
70
97
  // skip further processing if the material is not a node material
71
98
 
72
- if ( builder.material.isNodeMaterial !== true ) {
99
+ if ( material.isNodeMaterial !== true ) {
73
100
 
74
101
  return mvp;
75
102
 
76
103
  }
77
104
 
78
- // ndc space
105
+ // point size
79
106
 
80
- const { rotationNode, scaleNode, sizeNode } = this;
107
+ let pointSize = sizeNode !== null ? vec2( sizeNode ) : materialPointSize;
81
108
 
82
- const alignedPosition = positionGeometry.xy.toVar();
83
- const aspect = viewport.z.div( viewport.w );
109
+ pointSize = pointSize.mul( screenDPR );
84
110
 
85
- // rotation
111
+ // size attenuation
86
112
 
87
- if ( rotationNode && rotationNode.isNode ) {
113
+ if ( camera.isPerspectiveCamera && sizeAttenuation === true ) {
88
114
 
89
- const rotation = float( rotationNode );
115
+ // follow WebGLRenderer's implementation, and scale by half the canvas height in logical units
90
116
 
91
- alignedPosition.assign( rotate( alignedPosition, rotation ) );
117
+ pointSize = pointSize.mul( scale.div( positionView.z.negate() ) );
92
118
 
93
119
  }
94
120
 
95
- // point size
96
-
97
- let pointSize = sizeNode !== null ? vec2( sizeNode ) : materialPointSize;
121
+ // scale
98
122
 
99
- if ( this.sizeAttenuation === true ) {
123
+ if ( scaleNode && scaleNode.isNode ) {
100
124
 
101
- pointSize = pointSize.mul( pointSize.div( positionView.z.negate() ) );
125
+ pointSize = pointSize.mul( vec2( scaleNode ) );
102
126
 
103
127
  }
104
128
 
105
- // scale
129
+ // compute offset
106
130
 
107
- if ( scaleNode && scaleNode.isNode ) {
131
+ let offset = positionGeometry.xy;
108
132
 
109
- pointSize = pointSize.mul( vec2( scaleNode ) );
133
+ // apply rotation
134
+
135
+ if ( rotationNode && rotationNode.isNode ) {
136
+
137
+ const rotation = float( rotationNode );
138
+
139
+ offset = rotate( offset, rotation );
110
140
 
111
141
  }
112
142
 
113
- alignedPosition.mulAssign( pointSize.mul( 2 ) );
143
+ // account for point size
144
+
145
+ offset = offset.mul( pointSize );
146
+
147
+ // scale by viewport size
114
148
 
115
- alignedPosition.assign( alignedPosition.div( viewport.z ) );
116
- alignedPosition.y.assign( alignedPosition.y.mul( aspect ) );
149
+ offset = offset.div( viewportSize.div( 2 ) );
117
150
 
118
- // back to clip space
119
- alignedPosition.assign( alignedPosition.mul( mvp.w ) );
151
+ // compensate for the perspective divide
120
152
 
121
- //clipPos.xy += offset;
122
- mvp.addAssign( vec4( alignedPosition, 0, 0 ) );
153
+ offset = offset.mul( mvp.w );
154
+
155
+ // add offset
156
+
157
+ mvp = mvp.add( vec4( offset, 0, 0 ) );
123
158
 
124
159
  return mvp;
125
160
 
126
161
  }
127
162
 
163
+ setupVertex( builder ) {
164
+
165
+ if ( builder.object.isPoints ) {
166
+
167
+ return super.setupVertex( builder );
168
+
169
+
170
+ } else {
171
+
172
+ return this.setupVertexSprite( builder );
173
+
174
+ }
175
+
176
+ }
177
+
128
178
  /**
129
179
  * Whether alpha to coverage should be used or not.
130
180
  *
@@ -150,4 +200,12 @@ class PointsNodeMaterial extends SpriteNodeMaterial {
150
200
 
151
201
  }
152
202
 
203
+ const scale = /*@__PURE__*/ uniform( 1 ).onFrameUpdate( function ( { renderer } ) {
204
+
205
+ const size = renderer.getSize( _size ); // logical units
206
+
207
+ this.value = 0.5 * size.y;
208
+
209
+ } );
210
+
153
211
  export default PointsNodeMaterial;
@@ -1,5 +1,4 @@
1
1
  import NodeMaterial from './NodeMaterial.js';
2
- import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
3
2
  import { materialRotation } from '../../nodes/accessors/MaterialNode.js';
4
3
  import { modelViewMatrix, modelWorldMatrix } from '../../nodes/accessors/ModelNode.js';
5
4
  import { positionGeometry } from '../../nodes/accessors/Position.js';
@@ -111,9 +110,7 @@ class SpriteNodeMaterial extends NodeMaterial {
111
110
 
112
111
  const { object, camera } = builder;
113
112
 
114
- const sizeAttenuation = this.sizeAttenuation;
115
-
116
- const { positionNode, rotationNode, scaleNode } = this;
113
+ const { positionNode, rotationNode, scaleNode, sizeAttenuation } = this;
117
114
 
118
115
  const mvPosition = modelViewMatrix.mul( vec3( positionNode || 0 ) );
119
116
 
@@ -125,18 +122,9 @@ class SpriteNodeMaterial extends NodeMaterial {
125
122
 
126
123
  }
127
124
 
128
- if ( sizeAttenuation === false ) {
129
-
130
- if ( camera.isPerspectiveCamera ) {
131
-
132
- scale = scale.mul( mvPosition.z.negate() );
133
-
134
- } else {
135
-
136
- const orthoScale = float( 2.0 ).div( cameraProjectionMatrix.element( 1 ).element( 1 ) );
137
- scale = scale.mul( orthoScale.mul( 2 ) );
125
+ if ( camera.isPerspectiveCamera && sizeAttenuation === false ) {
138
126
 
139
- }
127
+ scale = scale.mul( mvPosition.z.negate() );
140
128
 
141
129
  }
142
130
 
@@ -55,6 +55,16 @@ const refreshUniforms = [
55
55
  'transmissionMap'
56
56
  ];
57
57
 
58
+
59
+ /**
60
+ * A WeakMap to cache lights data for node materials.
61
+ * Cache lights data by render ID to avoid unnecessary recalculations.
62
+ *
63
+ * @private
64
+ * @type {WeakMap<LightsNode,Object>}
65
+ */
66
+ const _lightsCache = new WeakMap();
67
+
58
68
  /**
59
69
  * This class is used by {@link WebGPURenderer} as management component.
60
70
  * It's primary purpose is to determine whether render objects require a
@@ -196,6 +206,8 @@ class NodeMaterialObserver {
196
206
 
197
207
  }
198
208
 
209
+ data.lights = this.getLightsData( renderObject.lightsNode.getLights() );
210
+
199
211
  this.renderObjects.set( renderObject, data );
200
212
 
201
213
  }
@@ -299,9 +311,10 @@ class NodeMaterialObserver {
299
311
  * Returns `true` if the given render object has not changed its state.
300
312
  *
301
313
  * @param {RenderObject} renderObject - The render object.
314
+ * @param {Array<Light>} lightsData - The current material lights.
302
315
  * @return {boolean} Whether the given render object has changed its state or not.
303
316
  */
304
- equals( renderObject ) {
317
+ equals( renderObject, lightsData ) {
305
318
 
306
319
  const { object, material, geometry } = renderObject;
307
320
 
@@ -452,13 +465,30 @@ class NodeMaterialObserver {
452
465
 
453
466
  if ( renderObjectData.morphTargetInfluences[ i ] !== object.morphTargetInfluences[ i ] ) {
454
467
 
468
+ renderObjectData.morphTargetInfluences[ i ] = object.morphTargetInfluences[ i ];
455
469
  morphChanged = true;
456
470
 
457
471
  }
458
472
 
459
473
  }
460
474
 
461
- if ( morphChanged ) return true;
475
+ if ( morphChanged ) return false;
476
+
477
+ }
478
+
479
+ // lights
480
+
481
+ if ( renderObjectData.lights ) {
482
+
483
+ for ( let i = 0; i < lightsData.length; i ++ ) {
484
+
485
+ if ( renderObjectData.lights[ i ].map !== lightsData[ i ].map ) {
486
+
487
+ return false;
488
+
489
+ }
490
+
491
+ }
462
492
 
463
493
  }
464
494
 
@@ -488,6 +518,61 @@ class NodeMaterialObserver {
488
518
 
489
519
  }
490
520
 
521
+ /**
522
+ * Returns the lights data for the given material lights.
523
+ *
524
+ * @param {Array<Light>} materialLights - The material lights.
525
+ * @return {Array<Object>} The lights data for the given material lights.
526
+ */
527
+ getLightsData( materialLights ) {
528
+
529
+ const lights = [];
530
+
531
+ for ( const light of materialLights ) {
532
+
533
+ if ( light.isSpotLight === true && light.map !== null ) {
534
+
535
+ // only add lights that have a map
536
+
537
+ lights.push( { map: light.map.version } );
538
+
539
+ }
540
+
541
+ }
542
+
543
+ return lights;
544
+
545
+ }
546
+
547
+ /**
548
+ * Returns the lights for the given lights node and render ID.
549
+ *
550
+ * @param {LightsNode} lightsNode - The lights node.
551
+ * @param {number} renderId - The render ID.
552
+ * @return {Array<Object>} The lights for the given lights node and render ID.
553
+ */
554
+ getLights( lightsNode, renderId ) {
555
+
556
+ if ( _lightsCache.has( lightsNode ) ) {
557
+
558
+ const cached = _lightsCache.get( lightsNode );
559
+
560
+ if ( cached.renderId === renderId ) {
561
+
562
+ return cached.lightsData;
563
+
564
+ }
565
+
566
+ }
567
+
568
+ const lightsData = this.getLightsData( lightsNode.getLights() );
569
+
570
+ _lightsCache.set( lightsNode, { renderId, lightsData } );
571
+
572
+ return lightsData;
573
+
574
+ }
575
+
491
576
  /**
492
577
  * Checks if the given render object requires a refresh.
493
578
  *
@@ -516,7 +601,8 @@ class NodeMaterialObserver {
516
601
  if ( isStatic || isBundle )
517
602
  return false;
518
603
 
519
- const notEqual = this.equals( renderObject ) !== true;
604
+ const lightsData = this.getLights( renderObject.lightsNode, renderId );
605
+ const notEqual = this.equals( renderObject, lightsData ) !== true;
520
606
 
521
607
  return notEqual;
522
608
 
package/src/math/Color.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { clamp, euclideanModulo, lerp } from './MathUtils.js';
2
2
  import { ColorManagement, SRGBToLinear, LinearToSRGB } from './ColorManagement.js';
3
3
  import { SRGBColorSpace } from '../constants.js';
4
+ import { warn } from '../utils.js';
4
5
 
5
6
  const _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
6
7
  'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
@@ -275,7 +276,7 @@ class Color {
275
276
  /**
276
277
  * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,
277
278
  * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or
278
- * any [X11 color name]{@link https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart} -
279
+ * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -
279
280
  * all 140 color names are supported).
280
281
  *
281
282
  * @param {string} style - Color as a CSS-style string.
@@ -290,7 +291,7 @@ class Color {
290
291
 
291
292
  if ( parseFloat( string ) < 1 ) {
292
293
 
293
- console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );
294
+ warn( 'Color: Alpha component of ' + style + ' will be ignored.' );
294
295
 
295
296
  }
296
297
 
@@ -366,7 +367,7 @@ class Color {
366
367
 
367
368
  default:
368
369
 
369
- console.warn( 'THREE.Color: Unknown color model ' + style );
370
+ warn( 'Color: Unknown color model ' + style );
370
371
 
371
372
  }
372
373
 
@@ -394,7 +395,7 @@ class Color {
394
395
 
395
396
  } else {
396
397
 
397
- console.warn( 'THREE.Color: Invalid hex color ' + style );
398
+ warn( 'Color: Invalid hex color ' + style );
398
399
 
399
400
  }
400
401
 
@@ -434,7 +435,7 @@ class Color {
434
435
  } else {
435
436
 
436
437
  // unknown color
437
- console.warn( 'THREE.Color: Unknown color ' + style );
438
+ warn( 'Color: Unknown color ' + style );
438
439
 
439
440
  }
440
441