@plastic-software/three 0.179.0 → 0.181.1

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 (430) hide show
  1. package/build/three.cjs +1108 -591
  2. package/build/three.core.js +616 -345
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +488 -250
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +37 -6
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +6576 -2152
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +6575 -2151
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  13. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  14. package/examples/jsm/Addons.js +1 -1
  15. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  16. package/examples/jsm/controls/ArcballControls.js +8 -8
  17. package/examples/jsm/controls/DragControls.js +7 -57
  18. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  19. package/examples/jsm/controls/FlyControls.js +1 -1
  20. package/examples/jsm/controls/OrbitControls.js +2 -2
  21. package/examples/jsm/controls/PointerLockControls.js +2 -10
  22. package/examples/jsm/controls/TrackballControls.js +1 -1
  23. package/examples/jsm/controls/TransformControls.js +1 -1
  24. package/examples/jsm/effects/AsciiEffect.js +8 -8
  25. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  26. package/examples/jsm/exporters/EXRExporter.js +1 -1
  27. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  28. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  29. package/examples/jsm/exporters/PLYExporter.js +1 -1
  30. package/examples/jsm/exporters/USDZExporter.js +9 -2
  31. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  34. package/examples/jsm/geometries/TextGeometry.js +3 -2
  35. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  36. package/examples/jsm/helpers/ViewHelper.js +43 -5
  37. package/examples/jsm/inspector/Inspector.js +427 -0
  38. package/examples/jsm/inspector/RendererInspector.js +415 -0
  39. package/examples/jsm/inspector/tabs/Console.js +204 -0
  40. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  41. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  42. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  43. package/examples/jsm/inspector/ui/Graph.js +95 -0
  44. package/examples/jsm/inspector/ui/Item.js +170 -0
  45. package/examples/jsm/inspector/ui/List.js +75 -0
  46. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  47. package/examples/jsm/inspector/ui/Style.js +654 -0
  48. package/examples/jsm/inspector/ui/Tab.js +46 -0
  49. package/examples/jsm/inspector/ui/Values.js +423 -0
  50. package/examples/jsm/inspector/ui/utils.js +56 -0
  51. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  52. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  53. package/examples/jsm/interactive/SelectionBox.js +30 -0
  54. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  55. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  56. package/examples/jsm/lines/Line2.js +3 -3
  57. package/examples/jsm/lines/LineGeometry.js +1 -1
  58. package/examples/jsm/lines/LineSegments2.js +2 -2
  59. package/examples/jsm/lines/Wireframe.js +2 -2
  60. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  61. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  62. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  63. package/examples/jsm/loaders/3MFLoader.js +1 -1
  64. package/examples/jsm/loaders/ColladaLoader.js +3 -3
  65. package/examples/jsm/loaders/DDSLoader.js +1 -1
  66. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  67. package/examples/jsm/loaders/EXRLoader.js +5 -5
  68. package/examples/jsm/loaders/FBXLoader.js +2 -2
  69. package/examples/jsm/loaders/FontLoader.js +23 -5
  70. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  71. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  72. package/examples/jsm/loaders/HDRLoader.js +486 -0
  73. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  74. package/examples/jsm/loaders/KTXLoader.js +2 -2
  75. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  76. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  77. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  78. package/examples/jsm/loaders/LWOLoader.js +2 -2
  79. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  80. package/examples/jsm/loaders/OBJLoader.js +1 -1
  81. package/examples/jsm/loaders/PDBLoader.js +1 -1
  82. package/examples/jsm/loaders/RGBELoader.js +7 -473
  83. package/examples/jsm/loaders/SVGLoader.js +2 -2
  84. package/examples/jsm/loaders/TTFLoader.js +4 -4
  85. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  86. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  87. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  88. package/examples/jsm/math/ColorSpaces.js +19 -1
  89. package/examples/jsm/math/ConvexHull.js +3 -3
  90. package/examples/jsm/math/ImprovedNoise.js +1 -1
  91. package/examples/jsm/math/Lut.js +2 -2
  92. package/examples/jsm/math/SimplexNoise.js +1 -1
  93. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  94. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  95. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  96. package/examples/jsm/misc/TubePainter.js +383 -40
  97. package/examples/jsm/misc/Volume.js +1 -1
  98. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  99. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  100. package/examples/jsm/objects/Sky.js +1 -1
  101. package/examples/jsm/objects/SkyMesh.js +1 -1
  102. package/examples/jsm/objects/Water.js +3 -3
  103. package/examples/jsm/objects/WaterMesh.js +6 -6
  104. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  105. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  106. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  107. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  108. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  109. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  110. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  111. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  112. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  113. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  114. package/examples/jsm/shaders/BokehShader.js +1 -1
  115. package/examples/jsm/shaders/BokehShader2.js +1 -1
  116. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  117. package/examples/jsm/shaders/FocusShader.js +1 -1
  118. package/examples/jsm/shaders/GTAOShader.js +2 -2
  119. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  120. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  122. package/examples/jsm/shaders/SSRShader.js +1 -1
  123. package/examples/jsm/shaders/SepiaShader.js +1 -1
  124. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  125. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  126. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
  127. package/examples/jsm/shaders/VignetteShader.js +1 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
  129. package/examples/jsm/transpiler/TSLEncoder.js +9 -10
  130. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  131. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  132. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  133. package/examples/jsm/tsl/display/BloomNode.js +7 -3
  134. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  135. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  136. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  137. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  138. package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
  139. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  140. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  141. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  142. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  143. package/examples/jsm/tsl/display/TRAANode.js +124 -7
  144. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  145. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  146. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  147. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  148. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  149. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  150. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  151. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  152. package/package.json +5 -10
  153. package/src/Three.Core.js +4 -2
  154. package/src/Three.TSL.js +36 -5
  155. package/src/Three.WebGPU.Nodes.js +2 -0
  156. package/src/Three.WebGPU.js +2 -0
  157. package/src/animation/AnimationClip.js +20 -4
  158. package/src/animation/AnimationMixer.js +3 -3
  159. package/src/animation/AnimationObjectGroup.js +2 -1
  160. package/src/animation/KeyframeTrack.js +7 -6
  161. package/src/animation/PropertyBinding.js +12 -11
  162. package/src/audio/Audio.js +10 -9
  163. package/src/audio/PositionalAudio.js +1 -1
  164. package/src/cameras/OrthographicCamera.js +1 -1
  165. package/src/cameras/PerspectiveCamera.js +1 -1
  166. package/src/cameras/StereoCamera.js +2 -2
  167. package/src/constants.js +11 -3
  168. package/src/core/BufferGeometry.js +10 -10
  169. package/src/core/EventDispatcher.js +1 -1
  170. package/src/core/InterleavedBuffer.js +1 -1
  171. package/src/core/InterleavedBufferAttribute.js +3 -2
  172. package/src/core/Object3D.js +3 -2
  173. package/src/core/Raycaster.js +2 -1
  174. package/src/core/RenderTarget.js +10 -1
  175. package/src/extras/Controls.js +5 -4
  176. package/src/extras/DataUtils.js +2 -1
  177. package/src/extras/Earcut.js +6 -0
  178. package/src/extras/ImageUtils.js +2 -2
  179. package/src/extras/PMREMGenerator.js +268 -55
  180. package/src/extras/TextureUtils.js +2 -1
  181. package/src/extras/core/Curve.js +2 -1
  182. package/src/extras/core/Interpolations.js +7 -1
  183. package/src/extras/core/ShapePath.js +4 -4
  184. package/src/extras/lib/earcut.js +8 -8
  185. package/src/geometries/BoxGeometry.js +1 -0
  186. package/src/geometries/CapsuleGeometry.js +1 -0
  187. package/src/geometries/CircleGeometry.js +1 -0
  188. package/src/geometries/ConeGeometry.js +1 -0
  189. package/src/geometries/CylinderGeometry.js +1 -0
  190. package/src/geometries/DodecahedronGeometry.js +1 -0
  191. package/src/geometries/ExtrudeGeometry.js +8 -6
  192. package/src/geometries/IcosahedronGeometry.js +1 -0
  193. package/src/geometries/LatheGeometry.js +1 -0
  194. package/src/geometries/OctahedronGeometry.js +1 -0
  195. package/src/geometries/PlaneGeometry.js +1 -0
  196. package/src/geometries/RingGeometry.js +1 -0
  197. package/src/geometries/ShapeGeometry.js +1 -0
  198. package/src/geometries/SphereGeometry.js +1 -0
  199. package/src/geometries/TetrahedronGeometry.js +1 -0
  200. package/src/geometries/TorusGeometry.js +1 -0
  201. package/src/geometries/TorusKnotGeometry.js +1 -0
  202. package/src/geometries/TubeGeometry.js +1 -0
  203. package/src/helpers/CameraHelper.js +1 -1
  204. package/src/lights/webgpu/ProjectorLight.js +1 -1
  205. package/src/loaders/AnimationLoader.js +2 -1
  206. package/src/loaders/AudioLoader.js +2 -1
  207. package/src/loaders/BufferGeometryLoader.js +2 -2
  208. package/src/loaders/Cache.js +2 -2
  209. package/src/loaders/DataTextureLoader.js +1 -1
  210. package/src/loaders/FileLoader.js +3 -2
  211. package/src/loaders/ImageBitmapLoader.js +5 -4
  212. package/src/loaders/ImageLoader.js +1 -1
  213. package/src/loaders/Loader.js +3 -3
  214. package/src/loaders/LoadingManager.js +25 -3
  215. package/src/loaders/MaterialLoader.js +3 -2
  216. package/src/loaders/ObjectLoader.js +13 -13
  217. package/src/loaders/TextureLoader.js +1 -1
  218. package/src/loaders/nodes/NodeLoader.js +3 -2
  219. package/src/materials/Material.js +16 -3
  220. package/src/materials/MeshBasicMaterial.js +1 -0
  221. package/src/materials/MeshDepthMaterial.js +1 -0
  222. package/src/materials/MeshDistanceMaterial.js +1 -1
  223. package/src/materials/MeshLambertMaterial.js +2 -1
  224. package/src/materials/MeshMatcapMaterial.js +22 -0
  225. package/src/materials/MeshNormalMaterial.js +1 -0
  226. package/src/materials/MeshPhongMaterial.js +2 -1
  227. package/src/materials/MeshPhysicalMaterial.js +2 -1
  228. package/src/materials/MeshStandardMaterial.js +8 -7
  229. package/src/materials/MeshToonMaterial.js +1 -0
  230. package/src/materials/PointsMaterial.js +1 -1
  231. package/src/materials/ShaderMaterial.js +2 -2
  232. package/src/materials/nodes/Line2NodeMaterial.js +2 -2
  233. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  234. package/src/materials/nodes/NodeMaterial.js +62 -22
  235. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  236. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  237. package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
  238. package/src/math/Color.js +6 -5
  239. package/src/math/ColorManagement.js +9 -3
  240. package/src/math/Cylindrical.js +1 -1
  241. package/src/math/Euler.js +2 -1
  242. package/src/math/MathUtils.js +13 -11
  243. package/src/math/Matrix2.js +1 -1
  244. package/src/math/Matrix3.js +2 -2
  245. package/src/math/Matrix4.js +7 -7
  246. package/src/math/Plane.js +1 -1
  247. package/src/math/Quaternion.js +68 -66
  248. package/src/math/Spherical.js +1 -1
  249. package/src/nodes/Nodes.js +4 -1
  250. package/src/nodes/TSL.js +4 -1
  251. package/src/nodes/accessors/BufferNode.js +1 -1
  252. package/src/nodes/accessors/Camera.js +133 -7
  253. package/src/nodes/accessors/ClippingNode.js +6 -5
  254. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  255. package/src/nodes/accessors/InstanceNode.js +25 -5
  256. package/src/nodes/accessors/Lights.js +10 -0
  257. package/src/nodes/accessors/Normal.js +5 -4
  258. package/src/nodes/accessors/Object3DNode.js +1 -1
  259. package/src/nodes/accessors/Position.js +18 -2
  260. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  261. package/src/nodes/accessors/ReferenceNode.js +3 -2
  262. package/src/nodes/accessors/SceneNode.js +2 -1
  263. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  264. package/src/nodes/accessors/StorageTextureNode.js +22 -0
  265. package/src/nodes/accessors/Texture3DNode.js +14 -1
  266. package/src/nodes/accessors/TextureNode.js +130 -44
  267. package/src/nodes/code/FunctionCallNode.js +24 -4
  268. package/src/nodes/code/FunctionNode.js +23 -0
  269. package/src/nodes/core/ArrayNode.js +1 -0
  270. package/src/nodes/core/AssignNode.js +4 -3
  271. package/src/nodes/core/AttributeNode.js +2 -1
  272. package/src/nodes/core/ContextNode.js +29 -10
  273. package/src/nodes/core/IndexNode.js +2 -2
  274. package/src/nodes/core/InputNode.js +2 -1
  275. package/src/nodes/core/InspectorNode.js +128 -0
  276. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
  277. package/src/nodes/core/Node.js +152 -31
  278. package/src/nodes/core/NodeBuilder.js +183 -35
  279. package/src/nodes/core/NodeFrame.js +21 -21
  280. package/src/nodes/core/NodeFunction.js +2 -1
  281. package/src/nodes/core/NodeParser.js +2 -1
  282. package/src/nodes/core/NodeUniform.js +1 -1
  283. package/src/nodes/core/NodeUtils.js +17 -91
  284. package/src/nodes/core/ParameterNode.js +31 -0
  285. package/src/nodes/core/PropertyNode.js +7 -0
  286. package/src/nodes/core/StackNode.js +43 -16
  287. package/src/nodes/core/StructNode.js +5 -5
  288. package/src/nodes/core/StructTypeNode.js +1 -0
  289. package/src/nodes/core/SubBuildNode.js +2 -2
  290. package/src/nodes/core/UniformNode.js +18 -10
  291. package/src/nodes/core/VarNode.js +70 -33
  292. package/src/nodes/core/VaryingNode.js +3 -2
  293. package/src/nodes/display/BlendModes.js +5 -4
  294. package/src/nodes/display/BumpMapNode.js +1 -1
  295. package/src/nodes/display/ColorAdjustment.js +1 -1
  296. package/src/nodes/display/FrontFacingNode.js +4 -8
  297. package/src/nodes/display/NormalMapNode.js +2 -1
  298. package/src/nodes/display/PassNode.js +52 -11
  299. package/src/nodes/display/RenderOutputNode.js +28 -2
  300. package/src/nodes/display/ScreenNode.js +44 -14
  301. package/src/nodes/display/ToneMappingNode.js +31 -4
  302. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  303. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  304. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  305. package/src/nodes/display/ViewportTextureNode.js +42 -12
  306. package/src/nodes/fog/Fog.js +3 -2
  307. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  308. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  309. package/src/nodes/functions/BasicLightingModel.js +2 -1
  310. package/src/nodes/functions/PhysicalLightingModel.js +3 -2
  311. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  312. package/src/nodes/geometry/RangeNode.js +40 -4
  313. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  314. package/src/nodes/gpgpu/ComputeNode.js +17 -5
  315. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  316. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  317. package/src/nodes/lighting/EnvironmentNode.js +6 -6
  318. package/src/nodes/lighting/LightsNode.js +3 -4
  319. package/src/nodes/lighting/PointShadowNode.js +6 -0
  320. package/src/nodes/lighting/ShadowFilterNode.js +2 -0
  321. package/src/nodes/lighting/ShadowNode.js +75 -8
  322. package/src/nodes/math/BitcastNode.js +156 -0
  323. package/src/nodes/math/ConditionalNode.js +24 -7
  324. package/src/nodes/math/MathNode.js +25 -19
  325. package/src/nodes/math/OperatorNode.js +7 -5
  326. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  327. package/src/nodes/shapes/Shapes.js +1 -1
  328. package/src/nodes/tsl/TSLBase.js +5 -2
  329. package/src/nodes/tsl/TSLCore.js +460 -159
  330. package/src/nodes/utils/DebugNode.js +2 -1
  331. package/src/nodes/utils/EventNode.js +36 -0
  332. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  333. package/src/nodes/utils/JoinNode.js +6 -3
  334. package/src/nodes/utils/LoopNode.js +20 -24
  335. package/src/nodes/utils/MemberNode.js +59 -7
  336. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  337. package/src/nodes/utils/RTTNode.js +13 -3
  338. package/src/nodes/utils/ReflectorNode.js +58 -7
  339. package/src/nodes/utils/SampleNode.js +12 -2
  340. package/src/nodes/utils/SplitNode.js +11 -0
  341. package/src/nodes/utils/Timer.js +0 -47
  342. package/src/objects/BatchedMesh.js +2 -2
  343. package/src/objects/LOD.js +1 -1
  344. package/src/objects/Line.js +2 -1
  345. package/src/objects/LineSegments.js +2 -1
  346. package/src/objects/Skeleton.js +3 -2
  347. package/src/objects/SkinnedMesh.js +3 -1
  348. package/src/objects/Sprite.js +4 -3
  349. package/src/renderers/WebGLRenderer.js +48 -41
  350. package/src/renderers/common/Animation.js +13 -1
  351. package/src/renderers/common/Attributes.js +1 -1
  352. package/src/renderers/common/Backend.js +108 -27
  353. package/src/renderers/common/Background.js +2 -1
  354. package/src/renderers/common/Bindings.js +58 -2
  355. package/src/renderers/common/CanvasTarget.js +341 -0
  356. package/src/renderers/common/ChainMap.js +1 -1
  357. package/src/renderers/common/DataMap.js +1 -1
  358. package/src/renderers/common/Geometries.js +26 -0
  359. package/src/renderers/common/Info.js +4 -2
  360. package/src/renderers/common/InspectorBase.js +146 -0
  361. package/src/renderers/common/Pipelines.js +1 -1
  362. package/src/renderers/common/PostProcessing.js +6 -25
  363. package/src/renderers/common/QuadMesh.js +7 -1
  364. package/src/renderers/common/RenderContext.js +2 -2
  365. package/src/renderers/common/RenderList.js +7 -3
  366. package/src/renderers/common/RenderObject.js +16 -2
  367. package/src/renderers/common/RenderObjects.js +1 -1
  368. package/src/renderers/common/Renderer.js +473 -245
  369. package/src/renderers/common/RendererUtils.js +9 -0
  370. package/src/renderers/common/SampledTexture.js +9 -1
  371. package/src/renderers/common/Sampler.js +50 -12
  372. package/src/renderers/common/StorageTexture.js +9 -1
  373. package/src/renderers/common/Textures.js +121 -45
  374. package/src/renderers/common/TimestampQueryPool.js +65 -3
  375. package/src/renderers/common/UniformsGroup.js +2 -1
  376. package/src/renderers/common/XRManager.js +42 -22
  377. package/src/renderers/common/extras/PMREMGenerator.js +160 -65
  378. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  379. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  380. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  381. package/src/renderers/common/nodes/Nodes.js +38 -16
  382. package/src/renderers/shaders/DFGLUTData.js +64 -0
  383. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  384. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  386. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  387. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  388. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  389. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  390. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  391. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
  392. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
  393. package/src/renderers/shaders/UniformsLib.js +1 -0
  394. package/src/renderers/shaders/UniformsUtils.js +25 -4
  395. package/src/renderers/webgl/WebGLCapabilities.js +2 -1
  396. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  397. package/src/renderers/webgl/WebGLInfo.js +3 -1
  398. package/src/renderers/webgl/WebGLProgram.js +15 -14
  399. package/src/renderers/webgl/WebGLPrograms.js +2 -1
  400. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  401. package/src/renderers/webgl/WebGLState.js +15 -14
  402. package/src/renderers/webgl/WebGLTextures.js +19 -14
  403. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  404. package/src/renderers/webgl/WebGLUtils.js +3 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
  407. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  408. package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
  409. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
  410. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  411. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  412. package/src/renderers/webgpu/WebGPUBackend.js +153 -123
  413. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  414. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  415. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
  416. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  417. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
  418. package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
  419. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
  420. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  421. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
  422. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  423. package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
  424. package/src/renderers/webxr/WebXRManager.js +42 -26
  425. package/src/textures/ExternalTexture.js +15 -4
  426. package/src/textures/Source.js +3 -2
  427. package/src/textures/Texture.js +3 -2
  428. package/src/textures/VideoTexture.js +2 -3
  429. package/src/utils.js +67 -3
  430. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -17,6 +17,7 @@ import VarNode from '../../../nodes/core/VarNode.js';
17
17
  import ExpressionNode from '../../../nodes/code/ExpressionNode.js';
18
18
 
19
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 = '';
@@ -219,19 +204,32 @@ class WGSLNodeBuilder extends NodeBuilder {
219
204
  * @param {string} textureProperty - The name of the texture uniform in the shader.
220
205
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
221
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.
222
208
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
223
209
  * @return {string} The WGSL snippet.
224
210
  */
225
- _generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
211
+ _generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
226
212
 
227
213
  if ( shaderStage === 'fragment' ) {
228
214
 
229
215
  if ( depthSnippet ) {
230
216
 
217
+ if ( offsetSnippet ) {
218
+
219
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ offsetSnippet } )`;
220
+
221
+ }
222
+
231
223
  return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet } )`;
232
224
 
233
225
  } else {
234
226
 
227
+ if ( offsetSnippet ) {
228
+
229
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ offsetSnippet } )`;
230
+
231
+ }
232
+
235
233
  return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet } )`;
236
234
 
237
235
  }
@@ -253,21 +251,28 @@ class WGSLNodeBuilder extends NodeBuilder {
253
251
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
254
252
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
255
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.
256
255
  * @return {string} The WGSL snippet.
257
256
  */
258
- generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
257
+ generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
259
258
 
260
259
  if ( this.isUnfilterable( texture ) === false ) {
261
260
 
261
+ if ( offsetSnippet ) {
262
+
263
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
264
+
265
+ }
266
+
262
267
  return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
263
268
 
264
269
  } else if ( this.isFilteredTexture( texture ) ) {
265
270
 
266
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
271
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
267
272
 
268
273
  } else {
269
274
 
270
- return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet );
275
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
271
276
 
272
277
  }
273
278
 
@@ -317,7 +322,7 @@ class WGSLNodeBuilder extends NodeBuilder {
317
322
 
318
323
  code += `\t\tcoord.${ axis }`;
319
324
 
320
- console.warn( `WebGPURenderer: Unsupported texture wrap type "${ wrap }" for vertex shader.` );
325
+ warn( `WebGPURenderer: Unsupported texture wrap type "${ wrap }" for vertex shader.` );
321
326
 
322
327
  }
323
328
 
@@ -445,16 +450,23 @@ class WGSLNodeBuilder extends NodeBuilder {
445
450
  * @param {Texture} texture - The texture.
446
451
  * @param {string} textureProperty - The name of the texture uniform in the shader.
447
452
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
448
- * @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.
449
455
  * @return {string} The WGSL snippet.
450
456
  */
451
- generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet = '0u' ) {
457
+ generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u' ) {
452
458
 
453
459
  this._include( 'biquadraticTexture' );
454
460
 
455
461
  const wrapFunction = this.generateWrapFunction( texture );
456
462
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
457
463
 
464
+ if ( offsetSnippet ) {
465
+
466
+ uvSnippet = `${ uvSnippet } + vec2<f32>(${ offsetSnippet }) / ${ textureDimension }`;
467
+
468
+ }
469
+
458
470
  return `tsl_biquadraticTexture( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ levelSnippet } ) )`;
459
471
 
460
472
  }
@@ -467,18 +479,26 @@ class WGSLNodeBuilder extends NodeBuilder {
467
479
  * @param {string} textureProperty - The name of the texture uniform in the shader.
468
480
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
469
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.
470
483
  * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
471
484
  * @return {string} The WGSL snippet.
472
485
  */
473
- generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet = '0u' ) {
486
+ generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet = '0u' ) {
474
487
 
475
488
  const wrapFunction = this.generateWrapFunction( texture );
476
489
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
477
490
 
478
491
  const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
492
+
493
+ if ( offsetSnippet ) {
494
+
495
+ uvSnippet = `${ uvSnippet } + ${ vecType }<f32>(${ offsetSnippet }) / ${ vecType }<f32>( ${ textureDimension } )`;
496
+
497
+ }
498
+
479
499
  const coordSnippet = `${ vecType }<u32>( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) )`;
480
500
 
481
- return this.generateTextureLoad( texture, textureProperty, coordSnippet, depthSnippet, levelSnippet );
501
+ return this.generateTextureLoad( texture, textureProperty, coordSnippet, levelSnippet, depthSnippet, null );
482
502
 
483
503
  }
484
504
 
@@ -488,11 +508,20 @@ class WGSLNodeBuilder extends NodeBuilder {
488
508
  * @param {Texture} texture - The texture.
489
509
  * @param {string} textureProperty - The name of the texture uniform in the shader.
490
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.
491
512
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
492
- * @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.
493
514
  * @return {string} The WGSL snippet.
494
515
  */
495
- generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0u' ) {
516
+ generateTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
517
+
518
+ if ( levelSnippet === null ) levelSnippet = '0u';
519
+
520
+ if ( offsetSnippet ) {
521
+
522
+ uvIndexSnippet = `${ uvIndexSnippet } + ${ offsetSnippet }`;
523
+
524
+ }
496
525
 
497
526
  let snippet;
498
527
 
@@ -578,20 +607,21 @@ class WGSLNodeBuilder extends NodeBuilder {
578
607
  * @param {string} textureProperty - The name of the texture uniform in the shader.
579
608
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
580
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.
581
611
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
582
612
  * @return {string} The WGSL snippet.
583
613
  */
584
- generateTexture( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
614
+ generateTexture( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
585
615
 
586
616
  let snippet = null;
587
617
 
588
618
  if ( this.isUnfilterable( texture ) ) {
589
619
 
590
- snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, '0', shaderStage );
620
+ snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, '0', shaderStage );
591
621
 
592
622
  } else {
593
623
 
594
- snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage );
624
+ snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage );
595
625
 
596
626
  }
597
627
 
@@ -607,19 +637,26 @@ class WGSLNodeBuilder extends NodeBuilder {
607
637
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
608
638
  * @param {Array<string>} gradSnippet - An array holding both gradient WGSL snippets.
609
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.
610
641
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
611
642
  * @return {string} The WGSL snippet.
612
643
  */
613
- generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, shaderStage = this.shaderStage ) {
644
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
614
645
 
615
646
  if ( shaderStage === 'fragment' ) {
616
647
 
617
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
+
618
655
  return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
619
656
 
620
657
  } else {
621
658
 
622
- console.error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
659
+ error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
623
660
 
624
661
  }
625
662
 
@@ -634,24 +671,37 @@ class WGSLNodeBuilder extends NodeBuilder {
634
671
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
635
672
  * @param {string} compareSnippet - A WGSL snippet that represents the reference value.
636
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.
637
675
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
638
676
  * @return {string} The WGSL snippet.
639
677
  */
640
- generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
678
+ generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
641
679
 
642
680
  if ( shaderStage === 'fragment' ) {
643
681
 
644
682
  if ( texture.isDepthTexture === true && texture.isArrayTexture === true ) {
645
683
 
684
+ if ( offsetSnippet ) {
685
+
686
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
687
+
688
+ }
689
+
646
690
  return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } )`;
647
691
 
648
692
  }
649
693
 
694
+ if ( offsetSnippet ) {
695
+
696
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
697
+
698
+ }
699
+
650
700
  return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet } )`;
651
701
 
652
702
  } else {
653
703
 
654
- console.error( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );
704
+ error( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );
655
705
 
656
706
  }
657
707
 
@@ -665,22 +715,29 @@ class WGSLNodeBuilder extends NodeBuilder {
665
715
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
666
716
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
667
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.
668
719
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
669
720
  * @return {string} The WGSL snippet.
670
721
  */
671
- generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
722
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
672
723
 
673
724
  if ( this.isUnfilterable( texture ) === false ) {
674
725
 
726
+ if ( offsetSnippet ) {
727
+
728
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
729
+
730
+ }
731
+
675
732
  return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
676
733
 
677
734
  } else if ( this.isFilteredTexture( texture ) ) {
678
735
 
679
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
736
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
680
737
 
681
738
  } else {
682
739
 
683
- return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet );
740
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
684
741
 
685
742
  }
686
743
 
@@ -694,18 +751,25 @@ class WGSLNodeBuilder extends NodeBuilder {
694
751
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
695
752
  * @param {string} biasSnippet - A WGSL snippet that represents the bias to apply to the mip level before sampling.
696
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.
697
755
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
698
756
  * @return {string} The WGSL snippet.
699
757
  */
700
- generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, shaderStage = this.shaderStage ) {
758
+ generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
701
759
 
702
760
  if ( shaderStage === 'fragment' ) {
703
761
 
762
+ if ( offsetSnippet ) {
763
+
764
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
765
+
766
+ }
767
+
704
768
  return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;
705
769
 
706
770
  } else {
707
771
 
708
- console.error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
772
+ error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
709
773
 
710
774
  }
711
775
 
@@ -805,7 +869,7 @@ class WGSLNodeBuilder extends NodeBuilder {
805
869
 
806
870
  if ( node.isAtomic === true ) {
807
871
 
808
- console.warn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );
872
+ warn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );
809
873
 
810
874
  return NodeAccess.READ_WRITE;
811
875
 
@@ -888,6 +952,7 @@ class WGSLNodeBuilder extends NodeBuilder {
888
952
  }
889
953
 
890
954
  texture.store = node.isStorageTextureNode === true;
955
+ texture.mipLevel = texture.store ? node.mipLevel : 0;
891
956
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
892
957
 
893
958
  if ( this.isUnfilterable( node.value ) === false && texture.store === false ) {
@@ -1051,7 +1116,8 @@ ${ flowData.code }
1051
1116
  }
1052
1117
 
1053
1118
  /**
1054
- * 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.
1055
1121
  *
1056
1122
  * @return {string} The instance index.
1057
1123
  */
@@ -1067,8 +1133,9 @@ ${ flowData.code }
1067
1133
 
1068
1134
  }
1069
1135
 
1136
+
1070
1137
  /**
1071
- * Returns the invocation local index builtin.
1138
+ * Returns a builtin representing the index of a compute invocation within the scope of a workgroup load.
1072
1139
  *
1073
1140
  * @return {string} The invocation local index.
1074
1141
  */
@@ -1079,7 +1146,7 @@ ${ flowData.code }
1079
1146
  }
1080
1147
 
1081
1148
  /**
1082
- * Returns the subgroup size builtin.
1149
+ * Returns a builtin representing the size of a subgroup within the current shader.
1083
1150
  *
1084
1151
  * @return {string} The subgroup size.
1085
1152
  */
@@ -1092,7 +1159,7 @@ ${ flowData.code }
1092
1159
  }
1093
1160
 
1094
1161
  /**
1095
- * Returns the invocation subgroup index builtin.
1162
+ * Returns a builtin representing the index of a compute invocation within the scope of a subgroup.
1096
1163
  *
1097
1164
  * @return {string} The invocation subgroup index.
1098
1165
  */
@@ -1105,7 +1172,7 @@ ${ flowData.code }
1105
1172
  }
1106
1173
 
1107
1174
  /**
1108
- * Returns the subgroup index builtin.
1175
+ * Returns a builtin representing the index of a compute invocation's subgroup within its workgroup.
1109
1176
  *
1110
1177
  * @return {string} The subgroup index.
1111
1178
  */
@@ -1899,6 +1966,35 @@ ${ flowData.code }
1899
1966
 
1900
1967
  }
1901
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
+
1902
1998
  /**
1903
1999
  * Returns the WGSL type of the given node data type.
1904
2000
  *
@@ -1973,11 +2069,7 @@ ${ flowData.code }
1973
2069
  const codeNode = wgslPolyfill[ name ];
1974
2070
  codeNode.build( this );
1975
2071
 
1976
- if ( this.currentFunctionNode !== null ) {
1977
-
1978
- this.currentFunctionNode.includes.push( codeNode );
1979
-
1980
- }
2072
+ this.addInclude( codeNode );
1981
2073
 
1982
2074
  return codeNode;
1983
2075
 
@@ -1,6 +1,7 @@
1
1
  import { GPUInputStepMode } from './WebGPUConstants.js';
2
2
 
3
3
  import { Float16BufferAttribute } from '../../../core/BufferAttribute.js';
4
+ import { error } from '../../../utils.js';
4
5
 
5
6
  const typedArraysToVertexFormatPrefix = new Map( [
6
7
  [ Int8Array, [ 'sint8', 'snorm8' ]],
@@ -406,7 +407,7 @@ class WebGPUAttributeUtils {
406
407
 
407
408
  if ( ! format ) {
408
409
 
409
- console.error( 'THREE.WebGPUAttributeUtils: Vertex format not supported yet.' );
410
+ error( 'WebGPUAttributeUtils: Vertex format not supported yet.' );
410
411
 
411
412
  }
412
413
 
@@ -5,6 +5,7 @@ import {
5
5
 
6
6
  import { FloatType, IntType, UnsignedIntType } from '../../../constants.js';
7
7
  import { NodeAccess } from '../../../nodes/core/constants.js';
8
+ import { error } from '../../../utils.js';
8
9
 
9
10
  /**
10
11
  * A WebGPU backend utility module for managing bindings.
@@ -222,7 +223,7 @@ class WebGPUBindingUtils {
222
223
 
223
224
  } else {
224
225
 
225
- console.error( `WebGPUBindingUtils: Unsupported binding "${ binding }".` );
226
+ error( `WebGPUBindingUtils: Unsupported binding "${ binding }".` );
226
227
 
227
228
  }
228
229
 
@@ -414,6 +415,7 @@ class WebGPUBindingUtils {
414
415
  } else {
415
416
 
416
417
  const mipLevelCount = binding.store ? 1 : textureData.texture.mipLevelCount;
418
+ const baseMipLevel = binding.store ? binding.mipLevel : 0;
417
419
  let propertyName = `view-${ textureData.texture.width }-${ textureData.texture.height }`;
418
420
 
419
421
  if ( textureData.texture.depthOrArrayLayers > 1 ) {
@@ -422,7 +424,7 @@ class WebGPUBindingUtils {
422
424
 
423
425
  }
424
426
 
425
- propertyName += `-${ mipLevelCount }`;
427
+ propertyName += `-${ mipLevelCount }-${ baseMipLevel }`;
426
428
 
427
429
  resourceGPU = textureData[ propertyName ];
428
430
 
@@ -450,7 +452,7 @@ class WebGPUBindingUtils {
450
452
 
451
453
  }
452
454
 
453
- resourceGPU = textureData[ propertyName ] = textureData.texture.createView( { aspect: aspectGPU, dimension: dimensionViewGPU, mipLevelCount } );
455
+ resourceGPU = textureData[ propertyName ] = textureData.texture.createView( { aspect: aspectGPU, dimension: dimensionViewGPU, mipLevelCount, baseMipLevel } );
454
456
 
455
457
  }
456
458
 
@@ -113,7 +113,7 @@ export const GPUTextureFormat = {
113
113
  // Packed 32-bit formats
114
114
  RGB9E5UFloat: 'rgb9e5ufloat',
115
115
  RGB10A2Unorm: 'rgb10a2unorm',
116
- RG11B10UFloat: 'rgb10a2unorm',
116
+ RG11B10UFloat: 'rg11b10ufloat',
117
117
 
118
118
  // 64-bit formats
119
119
 
@@ -158,7 +158,7 @@ export const GPUTextureFormat = {
158
158
  BC6HRGBUFloat: 'bc6h-rgb-ufloat',
159
159
  BC6HRGBFloat: 'bc6h-rgb-float',
160
160
  BC7RGBAUnorm: 'bc7-rgba-unorm',
161
- BC7RGBAUnormSRGB: 'bc7-rgba-srgb',
161
+ BC7RGBAUnormSRGB: 'bc7-rgba-unorm-srgb',
162
162
 
163
163
  // ETC2 compressed formats usable if 'texture-compression-etc2' is both
164
164
  // supported by the device/user agent and enabled in requestDevice.
@@ -337,3 +337,8 @@ export const GPUFeatureName = {
337
337
  TextureFormatsTier1: 'texture-formats-tier1',
338
338
  TextureFormatsTier2: 'texture-formats-tier2'
339
339
  };
340
+
341
+ export const GPUFeatureMap = {
342
+ 'texture-compression-s3tc': 'texture-compression-bc',
343
+ 'texture-compression-etc1': 'texture-compression-etc2'
344
+ };