super-three 0.177.0 → 0.181.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -16,7 +16,8 @@ import { NodeAccess } from '../../../nodes/core/constants.js';
16
16
  import VarNode from '../../../nodes/core/VarNode.js';
17
17
  import ExpressionNode from '../../../nodes/code/ExpressionNode.js';
18
18
 
19
- import { NoColorSpace, FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter } from '../../../constants.js';
19
+ import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter } from '../../../constants.js';
20
+ import { warn, error } from '../../../utils.js';
20
21
 
21
22
  // GPUShaderStage is not defined in browsers not supporting WebGPU
22
23
  const GPUShaderStage = ( typeof self !== 'undefined' ) ? self.GPUShaderStage : { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
@@ -131,22 +132,6 @@ const wgslMethods = {
131
132
  bitcast: 'bitcast<f32>'
132
133
  };
133
134
 
134
- // WebGPU issue: does not support pow() with negative base on Windows
135
-
136
- if ( typeof navigator !== 'undefined' && /Windows/g.test( navigator.userAgent ) ) {
137
-
138
- wgslPolyfill.pow_float = new CodeNode( 'fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }' );
139
- wgslPolyfill.pow_vec2 = new CodeNode( 'fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }', [ wgslPolyfill.pow_float ] );
140
- wgslPolyfill.pow_vec3 = new CodeNode( 'fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }', [ wgslPolyfill.pow_float ] );
141
- wgslPolyfill.pow_vec4 = new CodeNode( 'fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }', [ wgslPolyfill.pow_float ] );
142
-
143
- wgslMethods.pow_float = 'tsl_pow_float';
144
- wgslMethods.pow_vec2 = 'tsl_pow_vec2';
145
- wgslMethods.pow_vec3 = 'tsl_pow_vec3';
146
- wgslMethods.pow_vec4 = 'tsl_pow_vec4';
147
-
148
- }
149
-
150
135
  //
151
136
 
152
137
  let diagnostics = '';
@@ -211,18 +196,6 @@ class WGSLNodeBuilder extends NodeBuilder {
211
196
 
212
197
  }
213
198
 
214
- /**
215
- * Checks if the given texture requires a manual conversion to the working color space.
216
- *
217
- * @param {Texture} texture - The texture to check.
218
- * @return {boolean} Whether the given texture requires a conversion to working color space or not.
219
- */
220
- needsToWorkingColorSpace( texture ) {
221
-
222
- return texture.isVideoTexture === true && texture.colorSpace !== NoColorSpace;
223
-
224
- }
225
-
226
199
  /**
227
200
  * Generates the WGSL snippet for sampled textures.
228
201
  *
@@ -231,49 +204,39 @@ class WGSLNodeBuilder extends NodeBuilder {
231
204
  * @param {string} textureProperty - The name of the texture uniform in the shader.
232
205
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
233
206
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
207
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
234
208
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
235
209
  * @return {string} The WGSL snippet.
236
210
  */
237
- _generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
211
+ _generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
238
212
 
239
213
  if ( shaderStage === 'fragment' ) {
240
214
 
241
215
  if ( depthSnippet ) {
242
216
 
243
- return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet } )`;
217
+ if ( offsetSnippet ) {
244
218
 
245
- } else {
246
-
247
- return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet } )`;
219
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ offsetSnippet } )`;
248
220
 
249
- }
221
+ }
250
222
 
251
- } else {
223
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet } )`;
252
224
 
253
- return this._generateTextureSampleLevel( texture, textureProperty, uvSnippet, '0', depthSnippet );
225
+ } else {
254
226
 
255
- }
227
+ if ( offsetSnippet ) {
256
228
 
257
- }
229
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ offsetSnippet } )`;
258
230
 
259
- /**
260
- * Generates the WGSL snippet when sampling video textures.
261
- *
262
- * @private
263
- * @param {string} textureProperty - The name of the video texture uniform in the shader.
264
- * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
265
- * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
266
- * @return {string} The WGSL snippet.
267
- */
268
- _generateVideoSample( textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
231
+ }
269
232
 
270
- if ( shaderStage === 'fragment' ) {
233
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet } )`;
271
234
 
272
- return `textureSampleBaseClampToEdge( ${ textureProperty }, ${ textureProperty }_sampler, vec2<f32>( ${ uvSnippet }.x, 1.0 - ${ uvSnippet }.y ) )`;
235
+ }
273
236
 
274
237
  } else {
275
238
 
276
- console.error( `WebGPURenderer: THREE.VideoTexture does not support ${ shaderStage } shader.` );
239
+ return this.generateTextureSampleLevel( texture, textureProperty, uvSnippet, '0', depthSnippet );
277
240
 
278
241
  }
279
242
 
@@ -288,21 +251,28 @@ class WGSLNodeBuilder extends NodeBuilder {
288
251
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
289
252
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
290
253
  * @param {string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
254
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
291
255
  * @return {string} The WGSL snippet.
292
256
  */
293
- _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
257
+ generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
294
258
 
295
259
  if ( this.isUnfilterable( texture ) === false ) {
296
260
 
261
+ if ( offsetSnippet ) {
262
+
263
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
264
+
265
+ }
266
+
297
267
  return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
298
268
 
299
269
  } else if ( this.isFilteredTexture( texture ) ) {
300
270
 
301
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
271
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
302
272
 
303
273
  } else {
304
274
 
305
- return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet );
275
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
306
276
 
307
277
  }
308
278
 
@@ -352,7 +322,7 @@ class WGSLNodeBuilder extends NodeBuilder {
352
322
 
353
323
  code += `\t\tcoord.${ axis }`;
354
324
 
355
- console.warn( `WebGPURenderer: Unsupported texture wrap type "${ wrap }" for vertex shader.` );
325
+ warn( `WebGPURenderer: Unsupported texture wrap type "${ wrap }" for vertex shader.` );
356
326
 
357
327
  }
358
328
 
@@ -434,7 +404,7 @@ class WGSLNodeBuilder extends NodeBuilder {
434
404
  }
435
405
 
436
406
  // Build parameters string based on texture type and multisampling
437
- if ( isMultisampled || texture.isVideoTexture || texture.isStorageTexture ) {
407
+ if ( isMultisampled || texture.isStorageTexture ) {
438
408
 
439
409
  textureDimensionsParams = textureProperty;
440
410
 
@@ -480,16 +450,23 @@ class WGSLNodeBuilder extends NodeBuilder {
480
450
  * @param {Texture} texture - The texture.
481
451
  * @param {string} textureProperty - The name of the texture uniform in the shader.
482
452
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
483
- * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
453
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
454
+ * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
484
455
  * @return {string} The WGSL snippet.
485
456
  */
486
- generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet = '0u' ) {
457
+ generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u' ) {
487
458
 
488
459
  this._include( 'biquadraticTexture' );
489
460
 
490
461
  const wrapFunction = this.generateWrapFunction( texture );
491
462
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
492
463
 
464
+ if ( offsetSnippet ) {
465
+
466
+ uvSnippet = `${ uvSnippet } + vec2<f32>(${ offsetSnippet }) / ${ textureDimension }`;
467
+
468
+ }
469
+
493
470
  return `tsl_biquadraticTexture( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ levelSnippet } ) )`;
494
471
 
495
472
  }
@@ -502,18 +479,26 @@ class WGSLNodeBuilder extends NodeBuilder {
502
479
  * @param {string} textureProperty - The name of the texture uniform in the shader.
503
480
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
504
481
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
482
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
505
483
  * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
506
484
  * @return {string} The WGSL snippet.
507
485
  */
508
- generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet = '0u' ) {
486
+ generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet = '0u' ) {
509
487
 
510
488
  const wrapFunction = this.generateWrapFunction( texture );
511
489
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
512
490
 
513
491
  const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
492
+
493
+ if ( offsetSnippet ) {
494
+
495
+ uvSnippet = `${ uvSnippet } + ${ vecType }<f32>(${ offsetSnippet }) / ${ vecType }<f32>( ${ textureDimension } )`;
496
+
497
+ }
498
+
514
499
  const coordSnippet = `${ vecType }<u32>( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) )`;
515
500
 
516
- return this.generateTextureLoad( texture, textureProperty, coordSnippet, depthSnippet, levelSnippet );
501
+ return this.generateTextureLoad( texture, textureProperty, coordSnippet, levelSnippet, depthSnippet, null );
517
502
 
518
503
  }
519
504
 
@@ -523,19 +508,24 @@ class WGSLNodeBuilder extends NodeBuilder {
523
508
  * @param {Texture} texture - The texture.
524
509
  * @param {string} textureProperty - The name of the texture uniform in the shader.
525
510
  * @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.
511
+ * @param {?string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
526
512
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
527
- * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
513
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
528
514
  * @return {string} The WGSL snippet.
529
515
  */
530
- generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0u' ) {
516
+ generateTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
531
517
 
532
- let snippet;
518
+ if ( levelSnippet === null ) levelSnippet = '0u';
519
+
520
+ if ( offsetSnippet ) {
533
521
 
534
- if ( texture.isVideoTexture === true ) {
522
+ uvIndexSnippet = `${ uvIndexSnippet } + ${ offsetSnippet }`;
535
523
 
536
- snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet } )`;
524
+ }
537
525
 
538
- } else if ( depthSnippet ) {
526
+ let snippet;
527
+
528
+ if ( depthSnippet ) {
539
529
 
540
530
  snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet }, u32( ${ levelSnippet } ) )`;
541
531
 
@@ -617,24 +607,21 @@ class WGSLNodeBuilder extends NodeBuilder {
617
607
  * @param {string} textureProperty - The name of the texture uniform in the shader.
618
608
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
619
609
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
610
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
620
611
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
621
612
  * @return {string} The WGSL snippet.
622
613
  */
623
- generateTexture( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
614
+ generateTexture( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
624
615
 
625
616
  let snippet = null;
626
617
 
627
- if ( texture.isVideoTexture === true ) {
628
-
629
- snippet = this._generateVideoSample( textureProperty, uvSnippet, shaderStage );
618
+ if ( this.isUnfilterable( texture ) ) {
630
619
 
631
- } else if ( this.isUnfilterable( texture ) ) {
632
-
633
- snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, '0', shaderStage );
620
+ snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, '0', shaderStage );
634
621
 
635
622
  } else {
636
623
 
637
- snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage );
624
+ snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage );
638
625
 
639
626
  }
640
627
 
@@ -650,19 +637,26 @@ class WGSLNodeBuilder extends NodeBuilder {
650
637
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
651
638
  * @param {Array<string>} gradSnippet - An array holding both gradient WGSL snippets.
652
639
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
640
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
653
641
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
654
642
  * @return {string} The WGSL snippet.
655
643
  */
656
- generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, shaderStage = this.shaderStage ) {
644
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
657
645
 
658
646
  if ( shaderStage === 'fragment' ) {
659
647
 
660
648
  // TODO handle i32 or u32 --> uvSnippet, array_index: A, ddx, ddy
649
+ if ( offsetSnippet ) {
650
+
651
+ return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;
652
+
653
+ }
654
+
661
655
  return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
662
656
 
663
657
  } else {
664
658
 
665
- console.error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
659
+ error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
666
660
 
667
661
  }
668
662
 
@@ -677,24 +671,37 @@ class WGSLNodeBuilder extends NodeBuilder {
677
671
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
678
672
  * @param {string} compareSnippet - A WGSL snippet that represents the reference value.
679
673
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
674
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
680
675
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
681
676
  * @return {string} The WGSL snippet.
682
677
  */
683
- generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
678
+ generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
684
679
 
685
680
  if ( shaderStage === 'fragment' ) {
686
681
 
687
682
  if ( texture.isDepthTexture === true && texture.isArrayTexture === true ) {
688
683
 
684
+ if ( offsetSnippet ) {
685
+
686
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
687
+
688
+ }
689
+
689
690
  return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } )`;
690
691
 
691
692
  }
692
693
 
694
+ if ( offsetSnippet ) {
695
+
696
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
697
+
698
+ }
699
+
693
700
  return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet } )`;
694
701
 
695
702
  } else {
696
703
 
697
- console.error( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );
704
+ error( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );
698
705
 
699
706
  }
700
707
 
@@ -708,25 +715,32 @@ class WGSLNodeBuilder extends NodeBuilder {
708
715
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
709
716
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
710
717
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
718
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
711
719
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
712
720
  * @return {string} The WGSL snippet.
713
721
  */
714
- generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) {
722
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
715
723
 
716
- let snippet = null;
724
+ if ( this.isUnfilterable( texture ) === false ) {
725
+
726
+ if ( offsetSnippet ) {
717
727
 
718
- if ( texture.isVideoTexture === true ) {
728
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
729
+
730
+ }
731
+
732
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
733
+
734
+ } else if ( this.isFilteredTexture( texture ) ) {
719
735
 
720
- snippet = this._generateVideoSample( textureProperty, uvSnippet, shaderStage );
736
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
721
737
 
722
738
  } else {
723
739
 
724
- snippet = this._generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet );
740
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
725
741
 
726
742
  }
727
743
 
728
- return snippet;
729
-
730
744
  }
731
745
 
732
746
  /**
@@ -737,18 +751,25 @@ class WGSLNodeBuilder extends NodeBuilder {
737
751
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
738
752
  * @param {string} biasSnippet - A WGSL snippet that represents the bias to apply to the mip level before sampling.
739
753
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
754
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
740
755
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
741
756
  * @return {string} The WGSL snippet.
742
757
  */
743
- generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, shaderStage = this.shaderStage ) {
758
+ generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
744
759
 
745
760
  if ( shaderStage === 'fragment' ) {
746
761
 
762
+ if ( offsetSnippet ) {
763
+
764
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
765
+
766
+ }
767
+
747
768
  return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;
748
769
 
749
770
  } else {
750
771
 
751
- console.error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
772
+ error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
752
773
 
753
774
  }
754
775
 
@@ -844,9 +865,20 @@ class WGSLNodeBuilder extends NodeBuilder {
844
865
  */
845
866
  getNodeAccess( node, shaderStage ) {
846
867
 
847
- if ( shaderStage !== 'compute' )
868
+ if ( shaderStage !== 'compute' ) {
869
+
870
+ if ( node.isAtomic === true ) {
871
+
872
+ warn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );
873
+
874
+ return NodeAccess.READ_WRITE;
875
+
876
+ }
877
+
848
878
  return NodeAccess.READ_ONLY;
849
879
 
880
+ }
881
+
850
882
  return node.access;
851
883
 
852
884
  }
@@ -899,7 +931,15 @@ class WGSLNodeBuilder extends NodeBuilder {
899
931
 
900
932
  if ( type === 'texture' || type === 'storageTexture' ) {
901
933
 
902
- texture = new NodeSampledTexture( uniformNode.name, uniformNode.node, group, access );
934
+ if ( node.value.is3DTexture === true ) {
935
+
936
+ texture = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, group, access );
937
+
938
+ } else {
939
+
940
+ texture = new NodeSampledTexture( uniformNode.name, uniformNode.node, group, access );
941
+
942
+ }
903
943
 
904
944
  } else if ( type === 'cubeTexture' ) {
905
945
 
@@ -912,6 +952,7 @@ class WGSLNodeBuilder extends NodeBuilder {
912
952
  }
913
953
 
914
954
  texture.store = node.isStorageTextureNode === true;
955
+ texture.mipLevel = texture.store ? node.mipLevel : 0;
915
956
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
916
957
 
917
958
  if ( this.isUnfilterable( node.value ) === false && texture.store === false ) {
@@ -1075,7 +1116,8 @@ ${ flowData.code }
1075
1116
  }
1076
1117
 
1077
1118
  /**
1078
- * Returns the instance index builtin.
1119
+ * Contextually returns either the vertex stage instance index builtin
1120
+ * or the linearized index of an compute invocation within a grid of workgroups.
1079
1121
  *
1080
1122
  * @return {string} The instance index.
1081
1123
  */
@@ -1091,8 +1133,9 @@ ${ flowData.code }
1091
1133
 
1092
1134
  }
1093
1135
 
1136
+
1094
1137
  /**
1095
- * Returns the invocation local index builtin.
1138
+ * Returns a builtin representing the index of a compute invocation within the scope of a workgroup load.
1096
1139
  *
1097
1140
  * @return {string} The invocation local index.
1098
1141
  */
@@ -1103,7 +1146,7 @@ ${ flowData.code }
1103
1146
  }
1104
1147
 
1105
1148
  /**
1106
- * Returns the subgroup size builtin.
1149
+ * Returns a builtin representing the size of a subgroup within the current shader.
1107
1150
  *
1108
1151
  * @return {string} The subgroup size.
1109
1152
  */
@@ -1116,7 +1159,7 @@ ${ flowData.code }
1116
1159
  }
1117
1160
 
1118
1161
  /**
1119
- * Returns the invocation subgroup index builtin.
1162
+ * Returns a builtin representing the index of a compute invocation within the scope of a subgroup.
1120
1163
  *
1121
1164
  * @return {string} The invocation subgroup index.
1122
1165
  */
@@ -1129,7 +1172,7 @@ ${ flowData.code }
1129
1172
  }
1130
1173
 
1131
1174
  /**
1132
- * Returns the subgroup index builtin.
1175
+ * Returns a builtin representing the index of a compute invocation's subgroup within its workgroup.
1133
1176
  *
1134
1177
  * @return {string} The subgroup index.
1135
1178
  */
@@ -1701,24 +1744,25 @@ ${ flowData.code }
1701
1744
 
1702
1745
  }
1703
1746
 
1704
- } else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {
1747
+ } else if ( uniform.node.isStorageTextureNode === true ) {
1705
1748
 
1706
- textureType = 'texture_2d_array<f32>';
1749
+ const format = getFormat( texture );
1750
+ const access = this.getStorageAccess( uniform.node, shaderStage );
1707
1751
 
1708
- } else if ( texture.isVideoTexture === true ) {
1752
+ const is3D = uniform.node.value.is3DTexture;
1753
+ const isArrayTexture = uniform.node.value.isArrayTexture;
1709
1754
 
1710
- textureType = 'texture_external';
1755
+ const dimension = is3D ? '3d' : `2d${ isArrayTexture ? '_array' : '' }`;
1711
1756
 
1712
- } else if ( texture.isData3DTexture === true ) {
1757
+ textureType = `texture_storage_${ dimension }<${ format }, ${ access }>`;
1713
1758
 
1714
- textureType = 'texture_3d<f32>';
1759
+ } else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {
1715
1760
 
1716
- } else if ( uniform.node.isStorageTextureNode === true ) {
1761
+ textureType = 'texture_2d_array<f32>';
1717
1762
 
1718
- const format = getFormat( texture );
1719
- const access = this.getStorageAccess( uniform.node, shaderStage );
1763
+ } else if ( texture.is3DTexture === true || texture.isData3DTexture === true ) {
1720
1764
 
1721
- textureType = `texture_storage_2d<${ format }, ${ access }>`;
1765
+ textureType = 'texture_3d<f32>';
1722
1766
 
1723
1767
  } else {
1724
1768
 
@@ -1885,7 +1929,11 @@ ${ flowData.code }
1885
1929
 
1886
1930
  } else {
1887
1931
 
1888
- this.computeShader = this._getWGSLComputeCode( shadersData.compute, ( this.object.workgroupSize || [ 64 ] ).join( ', ' ) );
1932
+ // Early strictly validated in computeNode
1933
+
1934
+ const workgroupSize = this.object.workgroupSize;
1935
+
1936
+ this.computeShader = this._getWGSLComputeCode( shadersData.compute, workgroupSize );
1889
1937
 
1890
1938
  }
1891
1939
 
@@ -1918,6 +1966,35 @@ ${ flowData.code }
1918
1966
 
1919
1967
  }
1920
1968
 
1969
+ /**
1970
+ * Returns the bitcast method name for a given input and outputType.
1971
+ *
1972
+ * @param {string} type - The output type to bitcast to.
1973
+ * @return {string} The resolved WGSL bitcast invocation.
1974
+ */
1975
+ getBitcastMethod( type ) {
1976
+
1977
+ const dataType = this.getType( type );
1978
+
1979
+ return `bitcast<${ dataType }>`;
1980
+
1981
+ }
1982
+
1983
+ /**
1984
+ * Returns the native snippet for a ternary operation.
1985
+ *
1986
+ * @param {string} condSnippet - The condition determining which expression gets resolved.
1987
+ * @param {string} ifSnippet - The expression to resolve to if the condition is true.
1988
+ * @param {string} elseSnippet - The expression to resolve to if the condition is false.
1989
+ * @return {string} The resolved method name.
1990
+ */
1991
+ getTernary( condSnippet, ifSnippet, elseSnippet ) {
1992
+
1993
+ return `select( ${elseSnippet}, ${ifSnippet}, ${condSnippet} )`;
1994
+
1995
+ }
1996
+
1997
+
1921
1998
  /**
1922
1999
  * Returns the WGSL type of the given node data type.
1923
2000
  *
@@ -1992,11 +2069,7 @@ ${ flowData.code }
1992
2069
  const codeNode = wgslPolyfill[ name ];
1993
2070
  codeNode.build( this );
1994
2071
 
1995
- if ( this.currentFunctionNode !== null ) {
1996
-
1997
- this.currentFunctionNode.includes.push( codeNode );
1998
-
1999
- }
2072
+ this.addInclude( codeNode );
2000
2073
 
2001
2074
  return codeNode;
2002
2075
 
@@ -2090,36 +2163,40 @@ fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
2090
2163
  */
2091
2164
  _getWGSLComputeCode( shaderData, workgroupSize ) {
2092
2165
 
2166
+ const [ workgroupSizeX, workgroupSizeY, workgroupSizeZ ] = workgroupSize;
2167
+
2093
2168
  return `${ this.getSignature() }
2094
2169
  // directives
2095
- ${shaderData.directives}
2170
+ ${ shaderData.directives }
2096
2171
 
2097
2172
  // system
2098
2173
  var<private> instanceIndex : u32;
2099
2174
 
2100
2175
  // locals
2101
- ${shaderData.scopedArrays}
2176
+ ${ shaderData.scopedArrays }
2102
2177
 
2103
2178
  // structs
2104
- ${shaderData.structs}
2179
+ ${ shaderData.structs }
2105
2180
 
2106
2181
  // uniforms
2107
- ${shaderData.uniforms}
2182
+ ${ shaderData.uniforms }
2108
2183
 
2109
2184
  // codes
2110
- ${shaderData.codes}
2185
+ ${ shaderData.codes }
2111
2186
 
2112
- @compute @workgroup_size( ${workgroupSize} )
2113
- fn main( ${shaderData.attributes} ) {
2187
+ @compute @workgroup_size( ${ workgroupSizeX }, ${ workgroupSizeY }, ${ workgroupSizeZ } )
2188
+ fn main( ${ shaderData.attributes } ) {
2114
2189
 
2115
2190
  // system
2116
- instanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${workgroupSize}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${workgroupSize});
2191
+ instanceIndex = globalId.x
2192
+ + globalId.y * ( ${ workgroupSizeX } * numWorkgroups.x )
2193
+ + globalId.z * ( ${ workgroupSizeX } * numWorkgroups.x ) * ( ${ workgroupSizeY } * numWorkgroups.y );
2117
2194
 
2118
2195
  // vars
2119
- ${shaderData.vars}
2196
+ ${ shaderData.vars }
2120
2197
 
2121
2198
  // flow
2122
- ${shaderData.flow}
2199
+ ${ shaderData.flow }
2123
2200
 
2124
2201
  }
2125
2202
  `;