@plastic-software/three 0.175.14 → 0.178.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 (528) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7746 -6791
  3. package/build/three.core.js +7371 -6576
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +189 -29
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +19 -11
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4989 -2235
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +5082 -2469
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -1
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +1 -0
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +18 -4
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +49 -35
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +12 -10
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +2 -1
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +7 -0
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/lighting/TiledLighting.js +1 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +1 -0
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  79. package/examples/jsm/lines/Line2.js +1 -0
  80. package/examples/jsm/lines/LineGeometry.js +1 -0
  81. package/examples/jsm/lines/LineMaterial.js +4 -4
  82. package/examples/jsm/lines/LineSegments2.js +1 -0
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  84. package/examples/jsm/lines/Wireframe.js +1 -0
  85. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  88. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  89. package/examples/jsm/loaders/3DMLoader.js +1 -0
  90. package/examples/jsm/loaders/3MFLoader.js +1 -0
  91. package/examples/jsm/loaders/AMFLoader.js +1 -0
  92. package/examples/jsm/loaders/BVHLoader.js +1 -0
  93. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  94. package/examples/jsm/loaders/DDSLoader.js +1 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  96. package/examples/jsm/loaders/EXRLoader.js +1 -0
  97. package/examples/jsm/loaders/FBXLoader.js +25 -23
  98. package/examples/jsm/loaders/FontLoader.js +1 -0
  99. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  100. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  102. package/examples/jsm/loaders/IESLoader.js +1 -0
  103. package/examples/jsm/loaders/KMZLoader.js +1 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  105. package/examples/jsm/loaders/KTXLoader.js +1 -0
  106. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  107. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  108. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  110. package/examples/jsm/loaders/LWOLoader.js +1 -13
  111. package/examples/jsm/loaders/LottieLoader.js +15 -0
  112. package/examples/jsm/loaders/MD2Loader.js +1 -0
  113. package/examples/jsm/loaders/MDDLoader.js +1 -0
  114. package/examples/jsm/loaders/MTLLoader.js +4 -3
  115. package/examples/jsm/loaders/MaterialXLoader.js +1 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  117. package/examples/jsm/loaders/OBJLoader.js +1 -0
  118. package/examples/jsm/loaders/PCDLoader.js +122 -19
  119. package/examples/jsm/loaders/PDBLoader.js +1 -0
  120. package/examples/jsm/loaders/PLYLoader.js +1 -0
  121. package/examples/jsm/loaders/PVRLoader.js +1 -0
  122. package/examples/jsm/loaders/RGBELoader.js +1 -0
  123. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  124. package/examples/jsm/loaders/STLLoader.js +1 -0
  125. package/examples/jsm/loaders/SVGLoader.js +1 -0
  126. package/examples/jsm/loaders/TDSLoader.js +1 -0
  127. package/examples/jsm/loaders/TGALoader.js +1 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  129. package/examples/jsm/loaders/TTFLoader.js +1 -0
  130. package/examples/jsm/loaders/USDZLoader.js +1 -0
  131. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  132. package/examples/jsm/loaders/VOXLoader.js +1 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  134. package/examples/jsm/loaders/VTKLoader.js +1 -0
  135. package/examples/jsm/loaders/XYZLoader.js +1 -0
  136. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  137. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  138. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  139. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  140. package/examples/jsm/math/Capsule.js +2 -0
  141. package/examples/jsm/math/ColorConverter.js +1 -0
  142. package/examples/jsm/math/ConvexHull.js +2 -0
  143. package/examples/jsm/math/ImprovedNoise.js +19 -14
  144. package/examples/jsm/math/Lut.js +2 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  146. package/examples/jsm/math/OBB.js +2 -0
  147. package/examples/jsm/math/Octree.js +20 -1
  148. package/examples/jsm/math/SimplexNoise.js +2 -0
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  150. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  151. package/examples/jsm/misc/Gyroscope.js +1 -0
  152. package/examples/jsm/misc/MD2Character.js +2 -0
  153. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  154. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  158. package/examples/jsm/misc/RollerCoaster.js +5 -0
  159. package/examples/jsm/misc/Timer.js +2 -0
  160. package/examples/jsm/misc/TubePainter.js +1 -0
  161. package/examples/jsm/misc/Volume.js +2 -0
  162. package/examples/jsm/misc/VolumeSlice.js +1 -0
  163. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  167. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  168. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  169. package/examples/jsm/objects/Lensflare.js +3 -0
  170. package/examples/jsm/objects/LensflareMesh.js +1 -0
  171. package/examples/jsm/objects/MarchingCubes.js +2 -0
  172. package/examples/jsm/objects/Reflector.js +1 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  174. package/examples/jsm/objects/Refractor.js +1 -0
  175. package/examples/jsm/objects/ShadowMesh.js +1 -0
  176. package/examples/jsm/objects/Sky.js +2 -1
  177. package/examples/jsm/objects/SkyMesh.js +20 -17
  178. package/examples/jsm/objects/Water.js +1 -0
  179. package/examples/jsm/objects/Water2.js +1 -0
  180. package/examples/jsm/objects/Water2Mesh.js +3 -1
  181. package/examples/jsm/objects/WaterMesh.js +2 -1
  182. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  183. package/examples/jsm/physics/JoltPhysics.js +1 -0
  184. package/examples/jsm/physics/RapierPhysics.js +139 -12
  185. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  186. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  187. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  188. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  190. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  191. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  192. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  193. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  194. package/examples/jsm/postprocessing/GTAOPass.js +4 -3
  195. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  196. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  197. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  198. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  199. package/examples/jsm/postprocessing/OutlinePass.js +5 -2
  200. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  201. package/examples/jsm/postprocessing/Pass.js +3 -1
  202. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  203. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  204. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  205. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  206. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  207. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  208. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  209. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  210. package/examples/jsm/postprocessing/SavePass.js +2 -1
  211. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  212. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  213. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  214. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  215. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  216. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  217. package/examples/jsm/renderers/Projector.js +2 -0
  218. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  219. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  220. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  221. package/examples/jsm/shaders/BasicShader.js +4 -1
  222. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  223. package/examples/jsm/shaders/BlendShader.js +4 -1
  224. package/examples/jsm/shaders/BokehShader.js +4 -1
  225. package/examples/jsm/shaders/BokehShader2.js +4 -1
  226. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  227. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  228. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  229. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  230. package/examples/jsm/shaders/CopyShader.js +4 -1
  231. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  232. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  233. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  234. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  235. package/examples/jsm/shaders/ExposureShader.js +4 -1
  236. package/examples/jsm/shaders/FXAAShader.js +4 -1
  237. package/examples/jsm/shaders/FilmShader.js +4 -1
  238. package/examples/jsm/shaders/FocusShader.js +4 -1
  239. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  240. package/examples/jsm/shaders/GTAOShader.js +4 -1
  241. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  242. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  243. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  244. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  245. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  246. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  247. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  248. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  249. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  250. package/examples/jsm/shaders/MirrorShader.js +4 -1
  251. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  252. package/examples/jsm/shaders/OutputShader.js +4 -1
  253. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  254. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  255. package/examples/jsm/shaders/SAOShader.js +4 -1
  256. package/examples/jsm/shaders/SMAAShader.js +1 -0
  257. package/examples/jsm/shaders/SSAOShader.js +4 -1
  258. package/examples/jsm/shaders/SSRShader.js +1 -0
  259. package/examples/jsm/shaders/SepiaShader.js +4 -1
  260. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  261. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  262. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  263. package/examples/jsm/shaders/ToonShader.js +2 -1
  264. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  265. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
  266. package/examples/jsm/shaders/VelocityShader.js +4 -1
  267. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  268. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  269. package/examples/jsm/shaders/VignetteShader.js +4 -1
  270. package/examples/jsm/shaders/VolumeShader.js +5 -2
  271. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  272. package/examples/jsm/textures/FlakesTexture.js +2 -0
  273. package/examples/jsm/transpiler/AST.js +381 -30
  274. package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
  275. package/examples/jsm/transpiler/Linker.js +327 -0
  276. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  277. package/examples/jsm/transpiler/Transpiler.js +19 -1
  278. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  279. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  280. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  281. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  282. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  283. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  284. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  285. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  286. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  287. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  288. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  289. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  290. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  291. package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
  292. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  293. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  294. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  295. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  296. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  297. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  298. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  299. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  301. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  302. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  303. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  304. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  305. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  306. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  307. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  308. package/examples/jsm/tsl/math/Bayer.js +4 -1
  309. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  310. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  311. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  312. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  313. package/examples/jsm/utils/CameraUtils.js +4 -1
  314. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  315. package/examples/jsm/utils/GeometryUtils.js +4 -1
  316. package/examples/jsm/utils/LDrawUtils.js +2 -0
  317. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  318. package/examples/jsm/utils/SceneUtils.js +4 -1
  319. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  320. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  321. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  322. package/examples/jsm/utils/SortUtils.js +4 -1
  323. package/examples/jsm/utils/UVsDebug.js +4 -1
  324. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  325. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  326. package/examples/jsm/utils/WorkerPool.js +2 -0
  327. package/examples/jsm/webxr/ARButton.js +1 -0
  328. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  329. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  330. package/examples/jsm/webxr/Text2D.js +4 -1
  331. package/examples/jsm/webxr/VRButton.js +1 -0
  332. package/examples/jsm/webxr/XRButton.js +1 -0
  333. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  334. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  335. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  336. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  338. package/examples/jsm/webxr/XRPlanes.js +1 -0
  339. package/package.json +6 -4
  340. package/src/Three.Core.js +1 -1
  341. package/src/Three.TSL.js +18 -10
  342. package/src/Three.WebGPU.Nodes.js +1 -0
  343. package/src/Three.WebGPU.js +3 -0
  344. package/src/audio/AudioListener.js +13 -10
  345. package/src/cameras/ArrayCamera.js +9 -1
  346. package/src/constants.js +47 -20
  347. package/src/core/BufferAttribute.js +3 -3
  348. package/src/core/BufferGeometry.js +2 -5
  349. package/src/core/Clock.js +2 -8
  350. package/src/core/GLBufferAttribute.js +13 -1
  351. package/src/core/Object3D.js +23 -22
  352. package/src/core/RenderTarget.js +65 -21
  353. package/src/core/RenderTarget3D.js +1 -0
  354. package/src/extras/TextureUtils.js +1 -5
  355. package/src/extras/core/Curve.js +1 -1
  356. package/src/extras/core/Path.js +22 -22
  357. package/src/geometries/CapsuleGeometry.js +167 -17
  358. package/src/geometries/ExtrudeGeometry.js +39 -29
  359. package/src/helpers/ArrowHelper.js +2 -2
  360. package/src/helpers/SkeletonHelper.js +1 -1
  361. package/src/lights/LightShadow.js +14 -0
  362. package/src/lights/SpotLightShadow.js +9 -1
  363. package/src/lights/webgpu/ProjectorLight.js +46 -0
  364. package/src/loaders/BufferGeometryLoader.js +1 -10
  365. package/src/loaders/FileLoader.js +2 -2
  366. package/src/loaders/ImageBitmapLoader.js +25 -9
  367. package/src/loaders/ImageLoader.js +55 -8
  368. package/src/loaders/ObjectLoader.js +44 -16
  369. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  370. package/src/materials/Material.js +1 -7
  371. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  372. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  373. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  374. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  375. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  376. package/src/materials/nodes/NodeMaterial.js +105 -19
  377. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  378. package/src/math/Box3.js +28 -0
  379. package/src/math/Color.js +7 -7
  380. package/src/math/ColorManagement.js +22 -3
  381. package/src/math/Frustum.js +6 -1
  382. package/src/math/FrustumArray.js +253 -0
  383. package/src/math/Quaternion.js +1 -1
  384. package/src/math/Ray.js +2 -0
  385. package/src/math/Sphere.js +28 -0
  386. package/src/nodes/Nodes.js +2 -3
  387. package/src/nodes/TSL.js +5 -3
  388. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  389. package/src/nodes/accessors/Bitangent.js +54 -26
  390. package/src/nodes/accessors/Camera.js +31 -4
  391. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  392. package/src/nodes/accessors/InstanceNode.js +5 -4
  393. package/src/nodes/accessors/Lights.js +2 -2
  394. package/src/nodes/accessors/MaterialNode.js +4 -0
  395. package/src/nodes/accessors/ModelNode.js +1 -1
  396. package/src/nodes/accessors/Normal.js +102 -16
  397. package/src/nodes/accessors/Object3DNode.js +7 -8
  398. package/src/nodes/accessors/Position.js +14 -4
  399. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  400. package/src/nodes/accessors/ReferenceNode.js +1 -1
  401. package/src/nodes/accessors/ReflectVector.js +3 -3
  402. package/src/nodes/accessors/SkinningNode.js +3 -2
  403. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  404. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  405. package/src/nodes/accessors/Tangent.js +25 -17
  406. package/src/nodes/accessors/TangentUtils.js +46 -0
  407. package/src/nodes/accessors/TextureBicubic.js +21 -3
  408. package/src/nodes/accessors/TextureNode.js +59 -8
  409. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  410. package/src/nodes/accessors/VelocityNode.js +1 -0
  411. package/src/nodes/accessors/VertexColorNode.js +4 -4
  412. package/src/nodes/code/CodeNode.js +8 -11
  413. package/src/nodes/core/AssignNode.js +27 -5
  414. package/src/nodes/core/AttributeNode.js +2 -2
  415. package/src/nodes/core/ContextNode.js +7 -3
  416. package/src/nodes/core/Node.js +69 -20
  417. package/src/nodes/core/NodeBuilder.js +248 -29
  418. package/src/nodes/core/NodeUtils.js +42 -0
  419. package/src/nodes/core/NodeVarying.js +19 -1
  420. package/src/nodes/core/PropertyNode.js +8 -12
  421. package/src/nodes/core/StackNode.js +129 -26
  422. package/src/nodes/core/StructTypeNode.js +26 -4
  423. package/src/nodes/core/SubBuildNode.js +89 -0
  424. package/src/nodes/core/VarNode.js +11 -2
  425. package/src/nodes/core/VaryingNode.js +45 -24
  426. package/src/nodes/display/BlendModes.js +42 -1
  427. package/src/nodes/display/ColorSpaceNode.js +4 -27
  428. package/src/nodes/display/FrontFacingNode.js +34 -2
  429. package/src/nodes/display/NormalMapNode.js +19 -50
  430. package/src/nodes/display/PassNode.js +18 -19
  431. package/src/nodes/display/ScreenNode.js +0 -26
  432. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  433. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  434. package/src/nodes/functions/PhongLightingModel.js +3 -3
  435. package/src/nodes/functions/PhysicalLightingModel.js +14 -14
  436. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  437. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  438. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  439. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  440. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  441. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  442. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  443. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  444. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  445. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  446. package/src/nodes/lighting/LightsNode.js +29 -11
  447. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  448. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  449. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  450. package/src/nodes/lighting/ShadowNode.js +174 -242
  451. package/src/nodes/lighting/SpotLightNode.js +44 -7
  452. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  453. package/src/nodes/math/ConditionalNode.js +0 -19
  454. package/src/nodes/math/MathNode.js +68 -21
  455. package/src/nodes/math/OperatorNode.js +108 -98
  456. package/src/nodes/shapes/Shapes.js +5 -4
  457. package/src/nodes/tsl/TSLBase.js +1 -0
  458. package/src/nodes/tsl/TSLCore.js +160 -65
  459. package/src/nodes/utils/DebugNode.js +15 -3
  460. package/src/nodes/utils/Discard.js +2 -2
  461. package/src/nodes/utils/EquirectUV.js +27 -0
  462. package/src/nodes/utils/LoopNode.js +64 -34
  463. package/src/nodes/utils/MatcapUV.js +22 -0
  464. package/src/nodes/utils/RTTNode.js +13 -5
  465. package/src/nodes/utils/ReflectorNode.js +77 -7
  466. package/src/nodes/utils/SampleNode.js +81 -0
  467. package/src/nodes/utils/TriplanarTextures.js +65 -0
  468. package/src/objects/BatchedMesh.js +16 -4
  469. package/src/objects/Mesh.js +9 -0
  470. package/src/objects/Skeleton.js +1 -1
  471. package/src/objects/Sprite.js +9 -0
  472. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  473. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  474. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  475. package/src/renderers/WebGLRenderer.js +25 -11
  476. package/src/renderers/common/Animation.js +2 -2
  477. package/src/renderers/common/Background.js +13 -2
  478. package/src/renderers/common/CubeRenderTarget.js +1 -1
  479. package/src/renderers/common/RenderList.js +0 -4
  480. package/src/renderers/common/RenderObject.js +80 -4
  481. package/src/renderers/common/Renderer.js +116 -8
  482. package/src/renderers/common/Storage3DTexture.js +79 -0
  483. package/src/renderers/common/StorageArrayTexture.js +63 -0
  484. package/src/renderers/common/Textures.js +15 -21
  485. package/src/renderers/common/TimestampQueryPool.js +1 -0
  486. package/src/renderers/common/Uniform.js +1 -1
  487. package/src/renderers/common/UniformsGroup.js +14 -18
  488. package/src/renderers/common/XRManager.js +157 -27
  489. package/src/renderers/common/XRRenderTarget.js +21 -4
  490. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  491. package/src/renderers/common/nodes/Nodes.js +13 -3
  492. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  493. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  494. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  495. package/src/renderers/webgl/WebGLPrograms.js +4 -2
  496. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  497. package/src/renderers/webgl/WebGLState.js +4 -4
  498. package/src/renderers/webgl/WebGLTextures.js +144 -4
  499. package/src/renderers/webgl/WebGLUtils.js +1 -3
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
  501. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
  502. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  503. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  504. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  505. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  506. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  507. package/src/renderers/webgpu/WebGPUBackend.js +451 -128
  508. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  509. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  510. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
  512. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  513. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  514. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
  517. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
  518. package/src/renderers/webxr/WebXRController.js +1 -1
  519. package/src/renderers/webxr/WebXRManager.js +2 -1
  520. package/src/textures/DepthTexture.js +6 -10
  521. package/src/textures/Source.js +22 -0
  522. package/src/textures/Texture.js +118 -1
  523. package/src/textures/VideoTexture.js +1 -1
  524. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  525. package/src/core/RenderTargetArray.js +0 -40
  526. package/src/nodes/utils/EquirectUVNode.js +0 -65
  527. package/src/nodes/utils/MatcapUVNode.js +0 -49
  528. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -2,6 +2,8 @@ import { Cache } from './Cache.js';
2
2
  import { Loader } from './Loader.js';
3
3
  import { createElementNS } from '../utils.js';
4
4
 
5
+ const _loading = new WeakMap();
6
+
5
7
  /**
6
8
  * A loader for loading images. The class loads images with the HTML `Image` API.
7
9
  *
@@ -48,19 +50,36 @@ class ImageLoader extends Loader {
48
50
 
49
51
  const scope = this;
50
52
 
51
- const cached = Cache.get( url );
53
+ const cached = Cache.get( `image:${url}` );
52
54
 
53
55
  if ( cached !== undefined ) {
54
56
 
55
- scope.manager.itemStart( url );
57
+ if ( cached.complete === true ) {
58
+
59
+ scope.manager.itemStart( url );
60
+
61
+ setTimeout( function () {
62
+
63
+ if ( onLoad ) onLoad( cached );
64
+
65
+ scope.manager.itemEnd( url );
66
+
67
+ }, 0 );
56
68
 
57
- setTimeout( function () {
69
+ } else {
58
70
 
59
- if ( onLoad ) onLoad( cached );
71
+ let arr = _loading.get( cached );
60
72
 
61
- scope.manager.itemEnd( url );
73
+ if ( arr === undefined ) {
62
74
 
63
- }, 0 );
75
+ arr = [];
76
+ _loading.set( cached, arr );
77
+
78
+ }
79
+
80
+ arr.push( { onLoad, onError } );
81
+
82
+ }
64
83
 
65
84
  return cached;
66
85
 
@@ -72,10 +91,21 @@ class ImageLoader extends Loader {
72
91
 
73
92
  removeEventListeners();
74
93
 
75
- Cache.add( url, this );
76
-
77
94
  if ( onLoad ) onLoad( this );
78
95
 
96
+ //
97
+
98
+ const callbacks = _loading.get( this ) || [];
99
+
100
+ for ( let i = 0; i < callbacks.length; i ++ ) {
101
+
102
+ const callback = callbacks[ i ];
103
+ if ( callback.onLoad ) callback.onLoad( this );
104
+
105
+ }
106
+
107
+ _loading.delete( this );
108
+
79
109
  scope.manager.itemEnd( url );
80
110
 
81
111
  }
@@ -86,6 +116,22 @@ class ImageLoader extends Loader {
86
116
 
87
117
  if ( onError ) onError( event );
88
118
 
119
+ Cache.remove( `image:${url}` );
120
+
121
+ //
122
+
123
+ const callbacks = _loading.get( this ) || [];
124
+
125
+ for ( let i = 0; i < callbacks.length; i ++ ) {
126
+
127
+ const callback = callbacks[ i ];
128
+ if ( callback.onError ) callback.onError( event );
129
+
130
+ }
131
+
132
+ _loading.delete( this );
133
+
134
+
89
135
  scope.manager.itemError( url );
90
136
  scope.manager.itemEnd( url );
91
137
 
@@ -107,6 +153,7 @@ class ImageLoader extends Loader {
107
153
 
108
154
  }
109
155
 
156
+ Cache.add( `image:${url}`, image );
110
157
  scope.manager.itemStart( url );
111
158
 
112
159
  image.src = url;
@@ -975,37 +975,65 @@ class ObjectLoader extends Loader {
975
975
  object._drawRanges = data.drawRanges;
976
976
  object._reservedRanges = data.reservedRanges;
977
977
 
978
- object._visibility = data.visibility;
979
- object._active = data.active;
980
- object._bounds = data.bounds.map( bound => {
978
+ object._geometryInfo = data.geometryInfo.map( info => {
981
979
 
982
- const box = new Box3();
983
- box.min.fromArray( bound.boxMin );
984
- box.max.fromArray( bound.boxMax );
980
+ let box = null;
981
+ let sphere = null;
982
+ if ( info.boundingBox !== undefined ) {
985
983
 
986
- const sphere = new Sphere();
987
- sphere.radius = bound.sphereRadius;
988
- sphere.center.fromArray( bound.sphereCenter );
984
+ box = new Box3().fromJSON( info.boundingBox );
989
985
 
990
- return {
991
- boxInitialized: bound.boxInitialized,
992
- box: box,
986
+ }
987
+
988
+ if ( info.boundingSphere !== undefined ) {
989
+
990
+ sphere = new Sphere().fromJSON( info.boundingSphere );
991
+
992
+ }
993
993
 
994
- sphereInitialized: bound.sphereInitialized,
995
- sphere: sphere
994
+ return {
995
+ ...info,
996
+ boundingBox: box,
997
+ boundingSphere: sphere
996
998
  };
997
999
 
998
1000
  } );
1001
+ object._instanceInfo = data.instanceInfo;
1002
+
1003
+ object._availableInstanceIds = data._availableInstanceIds;
1004
+ object._availableGeometryIds = data._availableGeometryIds;
1005
+
1006
+ object._nextIndexStart = data.nextIndexStart;
1007
+ object._nextVertexStart = data.nextVertexStart;
1008
+ object._geometryCount = data.geometryCount;
999
1009
 
1000
1010
  object._maxInstanceCount = data.maxInstanceCount;
1001
1011
  object._maxVertexCount = data.maxVertexCount;
1002
1012
  object._maxIndexCount = data.maxIndexCount;
1003
1013
 
1004
1014
  object._geometryInitialized = data.geometryInitialized;
1005
- object._geometryCount = data.geometryCount;
1006
1015
 
1007
1016
  object._matricesTexture = getTexture( data.matricesTexture.uuid );
1008
- if ( data.colorsTexture !== undefined ) object._colorsTexture = getTexture( data.colorsTexture.uuid );
1017
+
1018
+ object._indirectTexture = getTexture( data.indirectTexture.uuid );
1019
+
1020
+ if ( data.colorsTexture !== undefined ) {
1021
+
1022
+ object._colorsTexture = getTexture( data.colorsTexture.uuid );
1023
+
1024
+ }
1025
+
1026
+ if ( data.boundingSphere !== undefined ) {
1027
+
1028
+ object.boundingSphere = new Sphere().fromJSON( data.boundingSphere );
1029
+
1030
+ }
1031
+
1032
+ if ( data.boundingBox !== undefined ) {
1033
+
1034
+ object.boundingBox = new Box3().fromJSON( data.boundingBox );
1035
+
1036
+ }
1009
1037
 
1010
1038
  break;
1011
1039
 
@@ -38,7 +38,7 @@ class NodeObjectLoader extends ObjectLoader {
38
38
  * A reference to hold the `nodes` JSON property.
39
39
  *
40
40
  * @private
41
- * @type {?Object}
41
+ * @type {?Object[]}
42
42
  */
43
43
  this._nodesJSON = null;
44
44
 
@@ -92,7 +92,7 @@ class NodeObjectLoader extends ObjectLoader {
92
92
  /**
93
93
  * Parses the node objects from the given JSON and textures.
94
94
  *
95
- * @param {Object} json - The JSON definition
95
+ * @param {Object[]} json - The JSON definition
96
96
  * @param {Object<string,Texture>} textures - The texture library.
97
97
  * @return {Object<string,Node>}. The parsed nodes.
98
98
  */
@@ -615,7 +615,7 @@ class Material extends EventDispatcher {
615
615
 
616
616
  const data = {
617
617
  metadata: {
618
- version: 4.6,
618
+ version: 4.7,
619
619
  type: 'Material',
620
620
  generator: 'Material.toJSON'
621
621
  }
@@ -997,12 +997,6 @@ class Material extends EventDispatcher {
997
997
 
998
998
  }
999
999
 
1000
- onBuild( /* shaderobject, renderer */ ) {
1001
-
1002
- console.warn( 'Material: onBuild() has been removed.' ); // @deprecated, r166
1003
-
1004
- }
1005
-
1006
1000
  }
1007
1001
 
1008
1002
  export { Material };
@@ -3,8 +3,9 @@ import { materialLightMap } from '../../nodes/accessors/MaterialNode.js';
3
3
  import BasicEnvironmentNode from '../../nodes/lighting/BasicEnvironmentNode.js';
4
4
  import BasicLightMapNode from '../../nodes/lighting/BasicLightMapNode.js';
5
5
  import BasicLightingModel from '../../nodes/functions/BasicLightingModel.js';
6
- import { normalView } from '../../nodes/accessors/Normal.js';
6
+ import { normalViewGeometry } from '../../nodes/accessors/Normal.js';
7
7
  import { diffuseColor } from '../../nodes/core/PropertyNode.js';
8
+ import { directionToFaceDirection } from '../../nodes/display/FrontFacingNode.js';
8
9
 
9
10
  import { MeshBasicMaterial } from '../MeshBasicMaterial.js';
10
11
 
@@ -59,13 +60,13 @@ class MeshBasicNodeMaterial extends NodeMaterial {
59
60
 
60
61
  /**
61
62
  * Basic materials are not affected by normal and bump maps so we
62
- * return by default {@link normalView}.
63
+ * return by default {@link normalViewGeometry}.
63
64
  *
64
65
  * @return {Node<vec3>} The normal node.
65
66
  */
66
67
  setupNormal() {
67
68
 
68
- return normalView; // see #28839
69
+ return directionToFaceDirection( normalViewGeometry ); // see #28839
69
70
 
70
71
  }
71
72
 
@@ -3,7 +3,7 @@ import { materialReference } from '../../nodes/accessors/MaterialReferenceNode.j
3
3
  import { diffuseColor } from '../../nodes/core/PropertyNode.js';
4
4
  import { vec3 } from '../../nodes/tsl/TSLBase.js';
5
5
  import { mix } from '../../nodes/math/MathNode.js';
6
- import { matcapUV } from '../../nodes/utils/MatcapUVNode.js';
6
+ import { matcapUV } from '../../nodes/utils/MatcapUV.js';
7
7
 
8
8
  import { MeshMatcapMaterial } from '../MeshMatcapMaterial.js';
9
9
 
@@ -2,7 +2,7 @@ import NodeMaterial from './NodeMaterial.js';
2
2
  import { diffuseColor } from '../../nodes/core/PropertyNode.js';
3
3
  import { directionToColor } from '../../nodes/utils/Packing.js';
4
4
  import { materialOpacity } from '../../nodes/accessors/MaterialNode.js';
5
- import { transformedNormalView } from '../../nodes/accessors/Normal.js';
5
+ import { normalView } from '../../nodes/accessors/Normal.js';
6
6
  import { colorSpaceToWorking } from '../../nodes/display/ColorSpaceNode.js';
7
7
  import { float, vec4 } from '../../nodes/tsl/TSLBase.js';
8
8
  import { SRGBColorSpace } from '../../constants.js';
@@ -58,7 +58,7 @@ class MeshNormalNodeMaterial extends NodeMaterial {
58
58
 
59
59
  // By convention, a normal packed to RGB is in sRGB color space. Convert it to working color space.
60
60
 
61
- diffuseColor.assign( colorSpaceToWorking( vec4( directionToColor( transformedNormalView ), opacityNode ), SRGBColorSpace ) );
61
+ diffuseColor.assign( colorSpaceToWorking( vec4( directionToColor( normalView ), opacityNode ), SRGBColorSpace ) );
62
62
 
63
63
  }
64
64
 
@@ -6,6 +6,7 @@ import { TBNViewMatrix } from '../../nodes/accessors/AccessorsUtils.js';
6
6
  import PhysicalLightingModel from '../../nodes/functions/PhysicalLightingModel.js';
7
7
  import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js';
8
8
  import { mix, pow2, min } from '../../nodes/math/MathNode.js';
9
+ import { subBuild } from '../../nodes/core/SubBuildNode.js';
9
10
 
10
11
  import { MeshPhysicalMaterial } from '../MeshPhysicalMaterial.js';
11
12
 
@@ -478,7 +479,7 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
478
479
 
479
480
  setup( builder ) {
480
481
 
481
- builder.context.setupClearcoatNormal = () => this.setupClearcoatNormal( builder );
482
+ builder.context.setupClearcoatNormal = () => subBuild( this.setupClearcoatNormal( builder ), 'NORMAL', 'vec3' );
482
483
 
483
484
  super.setup( builder );
484
485
 
@@ -1,6 +1,6 @@
1
1
  import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js';
2
2
  import PhysicalLightingModel from '../../nodes/functions/PhysicalLightingModel.js';
3
- import { transformedNormalView } from '../../nodes/accessors/Normal.js';
3
+ import { normalView } from '../../nodes/accessors/Normal.js';
4
4
  import { positionViewDirection } from '../../nodes/accessors/Position.js';
5
5
  import { float, vec3 } from '../../nodes/tsl/TSLBase.js';
6
6
 
@@ -52,7 +52,7 @@ class SSSLightingModel extends PhysicalLightingModel {
52
52
 
53
53
  const { thicknessColorNode, thicknessDistortionNode, thicknessAmbientNode, thicknessAttenuationNode, thicknessPowerNode, thicknessScaleNode } = material;
54
54
 
55
- const scatteringHalf = lightDirection.add( transformedNormalView.mul( thicknessDistortionNode ) ).normalize();
55
+ const scatteringHalf = lightDirection.add( normalView.mul( thicknessDistortionNode ) ).normalize();
56
56
  const scatteringDot = float( positionViewDirection.dot( scatteringHalf.negate() ).saturate().pow( thicknessPowerNode ).mul( thicknessScaleNode ) );
57
57
  const scatteringIllu = vec3( scatteringDot.add( thicknessAmbientNode ).mul( thicknessColorNode ) );
58
58
 
@@ -2,7 +2,6 @@ import { Material } from '../Material.js';
2
2
  import { NormalBlending } from '../../constants.js';
3
3
 
4
4
  import { getNodeChildren, getCacheKey } from '../../nodes/core/NodeUtils.js';
5
- import { attribute } from '../../nodes/core/AttributeNode.js';
6
5
  import { output, diffuseColor, emissive, varyingProperty } from '../../nodes/core/PropertyNode.js';
7
6
  import { materialAlphaTest, materialColor, materialOpacity, materialEmissive, materialNormal, materialLightMap, materialAO } from '../../nodes/accessors/MaterialNode.js';
8
7
  import { modelViewProjection } from '../../nodes/accessors/ModelViewProjectionNode.js';
@@ -14,7 +13,7 @@ import { positionLocal, positionView } from '../../nodes/accessors/Position.js';
14
13
  import { skinning } from '../../nodes/accessors/SkinningNode.js';
15
14
  import { morphReference } from '../../nodes/accessors/MorphNode.js';
16
15
  import { mix } from '../../nodes/math/MathNode.js';
17
- import { float, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
16
+ import { float, vec3, vec4, bool } from '../../nodes/tsl/TSLBase.js';
18
17
  import AONode from '../../nodes/lighting/AONode.js';
19
18
  import { lightingContext } from '../../nodes/lighting/LightingContextNode.js';
20
19
  import IrradianceNode from '../../nodes/lighting/IrradianceNode.js';
@@ -24,6 +23,9 @@ import { clipping, clippingAlpha, hardwareClipping } from '../../nodes/accessors
24
23
  import NodeMaterialObserver from './manager/NodeMaterialObserver.js';
25
24
  import getAlphaHashThreshold from '../../nodes/functions/material/getAlphaHashThreshold.js';
26
25
  import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
26
+ import { vertexColor } from '../../nodes/accessors/VertexColorNode.js';
27
+ import { premultiplyAlpha } from '../../nodes/display/BlendModes.js';
28
+ import { subBuild } from '../../nodes/core/SubBuildNode.js';
27
29
 
28
30
  /**
29
31
  * Base class for all node materials.
@@ -188,7 +190,7 @@ class NodeMaterial extends Material {
188
190
  this.opacityNode = null;
189
191
 
190
192
  /**
191
- * This node can be used to to implement a variety of filter-like effects. The idea is
193
+ * This node can be used to implement a variety of filter-like effects. The idea is
192
194
  * to store the current rendering into a texture e.g. via `viewportSharedTexture()`, use it
193
195
  * to create an arbitrary effect and then assign the node composition to this property.
194
196
  * Everything behind the object using this material will now be affected by a filter.
@@ -229,6 +231,15 @@ class NodeMaterial extends Material {
229
231
  */
230
232
  this.alphaTestNode = null;
231
233
 
234
+
235
+ /**
236
+ * Discards the fragment if the mask value is `false`.
237
+ *
238
+ * @type {?Node<bool>}
239
+ * @default null
240
+ */
241
+ this.maskNode = null;
242
+
232
243
  /**
233
244
  * The local vertex positions are computed based on multiple factors like the
234
245
  * attribute data, morphing or skinning. This node property allows to overwrite
@@ -278,7 +289,16 @@ class NodeMaterial extends Material {
278
289
  * @type {?Node<float>}
279
290
  * @default null
280
291
  */
281
- this.shadowPositionNode = null;
292
+ this.receivedShadowPositionNode = null;
293
+
294
+ /**
295
+ * Allows to overwrite the geometry position used for shadow map projection which
296
+ * is by default {@link positionLocal}, the vertex position in local space.
297
+ *
298
+ * @type {?Node<float>}
299
+ * @default null
300
+ */
301
+ this.castShadowPositionNode = null;
282
302
 
283
303
  /**
284
304
  * This node can be used to influence how an object using this node material
@@ -362,6 +382,26 @@ class NodeMaterial extends Material {
362
382
  */
363
383
  this.vertexNode = null;
364
384
 
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
+ console.warn( 'THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".' );
398
+
399
+ this.receivedShadowPositionNode = value;
400
+
401
+ }
402
+
403
+ } );
404
+
365
405
  }
366
406
 
367
407
  /**
@@ -406,7 +446,7 @@ class NodeMaterial extends Material {
406
446
  */
407
447
  setup( builder ) {
408
448
 
409
- builder.context.setupNormal = () => this.setupNormal( builder );
449
+ builder.context.setupNormal = () => subBuild( this.setupNormal( builder ), 'NORMAL', 'vec3' );
410
450
  builder.context.setupPositionView = () => this.setupPositionView( builder );
411
451
  builder.context.setupModelViewProjection = () => this.setupModelViewProjection( builder );
412
452
 
@@ -417,7 +457,9 @@ class NodeMaterial extends Material {
417
457
 
418
458
  builder.addStack();
419
459
 
420
- const vertexNode = this.vertexNode || this.setupVertex( builder );
460
+ const mvp = subBuild( this.setupVertex( builder ), 'VERTEX' );
461
+
462
+ const vertexNode = this.vertexNode || mvp;
421
463
 
422
464
  builder.stack.outputNode = vertexNode;
423
465
 
@@ -632,7 +674,7 @@ class NodeMaterial extends Material {
632
674
 
633
675
  if ( depthNode !== null ) {
634
676
 
635
- depth.assign( depthNode ).append();
677
+ depth.assign( depthNode ).toStack();
636
678
 
637
679
  }
638
680
 
@@ -693,13 +735,13 @@ class NodeMaterial extends Material {
693
735
 
694
736
  if ( geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color ) {
695
737
 
696
- morphReference( object ).append();
738
+ morphReference( object ).toStack();
697
739
 
698
740
  }
699
741
 
700
742
  if ( object.isSkinnedMesh === true ) {
701
743
 
702
- skinning( object ).append();
744
+ skinning( object ).toStack();
703
745
 
704
746
  }
705
747
 
@@ -715,19 +757,19 @@ class NodeMaterial extends Material {
715
757
 
716
758
  if ( object.isBatchedMesh ) {
717
759
 
718
- batch( object ).append();
760
+ batch( object ).toStack();
719
761
 
720
762
  }
721
763
 
722
764
  if ( ( object.isInstancedMesh && object.instanceMatrix && object.instanceMatrix.isInstancedBufferAttribute === true ) ) {
723
765
 
724
- instancedMesh( object ).append();
766
+ instancedMesh( object ).toStack();
725
767
 
726
768
  }
727
769
 
728
770
  if ( this.positionNode !== null ) {
729
771
 
730
- positionLocal.assign( this.positionNode.context( { isPositionNodeInput: true } ) );
772
+ positionLocal.assign( subBuild( this.positionNode, 'POSITION', 'vec3' ) );
731
773
 
732
774
  }
733
775
 
@@ -743,17 +785,29 @@ class NodeMaterial extends Material {
743
785
  */
744
786
  setupDiffuseColor( { object, geometry } ) {
745
787
 
788
+ // MASK
789
+
790
+ if ( this.maskNode !== null ) {
791
+
792
+ // Discard if the mask is `false`
793
+
794
+ bool( this.maskNode ).not().discard();
795
+
796
+ }
797
+
798
+ // COLOR
799
+
746
800
  let colorNode = this.colorNode ? vec4( this.colorNode ) : materialColor;
747
801
 
748
802
  // VERTEX COLORS
749
803
 
750
804
  if ( this.vertexColors === true && geometry.hasAttribute( 'color' ) ) {
751
805
 
752
- colorNode = vec4( colorNode.xyz.mul( attribute( 'color', 'vec3' ) ), colorNode.a );
806
+ colorNode = colorNode.mul( vertexColor() );
753
807
 
754
808
  }
755
809
 
756
- // Instanced colors
810
+ // INSTANCED COLORS
757
811
 
758
812
  if ( object.instanceColor ) {
759
813
 
@@ -771,8 +825,7 @@ class NodeMaterial extends Material {
771
825
 
772
826
  }
773
827
 
774
-
775
- // COLOR
828
+ // DIFFUSE COLOR
776
829
 
777
830
  diffuseColor.assign( colorNode );
778
831
 
@@ -783,9 +836,11 @@ class NodeMaterial extends Material {
783
836
 
784
837
  // ALPHA TEST
785
838
 
839
+ let alphaTestNode = null;
840
+
786
841
  if ( this.alphaTestNode !== null || this.alphaTest > 0 ) {
787
842
 
788
- const alphaTestNode = this.alphaTestNode !== null ? float( this.alphaTestNode ) : materialAlphaTest;
843
+ alphaTestNode = this.alphaTestNode !== null ? float( this.alphaTestNode ) : materialAlphaTest;
789
844
 
790
845
  diffuseColor.a.lessThanEqual( alphaTestNode ).discard();
791
846
 
@@ -799,10 +854,18 @@ class NodeMaterial extends Material {
799
854
 
800
855
  }
801
856
 
802
- if ( this.transparent === false && this.blending === NormalBlending && this.alphaToCoverage === false ) {
857
+ // OPAQUE
858
+
859
+ const isOpaque = this.transparent === false && this.blending === NormalBlending && this.alphaToCoverage === false;
860
+
861
+ if ( isOpaque ) {
803
862
 
804
863
  diffuseColor.a.assign( 1.0 );
805
864
 
865
+ } else if ( alphaTestNode === null ) {
866
+
867
+ diffuseColor.a.lessThanEqual( 0 ).discard();
868
+
806
869
  }
807
870
 
808
871
  }
@@ -1016,6 +1079,19 @@ class NodeMaterial extends Material {
1016
1079
 
1017
1080
  }
1018
1081
 
1082
+ /**
1083
+ * Setups premultiplied alpha.
1084
+ *
1085
+ * @param {NodeBuilder} builder - The current node builder.
1086
+ * @param {Node<vec4>} outputNode - The existing output node.
1087
+ * @return {Node<vec4>} The output node.
1088
+ */
1089
+ setupPremultipliedAlpha( builder, outputNode ) {
1090
+
1091
+ return premultiplyAlpha( outputNode );
1092
+
1093
+ }
1094
+
1019
1095
  /**
1020
1096
  * Setups the output node.
1021
1097
  *
@@ -1033,6 +1109,14 @@ class NodeMaterial extends Material {
1033
1109
 
1034
1110
  }
1035
1111
 
1112
+ // PREMULTIPLIED ALPHA
1113
+
1114
+ if ( this.premultipliedAlpha === true ) {
1115
+
1116
+ outputNode = this.setupPremultipliedAlpha( builder, outputNode );
1117
+
1118
+ }
1119
+
1036
1120
  return outputNode;
1037
1121
 
1038
1122
  }
@@ -1160,12 +1244,14 @@ class NodeMaterial extends Material {
1160
1244
  this.backdropNode = source.backdropNode;
1161
1245
  this.backdropAlphaNode = source.backdropAlphaNode;
1162
1246
  this.alphaTestNode = source.alphaTestNode;
1247
+ this.maskNode = source.maskNode;
1163
1248
 
1164
1249
  this.positionNode = source.positionNode;
1165
1250
  this.geometryNode = source.geometryNode;
1166
1251
 
1167
1252
  this.depthNode = source.depthNode;
1168
- this.shadowPositionNode = source.shadowPositionNode;
1253
+ this.receivedShadowPositionNode = source.receivedShadowPositionNode;
1254
+ this.castShadowPositionNode = source.castShadowPositionNode;
1169
1255
  this.receivedShadowNode = source.receivedShadowNode;
1170
1256
  this.castShadowNode = source.castShadowNode;
1171
1257
 
@@ -5,6 +5,7 @@ const refreshUniforms = [
5
5
  'anisotropyMap',
6
6
  'anisotropyRotation',
7
7
  'aoMap',
8
+ 'aoMapIntensity',
8
9
  'attenuationColor',
9
10
  'attenuationDistance',
10
11
  'bumpMap',
@@ -17,8 +18,10 @@ const refreshUniforms = [
17
18
  'dispersion',
18
19
  'displacementMap',
19
20
  'emissive',
21
+ 'emissiveIntensity',
20
22
  'emissiveMap',
21
23
  'envMap',
24
+ 'envMapIntensity',
22
25
  'gradientMap',
23
26
  'ior',
24
27
  'iridescence',
@@ -26,6 +29,7 @@ const refreshUniforms = [
26
29
  'iridescenceMap',
27
30
  'iridescenceThicknessMap',
28
31
  'lightMap',
32
+ 'lightMapIntensity',
29
33
  'map',
30
34
  'matcap',
31
35
  'metalness',
@@ -126,6 +130,20 @@ class NodeMaterialObserver {
126
130
 
127
131
  }
128
132
 
133
+ /**
134
+ * Returns `true` if the current rendering produces motion vectors.
135
+ *
136
+ * @param {Renderer} renderer - The renderer.
137
+ * @return {boolean} Whether the current rendering produces motion vectors or not.
138
+ */
139
+ needsVelocity( renderer ) {
140
+
141
+ const mrt = renderer.getMRT();
142
+
143
+ return ( mrt !== null && mrt.has( 'velocity' ) );
144
+
145
+ }
146
+
129
147
  /**
130
148
  * Returns monitoring data for the given render object.
131
149
  *
@@ -229,7 +247,7 @@ class NodeMaterialObserver {
229
247
 
230
248
  }
231
249
 
232
- if ( builder.renderer.nodes.modelViewMatrix !== null || builder.renderer.nodes.modelNormalViewMatrix !== null )
250
+ if ( builder.renderer.overrideNodes.modelViewMatrix !== null || builder.renderer.overrideNodes.modelNormalViewMatrix !== null )
233
251
  return true;
234
252
 
235
253
  return false;
@@ -479,7 +497,7 @@ class NodeMaterialObserver {
479
497
  */
480
498
  needsRefresh( renderObject, nodeFrame ) {
481
499
 
482
- if ( this.hasNode || this.hasAnimation || this.firstInitialization( renderObject ) )
500
+ if ( this.hasNode || this.hasAnimation || this.firstInitialization( renderObject ) || this.needsVelocity( nodeFrame.renderer ) )
483
501
  return true;
484
502
 
485
503
  const { renderId } = nodeFrame;