@plastic-software/three 0.175.13 → 0.178.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7747 -6792
  3. package/build/three.core.js +7371 -6576
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +190 -30
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +19 -11
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4989 -2235
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +5082 -2469
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -1
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +1 -0
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +18 -4
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +49 -35
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +12 -10
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +2 -1
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +7 -0
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/lighting/TiledLighting.js +1 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +1 -0
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  79. package/examples/jsm/lines/Line2.js +1 -0
  80. package/examples/jsm/lines/LineGeometry.js +1 -0
  81. package/examples/jsm/lines/LineMaterial.js +4 -4
  82. package/examples/jsm/lines/LineSegments2.js +1 -0
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  84. package/examples/jsm/lines/Wireframe.js +1 -0
  85. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  88. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  89. package/examples/jsm/loaders/3DMLoader.js +1 -0
  90. package/examples/jsm/loaders/3MFLoader.js +1 -0
  91. package/examples/jsm/loaders/AMFLoader.js +1 -0
  92. package/examples/jsm/loaders/BVHLoader.js +1 -0
  93. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  94. package/examples/jsm/loaders/DDSLoader.js +1 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  96. package/examples/jsm/loaders/EXRLoader.js +1 -0
  97. package/examples/jsm/loaders/FBXLoader.js +25 -23
  98. package/examples/jsm/loaders/FontLoader.js +1 -0
  99. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  100. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  102. package/examples/jsm/loaders/IESLoader.js +1 -0
  103. package/examples/jsm/loaders/KMZLoader.js +1 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  105. package/examples/jsm/loaders/KTXLoader.js +1 -0
  106. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  107. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  108. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  110. package/examples/jsm/loaders/LWOLoader.js +1 -13
  111. package/examples/jsm/loaders/LottieLoader.js +15 -0
  112. package/examples/jsm/loaders/MD2Loader.js +1 -0
  113. package/examples/jsm/loaders/MDDLoader.js +1 -0
  114. package/examples/jsm/loaders/MTLLoader.js +4 -3
  115. package/examples/jsm/loaders/MaterialXLoader.js +1 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  117. package/examples/jsm/loaders/OBJLoader.js +1 -0
  118. package/examples/jsm/loaders/PCDLoader.js +122 -19
  119. package/examples/jsm/loaders/PDBLoader.js +1 -0
  120. package/examples/jsm/loaders/PLYLoader.js +1 -0
  121. package/examples/jsm/loaders/PVRLoader.js +1 -0
  122. package/examples/jsm/loaders/RGBELoader.js +1 -0
  123. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  124. package/examples/jsm/loaders/STLLoader.js +1 -0
  125. package/examples/jsm/loaders/SVGLoader.js +1 -0
  126. package/examples/jsm/loaders/TDSLoader.js +1 -0
  127. package/examples/jsm/loaders/TGALoader.js +1 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  129. package/examples/jsm/loaders/TTFLoader.js +1 -0
  130. package/examples/jsm/loaders/USDZLoader.js +1 -0
  131. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  132. package/examples/jsm/loaders/VOXLoader.js +1 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  134. package/examples/jsm/loaders/VTKLoader.js +1 -0
  135. package/examples/jsm/loaders/XYZLoader.js +1 -0
  136. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  137. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  138. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  139. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  140. package/examples/jsm/math/Capsule.js +2 -0
  141. package/examples/jsm/math/ColorConverter.js +1 -0
  142. package/examples/jsm/math/ConvexHull.js +2 -0
  143. package/examples/jsm/math/ImprovedNoise.js +19 -14
  144. package/examples/jsm/math/Lut.js +2 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  146. package/examples/jsm/math/OBB.js +2 -0
  147. package/examples/jsm/math/Octree.js +20 -1
  148. package/examples/jsm/math/SimplexNoise.js +2 -0
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  150. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  151. package/examples/jsm/misc/Gyroscope.js +1 -0
  152. package/examples/jsm/misc/MD2Character.js +2 -0
  153. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  154. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  158. package/examples/jsm/misc/RollerCoaster.js +5 -0
  159. package/examples/jsm/misc/Timer.js +2 -0
  160. package/examples/jsm/misc/TubePainter.js +1 -0
  161. package/examples/jsm/misc/Volume.js +2 -0
  162. package/examples/jsm/misc/VolumeSlice.js +1 -0
  163. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  167. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  168. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  169. package/examples/jsm/objects/Lensflare.js +3 -0
  170. package/examples/jsm/objects/LensflareMesh.js +1 -0
  171. package/examples/jsm/objects/MarchingCubes.js +2 -0
  172. package/examples/jsm/objects/Reflector.js +1 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  174. package/examples/jsm/objects/Refractor.js +1 -0
  175. package/examples/jsm/objects/ShadowMesh.js +1 -0
  176. package/examples/jsm/objects/Sky.js +2 -1
  177. package/examples/jsm/objects/SkyMesh.js +20 -17
  178. package/examples/jsm/objects/Water.js +1 -0
  179. package/examples/jsm/objects/Water2.js +1 -0
  180. package/examples/jsm/objects/Water2Mesh.js +3 -1
  181. package/examples/jsm/objects/WaterMesh.js +2 -1
  182. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  183. package/examples/jsm/physics/JoltPhysics.js +1 -0
  184. package/examples/jsm/physics/RapierPhysics.js +139 -12
  185. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  186. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  187. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  188. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  190. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  191. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  192. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  193. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  194. package/examples/jsm/postprocessing/GTAOPass.js +4 -3
  195. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  196. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  197. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  198. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  199. package/examples/jsm/postprocessing/OutlinePass.js +5 -2
  200. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  201. package/examples/jsm/postprocessing/Pass.js +3 -1
  202. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  203. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  204. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  205. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  206. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  207. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  208. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  209. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  210. package/examples/jsm/postprocessing/SavePass.js +2 -1
  211. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  212. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  213. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  214. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  215. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  216. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  217. package/examples/jsm/renderers/Projector.js +2 -0
  218. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  219. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  220. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  221. package/examples/jsm/shaders/BasicShader.js +4 -1
  222. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  223. package/examples/jsm/shaders/BlendShader.js +4 -1
  224. package/examples/jsm/shaders/BokehShader.js +4 -1
  225. package/examples/jsm/shaders/BokehShader2.js +4 -1
  226. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  227. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  228. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  229. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  230. package/examples/jsm/shaders/CopyShader.js +4 -1
  231. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  232. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  233. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  234. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  235. package/examples/jsm/shaders/ExposureShader.js +4 -1
  236. package/examples/jsm/shaders/FXAAShader.js +4 -1
  237. package/examples/jsm/shaders/FilmShader.js +4 -1
  238. package/examples/jsm/shaders/FocusShader.js +4 -1
  239. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  240. package/examples/jsm/shaders/GTAOShader.js +4 -1
  241. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  242. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  243. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  244. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  245. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  246. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  247. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  248. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  249. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  250. package/examples/jsm/shaders/MirrorShader.js +4 -1
  251. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  252. package/examples/jsm/shaders/OutputShader.js +4 -1
  253. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  254. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  255. package/examples/jsm/shaders/SAOShader.js +4 -1
  256. package/examples/jsm/shaders/SMAAShader.js +1 -0
  257. package/examples/jsm/shaders/SSAOShader.js +4 -1
  258. package/examples/jsm/shaders/SSRShader.js +1 -0
  259. package/examples/jsm/shaders/SepiaShader.js +4 -1
  260. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  261. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  262. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  263. package/examples/jsm/shaders/ToonShader.js +2 -1
  264. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  265. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
  266. package/examples/jsm/shaders/VelocityShader.js +4 -1
  267. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  268. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  269. package/examples/jsm/shaders/VignetteShader.js +4 -1
  270. package/examples/jsm/shaders/VolumeShader.js +5 -2
  271. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  272. package/examples/jsm/textures/FlakesTexture.js +2 -0
  273. package/examples/jsm/transpiler/AST.js +381 -30
  274. package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
  275. package/examples/jsm/transpiler/Linker.js +327 -0
  276. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  277. package/examples/jsm/transpiler/Transpiler.js +19 -1
  278. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  279. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  280. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  281. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  282. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  283. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  284. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  285. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  286. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  287. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  288. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  289. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  290. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  291. package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
  292. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  293. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  294. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  295. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  296. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  297. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  298. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  299. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  301. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  302. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  303. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  304. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  305. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  306. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  307. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  308. package/examples/jsm/tsl/math/Bayer.js +4 -1
  309. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  310. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  311. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  312. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  313. package/examples/jsm/utils/CameraUtils.js +4 -1
  314. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  315. package/examples/jsm/utils/GeometryUtils.js +4 -1
  316. package/examples/jsm/utils/LDrawUtils.js +2 -0
  317. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  318. package/examples/jsm/utils/SceneUtils.js +4 -1
  319. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  320. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  321. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  322. package/examples/jsm/utils/SortUtils.js +4 -1
  323. package/examples/jsm/utils/UVsDebug.js +4 -1
  324. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  325. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  326. package/examples/jsm/utils/WorkerPool.js +2 -0
  327. package/examples/jsm/webxr/ARButton.js +1 -0
  328. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  329. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  330. package/examples/jsm/webxr/Text2D.js +4 -1
  331. package/examples/jsm/webxr/VRButton.js +1 -0
  332. package/examples/jsm/webxr/XRButton.js +1 -0
  333. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  334. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  335. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  336. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  338. package/examples/jsm/webxr/XRPlanes.js +1 -0
  339. package/package.json +6 -4
  340. package/src/Three.Core.js +1 -1
  341. package/src/Three.TSL.js +18 -10
  342. package/src/Three.WebGPU.Nodes.js +1 -0
  343. package/src/Three.WebGPU.js +3 -0
  344. package/src/audio/AudioListener.js +13 -10
  345. package/src/cameras/ArrayCamera.js +9 -1
  346. package/src/constants.js +47 -20
  347. package/src/core/BufferAttribute.js +3 -3
  348. package/src/core/BufferGeometry.js +2 -5
  349. package/src/core/Clock.js +2 -8
  350. package/src/core/GLBufferAttribute.js +13 -1
  351. package/src/core/Object3D.js +23 -22
  352. package/src/core/RenderTarget.js +65 -21
  353. package/src/core/RenderTarget3D.js +1 -0
  354. package/src/extras/TextureUtils.js +1 -5
  355. package/src/extras/core/Curve.js +1 -1
  356. package/src/extras/core/Path.js +22 -22
  357. package/src/geometries/CapsuleGeometry.js +167 -17
  358. package/src/geometries/ExtrudeGeometry.js +39 -29
  359. package/src/helpers/ArrowHelper.js +2 -2
  360. package/src/helpers/SkeletonHelper.js +1 -1
  361. package/src/lights/LightShadow.js +14 -0
  362. package/src/lights/SpotLightShadow.js +9 -1
  363. package/src/lights/webgpu/ProjectorLight.js +46 -0
  364. package/src/loaders/BufferGeometryLoader.js +1 -10
  365. package/src/loaders/FileLoader.js +2 -2
  366. package/src/loaders/ImageBitmapLoader.js +25 -9
  367. package/src/loaders/ImageLoader.js +55 -8
  368. package/src/loaders/ObjectLoader.js +44 -16
  369. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  370. package/src/materials/Material.js +1 -7
  371. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  372. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  373. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  374. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  375. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  376. package/src/materials/nodes/NodeMaterial.js +105 -19
  377. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  378. package/src/math/Box3.js +28 -0
  379. package/src/math/Color.js +7 -7
  380. package/src/math/ColorManagement.js +22 -3
  381. package/src/math/Frustum.js +6 -1
  382. package/src/math/FrustumArray.js +253 -0
  383. package/src/math/Quaternion.js +1 -1
  384. package/src/math/Ray.js +2 -0
  385. package/src/math/Sphere.js +28 -0
  386. package/src/nodes/Nodes.js +2 -3
  387. package/src/nodes/TSL.js +5 -3
  388. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  389. package/src/nodes/accessors/Bitangent.js +54 -26
  390. package/src/nodes/accessors/Camera.js +31 -4
  391. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  392. package/src/nodes/accessors/InstanceNode.js +5 -4
  393. package/src/nodes/accessors/Lights.js +2 -2
  394. package/src/nodes/accessors/MaterialNode.js +4 -0
  395. package/src/nodes/accessors/ModelNode.js +1 -1
  396. package/src/nodes/accessors/Normal.js +102 -16
  397. package/src/nodes/accessors/Object3DNode.js +7 -8
  398. package/src/nodes/accessors/Position.js +14 -4
  399. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  400. package/src/nodes/accessors/ReferenceNode.js +1 -1
  401. package/src/nodes/accessors/ReflectVector.js +3 -3
  402. package/src/nodes/accessors/SkinningNode.js +3 -2
  403. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  404. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  405. package/src/nodes/accessors/Tangent.js +25 -17
  406. package/src/nodes/accessors/TangentUtils.js +46 -0
  407. package/src/nodes/accessors/TextureBicubic.js +21 -3
  408. package/src/nodes/accessors/TextureNode.js +59 -8
  409. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  410. package/src/nodes/accessors/VelocityNode.js +1 -0
  411. package/src/nodes/accessors/VertexColorNode.js +4 -4
  412. package/src/nodes/code/CodeNode.js +8 -11
  413. package/src/nodes/core/AssignNode.js +27 -5
  414. package/src/nodes/core/AttributeNode.js +2 -2
  415. package/src/nodes/core/ContextNode.js +7 -3
  416. package/src/nodes/core/Node.js +69 -20
  417. package/src/nodes/core/NodeBuilder.js +248 -29
  418. package/src/nodes/core/NodeUtils.js +42 -0
  419. package/src/nodes/core/NodeVarying.js +19 -1
  420. package/src/nodes/core/PropertyNode.js +8 -12
  421. package/src/nodes/core/StackNode.js +129 -26
  422. package/src/nodes/core/StructTypeNode.js +26 -4
  423. package/src/nodes/core/SubBuildNode.js +89 -0
  424. package/src/nodes/core/VarNode.js +11 -2
  425. package/src/nodes/core/VaryingNode.js +45 -24
  426. package/src/nodes/display/BlendModes.js +42 -1
  427. package/src/nodes/display/ColorSpaceNode.js +4 -27
  428. package/src/nodes/display/FrontFacingNode.js +34 -2
  429. package/src/nodes/display/NormalMapNode.js +19 -50
  430. package/src/nodes/display/PassNode.js +18 -19
  431. package/src/nodes/display/ScreenNode.js +0 -26
  432. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  433. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  434. package/src/nodes/functions/PhongLightingModel.js +3 -3
  435. package/src/nodes/functions/PhysicalLightingModel.js +14 -14
  436. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  437. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  438. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  439. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  440. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  441. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  442. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  443. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  444. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  445. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  446. package/src/nodes/lighting/LightsNode.js +29 -11
  447. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  448. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  449. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  450. package/src/nodes/lighting/ShadowNode.js +174 -242
  451. package/src/nodes/lighting/SpotLightNode.js +44 -7
  452. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  453. package/src/nodes/math/ConditionalNode.js +0 -19
  454. package/src/nodes/math/MathNode.js +68 -21
  455. package/src/nodes/math/OperatorNode.js +108 -98
  456. package/src/nodes/shapes/Shapes.js +5 -4
  457. package/src/nodes/tsl/TSLBase.js +1 -0
  458. package/src/nodes/tsl/TSLCore.js +160 -65
  459. package/src/nodes/utils/DebugNode.js +15 -3
  460. package/src/nodes/utils/Discard.js +2 -2
  461. package/src/nodes/utils/EquirectUV.js +27 -0
  462. package/src/nodes/utils/LoopNode.js +64 -34
  463. package/src/nodes/utils/MatcapUV.js +22 -0
  464. package/src/nodes/utils/RTTNode.js +13 -5
  465. package/src/nodes/utils/ReflectorNode.js +77 -7
  466. package/src/nodes/utils/SampleNode.js +81 -0
  467. package/src/nodes/utils/TriplanarTextures.js +65 -0
  468. package/src/objects/BatchedMesh.js +16 -4
  469. package/src/objects/Mesh.js +9 -0
  470. package/src/objects/Skeleton.js +1 -1
  471. package/src/objects/Sprite.js +9 -0
  472. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  473. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  474. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  475. package/src/renderers/WebGLRenderer.js +25 -11
  476. package/src/renderers/common/Animation.js +2 -2
  477. package/src/renderers/common/Background.js +13 -2
  478. package/src/renderers/common/CubeRenderTarget.js +1 -1
  479. package/src/renderers/common/RenderList.js +0 -4
  480. package/src/renderers/common/RenderObject.js +80 -4
  481. package/src/renderers/common/Renderer.js +116 -8
  482. package/src/renderers/common/Storage3DTexture.js +79 -0
  483. package/src/renderers/common/StorageArrayTexture.js +63 -0
  484. package/src/renderers/common/Textures.js +15 -21
  485. package/src/renderers/common/TimestampQueryPool.js +1 -0
  486. package/src/renderers/common/Uniform.js +1 -1
  487. package/src/renderers/common/UniformsGroup.js +14 -18
  488. package/src/renderers/common/XRManager.js +157 -27
  489. package/src/renderers/common/XRRenderTarget.js +21 -4
  490. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  491. package/src/renderers/common/nodes/Nodes.js +13 -3
  492. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +1 -1
  493. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  494. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  495. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  496. package/src/renderers/webgl/WebGLPrograms.js +4 -2
  497. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  498. package/src/renderers/webgl/WebGLState.js +4 -4
  499. package/src/renderers/webgl/WebGLTextures.js +144 -4
  500. package/src/renderers/webgl/WebGLUtils.js +1 -3
  501. package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  504. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  507. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  508. package/src/renderers/webgpu/WebGPUBackend.js +451 -128
  509. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  510. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  511. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  512. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
  513. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  514. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  515. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
  516. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  517. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
  519. package/src/renderers/webxr/WebXRController.js +1 -1
  520. package/src/renderers/webxr/WebXRManager.js +2 -1
  521. package/src/textures/DepthTexture.js +6 -10
  522. package/src/textures/Source.js +22 -0
  523. package/src/textures/Texture.js +118 -1
  524. package/src/textures/VideoTexture.js +1 -1
  525. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  526. package/src/core/RenderTargetArray.js +0 -40
  527. package/src/nodes/utils/EquirectUVNode.js +0 -65
  528. package/src/nodes/utils/MatcapUVNode.js +0 -49
  529. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -1,6 +1,6 @@
1
1
  import Node from './Node.js';
2
2
  import { select } from '../math/ConditionalNode.js';
3
- import { ShaderNode, nodeProxy, getCurrentStack, setCurrentStack } from '../tsl/TSLBase.js';
3
+ import { ShaderNode, nodeProxy, getCurrentStack, setCurrentStack, nodeObject } from '../tsl/TSLBase.js';
4
4
 
5
5
  /**
6
6
  * Stack is a helper for Nodes that need to produce stack-based code instead of continuous flow.
@@ -57,6 +57,16 @@ class StackNode extends Node {
57
57
  */
58
58
  this._currentCond = null;
59
59
 
60
+ /**
61
+ * The expression node. Only
62
+ * relevant for Switch/Case.
63
+ *
64
+ * @private
65
+ * @type {Node}
66
+ * @default null
67
+ */
68
+ this._expressionNode = null;
69
+
60
70
  /**
61
71
  * This flag can be used for type testing.
62
72
  *
@@ -143,50 +153,143 @@ class StackNode extends Node {
143
153
 
144
154
  }
145
155
 
146
- build( builder, ...params ) {
156
+ /**
157
+ * Represents a `switch` statement in TSL.
158
+ *
159
+ * @param {any} expression - Represents the expression.
160
+ * @param {Function} method - TSL code which is executed if the condition evaluates to `true`.
161
+ * @return {StackNode} A reference to this stack node.
162
+ */
163
+ Switch( expression ) {
147
164
 
148
- const previousStack = getCurrentStack();
165
+ this._expressionNode = nodeObject( expression );
149
166
 
150
- setCurrentStack( this );
167
+ return this;
151
168
 
152
- for ( const node of this.nodes ) {
169
+ }
153
170
 
154
- node.build( builder, 'void' );
171
+ /**
172
+ * Represents a `case` statement in TSL. The TSL version accepts an arbitrary numbers of values.
173
+ * The last parameter must be the callback method that should be executed in the `true` case.
174
+ *
175
+ * @param {...any} params - The values of the `Case()` statement as well as the callback method.
176
+ * @return {StackNode} A reference to this stack node.
177
+ */
178
+ Case( ...params ) {
179
+
180
+ const caseNodes = [];
181
+
182
+ // extract case nodes from the parameter list
183
+
184
+ if ( params.length >= 2 ) {
185
+
186
+ for ( let i = 0; i < params.length - 1; i ++ ) {
187
+
188
+ caseNodes.push( this._expressionNode.equal( nodeObject( params[ i ] ) ) );
189
+
190
+ }
191
+
192
+ } else {
193
+
194
+ throw new Error( 'TSL: Invalid parameter length. Case() requires at least two parameters.' );
155
195
 
156
196
  }
157
197
 
158
- setCurrentStack( previousStack );
198
+ // extract method
199
+
200
+ const method = params[ params.length - 1 ];
201
+ const methodNode = new ShaderNode( method );
159
202
 
160
- return this.outputNode ? this.outputNode.build( builder, ...params ) : super.build( builder, ...params );
203
+ // chain multiple cases when using Case( 1, 2, 3, () => {} )
161
204
 
162
- }
205
+ let caseNode = caseNodes[ 0 ];
163
206
 
164
- // Deprecated
207
+ for ( let i = 1; i < caseNodes.length; i ++ ) {
165
208
 
166
- /**
167
- * @function
168
- * @deprecated since r168. Use {@link StackNode#Else} instead.
169
- *
170
- * @param {...any} params
171
- * @returns {StackNode}
172
- */
173
- else( ...params ) { // @deprecated, r168
209
+ caseNode = caseNode.or( caseNodes[ i ] );
210
+
211
+ }
212
+
213
+ // build condition
214
+
215
+ const condNode = select( caseNode, methodNode );
216
+
217
+ if ( this._currentCond === null ) {
174
218
 
175
- console.warn( 'THREE.TSL: .else() has been renamed to .Else().' );
176
- return this.Else( ...params );
219
+ this._currentCond = condNode;
220
+
221
+ return this.add( this._currentCond );
222
+
223
+ } else {
224
+
225
+ this._currentCond.elseNode = condNode;
226
+ this._currentCond = condNode;
227
+
228
+ return this;
229
+
230
+ }
177
231
 
178
232
  }
179
233
 
180
234
  /**
181
- * @deprecated since r168. Use {@link StackNode#ElseIf} instead.
235
+ * Represents the default code block of a Switch/Case statement.
182
236
  *
183
- * @param {...any} params
184
- * @returns {StackNode}
237
+ * @param {Function} method - TSL code which is executed in the `else` case.
238
+ * @return {StackNode} A reference to this stack node.
185
239
  */
186
- elseif( ...params ) { // @deprecated, r168
240
+ Default( method ) {
241
+
242
+ this.Else( method );
243
+
244
+ return this;
245
+
246
+ }
247
+
248
+ build( builder, ...params ) {
249
+
250
+ const previousBuildStack = builder.currentStack;
251
+ const previousStack = getCurrentStack();
252
+
253
+ setCurrentStack( this );
254
+
255
+ builder.currentStack = this;
256
+
257
+ const buildStage = builder.buildStage;
258
+
259
+ for ( const node of this.nodes ) {
260
+
261
+ if ( buildStage === 'setup' ) {
262
+
263
+ node.build( builder );
264
+
265
+ } else if ( buildStage === 'analyze' ) {
266
+
267
+ node.build( builder, this );
268
+
269
+ } else if ( buildStage === 'generate' ) {
270
+
271
+ const stages = builder.getDataFromNode( node, 'any' ).stages;
272
+ const parents = stages && stages[ builder.shaderStage ];
273
+
274
+ if ( node.isVarNode && parents && parents.length === 1 && parents[ 0 ] && parents[ 0 ].isStackNode ) {
275
+
276
+ continue; // skip var nodes that are only used in .toVarying()
277
+
278
+ }
279
+
280
+ node.build( builder, 'void' );
281
+
282
+ }
283
+
284
+ }
285
+
286
+ const result = this.outputNode ? this.outputNode.build( builder, ...params ) : super.build( builder, ...params );
287
+
288
+ setCurrentStack( previousStack );
289
+
290
+ builder.currentStack = previousBuildStack;
187
291
 
188
- console.warn( 'THREE.TSL: .elseif() has been renamed to .ElseIf().' );
189
- return this.ElseIf( ...params );
292
+ return result;
190
293
 
191
294
  }
192
295
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  import Node from './Node.js';
3
- import { getLengthFromType } from './NodeUtils.js';
3
+ import { getByteBoundaryFromType, getMemoryLengthFromType } from './NodeUtils.js';
4
4
 
5
5
  /**
6
6
  * Generates a layout for struct members.
@@ -86,15 +86,37 @@ class StructTypeNode extends Node {
86
86
  */
87
87
  getLength() {
88
88
 
89
- let length = 0;
89
+ const GPU_CHUNK_BYTES = 8;
90
+ const BYTES_PER_ELEMENT = Float32Array.BYTES_PER_ELEMENT;
91
+
92
+ let offset = 0; // global buffer offset in bytes
90
93
 
91
94
  for ( const member of this.membersLayout ) {
92
95
 
93
- length += getLengthFromType( member.type );
96
+ const type = member.type;
97
+
98
+ const itemSize = getMemoryLengthFromType( type ) * BYTES_PER_ELEMENT;
99
+ const boundary = getByteBoundaryFromType( type );
100
+
101
+ const chunkOffset = offset % GPU_CHUNK_BYTES; // offset in the current chunk
102
+ const chunkPadding = chunkOffset % boundary; // required padding to match boundary
103
+ const chunkStart = chunkOffset + chunkPadding; // start position in the current chunk for the data
104
+
105
+ offset += chunkPadding;
106
+
107
+ // Check for chunk overflow
108
+ if ( chunkStart !== 0 && ( GPU_CHUNK_BYTES - chunkStart ) < itemSize ) {
109
+
110
+ // Add padding to the end of the chunk
111
+ offset += ( GPU_CHUNK_BYTES - chunkStart );
112
+
113
+ }
114
+
115
+ offset += itemSize;
94
116
 
95
117
  }
96
118
 
97
- return length;
119
+ return ( Math.ceil( offset / GPU_CHUNK_BYTES ) * GPU_CHUNK_BYTES ) / BYTES_PER_ELEMENT;
98
120
 
99
121
  }
100
122
 
@@ -0,0 +1,89 @@
1
+ import Node from './Node.js';
2
+ import { nodeObject } from '../tsl/TSLCore.js';
3
+
4
+ /**
5
+ * This node is used to build a sub-build in the node system.
6
+ *
7
+ * @augments Node
8
+ * @param {Node} node - The node to be built in the sub-build.
9
+ * @param {string} name - The name of the sub-build.
10
+ * @param {string|null} [nodeType=null] - The type of the node, if known.
11
+ */
12
+ class SubBuildNode extends Node {
13
+
14
+ static get type() {
15
+
16
+ return 'SubBuild';
17
+
18
+ }
19
+
20
+ constructor( node, name, nodeType = null ) {
21
+
22
+ super( nodeType );
23
+
24
+ /**
25
+ * The node to be built in the sub-build.
26
+ *
27
+ * @type {Node}
28
+ */
29
+ this.node = node;
30
+
31
+ /**
32
+ * The name of the sub-build.
33
+ *
34
+ * @type {string}
35
+ */
36
+ this.name = name;
37
+
38
+ /**
39
+ * This flag can be used for type testing.
40
+ *
41
+ * @type {boolean}
42
+ * @readonly
43
+ * @default true
44
+ */
45
+ this.isSubBuildNode = true;
46
+
47
+ }
48
+
49
+ getNodeType( builder ) {
50
+
51
+ if ( this.nodeType !== null ) return this.nodeType;
52
+
53
+ builder.addSubBuild( this.name );
54
+
55
+ const nodeType = this.node.getNodeType( builder );
56
+
57
+ builder.removeSubBuild();
58
+
59
+ return nodeType;
60
+
61
+ }
62
+
63
+ build( builder, ...params ) {
64
+
65
+ builder.addSubBuild( this.name );
66
+
67
+ const data = this.node.build( builder, ...params );
68
+
69
+ builder.removeSubBuild();
70
+
71
+ return data;
72
+
73
+ }
74
+
75
+ }
76
+
77
+ export default SubBuildNode;
78
+
79
+ /**
80
+ * Creates a new sub-build node.
81
+ *
82
+ * @tsl
83
+ * @function
84
+ * @param {Node} node - The node to be built in the sub-build.
85
+ * @param {string} name - The name of the sub-build.
86
+ * @param {string|null} [type=null] - The type of the node, if known.
87
+ * @returns {Node} A node object wrapping the SubBuildNode instance.
88
+ */
89
+ export const subBuild = ( node, name, type = null ) => nodeObject( new SubBuildNode( nodeObject( node ), name, type ) );
@@ -72,6 +72,15 @@ class VarNode extends Node {
72
72
  */
73
73
  this.readOnly = readOnly;
74
74
 
75
+ /**
76
+ *
77
+ * Add this flag to the node system to indicate that this node require parents.
78
+ *
79
+ * @type {boolean}
80
+ * @default true
81
+ */
82
+ this.parents = true;
83
+
75
84
  }
76
85
 
77
86
  getMemberType( builder, name ) {
@@ -167,7 +176,7 @@ const createVar = /*@__PURE__*/ nodeProxy( VarNode );
167
176
  * @param {?string} name - The name of the variable in the shader.
168
177
  * @returns {VarNode}
169
178
  */
170
- export const Var = ( node, name = null ) => createVar( node, name ).append();
179
+ export const Var = ( node, name = null ) => createVar( node, name ).toStack();
171
180
 
172
181
  /**
173
182
  * TSL function for creating a const node.
@@ -178,7 +187,7 @@ export const Var = ( node, name = null ) => createVar( node, name ).append();
178
187
  * @param {?string} name - The name of the constant in the shader.
179
188
  * @returns {VarNode}
180
189
  */
181
- export const Const = ( node, name = null ) => createVar( node, name, true ).append();
190
+ export const Const = ( node, name = null ) => createVar( node, name, true ).toStack();
182
191
 
183
192
  // Method chaining
184
193
 
@@ -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
+ } );