super-three 0.171.0 → 0.172.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 (413) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +157 -49
  3. package/build/three.core.js +104 -42
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +53 -8
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +10 -5
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +21191 -1008
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +21189 -1008
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -5
  14. package/examples/jsm/animation/CCDIKSolver.js +3 -2
  15. package/examples/jsm/controls/ArcballControls.js +28 -19
  16. package/examples/jsm/controls/OrbitControls.js +5 -4
  17. package/examples/jsm/csm/CSMShadowNode.js +16 -11
  18. package/examples/jsm/curves/NURBSCurve.js +1 -1
  19. package/examples/jsm/curves/NURBSUtils.js +3 -0
  20. package/examples/jsm/effects/OutlineEffect.js +1 -1
  21. package/examples/jsm/exporters/GLTFExporter.js +11 -7
  22. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  23. package/examples/jsm/exporters/PLYExporter.js +2 -2
  24. package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
  25. package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
  26. package/examples/jsm/lights/LightProbeGenerator.js +3 -3
  27. package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
  28. package/examples/jsm/loaders/3MFLoader.js +6 -3
  29. package/examples/jsm/loaders/BVHLoader.js +1 -1
  30. package/examples/jsm/loaders/ColladaLoader.js +5 -5
  31. package/examples/jsm/loaders/DDSLoader.js +42 -0
  32. package/examples/jsm/loaders/GCodeLoader.js +1 -1
  33. package/examples/jsm/loaders/GLTFLoader.js +22 -2
  34. package/examples/jsm/loaders/KTX2Loader.js +6 -1
  35. package/examples/jsm/loaders/KTXLoader.js +4 -4
  36. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  37. package/examples/jsm/loaders/LottieLoader.js +1 -1
  38. package/examples/jsm/loaders/MTLLoader.js +1 -0
  39. package/examples/jsm/loaders/NRRDLoader.js +1 -1
  40. package/examples/jsm/loaders/PLYLoader.js +7 -7
  41. package/examples/jsm/loaders/PVRLoader.js +1 -1
  42. package/examples/jsm/loaders/SVGLoader.js +2 -2
  43. package/examples/jsm/loaders/TDSLoader.js +1 -1
  44. package/examples/jsm/loaders/VRMLLoader.js +7 -7
  45. package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
  46. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
  47. package/examples/jsm/math/ConvexHull.js +1 -1
  48. package/examples/jsm/math/OBB.js +17 -0
  49. package/examples/jsm/misc/ProgressiveLightMapGPU.js +10 -10
  50. package/examples/jsm/misc/Volume.js +20 -12
  51. package/examples/jsm/misc/VolumeSlice.js +2 -2
  52. package/examples/jsm/modifiers/CurveModifier.js +10 -8
  53. package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
  54. package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
  55. package/examples/jsm/objects/GroundedSkybox.js +4 -4
  56. package/examples/jsm/objects/Sky.js +2 -2
  57. package/examples/jsm/objects/SkyMesh.js +3 -3
  58. package/examples/jsm/objects/Water2.js +1 -1
  59. package/examples/jsm/objects/Water2Mesh.js +2 -2
  60. package/examples/jsm/objects/WaterMesh.js +4 -4
  61. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  62. package/examples/jsm/postprocessing/EffectComposer.js +1 -2
  63. package/examples/jsm/postprocessing/OutlinePass.js +4 -4
  64. package/examples/jsm/postprocessing/SAOPass.js +1 -2
  65. package/examples/jsm/postprocessing/SMAAPass.js +1 -3
  66. package/examples/jsm/postprocessing/SSAOPass.js +2 -4
  67. package/examples/jsm/postprocessing/SSRPass.js +2 -4
  68. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
  69. package/examples/jsm/renderers/SVGRenderer.js +6 -4
  70. package/examples/jsm/shaders/BokehShader2.js +1 -1
  71. package/examples/jsm/shaders/GodRaysShader.js +3 -3
  72. package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
  73. package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
  74. package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
  75. package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
  76. package/examples/jsm/tsl/display/BleachBypass.js +10 -0
  77. package/examples/jsm/tsl/display/BloomNode.js +233 -26
  78. package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
  79. package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
  80. package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
  81. package/examples/jsm/tsl/display/FXAANode.js +52 -3
  82. package/examples/jsm/tsl/display/FilmNode.js +47 -1
  83. package/examples/jsm/tsl/display/GTAONode.js +210 -14
  84. package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
  85. package/examples/jsm/tsl/display/LensflareNode.js +131 -13
  86. package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
  87. package/examples/jsm/tsl/display/MotionBlur.js +12 -2
  88. package/examples/jsm/tsl/display/OutlineNode.js +343 -26
  89. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
  90. package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
  91. package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
  92. package/examples/jsm/tsl/display/SMAANode.js +187 -46
  93. package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
  94. package/examples/jsm/tsl/display/SSRNode.js +194 -21
  95. package/examples/jsm/tsl/display/Sepia.js +9 -0
  96. package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
  97. package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
  98. package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
  99. package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
  100. package/examples/jsm/tsl/display/TransitionNode.js +71 -6
  101. package/examples/jsm/tsl/display/hashBlur.js +14 -3
  102. package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
  103. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  104. package/examples/jsm/utils/CameraUtils.js +4 -1
  105. package/examples/jsm/utils/GeometryUtils.js +22 -19
  106. package/examples/jsm/utils/SceneUtils.js +2 -2
  107. package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
  108. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  109. package/package.json +8 -3
  110. package/src/Three.Core.js +2 -0
  111. package/src/Three.Legacy.js +0 -21
  112. package/src/Three.TSL.js +9 -4
  113. package/src/Three.WebGPU.Nodes.js +2 -2
  114. package/src/Three.WebGPU.js +2 -2
  115. package/src/animation/PropertyBinding.js +2 -2
  116. package/src/cameras/PerspectiveCamera.js +18 -2
  117. package/src/constants.js +1 -1
  118. package/src/core/RenderTarget.js +18 -0
  119. package/src/core/RenderTarget3D.js +22 -0
  120. package/src/core/RenderTargetArray.js +22 -0
  121. package/src/extras/Earcut.js +1 -1
  122. package/src/extras/PMREMGenerator.js +20 -0
  123. package/src/extras/TextureUtils.js +6 -0
  124. package/src/helpers/CameraHelper.js +16 -13
  125. package/src/loaders/nodes/NodeLoader.js +59 -0
  126. package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
  127. package/src/loaders/nodes/NodeObjectLoader.js +61 -0
  128. package/src/materials/nodes/InstancedPointsNodeMaterial.js +72 -19
  129. package/src/materials/nodes/Line2NodeMaterial.js +128 -34
  130. package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
  131. package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
  132. package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
  133. package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
  134. package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
  135. package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
  136. package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
  137. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
  138. package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
  139. package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
  140. package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
  141. package/src/materials/nodes/NodeMaterial.js +474 -21
  142. package/src/materials/nodes/PointsNodeMaterial.js +22 -13
  143. package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
  144. package/src/materials/nodes/SpriteNodeMaterial.js +77 -19
  145. package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
  146. package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -0
  147. package/src/nodes/Nodes.js +1 -6
  148. package/src/nodes/TSL.js +2 -3
  149. package/src/nodes/accessors/AccessorsUtils.js +27 -0
  150. package/src/nodes/accessors/Arrays.js +24 -5
  151. package/src/nodes/accessors/BatchNode.js +39 -3
  152. package/src/nodes/accessors/Bitangent.js +37 -0
  153. package/src/nodes/accessors/BufferAttributeNode.js +178 -5
  154. package/src/nodes/accessors/BufferNode.js +63 -0
  155. package/src/nodes/accessors/BuiltinNode.js +38 -0
  156. package/src/nodes/accessors/Camera.js +49 -0
  157. package/src/nodes/accessors/ClippingNode.js +71 -2
  158. package/src/nodes/accessors/CubeTextureNode.js +64 -0
  159. package/src/nodes/accessors/InstanceNode.js +85 -2
  160. package/src/nodes/accessors/InstancedMeshNode.js +28 -3
  161. package/src/nodes/accessors/InstancedPointsMaterialNode.js +13 -0
  162. package/src/nodes/accessors/Lights.js +50 -1
  163. package/src/nodes/accessors/MaterialNode.js +302 -8
  164. package/src/nodes/accessors/MaterialProperties.js +7 -0
  165. package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
  166. package/src/nodes/accessors/ModelNode.js +100 -5
  167. package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
  168. package/src/nodes/accessors/MorphNode.js +48 -4
  169. package/src/nodes/accessors/Normal.js +59 -3
  170. package/src/nodes/accessors/Object3DNode.js +102 -1
  171. package/src/nodes/accessors/PointUVNode.js +26 -0
  172. package/src/nodes/accessors/Position.js +53 -4
  173. package/src/nodes/accessors/ReferenceBaseNode.js +188 -0
  174. package/src/nodes/accessors/ReferenceNode.js +202 -2
  175. package/src/nodes/accessors/ReflectVector.js +24 -0
  176. package/src/nodes/accessors/RendererReferenceNode.js +46 -1
  177. package/src/nodes/accessors/SceneNode.js +54 -0
  178. package/src/nodes/accessors/SkinningNode.js +127 -1
  179. package/src/nodes/accessors/StorageBufferNode.js +168 -4
  180. package/src/nodes/accessors/StorageTextureNode.js +118 -0
  181. package/src/nodes/accessors/Tangent.js +36 -0
  182. package/src/nodes/accessors/Texture3DNode.js +89 -5
  183. package/src/nodes/accessors/TextureBicubic.js +12 -2
  184. package/src/nodes/accessors/TextureNode.js +309 -10
  185. package/src/nodes/accessors/TextureSizeNode.js +42 -0
  186. package/src/nodes/accessors/UV.js +10 -1
  187. package/src/nodes/accessors/UniformArrayNode.js +223 -23
  188. package/src/nodes/accessors/UserDataNode.js +46 -0
  189. package/src/nodes/accessors/VelocityNode.js +82 -0
  190. package/src/nodes/accessors/VertexColorNode.js +39 -2
  191. package/src/nodes/code/CodeNode.js +95 -1
  192. package/src/nodes/code/ExpressionNode.js +28 -0
  193. package/src/nodes/code/FunctionCallNode.js +37 -0
  194. package/src/nodes/code/FunctionNode.js +45 -0
  195. package/src/nodes/code/ScriptableNode.js +223 -1
  196. package/src/nodes/code/ScriptableValueNode.js +85 -1
  197. package/src/nodes/core/AssignNode.js +48 -2
  198. package/src/nodes/core/AttributeNode.js +43 -0
  199. package/src/nodes/core/BypassNode.js +47 -2
  200. package/src/nodes/core/CacheNode.js +53 -2
  201. package/src/nodes/core/ConstNode.js +24 -0
  202. package/src/nodes/core/ContextNode.js +65 -0
  203. package/src/nodes/core/IndexNode.js +68 -7
  204. package/src/nodes/core/InputNode.js +48 -0
  205. package/src/nodes/core/LightingModel.js +60 -0
  206. package/src/nodes/core/MRTNode.js +66 -0
  207. package/src/nodes/core/Node.js +337 -12
  208. package/src/nodes/core/NodeAttribute.js +38 -0
  209. package/src/nodes/core/NodeBuilder.js +945 -15
  210. package/src/nodes/core/NodeCache.js +41 -2
  211. package/src/nodes/core/NodeCode.js +31 -0
  212. package/src/nodes/core/NodeFrame.js +123 -2
  213. package/src/nodes/core/NodeFunction.js +46 -0
  214. package/src/nodes/core/NodeFunctionInput.js +44 -0
  215. package/src/nodes/core/NodeParser.js +11 -0
  216. package/src/nodes/core/NodeUniform.js +52 -0
  217. package/src/nodes/core/NodeUtils.js +141 -0
  218. package/src/nodes/core/NodeVar.js +30 -0
  219. package/src/nodes/core/NodeVarying.js +28 -0
  220. package/src/nodes/core/OutputStructNode.js +33 -2
  221. package/src/nodes/core/ParameterNode.js +28 -0
  222. package/src/nodes/core/PropertyNode.js +232 -0
  223. package/src/nodes/core/StackNode.js +78 -0
  224. package/src/nodes/core/StructTypeNode.js +39 -1
  225. package/src/nodes/core/TempNode.js +30 -4
  226. package/src/nodes/core/UniformGroupNode.js +82 -7
  227. package/src/nodes/core/UniformNode.js +66 -0
  228. package/src/nodes/core/VarNode.js +52 -0
  229. package/src/nodes/core/VaryingNode.js +83 -2
  230. package/src/nodes/core/constants.js +36 -0
  231. package/src/nodes/display/BumpMapNode.js +37 -0
  232. package/src/nodes/display/ColorAdjustment.js +53 -11
  233. package/src/nodes/display/ColorSpaceFunctions.js +16 -0
  234. package/src/nodes/display/ColorSpaceNode.js +82 -0
  235. package/src/nodes/display/FrontFacingNode.js +29 -0
  236. package/src/nodes/display/NormalMapNode.js +43 -0
  237. package/src/nodes/display/PassNode.js +298 -7
  238. package/src/nodes/display/PosterizeNode.js +33 -0
  239. package/src/nodes/display/RenderOutputNode.js +66 -1
  240. package/src/nodes/display/ScreenNode.js +87 -0
  241. package/src/nodes/display/ToneMappingFunctions.js +58 -10
  242. package/src/nodes/display/ToneMappingNode.js +55 -2
  243. package/src/nodes/display/ToonOutlinePassNode.js +73 -0
  244. package/src/nodes/display/ViewportDepthNode.js +122 -8
  245. package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
  246. package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
  247. package/src/nodes/display/ViewportTextureNode.js +57 -0
  248. package/src/nodes/fog/Fog.js +93 -0
  249. package/src/nodes/functions/BasicLightingModel.js +24 -0
  250. package/src/nodes/functions/PhongLightingModel.js +34 -2
  251. package/src/nodes/functions/PhysicalLightingModel.js +167 -8
  252. package/src/nodes/functions/ShadowMaskModel.js +23 -0
  253. package/src/nodes/functions/ToonLightingModel.js +20 -0
  254. package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
  255. package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
  256. package/src/nodes/geometry/RangeNode.js +54 -2
  257. package/src/nodes/gpgpu/AtomicFunctionNode.js +157 -1
  258. package/src/nodes/gpgpu/BarrierNode.js +47 -0
  259. package/src/nodes/gpgpu/ComputeBuiltinNode.js +126 -0
  260. package/src/nodes/gpgpu/ComputeNode.js +106 -2
  261. package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
  262. package/src/nodes/lighting/AONode.js +18 -0
  263. package/src/nodes/lighting/AmbientLightNode.js +10 -0
  264. package/src/nodes/lighting/AnalyticLightNode.js +97 -2
  265. package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
  266. package/src/nodes/lighting/BasicLightMapNode.js +17 -0
  267. package/src/nodes/lighting/DirectionalLightNode.js +10 -0
  268. package/src/nodes/lighting/EnvironmentNode.js +18 -0
  269. package/src/nodes/lighting/HemisphereLightNode.js +31 -0
  270. package/src/nodes/lighting/IESSpotLightNode.js +11 -0
  271. package/src/nodes/lighting/IrradianceNode.js +17 -0
  272. package/src/nodes/lighting/LightProbeNode.js +20 -0
  273. package/src/nodes/lighting/LightUtils.js +12 -0
  274. package/src/nodes/lighting/LightingContextNode.js +48 -0
  275. package/src/nodes/lighting/LightingNode.js +15 -6
  276. package/src/nodes/lighting/LightsNode.js +132 -1
  277. package/src/nodes/lighting/PointLightNode.js +32 -1
  278. package/src/nodes/lighting/PointShadowNode.js +54 -1
  279. package/src/nodes/lighting/RectAreaLightNode.js +44 -6
  280. package/src/nodes/lighting/ShadowBaseNode.js +93 -0
  281. package/src/nodes/lighting/ShadowNode.js +240 -34
  282. package/src/nodes/lighting/SpotLightNode.js +43 -0
  283. package/src/nodes/math/ConditionalNode.js +70 -3
  284. package/src/nodes/math/Hash.js +9 -0
  285. package/src/nodes/math/MathNode.js +614 -11
  286. package/src/nodes/math/MathUtils.js +45 -1
  287. package/src/nodes/math/OperatorNode.js +233 -0
  288. package/src/nodes/math/TriNoise3D.js +18 -7
  289. package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
  290. package/src/nodes/parsers/GLSLNodeParser.js +11 -0
  291. package/src/nodes/pmrem/PMREMNode.js +133 -0
  292. package/src/nodes/pmrem/PMREMUtils.js +1 -1
  293. package/src/nodes/procedural/Checker.js +9 -0
  294. package/src/nodes/tsl/TSLBase.js +2 -2
  295. package/src/nodes/utils/ArrayElementNode.js +38 -2
  296. package/src/nodes/utils/ConvertNode.js +31 -0
  297. package/src/nodes/utils/CubeMapNode.js +78 -0
  298. package/src/nodes/utils/Discard.js +16 -0
  299. package/src/nodes/utils/EquirectUVNode.js +31 -1
  300. package/src/nodes/utils/FlipNode.js +38 -0
  301. package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
  302. package/src/nodes/utils/JoinNode.js +25 -0
  303. package/src/nodes/utils/LoopNode.js +74 -1
  304. package/src/nodes/utils/MatcapUVNode.js +17 -0
  305. package/src/nodes/utils/MaxMipLevelNode.js +49 -0
  306. package/src/nodes/utils/Oscillators.js +33 -0
  307. package/src/nodes/utils/Packing.js +17 -0
  308. package/src/nodes/utils/PostProcessingUtils.js +28 -23
  309. package/src/nodes/utils/RTTNode.js +123 -2
  310. package/src/nodes/utils/ReflectorNode.js +174 -4
  311. package/src/nodes/utils/RemapNode.js +79 -0
  312. package/src/nodes/utils/RotateNode.js +41 -0
  313. package/src/nodes/utils/SetNode.js +44 -1
  314. package/src/nodes/utils/SplitNode.js +55 -3
  315. package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
  316. package/src/nodes/utils/SpriteUtils.js +17 -0
  317. package/src/nodes/utils/StorageArrayElementNode.js +40 -0
  318. package/src/nodes/utils/Timer.js +19 -0
  319. package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
  320. package/src/nodes/utils/UVUtils.js +20 -0
  321. package/src/nodes/utils/ViewportUtils.js +13 -0
  322. package/src/objects/BatchedMesh.js +1 -2
  323. package/src/objects/ClippingGroup.js +49 -0
  324. package/src/renderers/WebGLRenderer.js +23 -4
  325. package/src/renderers/common/Animation.js +63 -0
  326. package/src/renderers/common/Attributes.js +36 -0
  327. package/src/renderers/common/Backend.js +467 -52
  328. package/src/renderers/common/Background.js +34 -1
  329. package/src/renderers/common/BindGroup.js +43 -0
  330. package/src/renderers/common/Binding.js +35 -0
  331. package/src/renderers/common/Bindings.js +93 -1
  332. package/src/renderers/common/Buffer.js +49 -0
  333. package/src/renderers/common/BufferUtils.js +27 -0
  334. package/src/renderers/common/BundleGroup.js +57 -0
  335. package/src/renderers/common/ChainMap.js +38 -1
  336. package/src/renderers/common/ClippingContext.js +107 -14
  337. package/src/renderers/common/Color4.js +36 -0
  338. package/src/renderers/common/ComputePipeline.js +24 -0
  339. package/src/renderers/common/CubeRenderTarget.js +13 -0
  340. package/src/renderers/common/DataMap.js +37 -1
  341. package/src/renderers/common/Geometries.js +98 -0
  342. package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
  343. package/src/renderers/common/Info.js +87 -0
  344. package/src/renderers/common/Lighting.js +26 -0
  345. package/src/renderers/common/Pipeline.js +22 -0
  346. package/src/renderers/common/Pipelines.js +148 -5
  347. package/src/renderers/common/PostProcessing.js +75 -3
  348. package/src/renderers/common/ProgrammableStage.js +60 -2
  349. package/src/renderers/common/QuadMesh.js +54 -5
  350. package/src/renderers/common/RenderBundle.js +14 -8
  351. package/src/renderers/common/RenderBundles.js +33 -10
  352. package/src/renderers/common/RenderContext.js +169 -4
  353. package/src/renderers/common/RenderContexts.js +42 -2
  354. package/src/renderers/common/RenderList.js +178 -0
  355. package/src/renderers/common/RenderLists.js +31 -0
  356. package/src/renderers/common/RenderObject.js +328 -4
  357. package/src/renderers/common/RenderObjects.js +101 -7
  358. package/src/renderers/common/RenderPipeline.js +24 -0
  359. package/src/renderers/common/Renderer.js +1096 -31
  360. package/src/renderers/common/RendererUtils.js +193 -0
  361. package/src/renderers/common/SampledTexture.js +121 -0
  362. package/src/renderers/common/Sampler.js +30 -0
  363. package/src/renderers/common/StorageBuffer.js +24 -0
  364. package/src/renderers/common/StorageBufferAttribute.js +31 -2
  365. package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
  366. package/src/renderers/common/StorageTexture.js +38 -0
  367. package/src/renderers/common/Textures.js +83 -0
  368. package/src/renderers/common/Uniform.js +188 -2
  369. package/src/renderers/common/UniformBuffer.js +19 -0
  370. package/src/renderers/common/UniformsGroup.js +139 -2
  371. package/src/renderers/common/extras/PMREMGenerator.js +24 -3
  372. package/src/renderers/common/nodes/NodeBuilderState.js +95 -1
  373. package/src/renderers/common/nodes/NodeLibrary.js +89 -0
  374. package/src/renderers/common/nodes/NodeSampledTexture.js +91 -2
  375. package/src/renderers/common/nodes/NodeSampler.js +28 -0
  376. package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
  377. package/src/renderers/common/nodes/NodeUniform.js +189 -0
  378. package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
  379. package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
  380. package/src/renderers/common/nodes/Nodes.js +327 -60
  381. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  382. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
  383. package/src/renderers/webgl-fallback/WebGLBackend.js +547 -29
  384. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +0 -1
  385. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
  386. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1 -1
  387. package/src/renderers/webgpu/WebGPUBackend.js +480 -49
  388. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +34 -0
  389. package/src/renderers/webgpu/WebGPURenderer.js +35 -0
  390. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
  391. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
  392. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +59 -11
  393. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
  394. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
  395. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +10 -8
  396. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +9 -1
  397. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -9
  398. package/src/renderers/webgpu/utils/WebGPUUtils.js +30 -0
  399. package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
  400. package/src/renderers/webxr/WebXRManager.js +7 -1
  401. package/src/textures/Data3DTexture.js +2 -2
  402. package/src/textures/Texture.js +4 -0
  403. package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
  404. package/examples/jsm/animation/MMDPhysics.js +0 -1408
  405. package/examples/jsm/exporters/MMDExporter.js +0 -223
  406. package/examples/jsm/libs/mmdparser.module.js +0 -11530
  407. package/examples/jsm/loaders/MMDLoader.js +0 -2298
  408. package/examples/jsm/shaders/MMDToonShader.js +0 -134
  409. package/src/nodes/core/UniformGroup.js +0 -13
  410. package/src/nodes/fog/FogExp2Node.js +0 -35
  411. package/src/nodes/fog/FogNode.js +0 -50
  412. package/src/nodes/fog/FogRangeNode.js +0 -36
  413. package/src/renderers/common/PostProcessingUtils.js +0 -86
@@ -3,8 +3,28 @@ import WebGLBackend from '../webgl-fallback/WebGLBackend.js';
3
3
  import WebGPUBackend from './WebGPUBackend.js';
4
4
  import BasicNodeLibrary from './nodes/BasicNodeLibrary.js';
5
5
 
6
+ /**
7
+ * This alternative version of {@link WebGPURenderer} only supports node materials.
8
+ * So classes like `MeshBasicMaterial` are not compatible.
9
+ *
10
+ * @augments module:Renderer~Renderer
11
+ */
6
12
  class WebGPURenderer extends Renderer {
7
13
 
14
+ /**
15
+ * Constructs a new WebGPU renderer.
16
+ *
17
+ * @param {Object} parameters - The configuration parameter.
18
+ * @param {Boolean} [parameters.logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
19
+ * @param {Boolean} [parameters.alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
20
+ * @param {Boolean} [parameters.depth=true] - Whether the default framebuffer should have a depth buffer or not.
21
+ * @param {Boolean} [parameters.stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
22
+ * @param {Boolean} [parameters.antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
23
+ * @param {Number} [parameters.samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0
24
+ * to overwrite the default.
25
+ * @param {Boolean} [parameters.forceWebGL=false] - If set to `true`, the renderer uses it
26
+ * WebGL 2 backend no matter if WebGPU is supported or not.
27
+ */
8
28
  constructor( parameters = {} ) {
9
29
 
10
30
  let BackendClass;
@@ -31,8 +51,22 @@ class WebGPURenderer extends Renderer {
31
51
 
32
52
  super( backend, parameters );
33
53
 
54
+ /**
55
+ * The generic default value is overwritten with the
56
+ * standard node library for type mapping. Material
57
+ * mapping is not supported with this version.
58
+ *
59
+ * @type {BasicNodeLibrary}
60
+ */
34
61
  this.library = new BasicNodeLibrary();
35
62
 
63
+ /**
64
+ * This flag can be used for type testing.
65
+ *
66
+ * @type {Boolean}
67
+ * @readonly
68
+ * @default true
69
+ */
36
70
  this.isWebGPURenderer = true;
37
71
 
38
72
  }
@@ -16,8 +16,30 @@ const debugHandler = {
16
16
 
17
17
  };
18
18
  */
19
+
20
+ /**
21
+ * This renderer is the new alternative of `WebGLRenderer`. `WebGPURenderer` has the ability
22
+ * to target different backends. By default, the renderer tries to use a WebGPU backend if the
23
+ * browser supports WebGPU. If not, `WebGPURenderer` falls backs to a WebGL 2 backend.
24
+ *
25
+ * @augments module:Renderer~Renderer
26
+ */
19
27
  class WebGPURenderer extends Renderer {
20
28
 
29
+ /**
30
+ * Constructs a new WebGPU renderer.
31
+ *
32
+ * @param {Object} parameters - The configuration parameter.
33
+ * @param {Boolean} [parameters.logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
34
+ * @param {Boolean} [parameters.alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
35
+ * @param {Boolean} [parameters.depth=true] - Whether the default framebuffer should have a depth buffer or not.
36
+ * @param {Boolean} [parameters.stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
37
+ * @param {Boolean} [parameters.antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
38
+ * @param {Number} [parameters.samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0
39
+ * to overwrite the default.
40
+ * @param {Boolean} [parameters.forceWebGL=false] - If set to `true`, the renderer uses it
41
+ * WebGL 2 backend no matter if WebGPU is supported or not.
42
+ */
21
43
  constructor( parameters = {} ) {
22
44
 
23
45
  let BackendClass;
@@ -45,8 +67,21 @@ class WebGPURenderer extends Renderer {
45
67
  //super( new Proxy( backend, debugHandler ) );
46
68
  super( backend, parameters );
47
69
 
70
+ /**
71
+ * The generic default value is overwritten with the
72
+ * standard node library for type mapping.
73
+ *
74
+ * @type {StandardNodeLibrary}
75
+ */
48
76
  this.library = new StandardNodeLibrary();
49
77
 
78
+ /**
79
+ * This flag can be used for type testing.
80
+ *
81
+ * @type {Boolean}
82
+ * @readonly
83
+ * @default true
84
+ */
50
85
  this.isWebGPURenderer = true;
51
86
 
52
87
  }
@@ -2,28 +2,40 @@ import NodeLibrary from '../../common/nodes/NodeLibrary.js';
2
2
 
3
3
  // Lights
4
4
  import { PointLight } from '../../../lights/PointLight.js';
5
- import { PointLightNode } from '../../../nodes/Nodes.js';
6
5
  import { DirectionalLight } from '../../../lights/DirectionalLight.js';
7
- import { DirectionalLightNode } from '../../../nodes/Nodes.js';
8
6
  import { RectAreaLight } from '../../../lights/RectAreaLight.js';
9
- import { RectAreaLightNode } from '../../../nodes/Nodes.js';
10
7
  import { SpotLight } from '../../../lights/SpotLight.js';
11
- import { SpotLightNode } from '../../../nodes/Nodes.js';
12
8
  import { AmbientLight } from '../../../lights/AmbientLight.js';
13
- import { AmbientLightNode } from '../../../nodes/Nodes.js';
14
9
  import { HemisphereLight } from '../../../lights/HemisphereLight.js';
15
- import { HemisphereLightNode } from '../../../nodes/Nodes.js';
16
10
  import { LightProbe } from '../../../lights/LightProbe.js';
17
- import { LightProbeNode } from '../../../nodes/Nodes.js';
18
11
  import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js';
19
- import { IESSpotLightNode } from '../../../nodes/Nodes.js';
12
+ import {
13
+ PointLightNode,
14
+ DirectionalLightNode,
15
+ RectAreaLightNode,
16
+ SpotLightNode,
17
+ AmbientLightNode,
18
+ HemisphereLightNode,
19
+ LightProbeNode,
20
+ IESSpotLightNode
21
+ } from '../../../nodes/Nodes.js';
20
22
 
21
23
  // Tone Mapping
22
24
  import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping } from '../../../constants.js';
23
25
  import { linearToneMapping, reinhardToneMapping, cineonToneMapping, acesFilmicToneMapping, agxToneMapping, neutralToneMapping } from '../../../nodes/display/ToneMappingFunctions.js';
24
26
 
27
+ /**
28
+ * This version of a node library represents a basic version
29
+ * just focusing on lights and tone mapping techniques.
30
+ *
31
+ * @private
32
+ * @augments NodeLibrary
33
+ */
25
34
  class BasicNodeLibrary extends NodeLibrary {
26
35
 
36
+ /**
37
+ * Constructs a new basic node library.
38
+ */
27
39
  constructor() {
28
40
 
29
41
  super();
@@ -21,28 +21,41 @@ import ShadowNodeMaterial from '../../../materials/nodes/ShadowNodeMaterial.js';
21
21
 
22
22
  // Lights
23
23
  import { PointLight } from '../../../lights/PointLight.js';
24
- import { PointLightNode } from '../../../nodes/Nodes.js';
25
24
  import { DirectionalLight } from '../../../lights/DirectionalLight.js';
26
- import { DirectionalLightNode } from '../../../nodes/Nodes.js';
27
25
  import { RectAreaLight } from '../../../lights/RectAreaLight.js';
28
- import { RectAreaLightNode } from '../../../nodes/Nodes.js';
29
26
  import { SpotLight } from '../../../lights/SpotLight.js';
30
- import { SpotLightNode } from '../../../nodes/Nodes.js';
31
27
  import { AmbientLight } from '../../../lights/AmbientLight.js';
32
- import { AmbientLightNode } from '../../../nodes/Nodes.js';
33
28
  import { HemisphereLight } from '../../../lights/HemisphereLight.js';
34
- import { HemisphereLightNode } from '../../../nodes/Nodes.js';
35
29
  import { LightProbe } from '../../../lights/LightProbe.js';
36
- import { LightProbeNode } from '../../../nodes/Nodes.js';
37
30
  import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js';
38
- import { IESSpotLightNode } from '../../../nodes/Nodes.js';
31
+ import {
32
+ PointLightNode,
33
+ DirectionalLightNode,
34
+ RectAreaLightNode,
35
+ SpotLightNode,
36
+ AmbientLightNode,
37
+ HemisphereLightNode,
38
+ LightProbeNode,
39
+ IESSpotLightNode
40
+ } from '../../../nodes/Nodes.js';
39
41
 
40
42
  // Tone Mapping
41
43
  import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping } from '../../../constants.js';
42
44
  import { linearToneMapping, reinhardToneMapping, cineonToneMapping, acesFilmicToneMapping, agxToneMapping, neutralToneMapping } from '../../../nodes/display/ToneMappingFunctions.js';
43
45
 
46
+ /**
47
+ * This version of a node library represents the standard version
48
+ * used in {@link WebGPURenderer}. It maps lights, tone mapping
49
+ * techniques and materials to node-based implementations.
50
+ *
51
+ * @private
52
+ * @augments NodeLibrary
53
+ */
44
54
  class StandardNodeLibrary extends NodeLibrary {
45
55
 
56
+ /**
57
+ * Constructs a new standard node library.
58
+ */
46
59
  constructor() {
47
60
 
48
61
  super();
@@ -223,7 +223,7 @@ class WGSLNodeBuilder extends NodeBuilder {
223
223
 
224
224
  _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) {
225
225
 
226
- if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false ) {
226
+ if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false ) {
227
227
 
228
228
  return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
229
229
 
@@ -241,7 +241,7 @@ class WGSLNodeBuilder extends NodeBuilder {
241
241
 
242
242
  generateWrapFunction( texture ) {
243
243
 
244
- const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }T`;
244
+ const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${texture.isData3DTexture ? '3d' : '2d'}T`;
245
245
 
246
246
  let nodeCode = wgslCodeCache[ functionName ];
247
247
 
@@ -249,7 +249,9 @@ class WGSLNodeBuilder extends NodeBuilder {
249
249
 
250
250
  const includes = [];
251
251
 
252
- let code = `fn ${ functionName }( coord : vec2f ) -> vec2f {\n\n\treturn vec2f(\n`;
252
+ // For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate
253
+ const coordType = texture.isData3DTexture ? 'vec3f' : 'vec2f';
254
+ let code = `fn ${functionName}( coord : ${coordType} ) -> ${coordType} {\n\n\treturn ${coordType}(\n`;
253
255
 
254
256
  const addWrapSnippet = ( wrap, axis ) => {
255
257
 
@@ -287,6 +289,13 @@ class WGSLNodeBuilder extends NodeBuilder {
287
289
 
288
290
  addWrapSnippet( texture.wrapT, 'y' );
289
291
 
292
+ if ( texture.isData3DTexture ) {
293
+
294
+ code += ',\n';
295
+ addWrapSnippet( texture.wrapR, 'z' );
296
+
297
+ }
298
+
290
299
  code += '\n\t);\n\n}\n';
291
300
 
292
301
  wgslCodeCache[ functionName ] = nodeCode = new CodeNode( code, includes );
@@ -310,21 +319,57 @@ class WGSLNodeBuilder extends NodeBuilder {
310
319
  if ( textureData.dimensionsSnippet[ levelSnippet ] === undefined ) {
311
320
 
312
321
  let textureDimensionsParams;
322
+ let dimensionType;
323
+
324
+ const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
325
+ const isMultisampled = primarySamples > 1;
326
+
327
+ if ( texture.isData3DTexture ) {
313
328
 
314
- if ( texture.isMultisampleRenderTargetTexture === true ) {
329
+ dimensionType = 'vec3<u32>';
330
+
331
+ } else {
332
+
333
+ // Regular 2D textures, depth textures, etc.
334
+ dimensionType = 'vec2<u32>';
335
+
336
+ }
337
+
338
+ // Build parameters string based on texture type and multisampling
339
+ if ( isMultisampled || texture.isVideoTexture || texture.isStorageTexture ) {
315
340
 
316
341
  textureDimensionsParams = textureProperty;
317
342
 
318
343
  } else {
319
344
 
320
- textureDimensionsParams = `${ textureProperty }, u32( ${ levelSnippet } )`;
345
+ textureDimensionsParams = `${textureProperty}${levelSnippet ? `, u32( ${ levelSnippet } )` : ''}`;
321
346
 
322
347
  }
323
348
 
324
- textureDimensionNode = new VarNode( new ExpressionNode( `textureDimensions( ${ textureDimensionsParams } )`, 'uvec2' ) );
349
+ textureDimensionNode = new VarNode( new ExpressionNode( `textureDimensions( ${ textureDimensionsParams } )`, dimensionType ) );
325
350
 
326
351
  textureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;
327
352
 
353
+ if ( texture.isDataArrayTexture || texture.isData3DTexture ) {
354
+
355
+ textureData.arrayLayerCount = new VarNode(
356
+ new ExpressionNode(
357
+ `textureNumLayers(${textureProperty})`,
358
+ 'u32'
359
+ )
360
+ );
361
+
362
+ }
363
+
364
+ // For cube textures, we know it's always 6 faces
365
+ if ( texture.isTextureCube ) {
366
+
367
+ textureData.cubeFaceCount = new VarNode(
368
+ new ExpressionNode( '6u', 'u32' )
369
+ );
370
+
371
+ }
372
+
328
373
  }
329
374
 
330
375
  return textureDimensionNode.build( this );
@@ -347,7 +392,8 @@ class WGSLNodeBuilder extends NodeBuilder {
347
392
  const wrapFunction = this.generateWrapFunction( texture );
348
393
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
349
394
 
350
- const coordSnippet = `vec2u( ${ wrapFunction }( ${ uvSnippet } ) * vec2f( ${ textureDimension } ) )`;
395
+ const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
396
+ const coordSnippet = `${vecType}<u32>(${wrapFunction}(${uvSnippet}) * ${vecType}<f32>(${textureDimension}))`;
351
397
 
352
398
  return this.generateTextureLoad( texture, textureProperty, coordSnippet, depthSnippet, levelSnippet );
353
399
 
@@ -388,7 +434,7 @@ class WGSLNodeBuilder extends NodeBuilder {
388
434
  return this.getComponentTypeFromTexture( texture ) !== 'float' ||
389
435
  ( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) ||
390
436
  ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
391
- texture.isMultisampleRenderTargetTexture === true;
437
+ this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;
392
438
 
393
439
  }
394
440
 
@@ -590,7 +636,7 @@ class WGSLNodeBuilder extends NodeBuilder {
590
636
  texture.store = node.isStorageTextureNode === true;
591
637
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
592
638
 
593
- if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) {
639
+ if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( node.value ) === false && texture.store === false ) {
594
640
 
595
641
  const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node, group );
596
642
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
@@ -1102,7 +1148,7 @@ ${ flowData.code }
1102
1148
 
1103
1149
  const texture = uniform.node.value;
1104
1150
 
1105
- if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
1151
+ if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
1106
1152
 
1107
1153
  if ( this.isSampleCompare( texture ) ) {
1108
1154
 
@@ -1120,7 +1166,9 @@ ${ flowData.code }
1120
1166
 
1121
1167
  let multisampled = '';
1122
1168
 
1123
- if ( texture.isMultisampleRenderTargetTexture === true ) {
1169
+ const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
1170
+
1171
+ if ( primarySamples > 1 ) {
1124
1172
 
1125
1173
  multisampled = '_multisampled';
1126
1174
 
@@ -58,6 +58,7 @@ const wgslTypeLib = {
58
58
  'texture_multisampled_2d': 'cubeTexture',
59
59
 
60
60
  'texture_depth_2d': 'depthTexture',
61
+ 'texture_depth_multisampled_2d': 'depthTexture',
61
62
 
62
63
  'texture_3d': 'texture3D',
63
64
 
@@ -140,8 +141,18 @@ const parse = ( source ) => {
140
141
 
141
142
  };
142
143
 
144
+ /**
145
+ * This class represents a WSL node function.
146
+ *
147
+ * @augments NodeFunction
148
+ */
143
149
  class WGSLNodeFunction extends NodeFunction {
144
150
 
151
+ /**
152
+ * Constructs a new WGSL node function.
153
+ *
154
+ * @param {String} source - The WGSL source.
155
+ */
145
156
  constructor( source ) {
146
157
 
147
158
  const { type, inputs, name, inputsCode, blockCode, outputType } = parse( source );
@@ -154,6 +165,12 @@ class WGSLNodeFunction extends NodeFunction {
154
165
 
155
166
  }
156
167
 
168
+ /**
169
+ * This method returns the WGSL code of the node function.
170
+ *
171
+ * @param {String} [name=this.name] - The function's name.
172
+ * @return {String} The shader code.
173
+ */
157
174
  getCode( name = this.name ) {
158
175
 
159
176
  const outputType = this.outputType !== 'void' ? '-> ' + this.outputType : '';
@@ -1,8 +1,19 @@
1
1
  import NodeParser from '../../../nodes/core/NodeParser.js';
2
2
  import WGSLNodeFunction from './WGSLNodeFunction.js';
3
3
 
4
+ /**
5
+ * A WGSL node parser.
6
+ *
7
+ * @augments NodeParser
8
+ */
4
9
  class WGSLNodeParser extends NodeParser {
5
10
 
11
+ /**
12
+ * The method parses the given WGSL code an returns a node function.
13
+ *
14
+ * @param {String} source - The WGSL code.
15
+ * @return {WGSLNodeFunction} A node function.
16
+ */
6
17
  parseFunction( source ) {
7
18
 
8
19
  return new WGSLNodeFunction( source );
@@ -227,18 +227,18 @@ class WebGPUAttributeUtils {
227
227
  const device = backend.device;
228
228
 
229
229
  const data = backend.get( this._getBufferAttribute( attribute ) );
230
-
231
230
  const bufferGPU = data.buffer;
232
231
  const size = bufferGPU.size;
233
232
 
234
233
  const readBufferGPU = device.createBuffer( {
235
- label: attribute.name,
234
+ label: `${ attribute.name }_readback`,
236
235
  size,
237
236
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
238
237
  } );
239
238
 
240
-
241
- const cmdEncoder = device.createCommandEncoder( {} );
239
+ const cmdEncoder = device.createCommandEncoder( {
240
+ label: `readback_encoder_${ attribute.name }`
241
+ } );
242
242
 
243
243
  cmdEncoder.copyBufferToBuffer(
244
244
  bufferGPU,
@@ -248,8 +248,6 @@ class WebGPUAttributeUtils {
248
248
  size
249
249
  );
250
250
 
251
- readBufferGPU.unmap();
252
-
253
251
  const gpuCommands = cmdEncoder.finish();
254
252
  device.queue.submit( [ gpuCommands ] );
255
253
 
@@ -257,7 +255,11 @@ class WebGPUAttributeUtils {
257
255
 
258
256
  const arrayBuffer = readBufferGPU.getMappedRange();
259
257
 
260
- return arrayBuffer;
258
+ const dstBuffer = new attribute.array.constructor( arrayBuffer.slice( 0 ) );
259
+
260
+ readBufferGPU.unmap();
261
+
262
+ return dstBuffer.buffer;
261
263
 
262
264
  }
263
265
 
@@ -269,7 +271,7 @@ class WebGPUAttributeUtils {
269
271
 
270
272
  let format;
271
273
 
272
- if ( itemSize == 1 ) {
274
+ if ( itemSize === 1 ) {
273
275
 
274
276
  format = typeArraysToVertexFormatPrefixForItemSize1.get( ArrayType );
275
277
 
@@ -107,10 +107,18 @@ class WebGPUBindingUtils {
107
107
 
108
108
  const texture = {}; // GPUTextureBindingLayout
109
109
 
110
- if ( binding.texture.isMultisampleRenderTargetTexture === true ) {
110
+ const { primarySamples } = backend.utils.getTextureSampleData( binding.texture );
111
+
112
+ if ( primarySamples > 1 ) {
111
113
 
112
114
  texture.multisampled = true;
113
115
 
116
+ if ( ! binding.texture.isDepthTexture ) {
117
+
118
+ texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
119
+
120
+ }
121
+
114
122
  }
115
123
 
116
124
  if ( binding.texture.isDepthTexture ) {
@@ -146,11 +146,7 @@ class WebGPUTextureUtils {
146
146
 
147
147
  textureData.format = format;
148
148
 
149
- let sampleCount = options.sampleCount !== undefined ? options.sampleCount : 1;
150
-
151
- sampleCount = backend.utils.getSampleCount( sampleCount );
152
-
153
- const primarySampleCount = texture.isRenderTargetTexture && ! texture.isMultisampleRenderTargetTexture ? 1 : sampleCount;
149
+ const { samples, primarySamples, isMSAA } = backend.utils.getTextureSampleData( texture );
154
150
 
155
151
  let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC;
156
152
 
@@ -174,7 +170,7 @@ class WebGPUTextureUtils {
174
170
  depthOrArrayLayers: depth,
175
171
  },
176
172
  mipLevelCount: levels,
177
- sampleCount: primarySampleCount,
173
+ sampleCount: primarySamples,
178
174
  dimension: dimension,
179
175
  format: format,
180
176
  usage: usage
@@ -208,12 +204,12 @@ class WebGPUTextureUtils {
208
204
 
209
205
  }
210
206
 
211
- if ( texture.isRenderTargetTexture && sampleCount > 1 && ! texture.isMultisampleRenderTargetTexture ) {
207
+ if ( isMSAA ) {
212
208
 
213
209
  const msaaTextureDescriptorGPU = Object.assign( {}, textureDescriptorGPU );
214
210
 
215
211
  msaaTextureDescriptorGPU.label = msaaTextureDescriptorGPU.label + '-msaa';
216
- msaaTextureDescriptorGPU.sampleCount = sampleCount;
212
+ msaaTextureDescriptorGPU.sampleCount = samples;
217
213
 
218
214
  textureData.msaaTexture = backend.device.createTexture( msaaTextureDescriptorGPU );
219
215
 
@@ -336,7 +332,7 @@ class WebGPUTextureUtils {
336
332
  depthTexture.image.width = width;
337
333
  depthTexture.image.height = height;
338
334
 
339
- this.createTexture( depthTexture, { sampleCount: backend.utils.getSampleCount( backend.renderer.samples ), width, height } );
335
+ this.createTexture( depthTexture, { width, height } );
340
336
 
341
337
  return backend.get( depthTexture ).texture;
342
338
 
@@ -36,6 +36,36 @@ class WebGPUUtils {
36
36
 
37
37
  }
38
38
 
39
+ getTextureSampleData( texture ) {
40
+
41
+ let samples;
42
+
43
+ if ( texture.isFramebufferTexture ) {
44
+
45
+ samples = 1;
46
+
47
+ } else if ( texture.isDepthTexture && ! texture.renderTarget ) {
48
+
49
+ const renderer = this.backend.renderer;
50
+ const renderTarget = renderer.getRenderTarget();
51
+
52
+ samples = renderTarget ? renderTarget.samples : renderer.samples;
53
+
54
+ } else if ( texture.renderTarget ) {
55
+
56
+ samples = texture.renderTarget.samples;
57
+
58
+ }
59
+
60
+ samples = samples || 1;
61
+
62
+ const isMSAA = samples > 1 && texture.renderTarget !== null && ( texture.isDepthTexture !== true && texture.isFramebufferTexture !== true );
63
+ const primarySamples = isMSAA ? 1 : samples;
64
+
65
+ return { samples, primarySamples, isMSAA };
66
+
67
+ }
68
+
39
69
  getCurrentColorFormat( renderContext ) {
40
70
 
41
71
  let format;
@@ -52,7 +52,7 @@ class WebXRDepthSensing {
52
52
  const texProps = renderer.properties.get( texture );
53
53
  texProps.__webglTexture = depthData.texture;
54
54
 
55
- if ( ( depthData.depthNear != renderState.depthNear ) || ( depthData.depthFar != renderState.depthFar ) ) {
55
+ if ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {
56
56
 
57
57
  this.depthNear = depthData.depthNear;
58
58
  this.depthFar = depthData.depthFar;
@@ -286,7 +286,9 @@ class WebXRManager extends EventDispatcher {
286
286
  currentPixelRatio = renderer.getPixelRatio();
287
287
  renderer.getSize( currentSize );
288
288
 
289
- if ( session.renderState.layers === undefined ) {
289
+ const useLayers = session.enabledFeatures !== undefined && session.enabledFeatures.includes( 'layers' );
290
+
291
+ if ( ! useLayers ) {
290
292
 
291
293
  const layerInit = {
292
294
  antialias: attributes.antialias,
@@ -511,6 +513,10 @@ class WebXRManager extends EventDispatcher {
511
513
  * the cameras' projection and world matrices have already been set.
512
514
  * And that near and far planes are identical for both cameras.
513
515
  * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765
516
+ *
517
+ * @param {ArrayCamera} camera - The camera to update.
518
+ * @param {PerspectiveCamera} cameraL - The left camera.
519
+ * @param {PerspectiveCamera} cameraR - The right camera.
514
520
  */
515
521
  function setProjectionFromUnion( camera, cameraL, cameraR ) {
516
522
 
@@ -6,9 +6,9 @@ class Data3DTexture extends Texture {
6
6
  constructor( data = null, width = 1, height = 1, depth = 1 ) {
7
7
 
8
8
  // We're going to add .setXXX() methods for setting properties later.
9
- // Users can still set in DataTexture3D directly.
9
+ // Users can still set in Data3DTexture directly.
10
10
  //
11
- // const texture = new THREE.DataTexture3D( data, width, height, depth );
11
+ // const texture = new THREE.Data3DTexture( data, width, height, depth );
12
12
  // texture.anisotropy = 16;
13
13
  //
14
14
  // See #14839
@@ -69,6 +69,7 @@ class Texture extends EventDispatcher {
69
69
  this.version = 0;
70
70
  this.onUpdate = null;
71
71
 
72
+ this.renderTarget = null; // assign texture to a render target
72
73
  this.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not
73
74
  this.pmremVersion = 0; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)
74
75
 
@@ -134,6 +135,9 @@ class Texture extends EventDispatcher {
134
135
  this.unpackAlignment = source.unpackAlignment;
135
136
  this.colorSpace = source.colorSpace;
136
137
 
138
+ this.renderTarget = source.renderTarget;
139
+ this.isRenderTargetTexture = source.isRenderTargetTexture;
140
+
137
141
  this.userData = JSON.parse( JSON.stringify( source.userData ) );
138
142
 
139
143
  this.needsUpdate = true;