@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
@@ -1,6 +1,7 @@
1
1
  import Node from './Node.js';
2
2
  import { NodeShaderStage } from './constants.js';
3
3
  import { addMethodChaining, nodeProxy } from '../tsl/TSLCore.js';
4
+ import { subBuild } from './SubBuildNode.js';
4
5
 
5
6
  /**
6
7
  * Class for representing shader varyings as nodes. Varyings are create from
@@ -55,17 +56,45 @@ class VaryingNode extends Node {
55
56
  */
56
57
  this.isVaryingNode = true;
57
58
 
59
+ /**
60
+ * The interpolation type of the varying data.
61
+ *
62
+ * @type {?string}
63
+ * @default null
64
+ */
65
+ this.interpolationType = null;
66
+
67
+ /**
68
+ * The interpolation sampling type of varying data.
69
+ *
70
+ * @type {?string}
71
+ * @default null
72
+ */
73
+ this.interpolationSampling = null;
74
+
75
+ /**
76
+ * This flag is used for global cache.
77
+ *
78
+ * @type {boolean}
79
+ * @default true
80
+ */
81
+ this.global = true;
82
+
58
83
  }
59
84
 
60
85
  /**
61
- * The method is overwritten so it always returns `true`.
86
+ * Defines the interpolation type of the varying.
62
87
  *
63
- * @param {NodeBuilder} builder - The current node builder.
64
- * @return {boolean} Whether this node is global or not.
88
+ * @param {string} type - The interpolation type.
89
+ * @param {?string} sampling - The interpolation sampling type
90
+ * @return {VaryingNode} A reference to this node.
65
91
  */
66
- isGlobal( /*builder*/ ) {
92
+ setInterpolation( type, sampling = null ) {
93
+
94
+ this.interpolationType = type;
95
+ this.interpolationSampling = sampling;
67
96
 
68
- return true;
97
+ return this;
69
98
 
70
99
  }
71
100
 
@@ -99,9 +128,11 @@ class VaryingNode extends Node {
99
128
 
100
129
  const name = this.name;
101
130
  const type = this.getNodeType( builder );
131
+ const interpolationType = this.interpolationType;
132
+ const interpolationSampling = this.interpolationSampling;
102
133
 
103
- properties.varying = varying = builder.getVaryingFromNode( this, name, type );
104
- properties.node = this.node;
134
+ properties.varying = varying = builder.getVaryingFromNode( this, name, type, interpolationType, interpolationSampling );
135
+ properties.node = subBuild( this.node, 'VERTEX' );
105
136
 
106
137
  }
107
138
 
@@ -116,43 +147,33 @@ class VaryingNode extends Node {
116
147
 
117
148
  this.setupVarying( builder );
118
149
 
150
+ builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, this.node );
151
+
119
152
  }
120
153
 
121
154
  analyze( builder ) {
122
155
 
123
156
  this.setupVarying( builder );
124
157
 
125
- return this.node.analyze( builder );
158
+ builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, this.node );
126
159
 
127
160
  }
128
161
 
129
162
  generate( builder ) {
130
163
 
164
+ const propertyKey = builder.getSubBuildProperty( 'property', builder.currentStack );
131
165
  const properties = builder.getNodeProperties( this );
132
166
  const varying = this.setupVarying( builder );
133
167
 
134
- const needsReassign = builder.shaderStage === 'fragment' && properties.reassignPosition === true && builder.context.needsPositionReassign;
135
-
136
- if ( properties.propertyName === undefined || needsReassign ) {
168
+ if ( properties[ propertyKey ] === undefined ) {
137
169
 
138
170
  const type = this.getNodeType( builder );
139
171
  const propertyName = builder.getPropertyName( varying, NodeShaderStage.VERTEX );
140
172
 
141
173
  // force node run in vertex stage
142
- builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, this.node, type, propertyName );
143
-
144
- properties.propertyName = propertyName;
145
-
146
- if ( needsReassign ) {
147
-
148
- // once reassign varying in fragment stage
149
- properties.reassignPosition = false;
150
-
151
- } else if ( properties.reassignPosition === undefined && builder.context.isPositionNodeInput ) {
152
-
153
- properties.reassignPosition = true;
174
+ builder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, properties.node, type, propertyName );
154
175
 
155
- }
176
+ properties[ propertyKey ] = propertyName;
156
177
 
157
178
  }
158
179
 
@@ -1,4 +1,4 @@
1
- import { Fn, vec4 } from '../tsl/TSLBase.js';
1
+ import { Fn, If, vec4 } from '../tsl/TSLBase.js';
2
2
  import { mix, min, step } from '../math/MathNode.js';
3
3
 
4
4
  /**
@@ -130,6 +130,47 @@ export const blendColor = /*@__PURE__*/ Fn( ( [ base, blend ] ) => {
130
130
  ]
131
131
  } );
132
132
 
133
+ /**
134
+ * Premultiplies the RGB channels of a color by its alpha channel.
135
+ *
136
+ * This function is useful for converting a non-premultiplied alpha color
137
+ * into a premultiplied alpha format, where the RGB values are scaled
138
+ * by the alpha value. Premultiplied alpha is often used in graphics
139
+ * rendering for certain operations, such as compositing and image processing.
140
+ *
141
+ * @tsl
142
+ * @function
143
+ * @param {Node<vec4>} color - The input color with non-premultiplied alpha.
144
+ * @return {Node<vec4>} The color with premultiplied alpha.
145
+ */
146
+ export const premultiplyAlpha = /*@__PURE__*/ Fn( ( [ color ] ) => {
147
+
148
+ return vec4( color.rgb.mul( color.a ), color.a );
149
+
150
+ }, { color: 'vec4', return: 'vec4' } );
151
+
152
+ /**
153
+ * Unpremultiplies the RGB channels of a color by its alpha channel.
154
+ *
155
+ * This function is useful for converting a premultiplied alpha color
156
+ * back into a non-premultiplied alpha format, where the RGB values are
157
+ * divided by the alpha value. Unpremultiplied alpha is often used in graphics
158
+ * rendering for certain operations, such as compositing and image processing.
159
+ *
160
+ * @tsl
161
+ * @function
162
+ * @param {Node<vec4>} color - The input color with premultiplied alpha.
163
+ * @return {Node<vec4>} The color with non-premultiplied alpha.
164
+ */
165
+ export const unpremultiplyAlpha = /*@__PURE__*/ Fn( ( [ color ] ) => {
166
+
167
+ If( color.a.equal( 0.0 ), () => vec4( 0.0 ) );
168
+
169
+ return vec4( color.rgb.div( color.a ), color.a );
170
+
171
+ }, { color: 'vec4', return: 'vec4' } );
172
+
173
+
133
174
  // Deprecated
134
175
 
135
176
  /**
@@ -126,36 +126,16 @@ class ColorSpaceNode extends TempNode {
126
126
 
127
127
  export default ColorSpaceNode;
128
128
 
129
- /**
130
- * TSL function for converting a given color node to the current output color space.
131
- *
132
- * @tsl
133
- * @function
134
- * @param {Node} node - Represents the node to convert.
135
- * @returns {ColorSpaceNode}
136
- */
137
- export const toOutputColorSpace = ( node ) => nodeObject( new ColorSpaceNode( nodeObject( node ), WORKING_COLOR_SPACE, OUTPUT_COLOR_SPACE ) );
138
-
139
- /**
140
- * TSL function for converting a given color node to the current working color space.
141
- *
142
- * @tsl
143
- * @function
144
- * @param {Node} node - Represents the node to convert.
145
- * @returns {ColorSpaceNode}
146
- */
147
- export const toWorkingColorSpace = ( node ) => nodeObject( new ColorSpaceNode( nodeObject( node ), OUTPUT_COLOR_SPACE, WORKING_COLOR_SPACE ) );
148
-
149
129
  /**
150
130
  * TSL function for converting a given color node from the current working color space to the given color space.
151
131
  *
152
132
  * @tsl
153
133
  * @function
154
134
  * @param {Node} node - Represents the node to convert.
155
- * @param {string} colorSpace - The target color space.
135
+ * @param {string} targetColorSpace - The target color space.
156
136
  * @returns {ColorSpaceNode}
157
137
  */
158
- export const workingToColorSpace = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), WORKING_COLOR_SPACE, colorSpace ) );
138
+ export const workingToColorSpace = ( node, targetColorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), WORKING_COLOR_SPACE, targetColorSpace ) );
159
139
 
160
140
  /**
161
141
  * TSL function for converting a given color node from the given color space to the current working color space.
@@ -163,10 +143,10 @@ export const workingToColorSpace = ( node, colorSpace ) => nodeObject( new Color
163
143
  * @tsl
164
144
  * @function
165
145
  * @param {Node} node - Represents the node to convert.
166
- * @param {string} colorSpace - The source color space.
146
+ * @param {string} sourceColorSpace - The source color space.
167
147
  * @returns {ColorSpaceNode}
168
148
  */
169
- export const colorSpaceToWorking = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), colorSpace, WORKING_COLOR_SPACE ) );
149
+ export const colorSpaceToWorking = ( node, sourceColorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), sourceColorSpace, WORKING_COLOR_SPACE ) );
170
150
 
171
151
  /**
172
152
  * TSL function for converting a given color node from one color space to another one.
@@ -180,8 +160,5 @@ export const colorSpaceToWorking = ( node, colorSpace ) => nodeObject( new Color
180
160
  */
181
161
  export const convertColorSpace = ( node, sourceColorSpace, targetColorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), sourceColorSpace, targetColorSpace ) );
182
162
 
183
- addMethodChaining( 'toOutputColorSpace', toOutputColorSpace );
184
- addMethodChaining( 'toWorkingColorSpace', toWorkingColorSpace );
185
-
186
163
  addMethodChaining( 'workingToColorSpace', workingToColorSpace );
187
164
  addMethodChaining( 'colorSpaceToWorking', colorSpaceToWorking );
@@ -1,7 +1,7 @@
1
1
  import Node from '../core/Node.js';
2
- import { nodeImmutable, float } from '../tsl/TSLBase.js';
2
+ import { nodeImmutable, float, Fn } from '../tsl/TSLBase.js';
3
3
 
4
- import { BackSide, WebGLCoordinateSystem } from '../../constants.js';
4
+ import { BackSide, DoubleSide, WebGLCoordinateSystem } from '../../constants.js';
5
5
 
6
6
  /**
7
7
  * This node can be used to evaluate whether a primitive is front or back facing.
@@ -36,6 +36,10 @@ class FrontFacingNode extends Node {
36
36
 
37
37
  generate( builder ) {
38
38
 
39
+ if ( builder.shaderStage !== 'fragment' ) return 'true';
40
+
41
+ //
42
+
39
43
  const { renderer, material } = builder;
40
44
 
41
45
  if ( renderer.coordinateSystem === WebGLCoordinateSystem ) {
@@ -72,3 +76,31 @@ export const frontFacing = /*@__PURE__*/ nodeImmutable( FrontFacingNode );
72
76
  * @type {Node<float>}
73
77
  */
74
78
  export const faceDirection = /*@__PURE__*/ float( frontFacing ).mul( 2.0 ).sub( 1.0 );
79
+
80
+ /**
81
+ * Converts a direction vector to a face direction vector based on the material's side.
82
+ *
83
+ * If the material is set to `BackSide`, the direction is inverted.
84
+ * If the material is set to `DoubleSide`, the direction is multiplied by `faceDirection`.
85
+ *
86
+ * @tsl
87
+ * @param {Node<vec3>} direction - The direction vector to convert.
88
+ * @returns {Node<vec3>} The converted direction vector.
89
+ */
90
+ export const directionToFaceDirection = /*@__PURE__*/ Fn( ( [ direction ], { material } ) => {
91
+
92
+ const side = material.side;
93
+
94
+ if ( side === BackSide ) {
95
+
96
+ direction = direction.mul( - 1.0 );
97
+
98
+ } else if ( side === DoubleSide ) {
99
+
100
+ direction = direction.mul( faceDirection );
101
+
102
+ }
103
+
104
+ return direction;
105
+
106
+ } );
@@ -1,41 +1,11 @@
1
1
  import TempNode from '../core/TempNode.js';
2
- import { add } from '../math/OperatorNode.js';
3
2
 
4
3
  import { normalView, transformNormalToView } from '../accessors/Normal.js';
5
- import { positionView } from '../accessors/Position.js';
6
4
  import { TBNViewMatrix } from '../accessors/AccessorsUtils.js';
7
- import { uv } from '../accessors/UV.js';
8
- import { faceDirection } from './FrontFacingNode.js';
9
- import { Fn, nodeProxy, vec3 } from '../tsl/TSLBase.js';
5
+ import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
10
6
 
11
7
  import { TangentSpaceNormalMap, ObjectSpaceNormalMap } from '../../constants.js';
12
-
13
- // Normal Mapping Without Precomputed Tangents
14
- // http://www.thetenthplanet.de/archives/1180
15
-
16
- const perturbNormal2Arb = /*@__PURE__*/ Fn( ( inputs ) => {
17
-
18
- const { eye_pos, surf_norm, mapN, uv } = inputs;
19
-
20
- const q0 = eye_pos.dFdx();
21
- const q1 = eye_pos.dFdy();
22
- const st0 = uv.dFdx();
23
- const st1 = uv.dFdy();
24
-
25
- const N = surf_norm; // normalized
26
-
27
- const q1perp = q1.cross( N );
28
- const q0perp = N.cross( q0 );
29
-
30
- const T = q1perp.mul( st0.x ).add( q0perp.mul( st1.x ) );
31
- const B = q1perp.mul( st0.y ).add( q0perp.mul( st1.y ) );
32
-
33
- const det = T.dot( T ).max( B.dot( B ) );
34
- const scale = faceDirection.mul( det.inverseSqrt() );
35
-
36
- return add( T.mul( mapN.x, scale ), B.mul( mapN.y, scale ), N.mul( mapN.z ) ).normalize();
37
-
38
- } );
8
+ import { directionToFaceDirection } from './FrontFacingNode.js';
39
9
 
40
10
  /**
41
11
  * This class can be used for applying normals maps to materials.
@@ -89,7 +59,7 @@ class NormalMapNode extends TempNode {
89
59
 
90
60
  }
91
61
 
92
- setup( builder ) {
62
+ setup( { material } ) {
93
63
 
94
64
  const { normalMapType, scaleNode } = this;
95
65
 
@@ -97,38 +67,37 @@ class NormalMapNode extends TempNode {
97
67
 
98
68
  if ( scaleNode !== null ) {
99
69
 
100
- normalMap = vec3( normalMap.xy.mul( scaleNode ), normalMap.z );
70
+ let scale = scaleNode;
71
+
72
+ if ( material.flatShading === true ) {
73
+
74
+ scale = directionToFaceDirection( scale );
75
+
76
+ }
77
+
78
+ normalMap = vec3( normalMap.xy.mul( scale ), normalMap.z );
101
79
 
102
80
  }
103
81
 
104
- let outputNode = null;
82
+ let output = null;
105
83
 
106
84
  if ( normalMapType === ObjectSpaceNormalMap ) {
107
85
 
108
- outputNode = transformNormalToView( normalMap );
86
+ output = transformNormalToView( normalMap );
109
87
 
110
88
  } else if ( normalMapType === TangentSpaceNormalMap ) {
111
89
 
112
- const tangent = builder.hasGeometryAttribute( 'tangent' );
113
-
114
- if ( tangent === true ) {
90
+ output = TBNViewMatrix.mul( normalMap ).normalize();
115
91
 
116
- outputNode = TBNViewMatrix.mul( normalMap ).normalize();
92
+ } else {
117
93
 
118
- } else {
94
+ console.error( `THREE.NodeMaterial: Unsupported normal map type: ${ normalMapType }` );
119
95
 
120
- outputNode = perturbNormal2Arb( {
121
- eye_pos: positionView,
122
- surf_norm: normalView,
123
- mapN: normalMap,
124
- uv: uv()
125
- } );
126
-
127
- }
96
+ output = normalView; // Fallback to default normal view
128
97
 
129
98
  }
130
99
 
131
- return outputNode;
100
+ return output;
132
101
 
133
102
  }
134
103
 
@@ -7,6 +7,7 @@ import { viewZToOrthographicDepth, perspectiveDepthToViewZ } from './ViewportDep
7
7
 
8
8
  import { HalfFloatType/*, FloatType*/ } from '../../constants.js';
9
9
  import { Vector2 } from '../../math/Vector2.js';
10
+ import { Vector4 } from '../../math/Vector4.js';
10
11
  import { DepthTexture } from '../../textures/DepthTexture.js';
11
12
  import { RenderTarget } from '../../core/RenderTarget.js';
12
13
 
@@ -48,7 +49,7 @@ class PassTextureNode extends TextureNode {
48
49
 
49
50
  setup( builder ) {
50
51
 
51
- if ( builder.object.isQuadMesh ) this.passNode.build( builder );
52
+ this.passNode.build( builder );
52
53
 
53
54
  return super.setup( builder );
54
55
 
@@ -126,7 +127,16 @@ class PassMultipleTextureNode extends PassTextureNode {
126
127
 
127
128
  clone() {
128
129
 
129
- return new this.constructor( this.passNode, this.textureName, this.previousTexture );
130
+ const newNode = new this.constructor( this.passNode, this.textureName, this.previousTexture );
131
+ newNode.uvNode = this.uvNode;
132
+ newNode.levelNode = this.levelNode;
133
+ newNode.biasNode = this.biasNode;
134
+ newNode.sampler = this.sampler;
135
+ newNode.depthNode = this.depthNode;
136
+ newNode.compareNode = this.compareNode;
137
+ newNode.gradNode = this.gradNode;
138
+
139
+ return newNode;
130
140
 
131
141
  }
132
142
 
@@ -314,10 +324,43 @@ class PassNode extends TempNode {
314
324
  */
315
325
  this._mrt = null;
316
326
 
327
+ /**
328
+ * Layer object for configuring the camera that is used
329
+ * to produce the pass.
330
+ *
331
+ * @private
332
+ * @type {?Layers}
333
+ * @default null
334
+ */
317
335
  this._layers = null;
318
336
 
337
+ /**
338
+ * Scales the resolution of the internal render target.
339
+ *
340
+ * @private
341
+ * @type {number}
342
+ * @default 1
343
+ */
319
344
  this._resolution = 1;
320
345
 
346
+ /**
347
+ * Custom viewport definition.
348
+ *
349
+ * @private
350
+ * @type {?Vector4}
351
+ * @default null
352
+ */
353
+ this._viewport = null;
354
+
355
+ /**
356
+ * Custom scissor definition.
357
+ *
358
+ * @private
359
+ * @type {?Vector4}
360
+ * @default null
361
+ */
362
+ this._scissor = null;
363
+
321
364
  /**
322
365
  * This flag can be used for type testing.
323
366
  *
@@ -336,6 +379,14 @@ class PassNode extends TempNode {
336
379
  */
337
380
  this.updateBeforeType = NodeUpdateType.FRAME;
338
381
 
382
+ /**
383
+ * This flag is used for global cache.
384
+ *
385
+ * @type {boolean}
386
+ * @default true
387
+ */
388
+ this.global = true;
389
+
339
390
  }
340
391
 
341
392
  /**
@@ -357,7 +408,6 @@ class PassNode extends TempNode {
357
408
  * Gets the current resolution of the pass.
358
409
  *
359
410
  * @return {number} The current resolution. A value of `1` means full resolution.
360
- * @default 1
361
411
  */
362
412
  getResolution() {
363
413
 
@@ -365,6 +415,12 @@ class PassNode extends TempNode {
365
415
 
366
416
  }
367
417
 
418
+ /**
419
+ * Sets the layer configuration that should be used when rendering the pass.
420
+ *
421
+ * @param {Layers} layers - The layers object to set.
422
+ * @return {PassNode} A reference to this pass.
423
+ */
368
424
  setLayers( layers ) {
369
425
 
370
426
  this._layers = layers;
@@ -373,6 +429,11 @@ class PassNode extends TempNode {
373
429
 
374
430
  }
375
431
 
432
+ /**
433
+ * Gets the current layer configuration of the pass.
434
+ *
435
+ * @return {?Layers} .
436
+ */
376
437
  getLayers() {
377
438
 
378
439
  return this._layers;
@@ -404,17 +465,6 @@ class PassNode extends TempNode {
404
465
 
405
466
  }
406
467
 
407
- /**
408
- * The method is overwritten so it always returns `true`.
409
- *
410
- * @return {boolean} Whether this node is global or not.
411
- */
412
- isGlobal() {
413
-
414
- return true;
415
-
416
- }
417
-
418
468
  /**
419
469
  * Returns the texture for the given output name.
420
470
  *
@@ -585,16 +635,35 @@ class PassNode extends TempNode {
585
635
 
586
636
  }
587
637
 
588
- setup( { renderer } ) {
638
+ /**
639
+ * Precompiles the pass.
640
+ *
641
+ * Note that this method must be called after the pass configuartion is complete.
642
+ * So calls like `setMRT()` and `getTextureNode()` must proceed the precompilation.
643
+ *
644
+ * @async
645
+ * @param {Renderer} renderer - The renderer.
646
+ * @return {Promise} A Promise that resolves when the compile has been finished.
647
+ * @see {@link Renderer#compileAsync}
648
+ */
649
+ async compileAsync( renderer ) {
589
650
 
590
- this.renderTarget.samples = this.options.samples === undefined ? renderer.samples : this.options.samples;
651
+ const currentRenderTarget = renderer.getRenderTarget();
652
+ const currentMRT = renderer.getMRT();
591
653
 
592
- // TODO: Disable MSAA for WebGL backend for now
593
- if ( renderer.backend.isWebGLBackend === true ) {
654
+ renderer.setRenderTarget( this.renderTarget );
655
+ renderer.setMRT( this._mrt );
594
656
 
595
- this.renderTarget.samples = 0;
657
+ await renderer.compileAsync( this.scene, this.camera );
596
658
 
597
- }
659
+ renderer.setRenderTarget( currentRenderTarget );
660
+ renderer.setMRT( currentMRT );
661
+
662
+ }
663
+
664
+ setup( { renderer } ) {
665
+
666
+ this.renderTarget.samples = this.options.samples === undefined ? renderer.samples : this.options.samples;
598
667
 
599
668
  this.renderTarget.texture.type = renderer.getColorBufferType();
600
669
 
@@ -681,6 +750,82 @@ class PassNode extends TempNode {
681
750
 
682
751
  this.renderTarget.setSize( effectiveWidth, effectiveHeight );
683
752
 
753
+ if ( this._scissor !== null ) this.renderTarget.scissor.copy( this._scissor );
754
+ if ( this._viewport !== null ) this.renderTarget.viewport.copy( this._viewport );
755
+
756
+ }
757
+
758
+ /**
759
+ * This method allows to define the pass's scissor rectangle. By default, the scissor rectangle is kept
760
+ * in sync with the pass's dimensions. To reverse the process and use auto-sizing again, call the method
761
+ * with `null` as the single argument.
762
+ *
763
+ * @param {?(number | Vector4)} x - The horizontal coordinate for the lower left corner of the box in logical pixel unit.
764
+ * Instead of passing four arguments, the method also works with a single four-dimensional vector.
765
+ * @param {number} y - The vertical coordinate for the lower left corner of the box in logical pixel unit.
766
+ * @param {number} width - The width of the scissor box in logical pixel unit.
767
+ * @param {number} height - The height of the scissor box in logical pixel unit.
768
+ */
769
+ setScissor( x, y, width, height ) {
770
+
771
+ if ( x === null ) {
772
+
773
+ this._scissor = null;
774
+
775
+ } else {
776
+
777
+ if ( this._scissor === null ) this._scissor = new Vector4();
778
+
779
+ if ( x.isVector4 ) {
780
+
781
+ this._scissor.copy( x );
782
+
783
+ } else {
784
+
785
+ this._scissor.set( x, y, width, height );
786
+
787
+ }
788
+
789
+ this._scissor.multiplyScalar( this._pixelRatio * this._resolution ).floor();
790
+
791
+ }
792
+
793
+ }
794
+
795
+ /**
796
+ * This method allows to define the pass's viewport. By default, the viewport is kept in sync
797
+ * with the pass's dimensions. To reverse the process and use auto-sizing again, call the method
798
+ * with `null` as the single argument.
799
+ *
800
+ * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.
801
+ * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.
802
+ * @param {number} width - The width of the viewport in logical pixel unit.
803
+ * @param {number} height - The height of the viewport in logical pixel unit.
804
+ */
805
+ setViewport( x, y, width, height ) {
806
+
807
+ if ( x === null ) {
808
+
809
+ this._viewport = null;
810
+
811
+ } else {
812
+
813
+ if ( this._viewport === null ) this._viewport = new Vector4();
814
+
815
+ if ( x.isVector4 ) {
816
+
817
+ this._viewport.copy( x );
818
+
819
+ } else {
820
+
821
+ this._viewport.set( x, y, width, height );
822
+
823
+ }
824
+
825
+ this._viewport.multiplyScalar( this._pixelRatio * this._resolution ).floor();
826
+
827
+ }
828
+
684
829
  }
685
830
 
686
831
  /**
@@ -258,29 +258,3 @@ export const viewportResolution = /*@__PURE__*/ ( Fn( () => { // @deprecated, r1
258
258
  return screenSize;
259
259
 
260
260
  }, 'vec2' ).once() )();
261
-
262
- /**
263
- * @tsl
264
- * @deprecated since r168. Use {@link screenUV} instead.
265
- * @type {Node<vec2>}
266
- */
267
- export const viewportTopLeft = /*@__PURE__*/ ( Fn( () => { // @deprecated, r168
268
-
269
- console.warn( 'THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.' );
270
-
271
- return screenUV;
272
-
273
- }, 'vec2' ).once() )();
274
-
275
- /**
276
- * @tsl
277
- * @deprecated since r168. Use `screenUV.flipY()` instead.
278
- * @type {Node<vec2>}
279
- */
280
- export const viewportBottomLeft = /*@__PURE__*/ ( Fn( () => { // @deprecated, r168
281
-
282
- console.warn( 'THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.' );
283
-
284
- return screenUV.flipY();
285
-
286
- }, 'vec2' ).once() )();