@plastic-software/three 0.175.14 → 0.179.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 (572) hide show
  1. package/README.md +4 -4
  2. package/build/three.cjs +8402 -6787
  3. package/build/three.core.js +8007 -6688
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +397 -102
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +84 -27
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +6831 -2838
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +6648 -2838
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +1 -3
  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 +2 -1
  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 +22 -8
  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 +57 -38
  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 +679 -300
  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 +48 -8
  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 +11 -2
  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/libs/meshopt_decoder.module.js +75 -58
  76. package/examples/jsm/lighting/TiledLighting.js +1 -0
  77. package/examples/jsm/lights/LightProbeGenerator.js +15 -3
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  79. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  80. package/examples/jsm/lines/Line2.js +1 -0
  81. package/examples/jsm/lines/LineGeometry.js +1 -0
  82. package/examples/jsm/lines/LineMaterial.js +4 -4
  83. package/examples/jsm/lines/LineSegments2.js +1 -0
  84. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  85. package/examples/jsm/lines/Wireframe.js +1 -0
  86. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  87. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  88. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  89. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  90. package/examples/jsm/loaders/3DMLoader.js +1 -0
  91. package/examples/jsm/loaders/3MFLoader.js +1 -0
  92. package/examples/jsm/loaders/AMFLoader.js +1 -0
  93. package/examples/jsm/loaders/BVHLoader.js +1 -0
  94. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  95. package/examples/jsm/loaders/DDSLoader.js +1 -0
  96. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  97. package/examples/jsm/loaders/EXRLoader.js +211 -22
  98. package/examples/jsm/loaders/FBXLoader.js +25 -23
  99. package/examples/jsm/loaders/FontLoader.js +1 -0
  100. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  101. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  102. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  103. package/examples/jsm/loaders/IESLoader.js +1 -0
  104. package/examples/jsm/loaders/KMZLoader.js +1 -0
  105. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  106. package/examples/jsm/loaders/KTXLoader.js +1 -0
  107. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  108. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  110. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  111. package/examples/jsm/loaders/LWOLoader.js +1 -13
  112. package/examples/jsm/loaders/LottieLoader.js +15 -0
  113. package/examples/jsm/loaders/MD2Loader.js +1 -0
  114. package/examples/jsm/loaders/MDDLoader.js +1 -0
  115. package/examples/jsm/loaders/MTLLoader.js +4 -3
  116. package/examples/jsm/loaders/MaterialXLoader.js +213 -30
  117. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  118. package/examples/jsm/loaders/OBJLoader.js +1 -0
  119. package/examples/jsm/loaders/PCDLoader.js +122 -19
  120. package/examples/jsm/loaders/PDBLoader.js +1 -0
  121. package/examples/jsm/loaders/PLYLoader.js +1 -0
  122. package/examples/jsm/loaders/PVRLoader.js +1 -0
  123. package/examples/jsm/loaders/RGBELoader.js +1 -0
  124. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  125. package/examples/jsm/loaders/STLLoader.js +1 -0
  126. package/examples/jsm/loaders/SVGLoader.js +1 -0
  127. package/examples/jsm/loaders/TDSLoader.js +1 -0
  128. package/examples/jsm/loaders/TGALoader.js +1 -0
  129. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  130. package/examples/jsm/loaders/TTFLoader.js +14 -1
  131. package/examples/jsm/loaders/USDLoader.js +219 -0
  132. package/examples/jsm/loaders/USDZLoader.js +4 -891
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  134. package/examples/jsm/loaders/VOXLoader.js +1 -0
  135. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  136. package/examples/jsm/loaders/VTKLoader.js +1 -0
  137. package/examples/jsm/loaders/XYZLoader.js +1 -0
  138. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  139. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  140. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  143. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  144. package/examples/jsm/math/Capsule.js +2 -0
  145. package/examples/jsm/math/ColorConverter.js +1 -0
  146. package/examples/jsm/math/ConvexHull.js +2 -0
  147. package/examples/jsm/math/ImprovedNoise.js +19 -14
  148. package/examples/jsm/math/Lut.js +2 -0
  149. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  150. package/examples/jsm/math/OBB.js +2 -0
  151. package/examples/jsm/math/Octree.js +20 -1
  152. package/examples/jsm/math/SimplexNoise.js +2 -0
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  155. package/examples/jsm/misc/Gyroscope.js +1 -0
  156. package/examples/jsm/misc/MD2Character.js +2 -0
  157. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  160. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  162. package/examples/jsm/misc/RollerCoaster.js +5 -0
  163. package/examples/jsm/misc/TubePainter.js +1 -0
  164. package/examples/jsm/misc/Volume.js +2 -0
  165. package/examples/jsm/misc/VolumeSlice.js +1 -0
  166. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  169. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  170. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  172. package/examples/jsm/objects/Lensflare.js +3 -0
  173. package/examples/jsm/objects/LensflareMesh.js +4 -3
  174. package/examples/jsm/objects/MarchingCubes.js +2 -0
  175. package/examples/jsm/objects/Reflector.js +1 -0
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  177. package/examples/jsm/objects/Refractor.js +1 -0
  178. package/examples/jsm/objects/ShadowMesh.js +1 -0
  179. package/examples/jsm/objects/Sky.js +2 -1
  180. package/examples/jsm/objects/SkyMesh.js +22 -19
  181. package/examples/jsm/objects/Water.js +1 -0
  182. package/examples/jsm/objects/Water2.js +1 -0
  183. package/examples/jsm/objects/Water2Mesh.js +3 -1
  184. package/examples/jsm/objects/WaterMesh.js +2 -1
  185. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  186. package/examples/jsm/physics/JoltPhysics.js +1 -0
  187. package/examples/jsm/physics/RapierPhysics.js +149 -13
  188. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  189. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  190. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  191. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  192. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  193. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  194. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  195. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  196. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  197. package/examples/jsm/postprocessing/GTAOPass.js +14 -12
  198. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  199. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  200. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  201. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  202. package/examples/jsm/postprocessing/OutlinePass.js +22 -19
  203. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  204. package/examples/jsm/postprocessing/Pass.js +3 -1
  205. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  206. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  207. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  208. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  209. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  210. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  211. package/examples/jsm/postprocessing/SSAOPass.js +12 -10
  212. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  213. package/examples/jsm/postprocessing/SavePass.js +2 -1
  214. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  215. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  216. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  217. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  218. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  219. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  220. package/examples/jsm/renderers/Projector.js +2 -0
  221. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  222. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  223. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  224. package/examples/jsm/shaders/BasicShader.js +4 -1
  225. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  226. package/examples/jsm/shaders/BlendShader.js +4 -1
  227. package/examples/jsm/shaders/BokehShader.js +4 -1
  228. package/examples/jsm/shaders/BokehShader2.js +4 -1
  229. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  230. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  231. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  232. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  233. package/examples/jsm/shaders/CopyShader.js +4 -1
  234. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  235. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  236. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  237. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  238. package/examples/jsm/shaders/ExposureShader.js +4 -1
  239. package/examples/jsm/shaders/FXAAShader.js +4 -1
  240. package/examples/jsm/shaders/FilmShader.js +4 -1
  241. package/examples/jsm/shaders/FocusShader.js +4 -1
  242. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  243. package/examples/jsm/shaders/GTAOShader.js +4 -1
  244. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  245. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  246. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  247. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  248. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  249. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  250. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  251. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  252. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  253. package/examples/jsm/shaders/MirrorShader.js +4 -1
  254. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  255. package/examples/jsm/shaders/OutputShader.js +4 -1
  256. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  257. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  258. package/examples/jsm/shaders/SAOShader.js +4 -1
  259. package/examples/jsm/shaders/SMAAShader.js +1 -0
  260. package/examples/jsm/shaders/SSAOShader.js +4 -1
  261. package/examples/jsm/shaders/SSRShader.js +1 -0
  262. package/examples/jsm/shaders/SepiaShader.js +4 -1
  263. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  264. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  265. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  266. package/examples/jsm/shaders/ToonShader.js +2 -1
  267. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  268. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
  269. package/examples/jsm/shaders/VelocityShader.js +4 -1
  270. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  271. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  272. package/examples/jsm/shaders/VignetteShader.js +4 -1
  273. package/examples/jsm/shaders/VolumeShader.js +5 -2
  274. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  275. package/examples/jsm/textures/FlakesTexture.js +2 -0
  276. package/examples/jsm/transpiler/AST.js +381 -30
  277. package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
  278. package/examples/jsm/transpiler/Linker.js +327 -0
  279. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  280. package/examples/jsm/transpiler/Transpiler.js +19 -1
  281. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  282. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  283. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  284. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  285. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  286. package/examples/jsm/tsl/display/BloomNode.js +9 -7
  287. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  288. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  289. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  290. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  291. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  292. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  293. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  294. package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
  295. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  296. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  297. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  298. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  300. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  301. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  302. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  303. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  304. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  305. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  306. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  307. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
  308. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  309. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  310. package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
  311. package/examples/jsm/tsl/math/Bayer.js +4 -1
  312. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  313. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  314. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  315. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  316. package/examples/jsm/utils/CameraUtils.js +4 -1
  317. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  318. package/examples/jsm/utils/GeometryUtils.js +4 -1
  319. package/examples/jsm/utils/LDrawUtils.js +2 -0
  320. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  321. package/examples/jsm/utils/SceneUtils.js +4 -1
  322. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  323. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  324. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  325. package/examples/jsm/utils/SortUtils.js +4 -1
  326. package/examples/jsm/utils/UVsDebug.js +4 -1
  327. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  328. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  329. package/examples/jsm/utils/WorkerPool.js +2 -0
  330. package/examples/jsm/webxr/ARButton.js +1 -0
  331. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  332. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  333. package/examples/jsm/webxr/Text2D.js +4 -1
  334. package/examples/jsm/webxr/VRButton.js +1 -0
  335. package/examples/jsm/webxr/XRButton.js +1 -0
  336. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  338. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  339. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  340. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  341. package/examples/jsm/webxr/XRPlanes.js +1 -0
  342. package/package.json +6 -4
  343. package/src/Three.Core.js +2 -1
  344. package/src/Three.TSL.js +83 -26
  345. package/src/Three.WebGPU.Nodes.js +1 -0
  346. package/src/Three.WebGPU.js +3 -0
  347. package/src/animation/KeyframeTrack.js +1 -1
  348. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  349. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  350. package/src/audio/AudioListener.js +13 -10
  351. package/src/cameras/ArrayCamera.js +9 -1
  352. package/src/cameras/Camera.js +14 -0
  353. package/src/cameras/OrthographicCamera.js +1 -1
  354. package/src/cameras/PerspectiveCamera.js +1 -1
  355. package/src/constants.js +47 -20
  356. package/src/core/BufferAttribute.js +3 -3
  357. package/src/core/BufferGeometry.js +2 -5
  358. package/src/core/Clock.js +2 -8
  359. package/src/core/GLBufferAttribute.js +13 -1
  360. package/src/core/Object3D.js +23 -22
  361. package/src/core/RenderTarget.js +65 -21
  362. package/src/core/RenderTarget3D.js +1 -0
  363. package/{examples/jsm/misc → src/core}/Timer.js +4 -40
  364. package/src/extras/PMREMGenerator.js +11 -0
  365. package/src/extras/TextureUtils.js +1 -5
  366. package/src/extras/core/Curve.js +1 -1
  367. package/src/extras/core/Path.js +22 -22
  368. package/src/geometries/CapsuleGeometry.js +167 -17
  369. package/src/geometries/ExtrudeGeometry.js +39 -29
  370. package/src/helpers/ArrowHelper.js +2 -2
  371. package/src/helpers/CameraHelper.js +41 -11
  372. package/src/helpers/SkeletonHelper.js +36 -7
  373. package/src/lights/LightShadow.js +34 -7
  374. package/src/lights/PointLightShadow.js +1 -1
  375. package/src/lights/SpotLightShadow.js +9 -1
  376. package/src/lights/webgpu/ProjectorLight.js +46 -0
  377. package/src/loaders/BufferGeometryLoader.js +1 -10
  378. package/src/loaders/FileLoader.js +27 -4
  379. package/src/loaders/ImageBitmapLoader.js +48 -9
  380. package/src/loaders/ImageLoader.js +55 -8
  381. package/src/loaders/Loader.js +14 -0
  382. package/src/loaders/LoadingManager.js +23 -0
  383. package/src/loaders/ObjectLoader.js +44 -16
  384. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  385. package/src/materials/Material.js +1 -7
  386. package/src/materials/MeshBasicMaterial.js +1 -1
  387. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  388. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  389. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  390. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  391. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  392. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  393. package/src/materials/nodes/NodeMaterial.js +106 -20
  394. package/src/materials/nodes/PointsNodeMaterial.js +5 -0
  395. package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
  396. package/src/math/Box3.js +28 -0
  397. package/src/math/Color.js +7 -7
  398. package/src/math/ColorManagement.js +22 -3
  399. package/src/math/Frustum.js +25 -9
  400. package/src/math/FrustumArray.js +258 -0
  401. package/src/math/Line3.js +129 -2
  402. package/src/math/Matrix4.js +48 -27
  403. package/src/math/Quaternion.js +1 -1
  404. package/src/math/Ray.js +2 -0
  405. package/src/math/Sphere.js +28 -0
  406. package/src/math/Spherical.js +2 -2
  407. package/src/nodes/Nodes.js +3 -3
  408. package/src/nodes/TSL.js +6 -3
  409. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  410. package/src/nodes/accessors/Bitangent.js +54 -26
  411. package/src/nodes/accessors/Camera.js +40 -13
  412. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  413. package/src/nodes/accessors/InstanceNode.js +5 -4
  414. package/src/nodes/accessors/Lights.js +2 -2
  415. package/src/nodes/accessors/MaterialNode.js +4 -0
  416. package/src/nodes/accessors/ModelNode.js +1 -1
  417. package/src/nodes/accessors/Normal.js +110 -24
  418. package/src/nodes/accessors/Object3DNode.js +7 -8
  419. package/src/nodes/accessors/Position.js +14 -4
  420. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  421. package/src/nodes/accessors/ReferenceNode.js +19 -4
  422. package/src/nodes/accessors/ReflectVector.js +3 -3
  423. package/src/nodes/accessors/SceneNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +3 -2
  425. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  426. package/src/nodes/accessors/StorageTextureNode.js +15 -4
  427. package/src/nodes/accessors/Tangent.js +25 -17
  428. package/src/nodes/accessors/TangentUtils.js +46 -0
  429. package/src/nodes/accessors/TextureBicubic.js +21 -3
  430. package/src/nodes/accessors/TextureNode.js +71 -8
  431. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  432. package/src/nodes/accessors/VelocityNode.js +1 -0
  433. package/src/nodes/accessors/VertexColorNode.js +4 -4
  434. package/src/nodes/code/CodeNode.js +8 -11
  435. package/src/nodes/core/ArrayNode.js +12 -0
  436. package/src/nodes/core/AssignNode.js +30 -5
  437. package/src/nodes/core/AttributeNode.js +2 -2
  438. package/src/nodes/core/ContextNode.js +27 -4
  439. package/src/nodes/core/Node.js +83 -22
  440. package/src/nodes/core/NodeBuilder.js +273 -49
  441. package/src/nodes/core/NodeUtils.js +46 -1
  442. package/src/nodes/core/NodeVarying.js +19 -1
  443. package/src/nodes/core/PropertyNode.js +8 -12
  444. package/src/nodes/core/StackNode.js +171 -26
  445. package/src/nodes/core/StructTypeNode.js +26 -4
  446. package/src/nodes/core/SubBuildNode.js +89 -0
  447. package/src/nodes/core/UniformNode.js +63 -5
  448. package/src/nodes/core/VarNode.js +102 -4
  449. package/src/nodes/core/VaryingNode.js +45 -24
  450. package/src/nodes/display/BlendModes.js +42 -1
  451. package/src/nodes/display/ColorSpaceNode.js +4 -27
  452. package/src/nodes/display/FrontFacingNode.js +34 -2
  453. package/src/nodes/display/NormalMapNode.js +19 -50
  454. package/src/nodes/display/PassNode.js +165 -20
  455. package/src/nodes/display/ScreenNode.js +0 -26
  456. package/src/nodes/display/ViewportTextureNode.js +67 -7
  457. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  458. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  459. package/src/nodes/functions/PhongLightingModel.js +3 -3
  460. package/src/nodes/functions/PhysicalLightingModel.js +16 -16
  461. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  462. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  463. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  464. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  465. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  466. package/src/nodes/gpgpu/ComputeNode.js +68 -24
  467. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  468. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  469. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  470. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  471. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  472. package/src/nodes/lighting/LightsNode.js +29 -11
  473. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  474. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  475. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  476. package/src/nodes/lighting/ShadowNode.js +174 -242
  477. package/src/nodes/lighting/SpotLightNode.js +44 -7
  478. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  479. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  480. package/src/nodes/math/ConditionalNode.js +1 -20
  481. package/src/nodes/math/MathNode.js +146 -75
  482. package/src/nodes/math/OperatorNode.js +129 -119
  483. package/src/nodes/shapes/Shapes.js +5 -4
  484. package/src/nodes/tsl/TSLBase.js +1 -0
  485. package/src/nodes/tsl/TSLCore.js +222 -72
  486. package/src/nodes/utils/DebugNode.js +16 -4
  487. package/src/nodes/utils/Discard.js +2 -2
  488. package/src/nodes/utils/EquirectUV.js +27 -0
  489. package/src/nodes/utils/EventNode.js +83 -0
  490. package/src/nodes/utils/LoopNode.js +64 -34
  491. package/src/nodes/utils/MatcapUV.js +22 -0
  492. package/src/nodes/utils/RTTNode.js +22 -5
  493. package/src/nodes/utils/ReflectorNode.js +77 -7
  494. package/src/nodes/utils/SampleNode.js +81 -0
  495. package/src/nodes/utils/TriplanarTextures.js +65 -0
  496. package/src/objects/BatchedMesh.js +20 -6
  497. package/src/objects/Mesh.js +9 -0
  498. package/src/objects/Skeleton.js +1 -1
  499. package/src/objects/Sprite.js +9 -0
  500. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  501. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  502. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  503. package/src/renderers/WebGLRenderer.js +45 -32
  504. package/src/renderers/common/Animation.js +2 -2
  505. package/src/renderers/common/Background.js +13 -2
  506. package/src/renderers/common/Bindings.js +19 -18
  507. package/src/renderers/common/Color4.js +2 -2
  508. package/src/renderers/common/CubeRenderTarget.js +1 -1
  509. package/src/renderers/common/PostProcessing.js +60 -5
  510. package/src/renderers/common/RenderList.js +0 -4
  511. package/src/renderers/common/RenderObject.js +80 -4
  512. package/src/renderers/common/Renderer.js +133 -22
  513. package/src/renderers/common/SampledTexture.js +3 -71
  514. package/src/renderers/common/Sampler.js +79 -0
  515. package/src/renderers/common/Storage3DTexture.js +100 -0
  516. package/src/renderers/common/StorageArrayTexture.js +84 -0
  517. package/src/renderers/common/StorageTexture.js +19 -0
  518. package/src/renderers/common/Textures.js +34 -24
  519. package/src/renderers/common/TimestampQueryPool.js +1 -0
  520. package/src/renderers/common/Uniform.js +1 -1
  521. package/src/renderers/common/UniformsGroup.js +14 -18
  522. package/src/renderers/common/XRManager.js +183 -35
  523. package/src/renderers/common/XRRenderTarget.js +21 -4
  524. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  525. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  526. package/src/renderers/common/nodes/Nodes.js +13 -3
  527. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  528. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
  529. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  530. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  531. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  532. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  533. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  534. package/src/renderers/webgl/WebGLProgram.js +22 -16
  535. package/src/renderers/webgl/WebGLPrograms.js +8 -6
  536. package/src/renderers/webgl/WebGLShadowMap.js +14 -3
  537. package/src/renderers/webgl/WebGLState.js +4 -4
  538. package/src/renderers/webgl/WebGLTextures.js +163 -11
  539. package/src/renderers/webgl/WebGLUtils.js +1 -3
  540. package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
  541. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
  542. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  543. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  544. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  545. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  546. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  547. package/src/renderers/webgpu/WebGPUBackend.js +505 -143
  548. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  549. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  550. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  551. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
  552. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  553. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  554. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
  555. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  556. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
  557. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
  558. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  559. package/src/renderers/webxr/WebXRController.js +1 -1
  560. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  561. package/src/renderers/webxr/WebXRManager.js +70 -9
  562. package/src/textures/DepthTexture.js +6 -10
  563. package/src/textures/ExternalTexture.js +45 -0
  564. package/src/textures/FramebufferTexture.js +2 -2
  565. package/src/textures/Source.js +32 -0
  566. package/src/textures/Texture.js +118 -1
  567. package/src/textures/VideoTexture.js +31 -3
  568. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  569. package/src/core/RenderTargetArray.js +0 -40
  570. package/src/nodes/utils/EquirectUVNode.js +0 -65
  571. package/src/nodes/utils/MatcapUVNode.js +0 -49
  572. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -35,10 +35,18 @@ class ViewportTextureNode extends TextureNode {
35
35
  */
36
36
  constructor( uvNode = screenUV, levelNode = null, framebufferTexture = null ) {
37
37
 
38
+ let defaultFramebuffer = null;
39
+
38
40
  if ( framebufferTexture === null ) {
39
41
 
40
- framebufferTexture = new FramebufferTexture();
41
- framebufferTexture.minFilter = LinearMipmapLinearFilter;
42
+ defaultFramebuffer = new FramebufferTexture();
43
+ defaultFramebuffer.minFilter = LinearMipmapLinearFilter;
44
+
45
+ framebufferTexture = defaultFramebuffer;
46
+
47
+ } else {
48
+
49
+ defaultFramebuffer = framebufferTexture;
42
50
 
43
51
  }
44
52
 
@@ -52,6 +60,16 @@ class ViewportTextureNode extends TextureNode {
52
60
  */
53
61
  this.generateMipmaps = false;
54
62
 
63
+ /**
64
+ * The reference framebuffer texture. This is used to store the framebuffer texture
65
+ * for the current render target. If the render target changes, a new framebuffer texture
66
+ * is created automatically.
67
+ *
68
+ * @type {FramebufferTexture}
69
+ * @default null
70
+ */
71
+ this.defaultFramebuffer = defaultFramebuffer;
72
+
55
73
  /**
56
74
  * This flag can be used for type testing.
57
75
  *
@@ -62,24 +80,64 @@ class ViewportTextureNode extends TextureNode {
62
80
  this.isOutputTextureNode = true;
63
81
 
64
82
  /**
65
- * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the
66
- * scene once per frame in its {@link ViewportTextureNode#updateBefore} method.
83
+ * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node renders the
84
+ * scene once per render in its {@link ViewportTextureNode#updateBefore} method.
67
85
  *
68
86
  * @type {string}
69
87
  * @default 'frame'
70
88
  */
71
- this.updateBeforeType = NodeUpdateType.FRAME;
89
+ this.updateBeforeType = NodeUpdateType.RENDER;
90
+
91
+ /**
92
+ * The framebuffer texture for the current renderer context.
93
+ *
94
+ * @type {WeakMap<RenderTarget, FramebufferTexture>}
95
+ * @private
96
+ */
97
+ this._textures = new WeakMap();
98
+
99
+ }
100
+
101
+ getFrameBufferTexture( reference = null ) {
102
+
103
+ const defaultFramebuffer = this.referenceNode ? this.referenceNode.defaultFramebuffer : this.defaultFramebuffer;
104
+
105
+ if ( reference === null ) {
106
+
107
+ return defaultFramebuffer;
108
+
109
+ }
110
+
111
+ if ( this._textures.has( reference ) === false ) {
112
+
113
+ const framebufferTexture = defaultFramebuffer.clone();
114
+
115
+ this._textures.set( reference, framebufferTexture );
116
+
117
+ }
118
+
119
+ return this._textures.get( reference );
72
120
 
73
121
  }
74
122
 
75
123
  updateBefore( frame ) {
76
124
 
77
125
  const renderer = frame.renderer;
78
- renderer.getDrawingBufferSize( _size );
126
+ const renderTarget = renderer.getRenderTarget();
127
+
128
+ if ( renderTarget === null ) {
129
+
130
+ renderer.getDrawingBufferSize( _size );
131
+
132
+ } else {
133
+
134
+ _size.set( renderTarget.width, renderTarget.height );
135
+
136
+ }
79
137
 
80
138
  //
81
139
 
82
- const framebufferTexture = this.value;
140
+ const framebufferTexture = this.getFrameBufferTexture( renderTarget );
83
141
 
84
142
  if ( framebufferTexture.image.width !== _size.width || framebufferTexture.image.height !== _size.height ) {
85
143
 
@@ -98,6 +156,8 @@ class ViewportTextureNode extends TextureNode {
98
156
 
99
157
  framebufferTexture.generateMipmaps = currentGenerateMipmaps;
100
158
 
159
+ this.value = framebufferTexture;
160
+
101
161
  }
102
162
 
103
163
  clone() {
@@ -3,17 +3,13 @@ import V_GGX_SmithCorrelated from './V_GGX_SmithCorrelated.js';
3
3
  import V_GGX_SmithCorrelated_Anisotropic from './V_GGX_SmithCorrelated_Anisotropic.js';
4
4
  import D_GGX from './D_GGX.js';
5
5
  import D_GGX_Anisotropic from './D_GGX_Anisotropic.js';
6
- import { transformedNormalView } from '../../accessors/Normal.js';
6
+ import { normalView as NormalView } from '../../accessors/Normal.js';
7
7
  import { positionViewDirection } from '../../accessors/Position.js';
8
8
  import { iridescence, alphaT, anisotropyT, anisotropyB } from '../../core/PropertyNode.js';
9
9
  import { Fn, defined } from '../../tsl/TSLBase.js';
10
10
 
11
11
  // GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility
12
- const BRDF_GGX = /*@__PURE__*/ Fn( ( inputs ) => {
13
-
14
- const { lightDirection, f0, f90, roughness, f, USE_IRIDESCENCE, USE_ANISOTROPY } = inputs;
15
-
16
- const normalView = inputs.normalView || transformedNormalView;
12
+ const BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, normalView = NormalView, USE_IRIDESCENCE, USE_ANISOTROPY } ) => {
17
13
 
18
14
  const alpha = roughness.pow2(); // UE4's roughness
19
15
 
@@ -1,4 +1,4 @@
1
- import { transformedNormalView } from '../../accessors/Normal.js';
1
+ import { normalView } from '../../accessors/Normal.js';
2
2
  import { positionViewDirection } from '../../accessors/Position.js';
3
3
  import { sheen, sheenRoughness } from '../../core/PropertyNode.js';
4
4
  import { Fn, float } from '../../tsl/TSLBase.js';
@@ -43,9 +43,9 @@ const BRDF_Sheen = /*@__PURE__*/ Fn( ( { lightDirection } ) => {
43
43
 
44
44
  const halfDir = lightDirection.add( positionViewDirection ).normalize();
45
45
 
46
- const dotNL = transformedNormalView.dot( lightDirection ).clamp();
47
- const dotNV = transformedNormalView.dot( positionViewDirection ).clamp();
48
- const dotNH = transformedNormalView.dot( halfDir ).clamp();
46
+ const dotNL = normalView.dot( lightDirection ).clamp();
47
+ const dotNV = normalView.dot( positionViewDirection ).clamp();
48
+ const dotNH = normalView.dot( halfDir ).clamp();
49
49
 
50
50
  const D = D_Charlie( { roughness: sheenRoughness, dotNH } );
51
51
  const V = V_Neubelt( { dotNV, dotNL } );
@@ -2,7 +2,7 @@ import BasicLightingModel from './BasicLightingModel.js';
2
2
  import F_Schlick from './BSDF/F_Schlick.js';
3
3
  import BRDF_Lambert from './BSDF/BRDF_Lambert.js';
4
4
  import { diffuseColor, shininess, specularColor } from '../core/PropertyNode.js';
5
- import { transformedNormalView } from '../accessors/Normal.js';
5
+ import { normalView } from '../accessors/Normal.js';
6
6
  import { materialSpecularStrength } from '../accessors/MaterialNode.js';
7
7
  import { positionViewDirection } from '../accessors/Position.js';
8
8
  import { Fn, float } from '../tsl/TSLBase.js';
@@ -19,7 +19,7 @@ const BRDF_BlinnPhong = /*@__PURE__*/ Fn( ( { lightDirection } ) => {
19
19
 
20
20
  const halfDir = lightDirection.add( positionViewDirection ).normalize();
21
21
 
22
- const dotNH = transformedNormalView.dot( halfDir ).clamp();
22
+ const dotNH = normalView.dot( halfDir ).clamp();
23
23
  const dotVH = positionViewDirection.dot( halfDir ).clamp();
24
24
 
25
25
  const F = F_Schlick( { f0: specularColor, f90: 1.0, dotVH } );
@@ -66,7 +66,7 @@ class PhongLightingModel extends BasicLightingModel {
66
66
  */
67
67
  direct( { lightDirection, lightColor, reflectedLight } ) {
68
68
 
69
- const dotNL = transformedNormalView.dot( lightDirection ).clamp();
69
+ const dotNL = normalView.dot( lightDirection ).clamp();
70
70
  const irradiance = dotNL.mul( lightColor );
71
71
 
72
72
  reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseColor.rgb } ) ) );
@@ -8,7 +8,7 @@ import BRDF_Sheen from './BSDF/BRDF_Sheen.js';
8
8
  import { LTC_Evaluate, LTC_Uv } from './BSDF/LTC.js';
9
9
  import LightingModel from '../core/LightingModel.js';
10
10
  import { diffuseColor, specularColor, specularF90, roughness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
11
- import { transformedNormalView, transformedClearcoatNormalView, transformedNormalWorld } from '../accessors/Normal.js';
11
+ import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
12
12
  import { positionViewDirection, positionView, positionWorld } from '../accessors/Position.js';
13
13
  import { Fn, float, vec2, vec3, vec4, mat3, If } from '../tsl/TSLBase.js';
14
14
  import { select } from '../math/ConditionalNode.js';
@@ -18,7 +18,7 @@ import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix } from '../acc
18
18
  import { modelWorldMatrix } from '../accessors/ModelNode.js';
19
19
  import { screenSize } from '../display/ScreenNode.js';
20
20
  import { viewportMipTexture } from '../display/ViewportTextureNode.js';
21
- import { textureBicubic } from '../accessors/TextureBicubic.js';
21
+ import { textureBicubicLevel } from '../accessors/TextureBicubic.js';
22
22
  import { Loop } from '../utils/LoopNode.js';
23
23
  import { BackSide } from '../../constants.js';
24
24
 
@@ -80,7 +80,7 @@ const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ],
80
80
 
81
81
  const lod = log2( screenSize.x ).mul( applyIorToRoughness( roughness, ior ) );
82
82
 
83
- return textureBicubic( transmissionSample, lod );
83
+ return textureBicubicLevel( transmissionSample, lod );
84
84
 
85
85
  } );
86
86
 
@@ -494,7 +494,7 @@ class PhysicalLightingModel extends LightingModel {
494
494
 
495
495
  if ( this.iridescence === true ) {
496
496
 
497
- const dotNVi = transformedNormalView.dot( positionViewDirection ).clamp();
497
+ const dotNVi = normalView.dot( positionViewDirection ).clamp();
498
498
 
499
499
  this.iridescenceFresnel = evalIridescence( {
500
500
  outsideIOR: float( 1.0 ),
@@ -512,7 +512,7 @@ class PhysicalLightingModel extends LightingModel {
512
512
 
513
513
  const position = positionWorld;
514
514
  const v = cameraPosition.sub( positionWorld ).normalize(); // TODO: Create Node for this, same issue in MaterialX
515
- const n = transformedNormalWorld;
515
+ const n = normalWorld;
516
516
 
517
517
  const context = builder.context;
518
518
 
@@ -550,7 +550,7 @@ class PhysicalLightingModel extends LightingModel {
550
550
 
551
551
  computeMultiscattering( singleScatter, multiScatter, specularF90 ) {
552
552
 
553
- const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
553
+ const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
554
554
 
555
555
  const fab = DFGApprox( { roughness, dotNV } );
556
556
 
@@ -575,9 +575,9 @@ class PhysicalLightingModel extends LightingModel {
575
575
  * @param {Object} lightData - The light data.
576
576
  * @param {NodeBuilder} builder - The current node builder.
577
577
  */
578
- direct( { lightDirection, lightColor, reflectedLight } ) {
578
+ direct( { lightDirection, lightColor, reflectedLight }, /* builder */ ) {
579
579
 
580
- const dotNL = transformedNormalView.dot( lightDirection ).clamp();
580
+ const dotNL = normalView.dot( lightDirection ).clamp();
581
581
  const irradiance = dotNL.mul( lightColor );
582
582
 
583
583
  if ( this.sheen === true ) {
@@ -588,10 +588,10 @@ class PhysicalLightingModel extends LightingModel {
588
588
 
589
589
  if ( this.clearcoat === true ) {
590
590
 
591
- const dotNLcc = transformedClearcoatNormalView.dot( lightDirection ).clamp();
591
+ const dotNLcc = clearcoatNormalView.dot( lightDirection ).clamp();
592
592
  const ccIrradiance = dotNLcc.mul( lightColor );
593
593
 
594
- this.clearcoatSpecularDirect.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: transformedClearcoatNormalView } ) ) );
594
+ this.clearcoatSpecularDirect.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: clearcoatNormalView } ) ) );
595
595
 
596
596
  }
597
597
 
@@ -608,14 +608,14 @@ class PhysicalLightingModel extends LightingModel {
608
608
  * @param {Object} input - The input data.
609
609
  * @param {NodeBuilder} builder - The current node builder.
610
610
  */
611
- directRectArea( { lightColor, lightPosition, halfWidth, halfHeight, reflectedLight, ltc_1, ltc_2 } ) {
611
+ directRectArea( { lightColor, lightPosition, halfWidth, halfHeight, reflectedLight, ltc_1, ltc_2 }, /* builder */ ) {
612
612
 
613
613
  const p0 = lightPosition.add( halfWidth ).sub( halfHeight ); // counterclockwise; light shines in local neg z direction
614
614
  const p1 = lightPosition.sub( halfWidth ).sub( halfHeight );
615
615
  const p2 = lightPosition.sub( halfWidth ).add( halfHeight );
616
616
  const p3 = lightPosition.add( halfWidth ).add( halfHeight );
617
617
 
618
- const N = transformedNormalView;
618
+ const N = normalView;
619
619
  const V = positionViewDirection;
620
620
  const P = positionView.toVar();
621
621
 
@@ -680,7 +680,7 @@ class PhysicalLightingModel extends LightingModel {
680
680
  this.sheenSpecularIndirect.addAssign( iblIrradiance.mul(
681
681
  sheen,
682
682
  IBLSheenBRDF( {
683
- normal: transformedNormalView,
683
+ normal: normalView,
684
684
  viewDir: positionViewDirection,
685
685
  roughness: sheenRoughness
686
686
  } )
@@ -690,7 +690,7 @@ class PhysicalLightingModel extends LightingModel {
690
690
 
691
691
  if ( this.clearcoat === true ) {
692
692
 
693
- const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
693
+ const dotNVcc = clearcoatNormalView.dot( positionViewDirection ).clamp();
694
694
 
695
695
  const clearcoatEnv = EnvironmentBRDF( {
696
696
  dotNV: dotNVcc,
@@ -731,7 +731,7 @@ class PhysicalLightingModel extends LightingModel {
731
731
 
732
732
  const { ambientOcclusion, reflectedLight } = builder.context;
733
733
 
734
- const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
734
+ const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
735
735
 
736
736
  const aoNV = dotNV.add( ambientOcclusion );
737
737
  const aoExp = roughness.mul( - 16.0 ).oneMinus().negate().exp2();
@@ -766,7 +766,7 @@ class PhysicalLightingModel extends LightingModel {
766
766
 
767
767
  if ( this.clearcoat === true ) {
768
768
 
769
- const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
769
+ const dotNVcc = clearcoatNormalView.dot( positionViewDirection ).clamp();
770
770
 
771
771
  const Fcc = F_Schlick( {
772
772
  dotVH: dotNVcc,
@@ -32,7 +32,11 @@ class ShadowMaskModel extends LightingModel {
32
32
  */
33
33
  direct( { lightNode } ) {
34
34
 
35
- this.shadowNode.mulAssign( lightNode.shadowNode );
35
+ if ( lightNode.shadowNode !== null ) {
36
+
37
+ this.shadowNode.mulAssign( lightNode.shadowNode );
38
+
39
+ }
36
40
 
37
41
  }
38
42
 
@@ -1,4 +1,4 @@
1
- import { normalView } from '../../accessors/Normal.js';
1
+ import { normalViewGeometry } from '../../accessors/Normal.js';
2
2
  import { float, Fn } from '../../tsl/TSLBase.js';
3
3
 
4
4
  const getGeometryRoughness = /*@__PURE__*/ Fn( ( builder ) => {
@@ -9,7 +9,7 @@ const getGeometryRoughness = /*@__PURE__*/ Fn( ( builder ) => {
9
9
 
10
10
  }
11
11
 
12
- const dxy = normalView.dFdx().abs().max( normalView.dFdy().abs() );
12
+ const dxy = normalViewGeometry.dFdx().abs().max( normalViewGeometry.dFdy().abs() );
13
13
  const geometryRoughness = dxy.x.max( dxy.y ).max( dxy.z );
14
14
 
15
15
  return geometryRoughness;
@@ -28,7 +28,7 @@ const getParallaxCorrectNormal = /*@__PURE__*/ Fn( ( [ normal, cubeSize, cubePos
28
28
  rbminmax.y = nDir.y.greaterThan( float( 0 ) ).select( rbmax.y, rbmin.y );
29
29
  rbminmax.z = nDir.z.greaterThan( float( 0 ) ).select( rbmax.z, rbmin.z );
30
30
 
31
- const correction = min( min( rbminmax.x, rbminmax.y ), rbminmax.z ).toVar();
31
+ const correction = min( rbminmax.x, rbminmax.y, rbminmax.z ).toVar();
32
32
  const boxIntersection = positionWorld.add( nDir.mul( correction ) ).toVar();
33
33
  return boxIntersection.sub( cubePos );
34
34
 
@@ -1,4 +1,5 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
+ import { expression } from '../code/ExpressionNode.js';
2
3
  import { nodeProxy } from '../tsl/TSLCore.js';
3
4
 
4
5
  /**
@@ -10,9 +11,9 @@ import { nodeProxy } from '../tsl/TSLCore.js';
10
11
  *
11
12
  * This node can only be used with a WebGPU backend.
12
13
  *
13
- * @augments TempNode
14
+ * @augments Node
14
15
  */
15
- class AtomicFunctionNode extends TempNode {
16
+ class AtomicFunctionNode extends Node {
16
17
 
17
18
  static get type() {
18
19
 
@@ -52,6 +53,14 @@ class AtomicFunctionNode extends TempNode {
52
53
  */
53
54
  this.valueNode = valueNode;
54
55
 
56
+ /**
57
+ * Creates a list of the parents for this node for detecting if the node needs to return a value.
58
+ *
59
+ * @type {boolean}
60
+ * @default true
61
+ */
62
+ this.parents = true;
63
+
55
64
  }
56
65
 
57
66
  /**
@@ -81,6 +90,9 @@ class AtomicFunctionNode extends TempNode {
81
90
 
82
91
  generate( builder ) {
83
92
 
93
+ const properties = builder.getNodeProperties( this );
94
+ const parents = properties.parents;
95
+
84
96
  const method = this.method;
85
97
 
86
98
  const type = this.getNodeType( builder );
@@ -101,14 +113,23 @@ class AtomicFunctionNode extends TempNode {
101
113
  }
102
114
 
103
115
  const methodSnippet = `${ builder.getMethod( method, type ) }( ${ params.join( ', ' ) } )`;
116
+ const isVoid = parents ? ( parents.length === 1 && parents[ 0 ].isStackNode === true ) : false;
104
117
 
105
- if ( b !== null ) {
118
+ if ( isVoid ) {
106
119
 
107
120
  builder.addLineFlowCode( methodSnippet, this );
108
121
 
109
- }
122
+ } else {
110
123
 
111
- return methodSnippet;
124
+ if ( properties.constNode === undefined ) {
125
+
126
+ properties.constNode = expression( methodSnippet, type ).toConst();
127
+
128
+ }
129
+
130
+ return properties.constNode.build( builder );
131
+
132
+ }
112
133
 
113
134
  }
114
135
 
@@ -150,10 +171,7 @@ const atomicNode = nodeProxy( AtomicFunctionNode );
150
171
  */
151
172
  export const atomicFunc = ( method, pointerNode, valueNode ) => {
152
173
 
153
- const node = atomicNode( method, pointerNode, valueNode );
154
- node.append();
155
-
156
- return node;
174
+ return atomicNode( method, pointerNode, valueNode ).toStack();
157
175
 
158
176
  };
159
177
 
@@ -63,7 +63,7 @@ const barrier = nodeProxy( BarrierNode );
63
63
  * @function
64
64
  * @returns {BarrierNode}
65
65
  */
66
- export const workgroupBarrier = () => barrier( 'workgroup' ).append();
66
+ export const workgroupBarrier = () => barrier( 'workgroup' ).toStack();
67
67
 
68
68
  /**
69
69
  * TSL function for creating a storage barrier. All invocations must
@@ -74,7 +74,7 @@ export const workgroupBarrier = () => barrier( 'workgroup' ).append();
74
74
  * @function
75
75
  * @returns {BarrierNode}
76
76
  */
77
- export const storageBarrier = () => barrier( 'storage' ).append();
77
+ export const storageBarrier = () => barrier( 'storage' ).toStack();
78
78
 
79
79
  /**
80
80
  * TSL function for creating a texture barrier. All invocations must
@@ -85,5 +85,5 @@ export const storageBarrier = () => barrier( 'storage' ).append();
85
85
  * @function
86
86
  * @returns {BarrierNode}
87
87
  */
88
- export const textureBarrier = () => barrier( 'texture' ).append();
88
+ export const textureBarrier = () => barrier( 'texture' ).toStack();
89
89
 
@@ -19,10 +19,9 @@ class ComputeNode extends Node {
19
19
  * Constructs a new compute node.
20
20
  *
21
21
  * @param {Node} computeNode - TODO
22
- * @param {number} count - TODO.
23
- * @param {Array<number>} [workgroupSize=[64]] - TODO.
22
+ * @param {Array<number>} workgroupSize - TODO.
24
23
  */
25
- constructor( computeNode, count, workgroupSize = [ 64 ] ) {
24
+ constructor( computeNode, workgroupSize ) {
26
25
 
27
26
  super( 'void' );
28
27
 
@@ -42,18 +41,12 @@ class ComputeNode extends Node {
42
41
  */
43
42
  this.computeNode = computeNode;
44
43
 
45
- /**
46
- * TODO
47
- *
48
- * @type {number}
49
- */
50
- this.count = count;
51
44
 
52
45
  /**
53
46
  * TODO
54
47
  *
55
48
  * @type {Array<number>}
56
- * @default [64]
49
+ * @default [ 64 ]
57
50
  */
58
51
  this.workgroupSize = workgroupSize;
59
52
 
@@ -62,7 +55,7 @@ class ComputeNode extends Node {
62
55
  *
63
56
  * @type {number}
64
57
  */
65
- this.dispatchCount = 0;
58
+ this.count = null;
66
59
 
67
60
  /**
68
61
  * TODO
@@ -95,7 +88,19 @@ class ComputeNode extends Node {
95
88
  */
96
89
  this.onInitFunction = null;
97
90
 
98
- this.updateDispatchCount();
91
+ }
92
+
93
+ setCount( count ) {
94
+
95
+ this.count = count;
96
+
97
+ return this;
98
+
99
+ }
100
+
101
+ getCount() {
102
+
103
+ return this.count;
99
104
 
100
105
  }
101
106
 
@@ -114,7 +119,7 @@ class ComputeNode extends Node {
114
119
  * @param {string} name - The name of the uniform.
115
120
  * @return {ComputeNode} A reference to this node.
116
121
  */
117
- label( name ) {
122
+ setName( name ) {
118
123
 
119
124
  this.name = name;
120
125
 
@@ -123,18 +128,17 @@ class ComputeNode extends Node {
123
128
  }
124
129
 
125
130
  /**
126
- * TODO
131
+ * Sets the {@link ComputeNode#name} property.
132
+ *
133
+ * @deprecated
134
+ * @param {string} name - The name of the uniform.
135
+ * @return {ComputeNode} A reference to this node.
127
136
  */
128
- updateDispatchCount() {
129
-
130
- const { count, workgroupSize } = this;
131
-
132
- let size = workgroupSize[ 0 ];
137
+ label( name ) {
133
138
 
134
- for ( let i = 1; i < workgroupSize.length; i ++ )
135
- size *= workgroupSize[ i ];
139
+ console.warn( 'THREE.TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
136
140
 
137
- this.dispatchCount = Math.ceil( count / size );
141
+ return this.setName( name );
138
142
 
139
143
  }
140
144
 
@@ -165,7 +169,7 @@ class ComputeNode extends Node {
165
169
 
166
170
  setup( builder ) {
167
171
 
168
- const result = this.computeNode.setup( builder );
172
+ const result = this.computeNode.build( builder );
169
173
 
170
174
  if ( result ) {
171
175
 
@@ -213,6 +217,45 @@ class ComputeNode extends Node {
213
217
 
214
218
  export default ComputeNode;
215
219
 
220
+ /**
221
+ * TSL function for creating a compute kernel node.
222
+ *
223
+ * @tsl
224
+ * @function
225
+ * @param {Node} node - TODO
226
+ * @param {Array<number>} [workgroupSize=[64]] - TODO.
227
+ * @returns {AtomicFunctionNode}
228
+ */
229
+ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
230
+
231
+ if ( workgroupSize.length === 0 || workgroupSize.length > 3 ) {
232
+
233
+ console.error( 'THREE.TSL: compute() workgroupSize must have 1, 2, or 3 elements' );
234
+
235
+ }
236
+
237
+ for ( let i = 0; i < workgroupSize.length; i ++ ) {
238
+
239
+ const val = workgroupSize[ i ];
240
+
241
+ if ( typeof val !== 'number' || val <= 0 || ! Number.isInteger( val ) ) {
242
+
243
+ console.error( `THREE.TSL: compute() workgroupSize element at index [ ${ i } ] must be a positive integer` );
244
+
245
+ }
246
+
247
+ }
248
+
249
+ // Implicit fill-up to [ x, y, z ] with 1s, just like WGSL treats @workgroup_size when fewer dimensions are specified
250
+
251
+ while ( workgroupSize.length < 3 ) workgroupSize.push( 1 );
252
+
253
+ //
254
+
255
+ return nodeObject( new ComputeNode( nodeObject( node ), workgroupSize ) );
256
+
257
+ };
258
+
216
259
  /**
217
260
  * TSL function for creating a compute node.
218
261
  *
@@ -223,6 +266,7 @@ export default ComputeNode;
223
266
  * @param {Array<number>} [workgroupSize=[64]] - TODO.
224
267
  * @returns {AtomicFunctionNode}
225
268
  */
226
- export const compute = ( node, count, workgroupSize ) => nodeObject( new ComputeNode( nodeObject( node ), count, workgroupSize ) );
269
+ export const compute = ( node, count, workgroupSize ) => computeKernel( node, workgroupSize ).setCount( count );
227
270
 
228
271
  addMethodChaining( 'compute', compute );
272
+ addMethodChaining( 'computeKernel', computeKernel );
@@ -116,15 +116,23 @@ class WorkgroupInfoNode extends Node {
116
116
  */
117
117
  this.scope = scope;
118
118
 
119
+ /**
120
+ * The name of the workgroup scoped buffer.
121
+ *
122
+ * @type {string}
123
+ * @default ''
124
+ */
125
+ this.name = '';
126
+
119
127
  }
120
128
 
121
129
  /**
122
- * Sets the name/label of this node.
130
+ * Sets the name of this node.
123
131
  *
124
132
  * @param {string} name - The name to set.
125
133
  * @return {WorkgroupInfoNode} A reference to this node.
126
134
  */
127
- label( name ) {
135
+ setName( name ) {
128
136
 
129
137
  this.name = name;
130
138
 
@@ -132,6 +140,21 @@ class WorkgroupInfoNode extends Node {
132
140
 
133
141
  }
134
142
 
143
+ /**
144
+ * Sets the name/label of this node.
145
+ *
146
+ * @deprecated
147
+ * @param {string} name - The name to set.
148
+ * @return {WorkgroupInfoNode} A reference to this node.
149
+ */
150
+ label( name ) {
151
+
152
+ console.warn( 'THREE.TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
153
+
154
+ return this.setName( name );
155
+
156
+ }
157
+
135
158
  /**
136
159
  * Sets the scope of this node.
137
160
  *
@@ -185,7 +208,9 @@ class WorkgroupInfoNode extends Node {
185
208
 
186
209
  generate( builder ) {
187
210
 
188
- return builder.getScopedArray( this.name || `${this.scope}Array_${this.id}`, this.scope.toLowerCase(), this.bufferType, this.bufferCount );
211
+ const name = ( this.name !== '' ) ? this.name : `${this.scope}Array_${this.id}`;
212
+
213
+ return builder.getScopedArray( name, this.scope.toLowerCase(), this.bufferType, this.bufferCount );
189
214
 
190
215
  }
191
216